WebKit Bugzilla
Attachment 369333 Details for
Bug 197676
: [ANGLE] Update ANGLE
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
WIP Patch
bug-197676.diff (text/plain), 30.57 MB, created by
Don Olmstead
on 2019-05-07 16:28:00 PDT
(
hide
)
Description:
WIP Patch
Filename:
MIME Type:
Creator:
Don Olmstead
Created:
2019-05-07 16:28:00 PDT
Size:
30.57 MB
patch
obsolete
>diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt >index 54fe4a2d2bc..8bced685698 100644 >--- a/Source/CMakeLists.txt >+++ b/Source/CMakeLists.txt >@@ -13,7 +13,7 @@ endif () > > add_subdirectory(JavaScriptCore) > >-if (WIN32 AND ENABLE_GRAPHICS_CONTEXT_3D) >+if (ENABLE_GRAPHICS_CONTEXT_3D) > add_subdirectory(ThirdParty/ANGLE) > endif () > >diff --git a/Source/ThirdParty/ANGLE/.clang-format b/Source/ThirdParty/ANGLE/.clang-format >new file mode 100644 >index 00000000000..e5ff7cf4846 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/.clang-format >@@ -0,0 +1,55 @@ >+# 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: >+ 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 >diff --git a/Source/ThirdParty/ANGLE/.gn b/Source/ThirdParty/ANGLE/.gn >new file mode 100644 >index 00000000000..dd2aacc7e05 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/.gn >@@ -0,0 +1,45 @@ >+# 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 secondary source root is a parallel directory tree where >+# GN build files are placed when they can not be placed directly >+# in the source tree, e.g. for third party source trees. >+secondary_source = "//build/secondary/" >+ >+# 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 whitelist 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 = { >+ use_custom_libcxx = false >+ clang_use_chrome_plugins = true >+ build_angle_deqp_tests = true >+ use_sysroot = true >+} >diff --git a/Source/ThirdParty/ANGLE/.style.yapf b/Source/ThirdParty/ANGLE/.style.yapf >new file mode 100644 >index 00000000000..7074d0e187b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/.style.yapf >@@ -0,0 +1,3 @@ >+[style] >+based_on_style = chromium >+column_limit = 99 >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/ANGLE.txt b/Source/ThirdParty/ANGLE/ANGLE.txt >deleted file mode 100644 >index 0513b7d0f9f..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE.txt >+++ /dev/null >@@ -1,32 +0,0 @@ >-// Copyright (C) 2002-2010 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. >diff --git a/Source/ThirdParty/ANGLE/ANGLE/ShaderLang.h b/Source/ThirdParty/ANGLE/ANGLE/ShaderLang.h >deleted file mode 100644 >index 73f8ed63f74..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/ShaderLang.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/GLSLANG/ShaderLang.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/egl.h b/Source/ThirdParty/ANGLE/ANGLE/egl.h >deleted file mode 100644 >index cd511edeae2..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/egl.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/EGL/egl.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/eglext.h b/Source/ThirdParty/ANGLE/ANGLE/eglext.h >deleted file mode 100644 >index 063f31c6348..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/eglext.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/EGL/eglext.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/eglext_angle.h b/Source/ThirdParty/ANGLE/ANGLE/eglext_angle.h >deleted file mode 100644 >index c086e497384..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/eglext_angle.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/EGL/eglext_angle.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/eglplatform.h b/Source/ThirdParty/ANGLE/ANGLE/eglplatform.h >deleted file mode 100644 >index 0f3c9453667..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/eglplatform.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/EGL/eglplatform.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/entry_points_egl.h b/Source/ThirdParty/ANGLE/ANGLE/entry_points_egl.h >deleted file mode 100644 >index 41c430a5115..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/entry_points_egl.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "src/libGLESv2/entry_points_egl.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/entry_points_egl_ext.h b/Source/ThirdParty/ANGLE/ANGLE/entry_points_egl_ext.h >deleted file mode 100644 >index fb9e5b3a10a..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/entry_points_egl_ext.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "src/libGLESv2/entry_points_egl_ext.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_2_0.h b/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_2_0.h >deleted file mode 100644 >index 5f6ad2c89e7..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_2_0.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "src/libGLESv2/entry_points_gles_2_0.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_2_0_autogen.h b/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_2_0_autogen.h >deleted file mode 100644 >index 2989972285d..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_2_0_autogen.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "src/libGLESv2/entry_points_gles_2_0_autogen.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_2_0_ext.h b/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_2_0_ext.h >deleted file mode 100644 >index 29951767aaa..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_2_0_ext.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "src/libGLESv2/entry_points_gles_2_0_ext.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_3_0.h b/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_3_0.h >deleted file mode 100644 >index 43d4b724279..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_3_0.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "src/libGLESv2/entry_points_gles_3_0.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_3_0_autogen.h b/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_3_0_autogen.h >deleted file mode 100644 >index bbbe094f16d..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_3_0_autogen.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "src/libGLESv2/entry_points_gles_3_0_autogen.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_3_1_autogen.h b/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_3_1_autogen.h >deleted file mode 100644 >index f71f74cec1d..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/entry_points_gles_3_1_autogen.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "src/libGLESv2/entry_points_gles_3_1_autogen.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/export.h b/Source/ThirdParty/ANGLE/ANGLE/export.h >deleted file mode 100644 >index 9fbd3149b81..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/export.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/export.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/gl2.h b/Source/ThirdParty/ANGLE/ANGLE/gl2.h >deleted file mode 100644 >index 8d502e355cc..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/gl2.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/GLES2/gl2.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/gl2ext.h b/Source/ThirdParty/ANGLE/ANGLE/gl2ext.h >deleted file mode 100644 >index 32ce624d734..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/gl2ext.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/GLES2/gl2ext.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/gl2ext_angle.h b/Source/ThirdParty/ANGLE/ANGLE/gl2ext_angle.h >deleted file mode 100644 >index 440a5c313df..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/gl2ext_angle.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/GLES2/gl2ext_angle.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/gl2platform.h b/Source/ThirdParty/ANGLE/ANGLE/gl2platform.h >deleted file mode 100644 >index 164cee81616..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/gl2platform.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/GLES2/gl2platform.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/gl3.h b/Source/ThirdParty/ANGLE/ANGLE/gl3.h >deleted file mode 100644 >index 1103491fac1..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/gl3.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/GLES3/gl3.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/gl31.h b/Source/ThirdParty/ANGLE/ANGLE/gl31.h >deleted file mode 100644 >index d2b9b9522f8..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/gl31.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/GLES3/gl31.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/gl32.h b/Source/ThirdParty/ANGLE/ANGLE/gl32.h >deleted file mode 100644 >index 2e9089b4704..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/gl32.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/GLES3/gl32.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/gl3platform.h b/Source/ThirdParty/ANGLE/ANGLE/gl3platform.h >deleted file mode 100644 >index 572c782bc07..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/gl3platform.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/GLES3/gl3platform.h" >diff --git a/Source/ThirdParty/ANGLE/ANGLE/khrplatform.h b/Source/ThirdParty/ANGLE/ANGLE/khrplatform.h >deleted file mode 100644 >index c423a7d472a..00000000000 >--- a/Source/ThirdParty/ANGLE/ANGLE/khrplatform.h >+++ /dev/null >@@ -1 +0,0 @@ >-#include "include/KHR/khrplatform.h" >diff --git a/Source/ThirdParty/ANGLE/AUTHORS b/Source/ThirdParty/ANGLE/AUTHORS >index 5dacdf8fbdc..082c6f4566e 100644 >--- a/Source/ThirdParty/ANGLE/AUTHORS >+++ b/Source/ThirdParty/ANGLE/AUTHORS >@@ -27,6 +27,9 @@ NVIDIA Corporation > Opera Software ASA > The Qt Company Ltd. > Advanced Micro Devices, Inc. >+LG Electronics, Inc. >+IBM Inc. >+AdaptVis GmbH > > Jacek Caban > Mark Callow >@@ -49,3 +52,6 @@ Nickolay Artamonov > Ihsan Akmal > Andrei Volykhin > Jérôme Duval >+Ð ÑÑлан ÐжбÑлаÑов >+Thomas Miller >+Till Rathmann >diff --git a/Source/ThirdParty/ANGLE/BUILD.gn b/Source/ThirdParty/ANGLE/BUILD.gn >index fff7ca9925a..c61e1f57d4a 100644 >--- a/Source/ThirdParty/ANGLE/BUILD.gn >+++ b/Source/ThirdParty/ANGLE/BUILD.gn >@@ -1,4 +1,4 @@ >-# Copyright 2014-2015 The Chromium Authors. All rights reserved. >+# 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. > >@@ -8,11 +8,20 @@ import("//build/config/linux/pkg_config.gni") > import("//build/config/ui.gni") > import("//testing/libfuzzer/fuzzer_test.gni") > import("gni/angle.gni") >+if (is_android) { >+ # android/rules.gni can only be imported for Android targets >+ import("//build/config/android/config.gni") >+ import("//build/config/android/rules.gni") >+ import("android/angle_apk.gni") >+} > > declare_args() { > # Use the PCI lib to collect GPU information on Linux. > use_libpci = is_linux && (!is_chromecast || is_cast_desktop_build) && > (use_x11 || use_ozone) >+ >+ # Link in system libGL, to work with apitrace. See doc/DebuggingTips.md. >+ angle_link_glx = false > } > > if (!build_with_chromium) { >@@ -21,6 +30,7 @@ if (!build_with_chromium) { > deps = [ > ":angle_shader_translator", > ":translator_fuzzer", >+ ":xxhash_fuzzer", > "//samples:all", > "//src/tests:all", > ] >@@ -42,15 +52,8 @@ angle_git_is_present = exec_script("src/commit_id.py", > > angle_use_commit_id = angle_git_is_present == 1 > >-gles_gypi = exec_script("//build/gypi_to_gn.py", >- [ rebase_path("src/libGLESv2.gypi") ], >- "scope", >- [ "src/libGLESv2.gypi" ]) >- >-compiler_gypi = exec_script("//build/gypi_to_gn.py", >- [ rebase_path("src/compiler.gypi") ], >- "scope", >- [ "src/compiler.gypi" ]) >+import("src/compiler.gni") >+import("src/libGLESv2.gni") > > # This config is exported to dependent targets (and also applied to internal > # ones). >@@ -58,6 +61,23 @@ config("external_config") { > include_dirs = [ "include" ] > } > >+# Prevent the GL headers from redeclaring ANGLE entry points. >+config("no_gl_prototypes") { >+ defines = [ >+ "GL_GLES_PROTOTYPES=0", >+ "EGL_EGL_PROTOTYPES=0", >+ ] >+} >+ >+config("gl_prototypes") { >+ defines = [ >+ "GL_GLES_PROTOTYPES=1", >+ "EGL_EGL_PROTOTYPES=1", >+ "GL_GLEXT_PROTOTYPES", >+ "EGL_EGLEXT_PROTOTYPES", >+ ] >+} >+ > # This config is applied to internal Angle targets (not pushed to dependents). > config("internal_config") { > include_dirs = [ >@@ -65,17 +85,29 @@ config("internal_config") { > "src", > ] > >- # Prevent the GL headers from redeclaring ANGLE entry points. >- defines = [ >- "GL_GLEXT_PROTOTYPES", >- "EGL_EGLEXT_PROTOTYPES", >- ] >+ defines = [] > >- if (current_cpu == "x86" || current_cpu == "arm") { >+ if (angle_64bit_current_cpu) { >+ defines += [ "ANGLE_IS_64_BIT_CPU" ] >+ } else { > defines += [ "ANGLE_IS_32_BIT_CPU" ] > } >- if (current_cpu == "x64" || current_cpu == "arm64") { >- defines += [ "ANGLE_IS_64_BIT_CPU" ] >+ >+ if (angle_force_thread_safety) { >+ defines += [ "ANGLE_FORCE_THREAD_SAFETY=1" ] >+ } >+ >+ if (angle_enable_vulkan) { >+ if (angle_enable_vulkan_gpu_trace_events) { >+ defines += [ "ANGLE_ENABLE_VULKAN_GPU_TRACE_EVENTS=1" ] >+ } >+ if (angle_vulkan_conformant_configs_only) { >+ defines += [ "ANGLE_VULKAN_CONFORMANT_CONFIGS_ONLY=1" ] >+ } >+ } >+ >+ if (angle_enable_trace) { >+ defines += [ "ANGLE_ENABLE_DEBUG_TRACE=1" ] > } > } > >@@ -88,48 +120,75 @@ config("extra_warnings") { > "/we4244", # Conversion: possible loss of data. > "/we4456", # Variable shadowing. > "/we4458", # declaration hides class member. >+ "/we4715", # not all control paths return a value >+ "/we4800", # forcing value to bool. >+ "/we4838", # narrowing conversion. > ] > } > if (is_clang) { >- # Remove when crbug.com/428099 is resolved. >- cflags += [ "-Winconsistent-missing-override" ] >+ cflags += [ >+ # Enable after anglebug.com/3128 is fixed. >+ # "-Wextra-semi-stmt", >+ >+ "-Wnon-virtual-dtor", >+ "-Wunneeded-internal-declaration", >+ ] > } > } > >-if (is_win) { >+# This config adds build-ids to the associated library. >+# -Wl is a special option that indicates that clang should pass the associated >+# option --build-id to the linker. This will cause a build-id section to be added >+# to the associated library. The build-id makes it possible for a debugger to >+# find the right symbol file to use. >+config("build_id_config") { >+ ldflags = [ "-Wl,--build-id" ] >+} >+ >+# Windows ARM64 is available since 10.0.16299 so no need to copy >+# d3dcompiler_47.dll because this file is available as inbox. >+if (is_win && target_cpu != "arm64") { >+ # We also ship an older DLL for compatiblity with Windows 7 machines without >+ # the UCRT. This DLL isn't available in the standard SDK distribution. >+ _old_compiler = "$windows_sdk_path/Redist/D3D/$target_cpu/d3dcompiler_old.dll" >+ _has_old_compiler = >+ exec_script("scripts/file_exists.py", [ _old_compiler ], "value") >+ > copy("copy_compiler_dll") { > sources = [ > "$windows_sdk_path/Redist/D3D/$target_cpu/d3dcompiler_47.dll", > ] >+ >+ if (_has_old_compiler) { >+ sources += [ _old_compiler ] >+ } >+ > outputs = [ >- "$root_out_dir/d3dcompiler_47.dll", >+ "$root_out_dir/{{source_file_part}}", > ] > } > } > >-angle_undefine_configs = [ "//build/config/compiler:default_include_dirs" ] >- > # Holds the shared includes so we only need to list them once. >-source_set("includes") { >- sources = rebase_path(gles_gypi.libangle_includes, ".", "src") >+config("includes_config") { >+ include_dirs = [ "include" ] > } > >-static_library("preprocessor") { >- sources = rebase_path(compiler_gypi.angle_preprocessor_sources, ".", "src") >+angle_source_set("includes") { >+ sources = libangle_includes >+ public_configs = [ ":includes_config" ] >+} > >- configs -= angle_undefine_configs >- configs += [ >- ":extra_warnings", >- ":internal_config", >- ] >+angle_static_library("preprocessor") { >+ sources = angle_preprocessor_sources > > public_deps = [ > ":angle_common", > ] > } > >-config("translator_disable_pool_alloc") { >- defines = [ "ANGLE_TRANSLATOR_DISABLE_POOL_ALLOC" ] >+config("angle_disable_pool_alloc") { >+ defines = [ "ANGLE_DISABLE_POOL_ALLOC" ] > } > > config("debug_annotations_config") { >@@ -146,36 +205,51 @@ config("angle_release_asserts_config") { > > config("angle_common_config") { > include_dirs = [ "src/common/third_party/base" ] >+ if (is_android) { >+ libs = [ "log" ] >+ } > } > >-static_library("angle_common") { >- sources = rebase_path(gles_gypi.libangle_common_sources, ".", "src") >+angle_source_set("angle_system_utils") { >+ sources = angle_system_utils_sources >+} > >- if (is_linux || is_android) { >- sources += rebase_path(gles_gypi.libangle_common_linux_sources, ".", "src") >- } >+angle_source_set("xxhash") { >+ sources = xxhash_sources >+ configs -= [ "${angle_root}:extra_warnings" ] >+} > >- if (is_mac) { >- sources += rebase_path(gles_gypi.libangle_common_mac_sources, ".", "src") >- } >+fuzzer_test("xxhash_fuzzer") { >+ sources = [ >+ "src/common/third_party/xxhash/xxhash_fuzzer.cpp", >+ ] >+ deps = [ >+ ":xxhash", >+ ] >+} > >- if (is_win) { >- sources += rebase_path(gles_gypi.libangle_common_win_sources, ".", "src") >- } >+angle_static_library("angle_common") { >+ sources = libangle_common_sources > >- configs -= angle_undefine_configs > configs += [ > ":angle_common_config", > ":debug_annotations_config", >- ":extra_warnings", >- ":internal_config", >+ ] >+ >+ deps = [ >+ ":xxhash", > ] > > public_deps = [ >- ":commit_id", >+ ":angle_system_utils", >+ ":angle_version", >+ ":includes", > ] >- public_configs = [ ":angle_common_config" ] >+ public_configs += [ ":angle_common_config" ] > all_dependent_configs = [ ":angle_release_asserts_config" ] >+ if (use_fuzzing_engine) { >+ all_dependent_configs += [ ":angle_disable_pool_alloc" ] >+ } > } > > config("angle_image_util_config") { >@@ -185,22 +259,28 @@ config("angle_image_util_config") { > ] > } > >-static_library("angle_image_util") { >- sources = rebase_path(gles_gypi.libangle_image_util_sources, ".", "src") >- >- configs -= angle_undefine_configs >- configs += [ >- ":internal_config", >- ":extra_warnings", >- ] >- >- public_configs = [ ":angle_image_util_config" ] >- >+angle_static_library("angle_image_util") { >+ sources = libangle_image_util_sources >+ public_configs += [ ":angle_image_util_config" ] > public_deps = [ > ":angle_common", > ] > } > >+config("angle_gl_visibility_config") { >+ if (is_win) { >+ defines = [ >+ "GL_APICALL=", >+ "GL_API=", >+ ] >+ } else { >+ defines = [ >+ "GL_APICALL=__attribute__((visibility(\"default\")))", >+ "GL_API=__attribute__((visibility(\"default\")))", >+ ] >+ } >+} >+ > config("angle_gpu_info_util_config") { > include_dirs = [ > "include", >@@ -208,38 +288,31 @@ config("angle_gpu_info_util_config") { > ] > } > >-static_library("angle_gpu_info_util") { >- configs -= angle_undefine_configs >- configs += [ >- ":internal_config", >- ":extra_warnings", >- ] >- >- public_configs = [ ":angle_gpu_info_util_config" ] >- >+angle_static_library("angle_gpu_info_util") { >+ public_configs += [ ":angle_gpu_info_util_config" ] > public_deps = [ > ":angle_common", > ] >- >- sources = rebase_path(gles_gypi.libangle_gpu_info_util_sources, ".", "src") >+ sources = libangle_gpu_info_util_sources > deps = [] > libs = [] > defines = [] > >+ if (is_android) { >+ sources += [ "src/gpu_info_util/SystemInfo_android.cpp" ] >+ } >+ > if (is_win) { >- sources += >- rebase_path(gles_gypi.libangle_gpu_info_util_win_sources, ".", "src") >+ sources += libangle_gpu_info_util_win_sources > libs += [ "setupapi.lib" ] > defines += [ "GPU_INFO_USE_SETUPAPI" ] > } > >- if (is_linux) { >- sources += >- rebase_path(gles_gypi.libangle_gpu_info_util_linux_sources, ".", "src") >+ if (is_linux || is_fuchsia) { >+ sources += libangle_gpu_info_util_linux_sources > > if (use_x11) { >- sources += >- rebase_path(gles_gypi.libangle_gpu_info_util_x11_sources, ".", "src") >+ sources += libangle_gpu_info_util_x11_sources > deps += [ "src/third_party/libXNVCtrl:libXNVCtrl" ] > defines += [ "GPU_INFO_USE_X11" ] > libs += [ >@@ -251,15 +324,13 @@ static_library("angle_gpu_info_util") { > } > > if (use_libpci) { >- sources += >- rebase_path(gles_gypi.libangle_gpu_info_util_libpci_sources, ".", "src") >+ sources += libangle_gpu_info_util_libpci_sources > defines += [ "GPU_INFO_USE_LIBPCI" ] > libs += [ "pci" ] > } > > if (is_mac) { >- sources += >- rebase_path(gles_gypi.libangle_gpu_info_util_mac_sources, ".", "src") >+ sources += libangle_gpu_info_util_mac_sources > libs += [ > "IOKit.framework", > "CoreFoundation.framework", >@@ -268,44 +339,31 @@ static_library("angle_gpu_info_util") { > } > } > >-static_library("translator") { >- sources = rebase_path(compiler_gypi.angle_translator_sources, ".", "src") >+angle_static_library("translator") { >+ sources = angle_translator_sources > defines = [] > > if (angle_enable_essl || use_fuzzing_engine) { >- sources += >- rebase_path(compiler_gypi.angle_translator_essl_sources, ".", "src") >+ sources += angle_translator_essl_sources > defines += [ "ANGLE_ENABLE_ESSL" ] > } > > if (angle_enable_glsl || use_fuzzing_engine) { >- sources += >- rebase_path(compiler_gypi.angle_translator_glsl_sources, ".", "src") >+ sources += angle_translator_glsl_sources > defines += [ "ANGLE_ENABLE_GLSL" ] > } > > if (angle_enable_hlsl || use_fuzzing_engine) { >- sources += >- rebase_path(compiler_gypi.angle_translator_hlsl_sources, ".", "src") >+ sources += angle_translator_hlsl_sources > defines += [ "ANGLE_ENABLE_HLSL" ] > } > > if (angle_enable_vulkan || use_fuzzing_engine) { >- sources += rebase_path(compiler_gypi.angle_translator_lib_vulkan_sources, >- ".", >- "src") >+ sources += angle_translator_lib_vulkan_sources > defines += [ "ANGLE_ENABLE_VULKAN" ] > } > >- configs -= angle_undefine_configs >- configs += [ >- ":internal_config", >- ":extra_warnings", >- ] >- public_configs = [ ":external_config" ] >- if (use_fuzzing_engine) { >- all_dependent_configs = [ ":translator_disable_pool_alloc" ] >- } >+ public_configs += [ ":external_config" ] > > deps = [ > ":includes", >@@ -323,7 +381,7 @@ static_library("translator") { > } > } > >-source_set("translator_fuzzer") { >+angle_source_set("translator_fuzzer") { > sources = [ > "src/compiler/fuzz/translator_fuzzer.cpp", > ] >@@ -340,6 +398,7 @@ source_set("translator_fuzzer") { > > config("commit_id_config") { > include_dirs = [ "$root_gen_dir/angle" ] >+ visibility = [ ":commit_id" ] > } > > commit_id_output_file = "$root_gen_dir/angle/id/commit.h" >@@ -350,6 +409,11 @@ if (angle_use_commit_id) { > commit_id_output_file, > ] > >+ # commit id should depend on angle's HEAD revision >+ inputs = [ >+ ".git/HEAD", >+ ] >+ > args = [ > "gen", > rebase_path(".", root_build_dir), >@@ -370,11 +434,23 @@ if (angle_use_commit_id) { > } > } > >+angle_source_set("angle_version") { >+ sources = [ >+ "src/common/version.h", >+ ] >+ public_deps = [ >+ ":commit_id", >+ ] >+} >+ > config("libANGLE_config") { > cflags = [] > defines = [] >+ libs = [] >+ ldflags = [] > if (angle_enable_d3d9) { > defines += [ "ANGLE_ENABLE_D3D9" ] >+ ldflags += [ "/DELAYLOAD:d3d9.dll" ] > } > if (angle_enable_d3d11) { > defines += [ "ANGLE_ENABLE_D3D11" ] >@@ -390,6 +466,9 @@ config("libANGLE_config") { > } > if (angle_enable_vulkan) { > defines += [ "ANGLE_ENABLE_VULKAN" ] >+ if (angle_enable_custom_vulkan_cmd_buffers) { >+ defines += [ "ANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1" ] >+ } > } > if (angle_enable_null) { > defines += [ "ANGLE_ENABLE_NULL" ] >@@ -399,55 +478,121 @@ config("libANGLE_config") { > if (is_win) { > cflags += [ "/wd4530" ] # C++ exception handler used, but unwind semantics are not enabled. > } >+ >+ if (is_android && (angle_enable_gl || angle_enable_vulkan)) { >+ # In API level 26 ANativeWindow APIs were moved from libandroid.so >+ # into a separate library, libnativewindow.so >+ if (ndk_api_level_at_least_26) { >+ libs += [ "nativewindow" ] >+ } else { >+ libs += [ "android" ] >+ } >+ } > } > >-static_library("libANGLE") { >- sources = rebase_path(gles_gypi.libangle_sources, ".", "src") >+if (angle_enable_vulkan) { >+ config("vulkan_config") { >+ if (is_android) { >+ libs = [ "vulkan" ] >+ } >+ } >+ >+ # Use this target to include everything ANGLE needs for Vulkan. >+ group("angle_vulkan") { >+ public_deps = [ >+ "$angle_root/third_party/vulkan-headers:vulkan_headers", >+ ] >+ public_configs = [ ":vulkan_config" ] >+ data_deps = [] >+ if (!is_android && !is_fuchsia) { >+ deps = [ >+ "$angle_root/third_party/vulkan-loader:libvulkan", >+ ] >+ data_deps += [ "$angle_root/third_party/vulkan-tools:VkICD_mock_icd" ] >+ public_configs += >+ [ "$angle_root/third_party/vulkan-loader:vulkan_loader_config" ] >+ } >+ if (is_fuchsia) { >+ public_deps += [ >+ "$angle_root/src/common/fuchsia_egl", >+ "//third_party/fuchsia-sdk:vulkan_base", >+ "//third_party/fuchsia-sdk/sdk:vulkan", >+ ] >+ } >+ >+ if (angle_enable_vulkan_validation_layers) { >+ if (is_fuchsia) { >+ deps = [ >+ "//third_party/fuchsia-sdk:vulkan_validation", >+ ] >+ } else { >+ data_deps += [ "$angle_root/third_party/vulkan-validation-layers:vulkan_validation_layers" ] >+ if (!is_android) { >+ data_deps += [ "$angle_root/third_party/vulkan-validation-layers:vulkan_gen_json_files" ] >+ } >+ } >+ } >+ } >+} >+ >+angle_static_library("libANGLE") { >+ sources = libangle_sources > > include_dirs = [] > libs = [] > defines = [] >+ if (angle_link_glx) { >+ libs += [ "GL" ] >+ defines += [ "ANGLE_LINK_GLX" ] >+ } > public_deps = [ > ":angle_common", >+ ":angle_gpu_info_util", >+ ":angle_version", >+ ":translator", > ] > deps = [ >- ":angle_gpu_info_util", > ":angle_image_util", >- ":commit_id", > ":includes", >- ":translator", > ] > >+ # Enable extra Chromium style warnings for libANGLE. >+ if (is_clang) { >+ suppressed_configs -= [ "//build/config/clang:find_bad_constructs" ] >+ } >+ > # Shared D3D sources. > if (angle_enable_d3d9 || angle_enable_d3d11) { >- sources += rebase_path(gles_gypi.libangle_d3d_shared_sources, ".", "src") >+ sources += libangle_d3d_shared_sources > > defines += [ "ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES={ " + "\"d3dcompiler_47.dll\", \"d3dcompiler_46.dll\", \"d3dcompiler_43.dll\" }" ] > } > > if (angle_enable_d3d9) { >- sources += rebase_path(gles_gypi.libangle_d3d9_sources, ".", "src") >+ sources += libangle_d3d9_sources > libs += [ "d3d9.lib" ] > } > > if (angle_enable_d3d11) { >- sources += rebase_path(gles_gypi.libangle_d3d11_sources, ".", "src") >- sources += rebase_path(gles_gypi.libangle_d3d11_win32_sources, ".", "src") >+ sources += libangle_d3d11_sources >+ sources += libangle_d3d11_win32_sources > libs += [ "dxguid.lib" ] >+ import("src/libANGLE/renderer/d3d/d3d11/d3d11_blit_shaders_autogen.gni") >+ sources += libangle_d3d11_blit_shaders > } > > if (angle_enable_gl) { >- sources += rebase_path(gles_gypi.libangle_gl_sources, ".", "src") >+ sources += libangle_gl_sources > include_dirs += [ "src/third_party/khronos" ] > > if (angle_enable_gl_null) { >- sources += rebase_path(gles_gypi.libangle_gl_null_sources, ".", "src") >+ sources += libangle_gl_null_sources > } > if (is_win) { >- sources += rebase_path(gles_gypi.libangle_gl_wgl_sources, ".", "src") >+ sources += libangle_gl_wgl_sources > } > if (use_x11) { >- sources += rebase_path(gles_gypi.libangle_gl_glx_sources, ".", "src") >+ sources += libangle_gl_glx_sources > deps += [ "src/third_party/libXNVCtrl:libXNVCtrl" ] > libs += [ > "X11", >@@ -456,7 +601,7 @@ static_library("libANGLE") { > ] > } > if (is_mac) { >- sources += rebase_path(gles_gypi.libangle_gl_cgl_sources, ".", "src") >+ sources += libangle_gl_cgl_sources > libs += [ > "Cocoa.framework", > "IOSurface.framework", >@@ -465,57 +610,66 @@ static_library("libANGLE") { > ] > } > if (is_android) { >- sources += rebase_path(gles_gypi.libangle_gl_egl_sources, ".", "src") >- sources += rebase_path(gles_gypi.libangle_gl_egl_dl_sources, ".", "src") >- sources += >- rebase_path(gles_gypi.libangle_gl_egl_android_sources, ".", "src") >- libs += [ >- "android", >- "log", >- ] >+ sources += libangle_gl_egl_sources >+ sources += libangle_gl_egl_dl_sources >+ sources += libangle_gl_egl_android_sources > } > if (ozone_platform_gbm) { > configs += [ ":libdrm" ] > defines += [ "ANGLE_USE_OZONE" ] > deps += [ "//third_party/minigbm" ] >- sources += rebase_path(gles_gypi.libangle_gl_egl_sources, ".", "src") >- sources += rebase_path(gles_gypi.libangle_gl_egl_dl_sources, ".", "src") >- sources += rebase_path(gles_gypi.libangle_gl_ozone_sources, ".", "src") >+ sources += libangle_gl_egl_sources >+ sources += libangle_gl_egl_dl_sources >+ sources += libangle_gl_ozone_sources > } > } > > if (angle_enable_vulkan) { >- sources += rebase_path(gles_gypi.libangle_vulkan_sources, ".", "src") >+ sources += libangle_vulkan_sources > if (is_win) { >- sources += >- rebase_path(gles_gypi.libangle_vulkan_win32_sources, ".", "src") >+ sources += libangle_vulkan_win32_sources > } > if (is_linux) { >- sources += rebase_path(gles_gypi.libangle_vulkan_xcb_sources, ".", "src") >+ sources += libangle_vulkan_xcb_sources > } >- deps += [ "src/vulkan_support:angle_vulkan" ] >+ if (is_fuchsia) { >+ sources += libangle_vulkan_fuchsia_sources >+ deps += [ >+ "$angle_root/src/common/fuchsia_egl", >+ "$angle_root/src/common/fuchsia_egl:backend", >+ ] >+ } >+ if (is_android) { >+ sources += libangle_vulkan_android_sources >+ libs += [ "vulkan" ] >+ } >+ deps += [ >+ ":angle_vulkan", >+ "${angle_glslang_dir}:glslang_default_resource_limits_sources", >+ "${angle_glslang_dir}:glslang_sources", >+ "${angle_spirv_tools_dir}:spvtools_val", >+ ] >+ public_deps += [ "$angle_root/third_party/vulkan-headers:vulkan_headers" ] >+ >+ # Include generated shaders. >+ import("src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.gni") >+ sources += angle_vulkan_internal_shaders > } > > if (angle_enable_null) { >- sources += rebase_path(gles_gypi.libangle_null_sources, ".", "src") >+ sources += libangle_null_sources > } > > if (is_debug) { > defines += [ "ANGLE_GENERATE_SHADER_DEBUG_INFO" ] > } > >- configs -= angle_undefine_configs >- >- configs += [ >- ":commit_id_config", >- ":debug_annotations_config", >- ":extra_warnings", >- ":internal_config", >- ] >- >- public_configs = [ ":libANGLE_config" ] >+ configs += [ ":debug_annotations_config" ] >+ public_configs += [ ":libANGLE_config" ] > >- if (is_win) { >+ # Windows ARM64 is available since 10.0.16299 so no need to copy >+ # d3dcompiler_47.dll because this file is available as inbox. >+ if (is_win && target_cpu != "arm64") { > data_deps = [ > ":copy_compiler_dll", > ] >@@ -533,88 +687,114 @@ config("shared_library_public_config") { > } > } > >+config("library_name_config") { >+ defines = [ >+ "ANGLE_EGL_LIBRARY_NAME=\"libEGL${angle_libs_suffix}\"", >+ "ANGLE_GLESV2_LIBRARY_NAME=\"libGLESv2${angle_libs_suffix}\"", >+ ] >+} >+ > # This config controls export definitions on ANGLE API calls. > config("angle_static") { > defines = [ > "ANGLE_EXPORT=", >+ "ANGLE_UTIL_EXPORT=", > "EGLAPI=", > "GL_APICALL=", >+ "GL_API=", > ] > } > >-shared_library("libGLESv2") { >- sources = rebase_path(gles_gypi.libglesv2_sources, ".", "src") >- >- if (is_android) { >- configs -= [ "//build/config/android:hide_all_but_jni_onload" ] >- } >+angle_shared_library("libGLESv2${angle_libs_suffix}") { >+ sources = libglesv2_sources > > if (is_win) { >- ldflags = >- [ "/DEF:" + rebase_path("src/libGLESv2/libGLESv2.def", root_build_dir) ] >+ sources += [ "src/libGLESv2/libGLESv2_autogen.def" ] > } > >- if (is_mac && !is_component_build) { >- ldflags = [ >- "-install_name", >- "@rpath/${target_name}.dylib", >- ] >- public_configs = [ ":shared_library_public_config" ] >- } >- >- configs -= angle_undefine_configs > configs += [ >- ":commit_id_config", >+ ":angle_gl_visibility_config", > ":debug_annotations_config", >- ":extra_warnings", >- ":internal_config", >+ ":gl_prototypes", > ] > > defines = [ "LIBGLESV2_IMPLEMENTATION" ] >- if (is_win) { >- defines += [ "GL_APICALL=" ] >- } else { >- defines += [ "GL_APICALL=__attribute__((visibility(\"default\")))" ] >- } > > deps = [ > ":includes", > ":libANGLE", >- "//build/config:exe_and_shlib_deps", >+ ] >+ >+ public_deps = [ >+ ":angle_version", >+ ] >+} >+ >+angle_static_library("libGLESv2_static") { >+ sources = libglesv2_sources >+ configs += [ ":debug_annotations_config" ] >+ public_configs += [ ":angle_static" ] >+ deps = [ >+ ":includes", >+ ] >+ public_deps = [ >+ ":libANGLE", > ] > } > >-static_library("libGLESv2_static") { >- sources = rebase_path(gles_gypi.libglesv2_sources, ".", "src") >+angle_shared_library("libGLESv1_CM${angle_libs_suffix}") { >+ sources = libglesv1_cm_sources > >- configs -= angle_undefine_configs > configs += [ >- ":commit_id_config", >+ ":angle_gl_visibility_config", > ":debug_annotations_config", >- ":extra_warnings", >- ":internal_config", >+ ":gl_prototypes", > ] > >- public_configs = [ ":angle_static" ] >+ defines = [] > > deps = [ > ":includes", >- ":libANGLE", >+ ":libGLESv2${angle_libs_suffix}", > ] > } > >-shared_library("libEGL") { >- sources = rebase_path(gles_gypi.libegl_sources, ".", "src") >+angle_static_library("libGLESv1_CM_static") { >+ sources = libglesv1_cm_sources >+ configs += [ ":debug_annotations_config" ] >+ public_configs += [ ":angle_static" ] >+ deps = [ >+ ":includes", >+ ":libGLESv2_static", >+ ] >+} >+ >+config("libEGL_egl_loader_config") { >+ defines = [ "ANGLE_USE_EGL_LOADER" ] >+} >+ >+angle_source_set("libEGL_egl_loader") { >+ sources = [ >+ "src/libEGL/egl_loader_autogen.cpp", >+ "src/libEGL/egl_loader_autogen.h", >+ ] >+ >+ public_configs += [ >+ ":libEGL_egl_loader_config", >+ ":gl_prototypes", >+ ] >+ >+ deps = [ >+ ":includes", >+ ] >+} >+ >+angle_shared_library("libEGL${angle_libs_suffix}") { >+ sources = libegl_sources > >- if (is_android) { >- configs -= [ "//build/config/android:hide_all_but_jni_onload" ] >- } >- configs -= angle_undefine_configs > configs += [ >- ":commit_id_config", > ":debug_annotations_config", >- ":extra_warnings", >- ":internal_config", >+ ":library_name_config", > ] > > defines = [ "LIBEGL_IMPLEMENTATION" ] >@@ -625,36 +805,33 @@ shared_library("libEGL") { > } > > if (is_win) { >- ldflags = [ "/DEF:" + rebase_path("src/libEGL/libEGL.def", root_build_dir) ] >- } >- >- if (is_mac && !is_component_build) { >- ldflags = [ >- "-install_name", >- "@rpath/${target_name}.dylib", >- ] >- public_configs = [ ":shared_library_public_config" ] >+ sources += [ "src/libEGL/libEGL.def" ] > } > > deps = [ >+ ":angle_system_utils", >+ ":angle_version", >+ ":libEGL_egl_loader", >+ ] >+ >+ public_deps = [ > ":includes", >- ":libGLESv2", >- "//build/config:exe_and_shlib_deps", >+ ] >+ >+ data_deps = [ >+ ":libGLESv2${angle_libs_suffix}", > ] > } > >-static_library("libEGL_static") { >- sources = rebase_path(gles_gypi.libegl_sources, ".", "src") >+angle_static_library("libEGL_static") { >+ sources = libegl_sources > >- configs -= angle_undefine_configs > configs += [ >- ":commit_id_config", > ":debug_annotations_config", >- ":extra_warnings", >- ":internal_config", >+ ":library_name_config", > ] > >- public_configs = [ ":angle_static" ] >+ public_configs += [ ":angle_static" ] > > deps = [ > ":includes", >@@ -662,13 +839,53 @@ static_library("libEGL_static") { > ] > } > >-util_gypi = exec_script("//build/gypi_to_gn.py", >- [ rebase_path("util/util.gyp") ], >- "scope", >- [ "util/util.gyp" ]) >+import("util/util.gni") >+ >+config("angle_util_loader_config") { >+ defines = [ "ANGLE_USE_UTIL_LOADER" ] >+} >+ >+angle_source_set("angle_util_loader_headers") { >+ sources = [ >+ "util/egl_loader_autogen.h", >+ "util/gles_loader_autogen.h", >+ "util/util_export.h", >+ ] >+ >+ if (is_win) { >+ sources += [ "util/windows/wgl_loader_autogen.h" ] >+ } >+ >+ public_deps = [ >+ ":includes", >+ ] >+} >+ >+angle_source_set("angle_util_loader") { >+ defines = [ "LIBANGLE_UTIL_IMPLEMENTATION" ] >+ >+ sources = [ >+ "util/egl_loader_autogen.cpp", >+ "util/gles_loader_autogen.cpp", >+ ] >+ >+ if (is_win) { >+ sources += [ "util/windows/wgl_loader_autogen.cpp" ] >+ } >+ >+ deps = [ >+ ":angle_util_loader_headers", >+ ] >+ >+ public_configs += [ >+ ":angle_util_config", >+ ":angle_util_loader_config", >+ ":no_gl_prototypes", >+ ] >+} > > config("angle_util_config") { >- include_dirs = [ "util" ] >+ include_dirs = [ "." ] > if (is_linux && use_x11) { > libs = [ "X11" ] > } >@@ -680,89 +897,100 @@ foreach(is_shared_library, > false, > ]) { > if (is_shared_library) { >- library_type = "shared_library" >+ library_type = "angle_shared_library" > library_name = "angle_util" >- dep_suffix = "" >+ dep_suffix = "${angle_libs_suffix}" > } else { >- library_type = "static_library" >+ library_type = "angle_static_library" > library_name = "angle_util_static" > dep_suffix = "_static" > } > > target(library_type, library_name) { >- sources = rebase_path(util_gypi.util_sources, ".", "util") >+ sources = util_sources > > if (is_win) { >- sources += rebase_path(util_gypi.util_win32_sources, ".", "util") >+ sources += util_win_sources > } > >+ libs = [] > if (is_linux) { >- sources += rebase_path(util_gypi.util_linux_sources, ".", "util") >- libs = [ >+ sources += util_linux_sources >+ libs += [ > "rt", > "dl", > ] > } > > if (is_mac) { >- sources += rebase_path(util_gypi.util_osx_sources, ".", "util") >- libs = [ >+ sources += util_osx_sources >+ libs += [ > "AppKit.framework", > "QuartzCore.framework", > ] > } > > if (use_x11) { >- sources += rebase_path(util_gypi.util_x11_sources, ".", "util") >+ sources += util_x11_sources > } > > if (is_android) { >- if (is_shared_library) { >- configs -= [ "//build/config/android:hide_all_but_jni_onload" ] >- } >- > # To prevent linux sources filtering on android > set_sources_assignment_filter([]) >- sources += rebase_path(util_gypi.util_linux_sources, ".", "util") >- sources += rebase_path(util_gypi.util_android_sources, ".", "util") >- libs = [ >+ sources += util_linux_sources >+ sources += util_android_sources >+ libs += [ > "android", > "log", > ] > } > >- if (use_ozone) { >- sources += rebase_path(util_gypi.util_ozone_sources, ".", "util") >- } >+ configs += [ ":debug_annotations_config" ] > >- configs += [ >- ":debug_annotations_config", >- ":extra_warnings", >- ] >- >- public_configs = [ >- ":angle_util_config", >- ":internal_config", >- ] >+ public_configs += [ ":angle_util_config" ] > > deps = [ > ":angle_common", >- ":libEGL${dep_suffix}", >- ":libGLESv2${dep_suffix}", >+ ":angle_util_loader_headers", > ] > >+ public_deps = [] >+ if (is_fuchsia) { >+ sources += util_fuchsia_sources >+ public_deps += [ >+ "$angle_root/src/common/fuchsia_egl", >+ "//third_party/fuchsia-sdk/sdk:async_loop_cpp", >+ "//third_party/fuchsia-sdk/sdk:fdio", >+ "//third_party/fuchsia-sdk/sdk:images", >+ "//third_party/fuchsia-sdk/sdk:scenic_cpp", >+ "//third_party/fuchsia-sdk/sdk:ui_policy", >+ "//third_party/fuchsia-sdk/sdk:ui_scenic", >+ "//third_party/fuchsia-sdk/sdk:ui_views", >+ ] >+ } else if (use_ozone) { >+ sources += util_ozone_sources >+ } >+ > if (is_shared_library) { > defines = [ "LIBANGLE_UTIL_IMPLEMENTATION" ] > >- deps += [ "//build/config:exe_and_shlib_deps" ] >+ if (is_win) { >+ sources += util_win_shared_sources >+ } >+ >+ public_deps += [ ":angle_util_loader" ] > > if (is_mac && !is_component_build) { > ldflags = [ > "-install_name", >- "@rpath/lib${target_name}.dylib", >+ "@rpath/libangle_util.dylib", > ] >- public_configs += [ ":shared_library_public_config" ] > } >+ } else { >+ public_configs += [ >+ ":angle_static", >+ ":gl_prototypes", >+ ] > } > } > } >@@ -770,7 +998,7 @@ foreach(is_shared_library, > # Convenience targets for some of the samples so they can be built > # with Chromium's toolchain. > >-executable("angle_shader_translator") { >+angle_executable("angle_shader_translator") { > testonly = true > > sources = [ >@@ -779,6 +1007,107 @@ executable("angle_shader_translator") { > > deps = [ > ":translator", >- "//build/config:exe_and_shlib_deps", > ] > } >+ >+config("angle_feature_support_config") { >+ include_dirs = [ >+ "include", >+ "src", >+ ] >+ defines = [ "LIBFEATURE_SUPPORT_IMPLEMENTATION" ] >+ if (is_debug) { >+ defines += [ "ANGLE_FEATURE_UTIL_LOG_VERBOSE" ] >+ } >+} >+ >+angle_shared_library("libfeature_support${angle_libs_suffix}") { >+ if (is_android) { >+ libs = [ "log" ] >+ } >+ >+ public_configs += [ >+ ":angle_feature_support_config", >+ "${angle_jsoncpp_dir}:jsoncpp_config", >+ ] >+ >+ if (is_mac && !is_component_build) { >+ ldflags = [ >+ "-install_name", >+ "@rpath/${target_name}.dylib", >+ ] >+ } >+ >+ sources = [ >+ "src/feature_support_util/feature_support_util.cpp", >+ "src/feature_support_util/feature_support_util.h", >+ ] >+ >+ deps = [ >+ ":angle_gpu_info_util", >+ "${angle_jsoncpp_dir}:jsoncpp", >+ ] >+} >+ >+if (!is_component_build && is_android && symbol_level != 0) { >+ action_foreach("compressed_symbols") { >+ sources = [] >+ foreach(_library, angle_libraries) { >+ sources += [ "${root_out_dir}/lib${_library}${angle_libs_suffix}.so" ] >+ } >+ if (angle_enable_vulkan_validation_layers) { >+ foreach(_layer, vulkan_validation_layers) { >+ sources += [ "${root_out_dir}/lib${_layer}.so" ] >+ } >+ } >+ >+ script = rebase_path("${root_build_dir}/android/compress_symbols.py", >+ root_build_dir) >+ >+ deps = [] >+ foreach(_library, angle_libraries) { >+ deps += [ "${angle_root}:lib${_library}${angle_libs_suffix}" ] >+ } >+ >+ if (angle_enable_vulkan_validation_layers) { >+ foreach(_layer, vulkan_validation_layers) { >+ deps += >+ [ "${angle_root}/third_party/vulkan-validation-layers:${_layer}" ] >+ } >+ } >+ >+ outputs = [ >+ "$root_out_dir/lib.compressed/{{source_file_part}}", >+ ] >+ >+ android_nm = "${android_tool_prefix}nm" >+ >+ args = [ >+ "--objcopy", >+ rebase_path(android_objcopy, root_build_dir), >+ "--nm", >+ rebase_path(android_nm, root_build_dir), >+ "--sofile", >+ "{{source}}", >+ "--unstrippedsofile", >+ "{{source_dir}}/lib.unstripped/{{source_file_part}}", >+ "--output", >+ "{{source_dir}}/lib.compressed/{{source_file_part}}", >+ ] >+ } >+} >+ >+if (!is_component_build && is_android && >+ current_toolchain == default_toolchain) { >+ # Package ANGLE libraries >+ angle_apk("angle_chromium_apk") { >+ package_name = "com.chromium.angle" >+ apk_name = "AngleLibraries" >+ } >+ >+ group("angle_apks") { >+ deps = [ >+ ":angle_chromium_apk", >+ ] >+ } >+} >diff --git a/Source/ThirdParty/ANGLE/CMakeLists.txt b/Source/ThirdParty/ANGLE/CMakeLists.txt >index 90de871668d..4a85807af46 100644 >--- a/Source/ThirdParty/ANGLE/CMakeLists.txt >+++ b/Source/ThirdParty/ANGLE/CMakeLists.txt >@@ -1,353 +1,158 @@ >-include_directories( >- . >- src >- src/common/third_party/base >- include >- include/KHR >-) >+# TODO REMOVE AFTER RELANDING THIS >+function(WEBKIT_COPY_FILES target_name) >+ set(options FLATTENED) >+ set(oneValueArgs DESTINATION) >+ set(multiValueArgs FILES) >+ cmake_parse_arguments(opt "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) >+ set(files ${opt_FILES}) >+ set(dst_files) >+ foreach (file IN LISTS files) >+ if (IS_ABSOLUTE ${file}) >+ set(src_file ${file}) >+ else () >+ set(src_file ${CMAKE_CURRENT_SOURCE_DIR}/${file}) >+ endif () >+ if (opt_FLATTENED) >+ get_filename_component(filename ${file} NAME) >+ set(dst_file ${opt_DESTINATION}/${filename}) >+ else () >+ get_filename_component(file_dir ${file} DIRECTORY) >+ file(MAKE_DIRECTORY ${opt_DESTINATION}/${file_dir}) >+ set(dst_file ${opt_DESTINATION}/${file}) >+ endif () >+ add_custom_command(OUTPUT ${dst_file} >+ COMMAND ${CMAKE_COMMAND} -E copy ${src_file} ${dst_file} >+ MAIN_DEPENDENCY ${file} >+ VERBATIM >+ ) >+ list(APPEND dst_files ${dst_file}) >+ endforeach () >+ add_custom_target(${target_name} DEPENDS ${dst_files}) >+endfunction() >+ >+include(Compiler.cmake) >+include(GLESv2.cmake) > > if (WIN32) > # FIXME: DX11 support will not compile if this preprocessor definition is set > # DirectX Documentation is setting that version to 0x700 but there is no > # corresponding value in sdkddkver.h >- remove_definitions(-D_WIN32_WINNT=0x601) >+ remove_definitions(-D_WIN32_WINNT=0x601 -DWINVER=0x601) > endif () > >-set(ANGLEEGL_SOURCES >- src/libEGL/libEGL.cpp >-) >- >-set(ANGLEEGL_COMPILE_DEFINITIONS >- EGLAPI= >+set(no_gl_prototypes >+ GL_GLES_PROTOTYPES=0 >+ EGL_EGL_PROTOTYPES=0 > ) > >-set(ANGLEGLESv2_SOURCES >- src/libGLESv2/entry_points_egl.cpp >- src/libGLESv2/entry_points_egl_ext.cpp >- src/libGLESv2/entry_points_gles_2_0_autogen.cpp >- src/libGLESv2/entry_points_gles_2_0_ext.cpp >- src/libGLESv2/entry_points_gles_3_0_autogen.cpp >- src/libGLESv2/entry_points_gles_3_1_autogen.cpp >- src/libGLESv2/global_state.cpp >- src/libGLESv2/libGLESv2.cpp >- src/libGLESv2/proc_table_autogen.cpp >+set(gl_prototypes >+ GL_GLES_PROTOTYPES=1 >+ EGL_EGL_PROTOTYPES=1 >+ GL_GLEXT_PROTOTYPES >+ EGL_EGLEXT_PROTOTYPES > ) > >-set(ANGLEGLESv2_COMPILE_DEFINITIONS >- GL_APICALL= >- LIBGLESV2_IMPLEMENTATION >+# ANGLE makes a number of small static libraries that are then joined into a >+# bigger library that is built shared. Rather than making the small libraries >+# there will be a ANGLE whose sources are dependent on whether the library >+# is being used as a compiler or as a GLES implementation. >+# >+# The corresponding gn targets are described below >+# >+# ANGLE (Compiler only) >+# + angle_common >+# + preprocessor >+# + translator >+# >+# ANGLE (GLES) >+# + ANGLE (Compiler only) >+# + xxhash >+# + angle_image_util >+# + angle_system_utils (OS specific) >+# + angle_(renderer) (Backend and OS specific) >+ >+set(ANGLE_PRIVATE_INCLUDE_DIRECTORIES >+ "${CMAKE_CURRENT_SOURCE_DIR}/include" >+ "${CMAKE_CURRENT_SOURCE_DIR}/src" >+ "${CMAKE_CURRENT_SOURCE_DIR}/src/common/third_party/base" > ) > >-set(ANGLEGLESv2_LIBRARIES >- libANGLE >+set(ANGLE_DEFINITIONS >+ ANGLE_ENABLE_ESSL > ) > > set(ANGLE_SOURCES >- src/common/angleutils.cpp >- src/common/debug.cpp >- src/common/event_tracer.cpp >- src/common/Float16ToFloat32.cpp >- src/common/mathutil.cpp >- src/common/MemoryBuffer.cpp >- src/common/string_utils.cpp >- src/common/third_party/smhasher/src/PMurHash.cpp >- src/common/third_party/base/anglebase/sha1.cc >- src/common/tls.cpp >- src/common/uniform_type_info_autogen.cpp >- src/common/utilities.cpp >- src/compiler/preprocessor/DiagnosticsBase.cpp >- src/compiler/preprocessor/DirectiveHandlerBase.cpp >- src/compiler/preprocessor/DirectiveParser.cpp >- src/compiler/preprocessor/ExpressionParser.cpp >- src/compiler/preprocessor/Input.cpp >- src/compiler/preprocessor/Lexer.cpp >- src/compiler/preprocessor/Macro.cpp >- src/compiler/preprocessor/MacroExpander.cpp >- src/compiler/preprocessor/Preprocessor.cpp >- src/compiler/preprocessor/Token.cpp >- src/compiler/preprocessor/Tokenizer.cpp >- src/compiler/translator/ASTMetadataHLSL.cpp >- src/compiler/translator/AddAndTrueToLoopCondition.cpp >- src/compiler/translator/AddDefaultReturnStatements.cpp >- src/compiler/translator/ArrayReturnValueToOutParameter.cpp >- src/compiler/translator/BreakVariableAliasingInInnerLoops.cpp >- src/compiler/translator/BuiltInFunctionEmulator.cpp >- src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp >- src/compiler/translator/BuiltInFunctionEmulatorHLSL.cpp >- src/compiler/translator/Cache.cpp >- src/compiler/translator/CallDAG.cpp >- src/compiler/translator/ClampPointSize.cpp >- src/compiler/translator/CodeGen.cpp >- src/compiler/translator/CollectVariables.cpp >- src/compiler/translator/Compiler.cpp >- src/compiler/translator/ConstantUnion.cpp >- src/compiler/translator/DeclareAndInitBuiltinsForInstancedMultiview.cpp >- src/compiler/translator/DeferGlobalInitializers.cpp >- src/compiler/translator/Diagnostics.cpp >- src/compiler/translator/DirectiveHandler.cpp >- src/compiler/translator/EmulateGLFragColorBroadcast.cpp >- src/compiler/translator/EmulatePrecision.cpp >- src/compiler/translator/ExpandIntegerPowExpressions.cpp >- src/compiler/translator/ExtensionBehavior.cpp >- src/compiler/translator/ExtensionGLSL.cpp >- src/compiler/translator/FindMain.cpp >- src/compiler/translator/FindSymbolNode.cpp >- src/compiler/translator/FlagStd140Structs.cpp >- src/compiler/translator/HashNames.cpp >- src/compiler/translator/ImageFunctionHLSL.cpp >- src/compiler/translator/InfoSink.cpp >- src/compiler/translator/Initialize.cpp >- src/compiler/translator/InitializeDll.cpp >- src/compiler/translator/InitializeVariables.cpp >- src/compiler/translator/IntermNode.cpp >- src/compiler/translator/IntermNodePatternMatcher.cpp >- src/compiler/translator/IntermNode_util.cpp >- src/compiler/translator/IntermTraverse.cpp >- src/compiler/translator/IsASTDepthBelowLimit.cpp >- src/compiler/translator/Operator.cpp >- src/compiler/translator/OutputESSL.cpp >- src/compiler/translator/OutputGLSL.cpp >- src/compiler/translator/OutputGLSLBase.cpp >- src/compiler/translator/OutputHLSL.cpp >- src/compiler/translator/OutputTree.cpp >- src/compiler/translator/OutputVulkanGLSL.cpp >- src/compiler/translator/ParseContext.cpp >- src/compiler/translator/PoolAlloc.cpp >- src/compiler/translator/PruneNoOps.cpp >- src/compiler/translator/QualifierTypes.cpp >- src/compiler/translator/RecordConstantPrecision.cpp >- src/compiler/translator/RegenerateStructNames.cpp >- src/compiler/translator/RemoveArrayLengthMethod.cpp >- src/compiler/translator/RemoveDynamicIndexing.cpp >- src/compiler/translator/RemoveEmptySwitchStatements.cpp >- src/compiler/translator/RemoveInvariantDeclaration.cpp >- src/compiler/translator/RemoveNoOpCasesFromEndOfSwitchStatements.cpp >- src/compiler/translator/RemovePow.cpp >- src/compiler/translator/RemoveSwitchFallThrough.cpp >- src/compiler/translator/RemoveUnreferencedVariables.cpp >- src/compiler/translator/RewriteDoWhile.cpp >- src/compiler/translator/RewriteElseBlocks.cpp >- src/compiler/translator/RewriteTexelFetchOffset.cpp >- src/compiler/translator/RewriteUnaryMinusOperatorFloat.cpp >- src/compiler/translator/RewriteUnaryMinusOperatorInt.cpp >- src/compiler/translator/RunAtTheEndOfShader.cpp >- src/compiler/translator/ScalarizeVecAndMatConstructorArgs.cpp >- src/compiler/translator/SearchSymbol.cpp >- src/compiler/translator/SeparateArrayInitialization.cpp >- src/compiler/translator/SeparateDeclarations.cpp >- src/compiler/translator/SeparateExpressionsReturningArrays.cpp >- src/compiler/translator/ShaderLang.cpp >- src/compiler/translator/ShaderVars.cpp >- src/compiler/translator/SimplifyLoopConditions.cpp >- src/compiler/translator/SplitSequenceOperator.cpp >- src/compiler/translator/StructureHLSL.cpp >- src/compiler/translator/SymbolTable.cpp >- src/compiler/translator/SymbolUniqueId.cpp >- src/compiler/translator/TextureFunctionHLSL.cpp >- src/compiler/translator/TranslatorESSL.cpp >- src/compiler/translator/TranslatorGLSL.cpp >- src/compiler/translator/TranslatorHLSL.cpp >- src/compiler/translator/TranslatorVulkan.cpp >- src/compiler/translator/Types.cpp >- src/compiler/translator/UnfoldShortCircuitAST.cpp >- src/compiler/translator/UnfoldShortCircuitToIf.cpp >- src/compiler/translator/UniformHLSL.cpp >- src/compiler/translator/UseInterfaceBlockFields.cpp >- src/compiler/translator/UtilsHLSL.cpp >- src/compiler/translator/ValidateGlobalInitializer.cpp >- src/compiler/translator/ValidateLimitations.cpp >- src/compiler/translator/ValidateMaxParameters.cpp >- src/compiler/translator/ValidateOutputs.cpp >- src/compiler/translator/ValidateSwitch.cpp >- src/compiler/translator/ValidateVaryingLocations.cpp >- src/compiler/translator/VariablePacker.cpp >- src/compiler/translator/VectorizeVectorScalarArithmetic.cpp >- src/compiler/translator/VersionGLSL.cpp >- src/compiler/translator/WrapSwitchStatementsInBlocks.cpp >- src/compiler/translator/blocklayout.cpp >- src/compiler/translator/blocklayoutHLSL.cpp >- src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp >- src/compiler/translator/glslang_lex.cpp >- src/compiler/translator/glslang_tab.cpp >- src/compiler/translator/util.cpp >- src/image_util/copyimage.cpp >- src/image_util/imageformats.cpp >- src/image_util/loadimage.cpp >- src/image_util/loadimage_etc.cpp >- src/libANGLE/AttributeMap.cpp >- src/libANGLE/Buffer.cpp >- src/libANGLE/Caps.cpp >- src/libANGLE/Compiler.cpp >- src/libANGLE/Config.cpp >- src/libANGLE/Context.cpp >- src/libANGLE/ContextState.cpp >- src/libANGLE/Debug.cpp >- src/libANGLE/Device.cpp >- src/libANGLE/Display.cpp >- src/libANGLE/Error.cpp >- src/libANGLE/Fence.cpp >- src/libANGLE/Framebuffer.cpp >- src/libANGLE/FramebufferAttachment.cpp >- src/libANGLE/HandleAllocator.cpp >- src/libANGLE/HandleRangeAllocator.cpp >- src/libANGLE/Image.cpp >- src/libANGLE/ImageIndex.cpp >- src/libANGLE/IndexRangeCache.cpp >- src/libANGLE/LoggingAnnotator.cpp >- src/libANGLE/MemoryProgramCache.cpp >- src/libANGLE/PackedGLEnums_autogen.cpp >- src/libANGLE/Path.cpp >- src/libANGLE/Platform.cpp >- src/libANGLE/Program.cpp >- src/libANGLE/ProgramLinkedResources.cpp >- src/libANGLE/ProgramPipeline.cpp >- src/libANGLE/Query.cpp >- src/libANGLE/Renderbuffer.cpp >- src/libANGLE/ResourceManager.cpp >- src/libANGLE/Sampler.cpp >- src/libANGLE/Shader.cpp >- src/libANGLE/State.cpp >- src/libANGLE/Stream.cpp >- src/libANGLE/Surface.cpp >- src/libANGLE/Texture.cpp >- src/libANGLE/Thread.cpp >- src/libANGLE/TransformFeedback.cpp >- src/libANGLE/Uniform.cpp >- src/libANGLE/VaryingPacking.cpp >- src/libANGLE/VertexArray.cpp >- src/libANGLE/VertexAttribute.cpp >- src/libANGLE/WorkerThread.cpp >- src/libANGLE/angletypes.cpp >- src/libANGLE/es3_copy_conversion_table_autogen.cpp >- src/libANGLE/format_map_autogen.cpp >- src/libANGLE/formatutils.cpp >- src/libANGLE/params.cpp >- src/libANGLE/queryconversions.cpp >- src/libANGLE/queryutils.cpp >- src/libANGLE/renderer/ContextImpl.cpp >- src/libANGLE/renderer/DeviceImpl.cpp >- src/libANGLE/renderer/DisplayImpl.cpp >- src/libANGLE/renderer/Format_table_autogen.cpp >- src/libANGLE/renderer/SurfaceImpl.cpp >- src/libANGLE/renderer/TextureImpl.cpp >- src/libANGLE/renderer/driver_utils.cpp >- src/libANGLE/renderer/load_functions_table_autogen.cpp >- src/libANGLE/renderer/renderer_utils.cpp >- src/libANGLE/validationEGL.cpp >- src/libANGLE/validationES.cpp >- src/libANGLE/validationES2.cpp >- src/libANGLE/validationES3.cpp >- src/libANGLE/validationES31.cpp >- src/third_party/compiler/ArrayBoundsClamper.cpp >+ ${libangle_common_sources} >+ ${angle_preprocessor_sources} >+ ${angle_translator_essl_sources} >+ ${angle_translator_glsl_sources} >+ ${angle_translator_sources} > ) > >-set(ANGLE_COMPILE_DEFINITIONS >- ANGLE_ENABLE_ESSL >- ANGLE_ENABLE_GLSL >- LIBANGLE_IMPLEMENTATION >- NOMINMAX >+set(ANGLEGLESv2_LIBRARIES >+ ANGLE > ) > >-if (NOT WIN32) >- list(APPEND ANGLE_SOURCES >- src/libANGLE/renderer/gl/BlitGL.cpp >- src/libANGLE/renderer/gl/BufferGL.cpp >- src/libANGLE/renderer/gl/ClearMultiviewGL.cpp >- src/libANGLE/renderer/gl/CompilerGL.cpp >- src/libANGLE/renderer/gl/ContextGL.cpp >- src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp >- src/libANGLE/renderer/gl/DisplayGL.cpp >- src/libANGLE/renderer/gl/FenceNVGL.cpp >- src/libANGLE/renderer/gl/FramebufferGL.cpp >- src/libANGLE/renderer/gl/FunctionsGL.cpp >- src/libANGLE/renderer/gl/PathGL.cpp >- src/libANGLE/renderer/gl/ProgramGL.cpp >- src/libANGLE/renderer/gl/ProgramPipelineGL.cpp >- src/libANGLE/renderer/gl/QueryGL.cpp >- src/libANGLE/renderer/gl/RenderbufferGL.cpp >- src/libANGLE/renderer/gl/RendererGL.cpp >- src/libANGLE/renderer/gl/SamplerGL.cpp >- src/libANGLE/renderer/gl/ShaderGL.cpp >- src/libANGLE/renderer/gl/StateManagerGL.cpp >- src/libANGLE/renderer/gl/SurfaceGL.cpp >- src/libANGLE/renderer/gl/SyncGL.cpp >- src/libANGLE/renderer/gl/TextureGL.cpp >- src/libANGLE/renderer/gl/TransformFeedbackGL.cpp >- src/libANGLE/renderer/gl/VertexArrayGL.cpp >- src/libANGLE/renderer/gl/egl/DisplayEGL.cpp >- src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp >- src/libANGLE/renderer/gl/egl/FunctionsEGLDL.cpp >- src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.cpp >- src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp >- src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.cpp >- src/libANGLE/renderer/gl/egl/android/DisplayAndroid.cpp >- src/libANGLE/renderer/gl/egl/egl_utils.cpp >- src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp >- src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp >- src/libANGLE/renderer/gl/formatutilsgl.cpp >- src/libANGLE/renderer/gl/glx/DisplayGLX.cpp >- src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp >- src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp >- src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp >- src/libANGLE/renderer/gl/null_functions.cpp >- src/libANGLE/renderer/gl/renderergl_utils.cpp >- src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp >- src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp >- src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp >- src/libANGLE/renderer/gl/wgl/FunctionsWGL.cpp >- src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp >- src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp >- src/libANGLE/renderer/gl/wgl/wgl_utils.cpp >- ) >- list(APPEND ANGLE_COMPILE_DEFINITIONS >- ANGLE_ENABLE_OPENGL >- ) >-endif () >- > WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS() > >-add_library(libEGL SHARED ${ANGLEEGL_SOURCES}) >-set_property(TARGET libEGL PROPERTY COMPILE_DEFINITIONS ${ANGLEEGL_COMPILE_DEFINITIONS}) >- >-add_library(libGLESv2 SHARED ${ANGLEGLESv2_SOURCES}) >-set_property(TARGET libGLESv2 PROPERTY COMPILE_DEFINITIONS ${ANGLEGLESv2_COMPILE_DEFINITIONS}) >+add_subdirectory(include) > >-add_library(libANGLE STATIC ${ANGLE_SOURCES}) >-set_property(TARGET libANGLE PROPERTY COMPILE_DEFINITIONS ${ANGLE_COMPILE_DEFINITIONS}) >+add_library(ANGLEFramework INTERFACE) >+add_dependencies(ANGLEFramework ANGLEHeaders) > >-target_link_libraries(libEGL >- libGLESv2 >-) >+if (USE_ANGLE_EGL) >+ add_library(ANGLE STATIC >+ ${ANGLE_SOURCES} >+ ${libangle_sources} >+ ${libangle_image_util_sources} >+ ${xxhash_sources} >+ ) >+ target_include_directories(ANGLE PRIVATE ${ANGLE_PRIVATE_INCLUDE_DIRECTORIES}) >+ target_compile_definitions(ANGLE PRIVATE >+ ${no_gl_prototypes} >+ LIBANGLE_IMPLEMENTATION >+ ) >+ target_compile_definitions(ANGLE PUBLIC ${ANGLE_DEFINITIONS}) >+ >+ add_library(GLESv2 SHARED ${libglesv2_sources}) >+ target_include_directories(GLESv2 PRIVATE ${ANGLE_PRIVATE_INCLUDE_DIRECTORIES}) >+ target_compile_definitions(GLESv2 PRIVATE LIBGLESV2_IMPLEMENTATION) >+ target_link_libraries(GLESv2 ${ANGLEGLESv2_LIBRARIES}) >+ >+ add_library(EGL SHARED ${libegl_sources}) >+ target_include_directories(EGL PRIVATE ${ANGLE_PRIVATE_INCLUDE_DIRECTORIES}) >+ target_compile_definitions(EGL PRIVATE >+ ${gl_prototypes} >+ EGLAPI= >+ ) >+ target_link_libraries(EGL GLESv2) >+ >+ if (WIN32) >+ target_sources(GLESv2 PRIVATE src/libGLESv2/libGLESv2_autogen.def) >+ target_sources(EGL PRIVATE src/libEGL/libEGL.def) >+ >+ # Output library names according to the .def >+ set_target_properties(GLESv2 PROPERTIES OUTPUT_NAME libGLESv2) >+ set_target_properties(EGL PROPERTIES OUTPUT_NAME libEGL) >+ endif () >+ >+ target_link_libraries(ANGLEFramework INTERFACE EGL GLESv2) >+ target_compile_definitions(ANGLEFramework INTERFACE ${gl_prototypes}) >+else () >+ add_library(ANGLE STATIC ${ANGLE_SOURCES}) >+ target_include_directories(ANGLE PRIVATE ${ANGLE_PRIVATE_INCLUDE_DIRECTORIES}) >+ target_compile_definitions(ANGLE PRIVATE >+ ${ANGLE_DEFINITIONS} >+ ${no_gl_prototypes} >+ LIBANGLE_IMPLEMENTATION >+ ) >+endif () > >-target_link_libraries(libGLESv2 ${ANGLEGLESv2_LIBRARIES}) >+if (COMPILER_IS_GCC_OR_CLANG) >+ WEBKIT_ADD_TARGET_CXX_FLAGS(ANGLE -Wno-cast-align -Wno-unused-parameter) >+endif () > >-file(MAKE_DIRECTORY ${FORWARDING_HEADERS_DIR}/ANGLE/include/egl) >-file(MAKE_DIRECTORY ${FORWARDING_HEADERS_DIR}/ANGLE/include/GLES2) >-file(MAKE_DIRECTORY ${FORWARDING_HEADERS_DIR}/ANGLE/include/GLSLANG) >-file(MAKE_DIRECTORY ${FORWARDING_HEADERS_DIR}/ANGLE/include/khr) >-file(GLOB _files_ANGLE "${THIRDPARTY_DIR}/ANGLE/ANGLE/*.h") >-file(GLOB _files_egl "${THIRDPARTY_DIR}/ANGLE/include/egl/*.h") >-file(GLOB _files_GLES2 "${THIRDPARTY_DIR}/ANGLE/include/GLES2/*.h") >-file(GLOB _files_GLES3 "${THIRDPARTY_DIR}/ANGLE/include/GLES3/*.h") >-file(GLOB _files_GLSLANG "${THIRDPARTY_DIR}/ANGLE/include/GLSLANG/*.h") >-file(GLOB _files_khr "${THIRDPARTY_DIR}/ANGLE/include/khr/*.h") >-foreach (_file ${_files_ANGLE}) >- file(COPY ${_file} DESTINATION ${FORWARDING_HEADERS_DIR}/ANGLE/) >-endforeach () >-foreach (_file ${_files_egl}) >- file(COPY ${_file} DESTINATION ${FORWARDING_HEADERS_DIR}/ANGLE/include/egl) >-endforeach () >-foreach (_file ${_files_GLES2}) >- file(COPY ${_file} DESTINATION ${FORWARDING_HEADERS_DIR}/ANGLE/include/GLES2) >-endforeach () >-foreach (_file ${_files_GLES3}) >- file(COPY ${_file} DESTINATION ${FORWARDING_HEADERS_DIR}/ANGLE/include/GLES3) >-endforeach () >-foreach (_file ${_files_GLSLANG}) >- file(COPY ${_file} DESTINATION ${FORWARDING_HEADERS_DIR}/ANGLE/include/GLSLANG) >-endforeach () >-foreach (_file ${_files_khr}) >- file(COPY ${_file} DESTINATION ${FORWARDING_HEADERS_DIR}/ANGLE/include/khr) >-endforeach () >+target_link_libraries(ANGLEFramework INTERFACE ANGLE) >+target_include_directories(ANGLEFramework INTERFACE ${ANGLE_FRAMEWORK_HEADERS_DIR}) > > set_property(DIRECTORY . PROPERTY FOLDER "ANGLE") >diff --git a/Source/ThirdParty/ANGLE/CONTRIBUTORS b/Source/ThirdParty/ANGLE/CONTRIBUTORS >index a767773b33f..4c3baa352cf 100644 >--- a/Source/ThirdParty/ANGLE/CONTRIBUTORS >+++ b/Source/ThirdParty/ANGLE/CONTRIBUTORS >@@ -42,6 +42,8 @@ Google Inc. > Scott Graham > Corentin Wallez > Kai Ninomiya >+ Victor Costan >+ Shahbaz Youssefi > > Adobe Systems Inc. > Alexandru Chiculita >@@ -73,11 +75,13 @@ Intel Corporation > Yunchao He > Xinghua Cao > Brandon Jones >+ Enrico Galli > > Klarälvdalens Datakonsult AB > Milian Wolff > > Mozilla Corp. >+ Dzmitry Malyshau > Ehsan Akhgari > Edwin Flores > Jeff Gilbert >@@ -99,12 +103,16 @@ Sebastian Bergstein > James Ross-Gowan > Andrei Volykhin > Jérôme Duval >+Till Rathmann > > Microsoft Corporation > Cooper Partin > Austin Kinross >+ Mingyu Hu > Minmin Gong > Shawn Hargreaves >+ Rafael Cintron >+ James Clarke > > Microsoft Open Technologies, Inc. > Cooper Partin >@@ -117,6 +125,8 @@ NVIDIA Corporation > Kimmo Kinnunen > Sami Väisänen > Martin Radev >+ Joonatan Saarhelo >+ Markus Tavenrath > > Opera Software ASA > Daniel Bratell >@@ -125,3 +135,13 @@ Opera Software ASA > > Advanced Micro Devices, Inc. > Russ Lind >+ >+LG Electronics, Inc. >+ Jani Hautakangas >+ >+IBM Inc. >+ Junliang Yan >+ >+AdaptVis GmbH >+ Sascha Kolodzey >+ >diff --git a/Source/ThirdParty/ANGLE/ChangeLog b/Source/ThirdParty/ANGLE/ChangeLog >deleted file mode 100644 >index 7dfef2ee964..00000000000 >--- a/Source/ThirdParty/ANGLE/ChangeLog >+++ /dev/null >@@ -1,11559 +0,0 @@ >-2019-04-29 Alex Christensen <achristensen@webkit.org> >- >- <rdar://problem/50299396> Fix internal High Sierra build >- https://bugs.webkit.org/show_bug.cgi?id=197388 >- >- * Configurations/Base.xcconfig: >- >-2019-04-25 Alex Christensen <achristensen@webkit.org> >- >- Start using C++17 >- https://bugs.webkit.org/show_bug.cgi?id=197131 >- >- Reviewed by Darin Adler. >- >- * Configurations/Base.xcconfig: >- >-2019-03-22 Keith Rollin <krollin@apple.com> >- >- Enable ThinLTO support in Production builds >- https://bugs.webkit.org/show_bug.cgi?id=190758 >- <rdar://problem/45413233> >- >- Reviewed by Daniel Bates. >- >- Enable building with Thin LTO in Production when using Xcode 10.2 or >- later. This change results in a 1.45% progression in PLT5. Full >- Production build times increase about 2-3%. Incremental build times >- are more severely affected, and so LTO is not enabled for local >- engineering builds. >- >- LTO is enabled only on macOS for now, until rdar://problem/49013399, >- which affects ARM builds, is fixed. >- >- To change the LTO setting when building locally: >- >- - If building with `make`, specify WK_LTO_MODE={none,thin,full} on the >- command line. >- - If building with `build-webkit`, specify --lto-mode={none,thin,full} >- on the command line. >- - If building with `build-root`, specify --lto={none,thin,full} on the >- command line. >- - If building with Xcode, create a LocalOverrides.xcconfig file at the >- top level of your repository directory (if needed) and define >- WK_LTO_MODE to full, thin, or none. >- >- * Configurations/Base.xcconfig: >- >-2019-02-23 Keith Miller <keith_miller@apple.com> >- >- Add new mac target numbers >- https://bugs.webkit.org/show_bug.cgi?id=194955 >- >- Reviewed by Tim Horton. >- >- * Configurations/Base.xcconfig: >- * Configurations/DebugRelease.xcconfig: >- >-2019-02-20 Andy Estes <aestes@apple.com> >- >- [Xcode] Add SDKVariant.xcconfig to various Xcode projects >- https://bugs.webkit.org/show_bug.cgi?id=194869 >- >- Rubber-stamped by Jer Noble. >- >- * ANGLE.xcodeproj/project.pbxproj: >- >-2019-01-18 Jer Noble <jer.noble@apple.com> >- >- SDK_VARIANT build destinations should be separate from non-SDK_VARIANT builds >- https://bugs.webkit.org/show_bug.cgi?id=189553 >- >- Reviewed by Tim Horton. >- >- * Configurations/Base.xcconfig: >- * Configurations/SDKVariant.xcconfig: Added. >- >-2019-01-17 Truitt Savell <tsavell@apple.com> >- >- Unreviewed, rolling out r240124. >- >- This commit broke an internal build. >- >- Reverted changeset: >- >- "SDK_VARIANT build destinations should be separate from non- >- SDK_VARIANT builds" >- https://bugs.webkit.org/show_bug.cgi?id=189553 >- https://trac.webkit.org/changeset/240124 >- >-2019-01-17 Jer Noble <jer.noble@apple.com> >- >- SDK_VARIANT build destinations should be separate from non-SDK_VARIANT builds >- https://bugs.webkit.org/show_bug.cgi?id=189553 >- >- Reviewed by Tim Horton. >- >- * Configurations/Base.xcconfig: >- * Configurations/SDKVariant.xcconfig: Added. >- >-2019-01-15 David Kilzer <ddkilzer@apple.com> >- >- clang-tidy: Fix unnecessary copy of for loop variables in ANGLE >- <https://webkit.org/b/193443> >- >- Reviewed by Alex Christensen. >- >- Fix unwanted copying of loop variables by making them const >- references. >- >- * src/compiler/preprocessor/MacroExpander.cpp: >- (pp::MacroExpander::ScopedMacroReenabler::~ScopedMacroReenabler): >- - Prevents copy and reference churn of std::shared_ptr<Macro> >- objects. >- * src/compiler/translator/Compiler.cpp: >- (sh::TCompiler::useAllMembersInUnusedStandardAndSharedBlocks): >- - Prevents copy of sh::InterfaceBlock structs. >- (sh::TCompiler::initializeOutputVariables): >- - Prevents copy of sh::Varying structs. >- * src/libANGLE/Program.cpp: >- (gl::(anonymous namespace)::IncludeSameArrayElement): >- - Prevents copy of std::string objects. >- >-2018-10-03 Dan Bernstein <mitz@apple.com> >- >- ANGLE part of [Xcode] Update some build settings as recommended by Xcode 10 >- https://bugs.webkit.org/show_bug.cgi?id=190250 >- >- Reviewed by Andy Estes. >- >- * ANGLE.xcodeproj/project.pbxproj: Kept the unreachable code warning off for four files that >- were generated by tools: glslang_lex.cpp, glslang_tab.cpp, Tokenizer.cpp, and >- ExpressionParser.cpp. Let Xcode update LastUpgradeCheck. >- >- * Configurations/Base.xcconfig: Enabled CLANG_WARN_COMMA, CLANG_WARN_INFINITE_RECURSION, >- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS, CLANG_WARN_SUSPICIOUS_MOVE, >- CLANG_WARN_UNREACHABLE_CODE, CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF, and >- CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED. >- >-2018-09-21 Adrian Perez de Castro <aperez@igalia.com> >- >- [GTK] ANGLE's eglplatform.h does not support Wayland-only builds >- https://bugs.webkit.org/show_bug.cgi?id=189844 >- >- Reviewed by Michael Catanzaro. >- >- This makes it possible to build WebKitGTK+ after r225340 when the >- build is configured to support only Wayland, and the X11 headers >- are not present. >- >- * changes.diff: Updated. >- * include/EGL/eglplatform.h: Include the X11 headers only when >- ANGLE_USE_X11 is defined and, for consistency with Mesa's version >- of the header, when MESA_EGL_NO_X11_HEADERS is not defined. >- >-2018-08-29 David Kilzer <ddkilzer@apple.com> >- >- Remove empty directories from from svn.webkit.org repository >- <https://webkit.org/b/189081> >- >- * src/angle.xcodeproj: Removed. >- * src/common/third_party/numerics: Removed. >- >-2018-08-28 David Kilzer <ddkilzer@apple.com> >- >- Move PMurHash.{cpp,h} into 'src' folder to match path on disk >- >- * ANGLE.xcodeproj/project.pbxproj: >- (src/common/third_party/smhasher/src): Add folder and move >- PMurHash.{cpp,h} into it. This makes tidy-Xcode-project-file >- run smoothly when updating the ANGLE project. >- >-2018-08-27 Keith Rollin <krollin@apple.com> >- >- Unreviewed build fix -- disable LTO for production builds >- >- * Configurations/Base.xcconfig: >- >-2018-08-27 Keith Rollin <krollin@apple.com> >- >- Build system support for LTO >- https://bugs.webkit.org/show_bug.cgi?id=187785 >- <rdar://problem/42353132> >- >- Reviewed by Dan Bernstein. >- >- Update Base.xcconfig and DebugRelease.xcconfig to optionally enable >- LTO. >- >- * Configurations/Base.xcconfig: >- * Configurations/DebugRelease.xcconfig: >- >-2018-08-03 Alex Christensen <achristensen@webkit.org> >- >- Fix spelling of "overridden" >- https://bugs.webkit.org/show_bug.cgi?id=188315 >- >- Reviewed by Darin Adler. >- >- * src/libANGLE/renderer/ProgramImpl.h: >- >-2018-07-14 Kocsen Chung <kocsen_chung@apple.com> >- >- Ensure WebKit stack is ad-hoc signed >- https://bugs.webkit.org/show_bug.cgi?id=187667 >- >- Reviewed by Alexey Proskuryakov. >- >- * Configurations/Base.xcconfig: >- >-2018-07-04 Tim Horton <timothy_horton@apple.com> >- >- Introduce PLATFORM(IOSMAC) >- https://bugs.webkit.org/show_bug.cgi?id=187315 >- >- Reviewed by Dan Bernstein. >- >- * Configurations/Base.xcconfig: >- >-2018-06-09 Dan Bernstein <mitz@apple.com> >- >- [Xcode] Clean up and modernize some build setting definitions >- https://bugs.webkit.org/show_bug.cgi?id=186463 >- >- Reviewed by Sam Weinig. >- >- * Configurations/Base.xcconfig: Removed definition for macOS 10.11. >- * Configurations/DebugRelease.xcconfig: Ditto. >- >-2018-05-30 David Kilzer <ddkilzer@apple.com> >- >- ANGLE: Fix clang static analyzer issues in GetExecutablePath() and GetExecutableDirectory() >- <https://webkit.org/b/186106> >- <rdar://problem/40659179> >- >- Reviewed by Alex Christensen. >- >- * src/common/system_utils_linux.cpp: >- (angle::GetExecutablePath): >- (angle::GetExecutableDirectory): >- * src/common/system_utils_mac.cpp: >- (angle::GetExecutablePath): >- (angle::GetExecutableDirectory): >- * src/common/system_utils_win.cpp: >- (angle::GetExecutablePath): >- (angle::GetExecutableDirectory): >- >-2018-05-22 Ryan Haddad <ryanhaddad@apple.com> >- >- Unreviewed, rolling out r232052. >- >- Breaks internal builds. >- >- Reverted changeset: >- >- "Use more C++17" >- https://bugs.webkit.org/show_bug.cgi?id=185176 >- https://trac.webkit.org/changeset/232052 >- >-2018-05-21 Yusuke Suzuki <utatane.tea@gmail.com> >- >- Use more C++17 >- https://bugs.webkit.org/show_bug.cgi?id=185176 >- >- Reviewed by JF Bastien. >- >- * Configurations/Base.xcconfig: >- >-2018-04-18 Jer Noble <jer.noble@apple.com> >- >- Don't put build products into WK_ALTERNATE_WEBKIT_SDK_PATH for engineering builds >- https://bugs.webkit.org/show_bug.cgi?id=184762 >- >- Reviewed by Dan Bernstein. >- >- * Configurations/Base.xcconfig: >- >-2018-04-19 David Kilzer <ddkilzer@apple.com> >- >- Enable Objective-C weak references >- <https://webkit.org/b/184789> >- <rdar://problem/39571716> >- >- Reviewed by Dan Bernstein. >- >- * Configurations/Base.xcconfig: >- (CLANG_ENABLE_OBJC_WEAK): Enable. >- >-2018-03-19 Carlos Alberto Lopez Perez <clopez@igalia.com> >- >- REGRESSION(r225340): WPE port should not be getting EGL X11 types on ANGLE >- https://bugs.webkit.org/show_bug.cgi?id=183749 >- >- Reviewed by Alex Christensen. >- >- Add back the USE_WPE ifdef. >- >- * changes.diff: >- * include/EGL/eglplatform.h: >- >-2018-03-15 Tim Horton <timothy_horton@apple.com> >- >- Add and adopt WK_ALTERNATE_FRAMEWORKS_DIR in ANGLE >- https://bugs.webkit.org/show_bug.cgi?id=183675 >- <rdar://problem/38515281> >- >- Reviewed by Dan Bernstein. >- >- * ANGLE.xcodeproj/project.pbxproj: >- * Configurations/ANGLE.xcconfig: >- * Configurations/Base.xcconfig: >- >-2018-01-27 Dan Bernstein <mitz@apple.com> >- >- HaveInternalSDK includes should be "#include?" >- https://bugs.webkit.org/show_bug.cgi?id=179670 >- >- * Configurations/Base.xcconfig: >- >-2018-01-18 Dan Bernstein <mitz@apple.com> >- >- [Xcode] Streamline and future-proof target-macOS-version-dependent build setting definitions >- https://bugs.webkit.org/show_bug.cgi?id=181803 >- >- Reviewed by Tim Horton. >- >- * Configurations/Base.xcconfig: Updated. >- * Configurations/DebugRelease.xcconfig: Ditto. >- >-2018-01-09 Dan Bernstein <mitz@apple.com> >- >- Removed some empty directories that were left behind >- >- * src/third_party/murmurhash: Removed. >- * third_party: Removed. >- * third_party/deqp: Removed. >- >-2017-12-14 David Kilzer <ddkilzer@apple.com> >- >- Enable -Wstrict-prototypes for WebKit >- <https://webkit.org/b/180757> >- <rdar://problem/36024132> >- >- Rubber-stamped by Joseph Pecoraro. >- >- * Configurations/Base.xcconfig: >- (CLANG_WARN_STRICT_PROTOTYPES): Add. Set to YES. >- >-2017-12-06 Dean Jackson <dino@apple.com> >- >- Update ANGLE's changes.diff >- https://bugs.webkit.org/show_bug.cgi?id=180491 >- >- Reviewed by Antoine Quint. >- >- Here is the list of things we've changed from the >- ANGLE commit that we merged in. >- >- * changes.diff: >- >-2017-12-06 Dean Jackson <dino@apple.com> >- >- Some iOS tests failing after ANGLE update >- https://bugs.webkit.org/show_bug.cgi?id=180487 >- <rdar://problem/35885969> >- >- Reviewed by Antoine Quint. >- >- The iOS OpenGL compiler doesn't like function declarations with >- nameless array parameters. See: >- <rdar://problem/35885989> Nameless array parameters in function declaration cause compiler error >- >- While that is being fixed, tell ANGLE's translator to not cull >- the names from parameters. This is not a bug in ANGLE, so we won't >- fix it upstream at the moment. >- >- * src/compiler/translator/ParseContext.cpp: >- (sh::TParseContext::addFunctionPrototypeDeclaration): >- >-2017-12-01 Michael Catanzaro <mcatanzaro@igalia.com> >- >- Unreviewed, fix byte order macros and address new -Wunknown-pragmas warnings >- https://bugs.webkit.org/show_bug.cgi?id=180177 >- <rdar://problem/35774734> >- >- I'm not sure how this code was developed, as it seems to have been designed for GCC, but it >- does not use any of GCC's documented byte order macros, and accordingly does not work. Let's >- fix it to guarantee there are no problems when building with GCC. I presume it should help >- Clang as well. >- >- This time, hopefully without breaking 32-bit macOS, where __BYTE_ORDER actually is defined. >- >- * src/common/third_party/smhasher/src/PMurHash.cpp: >- (angle::PMurHash32_Process): >- >-2017-12-01 Ryan Haddad <ryanhaddad@apple.com> >- >- Unreviewed, rolling out r225412. >- >- Breaks 32-bit macOS builds. >- >- Reverted changeset: >- >- "Unreviewed, fix byte order macros and address new -Wunknown- >- pragmas warnings" >- https://bugs.webkit.org/show_bug.cgi?id=180177 >- https://trac.webkit.org/changeset/225412 >- >-2017-12-01 Michael Catanzaro <mcatanzaro@igalia.com> >- >- Unreviewed, fix byte order macros and address new -Wunknown-pragmas warnings >- https://bugs.webkit.org/show_bug.cgi?id=180177 >- <rdar://problem/35774734> >- >- I'm not sure how this code was developed, as it seems to have been designed for GCC, but it >- does not use any of GCC's documented byte order macros, and accordingly does not work. Let's >- fix it to guarantee there are no problems when building with GCC. I presume it should help >- Clang as well. >- >- * src/common/third_party/smhasher/src/PMurHash.cpp: >- (angle::PMurHash32_Process): >- >-2017-12-01 Tomoki Imai <Tomoki.Imai@sony.com> >- >- Fix WinCairo build break after r225340 >- https://bugs.webkit.org/show_bug.cgi?id=180230 >- >- Unreviewed build fix. >- >- * CMakeLists.txt: Add missing sources. >- * PlatformWin.cmake: Add missing sources. >- >-2017-12-01 Michael Catanzaro <mcatanzaro@igalia.com> >- >- Unreviewed, fix -Wunknown-pragmas warnings. >- https://bugs.webkit.org/show_bug.cgi?id=180177 >- >- It seems GCC has started to warn about unrecognized Clang pragmas. Oh well. >- >- This is not sent upstream, because the Clang pragmas appear to be downstream WebKit >- additions. changes.diff is not updated, because it was not updated in yesterday's ANGLE >- update. >- >- * include/GLSLANG/ShaderVars.h: >- * src/libANGLE/Platform.cpp: >- >-2017-11-30 Alex Christensen <achristensen@webkit.org> >- >- Speculative WinCairo fix. >- https://bugs.webkit.org/show_bug.cgi?id=180177 >- >- * CMakeLists.txt: >- * PlatformWin.cmake: >- >-2017-11-30 Ryan Haddad <ryanhaddad@apple.com> >- >- Unreviewed build fix, remove executable property from a header file. >- >- * include/KHR/khrplatform.h: Removed property svn:executable. >- >-2017-11-30 Dean Jackson <dino@apple.com> >- >- Update ANGLE >- https://bugs.webkit.org/show_bug.cgi?id=180177 >- <rdar://problem/35774734> >- >- Reviewed by Alex Christensen. >- >- Huge list of changed files omitted. >- >-2017-07-18 Andy Estes <aestes@apple.com> >- >- [Xcode] Enable CLANG_WARN_RANGE_LOOP_ANALYSIS >- https://bugs.webkit.org/show_bug.cgi?id=174631 >- >- Reviewed by Tim Horton. >- >- * Configurations/Base.xcconfig: >- >-2017-07-18 Andy Estes <aestes@apple.com> >- >- [Xcode] Enable CLANG_WARN_OBJC_LITERAL_CONVERSION >- https://bugs.webkit.org/show_bug.cgi?id=174631 >- >- Reviewed by Sam Weinig. >- >- * Configurations/Base.xcconfig: >- >-2017-07-18 Andy Estes <aestes@apple.com> >- >- [Xcode] Enable CLANG_WARN_NON_LITERAL_NULL_CONVERSION >- https://bugs.webkit.org/show_bug.cgi?id=174631 >- >- Reviewed by Dan Bernstein. >- >- * Configurations/Base.xcconfig: >- >-2017-07-18 Andy Estes <aestes@apple.com> >- >- [Xcode] Enable CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING >- https://bugs.webkit.org/show_bug.cgi?id=174631 >- >- Reviewed by Darin Adler. >- >- * Configurations/Base.xcconfig: >- >-2017-07-13 Adrian Perez de Castro <aperez@igalia.com> >- >- eglplatform.h does not support Wayland >- https://bugs.webkit.org/show_bug.cgi?id=163482 >- >- This makes it possible to build WebKitGTK+ when the target system has only Wayland support, >- but no X11 (and therefore the X11 headers are not present). >- >- Reviewed by Alex Christensen. >- >- * include/EGL/eglplatform.h: Add Wayland typedefs when WL_EGL_PLATFORM is defined (for example >- by including wayland-egl.h before including EGL/egl.h). Also, include the X11 headers only >- when ANGLE_USE_X11 is defined and, for consistency with Mesa's version of the header, when >- MESA_EGL_NO_X11_HEADERS is not defined. >- >-2017-07-03 Andy Estes <aestes@apple.com> >- >- [Xcode] Add an experimental setting to build with ccache >- https://bugs.webkit.org/show_bug.cgi?id=173875 >- >- Reviewed by Tim Horton. >- >- * Configurations/DebugRelease.xcconfig: Included ccache.xcconfig. >- >-2017-07-01 Dan Bernstein <mitz@apple.com> >- >- [macOS] Remove code only needed when building for OS X Yosemite >- https://bugs.webkit.org/show_bug.cgi?id=174067 >- >- Reviewed by Tim Horton. >- >- * Configurations/Base.xcconfig: >- * Configurations/DebugRelease.xcconfig: >- >-2017-06-10 Dan Bernstein <mitz@apple.com> >- >- Reverted r218056 because it made the IDE reindex constantly. >- >- * Configurations/DebugRelease.xcconfig: >- >-2017-06-10 Dan Bernstein <mitz@apple.com> >- >- [Xcode] With Xcode 9 developer beta, everything rebuilds when switching between command-line and IDE >- https://bugs.webkit.org/show_bug.cgi?id=173223 >- >- Reviewed by Sam Weinig. >- >- The rebuilds were happening due to a difference in the compiler options that the IDE and >- xcodebuild were specifying. Only the IDE was passing the -index-store-path option. To make >- xcodebuild pass that option, too, set CLANG_INDEX_STORE_ENABLE to YES if it is unset, and >- specify an appropriate path in CLANG_INDEX_STORE_PATH. >- >- * Configurations/DebugRelease.xcconfig: >- >-2017-05-28 Dan Bernstein <mitz@apple.com> >- >- [Xcode] ALWAYS_SEARCH_USER_PATHS is set to YES >- https://bugs.webkit.org/show_bug.cgi?id=172691 >- >- Reviewed by Tim Horton. >- >- * Configurations/Base.xcconfig: Set ALWAYS_SEARCH_USER_PATHS to NO. >- >-2017-05-09 Zan Dobersek <zdobersek@igalia.com> >- >- Upstream the WPE port >- https://bugs.webkit.org/show_bug.cgi?id=171110 >- >- Reviewed by Alex Christensen. >- >- * include/EGL/eglplatform.h: >- Allow building WPE on platforms that don't provide X11 libraries. >- >-2017-05-04 Don Olmstead <don.olmstead@am.sony.com> >- >- [Win] Remove redundant macros that are set in the CMake config >- https://bugs.webkit.org/show_bug.cgi?id=171571 >- >- Reviewed by Brent Fulgham. >- >- * CMakeLists.txt: >- >-2017-04-20 Konstantin Tokarev <annulen@yandex.ru> >- >- [cmake] Define FORWARDING_HEADERS_DIR in WebKitFS and use it everywhere >- https://bugs.webkit.org/show_bug.cgi?id=171071 >- >- Reviewed by Michael Catanzaro. >- >- "${DERIVED_SOURCES_DIR}/ForwardingHeaders" path occurs very often in the >- build system files. GTK-specifc FORWARDING_HEADERS_DIR variable should >- be available for all ports. >- >- * CMakeLists.txt: >- >-2017-04-20 Fujii Hironori <Hironori.Fujii@sony.com> >- >- [WinCairo] Fix build break after updating ANGLE >- https://bugs.webkit.org/show_bug.cgi?id=170980 >- >- Reviewed by Brent Fulgham. >- >- * CMakeLists.txt: Added some new source files. >- * PlatformMac.cmake: Ditto. >- * PlatformWin.cmake: Ditto. Remove a macro 'ANGLE_WEBKIT_WIN' >- because SoftLinking is not used anymore. >- * src/third_party/systeminfo/: Restored. >- >-2017-04-19 Ryan Haddad <ryanhaddad@apple.com> >- >- Remove executable property from a header file. >- >- * include/KHR/khrplatform.h: Removed property svn:executable. >- >-2017-04-18 Dean Jackson <dino@apple.com> >- >- Add the actual content to the files, now that >- SVN knows they can have tabs. >- >- * src/third_party/murmurhash/MurmurHash3.cpp: >- * src/third_party/murmurhash/MurmurHash3.h: >- >-2017-04-18 Dean Jackson <dino@apple.com> >- >- WinCairo needs these files I recently removed >- from our copy of ANGLE. >- >- * src/third_party/murmurhash/LICENSE: Added. >- * src/third_party/murmurhash/MurmurHash3.cpp: Added. >- * src/third_party/murmurhash/MurmurHash3.h: Added. >- >-2017-04-18 Dean Jackson <dino@apple.com> >- >- Still trying to fix Windows. >- >- * PlatformWin.cmake: >- >-2017-04-18 Dean Jackson <dino@apple.com> >- >- Attempt to fix the Windows build. >- >- * PlatformWin.cmake: >- >-2017-04-18 Dean Jackson <dino@apple.com> >- >- Update ANGLE >- https://bugs.webkit.org/show_bug.cgi?id=170941 >- <rdar://problem/31633999> >- >- Reviewed by Alex Christensen. >- >- Huge list of changed files omitted. >- >-2017-04-12 Dan Bernstein <mitz@apple.com> >- >- [Mac] Future-proof .xcconfig files >- https://bugs.webkit.org/show_bug.cgi?id=170802 >- >- Reviewed by Tim Horton. >- >- * Configurations/Base.xcconfig: >- * Configurations/DebugRelease.xcconfig: >- >-2016-12-20 Tim Horton <timothy_horton@apple.com> >- >- Remove an ANGLE Markdown file from the ANGLE target >- https://bugs.webkit.org/show_bug.cgi?id=166279 >- >- Reviewed by Alex Christensen. >- >- * ANGLE.xcodeproj/project.pbxproj: >- We don't need to build this, it's not source code. >- >-2016-12-15 Myles C. Maxfield <mmaxfield@apple.com> >- >- Sort Xcode project files >- https://bugs.webkit.org/show_bug.cgi?id=165937 >- >- Reviewed by Simon Fraser. >- >- * ANGLE.xcodeproj/project.pbxproj: >- >-2016-12-15 Alex Christensen <achristensen@webkit.org> >- >- Fix Windows WebGL build after r209832 >- >- * CMakeLists.txt: >- * include/EGL/egl.h: >- * include/GLES2/gl2.h: >- >-2016-12-14 Alex Christensen <achristensen@webkit.org> >- >- Progress towards using ANGLE to do WebGL rendering >- https://bugs.webkit.org/show_bug.cgi?id=165864 >- >- Reviewed by Dean Jackson. >- >- * ANGLE.xcodeproj/project.pbxproj: >- Compile more files, and add some more "public" headers. >- ANGLE is not a public framework, so these headers just go in >- WebKitBuild/Release/usr/local/include/ANGLE to be included when compiling WebCore. >- * ANGLE/egl.h: Added. >- * ANGLE/eglext.h: Added. >- * ANGLE/eglplatform.h: Added. >- * ANGLE/entry_points_gles_2_0.h: Added. >- * ANGLE/entry_points_gles_2_0_ext.h: Added. >- * ANGLE/entry_points_gles_3_0.h: Added. >- * ANGLE/export.h: Added. >- * ANGLE/gl2.h: Added. >- * ANGLE/gl2ext.h: Added. >- * ANGLE/gl2platform.h: Added. >- * ANGLE/gl3.h: Added. >- * ANGLE/gl31.h: Added. >- * ANGLE/gl3platform.h: Added. >- * ANGLE/khrplatform.h: Added. >- Add more forwarding headers. There are already a few, but we need more. >- * CMakeLists.txt: >- * PlatformMac.cmake: >- Make the frameworks linked to by ANGLE be private so frameworks that link with >- ANGLE don't automatically link with them. This allows me to switch ANGLE from a >- static library to a dynamic library to make sure WebCore isn't directly using OpenGL. >- * PlatformWin.cmake: >- Move HLSL-specific files to only be built on Windows. >- * include/EGL/egl.h: >- * include/EGL/eglplatform.h: >- * include/GLES2/gl2.h: >- * include/GLES2/gl2platform.h: >- * include/GLES3/gl3.h: >- * include/GLES3/gl31.h: >- * include/GLES3/gl32.h: >- * include/GLES3/gl3platform.h: >- * src/libGLESv2/entry_points_egl.h: >- * src/libGLESv2/entry_points_egl_ext.h: >- * src/libGLESv2/entry_points_gles_2_0.h: >- * src/libGLESv2/entry_points_gles_2_0_ext.h: >- * src/libGLESv2/entry_points_gles_3_0.h: >- * src/libGLESv2/entry_points_gles_3_1.h: >- Include ANGLE headers as #include <ANGLE/*> instead of #include <KHR/*> or #include <GLES/*> >- This is needed to distinguish the ANGLE headers from any system OpenGL/OpenGLES headers. >- We will eventually only include ANGLE's entry_points_*.h directly from WebCore. >- >-2016-12-07 Alex Christensen <achristensen@webkit.org> >- >- Build more of ANGLE on Mac and Windows >- https://bugs.webkit.org/show_bug.cgi?id=165543 >- >- Reviewed by Dean Jackson. >- >- We will need to compile these files to use ANGLE's GLESv2 implementation instead of >- using OpenGL directly. No functional change. >- >- * ANGLE.xcodeproj/project.pbxproj: >- * CMakeLists.txt: >- Move platform-specific files to Platform*.cmake. >- * PlatformMac.cmake: Added. >- * PlatformWin.cmake: Added. >- * src/libANGLE/renderer/Format.cpp: >- * src/libANGLE/renderer/Format_autogen.cpp: >- (angle::Format::Get): >- * src/libANGLE/renderer/gl/PathGL.cpp: >- * src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h: >- * src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm: >- Rename SwapLayer to WebSwapLayer. Otherwise, WebCore complains about improperly named ObjC classes. >- Since this is the only one, let's just rename it instead of adding an exception. >- (rx::WindowSurfaceCGL::initialize): >- (-[SwapLayer initWithSharedState:withContext:withFunctions:]): Deleted. >- * src/libANGLE/renderer/gl/formatutilsgl.cpp: >- (rx::nativegl::GetInternalFormatMap): >- (rx::nativegl::GetInternalFormatInfo): >- * src/libANGLE/renderer/renderer_utils.cpp: >- (rx::GetColorWriteFunction): >- * src/libGLESv2/entry_points_egl.cpp: >- (egl::GetProcAddress): >- >-2016-12-06 Alexey Proskuryakov <ap@apple.com> >- >- Correct SDKROOT values in xcconfig files >- https://bugs.webkit.org/show_bug.cgi?id=165487 >- rdar://problem/29539209 >- >- Reviewed by Dan Bernstein. >- >- Fix suggested by Dan Bernstein. >- >- * Configurations/DebugRelease.xcconfig: >- >-2016-10-30 Michael Catanzaro <mcatanzaro@igalia.com> >- >- -Wpragmas warning spam from angleutils.h >- https://bugs.webkit.org/show_bug.cgi?id=164207 >- >- Reviewed by Darin Adler. >- >- Use #pragma clang instead of #pragma GCC since all of the warnings we need to suppress are >- Clang-specific warnings. GCC ignores unknown pragmas and does not warn, but it does warn if >- any GCC pragma is invalid. >- >- Note that this might still be broken for MSVCC, as MSVCC warns when it sees unknown pragmas. >- >- * changes.diff: >- * src/common/angleutils.cpp: >- (FormatString): >- * src/common/angleutils.h: >- (MakeStaticString): >- * src/common/debug.cpp: >- * src/common/mathutil.cpp: >- * src/libANGLE/Caps.cpp: >- (gl::TextureCapsMap::get): >- (gl::GetExtensionInfoMap): >- * src/libANGLE/Device.cpp: >- (egl::GetDeviceSet): >- * src/libANGLE/Display.cpp: >- (egl::Display::getClientExtensionString): >- * src/libANGLE/formatutils.cpp: >- (gl::GetInternalFormatMap): >- (gl::GetAllSizedInternalFormats): >- * src/libANGLE/validationES3.cpp: >- (gl::IsValidES3CopyTexImageCombination): >- >-2016-10-28 Alex Christensen <achristensen@webkit.org> >- >- Another build fix. >- >- * CMakeLists.txt: >- >-2016-10-28 Alex Christensen <achristensen@webkit.org> >- >- Fix Windows WebGL build after r208036 >- https://bugs.webkit.org/show_bug.cgi?id=164101 >- >- * CMakeLists.txt: >- >-2016-10-27 Alex Christensen <achristensen@webkit.org> >- >- Fix Windows WebGL build after r208036 >- https://bugs.webkit.org/show_bug.cgi?id=164101 >- >- * CMakeLists.txt: >- Add new files, remove deleted files. >- >-2016-10-27 Alex Christensen <achristensen@webkit.org> >- >- Update ANGLE >- https://bugs.webkit.org/show_bug.cgi?id=164101 >- >- Reviewed by Darin Adler. >- >- Updated to f01731530e7f754e5ebaf32d00f3e23b62376424 >- Differences between upstream ANGLE and WebKit's copy of ANGLE are in changes.diff >- >-2016-10-24 Alex Christensen <achristensen@webkit.org> >- >- Remove unused ANGLE.vcxproj after switching to CMake on Windows >- >- * ANGLE.vcxproj: Removed. >- * ANGLE.vcxproj/ANGLERelease.props: Removed. >- * ANGLE.vcxproj/DirectX32.props: Removed. >- * ANGLE.vcxproj/DirectX64.props: Removed. >- * ANGLE.vcxproj/libEGL.vcxproj: Removed. >- * ANGLE.vcxproj/libEGL.vcxproj.filters: Removed. >- * ANGLE.vcxproj/libEGLCommon.props: Removed. >- * ANGLE.vcxproj/libGLESv2.vcxproj: Removed. >- * ANGLE.vcxproj/libGLESv2.vcxproj.filters: Removed. >- * ANGLE.vcxproj/libGLESv2Common.props: Removed. >- * ANGLE.vcxproj/preprocessor.vcxproj: Removed. >- * ANGLE.vcxproj/preprocessor.vcxproj.filters: Removed. >- * ANGLE.vcxproj/translatorCommon.props: Removed. >- * ANGLE.vcxproj/translator_common.vcxproj: Removed. >- * ANGLE.vcxproj/translator_common.vcxproj.filters: Removed. >- * ANGLE.vcxproj/translator_glsl.vcxproj: Removed. >- * ANGLE.vcxproj/translator_glsl.vcxproj.filters: Removed. >- * ANGLE.vcxproj/translator_hlsl.vcxproj: Removed. >- * ANGLE.vcxproj/translator_hlsl.vcxproj.filters: Removed. >- >-2016-09-09 Dean Jackson <dino@apple.com> >- >- [ANGLE] instantiation of variable 'gl::GLTypeToGLenum<float>::value' required here, but no definition is available >- https://bugs.webkit.org/show_bug.cgi?id=161829 >- <rdar://problem/28051244> >- >- Reviewed by Alex Christensen. >- >- Newer versions of clang require explicit definition of some template types >- if they are in another translation unit. >- >- * src/libANGLE/Program.cpp: Add definitions for GLTypeToGLenum. >- >-2016-07-29 David Kilzer <ddkilzer@apple.com> >- >- ANGLE: Fix global constructors and exit-time destructors >- <https://webkit.org/b/160332> >- >- Reviewed by Darin Adler. >- >- * Configurations/Base.xcconfig: >- - Add warning flags. >- >- * src/common/angleutils.cpp: >- (FormatString): >- * src/common/angleutils.h: >- (MakeStaticString): >- * src/common/debug.cpp: >- * src/common/mathutil.cpp: >- (gl::g_sharedexp_max): >- (gl::convertRGBFloatsTo999E5): >- * src/compiler/translator/ShaderLang.cpp: >- (ShGetUniformRegisterMap): >- * src/libANGLE/Caps.cpp: >- (gl::TextureCapsMap::get): >- * src/libANGLE/Device.cpp: >- (egl::GetDeviceSet): >- * src/libANGLE/Display.cpp: >- (egl::Display::getClientExtensionString): >- * src/libANGLE/formatutils.cpp: >- (gl::BuildFormatMap): >- (gl::BuildInternalFormatInfoMap): >- (gl::GetInternalFormatMap): >- (gl::BuildAllSizedInternalFormatSet): >- (gl::GetSizedInternalFormat): >- (gl::GetAllSizedInternalFormats): >- * src/libANGLE/validationES3.cpp: >- (gl::BuildES3FormatSet): >- (gl::ValidateTexImageFormatCombination): >- (gl::BuildSizedEffectiveInternalFormatList): >- (gl::BuildUnsizedEffectiveInternalFormatList): >- (gl::GetEffectiveInternalFormat): >- (gl::BuildValidES3CopyTexImageCombinations): >- (gl::IsValidES3CopyTexImageCombination): >- - Fix global constructors and exit-time destructors. >- >-2016-07-13 Enrica Casucci <enrica@apple.com> >- >- Update supported platforms in xcconfig files to match the sdk names. >- https://bugs.webkit.org/show_bug.cgi?id=159728 >- >- Reviewed by Tim Horton. >- >- * Configurations/Base.xcconfig: >- >-2016-05-24 Alex Christensen <achristensen@webkit.org> >- >- Fix iOS WebGL after r199738 >- https://bugs.webkit.org/show_bug.cgi?id=158024 >- rdar://problem/26446679 >- >- Reviewed by Myles Maxfield. >- >- * ANGLE.xcodeproj/project.pbxproj: >- iOS needs the ESSL translator. >- >-2016-05-22 Brady Eidson <beidson@apple.com> >- >- Move to C++14. >- https://bugs.webkit.org/show_bug.cgi?id=157948 >- >- Reviewed by Michael Catanzaro. >- >- * Configurations/Base.xcconfig: >- >-2016-04-26 Per Arne Vollan <peavo@outlook.com> >- >- [WinCairo][ANGLE] Display object is not created. >- https://bugs.webkit.org/show_bug.cgi?id=157042 >- >- Reviewed by Alex Christensen. >- >- The CreateDisplayFromAttribs function will not create a DisplayD3D object when the requested >- type is EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE, because ANGLE_ENABLE_OPENGL is not defined. >- We should be able to create a DisplayD3D object without defining ANGLE_ENABLE_OPENGL. >- >- * src/libANGLE/Display.cpp: >- >-2016-04-26 Per Arne Vollan <peavo@outlook.com> >- >- [WinCairo][WebGL] Enable ESSL and GLSL translators. >- https://bugs.webkit.org/show_bug.cgi?id=157002 >- >- Reviewed by Darin Adler. >- >- Enable support for ESSL and GLSL translators, and add missing files. >- >- * CMakeLists.txt: >- >-2016-04-22 Joonghun Park <jh718.park@samsung.com> >- >- [ANGLE] Remove deprecated auto_ptr warning. Unreviewed. >- https://bugs.webkit.org/show_bug.cgi?id=156894 >- >- * src/compiler/preprocessor/MacroExpander.h: Use std::unique_ptr instead of std::auto_ptr. >- >-2016-04-19 Alex Christensen <achristensen@webkit.org> >- >- Build fix after r199738 >- >- * CMakeLists.txt: >- >-2016-04-19 Alex Christensen <achristensen@webkit.org> >- >- Build fix after r199738 >- >- * CMakeLists.txt: >- >-2016-04-19 Alex Christensen <achristensen@webkit.org> >- >- Build fix. >- >- * src/compiler/translator/Intermediate.h: Added. >- (TIntermediate::TIntermediate): >- * src/compiler/translator/intermediate.h: Removed. >- Changed case of Intermediate.h file name for case sensitive file systems. >- >-2016-04-19 Alex Christensen <achristensen@webkit.org> >- >- Update ANGLE >- https://bugs.webkit.org/show_bug.cgi?id=156755 >- >- Reviewed by Dean Jackson. >- >- Huge list of changed files omitted. >- >-2016-04-12 Alex Christensen <achristensen@webkit.org> >- >- Remove failing assertion in ANGLE >- https://bugs.webkit.org/show_bug.cgi?id=156485 >- >- Reviewed by Dean Jackson. >- >- * src/compiler/translator/glslang.l: >- * src/compiler/translator/glslang_lex.cpp: >- >-2016-04-11 Fujii Hironori <Hironori.Fujii@jp.sony.com> >- >- [CMake] Make FOLDER property INHERITED >- https://bugs.webkit.org/show_bug.cgi?id=156460 >- >- Reviewed by Brent Fulgham. >- >- * CMakeLists.txt: >- Set FOLDER property as a directory property not a target property >- >-2016-03-22 Alberto Garcia <berto@igalia.com> >- >- Unreviewed typo fix. >- >- * src/compiler/translator/InfoSink.cpp: >- (TInfoSinkBase::prefix): "UNKOWN" => "UNKOWN". >- >-2016-03-20 Dan Bernstein <mitz@apple.com> >- >- [Mac] Determine TARGET_MAC_OS_X_VERSION_MAJOR from MACOSX_DEPLOYMENT_TARGET rather than from MAC_OS_X_VERSION_MAJOR >- https://bugs.webkit.org/show_bug.cgi?id=155707 >- <rdar://problem/24980691> >- >- Reviewed by Darin Adler. >- >- * Configurations/Base.xcconfig: Set TARGET_MAC_OS_X_VERSION_MAJOR based on the last >- component of MACOSX_DEPLOYMENT_TARGET. >- * Configurations/DebugRelease.xcconfig: For engineering builds, preserve the behavior of >- TARGET_MAC_OS_X_VERSION_MAJOR being the hostâs OS version. >- >-2016-03-20 Dan Bernstein <mitz@apple.com> >- >- Update build settings >- >- Rubber-stamped by Andy Estes. >- >- * Configurations/DebugRelease.xcconfig: >- >-2016-02-23 Dan Bernstein <mitz@apple.com> >- >- [Xcode] Linker errors display mangled names, but no longer should >- https://bugs.webkit.org/show_bug.cgi?id=154632 >- >- Reviewed by Sam Weinig. >- >- * Configurations/Base.xcconfig: Stop setting LINKER_DISPLAYS_MANGLED_NAMES to YES. >- >-2016-01-08 Brent Fulgham <bfulgham@apple.com> >- >- [ANGLE] Correct UNREACHABLE runtime assertion for void constructors >- https://bugs.webkit.org/show_bug.cgi?id=152900 >- <rdar://problem/24107501> >- >- Reviewed by Alex Christensen. >- >- Tested by Khronos WebGL 1.0.4 suite. >- >- Merge a small part of ANGLE upstream commit r284735: >- >- commit 01971113492d9aca386f2bca021b1f4b134fc277 >- author Dmitry Skiba <dskiba@google.com> Fri Jul 10 18:54:00 2015 >- committer Jamie Madill <jmadill@chromium.org> Fri Jul 10 19:03:34 2015 >- tree 47e42eac00f7d64cddb14b3cc21a4e605c189d20 >- >- This issue was found by <https://www.khronos.org/registry/webgl/sdk/tests/conformance/glsl/bugs/angle-constructor-invalid-parameters.html?webglVersion=1&quiet=0> >- >- * src/compiler/translator/Types.cpp: >- (TType::buildMangledName): Don't assert with UNREACHABLE here. >- >-2015-12-28 Joonghun Park <jh718.park@samsung.com> >- >- [ANGLE][EFL][GTK] Remove 'template<class> class std::auto_ptr is deprecated' compile warning >- https://bugs.webkit.org/show_bug.cgi?id=152567 >- >- Reviewed by Alex Christensen. >- >- Because auto_ptr is deprecated as of C++11, we should use unique_ptr instead. >- >- * src/compiler/preprocessor/MacroExpander.h: >- >-2015-12-19 Dan Bernstein <mitz@apple.com> >- >- [Mac] WebKit contains dead source code for OS X Mavericks and earlier >- https://bugs.webkit.org/show_bug.cgi?id=152462 >- >- Reviewed by Alexey Proskuryakov. >- >- * Configurations/DebugRelease.xcconfig: Removed definitions of MACOSX_DEPLOYMENT_TARGET for >- OS X 10.8 and 10.9. >- >-2015-12-03 Anders Carlsson <andersca@apple.com> >- >- Remove Objective-C GC support >- https://bugs.webkit.org/show_bug.cgi?id=151819 >- rdar://problem/23746991 >- >- Reviewed by Dan Bernstein. >- >- * Configurations/Base.xcconfig: >- >-2015-11-30 Dana Burkart <dburkart@apple.com> >- >- Remove Mountain Lion support from ANGLE >- https://bugs.webkit.org/show_bug.cgi?id=151679 >- >- Reviewed by Darin Adler. >- >- * Configurations/Base.xcconfig: >- >-2015-11-02 Andy Estes <aestes@apple.com> >- >- [Cocoa] Add tvOS and watchOS to SUPPORTED_PLATFORMS >- https://bugs.webkit.org/show_bug.cgi?id=150819 >- >- Reviewed by Dan Bernstein. >- >- This tells Xcode to include these platforms in its Devices dropdown, making it possible to build in the IDE. >- >- * Configurations/Base.xcconfig: >- >-2015-10-10 Dan Bernstein <mitz@apple.com> >- >- [iOS] Remove project support for iOS 8 >- https://bugs.webkit.org/show_bug.cgi?id=149993 >- >- Reviewed by Alexey Proskuryakov. >- >- * Configurations/ANGLE.xcconfig: >- * Configurations/Base.xcconfig: >- >-2015-08-20 Alex Christensen <achristensen@webkit.org> >- >- Clean up CMake build after r188673 >- https://bugs.webkit.org/show_bug.cgi?id=148234 >- >- Reviewed by Tim Horton. >- >- * CMakeLists.txt: >- Copy headers to forwarding headers. >- >-2015-08-11 Brent Fulgham <bfulgham@apple.com> >- >- [Win] Switch Windows build to Visual Studio 2015 >- https://bugs.webkit.org/show_bug.cgi?id=147887 >- <rdar://problem/22235098> >- >- Reviewed by Alex Christensen. >- >- Update Visual Studio project file settings to use the current Visual >- Studio and compiler. Continue targeting binaries to run on our minimum >- supported configuration of Windows 7. >- >- * ANGLE.vcxproj/libEGL.vcxproj: >- * ANGLE.vcxproj/libGLESv2.vcxproj: >- * ANGLE.vcxproj/preprocessor.vcxproj: >- * ANGLE.vcxproj/translator_common.vcxproj: >- * ANGLE.vcxproj/translator_glsl.vcxproj: >- * ANGLE.vcxproj/translator_hlsl.vcxproj: >- >-2015-08-04 Alex Christensen <achristensen@webkit.org> >- >- Build fix after r187928. >- >- * CMakeLists.txt: >- Typo. Set libGLESv2 compile definitions instead of libEGL, which are set separately. >- >-2015-08-04 Alex Christensen <achristensen@webkit.org> >- >- Soft link libGLESv2 and libEGL on Windows again >- https://bugs.webkit.org/show_bug.cgi?id=147671 >- >- Reviewed by Dean Jackson. >- >- * CMakeLists.txt: >- Clean up some warnings when compiling with CMake. >- * include/EGL/egl.h: >- * include/EGL/eglsoftlinking.h: >- * include/GLES2/gl2.h: >- Soft link egl optionally. >- >-2015-08-04 Alex Christensen <achristensen@webkit.org> >- >- Enable WebGL on Windows CMake build. >- https://bugs.webkit.org/show_bug.cgi?id=143311 >- >- Reviewed by Csaba Osztrogonác. >- >- * CMakeLists.txt: Added. >- >-2015-07-03 Dan Bernstein <mitz@apple.com> >- >- [Xcode] Update some build settings as recommended by Xcode 7 >- https://bugs.webkit.org/show_bug.cgi?id=146597 >- >- Reviewed by Sam Weinig. >- >- * ANGLE.xcodeproj/project.pbxproj: Enabled CLANG_WARN_BOOL_CONVERSION, >- CLANG_WARN_ENUM_CONVERSION, CLANG_WARN_INT_CONVERSION, ENABLE_STRICT_OBJC_MSGSEND and >- GCC_NO_COMMON_BLOCKS. >- >- * Configurations/Base.xcconfig: Updated LastUpgradeCheck. >- >-2015-07-03 Per Arne Vollan <peavo@outlook.com> >- >- [WinCairo][WebGL] Enable HLSL. >- https://bugs.webkit.org/show_bug.cgi?id=146559 >- >- Reviewed by Alex Christensen. >- >- High Level Shader Language needs to be enabled for WebGL to work on Windows. >- >- * ANGLE.vcxproj/translatorCommon.props: >- * ANGLE.vcxproj/translator_hlsl.vcxproj: >- * ANGLE.vcxproj/translator_hlsl.vcxproj.filters: >- >-2015-07-01 Alex Christensen <achristensen@webkit.org> >- >- Re-enable WebGL on WinCairo >- https://bugs.webkit.org/show_bug.cgi?id=146537 >- >- Reviewed by Csaba Osztrogonác. >- >- * ANGLE.vcxproj/DirectX32.props: >- * ANGLE.vcxproj/DirectX64.props: >- * ANGLE.vcxproj/libGLESv2Common.props: >- Update DirectX directories to use the Windows SDK instead of the June 2010 DirectX SDK. >- >-2015-07-01 Alex Christensen <achristensen@webkit.org> >- >- Fix ANGLE Windows build after r186169. >- https://bugs.webkit.org/show_bug.cgi?id=146532 >- >- Reviewed by Brent Fulgham. >- >- * ANGLE.vcxproj/libEGL.vcxproj: >- * ANGLE.vcxproj/libEGL.vcxproj.filters: >- * ANGLE.vcxproj/libGLESv2.vcxproj: >- * ANGLE.vcxproj/libGLESv2.vcxproj.filters: >- * ANGLE.vcxproj/libGLESv2Common.props: >- * ANGLE.vcxproj/translator_common.vcxproj: >- * ANGLE.vcxproj/translator_common.vcxproj.filters: >- * ANGLE.vcxproj/translator_glsl.vcxproj: >- * ANGLE.vcxproj/translator_glsl.vcxproj.filters: >- * ANGLE.vcxproj/translator_hlsl.vcxproj: >- * ANGLE.vcxproj/translator_hlsl.vcxproj.filters: >- Update Windows build to build new files. >- >-2015-06-30 Alex Christensen <achristensen@webkit.org> >- >- Update ANGLE to b11e2483742db884bd0af41f78f528240577356b. >- https://bugs.webkit.org/show_bug.cgi?id=145010 >- >- Reviewed by Dean Jackson. >- >- Huge list of source changes omitted. >- ROLL DEPS! >- >-2015-05-26 Dan Bernstein <mitz@apple.com> >- >- <rdar://problem/21104551> Update build settings >- >- Reviewed by Anders Carlsson. >- >- * Configurations/Base.xcconfig: >- * Configurations/DebugRelease.xcconfig: >- >-2015-05-19 Carlos Alberto Lopez Perez <clopez@igalia.com> >- >- REGRESSION(r181571): Build broken when USE(OPENGL_ES_2) is defined. >- https://bugs.webkit.org/show_bug.cgi?id=145156 >- >- Reviewed by Alex Christensen. >- >- * include/GLES2/gl2softlinking.h: Revert r181589. Vertex Array Objects are not in GLESv2. >- >-2015-05-11 Brent Fulgham <bfulgham@apple.com> >- >- [Win] Move Windows build target to Windows 7 (or newer) >- https://bugs.webkit.org/show_bug.cgi?id=144890 >- <rdar://problem/20707307> >- >- Reviewed by Anders Carlsson. >- >- Update linked SDK and minimal Windows level to be compatible with >- Windows 7 or newer. >- >- * ANGLE.vcxproj/libEGL.vcxproj: >- * ANGLE.vcxproj/libGLESv2.vcxproj: >- * ANGLE.vcxproj/preprocessor.vcxproj: >- * ANGLE.vcxproj/translator_common.vcxproj: >- * ANGLE.vcxproj/translator_glsl.vcxproj: >- * ANGLE.vcxproj/translator_hlsl.vcxproj: >- >-2015-05-07 Dan Bernstein <mitz@apple.com> >- >- <rdar://problem/19317140> [Xcode] Remove usage of AspenFamily.xcconfig in Source/ >- https://bugs.webkit.org/show_bug.cgi?id=144727 >- >- Reviewed by Darin Adler. >- >- * Configurations/Base.xcconfig: Donât include AspenFamily.xcconfig, and define >- INSTALL_PATH_PREFIX and LD_DYLIB_INSTALL_NAME for the iOS 8.x Simulator. >- >-2015-04-01 Alex Christensen <achristensen@webkit.org> >- >- Progress towards CMake on Windows and Mac. >- https://bugs.webkit.org/show_bug.cgi?id=143293 >- >- Reviewed by Filip Pizlo. >- >- * include/GLES2/gl2.h: >- Temporarily disabled WebGL on Windows CMake builds. >- >-2015-03-17 Zan Dobersek <zdobersek@igalia.com> >- >- [CMake] Use a forwarding header for ANGLE's ShaderLang.h to avoid picking up ANGLE's EGL headers >- https://bugs.webkit.org/show_bug.cgi?id=142530 >- >- Reviewed by Darin Adler. >- >- * ANGLE/ShaderLang.h: Added. Includes include/GLSLANG/ShaderLang.h. Used in WebCore >- so we can avoid using ANGLE's EGL headers and use the system-default headers instead. >- >-2015-03-16 Roger Fong <roger_fong@apple.com> >- >- [Win] Unreviewed build fix after r181571. >- >- * include/GLES2/gl2softlinking.h: >- >-2015-03-12 Brent Fulgham <bfulgham@apple.com> >- >- [Win] Unreviewed build fix (part 2). >- >- * ANGLE.vcxproj/libGLESv2Common.props: Missed a directory separator. >- >-2015-03-12 Brent Fulgham <bfulgham@apple.com> >- >- [Win] Unreviewed build fix for some DirectX SDK Installs >- >- * ANGLE.vcxproj/libGLESv2Common.props: Correct path for Lib and >- Include paths based on problems others have had building WebKit >- under different Windows and DirectX revisions. >- >-2015-02-20 Alexey Proskuryakov <ap@apple.com> >- >- Remove svn:keywords property. >- >- As far as I can tell, the property had no effect on any of these files, but also, >- when it has effect it's likely harmful. >- >- * ANGLE.txt: Removed property svn:keywords. >- * src/common/RefCountObject.cpp: Removed property svn:keywords. >- * src/common/RefCountObject.h: Removed property svn:keywords. >- * src/compiler/translator/BaseTypes.h: Removed property svn:keywords. >- * src/compiler/translator/BuiltInFunctionEmulator.cpp: Removed property svn:keywords. >- * src/compiler/translator/BuiltInFunctionEmulator.h: Removed property svn:keywords. >- * src/compiler/translator/CodeGen.cpp: Removed property svn:keywords. >- * src/compiler/translator/Common.h: Removed property svn:keywords. >- * src/compiler/translator/Compiler.cpp: Removed property svn:keywords. >- * src/compiler/translator/ConstantUnion.h: Removed property svn:keywords. >- * src/compiler/translator/DetectCallDepth.cpp: Removed property svn:keywords. >- * src/compiler/translator/DetectCallDepth.h: Removed property svn:keywords. >- * src/compiler/translator/DetectDiscontinuity.cpp: Removed property svn:keywords. >- * src/compiler/translator/DetectDiscontinuity.h: Removed property svn:keywords. >- * src/compiler/translator/Diagnostics.cpp: Removed property svn:keywords. >- * src/compiler/translator/Diagnostics.h: Removed property svn:keywords. >- * src/compiler/translator/DirectiveHandler.cpp: Removed property svn:keywords. >- * src/compiler/translator/DirectiveHandler.h: Removed property svn:keywords. >- * src/compiler/translator/ExtensionBehavior.h: Removed property svn:keywords. >- * src/compiler/translator/ForLoopUnroll.cpp: Removed property svn:keywords. >- * src/compiler/translator/ForLoopUnroll.h: Removed property svn:keywords. >- * src/compiler/translator/HashNames.h: Removed property svn:keywords. >- * src/compiler/translator/InfoSink.cpp: Removed property svn:keywords. >- * src/compiler/translator/InfoSink.h: Removed property svn:keywords. >- * src/compiler/translator/Initialize.cpp: Removed property svn:keywords. >- * src/compiler/translator/Initialize.h: Removed property svn:keywords. >- * src/compiler/translator/InitializeDll.cpp: Removed property svn:keywords. >- * src/compiler/translator/InitializeDll.h: Removed property svn:keywords. >- * src/compiler/translator/InitializeGlobals.h: Removed property svn:keywords. >- * src/compiler/translator/InitializeParseContext.cpp: Removed property svn:keywords. >- * src/compiler/translator/InitializeParseContext.h: Removed property svn:keywords. >- * src/compiler/translator/InitializeVariables.cpp: Removed property svn:keywords. >- * src/compiler/translator/InitializeVariables.h: Removed property svn:keywords. >- * src/compiler/translator/IntermTraverse.cpp: Removed property svn:keywords. >- * src/compiler/translator/Intermediate.cpp: Removed property svn:keywords. >- * src/compiler/translator/MMap.h: Removed property svn:keywords. >- * src/compiler/translator/NodeSearch.h: Removed property svn:keywords. >- * src/compiler/translator/OutputESSL.cpp: Removed property svn:keywords. >- * src/compiler/translator/OutputESSL.h: Removed property svn:keywords. >- * src/compiler/translator/OutputGLSL.cpp: Removed property svn:keywords. >- * src/compiler/translator/OutputGLSL.h: Removed property svn:keywords. >- * src/compiler/translator/OutputGLSLBase.cpp: Removed property svn:keywords. >- * src/compiler/translator/OutputGLSLBase.h: Removed property svn:keywords. >- * src/compiler/translator/OutputHLSL.cpp: Removed property svn:keywords. >- * src/compiler/translator/OutputHLSL.h: Removed property svn:keywords. >- * src/compiler/translator/ParseContext.cpp: Removed property svn:keywords. >- * src/compiler/translator/ParseContext.h: Removed property svn:keywords. >- * src/compiler/translator/PoolAlloc.cpp: Removed property svn:keywords. >- * src/compiler/translator/PoolAlloc.h: Removed property svn:keywords. >- * src/compiler/translator/Pragma.h: Removed property svn:keywords. >- * src/compiler/translator/QualifierAlive.cpp: Removed property svn:keywords. >- * src/compiler/translator/QualifierAlive.h: Removed property svn:keywords. >- * src/compiler/translator/RemoveTree.cpp: Removed property svn:keywords. >- * src/compiler/translator/RemoveTree.h: Removed property svn:keywords. >- * src/compiler/translator/RenameFunction.h: Removed property svn:keywords. >- * src/compiler/translator/RewriteElseBlocks.cpp: Removed property svn:keywords. >- * src/compiler/translator/RewriteElseBlocks.h: Removed property svn:keywords. >- * src/compiler/translator/SearchSymbol.cpp: Removed property svn:keywords. >- * src/compiler/translator/SearchSymbol.h: Removed property svn:keywords. >- * src/compiler/translator/ShHandle.h: Removed property svn:keywords. >- * src/compiler/translator/ShaderLang.cpp: Removed property svn:keywords. >- * src/compiler/translator/SymbolTable.cpp: Removed property svn:keywords. >- * src/compiler/translator/SymbolTable.h: Removed property svn:keywords. >- * src/compiler/translator/TranslatorESSL.cpp: Removed property svn:keywords. >- * src/compiler/translator/TranslatorESSL.h: Removed property svn:keywords. >- * src/compiler/translator/TranslatorGLSL.cpp: Removed property svn:keywords. >- * src/compiler/translator/TranslatorGLSL.h: Removed property svn:keywords. >- * src/compiler/translator/TranslatorHLSL.cpp: Removed property svn:keywords. >- * src/compiler/translator/TranslatorHLSL.h: Removed property svn:keywords. >- * src/compiler/translator/Types.h: Removed property svn:keywords. >- * src/compiler/translator/UnfoldShortCircuit.cpp: Removed property svn:keywords. >- * src/compiler/translator/UnfoldShortCircuit.h: Removed property svn:keywords. >- * src/compiler/translator/UnfoldShortCircuitAST.cpp: Removed property svn:keywords. >- * src/compiler/translator/UnfoldShortCircuitAST.h: Removed property svn:keywords. >- * src/compiler/translator/ValidateLimitations.cpp: Removed property svn:keywords. >- * src/compiler/translator/ValidateLimitations.h: Removed property svn:keywords. >- * src/compiler/translator/VariableInfo.cpp: Removed property svn:keywords. >- * src/compiler/translator/VariableInfo.h: Removed property svn:keywords. >- * src/compiler/translator/VariablePacker.cpp: Removed property svn:keywords. >- * src/compiler/translator/VariablePacker.h: Removed property svn:keywords. >- * src/compiler/translator/VersionGLSL.cpp: Removed property svn:keywords. >- * src/compiler/translator/VersionGLSL.h: Removed property svn:keywords. >- * src/compiler/translator/compilerdebug.cpp: Removed property svn:keywords. >- * src/compiler/translator/compilerdebug.h: Removed property svn:keywords. >- * src/compiler/translator/depgraph/DependencyGraph.cpp: Removed property svn:keywords. >- * src/compiler/translator/depgraph/DependencyGraph.h: Removed property svn:keywords. >- * src/compiler/translator/depgraph/DependencyGraphBuilder.cpp: Removed property svn:keywords. >- * src/compiler/translator/depgraph/DependencyGraphBuilder.h: Removed property svn:keywords. >- * src/compiler/translator/depgraph/DependencyGraphOutput.cpp: Removed property svn:keywords. >- * src/compiler/translator/depgraph/DependencyGraphOutput.h: Removed property svn:keywords. >- * src/compiler/translator/depgraph/DependencyGraphTraverse.cpp: Removed property svn:keywords. >- * src/compiler/translator/generate_parser.sh: Removed property svn:keywords. >- * src/compiler/translator/glslang.h: Removed property svn:keywords. >- * src/compiler/translator/glslang_lex.cpp: Removed property svn:keywords. >- * src/compiler/translator/glslang_tab.cpp: Removed property svn:keywords. >- * src/compiler/translator/glslang_tab.h: Removed property svn:keywords. >- * src/compiler/translator/intermOut.cpp: Removed property svn:keywords. >- * src/compiler/translator/intermediate.h: Removed property svn:keywords. >- * src/compiler/translator/localintermediate.h: Removed property svn:keywords. >- * src/compiler/translator/osinclude.h: Removed property svn:keywords. >- * src/compiler/translator/ossource_posix.cpp: Removed property svn:keywords. >- * src/compiler/translator/ossource_win.cpp: Removed property svn:keywords. >- * src/compiler/translator/parseConst.cpp: Removed property svn:keywords. >- * src/compiler/translator/timing/RestrictFragmentShaderTiming.cpp: Removed property svn:keywords. >- * src/compiler/translator/timing/RestrictFragmentShaderTiming.h: Removed property svn:keywords. >- * src/compiler/translator/timing/RestrictVertexShaderTiming.cpp: Removed property svn:keywords. >- * src/compiler/translator/timing/RestrictVertexShaderTiming.h: Removed property svn:keywords. >- * src/compiler/translator/util.cpp: Removed property svn:keywords. >- * src/compiler/translator/util.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/BufferStorage11.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/BufferStorage11.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/Fence11.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/Fence11.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/Image11.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/Image11.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/IndexBuffer11.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/IndexBuffer11.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/InputLayoutCache.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/InputLayoutCache.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/Query11.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/Query11.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/RenderStateCache.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/RenderStateCache.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/RenderTarget11.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/RenderTarget11.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/Renderer11.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/Renderer11.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/ShaderExecutable11.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/ShaderExecutable11.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/SwapChain11.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/SwapChain11.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/TextureStorage11.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/TextureStorage11.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/VertexBuffer11.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/VertexBuffer11.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/renderer11_utils.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d11/renderer11_utils.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/BufferStorage9.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/BufferStorage9.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/Fence9.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/Fence9.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/Image9.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/Image9.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/IndexBuffer9.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/IndexBuffer9.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/Query9.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/Query9.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/RenderTarget9.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/RenderTarget9.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/Renderer9.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/Renderer9.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/ShaderExecutable9.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/ShaderExecutable9.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/SwapChain9.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/SwapChain9.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/TextureStorage9.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/TextureStorage9.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/VertexBuffer9.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/VertexBuffer9.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/VertexDeclarationCache.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/VertexDeclarationCache.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/renderer9_utils.cpp: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/renderer9_utils.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/shaders/compiled/componentmaskps.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/shaders/compiled/flipyvs.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/shaders/compiled/luminanceps.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/shaders/compiled/passthroughps.h: Removed property svn:keywords. >- * src/libGLESv2/renderer/d3d9/shaders/compiled/standardvs.h: Removed property svn:keywords. >- >-2015-01-28 Dana Burkart <dburkart@apple.com> >- >- Move ASan flag settings from DebugRelease.xcconfig to Base.xcconfig >- https://bugs.webkit.org/show_bug.cgi?id=136765 >- >- Reviewed by Alexey Proskuryakov. >- >- * Configurations/Base.xcconfig: >- * Configurations/DebugRelease.xcconfig: >- >-2014-12-26 Dan Bernstein <mitz@apple.com> >- >- <rdar://problem/19348208> REGRESSION (r177027): iOS builds use the wrong toolchain >- https://bugs.webkit.org/show_bug.cgi?id=139950 >- >- Reviewed by David Kilzer. >- >- * Configurations/Base.xcconfig: Only define TOOLCHAINS when building for OS X, doing so >- in a manner that works with Xcode 5.1.1. >- >-2014-12-24 Dan Bernstein <mitz@apple.com> >- >- ANGLE extern symbols are not hidden by default, but should be >- https://bugs.webkit.org/show_bug.cgi?id=139936 >- >- Reviewed by Mark Rowe. >- >- * Configurations/Base.xcconfig: Changed GCC_SYMBOLS_PRIVATE_EXTERN to YES. >- >-2014-12-24 Dan Bernstein <mitz@apple.com> >- >- Removed the Derived Sources target. >- >- It has been empty since r159533. >- >- * ANGLE.xcodeproj/project.pbxproj: >- >-2014-12-09 David Kilzer <ddkilzer@apple.com> >- >- Switch from using PLATFORM_NAME to SDK selectors in ANGLE, bmalloc, gtest, JavaScriptCore, WTF >- <http://webkit.org/b/139212> >- >- Reviewed by Joseph Pecoraro. >- >- * Configurations/Base.xcconfig: >- - Only set GCC_ENABLE_OBJC_GC, GCC_MODEL_TUNING and TOOLCHAINS >- on OS X. >- * Configurations/DebugRelease.xcconfig: >- - Only set MACOSX_DEPLOYMENT_TARGET and SDKROOT on OS X. >- >-2014-10-30 Dana Burkart <dburkart@apple.com> >- >- <rdar://problem/18821260> Prepare for the mysterious future >- >- Reviewed by Lucas Forschler. >- >- * Configurations/Base.xcconfig: >- * Configurations/DebugRelease.xcconfig: >- >-2014-10-08 Brent Fulgham <bfulgham@apple.com> >- >- [Win] Use proper v120 target for 64-bit builds. >- >- * ANGLE.vcxproj/libEGL.vcxproj: >- >-2014-09-29 peavo@outlook.com <peavo@outlook.com> >- >- [WinCairo] D3D11 is not used by default. >- https://bugs.webkit.org/show_bug.cgi?id=137215 >- >- Reviewed by Alex Christensen. >- >- ANGLE_DEFAULT_D3D11 needs to be defined for D3D11 to be used as default. >- >- * ANGLE.vcxproj/libGLESv2Common.props: >- >-2014-09-19 Daniel Bates <dabates@apple.com> >- >- Always assume internal SDK when building configuration Production >- https://bugs.webkit.org/show_bug.cgi?id=136925 >- <rdar://problem/18362399> >- >- Reviewed by Dan Bernstein. >- >- * Configurations/Base.xcconfig: >- >-2014-09-10 Roger Fong <roger_fong@apple.com> >- >- Check for varying packing restrictions per program instead of per shader. >- https://bugs.webkit.org/show_bug.cgi?id=136585. >- <rdar://problem/16308409>. >- >- Reviewed by Dean Jackson. >- >- Remove varying packing restrictions checks from ANGLE. >- * src/compiler/translator/Compiler.cpp: >- (TCompiler::compile): >- (TCompiler::enforcePackingRestrictions): >- * src/compiler/translator/ShHandle.h: >- >-2014-09-06 Darin Adler <darin@apple.com> >- >- Make updates suggested by new version of Xcode >- https://bugs.webkit.org/show_bug.cgi?id=136603 >- >- Reviewed by Mark Rowe. >- >- * ANGLE.xcodeproj/project.pbxproj: Updated LastUpgradeCheck. >- >- * Configurations/ANGLE.xcconfig: Added CLANG_WARN_BOOL_CONVERSION, >- CLANG_WARN_ENUM_CONVERSION, CLANG_WARN_INT_CONVERSION, COMBINE_HIDPI_IMAGES, >- and ENABLE_STRICT_OBJC_MSGSEND as suggested by Xcode upgrade check. >- >-2014-09-06 Commit Queue <commit-queue@webkit.org> >- >- Unreviewed, rolling out r173335. >- https://bugs.webkit.org/show_bug.cgi?id=136597 >- >- Broke webgl/1.0.2/conformance/glsl/misc/shader-varying- >- packing-restrictions.html (Requested by ap on #webkit). >- >- Reverted changeset: >- >- "Remove statically used varyings from packing restrictions >- check." >- https://bugs.webkit.org/show_bug.cgi?id=136585 >- http://trac.webkit.org/changeset/173335 >- >-2014-09-05 Roger Fong <roger_fong@apple.com> >- >- Remove statically used varyings from packing restrictions check. >- https://bugs.webkit.org/show_bug.cgi?id=136585. >- <rdar://problem/16308409> >- >- Reviewed by Dean Jackson. >- >- * src/compiler/translator/Compiler.cpp: >- (TCompiler::enforcePackingRestrictions): >- >-2014-08-29 Csaba Osztrogonác <ossy@webkit.org> >- >- Unreviwed, remove empty directories. >- >- * src/compiler/depgraph: Removed. >- * src/compiler/timing: Removed. >- * src/libGLESv2/renderer/shaders: Removed. >- * src/libGLESv2/renderer/shaders/compiled: Removed. >- >-2014-08-11 Andy Estes <aestes@apple.com> >- >- [iOS] Get rid of iOS.xcconfig >- https://bugs.webkit.org/show_bug.cgi?id=135809 >- >- Reviewed by Joseph Pecoraro. >- >- All iOS.xcconfig did was include AspenFamily.xcconfig, so there's no need for the indirection. >- >- * ANGLE.xcodeproj/project.pbxproj: >- * Configurations/Base.xcconfig: >- * Configurations/iOS.xcconfig: Removed. >- >-2014-08-07 Brent Fulgham <bfulgham@apple.com> >- >- [Win] Unreviewed gardening. >- >- DebugSuffix targets should use our debugsuffix property sheet, and >- will therefore build to the proper output location with the proper >- suffix tags. >- >- Also, we must use the WebKit_Libraries environment variable, not a set >- of relative paths to the property sheets. >- >- * ANGLE.vcxproj/libEGL.vcxproj: Use 'debugsuffix.props' sheet. >- * ANGLE.vcxproj/libGLESv2.vcxproj: Ditto. >- * ANGLE.vcxproj/preprocessor.vcxproj: Ditto. >- * ANGLE.vcxproj/translator_common.vcxproj: Ditto. >- * ANGLE.vcxproj/translator_glsl.vcxproj: Ditto. >- * ANGLE.vcxproj/translator_hlsl.vcxproj: Ditto. >- * ANGLE.vcxproj/libEGLCommon.props: Use $(DebugSuffix) endings. >- * ANGLE.vcxproj/libGLESv2Common.props: Ditto. >- * ANGLE.vcxproj/translatorCommon.props: Output to 'lib' folder, >- not 'bin' folder. These are libraries! >- >-2014-08-02 Brent Fulgham <bfulgham@apple.com> >- >- [Win] Unreviewed build fix. >- >- * src/libGLESv2/renderer/d3d11/BufferStorage11.cpp: >- (rx::BufferStorage11::copyData): Help compiler make >- decision about types. >- >-2014-07-25 peavo@outlook.com <peavo@outlook.com> >- >- [Win][ANGLE] Enable D3D11. >- https://bugs.webkit.org/show_bug.cgi?id=135296 >- >- Reviewed by Alex Christensen. >- >- Direct3D 11 is not enabled on Windows. >- >- * ANGLE.vcxproj/libGLESv2.vcxproj: Added files. >- * ANGLE.vcxproj/libGLESv2.vcxproj.filters: Ditto. >- * ANGLE.vcxproj/libGLESv2Common.props: Enable D3D11. >- * src/libGLESv2/precompiled.h: Header file does not exist, avoid include. >- * changes.diff: Updated diff. >- >-2014-06-04 Alex Christensen <achristensen@webkit.org> >- >- Enable WebGL on Windows. >- https://bugs.webkit.org/show_bug.cgi?id=133503 >- >- Reviewed by Brent Fulgham. >- >- * changes.diff >- Recorded additional changes from ANGLE. >- * ANGLE.vcxproj/libEGL.vcxproj: >- * ANGLE.vcxproj/libEGL.vcxproj.filters: >- * ANGLE.vcxproj/libGLESv2.vcxproj: >- * ANGLE.vcxproj/libGLESv2.vcxproj.filters: >- * include/EGL/egl.h: >- * include/EGL/eglsoftlinking.h: Added. >- * include/GLES2/gl2.h: >- * include/GLES2/gl2softlinking.h: Added. >- Resurrected soft linking headers from r153664. >- * src/libGLESv2/renderer/VertexBuffer.cpp: >- (rx::VertexBufferInterface::directStoragePossible): >- Compile fix for Win64. >- >-2014-05-02 Alex Christensen <achristensen@webkit.org> >- >- Update ANGLE Windows build. >- https://bugs.webkit.org/show_bug.cgi?id=132456 >- >- Reviewed by Brent Fulgham. >- >- * ANGLE.vcxproj/libEGLCommon.props: >- * ANGLE.vcxproj/libGLESv2.vcxproj: >- * ANGLE.vcxproj/libGLESv2.vcxproj.filters: >- * ANGLE.vcxproj/libGLESv2Common.props: >- * ANGLE.vcxproj/translator_common.vcxproj: >- * ANGLE.vcxproj/translator_common.vcxproj.filters: >- * ANGLE.vcxproj/translator_glsl.vcxproj: >- * ANGLE.vcxproj/translator_glsl.vcxproj.filters: >- * ANGLE.vcxproj/translator_hlsl.vcxproj: >- * ANGLE.vcxproj/translator_hlsl.vcxproj.filters: >- Updated ANGLE build. >- * src/ANGLE.sln: Removed. >- * src/build_angle.gyp: Removed. >- * src/commit.h: Added. >- * changes.diff: >- * src/libGLESv2/Program.cpp: >- (gl::InfoLog::append): >- Fixed typo. >- >-2014-05-01 Alex Christensen <achristensen@webkit.org> >- >- Finish updating ANGLE. >- https://bugs.webkit.org/show_bug.cgi?id=132434 >- >- Reviewed by Dean Jackson. >- >- * ANGLE.xcodeproj/project.pbxproj: >- Removed Uniform.cpp which is no longer in ANGLE. >- * changes.diff: >- Added more changes from ANGLE which are already included in WebKit. >- >- Updated ANGLE source files to e7a453a5bd76705ccb151117fa844846d4aa90af. Long list of changes omitted. >- >-2014-04-30 Alex Christensen <achristensen@webkit.org> >- >- Updated ANGLE. >- https://bugs.webkit.org/show_bug.cgi?id=132367 >- <rdar://problem/16211451> >- >- Reviewed by Dean Jackson. >- >- * ANGLE.plist: >- Updated and xml encoded. >- * ANGLE.xcodeproj/project.pbxproj: >- Added needed new source files. >- * changes.diff: >- Added to keep track of differences between WebKit's copy of ANGLE and the master repository. >- >- Updated ANGLE source files to e7a453a5bd76705ccb151117fa844846d4aa90af. Long list of changes omitted. >- >-2014-03-25 Martin Robinson <mrobinson@igalia.com> >- >- [GTK] Remove the autotools build >- https://bugs.webkit.org/show_bug.cgi?id=130717 >- >- Reviewed by Anders Carlsson. >- >- * GNUmakefile.am: Removed. >- >-2014-03-14 Mark Rowe <mrowe@apple.com> >- >- Fix the production build. >- >- Don't rely on USE_INTERNAL_SDK being set for the Production configuration since UseInternalSDK.xcconfig won't >- be at the expected relative path when working from installed source. >- >- * Configurations/Base.xcconfig: >- >-2014-03-13 Tim Horton <timothy_horton@apple.com> >- >- Fix relative paths to UseInternalSDK.xcconfig for ANGLE and WebKit/mac >- >- Rubber-stamped by Mark Rowe. >- >- One-too-few "..". >- >- * Configurations/Base.xcconfig: >- >-2014-03-13 Radu Stavila <stavila@adobe.com> >- >- Webkit not building on XCode 5.1 due to garbage collection no longer being supported >- https://bugs.webkit.org/show_bug.cgi?id=130087 >- >- Reviewed by Mark Rowe. >- >- Disable garbage collection on macosx when not using internal SDK. >- >- * Configurations/Base.xcconfig: >- >-2014-02-24 Dean Jackson <dino@apple.com> >- >- Unreviewed. This file should not be marked as executable (copied in from ANGLE). >- >- * include/KHR/khrplatform.h: >- >-2014-02-23 David Kilzer <ddkilzer@apple.com> >- >- ANGLE: Stop using unsafe strcpy method >- <http://webkit.org/b/129237> >- <rdar://problem/11077580> >- >- Reviewed by Dean Jackson. >- >- * include/GLSLANG/ShaderLang.h: >- - Drive-by fix for header documentation. >- >- * src/compiler/translator/ShaderLang.cpp: >- (ShGetInfoLog): >- (ShGetObjectCode): >- * src/libGLESv2/Program.cpp: >- (gl::InfoLog::append): >- - Switch to use strncpy(), and explicitly set NULL terminator at >- the end of the buffer. >- >-2014-02-23 Brent Fulgham <bfulgham@apple.com> >- >- [WinCairo] Unreviewed build fix after r164565. >- >- * ANGLE.vcxproj/libEGL.vcxproj: Use correct path to files. >- * ANGLE.vcxproj/libGLESv2.vcxproj: Ditto. >- * ANGLE.vcxproj/libGLESv2.vcxproj.filters: Ditto. >- * ANGLE.vcxproj/preprocessor.vcxproj: Ditto. >- * ANGLE.vcxproj/translator_common.vcxproj: Ditto. >- * ANGLE.vcxproj/translator_common.vcxproj.filters: Ditto. >- * ANGLE.vcxproj/translator_glsl.vcxproj: Ditto. >- * ANGLE.vcxproj/translator_glsl.vcxproj.filters: Ditto. >- * ANGLE.vcxproj/translator_hlsl.vcxproj: Ditto. >- * ANGLE.vcxproj/translator_hlsl.vcxproj.filters: Ditto. >- >-2014-02-23 Dean Jackson <dino@apple.com> >- >- Missing files from previous commit. >- >-2014-02-23 Dean Jackson <dino@apple.com> >- >- Update ANGLE to 836bd2176e5607b14846cf1fbc5932dbc91318f4 >- https://bugs.webkit.org/show_bug.cgi?id=129232 >- >- Reviewed by Brent Fulgham. >- >- I also reapplied some of our changes from previous updates, including disabling the clang deprecation >- warnings in some files, adding the Apple note about license and defining YY_NO_INPUT. >- >- Huge list of source changes omitted. >- >-2013-12-18 Carlos Garcia Campos <cgarcia@igalia.com> >- >- Unreviewed. Fix make distcheck. >- >- * GNUmakefile.am: >- >-2013-12-17 Gustavo Noronha Silva <gustavo.noronha@collabora.com> >- >- [GTK] Some ANGLE headers missing from dist >- https://bugs.webkit.org/show_bug.cgi?id=125782 >- >- Reviewed by Carlos Garcia Campos. >- >- * GNUmakefile.am: add a few headers that were missing from the build, >- causing build failures when the system headers were incompatible. >- >-2013-12-16 Alex Christensen <achristensen@webkit.org> >- >- Fixed Win64 build on VS2013. >- https://bugs.webkit.org/show_bug.cgi?id=125753 >- >- Reviewed by Brent Fulgham. >- >- * ANGLE.vcxproj/libGLESv2.vcxproj: >- * ANGLE.vcxproj/preprocessor.vcxproj: >- * ANGLE.vcxproj/translator_common.vcxproj: >- * ANGLE.vcxproj/translator_glsl.vcxproj: >- * ANGLE.vcxproj/translator_hlsl.vcxproj: >- Added correct PlatformToolset for 64-bit builds. >- >-2013-12-13 Brent Fulgham <bfulgham@apple.com> >- >- [Win] Unreviewed build fix after r160548 >- >- I missed the ANGLE files, since we aren't building these >- on the Apple Windows port at the moment. >- >- * ANGLE.vcxproj/libEGL.vcxproj: Update to VS2013 >- * ANGLE.vcxproj/libGLESv2.vcxproj: Ditto >- * ANGLE.vcxproj/preprocessor.vcxproj: Ditto >- * ANGLE.vcxproj/translator_common.vcxproj: Ditto >- * ANGLE.vcxproj/translator_glsl.vcxproj: Ditto >- * ANGLE.vcxproj/translator_hlsl.vcxproj: Ditto >- >-2013-12-06 Commit Queue <commit-queue@webkit.org> >- >- Unreviewed, rolling out r159543. >- http://trac.webkit.org/changeset/159543 >- https://bugs.webkit.org/show_bug.cgi?id=125371 >- >- Build fix for mac no longer needed (Requested by rfong on >- #webkit). >- >- * ANGLE.xcodeproj/project.pbxproj: >- * src/compiler/glslang_tab.cpp: >- (yysyntax_error): >- (glslang_parse): >- * src/compiler/glslang_tab.h: >- * src/compiler/preprocessor/ExpressionParser.cpp: >- (yy_symbol_print): >- (yy_stack_print): >- (yy_reduce_print): >- (yytnamerr): >- (yysyntax_error): >- (yydestruct): >- (yyparse): >- >-2013-12-05 Roger Fong <roger_fong@apple.com> >- >- [WebGL] Make sure we satisfy uniform and varying packing restrictions. >- https://bugs.webkit.org/show_bug.cgi?id=125124. >- <rdar://problem/15203291> >- >- Reviewed by Brent Fulgham. >- >- * src/compiler/Compiler.cpp: >- Add a check to enforcePackingRestrictions to ensure we make sure packing restrictions for varyings are satisfied as well. >- (TCompiler::TCompiler): >- (TCompiler::Init): >- (TCompiler::compile): >- (TCompiler::enforcePackingRestrictions): >- * src/compiler/ShHandle.h: Keep track of maximum varying vectors. >- >-2013-12-05 Matthew Hanson <matthew_hanson@apple.com> >- >- Fix ANGLE build failures by re-comitting the changes in http://trac.webkit.org/changeset/154223 >- on top of the library updates introduced by http://trac.webkit.org/changeset/159533. >- >- Rubber-stamped by Babak Shafiei. >- >- * src/compiler/glslang.l: >- * src/compiler/glslang_lex.cpp: >- * src/compiler/preprocessor/Tokenizer.cpp: >- * src/compiler/preprocessor/Tokenizer.l: >- >-2013-12-03 Daniel Bates <dabates@apple.com> >- >- ANGLE fails to build with trunk clang: unused constant kTraceBufferLen >- https://bugs.webkit.org/show_bug.cgi?id=125164 >- https://code.google.com/p/angleproject/issues/detail?id=534 >- >- Reviewed by Darin Adler. >- >- Move the definition of the constant kTraceBufferLen under the macro >- guard TRACE_ENABLED since it's only referenced in code guarded by >- TRACE_ENABLED. >- >- * src/compiler/debug.cpp: >- >-2013-11-21 Alex Christensen <achristensen@webkit.org> >- >- Remove ANGLEGenerated from Windows build. >- https://bugs.webkit.org/show_bug.cgi?id=124759 >- >- Reviewed by Darin Adler. >- >- * ANGLE.vcxproj/ANGLEGenerated.vcxproj: Removed. >- * ANGLE.vcxproj/ANGLEGenerated.vcxproj.filters: Removed. >- >-2013-11-21 Alex Christensen <achristensen@webkit.org> >- >- Unreviewed build fix. >- >- * src/libGLESv2/Constants.h: Added from checkout a60e0805721f62c28a55faf2df74472cc5fc91fc. >- >-2013-11-21 Mark Rowe <mrowe@apple.com> >- >- <https://webkit.org/b/124701> Fix an error in a few Xcode configuration setting files. >- >- Reviewed by Alexey Proskuryakov. >- >- * Configurations/Base.xcconfig: >- >-2013-11-21 Brent Fulgham <bfulgham@apple.com> >- >- Unreviewed gardening to hide annoying *.user files when. >- >- * ANGLE.vcxproj: Added property svn:ignore. >- >-2013-11-21 peavo@outlook.com <peavo@outlook.com> >- >- [WinCairo] Building ANGLE libraries fails. >- https://bugs.webkit.org/show_bug.cgi?id=124679 >- >- Reviewed by Brent Fulgham. >- >- Added/removed files to/from project, and re-added constants.h file. >- >- * ANGLE.vcxproj/libEGL.vcxproj: >- * ANGLE.vcxproj/libEGL.vcxproj.filters: >- * ANGLE.vcxproj/libGLESv2.vcxproj: >- * ANGLE.vcxproj/libGLESv2.vcxproj.filters: >- * ANGLE.vcxproj/libGLESv2Common.props: >- * ANGLE.vcxproj/translator_common.vcxproj: >- * ANGLE.vcxproj/translator_common.vcxproj.filters: >- * ANGLE.vcxproj/translator_glsl.vcxproj: >- * ANGLE.vcxproj/translator_glsl.vcxproj.filters: >- * ANGLE.vcxproj/translator_hlsl.vcxproj: >- * ANGLE.vcxproj/translator_hlsl.vcxproj.filters: >- * src/libGLESv2/libGLESv2.def: >- >-2013-11-20 Sergio Correia <sergio.correia@openbossa.org> >- >- ANGLE doesn't build with bison 3.0 >- https://bugs.webkit.org/show_bug.cgi?id=124642 >- >- Reviewed by Gyuyoung Kim. >- >- This is a reedition of r154109, now that ANGLE source has been updated >- in r159533. >- >- * src/compiler/glslang.y: Use %lex-param to set YYLEX_PARAM and stop >- using the deprecated YYID macro. >- >-2013-11-20 Carlos Garcia Campos <cgarcia@igalia.com> >- >- Unreviewed. Fix GTK build. >- >- * GNUmakefile.am: Remove duplicated entries. >- >-2013-11-19 Martin Robinson <mrobinson@igalia.com> >- >- Fix the GTK+ build after the ANGLE update in r159533 >- >- * GNUmakefile.am: Update the source list. >- >-2013-11-19 Roger Fong <roger_fong@apple.com> >- >- Unreviewed. Build fix for Mac. >- >- * src/compiler/glslang_tab.cpp: >- (yysyntax_error): >- (yyerror): >- * src/compiler/glslang_tab.h: >- * src/compiler/preprocessor/ExpressionParser.cpp: >- (yysyntax_error): >- >-2013-11-19 Roger Fong <roger_fong@apple.com> >- >- Unreviewed. Prospective build fix for GTK port following r159533. >- >- * GNUmakefile.am: >- >-2013-11-19 Roger Fong <roger_fong@apple.com> >- >- Update ANGLE sources. >- https://bugs.webkit.org/show_bug.cgi?id=124615. >- >- Reviewed by Dean Jackson. >- >- Update ANGLE to checkout a60e0805721f62c28a55faf2df74472cc5fc91fc. >- Modify xcodeproj files as necessary, update plist. >- Stop using DerivedSources.make and just use the generated sources that are checked into ANGLE. >- Add a note to bison generated files indicating that Apple elects to distribute said files under the BSD license: >- ExpressionParser.cpp, glslang_tab.cpp, glslang_tab.h. >- >- * ANGLE.plist: >- * ANGLE.xcodeproj/project.pbxproj: >- * DerivedSources.make: Removed. >- * include/EGL/egl.h: >- * include/EGL/eglsoftlinking.h: Removed. >- * include/GLES2/gl2.h: >- * include/GLES2/gl2softlinking.h: Removed. >- * include/GLSLANG/ShaderLang.h: >- * include/KHR/khrplatform.h: >- * src/ANGLE.sln: Added. >- * src/build_angle.gypi: >- * src/common/debug.h: >- * src/common/event_tracer.cpp: Added. >- (gl::TraceGetTraceCategoryEnabledFlag): >- (gl::TraceAddTraceEvent): >- * src/common/event_tracer.h: Added. >- * src/common/version.h: >- * src/compiler/CodeGen.cpp: Added. >- (ConstructCompiler): >- (DeleteCompiler): >- * src/compiler/CodeGenGLSL.cpp: Removed. >- * src/compiler/CodeGenHLSL.cpp: Removed. >- * src/compiler/Common.h: >- (NewPoolTString): >- * src/compiler/Compiler.cpp: >- (TCompiler::Init): >- (TCompiler::compile): >- (TCompiler::InitBuiltInSymbolTable): >- (TCompiler::clearResults): >- (TCompiler::collectVariables): >- * src/compiler/ConstantUnion.h: >- * src/compiler/DetectDiscontinuity.cpp: >- * src/compiler/InfoSink.h: >- * src/compiler/InitializeDll.cpp: >- (InitProcess): >- (DetachProcess): >- * src/compiler/InitializeDll.h: >- * src/compiler/InitializeGLPosition.cpp: Added. >- (InitializeGLPosition::visitAggregate): >- (InitializeGLPosition::insertCode): >- * src/compiler/InitializeGLPosition.h: Added. >- (InitializeGLPosition::InitializeGLPosition): >- (InitializeGLPosition::visitBinary): >- (InitializeGLPosition::visitUnary): >- (InitializeGLPosition::visitSelection): >- (InitializeGLPosition::visitLoop): >- (InitializeGLPosition::visitBranch): >- * src/compiler/InitializeGlobals.h: >- * src/compiler/InitializeParseContext.cpp: >- (InitializeParseContextIndex): >- (FreeParseContextIndex): >- (SetGlobalParseContext): >- (GetGlobalParseContext): >- * src/compiler/InitializeParseContext.h: >- * src/compiler/IntermTraverse.cpp: >- (TIntermSymbol::traverse): >- (TIntermConstantUnion::traverse): >- (TIntermBinary::traverse): >- (TIntermUnary::traverse): >- (TIntermAggregate::traverse): >- (TIntermSelection::traverse): >- (TIntermLoop::traverse): >- (TIntermBranch::traverse): >- * src/compiler/Intermediate.cpp: >- (GetHigherPrecision): >- (getOperatorString): >- (TIntermLoop::replaceChildNode): >- (TIntermBranch::replaceChildNode): >- (TIntermBinary::replaceChildNode): >- (TIntermUnary::replaceChildNode): >- (TIntermAggregate::replaceChildNode): >- (TIntermSelection::replaceChildNode): >- (TIntermOperator::isAssignment): >- (TIntermediate::promoteConstantUnion): >- * src/compiler/MapLongVariableNames.cpp: >- * src/compiler/MapLongVariableNames.h: >- * src/compiler/NodeSearch.h: Added. >- (sh::NodeSearchTraverser::NodeSearchTraverser): >- (sh::NodeSearchTraverser::found): >- (sh::NodeSearchTraverser::search): >- (sh::FindDiscard::visitBranch): >- (sh::FindSideEffectRewriting::visitBinary): >- * src/compiler/OutputGLSLBase.cpp: >- (TOutputGLSLBase::visitSelection): >- (TOutputGLSLBase::visitAggregate): >- (TOutputGLSLBase::visitLoop): >- * src/compiler/OutputGLSLBase.h: >- * src/compiler/OutputHLSL.cpp: >- (sh::OutputHLSL::OutputHLSL): >- (sh::OutputHLSL::header): >- (sh::OutputHLSL::visitBinary): >- (sh::OutputHLSL::visitSelection): >- (sh::OutputHLSL::visitBranch): >- (sh::OutputHLSL::handleExcessiveLoop): >- (sh::OutputHLSL::addConstructor): >- * src/compiler/OutputHLSL.h: >- * src/compiler/ParseContext.cpp: Added. >- (TParseContext::parseVectorFields): >- (TParseContext::parseMatrixFields): >- (TParseContext::recover): >- (TParseContext::error): >- (TParseContext::warning): >- (TParseContext::trace): >- (TParseContext::assignError): >- (TParseContext::unaryOpError): >- (TParseContext::binaryOpError): >- (TParseContext::precisionErrorCheck): >- (TParseContext::lValueErrorCheck): >- (TParseContext::constErrorCheck): >- (TParseContext::integerErrorCheck): >- (TParseContext::globalErrorCheck): >- (TParseContext::reservedErrorCheck): >- (TParseContext::constructorErrorCheck): >- (TParseContext::voidErrorCheck): >- (TParseContext::boolErrorCheck): >- (TParseContext::samplerErrorCheck): >- (TParseContext::structQualifierErrorCheck): >- (TParseContext::parameterSamplerErrorCheck): >- (TParseContext::containsSampler): >- (TParseContext::arraySizeErrorCheck): >- (TParseContext::arrayQualifierErrorCheck): >- (TParseContext::arrayTypeErrorCheck): >- (TParseContext::arrayErrorCheck): >- (TParseContext::nonInitConstErrorCheck): >- (TParseContext::nonInitErrorCheck): >- (TParseContext::paramErrorCheck): >- (TParseContext::extensionErrorCheck): >- (TParseContext::supportsExtension): >- (TParseContext::isExtensionEnabled): >- (TParseContext::findFunction): >- (TParseContext::executeInitializer): >- (TParseContext::areAllChildConst): >- (TParseContext::addConstructor): >- (TParseContext::foldConstConstructor): >- (TParseContext::constructBuiltIn): >- (TParseContext::constructStruct): >- (TParseContext::addConstVectorNode): >- (TParseContext::addConstMatrixNode): >- (TParseContext::addConstArrayNode): >- (TParseContext::addConstStruct): >- (TParseContext::enterStructDeclaration): >- (TParseContext::exitStructDeclaration): >- (TParseContext::structNestingErrorCheck): >- (TParseContext::addIndexExpression): >- (PaParseStrings): >- * src/compiler/ParseContext.h: Added. >- (TParseContext::TParseContext): >- (TParseContext::numErrors): >- (TParseContext::infoSink): >- (TParseContext::pragma): >- (TParseContext::extensionBehavior): >- * src/compiler/ParseHelper.cpp: Removed. >- * src/compiler/ParseHelper.h: Removed. >- * src/compiler/PoolAlloc.cpp: >- (InitializePoolIndex): >- (FreePoolIndex): >- (GetGlobalPoolAllocator): >- (SetGlobalPoolAllocator): >- * src/compiler/PoolAlloc.h: >- (pool_allocator::pool_allocator): >- * src/compiler/SearchSymbol.h: >- * src/compiler/ShHandle.h: >- (TCompiler::getVaryings): >- * src/compiler/ShaderLang.cpp: >- (checkVariableMaxLengths): >- (ShInitialize): >- (ShFinalize): >- (ShConstructCompiler): >- (ShCompile): >- (ShGetInfo): >- (ShGetVariableInfo): >- (ShCheckVariablesWithinPackingLimits): >- * src/compiler/SymbolTable.cpp: >- (TSymbolTable::~TSymbolTable): >- * src/compiler/SymbolTable.h: >- (TSymbol::TSymbol): >- (TSymbolTableLevel::insert): >- (TSymbolTable::push): >- (TSymbolTable::pop): >- (TSymbolTable::findBuiltIn): >- (TSymbolTable::relateToExtension): >- (TSymbolTable::setDefaultPrecision): >- (TSymbolTable::getDefaultPrecision): >- (TSymbolTable::supportsPrecision): >- * src/compiler/Types.h: >- (NewPoolTFieldList): >- (TType::TType): >- (TType::setNominalSize): >- (TPublicType::setAggregate): >- * src/compiler/UnfoldShortCircuit.cpp: >- (sh::UnfoldShortCircuit::visitBinary): >- (sh::UnfoldShortCircuit::visitSelection): >- * src/compiler/UnfoldShortCircuit.h: >- * src/compiler/UnfoldShortCircuitAST.cpp: Added. >- (UnfoldShortCircuitAST::visitBinary): >- (UnfoldShortCircuitAST::updateTree): >- * src/compiler/UnfoldShortCircuitAST.h: Added. >- (UnfoldShortCircuitAST::UnfoldShortCircuitAST): >- (UnfoldShortCircuitAST::NodeUpdateEntry::NodeUpdateEntry): >- * src/compiler/Uniform.cpp: >- (sh::Uniform::Uniform): >- * src/compiler/Uniform.h: >- * src/compiler/ValidateLimitations.cpp: >- (ValidateLimitations::validateFunctionCall): >- (ValidateLimitations::validateOperation): >- * src/compiler/VariableInfo.cpp: >- (TVariableInfo::TVariableInfo): >- (CollectVariables::CollectVariables): >- (CollectVariables::visitSymbol): >- (CollectVariables::visitAggregate): >- * src/compiler/VariableInfo.h: >- * src/compiler/debug.cpp: >- * src/compiler/depgraph/DependencyGraph.cpp: >- * src/compiler/depgraph/DependencyGraphBuilder.cpp: >- (TDependencyGraphBuilder::visitBinary): >- * src/compiler/generate_parser.sh: >- * src/compiler/glslang.l: >- * src/compiler/glslang.y: >- * src/compiler/glslang_lex.cpp: >- (input): >- (yyerror): >- (int_constant): >- (float_constant): >- (glslang_scan): >- * src/compiler/glslang_tab.cpp: >- (yysyntax_error): >- (glslang_parse): >- * src/compiler/glslang_tab.h: >- * src/compiler/intermediate.h: >- (TIntermSymbol::hasSideEffects): >- (TIntermSymbol::replaceChildNode): >- (TIntermConstantUnion::hasSideEffects): >- (TIntermConstantUnion::getIConst): >- (TIntermConstantUnion::getFConst): >- (TIntermConstantUnion::getBConst): >- (TIntermConstantUnion::replaceChildNode): >- (TIntermOperator::hasSideEffects): >- (TIntermBinary::hasSideEffects): >- (TIntermUnary::hasSideEffects): >- (TIntermAggregate::hasSideEffects): >- (TIntermSelection::hasSideEffects): >- (TIntermTraverser::~TIntermTraverser): >- (TIntermTraverser::incrementDepth): >- (TIntermTraverser::decrementDepth): >- (TIntermTraverser::getParentNode): >- * src/compiler/localintermediate.h: >- * src/compiler/parseConst.cpp: >- * src/compiler/preprocessor/ExpressionParser.cpp: >- (yy_symbol_print): >- (yy_stack_print): >- (yy_reduce_print): >- (yystrlen): >- (yystpcpy): >- (yytnamerr): >- (yysyntax_error): >- (yydestruct): >- (yyparse): >- * src/compiler/preprocessor/ExpressionParser.y: >- * src/compiler/preprocessor/Preprocessor.cpp: >- (pp::Preprocessor::setMaxTokenLength): >- (pp::Preprocessor::lex): >- * src/compiler/preprocessor/Preprocessor.h: >- * src/compiler/preprocessor/Tokenizer.cpp: >- (pp::Tokenizer::Tokenizer): >- (pp::Tokenizer::lex): >- * src/compiler/preprocessor/Tokenizer.h: >- (pp::Tokenizer::setMaxTokenLength): >- * src/compiler/preprocessor/Tokenizer.l: >- * src/compiler/preprocessor/generate_parser.sh: >- * src/compiler/preprocessor/preprocessor.vcxproj: Added. >- * src/compiler/preprocessor/preprocessor.vcxproj.filters: Added. >- * src/compiler/timing/RestrictFragmentShaderTiming.cpp: >- * src/compiler/translator.vcxproj: Added. >- * src/compiler/translator.vcxproj.filters: Added. >- * src/compiler/util.cpp: >- (atof_clamp): >- (atoi_clamp): >- * src/compiler/util.h: >- * src/libEGL/Surface.cpp: >- (egl::Surface::checkForOutOfDateSwapChain): >- * src/libEGL/libEGL.cpp: >- * src/libEGL/libEGL.rc: >- * src/libEGL/libEGL.vcxproj: Added. >- * src/libEGL/libEGL.vcxproj.filters: Added. >- * src/libGLESv2/Buffer.cpp: >- (gl::Buffer::bufferData): >- (gl::Buffer::bufferSubData): >- (gl::Buffer::size): >- (gl::Buffer::getIndexRangeCache): >- * src/libGLESv2/Buffer.h: >- * src/libGLESv2/Context.cpp: >- (gl::Context::applyTextures): >- (gl::Context::getBoundFramebufferTextureSerials): >- * src/libGLESv2/Context.h: >- (gl::Context::getRenderer): >- * src/libGLESv2/Framebuffer.h: >- * src/libGLESv2/ProgramBinary.cpp: >- (gl::DiscardWorkaround): >- (gl::ProgramBinary::load): >- (gl::ProgramBinary::link): >- (gl::ProgramBinary::linkAttributes): >- (gl::AttributeSorter::AttributeSorter): >- (gl::ProgramBinary::initAttributesByLayout): >- (gl::ProgramBinary::sortAttributesByLayout): >- * src/libGLESv2/ProgramBinary.h: >- * src/libGLESv2/Renderbuffer.cpp: >- (gl::RenderbufferTexture2D::getTextureSerial): >- (gl::RenderbufferTextureCubeMap::getTextureSerial): >- (gl::Renderbuffer::getTextureSerial): >- * src/libGLESv2/Renderbuffer.h: >- (gl::RenderbufferStorage::getTextureSerial): >- * src/libGLESv2/Shader.cpp: >- (gl::Shader::parseVaryings): >- (gl::Shader::uncompile): >- * src/libGLESv2/Shader.h: >- * src/libGLESv2/Texture.cpp: >- (gl::TextureCubeMap::storage): >- * src/libGLESv2/Uniform.cpp: >- (gl::Uniform::Uniform): >- (gl::Uniform::~Uniform): >- (gl::Uniform::isArray): >- (gl::Uniform::elementCount): >- * src/libGLESv2/Uniform.h: >- * src/libGLESv2/constants.h: Removed. >- * src/libGLESv2/libGLESv2.def: >- * src/libGLESv2/libGLESv2.rc: >- * src/libGLESv2/libGLESv2.vcxproj: Added. >- * src/libGLESv2/libGLESv2.vcxproj.filters: Added. >- * src/libGLESv2/precompiled.h: >- * src/libGLESv2/renderer/Image11.cpp: >- (rx::Image11::generateMipmap): >- (rx::Image11::loadData): >- (rx::Image11::loadCompressedData): >- (rx::Image11::copy): >- (rx::Image11::createStagingTexture): >- (rx::Image11::map): >- * src/libGLESv2/renderer/Image11.h: >- * src/libGLESv2/renderer/IndexBuffer.cpp: >- (rx::IndexBufferInterface::mapBuffer): >- (rx::StaticIndexBufferInterface::getIndexRangeCache): >- * src/libGLESv2/renderer/IndexBuffer.h: >- * src/libGLESv2/renderer/IndexBuffer11.cpp: >- (rx::IndexBuffer11::mapBuffer): >- * src/libGLESv2/renderer/IndexDataManager.cpp: >- (rx::IndexDataManager::prepareIndexData): >- (rx::IndexDataManager::getCountingIndices): >- * src/libGLESv2/renderer/IndexRangeCache.cpp: Added. >- (rx::IndexRangeCache::addRange): >- (rx::IndexRangeCache::invalidateRange): >- (rx::IndexRangeCache::findRange): >- (rx::IndexRangeCache::clear): >- (rx::IndexRangeCache::IndexRange::IndexRange): >- (rx::IndexRangeCache::IndexRange::operator<): >- (rx::IndexRangeCache::IndexBounds::IndexBounds): >- * src/libGLESv2/renderer/IndexRangeCache.h: Added. >- * src/libGLESv2/renderer/InputLayoutCache.cpp: >- (rx::InputLayoutCache::InputLayoutCache): >- (rx::InputLayoutCache::clear): >- (rx::InputLayoutCache::markDirty): >- (rx::InputLayoutCache::applyVertexBuffers): >- (rx::InputLayoutCache::hashInputLayout): >- (rx::InputLayoutCache::compareInputLayouts): >- * src/libGLESv2/renderer/InputLayoutCache.h: >- (rx::InputLayoutCache::InputLayoutKey::begin): >- (rx::InputLayoutCache::InputLayoutKey::end): >- * src/libGLESv2/renderer/RenderTarget11.cpp: >- (rx::RenderTarget11::getTexture): >- (rx::RenderTarget11::getRenderTargetView): >- (rx::RenderTarget11::getDepthStencilView): >- (rx::RenderTarget11::getShaderResourceView): >- * src/libGLESv2/renderer/RenderTarget11.h: >- * src/libGLESv2/renderer/Renderer.cpp: >- (rx::Renderer::initializeCompiler): >- * src/libGLESv2/renderer/Renderer.h: >- * src/libGLESv2/renderer/Renderer11.cpp: >- (rx::Renderer11::initialize): >- (rx::Renderer11::applyPrimitiveType): >- (rx::Renderer11::applyRenderTarget): >- (rx::Renderer11::drawLineLoop): >- (rx::Renderer11::drawTriangleFan): >- (rx::Renderer11::applyUniforms): >- (rx::Renderer11::clear): >- (rx::Renderer11::markAllStateDirty): >- (rx::Renderer11::copyImage): >- (rx::Renderer11::compileToExecutable): >- (rx::Renderer11::getRenderTargetResource): >- (rx::Renderer11::blitRenderbufferRect): >- * src/libGLESv2/renderer/Renderer11.h: >- * src/libGLESv2/renderer/Renderer9.cpp: >- (rx::Renderer9::initialize): >- (rx::Renderer9::setViewport): >- (rx::Renderer9::drawLineLoop): >- (rx::Renderer9::compileToExecutable): >- * src/libGLESv2/renderer/Renderer9.h: >- * src/libGLESv2/renderer/SwapChain.h: >- * src/libGLESv2/renderer/SwapChain11.cpp: >- (rx::SwapChain11::resetOffscreenTexture): >- (rx::SwapChain11::reset): >- (rx::SwapChain11::swapRect): >- * src/libGLESv2/renderer/SwapChain9.cpp: >- (rx::convertInterval): >- * src/libGLESv2/renderer/TextureStorage11.cpp: >- (rx::TextureStorage11::IsTextureFormatRenderable): >- (rx::TextureStorage11::generateMipmapLayer): >- (rx::TextureStorage11_Cube::getRenderTarget): >- * src/libGLESv2/renderer/VertexBuffer.cpp: >- (rx::VertexBufferInterface::storeVertexAttributes): >- (rx::VertexBufferInterface::storeRawData): >- (rx::VertexBufferInterface::reserveVertexSpace): >- (rx::StaticVertexBufferInterface::lookupAttribute): >- (rx::StaticVertexBufferInterface::storeVertexAttributes): >- * src/libGLESv2/renderer/VertexBuffer.h: >- * src/libGLESv2/renderer/VertexBuffer11.cpp: >- (rx::VertexBuffer11::getSpaceRequired): >- * src/libGLESv2/renderer/VertexBuffer11.h: >- * src/libGLESv2/renderer/VertexBuffer9.cpp: >- (rx::VertexBuffer9::storeVertexAttributes): >- (rx::VertexBuffer9::getSpaceRequired): >- (rx::VertexBuffer9::requiresConversion): >- (rx::VertexBuffer9::getVertexSize): >- (rx::VertexBuffer9::spaceRequired): >- * src/libGLESv2/renderer/VertexBuffer9.h: >- * src/libGLESv2/renderer/VertexDataManager.cpp: >- (rx::elementsInBuffer): >- (rx::StreamingBufferElementCount): >- (rx::VertexDataManager::prepareVertexData): >- * src/libGLESv2/renderer/VertexDataManager.h: >- * src/libGLESv2/renderer/renderer11_utils.cpp: >- (gl_d3d11::ConvertTextureFormat): >- * src/libGLESv2/renderer/shaders/compiled/clear11vs.h: >- * src/libGLESv2/renderer/shaders/compiled/clearmultiple11ps.h: >- * src/libGLESv2/renderer/shaders/compiled/clearsingle11ps.h: >- * src/libGLESv2/renderer/shaders/compiled/componentmaskps.h: >- * src/libGLESv2/renderer/shaders/compiled/flipyvs.h: >- * src/libGLESv2/renderer/shaders/compiled/luminanceps.h: >- * src/libGLESv2/renderer/shaders/compiled/passthrough11vs.h: >- * src/libGLESv2/renderer/shaders/compiled/passthroughlum11ps.h: >- * src/libGLESv2/renderer/shaders/compiled/passthroughlumalpha11ps.h: >- * src/libGLESv2/renderer/shaders/compiled/passthroughps.h: >- * src/libGLESv2/renderer/shaders/compiled/passthroughrgb11ps.h: >- * src/libGLESv2/renderer/shaders/compiled/passthroughrgba11ps.h: >- * src/libGLESv2/renderer/shaders/compiled/standardvs.h: >- * src/libGLESv2/renderer/shaders/generate_shaders.bat: >- * src/libGLESv2/utilities.cpp: >- (gl::ComputeTypeSize): >- * src/libGLESv2/utilities.h: >- * src/third_party/murmurhash/MurmurHash3.cpp: >- (rotl32): >- (rotl64): >- (getblock): >- (fmix): >- (MurmurHash3_x86_32): >- (MurmurHash3_x86_128): >- (MurmurHash3_x64_128): >- * src/third_party/murmurhash/MurmurHash3.h: >- * src/third_party/trace_event: Added. >- * src/third_party/trace_event/trace_event.h: Added. >- (gl::TraceEvent::TraceID::TraceID): >- (gl::TraceEvent::TraceID::data): >- (gl::TraceEvent::TraceStringWithCopy::TraceStringWithCopy): >- (gl::TraceEvent::TraceStringWithCopy::operator const char* ): >- (gl::TraceEvent::setTraceValue): >- (gl::TraceEvent::addTraceEvent): >- (gl::TraceEvent::TraceEndOnScopeClose::TraceEndOnScopeClose): >- (gl::TraceEvent::TraceEndOnScopeClose::~TraceEndOnScopeClose): >- (gl::TraceEvent::TraceEndOnScopeClose::initialize): >- (gl::TraceEvent::TraceEndOnScopeClose::addEventIfEnabled): >- (gl::TraceEvent::SamplingStateScope::SamplingStateScope): >- (gl::TraceEvent::SamplingStateScope::~SamplingStateScope): >- (gl::TraceEvent::SamplingStateScope::current): >- (gl::TraceEvent::SamplingStateScope::set): >- >-2013-11-18 Mark Rowe <mrowe@apple.com> >- >- Use hw.activecpu for determining how many processes to spawn. >- >- It's documented as the preferred way to determine the number of threads >- or processes to create in a SMP aware application. >- >- Rubber-stamped by Tim Horton. >- >- * ANGLE.xcodeproj/project.pbxproj: >- >-2013-11-06 Dean Jackson <dino@apple.com> >- >- kTraceBufferLen is unused in default builds >- https://bugs.webkit.org/show_bug.cgi?id=123941 >- <rdar://problem/15409804> >- >- Reviewed by Tim Horton. >- >- kTraceBufferLen is not used in debug.cpp if TRACE_ENABLED is >- not defined. This causes a warning in newer builds of clang. >- For now, skip warnings on unused variables until we >- update from ANGLE. >- >- * src/compiler/debug.cpp: Add unused-variable ignore pragma. >- >-2013-10-24 Mark Rowe <mrowe@apple.com> >- >- Remove references to OS X 10.7 from Xcode configuration settings. >- >- Now that we're not building for OS X 10.7 they're no longer needed. >- >- Reviewed by Anders Carlsson. >- >- * Configurations/Base.xcconfig: >- * Configurations/DebugRelease.xcconfig: >- >-2013-10-24 Mark Rowe <mrowe@apple.com> >- >- <rdar://problem/15312643> Prepare for the mysterious future. >- >- Reviewed by David Kilzer. >- >- * Configurations/Base.xcconfig: >- * Configurations/DebugRelease.xcconfig: >- >-2013-10-10 Mark Rowe <mrowe@apple.com> >- >- <rdar://problem/13341666> WebKit should always build against an SDK. >- >- Have all projects default to building against the OS X Internal SDK for the Production >- configuration. For the Debug and Release configurations, look for UseInternalSDK.xcconfig >- to determine whether the OS X Internal SDK should be used. If not, use the normal OS X SDK. >- >- Reviewed by Dan Bernstein. >- >- * Configurations/Base.xcconfig: >- * Configurations/DebugRelease.xcconfig: >- >-2013-10-08 Alex Christensen <achristensen@webkit.org> >- >- Generate pdb files for debugging ANGLE DLLs. >- https://bugs.webkit.org/show_bug.cgi?id=122530 >- >- Reviewed by Brent Fulgham. >- >- * ANGLE.vcxproj/libEGLCommon.props: >- * ANGLE.vcxproj/libGLESv2Common.props: >- Generate debug information. >- >-2013-10-03 Dan Bernstein <mitz@apple.com> >- >- <rdar://problem/15116673> [mac] Build failure when the source directory is not named ANGLE >- https://bugs.webkit.org/show_bug.cgi?id=122307 >- >- Reviewed by Mark Rowe. >- >- * ANGLE.xcodeproj/project.pbxproj: Ensure that the symlink to SRCROOT in >- DerivedSources/ANGLE is named ANGLE. >- >-2013-09-29 Darin Adler <darin@apple.com> >- >- Take some Xcode advice about turning on additional warnings in ANGLE and gtest >- https://bugs.webkit.org/show_bug.cgi?id=122087 >- >- Reviewed by Mark Rowe. >- >- * Configurations/Base.xcconfig: Add some of the warnings that Xcode 5 suggested. >- * src/compiler/preprocessor/Tokenizer.l: Defined YY_NO_INPUT so we don't compile >- an unused function and get a warning. >- >-2013-09-29 Darin Adler <darin@apple.com> >- >- Use RenderElement instead of RenderObject in many places >- https://bugs.webkit.org/show_bug.cgi?id=122078 >- >- Reviewed by Andreas Kling. >- >- * ANGLE.xcodeproj/project.pbxproj: Let Xcode do its thing to this file. >- >-2013-09-24 Mark Rowe <mrowe@apple.com> >- >- <rdar://problem/14971518> WebKit should build against the Xcode default toolchain when targeting OS X 10.8 >- >- Reviewed by Dan Bernstein. >- >- * Configurations/Base.xcconfig: >- >-2013-09-06 peavo@outlook.com <peavo@outlook.com> >- >- [Win][WebGL] WebGL rendering is slow. >- https://bugs.webkit.org/show_bug.cgi?id=120841 >- >- Reviewed by Brent Fulgham. >- >- Rendering WebGL content is slow on Windows, because lots of debug information is written to debug.txt. >- >- * ANGLE.vcxproj/ANGLERelease.props: Disable logging in release builds. >- >-2013-09-05 Dan Bernstein <mitz@apple.com> >- >- INSTALL_PATH_PREFIX is used even when not installing >- https://bugs.webkit.org/show_bug.cgi?id=120818 >- >- Reviewed by Darin Adler. >- >- * Configurations/ANGLE.xcconfig: Changed the definition of PRIVATE_HEADERS_FOLDER_PATH >- to include INSTALL_PATH_PREFIX only when installing. >- >-2013-08-17 David Kilzer <ddkilzer@apple.com> >- >- ANGLE fails to build with trunk clang: error: 'register' storage class specifier is deprecated [-Werror,-Wdeprecated-register] >- <http://webkit.org/b/119931> >- <rdar://problem/14763822> >- >- Reviewed by Darin Adler. >- >- * src/compiler/glslang.l: >- * src/compiler/glslang_lex.cpp: >- * src/compiler/preprocessor/Tokenizer.cpp: >- * src/compiler/preprocessor/Tokenizer.l: >- Add pragma statements to ignore -Wdeprecated-register warnings >- in generated code. Also ignore -Wunknown-pragmas so this >- doesn't cause a build failure in older versions of clang. >- >-2013-08-16 Commit Queue <commit-queue@webkit.org> >- >- Unreviewed, rolling out r153749. >- http://trac.webkit.org/changeset/153749 >- https://bugs.webkit.org/show_bug.cgi?id=119892 >- >- The bison generation of the glslang* files has now been fixed. (Requested by zdobersek on #webkit). >- >- * GNUmakefile.am: Preserve the libANGLE.la dependency on the ANGLE's GNUmakefile.am. >- >-2013-08-15 Allan Sandfeld Jensen <allan.jensen@digia.com> >- >- ANGLE doesn't build with bison 3.0 >- https://bugs.webkit.org/show_bug.cgi?id=119798 >- >- Reviewed by Antti Koivisto. >- >- Make glslang.y compatible with bison 3.0, by using %lex-param >- to set YYLEX_PARAM and getting rid of useless YYID macro. >- >- * src/compiler/glslang.y: >- >-2013-08-09 Zoltan Arvai <zarvai@inf.u-szeged.hu> >- >- [Qt] Buidfix after r153664. Adding ANGLE_WEBKIT_WIN definition. >- https://bugs.webkit.org/show_bug.cgi?id=119577 >- >- Reviewed by Allan Sandfeld Jensen. >- >- * Target.pri: >- >-2013-08-08 Alex Christensen <achristensen@apple.com> >- >- Link to correct DirectX libraries for Win64 ANGLE build. >- https://bugs.webkit.org/show_bug.cgi?id=119600 >- >- Reviewed by Brent Fulgham. >- >- * ANGLE.vcxproj/DirectX32.props: Added with x86 DirectX library directory. >- * ANGLE.vcxproj/DirectX64.props: Added with x64 DirectX library directory. >- * ANGLE.vcxproj/libEGL.vcxproj: >- * ANGLE.vcxproj/libGLESv2.vcxproj: >- Use DirectX32.props and DirectX64.props. >- * ANGLE.vcxproj/libEGLCommon.props: >- * ANGLE.vcxproj/libGLESv2Common.props: >- Removed DirectX library directory. >- >-2013-07-23 David Farler <dfarler@apple.com> >- >- Provide optional OTHER_CFLAGS, OTHER_CPPFLAGS, OTHER_LDFLAGS additions for building with ASAN >- https://bugs.webkit.org/show_bug.cgi?id=117762 >- >- Reviewed by Mark Rowe. >- >- * Configurations/DebugRelease.xcconfig: >- Add ASAN_OTHER_CFLAGS, CPLUSPLUSFLAGS. >- >-2013-08-06 Zan Dobersek <zdobersek@igalia.com> >- >- webkit-gtk fails to build with bison-3.0 >- https://bugs.webkit.org/show_bug.cgi?id=119373 >- >- Reviewed by Gustavo Noronha Silva. >- >- * GNUmakefile.am: Stop relying on generated glslang_tab.(cpp|h) and glslang.cpp sources as Bison 3.0 >- produces non-compilable source code. Instead, compile these pregenerated files as they're included in >- the tree. Originally, the ANGLE source tree provides these files as generated by Bison 2.7, but they're >- at the moment regenerated with Bison 2.3 when the third-party ANGLE source is being updated. >- >-2013-08-05 Alex Christensen <achristensen@apple.com> >- >- Added optimizations to Windows ANGLE builds. >- https://bugs.webkit.org/show_bug.cgi?id=119500 >- >- Reviewed by Brent Fulgham. >- >- * ANGLE.vcxproj/ANGLERelease.props: Added. >- * ANGLE.vcxproj/libEGL.vcxproj: >- * ANGLE.vcxproj/libGLESv2.vcxproj: >- * ANGLE.vcxproj/preprocessor.vcxproj: >- * ANGLE.vcxproj/translator_common.vcxproj: >- * ANGLE.vcxproj/translator_glsl.vcxproj: >- * ANGLE.vcxproj/translator_hlsl.vcxproj: >- Use ANGLERelease.props for Release, Release_WinCairo, and Production configurations. >- >-2013-08-02 Alex Christensen <achristensen@apple.com> >- >- Soft link ANGLE on Windows. >- https://bugs.webkit.org/show_bug.cgi?id=119452 >- >- Reviewed by Dean Jackson. >- >- * ANGLE.vcxproj/libEGL.vcxproj: >- * ANGLE.vcxproj/libEGL.vcxproj.filters: >- * ANGLE.vcxproj/libGLESv2.vcxproj: >- * ANGLE.vcxproj/libGLESv2.vcxproj.filters: >- Added soft linking headers. >- * ANGLE.vcxproj/libEGLCommon.props: >- * ANGLE.vcxproj/libGLESv2Common.props: >- * ANGLE.vcxproj/translatorCommon.props: >- Added ANGLE_WEBKIT_WIN macro definition for egl.h and gl2.h. >- * include/EGL/egl.h: >- * include/GLES2/gl2.h: >- Conditionally include soft linking headers based on ANGLE_WEBKIT_WIN macro. >- * include/EGL/eglsoftlinking.h: Added. >- * include/GLES2/gl2softlinking.h: Added. >- >-2013-08-01 Alex Christensen <achristensen@apple.com> >- >- Fixed wrong static_casting in ANGLE from r153064. >- https://bugs.webkit.org/show_bug.cgi?id=119296 >- >- Reviewed by Dean Jackson. >- >- * src/compiler/Intermediate.cpp: >- (TIntermediate::promoteConstantUnion): >- Undid erroneous static_cast change. >- * src/compiler/intermediate.h: >- (TIntermConstantUnion::getIConst): >- (TIntermConstantUnion::getFConst): >- (TIntermConstantUnion::getBConst): >- Made getters use size_t instead of int. >- >-2013-07-29 Carlos Garcia Campos <cgarcia@igalia.com> >- >- Unreviewed. Fix make distcheck. >- >- * GNUmakefile.am: Add missing header files to compilation. >- >-2013-07-29 Alex Christensen <achristensen@apple.com> >- >- Separated translator into preprocessor, translator_common, >- translator_hlsl (for libGLESv2), and translator_glsl >- (for ANGLEWebKitBridge). >- https://bugs.webkit.org/show_bug.cgi?id=119221 >- >- Reviewed by Brent Fulgham. >- >- * ANGLE.vcxproj/ANGLEGenerated.vcxproj: >- Removed unused preprocessor definitions. >- * ANGLE.vcxproj/libEGL.vcxproj: >- * ANGLE.vcxproj/libGLESv2.vcxproj: >- Removed dependency on removed translator project. >- * ANGLE.vcxproj/libGLESv2Common.props: >- Link to translator_hlsl libraries. >- * ANGLE.vcxproj/preprocessor.vcxproj: Added. >- * ANGLE.vcxproj/preprocessor.vcxproj.filters: Added. >- * ANGLE.vcxproj/translator.vcxproj: Removed. >- * ANGLE.vcxproj/translator.vcxproj.filters: Removed. >- * ANGLE.vcxproj/translator_common.vcxproj: Added. >- * ANGLE.vcxproj/translator_common.vcxproj.filters: Added. >- * ANGLE.vcxproj/translator_glsl.vcxproj: Added. >- * ANGLE.vcxproj/translator_glsl.vcxproj.filters: Added. >- * ANGLE.vcxproj/translator_hlsl.vcxproj: Added. >- * ANGLE.vcxproj/translator_hlsl.vcxproj.filters: Added. >- >-2013-07-26 Alex Christensen <achristensen@apple.com> >- >- Added module definition file for building libEGL. >- https://bugs.webkit.org/show_bug.cgi?id=119162 >- >- Reviewed by Brent Fulgham. >- >- * ANGLE.vcxproj/libEGLCommon.props: Added reference to libEGL.def. >- >-2013-07-25 Alex Christensen <achristensen@apple.com> >- >- Made Windows build system for ANGLE and removed existing broken build system. >- Removed empty src/libGLESv2/shaders directory and old README files. >- https://bugs.webkit.org/show_bug.cgi?id=119103 >- >- Reviewed by Brent Fulgham. >- >- * ANGLE.vcxproj: Added. >- * ANGLE.vcxproj/ANGLEGenerated.vcxproj: Added. >- * ANGLE.vcxproj/ANGLEGenerated.vcxproj.filters: Added. >- * ANGLE.vcxproj/libEGL.vcxproj: Added. >- * ANGLE.vcxproj/libEGL.vcxproj.filters: Added. >- * ANGLE.vcxproj/libEGLCommon.props: Added. >- * ANGLE.vcxproj/libGLESv2.vcxproj: Added. >- * ANGLE.vcxproj/libGLESv2.vcxproj.filters: Added. >- * ANGLE.vcxproj/libGLESv2Common.props: Added. >- * ANGLE.vcxproj/translator.vcxproj: Added. >- * ANGLE.vcxproj/translator.vcxproj.filters: Added. >- * ANGLE.vcxproj/translatorCommon.props: Added. >- * src/ANGLE.sln: Removed. >- * src/compiler/preprocessor/preprocessor.vcxproj: Removed. >- * src/compiler/preprocessor/preprocessor.vcxproj.filters: Removed. >- * src/compiler/translator_common.vcxproj: Removed. >- * src/compiler/translator_common.vcxproj.filters: Removed. >- * src/compiler/translator_hlsl.vcxproj: Removed. >- * src/compiler/translator_hlsl.vcxproj.filters: Removed. >- * src/libEGL/README: Removed. >- * src/libEGL/libEGL.vcxproj: Removed. >- * src/libEGL/libEGL.vcxproj.filters: Removed. >- * src/libGLESv2/README: Removed. >- * src/libGLESv2/libGLESv2.vcxproj: Removed. >- * src/libGLESv2/libGLESv2.vcxproj.filters: Removed. >- * src/libGLESv2/shaders: Removed. >- >-2013-07-24 Alex Christensen <achristensen@apple.com> >- >- Generate derived files in ANGLE at build time rather than when updating from upstream. >- https://bugs.webkit.org/show_bug.cgi?id=118872 >- >- Reviewed by Mark Rowe. >- >- * ANGLE.xcodeproj/project.pbxproj: Made Derived Sources target which calls DerivedSources.make, >- moved generated files into Derived Sources group. >- * DerivedSources.make: Added. >- >-2013-07-24 Zan Dobersek <zdobersek@igalia.com> >- >- Unreviewed. Setting the svn:eol-style=native property on the ANGLE.sln file. >- >- * src/ANGLE.sln: Added property svn:eol-style. >- >-2013-07-24 Gabor Abraham <abrhm@inf.u-szeged.hu> >- >- [Qt] Buildfix after r153064. Add Uniform files to the Target.pri. >- >- Reviewed by Csaba Osztrogonác. >- >- * Target.pri: >- >-2013-07-23 Alex Christensen <achristensen@apple.com> >- >- Updated ANGLE to latest git commit (047373aa3eb408be62be52ade840fa5f11e72337). >- Added missing ANGLE files except unused tests, extensions, samples, build, and .git directories. >- Ran Bison after making some changes to fix compile errors (see below). >- >- https://bugs.webkit.org/show_bug.cgi?id=118550 >- >- Reviewed by Dean Jackson. >- >- * ANGLE.plist: Updated from svn to git. >- * ANGLE.xcodeproj/project.pbxproj: Renamed DetectRecursion to DetectCallDepth. >- * AUTHORS: Added. >- * CONTRIBUTORS: Added. >- * DEPS: Added. >- * GNUmakefile.am: Renamed DetectRecursion to DetectCallDepth and added Uniform.cpp. >- * LICENSE: Added. >- * README.chromium: Added. >- * Target.pri: Renamed DetectRecursion to DetectCallDepth. >- * codereview.settings: Added. >- * include/EGL/eglext.h: >- * include/GLES2/gl2ext.h: >- * include/GLSLANG/ShaderLang.h: >- * src/ANGLE.sln: Added. >- * src/build_angle.gyp: Added. >- * src/build_angle.gypi: Added. >- * src/common/RefCountObject.cpp: >- * src/common/angleutils.h: >- (ArraySize): >- (SafeRelease): >- * src/common/debug.cpp: >- * src/common/debug.h: >- * src/common/system.h: >- * src/common/version.h: >- * src/compiler/64bit-lexer-safety.patch: Added. >- * src/compiler/BaseTypes.h: >- (getQualifierString): >- * src/compiler/CodeGenHLSL.cpp: >- (ConstructCompiler): >- * src/compiler/Common.h: >- * src/compiler/Compiler.cpp: >- (TCompiler::TCompiler): >- (TCompiler::Init): >- (TCompiler::compile): >- (TCompiler::InitBuiltInSymbolTable): >- (TCompiler::detectCallDepth): >- (TCompiler::limitExpressionComplexity): >- (TCompiler::getResources): >- * src/compiler/ConstantUnion.h: >- (ConstantUnion::ConstantUnion): >- * src/compiler/DetectCallDepth.cpp: Added. >- (DetectCallDepth::FunctionNode::FunctionNode): >- (DetectCallDepth::FunctionNode::getName): >- (DetectCallDepth::FunctionNode::addCallee): >- (DetectCallDepth::FunctionNode::detectCallDepth): >- (DetectCallDepth::FunctionNode::reset): >- (DetectCallDepth::DetectCallDepth): >- (DetectCallDepth::~DetectCallDepth): >- (DetectCallDepth::visitAggregate): >- (DetectCallDepth::checkExceedsMaxDepth): >- (DetectCallDepth::resetFunctionNodes): >- (DetectCallDepth::detectCallDepthForFunction): >- (DetectCallDepth::detectCallDepth): >- (DetectCallDepth::findFunctionByName): >- * src/compiler/DetectCallDepth.h: Added. >- (DetectCallDepth::getInfoSink): >- * src/compiler/DetectRecursion.cpp: Removed. >- * src/compiler/DetectRecursion.h: Removed. >- * src/compiler/Diagnostics.cpp: >- (TDiagnostics::writeInfo): >- * src/compiler/ForLoopUnroll.cpp: >- (ForLoopUnroll::evaluateIntConstant): >- * src/compiler/InfoSink.cpp: >- (TInfoSinkBase::prefix): >- (TInfoSinkBase::location): >- (TInfoSinkBase::message): >- * src/compiler/InfoSink.h: >- * src/compiler/Initialize.cpp: >- (InsertBuiltInFunctions): >- (IdentifyBuiltIns): >- (InitExtensionBehavior): >- * src/compiler/Initialize.h: >- * src/compiler/Intermediate.cpp: >- (TIntermediate::addSymbol): >- (TIntermediate::addBinaryMath): >- (TIntermediate::addAssign): >- (TIntermediate::addIndex): >- (TIntermediate::addUnaryMath): >- (TIntermediate::setAggregateOperator): >- (TIntermediate::addConversion): >- (TIntermediate::growAggregate): >- (TIntermediate::makeAggregate): >- (TIntermediate::addSelection): >- (TIntermediate::addComma): >- (TIntermediate::addConstantUnion): >- (TIntermediate::addSwizzle): >- (TIntermediate::addLoop): >- (TIntermediate::addBranch): >- (TIntermUnary::promote): >- (TIntermBinary::promote): >- (CompareStruct): >- (CompareStructure): >- (TIntermConstantUnion::fold): Added implied static_casts to fix compiling errors on Mac. >- (TIntermediate::promoteConstantUnion): >- * src/compiler/OutputGLSL.cpp: >- (TOutputGLSL::visitSymbol): >- * src/compiler/OutputGLSL.h: >- * src/compiler/OutputGLSLBase.cpp: >- (TOutputGLSLBase::writeVariableType): >- (TOutputGLSLBase::writeConstantUnion): >- (TOutputGLSLBase::visitBinary): >- (TOutputGLSLBase::visitAggregate): >- (TOutputGLSLBase::getTypeName): >- (TOutputGLSLBase::structDeclared): >- (TOutputGLSLBase::declareStruct): >- * src/compiler/OutputGLSLBase.h: >- * src/compiler/OutputHLSL.cpp: >- (sh::OutputHLSL::OutputHLSL): >- (sh::OutputHLSL::getUniforms): >- (sh::OutputHLSL::header): >- (sh::OutputHLSL::visitSymbol): >- (sh::OutputHLSL::visitBinary): >- (sh::OutputHLSL::visitAggregate): >- (sh::OutputHLSL::visitSelection): >- (sh::OutputHLSL::visitLoop): >- (sh::OutputHLSL::handleExcessiveLoop): >- (sh::OutputHLSL::argumentString): >- (sh::OutputHLSL::typeString): >- (sh::OutputHLSL::textureString): >- (sh::OutputHLSL::initializer): >- (sh::OutputHLSL::addConstructor): >- (sh::OutputHLSL::writeConstantUnion): >- (sh::OutputHLSL::decorateUniform): >- (sh::OutputHLSL::decorateField): >- (sh::OutputHLSL::registerString): >- (sh::OutputHLSL::samplerRegister): >- (sh::OutputHLSL::uniformRegister): >- (sh::OutputHLSL::declareUniform): >- (sh::OutputHLSL::glVariableType): >- (sh::OutputHLSL::glVariablePrecision): >- * src/compiler/OutputHLSL.h: >- * src/compiler/ParseHelper.cpp: >- (TParseContext::parseVectorFields): >- (TParseContext::parseMatrixFields): >- (TParseContext::error): >- (TParseContext::warning): >- (TParseContext::assignError): >- (TParseContext::unaryOpError): >- (TParseContext::binaryOpError): >- (TParseContext::precisionErrorCheck): >- (TParseContext::lValueErrorCheck): >- (TParseContext::globalErrorCheck): >- (TParseContext::reservedErrorCheck): >- (TParseContext::constructorErrorCheck): >- (TParseContext::voidErrorCheck): >- (TParseContext::boolErrorCheck): >- (TParseContext::samplerErrorCheck): >- (TParseContext::structQualifierErrorCheck): >- (TParseContext::parameterSamplerErrorCheck): >- (TParseContext::containsSampler): >- (TParseContext::arraySizeErrorCheck): >- (TParseContext::arrayQualifierErrorCheck): >- (TParseContext::arrayTypeErrorCheck): >- (TParseContext::arrayErrorCheck): >- (TParseContext::nonInitConstErrorCheck): >- (TParseContext::nonInitErrorCheck): >- (TParseContext::paramErrorCheck): >- (TParseContext::extensionErrorCheck): >- (TParseContext::isExtensionEnabled): >- Replaced auto with std::map<std::string, TBehavior>::const_iterator to fix Qt and EFL compiling errors. >- (TParseContext::findFunction): >- (TParseContext::executeInitializer): >- (TParseContext::addConstructor): >- (TParseContext::constructBuiltIn): >- (TParseContext::constructStruct): >- (TParseContext::addConstVectorNode): >- (TParseContext::addConstMatrixNode): >- (TParseContext::addConstArrayNode): >- (TParseContext::addConstStruct): >- (TParseContext::enterStructDeclaration): >- (TParseContext::structNestingErrorCheck): >- (TParseContext::addIndexExpression): >- * src/compiler/ParseHelper.h: >- (TParseContext::TParseContext): >- (TParseContext::pragma): >- * src/compiler/PoolAlloc.cpp: >- (TPoolAllocator::allocate): >- * src/compiler/ShHandle.h: >- (TShHandleBase::getAsTranslatorHLSL): >- * src/compiler/ShaderLang.cpp: >- (ShInitBuiltInResources): >- (ShGetInfoPointer): >- * src/compiler/SymbolTable.cpp: >- (TType::TType): >- (TType::buildMangledName): >- (TType::getObjectSize): >- (TStructure::containsArrays): >- (TStructure::buildMangledName): >- (TStructure::calculateObjectSize): >- (TStructure::calculateDeepestNesting): >- (TSymbolTableLevel::relateToExtension): >- * src/compiler/SymbolTable.h: >- (TSymbol::relateToExtension): >- (TSymbol::getExtension): >- (TVariable::TVariable): >- (TVariable::setQualifier): >- (TVariable::shareConstPointer): >- (TSymbolTableLevel::insert): >- (TSymbolTable::insertConstInt): >- (TSymbolTable::insertBuiltIn): >- * src/compiler/TranslatorHLSL.cpp: >- (TranslatorHLSL::TranslatorHLSL): >- (TranslatorHLSL::translate): >- * src/compiler/TranslatorHLSL.h: >- (TranslatorHLSL::getAsTranslatorHLSL): >- (TranslatorHLSL::getUniforms): >- * src/compiler/Types.h: Removed enum bit fields to fix gcc compiler errors. >- (TField::TField): >- (TField::type): >- (TField::name): >- (NewPoolTFieldList): >- (TStructure::TStructure): >- (TStructure::name): >- (TStructure::fields): >- (TStructure::mangledName): >- (TStructure::objectSize): >- (TStructure::deepestNesting): >- (TType::TType): >- (TType::elementRegisterCount): >- (TType::totalRegisterCount): >- (TType::clearArrayness): >- (TType::getStruct): >- (TType::setStruct): >- (TType::getMangledName): >- (TType::getDeepestStructNesting): >- (TType::isStructureContainingArrays): >- (TPublicType::setBasic): >- * src/compiler/Uniform.cpp: Added. >- (sh::Uniform::Uniform): >- * src/compiler/Uniform.h: Added. >- * src/compiler/VariableInfo.cpp: >- (getUserDefinedVariableInfo): >- * src/compiler/glslang.l: >- * src/compiler/glslang.y: Moved YYLTYPE definition into %union to work with Bison 2.3. >- * src/compiler/glslang_lex.cpp: >- (yy_get_previous_state): >- (yy_try_NUL_trans): >- (yyget_lloc): >- (yyset_lloc): >- (string_input): >- (check_type): >- (reserved_word): >- (glslang_scan): >- * src/compiler/glslang_tab.cpp: >- (yyerror): >- * src/compiler/glslang_tab.h: >- * src/compiler/intermOut.cpp: >- (TOutputTraverser::visitUnary): >- (TOutputTraverser::visitAggregate): >- (TOutputTraverser::visitConstantUnion): >- * src/compiler/intermediate.h: >- (TIntermNode::TIntermNode): >- (TIntermNode::~TIntermNode): >- (TIntermNode::getLine): >- (TIntermNode::setLine): >- (TIntermNode::getAsLoopNode): >- (TIntermTyped::totalRegisterCount): >- (TIntermTyped::elementRegisterCount): >- (TIntermTyped::getArraySize): >- (TIntermConstantUnion::getIConst): >- (TIntermConstantUnion::getFConst): >- (TIntermConstantUnion::getBConst): >- (TIntermAggregate::TIntermAggregate): >- (TIntermTraverser::TIntermTraverser): >- (TIntermTraverser::getMaxDepth): >- (TIntermTraverser::incrementDepth): >- * src/compiler/localintermediate.h: >- * src/compiler/parseConst.cpp: >- (TConstTraverser::visitSymbol): >- (TConstTraverser::visitBinary): >- (TConstTraverser::visitUnary): >- (TConstTraverser::visitAggregate): >- (TConstTraverser::visitSelection): >- (TConstTraverser::visitConstantUnion): >- (TConstTraverser::visitLoop): >- (TConstTraverser::visitBranch): >- (TIntermediate::parseConstTree): >- * src/compiler/preprocessor/64bit-tokenizer-safety.patch: Added. >- * src/compiler/preprocessor/Tokenizer.cpp: >- (yy_get_previous_state): >- (yy_try_NUL_trans): >- * src/compiler/preprocessor/Tokenizer.l: >- * src/compiler/preprocessor/preprocessor.vcxproj: Added. >- * src/compiler/preprocessor/preprocessor.vcxproj.filters: Added. >- * src/compiler/timing/RestrictVertexShaderTiming.cpp: >- (RestrictVertexShaderTiming::visitSymbol): >- * src/compiler/translator_common.vcxproj: Added. >- * src/compiler/translator_common.vcxproj.filters: Added. >- * src/compiler/translator_hlsl.vcxproj: Added. >- * src/compiler/translator_hlsl.vcxproj.filters: Added. >- * src/libEGL/Config.cpp: Added. >- (egl::Config::Config): >- (egl::Config::getHandle): >- (egl::SortConfig::SortConfig): >- (egl::SortConfig::scanForWantedComponents): >- (egl::SortConfig::wantedComponentsSize): >- (egl::SortConfig::operator()): >- (egl::ConfigSet::ConfigSet): >- (egl::ConfigSet::add): >- (egl::ConfigSet::size): >- (egl::ConfigSet::getConfigs): >- (egl::ConfigSet::get): >- * src/libEGL/Config.h: Added. >- * src/libEGL/Display.cpp: Added. >- (egl::Display::getDisplay): >- (egl::Display::Display): >- (egl::Display::~Display): >- (egl::Display::initialize): >- (egl::Display::terminate): >- (egl::Display::getConfigs): >- (egl::Display::getConfigAttrib): >- (egl::Display::createWindowSurface): >- (egl::Display::createOffscreenSurface): >- (egl::Display::createContext): >- (egl::Display::restoreLostDevice): >- (egl::Display::destroySurface): >- (egl::Display::destroyContext): >- (egl::Display::notifyDeviceLost): >- (egl::Display::recreateSwapChains): >- (egl::Display::isInitialized): >- (egl::Display::isValidConfig): >- (egl::Display::isValidContext): >- (egl::Display::isValidSurface): >- (egl::Display::hasExistingWindowSurface): >- (egl::Display::initExtensionString): >- (egl::Display::getExtensionString): >- (egl::Display::initVendorString): >- (egl::Display::getVendorString): >- * src/libEGL/Display.h: Added. >- (egl::Display::getRenderer): >- * src/libEGL/Surface.cpp: Added. >- (egl::Surface::Surface): >- (egl::Surface::~Surface): >- (egl::Surface::initialize): >- (egl::Surface::release): >- (egl::Surface::resetSwapChain): >- (egl::Surface::resizeSwapChain): >- (egl::Surface::swapRect): >- (egl::Surface::getWindowHandle): >- (egl::SurfaceWindowProc): >- (egl::Surface::subclassWindow): >- (egl::Surface::unsubclassWindow): >- (egl::Surface::checkForOutOfDateSwapChain): >- (egl::Surface::swap): >- (egl::Surface::postSubBuffer): >- (egl::Surface::getWidth): >- (egl::Surface::getHeight): >- (egl::Surface::isPostSubBufferSupported): >- (egl::Surface::getSwapChain): >- (egl::Surface::setSwapInterval): >- (egl::Surface::getTextureFormat): >- (egl::Surface::getTextureTarget): >- (egl::Surface::setBoundTexture): >- (egl::Surface::getBoundTexture): >- (egl::Surface::getFormat): >- * src/libEGL/Surface.h: Added. >- * src/libEGL/libEGL.cpp: Added. >- (validateDisplay): >- (validateConfig): >- (validateContext): >- (validateSurface): >- * src/libEGL/libEGL.def: Added. >- * src/libEGL/libEGL.rc: Added. >- * src/libEGL/libEGL.vcxproj: Added. >- * src/libEGL/libEGL.vcxproj.filters: Added. >- * src/libEGL/main.cpp: Added. >- (DllMain): >- (egl::setCurrentError): >- (egl::getCurrentError): >- (egl::setCurrentAPI): >- (egl::getCurrentAPI): >- (egl::setCurrentDisplay): >- (egl::getCurrentDisplay): >- (egl::setCurrentDrawSurface): >- (egl::getCurrentDrawSurface): >- (egl::setCurrentReadSurface): >- (egl::getCurrentReadSurface): >- (egl::error): >- * src/libEGL/main.h: Added. >- (egl::error): >- (egl::success): >- * src/libEGL/resource.h: Added. >- * src/libGLESv2/BinaryStream.h: Added. >- (gl::BinaryInputStream::BinaryInputStream): >- (gl::BinaryInputStream::read): >- (gl::BinaryInputStream::skip): >- (gl::BinaryInputStream::offset): >- (gl::BinaryInputStream::error): >- (gl::BinaryInputStream::endOfStream): >- (gl::BinaryOutputStream::BinaryOutputStream): >- (gl::BinaryOutputStream::write): >- (gl::BinaryOutputStream::length): >- (gl::BinaryOutputStream::data): >- * src/libGLESv2/Buffer.cpp: Added. >- (gl::Buffer::Buffer): >- (gl::Buffer::~Buffer): >- (gl::Buffer::bufferData): >- (gl::Buffer::bufferSubData): >- (gl::Buffer::getStorage): >- (gl::Buffer::size): >- (gl::Buffer::usage): >- (gl::Buffer::getStaticVertexBuffer): >- (gl::Buffer::getStaticIndexBuffer): >- (gl::Buffer::invalidateStaticData): >- (gl::Buffer::promoteStaticUsage): >- * src/libGLESv2/Buffer.h: Added. >- * src/libGLESv2/Context.cpp: Added. >- (gl::makeStaticString): >- (gl::Context::Context): >- (gl::Context::~Context): >- (gl::Context::makeCurrent): >- (gl::Context::markContextLost): >- (gl::Context::isContextLost): >- (gl::Context::setClearColor): >- (gl::Context::setClearDepth): >- (gl::Context::setClearStencil): >- (gl::Context::setCullFace): >- (gl::Context::isCullFaceEnabled): >- (gl::Context::setCullMode): >- (gl::Context::setFrontFace): >- (gl::Context::setDepthTest): >- (gl::Context::isDepthTestEnabled): >- (gl::Context::setDepthFunc): >- (gl::Context::setDepthRange): >- (gl::Context::setBlend): >- (gl::Context::isBlendEnabled): >- (gl::Context::setBlendFactors): >- (gl::Context::setBlendColor): >- (gl::Context::setBlendEquation): >- (gl::Context::setStencilTest): >- (gl::Context::isStencilTestEnabled): >- (gl::Context::setStencilParams): >- (gl::Context::setStencilBackParams): >- (gl::Context::setStencilWritemask): >- (gl::Context::setStencilBackWritemask): >- (gl::Context::setStencilOperations): >- (gl::Context::setStencilBackOperations): >- (gl::Context::setPolygonOffsetFill): >- (gl::Context::isPolygonOffsetFillEnabled): >- (gl::Context::setPolygonOffsetParams): >- (gl::Context::setSampleAlphaToCoverage): >- (gl::Context::isSampleAlphaToCoverageEnabled): >- (gl::Context::setSampleCoverage): >- (gl::Context::isSampleCoverageEnabled): >- (gl::Context::setSampleCoverageParams): >- (gl::Context::setScissorTest): >- (gl::Context::isScissorTestEnabled): >- (gl::Context::setDither): >- (gl::Context::isDitherEnabled): >- (gl::Context::setLineWidth): >- (gl::Context::setGenerateMipmapHint): >- (gl::Context::setFragmentShaderDerivativeHint): >- (gl::Context::setViewportParams): >- (gl::Context::setScissorParams): >- (gl::Context::setColorMask): >- (gl::Context::setDepthMask): >- (gl::Context::setActiveSampler): >- (gl::Context::getReadFramebufferHandle): >- (gl::Context::getDrawFramebufferHandle): >- (gl::Context::getRenderbufferHandle): >- (gl::Context::getArrayBufferHandle): >- (gl::Context::getActiveQuery): >- (gl::Context::setEnableVertexAttribArray): >- (gl::Context::getVertexAttribState): >- (gl::Context::setVertexAttribState): >- (gl::Context::getVertexAttribPointer): >- (gl::Context::setPackAlignment): >- (gl::Context::getPackAlignment): >- (gl::Context::setUnpackAlignment): >- (gl::Context::getUnpackAlignment): >- (gl::Context::setPackReverseRowOrder): >- (gl::Context::getPackReverseRowOrder): >- (gl::Context::createBuffer): >- (gl::Context::createProgram): >- (gl::Context::createShader): >- (gl::Context::createTexture): >- (gl::Context::createRenderbuffer): >- (gl::Context::createFramebuffer): >- (gl::Context::createFence): >- (gl::Context::createQuery): >- (gl::Context::deleteBuffer): >- (gl::Context::deleteShader): >- (gl::Context::deleteProgram): >- (gl::Context::deleteTexture): >- (gl::Context::deleteRenderbuffer): >- (gl::Context::deleteFramebuffer): >- (gl::Context::deleteFence): >- (gl::Context::deleteQuery): >- (gl::Context::getBuffer): >- (gl::Context::getShader): >- (gl::Context::getProgram): >- (gl::Context::getTexture): >- (gl::Context::getRenderbuffer): >- (gl::Context::getReadFramebuffer): >- (gl::Context::getDrawFramebuffer): >- (gl::Context::bindArrayBuffer): >- (gl::Context::bindElementArrayBuffer): >- (gl::Context::bindTexture2D): >- (gl::Context::bindTextureCubeMap): >- (gl::Context::bindReadFramebuffer): >- (gl::Context::bindDrawFramebuffer): >- (gl::Context::bindRenderbuffer): >- (gl::Context::useProgram): >- (gl::Context::linkProgram): >- (gl::Context::setProgramBinary): >- (gl::Context::beginQuery): >- (gl::Context::endQuery): >- (gl::Context::setFramebufferZero): >- (gl::Context::setRenderbufferStorage): >- (gl::Context::getFramebuffer): >- (gl::Context::getFence): >- (gl::Context::getQuery): >- (gl::Context::getArrayBuffer): >- (gl::Context::getElementArrayBuffer): >- (gl::Context::getCurrentProgramBinary): >- (gl::Context::getTexture2D): >- (gl::Context::getTextureCubeMap): >- (gl::Context::getSamplerTexture): >- (gl::Context::getBooleanv): >- (gl::Context::getFloatv): >- (gl::Context::getIntegerv): >- (gl::Context::getQueryParameterInfo): >- (gl::Context::applyRenderTarget): >- (gl::Context::applyState): >- (gl::Context::applyShaders): >- (gl::Context::applyTextures): >- (gl::Context::readPixels): >- (gl::Context::clear): >- (gl::Context::drawArrays): >- (gl::Context::drawElements): >- (gl::Context::sync): >- (gl::Context::recordInvalidEnum): >- (gl::Context::recordInvalidValue): >- (gl::Context::recordInvalidOperation): >- (gl::Context::recordOutOfMemory): >- (gl::Context::recordInvalidFramebufferOperation): >- (gl::Context::getError): >- (gl::Context::getResetStatus): >- (gl::Context::isResetNotificationEnabled): >- (gl::Context::getMajorShaderModel): >- (gl::Context::getMaximumPointSize): >- (gl::Context::getMaximumCombinedTextureImageUnits): >- (gl::Context::getMaxSupportedSamples): >- (gl::Context::getMaximumRenderTargets): >- (gl::Context::supportsEventQueries): >- (gl::Context::supportsOcclusionQueries): >- (gl::Context::supportsBGRATextures): >- (gl::Context::supportsDXT1Textures): >- (gl::Context::supportsDXT3Textures): >- (gl::Context::supportsDXT5Textures): >- (gl::Context::supportsFloat32Textures): >- (gl::Context::supportsFloat32LinearFilter): >- (gl::Context::supportsFloat32RenderableTextures): >- (gl::Context::supportsFloat16Textures): >- (gl::Context::supportsFloat16LinearFilter): >- (gl::Context::supportsFloat16RenderableTextures): >- (gl::Context::getMaximumRenderbufferDimension): >- (gl::Context::getMaximumTextureDimension): >- (gl::Context::getMaximumCubeTextureDimension): >- (gl::Context::getMaximumTextureLevel): >- (gl::Context::supportsLuminanceTextures): >- (gl::Context::supportsLuminanceAlphaTextures): >- (gl::Context::supportsDepthTextures): >- (gl::Context::supports32bitIndices): >- (gl::Context::supportsNonPower2Texture): >- (gl::Context::supportsInstancing): >- (gl::Context::supportsTextureFilterAnisotropy): >- (gl::Context::getTextureMaxAnisotropy): >- (gl::Context::getCurrentReadFormatType): >- (gl::Context::detachBuffer): >- (gl::Context::detachTexture): >- (gl::Context::detachFramebuffer): >- (gl::Context::detachRenderbuffer): >- (gl::Context::getIncompleteTexture): >- (gl::Context::skipDraw): >- (gl::Context::setVertexAttrib): >- (gl::Context::setVertexAttribDivisor): >- (gl::Context::initExtensionString): >- (gl::Context::getExtensionString): >- (gl::Context::initRendererString): >- (gl::Context::getRendererString): >- (gl::Context::blitFramebuffer): >- * src/libGLESv2/Context.h: Added. >- (gl::VertexAttribute::VertexAttribute): >- (gl::VertexAttribute::typeSize): >- (gl::VertexAttribute::stride): >- * src/libGLESv2/Fence.cpp: Added. >- (gl::Fence::Fence): >- (gl::Fence::~Fence): >- (gl::Fence::isFence): >- (gl::Fence::setFence): >- (gl::Fence::testFence): >- (gl::Fence::finishFence): >- (gl::Fence::getFenceiv): >- * src/libGLESv2/Fence.h: Added. >- * src/libGLESv2/Float16ToFloat32.cpp: Added. >- (gl::float16ToFloat32): >- * src/libGLESv2/Float16ToFloat32.py: Added. >- (convertMantissa): >- (convertExponent): >- (convertOffset): >- * src/libGLESv2/Framebuffer.cpp: Added. >- (gl::Framebuffer::Framebuffer): >- (gl::Framebuffer::~Framebuffer): >- (gl::Framebuffer::lookupRenderbuffer): >- (gl::Framebuffer::setColorbuffer): >- (gl::Framebuffer::setDepthbuffer): >- (gl::Framebuffer::setStencilbuffer): >- (gl::Framebuffer::detachTexture): >- (gl::Framebuffer::detachRenderbuffer): >- (gl::Framebuffer::getRenderTargetSerial): >- (gl::Framebuffer::getDepthbufferSerial): >- (gl::Framebuffer::getStencilbufferSerial): >- (gl::Framebuffer::getColorbuffer): >- (gl::Framebuffer::getDepthbuffer): >- (gl::Framebuffer::getStencilbuffer): >- (gl::Framebuffer::getDepthOrStencilbuffer): >- (gl::Framebuffer::getReadColorbuffer): >- (gl::Framebuffer::getReadColorbufferType): >- (gl::Framebuffer::getFirstColorbuffer): >- (gl::Framebuffer::getColorbufferType): >- (gl::Framebuffer::getDepthbufferType): >- (gl::Framebuffer::getStencilbufferType): >- (gl::Framebuffer::getColorbufferHandle): >- (gl::Framebuffer::getDepthbufferHandle): >- (gl::Framebuffer::getStencilbufferHandle): >- (gl::Framebuffer::getDrawBufferState): >- (gl::Framebuffer::setDrawBufferState): >- (gl::Framebuffer::isEnabledColorAttachment): >- (gl::Framebuffer::hasEnabledColorAttachment): >- (gl::Framebuffer::hasStencil): >- (gl::Framebuffer::usingExtendedDrawBuffers): >- (gl::Framebuffer::completeness): >- (gl::DefaultFramebuffer::DefaultFramebuffer): >- (gl::Framebuffer::getSamples): >- (gl::DefaultFramebuffer::completeness): >- * src/libGLESv2/Framebuffer.h: Added. >- * src/libGLESv2/HandleAllocator.cpp: Added. >- (gl::HandleAllocator::HandleAllocator): >- (gl::HandleAllocator::~HandleAllocator): >- (gl::HandleAllocator::setBaseHandle): >- (gl::HandleAllocator::allocate): >- (gl::HandleAllocator::release): >- * src/libGLESv2/HandleAllocator.h: Added. >- * src/libGLESv2/Program.cpp: Added. >- (gl::AttributeBindings::AttributeBindings): >- (gl::AttributeBindings::~AttributeBindings): >- (gl::InfoLog::InfoLog): >- (gl::InfoLog::~InfoLog): >- (gl::InfoLog::getLength): >- (gl::InfoLog::getLog): >- (gl::InfoLog::appendSanitized): >- (gl::InfoLog::append): >- (gl::InfoLog::reset): >- (gl::Program::Program): >- (gl::Program::~Program): >- (gl::Program::attachShader): >- (gl::Program::detachShader): >- (gl::Program::getAttachedShadersCount): >- (gl::AttributeBindings::bindAttributeLocation): >- (gl::Program::bindAttributeLocation): >- (gl::Program::link): >- (gl::AttributeBindings::getAttributeBinding): >- (gl::Program::unlink): >- (gl::Program::isLinked): >- (gl::Program::getProgramBinary): >- (gl::Program::setProgramBinary): >- (gl::Program::release): >- (gl::Program::addRef): >- (gl::Program::getRefCount): >- (gl::Program::getProgramBinaryLength): >- (gl::Program::getInfoLogLength): >- (gl::Program::getInfoLog): >- (gl::Program::getAttachedShaders): >- (gl::Program::getActiveAttribute): >- (gl::Program::getActiveAttributeCount): >- (gl::Program::getActiveAttributeMaxLength): >- (gl::Program::getActiveUniform): >- (gl::Program::getActiveUniformCount): >- (gl::Program::getActiveUniformMaxLength): >- (gl::Program::flagForDeletion): >- (gl::Program::isFlaggedForDeletion): >- (gl::Program::validate): >- (gl::Program::isValidated): >- * src/libGLESv2/Program.h: Added. >- * src/libGLESv2/ProgramBinary.cpp: Added. >- (gl::str): >- (gl::UniformLocation::UniformLocation): >- (gl::ProgramBinary::ProgramBinary): >- (gl::ProgramBinary::~ProgramBinary): >- (gl::ProgramBinary::getSerial): >- (gl::ProgramBinary::issueSerial): >- (gl::ProgramBinary::getPixelExecutable): >- (gl::ProgramBinary::getVertexExecutable): >- (gl::ProgramBinary::getGeometryExecutable): >- (gl::ProgramBinary::getAttributeLocation): >- (gl::ProgramBinary::getSemanticIndex): >- (gl::ProgramBinary::getUsedSamplerRange): >- (gl::ProgramBinary::usesPointSize): >- (gl::ProgramBinary::usesPointSpriteEmulation): >- (gl::ProgramBinary::usesGeometryShader): >- (gl::ProgramBinary::getSamplerMapping): >- (gl::ProgramBinary::getSamplerTextureType): >- (gl::ProgramBinary::getUniformLocation): >- (gl::ProgramBinary::setUniform1fv): >- (gl::ProgramBinary::setUniform2fv): >- (gl::ProgramBinary::setUniform3fv): >- (gl::ProgramBinary::setUniform4fv): >- (gl::transposeMatrix): >- (gl::ProgramBinary::setUniformMatrix2fv): >- (gl::ProgramBinary::setUniformMatrix3fv): >- (gl::ProgramBinary::setUniformMatrix4fv): >- (gl::ProgramBinary::setUniform1iv): >- (gl::ProgramBinary::setUniform2iv): >- (gl::ProgramBinary::setUniform3iv): >- (gl::ProgramBinary::setUniform4iv): >- (gl::ProgramBinary::getUniformfv): >- (gl::ProgramBinary::getUniformiv): >- (gl::ProgramBinary::dirtyAllUniforms): >- (gl::ProgramBinary::applyUniforms): >- (gl::ProgramBinary::packVaryings): >- (gl::ProgramBinary::linkVaryings): >- (gl::ProgramBinary::load): >- (gl::ProgramBinary::save): >- (gl::ProgramBinary::getLength): >- (gl::ProgramBinary::link): >- (gl::ProgramBinary::linkAttributes): >- (gl::ProgramBinary::linkUniforms): >- (gl::ProgramBinary::defineUniform): >- (gl::ProgramBinary::generateGeometryShaderHLSL): >- (gl::ProgramBinary::generatePointSpriteHLSL): >- (gl::ProgramBinary::decorateAttribute): >- (gl::ProgramBinary::isValidated): >- (gl::ProgramBinary::getActiveAttribute): >- (gl::ProgramBinary::getActiveAttributeCount): >- (gl::ProgramBinary::getActiveAttributeMaxLength): >- (gl::ProgramBinary::getActiveUniform): >- (gl::ProgramBinary::getActiveUniformCount): >- (gl::ProgramBinary::getActiveUniformMaxLength): >- (gl::ProgramBinary::validate): >- (gl::ProgramBinary::validateSamplers): >- (gl::ProgramBinary::Sampler::Sampler): >- (gl::AttributeSorter::AttributeSorter): >- (gl::AttributeSorter::operator()): >- (gl::ProgramBinary::sortAttributesByLayout): >- * src/libGLESv2/ProgramBinary.h: Added. >- (gl::UniformLocation::UniformLocation): >- * src/libGLESv2/Query.cpp: Added. >- (gl::Query::Query): >- (gl::Query::~Query): >- (gl::Query::begin): >- (gl::Query::end): >- (gl::Query::getResult): >- (gl::Query::isResultAvailable): >- (gl::Query::getType): >- * src/libGLESv2/Query.h: Added. >- * src/libGLESv2/Renderbuffer.cpp: Added. >- (gl::RenderbufferInterface::RenderbufferInterface): >- (gl::RenderbufferInterface::addProxyRef): >- (gl::RenderbufferInterface::releaseProxy): >- (gl::RenderbufferInterface::getRedSize): >- (gl::RenderbufferInterface::getGreenSize): >- (gl::RenderbufferInterface::getBlueSize): >- (gl::RenderbufferInterface::getAlphaSize): >- (gl::RenderbufferInterface::getDepthSize): >- (gl::RenderbufferInterface::getStencilSize): >- (gl::RenderbufferTexture2D::RenderbufferTexture2D): >- (gl::RenderbufferTexture2D::~RenderbufferTexture2D): >- (gl::RenderbufferTexture2D::addProxyRef): >- (gl::RenderbufferTexture2D::releaseProxy): >- (gl::RenderbufferTexture2D::getRenderTarget): >- (gl::RenderbufferTexture2D::getDepthStencil): >- (gl::RenderbufferTexture2D::getWidth): >- (gl::RenderbufferTexture2D::getHeight): >- (gl::RenderbufferTexture2D::getInternalFormat): >- (gl::RenderbufferTexture2D::getActualFormat): >- (gl::RenderbufferTexture2D::getSamples): >- (gl::RenderbufferTexture2D::getSerial): >- (gl::RenderbufferTextureCubeMap::RenderbufferTextureCubeMap): >- (gl::RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap): >- (gl::RenderbufferTextureCubeMap::addProxyRef): >- (gl::RenderbufferTextureCubeMap::releaseProxy): >- (gl::RenderbufferTextureCubeMap::getRenderTarget): >- (gl::RenderbufferTextureCubeMap::getDepthStencil): >- (gl::RenderbufferTextureCubeMap::getWidth): >- (gl::RenderbufferTextureCubeMap::getHeight): >- (gl::RenderbufferTextureCubeMap::getInternalFormat): >- (gl::RenderbufferTextureCubeMap::getActualFormat): >- (gl::RenderbufferTextureCubeMap::getSamples): >- (gl::RenderbufferTextureCubeMap::getSerial): >- (gl::Renderbuffer::Renderbuffer): >- (gl::Renderbuffer::~Renderbuffer): >- (gl::Renderbuffer::addRef): >- (gl::Renderbuffer::release): >- (gl::Renderbuffer::getRenderTarget): >- (gl::Renderbuffer::getDepthStencil): >- (gl::Renderbuffer::getWidth): >- (gl::Renderbuffer::getHeight): >- (gl::Renderbuffer::getInternalFormat): >- (gl::Renderbuffer::getActualFormat): >- (gl::Renderbuffer::getRedSize): >- (gl::Renderbuffer::getGreenSize): >- (gl::Renderbuffer::getBlueSize): >- (gl::Renderbuffer::getAlphaSize): >- (gl::Renderbuffer::getDepthSize): >- (gl::Renderbuffer::getStencilSize): >- (gl::Renderbuffer::getSamples): >- (gl::Renderbuffer::getSerial): >- (gl::Renderbuffer::setStorage): >- (gl::RenderbufferStorage::RenderbufferStorage): >- (gl::RenderbufferStorage::~RenderbufferStorage): >- (gl::RenderbufferStorage::getRenderTarget): >- (gl::RenderbufferStorage::getDepthStencil): >- (gl::RenderbufferStorage::getWidth): >- (gl::RenderbufferStorage::getHeight): >- (gl::RenderbufferStorage::getInternalFormat): >- (gl::RenderbufferStorage::getActualFormat): >- (gl::RenderbufferStorage::getSamples): >- (gl::RenderbufferStorage::getSerial): >- (gl::RenderbufferStorage::issueSerial): >- (gl::RenderbufferStorage::issueCubeSerials): >- (gl::Colorbuffer::Colorbuffer): >- (gl::Colorbuffer::~Colorbuffer): >- (gl::Colorbuffer::getRenderTarget): >- (gl::DepthStencilbuffer::DepthStencilbuffer): >- (gl::DepthStencilbuffer::~DepthStencilbuffer): >- (gl::DepthStencilbuffer::getDepthStencil): >- (gl::Depthbuffer::Depthbuffer): >- (gl::Depthbuffer::~Depthbuffer): >- (gl::Stencilbuffer::Stencilbuffer): >- (gl::Stencilbuffer::~Stencilbuffer): >- * src/libGLESv2/Renderbuffer.h: Added. >- (gl::RenderbufferInterface::~RenderbufferInterface): >- * src/libGLESv2/ResourceManager.cpp: Added. >- (gl::ResourceManager::ResourceManager): >- (gl::ResourceManager::~ResourceManager): >- (gl::ResourceManager::addRef): >- (gl::ResourceManager::release): >- (gl::ResourceManager::createBuffer): >- (gl::ResourceManager::createShader): >- (gl::ResourceManager::createProgram): >- (gl::ResourceManager::createTexture): >- (gl::ResourceManager::createRenderbuffer): >- (gl::ResourceManager::deleteBuffer): >- (gl::ResourceManager::deleteShader): >- (gl::ResourceManager::deleteProgram): >- (gl::ResourceManager::deleteTexture): >- (gl::ResourceManager::deleteRenderbuffer): >- (gl::ResourceManager::getBuffer): >- (gl::ResourceManager::getShader): >- (gl::ResourceManager::getTexture): >- (gl::ResourceManager::getProgram): >- (gl::ResourceManager::getRenderbuffer): >- (gl::ResourceManager::setRenderbuffer): >- (gl::ResourceManager::checkBufferAllocation): >- (gl::ResourceManager::checkTextureAllocation): >- (gl::ResourceManager::checkRenderbufferAllocation): >- * src/libGLESv2/ResourceManager.h: Added. >- * src/libGLESv2/Shader.cpp: Added. >- (gl::Shader::Shader): >- (gl::Shader::~Shader): >- (gl::Shader::getHandle): >- (gl::Shader::setSource): >- (gl::Shader::getInfoLogLength): >- (gl::Shader::getInfoLog): >- (gl::Shader::getSourceLength): >- (gl::Shader::getTranslatedSourceLength): >- (gl::Shader::getSourceImpl): >- (gl::Shader::getSource): >- (gl::Shader::getTranslatedSource): >- (gl::Shader::getUniforms): >- (gl::Shader::isCompiled): >- (gl::Shader::getHLSL): >- (gl::Shader::addRef): >- (gl::Shader::release): >- (gl::Shader::getRefCount): >- (gl::Shader::isFlaggedForDeletion): >- (gl::Shader::flagForDeletion): >- (gl::Shader::initializeCompiler): >- (gl::Shader::releaseCompiler): >- (gl::Shader::parseVaryings): >- (gl::Shader::resetVaryingsRegisterAssignment): >- (gl::Shader::uncompile): >- (gl::Shader::compileToHLSL): >- (gl::Shader::parseType): >- (gl::Shader::compareVarying): >- (gl::VertexShader::VertexShader): >- (gl::VertexShader::~VertexShader): >- (gl::VertexShader::getType): >- (gl::VertexShader::uncompile): >- (gl::VertexShader::compile): >- (gl::VertexShader::getSemanticIndex): >- (gl::VertexShader::parseAttributes): >- (gl::FragmentShader::FragmentShader): >- (gl::FragmentShader::~FragmentShader): >- (gl::FragmentShader::getType): >- (gl::FragmentShader::compile): >- * src/libGLESv2/Shader.h: Added. >- (gl::Varying::Varying): >- (gl::Attribute::Attribute): >- * src/libGLESv2/Texture.cpp: Added. >- (gl::Texture::Texture): >- (gl::Texture::~Texture): >- (gl::Texture::setMinFilter): >- (gl::Texture::setMagFilter): >- (gl::Texture::setWrapS): >- (gl::Texture::setWrapT): >- (gl::Texture::setMaxAnisotropy): >- (gl::Texture::setUsage): >- (gl::Texture::getMinFilter): >- (gl::Texture::getMagFilter): >- (gl::Texture::getWrapS): >- (gl::Texture::getWrapT): >- (gl::Texture::getMaxAnisotropy): >- (gl::Texture::getLodOffset): >- (gl::Texture::getSamplerState): >- (gl::Texture::getUsage): >- (gl::Texture::isMipmapFiltered): >- (gl::Texture::setImage): >- (gl::Texture::setCompressedImage): >- (gl::Texture::subImage): >- (gl::Texture::subImageCompressed): >- (gl::Texture::getNativeTexture): >- (gl::Texture::hasDirtyImages): >- (gl::Texture::resetDirty): >- (gl::Texture::getTextureSerial): >- (gl::Texture::getRenderTargetSerial): >- (gl::Texture::isImmutable): >- (gl::Texture::creationLevels): >- (gl::Texture2D::Texture2D): >- (gl::Texture2D::~Texture2D): >- (gl::Texture2D::addProxyRef): >- (gl::Texture2D::releaseProxy): >- (gl::Texture2D::getTarget): >- (gl::Texture2D::getWidth): >- (gl::Texture2D::getHeight): >- (gl::Texture2D::getInternalFormat): >- (gl::Texture2D::getActualFormat): >- (gl::Texture2D::redefineImage): >- (gl::Texture2D::setImage): >- (gl::Texture2D::bindTexImage): >- (gl::Texture2D::releaseTexImage): >- (gl::Texture2D::setCompressedImage): >- (gl::Texture2D::commitRect): >- (gl::Texture2D::subImage): >- (gl::Texture2D::subImageCompressed): >- (gl::Texture2D::copyImage): >- (gl::Texture2D::copySubImage): >- (gl::Texture2D::storage): >- (gl::Texture2D::isSamplerComplete): >- (gl::Texture2D::isMipmapComplete): >- (gl::Texture2D::isCompressed): >- (gl::Texture2D::isDepth): >- (gl::Texture2D::createTexture): >- (gl::Texture2D::updateTexture): >- (gl::Texture2D::convertToRenderTarget): >- (gl::Texture2D::generateMipmaps): >- (gl::Texture2D::getRenderbuffer): >- (gl::Texture2D::getRenderTarget): >- (gl::Texture2D::getDepthStencil): >- (gl::Texture2D::levelCount): >- (gl::Texture2D::getStorage): >- (gl::TextureCubeMap::TextureCubeMap): >- (gl::TextureCubeMap::~TextureCubeMap): >- (gl::TextureCubeMap::addProxyRef): >- (gl::TextureCubeMap::releaseProxy): >- (gl::TextureCubeMap::getTarget): >- (gl::TextureCubeMap::getWidth): >- (gl::TextureCubeMap::getHeight): >- (gl::TextureCubeMap::getInternalFormat): >- (gl::TextureCubeMap::getActualFormat): >- (gl::TextureCubeMap::setImagePosX): >- (gl::TextureCubeMap::setImageNegX): >- (gl::TextureCubeMap::setImagePosY): >- (gl::TextureCubeMap::setImageNegY): >- (gl::TextureCubeMap::setImagePosZ): >- (gl::TextureCubeMap::setImageNegZ): >- (gl::TextureCubeMap::setCompressedImage): >- (gl::TextureCubeMap::commitRect): >- (gl::TextureCubeMap::subImage): >- (gl::TextureCubeMap::subImageCompressed): >- (gl::TextureCubeMap::isSamplerComplete): >- (gl::TextureCubeMap::isCubeComplete): >- (gl::TextureCubeMap::isMipmapCubeComplete): >- (gl::TextureCubeMap::isCompressed): >- (gl::TextureCubeMap::createTexture): >- (gl::TextureCubeMap::updateTexture): >- (gl::TextureCubeMap::convertToRenderTarget): >- (gl::TextureCubeMap::setImage): >- (gl::TextureCubeMap::faceIndex): >- (gl::TextureCubeMap::redefineImage): >- (gl::TextureCubeMap::copyImage): >- (gl::TextureCubeMap::copySubImage): >- (gl::TextureCubeMap::storage): >- (gl::TextureCubeMap::generateMipmaps): >- (gl::TextureCubeMap::getRenderbuffer): >- (gl::TextureCubeMap::getRenderTarget): >- (gl::TextureCubeMap::levelCount): >- (gl::TextureCubeMap::getStorage): >- * src/libGLESv2/Texture.h: Added. >- * src/libGLESv2/Uniform.cpp: Added. >- (gl::Uniform::Uniform): >- (gl::Uniform::~Uniform): >- (gl::Uniform::isArray): >- (gl::Uniform::elementCount): >- * src/libGLESv2/Uniform.h: Added. >- * src/libGLESv2/angletypes.h: Added. >- * src/libGLESv2/constants.h: Added. >- * src/libGLESv2/libGLESv2.cpp: Added. >- (validImageSize): >- (checkTextureFormatType): >- (validateSubImageParams2D): >- (validateSubImageParamsCube): >- (validReadFormatType): >- * src/libGLESv2/libGLESv2.def: Added. >- * src/libGLESv2/libGLESv2.rc: Added. >- * src/libGLESv2/libGLESv2.vcxproj: Added. >- * src/libGLESv2/libGLESv2.vcxproj.filters: Added. >- * src/libGLESv2/main.cpp: Added. >- (DllMain): >- (gl::makeCurrent): >- (gl::getContext): >- (gl::getNonLostContext): >- (gl::getDisplay): >- (gl::error): >- * src/libGLESv2/main.h: Added. >- (gl::error): >- * src/libGLESv2/mathutil.h: Added. >- (gl::Vector4::Vector4): >- (gl::isPow2): >- (gl::log2): >- (gl::ceilPow2): >- (gl::clamp): >- (gl::clamp01): >- (gl::unorm): >- (gl::supportsSSE2): >- (gl::float32ToFloat16): >- (rx::Range::Range): >- * src/libGLESv2/precompiled.cpp: Added. >- * src/libGLESv2/precompiled.h: Added. >- * src/libGLESv2/renderer: Added. >- * src/libGLESv2/renderer/Blit.cpp: Added. >- (rx::Blit::Blit): >- (rx::Blit::~Blit): >- (rx::Blit::initGeometry): >- (rx::Blit::setShader): >- (rx::Blit::setVertexShader): >- (rx::Blit::setPixelShader): >- (rx::Blit::getSurfaceRect): >- (rx::Blit::boxFilter): >- (rx::Blit::copy): >- (rx::Blit::formatConvert): >- (rx::Blit::setFormatConvertShaders): >- (rx::Blit::copySurfaceToTexture): >- (rx::Blit::setViewport): >- (rx::Blit::setCommonBlitState): >- (rx::Blit::render): >- (rx::Blit::saveState): >- (rx::Blit::restoreState): >- * src/libGLESv2/renderer/Blit.h: Added. >- * src/libGLESv2/renderer/BufferStorage.cpp: Added. >- (rx::BufferStorage::BufferStorage): >- (rx::BufferStorage::~BufferStorage): >- (rx::BufferStorage::getSerial): >- (rx::BufferStorage::updateSerial): >- (rx::BufferStorage::markBufferUsage): >- * src/libGLESv2/renderer/BufferStorage.h: Added. >- * src/libGLESv2/renderer/BufferStorage11.cpp: Added. >- (rx::BufferStorage11::BufferStorage11): >- (rx::BufferStorage11::~BufferStorage11): >- (rx::BufferStorage11::makeBufferStorage11): >- (rx::BufferStorage11::getData): >- (rx::BufferStorage11::setData): >- (rx::BufferStorage11::clear): >- (rx::BufferStorage11::getSize): >- (rx::BufferStorage11::supportsDirectBinding): >- (rx::BufferStorage11::markBufferUsage): >- (rx::BufferStorage11::getBuffer): >- * src/libGLESv2/renderer/BufferStorage11.h: Added. >- * src/libGLESv2/renderer/BufferStorage9.cpp: Added. >- (rx::BufferStorage9::BufferStorage9): >- (rx::BufferStorage9::~BufferStorage9): >- (rx::BufferStorage9::makeBufferStorage9): >- (rx::BufferStorage9::getData): >- (rx::BufferStorage9::setData): >- (rx::BufferStorage9::clear): >- (rx::BufferStorage9::getSize): >- (rx::BufferStorage9::supportsDirectBinding): >- * src/libGLESv2/renderer/BufferStorage9.h: Added. >- * src/libGLESv2/renderer/Fence11.cpp: Added. >- (rx::Fence11::Fence11): >- (rx::Fence11::~Fence11): >- (rx::Fence11::isFence): >- (rx::Fence11::setFence): >- (rx::Fence11::testFence): >- (rx::Fence11::finishFence): >- (rx::Fence11::getFenceiv): >- * src/libGLESv2/renderer/Fence11.h: Added. >- * src/libGLESv2/renderer/Fence9.cpp: Added. >- (rx::Fence9::Fence9): >- (rx::Fence9::~Fence9): >- (rx::Fence9::isFence): >- (rx::Fence9::setFence): >- (rx::Fence9::testFence): >- (rx::Fence9::finishFence): >- (rx::Fence9::getFenceiv): >- * src/libGLESv2/renderer/Fence9.h: Added. >- * src/libGLESv2/renderer/FenceImpl.h: Added. >- (rx::FenceImpl::FenceImpl): >- (rx::FenceImpl::~FenceImpl): >- (rx::FenceImpl::setStatus): >- (rx::FenceImpl::getStatus): >- (rx::FenceImpl::setCondition): >- (rx::FenceImpl::getCondition): >- * src/libGLESv2/renderer/Image.cpp: Added. >- (rx::Image::Image): >- (rx::Image::loadAlphaDataToBGRA): >- (rx::Image::loadAlphaDataToNative): >- (rx::Image::loadAlphaFloatDataToRGBA): >- (rx::Image::loadAlphaHalfFloatDataToRGBA): >- (rx::Image::loadLuminanceDataToNativeOrBGRA): >- (rx::Image::loadLuminanceFloatDataToRGBA): >- (rx::Image::loadLuminanceFloatDataToRGB): >- (rx::Image::loadLuminanceHalfFloatDataToRGBA): >- (rx::Image::loadLuminanceAlphaDataToNativeOrBGRA): >- (rx::Image::loadLuminanceAlphaFloatDataToRGBA): >- (rx::Image::loadLuminanceAlphaHalfFloatDataToRGBA): >- (rx::Image::loadRGBUByteDataToBGRX): >- (rx::Image::loadRGBUByteDataToRGBA): >- (rx::Image::loadRGB565DataToBGRA): >- (rx::Image::loadRGB565DataToRGBA): >- (rx::Image::loadRGBFloatDataToRGBA): >- (rx::Image::loadRGBFloatDataToNative): >- (rx::Image::loadRGBHalfFloatDataToRGBA): >- (rx::Image::loadRGBAUByteDataToBGRA): >- (rx::Image::loadRGBAUByteDataToNative): >- (rx::Image::loadRGBA4444DataToBGRA): >- (rx::Image::loadRGBA4444DataToRGBA): >- (rx::Image::loadRGBA5551DataToBGRA): >- (rx::Image::loadRGBA5551DataToRGBA): >- (rx::Image::loadRGBAFloatDataToRGBA): >- (rx::Image::loadRGBAHalfFloatDataToRGBA): >- (rx::Image::loadBGRADataToBGRA): >- * src/libGLESv2/renderer/Image.h: Added. >- (rx::Image::~Image): >- (rx::Image::getWidth): >- (rx::Image::getHeight): >- (rx::Image::getInternalFormat): >- (rx::Image::getActualFormat): >- (rx::Image::markDirty): >- (rx::Image::markClean): >- (rx::Image::setManagedSurface): >- * src/libGLESv2/renderer/Image11.cpp: Added. >- (rx::Image11::Image11): >- (rx::Image11::~Image11): >- (rx::Image11::makeImage11): >- (rx::Image11::generateMipmap): >- (rx::Image11::isDirty): >- (rx::Image11::updateSurface): >- (rx::Image11::redefine): >- (rx::Image11::isRenderableFormat): >- (rx::Image11::getDXGIFormat): >- (rx::Image11::loadData): >- (rx::Image11::loadCompressedData): >- (rx::Image11::copy): >- (rx::Image11::getStagingTexture): >- (rx::Image11::getStagingSubresource): >- (rx::Image11::createStagingTexture): >- (rx::Image11::map): >- (rx::Image11::unmap): >- * src/libGLESv2/renderer/Image11.h: Added. >- * src/libGLESv2/renderer/Image9.cpp: Added. >- (rx::Image9::Image9): >- (rx::Image9::~Image9): >- (rx::Image9::generateMip): >- (rx::Image9::makeImage9): >- (rx::Image9::generateMipmap): >- (rx::Image9::copyLockableSurfaces): >- (rx::Image9::redefine): >- (rx::Image9::createSurface): >- (rx::Image9::lock): >- (rx::Image9::unlock): >- (rx::Image9::isRenderableFormat): >- (rx::Image9::getD3DFormat): >- (rx::Image9::getSurface): >- (rx::Image9::setManagedSurface): >- (rx::Image9::updateSurface): >- (rx::Image9::loadData): >- (rx::Image9::loadCompressedData): >- (rx::Image9::copy): >- * src/libGLESv2/renderer/Image9.h: Added. >- (rx::Image9::isDirty): >- * src/libGLESv2/renderer/ImageSSE2.cpp: Added. >- (rx::Image::loadRGBAUByteDataToBGRASSE2): >- (rx::Image::loadAlphaDataToBGRASSE2): >- * src/libGLESv2/renderer/IndexBuffer.cpp: Added. >- (rx::IndexBuffer::IndexBuffer): >- (rx::IndexBuffer::~IndexBuffer): >- (rx::IndexBuffer::getSerial): >- (rx::IndexBuffer::updateSerial): >- (rx::IndexBufferInterface::IndexBufferInterface): >- (rx::IndexBufferInterface::~IndexBufferInterface): >- (rx::IndexBufferInterface::getIndexType): >- (rx::IndexBufferInterface::getBufferSize): >- (rx::IndexBufferInterface::getSerial): >- (rx::IndexBufferInterface::mapBuffer): >- (rx::IndexBufferInterface::unmapBuffer): >- (rx::IndexBufferInterface::getIndexBuffer): >- (rx::IndexBufferInterface::getWritePosition): >- (rx::IndexBufferInterface::setWritePosition): >- (rx::IndexBufferInterface::discard): >- (rx::IndexBufferInterface::setBufferSize): >- (rx::StreamingIndexBufferInterface::StreamingIndexBufferInterface): >- (rx::StreamingIndexBufferInterface::~StreamingIndexBufferInterface): >- (rx::StreamingIndexBufferInterface::reserveBufferSpace): >- (rx::StaticIndexBufferInterface::StaticIndexBufferInterface): >- (rx::StaticIndexBufferInterface::~StaticIndexBufferInterface): >- (rx::StaticIndexBufferInterface::reserveBufferSpace): >- (rx::StaticIndexBufferInterface::lookupRange): >- (rx::StaticIndexBufferInterface::addRange): >- * src/libGLESv2/renderer/IndexBuffer.h: Added. >- (rx::StaticIndexBufferInterface::IndexRange::operator<): >- * src/libGLESv2/renderer/IndexBuffer11.cpp: Added. >- (rx::IndexBuffer11::IndexBuffer11): >- (rx::IndexBuffer11::~IndexBuffer11): >- (rx::IndexBuffer11::initialize): >- (rx::IndexBuffer11::makeIndexBuffer11): >- (rx::IndexBuffer11::mapBuffer): >- (rx::IndexBuffer11::unmapBuffer): >- (rx::IndexBuffer11::getIndexType): >- (rx::IndexBuffer11::getBufferSize): >- (rx::IndexBuffer11::setSize): >- (rx::IndexBuffer11::discard): >- (rx::IndexBuffer11::getIndexFormat): >- (rx::IndexBuffer11::getBuffer): >- * src/libGLESv2/renderer/IndexBuffer11.h: Added. >- * src/libGLESv2/renderer/IndexBuffer9.cpp: Added. >- (rx::IndexBuffer9::IndexBuffer9): >- (rx::IndexBuffer9::~IndexBuffer9): >- (rx::IndexBuffer9::initialize): >- (rx::IndexBuffer9::makeIndexBuffer9): >- (rx::IndexBuffer9::mapBuffer): >- (rx::IndexBuffer9::unmapBuffer): >- (rx::IndexBuffer9::getIndexType): >- (rx::IndexBuffer9::getBufferSize): >- (rx::IndexBuffer9::setSize): >- (rx::IndexBuffer9::discard): >- (rx::IndexBuffer9::getIndexFormat): >- (rx::IndexBuffer9::getBuffer): >- * src/libGLESv2/renderer/IndexBuffer9.h: Added. >- * src/libGLESv2/renderer/IndexDataManager.cpp: Added. >- (rx::IndexDataManager::IndexDataManager): >- (rx::IndexDataManager::~IndexDataManager): >- (rx::indexTypeSize): >- (rx::convertIndices): >- (rx::computeRange): >- (rx::IndexDataManager::prepareIndexData): >- (rx::IndexDataManager::getCountingIndices): >- * src/libGLESv2/renderer/IndexDataManager.h: Added. >- * src/libGLESv2/renderer/InputLayoutCache.cpp: Added. >- (rx::InputLayoutCache::InputLayoutCache): >- (rx::InputLayoutCache::~InputLayoutCache): >- (rx::InputLayoutCache::initialize): >- (rx::InputLayoutCache::clear): >- (rx::InputLayoutCache::applyVertexBuffers): >- (rx::InputLayoutCache::hashInputLayout): >- (rx::InputLayoutCache::compareInputLayouts): >- * src/libGLESv2/renderer/InputLayoutCache.h: Added. >- * src/libGLESv2/renderer/Query11.cpp: Added. >- (rx::Query11::Query11): >- (rx::Query11::~Query11): >- (rx::Query11::begin): >- (rx::Query11::end): >- (rx::Query11::getResult): >- (rx::Query11::isResultAvailable): >- (rx::Query11::testQuery): >- * src/libGLESv2/renderer/Query11.h: Added. >- * src/libGLESv2/renderer/Query9.cpp: Added. >- (rx::Query9::Query9): >- (rx::Query9::~Query9): >- (rx::Query9::begin): >- (rx::Query9::end): >- (rx::Query9::getResult): >- (rx::Query9::isResultAvailable): >- (rx::Query9::testQuery): >- * src/libGLESv2/renderer/Query9.h: Added. >- * src/libGLESv2/renderer/QueryImpl.h: Added. >- (rx::QueryImpl::QueryImpl): >- (rx::QueryImpl::~QueryImpl): >- (rx::QueryImpl::getType): >- * src/libGLESv2/renderer/RenderStateCache.cpp: Added. >- (rx::RenderStateCache::RenderStateCache): >- (rx::RenderStateCache::~RenderStateCache): >- (rx::RenderStateCache::initialize): >- (rx::RenderStateCache::clear): >- (rx::RenderStateCache::hashBlendState): >- (rx::RenderStateCache::compareBlendStates): >- (rx::RenderStateCache::getBlendState): >- (rx::RenderStateCache::hashRasterizerState): >- (rx::RenderStateCache::compareRasterizerStates): >- (rx::RenderStateCache::getRasterizerState): >- (rx::RenderStateCache::hashDepthStencilState): >- (rx::RenderStateCache::compareDepthStencilStates): >- (rx::RenderStateCache::getDepthStencilState): >- (rx::RenderStateCache::hashSamplerState): >- (rx::RenderStateCache::compareSamplerStates): >- (rx::RenderStateCache::getSamplerState): >- * src/libGLESv2/renderer/RenderStateCache.h: Added. >- * src/libGLESv2/renderer/RenderTarget.h: Added. >- (rx::RenderTarget::RenderTarget): >- (rx::RenderTarget::~RenderTarget): >- (rx::RenderTarget::getWidth): >- (rx::RenderTarget::getHeight): >- (rx::RenderTarget::getInternalFormat): >- (rx::RenderTarget::getActualFormat): >- (rx::RenderTarget::getSamples): >- * src/libGLESv2/renderer/RenderTarget11.cpp: Added. >- (rx::getRTVSubresourceIndex): >- (rx::getDSVSubresourceIndex): >- (rx::RenderTarget11::RenderTarget11): >- (rx::RenderTarget11::~RenderTarget11): >- (rx::RenderTarget11::makeRenderTarget11): >- (rx::RenderTarget11::getTexture): >- (rx::RenderTarget11::getRenderTargetView): >- (rx::RenderTarget11::getDepthStencilView): >- (rx::RenderTarget11::getShaderResourceView): >- (rx::RenderTarget11::getSubresourceIndex): >- * src/libGLESv2/renderer/RenderTarget11.h: Added. >- * src/libGLESv2/renderer/RenderTarget9.cpp: Added. >- (rx::RenderTarget9::RenderTarget9): >- (rx::RenderTarget9::~RenderTarget9): >- (rx::RenderTarget9::makeRenderTarget9): >- (rx::RenderTarget9::getSurface): >- * src/libGLESv2/renderer/RenderTarget9.h: Added. >- * src/libGLESv2/renderer/Renderer.cpp: Added. >- (rx::Renderer::Renderer): >- (rx::Renderer::~Renderer): >- (rx::Renderer::initializeCompiler): >- (rx::Renderer::compileToBinary): >- * src/libGLESv2/renderer/Renderer.h: Added. >- (getComparableOSVersion): >- (rx::Renderer::getVertexTextureSupport): >- * src/libGLESv2/renderer/Renderer11.cpp: Added. >- (rx::Renderer11::Renderer11): >- (rx::Renderer11::~Renderer11): >- (rx::Renderer11::makeRenderer11): >- (rx::Renderer11::initialize): >- (rx::Renderer11::initializeDevice): >- (rx::Renderer11::generateConfigs): >- (rx::Renderer11::deleteConfigs): >- (rx::Renderer11::sync): >- (rx::Renderer11::createSwapChain): >- (rx::Renderer11::setSamplerState): >- (rx::Renderer11::setTexture): >- (rx::Renderer11::setRasterizerState): >- (rx::Renderer11::setBlendState): >- (rx::Renderer11::setDepthStencilState): >- (rx::Renderer11::setScissorRectangle): >- (rx::Renderer11::setViewport): >- (rx::Renderer11::applyPrimitiveType): >- (rx::Renderer11::applyRenderTarget): >- (rx::Renderer11::applyVertexBuffer): >- (rx::Renderer11::applyIndexBuffer): >- (rx::Renderer11::drawArrays): >- (rx::Renderer11::drawElements): >- (rx::Renderer11::drawLineLoop): >- (rx::Renderer11::drawTriangleFan): >- (rx::Renderer11::applyShaders): >- (rx::Renderer11::applyUniforms): >- (rx::Renderer11::clear): >- (rx::Renderer11::maskedClear): >- (rx::Renderer11::markAllStateDirty): >- (rx::Renderer11::releaseDeviceResources): >- (rx::Renderer11::notifyDeviceLost): >- (rx::Renderer11::isDeviceLost): >- (rx::Renderer11::testDeviceLost): >- (rx::Renderer11::testDeviceResettable): >- (rx::Renderer11::release): >- (rx::Renderer11::resetDevice): >- (rx::Renderer11::getAdapterVendor): >- (rx::Renderer11::getRendererDescription): >- (rx::Renderer11::getAdapterIdentifier): >- (rx::Renderer11::getBGRATextureSupport): >- (rx::Renderer11::getDXT1TextureSupport): >- (rx::Renderer11::getDXT3TextureSupport): >- (rx::Renderer11::getDXT5TextureSupport): >- (rx::Renderer11::getDepthTextureSupport): >- (rx::Renderer11::getFloat32TextureSupport): >- (rx::Renderer11::getFloat16TextureSupport): >- (rx::Renderer11::getLuminanceTextureSupport): >- (rx::Renderer11::getLuminanceAlphaTextureSupport): >- (rx::Renderer11::getTextureFilterAnisotropySupport): >- (rx::Renderer11::getTextureMaxAnisotropy): >- (rx::Renderer11::getEventQuerySupport): >- (rx::Renderer11::getViewportBounds): >- (rx::Renderer11::getMaxVertexTextureImageUnits): >- (rx::Renderer11::getMaxCombinedTextureImageUnits): >- (rx::Renderer11::getReservedVertexUniformVectors): >- (rx::Renderer11::getReservedFragmentUniformVectors): >- (rx::Renderer11::getMaxVertexUniformVectors): >- (rx::Renderer11::getMaxFragmentUniformVectors): >- (rx::Renderer11::getMaxVaryingVectors): >- (rx::Renderer11::getNonPower2TextureSupport): >- (rx::Renderer11::getOcclusionQuerySupport): >- (rx::Renderer11::getInstancingSupport): >- (rx::Renderer11::getShareHandleSupport): >- (rx::Renderer11::getDerivativeInstructionSupport): >- (rx::Renderer11::getPostSubBufferSupport): >- (rx::Renderer11::getMajorShaderModel): >- (rx::Renderer11::getMinorShaderModel): >- (rx::Renderer11::getMaxPointSize): >- (rx::Renderer11::getMaxViewportDimension): >- (rx::Renderer11::getMaxTextureWidth): >- (rx::Renderer11::getMaxTextureHeight): >- (rx::Renderer11::get32BitIndexSupport): >- (rx::Renderer11::getMinSwapInterval): >- (rx::Renderer11::getMaxSwapInterval): >- (rx::Renderer11::getMaxSupportedSamples): >- (rx::Renderer11::getNearestSupportedSamples): >- (rx::Renderer11::getMaxRenderTargets): >- (rx::Renderer11::copyToRenderTarget): >- (rx::Renderer11::copyImage): >- (rx::Renderer11::copyTexture): >- (rx::Renderer11::unapplyRenderTargets): >- (rx::Renderer11::setOneTimeRenderTarget): >- (rx::Renderer11::createRenderTarget): >- (rx::Renderer11::loadExecutable): >- (rx::Renderer11::compileToExecutable): >- (rx::Renderer11::createVertexBuffer): >- (rx::Renderer11::createIndexBuffer): >- (rx::Renderer11::createBufferStorage): >- (rx::Renderer11::createQuery): >- (rx::Renderer11::createFence): >- (rx::Renderer11::getRenderTargetResource): >- (rx::Renderer11::blitRect): >- (rx::Renderer11::readPixels): >- (rx::Renderer11::createImage): >- (rx::Renderer11::generateMipmap): >- (rx::Renderer11::createTextureStorage2D): >- (rx::Renderer11::createTextureStorageCube): >- (rx::getFastPixelCopySize): >- (rx::readPixelColor): >- (rx::writePixelColor): >- (rx::Renderer11::readTextureData): >- (rx::Renderer11::blitRenderbufferRect): >- (rx::Renderer11::resolveMultisampledTexture): >- (rx::Renderer11::getLUID): >- * src/libGLESv2/renderer/Renderer11.h: Added. >- (rx::Renderer11::getDevice): >- (rx::Renderer11::getDeviceContext): >- (rx::Renderer11::getDxgiFactory): >- * src/libGLESv2/renderer/Renderer9.cpp: Added. >- (rx::Renderer9::Renderer9): >- (rx::Renderer9::~Renderer9): >- (rx::Renderer9::makeRenderer9): >- (rx::Renderer9::initialize): >- (rx::Renderer9::initializeDevice): >- (rx::Renderer9::getDefaultPresentParameters): >- (rx::Renderer9::generateConfigs): >- (rx::Renderer9::deleteConfigs): >- (rx::Renderer9::startScene): >- (rx::Renderer9::endScene): >- (rx::Renderer9::sync): >- (rx::Renderer9::createSwapChain): >- (rx::Renderer9::allocateEventQuery): >- (rx::Renderer9::freeEventQuery): >- (rx::Renderer9::createVertexShader): >- (rx::Renderer9::createPixelShader): >- (rx::Renderer9::createVertexBuffer): >- (rx::Renderer9::createIndexBuffer): >- (rx::Renderer9::createBufferStorage): >- (rx::Renderer9::createQuery): >- (rx::Renderer9::createFence): >- (rx::Renderer9::setSamplerState): >- (rx::Renderer9::setTexture): >- (rx::Renderer9::setRasterizerState): >- (rx::Renderer9::setBlendState): >- (rx::Renderer9::setDepthStencilState): >- (rx::Renderer9::setScissorRectangle): >- (rx::Renderer9::setViewport): >- (rx::Renderer9::applyPrimitiveType): >- (rx::Renderer9::getNullColorbuffer): >- (rx::Renderer9::applyRenderTarget): >- (rx::Renderer9::applyVertexBuffer): >- (rx::Renderer9::applyIndexBuffer): >- (rx::Renderer9::drawArrays): >- (rx::Renderer9::drawElements): >- (rx::Renderer9::drawLineLoop): >- (rx::drawPoints): >- (rx::Renderer9::drawIndexedPoints): >- (rx::Renderer9::applyShaders): >- (rx::Renderer9::applyUniforms): >- (rx::Renderer9::applyUniformnfv): >- (rx::Renderer9::applyUniformniv): >- (rx::Renderer9::applyUniformnbv): >- (rx::Renderer9::clear): >- (rx::Renderer9::markAllStateDirty): >- (rx::Renderer9::releaseDeviceResources): >- (rx::Renderer9::notifyDeviceLost): >- (rx::Renderer9::isDeviceLost): >- (rx::Renderer9::testDeviceLost): >- (rx::Renderer9::testDeviceResettable): >- (rx::Renderer9::resetDevice): >- (rx::Renderer9::getAdapterVendor): >- (rx::Renderer9::getRendererDescription): >- (rx::Renderer9::getAdapterIdentifier): >- (rx::Renderer9::getMultiSampleSupport): >- (rx::Renderer9::getBGRATextureSupport): >- (rx::Renderer9::getDXT1TextureSupport): >- (rx::Renderer9::getDXT3TextureSupport): >- (rx::Renderer9::getDXT5TextureSupport): >- (rx::Renderer9::getDepthTextureSupport): >- (rx::Renderer9::getFloat32TextureSupport): >- (rx::Renderer9::getFloat16TextureSupport): >- (rx::Renderer9::getLuminanceTextureSupport): >- (rx::Renderer9::getLuminanceAlphaTextureSupport): >- (rx::Renderer9::getTextureFilterAnisotropySupport): >- (rx::Renderer9::getTextureMaxAnisotropy): >- (rx::Renderer9::getEventQuerySupport): >- (rx::Renderer9::getMaxVertexTextureImageUnits): >- (rx::Renderer9::getMaxCombinedTextureImageUnits): >- (rx::Renderer9::getReservedVertexUniformVectors): >- (rx::Renderer9::getReservedFragmentUniformVectors): >- (rx::Renderer9::getMaxVertexUniformVectors): >- (rx::Renderer9::getMaxFragmentUniformVectors): >- (rx::Renderer9::getMaxVaryingVectors): >- (rx::Renderer9::getNonPower2TextureSupport): >- (rx::Renderer9::getOcclusionQuerySupport): >- (rx::Renderer9::getInstancingSupport): >- (rx::Renderer9::getShareHandleSupport): >- (rx::Renderer9::getDerivativeInstructionSupport): >- (rx::Renderer9::getPostSubBufferSupport): >- (rx::Renderer9::getMajorShaderModel): >- (rx::Renderer9::getMaxPointSize): >- (rx::Renderer9::getMaxViewportDimension): >- (rx::Renderer9::getMaxTextureWidth): >- (rx::Renderer9::getMaxTextureHeight): >- (rx::Renderer9::get32BitIndexSupport): >- (rx::Renderer9::getCapsDeclTypes): >- (rx::Renderer9::getMinSwapInterval): >- (rx::Renderer9::getMaxSwapInterval): >- (rx::Renderer9::getMaxSupportedSamples): >- (rx::Renderer9::getNearestSupportedSamples): >- (rx::Renderer9::getMaxRenderTargets): >- (rx::Renderer9::ConvertTextureInternalFormat): >- (rx::Renderer9::copyToRenderTarget): >- (rx::Renderer9::getBufferPool): >- (rx::Renderer9::copyImage): >- (rx::Renderer9::blitRect): >- (rx::Renderer9::readPixels): >- (rx::Renderer9::createRenderTarget): >- (rx::Renderer9::loadExecutable): >- (rx::Renderer9::compileToExecutable): >- (rx::Renderer9::boxFilter): >- (rx::Renderer9::getTexturePool): >- (rx::Renderer9::createImage): >- (rx::Renderer9::generateMipmap): >- (rx::Renderer9::createTextureStorage2D): >- (rx::Renderer9::createTextureStorageCube): >- (rx::Renderer9::getLUID): >- * src/libGLESv2/renderer/Renderer9.h: Added. >- (rx::Renderer9::getDevice): >- * src/libGLESv2/renderer/ShaderCache.h: Added. >- (rx::ShaderCache::ShaderCache): >- (rx::ShaderCache::~ShaderCache): >- (rx::ShaderCache::initialize): >- (rx::ShaderCache::create): >- (rx::ShaderCache::clear): >- (rx::ShaderCache::createShader): >- * src/libGLESv2/renderer/ShaderExecutable.h: Added. >- (rx::ShaderExecutable::ShaderExecutable): >- (rx::ShaderExecutable::~ShaderExecutable): >- (rx::ShaderExecutable::getFunction): >- (rx::ShaderExecutable::getLength): >- * src/libGLESv2/renderer/ShaderExecutable11.cpp: Added. >- (rx::ShaderExecutable11::ShaderExecutable11): >- (rx::ShaderExecutable11::~ShaderExecutable11): >- (rx::ShaderExecutable11::makeShaderExecutable11): >- (rx::ShaderExecutable11::getVertexShader): >- (rx::ShaderExecutable11::getPixelShader): >- (rx::ShaderExecutable11::getGeometryShader): >- (rx::ShaderExecutable11::getConstantBuffer): >- * src/libGLESv2/renderer/ShaderExecutable11.h: Added. >- * src/libGLESv2/renderer/ShaderExecutable9.cpp: Added. >- (rx::ShaderExecutable9::ShaderExecutable9): >- (rx::ShaderExecutable9::~ShaderExecutable9): >- (rx::ShaderExecutable9::makeShaderExecutable9): >- (rx::ShaderExecutable9::getVertexShader): >- (rx::ShaderExecutable9::getPixelShader): >- * src/libGLESv2/renderer/ShaderExecutable9.h: Added. >- * src/libGLESv2/renderer/SwapChain.h: Added. >- (rx::SwapChain::SwapChain): >- (rx::SwapChain::~SwapChain): >- (rx::SwapChain::getShareHandle): >- * src/libGLESv2/renderer/SwapChain11.cpp: Added. >- (rx::SwapChain11::SwapChain11): >- (rx::SwapChain11::~SwapChain11): >- (rx::SwapChain11::release): >- (rx::SwapChain11::releaseOffscreenTexture): >- (rx::SwapChain11::resetOffscreenTexture): >- (rx::SwapChain11::resize): >- (rx::SwapChain11::reset): >- (rx::SwapChain11::initPassThroughResources): >- (rx::SwapChain11::swapRect): >- (rx::SwapChain11::getOffscreenTexture): >- (rx::SwapChain11::getRenderTarget): >- (rx::SwapChain11::getRenderTargetShaderResource): >- (rx::SwapChain11::getDepthStencil): >- (rx::SwapChain11::getDepthStencilTexture): >- (rx::SwapChain11::makeSwapChain11): >- (rx::SwapChain11::recreate): >- * src/libGLESv2/renderer/SwapChain11.h: Added. >- (rx::SwapChain11::getWidth): >- (rx::SwapChain11::getHeight): >- * src/libGLESv2/renderer/SwapChain9.cpp: Added. >- (rx::SwapChain9::SwapChain9): >- (rx::SwapChain9::~SwapChain9): >- (rx::SwapChain9::release): >- (rx::convertInterval): >- (rx::SwapChain9::resize): >- (rx::SwapChain9::reset): >- (rx::SwapChain9::swapRect): >- (rx::SwapChain9::getRenderTarget): >- (rx::SwapChain9::getDepthStencil): >- (rx::SwapChain9::getOffscreenTexture): >- (rx::SwapChain9::makeSwapChain9): >- (rx::SwapChain9::recreate): >- * src/libGLESv2/renderer/SwapChain9.h: Added. >- * src/libGLESv2/renderer/TextureStorage.cpp: Added. >- (rx::TextureStorageInterface::TextureStorageInterface): >- (rx::TextureStorageInterface::~TextureStorageInterface): >- (rx::TextureStorageInterface::isRenderTarget): >- (rx::TextureStorageInterface::isManaged): >- (rx::TextureStorageInterface::getTextureSerial): >- (rx::TextureStorageInterface::issueTextureSerial): >- (rx::TextureStorageInterface::getLodOffset): >- (rx::TextureStorageInterface::levelCount): >- (rx::TextureStorageInterface2D::TextureStorageInterface2D): >- (rx::TextureStorageInterface2D::~TextureStorageInterface2D): >- (rx::TextureStorageInterface2D::getRenderTarget): >- (rx::TextureStorageInterface2D::generateMipmap): >- (rx::TextureStorageInterface2D::getRenderTargetSerial): >- (rx::TextureStorageInterfaceCube::TextureStorageInterfaceCube): >- (rx::TextureStorageInterfaceCube::~TextureStorageInterfaceCube): >- (rx::TextureStorageInterfaceCube::getRenderTarget): >- (rx::TextureStorageInterfaceCube::generateMipmap): >- (rx::TextureStorageInterfaceCube::getRenderTargetSerial): >- * src/libGLESv2/renderer/TextureStorage.h: Added. >- (rx::TextureStorage::TextureStorage): >- (rx::TextureStorage::~TextureStorage): >- (rx::TextureStorageInterface::getStorageInstance): >- * src/libGLESv2/renderer/TextureStorage11.cpp: Added. >- (rx::TextureStorage11::TextureStorage11): >- (rx::TextureStorage11::~TextureStorage11): >- (rx::TextureStorage11::makeTextureStorage11): >- (rx::TextureStorage11::GetTextureBindFlags): >- (rx::TextureStorage11::IsTextureFormatRenderable): >- (rx::TextureStorage11::getBindFlags): >- (rx::TextureStorage11::getBaseTexture): >- (rx::TextureStorage11::getLodOffset): >- (rx::TextureStorage11::isRenderTarget): >- (rx::TextureStorage11::isManaged): >- (rx::TextureStorage11::levelCount): >- (rx::TextureStorage11::getSubresourceIndex): >- (rx::TextureStorage11::updateSubresourceLevel): >- (rx::TextureStorage11::generateMipmapLayer): >- (rx::TextureStorage11_2D::TextureStorage11_2D): >- (rx::TextureStorage11_2D::~TextureStorage11_2D): >- (rx::TextureStorage11_2D::makeTextureStorage11_2D): >- (rx::TextureStorage11_2D::getRenderTarget): >- (rx::TextureStorage11_2D::getSRV): >- (rx::TextureStorage11_2D::generateMipmap): >- (rx::TextureStorage11_Cube::TextureStorage11_Cube): >- (rx::TextureStorage11_Cube::~TextureStorage11_Cube): >- (rx::TextureStorage11_Cube::makeTextureStorage11_Cube): >- (rx::TextureStorage11_Cube::getRenderTarget): >- (rx::TextureStorage11_Cube::getSRV): >- (rx::TextureStorage11_Cube::generateMipmap): >- * src/libGLESv2/renderer/TextureStorage11.h: Added. >- (rx::TextureStorage11::getRenderTarget): >- (rx::TextureStorage11::generateMipmap): >- * src/libGLESv2/renderer/TextureStorage9.cpp: Added. >- (rx::TextureStorage9::TextureStorage9): >- (rx::TextureStorage9::~TextureStorage9): >- (rx::TextureStorage9::makeTextureStorage9): >- (rx::TextureStorage9::GetTextureUsage): >- (rx::TextureStorage9::IsTextureFormatRenderable): >- (rx::TextureStorage9::isRenderTarget): >- (rx::TextureStorage9::isManaged): >- (rx::TextureStorage9::getPool): >- (rx::TextureStorage9::getUsage): >- (rx::TextureStorage9::getLodOffset): >- (rx::TextureStorage9::levelCount): >- (rx::TextureStorage9_2D::TextureStorage9_2D): >- (rx::TextureStorage9_2D::~TextureStorage9_2D): >- (rx::TextureStorage9_2D::makeTextureStorage9_2D): >- (rx::TextureStorage9_2D::getSurfaceLevel): >- (rx::TextureStorage9_2D::getRenderTarget): >- (rx::TextureStorage9_2D::generateMipmap): >- (rx::TextureStorage9_2D::getBaseTexture): >- (rx::TextureStorage9_2D::initializeRenderTarget): >- (rx::TextureStorage9_Cube::TextureStorage9_Cube): >- (rx::TextureStorage9_Cube::~TextureStorage9_Cube): >- (rx::TextureStorage9_Cube::makeTextureStorage9_Cube): >- (rx::TextureStorage9_Cube::getCubeMapSurface): >- (rx::TextureStorage9_Cube::getRenderTarget): >- (rx::TextureStorage9_Cube::generateMipmap): >- (rx::TextureStorage9_Cube::getBaseTexture): >- (rx::TextureStorage9_Cube::initializeRenderTarget): >- * src/libGLESv2/renderer/TextureStorage9.h: Added. >- (rx::TextureStorage9::getRenderTarget): >- (rx::TextureStorage9::generateMipmap): >- * src/libGLESv2/renderer/VertexBuffer.cpp: Added. >- (rx::VertexBuffer::VertexBuffer): >- (rx::VertexBuffer::~VertexBuffer): >- (rx::VertexBuffer::updateSerial): >- (rx::VertexBuffer::getSerial): >- (rx::VertexBufferInterface::VertexBufferInterface): >- (rx::VertexBufferInterface::~VertexBufferInterface): >- (rx::VertexBufferInterface::getSerial): >- (rx::VertexBufferInterface::getBufferSize): >- (rx::VertexBufferInterface::setBufferSize): >- (rx::VertexBufferInterface::getWritePosition): >- (rx::VertexBufferInterface::setWritePosition): >- (rx::VertexBufferInterface::discard): >- (rx::VertexBufferInterface::storeVertexAttributes): >- (rx::VertexBufferInterface::storeRawData): >- (rx::VertexBufferInterface::reserveVertexSpace): >- (rx::VertexBufferInterface::reserveRawDataSpace): >- (rx::VertexBufferInterface::getVertexBuffer): >- (rx::StreamingVertexBufferInterface::StreamingVertexBufferInterface): >- (rx::StreamingVertexBufferInterface::~StreamingVertexBufferInterface): >- (rx::StreamingVertexBufferInterface::reserveSpace): >- (rx::StaticVertexBufferInterface::StaticVertexBufferInterface): >- (rx::StaticVertexBufferInterface::~StaticVertexBufferInterface): >- (rx::StaticVertexBufferInterface::lookupAttribute): >- (rx::StaticVertexBufferInterface::reserveSpace): >- (rx::StaticVertexBufferInterface::storeVertexAttributes): >- * src/libGLESv2/renderer/VertexBuffer.h: Added. >- * src/libGLESv2/renderer/VertexBuffer11.cpp: Added. >- (rx::VertexBuffer11::VertexBuffer11): >- (rx::VertexBuffer11::~VertexBuffer11): >- (rx::VertexBuffer11::initialize): >- (rx::VertexBuffer11::makeVertexBuffer11): >- (rx::VertexBuffer11::storeVertexAttributes): >- (rx::VertexBuffer11::storeRawData): >- (rx::VertexBuffer11::getSpaceRequired): >- (rx::VertexBuffer11::requiresConversion): >- (rx::VertexBuffer11::getBufferSize): >- (rx::VertexBuffer11::setBufferSize): >- (rx::VertexBuffer11::discard): >- (rx::VertexBuffer11::getVertexSize): >- (rx::VertexBuffer11::getDXGIFormat): >- (rx::VertexBuffer11::getBuffer): >- (rx::copyVertexData): >- (rx::copyFixedVertexData): >- (rx::copyToFloatVertexData): >- (rx::VertexBuffer11::getVertexConversion): >- * src/libGLESv2/renderer/VertexBuffer11.h: Added. >- * src/libGLESv2/renderer/VertexBuffer9.cpp: Added. >- (rx::VertexBuffer9::VertexBuffer9): >- (rx::VertexBuffer9::~VertexBuffer9): >- (rx::VertexBuffer9::initialize): >- (rx::VertexBuffer9::makeVertexBuffer9): >- (rx::VertexBuffer9::storeVertexAttributes): >- (rx::VertexBuffer9::storeRawData): >- (rx::VertexBuffer9::getSpaceRequired): >- (rx::VertexBuffer9::requiresConversion): >- (rx::VertexBuffer9::getVertexSize): >- (rx::VertexBuffer9::getDeclType): >- (rx::VertexBuffer9::getBufferSize): >- (rx::VertexBuffer9::setBufferSize): >- (rx::VertexBuffer9::discard): >- (rx::VertexBuffer9::getBuffer): >- (rx::VertexBuffer9::initializeTranslations): >- (rx::VertexBuffer9::typeIndex): >- (rx::VertexBuffer9::formatConverter): >- (rx::VertexBuffer9::spaceRequired): >- * src/libGLESv2/renderer/VertexBuffer9.h: Added. >- * src/libGLESv2/renderer/VertexDataManager.cpp: Added. >- (rx::elementsInBuffer): >- (rx::VertexDataManager::VertexDataManager): >- (rx::VertexDataManager::~VertexDataManager): >- (rx::directStoragePossible): >- (rx::VertexDataManager::prepareVertexData): >- * src/libGLESv2/renderer/VertexDataManager.h: Added. >- * src/libGLESv2/renderer/VertexDeclarationCache.cpp: Added. >- (rx::VertexDeclarationCache::VertexDeclarationCache): >- (rx::VertexDeclarationCache::~VertexDeclarationCache): >- (rx::VertexDeclarationCache::applyDeclaration): >- (rx::VertexDeclarationCache::markStateDirty): >- * src/libGLESv2/renderer/VertexDeclarationCache.h: Added. >- * src/libGLESv2/renderer/generatemip.h: Added. >- (rx::L8::average): >- (rx::A8L8::average): >- (rx::A8R8G8B8::average): >- (rx::A16B16G16R16F::average): >- (rx::R16F::average): >- (rx::R16G16F::average): >- (rx::A32B32G32R32F::average): >- (rx::R32F::average): >- (rx::R32G32F::average): >- (rx::R32G32B32F::average): >- (rx::GenerateMip): >- * src/libGLESv2/renderer/renderer11_utils.cpp: Added. >- (gl_d3d11::ConvertBlendFunc): >- (gl_d3d11::ConvertBlendOp): >- (gl_d3d11::ConvertColorMask): >- (gl_d3d11::ConvertCullMode): >- (gl_d3d11::ConvertComparison): >- (gl_d3d11::ConvertDepthMask): >- (gl_d3d11::ConvertStencilMask): >- (gl_d3d11::ConvertStencilOp): >- (gl_d3d11::ConvertFilter): >- (gl_d3d11::ConvertTextureWrap): >- (gl_d3d11::ConvertMinLOD): >- (gl_d3d11::ConvertMaxLOD): >- (d3d11_gl::ConvertBackBufferFormat): >- (d3d11_gl::ConvertDepthStencilFormat): >- (d3d11_gl::ConvertRenderbufferFormat): >- (d3d11_gl::ConvertTextureInternalFormat): >- (gl_d3d11::ConvertRenderbufferFormat): >- (gl_d3d11::ConvertTextureFormat): >- (d3d11::SetPositionTexCoordVertex): >- (d3d11::SetPositionDepthColorVertex): >- (d3d11::ComputePixelSizeBits): >- (d3d11::ComputeBlockSizeBits): >- (d3d11::IsCompressed): >- (d3d11::GetTextureFormatDimensionAlignment): >- (d3d11::IsDepthStencilFormat): >- (d3d11::GetDepthTextureFormat): >- (d3d11::GetDepthShaderResourceFormat): >- (d3d11::SetDebugName): >- * src/libGLESv2/renderer/renderer11_utils.h: Added. >- (d3d11::isDeviceLostError): >- * src/libGLESv2/renderer/renderer9_utils.cpp: Added. >- (gl_d3d9::ConvertComparison): >- (gl_d3d9::ConvertColor): >- (gl_d3d9::ConvertBlendFunc): >- (gl_d3d9::ConvertBlendOp): >- (gl_d3d9::ConvertStencilOp): >- (gl_d3d9::ConvertTextureWrap): >- (gl_d3d9::ConvertCullMode): >- (gl_d3d9::ConvertCubeFace): >- (gl_d3d9::ConvertColorMask): >- (gl_d3d9::ConvertMagFilter): >- (gl_d3d9::ConvertMinFilter): >- (gl_d3d9::ConvertRenderbufferFormat): >- (gl_d3d9::GetMultisampleTypeFromSamples): >- (d3d9_gl::GetStencilSize): >- (d3d9_gl::GetAlphaSize): >- (d3d9_gl::GetSamplesFromMultisampleType): >- (d3d9_gl::IsFormatChannelEquivalent): >- (d3d9_gl::ConvertBackBufferFormat): >- (d3d9_gl::ConvertDepthStencilFormat): >- (d3d9_gl::ConvertRenderTargetFormat): >- (d3d9_gl::GetEquivalentFormat): >- (d3d9::IsCompressedFormat): >- (d3d9::ComputeRowSize): >- * src/libGLESv2/renderer/renderer9_utils.h: Added. >- (d3d9::isDeviceLostError): >- * src/libGLESv2/renderer/shaders: Added. >- * src/libGLESv2/renderer/shaders/Blit.ps: Added. >- * src/libGLESv2/renderer/shaders/Blit.vs: Added. >- * src/libGLESv2/renderer/shaders/Clear11.hlsl: Added. >- * src/libGLESv2/renderer/shaders/Passthrough11.hlsl: Added. >- * src/libGLESv2/renderer/shaders/compiled: Added. >- * src/libGLESv2/renderer/shaders/compiled/clear11vs.h: Added. >- * src/libGLESv2/renderer/shaders/compiled/clearmultiple11ps.h: Added. >- * src/libGLESv2/renderer/shaders/compiled/clearsingle11ps.h: Added. >- * src/libGLESv2/renderer/shaders/compiled/componentmaskps.h: Added. >- * src/libGLESv2/renderer/shaders/compiled/flipyvs.h: Added. >- * src/libGLESv2/renderer/shaders/compiled/luminanceps.h: Added. >- * src/libGLESv2/renderer/shaders/compiled/passthrough11vs.h: Added. >- * src/libGLESv2/renderer/shaders/compiled/passthroughlum11ps.h: Added. >- * src/libGLESv2/renderer/shaders/compiled/passthroughlumalpha11ps.h: Added. >- * src/libGLESv2/renderer/shaders/compiled/passthroughps.h: Added. >- * src/libGLESv2/renderer/shaders/compiled/passthroughrgb11ps.h: Added. >- * src/libGLESv2/renderer/shaders/compiled/passthroughrgba11ps.h: Added. >- * src/libGLESv2/renderer/shaders/compiled/standardvs.h: Added. >- * src/libGLESv2/renderer/shaders/generate_shaders.bat: Added. >- * src/libGLESv2/renderer/vertexconversion.h: Added. >- (rx::Identity::convert): >- (rx::Cast::convert): >- (rx::Normalize::convert): >- (rx::FixedToFloat::convert): >- (rx::SimpleDefaultValues::zero): >- (rx::SimpleDefaultValues::one): >- (rx::NormalizedDefaultValues::zero): >- (rx::NormalizedDefaultValues::one): >- (rx::VertexDataConverter::convertArray): >- (rx::VertexDataConverter::pointerAddBytes): >- (rx::VertexDataConverter::copyComponent): >- * src/libGLESv2/resource.h: Added. >- * src/libGLESv2/utilities.cpp: Added. >- (gl::UniformComponentCount): >- (gl::UniformComponentType): >- (gl::UniformComponentSize): >- (gl::UniformInternalSize): >- (gl::UniformExternalSize): >- (gl::VariableRowCount): >- (gl::VariableColumnCount): >- (gl::AllocateFirstFreeBits): >- (gl::ComputePitch): >- (gl::ComputeCompressedPitch): >- (gl::ComputeCompressedSize): >- (gl::IsCompressed): >- (gl::IsDepthTexture): >- (gl::IsStencilTexture): >- (gl::MakeValidSize): >- (gl::ComputePixelSize): >- (gl::IsCubemapTextureTarget): >- (gl::IsInternalTextureTarget): >- (gl::ConvertSizedInternalFormat): >- (gl::ExtractFormat): >- (gl::ExtractType): >- (gl::IsColorRenderable): >- (gl::IsDepthRenderable): >- (gl::IsStencilRenderable): >- (gl::IsFloat32Format): >- (gl::IsFloat16Format): >- (gl::GetAlphaSize): >- (gl::GetRedSize): >- (gl::GetGreenSize): >- (gl::GetBlueSize): >- (gl::GetDepthSize): >- (gl::GetStencilSize): >- (gl::IsTriangleMode): >- (getTempPath): >- (writeFile): >- * src/libGLESv2/utilities.h: Added. >- * src/third_party/murmurhash: Added. >- * src/third_party/murmurhash/LICENSE: Added. >- * src/third_party/murmurhash/MurmurHash3.cpp: Added, replaced tabs with spaces. >- (rotl32): >- (rotl64): >- (getblock): >- (fmix): >- (MurmurHash3_x86_32): >- (MurmurHash3_x86_128): >- (MurmurHash3_x64_128): >- * src/third_party/murmurhash/MurmurHash3.h: Added, replaced tabs with spaces. >- >-2013-07-20 Dean Jackson <dino@apple.com> >- >- Updated ANGLE is leaking like a sieve >- https://bugs.webkit.org/show_bug.cgi?id=118939 >- >- Rollout 152863, r152821, r152929 and r152755. >- >- * ANGLE.plist: >- * ANGLE.xcodeproj/project.pbxproj: >- * DerivedSources.make: Removed. >- * GNUmakefile.am: >- * Target.pri: >- * include/GLSLANG/ShaderLang.h: >- * src/compiler/BaseTypes.h: >- (getQualifierString): >- * src/compiler/Common.h: >- (EncodeSourceLoc): >- (DecodeSourceLoc): >- * src/compiler/Compiler.cpp: >- (TCompiler::TCompiler): >- (TCompiler::Init): >- (TCompiler::compile): >- (TCompiler::detectRecursion): >- * src/compiler/ConstantUnion.h: >- (ConstantUnion::ConstantUnion): >- * src/compiler/DetectCallDepth.cpp: Removed. >- * src/compiler/DetectRecursion.cpp: Added. >- (DetectRecursion::FunctionNode::FunctionNode): >- (DetectRecursion::FunctionNode::getName): >- (DetectRecursion::FunctionNode::addCallee): >- (DetectRecursion::FunctionNode::detectRecursion): >- (DetectRecursion::DetectRecursion): >- (DetectRecursion::~DetectRecursion): >- (DetectRecursion::visitAggregate): >- (DetectRecursion::detectRecursion): >- (DetectRecursion::findFunctionByName): >- * src/compiler/DetectRecursion.h: Renamed from Source/ThirdParty/ANGLE/src/compiler/DetectCallDepth.h. >- * src/compiler/Diagnostics.cpp: >- (TDiagnostics::writeInfo): >- * src/compiler/ForLoopUnroll.cpp: >- (ForLoopUnroll::evaluateIntConstant): >- * src/compiler/InfoSink.cpp: >- (TInfoSinkBase::prefix): >- (TInfoSinkBase::location): >- (TInfoSinkBase::message): >- * src/compiler/InfoSink.h: >- * src/compiler/Initialize.cpp: >- (BuiltInFunctionsCommon): >- (BuiltInFunctionsVertex): >- (TBuiltIns::initialize): >- (IdentifyBuiltIns): >- (InitExtensionBehavior): >- * src/compiler/Intermediate.cpp: >- (TIntermediate::addSymbol): >- (TIntermediate::addBinaryMath): >- (TIntermediate::addAssign): >- (TIntermediate::addIndex): >- (TIntermediate::addUnaryMath): >- (TIntermediate::setAggregateOperator): >- (TIntermediate::addConversion): >- (TIntermediate::growAggregate): >- (TIntermediate::makeAggregate): >- (TIntermediate::addSelection): >- (TIntermediate::addComma): >- (TIntermediate::addConstantUnion): >- (TIntermediate::addSwizzle): >- (TIntermediate::addLoop): >- (TIntermediate::addBranch): >- (TIntermUnary::promote): >- (TIntermBinary::promote): >- (CompareStruct): >- (CompareStructure): >- (TIntermConstantUnion::fold): >- (TIntermediate::promoteConstantUnion): >- * src/compiler/OutputGLSL.cpp: >- (TOutputGLSL::writeVariablePrecision): >- * src/compiler/OutputGLSL.h: >- * src/compiler/OutputGLSLBase.cpp: >- (TOutputGLSLBase::writeVariableType): >- (TOutputGLSLBase::writeConstantUnion): >- (TOutputGLSLBase::visitBinary): >- (TOutputGLSLBase::visitAggregate): >- (TOutputGLSLBase::getTypeName): >- (TOutputGLSLBase::hashFunctionName): >- * src/compiler/OutputGLSLBase.h: >- * src/compiler/OutputHLSL.cpp: >- (sh::OutputHLSL::OutputHLSL): >- (sh::OutputHLSL::header): >- (sh::OutputHLSL::visitSymbol): >- (sh::OutputHLSL::visitBinary): >- (sh::OutputHLSL::visitAggregate): >- (sh::OutputHLSL::visitSelection): >- (sh::OutputHLSL::visitLoop): >- (sh::OutputHLSL::handleExcessiveLoop): >- (sh::OutputHLSL::typeString): >- (sh::OutputHLSL::initializer): >- (sh::OutputHLSL::addConstructor): >- (sh::OutputHLSL::writeConstantUnion): >- (sh::OutputHLSL::decorateField): >- * src/compiler/OutputHLSL.h: >- * src/compiler/ParseHelper.cpp: >- (TParseContext::parseVectorFields): >- (TParseContext::parseMatrixFields): >- (TParseContext::error): >- (TParseContext::warning): >- (TParseContext::assignError): >- (TParseContext::unaryOpError): >- (TParseContext::binaryOpError): >- (TParseContext::precisionErrorCheck): >- (TParseContext::lValueErrorCheck): >- (TParseContext::globalErrorCheck): >- (TParseContext::reservedErrorCheck): >- (TParseContext::constructorErrorCheck): >- (TParseContext::voidErrorCheck): >- (TParseContext::boolErrorCheck): >- (TParseContext::samplerErrorCheck): >- (TParseContext::structQualifierErrorCheck): >- (TParseContext::parameterSamplerErrorCheck): >- (TParseContext::containsSampler): >- (TParseContext::arraySizeErrorCheck): >- (TParseContext::arrayQualifierErrorCheck): >- (TParseContext::arrayTypeErrorCheck): >- (TParseContext::arrayErrorCheck): >- (TParseContext::arraySetMaxSize): >- (TParseContext::nonInitConstErrorCheck): >- (TParseContext::nonInitErrorCheck): >- (TParseContext::paramErrorCheck): >- (TParseContext::extensionErrorCheck): >- (TParseContext::handleExtensionDirective): >- (TParseContext::handlePragmaDirective): >- (TParseContext::findFunction): >- (TParseContext::executeInitializer): >- (TParseContext::addConstructor): >- (TParseContext::constructBuiltIn): >- (TParseContext::constructStruct): >- (TParseContext::addConstVectorNode): >- (TParseContext::addConstMatrixNode): >- (TParseContext::addConstArrayNode): >- (TParseContext::addConstStruct): >- (TParseContext::enterStructDeclaration): >- (TParseContext::structNestingErrorCheck): >- * src/compiler/ParseHelper.h: >- (TParseContext::TParseContext): >- (TParseContext::pragma): >- * src/compiler/PoolAlloc.cpp: >- (TPoolAllocator::allocate): >- * src/compiler/ShHandle.h: >- * src/compiler/ShaderLang.cpp: >- (ShInitBuiltInResources): >- * src/compiler/SymbolTable.cpp: >- (TType::TType): >- (TType::buildMangledName): >- (TType::getStructSize): >- (TType::computeDeepestStructNesting): >- (TType::isStructureContainingArrays): >- (TSymbolTableLevel::relateToExtension): >- (TSymbol::TSymbol): >- (TVariable::TVariable): >- (TVariable::clone): >- (TFunction::TFunction): >- (TFunction::clone): >- (TSymbolTableLevel::clone): >- (TSymbolTable::copyTable): >- * src/compiler/SymbolTable.h: >- (TVariable::TVariable): >- (TVariable::updateArrayInformationType): >- (TVariable::getArrayInformationType): >- (TParameter::copyParam): >- (TFunction::relateToExtension): >- (TFunction::getExtension): >- * src/compiler/Types.h: >- (NewPoolTTypeList): >- (TType::TType): >- (TType::copyType): >- (TType::clone): >- (TType::getObjectSize): >- (TType::getMaxArraySize): >- (TType::setMaxArraySize): >- (TType::clearArrayness): >- (TType::setArrayInformationType): >- (TType::getArrayInformationType): >- (TType::getStruct): >- (TType::setStruct): >- (TType::getTypeName): >- (TType::setTypeName): >- (TType::isField): >- (TType::getFieldName): >- (TType::setFieldName): >- (TType::getMangledName): >- (TType::getDeepestStructNesting): >- (TPublicType::setBasic): >- * src/compiler/VariableInfo.cpp: >- (getUserDefinedVariableInfo): >- * src/compiler/builtin_symbol_table.cpp: Removed. >- * src/compiler/builtin_symbol_table.h: Removed. >- * src/compiler/builtin_symbols.json: Removed. >- * src/compiler/generate_builtin_symbol_table.py: Removed. >- * src/compiler/glslang.l: >- * src/compiler/glslang.y: >- * src/compiler/glslang_lex.cpp: >- (yy_get_previous_state): >- (yy_try_NUL_trans): >- (yy_push_state): >- (yy_pop_state): >- (yy_top_state): >- (string_input): >- (check_type): >- (reserved_word): >- (yyerror): >- (glslang_scan): >- * src/compiler/glslang_tab.cpp: >- * src/compiler/glslang_tab.h: >- * src/compiler/intermOut.cpp: >- (TOutputTraverser::visitUnary): >- (TOutputTraverser::visitAggregate): >- (TOutputTraverser::visitConstantUnion): >- * src/compiler/intermediate.h: >- (TIntermNode::TIntermNode): >- (TIntermNode::getLine): >- (TIntermNode::setLine): >- (TIntermNode::~TIntermNode): >- (TIntermConstantUnion::setUnionArrayPointer): >- (TIntermAggregate::TIntermAggregate): >- (TIntermAggregate::setEndLine): >- (TIntermAggregate::getEndLine): >- (TIntermTraverser::TIntermTraverser): >- (TIntermTraverser::incrementDepth): >- * src/compiler/localintermediate.h: >- * src/compiler/parseConst.cpp: >- (TConstTraverser::visitSymbol): >- (TConstTraverser::visitBinary): >- (TConstTraverser::visitUnary): >- (TConstTraverser::visitAggregate): >- (TConstTraverser::visitSelection): >- (TConstTraverser::visitConstantUnion): >- (TConstTraverser::visitLoop): >- (TConstTraverser::visitBranch): >- (TIntermediate::parseConstTree): >- * src/compiler/timing/RestrictVertexShaderTiming.cpp: >- (RestrictVertexShaderTiming::visitSymbol): >- * src/libEGL/Config.cpp: Removed. >- * src/libEGL/Config.h: Removed. >- * src/libEGL/Display.cpp: Removed. >- * src/libEGL/Display.h: Removed. >- * src/libEGL/README: Added. >- * src/libEGL/ShaderCache.h: Removed. >- * src/libEGL/Surface.cpp: Removed. >- * src/libEGL/Surface.h: Removed. >- * src/libEGL/libEGL.cpp: Removed. >- * src/libEGL/libEGL.def: Removed. >- * src/libEGL/libEGL.rc: Removed. >- * src/libEGL/libEGL.vcxproj: Removed. >- * src/libEGL/libEGL.vcxproj.filters: Removed. >- * src/libEGL/main.cpp: Removed. >- * src/libEGL/main.h: Removed. >- * src/libEGL/resource.h: Removed. >- * src/libGLESv2/BinaryStream.h: Removed. >- * src/libGLESv2/Blit.cpp: Removed. >- * src/libGLESv2/Blit.h: Removed. >- * src/libGLESv2/Buffer.cpp: Removed. >- * src/libGLESv2/Buffer.h: Removed. >- * src/libGLESv2/Context.cpp: Removed. >- * src/libGLESv2/Context.h: Removed. >- * src/libGLESv2/D3DConstantTable.cpp: Removed. >- * src/libGLESv2/D3DConstantTable.h: Removed. >- * src/libGLESv2/Fence.cpp: Removed. >- * src/libGLESv2/Fence.h: Removed. >- * src/libGLESv2/Float16ToFloat32.cpp: Removed. >- * src/libGLESv2/Float16ToFloat32.py: Removed. >- * src/libGLESv2/Framebuffer.cpp: Removed. >- * src/libGLESv2/Framebuffer.h: Removed. >- * src/libGLESv2/HandleAllocator.cpp: Removed. >- * src/libGLESv2/HandleAllocator.h: Removed. >- * src/libGLESv2/IndexDataManager.cpp: Removed. >- * src/libGLESv2/IndexDataManager.h: Removed. >- * src/libGLESv2/Program.cpp: Removed. >- * src/libGLESv2/Program.h: Removed. >- * src/libGLESv2/ProgramBinary.cpp: Removed. >- * src/libGLESv2/ProgramBinary.h: Removed. >- * src/libGLESv2/Query.cpp: Removed. >- * src/libGLESv2/Query.h: Removed. >- * src/libGLESv2/README: Added. >- * src/libGLESv2/Renderbuffer.cpp: Removed. >- * src/libGLESv2/Renderbuffer.h: Removed. >- * src/libGLESv2/ResourceManager.cpp: Removed. >- * src/libGLESv2/ResourceManager.h: Removed. >- * src/libGLESv2/Shader.cpp: Removed. >- * src/libGLESv2/Shader.h: Removed. >- * src/libGLESv2/Texture.cpp: Removed. >- * src/libGLESv2/Texture.h: Removed. >- * src/libGLESv2/TextureSSE2.cpp: Removed. >- * src/libGLESv2/VertexDataManager.cpp: Removed. >- * src/libGLESv2/VertexDataManager.h: Removed. >- * src/libGLESv2/libGLESv2.cpp: Removed. >- * src/libGLESv2/libGLESv2.def: Removed. >- * src/libGLESv2/libGLESv2.rc: Removed. >- * src/libGLESv2/libGLESv2.vcxproj: Removed. >- * src/libGLESv2/libGLESv2.vcxproj.filters: Removed. >- * src/libGLESv2/main.cpp: Removed. >- * src/libGLESv2/main.h: Removed. >- * src/libGLESv2/mathutil.h: Removed. >- * src/libGLESv2/resource.h: Removed. >- * src/libGLESv2/shaders/Blit.ps: Removed. >- * src/libGLESv2/shaders/Blit.vs: Removed. >- * src/libGLESv2/shaders/componentmaskps.h: Removed. >- * src/libGLESv2/shaders/flipyvs.h: Removed. >- * src/libGLESv2/shaders/generate_shaders.bat: Removed. >- * src/libGLESv2/shaders/luminanceps.h: Removed. >- * src/libGLESv2/shaders/passthroughps.h: Removed. >- * src/libGLESv2/shaders/standardvs.h: Removed. >- * src/libGLESv2/utilities.cpp: Removed. >- * src/libGLESv2/utilities.h: Removed. >- * src/libGLESv2/vertexconversion.h: Removed. >- >-2013-07-19 Alex Christensen <achristensen@apple.com> >- >- Generate derived files in ANGLE at build time rather than when updating from upstream. >- https://bugs.webkit.org/show_bug.cgi?id=118872 >- >- Reviewed by Mark Rowe. >- >- * ANGLE.xcodeproj/project.pbxproj: Made Derived Sources target which calls DerivedSources.make, >- moved generated files into Derived Sources group. >- * DerivedSources.make: Added. >- >-2013-07-18 Alex Christensen <achristensen@apple.com> >- >- Added previously unincluded files from ANGLE r2426 with these exceptions: >- No gyp files are included. No WebKit ports use them. >- ANGLE.sln is not included. I will not use that. >- translator_common and translator_hlsl projects and filters are not included. >- I will need to make a customized translator project that uses the GLSL translator instead of the HLSL. >- https://bugs.webkit.org/show_bug.cgi?id=118833 >- >- Reviewed by Dean Jackson. >- >- * src/compiler/builtin_symbols.json: Added. >- * src/compiler/generate_builtin_symbol_table.py: Added. >- (parseBuiltin): >- * src/libEGL: Replaced. >- * src/libEGL/Config.cpp: Added. >- (egl::Config::Config): >- (egl::Config::setDefaults): >- (egl::Config::set): >- (egl::Config::getHandle): >- (egl::SortConfig::SortConfig): >- (egl::SortConfig::scanForWantedComponents): >- (egl::SortConfig::wantedComponentsSize): >- (egl::SortConfig::operator()): >- (egl::ConfigSet::ConfigSet): >- (egl::ConfigSet::add): >- (egl::ConfigSet::size): >- (egl::ConfigSet::getConfigs): >- (egl::ConfigSet::get): >- * src/libEGL/Config.h: Added. >- * src/libEGL/Display.cpp: Added. >- (egl::Display::getDisplay): >- (egl::Display::Display): >- (egl::Display::~Display): >- (egl::Display::initialize): >- (egl::Display::terminate): >- (egl::Display::startScene): >- (egl::Display::endScene): >- (egl::Display::getConfigs): >- (egl::Display::getConfigAttrib): >- (egl::Display::createDevice): >- (egl::Display::initializeDevice): >- (egl::Display::resetDevice): >- (egl::Display::createWindowSurface): >- (egl::Display::createOffscreenSurface): >- (egl::Display::createContext): >- (egl::Display::restoreLostDevice): >- (egl::Display::destroySurface): >- (egl::Display::destroyContext): >- (egl::Display::notifyDeviceLost): >- (egl::Display::isDeviceLost): >- (egl::Display::isInitialized): >- (egl::Display::isValidConfig): >- (egl::Display::isValidContext): >- (egl::Display::isValidSurface): >- (egl::Display::hasExistingWindowSurface): >- (egl::Display::getMinSwapInterval): >- (egl::Display::getMaxSwapInterval): >- (egl::Display::getDevice): >- (egl::Display::getDeviceCaps): >- (egl::Display::getAdapterIdentifier): >- (egl::Display::testDeviceLost): >- (egl::Display::testDeviceResettable): >- (egl::Display::sync): >- (egl::Display::allocateEventQuery): >- (egl::Display::freeEventQuery): >- (egl::Display::getMultiSampleSupport): >- (egl::Display::getDXT1TextureSupport): >- (egl::Display::getDXT3TextureSupport): >- (egl::Display::getDXT5TextureSupport): >- (egl::Display::getDepthTextureSupport): >- (egl::Display::getFloat32TextureSupport): >- (egl::Display::getFloat16TextureSupport): >- (egl::Display::getLuminanceTextureSupport): >- (egl::Display::getLuminanceAlphaTextureSupport): >- (egl::Display::getTextureFilterAnisotropySupport): >- (egl::Display::getBufferPool): >- (egl::Display::getTexturePool): >- (egl::Display::getEventQuerySupport): >- (egl::Display::getDefaultPresentParameters): >- (egl::Display::initExtensionString): >- (egl::Display::getExtensionString): >- (egl::Display::initVendorString): >- (egl::Display::getVendorString): >- (egl::Display::shareHandleSupported): >- (egl::Display::createVertexShader): >- (egl::Display::compileShaderSource): >- (egl::Display::createPixelShader): >- (egl::Display::getVertexTextureSupport): >- (egl::Display::getNonPower2TextureSupport): >- (egl::Display::getOcclusionQuerySupport): >- (egl::Display::getInstancingSupport): >- * src/libEGL/Display.h: Added. >- (getComparableOSVersion): >- (egl::Display::isD3d9ExDevice): >- * src/libEGL/README: Removed. >- * src/libEGL/ShaderCache.h: Added. >- (egl::ShaderCache::ShaderCache): >- (egl::ShaderCache::~ShaderCache): >- (egl::ShaderCache::initialize): >- (egl::ShaderCache::create): >- (egl::ShaderCache::clear): >- (egl::ShaderCache::createShader): >- * src/libEGL/Surface.cpp: Added. >- (egl::Surface::Surface): >- (egl::Surface::~Surface): >- (egl::Surface::initialize): >- (egl::Surface::release): >- (egl::Surface::resetSwapChain): >- (egl::Surface::swapRect): >- (egl::Surface::getWindowHandle): >- (egl::SurfaceWindowProc): >- (egl::Surface::subclassWindow): >- (egl::Surface::unsubclassWindow): >- (egl::Surface::checkForOutOfDateSwapChain): >- (egl::Surface::convertInterval): >- (egl::Surface::swap): >- (egl::Surface::postSubBuffer): >- (egl::Surface::getWidth): >- (egl::Surface::getHeight): >- (egl::Surface::isPostSubBufferSupported): >- (egl::Surface::getRenderTarget): >- (egl::Surface::getDepthStencil): >- (egl::Surface::getOffscreenTexture): >- (egl::Surface::setSwapInterval): >- (egl::Surface::getTextureFormat): >- (egl::Surface::getTextureTarget): >- (egl::Surface::setBoundTexture): >- (egl::Surface::getBoundTexture): >- (egl::Surface::getFormat): >- * src/libEGL/Surface.h: Added. >- (egl::Surface::getShareHandle): >- * src/libEGL/libEGL.cpp: Added. >- (validateDisplay): >- (validateConfig): >- (validateContext): >- (validateSurface): >- * src/libEGL/libEGL.def: Added. >- * src/libEGL/libEGL.rc: Added. >- * src/libEGL/libEGL.vcxproj: Added. >- * src/libEGL/libEGL.vcxproj.filters: Added. >- * src/libEGL/main.cpp: Added. >- (DllMain): >- (egl::setCurrentError): >- (egl::getCurrentError): >- (egl::setCurrentAPI): >- (egl::getCurrentAPI): >- (egl::setCurrentDisplay): >- (egl::getCurrentDisplay): >- (egl::setCurrentDrawSurface): >- (egl::getCurrentDrawSurface): >- (egl::setCurrentReadSurface): >- (egl::getCurrentReadSurface): >- (error): >- * src/libEGL/main.h: Added. >- (error): >- (success): >- * src/libEGL/resource.h: Added. >- * src/libGLESv2: Replaced. >- * src/libGLESv2/BinaryStream.h: Added. >- (gl::BinaryInputStream::BinaryInputStream): >- (gl::BinaryInputStream::read): >- (gl::BinaryInputStream::skip): >- (gl::BinaryInputStream::offset): >- (gl::BinaryInputStream::error): >- (gl::BinaryInputStream::endOfStream): >- (gl::BinaryOutputStream::BinaryOutputStream): >- (gl::BinaryOutputStream::write): >- (gl::BinaryOutputStream::length): >- (gl::BinaryOutputStream::data): >- * src/libGLESv2/Blit.cpp: Added. >- (gl::Blit::Blit): >- (gl::Blit::~Blit): >- (gl::Blit::initGeometry): >- (gl::Blit::setShader): >- (gl::Blit::setVertexShader): >- (gl::Blit::setPixelShader): >- (gl::Blit::getSurfaceRect): >- (gl::Blit::boxFilter): >- (gl::Blit::copy): >- (gl::Blit::formatConvert): >- (gl::Blit::setFormatConvertShaders): >- (gl::Blit::copySurfaceToTexture): >- (gl::Blit::setViewport): >- (gl::Blit::setCommonBlitState): >- (gl::Blit::render): >- (gl::Blit::saveState): >- (gl::Blit::restoreState): >- * src/libGLESv2/Blit.h: Added. >- * src/libGLESv2/Buffer.cpp: Added. >- (gl::Buffer::Buffer): >- (gl::Buffer::~Buffer): >- (gl::Buffer::bufferData): >- (gl::Buffer::bufferSubData): >- (gl::Buffer::getStaticVertexBuffer): >- (gl::Buffer::getStaticIndexBuffer): >- (gl::Buffer::invalidateStaticData): >- (gl::Buffer::promoteStaticUsage): >- * src/libGLESv2/Buffer.h: Added. >- (gl::Buffer::data): >- (gl::Buffer::size): >- (gl::Buffer::usage): >- * src/libGLESv2/Context.cpp: Added. >- (gl::makeStaticString): >- (gl::Context::Context): >- (gl::Context::~Context): >- (gl::Context::makeCurrent): >- (gl::Context::markAllStateDirty): >- (gl::Context::markDxUniformsDirty): >- (gl::Context::markContextLost): >- (gl::Context::isContextLost): >- (gl::Context::setClearColor): >- (gl::Context::setClearDepth): >- (gl::Context::setClearStencil): >- (gl::Context::setCullFace): >- (gl::Context::isCullFaceEnabled): >- (gl::Context::setCullMode): >- (gl::Context::setFrontFace): >- (gl::Context::setDepthTest): >- (gl::Context::isDepthTestEnabled): >- (gl::Context::setDepthFunc): >- (gl::Context::setDepthRange): >- (gl::Context::setBlend): >- (gl::Context::isBlendEnabled): >- (gl::Context::setBlendFactors): >- (gl::Context::setBlendColor): >- (gl::Context::setBlendEquation): >- (gl::Context::setStencilTest): >- (gl::Context::isStencilTestEnabled): >- (gl::Context::setStencilParams): >- (gl::Context::setStencilBackParams): >- (gl::Context::setStencilWritemask): >- (gl::Context::setStencilBackWritemask): >- (gl::Context::setStencilOperations): >- (gl::Context::setStencilBackOperations): >- (gl::Context::setPolygonOffsetFill): >- (gl::Context::isPolygonOffsetFillEnabled): >- (gl::Context::setPolygonOffsetParams): >- (gl::Context::setSampleAlphaToCoverage): >- (gl::Context::isSampleAlphaToCoverageEnabled): >- (gl::Context::setSampleCoverage): >- (gl::Context::isSampleCoverageEnabled): >- (gl::Context::setSampleCoverageParams): >- (gl::Context::setScissorTest): >- (gl::Context::isScissorTestEnabled): >- (gl::Context::setDither): >- (gl::Context::isDitherEnabled): >- (gl::Context::setLineWidth): >- (gl::Context::setGenerateMipmapHint): >- (gl::Context::setFragmentShaderDerivativeHint): >- (gl::Context::setViewportParams): >- (gl::Context::setScissorParams): >- (gl::Context::setColorMask): >- (gl::Context::setDepthMask): >- (gl::Context::setActiveSampler): >- (gl::Context::getReadFramebufferHandle): >- (gl::Context::getDrawFramebufferHandle): >- (gl::Context::getRenderbufferHandle): >- (gl::Context::getArrayBufferHandle): >- (gl::Context::getActiveQuery): >- (gl::Context::setEnableVertexAttribArray): >- (gl::Context::getVertexAttribState): >- (gl::Context::setVertexAttribState): >- (gl::Context::getVertexAttribPointer): >- (gl::Context::getVertexAttributes): >- (gl::Context::setPackAlignment): >- (gl::Context::getPackAlignment): >- (gl::Context::setUnpackAlignment): >- (gl::Context::getUnpackAlignment): >- (gl::Context::setPackReverseRowOrder): >- (gl::Context::getPackReverseRowOrder): >- (gl::Context::createBuffer): >- (gl::Context::createProgram): >- (gl::Context::createShader): >- (gl::Context::createTexture): >- (gl::Context::createRenderbuffer): >- (gl::Context::createFramebuffer): >- (gl::Context::createFence): >- (gl::Context::createQuery): >- (gl::Context::deleteBuffer): >- (gl::Context::deleteShader): >- (gl::Context::deleteProgram): >- (gl::Context::deleteTexture): >- (gl::Context::deleteRenderbuffer): >- (gl::Context::deleteFramebuffer): >- (gl::Context::deleteFence): >- (gl::Context::deleteQuery): >- (gl::Context::getBuffer): >- (gl::Context::getShader): >- (gl::Context::getProgram): >- (gl::Context::getTexture): >- (gl::Context::getRenderbuffer): >- (gl::Context::getReadFramebuffer): >- (gl::Context::getDrawFramebuffer): >- (gl::Context::bindArrayBuffer): >- (gl::Context::bindElementArrayBuffer): >- (gl::Context::bindTexture2D): >- (gl::Context::bindTextureCubeMap): >- (gl::Context::bindReadFramebuffer): >- (gl::Context::bindDrawFramebuffer): >- (gl::Context::bindRenderbuffer): >- (gl::Context::useProgram): >- (gl::Context::linkProgram): >- (gl::Context::setProgramBinary): >- (gl::Context::beginQuery): >- (gl::Context::endQuery): >- (gl::Context::setFramebufferZero): >- (gl::Context::setRenderbufferStorage): >- (gl::Context::getFramebuffer): >- (gl::Context::getFence): >- (gl::Context::getQuery): >- (gl::Context::getArrayBuffer): >- (gl::Context::getElementArrayBuffer): >- (gl::Context::getCurrentProgramBinary): >- (gl::Context::getTexture2D): >- (gl::Context::getTextureCubeMap): >- (gl::Context::getSamplerTexture): >- (gl::Context::getBooleanv): >- (gl::Context::getFloatv): >- (gl::Context::getIntegerv): >- (gl::Context::getQueryParameterInfo): >- (gl::Context::applyRenderTarget): >- (gl::Context::applyState): >- (gl::Context::applyVertexBuffer): >- (gl::Context::applyIndexBuffer): >- (gl::Context::applyShaders): >- (gl::Context::applyTextures): >- (gl::Context::readPixels): >- (gl::Context::clear): >- (gl::Context::drawArrays): >- (gl::Context::drawElements): >- (gl::Context::sync): >- (gl::Context::drawLineLoop): >- (gl::Context::recordInvalidEnum): >- (gl::Context::recordInvalidValue): >- (gl::Context::recordInvalidOperation): >- (gl::Context::recordOutOfMemory): >- (gl::Context::recordInvalidFramebufferOperation): >- (gl::Context::getError): >- (gl::Context::getResetStatus): >- (gl::Context::isResetNotificationEnabled): >- (gl::Context::supportsShaderModel3): >- (gl::Context::getMaximumPointSize): >- (gl::Context::getMaximumVaryingVectors): >- (gl::Context::getMaximumVertexTextureImageUnits): >- (gl::Context::getMaximumCombinedTextureImageUnits): >- (gl::Context::getMaximumFragmentUniformVectors): >- (gl::Context::getMaxSupportedSamples): >- (gl::Context::getNearestSupportedSamples): >- (gl::Context::supportsEventQueries): >- (gl::Context::supportsOcclusionQueries): >- (gl::Context::supportsDXT1Textures): >- (gl::Context::supportsDXT3Textures): >- (gl::Context::supportsDXT5Textures): >- (gl::Context::supportsFloat32Textures): >- (gl::Context::supportsFloat32LinearFilter): >- (gl::Context::supportsFloat32RenderableTextures): >- (gl::Context::supportsFloat16Textures): >- (gl::Context::supportsFloat16LinearFilter): >- (gl::Context::supportsFloat16RenderableTextures): >- (gl::Context::getMaximumRenderbufferDimension): >- (gl::Context::getMaximumTextureDimension): >- (gl::Context::getMaximumCubeTextureDimension): >- (gl::Context::getMaximumTextureLevel): >- (gl::Context::supportsLuminanceTextures): >- (gl::Context::supportsLuminanceAlphaTextures): >- (gl::Context::supportsDepthTextures): >- (gl::Context::supports32bitIndices): >- (gl::Context::supportsNonPower2Texture): >- (gl::Context::supportsInstancing): >- (gl::Context::supportsTextureFilterAnisotropy): >- (gl::Context::supportsDerivativeInstructions): >- (gl::Context::getTextureMaxAnisotropy): >- (gl::Context::getCurrentReadFormatType): >- (gl::Context::detachBuffer): >- (gl::Context::detachTexture): >- (gl::Context::detachFramebuffer): >- (gl::Context::detachRenderbuffer): >- (gl::Context::getIncompleteTexture): >- (gl::Context::skipDraw): >- (gl::Context::isTriangleMode): >- (gl::Context::setVertexAttrib): >- (gl::Context::setVertexAttribDivisor): >- (gl::Context::initExtensionString): >- (gl::Context::getExtensionString): >- (gl::Context::initRendererString): >- (gl::Context::getRendererString): >- (gl::Context::blitFramebuffer): >- (gl::VertexDeclarationCache::VertexDeclarationCache): >- (gl::VertexDeclarationCache::~VertexDeclarationCache): >- (gl::VertexDeclarationCache::applyDeclaration): >- (gl::VertexDeclarationCache::markStateDirty): >- * src/libGLESv2/Context.h: Added. >- (gl::VertexAttribute::VertexAttribute): >- (gl::VertexAttribute::typeSize): >- (gl::VertexAttribute::stride): >- (gl::Context::getBlitter): >- (gl::Context::getDeviceCaps): >- * src/libGLESv2/D3DConstantTable.cpp: Added. >- (gl::D3DConstant::D3DConstant): >- (gl::D3DConstant::~D3DConstant): >- (gl::D3DConstant::addStructMembers): >- (gl::D3DConstantTable::D3DConstantTable): >- (gl::D3DConstantTable::~D3DConstantTable): >- (gl::D3DConstantTable::getConstant): >- (gl::D3DConstantTable::getConstantByName): >- * src/libGLESv2/D3DConstantTable.h: Added. >- (gl::D3DConstantTable::error): >- (gl::D3DConstantTable::constants): >- * src/libGLESv2/Fence.cpp: Added. >- (gl::Fence::Fence): >- (gl::Fence::~Fence): >- (gl::Fence::isFence): >- (gl::Fence::setFence): >- (gl::Fence::testFence): >- (gl::Fence::finishFence): >- (gl::Fence::getFenceiv): >- * src/libGLESv2/Fence.h: Added. >- * src/libGLESv2/Float16ToFloat32.cpp: Added. >- (gl::float16ToFloat32): >- * src/libGLESv2/Float16ToFloat32.py: Added. >- (convertMantissa): >- (convertExponent): >- (convertOffset): >- * src/libGLESv2/Framebuffer.cpp: Added. >- (gl::Framebuffer::Framebuffer): >- (gl::Framebuffer::~Framebuffer): >- (gl::Framebuffer::lookupRenderbuffer): >- (gl::Framebuffer::setColorbuffer): >- (gl::Framebuffer::setDepthbuffer): >- (gl::Framebuffer::setStencilbuffer): >- (gl::Framebuffer::detachTexture): >- (gl::Framebuffer::detachRenderbuffer): >- (gl::Framebuffer::getRenderTargetSerial): >- (gl::Framebuffer::getRenderTarget): >- (gl::Framebuffer::getDepthStencil): >- (gl::Framebuffer::getDepthbufferSerial): >- (gl::Framebuffer::getStencilbufferSerial): >- (gl::Framebuffer::getColorbuffer): >- (gl::Framebuffer::getDepthbuffer): >- (gl::Framebuffer::getStencilbuffer): >- (gl::Framebuffer::getNullColorbuffer): >- (gl::Framebuffer::getColorbufferType): >- (gl::Framebuffer::getDepthbufferType): >- (gl::Framebuffer::getStencilbufferType): >- (gl::Framebuffer::getColorbufferHandle): >- (gl::Framebuffer::getDepthbufferHandle): >- (gl::Framebuffer::getStencilbufferHandle): >- (gl::Framebuffer::hasStencil): >- (gl::Framebuffer::completeness): >- (gl::DefaultFramebuffer::DefaultFramebuffer): >- (gl::Framebuffer::getSamples): >- (gl::DefaultFramebuffer::completeness): >- * src/libGLESv2/Framebuffer.h: Added. >- * src/libGLESv2/HandleAllocator.cpp: Added. >- (gl::HandleAllocator::HandleAllocator): >- (gl::HandleAllocator::~HandleAllocator): >- (gl::HandleAllocator::setBaseHandle): >- (gl::HandleAllocator::allocate): >- (gl::HandleAllocator::release): >- * src/libGLESv2/HandleAllocator.h: Added. >- * src/libGLESv2/IndexDataManager.cpp: Added. >- (gl::IndexDataManager::IndexDataManager): >- (gl::IndexDataManager::~IndexDataManager): >- (gl::convertIndices): >- (gl::computeRange): >- (gl::IndexDataManager::prepareIndexData): >- (gl::IndexDataManager::indexSize): >- (gl::IndexDataManager::typeSize): >- (gl::IndexDataManager::getCountingIndices): >- (gl::IndexBuffer::IndexBuffer): >- (gl::IndexBuffer::~IndexBuffer): >- (gl::IndexBuffer::getBuffer): >- (gl::IndexBuffer::getSerial): >- (gl::IndexBuffer::issueSerial): >- (gl::IndexBuffer::unmap): >- (gl::StreamingIndexBuffer::StreamingIndexBuffer): >- (gl::StreamingIndexBuffer::~StreamingIndexBuffer): >- (gl::StreamingIndexBuffer::map): >- (gl::StreamingIndexBuffer::reserveSpace): >- (gl::StaticIndexBuffer::StaticIndexBuffer): >- (gl::StaticIndexBuffer::~StaticIndexBuffer): >- (gl::StaticIndexBuffer::map): >- (gl::StaticIndexBuffer::reserveSpace): >- (gl::StaticIndexBuffer::lookupType): >- (gl::StaticIndexBuffer::lookupRange): >- (gl::StaticIndexBuffer::addRange): >- * src/libGLESv2/IndexDataManager.h: Added. >- (gl::IndexBuffer::size): >- (gl::StaticIndexBuffer::IndexRange::operator<): >- * src/libGLESv2/Program.cpp: Added. >- (gl::AttributeBindings::AttributeBindings): >- (gl::AttributeBindings::~AttributeBindings): >- (gl::InfoLog::InfoLog): >- (gl::InfoLog::~InfoLog): >- (gl::InfoLog::getLength): >- (gl::InfoLog::getLog): >- (gl::InfoLog::appendSanitized): >- (gl::InfoLog::append): >- (gl::InfoLog::reset): >- (gl::Program::Program): >- (gl::Program::~Program): >- (gl::Program::attachShader): >- (gl::Program::detachShader): >- (gl::Program::getAttachedShadersCount): >- (gl::AttributeBindings::bindAttributeLocation): >- (gl::Program::bindAttributeLocation): >- (gl::Program::link): >- (gl::AttributeBindings::getAttributeBinding): >- (gl::Program::unlink): >- (gl::Program::isLinked): >- (gl::Program::getProgramBinary): >- (gl::Program::setProgramBinary): >- (gl::Program::release): >- (gl::Program::addRef): >- (gl::Program::getRefCount): >- (gl::Program::getProgramBinaryLength): >- (gl::Program::getInfoLogLength): >- (gl::Program::getInfoLog): >- (gl::Program::getAttachedShaders): >- (gl::Program::getActiveAttribute): >- (gl::Program::getActiveAttributeCount): >- (gl::Program::getActiveAttributeMaxLength): >- (gl::Program::getActiveUniform): >- (gl::Program::getActiveUniformCount): >- (gl::Program::getActiveUniformMaxLength): >- (gl::Program::flagForDeletion): >- (gl::Program::isFlaggedForDeletion): >- (gl::Program::validate): >- (gl::Program::isValidated): >- * src/libGLESv2/Program.h: Added. >- * src/libGLESv2/ProgramBinary.cpp: Added. >- (gl::str): >- (gl::Uniform::Uniform): >- (gl::Uniform::~Uniform): >- (gl::Uniform::isArray): >- (gl::UniformLocation::UniformLocation): >- (gl::ProgramBinary::ProgramBinary): >- (gl::ProgramBinary::~ProgramBinary): >- (gl::ProgramBinary::getSerial): >- (gl::ProgramBinary::issueSerial): >- (gl::ProgramBinary::getPixelShader): >- (gl::ProgramBinary::getVertexShader): >- (gl::ProgramBinary::getAttributeLocation): >- (gl::ProgramBinary::getSemanticIndex): >- (gl::ProgramBinary::getUsedSamplerRange): >- (gl::ProgramBinary::usesPointSize): >- (gl::ProgramBinary::getSamplerMapping): >- (gl::ProgramBinary::getSamplerTextureType): >- (gl::ProgramBinary::getUniformLocation): >- (gl::ProgramBinary::setUniform1fv): >- (gl::ProgramBinary::setUniform2fv): >- (gl::ProgramBinary::setUniform3fv): >- (gl::ProgramBinary::setUniform4fv): >- (gl::transposeMatrix): >- (gl::ProgramBinary::setUniformMatrix2fv): >- (gl::ProgramBinary::setUniformMatrix3fv): >- (gl::ProgramBinary::setUniformMatrix4fv): >- (gl::ProgramBinary::setUniform1iv): >- (gl::ProgramBinary::setUniform2iv): >- (gl::ProgramBinary::setUniform3iv): >- (gl::ProgramBinary::setUniform4iv): >- (gl::ProgramBinary::getUniformfv): >- (gl::ProgramBinary::getUniformiv): >- (gl::ProgramBinary::dirtyAllUniforms): >- (gl::ProgramBinary::applyUniforms): >- (gl::ProgramBinary::compileToBinary): >- (gl::ProgramBinary::packVaryings): >- (gl::ProgramBinary::linkVaryings): >- (gl::ProgramBinary::load): >- (gl::ProgramBinary::save): >- (gl::ProgramBinary::getLength): >- (gl::ProgramBinary::link): >- (gl::ProgramBinary::linkAttributes): >- (gl::ProgramBinary::linkUniforms): >- (gl::ProgramBinary::defineUniform): >- (gl::ProgramBinary::createUniform): >- (gl::ProgramBinary::decorateAttribute): >- (gl::ProgramBinary::undecorateUniform): >- (gl::ProgramBinary::applyUniformnbv): >- (gl::ProgramBinary::applyUniformnfv): >- (gl::ProgramBinary::applyUniform1iv): >- (gl::ProgramBinary::applyUniform2iv): >- (gl::ProgramBinary::applyUniform3iv): >- (gl::ProgramBinary::applyUniform4iv): >- (gl::ProgramBinary::applyUniformniv): >- (gl::ProgramBinary::isValidated): >- (gl::ProgramBinary::getActiveAttribute): >- (gl::ProgramBinary::getActiveAttributeCount): >- (gl::ProgramBinary::getActiveAttributeMaxLength): >- (gl::ProgramBinary::getActiveUniform): >- (gl::ProgramBinary::getActiveUniformCount): >- (gl::ProgramBinary::getActiveUniformMaxLength): >- (gl::ProgramBinary::validate): >- (gl::ProgramBinary::validateSamplers): >- (gl::ProgramBinary::getDxDepthRangeLocation): >- (gl::ProgramBinary::getDxDepthLocation): >- (gl::ProgramBinary::getDxCoordLocation): >- (gl::ProgramBinary::getDxHalfPixelSizeLocation): >- (gl::ProgramBinary::getDxFrontCCWLocation): >- (gl::ProgramBinary::getDxPointsOrLinesLocation): >- (gl::ProgramBinary::Sampler::Sampler): >- * src/libGLESv2/ProgramBinary.h: Added. >- (gl::Uniform::RegisterInfo::RegisterInfo): >- (gl::Uniform::RegisterInfo::set): >- (gl::UniformLocation::UniformLocation): >- * src/libGLESv2/Query.cpp: Added. >- (gl::Query::Query): >- (gl::Query::~Query): >- (gl::Query::begin): >- (gl::Query::end): >- (gl::Query::getResult): >- (gl::Query::isResultAvailable): >- (gl::Query::getType): >- (gl::Query::testQuery): >- * src/libGLESv2/Query.h: Added. >- * src/libGLESv2/README: Removed. >- * src/libGLESv2/Renderbuffer.cpp: Added. >- (gl::RenderbufferInterface::RenderbufferInterface): >- (gl::RenderbufferInterface::addProxyRef): >- (gl::RenderbufferInterface::releaseProxy): >- (gl::RenderbufferInterface::getRedSize): >- (gl::RenderbufferInterface::getGreenSize): >- (gl::RenderbufferInterface::getBlueSize): >- (gl::RenderbufferInterface::getAlphaSize): >- (gl::RenderbufferInterface::getDepthSize): >- (gl::RenderbufferInterface::getStencilSize): >- (gl::RenderbufferTexture2D::RenderbufferTexture2D): >- (gl::RenderbufferTexture2D::~RenderbufferTexture2D): >- (gl::RenderbufferTexture2D::addProxyRef): >- (gl::RenderbufferTexture2D::releaseProxy): >- (gl::RenderbufferTexture2D::getRenderTarget): >- (gl::RenderbufferTexture2D::getDepthStencil): >- (gl::RenderbufferTexture2D::getWidth): >- (gl::RenderbufferTexture2D::getHeight): >- (gl::RenderbufferTexture2D::getInternalFormat): >- (gl::RenderbufferTexture2D::getD3DFormat): >- (gl::RenderbufferTexture2D::getSamples): >- (gl::RenderbufferTexture2D::getSerial): >- (gl::RenderbufferTextureCubeMap::RenderbufferTextureCubeMap): >- (gl::RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap): >- (gl::RenderbufferTextureCubeMap::addProxyRef): >- (gl::RenderbufferTextureCubeMap::releaseProxy): >- (gl::RenderbufferTextureCubeMap::getRenderTarget): >- (gl::RenderbufferTextureCubeMap::getDepthStencil): >- (gl::RenderbufferTextureCubeMap::getWidth): >- (gl::RenderbufferTextureCubeMap::getHeight): >- (gl::RenderbufferTextureCubeMap::getInternalFormat): >- (gl::RenderbufferTextureCubeMap::getD3DFormat): >- (gl::RenderbufferTextureCubeMap::getSamples): >- (gl::RenderbufferTextureCubeMap::getSerial): >- (gl::Renderbuffer::Renderbuffer): >- (gl::Renderbuffer::~Renderbuffer): >- (gl::Renderbuffer::addRef): >- (gl::Renderbuffer::release): >- (gl::Renderbuffer::getRenderTarget): >- (gl::Renderbuffer::getDepthStencil): >- (gl::Renderbuffer::getWidth): >- (gl::Renderbuffer::getHeight): >- (gl::Renderbuffer::getInternalFormat): >- (gl::Renderbuffer::getD3DFormat): >- (gl::Renderbuffer::getRedSize): >- (gl::Renderbuffer::getGreenSize): >- (gl::Renderbuffer::getBlueSize): >- (gl::Renderbuffer::getAlphaSize): >- (gl::Renderbuffer::getDepthSize): >- (gl::Renderbuffer::getStencilSize): >- (gl::Renderbuffer::getSamples): >- (gl::Renderbuffer::getSerial): >- (gl::Renderbuffer::setStorage): >- (gl::RenderbufferStorage::RenderbufferStorage): >- (gl::RenderbufferStorage::~RenderbufferStorage): >- (gl::RenderbufferStorage::getRenderTarget): >- (gl::RenderbufferStorage::getDepthStencil): >- (gl::RenderbufferStorage::getWidth): >- (gl::RenderbufferStorage::getHeight): >- (gl::RenderbufferStorage::getInternalFormat): >- (gl::RenderbufferStorage::getD3DFormat): >- (gl::RenderbufferStorage::getSamples): >- (gl::RenderbufferStorage::getSerial): >- (gl::RenderbufferStorage::issueSerial): >- (gl::RenderbufferStorage::issueCubeSerials): >- (gl::Colorbuffer::Colorbuffer): >- (gl::Colorbuffer::~Colorbuffer): >- (gl::Colorbuffer::getRenderTarget): >- (gl::DepthStencilbuffer::DepthStencilbuffer): >- (gl::DepthStencilbuffer::~DepthStencilbuffer): >- (gl::DepthStencilbuffer::getDepthStencil): >- (gl::Depthbuffer::Depthbuffer): >- (gl::Depthbuffer::~Depthbuffer): >- (gl::Stencilbuffer::Stencilbuffer): >- (gl::Stencilbuffer::~Stencilbuffer): >- * src/libGLESv2/Renderbuffer.h: Added. >- (gl::RenderbufferInterface::~RenderbufferInterface): >- * src/libGLESv2/ResourceManager.cpp: Added. >- (gl::ResourceManager::ResourceManager): >- (gl::ResourceManager::~ResourceManager): >- (gl::ResourceManager::addRef): >- (gl::ResourceManager::release): >- (gl::ResourceManager::createBuffer): >- (gl::ResourceManager::createShader): >- (gl::ResourceManager::createProgram): >- (gl::ResourceManager::createTexture): >- (gl::ResourceManager::createRenderbuffer): >- (gl::ResourceManager::deleteBuffer): >- (gl::ResourceManager::deleteShader): >- (gl::ResourceManager::deleteProgram): >- (gl::ResourceManager::deleteTexture): >- (gl::ResourceManager::deleteRenderbuffer): >- (gl::ResourceManager::getBuffer): >- (gl::ResourceManager::getShader): >- (gl::ResourceManager::getTexture): >- (gl::ResourceManager::getProgram): >- (gl::ResourceManager::getRenderbuffer): >- (gl::ResourceManager::setRenderbuffer): >- (gl::ResourceManager::checkBufferAllocation): >- (gl::ResourceManager::checkTextureAllocation): >- (gl::ResourceManager::checkRenderbufferAllocation): >- * src/libGLESv2/ResourceManager.h: Added. >- * src/libGLESv2/Shader.cpp: Added. >- (gl::Shader::Shader): >- (gl::Shader::~Shader): >- (gl::Shader::getHandle): >- (gl::Shader::setSource): >- (gl::Shader::getInfoLogLength): >- (gl::Shader::getInfoLog): >- (gl::Shader::getSourceLength): >- (gl::Shader::getTranslatedSourceLength): >- (gl::Shader::getSourceImpl): >- (gl::Shader::getSource): >- (gl::Shader::getTranslatedSource): >- (gl::Shader::isCompiled): >- (gl::Shader::getHLSL): >- (gl::Shader::addRef): >- (gl::Shader::release): >- (gl::Shader::getRefCount): >- (gl::Shader::isFlaggedForDeletion): >- (gl::Shader::flagForDeletion): >- (gl::Shader::initializeCompiler): >- (gl::Shader::releaseCompiler): >- (gl::Shader::parseVaryings): >- (gl::Shader::uncompile): >- (gl::Shader::compileToHLSL): >- (gl::Shader::parseType): >- (gl::Shader::compareVarying): >- (gl::VertexShader::VertexShader): >- (gl::VertexShader::~VertexShader): >- (gl::VertexShader::getType): >- (gl::VertexShader::uncompile): >- (gl::VertexShader::compile): >- (gl::VertexShader::getSemanticIndex): >- (gl::VertexShader::parseAttributes): >- (gl::FragmentShader::FragmentShader): >- (gl::FragmentShader::~FragmentShader): >- (gl::FragmentShader::getType): >- (gl::FragmentShader::compile): >- * src/libGLESv2/Shader.h: Added. >- (gl::Varying::Varying): >- (gl::Attribute::Attribute): >- * src/libGLESv2/Texture.cpp: Added. >- (gl::ConvertTextureInternalFormat): >- (gl::IsTextureFormatRenderable): >- (gl::GetTextureUsage): >- (gl::MakeValidSize): >- (gl::CopyLockableSurfaces): >- (gl::Image::Image): >- (gl::Image::~Image): >- (gl::Image::redefine): >- (gl::Image::createSurface): >- (gl::Image::lock): >- (gl::Image::unlock): >- (gl::Image::isRenderableFormat): >- (gl::Image::getD3DFormat): >- (gl::Image::getSurface): >- (gl::Image::setManagedSurface): >- (gl::Image::updateSurface): >- (gl::Image::loadData): >- (gl::Image::loadAlphaData): >- (gl::Image::loadAlphaFloatData): >- (gl::Image::loadAlphaHalfFloatData): >- (gl::Image::loadLuminanceData): >- (gl::Image::loadLuminanceFloatData): >- (gl::Image::loadLuminanceHalfFloatData): >- (gl::Image::loadLuminanceAlphaData): >- (gl::Image::loadLuminanceAlphaFloatData): >- (gl::Image::loadLuminanceAlphaHalfFloatData): >- (gl::Image::loadRGBUByteData): >- (gl::Image::loadRGB565Data): >- (gl::Image::loadRGBFloatData): >- (gl::Image::loadRGBHalfFloatData): >- (gl::Image::loadRGBAUByteData): >- (gl::Image::loadRGBA4444Data): >- (gl::Image::loadRGBA5551Data): >- (gl::Image::loadRGBAFloatData): >- (gl::Image::loadRGBAHalfFloatData): >- (gl::Image::loadBGRAData): >- (gl::Image::loadCompressedData): >- (gl::Image::copy): >- (gl::TextureStorage::TextureStorage): >- (gl::TextureStorage::~TextureStorage): >- (gl::TextureStorage::isRenderTarget): >- (gl::TextureStorage::isManaged): >- (gl::TextureStorage::getPool): >- (gl::TextureStorage::getUsage): >- (gl::TextureStorage::getTextureSerial): >- (gl::TextureStorage::issueTextureSerial): >- (gl::TextureStorage::getLodOffset): >- (gl::Texture::Texture): >- (gl::Texture::~Texture): >- (gl::Texture::setMinFilter): >- (gl::Texture::setMagFilter): >- (gl::Texture::setWrapS): >- (gl::Texture::setWrapT): >- (gl::Texture::setMaxAnisotropy): >- (gl::Texture::setUsage): >- (gl::Texture::getMinFilter): >- (gl::Texture::getMagFilter): >- (gl::Texture::getWrapS): >- (gl::Texture::getWrapT): >- (gl::Texture::getMaxAnisotropy): >- (gl::Texture::getUsage): >- (gl::Texture::isMipmapFiltered): >- (gl::Texture::setImage): >- (gl::Texture::setCompressedImage): >- (gl::Texture::subImage): >- (gl::Texture::subImageCompressed): >- (gl::Texture::getTexture): >- (gl::Texture::hasDirtyParameters): >- (gl::Texture::hasDirtyImages): >- (gl::Texture::resetDirty): >- (gl::Texture::getTextureSerial): >- (gl::Texture::getRenderTargetSerial): >- (gl::Texture::isImmutable): >- (gl::Texture::getLodOffset): >- (gl::Texture::creationLevels): >- (gl::Texture::levelCount): >- (gl::Texture::getBlitter): >- (gl::Texture::copyToRenderTarget): >- (gl::TextureStorage2D::TextureStorage2D): >- (gl::TextureStorage2D::~TextureStorage2D): >- (gl::TextureStorage2D::getSurfaceLevel): >- (gl::TextureStorage2D::getBaseTexture): >- (gl::TextureStorage2D::getRenderTargetSerial): >- (gl::Texture2D::Texture2D): >- (gl::Texture2D::~Texture2D): >- (gl::Texture2D::addProxyRef): >- (gl::Texture2D::releaseProxy): >- (gl::Texture2D::getTarget): >- (gl::Texture2D::getWidth): >- (gl::Texture2D::getHeight): >- (gl::Texture2D::getInternalFormat): >- (gl::Texture2D::getD3DFormat): >- (gl::Texture2D::redefineImage): >- (gl::Texture2D::setImage): >- (gl::Texture2D::bindTexImage): >- (gl::Texture2D::releaseTexImage): >- (gl::Texture2D::setCompressedImage): >- (gl::Texture2D::commitRect): >- (gl::Texture2D::subImage): >- (gl::Texture2D::subImageCompressed): >- (gl::Texture2D::copyImage): >- (gl::Texture2D::copySubImage): >- (gl::Texture2D::storage): >- (gl::Texture2D::isSamplerComplete): >- (gl::Texture2D::isMipmapComplete): >- (gl::Texture2D::isCompressed): >- (gl::Texture2D::isDepth): >- (gl::Texture2D::getBaseTexture): >- (gl::Texture2D::createTexture): >- (gl::Texture2D::updateTexture): >- (gl::Texture2D::convertToRenderTarget): >- (gl::Texture2D::generateMipmaps): >- (gl::Texture2D::getRenderbuffer): >- (gl::Texture2D::getRenderTarget): >- (gl::Texture2D::getDepthStencil): >- (gl::Texture2D::getStorage): >- (gl::TextureStorageCubeMap::TextureStorageCubeMap): >- (gl::TextureStorageCubeMap::~TextureStorageCubeMap): >- (gl::TextureStorageCubeMap::getCubeMapSurface): >- (gl::TextureStorageCubeMap::getBaseTexture): >- (gl::TextureStorageCubeMap::getRenderTargetSerial): >- (gl::TextureCubeMap::TextureCubeMap): >- (gl::TextureCubeMap::~TextureCubeMap): >- (gl::TextureCubeMap::addProxyRef): >- (gl::TextureCubeMap::releaseProxy): >- (gl::TextureCubeMap::getTarget): >- (gl::TextureCubeMap::getWidth): >- (gl::TextureCubeMap::getHeight): >- (gl::TextureCubeMap::getInternalFormat): >- (gl::TextureCubeMap::getD3DFormat): >- (gl::TextureCubeMap::setImagePosX): >- (gl::TextureCubeMap::setImageNegX): >- (gl::TextureCubeMap::setImagePosY): >- (gl::TextureCubeMap::setImageNegY): >- (gl::TextureCubeMap::setImagePosZ): >- (gl::TextureCubeMap::setImageNegZ): >- (gl::TextureCubeMap::setCompressedImage): >- (gl::TextureCubeMap::commitRect): >- (gl::TextureCubeMap::subImage): >- (gl::TextureCubeMap::subImageCompressed): >- (gl::TextureCubeMap::isSamplerComplete): >- (gl::TextureCubeMap::isCubeComplete): >- (gl::TextureCubeMap::isMipmapCubeComplete): >- (gl::TextureCubeMap::isCompressed): >- (gl::TextureCubeMap::getBaseTexture): >- (gl::TextureCubeMap::createTexture): >- (gl::TextureCubeMap::updateTexture): >- (gl::TextureCubeMap::convertToRenderTarget): >- (gl::TextureCubeMap::setImage): >- (gl::TextureCubeMap::faceIndex): >- (gl::TextureCubeMap::redefineImage): >- (gl::TextureCubeMap::copyImage): >- (gl::TextureCubeMap::copySubImage): >- (gl::TextureCubeMap::storage): >- (gl::TextureCubeMap::generateMipmaps): >- (gl::TextureCubeMap::getRenderbuffer): >- (gl::TextureCubeMap::getRenderTarget): >- (gl::TextureCubeMap::getStorage): >- * src/libGLESv2/Texture.h: Added. >- (gl::Image::markDirty): >- (gl::Image::markClean): >- (gl::Image::getWidth): >- (gl::Image::getHeight): >- (gl::Image::getInternalFormat): >- (gl::Image::isDirty): >- * src/libGLESv2/TextureSSE2.cpp: Added. >- (gl::Image::loadRGBAUByteDataSSE2): >- (gl::Image::loadAlphaDataSSE2): >- * src/libGLESv2/VertexDataManager.cpp: Added. >- (gl::elementsInBuffer): >- (gl::VertexDataManager::VertexDataManager): >- (gl::VertexDataManager::~VertexDataManager): >- (gl::VertexDataManager::writeAttributeData): >- (gl::VertexDataManager::prepareVertexData): >- (gl::VertexDataManager::spaceRequired): >- (gl::VertexDataManager::checkVertexCaps): >- (gl::VertexDataManager::typeIndex): >- (gl::VertexBuffer::VertexBuffer): >- (gl::VertexBuffer::~VertexBuffer): >- (gl::VertexBuffer::unmap): >- (gl::VertexBuffer::getBuffer): >- (gl::VertexBuffer::getSerial): >- (gl::VertexBuffer::issueSerial): >- (gl::ArrayVertexBuffer::ArrayVertexBuffer): >- (gl::ArrayVertexBuffer::~ArrayVertexBuffer): >- (gl::ArrayVertexBuffer::addRequiredSpace): >- (gl::StreamingVertexBuffer::StreamingVertexBuffer): >- (gl::StreamingVertexBuffer::~StreamingVertexBuffer): >- (gl::StreamingVertexBuffer::map): >- (gl::StreamingVertexBuffer::reserveRequiredSpace): >- (gl::StaticVertexBuffer::StaticVertexBuffer): >- (gl::StaticVertexBuffer::~StaticVertexBuffer): >- (gl::StaticVertexBuffer::map): >- (gl::StaticVertexBuffer::reserveRequiredSpace): >- (gl::StaticVertexBuffer::lookupAttribute): >- (gl::VertexDataManager::formatConverter): >- * src/libGLESv2/VertexDataManager.h: Added. >- (gl::ArrayVertexBuffer::size): >- (gl::VertexDataManager::dirtyCurrentValue): >- * src/libGLESv2/libGLESv2.cpp: Added. >- (validImageSize): >- (checkTextureFormatType): >- (validateSubImageParams2D): >- (validateSubImageParamsCube): >- (validReadFormatType): >- * src/libGLESv2/libGLESv2.def: Added. >- * src/libGLESv2/libGLESv2.rc: Added. >- * src/libGLESv2/libGLESv2.vcxproj: Added. >- * src/libGLESv2/libGLESv2.vcxproj.filters: Added. >- * src/libGLESv2/main.cpp: Added. >- (DllMain): >- (gl::makeCurrent): >- (gl::getContext): >- (gl::getNonLostContext): >- (gl::getDisplay): >- (gl::getDevice): >- (gl::checkDeviceLost): >- (error): >- * src/libGLESv2/main.h: Added. >- (error): >- * src/libGLESv2/mathutil.h: Added. >- (gl::Vector4::Vector4): >- (gl::isPow2): >- (gl::log2): >- (gl::ceilPow2): >- (gl::clamp): >- (gl::clamp01): >- (gl::unorm): >- (gl::supportsSSE2): >- (gl::float32ToFloat16): >- * src/libGLESv2/resource.h: Added. >- * src/libGLESv2/shaders: Added. >- * src/libGLESv2/shaders/Blit.ps: Added. >- * src/libGLESv2/shaders/Blit.vs: Added. >- * src/libGLESv2/shaders/componentmaskps.h: Added. >- * src/libGLESv2/shaders/flipyvs.h: Added. >- * src/libGLESv2/shaders/generate_shaders.bat: Added. >- * src/libGLESv2/shaders/luminanceps.h: Added. >- * src/libGLESv2/shaders/passthroughps.h: Added. >- * src/libGLESv2/shaders/standardvs.h: Added. >- * src/libGLESv2/utilities.cpp: Added. >- (gl::UniformExternalComponentCount): >- (gl::UniformInternalComponentCount): >- (gl::UniformComponentType): >- (gl::UniformComponentSize): >- (gl::UniformInternalSize): >- (gl::UniformExternalSize): >- (gl::VariableRowCount): >- (gl::VariableColumnCount): >- (gl::AllocateFirstFreeBits): >- (gl::ComputePitch): >- (gl::ComputeCompressedPitch): >- (gl::ComputeCompressedSize): >- (gl::IsCompressed): >- (gl::IsDepthTexture): >- (gl::IsStencilTexture): >- (gl::ComputePixelSize): >- (gl::IsCubemapTextureTarget): >- (gl::IsInternalTextureTarget): >- (gl::ConvertSizedInternalFormat): >- (gl::ExtractFormat): >- (gl::ExtractType): >- (gl::IsColorRenderable): >- (gl::IsDepthRenderable): >- (gl::IsStencilRenderable): >- (gl::IsFloat32Format): >- (gl::IsFloat16Format): >- (es2dx::ConvertComparison): >- (es2dx::ConvertColor): >- (es2dx::ConvertBlendFunc): >- (es2dx::ConvertBlendOp): >- (es2dx::ConvertStencilOp): >- (es2dx::ConvertTextureWrap): >- (es2dx::ConvertCullMode): >- (es2dx::ConvertCubeFace): >- (es2dx::ConvertColorMask): >- (es2dx::ConvertMagFilter): >- (es2dx::ConvertMinFilter): >- (es2dx::ConvertPrimitiveType): >- (es2dx::ConvertRenderbufferFormat): >- (es2dx::GetMultisampleTypeFromSamples): >- (dx2es::GetStencilSize): >- (dx2es::GetAlphaSize): >- (dx2es::GetRedSize): >- (dx2es::GetGreenSize): >- (dx2es::GetBlueSize): >- (dx2es::GetDepthSize): >- (dx2es::GetSamplesFromMultisampleType): >- (dx2es::IsFormatChannelEquivalent): >- (dx2es::ConvertReadBufferFormat): >- (dx2es::ConvertBackBufferFormat): >- (dx2es::ConvertDepthStencilFormat): >- (dx::IsCompressedFormat): >- (dx::ComputeRowSize): >- (getTempPath): >- (writeFile): >- * src/libGLESv2/utilities.h: Added. >- (isDeviceLostError): >- * src/libGLESv2/vertexconversion.h: Added. >- (gl::Identity::convert): >- (gl::Cast::convert): >- (gl::Normalize::convert): >- (gl::FixedToFloat::convert): >- (gl::SimpleDefaultValues::zero): >- (gl::SimpleDefaultValues::one): >- (gl::NormalizedDefaultValues::zero): >- (gl::NormalizedDefaultValues::one): >- (gl::VertexDataConverter::convertArray): >- (gl::VertexDataConverter::pointerAddBytes): >- (gl::VertexDataConverter::copyComponent): >- >-2013-07-17 Alex Christensen <achristensen@apple.com> >- >- Made a repeatable process for updating ANGLE that does not include manually editing any files. >- https://bugs.webkit.org/show_bug.cgi?id=118815 >- >- Reviewed by Dean Jackson. >- >- * src/compiler/glslang.y: >- * src/compiler/glslang_lex.cpp: >- * src/compiler/glslang_tab.cpp: >- * src/compiler/glslang_tab.h: Put YYLTYPE definition in %union instead of prologue and ran Bison. >- >-2013-07-16 Alex Christensen <achristensen@apple.com> >- >- Update ANGLE from r1987 to r2426 while keeping these changes: >- Keeping #if defined(_MSC_VER) around #pragma warning(disable: 4718) in DependencyGraph.cpp. >- Keeping include khrplatform.h instead of KHR/khrplatform.h in ShaderLang.h. >- Added static_casts in Intermediate.cpp to fix compiling on Mac. >- Changed enum bit fields to just enums for GCC in Types.h to fix compiling for GTK. >- Ran Bison on Mac after removing the unsupported %code tag (See diff uploaded to bug for details). >- Added YYLTYPE definition to glslang_tab.h which would have been put there by the unsupported %code tag. >- >- https://bugs.webkit.org/show_bug.cgi?id=118550 >- >- Reviewed by Dean Jackson. >- >- * ANGLE.plist: Updated revision of ANGLE to 2426. >- * ANGLE.xcodeproj/project.pbxproj: >- * GNUmakefile.am: >- * Target.pri: >- Renamed DetectRecursion to DetectCallDepth and added builtin_symbol_table. >- * include/GLSLANG/ShaderLang.h: >- * src/common/version.h: >- * src/compiler/BaseTypes.h: >- (getQualifierString): >- * src/compiler/Common.h: >- * src/compiler/Compiler.cpp: >- (TCompiler::TCompiler): >- (TCompiler::Init): >- (TCompiler::compile): >- (TCompiler::detectCallDepth): >- (TCompiler::enforceTimingRestrictions): >- (TCompiler::limitExpressionComplexity): >- * src/compiler/ConstantUnion.h: >- (ConstantUnion::ConstantUnion): >- * src/compiler/DetectCallDepth.cpp: Added. >- (DetectCallDepth::FunctionNode::FunctionNode): >- (DetectCallDepth::FunctionNode::getName): >- (DetectCallDepth::FunctionNode::addCallee): >- (DetectCallDepth::FunctionNode::detectCallDepth): >- (DetectCallDepth::FunctionNode::reset): >- (DetectCallDepth::DetectCallDepth): >- (DetectCallDepth::~DetectCallDepth): >- (DetectCallDepth::visitAggregate): >- (DetectCallDepth::checkExceedsMaxDepth): >- (DetectCallDepth::resetFunctionNodes): >- (DetectCallDepth::detectCallDepthForFunction): >- (DetectCallDepth::detectCallDepth): >- (DetectCallDepth::findFunctionByName): >- * src/compiler/DetectCallDepth.h: Added. >- (DetectCallDepth::getInfoSink): >- * src/compiler/DetectRecursion.cpp: Removed. >- * src/compiler/DetectRecursion.h: Removed. >- * src/compiler/Diagnostics.cpp: >- (TDiagnostics::writeInfo): >- * src/compiler/ForLoopUnroll.cpp: >- (ForLoopUnroll::evaluateIntConstant): >- * src/compiler/InfoSink.cpp: >- (TInfoSinkBase::prefix): >- (TInfoSinkBase::location): >- (TInfoSinkBase::message): >- * src/compiler/InfoSink.h: >- * src/compiler/Initialize.cpp: >- (TBuiltIns::initialize): >- (IdentifyBuiltIns): >- (InitExtensionBehavior): >- * src/compiler/Intermediate.cpp: Updated and added static_casts to fix build errors on Mac. >- (TIntermediate::addSymbol): >- (TIntermediate::addBinaryMath): >- (TIntermediate::addAssign): >- (TIntermediate::addIndex): >- (TIntermediate::addUnaryMath): >- (TIntermediate::setAggregateOperator): >- (TIntermediate::addConversion): >- (TIntermediate::growAggregate): >- (TIntermediate::makeAggregate): >- (TIntermediate::addSelection): >- (TIntermediate::addComma): >- (TIntermediate::addConstantUnion): >- (TIntermediate::addSwizzle): >- (TIntermediate::addLoop): >- (TIntermediate::addBranch): >- (TIntermUnary::promote): >- (TIntermBinary::promote): >- (CompareStruct): >- (CompareStructure): >- (TIntermConstantUnion::fold): >- (TIntermediate::promoteConstantUnion): >- * src/compiler/OutputGLSL.cpp: >- (TOutputGLSL::visitSymbol): >- * src/compiler/OutputGLSL.h: >- * src/compiler/OutputGLSLBase.cpp: >- (TOutputGLSLBase::writeVariableType): >- (TOutputGLSLBase::writeConstantUnion): >- (TOutputGLSLBase::visitBinary): >- (TOutputGLSLBase::visitAggregate): >- (TOutputGLSLBase::getTypeName): >- (TOutputGLSLBase::hashFunctionName): >- (TOutputGLSLBase::structDeclared): >- (TOutputGLSLBase::declareStruct): >- * src/compiler/OutputGLSLBase.h: >- * src/compiler/OutputHLSL.cpp: >- (sh::OutputHLSL::OutputHLSL): >- (sh::OutputHLSL::header): >- (sh::OutputHLSL::visitSymbol): >- (sh::OutputHLSL::visitBinary): >- (sh::OutputHLSL::visitAggregate): >- (sh::OutputHLSL::visitSelection): >- (sh::OutputHLSL::visitLoop): >- (sh::OutputHLSL::handleExcessiveLoop): >- (sh::OutputHLSL::typeString): >- (sh::OutputHLSL::initializer): >- (sh::OutputHLSL::addConstructor): >- (sh::OutputHLSL::writeConstantUnion): >- (sh::OutputHLSL::decorateField): >- * src/compiler/OutputHLSL.h: >- * src/compiler/ParseHelper.cpp: >- (TParseContext::parseVectorFields): >- (TParseContext::parseMatrixFields): >- (TParseContext::error): >- (TParseContext::warning): >- (TParseContext::assignError): >- (TParseContext::unaryOpError): >- (TParseContext::binaryOpError): >- (TParseContext::precisionErrorCheck): >- (TParseContext::lValueErrorCheck): >- (TParseContext::globalErrorCheck): >- (TParseContext::reservedErrorCheck): >- (TParseContext::constructorErrorCheck): >- (TParseContext::voidErrorCheck): >- (TParseContext::boolErrorCheck): >- (TParseContext::samplerErrorCheck): >- (TParseContext::structQualifierErrorCheck): >- (TParseContext::parameterSamplerErrorCheck): >- (TParseContext::containsSampler): >- (TParseContext::arraySizeErrorCheck): >- (TParseContext::arrayQualifierErrorCheck): >- (TParseContext::arrayTypeErrorCheck): >- (TParseContext::arrayErrorCheck): >- (TParseContext::nonInitConstErrorCheck): >- (TParseContext::nonInitErrorCheck): >- (TParseContext::paramErrorCheck): >- (TParseContext::extensionErrorCheck): >- (TParseContext::findFunction): >- (TParseContext::isVariableBuiltIn): >- (TParseContext::executeInitializer): >- (TParseContext::addConstructor): >- (TParseContext::constructBuiltIn): >- (TParseContext::constructStruct): >- (TParseContext::addConstVectorNode): >- (TParseContext::addConstMatrixNode): >- (TParseContext::addConstArrayNode): >- (TParseContext::addConstStruct): >- (TParseContext::enterStructDeclaration): >- (TParseContext::structNestingErrorCheck): >- * src/compiler/ParseHelper.h: >- (TParseContext::TParseContext): >- (TParseContext::pragma): >- * src/compiler/PoolAlloc.cpp: >- (TPoolAllocator::allocate): >- * src/compiler/ShHandle.h: >- * src/compiler/ShaderLang.cpp: >- (ShInitBuiltInResources): >- * src/compiler/SymbolTable.cpp: >- (TType::TType): >- (TType::buildMangledName): >- (TType::getObjectSize): >- (TStructure::containsArrays): >- (TStructure::buildMangledName): >- (TStructure::calculateObjectSize): >- (TStructure::calculateDeepestNesting): >- (TSymbolTableLevel::relateToExtension): >- * src/compiler/SymbolTable.h: >- (TSymbol::relateToExtension): >- (TSymbol::getExtension): >- (TVariable::TVariable): >- (TVariable::setQualifier): >- (TVariable::shareConstPointer): >- * src/compiler/Types.h: Updated and changed enum bit fields to enums to fix compiling with GCC. >- (TField::TField): >- (TField::type): >- (TField::name): >- (NewPoolTFieldList): >- (TStructure::TStructure): >- (TStructure::name): >- (TStructure::fields): >- (TStructure::mangledName): >- (TStructure::objectSize): >- (TStructure::deepestNesting): >- (TType::TType): >- (TType::clearArrayness): >- (TType::getStruct): >- (TType::setStruct): >- (TType::getMangledName): >- (TType::getDeepestStructNesting): >- (TType::isStructureContainingArrays): >- (TPublicType::setBasic): >- * src/compiler/VariableInfo.cpp: >- (getUserDefinedVariableInfo): >- * src/compiler/builtin_symbol_table.cpp: Added. >- (builtin1): >- (builtin2): >- (builtin3): >- (InsertBuiltInFunctionsCommon): >- (InsertBuiltInFunctionsVertex): >- * src/compiler/builtin_symbol_table.h: Added. >- * src/compiler/glslang.l: >- * src/compiler/glslang.y: >- * src/compiler/glslang_lex.cpp: >- (yy_get_previous_state): >- (yy_try_NUL_trans): >- (yyget_lloc): >- (yyset_lloc): >- (string_input): >- (check_type): >- (reserved_word): >- (glslang_scan): >- * src/compiler/glslang_tab.cpp: >- (yysyntax_error): >- (yyerror): >- (glslang_parse): >- * src/compiler/glslang_tab.h: Readded YYLTYPE definition after Bison removed it. >- * src/compiler/intermOut.cpp: >- (TOutputTraverser::visitUnary): >- (TOutputTraverser::visitAggregate): >- (TOutputTraverser::visitConstantUnion): >- * src/compiler/intermediate.h: >- (TIntermNode::TIntermNode): >- (TIntermNode::~TIntermNode): >- (TIntermNode::getLine): >- (TIntermNode::setLine): >- (TIntermNode::getAsLoopNode): >- (TIntermConstantUnion::getIConst): >- (TIntermConstantUnion::getFConst): >- (TIntermConstantUnion::getBConst): >- (TIntermAggregate::TIntermAggregate): >- (TIntermTraverser::TIntermTraverser): >- (TIntermTraverser::getMaxDepth): >- (TIntermTraverser::incrementDepth): >- * src/compiler/localintermediate.h: >- * src/compiler/parseConst.cpp: >- (TConstTraverser::visitSymbol): >- (TConstTraverser::visitBinary): >- (TConstTraverser::visitUnary): >- (TConstTraverser::visitAggregate): >- (TConstTraverser::visitSelection): >- (TConstTraverser::visitConstantUnion): >- (TConstTraverser::visitLoop): >- (TConstTraverser::visitBranch): >- (TIntermediate::parseConstTree): >- * src/compiler/preprocessor/ExpressionParser.cpp: >- * src/compiler/timing/RestrictVertexShaderTiming.cpp: >- (RestrictVertexShaderTiming::visitSymbol): >- Updated ANGLE to r2426 and ran Bison. >- >-2013-06-17 Darin Adler <darin@apple.com> >- >- Sort all the Xcode project files >- https://bugs.webkit.org/show_bug.cgi?id=117696 >- >- Reviewed by Anders Carlsson. >- >- * ANGLE.xcodeproj/project.pbxproj: Ran the sort-Xcode-project-file script. >- >-2013-04-18 Krzysztof Wolanski <k.wolanski@samsung.com> >- >- Add checking whether the compiler allows to use #pragma directive. >- https://bugs.webkit.org/show_bug.cgi?id=114740 >- >- Reviewed by Andreas Kling. >- >- Some compilers may complain that #pragma warning is an undefined macro. >- >- * src/compiler/depgraph/DependencyGraph.cpp: >- >-2013-04-11 Andras Becsi <andras.becsi@digia.com> >- >- [Qt][Mac] Linking fails with Qt 5.1 >- https://bugs.webkit.org/show_bug.cgi?id=114435 >- >- Reviewed by Tor Arne Vestbø. >- >- Qt 5.1 enables C++11 by default when using clang on Mac >- and links against the libc++ standard library. As a result >- building the QtWebKit shared library fails when linking >- agains the ANGLE intermediate static library because libc++ >- misses some symbols needed by ANGLE. >- Disable C++11 for the ANGLE intermediate library to fix the build. >- >- * ANGLE.pri: >- >-2013-04-10 Benjamin Poulain <bpoulain@apple.com> >- >- Mass remove all the empty directories >- >- Rubberstamped by Ryosuke Niwa. >- >- * src/libGLESv2/geometry: Removed. >- >-2013-04-08 Ryosuke Niwa <rniwa@webkit.org> >- >- Remove ANGLE.gyp >- https://bugs.webkit.org/show_bug.cgi?id=114245 >- >- Unreviewed. Just removing an empty directory. >- >- * ANGLE.gyp: Removed. >- >-2013-04-04 Martin Robinson <mrobinson@igalia.com> >- >- [GTK] Remove the gyp build >- https://bugs.webkit.org/show_bug.cgi?id=113942 >- >- Reviewed by Gustavo Noronha Silva. >- >- * ANGLE.gyp/ANGLE.gyp: Removed. >- * ANGLE.gypi: Removed. >- >-2013-03-20 Zan Dobersek <zdobersek@igalia.com> >- >- [GTK] Build ANGLE sources into a separate library from libWebCore.la >- https://bugs.webkit.org/show_bug.cgi?id=112778 >- >- Reviewed by Martin Robinson. >- >- * GNUmakefile.am: Added, sets up the libANGLE.la library. >- >-2013-03-05 Kenneth Russell <kbr@google.com> >- >- Upgrade ANGLE to r1987 >- https://bugs.webkit.org/show_bug.cgi?id=111381 >- >- Reviewed by Dean Jackson. >- >- * include/GLSLANG/ShaderLang.h: >- * src/common/version.h: >- * src/compiler/Compiler.cpp: >- (TCompiler::TCompiler): >- (TCompiler::Init): >- (TCompiler::compile): >- * src/compiler/ParseHelper.h: >- (TParseContext): >- * src/compiler/ShHandle.h: >- (TCompiler): >- * src/compiler/ShaderLang.cpp: >- (ShInitBuiltInResources): >- * src/compiler/UnfoldShortCircuit.cpp: >- (sh::UnfoldShortCircuit::visitSelection): >- * src/compiler/glslang.l: >- * src/compiler/glslang.y: >- * src/compiler/glslang_lex.cpp: >- (glslang_scan): >- * src/compiler/glslang_tab.cpp: >- Updated ANGLE to r1987. >- >-2013-03-01 Martin Robinson <mrobinson@igalia.com> >- >- [GTK] Add ANGLE to the GTK+ gyp build >- https://bugs.webkit.org/show_bug.cgi?id=111128 >- >- Reviewed by Dirk Pranke. >- >- Add files that build an ANGLE static library for GTK+ using gyp. >- >- * ANGLE.gyp/ANGLE.gyp: Added. >- * ANGLE.gypi: Added. >- >-2013-02-22 Kenneth Russell <kbr@google.com> >- >- Mac OS build broken by new ExpressionParser.cpp >- https://bugs.webkit.org/show_bug.cgi?id=110629 >- >- Unreviewed build fix. Regenerated ExpressionParser with Bison 2.3. >- >- * src/compiler/preprocessor/ExpressionParser.cpp: >- >-2013-02-21 Zhenyao Mo <zmo@google.com> >- >- Roll ANGLE to r1833 >- https://bugs.webkit.org/show_bug.cgi?id=110513 >- >- Reviewed by Kenneth Russell. >- >- Upstream ANGLE r1833 includes webkit side local fixes >- 1) r139758 build fix for -Wshorten-64-to-32 >- 2) r139665 build fix for uninitialized variables >- >- After this roll, WebKit side ANGLE is the same as upstream ANGLE r1833, except: >- 1) include/GLSLANG/ShaderLang.h, where "KHR" is removed from include path. >- >- With this roll, we have EXT_draw_buffers support. >- >- * ANGLE.xcodeproj/project.pbxproj: >- * Target.pri: >- * include/GLSLANG/ShaderLang.h: >- * src/common/debug.cpp: >- * src/common/system.h: Added. >- * src/common/version.h: >- * src/compiler/ArrayBoundsClamper.cpp: Removed. >- * src/compiler/ArrayBoundsClamper.h: Removed. >- * src/compiler/Compiler.cpp: >- (TCompiler::TCompiler): >- (TCompiler::Init): >- (TCompiler::compile): >- (TCompiler::getArrayBoundsClamper): >- (TCompiler::getArrayIndexClampingStrategy): >- (TCompiler::getBuiltInFunctionEmulator): >- * src/compiler/DetectDiscontinuity.cpp: >- (sh::DetectLoopDiscontinuity::traverse): >- (sh::DetectLoopDiscontinuity::visitLoop): >- (sh): >- (sh::DetectLoopDiscontinuity::visitBranch): >- * src/compiler/DetectDiscontinuity.h: >- (DetectLoopDiscontinuity): >- * src/compiler/Initialize.cpp: >- (InitExtensionBehavior): >- * src/compiler/Intermediate.cpp: >- (TIntermConstantUnion::fold): >- (TIntermTraverser::hash): >- * src/compiler/MapLongVariableNames.cpp: >- (LongNameMap::Size): >- (MapLongVariableNames::mapGlobalLongName): >- * src/compiler/MapLongVariableNames.h: >- (LongNameMap): >- * src/compiler/OutputESSL.cpp: >- (TOutputESSL::TOutputESSL): >- * src/compiler/OutputESSL.h: >- (TOutputESSL): >- * src/compiler/OutputGLSL.cpp: >- (TOutputGLSL::TOutputGLSL): >- * src/compiler/OutputGLSL.h: >- (TOutputGLSL): >- * src/compiler/OutputGLSLBase.cpp: >- (TOutputGLSLBase::TOutputGLSLBase): >- (TOutputGLSLBase::writeConstantUnion): >- (TOutputGLSLBase::visitBinary): >- * src/compiler/OutputGLSLBase.h: >- (TOutputGLSLBase): >- * src/compiler/OutputHLSL.cpp: >- (sh::OutputHLSL::output): >- (sh::OutputHLSL::visitLoop): >- (sh::OutputHLSL::writeConstantUnion): >- * src/compiler/ParseHelper.cpp: >- (TParseContext::constructorErrorCheck): >- (PaParseStrings): >- * src/compiler/ParseHelper.h: >- * src/compiler/ShHandle.h: >- (TCompiler): >- * src/compiler/ShaderLang.cpp: >- (checkActiveUniformAndAttribMaxLengths): >- (checkMappedNameMaxLength): >- (getVariableInfo): >- (ShInitBuiltInResources): >- (ShCompile): >- (ShGetInfo): >- (ShGetActiveAttrib): >- (ShGetActiveUniform): >- (ShGetNameHashingEntry): >- * src/compiler/SymbolTable.h: >- (TFunction::getParamCount): >- (TFunction::getParam): >- (TSymbolTable::setDefaultPrecision): >- * src/compiler/TranslatorESSL.cpp: >- (TranslatorESSL::translate): >- * src/compiler/TranslatorGLSL.cpp: >- (TranslatorGLSL::translate): >- * src/compiler/ValidateLimitations.cpp: >- (ValidateLimitations::validateFunctionCall): >- * src/compiler/VariablePacker.cpp: >- (VariablePacker::GetNumRows): >- * src/compiler/glslang.h: >- * src/compiler/glslang.l: >- * src/compiler/glslang.y: >- * src/compiler/glslang_lex.cpp: >- (string_input): >- (glslang_scan): >- * src/compiler/glslang_tab.cpp: >- * src/compiler/preprocessor/ExpressionParser.cpp: >- * src/compiler/preprocessor/ExpressionParser.y: >- * src/compiler/preprocessor/Input.cpp: >- (pp::Input::Input): >- (pp::Input::read): >- * src/compiler/preprocessor/Input.h: >- (Input): >- (pp::Input::count): >- (pp::Input::string): >- (pp::Input::length): >- (Location): >- * src/compiler/preprocessor/Preprocessor.cpp: >- (pp::Preprocessor::init): >- * src/compiler/preprocessor/Preprocessor.h: >- (Preprocessor): >- * src/compiler/preprocessor/Tokenizer.cpp: >- (pp::Tokenizer::init): >- * src/compiler/preprocessor/Tokenizer.h: >- (Tokenizer): >- * src/compiler/preprocessor/Tokenizer.l: >- * src/third_party: Added. >- * src/third_party/compiler: Added. >- * src/third_party/compiler/ArrayBoundsClamper.cpp: Added. >- (ArrayBoundsClamper::ArrayBoundsClamper): >- (ArrayBoundsClamper::SetClampingStrategy): >- (ArrayBoundsClamper::MarkIndirectArrayBoundsForClamping): >- (ArrayBoundsClamper::OutputClampingFunctionDefinition): >- * src/third_party/compiler/ArrayBoundsClamper.h: Added. >- (ArrayBoundsClamper): >- (ArrayBoundsClamper::Cleanup): >- (ArrayBoundsClamper::GetArrayBoundsClampDefinitionNeeded): >- (ArrayBoundsClamper::SetArrayBoundsClampDefinitionNeeded): >- * src/third_party/compiler/LICENSE: Added. >- * src/third_party/compiler/README.angle: Added. >- >-2013-02-04 David Kilzer <ddkilzer@apple.com> >- >- Sort ANGLE Xcode project file. >- >- * ANGLE.xcodeproj/project.pbxproj: >- >-2013-01-30 David Kilzer <ddkilzer@apple.com> >- >- Remove useless comment from Base.xcconfig >- >- Rubber-stamped by Mark Rowe. >- >- * Configurations/Base.xcconfig: Remove comment. >- >-2013-01-16 Allan Sandfeld Jensen <allan.jensen@digia.com> >- >- Doesn't build with GCC 4.7+ >- https://bugs.webkit.org/show_bug.cgi?id=106999 >- >- Reviewed by Csaba Osztrogonác. >- >- Correct __GNU_C_MINOR__ macro to __GNUC_MINOR__. >- >- * src/compiler/preprocessor/ExpressionParser.y: >- >-2013-01-15 David Kilzer <ddkilzer@apple.com> >- >- BUILD FIX: Add SUPPORTED_PLATFORMS to Base.xcconfig >- >- * Configurations/Base.xcconfig: Add SUPPORTED_PLATFORMS so that >- Xcode knows we can build this project for all three platforms. >- Previously the Mac OS X SDKs were missing in the scheme picker. >- >-2013-01-15 David Kilzer <ddkilzer@apple.com> >- >- Upstream iOS changes for ANGLE project >- <http://webkit.org/b/106913> >- >- Reviewed by Joseph Pecoraro. >- >- * ANGLE.xcodeproj/project.pbxproj: >- - Use $(INSTALL_PATH_PREFIX) with CopyFiles build phase paths. >- - Add iOS.xcconfig to project. >- * Configurations/ANGLE.xcconfig: >- - Use INSTALL_PATH_ACTUAL instead of INSTALL_PATH. (See below.) >- - Use $(INSTALL_PATH_PREFIX) with PUBLIC_HEADERS_FOLDER_PATH. >- * Configurations/Base.xcconfig: >- - Include iOS.xcconfig. >- - Add per-platform values for GCC_ENABLE_OBJC_GC and >- GCC_MODEL_TUNING. >- - Define INSTALL_PATH when building for macosx SDK. >- * Configurations/iOS.xcconfig: Add. Note that missing include >- files are simply ignored without an error by Xcode. >- >-2013-01-15 David Kilzer <ddkilzer@apple.com> >- >- ANGLE should build with -Wshorten-64-to-32 >- <http://webkit.org/b/106798> >- <http://code.google.com/p/angleproject/issues/detail?id=396> >- >- Reviewed by Kenneth Russell. >- >- Most changes below are simply to document issues with #pragma >- statements per request by upstream. The change to osinclude.h >- is the only bug fix, which defines OS_TLSIndex in terms of >- pthread_key_t instead of unsigned int since pthread_key_t is a >- 64-bit value on 64-bit Mac OS X. >- >- * Configurations/Base.xcconfig: Enable -Wshorten-64-to-32 by >- setting GCC_WARN_64_TO_32_BIT_CONVERSION to YES. >- * src/compiler/Intermediate.cpp: >- (TIntermTraverser::hash): Add #pragmas for clang to ignore >- -Wshorten-64-to-32 warning. >- * src/compiler/MapLongVariableNames.cpp: >- (LongNameMap::Size): Ditto. >- * src/compiler/ShaderLang.cpp: >- (getVariableInfo): Ditto. >- (ShGetInfo): Ditto. >- * src/compiler/ValidateLimitations.cpp: >- (ValidateLimitations::validateFunctionCall): Ditto. >- * src/compiler/glslang.l: Ditto. >- * src/compiler/glslang_lex.cpp: Ditto. >- * src/compiler/osinclude.h: Change type of OS_TLSIndex to >- pthread_key_t. Define OS_INVALID_TLS_INDEX by using >- static_cast<OS_TLSIndex>(-1). >- * src/compiler/preprocessor/Input.cpp: >- (pp::Input::Input): Add #pragmas for clang to ignore >- -Wshorten-64-to-32 warning. >- * src/compiler/preprocessor/Tokenizer.cpp: Ditto. >- * src/compiler/preprocessor/Tokenizer.l: Ditto. >- >-2013-01-14 David Kilzer <ddkilzer@apple.com> >- >- Remove nonexistent file in ANGLE Xcode project >- >- * ANGLE.xcodeproj/project.pbxproj: Remove references to >- ossource_nspr.cpp which was removed in r139665. >- >-2013-01-14 Dean Jackson <dino@apple.com> >- >- Unreviewed QT build fix. >- >- * ANGLE.pri: >- >-2013-01-14 Dean Jackson <dino@apple.com> >- >- [ANGLE] Update ANGLE in WebKit >- https://bugs.webkit.org/show_bug.cgi?id=106274 >- >- Unreviewed attempted build fix. >- >- Remove the copy files stage. Make khrplatform.h a public header. >- >- * ANGLE.xcodeproj/project.pbxproj: >- * include/GLSLANG/ShaderLang.h: >- >-2013-01-14 Max Vujovic <mvujovic@adobe.com> >- >- [ANGLE] Update ANGLE in WebKit >- https://bugs.webkit.org/show_bug.cgi?id=106274 >- >- Reviewed by Dean Jackson. >- >- Update ANGLE to r1641. >- >- ANGLE parsers were generated with Bison 2.3. >- >- Additionally, perform the following changes to WebKit's ANGLE build system. Note that these >- changes only apply to WebKit's copy of ANGLE, and do not need to be upstreamed to ANGLE. >- (a) Remove all files in the libEGL and libGLESv2 directories because nobody is using them. >- Add a README in each directory to explain why their contents are not copied over from >- ANGLE. This simplifies updating ANGLE in the future. >- (b) Remove the build_angle.xcodeproj file that no-one is using. It appears it was copied >- over from a gyp build of ANGLE. The Mac build uses ANGLE.xcodeproj. >- (c) Remove duplicate file entries in ANGLE.xcodeproj. Change its Xcode group structure to >- match ANGLE's directory structure. >- (d) Add a Copy Files task to ANGLE.xcodeproj to put the khrplatform.h header in the right >- place so ShaderLang.h can find it. ShaderLang.h is copied to >- <BuildDir>/usr/local/include/ANGLE/ShaderLang.h during the Copy Headers task, and it >- includes "KHR/khrplatform.h". Thus, we need to copy khrplatform.h to >- <BuildDir>/usr/local/include/ANGLE/KHR/khrplatform.h. >- >- Additionally, make one build fix in ANGLE source that should be upstreamed to ANGLE: >- (1) Before this patch in ExpressionParser.y, we toggled the "-Wpragmas" flag so compilers >- could ignore the pragmas that they didn't understand instead of generating an error. >- However, clang does not understand "-Wpragmas" itself. Instead, tt understands >- "-Wunknown-pragmas". Now, instead of trying to temporarily ignore pragmas, we apply the >- right flags to the right compiler versions. The new code in ExpressionParser.y looks >- like: >- >- """ >- // Turn off uninitialized variable warnings triggered by the auto-generated pplval variable. >- // On gcc 4.7+, The flag is called "-Wmaybe-uninitialized". >- // On clang and gcc < 4.7, the flag is called "-Wuninitialized". >- #if !defined(__clang__) && ((__GNUC__ == 4 && __GNU_C_MINOR__ >= 7) || __GNUC__ >= 5) >- #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" >- #else >- #pragma GCC diagnostic ignored "-Wuninitialized" >- #endif >- """ >- >- * ANGLE.plist: >- * ANGLE.pri: >- * ANGLE.xcodeproj/project.pbxproj: >- * DerivedSources.pri: >- * Target.pri: >- * include/GLSLANG/ShaderLang.h: >- * src/build_angle.xcodeproj/project.pbxproj: Removed. >- * src/common/angleutils.h: >- * src/common/debug.cpp: >- (gl::ScopedPerfEventHelper::ScopedPerfEventHelper): >- * src/common/debug.h: >- * src/common/version.h: >- * src/compiler/Compiler.cpp: >- (TCompiler::Init): >- (TCompiler::compile): >- (TCompiler::clearResults): >- (TCompiler::collectAttribsUniforms): >- (TCompiler::enforcePackingRestrictions): >- * src/compiler/Diagnostics.cpp: >- (TDiagnostics::TDiagnostics): >- (TDiagnostics::writeInfo): >- (TDiagnostics::print): >- * src/compiler/Diagnostics.h: >- (TDiagnostics::numErrors): >- (TDiagnostics::numWarnings): >- (TDiagnostics): >- * src/compiler/DirectiveHandler.h: >- * src/compiler/HashNames.h: Added. >- * src/compiler/Intermediate.cpp: >- (TIntermTraverser::hash): >- * src/compiler/OutputESSL.cpp: >- (TOutputESSL::TOutputESSL): >- * src/compiler/OutputESSL.h: >- (TOutputESSL): >- * src/compiler/OutputGLSL.cpp: >- (TOutputGLSL::TOutputGLSL): >- * src/compiler/OutputGLSL.h: >- (TOutputGLSL): >- * src/compiler/OutputGLSLBase.cpp: >- (TOutputGLSLBase::TOutputGLSLBase): >- (TOutputGLSLBase::writeVariableType): >- (TOutputGLSLBase::writeFunctionParameters): >- (TOutputGLSLBase::writeConstantUnion): >- (TOutputGLSLBase::visitSymbol): >- (TOutputGLSLBase::visitBinary): >- (TOutputGLSLBase::visitAggregate): >- (TOutputGLSLBase::getTypeName): >- (TOutputGLSLBase::hashName): >- (TOutputGLSLBase::hashVariableName): >- (TOutputGLSLBase::hashFunctionName): >- * src/compiler/OutputGLSLBase.h: >- (TOutputGLSLBase): >- * src/compiler/OutputHLSL.cpp: >- (sh::OutputHLSL::OutputHLSL): >- (sh::OutputHLSL::header): >- (sh::OutputHLSL::visitAggregate): >- (sh::OutputHLSL::visitBranch): >- (sh::OutputHLSL::handleExcessiveLoop): >- * src/compiler/OutputHLSL.h: >- (OutputHLSL): >- * src/compiler/ParseHelper.cpp: >- (TParseContext::error): >- (TParseContext::nonInitConstErrorCheck): >- (PaParseStrings): >- * src/compiler/ParseHelper.h: >- (TParseContext::TParseContext): >- (TParseContext): >- (TParseContext::numErrors): >- * src/compiler/RenameFunction.h: >- (RenameFunction::visitAggregate): >- * src/compiler/ShHandle.h: >- (TCompiler::getHashFunction): >- (TCompiler::getNameMap): >- (TCompiler::getSymbolTable): >- (TCompiler): >- * src/compiler/ShaderLang.cpp: >- (ShInitBuiltInResources): >- (ShGetInfo): >- (ShGetNameHashingEntry): >- * src/compiler/SymbolTable.cpp: >- (TType::TType): >- (TType::isStructureContainingArrays): >- * src/compiler/SymbolTable.h: >- (TSymbolTable::findBuiltIn): >- (TSymbolTable): >- * src/compiler/TranslatorESSL.cpp: >- (TranslatorESSL::translate): >- * src/compiler/TranslatorGLSL.cpp: >- (TranslatorGLSL::translate): >- * src/compiler/Types.h: >- (TType): >- (TPublicType): >- (TPublicType::setBasic): >- (TPublicType::setAggregate): >- (TPublicType::setArray): >- (TPublicType::isStructureContainingArrays): >- * src/compiler/UnfoldShortCircuit.cpp: >- (sh::UnfoldShortCircuit::visitBinary): >- * src/compiler/VariableInfo.cpp: >- (getVariableInfo): >- (getUserDefinedVariableInfo): >- (TVariableInfo::TVariableInfo): >- (CollectAttribsUniforms::CollectAttribsUniforms): >- (CollectAttribsUniforms::visitAggregate): >- * src/compiler/VariableInfo.h: >- (TVariableInfo): >- (CollectAttribsUniforms): >- * src/compiler/VariablePacker.cpp: Added. >- (VariablePacker::GetNumComponentsPerRow): >- (VariablePacker::GetNumRows): >- (TVariableInfoComparer::operator()): >- (VariablePacker::makeColumnFlags): >- (VariablePacker::fillColumns): >- (VariablePacker::searchColumn): >- (VariablePacker::CheckVariablesWithinPackingLimits): >- * src/compiler/VariablePacker.h: Added. >- (VariablePacker): >- * src/compiler/VersionGLSL.cpp: >- (TVersionGLSL::visitAggregate): >- * src/compiler/VersionGLSL.h: >- (TVersionGLSL): >- * src/compiler/glslang.l: >- * src/compiler/glslang.y: >- * src/compiler/glslang_lex.cpp: >- (string_input): >- (glslang_finalize): >- (glslang_scan): >- * src/compiler/glslang_tab.cpp: >- * src/compiler/intermediate.h: >- (TIntermTraverser): >- * src/compiler/osinclude.h: >- (OS_GetTLSValue): >- * src/compiler/ossource_nspr.cpp: >- * src/compiler/preprocessor/DiagnosticsBase.cpp: Added. >- (pp): >- (pp::Diagnostics::~Diagnostics): >- (pp::Diagnostics::report): >- (pp::Diagnostics::severity): >- (pp::Diagnostics::message): >- * src/compiler/preprocessor/DiagnosticsBase.h: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Diagnostics.h. >- (pp): >- (Diagnostics): >- * src/compiler/preprocessor/DirectiveHandlerBase.cpp: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/DirectiveHandlerBase.cpp. >- (pp): >- (pp::DirectiveHandler::~DirectiveHandler): >- * src/compiler/preprocessor/DirectiveHandlerBase.h: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/DirectiveHandler.h. >- (pp): >- (DirectiveHandler): >- * src/compiler/preprocessor/DirectiveParser.cpp: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/DirectiveParser.cpp. >- (getDirective): >- (isConditionalDirective): >- (isEOD): >- (skipUntilEOD): >- (isMacroNameReserved): >- (isMacroPredefined): >- (pp): >- (DefinedParser): >- (pp::DefinedParser::DefinedParser): >- (pp::DefinedParser::lex): >- (pp::DirectiveParser::DirectiveParser): >- (pp::DirectiveParser::lex): >- (pp::DirectiveParser::parseDirective): >- (pp::DirectiveParser::parseDefine): >- (pp::DirectiveParser::parseUndef): >- (pp::DirectiveParser::parseIf): >- (pp::DirectiveParser::parseIfdef): >- (pp::DirectiveParser::parseIfndef): >- (pp::DirectiveParser::parseElse): >- (pp::DirectiveParser::parseElif): >- (pp::DirectiveParser::parseEndif): >- (pp::DirectiveParser::parseError): >- (pp::DirectiveParser::parsePragma): >- (pp::DirectiveParser::parseExtension): >- (pp::DirectiveParser::parseVersion): >- (pp::DirectiveParser::parseLine): >- (pp::DirectiveParser::skipping): >- (pp::DirectiveParser::parseConditionalIf): >- (pp::DirectiveParser::parseExpressionIf): >- (pp::DirectiveParser::parseExpressionIfdef): >- * src/compiler/preprocessor/DirectiveParser.h: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/DirectiveParser.h. >- (pp): >- (DirectiveParser): >- (ConditionalBlock): >- (pp::DirectiveParser::ConditionalBlock::ConditionalBlock): >- * src/compiler/preprocessor/ExpressionParser.cpp: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/ExpressionParser.cpp. >- (yysyntax_error): >- (yylex): >- (yyerror): >- (pp): >- (pp::ExpressionParser::ExpressionParser): >- (pp::ExpressionParser::parse): >- * src/compiler/preprocessor/ExpressionParser.h: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/ExpressionParser.h. >- (pp): >- (ExpressionParser): >- * src/compiler/preprocessor/ExpressionParser.y: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/ExpressionParser.y. >- * src/compiler/preprocessor/Input.cpp: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Input.cpp. >- (pp): >- (pp::Input::Input): >- (pp::Input::read): >- * src/compiler/preprocessor/Input.h: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Input.h. >- (pp): >- (Input): >- (pp::Input::count): >- (pp::Input::string): >- (pp::Input::length): >- (Location): >- (pp::Input::Location::Location): >- (pp::Input::readLoc): >- * src/compiler/preprocessor/Lexer.cpp: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Lexer.cpp. >- (pp): >- (pp::Lexer::~Lexer): >- * src/compiler/preprocessor/Lexer.h: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Lexer.h. >- (pp): >- (Lexer): >- * src/compiler/preprocessor/Macro.cpp: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Macro.cpp. >- (pp): >- (pp::Macro::equals): >- * src/compiler/preprocessor/Macro.h: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Macro.h. >- (pp): >- (pp::Macro::Macro): >- (Macro): >- * src/compiler/preprocessor/MacroExpander.cpp: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/MacroExpander.cpp. >- (pp): >- (TokenLexer): >- (pp::TokenLexer::TokenLexer): >- (pp::TokenLexer::lex): >- (pp::MacroExpander::MacroExpander): >- (pp::MacroExpander::~MacroExpander): >- (pp::MacroExpander::lex): >- (pp::MacroExpander::getToken): >- (pp::MacroExpander::ungetToken): >- (pp::MacroExpander::isNextTokenLeftParen): >- (pp::MacroExpander::pushMacro): >- (pp::MacroExpander::popMacro): >- (pp::MacroExpander::expandMacro): >- (pp::MacroExpander::collectMacroArgs): >- (pp::MacroExpander::replaceMacroParams): >- * src/compiler/preprocessor/MacroExpander.h: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/MacroExpander.h. >- (pp): >- (MacroExpander): >- (MacroContext): >- (pp::MacroExpander::MacroContext::MacroContext): >- (pp::MacroExpander::MacroContext::empty): >- (pp::MacroExpander::MacroContext::get): >- (pp::MacroExpander::MacroContext::unget): >- * src/compiler/preprocessor/Preprocessor.cpp: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Preprocessor.cpp. >- (pp): >- (PreprocessorImpl): >- (pp::PreprocessorImpl::PreprocessorImpl): >- (pp::Preprocessor::Preprocessor): >- (pp::Preprocessor::~Preprocessor): >- (pp::Preprocessor::init): >- (pp::Preprocessor::predefineMacro): >- (pp::Preprocessor::lex): >- * src/compiler/preprocessor/Preprocessor.h: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Preprocessor.h. >- (pp): >- (Preprocessor): >- * src/compiler/preprocessor/SourceLocation.h: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/SourceLocation.h. >- (pp): >- (pp::SourceLocation::SourceLocation): >- (SourceLocation): >- (pp::SourceLocation::equals): >- (pp::operator==): >- (pp::operator!=): >- * src/compiler/preprocessor/Token.cpp: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Token.cpp. >- (pp): >- (pp::Token::reset): >- (pp::Token::equals): >- (pp::Token::setAtStartOfLine): >- (pp::Token::setHasLeadingSpace): >- (pp::Token::setExpansionDisabled): >- (pp::Token::iValue): >- (pp::Token::uValue): >- (pp::Token::fValue): >- (pp::operator<<): >- * src/compiler/preprocessor/Token.h: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Token.h. >- (pp): >- (pp::Token::Token): >- (Token): >- (pp::Token::atStartOfLine): >- (pp::Token::hasLeadingSpace): >- (pp::Token::expansionDisabled): >- (pp::operator==): >- (pp::operator!=): >- * src/compiler/preprocessor/Tokenizer.cpp: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Tokenizer.cpp. >- (yy_buffer_state): >- (yy_trans_info): >- (yyguts_t): >- (yy_get_previous_state): >- (yy_try_NUL_trans): >- (input): >- (pprestart): >- (pp_switch_to_buffer): >- (pp_load_buffer_state): >- (pp_create_buffer): >- (pp_delete_buffer): >- (pp_init_buffer): >- (pp_flush_buffer): >- (pppush_buffer_state): >- (pppop_buffer_state): >- (ppensure_buffer_stack): >- (pp_scan_buffer): >- (pp_scan_string): >- (pp_scan_bytes): >- (yy_fatal_error): >- (ppget_extra): >- (ppget_lineno): >- (ppget_column): >- (ppget_in): >- (ppget_out): >- (ppget_leng): >- (ppget_text): >- (ppset_extra): >- (ppset_lineno): >- (ppset_column): >- (ppset_in): >- (ppset_out): >- (ppget_debug): >- (ppset_debug): >- (ppget_lval): >- (ppset_lval): >- (ppget_lloc): >- (ppset_lloc): >- (pplex_init): >- (pplex_init_extra): >- (yy_init_globals): >- (pplex_destroy): >- (yy_flex_strncpy): >- (yy_flex_strlen): >- (ppalloc): >- (pprealloc): >- (ppfree): >- (pp): >- (pp::Tokenizer::Tokenizer): >- (pp::Tokenizer::~Tokenizer): >- (pp::Tokenizer::init): >- (pp::Tokenizer::setFileNumber): >- (pp::Tokenizer::setLineNumber): >- (pp::Tokenizer::lex): >- (pp::Tokenizer::initScanner): >- (pp::Tokenizer::destroyScanner): >- * src/compiler/preprocessor/Tokenizer.h: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Tokenizer.h. >- (pp): >- (Tokenizer): >- (Context): >- * src/compiler/preprocessor/Tokenizer.l: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Tokenizer.l. >- * src/compiler/preprocessor/atom.c: Removed. >- * src/compiler/preprocessor/atom.h: Removed. >- * src/compiler/preprocessor/compile.h: Removed. >- * src/compiler/preprocessor/cpp.c: Removed. >- * src/compiler/preprocessor/cpp.h: Removed. >- * src/compiler/preprocessor/cppstruct.c: Removed. >- * src/compiler/preprocessor/generate_parser.sh: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/generate_parser.sh. >- * src/compiler/preprocessor/memory.c: Removed. >- * src/compiler/preprocessor/memory.h: Removed. >- * src/compiler/preprocessor/new/DiagnosticsBase.cpp: Removed. >- * src/compiler/preprocessor/new/new_file.cpp: Removed. >- * src/compiler/preprocessor/new/new_file2.cpp: Removed. >- * src/compiler/preprocessor/new/preprocessor.vcproj: Removed. >- * src/compiler/preprocessor/numeric_lex.h: Added. >- (pp): >- (pp::numeric_base_int): >- (pp::numeric_lex_int): >- (pp::numeric_lex_float): >- * src/compiler/preprocessor/parser.h: Removed. >- * src/compiler/preprocessor/pp_utils.h: Renamed from Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp_utils.h. >- * src/compiler/preprocessor/preprocess.h: Removed. >- * src/compiler/preprocessor/scanner.c: Removed. >- * src/compiler/preprocessor/scanner.h: Removed. >- * src/compiler/preprocessor/slglobals.h: Removed. >- * src/compiler/preprocessor/symbols.c: Removed. >- * src/compiler/preprocessor/symbols.h: Removed. >- * src/compiler/preprocessor/tokens.c: Removed. >- * src/compiler/preprocessor/tokens.h: Removed. >- * src/libEGL/Config.cpp: Removed. >- * src/libEGL/Config.h: Removed. >- * src/libEGL/Display.cpp: Removed. >- * src/libEGL/Display.h: Removed. >- * src/libEGL/README: Added. >- * src/libEGL/Surface.cpp: Removed. >- * src/libEGL/Surface.h: Removed. >- * src/libEGL/libEGL.cpp: Removed. >- * src/libEGL/libEGL.def: Removed. >- * src/libEGL/libEGL.rc: Removed. >- * src/libEGL/libEGL.vcproj: Removed. >- * src/libEGL/main.cpp: Removed. >- * src/libEGL/main.h: Removed. >- * src/libEGL/resource.h: Removed. >- * src/libGLESv2/Blit.cpp: Removed. >- * src/libGLESv2/Blit.h: Removed. >- * src/libGLESv2/Buffer.cpp: Removed. >- * src/libGLESv2/Buffer.h: Removed. >- * src/libGLESv2/Context.cpp: Removed. >- * src/libGLESv2/Context.h: Removed. >- * src/libGLESv2/Fence.cpp: Removed. >- * src/libGLESv2/Fence.h: Removed. >- * src/libGLESv2/Framebuffer.cpp: Removed. >- * src/libGLESv2/Framebuffer.h: Removed. >- * src/libGLESv2/HandleAllocator.cpp: Removed. >- * src/libGLESv2/HandleAllocator.h: Removed. >- * src/libGLESv2/IndexDataManager.cpp: Removed. >- * src/libGLESv2/IndexDataManager.h: Removed. >- * src/libGLESv2/Program.cpp: Removed. >- * src/libGLESv2/Program.h: Removed. >- * src/libGLESv2/ProgramBinary.cpp: Removed. >- * src/libGLESv2/ProgramBinary.h: Removed. >- * src/libGLESv2/Query.cpp: Removed. >- * src/libGLESv2/Query.h: Removed. >- * src/libGLESv2/README: Added. >- * src/libGLESv2/Renderbuffer.cpp: Removed. >- * src/libGLESv2/Renderbuffer.h: Removed. >- * src/libGLESv2/ResourceManager.cpp: Removed. >- * src/libGLESv2/ResourceManager.h: Removed. >- * src/libGLESv2/Shader.cpp: Removed. >- * src/libGLESv2/Shader.h: Removed. >- * src/libGLESv2/Texture.cpp: Removed. >- * src/libGLESv2/Texture.h: Removed. >- * src/libGLESv2/VertexDataManager.cpp: Removed. >- * src/libGLESv2/VertexDataManager.h: Removed. >- * src/libGLESv2/libGLESv2.cpp: Removed. >- * src/libGLESv2/libGLESv2.def: Removed. >- * src/libGLESv2/libGLESv2.rc: Removed. >- * src/libGLESv2/libGLESv2.vcproj: Removed. >- * src/libGLESv2/main.cpp: Removed. >- * src/libGLESv2/main.h: Removed. >- * src/libGLESv2/mathutil.h: Removed. >- * src/libGLESv2/resource.h: Removed. >- * src/libGLESv2/utilities.cpp: Removed. >- * src/libGLESv2/utilities.h: Removed. >- * src/libGLESv2/vertexconversion.h: Removed. >- >-2012-12-18 Max Vujovic <mvujovic@adobe.com> >- >- [ANGLE] Use of uninitialized memory in ArrayBoundsClamper >- https://bugs.webkit.org/show_bug.cgi?id=105218 >- >- Reviewed by Dean Jackson. >- >- TIntermBinary::addIndexClamp is uninitialized when the compile flag >- SH_CLAMP_INDIRECT_ARRAY_BOUNDS is not set. Then, addIndexClamp is used in OutputGLSLBase. >- CSS Shaders needs to do a first validation pass without the SH_CLAMP_INDIRECT_ARRAY_BOUNDS >- flag and its effects. However, sometimes addIndexClamp is true, which inserts clamping code >- that causes a shader to fail compilation at the WebGL level. >- >- * src/compiler/intermediate.h: >- (TIntermBinary::TIntermBinary): >- >-2012-10-29 Anders Carlsson <andersca@apple.com> >- >- Build WebKit as C++11 on Mac >- https://bugs.webkit.org/show_bug.cgi?id=100720 >- >- Reviewed by Daniel Bates. >- >- * Configurations/Base.xcconfig: >- Add CLANG_CXX_LANGUAGE_STANDARD=gnu++0x. >- >-2012-10-28 Mark Rowe <mrowe@apple.com> >- >- Simplify Xcode configuration settings that used to vary between OS versions. >- >- Reviewed by Dan Bernstein. >- >- * Configurations/Base.xcconfig: >- * Configurations/DebugRelease.xcconfig: >- >-2012-10-28 Mark Rowe <mrowe@apple.com> >- >- Remove references to unsupported OS and Xcode versions. >- >- Reviewed by Anders Carlsson. >- >- * Configurations/Base.xcconfig: >- * Configurations/CompilerVersion.xcconfig: Removed. >- * Configurations/DebugRelease.xcconfig: >- >-2012-10-27 Dan Bernstein <mitz@apple.com> >- >- REAL_PLATFORM_NAME build setting is no longer needed >- https://bugs.webkit.org/show_bug.cgi?id=100587 >- >- Reviewed by Mark Rowe. >- >- Removed the definition of REAL_PLATFORM_NAME and replaced references to it with references >- to PLATFORM_NAME. >- >- * Configurations/Base.xcconfig: >- * Configurations/CompilerVersion.xcconfig: >- >-2012-10-18 Dean Jackson <dino@apple.com> >- >- Shader translator needs option to clamp uniform array accesses in vertex shaders >- https://bugs.webkit.org/show_bug.cgi?id=98977 >- https://code.google.com/p/angleproject/issues/detail?id=49 >- >- Reviewed by Alok Priyadarshi and Ken Russell. >- >- WebGL does not allow GLSL code to index a uniform array outside its bounds. Add a >- flag to the ANGLE compiler to insert clamp statements around such indexing. >- Since it is possible to access vec2/3/4 and mat2/3/4 components by array indexing, >- they must be similarly clamped. >- >- Unfortunately, it is currently not possible to always determine that the indexing is >- operating on a uniform variable. For example, suppose we have "uniform mat4 a". ANGLE >- is currently not able to tell us that the rvalue of "a[0]" is a uniform, just that >- it has a size of 4. Therefore, the clamping is done on all indirect array indexing. >- >- This will have a performance impact. Future enhancements may be able to determine >- cases where the clamping is not necessary. Currently only direct indexing is skipped >- (i.e. looking up a value using a constant index). >- >- The clamp insertion is only performed on the GLSL output. Direct3D already guarantees >- that out-of-bounds uniform array access returns a zero value. >- >- * ANGLE.xcodeproj/project.pbxproj: >- * Target.pri: >- * include/GLSLANG/ShaderLang.h: New compiler option. >- * src/compiler/ArrayBoundsClamper.cpp: Added. >- (ArrayBoundsClamper::ArrayBoundsClamper): >- (ArrayBoundsClamper::OutputClampingFunctionDefinition): Injects a clamping function for integers into GLSL source. >- (ArrayBoundsClamper::MarkIndirectArrayBoundsForClamping): Examines the AST looking for non-direct array indexing. >- * src/compiler/ArrayBoundsClamper.h: Added. >- (ArrayBoundsClamper): >- (ArrayBoundsClamper::GetArrayBoundsClampDefinitionNeeded): >- (ArrayBoundsClamper::SetArrayBoundsClampDefinitionNeeded): Marks the object as needing to output the clamping function. >- (ArrayBoundsClamper::Cleanup): Resets the state so that subsequent runs start fresh. >- * src/compiler/Compiler.cpp: >- (TCompiler::compile): Run the clamping code if the compile option was set. >- (TCompiler::clearResults): >- (TCompiler::getArrayBoundsClamper): >- * src/compiler/OutputGLSLBase.cpp: >- (TOutputGLSLBase::visitBinary): If the expression has been flagged, insert an appropriate "clamp" statement. >- * src/compiler/ShHandle.h: >- (TCompiler): >- * src/compiler/TranslatorESSL.cpp: >- (TranslatorESSL::translate): >- * src/compiler/TranslatorGLSL.cpp: >- (TranslatorGLSL::translate): >- * src/compiler/intermOut.cpp: >- (TType::getCompleteString): Add array size to intermediate tree output. >- * src/compiler/intermediate.h: >- (TIntermBinary::setAddIndexClamp): New flag for indicating a binary expression needs clamping. >- (TIntermBinary::getAddIndexClamp): >- (TIntermBinary): >- >-2012-09-13 Mark Rowe <mrowe@apple.com> >- >- <rdar://problem/12255720> Fix the build with newer Clang >- >- Reviewed by Sam Weinig. >- >- Clang generates a warning about the inclusion of trailing commas on the final enum item as it's apparently >- a C++11 extension. Remove them. >- >- * src/compiler/BaseTypes.h: >- * src/compiler/ExtensionBehavior.h: >- * src/compiler/ParseHelper.cpp: >- (TParseContext::parseVectorFields): >- * src/compiler/intermediate.h: >- >-2012-09-13 Simon Hausmann <simon.hausmann@nokia.com> >- >- [Qt] The ANGLE build on Windows breaks with GnuWin32's flex because it is too old >- https://bugs.webkit.org/show_bug.cgi?id=96359 >- >- Reviewed by Tor Arne Vestbø. >- >- GnuWin32's flex is 2.5.4 and that is too old for ANGLE's preprocessor >- lexer. The only viable alternative I could find on Windows that provides >- binaries is the winflexbison distribution (http://sourceforge.net/projects/winflexbison/), >- so let's use that one instead. >- >- * DerivedSources.pri: >- >-2012-09-12 Simon Hausmann <simon.hausmann@nokia.com> >- >- [Qt] Build on Windows requires bison/flex in PATH >- https://bugs.webkit.org/show_bug.cgi?id=96358 >- >- Reviewed by Tor Arne Vestbø. >- >- Use MAKEFILE_NOOP_COMMAND instead of the \n\t trick to generate a dummy command. Otherwise >- the PATH prepend trick will break because it generates a command line along the lines of >- (set PATH="...") && with just that trailing ampersand pair. >- >- * DerivedSources.pri: >- >-2012-09-10 Dean Jackson <dino@apple.com> >- >- [Apple] Install plist for Apple Open Source build system >- https://bugs.webkit.org/show_bug.cgi?id=96345 >- >- Reviewed by Mark Rowe. >- >- Apple's build system requires a couple of files that describe where >- the 3rd party Open Source library came from, and what license it >- uses. These files are copied into /usr/local when the project is >- being installed. >- >- * ANGLE.plist: Added. >- * ANGLE.txt: Added. >- * ANGLE.xcodeproj/project.pbxproj: >- >-2012-09-06 Andras Becsi <andras.becsi@nokia.com> >- >- [ANGLE] Fix the build with gcc 4.7 >- https://bugs.webkit.org/show_bug.cgi?id=95989 >- >- Reviewed by Csaba Osztrogonác. >- >- The build fails because of a bogus warning about the auto-generated >- pplval variable. Unfortunately the warning is called -Wuninitialized >- in gcc 4.6 and -Wmaybe-uninitialized in gcc 4.7 thus we also need to >- ignore unknown pragmas not to break the build with compilers that do >- not recognize these options. >- >- * src/compiler/preprocessor/new/ExpressionParser.y: >- >-2012-09-06 Simon Hausmann <simon.hausmann@nokia.com> >- >- [Qt] Fix build with ANGLE on platforms that provide EGL/GLESv2 >- https://bugs.webkit.org/show_bug.cgi?id=95965 >- >- Reviewed by Tor Arne Vestbø. >- >- Add build rules to build ANGLE as a static library for the Qt port. >- >- * ANGLE.pri: Added. >- * ANGLE.pro: Added. >- * DerivedSources.pri: Added. >- * Target.pri: Added. >- >-2012-08-24 Joshua Netterfield <jnetterfield@rim.com> >- >- [CSS Shaders] [ANGLE] RenameFunction::RenameFunction may store references to temporary string >- https://bugs.webkit.org/show_bug.cgi?id=94736 >- http://code.google.com/p/angleproject/issues/detail?id=360 >- >- Reviewed by George Staikos. >- >- When RenameFunction::RenameFunction(const TString& oldFunctionName, const TString& >- newFunctionName) is called from TCompiler::rewriteCSSShader(TIntermNode*), references to >- the temporaries oldFunctionName and newFunctionName are stored as mOldFunctionName and >- mNewFunctionName. This results in undefined behaviour in visitAggregate. >- >- This same patch is being applied in upstream ANGLE, and is needed for CSS Shader >- sanitization. >- >- * src/compiler/RenameFunction.h: >- (RenameFunction::visitAggregate): >- (RenameFunction): >- >-2012-07-18 Kristóf Kosztyó <kkristof@inf.u-szeged.hu> >- >- [Qt] Buildfix after r122870. >- https://bugs.webkit.org/show_bug.cgi?id=89039 >- >- Reviewed by Csaba Osztrogonác >- >- * src/compiler/preprocessor/new/MacroExpander.cpp: >- (pp::MacroExpander::ungetToken): >- >-2012-07-17 Max Vujovic <mvujovic@adobe.com> >- >- Update ANGLE in WebKit >- https://bugs.webkit.org/show_bug.cgi?id=89039 >- >- Reviewed by Dean Jackson and Mark Rowe. >- >- Update ANGLE to r1170, with the following modifications: >- >- (1) Use Bison 2.3 instead of Bison 2.4.2 to generate ExpressionParser.cpp and >- glslang_tab.cpp. I had to modify ExpressionParser.y to make it compatible with Bison >- 2.3. The changes have been contributed back to ANGLE in r1224. >- >- (2) Continue to recognize QNX as POSIX in ANGLE. This has been contributed back to ANGLE >- in r1223. >- >- (3) Rename ANGLE/src/compiler/preprocessor/new/Diagnostic.cpp to DiagnosticBase.cpp. >- Rename ANGLE/src/compiler/preprocessor/new/DirectiveHandler.cpp to DirectiveHandlerBase.cpp. >- >- With the introduction of ANGLE's new preprocessor, there were two files named Diagnostic.cpp >- in ANGLE under different folders. This caused problems on the QT build when their object >- files, both named Diagnostic.o, tried to go in the same folder. Renaming one of them to >- DiagnosticBase.cpp avoids this conflict. The same situation occurred with >- DirectiveHandler.cpp. I will work on contributing this change back to ANGLE for future >- updates. >- >- (4) Add the following lines to glslang.y and ExpressionParser.y: >- #define YYENABLE_NLS 0 >- #define YYLTYPE_IS_TRIVIAL 1 >- >- Bison 2.3 doesn't first check that these macros are defined before reading their value, >- which causes the QT build to fail. >- >- We work around this issue in the same way in CSSGrammar.y. >- >- I will work on contributing this change back to ANGLE. >- >- * ANGLE.xcodeproj/project.pbxproj: >- * include/GLES2/gl2ext.h: >- * include/GLSLANG/ShaderLang.h: >- * src/build_angle.xcodeproj/project.pbxproj: >- * src/common/angleutils.h: >- * src/common/debug.cpp: >- (gl): >- (gl::output): >- (gl::trace): >- (gl::perfActive): >- (gl::ScopedPerfEventHelper::ScopedPerfEventHelper): >- (gl::ScopedPerfEventHelper::~ScopedPerfEventHelper): >- * src/common/version.h: >- * src/compiler/BuiltInFunctionEmulator.cpp: >- (BuiltInFunctionEmulator::IdentifyFunction): >- * src/compiler/BuiltInFunctionEmulator.h: >- * src/compiler/Compiler.cpp: >- (isWebGLBasedSpec): >- (TCompiler::compile): >- (TCompiler::rewriteCSSShader): >- (TCompiler::enforceTimingRestrictions): >- (TCompiler::enforceFragmentShaderTimingRestrictions): >- (TCompiler::enforceVertexShaderTimingRestrictions): >- * src/compiler/DetectDiscontinuity.cpp: Added. >- (sh::DetectLoopDiscontinuity::traverse): >- (sh): >- (sh::DetectLoopDiscontinuity::visitBranch): >- (sh::DetectLoopDiscontinuity::visitAggregate): >- (sh::containsLoopDiscontinuity): >- (sh::DetectGradientOperation::traverse): >- (sh::DetectGradientOperation::visitUnary): >- (sh::DetectGradientOperation::visitAggregate): >- (sh::containsGradientOperation): >- * src/compiler/DetectDiscontinuity.h: Added. >- (sh): >- (DetectLoopDiscontinuity): >- (DetectGradientOperation): >- * src/compiler/Diagnostics.cpp: Added. >- (TDiagnostics::TDiagnostics): >- (TDiagnostics::~TDiagnostics): >- (TDiagnostics::writeInfo): >- (TDiagnostics::writeDebug): >- (TDiagnostics::print): >- * src/compiler/Diagnostics.h: Added. >- (TDiagnostics): >- (TDiagnostics::infoSink): >- * src/compiler/DirectiveHandler.cpp: Added. >- (getBehavior): >- (TDirectiveHandler::TDirectiveHandler): >- (TDirectiveHandler::~TDirectiveHandler): >- (TDirectiveHandler::handleError): >- (TDirectiveHandler::handlePragma): >- (TDirectiveHandler::handleExtension): >- (TDirectiveHandler::handleVersion): >- * src/compiler/DirectiveHandler.h: Added. >- (TDirectiveHandler): >- (TDirectiveHandler::pragma): >- (TDirectiveHandler::extensionBehavior): >- * src/compiler/ExtensionBehavior.h: >- (getBehaviorString): >- * src/compiler/Initialize.cpp: >- (BuiltInConstants): >- (TBuiltIns::initialize): >- (IdentifyBuiltIns): >- * src/compiler/InitializeParseContext.cpp: Added. >- (InitializeParseContextIndex): >- (FreeParseContextIndex): >- (InitializeGlobalParseContext): >- (FreeParseContext): >- (GetGlobalParseContext): >- * src/compiler/InitializeParseContext.h: >- (TThreadParseContextRec): >- * src/compiler/Intermediate.cpp: >- (TIntermediate::addSelection): >- * src/compiler/MapLongVariableNames.cpp: >- * src/compiler/OutputHLSL.cpp: >- (sh::str): >- (sh::OutputHLSL::OutputHLSL): >- (sh::OutputHLSL::~OutputHLSL): >- (sh::OutputHLSL::output): >- (sh::OutputHLSL::header): >- (sh::OutputHLSL::visitBinary): >- (sh::OutputHLSL::visitUnary): >- (sh::OutputHLSL::visitAggregate): >- (sh::OutputHLSL::visitSelection): >- (sh::OutputHLSL::visitLoop): >- (sh::OutputHLSL::traverseStatements): >- (sh): >- (sh::OutputHLSL::handleExcessiveLoop): >- (sh::OutputHLSL::typeString): >- (sh::OutputHLSL::addConstructor): >- (sh::OutputHLSL::decorateField): >- * src/compiler/OutputHLSL.h: >- (sh): >- (OutputHLSL): >- * src/compiler/ParseHelper.cpp: >- (TParseContext::parseVectorFields): >- (TParseContext::parseMatrixFields): >- (TParseContext::error): >- (TParseContext::warning): >- (TParseContext::trace): >- (TParseContext::assignError): >- (TParseContext::unaryOpError): >- (TParseContext::binaryOpError): >- (TParseContext::precisionErrorCheck): >- (TParseContext::lValueErrorCheck): >- (TParseContext::constErrorCheck): >- (TParseContext::integerErrorCheck): >- (TParseContext::globalErrorCheck): >- (TParseContext::reservedErrorCheck): >- (TParseContext::constructorErrorCheck): >- (TParseContext::voidErrorCheck): >- (TParseContext::boolErrorCheck): >- (TParseContext::samplerErrorCheck): >- (TParseContext::structQualifierErrorCheck): >- (TParseContext::parameterSamplerErrorCheck): >- (TParseContext::arraySizeErrorCheck): >- (TParseContext::arrayQualifierErrorCheck): >- (TParseContext::arrayTypeErrorCheck): >- (TParseContext::arrayErrorCheck): >- (TParseContext::arraySetMaxSize): >- (TParseContext::nonInitConstErrorCheck): >- (TParseContext::nonInitErrorCheck): >- (TParseContext::paramErrorCheck): >- (TParseContext::extensionErrorCheck): >- (TParseContext::supportsExtension): >- (TParseContext::handleExtensionDirective): >- (TParseContext::handlePragmaDirective): >- (TParseContext::findFunction): >- (TParseContext::executeInitializer): >- (TParseContext::constructBuiltIn): >- (TParseContext::constructStruct): >- (TParseContext::addConstVectorNode): >- (TParseContext::addConstMatrixNode): >- (TParseContext::addConstArrayNode): >- (TParseContext::addConstStruct): >- (TParseContext::enterStructDeclaration): >- (TParseContext::structNestingErrorCheck): >- (PaParseStrings): >- * src/compiler/ParseHelper.h: >- (TParseContext::TParseContext): >- (TParseContext): >- (TParseContext::infoSink): >- (TParseContext::extensionBehavior): >- (TParseContext::pragma): >- * src/compiler/PoolAlloc.cpp: >- (TAllocation::checkGuardBlock): >- * src/compiler/Pragma.h: Added. >- (TPragma): >- (TPragma::TPragma): >- * src/compiler/RenameFunction.h: Added. >- (RenameFunction): >- (RenameFunction::RenameFunction): >- (RenameFunction::visitAggregate): >- * src/compiler/ShHandle.h: >- (TCompiler): >- * src/compiler/ShaderLang.cpp: >- (getVariableInfo): >- * src/compiler/SymbolTable.cpp: >- (TType::buildMangledName): >- * src/compiler/TranslatorHLSL.cpp: >- * src/compiler/UnfoldSelect.cpp: Removed. >- * src/compiler/UnfoldSelect.h: Removed. >- * src/compiler/UnfoldShortCircuit.cpp: Added. >- (sh::UnfoldShortCircuit::UnfoldShortCircuit): >- (sh): >- (sh::UnfoldShortCircuit::traverse): >- (sh::UnfoldShortCircuit::visitBinary): >- (sh::UnfoldShortCircuit::visitSelection): >- (sh::UnfoldShortCircuit::visitLoop): >- (sh::UnfoldShortCircuit::getNextTemporaryIndex): >- * src/compiler/UnfoldShortCircuit.h: Added. >- (sh): >- (UnfoldShortCircuit): >- * src/compiler/ValidateLimitations.cpp: >- * src/compiler/debug.cpp: >- * src/compiler/depgraph: Added. >- * src/compiler/depgraph/DependencyGraph.cpp: Added. >- (TDependencyGraph::TDependencyGraph): >- (TDependencyGraph::~TDependencyGraph): >- (TDependencyGraph::createArgument): >- (TDependencyGraph::createFunctionCall): >- (TDependencyGraph::getOrCreateSymbol): >- (TDependencyGraph::createSelection): >- (TDependencyGraph::createLoop): >- (TDependencyGraph::createLogicalOp): >- (TGraphLogicalOp::getOpString): >- * src/compiler/depgraph/DependencyGraph.h: Added. >- (TGraphNode): >- (TGraphNode::TGraphNode): >- (TGraphNode::~TGraphNode): >- (TGraphParentNode): >- (TGraphParentNode::TGraphParentNode): >- (TGraphParentNode::~TGraphParentNode): >- (TGraphParentNode::addDependentNode): >- (TGraphArgument): >- (TGraphArgument::TGraphArgument): >- (TGraphArgument::~TGraphArgument): >- (TGraphArgument::getIntermFunctionCall): >- (TGraphArgument::getArgumentNumber): >- (TGraphFunctionCall): >- (TGraphFunctionCall::TGraphFunctionCall): >- (TGraphFunctionCall::~TGraphFunctionCall): >- (TGraphFunctionCall::getIntermFunctionCall): >- (TGraphSymbol): >- (TGraphSymbol::TGraphSymbol): >- (TGraphSymbol::~TGraphSymbol): >- (TGraphSymbol::getIntermSymbol): >- (TGraphSelection): >- (TGraphSelection::TGraphSelection): >- (TGraphSelection::~TGraphSelection): >- (TGraphSelection::getIntermSelection): >- (TGraphLoop): >- (TGraphLoop::TGraphLoop): >- (TGraphLoop::~TGraphLoop): >- (TGraphLoop::getIntermLoop): >- (TGraphLogicalOp): >- (TGraphLogicalOp::TGraphLogicalOp): >- (TGraphLogicalOp::~TGraphLogicalOp): >- (TGraphLogicalOp::getIntermLogicalOp): >- (TDependencyGraph): >- (TDependencyGraph::begin): >- (TDependencyGraph::end): >- (TDependencyGraph::beginSamplerSymbols): >- (TDependencyGraph::endSamplerSymbols): >- (TDependencyGraph::beginUserDefinedFunctionCalls): >- (TDependencyGraph::endUserDefinedFunctionCalls): >- (TDependencyGraphTraverser): >- (TDependencyGraphTraverser::TDependencyGraphTraverser): >- (TDependencyGraphTraverser::visitSymbol): >- (TDependencyGraphTraverser::visitArgument): >- (TDependencyGraphTraverser::visitFunctionCall): >- (TDependencyGraphTraverser::visitSelection): >- (TDependencyGraphTraverser::visitLoop): >- (TDependencyGraphTraverser::visitLogicalOp): >- (TDependencyGraphTraverser::getDepth): >- (TDependencyGraphTraverser::incrementDepth): >- (TDependencyGraphTraverser::decrementDepth): >- (TDependencyGraphTraverser::clearVisited): >- (TDependencyGraphTraverser::markVisited): >- (TDependencyGraphTraverser::isVisited): >- * src/compiler/depgraph/DependencyGraphBuilder.cpp: Added. >- (TDependencyGraphBuilder::build): >- (TDependencyGraphBuilder::visitAggregate): >- (TDependencyGraphBuilder::visitFunctionDefinition): >- (TDependencyGraphBuilder::visitFunctionCall): >- (TDependencyGraphBuilder::visitAggregateChildren): >- (TDependencyGraphBuilder::visitSymbol): >- (TDependencyGraphBuilder::visitBinary): >- (TDependencyGraphBuilder::visitAssignment): >- (TDependencyGraphBuilder::visitLogicalOp): >- (TDependencyGraphBuilder::visitBinaryChildren): >- (TDependencyGraphBuilder::visitSelection): >- (TDependencyGraphBuilder::visitLoop): >- (TDependencyGraphBuilder::connectMultipleNodesToSingleNode): >- * src/compiler/depgraph/DependencyGraphBuilder.h: Added. >- (TDependencyGraphBuilder): >- (TNodeSetStack): >- (TDependencyGraphBuilder::TNodeSetStack::TNodeSetStack): >- (TDependencyGraphBuilder::TNodeSetStack::~TNodeSetStack): >- (TDependencyGraphBuilder::TNodeSetStack::getTopSet): >- (TDependencyGraphBuilder::TNodeSetStack::pushSet): >- (TDependencyGraphBuilder::TNodeSetStack::popSet): >- (TDependencyGraphBuilder::TNodeSetStack::popSetIntoNext): >- (TDependencyGraphBuilder::TNodeSetStack::insertIntoTopSet): >- (TDependencyGraphBuilder::TNodeSetStack::clear): >- (TNodeSetMaintainer): >- (TDependencyGraphBuilder::TNodeSetMaintainer::TNodeSetMaintainer): >- (TDependencyGraphBuilder::TNodeSetMaintainer::~TNodeSetMaintainer): >- (TNodeSetPropagatingMaintainer): >- (TDependencyGraphBuilder::TNodeSetPropagatingMaintainer::TNodeSetPropagatingMaintainer): >- (TDependencyGraphBuilder::TNodeSetPropagatingMaintainer::~TNodeSetPropagatingMaintainer): >- (TLeftmostSymbolMaintainer): >- (TDependencyGraphBuilder::TLeftmostSymbolMaintainer::TLeftmostSymbolMaintainer): >- (TDependencyGraphBuilder::TLeftmostSymbolMaintainer::~TLeftmostSymbolMaintainer): >- (TDependencyGraphBuilder::TDependencyGraphBuilder): >- (TDependencyGraphBuilder::build): >- * src/compiler/depgraph/DependencyGraphOutput.cpp: Added. >- (TDependencyGraphOutput::outputIndentation): >- (TDependencyGraphOutput::visitArgument): >- (TDependencyGraphOutput::visitFunctionCall): >- (TDependencyGraphOutput::visitSymbol): >- (TDependencyGraphOutput::visitSelection): >- (TDependencyGraphOutput::visitLoop): >- (TDependencyGraphOutput::visitLogicalOp): >- (TDependencyGraphOutput::outputAllSpanningTrees): >- * src/compiler/depgraph/DependencyGraphOutput.h: Added. >- (TDependencyGraphOutput): >- (TDependencyGraphOutput::TDependencyGraphOutput): >- * src/compiler/depgraph/DependencyGraphTraverse.cpp: Added. >- (TGraphNode::traverse): >- (TGraphParentNode::traverse): >- (TGraphArgument::traverse): >- (TGraphFunctionCall::traverse): >- (TGraphSymbol::traverse): >- (TGraphSelection::traverse): >- (TGraphLoop::traverse): >- (TGraphLogicalOp::traverse): >- * src/compiler/glslang.h: >- * src/compiler/glslang.l: >- * src/compiler/glslang.y: >- * src/compiler/glslang_lex.cpp: >- (yy_buffer_state): >- (yyguts_t): >- (yy_get_previous_state): >- (yy_try_NUL_trans): >- (input): >- (yyensure_buffer_stack): >- (yy_scan_bytes): >- (yyget_leng): >- (string_input): >- (yyerror): >- (glslang_finalize): >- (glslang_scan): >- * src/compiler/glslang_tab.cpp: >- * src/compiler/intermediate.h: >- (TIntermAggregate::TIntermAggregate): >- (TIntermAggregate::~TIntermAggregate): >- (TIntermAggregate::isUserDefined): >- (TIntermAggregate): >- (TIntermTraverser::~TIntermTraverser): >- * src/compiler/osinclude.h: >- * src/compiler/preprocessor/atom.c: >- (FindHashLoc): >- (PrintAtomTable): >- * src/compiler/preprocessor/cpp.c: >- (CPPpragma): >- (readCPPline): >- (PredefineIntMacro): >- (MacroExpand): >- * src/compiler/preprocessor/cpp.h: >- * src/compiler/preprocessor/memory.h: >- * src/compiler/preprocessor/new: Added properties allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs, allow-tabs and allow-tabs. >- * src/compiler/preprocessor/new/Context.cpp: Removed. >- * src/compiler/preprocessor/new/Context.h: Removed. >- * src/compiler/preprocessor/new/Diagnostics.h: Added. >- (pp): >- (Diagnostics): >- * src/compiler/preprocessor/new/DiagnosticsBase.cpp: Added. >- (pp): >- (pp::Diagnostics::~Diagnostics): >- (pp::Diagnostics::report): >- (pp::Diagnostics::severity): >- * src/compiler/preprocessor/new/DirectiveHandler.h: Added. >- (pp): >- (DirectiveHandler): >- * src/compiler/preprocessor/new/DirectiveHandlerBase.cpp: Added. >- (pp): >- (pp::DirectiveHandler::~DirectiveHandler): >- * src/compiler/preprocessor/new/DirectiveParser.cpp: Added. >- (getDirective): >- (isConditionalDirective): >- (isEOD): >- (skipUntilEOD): >- (isMacroNameReserved): >- (isMacroPredefined): >- (pp): >- (DefinedParser): >- (pp::DefinedParser::DefinedParser): >- (pp::DefinedParser::lex): >- (pp::DirectiveParser::DirectiveParser): >- (pp::DirectiveParser::lex): >- (pp::DirectiveParser::parseDirective): >- (pp::DirectiveParser::parseDefine): >- (pp::DirectiveParser::parseUndef): >- (pp::DirectiveParser::parseIf): >- (pp::DirectiveParser::parseIfdef): >- (pp::DirectiveParser::parseIfndef): >- (pp::DirectiveParser::parseElse): >- (pp::DirectiveParser::parseElif): >- (pp::DirectiveParser::parseEndif): >- (pp::DirectiveParser::parseError): >- (pp::DirectiveParser::parsePragma): >- (pp::DirectiveParser::parseExtension): >- (pp::DirectiveParser::parseVersion): >- (pp::DirectiveParser::parseLine): >- (pp::DirectiveParser::skipping): >- (pp::DirectiveParser::parseConditionalIf): >- (pp::DirectiveParser::parseExpressionIf): >- (pp::DirectiveParser::parseExpressionIfdef): >- * src/compiler/preprocessor/new/DirectiveParser.h: Added. >- (pp): >- (DirectiveParser): >- (ConditionalBlock): >- (pp::DirectiveParser::ConditionalBlock::ConditionalBlock): >- * src/compiler/preprocessor/new/ExpressionParser.cpp: Added. >- (yysyntax_error): >- (yylex): >- (yyerror): >- (pp): >- (pp::ExpressionParser::ExpressionParser): >- (pp::ExpressionParser::parse): >- * src/compiler/preprocessor/new/ExpressionParser.h: Added. >- (pp): >- (ExpressionParser): >- * src/compiler/preprocessor/new/ExpressionParser.y: Added. >- * src/compiler/preprocessor/new/Input.cpp: Added property allow-tabs. >- (pp::Input::Input): >- (pp::Input::read): >- * src/compiler/preprocessor/new/Input.h: Added property allow-tabs. >- (pp): >- (Input): >- (pp::Input::count): >- (pp::Input::string): >- (pp::Input::length): >- (Location): >- (pp::Input::Location::Location): >- (pp::Input::readLoc): >- * src/compiler/preprocessor/new/Lexer.cpp: Added. >- (pp): >- (pp::Lexer::~Lexer): >- * src/compiler/preprocessor/new/Lexer.h: Added. >- (pp): >- (Lexer): >- * src/compiler/preprocessor/new/Macro.cpp: Added property allow-tabs. >- (pp::Macro::equals): >- * src/compiler/preprocessor/new/Macro.h: Added property allow-tabs. >- (pp): >- (pp::Macro::Macro): >- (Macro): >- * src/compiler/preprocessor/new/MacroExpander.cpp: Added. >- (pp): >- (TokenLexer): >- (pp::TokenLexer::TokenLexer): >- (pp::TokenLexer::lex): >- (pp::MacroExpander::MacroExpander): >- (pp::MacroExpander::~MacroExpander): >- (pp::MacroExpander::lex): >- (pp::MacroExpander::getToken): >- (pp::MacroExpander::ungetToken): >- (pp::MacroExpander::isNextTokenLeftParen): >- (pp::MacroExpander::pushMacro): >- (pp::MacroExpander::popMacro): >- (pp::MacroExpander::expandMacro): >- (pp::MacroExpander::collectMacroArgs): >- (pp::MacroExpander::replaceMacroParams): >- * src/compiler/preprocessor/new/MacroExpander.h: Added. >- (pp): >- (MacroExpander): >- (MacroContext): >- (pp::MacroExpander::MacroContext::MacroContext): >- (pp::MacroExpander::MacroContext::empty): >- (pp::MacroExpander::MacroContext::get): >- (pp::MacroExpander::MacroContext::unget): >- * src/compiler/preprocessor/new/Preprocessor.cpp: Added property allow-tabs. >- (PreprocessorImpl): >- (pp::PreprocessorImpl::PreprocessorImpl): >- (pp): >- (pp::Preprocessor::Preprocessor): >- (pp::Preprocessor::~Preprocessor): >- (pp::Preprocessor::init): >- (pp::Preprocessor::predefineMacro): >- (pp::Preprocessor::lex): >- * src/compiler/preprocessor/new/Preprocessor.h: Added property allow-tabs. >- (pp): >- (Preprocessor): >- * src/compiler/preprocessor/new/SourceLocation.h: Added. >- (pp): >- (pp::SourceLocation::SourceLocation): >- (SourceLocation): >- (pp::SourceLocation::equals): >- (pp::operator==): >- (pp::operator!=): >- * src/compiler/preprocessor/new/Token.cpp: Added property allow-tabs. >- (pp::Token::reset): >- (pp::Token::equals): >- (pp::Token::setAtStartOfLine): >- (pp::Token::setHasLeadingSpace): >- (pp): >- (pp::Token::setExpansionDisabled): >- (pp::operator<<): >- * src/compiler/preprocessor/new/Token.h: Added property allow-tabs. >- (pp::Token::Token): >- (Token): >- (pp::Token::atStartOfLine): >- (pp::Token::hasLeadingSpace): >- (pp::Token::expansionDisabled): >- (pp::operator==): >- (pp): >- (pp::operator!=): >- * src/compiler/preprocessor/new/Tokenizer.cpp: Added. >- (yy_buffer_state): >- (yy_trans_info): >- (yyguts_t): >- (yy_get_previous_state): >- (yy_try_NUL_trans): >- (input): >- (pprestart): >- (pp_switch_to_buffer): >- (pp_load_buffer_state): >- (pp_create_buffer): >- (pp_delete_buffer): >- (pp_init_buffer): >- (pp_flush_buffer): >- (pppush_buffer_state): >- (pppop_buffer_state): >- (ppensure_buffer_stack): >- (pp_scan_buffer): >- (pp_scan_string): >- (pp_scan_bytes): >- (yy_fatal_error): >- (ppget_extra): >- (ppget_lineno): >- (ppget_column): >- (ppget_in): >- (ppget_out): >- (ppget_leng): >- (ppget_text): >- (ppset_extra): >- (ppset_lineno): >- (ppset_column): >- (ppset_in): >- (ppset_out): >- (ppget_debug): >- (ppset_debug): >- (ppget_lval): >- (ppset_lval): >- (ppget_lloc): >- (ppset_lloc): >- (pplex_init): >- (pplex_init_extra): >- (yy_init_globals): >- (pplex_destroy): >- (yy_flex_strncpy): >- (yy_flex_strlen): >- (ppalloc): >- (pprealloc): >- (ppfree): >- (pp): >- (pp::Tokenizer::Tokenizer): >- (pp::Tokenizer::~Tokenizer): >- (pp::Tokenizer::init): >- (pp::Tokenizer::setFileNumber): >- (pp::Tokenizer::setLineNumber): >- (pp::Tokenizer::lex): >- (pp::Tokenizer::initScanner): >- (pp::Tokenizer::destroyScanner): >- * src/compiler/preprocessor/new/Tokenizer.h: Added. >- (pp): >- (Tokenizer): >- (Context): >- * src/compiler/preprocessor/new/Tokenizer.l: Added. >- * src/compiler/preprocessor/new/generate_parser.sh: Added property allow-tabs. >- * src/compiler/preprocessor/new/pp.l: Removed. >- * src/compiler/preprocessor/new/pp.y: Removed. >- * src/compiler/preprocessor/new/pp_lex.cpp: Removed. >- * src/compiler/preprocessor/new/pp_tab.cpp: Removed. >- * src/compiler/preprocessor/new/pp_tab.h: Removed. >- * src/compiler/preprocessor/new/pp_utils.h: Added. >- * src/compiler/preprocessor/new/preprocessor.vcproj: Added. >- * src/compiler/preprocessor/new/stl_utils.h: Removed. >- * src/compiler/preprocessor/new/token_type.h: Removed. >- * src/compiler/preprocessor/preprocess.h: >- * src/compiler/preprocessor/scanner.c: >- (InitScannerInput): >- * src/compiler/preprocessor/scanner.h: >- * src/compiler/preprocessor/symbols.h: >- * src/compiler/preprocessor/tokens.c: >- (ReadToken): >- (DumpTokenStream): >- * src/compiler/preprocessor/tokens.h: >- * src/compiler/timing: Added. >- * src/compiler/timing/RestrictFragmentShaderTiming.cpp: Added. >- (RestrictFragmentShaderTiming::RestrictFragmentShaderTiming): >- (RestrictFragmentShaderTiming::enforceRestrictions): >- (RestrictFragmentShaderTiming::validateUserDefinedFunctionCallUsage): >- (RestrictFragmentShaderTiming::beginError): >- (RestrictFragmentShaderTiming::isSamplingOp): >- (RestrictFragmentShaderTiming::visitArgument): >- (RestrictFragmentShaderTiming::visitSelection): >- (RestrictFragmentShaderTiming::visitLoop): >- (RestrictFragmentShaderTiming::visitLogicalOp): >- * src/compiler/timing/RestrictFragmentShaderTiming.h: Added. >- (RestrictFragmentShaderTiming): >- (RestrictFragmentShaderTiming::numErrors): >- * src/compiler/timing/RestrictVertexShaderTiming.cpp: Added. >- (RestrictVertexShaderTiming::visitSymbol): >- * src/compiler/timing/RestrictVertexShaderTiming.h: Added. >- (RestrictVertexShaderTiming): >- (RestrictVertexShaderTiming::RestrictVertexShaderTiming): >- (RestrictVertexShaderTiming::enforceRestrictions): >- (RestrictVertexShaderTiming::numErrors): >- * src/libEGL/Display.cpp: >- (egl): >- (egl::Display::getDepthTextureSupport): >- (egl::Display::getTexturePool): >- * src/libEGL/Display.h: >- (Display): >- * src/libEGL/Surface.cpp: >- (egl::Surface::Surface): >- (egl::Surface::release): >- (egl::Surface::resetSwapChain): >- (egl::Surface::swapRect): >- (egl): >- (egl::Surface::swap): >- (egl::Surface::postSubBuffer): >- * src/libEGL/Surface.h: >- (Surface): >- * src/libEGL/libEGL.cpp: >- * src/libGLESv2/Context.cpp: >- (gl::Context::makeCurrent): >- (gl::Context::markDxUniformsDirty): >- (gl): >- (gl::Context::getIntegerv): >- (gl::Context::getQueryParameterInfo): >- (gl::Context::applyRenderTarget): >- (gl::Context::applyState): >- (gl::Context::applyShaders): >- (gl::Context::applyTextures): >- (gl::Context::readPixels): >- (gl::Context::clear): >- (gl::Context::drawArrays): >- (gl::Context::drawElements): >- (gl::Context::supportsDepthTextures): >- (gl::Context::initExtensionString): >- (gl::Context::blitFramebuffer): >- (gl::VertexDeclarationCache::applyDeclaration): >- * src/libGLESv2/Context.h: >- (Context): >- * src/libGLESv2/Framebuffer.cpp: >- (gl::Framebuffer::~Framebuffer): >- (gl): >- (gl::Framebuffer::getNullColorbuffer): >- (gl::Framebuffer::completeness): >- * src/libGLESv2/Framebuffer.h: >- (Framebuffer): >- * src/libGLESv2/Program.cpp: >- (gl): >- (gl::AttributeBindings::AttributeBindings): >- (gl::AttributeBindings::~AttributeBindings): >- (gl::InfoLog::InfoLog): >- (gl::InfoLog::~InfoLog): >- (gl::InfoLog::getLength): >- (gl::InfoLog::getLog): >- (gl::InfoLog::appendSanitized): >- (gl::InfoLog::append): >- (gl::InfoLog::reset): >- (gl::Program::Program): >- (gl::Program::~Program): >- (gl::Program::attachShader): >- (gl::Program::detachShader): >- (gl::Program::getAttachedShadersCount): >- (gl::AttributeBindings::bindAttributeLocation): >- (gl::Program::bindAttributeLocation): >- (gl::Program::link): >- (gl::AttributeBindings::getAttributeBinding): >- (gl::Program::unlink): >- (gl::Program::getProgramBinary): >- (gl::Program::setProgramBinary): >- (gl::Program::getInfoLogLength): >- (gl::Program::getInfoLog): >- (gl::Program::getActiveAttribute): >- (gl::Program::getActiveAttributeCount): >- (gl::Program::getActiveAttributeMaxLength): >- (gl::Program::getActiveUniform): >- (gl::Program::getActiveUniformCount): >- (gl::Program::getActiveUniformMaxLength): >- (gl::Program::validate): >- (gl::Program::isValidated): >- * src/libGLESv2/Program.h: >- (gl): >- (AttributeBindings): >- (InfoLog): >- (Program): >- * src/libGLESv2/ProgramBinary.cpp: Added. >- (gl::str): >- (gl): >- (gl::Uniform::Uniform): >- (gl::Uniform::~Uniform): >- (gl::Uniform::isArray): >- (gl::UniformLocation::UniformLocation): >- (gl::ProgramBinary::ProgramBinary): >- (gl::ProgramBinary::~ProgramBinary): >- (gl::ProgramBinary::getPixelShader): >- (gl::ProgramBinary::getVertexShader): >- (gl::ProgramBinary::getAttributeLocation): >- (gl::ProgramBinary::getSemanticIndex): >- (gl::ProgramBinary::getUsedSamplerRange): >- (gl::ProgramBinary::getSamplerMapping): >- (gl::ProgramBinary::getSamplerTextureType): >- (gl::ProgramBinary::getUniformLocation): >- (gl::ProgramBinary::setUniform1fv): >- (gl::ProgramBinary::setUniform2fv): >- (gl::ProgramBinary::setUniform3fv): >- (gl::ProgramBinary::setUniform4fv): >- (gl::transposeMatrix): >- (gl::ProgramBinary::setUniformMatrix2fv): >- (gl::ProgramBinary::setUniformMatrix3fv): >- (gl::ProgramBinary::setUniformMatrix4fv): >- (gl::ProgramBinary::setUniform1iv): >- (gl::ProgramBinary::setUniform2iv): >- (gl::ProgramBinary::setUniform3iv): >- (gl::ProgramBinary::setUniform4iv): >- (gl::ProgramBinary::getUniformfv): >- (gl::ProgramBinary::getUniformiv): >- (gl::ProgramBinary::dirtyAllUniforms): >- (gl::ProgramBinary::applyUniforms): >- (gl::ProgramBinary::compileToBinary): >- (gl::ProgramBinary::packVaryings): >- (gl::ProgramBinary::linkVaryings): >- (gl::ProgramBinary::link): >- (gl::ProgramBinary::linkAttributes): >- (gl::ProgramBinary::linkUniforms): >- (gl::ProgramBinary::defineUniform): >- (gl::ProgramBinary::createUniform): >- (gl::ProgramBinary::decorateAttribute): >- (gl::ProgramBinary::undecorateUniform): >- (gl::ProgramBinary::applyUniformnbv): >- (gl::ProgramBinary::applyUniformnfv): >- (gl::ProgramBinary::applyUniform1iv): >- (gl::ProgramBinary::applyUniform2iv): >- (gl::ProgramBinary::applyUniform3iv): >- (gl::ProgramBinary::applyUniform4iv): >- (gl::ProgramBinary::applyUniformniv): >- (gl::ProgramBinary::isValidated): >- (gl::ProgramBinary::getActiveAttribute): >- (gl::ProgramBinary::getActiveAttributeCount): >- (gl::ProgramBinary::getActiveAttributeMaxLength): >- (gl::ProgramBinary::getActiveUniform): >- (gl::ProgramBinary::getActiveUniformCount): >- (gl::ProgramBinary::getActiveUniformMaxLength): >- (gl::ProgramBinary::validate): >- (gl::ProgramBinary::validateSamplers): >- (gl::ProgramBinary::getDxDepthRangeLocation): >- (gl::ProgramBinary::getDxDepthLocation): >- (gl::ProgramBinary::getDxCoordLocation): >- (gl::ProgramBinary::getDxHalfPixelSizeLocation): >- (gl::ProgramBinary::getDxFrontCCWLocation): >- (gl::ProgramBinary::getDxPointsOrLinesLocation): >- * src/libGLESv2/ProgramBinary.h: Added. >- (gl): >- (Uniform): >- (gl::Uniform::RegisterInfo::RegisterInfo): >- (RegisterInfo): >- (gl::Uniform::RegisterInfo::set): >- (UniformLocation): >- (ProgramBinary): >- (Sampler): >- * src/libGLESv2/Renderbuffer.cpp: >- (gl): >- (gl::RenderbufferTexture2D::RenderbufferTexture2D): >- (gl::RenderbufferTexture2D::~RenderbufferTexture2D): >- (gl::RenderbufferTexture2D::addProxyRef): >- (gl::RenderbufferTexture2D::releaseProxy): >- (gl::RenderbufferTexture2D::getRenderTarget): >- (gl::RenderbufferTexture2D::getDepthStencil): >- (gl::RenderbufferTexture2D::getWidth): >- (gl::RenderbufferTexture2D::getHeight): >- (gl::RenderbufferTexture2D::getInternalFormat): >- (gl::RenderbufferTexture2D::getD3DFormat): >- (gl::RenderbufferTexture2D::getSamples): >- (gl::RenderbufferTexture2D::getSerial): >- (gl::RenderbufferTextureCubeMap::RenderbufferTextureCubeMap): >- (gl::RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap): >- (gl::RenderbufferTextureCubeMap::addProxyRef): >- (gl::RenderbufferTextureCubeMap::releaseProxy): >- (gl::RenderbufferTextureCubeMap::getRenderTarget): >- (gl::RenderbufferTextureCubeMap::getDepthStencil): >- (gl::RenderbufferTextureCubeMap::getWidth): >- (gl::RenderbufferTextureCubeMap::getHeight): >- (gl::RenderbufferTextureCubeMap::getInternalFormat): >- (gl::RenderbufferTextureCubeMap::getD3DFormat): >- (gl::RenderbufferTextureCubeMap::getSamples): >- (gl::RenderbufferTextureCubeMap::getSerial): >- (gl::DepthStencilbuffer::getDepthStencil): >- * src/libGLESv2/Renderbuffer.h: >- (gl): >- (RenderbufferTexture2D): >- (RenderbufferTextureCubeMap): >- * src/libGLESv2/Shader.cpp: >- (gl::Shader::getInfoLog): >- (gl::Shader::getSourceImpl): >- * src/libGLESv2/Shader.h: >- (Shader): >- (VertexShader): >- * src/libGLESv2/Texture.cpp: >- (gl::ConvertTextureFormatType): >- (gl::IsTextureFormatRenderable): >- (gl::GetTextureUsage): >- (gl): >- (gl::Image::createSurface): >- (gl::Image::updateSurface): >- (gl::Image::loadData): >- (gl::Image::loadAlphaData): >- (gl::Image::loadAlphaDataSSE2): >- (gl::Image::loadAlphaFloatData): >- (gl::Image::loadAlphaHalfFloatData): >- (gl::Image::loadLuminanceData): >- (gl::Image::loadLuminanceFloatData): >- (gl::Image::loadLuminanceHalfFloatData): >- (gl::Image::loadLuminanceAlphaData): >- (gl::Image::loadLuminanceAlphaFloatData): >- (gl::Image::loadLuminanceAlphaHalfFloatData): >- (gl::Image::loadRGBUByteData): >- (gl::Image::loadRGB565Data): >- (gl::Image::loadRGBFloatData): >- (gl::Image::loadRGBHalfFloatData): >- (gl::Image::loadRGBAUByteDataSSE2): >- (gl::Image::loadRGBAUByteData): >- (gl::Image::loadRGBA4444Data): >- (gl::Image::loadRGBA5551Data): >- (gl::Image::loadRGBAFloatData): >- (gl::Image::loadRGBAHalfFloatData): >- (gl::Image::loadBGRAData): >- (gl::Image::loadCompressedData): >- (gl::Image::copy): >- (gl::TextureStorage::TextureStorage): >- (gl::TextureStorage::isRenderTarget): >- (gl::TextureStorage::getUsage): >- (gl::Texture::setImage): >- (gl::Texture::setCompressedImage): >- (gl::Texture::subImage): >- (gl::Texture::subImageCompressed): >- (gl::TextureStorage2D::TextureStorage2D): >- (gl::Texture2D::getInternalFormat): >- (gl::Texture2D::getD3DFormat): >- (gl::Texture2D::copyImage): >- (gl::Texture2D::copySubImage): >- (gl::Texture2D::storage): >- (gl::Texture2D::isSamplerComplete): >- (gl::Texture2D::isCompressed): >- (gl::Texture2D::isDepth): >- (gl::Texture2D::createTexture): >- (gl::Texture2D::convertToRenderTarget): >- (gl::Texture2D::getRenderbuffer): >- (gl::Texture2D::getRenderTarget): >- (gl::Texture2D::getDepthStencil): >- (gl::TextureStorageCubeMap::TextureStorageCubeMap): >- (gl::TextureCubeMap::getWidth): >- (gl::TextureCubeMap::getHeight): >- (gl::TextureCubeMap::getInternalFormat): >- (gl::TextureCubeMap::getD3DFormat): >- (gl::TextureCubeMap::isSamplerComplete): >- (gl::TextureCubeMap::isCompressed): >- (gl::TextureCubeMap::createTexture): >- (gl::TextureCubeMap::convertToRenderTarget): >- (gl::TextureCubeMap::copyImage): >- (gl::TextureCubeMap::copySubImage): >- (gl::TextureCubeMap::storage): >- (gl::TextureCubeMap::getRenderbuffer): >- * src/libGLESv2/Texture.h: >- (Image): >- (TextureStorage): >- (Texture): >- (TextureStorage2D): >- (Texture2D): >- (TextureStorageCubeMap): >- (TextureCubeMap): >- * src/libGLESv2/VertexDataManager.cpp: >- (gl::VertexDataManager::prepareVertexData): >- * src/libGLESv2/libGLESv2.cpp: >- (checkTextureFormatType): >- (validateSubImageParams2D): >- (validateSubImageParamsCube): >- * src/libGLESv2/libGLESv2.vcproj: >- * src/libGLESv2/mathutil.h: >- (gl): >- * src/libGLESv2/utilities.cpp: >- (gl::IsDepthTexture): >- (gl): >- (gl::ComputePixelSize): >- (gl::ExtractFormat): >- (gl::ExtractType): >- (es2dx::ConvertCubeFace): >- (es2dx::ConvertRenderbufferFormat): >- (dx2es::GetStencilSize): >- (dx2es::GetDepthSize): >- (dx2es::IsDepthTextureFormat): >- (dx2es): >- (dx2es::IsStencilTextureFormat): >- (dx2es::ConvertDepthStencilFormat): >- * src/libGLESv2/utilities.h: >- (gl): >- (dx2es): >- >-2012-07-11 Mark Rowe <mrowe@apple.com> >- >- <http://webkit.org/b/91024> Build against the latest SDK when targeting older OS X versions. >- >- Reviewed by Dan Bernstein. >- >- The deployment target is already set to the version that we're targeting, and it's that setting >- which determines which functionality from the SDK is available to us. >- >- * Configurations/Base.xcconfig: >- >-2012-06-22 Joshua Netterfield <jnetterfield@rim.com> >- >- [BlackBerry] Sanitize GLSL code using ANGLE. >- >- BlackBerry port does not sanitize GLSL code with ANGLE >- https://bugs.webkit.org/show_bug.cgi?id=89583 >- >- Reviewed by Rob Buis. >- >- * src/compiler/osinclude.h: Recognises QNX as POSIX >- >-2012-03-26 Dean Jackson <dino@apple.com> >- >- Update ANGLE in WebKit >- https://bugs.webkit.org/show_bug.cgi?id=81717 >- >- Reviewed by Kenneth Russell. >- >- Update angleproject to r1009. Synced the source directory >- between the angle repository and WebKit. Ran the OS X Lion >- version of Bison over the glslang.l input which generates >- a slightly different output than angle provided. >- >- * include/EGL/eglext.h: >- * include/GLES2/gl2ext.h: >- * include/GLSLANG/ShaderLang.h: >- * src/common/RefCountObject.cpp: Renamed from Source/ThirdParty/ANGLE/src/libGLESv2/RefCountObject.cpp. >- (RefCountObject::RefCountObject): >- (RefCountObject::~RefCountObject): >- (RefCountObject::addRef): >- (RefCountObject::release): >- (RefCountObjectBindingPointer::set): >- * src/common/RefCountObject.h: Renamed from Source/ThirdParty/ANGLE/src/libGLESv2/RefCountObject.h. >- (RefCountObject): >- (RefCountObject::id): >- (RefCountObjectBindingPointer): >- (RefCountObjectBindingPointer::RefCountObjectBindingPointer): >- (RefCountObjectBindingPointer::~RefCountObjectBindingPointer): >- (RefCountObjectBindingPointer::get): >- (RefCountObjectBindingPointer::id): >- (RefCountObjectBindingPointer::operator ! ): >- (BindingPointer): >- (BindingPointer::set): >- (BindingPointer::get): >- (BindingPointer::operator -> ): >- * src/common/debug.cpp: >- (gl::output): >- * src/common/version.h: >- * src/compiler/BaseTypes.h: >- * src/compiler/Compiler.cpp: >- (TCompiler::TCompiler): >- (TCompiler::~TCompiler): >- (TCompiler::mapLongVariableNames): >- * src/compiler/ConstantUnion.h: >- (ConstantUnion::ConstantUnion): >- (ConstantUnion::operator==): >- (ConstantUnion::operator>): >- (ConstantUnion::operator<): >- * src/compiler/Intermediate.cpp: >- (TIntermConstantUnion::fold): >- * src/compiler/MapLongVariableNames.cpp: >- (LongNameMap::LongNameMap): >- (LongNameMap::~LongNameMap): >- (LongNameMap::GetInstance): >- (LongNameMap::Release): >- (LongNameMap::Find): >- (LongNameMap::Insert): >- (LongNameMap::Size): >- (MapLongVariableNames::MapLongVariableNames): >- (MapLongVariableNames::visitSymbol): >- (MapLongVariableNames::mapGlobalLongName): >- * src/compiler/MapLongVariableNames.h: >- (LongNameMap): >- (MapLongVariableNames): >- * src/compiler/OutputHLSL.cpp: >- (sh::OutputHLSL::OutputHLSL): >- (sh::OutputHLSL::header): >- (sh::OutputHLSL::visitSymbol): >- (sh::OutputHLSL::visitUnary): >- (sh::OutputHLSL::visitAggregate): >- (sh::OutputHLSL::visitLoop): >- (sh::OutputHLSL::handleExcessiveLoop): >- (sh::OutputHLSL::typeString): >- (sh::OutputHLSL::addConstructor): >- (sh::OutputHLSL::decorateUniform): >- * src/compiler/OutputHLSL.h: >- (OutputHLSL): >- * src/compiler/PoolAlloc.cpp: >- (TAllocation::checkGuardBlock): >- * src/compiler/ShHandle.h: >- (TCompiler): >- * src/compiler/SymbolTable.cpp: >- * src/compiler/SymbolTable.h: >- (TSymbolTable): >- (TSymbolTable::getOuterLevel): >- * src/compiler/VariableInfo.cpp: >- (getVariableDataType): >- * src/compiler/glslang.l: >- * src/compiler/glslang.y: >- * src/compiler/glslang_lex.cpp: >- (yy_buffer_state): >- (yyguts_t): >- (input): >- (yyensure_buffer_stack): >- (yy_scan_bytes): >- (yyget_leng): >- * src/compiler/glslang_tab.cpp: >- * src/compiler/osinclude.h: >- * src/compiler/preprocessor/cpp.c: >- * src/compiler/preprocessor/memory.c: >- * src/compiler/preprocessor/new/Context.cpp: Added. >- (isMacroNameReserved): >- (pp): >- (pp::Context::Context): >- (pp::Context::~Context): >- (pp::Context::init): >- (pp::Context::process): >- (pp::Context::defineMacro): >- (pp::Context::undefineMacro): >- (pp::Context::isMacroDefined): >- (pp::Context::reset): >- (pp::Context::defineBuiltInMacro): >- * src/compiler/preprocessor/new/Context.h: Added. >- (pp): >- (Context): >- (pp::Context::lexer): >- (pp::Context::output): >- * src/compiler/preprocessor/new/Input.cpp: Added. >- (pp): >- (pp::Input::Input): >- (pp::Input::eof): >- (pp::Input::read): >- (pp::Input::getChar): >- (pp::Input::peekChar): >- (pp::Input::switchToNextString): >- (pp::Input::isStringEmpty): >- (pp::Input::stringLength): >- * src/compiler/preprocessor/new/Input.h: Added. >- (pp): >- (Input): >- (pp::Input::error): >- (pp::Input::stringIndex): >- * src/compiler/preprocessor/new/Macro.cpp: Added. >- (pp): >- (pp::Macro::Macro): >- (pp::Macro::~Macro): >- * src/compiler/preprocessor/new/Macro.h: Added. >- (pp): >- (Macro): >- (pp::Macro::type): >- (pp::Macro::identifier): >- (pp::Macro::parameters): >- (pp::Macro::replacements): >- * src/compiler/preprocessor/new/Preprocessor.cpp: Added. >- (pp): >- (pp::Preprocessor::Preprocessor): >- (pp::Preprocessor::~Preprocessor): >- (pp::Preprocessor::init): >- (pp::Preprocessor::process): >- (pp::Preprocessor::reset): >- * src/compiler/preprocessor/new/Preprocessor.h: Added. >- (pp): >- (Preprocessor): >- (pp::Preprocessor::begin): >- (pp::Preprocessor::end): >- * src/compiler/preprocessor/new/Token.cpp: Added. >- (pp): >- (pp::Token::encodeLocation): >- (pp::Token::decodeLocation): >- (pp::Token::Token): >- (pp::Token::~Token): >- (pp::operator<<): >- * src/compiler/preprocessor/new/Token.h: Added. >- (pp): >- (Token): >- (pp::Token::location): >- (pp::Token::type): >- (pp::Token::value): >- * src/compiler/preprocessor/new/generate_parser.sh: Added. >- * src/compiler/preprocessor/new/pp.l: Added. >- * src/compiler/preprocessor/new/pp.y: Added. >- * src/compiler/preprocessor/new/pp_lex.cpp: Added. >- (yy_buffer_state): >- (yy_trans_info): >- (yyguts_t): >- (yy_get_previous_state): >- (yy_try_NUL_trans): >- (input): >- (pprestart): >- (pp_switch_to_buffer): >- (pp_load_buffer_state): >- (pp_create_buffer): >- (pp_delete_buffer): >- (pp_init_buffer): >- (pp_flush_buffer): >- (pppush_buffer_state): >- (pppop_buffer_state): >- (ppensure_buffer_stack): >- (pp_scan_buffer): >- (pp_scan_string): >- (pp_scan_bytes): >- (yy_push_state): >- (yy_pop_state): >- (yy_top_state): >- (yy_fatal_error): >- (ppget_extra): >- (ppget_lineno): >- (ppget_column): >- (ppget_in): >- (ppget_out): >- (ppget_leng): >- (ppget_text): >- (ppset_extra): >- (ppset_lineno): >- (ppset_column): >- (ppset_in): >- (ppset_out): >- (ppget_debug): >- (ppset_debug): >- (ppget_lval): >- (ppset_lval): >- (ppget_lloc): >- (ppset_lloc): >- (pplex_init): >- (pplex_init_extra): >- (yy_init_globals): >- (pplex_destroy): >- (yy_flex_strncpy): >- (yy_flex_strlen): >- (ppalloc): >- (pprealloc): >- (ppfree): >- (extractMacroName): >- (pp): >- (pp::Context::readInput): >- (pp::Context::initLexer): >- (pp::Context::destroyLexer): >- * src/compiler/preprocessor/new/pp_tab.cpp: Added. >- (YYLTYPE): >- (yysyntax_error): >- (yyerror): >- (pushConditionalBlock): >- (popConditionalBlock): >- (pp::Context::parse): >- * src/compiler/preprocessor/new/pp_tab.h: Added. >- (YYLTYPE): >- * src/compiler/preprocessor/new/stl_utils.h: Added. >- (pp): >- (Delete): >- (pp::Delete::operator()): >- (DeleteSecond): >- (pp::DeleteSecond::operator()): >- * src/compiler/preprocessor/new/token_type.h: Added. >- * src/compiler/preprocessor/scanner.c: >- (yylex_CPP): >- * src/compiler/preprocessor/symbols.c: >- * src/compiler/preprocessor/tokens.c: >- * src/libEGL/Config.cpp: >- (egl::ConfigSet::getConfigs): >- * src/libEGL/Display.cpp: >- (egl::Display::initialize): >- (egl::Display::terminate): >- (egl::Display::restoreLostDevice): >- (egl::Display::sync): >- (egl): >- (egl::Display::allocateEventQuery): >- (egl::Display::freeEventQuery): >- (egl::Display::getFloat32TextureSupport): >- (egl::Display::getFloat16TextureSupport): >- (egl::Display::getEventQuerySupport): >- (egl::Display::initExtensionString): >- (egl::Display::shareHandleSupported): >- (egl::Display::getOcclusionQuerySupport): >- (egl::Display::getInstancingSupport): >- * src/libEGL/Display.h: >- (Display): >- (egl::Display::isD3d9ExDevice): >- * src/libEGL/Surface.cpp: >- (egl::Surface::resetSwapChain): >- * src/libEGL/libEGL.cpp: >- * src/libEGL/libEGL.vcproj: >- * src/libGLESv2/Blit.cpp: >- (gl::Blit::setCommonBlitState): >- * src/libGLESv2/Buffer.h: >- (Buffer): >- * src/libGLESv2/Context.cpp: >- (gl::Context::Context): >- (gl::Context::~Context): >- (gl::Context::makeCurrent): >- (gl::Context::getActiveQuery): >- (gl): >- (gl::Context::createFence): >- (gl::Context::createQuery): >- (gl::Context::deleteQuery): >- (gl::Context::beginQuery): >- (gl::Context::endQuery): >- (gl::Context::getQuery): >- (gl::Context::applyVertexBuffer): >- (gl::Context::applyIndexBuffer): >- (gl::Context::readPixels): >- (gl::Context::clear): >- (gl::Context::drawArrays): >- (gl::Context::drawElements): >- (gl::Context::sync): >- (gl::Context::drawLineLoop): >- (gl::Context::supportsOcclusionQueries): >- (gl::Context::supportsInstancing): >- (gl::Context::setVertexAttribDivisor): >- (gl::Context::initExtensionString): >- (gl::VertexDeclarationCache::applyDeclaration): >- (gl::VertexDeclarationCache::markStateDirty): >- * src/libGLESv2/Context.h: >- (gl): >- (gl::VertexAttribute::VertexAttribute): >- (State): >- (VertexDeclarationCache): >- (Context): >- * src/libGLESv2/Fence.cpp: >- (gl::Fence::Fence): >- (gl::Fence::~Fence): >- (gl::Fence::setFence): >- * src/libGLESv2/Fence.h: >- (egl): >- (Fence): >- * src/libGLESv2/Framebuffer.cpp: >- (gl::Framebuffer::lookupRenderbuffer): >- (gl::Framebuffer::detachTexture): >- (gl::Framebuffer::completeness): >- * src/libGLESv2/Framebuffer.h: >- * src/libGLESv2/IndexDataManager.cpp: >- (gl::IndexDataManager::IndexDataManager): >- (gl::IndexDataManager::~IndexDataManager): >- (gl::computeRange): >- (gl::IndexDataManager::prepareIndexData): >- (gl::IndexDataManager::getCountingIndices): >- (gl): >- * src/libGLESv2/IndexDataManager.h: >- (IndexDataManager): >- * src/libGLESv2/Program.cpp: >- (gl::Program::getUniformLocation): >- (gl::Program::setUniform1fv): >- (gl::Program::setUniform2fv): >- (gl::Program::setUniform3fv): >- (gl::Program::setUniform4fv): >- (gl::Program::setUniform1iv): >- (gl::Program::setUniform2iv): >- (gl::Program::setUniform3iv): >- (gl::Program::setUniform4iv): >- (gl::Program::packVaryings): >- (gl::Program::linkVaryings): >- (gl::Program::defineUniform): >- (gl::Program::createUniform): >- (gl::Program::applyUniformnbv): >- (gl::Program::applyUniform1iv): >- (gl::Program::applyUniform2iv): >- (gl::Program::applyUniform3iv): >- (gl::Program::applyUniform4iv): >- (gl::Program::getInfoLog): >- * src/libGLESv2/Program.h: >- (Program): >- * src/libGLESv2/Query.cpp: Added. >- (gl): >- (gl::Query::Query): >- (gl::Query::~Query): >- (gl::Query::begin): >- (gl::Query::end): >- (gl::Query::getResult): >- (gl::Query::isResultAvailable): >- (gl::Query::getType): >- (gl::Query::testQuery): >- * src/libGLESv2/Query.h: Added. >- (gl): >- (Query): >- * src/libGLESv2/Renderbuffer.cpp: >- (gl): >- (gl::RenderbufferInterface::addProxyRef): >- (gl::RenderbufferInterface::releaseProxy): >- (gl::RenderbufferTexture::RenderbufferTexture): >- (gl::RenderbufferTexture::~RenderbufferTexture): >- (gl::RenderbufferTexture::addProxyRef): >- (gl::RenderbufferTexture::releaseProxy): >- (gl::Renderbuffer::addRef): >- (gl::Renderbuffer::release): >- * src/libGLESv2/Renderbuffer.h: >- (gl): >- (RenderbufferInterface): >- (RenderbufferTexture): >- (Renderbuffer): >- * src/libGLESv2/Shader.cpp: >- (gl::Shader::Shader): >- (gl::Shader::getInfoLog): >- (gl::Shader::getSourceImpl): >- (gl): >- (gl::Shader::initializeCompiler): >- (gl::Shader::parseVaryings): >- (gl::Shader::uncompile): >- (gl::Shader::compileToHLSL): >- (gl::VertexShader::uncompile): >- (gl::VertexShader::compile): >- (gl::VertexShader::parseAttributes): >- (gl::FragmentShader::compile): >- * src/libGLESv2/Shader.h: >- (Shader): >- (VertexShader): >- * src/libGLESv2/Texture.cpp: >- (gl::Texture2D::Texture2D): >- (gl::Texture2D::~Texture2D): >- (gl): >- (gl::Texture2D::addProxyRef): >- (gl::Texture2D::releaseProxy): >- (gl::Texture2D::getRenderbuffer): >- (gl::TextureCubeMap::TextureCubeMap): >- (gl::TextureCubeMap::~TextureCubeMap): >- (gl::TextureCubeMap::addProxyRef): >- (gl::TextureCubeMap::releaseProxy): >- (gl::TextureCubeMap::isSamplerComplete): >- (gl::TextureCubeMap::convertToRenderTarget): >- (gl::TextureCubeMap::getRenderbuffer): >- * src/libGLESv2/Texture.h: >- (Texture): >- (Texture2D): >- (TextureCubeMap): >- * src/libGLESv2/VertexDataManager.cpp: >- (gl::VertexDataManager::writeAttributeData): >- (gl::VertexDataManager::prepareVertexData): >- (gl::VertexDataManager::spaceRequired): >- (gl): >- * src/libGLESv2/VertexDataManager.h: >- (TranslatedAttribute): >- (VertexDataManager): >- * src/libGLESv2/libGLESv2.cpp: >- * src/libGLESv2/libGLESv2.def: >- * src/libGLESv2/libGLESv2.vcproj: >- * src/libGLESv2/utilities.cpp: >- (gl::IsInternalTextureTarget): >- * src/libGLESv2/utilities.h: >- (gl): >- >-2012-03-09 Ashod Nakashian <ashodnakashian@yahoo.com> >- >- Bash scripts should support LF endings only >- https://bugs.webkit.org/show_bug.cgi?id=79509 >- >- Reviewed by David Kilzer. >- >- * src/compiler/generate_parser.sh: Added property svn:eol-style. >- >-2012-02-21 Sam Weinig <sam@webkit.org> >- >- Attempt to fix the Snow Leopard build. >- >- * Configurations/Base.xcconfig: >- >-2012-02-21 Sam Weinig <sam@webkit.org> >- >- Use libc++ when building with Clang on Mac >- https://bugs.webkit.org/show_bug.cgi?id=78981 >- >- Reviewed by Dan Bernstein. >- >- * Configurations/Base.xcconfig: >- >-2012-01-07 Chris Marrin <cmarrin@apple.com> >- >- Fixed a warning in GTK build of ANGLE >- >- Unreviewed. >- >- * src/compiler/DetectRecursion.cpp: >- (DetectRecursion::~DetectRecursion): >- >-2012-01-06 Mark Rowe <mrowe@apple.com> >- >- Regenerate a few files with a more appropriate version of bison. >- >- Rubber-stamped by Dan Bernstein. >- >- * src/compiler/glslang.l: Tweak the input so that it generates code that compiles without warnings. >- * src/compiler/glslang_lex.cpp: >- * src/compiler/glslang_tab.cpp: >- * src/compiler/glslang_tab.h: >- >-2012-01-06 Chris Marrin <cmarrin@apple.com> >- >- Update ANGLE in WebKit tree >- https://bugs.webkit.org/show_bug.cgi?id=75753 >- >- Reviewed by Simon Fraser. >- >- Updated ANGLE to r939. Fixed a compiler error (missing case in switch statement) >- and added 5 new files to xcodeproj. Other than that it is a straight copy of >- the files from the ANGLE repository. >- >- * ANGLE.xcodeproj/project.pbxproj: >- * include/EGL/eglext.h: >- * include/EGL/eglplatform.h: >- * include/GLES2/gl2ext.h: >- * include/GLSLANG/ShaderLang.h: >- * src/common/debug.cpp: >- (gl::output): >- (gl::trace): >- (gl::perfActive): >- (gl::ScopedPerfEventHelper::ScopedPerfEventHelper): >- (gl::ScopedPerfEventHelper::~ScopedPerfEventHelper): >- * src/common/version.h: >- * src/compiler/BaseTypes.h: >- (getBasicString): >- * src/compiler/BuiltInFunctionEmulator.cpp: Added. >- (BuiltInFunctionEmulator::BuiltInFunctionEmulator): >- (BuiltInFunctionEmulator::SetFunctionCalled): >- (BuiltInFunctionEmulator::OutputEmulatedFunctionDefinition): >- (BuiltInFunctionEmulator::IdentifyFunction): >- (BuiltInFunctionEmulator::MarkBuiltInFunctionsForEmulation): >- (BuiltInFunctionEmulator::Cleanup): >- (BuiltInFunctionEmulator::GetEmulatedFunctionName): >- * src/compiler/BuiltInFunctionEmulator.h: Added. >- * src/compiler/Compiler.cpp: >- (TCompiler::TCompiler): >- (TCompiler::compile): >- (TCompiler::clearResults): >- (TCompiler::detectRecursion): >- (TCompiler::getMappedNameMaxLength): >- (TCompiler::getBuiltInFunctionEmulator): >- * src/compiler/DetectRecursion.cpp: Added. >- (DetectRecursion::FunctionNode::FunctionNode): >- (DetectRecursion::FunctionNode::getName): >- (DetectRecursion::FunctionNode::addCallee): >- (DetectRecursion::FunctionNode::detectRecursion): >- (DetectRecursion::DetectRecursion): >- (DetectRecursion::~DetectRecursion): >- (DetectRecursion::visitAggregate): >- (DetectRecursion::detectRecursion): >- (DetectRecursion::findFunctionByName): >- * src/compiler/DetectRecursion.h: Added. >- * src/compiler/ExtensionBehavior.h: >- * src/compiler/ForLoopUnroll.cpp: >- (ForLoopUnroll::MarkForLoopsWithIntegerIndicesForUnrolling): >- * src/compiler/ForLoopUnroll.h: >- * src/compiler/Initialize.cpp: >- (BuiltInFunctionsCommon): >- (BuiltInFunctionsVertex): >- (BuiltInFunctionsFragment): >- (TBuiltIns::initialize): >- (IdentifyBuiltIns): >- (InitExtensionBehavior): >- * src/compiler/MapLongVariableNames.cpp: >- (MapLongVariableNames::MapLongVariableNames): >- (MapLongVariableNames::visitSymbol): >- (MapLongVariableNames::mapVaryingLongName): >- * src/compiler/MapLongVariableNames.h: >- * src/compiler/OutputGLSLBase.cpp: >- (TOutputGLSLBase::visitUnary): >- (TOutputGLSLBase::visitAggregate): >- * src/compiler/OutputHLSL.cpp: >- (sh::OutputHLSL::OutputHLSL): >- (sh::OutputHLSL::header): >- (sh::OutputHLSL::visitSymbol): >- (sh::OutputHLSL::visitAggregate): >- (sh::OutputHLSL::visitSelection): >- (sh::OutputHLSL::visitLoop): >- (sh::OutputHLSL::handleExcessiveLoop): >- (sh::OutputHLSL::addConstructor): >- (sh::OutputHLSL::decorate): >- (sh::OutputHLSL::decorateUniform): >- * src/compiler/OutputHLSL.h: >- * src/compiler/ParseHelper.cpp: >- (TParseContext::recover): >- (TParseContext::reservedErrorCheck): >- (TParseContext::constructorErrorCheck): >- (TParseContext::extensionErrorCheck): >- (TParseContext::supportsExtension): >- (TParseContext::enterStructDeclaration): >- (TParseContext::exitStructDeclaration): >- (TParseContext::structNestingErrorCheck): >- * src/compiler/ParseHelper.h: >- (TParseContext::TParseContext): >- * src/compiler/PoolAlloc.h: >- (pool_allocator::pool_allocator): >- (pool_allocator::operator=): >- (pool_allocator::setAllocator): >- (pool_allocator::getAllocator): >- * src/compiler/ShHandle.h: >- * src/compiler/ShaderLang.cpp: >- (checkActiveUniformAndAttribMaxLengths): >- (checkMappedNameMaxLength): >- (getVariableInfo): >- (ShInitBuiltInResources): >- (ShGetInfo): >- * src/compiler/SymbolTable.cpp: >- (TType::computeDeepestStructNesting): >- * src/compiler/TranslatorESSL.cpp: >- (TranslatorESSL::translate): >- (TranslatorESSL::writeExtensionBehavior): >- * src/compiler/TranslatorGLSL.cpp: >- (TranslatorGLSL::translate): >- * src/compiler/Types.h: >- (TType::TType): >- (TType::copyType): >- (TType::setStruct): >- (TType::getDeepestStructNesting): >- * src/compiler/UnfoldSelect.cpp: >- (sh::UnfoldSelect::traverse): >- (sh::UnfoldSelect::visitSelection): >- (sh::UnfoldSelect::visitLoop): >- (sh::UnfoldSelect::getNextTemporaryIndex): >- * src/compiler/UnfoldSelect.h: >- * src/compiler/ValidateLimitations.cpp: >- * src/compiler/ValidateLimitations.h: >- * src/compiler/VariableInfo.cpp: >- (getVariableDataType): >- * src/compiler/generate_glslang_lexer.sh: Removed. >- * src/compiler/generate_glslang_parser.sh: Removed. >- * src/compiler/generate_parser.sh: Added. >- * src/compiler/glslang.l: >- * src/compiler/glslang.y: >- * src/compiler/glslang_lex.cpp: >- (yy_get_previous_state): >- (yy_try_NUL_trans): >- * src/compiler/glslang_tab.cpp: >- * src/compiler/glslang_tab.h: >- * src/compiler/intermOut.cpp: >- (TOutputTraverser::visitAggregate): >- * src/compiler/intermediate.h: >- (TIntermUnary::TIntermUnary): >- (TIntermUnary::setUseEmulatedFunction): >- (TIntermUnary::getUseEmulatedFunction): >- (TIntermAggregate::TIntermAggregate): >- (TIntermAggregate::setUseEmulatedFunction): >- (TIntermAggregate::getUseEmulatedFunction): >- * src/compiler/osinclude.h: >- * src/compiler/ossource_posix.cpp: >- (OS_AllocTLSIndex): >- (OS_SetTLSValue): >- (OS_FreeTLSIndex): >- * src/compiler/preprocessor/atom.c: >- (GrowAtomTable): >- * src/compiler/preprocessor/length_limits.h: Added. >- * src/compiler/preprocessor/scanner.h: >- * src/libEGL/Display.cpp: >- (egl::Display::getDisplay): >- (egl::Display::Display): >- (egl::Display::~Display): >- (egl::Display::initialize): >- (egl::Display::terminate): >- (egl::Display::startScene): >- (egl::Display::endScene): >- (egl::Display::createDevice): >- (egl::Display::initializeDevice): >- (egl::Display::resetDevice): >- (egl::Display::createWindowSurface): >- (egl::Display::createOffscreenSurface): >- (egl::Display::createContext): >- (egl::Display::restoreLostDevice): >- (egl::Display::notifyDeviceLost): >- (egl::Display::isDeviceLost): >- (egl::Display::testDeviceLost): >- (egl::Display::testDeviceResettable): >- (egl::Display::getDXT1TextureSupport): >- (egl::Display::getDXT3TextureSupport): >- (egl::Display::getDXT5TextureSupport): >- (egl::Display::getFloat32TextureSupport): >- (egl::Display::getFloat16TextureSupport): >- (egl::Display::getTexturePool): >- (egl::Display::initExtensionString): >- * src/libEGL/Display.h: >- * src/libEGL/Surface.cpp: >- (egl::Surface::Surface): >- (egl::Surface::initialize): >- (egl::Surface::resetSwapChain): >- (egl::Surface::subclassWindow): >- (egl::Surface::unsubclassWindow): >- (egl::Surface::swap): >- (egl::Surface::postSubBuffer): >- (egl::Surface::isPostSubBufferSupported): >- * src/libEGL/Surface.h: >- * src/libEGL/libEGL.cpp: >- * src/libEGL/libEGL.rc: >- * src/libEGL/libEGL.vcproj: >- * src/libGLESv2/Buffer.cpp: >- (gl::Buffer::bufferSubData): >- * src/libGLESv2/Context.cpp: >- (gl::Context::Context): >- (gl::Context::makeCurrent): >- (gl::Context::markAllStateDirty): >- (gl::Context::markContextLost): >- (gl::Context::isContextLost): >- (gl::Context::setPackReverseRowOrder): >- (gl::Context::getPackReverseRowOrder): >- (gl::Context::deleteProgram): >- (gl::Context::getDrawFramebuffer): >- (gl::Context::bindDrawFramebuffer): >- (gl::Context::useProgram): >- (gl::Context::setFramebufferZero): >- (gl::Context::getCurrentProgram): >- (gl::Context::getBooleanv): >- (gl::Context::getIntegerv): >- (gl::Context::getQueryParameterInfo): >- (gl::Context::applyRenderTarget): >- (gl::Context::applyState): >- (gl::Context::applyVertexBuffer): >- (gl::Context::applyIndexBuffer): >- (gl::Context::applyShaders): >- (gl::Context::applyTextures): >- (gl::Context::readPixels): >- (gl::Context::clear): >- (gl::Context::drawArrays): >- (gl::Context::drawElements): >- (gl::Context::sync): >- (gl::Context::drawClosingLine): >- (gl::Context::getResetStatus): >- (gl::Context::isResetNotificationEnabled): >- (gl::Context::supportsDXT1Textures): >- (gl::Context::supportsDXT3Textures): >- (gl::Context::supportsDXT5Textures): >- (gl::Context::supportsFloat32Textures): >- (gl::Context::supportsFloat32LinearFilter): >- (gl::Context::supportsFloat32RenderableTextures): >- (gl::Context::supportsFloat16Textures): >- (gl::Context::supportsFloat16LinearFilter): >- (gl::Context::supportsFloat16RenderableTextures): >- (gl::Context::initExtensionString): >- (gl::Context::initRendererString): >- (gl::Context::getRendererString): >- (gl::Context::blitFramebuffer): >- (gl::VertexDeclarationCache::applyDeclaration): >- (gl::VertexDeclarationCache::markStateDirty): >- * src/libGLESv2/Context.h: >- * src/libGLESv2/Fence.cpp: >- (gl::Fence::testFence): >- (gl::Fence::getFenceiv): >- * src/libGLESv2/Framebuffer.cpp: >- (gl::Framebuffer::setColorbuffer): >- (gl::Framebuffer::setDepthbuffer): >- (gl::Framebuffer::setStencilbuffer): >- (gl::Framebuffer::getColorbuffer): >- (gl::Framebuffer::getDepthbuffer): >- (gl::Framebuffer::getStencilbuffer): >- (gl::Framebuffer::hasStencil): >- (gl::Framebuffer::completeness): >- (gl::DefaultFramebuffer::DefaultFramebuffer): >- * src/libGLESv2/Framebuffer.h: >- * src/libGLESv2/IndexDataManager.cpp: >- (gl::IndexDataManager::prepareIndexData): >- (gl::IndexBuffer::IndexBuffer): >- (gl::IndexBuffer::getSerial): >- (gl::IndexBuffer::issueSerial): >- (gl::StreamingIndexBuffer::reserveSpace): >- (gl::StaticIndexBuffer::reserveSpace): >- (gl::StaticIndexBuffer::lookupRange): >- (gl::StaticIndexBuffer::addRange): >- * src/libGLESv2/IndexDataManager.h: >- (gl::StaticIndexBuffer::IndexRange::operator<): >- * src/libGLESv2/Program.cpp: >- (gl::Uniform::Uniform): >- (gl::Uniform::isArray): >- (gl::UniformLocation::UniformLocation): >- (gl::Program::Program): >- (gl::Program::detachShader): >- (gl::Program::getUsedSamplerRange): >- (gl::Program::getSamplerMapping): >- (gl::Program::getUniformLocation): >- (gl::Program::setUniform1fv): >- (gl::Program::setUniform2fv): >- (gl::Program::setUniform3fv): >- (gl::transposeMatrix): >- (gl::Program::setUniformMatrix2fv): >- (gl::Program::setUniformMatrix3fv): >- (gl::Program::setUniformMatrix4fv): >- (gl::Program::getUniformfv): >- (gl::Program::getUniformiv): >- (gl::Program::applyUniforms): >- (gl::Program::compileToBinary): >- (gl::Program::linkVaryings): >- (gl::Program::link): >- (gl::Program::defineUniform): >- (gl::Program::createUniform): >- (gl::Program::decorateAttribute): >- (gl::Program::undecorateUniform): >- (gl::Program::applyUniformnbv): >- (gl::Program::applyUniformnfv): >- (gl::Program::applyUniform1iv): >- (gl::Program::applyUniform2iv): >- (gl::Program::applyUniform3iv): >- (gl::Program::applyUniform4iv): >- (gl::Program::applyUniformniv): >- (gl::Program::appendToInfoLogSanitized): >- (gl::Program::unlink): >- (gl::Program::getActiveUniform): >- (gl::Program::getActiveUniformCount): >- (gl::Program::getActiveUniformMaxLength): >- (gl::Program::validateSamplers): >- (gl::Program::initializeConstantHandles): >- (gl::Program::getDxCoordLocation): >- * src/libGLESv2/Program.h: >- * src/libGLESv2/Renderbuffer.cpp: >- (gl::RenderbufferInterface::RenderbufferInterface): >- (gl::RenderbufferInterface::getRedSize): >- (gl::RenderbufferInterface::getGreenSize): >- (gl::RenderbufferInterface::getBlueSize): >- (gl::RenderbufferInterface::getAlphaSize): >- (gl::RenderbufferInterface::getDepthSize): >- (gl::RenderbufferInterface::getStencilSize): >- (gl::RenderbufferTexture::RenderbufferTexture): >- (gl::RenderbufferTexture::~RenderbufferTexture): >- (gl::RenderbufferTexture::getRenderTarget): >- (gl::RenderbufferTexture::getDepthStencil): >- (gl::RenderbufferTexture::getWidth): >- (gl::RenderbufferTexture::getHeight): >- (gl::RenderbufferTexture::getInternalFormat): >- (gl::RenderbufferTexture::getD3DFormat): >- (gl::RenderbufferTexture::getSamples): >- (gl::RenderbufferTexture::getSerial): >- (gl::Renderbuffer::Renderbuffer): >- (gl::Renderbuffer::~Renderbuffer): >- (gl::Renderbuffer::getRenderTarget): >- (gl::Renderbuffer::getDepthStencil): >- (gl::Renderbuffer::getWidth): >- (gl::Renderbuffer::getHeight): >- (gl::Renderbuffer::getInternalFormat): >- (gl::Renderbuffer::getD3DFormat): >- (gl::Renderbuffer::getRedSize): >- (gl::Renderbuffer::getGreenSize): >- (gl::Renderbuffer::getBlueSize): >- (gl::Renderbuffer::getAlphaSize): >- (gl::Renderbuffer::getDepthSize): >- (gl::Renderbuffer::getStencilSize): >- (gl::Renderbuffer::getSamples): >- (gl::Renderbuffer::getSerial): >- (gl::Renderbuffer::setStorage): >- (gl::RenderbufferStorage::getD3DFormat): >- (gl::RenderbufferStorage::issueCubeSerials): >- (gl::Colorbuffer::Colorbuffer): >- (gl::Colorbuffer::getRenderTarget): >- (gl::Depthbuffer::Depthbuffer): >- (gl::Stencilbuffer::Stencilbuffer): >- * src/libGLESv2/Renderbuffer.h: >- (gl::RenderbufferInterface::~RenderbufferInterface): >- * src/libGLESv2/Shader.cpp: >- (gl::Shader::getTranslatedSourceLength): >- (gl::Shader::getSourceImpl): >- (gl::Shader::getSource): >- (gl::Shader::getTranslatedSource): >- * src/libGLESv2/Shader.h: >- * src/libGLESv2/Texture.cpp: >- (gl::ConvertTextureFormatType): >- (gl::IsTextureFormatRenderable): >- (gl::Image::Image): >- (gl::Image::~Image): >- (gl::Image::redefine): >- (gl::Image::createSurface): >- (gl::Image::lock): >- (gl::Image::unlock): >- (gl::Image::isRenderableFormat): >- (gl::Image::getD3DFormat): >- (gl::Image::getSurface): >- (gl::Image::setManagedSurface): >- (gl::Image::updateSurface): >- (gl::Image::loadData): >- (gl::Image::loadAlphaData): >- (gl::Image::loadAlphaFloatData): >- (gl::Image::loadAlphaHalfFloatData): >- (gl::Image::loadLuminanceData): >- (gl::Image::loadLuminanceFloatData): >- (gl::Image::loadLuminanceHalfFloatData): >- (gl::Image::loadLuminanceAlphaData): >- (gl::Image::loadLuminanceAlphaFloatData): >- (gl::Image::loadLuminanceAlphaHalfFloatData): >- (gl::Image::loadRGBUByteData): >- (gl::Image::loadRGB565Data): >- (gl::Image::loadRGBFloatData): >- (gl::Image::loadRGBHalfFloatData): >- (gl::Image::loadRGBAUByteDataSSE2): >- (gl::Image::loadRGBAUByteData): >- (gl::Image::loadRGBA4444Data): >- (gl::Image::loadRGBA5551Data): >- (gl::Image::loadRGBAFloatData): >- (gl::Image::loadRGBAHalfFloatData): >- (gl::Image::loadBGRAData): >- (gl::Image::loadCompressedData): >- (gl::FlipCopyDXT1BlockFull): >- (gl::FlipCopyDXT1BlockHalf): >- (gl::FlipCopyDXT3BlockFull): >- (gl::FlipCopyDXT3BlockHalf): >- (gl::FlipCopyDXT5BlockFull): >- (gl::FlipCopyDXT5BlockHalf): >- (gl::Image::loadDXT1Data): >- (gl::Image::loadDXT3Data): >- (gl::Image::loadDXT5Data): >- (gl::Image::copy): >- (gl::TextureStorage::TextureStorage): >- (gl::TextureStorage::~TextureStorage): >- (gl::TextureStorage::isRenderTarget): >- (gl::TextureStorage::isManaged): >- (gl::TextureStorage::getPool): >- (gl::TextureStorage::getTextureSerial): >- (gl::TextureStorage::issueTextureSerial): >- (gl::Texture::Texture): >- (gl::Texture::~Texture): >- (gl::Texture::setMinFilter): >- (gl::Texture::setMagFilter): >- (gl::Texture::setWrapS): >- (gl::Texture::setWrapT): >- (gl::Texture::setUsage): >- (gl::Texture::getMinFilter): >- (gl::Texture::getMagFilter): >- (gl::Texture::getWrapS): >- (gl::Texture::getWrapT): >- (gl::Texture::getUsage): >- (gl::Texture::setImage): >- (gl::Texture::setCompressedImage): >- (gl::Texture::subImage): >- (gl::Texture::subImageCompressed): >- (gl::Texture::getTexture): >- (gl::Texture::hasDirtyParameters): >- (gl::Texture::hasDirtyImages): >- (gl::Texture::resetDirty): >- (gl::Texture::getTextureSerial): >- (gl::Texture::getRenderTargetSerial): >- (gl::Texture::isImmutable): >- (gl::Texture::creationLevels): >- (gl::Texture::getBlitter): >- (gl::Texture::copyToRenderTarget): >- (gl::TextureStorage2D::TextureStorage2D): >- (gl::TextureStorage2D::~TextureStorage2D): >- (gl::TextureStorage2D::getSurfaceLevel): >- (gl::TextureStorage2D::getBaseTexture): >- (gl::TextureStorage2D::getRenderTargetSerial): >- (gl::Texture2D::Texture2D): >- (gl::Texture2D::~Texture2D): >- (gl::Texture2D::getWidth): >- (gl::Texture2D::getHeight): >- (gl::Texture2D::getInternalFormat): >- (gl::Texture2D::getType): >- (gl::Texture2D::redefineImage): >- (gl::Texture2D::setImage): >- (gl::Texture2D::bindTexImage): >- (gl::Texture2D::releaseTexImage): >- (gl::Texture2D::setCompressedImage): >- (gl::Texture2D::commitRect): >- (gl::Texture2D::copyImage): >- (gl::Texture2D::copySubImage): >- (gl::Texture2D::storage): >- (gl::Texture2D::isSamplerComplete): >- (gl::Texture2D::isMipmapComplete): >- (gl::Texture2D::getBaseTexture): >- (gl::Texture2D::createTexture): >- (gl::Texture2D::updateTexture): >- (gl::Texture2D::convertToRenderTarget): >- (gl::Texture2D::generateMipmaps): >- (gl::Texture2D::getRenderbuffer): >- (gl::Texture2D::getRenderTarget): >- (gl::Texture2D::getStorage): >- (gl::TextureStorageCubeMap::TextureStorageCubeMap): >- (gl::TextureStorageCubeMap::~TextureStorageCubeMap): >- (gl::TextureStorageCubeMap::getCubeMapSurface): >- (gl::TextureStorageCubeMap::getBaseTexture): >- (gl::TextureStorageCubeMap::getRenderTargetSerial): >- (gl::TextureCubeMap::TextureCubeMap): >- (gl::TextureCubeMap::~TextureCubeMap): >- (gl::TextureCubeMap::getWidth): >- (gl::TextureCubeMap::getHeight): >- (gl::TextureCubeMap::getInternalFormat): >- (gl::TextureCubeMap::getType): >- (gl::TextureCubeMap::setCompressedImage): >- (gl::TextureCubeMap::commitRect): >- (gl::TextureCubeMap::subImage): >- (gl::TextureCubeMap::subImageCompressed): >- (gl::TextureCubeMap::isSamplerComplete): >- (gl::TextureCubeMap::isCubeComplete): >- (gl::TextureCubeMap::isMipmapCubeComplete): >- (gl::TextureCubeMap::getBaseTexture): >- (gl::TextureCubeMap::createTexture): >- (gl::TextureCubeMap::updateTexture): >- (gl::TextureCubeMap::convertToRenderTarget): >- (gl::TextureCubeMap::setImage): >- (gl::TextureCubeMap::redefineImage): >- (gl::TextureCubeMap::copyImage): >- (gl::TextureCubeMap::copySubImage): >- (gl::TextureCubeMap::storage): >- (gl::TextureCubeMap::generateMipmaps): >- (gl::TextureCubeMap::getRenderbuffer): >- (gl::TextureCubeMap::getRenderTarget): >- (gl::TextureCubeMap::getStorage): >- * src/libGLESv2/Texture.h: >- (gl::Image::markDirty): >- (gl::Image::markClean): >- (gl::Image::getWidth): >- (gl::Image::getHeight): >- (gl::Image::getFormat): >- (gl::Image::getType): >- (gl::Image::isDirty): >- * src/libGLESv2/VertexDataManager.cpp: >- (gl::elementsInBuffer): >- (gl::VertexDataManager::VertexDataManager): >- (gl::VertexDataManager::writeAttributeData): >- (gl::VertexDataManager::prepareVertexData): >- (gl::VertexBuffer::VertexBuffer): >- (gl::VertexBuffer::getSerial): >- (gl::VertexBuffer::issueSerial): >- (gl::StreamingVertexBuffer::reserveRequiredSpace): >- (gl::StaticVertexBuffer::map): >- (gl::StaticVertexBuffer::reserveRequiredSpace): >- (gl::StaticVertexBuffer::lookupAttribute): >- * src/libGLESv2/VertexDataManager.h: >- (gl::ArrayVertexBuffer::size): >- * src/libGLESv2/geometry/IndexDataManager.cpp: Removed. >- * src/libGLESv2/geometry/IndexDataManager.h: Removed. >- * src/libGLESv2/geometry/VertexDataManager.cpp: Removed. >- * src/libGLESv2/geometry/VertexDataManager.h: Removed. >- * src/libGLESv2/geometry/vertexconversion.h: Removed. >- * src/libGLESv2/libGLESv2.cpp: >- (validateSubImageParams): >- (validReadFormatType): >- (Extension::glBindTexImage): >- * src/libGLESv2/libGLESv2.def: >- * src/libGLESv2/libGLESv2.rc: >- * src/libGLESv2/libGLESv2.vcproj: >- * src/libGLESv2/main.cpp: >- (gl::getNonLostContext): >- (gl::checkDeviceLost): >- * src/libGLESv2/main.h: >- * src/libGLESv2/utilities.cpp: >- (gl::UniformExternalComponentCount): >- (gl::UniformInternalComponentCount): >- (gl::UniformComponentSize): >- (gl::UniformInternalSize): >- (gl::UniformExternalSize): >- (gl::ComputeCompressedSize): >- (gl::IsCompressed): >- (gl::ExtractFormat): >- (gl::ExtractType): >- (dx2es::IsFloat32Format): >- (dx2es::IsFloat16Format): >- * src/libGLESv2/utilities.h: >- (isDeviceLostError): >- >-2011-11-11 Darin Adler <darin@apple.com> >- >- * ANGLE.xcodeproj/project.pbxproj: Let a newer Xcode update this file. >- If an older Xcode downgrades this file and we have a risk of some kind of >- oscillating commit situation, please contact me so I know not to do this again. >- >-2011-09-19 Adam Roben <aroben@apple.com> >- >- Let Xcode 4 do its thang with ANGLE.xcodeproj >- >- * ANGLE.xcodeproj/project.pbxproj: >- >-2011-09-13 Anders Carlsson <andersca@apple.com> >- >- Disable C++ exceptions when building with clang >- https://bugs.webkit.org/show_bug.cgi?id=68031 >- <rdar://problem/9556880> >- >- Reviewed by Mark Rowe. >- >- * Configurations/Base.xcconfig: >- >-2011-09-08 Andras Becsi <andras.becsi@nokia.com> >- >- [Qt] Build fails with strict compiler >- https://bugs.webkit.org/show_bug.cgi?id=67778 >- >- Reviewed by Csaba Osztrogonác. >- >- * src/compiler/glslang_lex.cpp: Regenerate with generate_glslang_lexer.sh using a newer flex >- to suppress warning and fix the build when using [-Werror=unused-result] >- >-2011-08-12 Mark Rowe <mrowe@apple.com> >- >- Be more forward-looking in the choice of compiler. >- >- Rubber-stamped by Jon Honeycutt. >- >- * Configurations/CompilerVersion.xcconfig: >- >-2011-08-11 Renata Hodovan <reni@webkit.org> >- >- [Qt]Fix warnings after r92805. >- >- Reviewed by Csaba Osztrogonác. >- >- Control reached the end non-void functions. >- >- * src/compiler/ossource_posix.cpp: >- (OS_AllocTLSIndex): >- (OS_SetTLSValue): >- >-2011-08-11 Renata Hodovan <reni@webkit.org> >- >- Build fix on Qt Windows 32-bit Release/Debug after r92805. >- >- Unreviewed. >- >- * src/compiler/ossource_posix.cpp: >- (OS_FreeTLSIndex): >- >-2011-08-04 Mark Rowe <mrowe@apple.com> >- >- Future-proof Xcode configuration settings. >- >- * Configurations/Base.xcconfig: >- * Configurations/CompilerVersion.xcconfig: >- * Configurations/DebugRelease.xcconfig: >- >-2011-06-30 Mark Rowe <mrowe@apple.com> >- >- Rubber-stamped by Dan Bernstein. >- >- ANGLE shouldn't try to use internal SDKs. It doesn't need them! >- >- * Configurations/Base.xcconfig: >- >-2011-06-20 Zhenyao Mo <zmo@google.com> >- >- Reviewed by Kenneth Russell. >- >- Update ANGLE to r696 >- https://bugs.webkit.org/show_bug.cgi?id=56396 >- >- * ANGLE.xcodeproj/project.pbxproj: >- * include/EGL/eglext.h: >- * include/GLSLANG/ShaderLang.h: >- * src/build_angle.xcodeproj/project.pbxproj: >- * src/common/debug.cpp: >- (gl::output): >- (gl::trace): >- (gl::perfActive): >- (gl::ScopedPerfEventHelper::ScopedPerfEventHelper): >- (gl::ScopedPerfEventHelper::~ScopedPerfEventHelper): >- * src/common/debug.h: >- * src/common/version.h: Added. >- * src/compiler/CodeGenGLSL.cpp: >- (ConstructCompiler): >- * src/compiler/CodeGenHLSL.cpp: >- (ConstructCompiler): >- * src/compiler/Compiler.cpp: >- (TCompiler::compile): >- (TCompiler::mapLongVariableNames): >- (TCompiler::getMappedNameMaxLength): >- (TCompiler::getExtensionBehavior): >- * src/compiler/ConstantUnion.h: >- (ConstantUnion::operator==): >- (ConstantUnion::operator>): >- (ConstantUnion::operator<): >- * src/compiler/ExtensionBehavior.h: >- (getBehaviorString): >- * src/compiler/ForLoopUnroll.cpp: Added. >- (ForLoopUnroll::FillLoopIndexInfo): >- (ForLoopUnroll::Step): >- (ForLoopUnroll::SatisfiesLoopCondition): >- (ForLoopUnroll::NeedsToReplaceSymbolWithValue): >- (ForLoopUnroll::GetLoopIndexValue): >- (ForLoopUnroll::Push): >- (ForLoopUnroll::Pop): >- (ForLoopUnroll::getLoopIncrement): >- (ForLoopUnroll::evaluateIntConstant): >- * src/compiler/ForLoopUnroll.h: Added. >- (ForLoopUnroll::ForLoopUnroll): >- * src/compiler/Initialize.cpp: >- (BuiltInFunctionsVertex): >- * src/compiler/MapLongVariableNames.cpp: Added. >- (MapLongVariableNames::MapLongVariableNames): >- (MapLongVariableNames::visitSymbol): >- (MapLongVariableNames::visitConstantUnion): >- (MapLongVariableNames::visitBinary): >- (MapLongVariableNames::visitUnary): >- (MapLongVariableNames::visitSelection): >- (MapLongVariableNames::visitAggregate): >- (MapLongVariableNames::visitLoop): >- (MapLongVariableNames::visitBranch): >- (MapLongVariableNames::mapVaryingLongName): >- * src/compiler/MapLongVariableNames.h: Added. >- * src/compiler/OutputESSL.cpp: Added. >- (TOutputESSL::TOutputESSL): >- (TOutputESSL::writeVariablePrecision): >- * src/compiler/OutputESSL.h: Added. >- * src/compiler/OutputGLSL.cpp: >- (TOutputGLSL::TOutputGLSL): >- (TOutputGLSL::writeVariablePrecision): >- * src/compiler/OutputGLSL.h: >- * src/compiler/OutputGLSLBase.cpp: Added. >- (TOutputGLSLBase::TOutputGLSLBase): >- (TOutputGLSLBase::writeTriplet): >- (TOutputGLSLBase::writeVariableType): >- (TOutputGLSLBase::writeFunctionParameters): >- (TOutputGLSLBase::writeConstantUnion): >- (TOutputGLSLBase::visitSymbol): >- (TOutputGLSLBase::visitConstantUnion): >- (TOutputGLSLBase::visitBinary): >- (TOutputGLSLBase::visitUnary): >- (TOutputGLSLBase::visitSelection): >- (TOutputGLSLBase::visitAggregate): >- (TOutputGLSLBase::visitLoop): >- (TOutputGLSLBase::visitBranch): >- (TOutputGLSLBase::visitCodeBlock): >- * src/compiler/OutputGLSLBase.h: Added. >- (TOutputGLSLBase::objSink): >- * src/compiler/OutputHLSL.cpp: >- (sh::OutputHLSL::OutputHLSL): >- (sh::OutputHLSL::header): >- (sh::OutputHLSL::visitUnary): >- (sh::OutputHLSL::visitAggregate): >- (sh::OutputHLSL::visitSelection): >- (sh::OutputHLSL::visitLoop): >- (sh::OutputHLSL::visitBranch): >- (sh::OutputHLSL::handleExcessiveLoop): >- (sh::OutputHLSL::outputLineDirective): >- * src/compiler/OutputHLSL.h: >- * src/compiler/ParseHelper.cpp: >- (TParseContext::precisionErrorCheck): >- (TParseContext::constructorErrorCheck): >- (TParseContext::nonInitErrorCheck): >- * src/compiler/ParseHelper.h: >- (TParseContext::TParseContext): >- * src/compiler/ShHandle.h: >- * src/compiler/ShaderLang.cpp: >- (getVariableInfo): >- (ShConstructCompiler): >- (ShGetInfo): >- (ShGetActiveAttrib): >- (ShGetActiveUniform): >- * src/compiler/TranslatorESSL.cpp: Added. >- (TranslatorESSL::TranslatorESSL): >- (TranslatorESSL::translate): >- (TranslatorESSL::writeExtensionBehavior): >- * src/compiler/TranslatorESSL.h: Added. >- * src/compiler/ValidateLimitations.cpp: >- (ValidateLimitations::visitBinary): >- (ValidateLimitations::visitLoop): >- * src/compiler/ValidateLimitations.h: >- * src/compiler/VariableInfo.cpp: >- (getVariableInfo): >- (getBuiltInVariableInfo): >- (getUserDefinedVariableInfo): >- (CollectAttribsUniforms::visitAggregate): >- * src/compiler/VariableInfo.h: >- * src/compiler/VersionGLSL.cpp: >- (TVersionGLSL::visitSymbol): >- (TVersionGLSL::visitConstantUnion): >- (TVersionGLSL::visitBinary): >- (TVersionGLSL::visitUnary): >- (TVersionGLSL::visitSelection): >- (TVersionGLSL::visitAggregate): >- (TVersionGLSL::visitLoop): >- (TVersionGLSL::visitBranch): >- * src/compiler/VersionGLSL.h: >- * src/compiler/glslang.y: >- * src/compiler/glslang_tab.cpp: >- * src/compiler/glslang_tab.h: >- * src/compiler/intermediate.h: >- (TIntermLoop::TIntermLoop): >- (TIntermLoop::setUnrollFlag): >- (TIntermLoop::getUnrollFlag): >- (TIntermSymbol::TIntermSymbol): >- (TIntermSymbol::setId): >- (TIntermSymbol::setSymbol): >- (TIntermSymbol::getOriginalSymbol): >- (TIntermAggregate::TIntermAggregate): >- (TIntermAggregate::setEndLine): >- (TIntermAggregate::getEndLine): >- * src/compiler/preprocessor/atom.c: >- (AddString): >- * src/compiler/preprocessor/compile.h: >- * src/compiler/preprocessor/cpp.c: >- (CPPelse): >- (eval): >- (CPPif): >- (CPPifdef): >- (readCPPline): >- (ChkCorrectElseNesting): >- * src/compiler/preprocessor/cppstruct.c: >- (ResetPreprocessor): >- * src/compiler/preprocessor/scanner.c: >- (byte_scan): >- (yylex_CPP): >- * src/compiler/preprocessor/scanner.h: >- * src/libEGL/Config.cpp: >- (egl::Config::Config): >- (egl::Config::set): >- (egl::ConfigSet::add): >- (egl::ConfigSet::getConfigs): >- * src/libEGL/Config.h: >- * src/libEGL/Display.cpp: >- (egl::Display::Display): >- (egl::Display::initialize): >- (egl::Display::terminate): >- (egl::Display::getConfigAttrib): >- (egl::Display::createDevice): >- (egl::Display::createWindowSurface): >- (egl::Display::createOffscreenSurface): >- (egl::Display::createContext): >- (egl::Display::destroyContext): >- (egl::Display::isInitialized): >- (egl::Display::getAdapterIdentifier): >- (egl::Display::isDeviceLost): >- (egl::Display::getBufferPool): >- (egl::Display::initExtensionString): >- (egl::Display::getExtensionString): >- (egl::Display::getVertexTextureSupport): >- (egl::Display::getNonPower2TextureSupport): >- * src/libEGL/Display.h: >- (egl::Display::isD3d9ExDevice): >- * src/libEGL/Surface.cpp: >- (egl::Surface::Surface): >- (egl::Surface::initialize): >- (egl::Surface::release): >- (egl::Surface::resetSwapChain): >- (egl::SurfaceWindowProc): >- (egl::Surface::subclassWindow): >- (egl::Surface::unsubclassWindow): >- (egl::Surface::swap): >- (egl::Surface::getRenderTarget): >- (egl::Surface::getOffscreenTexture): >- (egl::Surface::getTextureFormat): >- (egl::Surface::getTextureTarget): >- (egl::Surface::setBoundTexture): >- (egl::Surface::getBoundTexture): >- (egl::Surface::getFormat): >- * src/libEGL/Surface.h: >- (egl::Surface::getShareHandle): >- * src/libEGL/libEGL.cpp: >- (validateDisplay): >- (validateConfig): >- (validateContext): >- (validateSurface): >- * src/libEGL/libEGL.rc: Added. >- * src/libEGL/libEGL.vcproj: >- * src/libEGL/main.cpp: >- (DllMain): >- * src/libEGL/main.h: >- * src/libEGL/resource.h: Added. >- * src/libGLESv2/Blit.cpp: >- (gl::Blit::initGeometry): >- (gl::Blit::copy): >- * src/libGLESv2/Blit.h: >- * src/libGLESv2/Buffer.cpp: >- (gl::Buffer::Buffer): >- (gl::Buffer::~Buffer): >- (gl::Buffer::bufferData): >- (gl::Buffer::bufferSubData): >- (gl::Buffer::getStaticVertexBuffer): >- (gl::Buffer::getStaticIndexBuffer): >- (gl::Buffer::invalidateStaticData): >- (gl::Buffer::promoteStaticUsage): >- * src/libGLESv2/Buffer.h: >- * src/libGLESv2/Context.cpp: >- (gl::Context::Context): >- (gl::Context::~Context): >- (gl::Context::makeCurrent): >- (gl::Context::markAllStateDirty): >- (gl::Context::setActiveSampler): >- (gl::Context::createFramebuffer): >- (gl::Context::createFence): >- (gl::Context::deleteFramebuffer): >- (gl::Context::deleteFence): >- (gl::Context::bindTexture2D): >- (gl::Context::bindTextureCubeMap): >- (gl::Context::getTexture2D): >- (gl::Context::getTextureCubeMap): >- (gl::Context::getSamplerTexture): >- (gl::Context::getIntegerv): >- (gl::Context::applyRenderTarget): >- (gl::Context::applyState): >- (gl::Context::applyVertexBuffer): >- (gl::Context::applyShaders): >- (gl::Context::applyTextures): >- (gl::Context::readPixels): >- (gl::Context::clear): >- (gl::Context::drawArrays): >- (gl::Context::drawElements): >- (gl::Context::finish): >- (gl::Context::flush): >- (gl::Context::drawClosingLine): >- (gl::Context::getMaximumVertexTextureImageUnits): >- (gl::Context::getMaximumCombinedTextureImageUnits): >- (gl::Context::supportsNonPower2Texture): >- (gl::Context::detachTexture): >- (gl::Context::getIncompleteTexture): >- (gl::Context::initExtensionString): >- (gl::Context::blitFramebuffer): >- (gl::VertexDeclarationCache::VertexDeclarationCache): >- (gl::VertexDeclarationCache::~VertexDeclarationCache): >- (gl::VertexDeclarationCache::applyDeclaration): >- * src/libGLESv2/Context.h: >- * src/libGLESv2/Framebuffer.cpp: >- (gl::Framebuffer::lookupRenderbuffer): >- (gl::Framebuffer::completeness): >- * src/libGLESv2/Framebuffer.h: >- * src/libGLESv2/HandleAllocator.cpp: Added. >- (gl::HandleAllocator::HandleAllocator): >- (gl::HandleAllocator::~HandleAllocator): >- (gl::HandleAllocator::setBaseHandle): >- (gl::HandleAllocator::allocate): >- (gl::HandleAllocator::release): >- * src/libGLESv2/HandleAllocator.h: Added. >- * src/libGLESv2/IndexDataManager.cpp: Added. >- (gl::IndexDataManager::IndexDataManager): >- (gl::IndexDataManager::~IndexDataManager): >- (gl::convertIndices): >- (gl::computeRange): >- (gl::IndexDataManager::prepareIndexData): >- (gl::IndexDataManager::indexSize): >- (gl::IndexDataManager::typeSize): >- (gl::IndexBuffer::IndexBuffer): >- (gl::IndexBuffer::~IndexBuffer): >- (gl::IndexBuffer::getBuffer): >- (gl::IndexBuffer::unmap): >- (gl::StreamingIndexBuffer::StreamingIndexBuffer): >- (gl::StreamingIndexBuffer::~StreamingIndexBuffer): >- (gl::StreamingIndexBuffer::map): >- (gl::StreamingIndexBuffer::reserveSpace): >- (gl::StaticIndexBuffer::StaticIndexBuffer): >- (gl::StaticIndexBuffer::~StaticIndexBuffer): >- (gl::StaticIndexBuffer::map): >- (gl::StaticIndexBuffer::reserveSpace): >- (gl::StaticIndexBuffer::lookupType): >- (gl::StaticIndexBuffer::lookupRange): >- (gl::StaticIndexBuffer::addRange): >- * src/libGLESv2/IndexDataManager.h: Added. >- (gl::IndexBuffer::size): >- * src/libGLESv2/Program.cpp: >- (gl::Program::getSemanticIndex): >- (gl::Program::getSamplerMapping): >- (gl::Program::getSamplerTextureType): >- (gl::Program::compileToBinary): >- (gl::Program::packVaryings): >- (gl::Program::linkVaryings): >- (gl::Program::link): >- (gl::Program::linkUniforms): >- (gl::Program::defineUniform): >- (gl::Program::applyUniform1iv): >- (gl::Program::appendToInfoLogSanitized): >- (gl::Program::unlink): >- (gl::Program::getActiveUniformMaxLength): >- (gl::Program::validate): >- (gl::Program::validateSamplers): >- * src/libGLESv2/Program.h: >- * src/libGLESv2/Renderbuffer.cpp: >- (gl::Renderbuffer::getWidth): >- (gl::Renderbuffer::getHeight): >- (gl::Renderbuffer::getInternalFormat): >- (gl::Renderbuffer::getRedSize): >- (gl::Renderbuffer::getGreenSize): >- (gl::Renderbuffer::getBlueSize): >- (gl::Renderbuffer::getAlphaSize): >- (gl::Renderbuffer::getDepthSize): >- (gl::Renderbuffer::getStencilSize): >- (gl::Renderbuffer::getSamples): >- (gl::RenderbufferStorage::RenderbufferStorage): >- (gl::RenderbufferStorage::getWidth): >- (gl::RenderbufferStorage::getHeight): >- (gl::RenderbufferStorage::getInternalFormat): >- (gl::RenderbufferStorage::getRedSize): >- (gl::RenderbufferStorage::getGreenSize): >- (gl::RenderbufferStorage::getBlueSize): >- (gl::RenderbufferStorage::getAlphaSize): >- (gl::RenderbufferStorage::getDepthSize): >- (gl::RenderbufferStorage::getStencilSize): >- (gl::RenderbufferStorage::getD3DFormat): >- (gl::Colorbuffer::Colorbuffer): >- (gl::Colorbuffer::getWidth): >- (gl::Colorbuffer::getHeight): >- (gl::Colorbuffer::getInternalFormat): >- (gl::Colorbuffer::getType): >- (gl::Colorbuffer::getD3DFormat): >- (gl::Colorbuffer::isColorbuffer): >- (gl::Colorbuffer::getRenderTarget): >- (gl::DepthStencilbuffer::DepthStencilbuffer): >- (gl::Depthbuffer::Depthbuffer): >- (gl::Stencilbuffer::Stencilbuffer): >- * src/libGLESv2/Renderbuffer.h: >- * src/libGLESv2/ResourceManager.cpp: >- (gl::ResourceManager::createBuffer): >- (gl::ResourceManager::createShader): >- (gl::ResourceManager::createProgram): >- (gl::ResourceManager::createTexture): >- (gl::ResourceManager::createRenderbuffer): >- (gl::ResourceManager::deleteBuffer): >- (gl::ResourceManager::deleteShader): >- (gl::ResourceManager::deleteProgram): >- (gl::ResourceManager::deleteTexture): >- (gl::ResourceManager::deleteRenderbuffer): >- (gl::ResourceManager::checkTextureAllocation): >- * src/libGLESv2/ResourceManager.h: >- * src/libGLESv2/Shader.cpp: >- (gl::Shader::Shader): >- (gl::Shader::compileToHLSL): >- * src/libGLESv2/Shader.h: >- * src/libGLESv2/Texture.cpp: >- (gl::Texture::Image::Image): >- (gl::Texture::Image::~Image): >- (gl::Texture::Image::isRenderable): >- (gl::Texture::Image::getD3DFormat): >- (gl::Texture::Texture): >- (gl::Texture::setMinFilter): >- (gl::Texture::setMagFilter): >- (gl::Texture::setWrapS): >- (gl::Texture::setWrapT): >- (gl::Texture::loadImageData): >- (gl::Texture::loadAlphaImageData): >- (gl::Texture::loadAlphaFloatImageData): >- (gl::Texture::loadAlphaHalfFloatImageData): >- (gl::Texture::loadLuminanceImageData): >- (gl::Texture::loadLuminanceFloatImageData): >- (gl::Texture::loadLuminanceHalfFloatImageData): >- (gl::Texture::loadLuminanceAlphaImageData): >- (gl::Texture::loadLuminanceAlphaFloatImageData): >- (gl::Texture::loadLuminanceAlphaHalfFloatImageData): >- (gl::Texture::loadRGBUByteImageData): >- (gl::Texture::loadRGB565ImageData): >- (gl::Texture::loadRGBFloatImageData): >- (gl::Texture::loadRGBHalfFloatImageData): >- (gl::Texture::loadRGBAUByteImageDataSSE2): >- (gl::Texture::loadRGBAUByteImageData): >- (gl::Texture::loadRGBA4444ImageData): >- (gl::Texture::loadRGBA5551ImageData): >- (gl::Texture::loadRGBAFloatImageData): >- (gl::Texture::loadRGBAHalfFloatImageData): >- (gl::Texture::loadBGRAImageData): >- (gl::Texture::loadCompressedImageData): >- (gl::Texture::createSurface): >- (gl::Texture::setImage): >- (gl::Texture::setCompressedImage): >- (gl::Texture::subImage): >- (gl::Texture::subImageCompressed): >- (gl::Texture::copyToImage): >- (gl::Texture::getTexture): >- (gl::Texture::isDirtyParameter): >- (gl::Texture::isDirtyImage): >- (gl::Texture::resetDirty): >- (gl::Texture::getSerial): >- (gl::Texture::creationLevels): >- (gl::Texture::levelCount): >- (gl::Texture::issueSerial): >- (gl::Texture2D::Texture2D): >- (gl::Texture2D::~Texture2D): >- (gl::Texture2D::getWidth): >- (gl::Texture2D::getHeight): >- (gl::Texture2D::getInternalFormat): >- (gl::Texture2D::getType): >- (gl::Texture2D::getD3DFormat): >- (gl::Texture2D::redefineTexture): >- (gl::Texture2D::setImage): >- (gl::Texture2D::bindTexImage): >- (gl::Texture2D::releaseTexImage): >- (gl::Texture2D::setCompressedImage): >- (gl::Texture2D::commitRect): >- (gl::Texture2D::copyImage): >- (gl::Texture2D::copySubImage): >- (gl::Texture2D::isComplete): >- (gl::Texture2D::isCompressed): >- (gl::Texture2D::getBaseTexture): >- (gl::Texture2D::createTexture): >- (gl::Texture2D::updateTexture): >- (gl::Texture2D::convertToRenderTarget): >- (gl::Texture2D::generateMipmaps): >- (gl::Texture2D::getRenderbuffer): >- (gl::Texture2D::getRenderTarget): >- (gl::TextureCubeMap::getWidth): >- (gl::TextureCubeMap::getHeight): >- (gl::TextureCubeMap::getInternalFormat): >- (gl::TextureCubeMap::getType): >- (gl::TextureCubeMap::getD3DFormat): >- (gl::TextureCubeMap::setImagePosX): >- (gl::TextureCubeMap::setImageNegX): >- (gl::TextureCubeMap::setImagePosY): >- (gl::TextureCubeMap::setImageNegY): >- (gl::TextureCubeMap::setImagePosZ): >- (gl::TextureCubeMap::setImageNegZ): >- (gl::TextureCubeMap::setCompressedImage): >- (gl::TextureCubeMap::commitRect): >- (gl::TextureCubeMap::isComplete): >- (gl::TextureCubeMap::isCompressed): >- (gl::TextureCubeMap::getBaseTexture): >- (gl::TextureCubeMap::createTexture): >- (gl::TextureCubeMap::updateTexture): >- (gl::TextureCubeMap::convertToRenderTarget): >- (gl::TextureCubeMap::setImage): >- (gl::TextureCubeMap::redefineTexture): >- (gl::TextureCubeMap::copyImage): >- (gl::TextureCubeMap::getCubeMapSurface): >- (gl::TextureCubeMap::copySubImage): >- (gl::TextureCubeMap::generateMipmaps): >- (gl::TextureCubeMap::getRenderbuffer): >- (gl::TextureCubeMap::getRenderTarget): >- * src/libGLESv2/Texture.h: >- * src/libGLESv2/VertexDataManager.cpp: Added. >- (gl::VertexDataManager::VertexDataManager): >- (gl::VertexDataManager::~VertexDataManager): >- (gl::VertexDataManager::writeAttributeData): >- (gl::VertexDataManager::prepareVertexData): >- (gl::VertexDataManager::spaceRequired): >- (gl::VertexDataManager::checkVertexCaps): >- (gl::VertexDataManager::typeIndex): >- (gl::VertexBuffer::VertexBuffer): >- (gl::VertexBuffer::~VertexBuffer): >- (gl::VertexBuffer::unmap): >- (gl::VertexBuffer::getBuffer): >- (gl::ConstantVertexBuffer::ConstantVertexBuffer): >- (gl::ConstantVertexBuffer::~ConstantVertexBuffer): >- (gl::ArrayVertexBuffer::ArrayVertexBuffer): >- (gl::ArrayVertexBuffer::~ArrayVertexBuffer): >- (gl::ArrayVertexBuffer::addRequiredSpace): >- (gl::ArrayVertexBuffer::addRequiredSpaceFor): >- (gl::StreamingVertexBuffer::StreamingVertexBuffer): >- (gl::StreamingVertexBuffer::~StreamingVertexBuffer): >- (gl::StreamingVertexBuffer::map): >- (gl::StreamingVertexBuffer::reserveRequiredSpace): >- (gl::StaticVertexBuffer::StaticVertexBuffer): >- (gl::StaticVertexBuffer::~StaticVertexBuffer): >- (gl::StaticVertexBuffer::map): >- (gl::StaticVertexBuffer::reserveRequiredSpace): >- (gl::StaticVertexBuffer::lookupAttribute): >- (gl::VertexDataManager::formatConverter): >- * src/libGLESv2/VertexDataManager.h: Added. >- (gl::ArrayVertexBuffer::size): >- (gl::VertexDataManager::dirtyCurrentValue): >- * src/libGLESv2/libGLESv2.cpp: >- (validImageSize): >- (Extension::glBindTexImage): >- * src/libGLESv2/libGLESv2.def: >- * src/libGLESv2/libGLESv2.rc: Added. >- * src/libGLESv2/libGLESv2.vcproj: >- * src/libGLESv2/main.cpp: >- (error): >- * src/libGLESv2/mathutil.h: >- (gl::clamp): >- (gl::clamp01): >- (gl::transformPixelRect): >- (gl::transformPixelYOffset): >- (gl::adjustWinding): >- (gl::supportsSSE2): >- * src/libGLESv2/resource.h: Added. >- * src/libGLESv2/utilities.cpp: >- (gl::ComputeCompressedPitch): >- (es2dx::ConvertCubeFace): >- (es2dx::ConvertPrimitiveType): >- (es2dx::ConvertRenderbufferFormat): >- (es2dx::GetMultisampleTypeFromSamples): >- (dx2es::GetStencilSize): >- (dx2es::GetAlphaSize): >- (dx2es::GetRedSize): >- (dx2es::GetGreenSize): >- (dx2es::GetBlueSize): >- (dx2es::GetDepthSize): >- (getTempPath): >- (writeFile): >- * src/libGLESv2/utilities.h: >- * src/libGLESv2/vertexconversion.h: Added. >- (gl::Identity::convert): >- (gl::Cast::convert): >- (gl::Normalize::convert): >- (gl::FixedToFloat::convert): >- (gl::SimpleDefaultValues::zero): >- (gl::SimpleDefaultValues::one): >- (gl::NormalizedDefaultValues::zero): >- (gl::NormalizedDefaultValues::one): >- (gl::VertexDataConverter::convertArray): >- (gl::VertexDataConverter::pointerAddBytes): >- (gl::VertexDataConverter::copyComponent): >- >-2011-05-24 David Kilzer <ddkilzer@apple.com> >- >- Part 2 of 2: <http://webkit.org/b/60805> Enable -Wnewline-eof on ANGLE >- >- Reviewed by Adam Roben. >- >- * Configurations/Base.xcconfig: >- (GCC_WARN_ABOUT_MISSING_NEWLINE): Added. Set to YES. >- >-2011-05-23 David Kilzer <ddkilzer@apple.com> >- >- Part 1 of 2: <http://webkit.org/b/60805> Enable -Wnewline-eof on ANGLE >- >- Merge ANGLE upstream commit r653 for Issue 154. >- >- * src/compiler/PoolAlloc.h: Added newline to end of file. >- * src/compiler/ShHandle.h: Ditto. >- * src/libEGL/Display.cpp: Ditto. >- >-2011-05-16 David Kilzer <ddkilzer@apple.com> >- >- <http://webkit.org/b/60913> C++ exceptions should not be enabled when building with llvm-gcc-4.2 >- <rdar://problem/9446430> >- >- Reviewed by Mark Rowe. >- >- * Configurations/Base.xcconfig: Fixed typo. >- >-2011-05-04 David Kilzer <ddkilzer@apple.com> >- >- Part 2 of 2: <http://webkit.org/b/56337> Enable -Werror on ANGLE >- >- Reviewed by Adam Barth. >- >- * Configurations/Base.xcconfig: >- (GCC_TREAT_WARNINGS_AS_ERRORS): Set to YES. >- >-2011-05-04 David Kilzer <ddkilzer@apple.com> >- >- Part 1 of 2: <http://webkit.org/b/56337> Enable -Werror on ANGLE >- >- Merge ANGLE upstream commits r572, r573, r574, r575. >- >- This unblocks enabling -Werror on ANGLE. Since all changes are >- in the upstream repository, they may be safely overwritten >- during the next ANGLE update. >- >- * src/compiler/ConstantUnion.h: >- (ConstantUnion::operator==): Added a default case. >- * src/compiler/Intermediate.cpp: >- (TIntermBinary::promote): Added parentheses. >- * src/compiler/ParseHelper.cpp: >- (TParseContext::precisionErrorCheck): Added a default case. >- * src/compiler/PoolAlloc.cpp: >- (TAllocation::checkGuardBlock): Changed '%u' to '%lu' for size_t >- variable. Put for loop inside #ifdef GUARD_BLOCKS/#endif macros >- to fix tautological-compare warning. >- (TAllocation::checkAllocList): Added newline to end of file. >- >-2011-04-26 Dan Bernstein <mitz@apple.com> >- >- Build fix. >- >- * Configurations/CompilerVersion.xcconfig: >- >-2011-04-26 Dan Bernstein <mitz@apple.com> >- >- Reviewed by Mark Rowe. >- >- Choose the compiler based on the Xcode version for Snow Leopard debug builds. >- >- * Configurations/Base.xcconfig: >- * Configurations/CompilerVersion.xcconfig: Added. >- >-2011-03-17 Jeff Miller <jeffm@apple.com> >- >- Use a consistent set of file patterns in the svn:ignore property for all .xcodeproj directories, specifically: >- >- *.mode* >- *.pbxuser >- *.perspective* >- project.xcworkspace >- xcuserdata >- >- * ANGLE.xcodeproj: Modified property svn:ignore. >- * src/build_angle.xcodeproj: Modified property svn:ignore. >- >-2011-01-18 Kenneth Russell <kbr@google.com> >- >- Unreviewed, Leopard build fix. Remove flex/bison targets for GLSL >- grammar because the generated sources are already checked in. >- >- * ANGLE.xcodeproj/project.pbxproj: >- * src/build_angle.xcodeproj/project.pbxproj: >- >-2011-01-18 Kenneth Russell <kbr@google.com> >- >- Unreviewed, release build fix. Explicitly cast away const. >- >- * src/compiler/preprocessor/scanner.c: >- (ScanFromString): >- >-2011-01-18 Ben Vanik <ben.vanik@gmail.com> >- >- Reviewed by Kenneth Russell. >- >- Updating ANGLE in WebKit to r533. >- https://bugs.webkit.org/show_bug.cgi?id=47194 >- >- * ANGLE.xcodeproj/project.pbxproj: >- * include/GLSLANG/ShaderLang.h: >- * src/common/debug.cpp: >- (gl::trace): >- * src/common/debug.h: >- * src/compiler/CodeGenGLSL.cpp: >- (ConstructCompiler): >- * src/compiler/CodeGenHLSL.cpp: >- (ConstructCompiler): >- * src/compiler/Common.h: >- (EncodeSourceLoc): >- (DecodeSourceLoc): >- * src/compiler/Compiler.cpp: Added. >- (TShHandleBase::TShHandleBase): >- (TShHandleBase::~TShHandleBase): >- (TCompiler::TCompiler): >- (TCompiler::~TCompiler): >- (TCompiler::Init): >- (TCompiler::compile): >- (TCompiler::InitBuiltInSymbolTable): >- (TCompiler::clearResults): >- (TCompiler::validateLimitations): >- (TCompiler::collectAttribsUniforms): >- * src/compiler/ExtensionBehavior.h: Added. >- * src/compiler/InfoSink.cpp: >- (TInfoSinkBase::location): >- * src/compiler/InfoSink.h: >- (TInfoSinkBase::size): >- * src/compiler/Initialize.cpp: >- (BuiltInFunctionsCommon): >- (BuiltInFunctionsVertex): >- (BuiltInFunctionsFragment): >- (StandardUniforms): >- (DefaultPrecisionVertex): >- (DefaultPrecisionFragment): >- (BuiltInConstants): >- (TBuiltIns::initialize): >- (IdentifyBuiltIns): >- (InitExtensionBehavior): >- * src/compiler/Initialize.h: >- * src/compiler/IntermTraverse.cpp: >- (TIntermLoop::traverse): >- * src/compiler/Intermediate.cpp: >- (getOperatorString): >- (TIntermediate::addBinaryMath): >- (TIntermediate::addLoop): >- (TIntermediate::postProcess): >- (TIntermBinary::promote): >- * src/compiler/OutputGLSL.cpp: >- (TOutputGLSL::visitUnary): >- (TOutputGLSL::visitLoop): >- * src/compiler/OutputHLSL.cpp: >- (sh::OutputHLSL::OutputHLSL): >- (sh::OutputHLSL::header): >- (sh::OutputHLSL::visitBinary): >- (sh::OutputHLSL::visitUnary): >- (sh::OutputHLSL::visitAggregate): >- (sh::OutputHLSL::visitLoop): >- (sh::OutputHLSL::handleExcessiveLoop): >- (sh::OutputHLSL::argumentString): >- * src/compiler/OutputHLSL.h: >- * src/compiler/ParseHelper.cpp: >- (ReportInfo): >- (DefineExtensionMacros): >- (TParseContext::error): >- (TParseContext::warning): >- (TParseContext::reservedErrorCheck): >- (TParseContext::constructorErrorCheck): >- (TParseContext::arrayQualifierErrorCheck): >- (TParseContext::extensionErrorCheck): >- (TParseContext::areAllChildConst): >- (PaParseStrings): >- * src/compiler/ParseHelper.h: >- (TParseContext::TParseContext): >- * src/compiler/PoolAlloc.cpp: >- (InitializeGlobalPools): >- (FreeGlobalPools): >- (SetGlobalPoolAllocator): >- (TPoolAllocator::TPoolAllocator): >- (TPoolAllocator::~TPoolAllocator): >- (TAllocation::checkAllocList): >- * src/compiler/PoolAlloc.h: >- * src/compiler/SearchSymbol.cpp: Added. >- (sh::SearchSymbol::SearchSymbol): >- (sh::SearchSymbol::traverse): >- (sh::SearchSymbol::visitSymbol): >- (sh::SearchSymbol::foundMatch): >- * src/compiler/SearchSymbol.h: Added. >- * src/compiler/ShHandle.h: >- (TCompiler::getAsCompiler): >- (TCompiler::getInfoSink): >- (TCompiler::getAttribs): >- (TCompiler::getUniforms): >- (TCompiler::getShaderType): >- (TCompiler::getShaderSpec): >- * src/compiler/ShaderLang.cpp: >- (getVariableMaxLength): >- (getVariableInfo): >- (ShInitBuiltInResources): >- (ShConstructCompiler): >- (ShCompile): >- (ShGetInfo): >- (ShGetInfoLog): >- (ShGetObjectCode): >- (ShGetActiveAttrib): >- (ShGetActiveUniform): >- * src/compiler/SymbolTable.cpp: >- (TSymbolTableLevel::relateToExtension): >- * src/compiler/SymbolTable.h: >- (TVariable::shareConstPointer): >- (TFunction::relateToExtension): >- (TFunction::getExtension): >- (TFunction::getParamCount): >- (TFunction::getParam): >- (TSymbolTable::getGlobalLevel): >- (TSymbolTable::relateToOperator): >- (TSymbolTable::relateToExtension): >- * src/compiler/TranslatorGLSL.cpp: >- (writeVersion): >- (TranslatorGLSL::TranslatorGLSL): >- (TranslatorGLSL::translate): >- * src/compiler/TranslatorGLSL.h: >- * src/compiler/TranslatorHLSL.cpp: >- (TranslatorHLSL::TranslatorHLSL): >- (TranslatorHLSL::translate): >- * src/compiler/TranslatorHLSL.h: >- * src/compiler/Types.h: >- (TType::TType): >- * src/compiler/UnfoldSelect.cpp: >- (sh::UnfoldSelect::visitSelection): >- * src/compiler/UnfoldSelect.h: >- * src/compiler/ValidateLimitations.cpp: Added. >- (ValidateLimitations::ValidateLimitations): >- (ValidateLimitations::visitSymbol): >- (ValidateLimitations::visitConstantUnion): >- (ValidateLimitations::visitBinary): >- (ValidateLimitations::visitUnary): >- (ValidateLimitations::visitSelection): >- (ValidateLimitations::visitAggregate): >- (ValidateLimitations::visitLoop): >- (ValidateLimitations::visitBranch): >- (ValidateLimitations::error): >- (ValidateLimitations::withinLoopBody): >- (ValidateLimitations::isLoopIndex): >- (ValidateLimitations::validateLoopType): >- (ValidateLimitations::validateForLoopHeader): >- (ValidateLimitations::validateForLoopInit): >- (ValidateLimitations::validateForLoopCond): >- (ValidateLimitations::validateForLoopExpr): >- (ValidateLimitations::validateFunctionCall): >- (ValidateLimitations::validateOperation): >- (ValidateLimitations::isConstExpr): >- (ValidateLimitations::isConstIndexExpr): >- (ValidateLimitations::validateIndexing): >- * src/compiler/ValidateLimitations.h: Added. >- (ValidateLimitations::numErrors): >- * src/compiler/VariableInfo.cpp: Added. >- (arrayBrackets): >- (getVariableDataType): >- (getVariableInfo): >- (getBuiltInVariableInfo): >- (getUserDefinedVariableInfo): >- (CollectAttribsUniforms::CollectAttribsUniforms): >- (CollectAttribsUniforms::visitSymbol): >- (CollectAttribsUniforms::visitConstantUnion): >- (CollectAttribsUniforms::visitBinary): >- (CollectAttribsUniforms::visitUnary): >- (CollectAttribsUniforms::visitSelection): >- (CollectAttribsUniforms::visitAggregate): >- (CollectAttribsUniforms::visitLoop): >- (CollectAttribsUniforms::visitBranch): >- * src/compiler/VariableInfo.h: Added. >- * src/compiler/VersionGLSL.cpp: Added. >- (TVersionGLSL::TVersionGLSL): >- (TVersionGLSL::visitSymbol): >- (TVersionGLSL::visitConstantUnion): >- (TVersionGLSL::visitBinary): >- (TVersionGLSL::visitUnary): >- (TVersionGLSL::visitSelection): >- (TVersionGLSL::visitAggregate): >- (TVersionGLSL::visitLoop): >- (TVersionGLSL::visitBranch): >- (TVersionGLSL::updateVersion): >- * src/compiler/VersionGLSL.h: Added. >- (TVersionGLSL::getVersion): >- * src/compiler/generate_glslang_lexer.sh: Added. >- * src/compiler/generate_glslang_parser.sh: Added. >- * src/compiler/glslang.h: Added. >- * src/compiler/glslang.l: >- * src/compiler/glslang.y: >- * src/compiler/glslang_lex.cpp: Added. >- (yy_get_next_buffer): >- (yy_get_previous_state): >- (yy_try_NUL_trans): >- (input): >- (yyrestart): >- (yy_switch_to_buffer): >- (yy_load_buffer_state): >- (yy_create_buffer): >- (yy_delete_buffer): >- (yy_init_buffer): >- (yy_flush_buffer): >- (yypush_buffer_state): >- (yypop_buffer_state): >- (yyensure_buffer_stack): >- (yy_scan_buffer): >- (yy_scan_string): >- (yy_scan_bytes): >- (yy_push_state): >- (yy_pop_state): >- (yy_top_state): >- (yy_fatal_error): >- (yyget_extra): >- (yyget_lineno): >- (yyget_column): >- (yyget_in): >- (yyget_out): >- (yyget_leng): >- (yyget_text): >- (yyset_extra): >- (yyset_lineno): >- (yyset_column): >- (yyset_in): >- (yyset_out): >- (yyget_debug): >- (yyset_debug): >- (yyget_lval): >- (yyset_lval): >- (yylex_init): >- (yylex_init_extra): >- (yy_init_globals): >- (yylex_destroy): >- (yy_flex_strncpy): >- (yy_flex_strlen): >- (yyalloc): >- (yyrealloc): >- (yyfree): >- (string_input): >- (check_type): >- (reserved_word): >- (yyerror): >- (glslang_initialize): >- (glslang_finalize): >- (glslang_scan): >- * src/compiler/glslang_tab.cpp: Added. >- (yytnamerr): >- (yysyntax_error): >- (glslang_parse): >- * src/compiler/glslang_tab.h: Added. >- * src/compiler/intermOut.cpp: >- (TOutputTraverser::TOutputTraverser): >- (OutputTreeText): >- (TOutputTraverser::visitSymbol): >- (TOutputTraverser::visitBinary): >- (TOutputTraverser::visitUnary): >- (TOutputTraverser::visitAggregate): >- (TOutputTraverser::visitSelection): >- (TOutputTraverser::visitConstantUnion): >- (TOutputTraverser::visitLoop): >- (TOutputTraverser::visitBranch): >- (TIntermediate::outputTree): >- * src/compiler/intermediate.h: >- (TIntermLoop::TIntermLoop): >- (TIntermLoop::getType): >- (TIntermLoop::getInit): >- (TIntermLoop::getCondition): >- (TIntermLoop::getExpression): >- (TIntermLoop::getBody): >- * src/compiler/localintermediate.h: >- * src/compiler/osinclude.h: >- (OS_GetTLSValue): >- * src/compiler/ossource_nspr.cpp: Added. >- (OS_AllocTLSIndex): >- (OS_SetTLSValue): >- (OS_FreeTLSIndex): >- * src/compiler/preprocessor/compile.h: >- * src/compiler/preprocessor/cpp.c: >- (CPPdefine): >- (CPPelse): >- (CPPif): >- (CPPifdef): >- (CPPerror): >- (CPPextension): >- (readCPPline): >- * src/compiler/preprocessor/preprocess.h: >- * src/compiler/preprocessor/scanner.c: >- (str_getch): >- (str_ungetch): >- (ScanFromString): >- (lFloatConst): >- (byte_scan): >- (yylex_CPP): >- (check_EOF): >- * src/compiler/preprocessor/scanner.h: >- * src/compiler/preprocessor/tokens.c: >- (RecordToken): >- (ReadToken): >- * src/compiler/tools: Removed. >- * src/compiler/unistd.h: Removed. >- * src/compiler/util.cpp: Added. >- (atof_dot): >- * src/compiler/util.h: Added. >- * src/libEGL/Config.cpp: >- (egl::Config::set): >- * src/libEGL/Display.cpp: >- (egl::Display::Display): >- (egl::Display::initialize): >- (egl::Display::terminate): >- (egl::Display::createDevice): >- (egl::Display::resetDevice): >- (egl::Display::createContext): >- (egl::Display::destroyContext): >- (egl::Display::getMinSwapInterval): >- (egl::Display::getMaxSwapInterval): >- (egl::Display::getDevice): >- (egl::Display::getFloatTextureSupport): >- (egl::Display::getHalfFloatTextureSupport): >- (egl::Display::getLuminanceTextureSupport): >- (egl::Display::getLuminanceAlphaTextureSupport): >- (egl::Display::getBufferPool): >- (egl::Display::getEventQuerySupport): >- (egl::Display::getDefaultPresentParameters): >- * src/libEGL/Display.h: >- * src/libEGL/Surface.cpp: >- (egl::Surface::Surface): >- (egl::Surface::~Surface): >- (egl::Surface::release): >- (egl::Surface::resetSwapChain): >- (egl::Surface::writeRecordableFlipState): >- (egl::Surface::restoreState): >- (egl::SurfaceWindowProc): >- (egl::Surface::subclassWindow): >- (egl::Surface::unsubclassWindow): >- (egl::Surface::checkForOutOfDateSwapChain): >- (egl::Surface::convertInterval): >- (egl::Surface::swap): >- (egl::Surface::getRenderTarget): >- (egl::Surface::setSwapInterval): >- * src/libEGL/Surface.h: >- * src/libEGL/libEGL.cpp: >- * src/libGLESv2/Blit.cpp: >- (gl::Blit::copySurfaceToTexture): >- (gl::Blit::setCommonBlitState): >- * src/libGLESv2/Buffer.cpp: >- (gl::Buffer::Buffer): >- (gl::Buffer::~Buffer): >- (gl::Buffer::bufferData): >- (gl::Buffer::bufferSubData): >- (gl::Buffer::getVertexBuffer): >- (gl::Buffer::getIndexBuffer): >- (gl::Buffer::invalidateStaticData): >- * src/libGLESv2/Buffer.h: >- * src/libGLESv2/Context.cpp: >- (gl::Context::Context): >- (gl::Context::~Context): >- (gl::Context::makeCurrent): >- (gl::Context::markAllStateDirty): >- (gl::Context::setFragmentShaderDerivativeHint): >- (gl::Context::setEnableVertexAttribArray): >- (gl::Context::getVertexAttribState): >- (gl::Context::getVertexAttributes): >- (gl::Context::createFence): >- (gl::Context::deleteFence): >- (gl::Context::bindTexture2D): >- (gl::Context::bindTextureCubeMap): >- (gl::Context::getFence): >- (gl::Context::getTexture2D): >- (gl::Context::getTextureCubeMap): >- (gl::Context::getSamplerTexture): >- (gl::Context::getBooleanv): >- (gl::Context::getIntegerv): >- (gl::Context::getQueryParameterInfo): >- (gl::Context::applyRenderTarget): >- (gl::Context::applyState): >- (gl::Context::lookupAttributeMapping): >- (gl::Context::applyVertexBuffer): >- (gl::Context::applyIndexBuffer): >- (gl::Context::readPixels): >- (gl::Context::clear): >- (gl::Context::drawArrays): >- (gl::Context::drawElements): >- (gl::Context::finish): >- (gl::Context::drawClosingLine): >- (gl::Context::getMaximumVaryingVectors): >- (gl::Context::getMaximumFragmentUniformVectors): >- (gl::Context::supportsEventQueries): >- (gl::Context::supportsFloatTextures): >- (gl::Context::supportsFloatLinearFilter): >- (gl::Context::supportsFloatRenderableTextures): >- (gl::Context::supportsHalfFloatTextures): >- (gl::Context::supportsHalfFloatLinearFilter): >- (gl::Context::supportsHalfFloatRenderableTextures): >- (gl::Context::getMaximumRenderbufferDimension): >- (gl::Context::getMaximumTextureDimension): >- (gl::Context::getMaximumCubeTextureDimension): >- (gl::Context::getMaximumTextureLevel): >- (gl::Context::supportsLuminanceTextures): >- (gl::Context::supportsLuminanceAlphaTextures): >- (gl::Context::supports32bitIndices): >- (gl::Context::getIncompleteTexture): >- (gl::Context::setVertexAttrib): >- (gl::Context::initExtensionString): >- (gl::Context::blitFramebuffer): >- * src/libGLESv2/Context.h: >- (gl::VertexAttribute::VertexAttribute): >- (gl::VertexAttribute::typeSize): >- (gl::VertexAttribute::stride): >- * src/libGLESv2/Fence.cpp: Added. >- (gl::Fence::Fence): >- (gl::Fence::~Fence): >- (gl::Fence::isFence): >- (gl::Fence::setFence): >- (gl::Fence::testFence): >- (gl::Fence::finishFence): >- (gl::Fence::getFenceiv): >- * src/libGLESv2/Fence.h: Added. >- * src/libGLESv2/Framebuffer.cpp: >- (gl::Framebuffer::completeness): >- (gl::DefaultFramebuffer::DefaultFramebuffer): >- (gl::DefaultFramebuffer::completeness): >- * src/libGLESv2/Program.cpp: >- (gl::Program::Program): >- (gl::Program::getSamplerMapping): >- (gl::Program::getUniformLocation): >- (gl::Program::setUniform1iv): >- (gl::Program::applyUniforms): >- (gl::Program::packVaryings): >- (gl::Program::linkVaryings): >- (gl::Program::link): >- (gl::Program::defineUniform): >- (gl::Program::createUniform): >- (gl::Program::applyUniform1iv): >- (gl::Program::resetInfoLog): >- (gl::Program::unlink): >- (gl::Program::getActiveAttribute): >- (gl::Program::getActiveUniform): >- (gl::Program::getDxDepthRangeLocation): >- * src/libGLESv2/Program.h: >- * src/libGLESv2/RefCountObject.cpp: >- (gl::RefCountObject::~RefCountObject): >- * src/libGLESv2/Renderbuffer.cpp: >- (gl::RenderbufferStorage::RenderbufferStorage): >- (gl::RenderbufferStorage::isFloatingPoint): >- (gl::Colorbuffer::Colorbuffer): >- (gl::DepthStencilbuffer::DepthStencilbuffer): >- * src/libGLESv2/Renderbuffer.h: >- * src/libGLESv2/Shader.cpp: >- (gl::Shader::Shader): >- (gl::Shader::parseVaryings): >- (gl::Shader::compileToHLSL): >- (gl::VertexShader::parseAttributes): >- * src/libGLESv2/Texture.cpp: >- (gl::Texture::Texture): >- (gl::Texture::isFloatingPoint): >- (gl::Texture::isRenderableFormat): >- (gl::Texture::selectFormat): >- (gl::Texture::loadImageData): >- (gl::Texture::loadAlphaFloatImageData): >- (gl::Texture::loadAlphaHalfFloatImageData): >- (gl::Texture::loadLuminanceImageData): >- (gl::Texture::loadLuminanceFloatImageData): >- (gl::Texture::loadLuminanceHalfFloatImageData): >- (gl::Texture::loadLuminanceAlphaImageData): >- (gl::Texture::loadLuminanceAlphaFloatImageData): >- (gl::Texture::loadLuminanceAlphaHalfFloatImageData): >- (gl::Texture::loadRGBFloatImageData): >- (gl::Texture::loadRGBHalfFloatImageData): >- (gl::Texture::loadRGBAFloatImageData): >- (gl::Texture::loadRGBAHalfFloatImageData): >- (gl::Texture::createSurface): >- (gl::Texture::setImage): >- (gl::Texture::setCompressedImage): >- (gl::Texture::subImage): >- (gl::Texture::subImageCompressed): >- (gl::Texture::copyNonRenderable): >- (gl::Texture::getD3DFormat): >- (gl::Texture::isRenderable): >- (gl::Texture2D::Texture2D): >- (gl::Texture2D::~Texture2D): >- (gl::Texture2D::redefineTexture): >- (gl::Texture2D::setImage): >- (gl::Texture2D::setCompressedImage): >- (gl::Texture2D::copyImage): >- (gl::Texture2D::copySubImage): >- (gl::Texture2D::isComplete): >- (gl::Texture2D::createTexture): >- (gl::Texture2D::convertToRenderTarget): >- (gl::Texture2D::generateMipmaps): >- (gl::Texture2D::getColorbuffer): >- (gl::Texture2D::getRenderTarget): >- (gl::TextureCubeMap::TextureCubeMap): >- (gl::TextureCubeMap::~TextureCubeMap): >- (gl::TextureCubeMap::subImage): >- (gl::TextureCubeMap::subImageCompressed): >- (gl::TextureCubeMap::isComplete): >- (gl::TextureCubeMap::createTexture): >- (gl::TextureCubeMap::convertToRenderTarget): >- (gl::TextureCubeMap::redefineTexture): >- (gl::TextureCubeMap::copyImage): >- (gl::TextureCubeMap::copySubImage): >- (gl::TextureCubeMap::generateMipmaps): >- (gl::TextureCubeMap::getColorbuffer): >- (gl::TextureCubeMap::getRenderTarget): >- (gl::Texture::TextureColorbufferProxy::TextureColorbufferProxy): >- (gl::Texture::TextureColorbufferProxy::isFloatingPoint): >- * src/libGLESv2/Texture.h: >- * src/libGLESv2/geometry/IndexDataManager.cpp: >- (gl::IndexDataManager::IndexDataManager): >- (gl::IndexDataManager::~IndexDataManager): >- (gl::convertIndices): >- (gl::computeRange): >- (gl::IndexDataManager::prepareIndexData): >- (gl::IndexDataManager::indexSize): >- (gl::IndexDataManager::typeSize): >- (gl::IndexBuffer::IndexBuffer): >- (gl::IndexBuffer::~IndexBuffer): >- (gl::IndexBuffer::getBuffer): >- (gl::IndexBuffer::unmap): >- (gl::StreamingIndexBuffer::StreamingIndexBuffer): >- (gl::StreamingIndexBuffer::~StreamingIndexBuffer): >- (gl::StreamingIndexBuffer::map): >- (gl::StreamingIndexBuffer::reserveSpace): >- (gl::StaticIndexBuffer::StaticIndexBuffer): >- (gl::StaticIndexBuffer::~StaticIndexBuffer): >- (gl::StaticIndexBuffer::map): >- (gl::StaticIndexBuffer::reserveSpace): >- (gl::StaticIndexBuffer::lookupType): >- (gl::StaticIndexBuffer::lookupRange): >- (gl::StaticIndexBuffer::addRange): >- * src/libGLESv2/geometry/IndexDataManager.h: >- (gl::IndexBuffer::size): >- * src/libGLESv2/geometry/VertexDataManager.cpp: >- (gl::VertexDataManager::VertexDataManager): >- (gl::VertexDataManager::~VertexDataManager): >- (gl::VertexDataManager::writeAttributeData): >- (gl::VertexDataManager::prepareVertexData): >- (gl::VertexDataManager::spaceRequired): >- (gl::VertexDataManager::checkVertexCaps): >- (gl::VertexDataManager::typeIndex): >- (gl::VertexDataManager::setupAttributes): >- (gl::VertexBuffer::VertexBuffer): >- (gl::VertexBuffer::~VertexBuffer): >- (gl::VertexBuffer::unmap): >- (gl::VertexBuffer::getBuffer): >- (gl::ConstantVertexBuffer::ConstantVertexBuffer): >- (gl::ConstantVertexBuffer::~ConstantVertexBuffer): >- (gl::ArrayVertexBuffer::ArrayVertexBuffer): >- (gl::ArrayVertexBuffer::~ArrayVertexBuffer): >- (gl::ArrayVertexBuffer::addRequiredSpace): >- (gl::ArrayVertexBuffer::addRequiredSpaceFor): >- (gl::StreamingVertexBuffer::StreamingVertexBuffer): >- (gl::StreamingVertexBuffer::~StreamingVertexBuffer): >- (gl::StreamingVertexBuffer::map): >- (gl::StreamingVertexBuffer::reserveRequiredSpace): >- (gl::StaticVertexBuffer::StaticVertexBuffer): >- (gl::StaticVertexBuffer::~StaticVertexBuffer): >- (gl::StaticVertexBuffer::map): >- (gl::StaticVertexBuffer::reserveRequiredSpace): >- (gl::StaticVertexBuffer::lookupAttribute): >- (gl::VertexDataManager::formatConverter): >- * src/libGLESv2/geometry/VertexDataManager.h: >- (gl::ArrayVertexBuffer::size): >- (gl::VertexDataManager::dirtyCurrentValue): >- * src/libGLESv2/geometry/backend.cpp: Removed. >- * src/libGLESv2/geometry/backend.h: Removed. >- * src/libGLESv2/geometry/dx9.cpp: Removed. >- * src/libGLESv2/geometry/dx9.h: Removed. >- * src/libGLESv2/libGLESv2.cpp: >- * src/libGLESv2/libGLESv2.def: >- * src/libGLESv2/libGLESv2.vcproj: >- * src/libGLESv2/utilities.cpp: >- (gl::UniformComponentCount): >- (gl::UniformComponentType): >- (gl::ComputePixelSize): >- (gl::CheckTextureFormatType): >- (gl::IsColorRenderable): >- (gl::IsDepthRenderable): >- (gl::IsStencilRenderable): >- (es2dx::GetAlphaSize): >- (es2dx::GetRedSize): >- (es2dx::GetGreenSize): >- (es2dx::GetBlueSize): >- (es2dx::GetDepthSize): >- (es2dx::ConvertPrimitiveType): >- (dx2es::ConvertBackBufferFormat): >- (dx2es::ConvertDepthStencilFormat): >- * src/libGLESv2/utilities.h: >- >-2011-01-17 Dan Bernstein <mitz@apple.com> >- >- Rubber-stamped by Mark Rowe. >- >- Update xcodeproj svn:ignore to include xcuserdata. >- >- * ANGLE.xcodeproj: Modified property svn:ignore. >- * src/build_angle.xcodeproj: Modified property svn:ignore. >- >-2010-12-01 Steve Falkenburg <sfalken@apple.com> >- >- Reviewed by Adam Roben. >- >- vcproj changes can't be applied cleanly by the Windows EWS bot >- https://bugs.webkit.org/show_bug.cgi?id=50328 >- >- * src/libEGL/libEGL.vcproj: Added property svn:eol-style. >- * src/libGLESv2/libGLESv2.vcproj: Added property svn:eol-style. >- >-2010-11-03 Darin Adler <darin@apple.com> >- >- Updated Xcode projects by opening them with Xcode 3.2.4. >- Updated svn:ignore for Xcode projects. >- >- * ANGLE.xcodeproj: Added property svn:ignore. >- * ANGLE.xcodeproj/project.pbxproj: Updated with Xcode 3.2.4. >- * src/build_angle.xcodeproj: Added property svn:ignore. >- * src/build_angle.xcodeproj/project.pbxproj: Updated with Xcode 3.2.4. >- >-2010-09-01 Zhenyao Mo <zmo@google.com> >- >- Reviewed by Kenneth Russell. >- >- Roll ANGLE under webkit to r402 >- https://bugs.webkit.org/show_bug.cgi?id=45004 >- >- * ANGLE.xcodeproj/project.pbxproj: >- * include/GLES2/gl2ext.h: >- * include/GLSLANG/ResourceLimits.h: Removed. >- * include/GLSLANG/ShaderLang.h: >- * src/compiler/BaseTypes.h: >- (getPrecisionString): >- (getBasicString): >- (IsSampler): >- (getQualifierString): >- * src/compiler/Initialize.cpp: >- (BuiltInConstants): >- (IdentifyBuiltIns): >- * src/compiler/Initialize.h: >- * src/compiler/InitializeDll.cpp: >- (InitProcess): >- (DetachProcess): >- (InitThread): >- (DetachThread): >- * src/compiler/InitializeDll.h: >- * src/compiler/InitializeParseContext.h: >- * src/compiler/Intermediate.cpp: >- (GetHigherPrecision): >- (TIntermediate::addBinaryMath): >- (TIntermediate::setAggregateOperator): >- (TIntermediate::addComma): >- (TIntermediate::postProcess): >- (TIntermBinary::promote): >- (CompareStruct): >- * src/compiler/OutputGLSL.cpp: >- (TOutputGLSL::writeFunctionParameters): >- (TOutputGLSL::visitUnary): >- (TOutputGLSL::visitBranch): >- * src/compiler/OutputHLSL.cpp: >- (sh::OutputHLSL::header): >- (sh::OutputHLSL::visitBinary): >- (sh::OutputHLSL::visitAggregate): >- (sh::OutputHLSL::handleExcessiveLoop): >- (sh::OutputHLSL::addConstructor): >- * src/compiler/ParseHelper.cpp: >- (TParseContext::constructorErrorCheck): >- (TParseContext::samplerErrorCheck): >- (TParseContext::paramErrorCheck): >- (TParseContext::findFunction): >- (TParseContext::executeInitializer): >- (TParseContext::addConstructor): >- (TParseContext::addConstStruct): >- (FreeParseContextIndex): >- (GetGlobalParseContext): >- * src/compiler/PoolAlloc.h: >- (TPoolAllocator::tHeader::tHeader): >- (pool_allocator::allocate): >- (pool_allocator::deallocate): >- * src/compiler/ShaderLang.cpp: >- (ShInitialize): >- (ShFinalize): >- (ShInitBuiltInResource): >- * src/compiler/SymbolTable.cpp: >- (TType::getStructSize): >- * src/compiler/SymbolTable.h: >- (TVariable::setQualifier): >- * src/compiler/Types.h: >- (TType::TType): >- (TType::getBasicType): >- (TType::setBasicType): >- (TType::getPrecision): >- (TType::setPrecision): >- (TType::getQualifier): >- (TType::setQualifier): >- (TType::getNominalSize): >- (TType::setNominalSize): >- (TType::isMatrix): >- (TType::setMatrix): >- (TType::isArray): >- (TType::getArraySize): >- (TType::setArraySize): >- (TType::getMaxArraySize): >- (TType::setMaxArraySize): >- (TType::clearArrayness): >- (TType::setArrayInformationType): >- (TType::getArrayInformationType): >- (TType::isVector): >- (TType::isScalar): >- (TType::setStruct): >- (TType::getTypeName): >- (TType::setTypeName): >- (TType::isField): >- (TType::getFieldName): >- (TType::setFieldName): >- (TType::getBasicString): >- (TType::getPrecisionString): >- (TType::getQualifierString): >- * src/compiler/glslang.l: >- * src/compiler/glslang.y: >- * src/compiler/intermediate.h: >- (TIntermNode::getLine): >- (TIntermNode::setLine): >- (TIntermTyped::getAsTyped): >- (TIntermTyped::setType): >- (TIntermTyped::getType): >- (TIntermTyped::getTypePointer): >- (TIntermTyped::getBasicType): >- (TIntermTyped::getQualifier): >- (TIntermTyped::getPrecision): >- (TIntermTyped::getNominalSize): >- (TIntermTyped::isMatrix): >- (TIntermTyped::isArray): >- (TIntermTyped::isVector): >- (TIntermTyped::isScalar): >- (TIntermTyped::getBasicString): >- (TIntermTyped::getQualifierString): >- (TIntermSymbol::getId): >- (TIntermSymbol::getSymbol): >- (TIntermOperator::setOp): >- (TIntermBinary::setLeft): >- (TIntermBinary::setRight): >- (TIntermBinary::getLeft): >- (TIntermBinary::getRight): >- (TIntermUnary::setOperand): >- (TIntermUnary::getOperand): >- (TIntermAggregate::getAsAggregate): >- (TIntermAggregate::getSequence): >- (TIntermAggregate::setName): >- (TIntermAggregate::getName): >- (TIntermAggregate::setUserDefined): >- (TIntermAggregate::isUserDefined): >- (TIntermAggregate::getQualifier): >- (TIntermAggregate::setOptimize): >- (TIntermAggregate::setDebug): >- (TIntermSelection::getCondition): >- (TIntermSelection::getTrueBlock): >- (TIntermSelection::getFalseBlock): >- (TIntermSelection::getAsSelectionNode): >- * src/compiler/parseConst.cpp: >- (TConstTraverser::TConstTraverser): >- * src/compiler/preprocessor/atom.c: >- (InitAtomTable): >- * src/compiler/preprocessor/atom.h: >- * src/compiler/preprocessor/compile.h: >- * src/compiler/preprocessor/cpp.c: >- * src/compiler/preprocessor/cpp.h: >- * src/compiler/preprocessor/cppstruct.c: >- * src/compiler/preprocessor/memory.c: >- * src/compiler/preprocessor/memory.h: >- * src/compiler/preprocessor/parser.h: >- * src/compiler/preprocessor/preprocess.h: >- * src/compiler/preprocessor/scanner.c: >- * src/compiler/preprocessor/scanner.h: >- * src/compiler/preprocessor/slglobals.h: >- * src/compiler/preprocessor/symbols.c: >- (NewSymbol): >- * src/compiler/preprocessor/symbols.h: >- * src/compiler/preprocessor/tokens.c: >- (RecordToken): >- * src/compiler/preprocessor/tokens.h: >- * src/libEGL/Display.cpp: >- (egl::Display::Display): >- (egl::Display::initialize): >- (egl::Display::terminate): >- (egl::Display::createDevice): >- (egl::Display::createWindowSurface): >- (egl::Display::createContext): >- (egl::Display::getMultiSampleSupport): >- (egl::Display::getCompressedTextureSupport): >- * src/libEGL/Display.h: >- * src/libEGL/Surface.cpp: >- (egl::Surface::Surface): >- (egl::Surface::resetSwapChain): >- (egl::Surface::getWindowHandle): >- (egl::Surface::writeRecordableFlipState): >- (egl::Surface::applyFlipState): >- (egl::Surface::releaseRecordedState): >- (egl::Surface::checkForWindowResize): >- (egl::Surface::swap): >- * src/libEGL/Surface.h: >- * src/libEGL/libEGL.cpp: >- * src/libEGL/libEGL.vcproj: >- * src/libGLESv2/Blit.cpp: >- (gl::Blit::setVertexShader): >- (gl::Blit::setPixelShader): >- (gl::Blit::setFormatConvertShaders): >- * src/libGLESv2/Buffer.cpp: >- (gl::Buffer::Buffer): >- * src/libGLESv2/Buffer.h: >- * src/libGLESv2/Context.cpp: >- (gl::Context::Context): >- (gl::Context::~Context): >- (gl::Context::makeCurrent): >- (gl::Context::markAllStateDirty): >- (gl::Context::getReadFramebufferHandle): >- (gl::Context::getDrawFramebufferHandle): >- (gl::Context::getRenderbufferHandle): >- (gl::Context::getArrayBufferHandle): >- (gl::Context::setVertexAttribState): >- (gl::Context::createBuffer): >- (gl::Context::createProgram): >- (gl::Context::createShader): >- (gl::Context::createTexture): >- (gl::Context::createRenderbuffer): >- (gl::Context::deleteBuffer): >- (gl::Context::deleteShader): >- (gl::Context::deleteProgram): >- (gl::Context::deleteTexture): >- (gl::Context::deleteRenderbuffer): >- (gl::Context::getBuffer): >- (gl::Context::getShader): >- (gl::Context::getProgram): >- (gl::Context::getTexture): >- (gl::Context::getRenderbuffer): >- (gl::Context::getReadFramebuffer): >- (gl::Context::getDrawFramebuffer): >- (gl::Context::bindArrayBuffer): >- (gl::Context::bindElementArrayBuffer): >- (gl::Context::bindTexture2D): >- (gl::Context::bindTextureCubeMap): >- (gl::Context::bindReadFramebuffer): >- (gl::Context::bindDrawFramebuffer): >- (gl::Context::bindRenderbuffer): >- (gl::Context::useProgram): >- (gl::Context::setFramebufferZero): >- (gl::Context::setRenderbufferStorage): >- (gl::Context::getFramebuffer): >- (gl::Context::getArrayBuffer): >- (gl::Context::getElementArrayBuffer): >- (gl::Context::getCurrentProgram): >- (gl::Context::getTexture2D): >- (gl::Context::getTextureCubeMap): >- (gl::Context::getSamplerTexture): >- (gl::Context::getFloatv): >- (gl::Context::getIntegerv): >- (gl::Context::getQueryParameterInfo): >- (gl::Context::applyRenderTarget): >- (gl::Context::applyState): >- (gl::Context::applyIndexBuffer): >- (gl::Context::readPixels): >- (gl::Context::clear): >- (gl::Context::finish): >- (gl::Context::flush): >- (gl::Context::supportsShaderModel3): >- (gl::Context::getMaxSupportedSamples): >- (gl::Context::getNearestSupportedSamples): >- (gl::Context::supportsCompressedTextures): >- (gl::Context::detachBuffer): >- (gl::Context::detachTexture): >- (gl::Context::detachFramebuffer): >- (gl::Context::detachRenderbuffer): >- (gl::Context::getIncompleteTexture): >- (gl::Context::initExtensionString): >- (gl::Context::blitFramebuffer): >- * src/libGLESv2/Context.h: >- (gl::AttributeState::AttributeState): >- * src/libGLESv2/Framebuffer.cpp: >- (gl::Framebuffer::Framebuffer): >- (gl::Framebuffer::~Framebuffer): >- (gl::Framebuffer::lookupRenderbuffer): >- (gl::Framebuffer::setColorbuffer): >- (gl::Framebuffer::setDepthbuffer): >- (gl::Framebuffer::setStencilbuffer): >- (gl::Framebuffer::detachTexture): >- (gl::Framebuffer::detachRenderbuffer): >- (gl::Framebuffer::getRenderTargetSerial): >- (gl::Framebuffer::getRenderTarget): >- (gl::Framebuffer::getDepthStencil): >- (gl::Framebuffer::getDepthbufferSerial): >- (gl::Framebuffer::getStencilbufferSerial): >- (gl::Framebuffer::getColorbuffer): >- (gl::Framebuffer::getDepthbuffer): >- (gl::Framebuffer::getStencilbuffer): >- (gl::Framebuffer::getColorbufferHandle): >- (gl::Framebuffer::getDepthbufferHandle): >- (gl::Framebuffer::getStencilbufferHandle): >- (gl::Framebuffer::hasStencil): >- (gl::Framebuffer::isMultisample): >- (gl::Framebuffer::completeness): >- (gl::DefaultFramebuffer::DefaultFramebuffer): >- (gl::Framebuffer::getSamples): >- (gl::DefaultFramebuffer::completeness): >- * src/libGLESv2/Framebuffer.h: >- * src/libGLESv2/Program.cpp: >- (gl::Program::Program): >- (gl::Program::~Program): >- (gl::Program::attachShader): >- (gl::Program::detachShader): >- (gl::Program::linkVaryings): >- (gl::Program::link): >- (gl::Program::unlink): >- (gl::Program::release): >- (gl::Program::addRef): >- (gl::Program::getRefCount): >- (gl::Program::getDxViewportLocation): >- * src/libGLESv2/Program.h: >- * src/libGLESv2/RefCountObject.cpp: Added. >- (gl::RefCountObject::RefCountObject): >- (gl::RefCountObject::~RefCountObject): >- (gl::RefCountObject::addRef): >- (gl::RefCountObject::release): >- (gl::RefCountObjectBindingPointer::set): >- * src/libGLESv2/RefCountObject.h: Added. >- (gl::RefCountObject::id): >- (gl::RefCountObjectBindingPointer::RefCountObjectBindingPointer): >- (gl::RefCountObjectBindingPointer::~RefCountObjectBindingPointer): >- (gl::RefCountObjectBindingPointer::get): >- (gl::RefCountObjectBindingPointer::id): >- (gl::RefCountObjectBindingPointer::operator ! ): >- (gl::BindingPointer::set): >- (gl::BindingPointer::get): >- (gl::BindingPointer::operator -> ): >- * src/libGLESv2/Renderbuffer.cpp: >- (gl::Renderbuffer::Renderbuffer): >- (gl::Renderbuffer::~Renderbuffer): >- (gl::Renderbuffer::isColorbuffer): >- (gl::Renderbuffer::isDepthbuffer): >- (gl::Renderbuffer::isStencilbuffer): >- (gl::Renderbuffer::getRenderTarget): >- (gl::Renderbuffer::getDepthStencil): >- (gl::Renderbuffer::getWidth): >- (gl::Renderbuffer::getHeight): >- (gl::Renderbuffer::getFormat): >- (gl::Renderbuffer::getD3DFormat): >- (gl::Renderbuffer::getSerial): >- (gl::Renderbuffer::setStorage): >- (gl::RenderbufferStorage::RenderbufferStorage): >- (gl::RenderbufferStorage::~RenderbufferStorage): >- (gl::RenderbufferStorage::isColorbuffer): >- (gl::RenderbufferStorage::isDepthbuffer): >- (gl::RenderbufferStorage::isStencilbuffer): >- (gl::RenderbufferStorage::getRenderTarget): >- (gl::RenderbufferStorage::getDepthStencil): >- (gl::RenderbufferStorage::getWidth): >- (gl::RenderbufferStorage::getHeight): >- (gl::RenderbufferStorage::setSize): >- (gl::RenderbufferStorage::getFormat): >- (gl::RenderbufferStorage::getD3DFormat): >- (gl::RenderbufferStorage::getSamples): >- (gl::RenderbufferStorage::getSerial): >- (gl::RenderbufferStorage::issueSerial): >- (gl::Colorbuffer::Colorbuffer): >- (gl::Colorbuffer::isColorbuffer): >- (gl::Colorbuffer::getRedSize): >- (gl::Colorbuffer::getGreenSize): >- (gl::Colorbuffer::getBlueSize): >- (gl::Colorbuffer::getAlphaSize): >- (gl::DepthStencilbuffer::DepthStencilbuffer): >- (gl::DepthStencilbuffer::~DepthStencilbuffer): >- (gl::DepthStencilbuffer::isDepthbuffer): >- (gl::DepthStencilbuffer::isStencilbuffer): >- (gl::DepthStencilbuffer::getDepthSize): >- (gl::DepthStencilbuffer::getStencilSize): >- (gl::DepthStencilbuffer::getDepthStencil): >- (gl::Depthbuffer::Depthbuffer): >- (gl::Depthbuffer::~Depthbuffer): >- (gl::Depthbuffer::isDepthbuffer): >- (gl::Depthbuffer::isStencilbuffer): >- (gl::Stencilbuffer::Stencilbuffer): >- (gl::Stencilbuffer::~Stencilbuffer): >- (gl::Stencilbuffer::isDepthbuffer): >- (gl::Stencilbuffer::isStencilbuffer): >- * src/libGLESv2/Renderbuffer.h: >- (gl::Renderbuffer::getStorage): >- * src/libGLESv2/ResourceManager.cpp: Added. >- (gl::ResourceManager::ResourceManager): >- (gl::ResourceManager::~ResourceManager): >- (gl::ResourceManager::addRef): >- (gl::ResourceManager::release): >- (gl::ResourceManager::createBuffer): >- (gl::ResourceManager::createShader): >- (gl::ResourceManager::createProgram): >- (gl::ResourceManager::createTexture): >- (gl::ResourceManager::createRenderbuffer): >- (gl::ResourceManager::deleteBuffer): >- (gl::ResourceManager::deleteShader): >- (gl::ResourceManager::deleteProgram): >- (gl::ResourceManager::deleteTexture): >- (gl::ResourceManager::deleteRenderbuffer): >- (gl::ResourceManager::getBuffer): >- (gl::ResourceManager::getShader): >- (gl::ResourceManager::getTexture): >- (gl::ResourceManager::getProgram): >- (gl::ResourceManager::getRenderbuffer): >- (gl::ResourceManager::setRenderbuffer): >- (gl::ResourceManager::checkBufferAllocation): >- (gl::ResourceManager::checkTextureAllocation): >- (gl::ResourceManager::checkRenderbufferAllocation): >- * src/libGLESv2/ResourceManager.h: Added. >- * src/libGLESv2/Shader.cpp: >- (gl::Shader::Shader): >- (gl::Shader::addRef): >- (gl::Shader::release): >- (gl::Shader::getRefCount): >- (gl::Shader::parseVaryings): >- (gl::VertexShader::VertexShader): >- (gl::FragmentShader::FragmentShader): >- * src/libGLESv2/Shader.h: >- * src/libGLESv2/Texture.cpp: >- (gl::Texture::Image::Image): >- (gl::Texture::Texture): >- (gl::Texture::getBlitter): >- (gl::Texture::selectFormat): >- (gl::Texture::loadImageData): >- (gl::Texture::loadAlphaImageData): >- (gl::Texture::loadLuminanceImageData): >- (gl::Texture::loadLuminanceAlphaImageData): >- (gl::Texture::loadRGBUByteImageData): >- (gl::Texture::loadRGB565ImageData): >- (gl::Texture::loadRGBAUByteImageData): >- (gl::Texture::loadRGBA4444ImageData): >- (gl::Texture::loadRGBA5551ImageData): >- (gl::Texture::loadBGRAImageData): >- (gl::Texture::createSurface): >- (gl::Texture::setImage): >- (gl::Texture::setCompressedImage): >- (gl::Texture::subImage): >- (gl::Texture::subImageCompressed): >- (gl::Texture2D::Texture2D): >- (gl::Texture2D::getFormat): >- (gl::Texture2D::setCompressedImage): >- (gl::Texture2D::subImage): >- (gl::Texture2D::subImageCompressed): >- (gl::Texture2D::copyImage): >- (gl::Texture2D::copySubImage): >- (gl::Texture2D::isCompressed): >- (gl::Texture2D::getColorbuffer): >- (gl::TextureCubeMap::TextureCubeMap): >- (gl::TextureCubeMap::getFormat): >- (gl::TextureCubeMap::setCompressedImage): >- (gl::TextureCubeMap::subImage): >- (gl::TextureCubeMap::subImageCompressed): >- (gl::TextureCubeMap::isCompressed): >- (gl::TextureCubeMap::copyImage): >- (gl::TextureCubeMap::copySubImage): >- (gl::TextureCubeMap::getColorbuffer): >- (gl::Texture::TextureColorbufferProxy::addRef): >- (gl::Texture::TextureColorbufferProxy::release): >- (gl::Texture::TextureColorbufferProxy::getWidth): >- (gl::Texture::TextureColorbufferProxy::getHeight): >- (gl::Texture::TextureColorbufferProxy::getFormat): >- * src/libGLESv2/Texture.h: >- * src/libGLESv2/libGLESv2.cpp: >- * src/libGLESv2/libGLESv2.def: >- * src/libGLESv2/libGLESv2.vcproj: >- * src/libGLESv2/main.h: >- * src/libGLESv2/utilities.cpp: >- (gl::ComputeCompressedPitch): >- (gl::ComputeCompressedSize): >- (gl::IsCompressed): >- (gl::ComputePixelSize): >- (gl::CheckTextureFormatType): >- (es2dx::ConvertRenderbufferFormat): >- (es2dx::GetSamplesFromMultisampleType): >- (es2dx::GetMultisampleTypeFromSamples): >- * src/libGLESv2/utilities.h: >- >-2010-08-17 Chris Marrin <cmarrin@apple.com> >- >- Unreviewed. >- >- Moved previous link error fix to Base.xcconfig. >- >- * ANGLE.xcodeproj/project.pbxproj: >- * Configurations/Base.xcconfig: >- >-2010-08-17 Chris Marrin <cmarrin@apple.com> >- >- Unreviewed. >- >- Got rid of link errors in WebCore. >- >- Changed GCC_INLINES_ARE_PRIVATE_EXTERN to YES and >- GCC_SYMBOLS_PRIVATE_EXTERN to NO to match WebCore >- flags. >- >- * ANGLE.xcodeproj/project.pbxproj: >- >-2010-08-04 Kenneth Russell <kbr@google.com> >- >- Reviewed by Dimitri Glazkov. >- >- Update ANGLE to r352 >- https://bugs.webkit.org/show_bug.cgi?id=43500 >- >- Updated ANGLE to r352 (July 26, 2010). Built WebKit to test. >- >- * include/GLSLANG/ShaderLang.h: >- * src/compiler/Initialize.cpp: >- (BuiltInFunctionsCommon): >- (BuiltInFunctionsVertex): >- (BuiltInFunctionsFragment): >- (StandardUniforms): >- (DefaultPrecisionVertex): >- (DefaultPrecisionFragment): >- (BuiltInConstants): >- (TBuiltIns::initialize): >- (IdentifyBuiltIns): >- * src/compiler/Initialize.h: >- (TBuiltIns::getBuiltInStrings): >- * src/compiler/OutputGLSL.cpp: >- (TOutputGLSL::visitSelection): >- * src/compiler/ShHandle.h: >- (TCompiler::getLanguage): >- (TCompiler::getSpec): >- (TCompiler::getSymbolTable): >- (TCompiler::getInfoSink): >- * src/compiler/ShaderLang.cpp: >- (InitializeSymbolTable): >- (GenerateBuiltInSymbolTable): >- (ShInitialize): >- (ShConstructCompiler): >- (ShFinalize): >- (ShCompile): >- * src/compiler/SymbolTable.h: >- (TSymbolTable::atBuiltInLevel): >- (TSymbolTable::atGlobalLevel): >- (TSymbolTable::push): >- (TSymbolTable::getGlobalLevel): >- (TSymbolTable::currentLevel): >- * src/libGLESv2/Shader.cpp: >- (gl::Shader::Shader): >- (gl::Shader::compileToHLSL): >- >-2010-08-03 Mark Rowe <mrowe@apple.com> >- >- Rubber-stamped by Adele Peterson. >- >- Remove some unnecessary files from the ANGLE tree. >- >- * src/compiler/tools/COPYING.bison: Removed. >- * src/compiler/tools/COPYING.flex: Removed. >- * src/compiler/tools/README: Removed. >- * src/compiler/tools/bison.hairy: Removed. >- * src/compiler/tools/bison.simple: Removed. >- >-2010-08-03 Mark Rowe <mrowe@apple.com> >- >- Rubber-stamped by Adele Peterson. >- >- Clean up the ANGLE Xcode project. >- >- Main changes include: >- ⢠Adding a Production configuration. >- ⢠Modifying the library name from libangle.a to libANGLE.a. >- ⢠Installing the headers in a subdirectory of /usr/local/include to avoid polluting the top-level directory. >- ⢠Generating derived sources in to the built products directory so they're saved along with the symroot. >- ⢠Switching to using .xcconfig files for maximum cleanliness. >- >- * ANGLE.xcodeproj/project.pbxproj: >- * Configurations/ANGLE.xcconfig: Added. >- * Configurations/Base.xcconfig: Added. >- * Configurations/DebugRelease.xcconfig: Added. >- >-2010-08-02 Paul Sawaya <psawaya@apple.com> >- >- Reviewed by Adele Peterson. >- >- Add ANGLE library to WebKit. From the repository (http://angleproject.googlecode.com) as of July 22. >- https://bugs.webkit.org/show_bug.cgi?id=42789 >- >diff --git a/Source/ThirdParty/ANGLE/Compiler.cmake b/Source/ThirdParty/ANGLE/Compiler.cmake >new file mode 100644 >index 00000000000..c3d8f61f44c >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/Compiler.cmake >@@ -0,0 +1,301 @@ >+# Contains the source file definitions in src/compiler.gn >+# >+# This is a direct mapping of ALL values unless otherwise specified. All >+# declarations are in the same ordering as the original .gn file >+ >+set(angle_translator_sources >+ src/compiler/translator/BaseTypes.h >+ src/compiler/translator/BuiltInFunctionEmulator.cpp >+ src/compiler/translator/BuiltInFunctionEmulator.h >+ src/compiler/translator/CallDAG.cpp >+ src/compiler/translator/CallDAG.h >+ src/compiler/translator/CodeGen.cpp >+ src/compiler/translator/CollectVariables.cpp >+ src/compiler/translator/CollectVariables.h >+ src/compiler/translator/Common.h >+ src/compiler/translator/Compiler.cpp >+ src/compiler/translator/Compiler.h >+ src/compiler/translator/ConstantUnion.cpp >+ src/compiler/translator/ConstantUnion.h >+ src/compiler/translator/Declarator.cpp >+ src/compiler/translator/Declarator.h >+ src/compiler/translator/Diagnostics.cpp >+ src/compiler/translator/Diagnostics.h >+ src/compiler/translator/DirectiveHandler.cpp >+ src/compiler/translator/DirectiveHandler.h >+ src/compiler/translator/ExtensionBehavior.cpp >+ src/compiler/translator/ExtensionBehavior.h >+ src/compiler/translator/FlagStd140Structs.cpp >+ src/compiler/translator/FlagStd140Structs.h >+ src/compiler/translator/FunctionLookup.cpp >+ src/compiler/translator/FunctionLookup.h >+ src/compiler/translator/HashNames.cpp >+ src/compiler/translator/HashNames.h >+ src/compiler/translator/ImmutableString.cpp >+ src/compiler/translator/ImmutableString.h >+ src/compiler/translator/ImmutableStringBuilder.cpp >+ src/compiler/translator/ImmutableStringBuilder.h >+ src/compiler/translator/InfoSink.cpp >+ src/compiler/translator/InfoSink.h >+ src/compiler/translator/Initialize.cpp >+ src/compiler/translator/Initialize.h >+ src/compiler/translator/InitializeDll.cpp >+ src/compiler/translator/InitializeDll.h >+ src/compiler/translator/InitializeGlobals.h >+ src/compiler/translator/IntermNode.h >+ src/compiler/translator/IntermNode.cpp >+ src/compiler/translator/IsASTDepthBelowLimit.cpp >+ src/compiler/translator/IsASTDepthBelowLimit.h >+ src/compiler/translator/Operator.cpp >+ src/compiler/translator/Operator.h >+ src/compiler/translator/OutputTree.cpp >+ src/compiler/translator/OutputTree.h >+ src/compiler/translator/ParseContext.cpp >+ src/compiler/translator/ParseContext.h >+ src/compiler/translator/ParseContext_autogen.h >+ src/compiler/translator/PoolAlloc.cpp >+ src/compiler/translator/PoolAlloc.h >+ src/compiler/translator/Pragma.h >+ src/compiler/translator/QualifierTypes.h >+ src/compiler/translator/QualifierTypes.cpp >+ src/compiler/translator/Severity.h >+ src/compiler/translator/ShaderLang.cpp >+ src/compiler/translator/ShaderVars.cpp >+ src/compiler/translator/StaticType.h >+ src/compiler/translator/Symbol.cpp >+ src/compiler/translator/Symbol.h >+ src/compiler/translator/SymbolTable.cpp >+ src/compiler/translator/SymbolTable.h >+ src/compiler/translator/SymbolTable_autogen.cpp >+ src/compiler/translator/SymbolTable_autogen.h >+ src/compiler/translator/SymbolUniqueId.cpp >+ src/compiler/translator/SymbolUniqueId.h >+ src/compiler/translator/Types.cpp >+ src/compiler/translator/Types.h >+ src/compiler/translator/ValidateAST.cpp >+ src/compiler/translator/ValidateAST.h >+ src/compiler/translator/ValidateGlobalInitializer.cpp >+ src/compiler/translator/ValidateGlobalInitializer.h >+ src/compiler/translator/ValidateLimitations.cpp >+ src/compiler/translator/ValidateLimitations.h >+ src/compiler/translator/ValidateMaxParameters.h >+ src/compiler/translator/ValidateMaxParameters.cpp >+ src/compiler/translator/ValidateOutputs.cpp >+ src/compiler/translator/ValidateOutputs.h >+ src/compiler/translator/ValidateSwitch.cpp >+ src/compiler/translator/ValidateSwitch.h >+ src/compiler/translator/ValidateVaryingLocations.cpp >+ src/compiler/translator/ValidateVaryingLocations.h >+ src/compiler/translator/VariablePacker.cpp >+ src/compiler/translator/VariablePacker.h >+ src/compiler/translator/blocklayout.cpp >+ src/compiler/translator/blocklayout.h >+ src/compiler/translator/glslang.h >+ src/compiler/translator/glslang.l >+ src/compiler/translator/glslang.y >+ src/compiler/translator/glslang_lex.cpp >+ src/compiler/translator/glslang_tab.cpp >+ src/compiler/translator/glslang_tab.h >+ src/compiler/translator/length_limits.h >+ src/compiler/translator/util.cpp >+ src/compiler/translator/util.h >+ src/compiler/translator/tree_ops/AddAndTrueToLoopCondition.cpp >+ src/compiler/translator/tree_ops/AddAndTrueToLoopCondition.h >+ src/compiler/translator/tree_ops/BreakVariableAliasingInInnerLoops.cpp >+ src/compiler/translator/tree_ops/BreakVariableAliasingInInnerLoops.h >+ src/compiler/translator/tree_ops/ClampFragDepth.cpp >+ src/compiler/translator/tree_ops/ClampFragDepth.h >+ src/compiler/translator/tree_ops/ClampPointSize.cpp >+ src/compiler/translator/tree_ops/ClampPointSize.h >+ src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.h >+ src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp >+ src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp >+ src/compiler/translator/tree_ops/DeferGlobalInitializers.h >+ src/compiler/translator/tree_ops/EmulateGLDrawID.cpp >+ src/compiler/translator/tree_ops/EmulateGLDrawID.h >+ src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.cpp >+ src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.h >+ src/compiler/translator/tree_ops/EmulatePrecision.cpp >+ src/compiler/translator/tree_ops/EmulatePrecision.h >+ src/compiler/translator/tree_ops/ExpandIntegerPowExpressions.cpp >+ src/compiler/translator/tree_ops/ExpandIntegerPowExpressions.h >+ src/compiler/translator/tree_ops/FoldExpressions.cpp >+ src/compiler/translator/tree_ops/FoldExpressions.h >+ src/compiler/translator/tree_ops/InitializeVariables.cpp >+ src/compiler/translator/tree_ops/InitializeVariables.h >+ src/compiler/translator/tree_ops/NameEmbeddedUniformStructs.cpp >+ src/compiler/translator/tree_ops/NameEmbeddedUniformStructs.h >+ src/compiler/translator/tree_ops/PruneEmptyCases.cpp >+ src/compiler/translator/tree_ops/PruneEmptyCases.h >+ src/compiler/translator/tree_ops/PruneNoOps.cpp >+ src/compiler/translator/tree_ops/PruneNoOps.h >+ src/compiler/translator/tree_ops/RecordConstantPrecision.cpp >+ src/compiler/translator/tree_ops/RecordConstantPrecision.h >+ src/compiler/translator/tree_ops/RegenerateStructNames.cpp >+ src/compiler/translator/tree_ops/RegenerateStructNames.h >+ src/compiler/translator/tree_ops/RemoveArrayLengthMethod.cpp >+ src/compiler/translator/tree_ops/RemoveArrayLengthMethod.h >+ src/compiler/translator/tree_ops/RemoveInvariantDeclaration.cpp >+ src/compiler/translator/tree_ops/RemoveInvariantDeclaration.h >+ src/compiler/translator/tree_ops/RemovePow.cpp >+ src/compiler/translator/tree_ops/RemovePow.h >+ src/compiler/translator/tree_ops/RemoveUnreferencedVariables.cpp >+ src/compiler/translator/tree_ops/RemoveUnreferencedVariables.h >+ src/compiler/translator/tree_ops/RewriteAtomicFunctionExpressions.cpp >+ src/compiler/translator/tree_ops/RewriteAtomicFunctionExpressions.h >+ src/compiler/translator/tree_ops/RewriteDoWhile.cpp >+ src/compiler/translator/tree_ops/RewriteDoWhile.h >+ src/compiler/translator/tree_ops/RewriteExpressionsWithShaderStorageBlock.cpp >+ src/compiler/translator/tree_ops/RewriteExpressionsWithShaderStorageBlock.h >+ src/compiler/translator/tree_ops/RewriteStructSamplers.cpp >+ src/compiler/translator/tree_ops/RewriteStructSamplers.h >+ src/compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.cpp >+ src/compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.h >+ src/compiler/translator/tree_ops/RewriteTexelFetchOffset.cpp >+ src/compiler/translator/tree_ops/RewriteTexelFetchOffset.h >+ src/compiler/translator/tree_ops/RewriteUnaryMinusOperatorFloat.cpp >+ src/compiler/translator/tree_ops/RewriteUnaryMinusOperatorFloat.h >+ src/compiler/translator/tree_ops/RewriteUnaryMinusOperatorInt.cpp >+ src/compiler/translator/tree_ops/RewriteUnaryMinusOperatorInt.h >+ src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.cpp >+ src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.h >+ src/compiler/translator/tree_ops/SeparateDeclarations.cpp >+ src/compiler/translator/tree_ops/SeparateDeclarations.h >+ src/compiler/translator/tree_ops/SimplifyLoopConditions.cpp >+ src/compiler/translator/tree_ops/SimplifyLoopConditions.h >+ src/compiler/translator/tree_ops/SplitSequenceOperator.cpp >+ src/compiler/translator/tree_ops/SplitSequenceOperator.h >+ src/compiler/translator/tree_ops/UnfoldShortCircuitAST.cpp >+ src/compiler/translator/tree_ops/UnfoldShortCircuitAST.h >+ src/compiler/translator/tree_ops/UseInterfaceBlockFields.cpp >+ src/compiler/translator/tree_ops/UseInterfaceBlockFields.h >+ src/compiler/translator/tree_ops/VectorizeVectorScalarArithmetic.cpp >+ src/compiler/translator/tree_ops/VectorizeVectorScalarArithmetic.h >+ src/compiler/translator/tree_util/BuiltIn_autogen.h >+ src/compiler/translator/tree_util/FindMain.cpp >+ src/compiler/translator/tree_util/FindMain.h >+ src/compiler/translator/tree_util/FindSymbolNode.cpp >+ src/compiler/translator/tree_util/FindSymbolNode.h >+ src/compiler/translator/tree_util/IntermNodePatternMatcher.cpp >+ src/compiler/translator/tree_util/IntermNodePatternMatcher.h >+ src/compiler/translator/tree_util/IntermNode_util.cpp >+ src/compiler/translator/tree_util/IntermNode_util.h >+ src/compiler/translator/tree_util/IntermTraverse.cpp >+ src/compiler/translator/tree_util/IntermTraverse.h >+ src/compiler/translator/tree_util/NodeSearch.h >+ src/compiler/translator/tree_util/ReplaceVariable.cpp >+ src/compiler/translator/tree_util/ReplaceVariable.h >+ src/compiler/translator/tree_util/RunAtTheEndOfShader.cpp >+ src/compiler/translator/tree_util/RunAtTheEndOfShader.h >+ src/compiler/translator/tree_util/Visit.h >+ src/third_party/compiler/ArrayBoundsClamper.cpp >+ src/third_party/compiler/ArrayBoundsClamper.h >+) >+ >+set(angle_translator_essl_sources >+ src/compiler/translator/OutputESSL.cpp >+ src/compiler/translator/OutputESSL.h >+ src/compiler/translator/TranslatorESSL.cpp >+ src/compiler/translator/TranslatorESSL.h >+) >+ >+set(angle_translator_glsl_sources >+ src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp >+ src/compiler/translator/BuiltInFunctionEmulatorGLSL.h >+ src/compiler/translator/ExtensionGLSL.cpp >+ src/compiler/translator/ExtensionGLSL.h >+ src/compiler/translator/OutputGLSL.cpp >+ src/compiler/translator/OutputGLSL.h >+ src/compiler/translator/OutputGLSLBase.cpp >+ src/compiler/translator/OutputGLSLBase.h >+ src/compiler/translator/TranslatorGLSL.cpp >+ src/compiler/translator/TranslatorGLSL.h >+ src/compiler/translator/VersionGLSL.cpp >+ src/compiler/translator/VersionGLSL.h >+) >+ >+set(angle_translator_hlsl_sources >+ src/compiler/translator/ASTMetadataHLSL.cpp >+ src/compiler/translator/ASTMetadataHLSL.h >+ src/compiler/translator/AtomicCounterFunctionHLSL.cpp >+ src/compiler/translator/AtomicCounterFunctionHLSL.h >+ src/compiler/translator/blocklayoutHLSL.cpp >+ src/compiler/translator/blocklayoutHLSL.h >+ src/compiler/translator/BuiltInFunctionEmulatorHLSL.cpp >+ src/compiler/translator/BuiltInFunctionEmulatorHLSL.h >+ src/compiler/translator/OutputHLSL.cpp >+ src/compiler/translator/OutputHLSL.h >+ src/compiler/translator/ResourcesHLSL.cpp >+ src/compiler/translator/ResourcesHLSL.h >+ src/compiler/translator/ShaderStorageBlockFunctionHLSL.cpp >+ src/compiler/translator/ShaderStorageBlockFunctionHLSL.h >+ src/compiler/translator/ShaderStorageBlockOutputHLSL.cpp >+ src/compiler/translator/ShaderStorageBlockOutputHLSL.h >+ src/compiler/translator/StructureHLSL.cpp >+ src/compiler/translator/StructureHLSL.h >+ src/compiler/translator/TextureFunctionHLSL.cpp >+ src/compiler/translator/TextureFunctionHLSL.h >+ src/compiler/translator/ImageFunctionHLSL.cpp >+ src/compiler/translator/ImageFunctionHLSL.h >+ src/compiler/translator/TranslatorHLSL.cpp >+ src/compiler/translator/TranslatorHLSL.h >+ src/compiler/translator/UtilsHLSL.cpp >+ src/compiler/translator/UtilsHLSL.h >+ src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp >+ src/compiler/translator/tree_ops/AddDefaultReturnStatements.cpp >+ src/compiler/translator/tree_ops/AddDefaultReturnStatements.h >+ src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.cpp >+ src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.h >+ src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp >+ src/compiler/translator/tree_ops/RemoveDynamicIndexing.h >+ src/compiler/translator/tree_ops/RemoveSwitchFallThrough.cpp >+ src/compiler/translator/tree_ops/RemoveSwitchFallThrough.h >+ src/compiler/translator/tree_ops/RewriteElseBlocks.cpp >+ src/compiler/translator/tree_ops/RewriteElseBlocks.h >+ src/compiler/translator/tree_ops/SeparateArrayConstructorStatements.cpp >+ src/compiler/translator/tree_ops/SeparateArrayConstructorStatements.h >+ src/compiler/translator/tree_ops/SeparateArrayInitialization.cpp >+ src/compiler/translator/tree_ops/SeparateArrayInitialization.h >+ src/compiler/translator/tree_ops/SeparateExpressionsReturningArrays.cpp >+ src/compiler/translator/tree_ops/SeparateExpressionsReturningArrays.h >+ src/compiler/translator/tree_ops/UnfoldShortCircuitToIf.cpp >+ src/compiler/translator/tree_ops/UnfoldShortCircuitToIf.h >+ src/compiler/translator/tree_ops/WrapSwitchStatementsInBlocks.cpp >+ src/compiler/translator/tree_ops/WrapSwitchStatementsInBlocks.h >+) >+ >+set(angle_translator_lib_vulkan_sources >+ src/compiler/translator/OutputVulkanGLSL.cpp >+ src/compiler/translator/OutputVulkanGLSL.h >+ src/compiler/translator/TranslatorVulkan.cpp >+ src/compiler/translator/TranslatorVulkan.h >+) >+ >+set(angle_preprocessor_sources >+ src/compiler/preprocessor/DiagnosticsBase.cpp >+ src/compiler/preprocessor/DiagnosticsBase.h >+ src/compiler/preprocessor/DirectiveHandlerBase.cpp >+ src/compiler/preprocessor/DirectiveHandlerBase.h >+ src/compiler/preprocessor/DirectiveParser.cpp >+ src/compiler/preprocessor/DirectiveParser.h >+ src/compiler/preprocessor/ExpressionParser.cpp >+ src/compiler/preprocessor/ExpressionParser.h >+ src/compiler/preprocessor/ExpressionParser.y >+ src/compiler/preprocessor/Input.cpp >+ src/compiler/preprocessor/Input.h >+ src/compiler/preprocessor/Lexer.cpp >+ src/compiler/preprocessor/Lexer.h >+ src/compiler/preprocessor/Macro.cpp >+ src/compiler/preprocessor/Macro.h >+ src/compiler/preprocessor/MacroExpander.cpp >+ src/compiler/preprocessor/MacroExpander.h >+ src/compiler/preprocessor/Preprocessor.cpp >+ src/compiler/preprocessor/Preprocessor.h >+ src/compiler/preprocessor/SourceLocation.h >+ src/compiler/preprocessor/Token.cpp >+ src/compiler/preprocessor/Token.h >+ src/compiler/preprocessor/Tokenizer.cpp >+ src/compiler/preprocessor/Tokenizer.h >+ src/compiler/preprocessor/Tokenizer.l >+ src/compiler/preprocessor/numeric_lex.h >+) >diff --git a/Source/ThirdParty/ANGLE/DEPS b/Source/ThirdParty/ANGLE/DEPS >index 36e64adf52e..6bb57674db3 100644 >--- a/Source/ThirdParty/ANGLE/DEPS >+++ b/Source/ThirdParty/ANGLE/DEPS >@@ -1,52 +1,192 @@ > vars = { > 'android_git': 'https://android.googlesource.com', > 'chromium_git': 'https://chromium.googlesource.com', >+ >+ # This variable is set on the Chrome infra for compatiblity with gclient. >+ 'angle_root': '.', >+ >+ # This variable is overrided in Chromium's DEPS file. >+ 'build_with_chromium': False, >+ >+ # Current revision of dEQP. >+ 'deqp_revision': '66a49e0a43f7af654ee1de8a3b1bcaf6c0d14aa4', >+ >+ # Current revision of glslang, the Khronos SPIRV compiler. >+ 'glslang_revision': '86c72c9486a97da534f97e56b8f7ae06cd1b580b', >+ >+ # Current revision fo the SPIRV-Headers Vulkan support library. >+ 'spirv_headers_revision': '2434b89345a50c018c84f42a310b0fad4f3fd94f', >+ >+ # Current revision of SPIRV-Tools for Vulkan. >+ 'spirv_tools_revision': 'c8b09744c6a15f3586c26351376bf5c6f656e89f', >+ >+ # Current revision of Khronos Vulkan-Headers. >+ 'vulkan_headers_revision': '982f0f84dccf6f281b48318c77261a9028000126', >+ >+ # Current revision of Khronos Vulkan-Loader. >+ 'vulkan_loader_revision': '2f0abfcf9eb04018e6e92125a70bc28665aa17fe', >+ >+ # Current revision of Khronos Vulkan-Tools. >+ 'vulkan_tools_revision': 'f392e71b994036c92b896c2a62cc63d042b7f9b1', >+ >+ # Current revision of Khronos Vulkan-ValidationLayers. >+ 'vulkan_validation_revision': 'ff80a937c8a505abbdddb95d8ffaa446820c8391', > } > > deps = { > >- 'build': >- Var('chromium_git') + '/chromium/src/build.git' + '@' + '8a1537f019e55807420ae76c62e4ce8f56fedca1', >+ '{angle_root}/build': { >+ 'url': '{chromium_git}/chromium/src/build.git@54ea0e7fd122348de2f73ac21d1b6eafb9b78969', >+ 'condition': 'not build_with_chromium', >+ }, > >- 'buildtools': >- Var('chromium_git') + '/chromium/buildtools.git' + '@' + '461b345a815c1c745ac0534a6a4bd52d123abe68', >+ '{angle_root}/buildtools': { >+ 'url': '{chromium_git}/chromium/src/buildtools.git@d5c58b84d50d256968271db459cd29b22bff1ba2', >+ 'condition': 'not build_with_chromium', >+ }, > >- 'testing': >- Var('chromium_git') + '/chromium/src/testing' + '@' + '6dfa36ab2e5143fa2f7353e3af5d2935af2e61f7', >+ '{angle_root}/testing': { >+ 'url': '{chromium_git}/chromium/src/testing@32e614b7ec7b2b741351c1b8470aaf30c2f532fa', >+ 'condition': 'not build_with_chromium', >+ }, > > # Cherry is a dEQP management GUI written in Go. We use it for viewing test results. >- 'third_party/cherry': >- Var('android_git') + '/platform/external/cherry' + '@' + '4f8fb08d33ca5ff05a1c638f04c85bbb8d8b52cc', >+ '{angle_root}/third_party/cherry': { >+ 'url': '{android_git}/platform/external/cherry@4f8fb08d33ca5ff05a1c638f04c85bbb8d8b52cc', >+ 'condition': 'not build_with_chromium', >+ }, >+ >+ '{angle_root}/third_party/deqp/src': { >+ 'url': '{chromium_git}/external/deqp@{deqp_revision}', >+ }, >+ >+ '{angle_root}/third_party/fuchsia-sdk': { >+ 'url': '{chromium_git}/chromium/src/third_party/fuchsia-sdk.git@8e8db13b538ecb251e5ce9d5c781fc142f9752fd', >+ 'condition': 'checkout_fuchsia and not build_with_chromium', >+ }, > >- 'third_party/deqp/src': >- Var('android_git') + '/platform/external/deqp' + '@' + '455d82c60b096e7bd83b6a2f5ed70c61e4bfa759', >+ # glmark2 is a GPL3-licensed OpenGL ES 2.0 benchmark. We use it for testing. >+ '{angle_root}/third_party/glmark2/src': { >+ 'url': '{chromium_git}/external/github.com/glmark2/glmark2@c4b3ff5a481348e8bdc2b71ee275864db91e40b1', >+ }, > >- 'third_party/glslang-angle/src': >- Var('android_git') + '/platform/external/shaderc/glslang' + '@' + '1e275c8486325aaab34734ad9a650c0121c5efdb', >+ '{angle_root}/third_party/glslang/src': { >+ 'url': '{chromium_git}/external/github.com/KhronosGroup/glslang@{glslang_revision}', >+ 'condition': 'not build_with_chromium', >+ }, > >- 'third_party/googletest/src': >- Var('chromium_git') + '/external/github.com/google/googletest.git' + '@' + 'd175c8bf823e709d570772b038757fadf63bc632', >+ '{angle_root}/third_party/googletest': { >+ 'url': '{chromium_git}/chromium/src/third_party/googletest@d5024103c8a8977156ee800eb1c84d92dffe9fdf', >+ 'condition': 'not build_with_chromium', >+ }, > >- 'third_party/libpng/src': >- Var('android_git') + '/platform/external/libpng' + '@' + '094e181e79a3d6c23fd005679025058b7df1ad6c', >+ '{angle_root}/third_party/googletest/src': { >+ 'url': '{chromium_git}/external/github.com/google/googletest.git@9997a830ee5589c2da79198bc3b60d1c47e50118', >+ 'condition': 'not build_with_chromium', >+ }, > >- 'third_party/spirv-headers/src': >- Var('android_git') + '/platform/external/shaderc/spirv-headers' + '@' + 'c470b68225a04965bf87d35e143ae92f831e8110', >+ # libjpeg_turbo is used by glmark2. >+ '{angle_root}/third_party/libjpeg_turbo': { >+ 'url': '{chromium_git}/chromium/deps/libjpeg_turbo@6dcdade8828297e306cabfdae80f3510f3f3eea2', >+ 'condition': 'not build_with_chromium', >+ }, > >- 'third_party/spirv-tools-angle/src': >- Var('android_git') + '/platform/external/shaderc/spirv-tools' + '@' + '68c5f0436f1d4f1f137e608780190865d0b193ca', >+ '{angle_root}/third_party/libpng/src': { >+ 'url': '{android_git}/platform/external/libpng@094e181e79a3d6c23fd005679025058b7df1ad6c', >+ 'condition': 'not build_with_chromium', >+ }, > >- 'third_party/vulkan-validation-layers/src': >- Var('android_git') + '/platform/external/vulkan-validation-layers' + '@' + 'f47c534fee2f26f6b783209d56e0ade48e30eb8d', >+ '{angle_root}/third_party/jsoncpp': { >+ 'url': '{chromium_git}/chromium/src/third_party/jsoncpp@fd0ac8ce63a47e99b71a58f1489136fbb19c9137', >+ 'condition': 'not build_with_chromium', >+ }, > >- 'third_party/zlib': >- Var('chromium_git') + '/chromium/src/third_party/zlib' + '@' + '24ab14872e8e068ba08cc31cc3d43bcc6d5cb832', >+ '{angle_root}/third_party/jsoncpp/source': { >+ 'url' : '{chromium_git}/external/github.com/open-source-parsers/jsoncpp@f572e8e42e22cfcf5ab0aea26574f408943edfa4', >+ 'condition': 'not build_with_chromium', >+ }, > >- 'tools/clang': >- Var('chromium_git') + '/chromium/src/tools/clang.git' + '@' + 'e70074db10b27867e6c873adc3ac7e5f9ee0ff6e', >+ '{angle_root}/third_party/Python-Markdown': { >+ 'url': '{chromium_git}/chromium/src/third_party/Python-Markdown@b08af21eb795e522e1b972cb85bff59edb1ae209', >+ 'condition': 'not build_with_chromium', >+ }, >+ >+ '{angle_root}/third_party/qemu-linux-x64': { >+ 'packages': [ >+ { >+ 'package': 'fuchsia/qemu/linux-amd64', >+ 'version': '9cc486c5b18a0be515c39a280ca9a309c54cf994' >+ }, >+ ], >+ 'condition': 'not build_with_chromium and (host_os == "linux" and checkout_fuchsia)', >+ 'dep_type': 'cipd', >+ }, >+ >+ '{angle_root}/third_party/qemu-mac-x64': { >+ 'packages': [ >+ { >+ 'package': 'fuchsia/qemu/mac-amd64', >+ 'version': '2d3358ae9a569b2d4a474f498b32b202a152134f' >+ }, >+ ], >+ 'condition': 'not build_with_chromium and (host_os == "mac" and checkout_fuchsia)', >+ 'dep_type': 'cipd', >+ }, >+ >+ '{angle_root}/third_party/rapidjson/src': { >+ 'url': '{chromium_git}/external/github.com/Tencent/rapidjson@7484e06c589873e1ed80382d262087e4fa80fb63', >+ }, >+ >+ '{angle_root}/third_party/spirv-headers/src': { >+ 'url': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@{spirv_headers_revision}', >+ 'condition': 'not build_with_chromium', >+ }, >+ >+ '{angle_root}/third_party/spirv-tools/src': { >+ 'url': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@{spirv_tools_revision}', >+ 'condition': 'not build_with_chromium', >+ }, >+ >+ '{angle_root}/third_party/vulkan-headers/src': { >+ 'url': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Headers@{vulkan_headers_revision}', >+ }, >+ >+ '{angle_root}/third_party/vulkan-loader/src': { >+ 'url': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@{vulkan_loader_revision}', >+ }, >+ >+ '{angle_root}/third_party/vulkan-tools/src': { >+ 'url': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@{vulkan_tools_revision}', >+ }, >+ >+ '{angle_root}/third_party/vulkan-validation-layers/src': { >+ 'url': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@{vulkan_validation_revision}', >+ }, >+ >+ '{angle_root}/third_party/yasm': { >+ 'url': '{chromium_git}/chromium/src/third_party/yasm@86b6058141a42aed51bbd8bb9f9d54d199d9dbd0', >+ 'condition': 'not build_with_chromium', >+ }, >+ >+ '{angle_root}/third_party/yasm/source/patched-yasm': { >+ 'url': '{chromium_git}/chromium/deps/yasm/patched-yasm.git@720b70524a4424b15fc57e82263568c8ba0496ad', >+ 'condition': 'not build_with_chromium', >+ }, > >- 'tools/gyp': >- Var('chromium_git') + '/external/gyp' + '@' + '5e2b3ddde7cda5eb6bc09a5546a76b00e49d888f', >+ '{angle_root}/third_party/zlib': { >+ 'url': '{chromium_git}/chromium/src/third_party/zlib@f95aeb0fa7f136ef4a457a6d9ba6f3c2701a444b', >+ 'condition': 'not build_with_chromium', >+ }, >+ >+ '{angle_root}/tools/clang': { >+ 'url': '{chromium_git}/chromium/src/tools/clang.git@210f1dc3ebf8504ae246d925e9110ec427eef43f', >+ 'condition': 'not build_with_chromium', >+ }, >+ >+ '{angle_root}/tools/md_browser': { >+ 'url': '{chromium_git}/chromium/src/tools/md_browser@e9462696241f3ca832890473173e03e7bcfe6adc', >+ 'condition': 'not build_with_chromium', >+ }, > } > > hooks = [ >@@ -54,104 +194,138 @@ hooks = [ > { > 'name': 'clang_format_win', > 'pattern': '.', >- 'condition': 'host_os == "win"', >+ 'condition': 'host_os == "win" and not build_with_chromium', > 'action': [ 'download_from_google_storage', > '--no_resume', > '--platform=win32', > '--no_auth', > '--bucket', 'chromium-clang-format', >- '-s', 'buildtools/win/clang-format.exe.sha1', >+ '-s', '{angle_root}/buildtools/win/clang-format.exe.sha1', > ], > }, > { > 'name': 'clang_format_mac', > 'pattern': '.', >- 'condition': 'host_os == "mac"', >+ 'condition': 'host_os == "mac" and not build_with_chromium', > 'action': [ 'download_from_google_storage', > '--no_resume', > '--platform=darwin', > '--no_auth', > '--bucket', 'chromium-clang-format', >- '-s', 'buildtools/mac/clang-format.sha1', >+ '-s', '{angle_root}/buildtools/mac/clang-format.sha1', > ], > }, > { > 'name': 'clang_format_linux', > 'pattern': '.', >- 'condition': 'host_os == "linux"', >+ 'condition': 'host_os == "linux" and not build_with_chromium', > 'action': [ 'download_from_google_storage', > '--no_resume', > '--platform=linux*', > '--no_auth', > '--bucket', 'chromium-clang-format', >- '-s', 'buildtools/linux64/clang-format.sha1', >+ '-s', '{angle_root}/buildtools/linux64/clang-format.sha1', > ], > }, >- # Pull GN binaries using checked-in hashes. > { >- 'name': 'gn_win', >+ 'name': 'sysroot_x86', > 'pattern': '.', >- 'condition': 'host_os == "win"', >- 'action': [ 'download_from_google_storage', >- '--no_resume', >- '--platform=win32', >- '--no_auth', >- '--bucket', 'chromium-gn', >- '-s', 'buildtools/win/gn.exe.sha1', >- ], >+ 'condition': 'checkout_linux and ((checkout_x86 or checkout_x64) and not build_with_chromium)', >+ 'action': ['python', '{angle_root}/build/linux/sysroot_scripts/install-sysroot.py', >+ '--arch=x86'], > }, > { >- 'name': 'gn_mac', >+ 'name': 'sysroot_x64', > 'pattern': '.', >- 'condition': 'host_os == "mac"', >- 'action': [ 'download_from_google_storage', >- '--no_resume', >- '--platform=darwin', >- '--no_auth', >- '--bucket', 'chromium-gn', >- '-s', 'buildtools/mac/gn.sha1', >- ], >+ 'condition': 'checkout_linux and (checkout_x64 and not build_with_chromium)', >+ 'action': ['python', '{angle_root}/build/linux/sysroot_scripts/install-sysroot.py', >+ '--arch=x64'], > }, > { >- 'name': 'gn_linux64', >+ # Update the Windows toolchain if necessary. Must run before 'clang' below. >+ 'name': 'win_toolchain', > 'pattern': '.', >- 'condition': 'host_os == "linux"', >- 'action': [ 'download_from_google_storage', >- '--no_resume', >- '--platform=linux*', >- '--no_auth', >- '--bucket', 'chromium-gn', >- '-s', 'buildtools/linux64/gn.sha1', >- ], >+ 'condition': 'checkout_win and not build_with_chromium', >+ 'action': ['python', '{angle_root}/build/vs_toolchain.py', 'update', '--force'], >+ }, >+ { >+ # Update the Mac toolchain if necessary. >+ 'name': 'mac_toolchain', >+ 'pattern': '.', >+ 'condition': 'checkout_mac and not build_with_chromium', >+ 'action': ['python', '{angle_root}/build/mac_toolchain.py'], > }, >+ > { > # Note: On Win, this should run after win_toolchain, as it may use it. > 'name': 'clang', > 'pattern': '.', >- 'action': ['python', 'tools/clang/scripts/update.py', '--if-needed'], >+ 'action': ['python', '{angle_root}/tools/clang/scripts/update.py'], >+ 'condition': 'not build_with_chromium', >+ }, >+ >+ { >+ # Update LASTCHANGE. >+ 'name': 'lastchange', >+ 'pattern': '.', >+ 'condition': 'not build_with_chromium', >+ 'action': ['python', '{angle_root}/build/util/lastchange.py', >+ '-o', '{angle_root}/build/util/LASTCHANGE'], > }, > > # Pull rc binaries using checked-in hashes. > { > 'name': 'rc_win', > 'pattern': '.', >- 'condition': 'checkout_win and host_os == "win"', >+ 'condition': 'checkout_win and (host_os == "win" and not build_with_chromium)', > 'action': [ 'download_from_google_storage', > '--no_resume', > '--no_auth', > '--bucket', 'chromium-browser-clang/rc', >- '-s', 'build/toolchain/win/rc/win/rc.exe.sha1', >+ '-s', '{angle_root}/build/toolchain/win/rc/win/rc.exe.sha1', >+ ], >+ }, >+ >+ { >+ 'name': 'fuchsia_sdk', >+ 'pattern': '.', >+ 'condition': 'checkout_fuchsia and not build_with_chromium', >+ 'action': [ >+ 'python', >+ '{angle_root}/build/fuchsia/update_sdk.py', > ], > }, > >+ # Download glslang validator binary for Linux. > { >- # A change to a .gyp, .gypi, or to GYP itself should run the generator. >+ 'name': 'linux_glslang_validator', > 'pattern': '.', >- 'action': ['python', 'gyp/gyp_angle'], >+ 'condition': 'checkout_linux and not build_with_chromium', >+ 'action': [ 'download_from_google_storage', >+ '--no_resume', >+ '--platform=linux*', >+ '--no_auth', >+ '--bucket', 'angle-glslang-validator', >+ '-s', '{angle_root}/tools/glslang/glslang_validator.sha1', >+ ], >+ }, >+ >+ # Download glslang validator binary for Windows. >+ { >+ 'name': 'win_glslang_validator', >+ 'pattern': '.', >+ 'condition': 'checkout_win and not build_with_chromium', >+ 'action': [ 'download_from_google_storage', >+ '--no_resume', >+ '--platform=win32*', >+ '--no_auth', >+ '--bucket', 'angle-glslang-validator', >+ '-s', '{angle_root}/tools/glslang/glslang_validator.exe.sha1', >+ ], > }, > ] > > recursedeps = [ > # buildtools provides clang_format. >- 'buildtools', >+ '{angle_root}/buildtools', > ] >diff --git a/Source/ThirdParty/ANGLE/GLESv2.cmake b/Source/ThirdParty/ANGLE/GLESv2.cmake >new file mode 100644 >index 00000000000..c45aa99baf3 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/GLESv2.cmake >@@ -0,0 +1,931 @@ >+# Contains the source file definitions in src/libGLESv2.gn >+# >+# This is a direct mapping of ALL values unless otherwise specified. All >+# declarations are in the same ordering as the original .gn file >+ >+set(libangle_common_sources >+ src/common/Color.h >+ src/common/Color.inl >+ src/common/FastVector.h >+ src/common/FixedVector.h >+ src/common/Float16ToFloat32.cpp >+ src/common/MemoryBuffer.cpp >+ src/common/MemoryBuffer.h >+ src/common/Optional.h >+ src/common/PackedEGLEnums_autogen.cpp >+ src/common/PackedEGLEnums_autogen.h >+ src/common/PackedEnums.cpp >+ src/common/PackedEnums.h >+ src/common/PackedGLEnums_autogen.cpp >+ src/common/PackedGLEnums_autogen.h >+ src/common/PoolAlloc.cpp >+ src/common/PoolAlloc.h >+ src/common/aligned_memory.cpp >+ src/common/aligned_memory.h >+ src/common/angleutils.cpp >+ src/common/angleutils.h >+ src/common/bitset_utils.h >+ src/common/debug.cpp >+ src/common/debug.h >+ src/common/hash_utils.h >+ src/common/mathutil.cpp >+ src/common/mathutil.h >+ src/common/matrix_utils.cpp >+ src/common/matrix_utils.h >+ src/common/platform.h >+ src/common/string_utils.cpp >+ src/common/string_utils.h >+ src/common/third_party/base/anglebase/base_export.h >+ src/common/third_party/base/anglebase/containers/mru_cache.h >+ src/common/third_party/base/anglebase/logging.h >+ src/common/third_party/base/anglebase/macros.h >+ src/common/third_party/base/anglebase/numerics/safe_conversions.h >+ src/common/third_party/base/anglebase/numerics/safe_conversions_impl.h >+ src/common/third_party/base/anglebase/numerics/safe_math.h >+ src/common/third_party/base/anglebase/numerics/safe_math_impl.h >+ src/common/third_party/base/anglebase/sha1.cc >+ src/common/third_party/base/anglebase/sha1.h >+ src/common/third_party/base/anglebase/sys_byteorder.h >+ src/common/third_party/smhasher/src/PMurHash.cpp >+ src/common/third_party/smhasher/src/PMurHash.h >+ src/common/tls.cpp >+ src/common/tls.h >+ src/common/uniform_type_info_autogen.cpp >+ src/common/utilities.cpp >+ src/common/utilities.h >+ src/common/vector_utils.h >+) >+ >+set(xxhash_sources >+ src/common/third_party/xxhash/xxhash.c >+ src/common/third_party/xxhash/xxhash.h >+) >+ >+set(angle_system_utils_sources >+ src/common/Optional.h >+ src/common/angleutils.h >+ src/common/platform.h >+ src/common/system_utils.cpp >+ src/common/system_utils.h >+) >+ >+# Rather than appending to the angle_system_utils_sources we instead make variables that can be used >+ >+set(angle_system_utils_sources_linux src/common/system_utils_linux.cpp) >+set(angle_system_utils_sources_posix src/common/system_utils_posix.cpp) >+set(angle_system_utils_sources_mac src/common/system_utils_mac.cpp) >+set(angle_system_utils_sources_win src/common/system_utils_win.cpp) >+set(angle_system_utils_sources_android >+ src/common/android_util.cpp >+ src/common/android_util.h >+) >+ >+# end modification >+ >+set(libangle_image_util_sources >+ src/image_util/copyimage.cpp >+ src/image_util/copyimage.h >+ src/image_util/copyimage.inl >+ src/image_util/generatemip.h >+ src/image_util/generatemip.inl >+ src/image_util/imageformats.cpp >+ src/image_util/imageformats.h >+ src/image_util/loadimage.cpp >+ src/image_util/loadimage.h >+ src/image_util/loadimage.inl >+ src/image_util/loadimage_etc.cpp >+) >+ >+set(libangle_gpu_info_util_sources >+ src/gpu_info_util/SystemInfo.cpp >+ src/gpu_info_util/SystemInfo.h >+ src/gpu_info_util/SystemInfo_internal.h >+) >+ >+set(libangle_gpu_info_util_win_sources src/gpu_info_util/SystemInfo_win.cpp) >+set(libangle_gpu_info_util_linux_sources src/gpu_info_util/SystemInfo_linux.cpp) >+set(libangle_gpu_info_util_libpci_sources src/gpu_info_util/SystemInfo_libpci.cpp) >+set(libangle_gpu_info_util_x11_sources src/gpu_info_util/SystemInfo_x11.cpp) >+set(libangle_gpu_info_util_mac_sources src/gpu_info_util/SystemInfo_mac.mm) >+ >+set(libangle_includes >+ include/angle_gl.h >+ include/export.h >+ include/EGL/egl.h >+ include/EGL/eglext.h >+ include/EGL/eglext_angle.h >+ include/EGL/eglplatform.h >+ include/GLES/gl.h >+ include/GLES/glplatform.h >+ include/GLES/glext.h >+ include/GLES/glext_angle.h >+ include/GLES/glext_explicit_context_autogen.inc >+ include/GLES2/gl2.h >+ include/GLES2/gl2ext.h >+ include/GLES2/gl2ext_angle.h >+ include/GLES2/gl2ext_explicit_context_autogen.inc >+ include/GLES2/gl2platform.h >+ include/GLES3/gl3.h >+ include/GLES3/gl3ext_explicit_context_autogen.inc >+ include/GLES3/gl3platform.h >+ include/GLES3/gl31.h >+ include/GLES3/gl31ext_explicit_context_autogen.inc >+ include/GLES3/gl32.h >+ include/GLSLANG/ShaderLang.h >+ include/GLSLANG/ShaderVars.h >+ include/KHR/khrplatform.h >+ include/WGL/wgl.h >+ include/platform/FeaturesVk.h >+ include/platform/Platform.h >+ include/platform/WorkaroundsD3D.h) >+ >+set(libangle_sources >+ src/common/event_tracer.cpp >+ src/common/event_tracer.h >+ src/libANGLE/AttributeMap.cpp >+ src/libANGLE/AttributeMap.h >+ src/libANGLE/BinaryStream.h >+ src/libANGLE/BlobCache.cpp >+ src/libANGLE/BlobCache.h >+ src/libANGLE/Buffer.cpp >+ src/libANGLE/Buffer.h >+ src/libANGLE/Caps.cpp >+ src/libANGLE/Caps.h >+ src/libANGLE/Compiler.cpp >+ src/libANGLE/Compiler.h >+ src/libANGLE/Config.cpp >+ src/libANGLE/Config.h >+ src/libANGLE/Constants.h >+ src/libANGLE/Context.cpp >+ src/libANGLE/Context_gles_1_0.cpp >+ src/libANGLE/Context_gles_1_0_autogen.h >+ src/libANGLE/Context.h >+ src/libANGLE/Debug.cpp >+ src/libANGLE/Debug.h >+ src/libANGLE/Device.cpp >+ src/libANGLE/Device.h >+ src/libANGLE/Display.cpp >+ src/libANGLE/Display.h >+ src/libANGLE/EGLSync.cpp >+ src/libANGLE/EGLSync.h >+ src/libANGLE/Error.cpp >+ src/libANGLE/Error.h >+ src/libANGLE/Error.inl >+ src/libANGLE/ErrorStrings.h >+ src/libANGLE/Fence.cpp >+ src/libANGLE/Fence.h >+ src/libANGLE/Framebuffer.cpp >+ src/libANGLE/Framebuffer.h >+ src/libANGLE/FramebufferAttachment.cpp >+ src/libANGLE/FramebufferAttachment.h >+ src/libANGLE/GLES1Renderer.cpp >+ src/libANGLE/GLES1Renderer.h >+ src/libANGLE/GLES1Shaders.inc >+ src/libANGLE/GLES1State.cpp >+ src/libANGLE/GLES1State.h >+ src/libANGLE/HandleAllocator.cpp >+ src/libANGLE/HandleAllocator.h >+ src/libANGLE/HandleRangeAllocator.h >+ src/libANGLE/HandleRangeAllocator.cpp >+ src/libANGLE/Image.h >+ src/libANGLE/Image.cpp >+ src/libANGLE/ImageIndex.h >+ src/libANGLE/ImageIndex.cpp >+ src/libANGLE/IndexRangeCache.cpp >+ src/libANGLE/IndexRangeCache.h >+ src/libANGLE/LoggingAnnotator.cpp >+ src/libANGLE/LoggingAnnotator.h >+ src/libANGLE/MemoryObject.cpp >+ src/libANGLE/MemoryObject.h >+ src/libANGLE/MemoryProgramCache.cpp >+ src/libANGLE/MemoryProgramCache.h >+ src/libANGLE/Observer.cpp >+ src/libANGLE/Observer.h >+ src/libANGLE/Path.h >+ src/libANGLE/Path.cpp >+ src/libANGLE/Platform.cpp >+ src/libANGLE/Program.cpp >+ src/libANGLE/Program.h >+ src/libANGLE/ProgramLinkedResources.cpp >+ src/libANGLE/ProgramLinkedResources.h >+ src/libANGLE/ProgramPipeline.cpp >+ src/libANGLE/ProgramPipeline.h >+ src/libANGLE/Query.cpp >+ src/libANGLE/Query.h >+ src/libANGLE/RefCountObject.h >+ src/libANGLE/Renderbuffer.cpp >+ src/libANGLE/Renderbuffer.h >+ src/libANGLE/ResourceManager.cpp >+ src/libANGLE/ResourceManager.h >+ src/libANGLE/ResourceMap.h >+ src/libANGLE/Sampler.cpp >+ src/libANGLE/Sampler.h >+ src/libANGLE/Shader.cpp >+ src/libANGLE/Shader.h >+ src/libANGLE/SizedMRUCache.h >+ src/libANGLE/State.cpp >+ src/libANGLE/State.h >+ src/libANGLE/Stream.cpp >+ src/libANGLE/Stream.h >+ src/libANGLE/Surface.cpp >+ src/libANGLE/Surface.h >+ src/libANGLE/Texture.cpp >+ src/libANGLE/Texture.h >+ src/libANGLE/Thread.cpp >+ src/libANGLE/Thread.h >+ src/libANGLE/TransformFeedback.cpp >+ src/libANGLE/TransformFeedback.h >+ src/libANGLE/Uniform.cpp >+ src/libANGLE/Uniform.h >+ src/libANGLE/VaryingPacking.cpp >+ src/libANGLE/VaryingPacking.h >+ src/libANGLE/Version.h >+ src/libANGLE/Version.inl >+ src/libANGLE/VertexArray.cpp >+ src/libANGLE/VertexArray.h >+ src/libANGLE/VertexAttribute.cpp >+ src/libANGLE/VertexAttribute.h >+ src/libANGLE/VertexAttribute.inl >+ src/libANGLE/Workarounds.h >+ src/libANGLE/WorkerThread.cpp >+ src/libANGLE/WorkerThread.h >+ src/libANGLE/angletypes.cpp >+ src/libANGLE/angletypes.h >+ src/libANGLE/angletypes.inl >+ src/libANGLE/es3_copy_conversion_table_autogen.cpp >+ src/libANGLE/features.h >+ src/libANGLE/format_map_autogen.cpp >+ src/libANGLE/formatutils.cpp >+ src/libANGLE/formatutils.h >+ src/libANGLE/histogram_macros.h >+ src/libANGLE/queryconversions.cpp >+ src/libANGLE/queryconversions.h >+ src/libANGLE/queryutils.cpp >+ src/libANGLE/queryutils.h >+ src/libANGLE/renderer/BufferImpl.h >+ src/libANGLE/renderer/CompilerImpl.h >+ src/libANGLE/renderer/ContextImpl.cpp >+ src/libANGLE/renderer/ContextImpl.h >+ src/libANGLE/renderer/driver_utils.cpp >+ src/libANGLE/renderer/driver_utils.h >+ src/libANGLE/renderer/DeviceImpl.cpp >+ src/libANGLE/renderer/DeviceImpl.h >+ src/libANGLE/renderer/DisplayImpl.cpp >+ src/libANGLE/renderer/DisplayImpl.h >+ src/libANGLE/renderer/EGLImplFactory.h >+ src/libANGLE/renderer/EGLSyncImpl.h >+ src/libANGLE/renderer/FenceNVImpl.h >+ src/libANGLE/renderer/FormatID_autogen.h >+ src/libANGLE/renderer/Format_table_autogen.cpp >+ src/libANGLE/renderer/Format.h >+ src/libANGLE/renderer/FramebufferAttachmentObjectImpl.h >+ src/libANGLE/renderer/FramebufferImpl.h >+ src/libANGLE/renderer/GLImplFactory.h >+ src/libANGLE/renderer/ImageImpl.h >+ src/libANGLE/renderer/MemoryObjectImpl.h >+ src/libANGLE/renderer/PathImpl.h >+ src/libANGLE/renderer/ProgramImpl.h >+ src/libANGLE/renderer/ProgramPipelineImpl.h >+ src/libANGLE/renderer/QueryImpl.cpp >+ src/libANGLE/renderer/QueryImpl.h >+ src/libANGLE/renderer/RenderbufferImpl.h >+ src/libANGLE/renderer/RenderTargetCache.h >+ src/libANGLE/renderer/SamplerImpl.h >+ src/libANGLE/renderer/ShaderImpl.cpp >+ src/libANGLE/renderer/ShaderImpl.h >+ src/libANGLE/renderer/StreamProducerImpl.h >+ src/libANGLE/renderer/SurfaceImpl.cpp >+ src/libANGLE/renderer/SurfaceImpl.h >+ src/libANGLE/renderer/SyncImpl.h >+ src/libANGLE/renderer/TextureImpl.cpp >+ src/libANGLE/renderer/TextureImpl.h >+ src/libANGLE/renderer/TransformFeedbackImpl.h >+ src/libANGLE/renderer/VertexArrayImpl.h >+ src/libANGLE/renderer/copyvertex.h >+ src/libANGLE/renderer/copyvertex.inc.h >+ src/libANGLE/renderer/load_functions_table.h >+ src/libANGLE/renderer/load_functions_table_autogen.cpp >+ src/libANGLE/renderer/renderer_utils.cpp >+ src/libANGLE/renderer/renderer_utils.h >+ src/libANGLE/validationEGL.cpp >+ src/libANGLE/validationEGL.h >+ src/libANGLE/validationES.cpp >+ src/libANGLE/validationES.h >+ src/libANGLE/validationES1.cpp >+ src/libANGLE/validationES1_autogen.h >+ src/libANGLE/validationES1.h >+ src/libANGLE/validationES2.cpp >+ src/libANGLE/validationES2_autogen.h >+ src/libANGLE/validationES2.h >+ src/libANGLE/validationES3.cpp >+ src/libANGLE/validationES31.cpp >+ src/libANGLE/validationES31_autogen.h >+ src/libANGLE/validationES31.h >+ src/libANGLE/validationES3_autogen.h >+ src/libANGLE/validationES3.h >+ src/libANGLE/validationESEXT_autogen.h >+ src/libANGLE/validationESEXT.h >+ src/third_party/trace_event/trace_event.h >+) >+ >+set(libangle_d3d_shared_sources >+ src/libANGLE/renderer/d3d/BufferD3D.cpp >+ src/libANGLE/renderer/d3d/BufferD3D.h >+ src/libANGLE/renderer/d3d/CompilerD3D.cpp >+ src/libANGLE/renderer/d3d/CompilerD3D.h >+ src/libANGLE/renderer/d3d/ContextD3D.h >+ src/libANGLE/renderer/d3d/DeviceD3D.cpp >+ src/libANGLE/renderer/d3d/DeviceD3D.h >+ src/libANGLE/renderer/d3d/DisplayD3D.cpp >+ src/libANGLE/renderer/d3d/DisplayD3D.h >+ src/libANGLE/renderer/d3d/DynamicHLSL.cpp >+ src/libANGLE/renderer/d3d/DynamicHLSL.h >+ src/libANGLE/renderer/d3d/DynamicImage2DHLSL.cpp >+ src/libANGLE/renderer/d3d/DynamicImage2DHLSL.h >+ src/libANGLE/renderer/d3d/EGLImageD3D.cpp >+ src/libANGLE/renderer/d3d/EGLImageD3D.h >+ src/libANGLE/renderer/d3d/formatutilsD3D.h >+ src/libANGLE/renderer/d3d/FramebufferD3D.cpp >+ src/libANGLE/renderer/d3d/FramebufferD3D.h >+ src/libANGLE/renderer/d3d/HLSLCompiler.cpp >+ src/libANGLE/renderer/d3d/HLSLCompiler.h >+ src/libANGLE/renderer/d3d/ImageD3D.cpp >+ src/libANGLE/renderer/d3d/ImageD3D.h >+ src/libANGLE/renderer/d3d/IndexBuffer.cpp >+ src/libANGLE/renderer/d3d/IndexBuffer.h >+ src/libANGLE/renderer/d3d/IndexDataManager.cpp >+ src/libANGLE/renderer/d3d/IndexDataManager.h >+ src/libANGLE/renderer/d3d/NativeWindowD3D.cpp >+ src/libANGLE/renderer/d3d/NativeWindowD3D.h >+ src/libANGLE/renderer/d3d/ProgramD3D.cpp >+ src/libANGLE/renderer/d3d/ProgramD3D.h >+ src/libANGLE/renderer/d3d/RenderbufferD3D.cpp >+ src/libANGLE/renderer/d3d/RenderbufferD3D.h >+ src/libANGLE/renderer/d3d/RendererD3D.cpp >+ src/libANGLE/renderer/d3d/RendererD3D.h >+ src/libANGLE/renderer/d3d/RenderTargetD3D.h >+ src/libANGLE/renderer/d3d/RenderTargetD3D.cpp >+ src/libANGLE/renderer/d3d/SamplerD3D.h >+ src/libANGLE/renderer/d3d/ShaderD3D.cpp >+ src/libANGLE/renderer/d3d/ShaderD3D.h >+ src/libANGLE/renderer/d3d/ShaderExecutableD3D.cpp >+ src/libANGLE/renderer/d3d/ShaderExecutableD3D.h >+ src/libANGLE/renderer/d3d/SurfaceD3D.cpp >+ src/libANGLE/renderer/d3d/SurfaceD3D.h >+ src/libANGLE/renderer/d3d/SwapChainD3D.cpp >+ src/libANGLE/renderer/d3d/SwapChainD3D.h >+ src/libANGLE/renderer/d3d/TextureD3D.cpp >+ src/libANGLE/renderer/d3d/TextureD3D.h >+ src/libANGLE/renderer/d3d/TextureStorage.h >+ src/libANGLE/renderer/d3d/VertexBuffer.cpp >+ src/libANGLE/renderer/d3d/VertexBuffer.h >+ src/libANGLE/renderer/d3d/VertexDataManager.cpp >+ src/libANGLE/renderer/d3d/VertexDataManager.h >+) >+set(libangle_d3d9_sources >+ src/libANGLE/renderer/d3d/d3d9/Blit9.cpp >+ src/libANGLE/renderer/d3d/d3d9/Blit9.h >+ src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp >+ src/libANGLE/renderer/d3d/d3d9/Buffer9.h >+ src/libANGLE/renderer/d3d/d3d9/Context9.cpp >+ src/libANGLE/renderer/d3d/d3d9/Context9.h >+ src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp >+ src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h >+ src/libANGLE/renderer/d3d/d3d9/Fence9.cpp >+ src/libANGLE/renderer/d3d/d3d9/Fence9.h >+ src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp >+ src/libANGLE/renderer/d3d/d3d9/formatutils9.h >+ src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp >+ src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h >+ src/libANGLE/renderer/d3d/d3d9/Image9.cpp >+ src/libANGLE/renderer/d3d/d3d9/Image9.h >+ src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp >+ src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.h >+ src/libANGLE/renderer/d3d/d3d9/NativeWindow9.cpp >+ src/libANGLE/renderer/d3d/d3d9/NativeWindow9.h >+ src/libANGLE/renderer/d3d/d3d9/Query9.cpp >+ src/libANGLE/renderer/d3d/d3d9/Query9.h >+ src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp >+ src/libANGLE/renderer/d3d/d3d9/Renderer9.h >+ src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp >+ src/libANGLE/renderer/d3d/d3d9/renderer9_utils.h >+ src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp >+ src/libANGLE/renderer/d3d/d3d9/RenderTarget9.h >+ src/libANGLE/renderer/d3d/d3d9/ShaderCache.h >+ src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp >+ src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.h >+ src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskps.h >+ src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskpremultps.h >+ src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskunmultps.h >+ src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceps.h >+ src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminancepremultps.h >+ src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceunmultps.h >+ src/libANGLE/renderer/d3d/d3d9/shaders/compiled/passthroughps.h >+ src/libANGLE/renderer/d3d/d3d9/shaders/compiled/standardvs.h >+ src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp >+ src/libANGLE/renderer/d3d/d3d9/StateManager9.h >+ src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp >+ src/libANGLE/renderer/d3d/d3d9/SwapChain9.h >+ src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp >+ src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h >+ src/libANGLE/renderer/d3d/d3d9/VertexArray9.h >+ src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp >+ src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.h >+ src/libANGLE/renderer/d3d/d3d9/vertexconversion.h >+ src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp >+ src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h >+) >+ >+set(libangle_d3d11_sources >+ src/libANGLE/renderer/d3d/d3d11/Blit11.cpp >+ src/libANGLE/renderer/d3d/d3d11/Blit11.h >+ src/libANGLE/renderer/d3d/d3d11/Blit11Helper_autogen.inc >+ src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp >+ src/libANGLE/renderer/d3d/d3d11/Buffer11.h >+ src/libANGLE/renderer/d3d/d3d11/Clear11.cpp >+ src/libANGLE/renderer/d3d/d3d11/Clear11.h >+ src/libANGLE/renderer/d3d/d3d11/Context11.cpp >+ src/libANGLE/renderer/d3d/d3d11/Context11.h >+ src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp >+ src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h >+ src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp >+ src/libANGLE/renderer/d3d/d3d11/dxgi_support_table_autogen.cpp >+ src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h >+ src/libANGLE/renderer/d3d/d3d11/Fence11.cpp >+ src/libANGLE/renderer/d3d/d3d11/Fence11.h >+ src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp >+ src/libANGLE/renderer/d3d/d3d11/formatutils11.h >+ src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp >+ src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h >+ src/libANGLE/renderer/d3d/d3d11/Image11.cpp >+ src/libANGLE/renderer/d3d/d3d11/Image11.h >+ src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp >+ src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h >+ src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp >+ src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h >+ src/libANGLE/renderer/d3d/d3d11/NativeWindow11.h >+ src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp >+ src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.h >+ src/libANGLE/renderer/d3d/d3d11/Program11.cpp >+ src/libANGLE/renderer/d3d/d3d11/Program11.h >+ src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.cpp >+ src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.h >+ src/libANGLE/renderer/d3d/d3d11/Query11.cpp >+ src/libANGLE/renderer/d3d/d3d11/Query11.h >+ src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp >+ src/libANGLE/renderer/d3d/d3d11/Renderer11.h >+ src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp >+ src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h >+ src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp >+ src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h >+ src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp >+ src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h >+ src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp >+ src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h >+ src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp >+ src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_gs.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4f.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4i.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4ui.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11_fl9vs.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewgs.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewvs.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11vs.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/cleardepth11ps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11_fl9ps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps1.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps2.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps3.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps4.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps5.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps6.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps7.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps8.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps1.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps2.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps3.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps4.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps5.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps6.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps7.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps8.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps1.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps2.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps3.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps4.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps5.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps6.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps7.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps8.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11gs.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11vs.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughdepth2d11ps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvecolor2dps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepth11_ps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_ps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_vs.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvestencil11_ps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2darrayps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2dps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef3dps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2darrayps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2dps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei3dps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2darrayps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2dps.h >+ src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui3dps.h >+ src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp >+ src/libANGLE/renderer/d3d/d3d11/StateManager11.h >+ src/libANGLE/renderer/d3d/d3d11/StreamProducerD3DTexture.cpp >+ src/libANGLE/renderer/d3d/d3d11/StreamProducerD3DTexture.h >+ src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp >+ src/libANGLE/renderer/d3d/d3d11/SwapChain11.h >+ src/libANGLE/renderer/d3d/d3d11/texture_format_table.cpp >+ src/libANGLE/renderer/d3d/d3d11/texture_format_table.h >+ src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp >+ src/libANGLE/renderer/d3d/d3d11/texture_format_table_utils.h >+ src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp >+ src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h >+ src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp >+ src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.h >+ src/libANGLE/renderer/d3d/d3d11/Trim11.cpp >+ src/libANGLE/renderer/d3d/d3d11/Trim11.h >+ src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp >+ src/libANGLE/renderer/d3d/d3d11/VertexArray11.h >+ src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp >+ src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h >+) >+ >+set(libangle_d3d11_win32_sources >+ src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.cpp >+ src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.h >+ src/libANGLE/renderer/d3d/d3d11/converged/CompositorNativeWindow11.cpp >+ src/libANGLE/renderer/d3d/d3d11/converged/CompositorNativeWindow11.h >+ src/third_party/systeminfo/SystemInfo.cpp >+ src/third_party/systeminfo/SystemInfo.h >+) >+ >+set(libangle_d3d11_winrt_sources >+ src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.cpp >+ src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h >+ src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp >+ src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h >+ src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.cpp >+ src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h >+ src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.cpp >+ src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h >+) >+ >+set(libangle_gl_sources >+ src/libANGLE/renderer/gl/BlitGL.cpp >+ src/libANGLE/renderer/gl/BlitGL.h >+ src/libANGLE/renderer/gl/BufferGL.cpp >+ src/libANGLE/renderer/gl/BufferGL.h >+ src/libANGLE/renderer/gl/ClearMultiviewGL.cpp >+ src/libANGLE/renderer/gl/ClearMultiviewGL.h >+ src/libANGLE/renderer/gl/CompilerGL.cpp >+ src/libANGLE/renderer/gl/CompilerGL.h >+ src/libANGLE/renderer/gl/ContextGL.cpp >+ src/libANGLE/renderer/gl/ContextGL.h >+ src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp >+ src/libANGLE/renderer/gl/DispatchTableGL_autogen.h >+ src/libANGLE/renderer/gl/DisplayGL.cpp >+ src/libANGLE/renderer/gl/DisplayGL.h >+ src/libANGLE/renderer/gl/FenceNVGL.cpp >+ src/libANGLE/renderer/gl/FenceNVGL.h >+ src/libANGLE/renderer/gl/FramebufferGL.cpp >+ src/libANGLE/renderer/gl/FramebufferGL.h >+ src/libANGLE/renderer/gl/FunctionsGL.cpp >+ src/libANGLE/renderer/gl/FunctionsGL.h >+ src/libANGLE/renderer/gl/ImageGL.cpp >+ src/libANGLE/renderer/gl/ImageGL.h >+ src/libANGLE/renderer/gl/PathGL.h >+ src/libANGLE/renderer/gl/PathGL.cpp >+ src/libANGLE/renderer/gl/ProgramGL.cpp >+ src/libANGLE/renderer/gl/ProgramGL.h >+ src/libANGLE/renderer/gl/ProgramPipelineGL.cpp >+ src/libANGLE/renderer/gl/ProgramPipelineGL.h >+ src/libANGLE/renderer/gl/QueryGL.cpp >+ src/libANGLE/renderer/gl/QueryGL.h >+ src/libANGLE/renderer/gl/RenderbufferGL.cpp >+ src/libANGLE/renderer/gl/RenderbufferGL.h >+ src/libANGLE/renderer/gl/RendererGL.cpp >+ src/libANGLE/renderer/gl/RendererGL.h >+ src/libANGLE/renderer/gl/SamplerGL.cpp >+ src/libANGLE/renderer/gl/SamplerGL.h >+ src/libANGLE/renderer/gl/ShaderGL.cpp >+ src/libANGLE/renderer/gl/ShaderGL.h >+ src/libANGLE/renderer/gl/StateManagerGL.cpp >+ src/libANGLE/renderer/gl/StateManagerGL.h >+ src/libANGLE/renderer/gl/SurfaceGL.cpp >+ src/libANGLE/renderer/gl/SurfaceGL.h >+ src/libANGLE/renderer/gl/SyncGL.cpp >+ src/libANGLE/renderer/gl/SyncGL.h >+ src/libANGLE/renderer/gl/TextureGL.cpp >+ src/libANGLE/renderer/gl/TextureGL.h >+ src/libANGLE/renderer/gl/TransformFeedbackGL.cpp >+ src/libANGLE/renderer/gl/TransformFeedbackGL.h >+ src/libANGLE/renderer/gl/VertexArrayGL.cpp >+ src/libANGLE/renderer/gl/VertexArrayGL.h >+ src/libANGLE/renderer/gl/WorkaroundsGL.h >+ src/libANGLE/renderer/gl/formatutilsgl.cpp >+ src/libANGLE/renderer/gl/formatutilsgl.h >+ src/libANGLE/renderer/gl/functionsgl_enums.h >+ src/libANGLE/renderer/gl/functionsgl_typedefs.h >+ src/libANGLE/renderer/gl/renderergl_utils.cpp >+ src/libANGLE/renderer/gl/renderergl_utils.h >+) >+ >+set(libangle_gl_null_sources >+ src/libANGLE/renderer/gl/null_functions.cpp >+ src/libANGLE/renderer/gl/null_functions.h >+) >+ >+set(libangle_gl_wgl_sources >+ src/libANGLE/renderer/gl/wgl/ContextWGL.cpp >+ src/libANGLE/renderer/gl/wgl/ContextWGL.h >+ src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp >+ src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h >+ src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp >+ src/libANGLE/renderer/gl/wgl/DisplayWGL.h >+ src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp >+ src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h >+ src/libANGLE/renderer/gl/wgl/FunctionsWGL.cpp >+ src/libANGLE/renderer/gl/wgl/FunctionsWGL.h >+ src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp >+ src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h >+ src/libANGLE/renderer/gl/wgl/RendererWGL.cpp >+ src/libANGLE/renderer/gl/wgl/RendererWGL.h >+ src/libANGLE/renderer/gl/wgl/SurfaceWGL.h >+ src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp >+ src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h >+ src/libANGLE/renderer/gl/wgl/functionswgl_typedefs.h >+ src/libANGLE/renderer/gl/wgl/wgl_utils.cpp >+ src/libANGLE/renderer/gl/wgl/wgl_utils.h >+ src/third_party/khronos/GL/wglext.h >+) >+ >+set(libangle_gl_glx_sources >+ src/libANGLE/renderer/gl/glx/DisplayGLX.cpp >+ src/libANGLE/renderer/gl/glx/DisplayGLX.h >+ src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp >+ src/libANGLE/renderer/gl/glx/FunctionsGLX.h >+ src/libANGLE/renderer/gl/glx/RendererGLX.h >+ src/libANGLE/renderer/gl/glx/RendererGLX.cpp >+ src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp >+ src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h >+ src/libANGLE/renderer/gl/glx/SurfaceGLX.h >+ src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp >+ src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h >+ src/libANGLE/renderer/gl/glx/functionsglx_typedefs.h >+ src/libANGLE/renderer/gl/glx/platform_glx.h >+) >+ >+set(libangle_gl_egl_sources >+ src/libANGLE/renderer/gl/egl/ContextEGL.cpp >+ src/libANGLE/renderer/gl/egl/ContextEGL.h >+ src/libANGLE/renderer/gl/egl/DisplayEGL.cpp >+ src/libANGLE/renderer/gl/egl/DisplayEGL.h >+ src/libANGLE/renderer/gl/egl/ExternalImageSiblingEGL.h >+ src/libANGLE/renderer/gl/egl/egl_utils.cpp >+ src/libANGLE/renderer/gl/egl/egl_utils.h >+ src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp >+ src/libANGLE/renderer/gl/egl/FunctionsEGL.h >+ src/libANGLE/renderer/gl/egl/ImageEGL.cpp >+ src/libANGLE/renderer/gl/egl/ImageEGL.h >+ src/libANGLE/renderer/gl/egl/functionsegl_typedefs.h >+ src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.cpp >+ src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.h >+ src/libANGLE/renderer/gl/egl/RendererEGL.cpp >+ src/libANGLE/renderer/gl/egl/RendererEGL.h >+ src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp >+ src/libANGLE/renderer/gl/egl/SurfaceEGL.h >+ src/libANGLE/renderer/gl/egl/SyncEGL.cpp >+ src/libANGLE/renderer/gl/egl/SyncEGL.h >+ src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.cpp >+ src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.h >+) >+ >+set(libangle_gl_egl_dl_sources >+ src/libANGLE/renderer/gl/egl/FunctionsEGLDL.cpp >+ src/libANGLE/renderer/gl/egl/FunctionsEGLDL.h >+) >+ >+set(libangle_gl_ozone_sources >+ src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp >+ src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.h >+ src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp >+ src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h >+) >+ >+set(libangle_gl_egl_android_sources >+ src/libANGLE/renderer/gl/egl/android/DisplayAndroid.cpp >+ src/libANGLE/renderer/gl/egl/android/DisplayAndroid.h >+ src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.cpp >+ src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h >+) >+ >+set(libangle_gl_cgl_sources >+ src/libANGLE/renderer/gl/cgl/ContextCGL.cpp >+ src/libANGLE/renderer/gl/cgl/ContextCGL.h >+ src/libANGLE/renderer/gl/cgl/DisplayCGL.mm >+ src/libANGLE/renderer/gl/cgl/DisplayCGL.h >+ src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.mm >+ src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.h >+ src/libANGLE/renderer/gl/cgl/RendererCGL.mm >+ src/libANGLE/renderer/gl/cgl/RendererCGL.h >+ src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm >+ src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h >+ src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm >+ src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h >+) >+ >+set(libangle_vulkan_sources >+ src/libANGLE/renderer/vulkan/BufferVk.cpp >+ src/libANGLE/renderer/vulkan/BufferVk.h >+ src/libANGLE/renderer/vulkan/CommandGraph.cpp >+ src/libANGLE/renderer/vulkan/CommandGraph.h >+ src/libANGLE/renderer/vulkan/CompilerVk.cpp >+ src/libANGLE/renderer/vulkan/CompilerVk.h >+ src/libANGLE/renderer/vulkan/ContextVk.cpp >+ src/libANGLE/renderer/vulkan/ContextVk.h >+ src/libANGLE/renderer/vulkan/DeviceVk.cpp >+ src/libANGLE/renderer/vulkan/DeviceVk.h >+ src/libANGLE/renderer/vulkan/DisplayVk.cpp >+ src/libANGLE/renderer/vulkan/DisplayVk.h >+ src/libANGLE/renderer/vulkan/FenceNVVk.cpp >+ src/libANGLE/renderer/vulkan/FenceNVVk.h >+ src/libANGLE/renderer/vulkan/FramebufferVk.cpp >+ src/libANGLE/renderer/vulkan/FramebufferVk.h >+ src/libANGLE/renderer/vulkan/GlslangWrapper.cpp >+ src/libANGLE/renderer/vulkan/GlslangWrapper.h >+ src/libANGLE/renderer/vulkan/ImageVk.cpp >+ src/libANGLE/renderer/vulkan/ImageVk.h >+ src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp >+ src/libANGLE/renderer/vulkan/MemoryObjectVk.h >+ src/libANGLE/renderer/vulkan/ProgramVk.cpp >+ src/libANGLE/renderer/vulkan/ProgramVk.h >+ src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp >+ src/libANGLE/renderer/vulkan/ProgramPipelineVk.h >+ src/libANGLE/renderer/vulkan/QueryVk.cpp >+ src/libANGLE/renderer/vulkan/QueryVk.h >+ src/libANGLE/renderer/vulkan/RenderbufferVk.cpp >+ src/libANGLE/renderer/vulkan/RenderbufferVk.h >+ src/libANGLE/renderer/vulkan/RendererVk.cpp >+ src/libANGLE/renderer/vulkan/RendererVk.h >+ src/libANGLE/renderer/vulkan/RenderTargetVk.cpp >+ src/libANGLE/renderer/vulkan/RenderTargetVk.h >+ src/libANGLE/renderer/vulkan/SamplerVk.cpp >+ src/libANGLE/renderer/vulkan/SamplerVk.h >+ src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.cpp >+ src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.h >+ src/libANGLE/renderer/vulkan/ShaderVk.cpp >+ src/libANGLE/renderer/vulkan/ShaderVk.h >+ src/libANGLE/renderer/vulkan/SurfaceVk.cpp >+ src/libANGLE/renderer/vulkan/SurfaceVk.h >+ src/libANGLE/renderer/vulkan/SyncVk.cpp >+ src/libANGLE/renderer/vulkan/SyncVk.h >+ src/libANGLE/renderer/vulkan/TextureVk.cpp >+ src/libANGLE/renderer/vulkan/TextureVk.h >+ src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp >+ src/libANGLE/renderer/vulkan/TransformFeedbackVk.h >+ src/libANGLE/renderer/vulkan/UtilsVk.cpp >+ src/libANGLE/renderer/vulkan/UtilsVk.h >+ src/libANGLE/renderer/vulkan/VertexArrayVk.cpp >+ src/libANGLE/renderer/vulkan/VertexArrayVk.h >+ src/libANGLE/renderer/vulkan/vk_cache_utils.cpp >+ src/libANGLE/renderer/vulkan/vk_cache_utils.h >+ src/libANGLE/renderer/vulkan/vk_caps_utils.cpp >+ src/libANGLE/renderer/vulkan/vk_caps_utils.h >+ src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp >+ src/libANGLE/renderer/vulkan/vk_format_utils.h >+ src/libANGLE/renderer/vulkan/vk_format_utils.cpp >+ src/libANGLE/renderer/vulkan/vk_helpers.cpp >+ src/libANGLE/renderer/vulkan/vk_helpers.h >+ src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h >+ src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp >+ src/libANGLE/renderer/vulkan/vk_mandatory_format_support_table_autogen.cpp >+ src/libANGLE/renderer/vulkan/vk_utils.cpp >+ src/libANGLE/renderer/vulkan/vk_utils.h >+ src/libANGLE/renderer/vulkan/vk_wrapper.h >+) >+ >+set(libangle_vulkan_android_sources >+ src/libANGLE/renderer/vulkan/android/DisplayVkAndroid.cpp >+ src/libANGLE/renderer/vulkan/android/DisplayVkAndroid.h >+ src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp >+ src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.h >+ src/libANGLE/renderer/vulkan/android/WindowSurfaceVkAndroid.cpp >+ src/libANGLE/renderer/vulkan/android/WindowSurfaceVkAndroid.h >+) >+ >+set(libangle_vulkan_win32_sources >+ src/libANGLE/renderer/vulkan/win32/DisplayVkWin32.cpp >+ src/libANGLE/renderer/vulkan/win32/DisplayVkWin32.h >+ src/libANGLE/renderer/vulkan/win32/WindowSurfaceVkWin32.cpp >+ src/libANGLE/renderer/vulkan/win32/WindowSurfaceVkWin32.h >+) >+ >+set(libangle_vulkan_xcb_sources >+ src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.cpp >+ src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.h >+ src/libANGLE/renderer/vulkan/xcb/WindowSurfaceVkXcb.cpp >+ src/libANGLE/renderer/vulkan/xcb/WindowSurfaceVkXcb.h >+) >+ >+set(libangle_vulkan_fuchsia_sources >+ src/libANGLE/renderer/vulkan/fuchsia/DisplayVkFuchsia.cpp >+ src/libANGLE/renderer/vulkan/fuchsia/DisplayVkFuchsia.h >+ src/libANGLE/renderer/vulkan/fuchsia/WindowSurfaceVkFuchsia.cpp >+ src/libANGLE/renderer/vulkan/fuchsia/WindowSurfaceVkFuchsia.h >+) >+ >+set(libangle_null_sources >+ src/libANGLE/renderer/null/BufferNULL.cpp >+ src/libANGLE/renderer/null/BufferNULL.h >+ src/libANGLE/renderer/null/CompilerNULL.cpp >+ src/libANGLE/renderer/null/CompilerNULL.h >+ src/libANGLE/renderer/null/ContextNULL.cpp >+ src/libANGLE/renderer/null/ContextNULL.h >+ src/libANGLE/renderer/null/DeviceNULL.cpp >+ src/libANGLE/renderer/null/DeviceNULL.h >+ src/libANGLE/renderer/null/DisplayNULL.cpp >+ src/libANGLE/renderer/null/DisplayNULL.h >+ src/libANGLE/renderer/null/FenceNVNULL.cpp >+ src/libANGLE/renderer/null/FenceNVNULL.h >+ src/libANGLE/renderer/null/FramebufferNULL.cpp >+ src/libANGLE/renderer/null/FramebufferNULL.h >+ src/libANGLE/renderer/null/ImageNULL.cpp >+ src/libANGLE/renderer/null/ImageNULL.h >+ src/libANGLE/renderer/null/PathNULL.cpp >+ src/libANGLE/renderer/null/PathNULL.h >+ src/libANGLE/renderer/null/ProgramNULL.cpp >+ src/libANGLE/renderer/null/ProgramNULL.h >+ src/libANGLE/renderer/null/ProgramPipelineNULL.cpp >+ src/libANGLE/renderer/null/ProgramPipelineNULL.h >+ src/libANGLE/renderer/null/QueryNULL.cpp >+ src/libANGLE/renderer/null/QueryNULL.h >+ src/libANGLE/renderer/null/RenderbufferNULL.cpp >+ src/libANGLE/renderer/null/RenderbufferNULL.h >+ src/libANGLE/renderer/null/SamplerNULL.cpp >+ src/libANGLE/renderer/null/SamplerNULL.h >+ src/libANGLE/renderer/null/ShaderNULL.cpp >+ src/libANGLE/renderer/null/ShaderNULL.h >+ src/libANGLE/renderer/null/SurfaceNULL.cpp >+ src/libANGLE/renderer/null/SurfaceNULL.h >+ src/libANGLE/renderer/null/SyncNULL.cpp >+ src/libANGLE/renderer/null/SyncNULL.h >+ src/libANGLE/renderer/null/TextureNULL.cpp >+ src/libANGLE/renderer/null/TextureNULL.h >+ src/libANGLE/renderer/null/TransformFeedbackNULL.cpp >+ src/libANGLE/renderer/null/TransformFeedbackNULL.h >+ src/libANGLE/renderer/null/VertexArrayNULL.cpp >+ src/libANGLE/renderer/null/VertexArrayNULL.h >+) >+ >+set(libglesv2_sources >+ src/common/angleutils.h >+ src/common/debug.h >+ src/libGLESv2/entry_points_egl.cpp >+ src/libGLESv2/entry_points_egl.h >+ src/libGLESv2/entry_points_egl_ext.cpp >+ src/libGLESv2/entry_points_egl_ext.h >+ src/libGLESv2/entry_points_enum_autogen.h >+ src/libGLESv2/entry_points_gles_1_0_autogen.cpp >+ src/libGLESv2/entry_points_gles_1_0_autogen.h >+ src/libGLESv2/entry_points_gles_2_0_autogen.cpp >+ src/libGLESv2/entry_points_gles_2_0_autogen.h >+ src/libGLESv2/entry_points_gles_3_0_autogen.cpp >+ src/libGLESv2/entry_points_gles_3_0_autogen.h >+ src/libGLESv2/entry_points_gles_3_1_autogen.cpp >+ src/libGLESv2/entry_points_gles_3_1_autogen.h >+ src/libGLESv2/entry_points_gles_ext_autogen.cpp >+ src/libGLESv2/entry_points_gles_ext_autogen.h >+ src/libGLESv2/entry_points_utils.h >+ src/libGLESv2/global_state.cpp >+ src/libGLESv2/global_state.h >+ src/libGLESv2/libGLESv2_autogen.cpp >+ src/libGLESv2/libGLESv2.rc >+ src/libGLESv2/proc_table.h >+ src/libGLESv2/proc_table_autogen.cpp >+ src/libGLESv2/resource.h >+) >+ >+set(libglesv1_cm_sources >+ src/libGLESv1_CM/libGLESv1_CM.cpp >+ src/libGLESv1_CM/libGLESv1_CM.def >+ src/libGLESv1_CM/libGLESv1_CM.rc >+ src/libGLESv1_CM/resource.h >+) >+ >+set(libegl_sources >+ src/libEGL/libEGL.cpp >+ src/libEGL/libEGL.rc >+ src/libEGL/resource.h >+ src/libGLESv2/entry_points_egl.h >+ src/libGLESv2/entry_points_egl_ext.h >+ src/libEGL/egl_loader_autogen.h >+) >diff --git a/Source/ThirdParty/ANGLE/LICENSE b/Source/ThirdParty/ANGLE/LICENSE >index bdacb32e36d..0f65fd60fd6 100644 >--- a/Source/ThirdParty/ANGLE/LICENSE >+++ b/Source/ThirdParty/ANGLE/LICENSE >@@ -1,4 +1,4 @@ >-// Copyright (C) 2002-2013 The ANGLE Project Authors. >+// Copyright 2018 The ANGLE Project Authors. > // All rights reserved. > // > // Redistribution and use in source and binary forms, with or without >@@ -8,7 +8,7 @@ > // 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 >+// 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. >@@ -19,7 +19,7 @@ > // prior written permission. > // > // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >+// "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, >diff --git a/Source/ThirdParty/ANGLE/Makefile b/Source/ThirdParty/ANGLE/Makefile >deleted file mode 100644 >index cb4c11a57c6..00000000000 >--- a/Source/ThirdParty/ANGLE/Makefile >+++ /dev/null >@@ -1 +0,0 @@ >-include ../Makefile.shared >diff --git a/Source/ThirdParty/ANGLE/OWNERS b/Source/ThirdParty/ANGLE/OWNERS >new file mode 100644 >index 00000000000..b700861dabe >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/OWNERS >@@ -0,0 +1,8 @@ >+# See https://chromium.googlesource.com/angle/angle/+/master/doc/ContributingCode.md#selecting-reviewers for per-file owners >+cwallez@chromium.org >+geofflang@chromium.org >+jmadill@chromium.org >+syoussefi@chromium.org >+ynovikov@chromium.org >+ >+# COMPONENT: Internals>GPU>Angle >diff --git a/Source/ThirdParty/ANGLE/PRESUBMIT.py b/Source/ThirdParty/ANGLE/PRESUBMIT.py >new file mode 100644 >index 00000000000..501fecdb681 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/PRESUBMIT.py >@@ -0,0 +1,110 @@ >+# 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. >+""" >+ >+from subprocess import call >+ >+ >+# Fragment of a regular expression that matches C++ and Objective-C++ implementation files. >+_IMPLEMENTATION_EXTENSIONS = r'\.(cc|cpp|cxx|mm)$' >+ >+ >+# Fragment of a regular expression that matches C++ and Objective-C++ header files. >+_HEADER_EXTENSIONS = r'\.(h|hpp|hxx)$' >+ >+ >+def _CheckCodeGeneration(input_api, output_api): >+ >+ class Msg(output_api.PresubmitError): >+ """Specialized error message""" >+ def __init__(self, message): >+ super(output_api.PresubmitError, self).__init__(message, >+ long_text='Please ensure your ANGLE repositiory is synced to tip-of-tree\n' >+ 'and you have an up-to-date checkout of all ANGLE dependencies.\n' >+ 'If you are using ANGLE inside Chromium you may need to bootstrap ANGLE \n' >+ 'and run gclient sync. See the DevSetup documentation for details.\n') >+ >+ code_gen_path = input_api.os_path.join(input_api.PresubmitLocalPath(), >+ 'scripts/run_code_generation.py') >+ cmd_name = 'run_code_generation' >+ cmd = [input_api.python_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, white_list=(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, white_list=(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 CheckChangeOnUpload(input_api, output_api): >+ results = [] >+ results.extend(_CheckCodeGeneration(input_api, output_api)) >+ results.extend(input_api.canned_checks.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( >+ input_api.canned_checks.CheckPatchFormatted(input_api, output_api)) >+ return results >+ >+ >+def CheckChangeOnCommit(input_api, output_api): >+ results = [] >+ results.extend(_CheckCodeGeneration(input_api, output_api)) >+ results.extend( >+ input_api.canned_checks.CheckPatchFormatted(input_api, output_api)) >+ results.extend(input_api.canned_checks.CheckChangeHasBugField( >+ input_api, output_api)) >+ results.extend(input_api.canned_checks.CheckChangeHasDescription( >+ input_api, output_api)) >+ return results >diff --git a/Source/ThirdParty/ANGLE/PlatformMac.cmake b/Source/ThirdParty/ANGLE/PlatformMac.cmake >deleted file mode 100644 >index 676b6768ad0..00000000000 >--- a/Source/ThirdParty/ANGLE/PlatformMac.cmake >+++ /dev/null >@@ -1,15 +0,0 @@ >-list(APPEND ANGLE_SOURCES >- src/common/system_utils_mac.cpp >- src/libANGLE/renderer/gl/cgl/DisplayCGL.mm >- src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm >- src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm >-) >- >-find_library(COREGRAPHICS_LIBRARY CoreGraphics) >-find_library(OPENGL_LIBRARY OpenGL) >-find_library(QUARTZCORE_LIBRARY QuartzCore) >-list(APPEND ANGLEGLESv2_LIBRARIES >- PRIVATE ${COREGRAPHICS_LIBRARY} >- PRIVATE ${OPENGL_LIBRARY} >- PRIVATE ${QUARTZCORE_LIBRARY} >-) >diff --git a/Source/ThirdParty/ANGLE/PlatformPlayStation.cmake b/Source/ThirdParty/ANGLE/PlatformPlayStation.cmake >new file mode 100644 >index 00000000000..5d358cae55d >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/PlatformPlayStation.cmake >@@ -0,0 +1,2 @@ >+# Allow building ANGLE on platforms that don't provide X11 headers. >+list(APPEND ANGLE_DEFINITIONS USE_WPE) >diff --git a/Source/ThirdParty/ANGLE/PlatformWPE.cmake b/Source/ThirdParty/ANGLE/PlatformWPE.cmake >new file mode 100644 >index 00000000000..5d358cae55d >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/PlatformWPE.cmake >@@ -0,0 +1,2 @@ >+# Allow building ANGLE on platforms that don't provide X11 headers. >+list(APPEND ANGLE_DEFINITIONS USE_WPE) >diff --git a/Source/ThirdParty/ANGLE/PlatformWin.cmake b/Source/ThirdParty/ANGLE/PlatformWin.cmake >index 3dcbf6fe303..65dbbc73812 100644 >--- a/Source/ThirdParty/ANGLE/PlatformWin.cmake >+++ b/Source/ThirdParty/ANGLE/PlatformWin.cmake >@@ -1,147 +1,32 @@ >-if (${CMAKE_GENERATOR} MATCHES "Ninja") >- if (${MSVC_CXX_ARCHITECTURE_ID} STREQUAL "X86") >- link_directories(${WINDOWSSDKDIR}Lib/${WINDOWSSDKLIBVERSION}/um/x86) >- else () >- link_directories(${WINDOWSSDKDIR}Lib/${WINDOWSSDKLIBVERSION}/um/x64) >- endif () >-else () >- if (${MSVC_CXX_ARCHITECTURE_ID} STREQUAL "X86") >- link_directories($(WINDOWSSDKDIR)Lib/$(WINDOWSSDKLIBVERSION)/um/x86) >- else () >- link_directories($(WINDOWSSDKDIR)Lib/$(WINDOWSSDKLIBVERSION)/um/x64) >- endif () >-endif () >+# We're targeting Windows 10 which will have DirectX 11 on it so require that >+# but make DirectX 9 optional > >-list(APPEND ANGLEEGL_SOURCES >- src/libEGL/libEGL.def >- src/libEGL/libEGL.rc >+list(APPEND ANGLE_DEFINITIONS >+ GL_APICALL= >+ GL_API= >+ NOMINMAX > ) > >-list(APPEND ANGLEEGL_COMPILE_DEFINITIONS >- __STDC_CONSTANT_MACROS >-) >+if (USE_ANGLE_EGL) >+ # We're targeting Windows 10 which will have DirectX 11 >+ list(APPEND ANGLE_SOURCES >+ ${angle_system_utils_sources_win} >+ ${angle_translator_hlsl_sources} > >-list(APPEND ANGLEGLESv2_SOURCES >- src/libGLESv2/libGLESv2.def >- src/libGLESv2/libGLESv2.rc >-) >+ ${libangle_d3d_shared_sources} >+ ${libangle_d3d11_sources} >+ ${libangle_d3d11_win32_sources} >+ ) > >-list(APPEND ANGLEGLESv2_COMPILE_DEFINITIONS >- __STDC_CONSTANT_MACROS >- __STDC_LIMIT_MACROS >-) >+ list(APPEND ANGLE_DEFINITIONS >+ ANGLE_ENABLE_HLSL >+ ANGLE_ENABLE_D3D11 >+ ) > >-list(APPEND ANGLEGLESv2_LIBRARIES >- D3d9 >-) >+ list(APPEND ANGLEGLESv2_LIBRARIES dxguid) > >-list(APPEND ANGLE_SOURCES >- src/common/system_utils_win.cpp >- src/compiler/translator/AddDefaultReturnStatements.cpp >- src/compiler/translator/ArrayReturnValueToOutParameter.cpp >- src/compiler/translator/ASTMetadataHLSL.cpp >- src/compiler/translator/blocklayoutHLSL.cpp >- src/compiler/translator/BuiltInFunctionEmulatorHLSL.cpp >- src/compiler/translator/OutputHLSL.cpp >- src/compiler/translator/RemoveDynamicIndexing.cpp >- src/compiler/translator/RemoveSwitchFallThrough.cpp >- src/compiler/translator/RewriteElseBlocks.cpp >- src/compiler/translator/SeparateArrayInitialization.cpp >- src/compiler/translator/SeparateExpressionsReturningArrays.cpp >- src/compiler/translator/StructureHLSL.cpp >- src/compiler/translator/TextureFunctionHLSL.cpp >- src/compiler/translator/ImageFunctionHLSL.cpp >- src/compiler/translator/TranslatorHLSL.cpp >- src/compiler/translator/UnfoldShortCircuitToIf.cpp >- src/compiler/translator/UniformHLSL.cpp >- src/compiler/translator/UtilsHLSL.cpp >- src/compiler/translator/WrapSwitchStatementsInBlocks.cpp >- src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp >- src/libANGLE/renderer/d3d/BufferD3D.cpp >- src/libANGLE/renderer/d3d/CompilerD3D.cpp >- src/libANGLE/renderer/d3d/DeviceD3D.cpp >- src/libANGLE/renderer/d3d/DisplayD3D.cpp >- src/libANGLE/renderer/d3d/DynamicHLSL.cpp >- src/libANGLE/renderer/d3d/EGLImageD3D.cpp >- src/libANGLE/renderer/d3d/FramebufferD3D.cpp >- src/libANGLE/renderer/d3d/HLSLCompiler.cpp >- src/libANGLE/renderer/d3d/ImageD3D.cpp >- src/libANGLE/renderer/d3d/IndexBuffer.cpp >- src/libANGLE/renderer/d3d/IndexDataManager.cpp >- src/libANGLE/renderer/d3d/NativeWindowD3D.cpp >- src/libANGLE/renderer/d3d/ProgramD3D.cpp >- src/libANGLE/renderer/d3d/RenderbufferD3D.cpp >- src/libANGLE/renderer/d3d/RendererD3D.cpp >- src/libANGLE/renderer/d3d/RenderTargetD3D.cpp >- src/libANGLE/renderer/d3d/ShaderD3D.cpp >- src/libANGLE/renderer/d3d/ShaderExecutableD3D.cpp >- src/libANGLE/renderer/d3d/SurfaceD3D.cpp >- src/libANGLE/renderer/d3d/SwapChainD3D.cpp >- src/libANGLE/renderer/d3d/TextureD3D.cpp >- src/libANGLE/renderer/d3d/VertexBuffer.cpp >- src/libANGLE/renderer/d3d/VertexDataManager.cpp >- src/libANGLE/renderer/d3d/d3d11/Blit11.cpp >- src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp >- src/libANGLE/renderer/d3d/d3d11/Clear11.cpp >- src/libANGLE/renderer/d3d/d3d11/Context11.cpp >- src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp >- src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp >- src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp >- src/libANGLE/renderer/d3d/d3d11/Fence11.cpp >- src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp >- src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp >- src/libANGLE/renderer/d3d/d3d11/Image11.cpp >- src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp >- src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp >- src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp >- src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.cpp >- src/libANGLE/renderer/d3d/d3d11/Query11.cpp >- src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp >- src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp >- src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp >- src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp >- src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp >- src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp >- src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp >- src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.cpp >- src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp >- src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp >- src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp >- src/libANGLE/renderer/d3d/d3d11/Trim11.cpp >- src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp >- src/libANGLE/renderer/d3d/d3d11/texture_format_table.cpp >- src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp >- src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp >- src/libANGLE/renderer/d3d/d3d9/Blit9.cpp >- src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp >- src/libANGLE/renderer/d3d/d3d9/Context9.cpp >- src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp >- src/libANGLE/renderer/d3d/d3d9/Fence9.cpp >- src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp >- src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp >- src/libANGLE/renderer/d3d/d3d9/Image9.cpp >- src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp >- src/libANGLE/renderer/d3d/d3d9/NativeWindow9.cpp >- src/libANGLE/renderer/d3d/d3d9/Query9.cpp >- src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp >- src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp >- src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp >- src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp >- src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp >- src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp >- src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp >- src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp >- src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp >- src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.cpp >- src/third_party/systeminfo/SystemInfo.cpp >-) >- >-list(APPEND ANGLE_COMPILE_DEFINITIONS >- ANGLE_DEFAULT_D3D11=1 >- ANGLE_ENABLE_D3D9 >- ANGLE_ENABLE_D3D11 >- ANGLE_ENABLE_HLSL >- ANGLE_SKIP_DXGI_1_2_CHECK=1 >- __STDC_CONSTANT_MACROS >- __STDC_LIMIT_MACROS >-) >+ # DirectX 9 support should be optional but ANGLE will not compile without it >+ list(APPEND ANGLE_SOURCES ${libangle_d3d9_sources}) >+ list(APPEND ANGLE_DEFINITIONS ANGLE_ENABLE_D3D9) >+ list(APPEND ANGLEGLESv2_LIBRARIES d3d9) >+endif () >diff --git a/Source/ThirdParty/ANGLE/README.chromium b/Source/ThirdParty/ANGLE/README.chromium >index b141fb53074..bcee64a416a 100644 >--- a/Source/ThirdParty/ANGLE/README.chromium >+++ b/Source/ThirdParty/ANGLE/README.chromium >@@ -1,10 +1,12 @@ > Name: ANGLE >-URL: https://code.google.com/p/angleproject/ >-Version: 2422 >+URL: http://angleproject.org >+Version: unknown > License: BSD > License File: LICENSE > > Description: >-ANGLE is a conformant implementation of the OpenGL ES 2.0 >-specification that is hardwareâaccelerated via Direct3D. >+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. > >diff --git a/Source/ThirdParty/ANGLE/README.md b/Source/ThirdParty/ANGLE/README.md >index 91a47441b90..b32d55254cb 100644 >--- a/Source/ThirdParty/ANGLE/README.md >+++ b/Source/ThirdParty/ANGLE/README.md >@@ -19,10 +19,10 @@ underway, and future plans include compute shader support (ES 3.1) and MacOS sup > | | Direct3D 9 | Direct3D 11 | Desktop GL | GL ES | Vulkan | > |------------:|:--------------:|:--------------:|:-------------:|:-----------:|:-----------:| > | Windows | complete | complete | complete | complete | in progress | >-| Linux | | | complete | | planned | >-| Mac OS X | | | in progress | | | >+| Linux | | | complete | | in progress | >+| Mac OS X | | | in progress | | | > | Chrome OS | | | | complete | planned | >-| Android | | | | complete | planned | >+| Android | | | | complete | in progress | > > ANGLE v1.0.772 was certified compliant by passing the ES 2.0.3 conformance tests in October 2011. > ANGLE also provides an implementation of the EGL 1.4 specification. >@@ -49,27 +49,30 @@ ANGLE repository is hosted by Chromium project and can be > > ## Building > >-View the [Dev setup instructions](doc/DevSetup.md). For generating a Windows Store version of ANGLE view the [Windows Store instructions](doc/BuildingAngleForWindowsStore.md) >+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 IRC in the #ANGLEproject channel on FreeNode. >-* File bugs in the [issue tracker](http://code.google.com/p/angleproject/issues/list) (preferably with an isolated test-case). >+* Join us on [Slack](https://chromium.slack.com) in the #angle 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. >+* 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](doc/Starter-Projects.md). > > > * Read about WebGL on the [Khronos WebGL Wiki](http://khronos.org/webgl/wiki/Main_Page). > * Learn about implementation details in the [OpenGL Insights chapter on ANGLE](http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-ANGLE.pdf) and this [ANGLE presentation](https://drive.google.com/file/d/0Bw29oYeC09QbbHoxNE5EUFh0RGs/view?usp=sharing). >-* Learn about the past, present, and future of the ANGLE implementation in [this recent presentation](https://docs.google.com/presentation/d/1CucIsdGVDmdTWRUbg68IxLE5jXwCb2y1E9YVhQo0thg/pub?start=false&loop=false). >+* 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) > * If you use ANGLE in your own project, we'd love to hear about it! >- >diff --git a/Source/ThirdParty/ANGLE/WATCHLISTS b/Source/ThirdParty/ANGLE/WATCHLISTS >new file mode 100644 >index 00000000000..f4139e54353 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/WATCHLISTS >@@ -0,0 +1,24 @@ >+# 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': ['jmadill+watch@chromium.org'], >+ }, >+} >diff --git a/Source/ThirdParty/ANGLE/additional_readme_paths.json b/Source/ThirdParty/ANGLE/additional_readme_paths.json >new file mode 100644 >index 00000000000..4bb2934a793 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/additional_readme_paths.json >@@ -0,0 +1,4 @@ >+[ >+ "src/common/third_party/xxhash", >+ "src/third_party/compiler" >+] >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/android/AndroidManifest.xml.jinja2 b/Source/ThirdParty/ANGLE/android/AndroidManifest.xml.jinja2 >new file mode 100644 >index 00000000000..b559b37da2c >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/android/AndroidManifest.xml.jinja2 >@@ -0,0 +1,20 @@ >+<?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('com.chromium.angle')}}"> >+ >+ <uses-sdk android:minSdkVersion="26" >+ android:targetSdkVersion="28"> >+ </uses-sdk> >+ >+ <application android:label="Angle for Android" >+ android:extractNativeLibs="false" >+ android:multiArch="true"> >+ </application> >+</manifest> >diff --git a/Source/ThirdParty/ANGLE/android/OWNERS b/Source/ThirdParty/ANGLE/android/OWNERS >new file mode 100644 >index 00000000000..f38b3668a9f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/android/OWNERS >@@ -0,0 +1,6 @@ >+alanward@google.com >+cnorthrop@google.com >+courtneygo@google.com >+ianelliott@google.com >+timvp@google.com >+tobine@google.com >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/android/angle_apk.gni b/Source/ThirdParty/ANGLE/android/angle_apk.gni >new file mode 100644 >index 00000000000..d2904abc08a >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/android/angle_apk.gni >@@ -0,0 +1,114 @@ >+# 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("//third_party/angle/gni/angle.gni") >+ >+vulkan_validation_layers = [ >+ "VkLayer_core_validation", >+ "VkLayer_object_lifetimes", >+ "VkLayer_stateless_validation", >+ "VkLayer_thread_safety", >+ "VkLayer_unique_objects", >+] >+ >+angle_libraries = [ >+ "EGL", >+ "GLESv1_CM", >+ "GLESv2", >+ "feature_support", >+] >+ >+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 = "//third_party/angle/android/AndroidManifest.xml.jinja2" >+ output = manifest_path >+ variables = [ "manifest_package=${invoker.package_name}" ] >+ } >+ >+ 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" >+ deps = [ >+ ":${invoker.package_name}_assets", >+ ] >+ if (symbol_level != 0) { >+ deps += [ ":compressed_symbols" ] >+ if (build_apk_secondary_abi && android_64bit_target_cpu) { >+ deps += [ ":compressed_symbols($android_secondary_abi_toolchain)" ] >+ } >+ } >+ >+ uncompress_shared_libraries = true >+ >+ if (build_apk_secondary_abi && android_64bit_target_cpu) { >+ if (symbol_level == 0) { >+ secondary_abi_shared_libraries = [] >+ foreach(_library, angle_libraries) { >+ secondary_abi_shared_libraries += >+ [ "${angle_root}:lib${_library}${angle_libs_suffix}" + >+ "($android_secondary_abi_toolchain)" ] >+ } >+ if (angle_enable_vulkan_validation_layers) { >+ foreach(_layer, vulkan_validation_layers) { >+ secondary_abi_shared_libraries += [ >+ "${angle_root}/third_party/vulkan-validation-layers:${_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/lib${_library}${angle_libs_suffix}.so" ] >+ } >+ if (angle_enable_vulkan_validation_layers) { >+ foreach(_layer, vulkan_validation_layers) { >+ secondary_abi_loadable_modules += >+ [ "${_secondary_out_dir}/lib.compressed/lib${_layer}.so" ] >+ } >+ } >+ } >+ } >+ >+ if (symbol_level == 0) { >+ shared_libraries = [] >+ foreach(_library, angle_libraries) { >+ shared_libraries += >+ [ "${angle_root}:lib${_library}${angle_libs_suffix}" ] >+ } >+ if (angle_enable_vulkan_validation_layers) { >+ foreach(_layer, vulkan_validation_layers) { >+ shared_libraries += >+ [ "${angle_root}/third_party/vulkan-validation-layers:${_layer}" ] >+ } >+ } >+ } else { >+ loadable_modules = [] >+ foreach(_library, angle_libraries) { >+ loadable_modules += [ "${root_out_dir}/lib.compressed/lib${_library}${angle_libs_suffix}.so" ] >+ } >+ if (angle_enable_vulkan_validation_layers) { >+ foreach(_layer, vulkan_validation_layers) { >+ loadable_modules += >+ [ "${root_out_dir}/lib.compressed/lib${_layer}.so" ] >+ } >+ } >+ } >+ } >+} >diff --git a/Source/ThirdParty/ANGLE/android/compress_symbols.py b/Source/ThirdParty/ANGLE/android/compress_symbols.py >new file mode 100644 >index 00000000000..ab0ed91d459 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/android/compress_symbols.py >@@ -0,0 +1,128 @@ >+#!/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. >+# >+ >+import argparse >+import os >+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( >+ '--sofile', >+ required=True, >+ help='Shared object file produced by linking command', >+ metavar='FILE') >+ 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.sofile, args.output] >+ result = subprocess.call(copy_cmd) >+ >+ objcopy_cmd = [args.objcopy] >+ objcopy_cmd.append('--only-keep-debug') >+ objcopy_cmd.append(args.unstrippedsofile) >+ objcopy_cmd.append(args.output + '.debug') >+ result = subprocess.call(objcopy_cmd) >+ >+ nm_cmd = subprocess.Popen( >+ [args.nm, args.unstrippedsofile, '--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) >+ dynsym_out.close() >+ >+ nm_cmd = subprocess.Popen( >+ [args.nm, args.unstrippedsofile, '--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) >+ >+ funcsyms_out = open(args.output + '.funcsyms', 'w') >+ sort_cmd = subprocess.Popen(['sort'], >+ stdin=awk_cmd.stdout, >+ stdout=funcsyms_out) >+ funcsyms_out.close() >+ >+ keep_symbols = open(args.output + '.keep_symbols', 'w') >+ sort_cmd = subprocess.Popen( >+ ['comm', '-13', args.output + '.dynsyms', args.output + '.funcsyms'], >+ stdin=awk_cmd.stdout, >+ stdout=keep_symbols) >+ >+ # Ensure that the keep_symbols file is not empty. >+ keep_symbols.write("\n") >+ keep_symbols.close() >+ >+ objcopy_cmd = [ >+ args.objcopy, '--rename-section', '.debug_frame=saved_debug_frame', >+ args.output + '.debug', args.output + ".mini_debuginfo" >+ ] >+ 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 + '.mini_debuginfo' >+ ] >+ subprocess.check_call(objcopy_cmd) >+ >+ objcopy_cmd = [ >+ args.objcopy, '--rename-section', '.saved_debug_frame=.debug_frame', >+ args.output + ".mini_debuginfo" >+ ] >+ subprocess.check_call(objcopy_cmd) >+ >+ xz_cmd = ['xz', 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()) >diff --git a/Source/ThirdParty/ANGLE/build_overrides/angle.gni b/Source/ThirdParty/ANGLE/build_overrides/angle.gni >new file mode 100644 >index 00000000000..903a1f51e0d >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/build_overrides/angle.gni >@@ -0,0 +1,11 @@ >+# 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. >+ >+# Overrides for ANGLE's dependencies >+angle_glslang_dir = "//third_party/glslang/src" >+angle_googletest_dir = "//third_party/googletest/src" >+angle_libjpeg_turbo_dir = "//third_party/libjpeg_turbo" >+angle_jsoncpp_dir = "//third_party/jsoncpp" >+angle_libpng_dir = "//third_party/libpng" >+angle_spirv_tools_dir = "//third_party/spirv-tools/src" >diff --git a/Source/ThirdParty/ANGLE/build_overrides/build.gni b/Source/ThirdParty/ANGLE/build_overrides/build.gni >new file mode 100644 >index 00000000000..e82a3fe5cdd >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/build_overrides/build.gni >@@ -0,0 +1,26 @@ >+# Copyright (c) 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 >+ linux_use_bundled_binutils_override = false >+ >+ use_system_xcode = "" >+} >+ >+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 >+} >diff --git a/Source/ThirdParty/ANGLE/build_overrides/glslang.gni b/Source/ThirdParty/ANGLE/build_overrides/glslang.gni >new file mode 100644 >index 00000000000..534d55d9113 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/build_overrides/glslang.gni >@@ -0,0 +1,6 @@ >+# 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/spirv-tools/src" >diff --git a/Source/ThirdParty/ANGLE/build_overrides/gtest.gni b/Source/ThirdParty/ANGLE/build_overrides/gtest.gni >new file mode 100644 >index 00000000000..5344cd8318d >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/build_overrides/gtest.gni >@@ -0,0 +1,17 @@ >+# 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 >diff --git a/Source/ThirdParty/ANGLE/build_overrides/spirv_tools.gni b/Source/ThirdParty/ANGLE/build_overrides/spirv_tools.gni >new file mode 100644 >index 00000000000..adfa08b6d8f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/build_overrides/spirv_tools.gni >@@ -0,0 +1,10 @@ >+# 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/spirv-headers/src" >diff --git a/Source/ThirdParty/ANGLE/changes.diff b/Source/ThirdParty/ANGLE/changes.diff >deleted file mode 100644 >index c3afb79e51a..00000000000 >--- a/Source/ThirdParty/ANGLE/changes.diff >+++ /dev/null >@@ -1,8109 +0,0 @@ >-diff --git a/include/GLSLANG/ShaderLang.h b/include/GLSLANG/ShaderLang.h >-index 1468bb146..2875c02ab 100644 >---- a/include/GLSLANG/ShaderLang.h >-+++ b/include/GLSLANG/ShaderLang.h >-@@ -8,7 +8,7 @@ >- >- #include <stddef.h> >- >--#include "KHR/khrplatform.h" >-+#include "khrplatform.h" >- >- #include <array> >- #include <map> >-diff --git a/include/GLSLANG/ShaderVars.h b/include/GLSLANG/ShaderVars.h >-index 709428aeb..acd9c358f 100644 >---- a/include/GLSLANG/ShaderVars.h >-+++ b/include/GLSLANG/ShaderVars.h >-@@ -281,10 +281,17 @@ struct WorkGroupSize >- { >- // Must have a trivial default constructor since it is used in YYSTYPE. >- WorkGroupSize() = default; >-+#if defined(__clang__) >-+#pragma clang diagnostic push >-+#pragma clang diagnostic ignored "-Wmissing-braces" >-+#endif >- explicit constexpr WorkGroupSize(int initialSize) >- : localSizeQualifiers{initialSize, initialSize, initialSize} >- { >- } >-+#if defined(__clang__) >-+#pragma clang diagnostic pop >-+#endif >- >- void fill(int fillValue); >- void setLocalSize(int localSizeX, int localSizeY, int localSizeZ); >-diff --git a/include/KHR/khrplatform.h b/include/KHR/khrplatform.h >-old mode 100755 >-new mode 100644 >-index 68fca4827..07b61b9bd >---- a/include/KHR/khrplatform.h >-+++ b/include/KHR/khrplatform.h >-@@ -282,4 +282,4 @@ typedef enum { >- KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM >- } khronos_boolean_enum_t; >- >--#endif /* __khrplatform_h_ */ >-\ No newline at end of file >-+#endif /* __khrplatform_h_ */ >-diff --git a/src/common/third_party/smhasher/src/PMurHash.cpp b/src/common/third_party/smhasher/src/PMurHash.cpp >-index 071bc3153..2d608e97d 100644 >---- a/src/common/third_party/smhasher/src/PMurHash.cpp >-+++ b/src/common/third_party/smhasher/src/PMurHash.cpp >-@@ -74,6 +74,12 @@ on big endian machines, or a byte-by-byte read if the endianess is unknown. >- * ROTL32(x,r) Rotate x left by r bits >- */ >- >-+#if !defined(__BYTE_ORDER) && defined(__GNUC__) >-+ #define __BIG_ENDIAN __ORDER_BIG_ENDIAN__ >-+ #define __LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ >-+ #define __BYTE_ORDER __BYTE_ORDER__ >-+#endif >-+ >- /* Convention is to define __BYTE_ORDER == to one of these values */ >- #if !defined(__BIG_ENDIAN) >- #define __BIG_ENDIAN 4321 >-@@ -84,7 +90,9 @@ on big endian machines, or a byte-by-byte read if the endianess is unknown. >- >- /* I386 */ >- #if defined(_M_IX86) || defined(__i386__) || defined(__i386) || defined(i386) >-- #define __BYTE_ORDER __LITTLE_ENDIAN >-+ #if !defined(__BYTE_ORDER) >-+ #define __BYTE_ORDER __LITTLE_ENDIAN >-+ #endif >- #define UNALIGNED_SAFE >- #endif >- >-@@ -111,7 +119,14 @@ on big endian machines, or a byte-by-byte read if the endianess is unknown. >- /* Now find best way we can to READ_UINT32 */ >- #if __BYTE_ORDER==__LITTLE_ENDIAN >- /* CPU endian matches murmurhash algorithm, so read 32-bit word directly */ >-+#if defined(__clang__) >-+#pragma clang diagnostic push >-+#pragma clang diagnostic ignored "-Wcast-align" >-+#endif >- #define READ_UINT32(ptr) (*((uint32_t*)(ptr))) >-+#if defined(__clang__) >-+#pragma clang diagnostic pop >-+#endif >- #elif __BYTE_ORDER==__BIG_ENDIAN >- /* TODO: Add additional cases below where a compiler provided bswap32 is available */ >- #if defined(__GNUC__) && (__GNUC__>4 || (__GNUC__==4 && __GNUC_MINOR__>=3)) >-@@ -218,14 +233,28 @@ void PMurHash32_Process(uint32_t *ph1, uint32_t *pcarry, const void *key, int le >- switch(n) { /* how many bytes in c */ >- case 0: /* c=[----] w=[3210] b=[3210]=w c'=[----] */ >- for( ; ptr < end ; ptr+=4) { >-+#if defined(__clang__) >-+#pragma clang diagnostic push >-+#pragma clang diagnostic ignored "-Wcast-align" >-+#endif >- uint32_t k1 = READ_UINT32(ptr); >-+#if defined(__clang__) >-+#pragma clang diagnostic pop >-+#endif >- DOBLOCK(h1, k1); >- } >- break; >- case 1: /* c=[0---] w=[4321] b=[3210]=c>>24|w<<8 c'=[4---] */ >- for( ; ptr < end ; ptr+=4) { >- uint32_t k1 = c>>24; >-+#if defined(__clang__) >-+#pragma clang diagnostic push >-+#pragma clang diagnostic ignored "-Wcast-align" >-+#endif >- c = READ_UINT32(ptr); >-+#if defined(__clang__) >-+#pragma clang diagnostic pop >-+#endif >- k1 |= c<<8; >- DOBLOCK(h1, k1); >- } >-@@ -233,7 +262,14 @@ void PMurHash32_Process(uint32_t *ph1, uint32_t *pcarry, const void *key, int le >- case 2: /* c=[10--] w=[5432] b=[3210]=c>>16|w<<16 c'=[54--] */ >- for( ; ptr < end ; ptr+=4) { >- uint32_t k1 = c>>16; >-+#if defined(__clang__) >-+#pragma clang diagnostic push >-+#pragma clang diagnostic ignored "-Wcast-align" >-+#endif >- c = READ_UINT32(ptr); >-+#if defined(__clang__) >-+#pragma clang diagnostic pop >-+#endif >- k1 |= c<<16; >- DOBLOCK(h1, k1); >- } >-@@ -241,7 +277,14 @@ void PMurHash32_Process(uint32_t *ph1, uint32_t *pcarry, const void *key, int le >- case 3: /* c=[210-] w=[6543] b=[3210]=c>>8|w<<24 c'=[654-] */ >- for( ; ptr < end ; ptr+=4) { >- uint32_t k1 = c>>8; >-+#if defined(__clang__) >-+#pragma clang diagnostic push >-+#pragma clang diagnostic ignored "-Wcast-align" >-+#endif >- c = READ_UINT32(ptr); >-+#if defined(__clang__) >-+#pragma clang diagnostic pop >-+#endif >- k1 |= c<<24; >- DOBLOCK(h1, k1); >- } >-diff --git a/src/compiler/preprocessor/ExpressionParser.cpp b/src/compiler/preprocessor/ExpressionParser.cpp >-index ede334619..c0f8b9c97 100644 >---- a/src/compiler/preprocessor/ExpressionParser.cpp >-+++ b/src/compiler/preprocessor/ExpressionParser.cpp >-@@ -1,5 +1,7 @@ >- /* A Bison parser, made by GNU Bison 3.0.4. */ >- >-+/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */ >-+ >- /* Bison implementation for Yacc-like parsers in C >- >- Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. >-diff --git a/src/compiler/preprocessor/Tokenizer.cpp b/src/compiler/preprocessor/Tokenizer.cpp >-index d8a9b9a12..d7fad68f1 100644 >---- a/src/compiler/preprocessor/Tokenizer.cpp >-+++ b/src/compiler/preprocessor/Tokenizer.cpp >-@@ -1148,7 +1148,7 @@ static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); >- static int yy_flex_strlen ( const char * , yyscan_t yyscanner); >- #endif >- >--#ifndef YY_NO_INPUT >-+#if 0 // #ifndef YY_NO_INPUT >- #ifdef __cplusplus >- static int yyinput ( yyscan_t yyscanner ); >- #else >-@@ -2049,7 +2049,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) >- >- #endif >- >--#ifndef YY_NO_INPUT >-+#if 0 // #ifndef YY_NO_INPUT >- #ifdef __cplusplus >- static int yyinput (yyscan_t yyscanner) >- #else >-diff --git a/src/compiler/translator/ParseContext.cpp b/src/compiler/translator/ParseContext.cpp >-index c97f91d78..d0a4f6aeb 100644 >---- a/src/compiler/translator/ParseContext.cpp >-+++ b/src/compiler/translator/ParseContext.cpp >-@@ -3240,8 +3240,11 @@ TIntermFunctionPrototype *TParseContext::addFunctionPrototypeDeclaration( >- } >- function->setHasPrototypeDeclaration(); >- >-+ // WebKit note: We currently pass true instead of false for the last parameter >-+ // here because some compilers have an issue with nameless parameters in function >-+ // declarations. >- TIntermFunctionPrototype *prototype = >-- createPrototypeNodeFromFunction(*function, location, false); >-+ createPrototypeNodeFromFunction(*function, location, true); >- >- symbolTable.pop(); >- >-diff --git a/src/compiler/translator/TranslatorHLSL.h b/src/compiler/translator/TranslatorHLSL.h >-index d7005a603..e8436e98e 100644 >---- a/src/compiler/translator/TranslatorHLSL.h >-+++ b/src/compiler/translator/TranslatorHLSL.h >-@@ -16,7 +16,7 @@ class TranslatorHLSL : public TCompiler >- { >- public: >- TranslatorHLSL(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output); >-- TranslatorHLSL *getAsTranslatorHLSL() override { return this; } >-+ TranslatorHLSL *getAsTranslatorHLSL() { return this; } >- >- bool hasUniformBlock(const std::string &interfaceBlockName) const; >- unsigned int getUniformBlockRegister(const std::string &interfaceBlockName) const; >-diff --git a/src/compiler/translator/glslang_tab.cpp b/src/compiler/translator/glslang_tab.cpp >-index ce4aacf40..14cd5360c 100644 >---- a/src/compiler/translator/glslang_tab.cpp >-+++ b/src/compiler/translator/glslang_tab.cpp >-@@ -1,5 +1,7 @@ >- /* A Bison parser, made by GNU Bison 3.0.4. */ >- >-+/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */ >-+ >- /* Bison implementation for Yacc-like parsers in C >- >- Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. >-diff --git a/src/compiler/translator/glslang_tab.h b/src/compiler/translator/glslang_tab.h >-index 1f5308551..cb43a46df 100644 >---- a/src/compiler/translator/glslang_tab.h >-+++ b/src/compiler/translator/glslang_tab.h >-@@ -1,5 +1,7 @@ >- /* A Bison parser, made by GNU Bison 3.0.4. */ >- >-+/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */ >-+ >- /* Bison interface for Yacc-like parsers in C >- >- Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. >-diff --git a/src/libANGLE/MemoryProgramCache.cpp b/src/libANGLE/MemoryProgramCache.cpp >-index 9eec12e3e..2a9c6836a 100644 >---- a/src/libANGLE/MemoryProgramCache.cpp >-+++ b/src/libANGLE/MemoryProgramCache.cpp >-@@ -234,7 +234,10 @@ LinkResult MemoryProgramCache::Deserialize(const Context *context, >- >- static_assert(MAX_VERTEX_ATTRIBS <= sizeof(unsigned long) * 8, >- "Too many vertex attribs for mask"); >-+#pragma clang diagnostic push >-+#pragma clang diagnostic ignored "-Wconversion" >- state->mActiveAttribLocationsMask = stream.readInt<unsigned long>(); >-+#pragma clang diagnostic pop >- >- unsigned int attribCount = stream.readInt<unsigned int>(); >- ASSERT(state->mAttributes.empty()); >-@@ -408,7 +411,10 @@ LinkResult MemoryProgramCache::Deserialize(const Context *context, >- state->mAtomicCounterUniformRange = RangeUI(atomicCounterRangeLow, atomicCounterRangeHigh); >- >- static_assert(SHADER_TYPE_MAX <= sizeof(unsigned long) * 8, "Too many shader types"); >-+#pragma clang diagnostic push >-+#pragma clang diagnostic ignored "-Wconversion" >- state->mLinkedShaderStages = stream.readInt<unsigned long>(); >-+#pragma clang diagnostic pop >- >- return program->getImplementation()->load(context, infoLog, &stream); >- } >-diff --git a/src/libANGLE/Platform.cpp b/src/libANGLE/Platform.cpp >-index 702091624..c51289423 100644 >---- a/src/libANGLE/Platform.cpp >-+++ b/src/libANGLE/Platform.cpp >-@@ -15,7 +15,14 @@ >- namespace >- { >- // TODO(jmadill): Make methods owned by egl::Display. >--angle::PlatformMethods g_platformMethods; >-+#if defined(__clang__) >-+#pragma clang diagnostic push >-+#pragma clang diagnostic ignored "-Wglobal-constructors" >-+#endif >-+ angle::PlatformMethods g_platformMethods; >-+#if defined(__clang__) >-+#pragma clang diagnostic pop >-+#endif >- } // anonymous namespace >- >- angle::PlatformMethods::PlatformMethods() >-diff --git a/src/tests/compiler_tests/QualificationOrder_test.cpp b/src/tests/compiler_tests/QualificationOrder_test.cpp >-index c0249dbb9..c82acffd7 100644 >---- a/src/tests/compiler_tests/QualificationOrder_test.cpp >-+++ b/src/tests/compiler_tests/QualificationOrder_test.cpp >-@@ -429,7 +429,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersInvariant) >- "}\n" >- "void main()\n" >- "{\n" >-- " gl_FragColor = vec4(foo0(value));\n" >-+ " gl_FragColor = vec4(foo0(value));\n" >- "}\n"; >- >- if (compile(shaderString)) >-@@ -449,7 +449,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersAttribute) >- "}\n" >- "void main()\n" >- "{\n" >-- " gl_FragColor = vec4(foo0(value));\n" >-+ " gl_FragColor = vec4(foo0(value));\n" >- "}\n"; >- >- if (compile(shaderString)) >-@@ -469,7 +469,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersVarying) >- "}\n" >- "void main()\n" >- "{\n" >-- " gl_FragColor = vec4(foo0(value));\n" >-+ " gl_FragColor = vec4(foo0(value));\n" >- "}\n"; >- >- if (compile(shaderString)) >-@@ -491,7 +491,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersLayout) >- "out vec4 colorOUT;\n" >- "void main()\n" >- "{\n" >-- " colorOUT = vec4(foo0(value));\n" >-+ " colorOUT = vec4(foo0(value));\n" >- "}\n"; >- >- if (compile(shaderString)) >-@@ -513,7 +513,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersCentroidIn >- "out vec4 colorOUT;\n" >- "void main()\n" >- "{\n" >-- " colorOUT = vec4(foo0(value));\n" >-+ " colorOUT = vec4(foo0(value));\n" >- "}\n"; >- >- if (compile(shaderString)) >-@@ -535,7 +535,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersFlatIn) >- "out vec4 colorOUT;\n" >- "void main()\n" >- "{\n" >-- " colorOUT = vec4(foo0(value));\n" >-+ " colorOUT = vec4(foo0(value));\n" >- "}\n"; >- >- if (compile(shaderString)) >-diff --git a/src/tests/deqp_support/es2fShaderMatrixTests.cpp b/src/tests/deqp_support/es2fShaderMatrixTests.cpp >-index 9feb4dcfa..54d8474fd 100644 >---- a/src/tests/deqp_support/es2fShaderMatrixTests.cpp >-+++ b/src/tests/deqp_support/es2fShaderMatrixTests.cpp >-@@ -69,77 +69,77 @@ using tcu::Mat4; >- // Uniform / constant values for tests. >- // \note Input1 should not contain 0 components as it is used as divisor in div cases. >- // \todo [2012-02-14 pyry] Make these dynamic. >--static const float s_constInFloat[2] = { 0.5f, -0.2f }; >--static const Vec2 s_constInVec2[2] = { Vec2(1.2f, 0.5f), Vec2(0.5f, 1.0f) }; >--static const Vec3 s_constInVec3[2] = { Vec3(1.1f, 0.1f, 0.5f), Vec3(-0.2f, 0.5f, 0.8f) }; >--static const Vec4 s_constInVec4[2] = { Vec4(1.4f, 0.2f, -0.5f, 0.7f), Vec4(0.2f, -1.0f, 0.5f, 0.8f) }; >-+static const float s_constInFloat[2] = { 0.5f, -0.2f }; >-+static const Vec2 s_constInVec2[2] = { Vec2(1.2f, 0.5f), Vec2(0.5f, 1.0f) }; >-+static const Vec3 s_constInVec3[2] = { Vec3(1.1f, 0.1f, 0.5f), Vec3(-0.2f, 0.5f, 0.8f) }; >-+static const Vec4 s_constInVec4[2] = { Vec4(1.4f, 0.2f, -0.5f, 0.7f), Vec4(0.2f, -1.0f, 0.5f, 0.8f) }; >- >- static const float s_constInMat20[] = { 0.6f, -1.0f, 0.7f, 0.4f }; >- static const float s_constInMat21[] = { -0.5f, -0.4f, 0.7f, -0.8f }; >- >- static const float s_constInMat31[] = >- { >-- 1.2f, 0.1f, -0.1f, >-- 0.1f, 0.9f, 0.2f, >-- 0.2f, -0.1f, 0.7f >-+ 1.2f, 0.1f, -0.1f, >-+ 0.1f, 0.9f, 0.2f, >-+ 0.2f, -0.1f, 0.7f >- }; >- static const float s_constInMat41[] = >- { >-- 1.2f, -0.2f, 0.4f, 0.1f, >-- 0.1f, 0.8f, -0.1f, -0.2f, >-- -0.2f, 0.1f, -1.1f, 0.3f, >-- 0.1f, 0.2f, 0.3f, 0.9f >-+ 1.2f, -0.2f, 0.4f, 0.1f, >-+ 0.1f, 0.8f, -0.1f, -0.2f, >-+ -0.2f, 0.1f, -1.1f, 0.3f, >-+ 0.1f, 0.2f, 0.3f, 0.9f >- }; >- >--static const Mat2 s_constInMat2[2] = { tcu::Mat2(s_constInMat20), tcu::Mat2(s_constInMat21) }; >--static const Mat3 s_constInMat3[2] = { tcu::translationMatrix(tcu::Vec2(0.2f, -0.3f)), tcu::Mat3(s_constInMat31) }; >--static const Mat4 s_constInMat4[2] = { tcu::translationMatrix(tcu::Vec3(0.2f, -0.3f, 0.15f)), tcu::Mat4(s_constInMat41) }; >-+static const Mat2 s_constInMat2[2] = { tcu::Mat2(s_constInMat20), tcu::Mat2(s_constInMat21) }; >-+static const Mat3 s_constInMat3[2] = { tcu::translationMatrix(tcu::Vec2(0.2f, -0.3f)), tcu::Mat3(s_constInMat31) }; >-+static const Mat4 s_constInMat4[2] = { tcu::translationMatrix(tcu::Vec3(0.2f, -0.3f, 0.15f)), tcu::Mat4(s_constInMat41) }; >- >- namespace MatrixCaseUtils >- { >- >- enum InputType >- { >-- INPUTTYPE_CONST = 0, >-- INPUTTYPE_UNIFORM, >-- INPUTTYPE_DYNAMIC, >-+ INPUTTYPE_CONST = 0, >-+ INPUTTYPE_UNIFORM, >-+ INPUTTYPE_DYNAMIC, >- >-- INPUTTYPE_LAST >-+ INPUTTYPE_LAST >- }; >- >- struct ShaderInput >- { >-- ShaderInput (InputType inputType_, DataType dataType_, Precision precision_) >-- : inputType (inputType_) >-- , dataType (dataType_) >-- , precision (precision_) >-- { >-- } >-- >-- InputType inputType; >-- DataType dataType; >-- Precision precision; >-+ ShaderInput (InputType inputType_, DataType dataType_, Precision precision_) >-+ : inputType (inputType_) >-+ , dataType (dataType_) >-+ , precision (precision_) >-+ { >-+ } >-+ >-+ InputType inputType; >-+ DataType dataType; >-+ Precision precision; >- }; >- >- enum MatrixOp >- { >-- OP_ADD = 0, >-- OP_SUB, >-- OP_MUL, >-- OP_DIV, >-- OP_COMP_MUL, >-- OP_UNARY_PLUS, >-- OP_NEGATION, >-- OP_PRE_INCREMENT, >-- OP_PRE_DECREMENT, >-- OP_POST_INCREMENT, >-- OP_POST_DECREMENT, >-- OP_ADD_INTO, >-- OP_SUBTRACT_FROM, >-- OP_MULTIPLY_INTO, >-- OP_DIVIDE_INTO, >-- >-- OP_LAST >-+ OP_ADD = 0, >-+ OP_SUB, >-+ OP_MUL, >-+ OP_DIV, >-+ OP_COMP_MUL, >-+ OP_UNARY_PLUS, >-+ OP_NEGATION, >-+ OP_PRE_INCREMENT, >-+ OP_PRE_DECREMENT, >-+ OP_POST_INCREMENT, >-+ OP_POST_DECREMENT, >-+ OP_ADD_INTO, >-+ OP_SUBTRACT_FROM, >-+ OP_MULTIPLY_INTO, >-+ OP_DIVIDE_INTO, >-+ >-+ OP_LAST >- }; >- >- // Type traits. >-@@ -147,16 +147,16 @@ enum MatrixOp >- template <int DataT> >- struct TypeTraits; >- >--#define DECLARE_TYPE_TRAIT(DATATYPE, TYPE) \ >--template<> \ >--struct TypeTraits<DATATYPE> { \ >-- typedef TYPE Type; \ >-+#define DECLARE_TYPE_TRAIT(DATATYPE, TYPE) \ >-+template<> \ >-+struct TypeTraits<DATATYPE> { \ >-+ typedef TYPE Type; \ >- } >- >--DECLARE_TYPE_TRAIT(TYPE_FLOAT, float); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC2, tcu::Vec2); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC3, tcu::Vec3); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC4, tcu::Vec4); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT, float); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC2, tcu::Vec2); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC3, tcu::Vec3); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC4, tcu::Vec4); >- DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2, tcu::Mat2); >- DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3, tcu::Mat3); >- DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4, tcu::Mat4); >-@@ -165,169 +165,169 @@ DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4, tcu::Mat4); >- >- enum OperationType >- { >-- OPERATIONTYPE_BINARY_OPERATOR = 0, >-- OPERATIONTYPE_BINARY_FUNCTION, >-- OPERATIONTYPE_UNARY_PREFIX_OPERATOR, >-- OPERATIONTYPE_UNARY_POSTFIX_OPERATOR, >-- OPERATIONTYPE_ASSIGNMENT, >-+ OPERATIONTYPE_BINARY_OPERATOR = 0, >-+ OPERATIONTYPE_BINARY_FUNCTION, >-+ OPERATIONTYPE_UNARY_PREFIX_OPERATOR, >-+ OPERATIONTYPE_UNARY_POSTFIX_OPERATOR, >-+ OPERATIONTYPE_ASSIGNMENT, >- >-- OPERATIONTYPE_LAST >-+ OPERATIONTYPE_LAST >- }; >- >- static const char* getOperationName (MatrixOp op) >- { >-- switch (op) >-- { >-- case OP_ADD: return "+"; >-- case OP_SUB: return "-"; >-- case OP_MUL: return "*"; >-- case OP_DIV: return "/"; >-- case OP_COMP_MUL: return "matrixCompMult"; >-- case OP_UNARY_PLUS: return "+"; >-- case OP_NEGATION: return "-"; >-- case OP_PRE_INCREMENT: return "++"; >-- case OP_PRE_DECREMENT: return "--"; >-- case OP_POST_INCREMENT: return "++"; >-- case OP_POST_DECREMENT: return "--"; >-- case OP_ADD_INTO: return "+="; >-- case OP_SUBTRACT_FROM: return "-="; >-- case OP_MULTIPLY_INTO: return "*="; >-- case OP_DIVIDE_INTO: return "/="; >-- default: >-- DE_ASSERT(DE_FALSE); >-- return ""; >-- } >-+ switch (op) >-+ { >-+ case OP_ADD: return "+"; >-+ case OP_SUB: return "-"; >-+ case OP_MUL: return "*"; >-+ case OP_DIV: return "/"; >-+ case OP_COMP_MUL: return "matrixCompMult"; >-+ case OP_UNARY_PLUS: return "+"; >-+ case OP_NEGATION: return "-"; >-+ case OP_PRE_INCREMENT: return "++"; >-+ case OP_PRE_DECREMENT: return "--"; >-+ case OP_POST_INCREMENT: return "++"; >-+ case OP_POST_DECREMENT: return "--"; >-+ case OP_ADD_INTO: return "+="; >-+ case OP_SUBTRACT_FROM: return "-="; >-+ case OP_MULTIPLY_INTO: return "*="; >-+ case OP_DIVIDE_INTO: return "/="; >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ return ""; >-+ } >- } >- >- static OperationType getOperationType (MatrixOp op) >- { >-- switch (op) >-- { >-- case OP_ADD: return OPERATIONTYPE_BINARY_OPERATOR; >-- case OP_SUB: return OPERATIONTYPE_BINARY_OPERATOR; >-- case OP_MUL: return OPERATIONTYPE_BINARY_OPERATOR; >-- case OP_DIV: return OPERATIONTYPE_BINARY_OPERATOR; >-- case OP_COMP_MUL: return OPERATIONTYPE_BINARY_FUNCTION; >-- case OP_UNARY_PLUS: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-- case OP_NEGATION: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-- case OP_PRE_INCREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-- case OP_PRE_DECREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-- case OP_POST_INCREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; >-- case OP_POST_DECREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; >-- case OP_ADD_INTO: return OPERATIONTYPE_ASSIGNMENT; >-- case OP_SUBTRACT_FROM: return OPERATIONTYPE_ASSIGNMENT; >-- case OP_MULTIPLY_INTO: return OPERATIONTYPE_ASSIGNMENT; >-- case OP_DIVIDE_INTO: return OPERATIONTYPE_ASSIGNMENT; >-- default: >-- DE_ASSERT(DE_FALSE); >-- return OPERATIONTYPE_LAST; >-- } >-+ switch (op) >-+ { >-+ case OP_ADD: return OPERATIONTYPE_BINARY_OPERATOR; >-+ case OP_SUB: return OPERATIONTYPE_BINARY_OPERATOR; >-+ case OP_MUL: return OPERATIONTYPE_BINARY_OPERATOR; >-+ case OP_DIV: return OPERATIONTYPE_BINARY_OPERATOR; >-+ case OP_COMP_MUL: return OPERATIONTYPE_BINARY_FUNCTION; >-+ case OP_UNARY_PLUS: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-+ case OP_NEGATION: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-+ case OP_PRE_INCREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-+ case OP_PRE_DECREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-+ case OP_POST_INCREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; >-+ case OP_POST_DECREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; >-+ case OP_ADD_INTO: return OPERATIONTYPE_ASSIGNMENT; >-+ case OP_SUBTRACT_FROM: return OPERATIONTYPE_ASSIGNMENT; >-+ case OP_MULTIPLY_INTO: return OPERATIONTYPE_ASSIGNMENT; >-+ case OP_DIVIDE_INTO: return OPERATIONTYPE_ASSIGNMENT; >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ return OPERATIONTYPE_LAST; >-+ } >- } >- >- enum TestMatrixType >- { >-- TESTMATRIXTYPE_DEFAULT = 0, >-- TESTMATRIXTYPE_NEGATED, >-- TESTMATRIXTYPE_INCREMENTED, >-- TESTMATRIXTYPE_DECREMENTED, >-+ TESTMATRIXTYPE_DEFAULT = 0, >-+ TESTMATRIXTYPE_NEGATED, >-+ TESTMATRIXTYPE_INCREMENTED, >-+ TESTMATRIXTYPE_DECREMENTED, >- >-- TESTMATRIXTYPE_LAST >-+ TESTMATRIXTYPE_LAST >- }; >- >- static TestMatrixType getOperationTestMatrixType (MatrixOp op) >- { >-- switch(op) >-- { >-- case OP_ADD: return TESTMATRIXTYPE_DEFAULT; >-- case OP_SUB: return TESTMATRIXTYPE_DEFAULT; >-- case OP_MUL: return TESTMATRIXTYPE_DEFAULT; >-- case OP_DIV: return TESTMATRIXTYPE_DEFAULT; >-- case OP_COMP_MUL: return TESTMATRIXTYPE_DEFAULT; >-- case OP_UNARY_PLUS: return TESTMATRIXTYPE_DEFAULT; >-- case OP_NEGATION: return TESTMATRIXTYPE_NEGATED; >-- case OP_PRE_INCREMENT: return TESTMATRIXTYPE_NEGATED; >-- case OP_PRE_DECREMENT: return TESTMATRIXTYPE_INCREMENTED; >-- case OP_POST_INCREMENT: return TESTMATRIXTYPE_NEGATED; >-- case OP_POST_DECREMENT: return TESTMATRIXTYPE_DEFAULT; >-- case OP_ADD_INTO: return TESTMATRIXTYPE_DECREMENTED; >-- case OP_SUBTRACT_FROM: return TESTMATRIXTYPE_DEFAULT; >-- case OP_MULTIPLY_INTO: return TESTMATRIXTYPE_DEFAULT; >-- case OP_DIVIDE_INTO: return TESTMATRIXTYPE_DEFAULT; >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- return TESTMATRIXTYPE_LAST; >-- } >-+ switch(op) >-+ { >-+ case OP_ADD: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_SUB: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_MUL: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_DIV: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_COMP_MUL: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_UNARY_PLUS: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_NEGATION: return TESTMATRIXTYPE_NEGATED; >-+ case OP_PRE_INCREMENT: return TESTMATRIXTYPE_NEGATED; >-+ case OP_PRE_DECREMENT: return TESTMATRIXTYPE_INCREMENTED; >-+ case OP_POST_INCREMENT: return TESTMATRIXTYPE_NEGATED; >-+ case OP_POST_DECREMENT: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_ADD_INTO: return TESTMATRIXTYPE_DECREMENTED; >-+ case OP_SUBTRACT_FROM: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_MULTIPLY_INTO: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_DIVIDE_INTO: return TESTMATRIXTYPE_DEFAULT; >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ return TESTMATRIXTYPE_LAST; >-+ } >- } >- >- static bool isOperationBinary (MatrixOp op) >- { >-- return getOperationType(op) == OPERATIONTYPE_BINARY_OPERATOR || >-- getOperationType(op) == OPERATIONTYPE_BINARY_FUNCTION || >-- getOperationType(op) == OPERATIONTYPE_ASSIGNMENT; >-+ return getOperationType(op) == OPERATIONTYPE_BINARY_OPERATOR || >-+ getOperationType(op) == OPERATIONTYPE_BINARY_FUNCTION || >-+ getOperationType(op) == OPERATIONTYPE_ASSIGNMENT; >- } >- >- static bool isOperationMatrixScalar (MatrixOp op) >- { >-- return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV; >-+ return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV; >- } >- >- static bool isOperationMatrixVector (MatrixOp op) >- { >-- return op == OP_MUL; >-+ return op == OP_MUL; >- } >- >- static bool isOperationMatrixMatrix (MatrixOp op) >- { >-- return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV || op == OP_COMP_MUL; >-+ return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV || op == OP_COMP_MUL; >- } >- >- static bool isOperationUnary (MatrixOp op) >- { >-- return op == OP_UNARY_PLUS || >-- op == OP_NEGATION || >-- op == OP_PRE_INCREMENT || >-- op == OP_PRE_DECREMENT || >-- op == OP_POST_INCREMENT || >-- op == OP_POST_DECREMENT; >-+ return op == OP_UNARY_PLUS || >-+ op == OP_NEGATION || >-+ op == OP_PRE_INCREMENT || >-+ op == OP_PRE_DECREMENT || >-+ op == OP_POST_INCREMENT || >-+ op == OP_POST_DECREMENT; >- } >- >- static bool isOperationValueModifying (MatrixOp op) >- { >-- return op == OP_PRE_INCREMENT || >-- op == OP_PRE_DECREMENT || >-- op == OP_POST_INCREMENT || >-- op == OP_POST_DECREMENT; >-+ return op == OP_PRE_INCREMENT || >-+ op == OP_PRE_DECREMENT || >-+ op == OP_POST_INCREMENT || >-+ op == OP_POST_DECREMENT; >- } >- >- static bool isOperationAssignment (MatrixOp op) >- { >-- return op == OP_ADD_INTO || >-- op == OP_SUBTRACT_FROM || >-- op == OP_MULTIPLY_INTO || >-- op == OP_DIVIDE_INTO; >-+ return op == OP_ADD_INTO || >-+ op == OP_SUBTRACT_FROM || >-+ op == OP_MULTIPLY_INTO || >-+ op == OP_DIVIDE_INTO; >- } >- >- // Operation nature >- >- enum OperationNature >- { >-- OPERATIONNATURE_PURE = 0, >-- OPERATIONNATURE_MUTATING, >-- OPERATIONNATURE_ASSIGNMENT, >-+ OPERATIONNATURE_PURE = 0, >-+ OPERATIONNATURE_MUTATING, >-+ OPERATIONNATURE_ASSIGNMENT, >- >-- OPERATIONNATURE_LAST >-+ OPERATIONNATURE_LAST >- }; >- >- static OperationNature getOperationNature (MatrixOp op) >- { >-- if (isOperationAssignment(op)) >-- return OPERATIONNATURE_ASSIGNMENT; >-+ if (isOperationAssignment(op)) >-+ return OPERATIONNATURE_ASSIGNMENT; >- >-- if (isOperationValueModifying(op)) >-- return OPERATIONNATURE_MUTATING; >-+ if (isOperationValueModifying(op)) >-+ return OPERATIONNATURE_MUTATING; >- >-- return OPERATIONNATURE_PURE; >-+ return OPERATIONNATURE_PURE; >- } >- >- // Input value loader. >-@@ -335,47 +335,47 @@ static OperationNature getOperationNature (MatrixOp op) >- template <int InputT, int DataT> >- typename TypeTraits<DataT>::Type getInputValue (const ShaderEvalContext& evalCtx, int inputNdx); >- >--template <> inline float getInputValue<INPUTTYPE_CONST, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInFloat[inputNdx]; } >--template <> inline tcu::Vec2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec2[inputNdx]; } >--template <> inline tcu::Vec3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec3[inputNdx]; } >--template <> inline tcu::Vec4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec4[inputNdx]; } >--template <> inline tcu::Mat2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat2[inputNdx]; } >--template <> inline tcu::Mat3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat3[inputNdx]; } >--template <> inline tcu::Mat4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat4[inputNdx]; } >-+template <> inline float getInputValue<INPUTTYPE_CONST, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInFloat[inputNdx]; } >-+template <> inline tcu::Vec2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec2[inputNdx]; } >-+template <> inline tcu::Vec3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec3[inputNdx]; } >-+template <> inline tcu::Vec4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec4[inputNdx]; } >-+template <> inline tcu::Mat2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat2[inputNdx]; } >-+template <> inline tcu::Mat3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat3[inputNdx]; } >-+template <> inline tcu::Mat4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat4[inputNdx]; } >- >--template <> inline float getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.x(); } >--template <> inline tcu::Vec2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1); } >--template <> inline tcu::Vec3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2); } >--template <> inline tcu::Vec4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2, 3); } >-+template <> inline float getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.x(); } >-+template <> inline tcu::Vec2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1); } >-+template <> inline tcu::Vec3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2); } >-+template <> inline tcu::Vec4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2, 3); } >- >- template <> inline tcu::Mat2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) >- { >-- DE_UNREF(inputNdx); // Not used. >-- tcu::Mat2 m; >-- m.setColumn(0, evalCtx.in[0].swizzle(0,1)); >-- m.setColumn(1, evalCtx.in[1].swizzle(0,1)); >-- return m; >-+ DE_UNREF(inputNdx); // Not used. >-+ tcu::Mat2 m; >-+ m.setColumn(0, evalCtx.in[0].swizzle(0,1)); >-+ m.setColumn(1, evalCtx.in[1].swizzle(0,1)); >-+ return m; >- } >- >- template <> inline tcu::Mat3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) >- { >-- DE_UNREF(inputNdx); // Not used. >-- tcu::Mat3 m; >-- m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); >-- m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); >-- m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); >-- return m; >-+ DE_UNREF(inputNdx); // Not used. >-+ tcu::Mat3 m; >-+ m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); >-+ m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); >-+ m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); >-+ return m; >- } >- >- template <> inline tcu::Mat4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) >- { >-- DE_UNREF(inputNdx); // Not used. >-- tcu::Mat4 m; >-- m.setColumn(0, evalCtx.in[0]); >-- m.setColumn(1, evalCtx.in[1]); >-- m.setColumn(2, evalCtx.in[2]); >-- m.setColumn(3, evalCtx.in[3]); >-- return m; >-+ DE_UNREF(inputNdx); // Not used. >-+ tcu::Mat4 m; >-+ m.setColumn(0, evalCtx.in[0]); >-+ m.setColumn(1, evalCtx.in[1]); >-+ m.setColumn(2, evalCtx.in[2]); >-+ m.setColumn(3, evalCtx.in[3]); >-+ return m; >- } >- >- // Reduction from expression result to vec3. >-@@ -392,13 +392,13 @@ inline tcu::Vec3 reduceToVec3 (const tcu::Mat4& value) { return value.getColumn( >- template <typename T, int Rows, int Cols> >- tcu::Matrix<T, Rows, Cols> matrixCompMult (const tcu::Matrix<T, Rows, Cols>& a, const tcu::Matrix<T, Rows, Cols>& b) >- { >-- tcu::Matrix<T, Rows, Cols> retVal; >-+ tcu::Matrix<T, Rows, Cols> retVal; >- >-- for (int r = 0; r < Rows; ++r) >-- for (int c = 0; c < Cols; ++c) >-- retVal(r,c) = a(r,c) * b(r, c); >-+ for (int r = 0; r < Rows; ++r) >-+ for (int c = 0; c < Cols; ++c) >-+ retVal(r,c) = a(r,c) * b(r, c); >- >-- return retVal; >-+ return retVal; >- } >- >- // negate >-@@ -406,13 +406,13 @@ tcu::Matrix<T, Rows, Cols> matrixCompMult (const tcu::Matrix<T, Rows, Cols>& a, >- template <typename T, int Rows, int Cols> >- tcu::Matrix<T, Rows, Cols> negate (const tcu::Matrix<T, Rows, Cols>& mat) >- { >-- tcu::Matrix<T, Rows, Cols> retVal; >-+ tcu::Matrix<T, Rows, Cols> retVal; >- >-- for (int r = 0; r < Rows; ++r) >-- for (int c = 0; c < Cols; ++c) >-- retVal(r,c) = -mat(r, c); >-+ for (int r = 0; r < Rows; ++r) >-+ for (int c = 0; c < Cols; ++c) >-+ retVal(r,c) = -mat(r, c); >- >-- return retVal; >-+ return retVal; >- } >- >- // increment/decrement >-@@ -420,25 +420,25 @@ tcu::Matrix<T, Rows, Cols> negate (const tcu::Matrix<T, Rows, Cols>& mat) >- template <typename T, int Rows, int Cols> >- tcu::Matrix<T, Rows, Cols> increment (const tcu::Matrix<T, Rows, Cols>& mat) >- { >-- tcu::Matrix<T, Rows, Cols> retVal; >-+ tcu::Matrix<T, Rows, Cols> retVal; >- >-- for (int r = 0; r < Rows; ++r) >-- for (int c = 0; c < Cols; ++c) >-- retVal(r,c) = mat(r, c) + 1.0f; >-+ for (int r = 0; r < Rows; ++r) >-+ for (int c = 0; c < Cols; ++c) >-+ retVal(r,c) = mat(r, c) + 1.0f; >- >-- return retVal; >-+ return retVal; >- } >- >- template <typename T, int Rows, int Cols> >- tcu::Matrix<T, Rows, Cols> decrement (const tcu::Matrix<T, Rows, Cols>& mat) >- { >-- tcu::Matrix<T, Rows, Cols> retVal; >-+ tcu::Matrix<T, Rows, Cols> retVal; >- >-- for (int r = 0; r < Rows; ++r) >-- for (int c = 0; c < Cols; ++c) >-- retVal(r,c) = mat(r, c) - 1.0f; >-+ for (int r = 0; r < Rows; ++r) >-+ for (int c = 0; c < Cols; ++c) >-+ retVal(r,c) = mat(r, c) - 1.0f; >- >-- return retVal; >-+ return retVal; >- } >- >- // Evaluator template. >-@@ -449,244 +449,244 @@ struct Evaluator; >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_ADD, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) + getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) + getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-+ } >- }; >- >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_SUB, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) - getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) - getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-+ } >- }; >- >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_MUL, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) * getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) * getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-+ } >- }; >- >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_DIV, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) / getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) / getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-+ } >- }; >- >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_COMP_MUL, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- evalCtx.color.xyz() = reduceToVec3(matrixCompMult(getInputValue<In0Type, In0DataType>(evalCtx, 0), getInputValue<In1Type, In1DataType>(evalCtx, 1))); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ evalCtx.color.xyz() = reduceToVec3(matrixCompMult(getInputValue<In0Type, In0DataType>(evalCtx, 0), getInputValue<In1Type, In1DataType>(evalCtx, 1))); >-+ } >- }; >- >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_UNARY_PLUS, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)); >-+ } >- }; >- >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_NEGATION, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- evalCtx.color.xyz() = reduceToVec3(negate(getInputValue<In0Type, In0DataType>(evalCtx, 0))); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ evalCtx.color.xyz() = reduceToVec3(negate(getInputValue<In0Type, In0DataType>(evalCtx, 0))); >-+ } >- }; >- >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_PRE_INCREMENT, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- // modifying reduction: sum modified value too >-- evalCtx.color.xyz() = reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))) + reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ // modifying reduction: sum modified value too >-+ evalCtx.color.xyz() = reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))) + reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))); >-+ } >- }; >- >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_PRE_DECREMENT, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- // modifying reduction: sum modified value too >-- evalCtx.color.xyz() = reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))) + reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ // modifying reduction: sum modified value too >-+ evalCtx.color.xyz() = reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))) + reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))); >-+ } >- }; >- >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_POST_INCREMENT, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- // modifying reduction: sum modified value too >-- evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)) + reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ // modifying reduction: sum modified value too >-+ evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)) + reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))); >-+ } >- }; >- >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_POST_DECREMENT, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- // modifying reduction: sum modified value too >-- evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)) + reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ // modifying reduction: sum modified value too >-+ evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)) + reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))); >-+ } >- }; >- >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_ADD_INTO, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) + getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) + getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-+ } >- }; >- >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_SUBTRACT_FROM, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) - getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) - getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-+ } >- }; >- >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_MULTIPLY_INTO, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) * getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) * getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-+ } >- }; >- >- template <int In0Type, int In0DataType, int In1Type, int In1DataType> >- struct Evaluator<OP_DIVIDE_INTO, In0Type, In0DataType, In1Type, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx) >-- { >-- evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) / getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx) >-+ { >-+ evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) / getInputValue<In1Type, In1DataType>(evalCtx, 1)); >-+ } >- }; >- >- ShaderEvalFunc getEvalFunc (const ShaderInput& in0, const ShaderInput& in1, MatrixOp op) >- { >-- DE_STATIC_ASSERT(TYPE_LAST <= (1<<7)); >-- DE_STATIC_ASSERT(OP_LAST <= (1<<4)); >-- DE_STATIC_ASSERT(INPUTTYPE_LAST <= (1<<2)); >-- >--#define PACK_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) (((OP) << 18) | ((IN0TYPE) << 16) | ((IN0DATATYPE) << 9) | ((IN1TYPE) << 7) | (IN1DATATYPE)) >-- >--#define MAKE_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ >-- case PACK_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE): \ >-- return Evaluator<OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE>::evaluate >-- >--#define SCALAR_OPS(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ >-- MAKE_EVAL_CASE(OP_ADD, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_SUB, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_DIV, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) >-- >--#define ALL_OPS(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ >-- MAKE_EVAL_CASE(OP_ADD, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_SUB, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_DIV, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_COMP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); >-- >--#define MUL_OP(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ >-- MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) >-- >--#define MAKE_MAT_SCALAR_VEC_CASES(OP, TYPE0, TYPE1) \ >-- OP(INPUTTYPE_CONST, TYPE0, INPUTTYPE_CONST, TYPE1); \ >-- OP(INPUTTYPE_DYNAMIC, TYPE0, INPUTTYPE_CONST, TYPE1); \ >-- OP(INPUTTYPE_CONST, TYPE0, INPUTTYPE_DYNAMIC, TYPE1); \ >-- OP(INPUTTYPE_DYNAMIC, TYPE0, INPUTTYPE_DYNAMIC, TYPE1) >-- >--#define MAKE_MAT_MAT_CASES(OP, MATTYPE) \ >-- OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ >-- OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_CONST, MATTYPE) >-- >--#define UNARY_OP(IN0TYPE, IN0DATATYPE) \ >-- MAKE_EVAL_CASE(OP_UNARY_PLUS, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ >-- MAKE_EVAL_CASE(OP_NEGATION, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ >-- MAKE_EVAL_CASE(OP_PRE_INCREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ >-- MAKE_EVAL_CASE(OP_PRE_DECREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ >-- MAKE_EVAL_CASE(OP_POST_INCREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ >-- MAKE_EVAL_CASE(OP_POST_DECREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST) >-- >--#define MAKE_UNARY_CASES(OP, MATTYPE) \ >-- OP(INPUTTYPE_CONST, MATTYPE); \ >-- OP(INPUTTYPE_DYNAMIC, MATTYPE) >-- >--#define ASSIGN_OP(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ >-- MAKE_EVAL_CASE(OP_ADD_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_SUBTRACT_FROM, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_MULTIPLY_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_DIVIDE_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) >-- >--#define MAKE_ASSIGNMENT_CASES(OP, MATTYPE) \ >-- OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ >-- OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ >-- OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_DYNAMIC, MATTYPE); \ >-- OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_DYNAMIC, MATTYPE) >-- >-- // \note At the moment there is no difference between uniform and const inputs. This saves binary size. >-- InputType in0Type = in0.inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_DYNAMIC : INPUTTYPE_CONST; >-- InputType in1Type = in1.inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_DYNAMIC : INPUTTYPE_CONST; >-- >-- switch (PACK_EVAL_CASE(op, in0Type, in0.dataType, in1Type, in1.dataType)) >-- { >-- // Matrix-scalar. >-- MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT2, TYPE_FLOAT); >-- MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT3, TYPE_FLOAT); >-- MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT4, TYPE_FLOAT); >-- >-- // Matrix-vector. >-- MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT2, TYPE_FLOAT_VEC2); >-- MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT3, TYPE_FLOAT_VEC3); >-- MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT4, TYPE_FLOAT_VEC4); >-- >-- // Vector-matrix. >-- MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT2); >-- MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT3); >-- MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT4); >-- >-- // Matrix-matrix. >-- MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT2); >-- MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT3); >-- MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT4); >-- >-- // Unary matrix >-- MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT2); >-- MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT3); >-- MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT4); >-- >-- // Assignment matrix >-- MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT2); >-- MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT3); >-- MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT4); >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- return DE_NULL; >-- } >-+ DE_STATIC_ASSERT(TYPE_LAST <= (1<<7)); >-+ DE_STATIC_ASSERT(OP_LAST <= (1<<4)); >-+ DE_STATIC_ASSERT(INPUTTYPE_LAST <= (1<<2)); >-+ >-+#define PACK_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) (((OP) << 18) | ((IN0TYPE) << 16) | ((IN0DATATYPE) << 9) | ((IN1TYPE) << 7) | (IN1DATATYPE)) >-+ >-+#define MAKE_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ >-+ case PACK_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE): \ >-+ return Evaluator<OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE>::evaluate >-+ >-+#define SCALAR_OPS(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ >-+ MAKE_EVAL_CASE(OP_ADD, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_SUB, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_DIV, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) >-+ >-+#define ALL_OPS(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ >-+ MAKE_EVAL_CASE(OP_ADD, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_SUB, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_DIV, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_COMP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); >-+ >-+#define MUL_OP(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ >-+ MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) >-+ >-+#define MAKE_MAT_SCALAR_VEC_CASES(OP, TYPE0, TYPE1) \ >-+ OP(INPUTTYPE_CONST, TYPE0, INPUTTYPE_CONST, TYPE1); \ >-+ OP(INPUTTYPE_DYNAMIC, TYPE0, INPUTTYPE_CONST, TYPE1); \ >-+ OP(INPUTTYPE_CONST, TYPE0, INPUTTYPE_DYNAMIC, TYPE1); \ >-+ OP(INPUTTYPE_DYNAMIC, TYPE0, INPUTTYPE_DYNAMIC, TYPE1) >-+ >-+#define MAKE_MAT_MAT_CASES(OP, MATTYPE) \ >-+ OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ >-+ OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_CONST, MATTYPE) >-+ >-+#define UNARY_OP(IN0TYPE, IN0DATATYPE) \ >-+ MAKE_EVAL_CASE(OP_UNARY_PLUS, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ >-+ MAKE_EVAL_CASE(OP_NEGATION, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ >-+ MAKE_EVAL_CASE(OP_PRE_INCREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ >-+ MAKE_EVAL_CASE(OP_PRE_DECREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ >-+ MAKE_EVAL_CASE(OP_POST_INCREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ >-+ MAKE_EVAL_CASE(OP_POST_DECREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST) >-+ >-+#define MAKE_UNARY_CASES(OP, MATTYPE) \ >-+ OP(INPUTTYPE_CONST, MATTYPE); \ >-+ OP(INPUTTYPE_DYNAMIC, MATTYPE) >-+ >-+#define ASSIGN_OP(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ >-+ MAKE_EVAL_CASE(OP_ADD_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_SUBTRACT_FROM, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_MULTIPLY_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_DIVIDE_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) >-+ >-+#define MAKE_ASSIGNMENT_CASES(OP, MATTYPE) \ >-+ OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ >-+ OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ >-+ OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_DYNAMIC, MATTYPE); \ >-+ OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_DYNAMIC, MATTYPE) >-+ >-+ // \note At the moment there is no difference between uniform and const inputs. This saves binary size. >-+ InputType in0Type = in0.inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_DYNAMIC : INPUTTYPE_CONST; >-+ InputType in1Type = in1.inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_DYNAMIC : INPUTTYPE_CONST; >-+ >-+ switch (PACK_EVAL_CASE(op, in0Type, in0.dataType, in1Type, in1.dataType)) >-+ { >-+ // Matrix-scalar. >-+ MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT2, TYPE_FLOAT); >-+ MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT3, TYPE_FLOAT); >-+ MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT4, TYPE_FLOAT); >-+ >-+ // Matrix-vector. >-+ MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT2, TYPE_FLOAT_VEC2); >-+ MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT3, TYPE_FLOAT_VEC3); >-+ MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT4, TYPE_FLOAT_VEC4); >-+ >-+ // Vector-matrix. >-+ MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT2); >-+ MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT3); >-+ MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT4); >-+ >-+ // Matrix-matrix. >-+ MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT2); >-+ MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT3); >-+ MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT4); >-+ >-+ // Unary matrix >-+ MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT2); >-+ MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT3); >-+ MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT4); >-+ >-+ // Assignment matrix >-+ MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT2); >-+ MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT3); >-+ MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT4); >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ return DE_NULL; >-+ } >- >- #undef PACK_EVAL_CASE >- #undef MAKE_EVAL_CASE >-@@ -701,35 +701,35 @@ ShaderEvalFunc getEvalFunc (const ShaderInput& in0, const ShaderInput& in1, Matr >- template <int Size> >- void writeVectorConstructor (std::ostream& str, const tcu::Vector<float, Size>& v) >- { >-- str << "vec" << Size << "("; >-- for (int ndx = 0; ndx < Size; ndx++) >-- { >-- if (ndx != 0) >-- str << ", "; >-- str << de::floatToString(v[ndx], 1); >-- } >-- str << ")"; >-+ str << "vec" << Size << "("; >-+ for (int ndx = 0; ndx < Size; ndx++) >-+ { >-+ if (ndx != 0) >-+ str << ", "; >-+ str << de::floatToString(v[ndx], 1); >-+ } >-+ str << ")"; >- } >- >- template <int Cols, int Rows> >- void writeMatrixConstructor (std::ostream& str, const tcu::Matrix<float, Rows, Cols>& m) >- { >-- if (Rows == Cols) >-- str << "mat" << Cols; >-- else >-- str << "mat" << Cols << "x" << Rows; >-- >-- str << "("; >-- for (int colNdx = 0; colNdx < Cols; colNdx++) >-- { >-- for (int rowNdx = 0; rowNdx < Rows; rowNdx++) >-- { >-- if (rowNdx > 0 || colNdx > 0) >-- str << ", "; >-- str << de::floatToString(m(rowNdx, colNdx), 1); >-- } >-- } >-- str << ")"; >-+ if (Rows == Cols) >-+ str << "mat" << Cols; >-+ else >-+ str << "mat" << Cols << "x" << Rows; >-+ >-+ str << "("; >-+ for (int colNdx = 0; colNdx < Cols; colNdx++) >-+ { >-+ for (int rowNdx = 0; rowNdx < Rows; rowNdx++) >-+ { >-+ if (rowNdx > 0 || colNdx > 0) >-+ str << ", "; >-+ str << de::floatToString(m(rowNdx, colNdx), 1); >-+ } >-+ } >-+ str << ")"; >- } >- >- } // MatrixCaseUtils >-@@ -739,26 +739,26 @@ using namespace MatrixCaseUtils; >- class ShaderMatrixCase : public ShaderRenderCase >- { >- public: >-- ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase); >-- ~ShaderMatrixCase (void); >-+ ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase); >-+ ~ShaderMatrixCase (void); >- >-- void init (void); >-+ void init (void); >- >- protected: >-- std::string genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName); >-- void setupUniforms (int programID, const tcu::Vec4& constCoords); >-+ std::string genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName); >-+ void setupUniforms (int programID, const tcu::Vec4& constCoords); >- >- private: >-- ShaderInput m_in0; >-- ShaderInput m_in1; >-- MatrixOp m_op; >-+ ShaderInput m_in0; >-+ ShaderInput m_in1; >-+ MatrixOp m_op; >- }; >- >- ShaderMatrixCase::ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase) >-- : ShaderRenderCase (context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc, isVertexCase, getEvalFunc(in0, in1, op)) >-- , m_in0 (in0) >-- , m_in1 (in1) >-- , m_op (op) >-+ : ShaderRenderCase (context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc, isVertexCase, getEvalFunc(in0, in1, op)) >-+ , m_in0 (in0) >-+ , m_in1 (in1) >-+ , m_op (op) >- { >- } >- >-@@ -768,315 +768,315 @@ ShaderMatrixCase::~ShaderMatrixCase (void) >- >- void ShaderMatrixCase::init (void) >- { >-- std::ostringstream vtx; >-- std::ostringstream frag; >-- std::ostringstream& op = m_isVertexCase ? vtx : frag; >-- >-- bool isInDynMat0 = isDataTypeMatrix(m_in0.dataType) && m_in0.inputType == INPUTTYPE_DYNAMIC; >-- bool isInDynMat1 = isDataTypeMatrix(m_in1.dataType) && m_in1.inputType == INPUTTYPE_DYNAMIC; >-- string inValue0; >-- string inValue1; >-- DataType resultType = TYPE_LAST; >-- Precision resultPrec = m_in0.precision; >-- vector<string> passVars; >-- int numInputs = (isOperationBinary(m_op)) ? (2) : (1); >-- >-- std::string operationValue0; >-- std::string operationValue1; >-- >-- DE_ASSERT(!isInDynMat0 || !isInDynMat1); // Only single dynamic matrix input is allowed. >-- DE_UNREF(isInDynMat0 && isInDynMat1); >-- >-- // Compute result type. >-- if (isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) >-- { >-- DE_ASSERT(m_in0.dataType == m_in1.dataType); >-- resultType = m_in0.dataType; >-- } >-- else if (getOperationType(m_op) == OPERATIONTYPE_UNARY_PREFIX_OPERATOR || >-- getOperationType(m_op) == OPERATIONTYPE_UNARY_POSTFIX_OPERATOR) >-- { >-- resultType = m_in0.dataType; >-- } >-- else >-- { >-- int matNdx = isDataTypeMatrix(m_in0.dataType) ? 0 : 1; >-- DataType matrixType = matNdx == 0 ? m_in0.dataType : m_in1.dataType; >-- DataType otherType = matNdx == 0 ? m_in1.dataType : m_in0.dataType; >-- >-- if (otherType == TYPE_FLOAT) >-- resultType = matrixType; >-- else >-- { >-- DE_ASSERT(isDataTypeVector(otherType)); >-- resultType = otherType; >-- } >-- } >-- >-- vtx << "attribute highp vec4 a_position;\n"; >-- if (m_isVertexCase) >-- { >-- vtx << "varying mediump vec4 v_color;\n"; >-- frag << "varying mediump vec4 v_color;\n"; >-- } >-- >-- // Input declarations. >-- for (int inNdx = 0; inNdx < numInputs; inNdx++) >-- { >-- const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; >-- const char* precName = getPrecisionName(in.precision); >-- const char* typeName = getDataTypeName(in.dataType); >-- string& inValue = inNdx > 0 ? inValue1 : inValue0; >-- >-- if (in.inputType == INPUTTYPE_DYNAMIC) >-- { >-- vtx << "attribute " << precName << " " << typeName << " a_"; >-- >-- if (isDataTypeMatrix(in.dataType)) >-- { >-- // a_matN, v_matN >-- vtx << typeName << ";\n"; >-- if (!m_isVertexCase) >-- { >-- vtx << "varying " << precName << " " << typeName << " v_" << typeName << ";\n"; >-- frag << "varying " << precName << " " << typeName << " v_" << typeName << ";\n"; >-- passVars.push_back(typeName); >-- } >-- >-- inValue = string(m_isVertexCase ? "a_" : "v_") + getDataTypeName(in.dataType); >-- } >-- else >-- { >-- // a_coords, v_coords >-- vtx << "coords;\n"; >-- if (!m_isVertexCase) >-- { >-- vtx << "varying " << precName << " " << typeName << " v_coords;\n"; >-- frag << "varying " << precName << " " << typeName << " v_coords;\n"; >-- passVars.push_back("coords"); >-- } >-- >-- inValue = m_isVertexCase ? "a_coords" : "v_coords"; >-- } >-- } >-- else if (in.inputType == INPUTTYPE_UNIFORM) >-- { >-- op << "uniform " << precName << " " << typeName << " u_in" << inNdx << ";\n"; >-- inValue = string("u_in") + de::toString(inNdx); >-- } >-- else if (in.inputType == INPUTTYPE_CONST) >-- { >-- op << "const " << precName << " " << typeName << " in" << inNdx << " = "; >-- >-- // Generate declaration. >-- switch (in.dataType) >-- { >-- case TYPE_FLOAT: op << de::floatToString(s_constInFloat[inNdx], 1); break; >-- case TYPE_FLOAT_VEC2: writeVectorConstructor<2>(op, s_constInVec2[inNdx]); break; >-- case TYPE_FLOAT_VEC3: writeVectorConstructor<3>(op, s_constInVec3[inNdx]); break; >-- case TYPE_FLOAT_VEC4: writeVectorConstructor<4>(op, s_constInVec4[inNdx]); break; >-- case TYPE_FLOAT_MAT2: writeMatrixConstructor<2, 2>(op, Mat2(s_constInMat2[inNdx])); break; >-- case TYPE_FLOAT_MAT3: writeMatrixConstructor<3, 3>(op, Mat3(s_constInMat3[inNdx])); break; >-- case TYPE_FLOAT_MAT4: writeMatrixConstructor<4, 4>(op, Mat4(s_constInMat4[inNdx])); break; >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- } >-- >-- op << ";\n"; >-- >-- inValue = string("in") + de::toString(inNdx); >-- } >-- } >-- >-- vtx << "\n" >-- << "void main (void)\n" >-- << "{\n" >-- << " gl_Position = a_position;\n"; >-- frag << "\n" >-- << "void main (void)\n" >-- << "{\n"; >-- >-- if (m_isVertexCase) >-- { >-- frag << " gl_FragColor = v_color;\n"; >-- } >-- else >-- { >-- for (vector<string>::const_iterator copyIter = passVars.begin(); copyIter != passVars.end(); copyIter++) >-- vtx << " v_" << *copyIter << " = " << "a_" << *copyIter << ";\n"; >-- } >-- >-- // Operation. >-- >-- switch (getOperationNature(m_op)) >-- { >-- case OPERATIONNATURE_PURE: >-- DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); >-- >-- operationValue0 = inValue0; >-- operationValue1 = inValue1; >-- break; >-- >-- case OPERATIONNATURE_MUTATING: >-- DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); >-- >-- op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " tmpValue = " << inValue0 << ";\n"; >-- >-- operationValue0 = "tmpValue"; >-- operationValue1 = inValue1; >-- break; >-- >-- case OPERATIONNATURE_ASSIGNMENT: >-- DE_ASSERT(getOperationType(m_op) == OPERATIONTYPE_ASSIGNMENT); >-- >-- operationValue0 = inValue0; >-- operationValue1 = inValue1; >-- break; >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- } >-- >-- switch (getOperationType(m_op)) >-- { >-- case OPERATIONTYPE_BINARY_OPERATOR: >-- op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << " " << getOperationName(m_op) << " " << operationValue1 << ";\n"; >-- break; >-- >-- case OPERATIONTYPE_UNARY_PREFIX_OPERATOR: >-- op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << operationValue0 << ";\n"; >-- break; >-- >-- case OPERATIONTYPE_UNARY_POSTFIX_OPERATOR: >-- op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << getOperationName(m_op) << ";\n"; >-- break; >-- >-- case OPERATIONTYPE_BINARY_FUNCTION: >-- op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ", " << operationValue1 << ");\n"; >-- break; >-- >-- case OPERATIONTYPE_ASSIGNMENT: >-- op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << ";\n"; >-- op << " res " << getOperationName(m_op) << " " << operationValue1 << ";\n"; >-- break; >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- } >-- >-- // Reduction to vec3 (rgb). Check the used value too if it was modified. >-- op << " " << (m_isVertexCase ? "v_color" : "gl_FragColor") << " = "; >-- >-- if (isOperationValueModifying(m_op)) >-- op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0) + vec4(" << genGLSLMatToVec3Reduction(resultType, "tmpValue") << ", 0.0);\n"; >-- else >-- op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0);\n"; >-- >-- vtx << "}\n"; >-- frag << "}\n"; >-- >-- m_vertShaderSource = vtx.str(); >-- m_fragShaderSource = frag.str(); >-- >-- // \todo [2012-02-14 pyry] Compute better values for matrix tests. >-- m_userAttribTransforms.resize(4); >-- for (int attribNdx = 0; attribNdx < 4; attribNdx++) >-- { >-- m_userAttribTransforms[attribNdx] = Mat4(0.0f); >-- m_userAttribTransforms[attribNdx]((0 + attribNdx) % 4, 0) = 1.0f; >-- m_userAttribTransforms[attribNdx]((1 + attribNdx) % 4, 1) = 1.0f; >-- m_userAttribTransforms[attribNdx]((2 + attribNdx) % 4, 2) = 1.0f; >-- m_userAttribTransforms[attribNdx]((3 + attribNdx) % 4, 3) = 1.0f; >-- } >-- >-- // prevent bad reference cases such as black result images by fine-tuning used matrices >-- if (getOperationTestMatrixType(m_op) != TESTMATRIXTYPE_DEFAULT) >-- { >-- for (int attribNdx = 0; attribNdx < 4; attribNdx++) >-- { >-- for (int row = 0; row < 4; row++) >-- for (int col = 0; col < 4; col++) >-- { >-- switch (getOperationTestMatrixType(m_op)) >-- { >-- case TESTMATRIXTYPE_NEGATED: >-- m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col); >-- break; >-- case TESTMATRIXTYPE_INCREMENTED: >-- m_userAttribTransforms[attribNdx](row, col) += 0.3f; >-- break; >-- case TESTMATRIXTYPE_DECREMENTED: >-- m_userAttribTransforms[attribNdx](row, col) -= 0.1f; >-- break; >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- break; >-- } >-- } >-- } >-- } >-- >-- ShaderRenderCase::init(); >-+ std::ostringstream vtx; >-+ std::ostringstream frag; >-+ std::ostringstream& op = m_isVertexCase ? vtx : frag; >-+ >-+ bool isInDynMat0 = isDataTypeMatrix(m_in0.dataType) && m_in0.inputType == INPUTTYPE_DYNAMIC; >-+ bool isInDynMat1 = isDataTypeMatrix(m_in1.dataType) && m_in1.inputType == INPUTTYPE_DYNAMIC; >-+ string inValue0; >-+ string inValue1; >-+ DataType resultType = TYPE_LAST; >-+ Precision resultPrec = m_in0.precision; >-+ vector<string> passVars; >-+ int numInputs = (isOperationBinary(m_op)) ? (2) : (1); >-+ >-+ std::string operationValue0; >-+ std::string operationValue1; >-+ >-+ DE_ASSERT(!isInDynMat0 || !isInDynMat1); // Only single dynamic matrix input is allowed. >-+ DE_UNREF(isInDynMat0 && isInDynMat1); >-+ >-+ // Compute result type. >-+ if (isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) >-+ { >-+ DE_ASSERT(m_in0.dataType == m_in1.dataType); >-+ resultType = m_in0.dataType; >-+ } >-+ else if (getOperationType(m_op) == OPERATIONTYPE_UNARY_PREFIX_OPERATOR || >-+ getOperationType(m_op) == OPERATIONTYPE_UNARY_POSTFIX_OPERATOR) >-+ { >-+ resultType = m_in0.dataType; >-+ } >-+ else >-+ { >-+ int matNdx = isDataTypeMatrix(m_in0.dataType) ? 0 : 1; >-+ DataType matrixType = matNdx == 0 ? m_in0.dataType : m_in1.dataType; >-+ DataType otherType = matNdx == 0 ? m_in1.dataType : m_in0.dataType; >-+ >-+ if (otherType == TYPE_FLOAT) >-+ resultType = matrixType; >-+ else >-+ { >-+ DE_ASSERT(isDataTypeVector(otherType)); >-+ resultType = otherType; >-+ } >-+ } >-+ >-+ vtx << "attribute highp vec4 a_position;\n"; >-+ if (m_isVertexCase) >-+ { >-+ vtx << "varying mediump vec4 v_color;\n"; >-+ frag << "varying mediump vec4 v_color;\n"; >-+ } >-+ >-+ // Input declarations. >-+ for (int inNdx = 0; inNdx < numInputs; inNdx++) >-+ { >-+ const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; >-+ const char* precName = getPrecisionName(in.precision); >-+ const char* typeName = getDataTypeName(in.dataType); >-+ string& inValue = inNdx > 0 ? inValue1 : inValue0; >-+ >-+ if (in.inputType == INPUTTYPE_DYNAMIC) >-+ { >-+ vtx << "attribute " << precName << " " << typeName << " a_"; >-+ >-+ if (isDataTypeMatrix(in.dataType)) >-+ { >-+ // a_matN, v_matN >-+ vtx << typeName << ";\n"; >-+ if (!m_isVertexCase) >-+ { >-+ vtx << "varying " << precName << " " << typeName << " v_" << typeName << ";\n"; >-+ frag << "varying " << precName << " " << typeName << " v_" << typeName << ";\n"; >-+ passVars.push_back(typeName); >-+ } >-+ >-+ inValue = string(m_isVertexCase ? "a_" : "v_") + getDataTypeName(in.dataType); >-+ } >-+ else >-+ { >-+ // a_coords, v_coords >-+ vtx << "coords;\n"; >-+ if (!m_isVertexCase) >-+ { >-+ vtx << "varying " << precName << " " << typeName << " v_coords;\n"; >-+ frag << "varying " << precName << " " << typeName << " v_coords;\n"; >-+ passVars.push_back("coords"); >-+ } >-+ >-+ inValue = m_isVertexCase ? "a_coords" : "v_coords"; >-+ } >-+ } >-+ else if (in.inputType == INPUTTYPE_UNIFORM) >-+ { >-+ op << "uniform " << precName << " " << typeName << " u_in" << inNdx << ";\n"; >-+ inValue = string("u_in") + de::toString(inNdx); >-+ } >-+ else if (in.inputType == INPUTTYPE_CONST) >-+ { >-+ op << "const " << precName << " " << typeName << " in" << inNdx << " = "; >-+ >-+ // Generate declaration. >-+ switch (in.dataType) >-+ { >-+ case TYPE_FLOAT: op << de::floatToString(s_constInFloat[inNdx], 1); break; >-+ case TYPE_FLOAT_VEC2: writeVectorConstructor<2>(op, s_constInVec2[inNdx]); break; >-+ case TYPE_FLOAT_VEC3: writeVectorConstructor<3>(op, s_constInVec3[inNdx]); break; >-+ case TYPE_FLOAT_VEC4: writeVectorConstructor<4>(op, s_constInVec4[inNdx]); break; >-+ case TYPE_FLOAT_MAT2: writeMatrixConstructor<2, 2>(op, Mat2(s_constInMat2[inNdx])); break; >-+ case TYPE_FLOAT_MAT3: writeMatrixConstructor<3, 3>(op, Mat3(s_constInMat3[inNdx])); break; >-+ case TYPE_FLOAT_MAT4: writeMatrixConstructor<4, 4>(op, Mat4(s_constInMat4[inNdx])); break; >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ } >-+ >-+ op << ";\n"; >-+ >-+ inValue = string("in") + de::toString(inNdx); >-+ } >-+ } >-+ >-+ vtx << "\n" >-+ << "void main (void)\n" >-+ << "{\n" >-+ << " gl_Position = a_position;\n"; >-+ frag << "\n" >-+ << "void main (void)\n" >-+ << "{\n"; >-+ >-+ if (m_isVertexCase) >-+ { >-+ frag << " gl_FragColor = v_color;\n"; >-+ } >-+ else >-+ { >-+ for (vector<string>::const_iterator copyIter = passVars.begin(); copyIter != passVars.end(); copyIter++) >-+ vtx << " v_" << *copyIter << " = " << "a_" << *copyIter << ";\n"; >-+ } >-+ >-+ // Operation. >-+ >-+ switch (getOperationNature(m_op)) >-+ { >-+ case OPERATIONNATURE_PURE: >-+ DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); >-+ >-+ operationValue0 = inValue0; >-+ operationValue1 = inValue1; >-+ break; >-+ >-+ case OPERATIONNATURE_MUTATING: >-+ DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); >-+ >-+ op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " tmpValue = " << inValue0 << ";\n"; >-+ >-+ operationValue0 = "tmpValue"; >-+ operationValue1 = inValue1; >-+ break; >-+ >-+ case OPERATIONNATURE_ASSIGNMENT: >-+ DE_ASSERT(getOperationType(m_op) == OPERATIONTYPE_ASSIGNMENT); >-+ >-+ operationValue0 = inValue0; >-+ operationValue1 = inValue1; >-+ break; >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ } >-+ >-+ switch (getOperationType(m_op)) >-+ { >-+ case OPERATIONTYPE_BINARY_OPERATOR: >-+ op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << " " << getOperationName(m_op) << " " << operationValue1 << ";\n"; >-+ break; >-+ >-+ case OPERATIONTYPE_UNARY_PREFIX_OPERATOR: >-+ op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << operationValue0 << ";\n"; >-+ break; >-+ >-+ case OPERATIONTYPE_UNARY_POSTFIX_OPERATOR: >-+ op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << getOperationName(m_op) << ";\n"; >-+ break; >-+ >-+ case OPERATIONTYPE_BINARY_FUNCTION: >-+ op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ", " << operationValue1 << ");\n"; >-+ break; >-+ >-+ case OPERATIONTYPE_ASSIGNMENT: >-+ op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << ";\n"; >-+ op << " res " << getOperationName(m_op) << " " << operationValue1 << ";\n"; >-+ break; >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ } >-+ >-+ // Reduction to vec3 (rgb). Check the used value too if it was modified. >-+ op << " " << (m_isVertexCase ? "v_color" : "gl_FragColor") << " = "; >-+ >-+ if (isOperationValueModifying(m_op)) >-+ op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0) + vec4(" << genGLSLMatToVec3Reduction(resultType, "tmpValue") << ", 0.0);\n"; >-+ else >-+ op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0);\n"; >-+ >-+ vtx << "}\n"; >-+ frag << "}\n"; >-+ >-+ m_vertShaderSource = vtx.str(); >-+ m_fragShaderSource = frag.str(); >-+ >-+ // \todo [2012-02-14 pyry] Compute better values for matrix tests. >-+ m_userAttribTransforms.resize(4); >-+ for (int attribNdx = 0; attribNdx < 4; attribNdx++) >-+ { >-+ m_userAttribTransforms[attribNdx] = Mat4(0.0f); >-+ m_userAttribTransforms[attribNdx]((0 + attribNdx) % 4, 0) = 1.0f; >-+ m_userAttribTransforms[attribNdx]((1 + attribNdx) % 4, 1) = 1.0f; >-+ m_userAttribTransforms[attribNdx]((2 + attribNdx) % 4, 2) = 1.0f; >-+ m_userAttribTransforms[attribNdx]((3 + attribNdx) % 4, 3) = 1.0f; >-+ } >-+ >-+ // prevent bad reference cases such as black result images by fine-tuning used matrices >-+ if (getOperationTestMatrixType(m_op) != TESTMATRIXTYPE_DEFAULT) >-+ { >-+ for (int attribNdx = 0; attribNdx < 4; attribNdx++) >-+ { >-+ for (int row = 0; row < 4; row++) >-+ for (int col = 0; col < 4; col++) >-+ { >-+ switch (getOperationTestMatrixType(m_op)) >-+ { >-+ case TESTMATRIXTYPE_NEGATED: >-+ m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col); >-+ break; >-+ case TESTMATRIXTYPE_INCREMENTED: >-+ m_userAttribTransforms[attribNdx](row, col) += 0.3f; >-+ break; >-+ case TESTMATRIXTYPE_DECREMENTED: >-+ m_userAttribTransforms[attribNdx](row, col) -= 0.1f; >-+ break; >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ break; >-+ } >-+ } >-+ } >-+ } >-+ >-+ ShaderRenderCase::init(); >- } >- >- std::string ShaderMatrixCase::genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName) >- { >-- std::ostringstream op; >-- >-- switch (matType) >-- { >-- case TYPE_FLOAT: op << varName << ", " << varName << ", " << varName << ""; break; >-- case TYPE_FLOAT_VEC2: op << varName << ".x, " << varName << ".y, " << varName << ".x"; break; >-- case TYPE_FLOAT_VEC3: op << varName << ""; break; >-- case TYPE_FLOAT_VEC4: op << varName << ".x, " << varName << ".y, " << varName << ".z+" << varName << ".w"; break; >-- case TYPE_FLOAT_MAT2: op << varName << "[0][0], " << varName << "[1][0], " << varName << "[0][1]+" << varName << "[1][1]"; break; >-- case TYPE_FLOAT_MAT3: op << varName << "[0]+" << varName << "[1]+" << varName << "[2]"; break; >-- case TYPE_FLOAT_MAT4: op << varName << "[0].xyz+" << varName << "[1].yzw+" << varName << "[2].zwx+" << varName << "[3].wxy"; break; >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- } >-- >-- return op.str(); >-+ std::ostringstream op; >-+ >-+ switch (matType) >-+ { >-+ case TYPE_FLOAT: op << varName << ", " << varName << ", " << varName << ""; break; >-+ case TYPE_FLOAT_VEC2: op << varName << ".x, " << varName << ".y, " << varName << ".x"; break; >-+ case TYPE_FLOAT_VEC3: op << varName << ""; break; >-+ case TYPE_FLOAT_VEC4: op << varName << ".x, " << varName << ".y, " << varName << ".z+" << varName << ".w"; break; >-+ case TYPE_FLOAT_MAT2: op << varName << "[0][0], " << varName << "[1][0], " << varName << "[0][1]+" << varName << "[1][1]"; break; >-+ case TYPE_FLOAT_MAT3: op << varName << "[0]+" << varName << "[1]+" << varName << "[2]"; break; >-+ case TYPE_FLOAT_MAT4: op << varName << "[0].xyz+" << varName << "[1].yzw+" << varName << "[2].zwx+" << varName << "[3].wxy"; break; >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ } >-+ >-+ return op.str(); >- } >- >- void ShaderMatrixCase::setupUniforms (int programID, const tcu::Vec4& constCoords) >- { >-- const glw::Functions& gl = m_renderCtx.getFunctions(); >-- >-- DE_UNREF(constCoords); >-- >-- for (int inNdx = 0; inNdx < 2; inNdx++) >-- { >-- const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; >-- >-- if (in.inputType == INPUTTYPE_UNIFORM) >-- { >-- int loc = gl.getUniformLocation(programID, (string("u_in") + de::toString(inNdx)).c_str()); >-- >-- if (loc < 0) >-- continue; >-- >-- switch (in.dataType) >-- { >-- case TYPE_FLOAT: gl.uniform1f(loc, s_constInFloat[inNdx]); break; >-- case TYPE_FLOAT_VEC2: gl.uniform2fv(loc, 1, s_constInVec2[inNdx].getPtr()); break; >-- case TYPE_FLOAT_VEC3: gl.uniform3fv(loc, 1, s_constInVec3[inNdx].getPtr()); break; >-- case TYPE_FLOAT_VEC4: gl.uniform4fv(loc, 1, s_constInVec4[inNdx].getPtr()); break; >-- case TYPE_FLOAT_MAT2: gl.uniformMatrix2fv(loc, 1, GL_FALSE, s_constInMat2[inNdx].getColumnMajorData().getPtr()); break; >-- case TYPE_FLOAT_MAT3: gl.uniformMatrix3fv(loc, 1, GL_FALSE, s_constInMat3[inNdx].getColumnMajorData().getPtr()); break; >-- case TYPE_FLOAT_MAT4: gl.uniformMatrix4fv(loc, 1, GL_FALSE, s_constInMat4[inNdx].getColumnMajorData().getPtr()); break; >-- default: >-- DE_ASSERT(false); >-- } >-- } >-- } >-+ const glw::Functions& gl = m_renderCtx.getFunctions(); >-+ >-+ DE_UNREF(constCoords); >-+ >-+ for (int inNdx = 0; inNdx < 2; inNdx++) >-+ { >-+ const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; >-+ >-+ if (in.inputType == INPUTTYPE_UNIFORM) >-+ { >-+ int loc = gl.getUniformLocation(programID, (string("u_in") + de::toString(inNdx)).c_str()); >-+ >-+ if (loc < 0) >-+ continue; >-+ >-+ switch (in.dataType) >-+ { >-+ case TYPE_FLOAT: gl.uniform1f(loc, s_constInFloat[inNdx]); break; >-+ case TYPE_FLOAT_VEC2: gl.uniform2fv(loc, 1, s_constInVec2[inNdx].getPtr()); break; >-+ case TYPE_FLOAT_VEC3: gl.uniform3fv(loc, 1, s_constInVec3[inNdx].getPtr()); break; >-+ case TYPE_FLOAT_VEC4: gl.uniform4fv(loc, 1, s_constInVec4[inNdx].getPtr()); break; >-+ case TYPE_FLOAT_MAT2: gl.uniformMatrix2fv(loc, 1, GL_FALSE, s_constInMat2[inNdx].getColumnMajorData().getPtr()); break; >-+ case TYPE_FLOAT_MAT3: gl.uniformMatrix3fv(loc, 1, GL_FALSE, s_constInMat3[inNdx].getColumnMajorData().getPtr()); break; >-+ case TYPE_FLOAT_MAT4: gl.uniformMatrix4fv(loc, 1, GL_FALSE, s_constInMat4[inNdx].getColumnMajorData().getPtr()); break; >-+ default: >-+ DE_ASSERT(false); >-+ } >-+ } >-+ } >- } >- >- ShaderMatrixTests::ShaderMatrixTests (Context& context) >-- : TestCaseGroup(context, "matrix", "Matrix Tests") >-+ : TestCaseGroup(context, "matrix", "Matrix Tests") >- { >- } >- >-@@ -1086,136 +1086,136 @@ ShaderMatrixTests::~ShaderMatrixTests (void) >- >- void ShaderMatrixTests::init (void) >- { >-- static const struct >-- { >-- const char* name; >-- const char* desc; >-- MatrixOp op; >-- bool extendedInputTypeCases; // !< test with const and uniform types too >-- } ops[] = >-- { >-- { "add", "Matrix addition tests", OP_ADD, true }, >-- { "sub", "Matrix subtraction tests", OP_SUB, true }, >-- { "mul", "Matrix multiplication tests", OP_MUL, true }, >-- { "div", "Matrix division tests", OP_DIV, true }, >-- { "matrixcompmult", "Matrix component-wise multiplication tests", OP_COMP_MUL, false }, >-- { "unary_addition", "Matrix unary addition tests", OP_UNARY_PLUS, false }, >-- { "negation", "Matrix negation tests", OP_NEGATION, false }, >-- { "pre_increment", "Matrix prefix increment tests", OP_PRE_INCREMENT, false }, >-- { "pre_decrement", "Matrix prefix decrement tests", OP_PRE_DECREMENT, false }, >-- { "post_increment", "Matrix postfix increment tests", OP_POST_INCREMENT, false }, >-- { "post_decrement", "Matrix postfix decrement tests", OP_POST_DECREMENT, false }, >-- { "add_assign", "Matrix add into tests", OP_ADD_INTO, false }, >-- { "sub_assign", "Matrix subtract from tests", OP_SUBTRACT_FROM, false }, >-- { "mul_assign", "Matrix multiply into tests", OP_MULTIPLY_INTO, false }, >-- { "div_assign", "Matrix divide into tests", OP_DIVIDE_INTO, false }, >-- }; >-- >-- struct InputTypeSpec >-- { >-- const char* name; >-- const char* desc; >-- InputType type; >-- }; >-- static const InputTypeSpec extendedInputTypes[] = >-- { >-- { "const", "Constant matrix input", INPUTTYPE_CONST }, >-- { "uniform", "Uniform matrix input", INPUTTYPE_UNIFORM }, >-- { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } >-- }; >-- static const InputTypeSpec reducedInputTypes[] = >-- { >-- { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } >-- }; >-- >-- static const DataType matrixTypes[] = >-- { >-- TYPE_FLOAT_MAT2, >-- TYPE_FLOAT_MAT3, >-- TYPE_FLOAT_MAT4 >-- }; >-- >-- static const Precision precisions[] = >-- { >-- PRECISION_LOWP, >-- PRECISION_MEDIUMP, >-- PRECISION_HIGHP >-- }; >-- >-- for (int opNdx = 0; opNdx < DE_LENGTH_OF_ARRAY(ops); opNdx++) >-- { >-- const InputTypeSpec* inTypeList = (ops[opNdx].extendedInputTypeCases) ? (extendedInputTypes) : (reducedInputTypes); >-- const int inTypeListSize = (ops[opNdx].extendedInputTypeCases) ? (DE_LENGTH_OF_ARRAY(extendedInputTypes)) : (DE_LENGTH_OF_ARRAY(reducedInputTypes)); >-- const MatrixOp op = ops[opNdx].op; >-- tcu::TestCaseGroup* opGroup = new tcu::TestCaseGroup(m_testCtx, ops[opNdx].name, ops[opNdx].desc); >-- >-- addChild(opGroup); >-- >-- for (int inTypeNdx = 0; inTypeNdx < inTypeListSize; inTypeNdx++) >-- { >-- const InputType inputType = inTypeList[inTypeNdx].type; >-- >-- for (int matTypeNdx = 0; matTypeNdx < DE_LENGTH_OF_ARRAY(matrixTypes); matTypeNdx++) >-- { >-- DataType matType = matrixTypes[matTypeNdx]; >-- const char* matTypeName = getDataTypeName(matType); >-- >-- for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisions); precNdx++) >-- { >-- Precision precision = precisions[precNdx]; >-- const char* precName = getPrecisionName(precision); >-- string baseName = string(inTypeList[inTypeNdx].name) + "_" + precName + "_" + matTypeName + "_"; >-- ShaderInput matIn (inputType, matType, precision); >-- >-- if (isOperationMatrixScalar(op)) >-- { >-- // Matrix-scalar \note For div cases we use uniform input. >-- ShaderInput scalarIn(op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, TYPE_FLOAT, precision); >-- opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix-scalar case", matIn, scalarIn, op, true)); >-- opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix-scalar case", matIn, scalarIn, op, false)); >-- } >-- >-- if (isOperationMatrixVector(op)) >-- { >-- // Matrix-vector. >-- DataType vecType = getDataTypeFloatVec(getDataTypeMatrixNumColumns(matType)); >-- ShaderInput vecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, vecType, precision); >-- >-- opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(vecType) + "_vertex").c_str(), "Matrix-vector case", matIn, vecIn, op, true)); >-- opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(vecType) + "_fragment").c_str(), "Matrix-vector case", matIn, vecIn, op, false)); >-- >-- // Vector-matrix. >-- string vecMatName = string(inTypeList[inTypeNdx].name) + "_" + precName + "_" + getDataTypeName(vecType) + "_" + matTypeName; >-- opGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_vertex").c_str(), "Vector-matrix case", vecIn, matIn, op, true)); >-- opGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_fragment").c_str(), "Vector-matrix case", vecIn, matIn, op, false)); >-- } >-- >-- if (isOperationMatrixMatrix(op)) >-- { >-- // Matrix-matrix. >-- ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); >-- opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); >-- opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); >-- } >-- >-- if (isOperationUnary(op)) >-- { >-- // op matrix >-- ShaderInput voidInput(INPUTTYPE_LAST, TYPE_LAST, PRECISION_LAST); >-- opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "vertex").c_str(), "Matrix case", matIn, voidInput, op, true)); >-- opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "fragment").c_str(), "Matrix case", matIn, voidInput, op, false)); >-- } >-- >-- if (isOperationAssignment(op)) >-- { >-- ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); >-- opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "vertex").c_str(), "Matrix assignment case", matIn, otherMatIn, op, true)); >-- opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "fragment").c_str(), "Matrix assignment case", matIn, otherMatIn, op, false)); >-- } >-- } >-- } >-- } >-- } >-+ static const struct >-+ { >-+ const char* name; >-+ const char* desc; >-+ MatrixOp op; >-+ bool extendedInputTypeCases; // !< test with const and uniform types too >-+ } ops[] = >-+ { >-+ { "add", "Matrix addition tests", OP_ADD, true }, >-+ { "sub", "Matrix subtraction tests", OP_SUB, true }, >-+ { "mul", "Matrix multiplication tests", OP_MUL, true }, >-+ { "div", "Matrix division tests", OP_DIV, true }, >-+ { "matrixcompmult", "Matrix component-wise multiplication tests", OP_COMP_MUL, false }, >-+ { "unary_addition", "Matrix unary addition tests", OP_UNARY_PLUS, false }, >-+ { "negation", "Matrix negation tests", OP_NEGATION, false }, >-+ { "pre_increment", "Matrix prefix increment tests", OP_PRE_INCREMENT, false }, >-+ { "pre_decrement", "Matrix prefix decrement tests", OP_PRE_DECREMENT, false }, >-+ { "post_increment", "Matrix postfix increment tests", OP_POST_INCREMENT, false }, >-+ { "post_decrement", "Matrix postfix decrement tests", OP_POST_DECREMENT, false }, >-+ { "add_assign", "Matrix add into tests", OP_ADD_INTO, false }, >-+ { "sub_assign", "Matrix subtract from tests", OP_SUBTRACT_FROM, false }, >-+ { "mul_assign", "Matrix multiply into tests", OP_MULTIPLY_INTO, false }, >-+ { "div_assign", "Matrix divide into tests", OP_DIVIDE_INTO, false }, >-+ }; >-+ >-+ struct InputTypeSpec >-+ { >-+ const char* name; >-+ const char* desc; >-+ InputType type; >-+ }; >-+ static const InputTypeSpec extendedInputTypes[] = >-+ { >-+ { "const", "Constant matrix input", INPUTTYPE_CONST }, >-+ { "uniform", "Uniform matrix input", INPUTTYPE_UNIFORM }, >-+ { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } >-+ }; >-+ static const InputTypeSpec reducedInputTypes[] = >-+ { >-+ { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } >-+ }; >-+ >-+ static const DataType matrixTypes[] = >-+ { >-+ TYPE_FLOAT_MAT2, >-+ TYPE_FLOAT_MAT3, >-+ TYPE_FLOAT_MAT4 >-+ }; >-+ >-+ static const Precision precisions[] = >-+ { >-+ PRECISION_LOWP, >-+ PRECISION_MEDIUMP, >-+ PRECISION_HIGHP >-+ }; >-+ >-+ for (int opNdx = 0; opNdx < DE_LENGTH_OF_ARRAY(ops); opNdx++) >-+ { >-+ const InputTypeSpec* inTypeList = (ops[opNdx].extendedInputTypeCases) ? (extendedInputTypes) : (reducedInputTypes); >-+ const int inTypeListSize = (ops[opNdx].extendedInputTypeCases) ? (DE_LENGTH_OF_ARRAY(extendedInputTypes)) : (DE_LENGTH_OF_ARRAY(reducedInputTypes)); >-+ const MatrixOp op = ops[opNdx].op; >-+ tcu::TestCaseGroup* opGroup = new tcu::TestCaseGroup(m_testCtx, ops[opNdx].name, ops[opNdx].desc); >-+ >-+ addChild(opGroup); >-+ >-+ for (int inTypeNdx = 0; inTypeNdx < inTypeListSize; inTypeNdx++) >-+ { >-+ const InputType inputType = inTypeList[inTypeNdx].type; >-+ >-+ for (int matTypeNdx = 0; matTypeNdx < DE_LENGTH_OF_ARRAY(matrixTypes); matTypeNdx++) >-+ { >-+ DataType matType = matrixTypes[matTypeNdx]; >-+ const char* matTypeName = getDataTypeName(matType); >-+ >-+ for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisions); precNdx++) >-+ { >-+ Precision precision = precisions[precNdx]; >-+ const char* precName = getPrecisionName(precision); >-+ string baseName = string(inTypeList[inTypeNdx].name) + "_" + precName + "_" + matTypeName + "_"; >-+ ShaderInput matIn (inputType, matType, precision); >-+ >-+ if (isOperationMatrixScalar(op)) >-+ { >-+ // Matrix-scalar \note For div cases we use uniform input. >-+ ShaderInput scalarIn(op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, TYPE_FLOAT, precision); >-+ opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix-scalar case", matIn, scalarIn, op, true)); >-+ opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix-scalar case", matIn, scalarIn, op, false)); >-+ } >-+ >-+ if (isOperationMatrixVector(op)) >-+ { >-+ // Matrix-vector. >-+ DataType vecType = getDataTypeFloatVec(getDataTypeMatrixNumColumns(matType)); >-+ ShaderInput vecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, vecType, precision); >-+ >-+ opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(vecType) + "_vertex").c_str(), "Matrix-vector case", matIn, vecIn, op, true)); >-+ opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(vecType) + "_fragment").c_str(), "Matrix-vector case", matIn, vecIn, op, false)); >-+ >-+ // Vector-matrix. >-+ string vecMatName = string(inTypeList[inTypeNdx].name) + "_" + precName + "_" + getDataTypeName(vecType) + "_" + matTypeName; >-+ opGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_vertex").c_str(), "Vector-matrix case", vecIn, matIn, op, true)); >-+ opGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_fragment").c_str(), "Vector-matrix case", vecIn, matIn, op, false)); >-+ } >-+ >-+ if (isOperationMatrixMatrix(op)) >-+ { >-+ // Matrix-matrix. >-+ ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); >-+ opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); >-+ opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); >-+ } >-+ >-+ if (isOperationUnary(op)) >-+ { >-+ // op matrix >-+ ShaderInput voidInput(INPUTTYPE_LAST, TYPE_LAST, PRECISION_LAST); >-+ opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "vertex").c_str(), "Matrix case", matIn, voidInput, op, true)); >-+ opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "fragment").c_str(), "Matrix case", matIn, voidInput, op, false)); >-+ } >-+ >-+ if (isOperationAssignment(op)) >-+ { >-+ ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); >-+ opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "vertex").c_str(), "Matrix assignment case", matIn, otherMatIn, op, true)); >-+ opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "fragment").c_str(), "Matrix assignment case", matIn, otherMatIn, op, false)); >-+ } >-+ } >-+ } >-+ } >-+ } >- } >- >- } // Functional >-diff --git a/src/tests/deqp_support/es3fShaderMatrixTests.cpp b/src/tests/deqp_support/es3fShaderMatrixTests.cpp >-index b18f8ba14..25784982c 100644 >---- a/src/tests/deqp_support/es3fShaderMatrixTests.cpp >-+++ b/src/tests/deqp_support/es3fShaderMatrixTests.cpp >-@@ -77,127 +77,127 @@ using tcu::Mat4; >- // Uniform / constant values for tests. >- // \note Input1 should not contain 0 components as it is used as divisor in div cases. >- // \todo [2012-02-14 pyry] Make these dynamic. >--static const float s_constInFloat[2] = { 0.5f, -0.2f }; >--static const Vec2 s_constInVec2[2] = { Vec2(1.2f, 0.5f), Vec2(0.5f, 1.0f) }; >--static const Vec3 s_constInVec3[2] = { Vec3(1.1f, 0.1f, 0.5f), Vec3(-0.2f, 0.5f, 0.8f) }; >--static const Vec4 s_constInVec4[2] = { Vec4(1.4f, 0.2f, -0.5f, 0.7f), Vec4(0.2f, -1.0f, 0.5f, 0.8f) }; >-+static const float s_constInFloat[2] = { 0.5f, -0.2f }; >-+static const Vec2 s_constInVec2[2] = { Vec2(1.2f, 0.5f), Vec2(0.5f, 1.0f) }; >-+static const Vec3 s_constInVec3[2] = { Vec3(1.1f, 0.1f, 0.5f), Vec3(-0.2f, 0.5f, 0.8f) }; >-+static const Vec4 s_constInVec4[2] = { Vec4(1.4f, 0.2f, -0.5f, 0.7f), Vec4(0.2f, -1.0f, 0.5f, 0.8f) }; >- >- static const float s_constInMat2x2[2][4] = >- { >-- { >-- -0.1f, 1.0f, >-- -0.2f, 0.0f, >-- }, >-- { >-- 0.8f, 0.1f, >-- 0.5f, -0.9f, >-- }, >-+ { >-+ -0.1f, 1.0f, >-+ -0.2f, 0.0f, >-+ }, >-+ { >-+ 0.8f, 0.1f, >-+ 0.5f, -0.9f, >-+ }, >- }; >- static const float s_constInMat3x2[2][6] = >- { >-- { >-- 0.8f, -0.3f, 0.3f, >-- 1.0f, 1.2f, -1.2f, >-- }, >-- { >-- 1.2f, -1.0f, 0.5f, >-- -0.8f, 1.1f, 0.3f, >-- }, >-+ { >-+ 0.8f, -0.3f, 0.3f, >-+ 1.0f, 1.2f, -1.2f, >-+ }, >-+ { >-+ 1.2f, -1.0f, 0.5f, >-+ -0.8f, 1.1f, 0.3f, >-+ }, >- }; >- static const float s_constInMat4x2[2][8] = >- { >-- { >-- -0.2f, 0.5f, 0.0f, -1.0f, >-- 1.2f, -0.5f, 0.3f, -0.9f, >-- }, >-- { >-- 1.0f, 0.1f, -1.1f, 0.6f, >-- 0.8f, -1.2f, -1.1f, 0.7f, >-- }, >-+ { >-+ -0.2f, 0.5f, 0.0f, -1.0f, >-+ 1.2f, -0.5f, 0.3f, -0.9f, >-+ }, >-+ { >-+ 1.0f, 0.1f, -1.1f, 0.6f, >-+ 0.8f, -1.2f, -1.1f, 0.7f, >-+ }, >- }; >- static const float s_constInMat2x3[2][6] = >- { >-- { >-- -0.6f, -0.1f, >-- -0.7f, -1.2f, >-- -0.2f, 0.0f, >-- }, >-- { >-- 1.1f, 0.6f, >-- 0.8f, 1.0f, >-- 0.7f, 0.1f, >-- }, >-+ { >-+ -0.6f, -0.1f, >-+ -0.7f, -1.2f, >-+ -0.2f, 0.0f, >-+ }, >-+ { >-+ 1.1f, 0.6f, >-+ 0.8f, 1.0f, >-+ 0.7f, 0.1f, >-+ }, >- }; >- static const float s_constInMat3x3[2][9] = >- { >-- { >-- -0.2f, 1.1f, 1.2f, >-- -1.0f, 1.2f, 0.5f, >-- 0.7f, -0.2f, 1.0f, >-- }, >-- { >-- -0.1f, -0.1f, 0.1f, >-- -0.1f, -0.2f, 1.0f, >-- -0.5f, 0.1f, -0.4f, >-- }, >-+ { >-+ -0.2f, 1.1f, 1.2f, >-+ -1.0f, 1.2f, 0.5f, >-+ 0.7f, -0.2f, 1.0f, >-+ }, >-+ { >-+ -0.1f, -0.1f, 0.1f, >-+ -0.1f, -0.2f, 1.0f, >-+ -0.5f, 0.1f, -0.4f, >-+ }, >- }; >- static const float s_constInMat4x3[2][12] = >- { >-- { >-- -0.9f, 0.0f, 0.6f, 0.2f, >-- 0.9f, -0.1f, -0.3f, -0.7f, >-- -0.1f, 0.1f, 1.0f, 0.0f, >-- }, >-- { >-- 0.5f, 0.7f, 0.7f, 1.2f, >-- 1.1f, 0.1f, 1.0f, -1.0f, >-- -0.2f, -0.2f, -0.3f, -0.5f, >-- }, >-+ { >-+ -0.9f, 0.0f, 0.6f, 0.2f, >-+ 0.9f, -0.1f, -0.3f, -0.7f, >-+ -0.1f, 0.1f, 1.0f, 0.0f, >-+ }, >-+ { >-+ 0.5f, 0.7f, 0.7f, 1.2f, >-+ 1.1f, 0.1f, 1.0f, -1.0f, >-+ -0.2f, -0.2f, -0.3f, -0.5f, >-+ }, >- }; >- static const float s_constInMat2x4[2][8] = >- { >-- { >-- -0.6f, -1.1f, >-- -0.6f, -0.6f, >-- -0.2f, -0.6f, >-- -0.1f, -0.1f, >-- }, >-- { >-- -1.2f, -1.0f, >-- 0.7f, -1.0f, >-- 0.7f, 0.7f, >-- -0.4f, -0.3f, >-- }, >-+ { >-+ -0.6f, -1.1f, >-+ -0.6f, -0.6f, >-+ -0.2f, -0.6f, >-+ -0.1f, -0.1f, >-+ }, >-+ { >-+ -1.2f, -1.0f, >-+ 0.7f, -1.0f, >-+ 0.7f, 0.7f, >-+ -0.4f, -0.3f, >-+ }, >- }; >- static const float s_constInMat3x4[2][12] = >- { >-- { >-- 0.6f, -0.4f, 1.2f, >-- 0.9f, 0.8f, 0.4f, >-- 1.1f, 0.3f, 0.5f, >-- -0.2f, 0.0f, 1.1f, >-- }, >-- { >-- -0.8f, 1.2f, -0.2f, >-- -1.1f, -0.9f, -0.5f, >-- -1.2f, 1.0f, 1.2f, >-- 0.1f, -0.7f, -0.5f, >-- }, >-+ { >-+ 0.6f, -0.4f, 1.2f, >-+ 0.9f, 0.8f, 0.4f, >-+ 1.1f, 0.3f, 0.5f, >-+ -0.2f, 0.0f, 1.1f, >-+ }, >-+ { >-+ -0.8f, 1.2f, -0.2f, >-+ -1.1f, -0.9f, -0.5f, >-+ -1.2f, 1.0f, 1.2f, >-+ 0.1f, -0.7f, -0.5f, >-+ }, >- }; >- static const float s_constInMat4x4[2][16] = >- { >-- { >-- 0.3f, 0.9f, -0.2f, 1.0f, >-- -0.4f, -0.6f, 0.6f, -1.0f, >-- -0.9f, -0.1f, 0.3f, -0.2f, >-- -0.3f, -0.9f, 1.0f, 0.1f, >-- }, >-- { >-- 0.4f, -0.7f, -0.8f, 0.7f, >-- -0.4f, -0.8f, 0.6f, -0.3f, >-- 0.7f, -1.0f, 0.1f, -0.3f, >-- 0.2f, 0.6f, 0.4f, -1.0f, >-- }, >-+ { >-+ 0.3f, 0.9f, -0.2f, 1.0f, >-+ -0.4f, -0.6f, 0.6f, -1.0f, >-+ -0.9f, -0.1f, 0.3f, -0.2f, >-+ -0.3f, -0.9f, 1.0f, 0.1f, >-+ }, >-+ { >-+ 0.4f, -0.7f, -0.8f, 0.7f, >-+ -0.4f, -0.8f, 0.6f, -0.3f, >-+ 0.7f, -1.0f, 0.1f, -0.3f, >-+ 0.2f, 0.6f, 0.4f, -1.0f, >-+ }, >- }; >- >- namespace MatrixCaseUtils >-@@ -205,49 +205,49 @@ namespace MatrixCaseUtils >- >- enum InputType >- { >-- INPUTTYPE_CONST = 0, >-- INPUTTYPE_UNIFORM, >-- INPUTTYPE_DYNAMIC, >-+ INPUTTYPE_CONST = 0, >-+ INPUTTYPE_UNIFORM, >-+ INPUTTYPE_DYNAMIC, >- >-- INPUTTYPE_LAST >-+ INPUTTYPE_LAST >- }; >- >- struct ShaderInput >- { >-- ShaderInput (InputType inputType_, DataType dataType_, Precision precision_) >-- : inputType (inputType_) >-- , dataType (dataType_) >-- , precision (precision_) >-- { >-- } >-+ ShaderInput (InputType inputType_, DataType dataType_, Precision precision_) >-+ : inputType (inputType_) >-+ , dataType (dataType_) >-+ , precision (precision_) >-+ { >-+ } >- >-- InputType inputType; >-- DataType dataType; >-- Precision precision; >-+ InputType inputType; >-+ DataType dataType; >-+ Precision precision; >- }; >- >- enum MatrixOp >- { >-- OP_ADD = 0, >-- OP_SUB, >-- OP_MUL, >-- OP_DIV, >-- OP_COMP_MUL, >-- OP_OUTER_PRODUCT, >-- OP_TRANSPOSE, >-- OP_INVERSE, >-- OP_DETERMINANT, >-- OP_UNARY_PLUS, >-- OP_NEGATION, >-- OP_PRE_INCREMENT, >-- OP_PRE_DECREMENT, >-- OP_POST_INCREMENT, >-- OP_POST_DECREMENT, >-- OP_ADD_INTO, >-- OP_SUBTRACT_FROM, >-- OP_MULTIPLY_INTO, >-- OP_DIVIDE_INTO, >-- OP_LAST >-+ OP_ADD = 0, >-+ OP_SUB, >-+ OP_MUL, >-+ OP_DIV, >-+ OP_COMP_MUL, >-+ OP_OUTER_PRODUCT, >-+ OP_TRANSPOSE, >-+ OP_INVERSE, >-+ OP_DETERMINANT, >-+ OP_UNARY_PLUS, >-+ OP_NEGATION, >-+ OP_PRE_INCREMENT, >-+ OP_PRE_DECREMENT, >-+ OP_POST_INCREMENT, >-+ OP_POST_DECREMENT, >-+ OP_ADD_INTO, >-+ OP_SUBTRACT_FROM, >-+ OP_MULTIPLY_INTO, >-+ OP_DIVIDE_INTO, >-+ OP_LAST >- }; >- >- // Type traits. >-@@ -255,237 +255,237 @@ enum MatrixOp >- template <int DataT> >- struct TypeTraits; >- >--#define DECLARE_TYPE_TRAIT(DATATYPE, TYPE) \ >--template<> \ >--struct TypeTraits<DATATYPE> { \ >-- typedef TYPE Type; \ >-+#define DECLARE_TYPE_TRAIT(DATATYPE, TYPE) \ >-+template<> \ >-+struct TypeTraits<DATATYPE> { \ >-+ typedef TYPE Type; \ >- } >- >--DECLARE_TYPE_TRAIT(TYPE_FLOAT, float); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC2, tcu::Vec2); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC3, tcu::Vec3); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC4, tcu::Vec4); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2, tcu::Mat2); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2X3, tcu::Mat2x3); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2X4, tcu::Mat2x4); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3X2, tcu::Mat3x2); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3, tcu::Mat3); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3X4, tcu::Mat3x4); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4X2, tcu::Mat4x2); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4X3, tcu::Mat4x3); >--DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4, tcu::Mat4); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT, float); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC2, tcu::Vec2); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC3, tcu::Vec3); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC4, tcu::Vec4); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2, tcu::Mat2); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2X3, tcu::Mat2x3); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2X4, tcu::Mat2x4); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3X2, tcu::Mat3x2); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3, tcu::Mat3); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3X4, tcu::Mat3x4); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4X2, tcu::Mat4x2); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4X3, tcu::Mat4x3); >-+DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4, tcu::Mat4); >- >- // Operation info >- >- enum OperationType >- { >-- OPERATIONTYPE_BINARY_OPERATOR = 0, >-- OPERATIONTYPE_BINARY_FUNCTION, >-- OPERATIONTYPE_UNARY_PREFIX_OPERATOR, >-- OPERATIONTYPE_UNARY_POSTFIX_OPERATOR, >-- OPERATIONTYPE_UNARY_FUNCTION, >-- OPERATIONTYPE_ASSIGNMENT, >-+ OPERATIONTYPE_BINARY_OPERATOR = 0, >-+ OPERATIONTYPE_BINARY_FUNCTION, >-+ OPERATIONTYPE_UNARY_PREFIX_OPERATOR, >-+ OPERATIONTYPE_UNARY_POSTFIX_OPERATOR, >-+ OPERATIONTYPE_UNARY_FUNCTION, >-+ OPERATIONTYPE_ASSIGNMENT, >- >-- OPERATIONTYPE_LAST >-+ OPERATIONTYPE_LAST >- }; >- >- static const char* getOperationName (MatrixOp op) >- { >-- switch (op) >-- { >-- case OP_ADD: return "+"; >-- case OP_SUB: return "-"; >-- case OP_MUL: return "*"; >-- case OP_DIV: return "/"; >-- case OP_COMP_MUL: return "matrixCompMult"; >-- case OP_OUTER_PRODUCT: return "outerProduct"; >-- case OP_TRANSPOSE: return "transpose"; >-- case OP_INVERSE: return "inverse"; >-- case OP_DETERMINANT: return "determinant"; >-- case OP_UNARY_PLUS: return "+"; >-- case OP_NEGATION: return "-"; >-- case OP_PRE_INCREMENT: return "++"; >-- case OP_PRE_DECREMENT: return "--"; >-- case OP_POST_INCREMENT: return "++"; >-- case OP_POST_DECREMENT: return "--"; >-- case OP_ADD_INTO: return "+="; >-- case OP_SUBTRACT_FROM: return "-="; >-- case OP_MULTIPLY_INTO: return "*="; >-- case OP_DIVIDE_INTO: return "/="; >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- return ""; >-- } >-+ switch (op) >-+ { >-+ case OP_ADD: return "+"; >-+ case OP_SUB: return "-"; >-+ case OP_MUL: return "*"; >-+ case OP_DIV: return "/"; >-+ case OP_COMP_MUL: return "matrixCompMult"; >-+ case OP_OUTER_PRODUCT: return "outerProduct"; >-+ case OP_TRANSPOSE: return "transpose"; >-+ case OP_INVERSE: return "inverse"; >-+ case OP_DETERMINANT: return "determinant"; >-+ case OP_UNARY_PLUS: return "+"; >-+ case OP_NEGATION: return "-"; >-+ case OP_PRE_INCREMENT: return "++"; >-+ case OP_PRE_DECREMENT: return "--"; >-+ case OP_POST_INCREMENT: return "++"; >-+ case OP_POST_DECREMENT: return "--"; >-+ case OP_ADD_INTO: return "+="; >-+ case OP_SUBTRACT_FROM: return "-="; >-+ case OP_MULTIPLY_INTO: return "*="; >-+ case OP_DIVIDE_INTO: return "/="; >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ return ""; >-+ } >- } >- >- static OperationType getOperationType (MatrixOp op) >- { >-- switch (op) >-- { >-- case OP_ADD: return OPERATIONTYPE_BINARY_OPERATOR; >-- case OP_SUB: return OPERATIONTYPE_BINARY_OPERATOR; >-- case OP_MUL: return OPERATIONTYPE_BINARY_OPERATOR; >-- case OP_DIV: return OPERATIONTYPE_BINARY_OPERATOR; >-- case OP_COMP_MUL: return OPERATIONTYPE_BINARY_FUNCTION; >-- case OP_OUTER_PRODUCT: return OPERATIONTYPE_BINARY_FUNCTION; >-- case OP_TRANSPOSE: return OPERATIONTYPE_UNARY_FUNCTION; >-- case OP_INVERSE: return OPERATIONTYPE_UNARY_FUNCTION; >-- case OP_DETERMINANT: return OPERATIONTYPE_UNARY_FUNCTION; >-- case OP_UNARY_PLUS: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-- case OP_NEGATION: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-- case OP_PRE_INCREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-- case OP_PRE_DECREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-- case OP_POST_INCREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; >-- case OP_POST_DECREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; >-- case OP_ADD_INTO: return OPERATIONTYPE_ASSIGNMENT; >-- case OP_SUBTRACT_FROM: return OPERATIONTYPE_ASSIGNMENT; >-- case OP_MULTIPLY_INTO: return OPERATIONTYPE_ASSIGNMENT; >-- case OP_DIVIDE_INTO: return OPERATIONTYPE_ASSIGNMENT; >-- default: >-- DE_ASSERT(DE_FALSE); >-- return OPERATIONTYPE_LAST; >-- } >-+ switch (op) >-+ { >-+ case OP_ADD: return OPERATIONTYPE_BINARY_OPERATOR; >-+ case OP_SUB: return OPERATIONTYPE_BINARY_OPERATOR; >-+ case OP_MUL: return OPERATIONTYPE_BINARY_OPERATOR; >-+ case OP_DIV: return OPERATIONTYPE_BINARY_OPERATOR; >-+ case OP_COMP_MUL: return OPERATIONTYPE_BINARY_FUNCTION; >-+ case OP_OUTER_PRODUCT: return OPERATIONTYPE_BINARY_FUNCTION; >-+ case OP_TRANSPOSE: return OPERATIONTYPE_UNARY_FUNCTION; >-+ case OP_INVERSE: return OPERATIONTYPE_UNARY_FUNCTION; >-+ case OP_DETERMINANT: return OPERATIONTYPE_UNARY_FUNCTION; >-+ case OP_UNARY_PLUS: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-+ case OP_NEGATION: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-+ case OP_PRE_INCREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-+ case OP_PRE_DECREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; >-+ case OP_POST_INCREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; >-+ case OP_POST_DECREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; >-+ case OP_ADD_INTO: return OPERATIONTYPE_ASSIGNMENT; >-+ case OP_SUBTRACT_FROM: return OPERATIONTYPE_ASSIGNMENT; >-+ case OP_MULTIPLY_INTO: return OPERATIONTYPE_ASSIGNMENT; >-+ case OP_DIVIDE_INTO: return OPERATIONTYPE_ASSIGNMENT; >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ return OPERATIONTYPE_LAST; >-+ } >- } >- >- enum TestMatrixType >- { >-- TESTMATRIXTYPE_DEFAULT = 0, >-- TESTMATRIXTYPE_NEGATED, >-- TESTMATRIXTYPE_INCREMENTED, >-- TESTMATRIXTYPE_DECREMENTED, >-- TESTMATRIXTYPE_NEGATED_INCREMENTED, >-- TESTMATRIXTYPE_INCREMENTED_LESS, >-+ TESTMATRIXTYPE_DEFAULT = 0, >-+ TESTMATRIXTYPE_NEGATED, >-+ TESTMATRIXTYPE_INCREMENTED, >-+ TESTMATRIXTYPE_DECREMENTED, >-+ TESTMATRIXTYPE_NEGATED_INCREMENTED, >-+ TESTMATRIXTYPE_INCREMENTED_LESS, >- >-- TESTMATRIXTYPE_LAST >-+ TESTMATRIXTYPE_LAST >- }; >- >- static TestMatrixType getOperationTestMatrixType (MatrixOp op) >- { >-- switch(op) >-- { >-- case OP_ADD: return TESTMATRIXTYPE_DEFAULT; >-- case OP_SUB: return TESTMATRIXTYPE_DEFAULT; >-- case OP_MUL: return TESTMATRIXTYPE_DEFAULT; >-- case OP_DIV: return TESTMATRIXTYPE_DEFAULT; >-- case OP_COMP_MUL: return TESTMATRIXTYPE_DEFAULT; >-- case OP_OUTER_PRODUCT: return TESTMATRIXTYPE_DEFAULT; >-- case OP_TRANSPOSE: return TESTMATRIXTYPE_DEFAULT; >-- case OP_INVERSE: return TESTMATRIXTYPE_DEFAULT; >-- case OP_DETERMINANT: return TESTMATRIXTYPE_DEFAULT; >-- case OP_UNARY_PLUS: return TESTMATRIXTYPE_DECREMENTED; >-- case OP_NEGATION: return TESTMATRIXTYPE_NEGATED_INCREMENTED; >-- case OP_PRE_INCREMENT: return TESTMATRIXTYPE_NEGATED; >-- case OP_PRE_DECREMENT: return TESTMATRIXTYPE_INCREMENTED; >-- case OP_POST_INCREMENT: return TESTMATRIXTYPE_NEGATED; >-- case OP_POST_DECREMENT: return TESTMATRIXTYPE_DEFAULT; >-- case OP_ADD_INTO: return TESTMATRIXTYPE_DEFAULT; >-- case OP_SUBTRACT_FROM: return TESTMATRIXTYPE_INCREMENTED_LESS; >-- case OP_MULTIPLY_INTO: return TESTMATRIXTYPE_NEGATED; >-- case OP_DIVIDE_INTO: return TESTMATRIXTYPE_DECREMENTED; >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- return TESTMATRIXTYPE_LAST; >-- } >-+ switch(op) >-+ { >-+ case OP_ADD: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_SUB: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_MUL: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_DIV: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_COMP_MUL: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_OUTER_PRODUCT: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_TRANSPOSE: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_INVERSE: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_DETERMINANT: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_UNARY_PLUS: return TESTMATRIXTYPE_DECREMENTED; >-+ case OP_NEGATION: return TESTMATRIXTYPE_NEGATED_INCREMENTED; >-+ case OP_PRE_INCREMENT: return TESTMATRIXTYPE_NEGATED; >-+ case OP_PRE_DECREMENT: return TESTMATRIXTYPE_INCREMENTED; >-+ case OP_POST_INCREMENT: return TESTMATRIXTYPE_NEGATED; >-+ case OP_POST_DECREMENT: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_ADD_INTO: return TESTMATRIXTYPE_DEFAULT; >-+ case OP_SUBTRACT_FROM: return TESTMATRIXTYPE_INCREMENTED_LESS; >-+ case OP_MULTIPLY_INTO: return TESTMATRIXTYPE_NEGATED; >-+ case OP_DIVIDE_INTO: return TESTMATRIXTYPE_DECREMENTED; >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ return TESTMATRIXTYPE_LAST; >-+ } >- } >- >- static bool isOperationBinary (MatrixOp op) >- { >-- return getOperationType(op) == OPERATIONTYPE_BINARY_OPERATOR || >-- getOperationType(op) == OPERATIONTYPE_BINARY_FUNCTION || >-- getOperationType(op) == OPERATIONTYPE_ASSIGNMENT; >-+ return getOperationType(op) == OPERATIONTYPE_BINARY_OPERATOR || >-+ getOperationType(op) == OPERATIONTYPE_BINARY_FUNCTION || >-+ getOperationType(op) == OPERATIONTYPE_ASSIGNMENT; >- } >- >- static bool isOperationMatrixScalar (MatrixOp op) >- { >-- return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV; >-+ return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV; >- } >- >- static bool isOperationMatrixVector (MatrixOp op) >- { >-- return op == OP_MUL; >-+ return op == OP_MUL; >- } >- >- static bool isOperationArithmeticMatrixMatrix (MatrixOp op) >- { >-- return op == OP_MUL; >-+ return op == OP_MUL; >- } >- >- static bool isOperationComponentwiseMatrixMatrix (MatrixOp op) >- { >-- return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV || op == OP_COMP_MUL; >-+ return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV || op == OP_COMP_MUL; >- } >- >- static bool isOperationVectorVector (MatrixOp op) >- { >-- return op == OP_OUTER_PRODUCT; >-+ return op == OP_OUTER_PRODUCT; >- } >- >- static bool isOperationUnaryAnyMatrix (MatrixOp op) >- { >-- return op == OP_TRANSPOSE || >-- op == OP_UNARY_PLUS || >-- op == OP_NEGATION || >-- op == OP_PRE_INCREMENT || >-- op == OP_PRE_DECREMENT || >-- op == OP_POST_INCREMENT || >-- op == OP_POST_DECREMENT; >-+ return op == OP_TRANSPOSE || >-+ op == OP_UNARY_PLUS || >-+ op == OP_NEGATION || >-+ op == OP_PRE_INCREMENT || >-+ op == OP_PRE_DECREMENT || >-+ op == OP_POST_INCREMENT || >-+ op == OP_POST_DECREMENT; >- } >- >- static bool isOperationUnarySymmetricMatrix (MatrixOp op) >- { >-- return op == OP_INVERSE || op == OP_DETERMINANT; >-+ return op == OP_INVERSE || op == OP_DETERMINANT; >- } >- >- static bool isOperationValueModifying (MatrixOp op) >- { >-- return op == OP_PRE_INCREMENT || >-- op == OP_PRE_DECREMENT || >-- op == OP_POST_INCREMENT || >-- op == OP_POST_DECREMENT; >-+ return op == OP_PRE_INCREMENT || >-+ op == OP_PRE_DECREMENT || >-+ op == OP_POST_INCREMENT || >-+ op == OP_POST_DECREMENT; >- } >- >- static bool isOperationAssignment (MatrixOp op) >- { >-- return op == OP_ADD_INTO || >-- op == OP_SUBTRACT_FROM || >-- op == OP_MULTIPLY_INTO || >-- op == OP_DIVIDE_INTO; >-+ return op == OP_ADD_INTO || >-+ op == OP_SUBTRACT_FROM || >-+ op == OP_MULTIPLY_INTO || >-+ op == OP_DIVIDE_INTO; >- } >- >- static bool isOperationAssignmentAnyMatrix (MatrixOp op) >- { >-- return op == OP_ADD_INTO || >-- op == OP_SUBTRACT_FROM || >-- op == OP_DIVIDE_INTO; >-+ return op == OP_ADD_INTO || >-+ op == OP_SUBTRACT_FROM || >-+ op == OP_DIVIDE_INTO; >- } >- >- static bool isOperationAssignmentSymmetricMatrix (MatrixOp op) >- { >-- return op == OP_MULTIPLY_INTO; >-+ return op == OP_MULTIPLY_INTO; >- } >- >- // Operation nature >- >- enum OperationNature >- { >-- OPERATIONNATURE_PURE = 0, >-- OPERATIONNATURE_MUTATING, >-- OPERATIONNATURE_ASSIGNMENT, >-+ OPERATIONNATURE_PURE = 0, >-+ OPERATIONNATURE_MUTATING, >-+ OPERATIONNATURE_ASSIGNMENT, >- >-- OPERATIONNATURE_LAST >-+ OPERATIONNATURE_LAST >- }; >- >- static OperationNature getOperationNature (MatrixOp op) >- { >-- if (isOperationAssignment(op)) >-- return OPERATIONNATURE_ASSIGNMENT; >-+ if (isOperationAssignment(op)) >-+ return OPERATIONNATURE_ASSIGNMENT; >- >-- if (isOperationValueModifying(op)) >-- return OPERATIONNATURE_MUTATING; >-+ if (isOperationValueModifying(op)) >-+ return OPERATIONNATURE_MUTATING; >- >-- return OPERATIONNATURE_PURE; >-+ return OPERATIONNATURE_PURE; >- } >- >- // Input value loader. >-@@ -493,143 +493,143 @@ static OperationNature getOperationNature (MatrixOp op) >- template <int InputT, int DataT> >- typename TypeTraits<DataT>::Type getInputValue (const ShaderEvalContext& evalCtx, int inputNdx); >- >--template <> inline float getInputValue<INPUTTYPE_CONST, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInFloat[inputNdx]; } >--template <> inline tcu::Vec2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec2[inputNdx]; } >--template <> inline tcu::Vec3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec3[inputNdx]; } >--template <> inline tcu::Vec4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec4[inputNdx]; } >-- >--template <> inline tcu::Mat2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2(s_constInMat2x2[inputNdx]); } >--template <> inline tcu::Mat2x3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2X3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2x3(s_constInMat2x3[inputNdx]); } >--template <> inline tcu::Mat2x4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2X4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2x4(s_constInMat2x4[inputNdx]); } >--template <> inline tcu::Mat3x2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3X2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3x2(s_constInMat3x2[inputNdx]); } >--template <> inline tcu::Mat3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3(s_constInMat3x3[inputNdx]); } >--template <> inline tcu::Mat3x4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3X4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3x4(s_constInMat3x4[inputNdx]); } >--template <> inline tcu::Mat4x2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4X2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4x2(s_constInMat4x2[inputNdx]); } >--template <> inline tcu::Mat4x3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4X3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4x3(s_constInMat4x3[inputNdx]); } >--template <> inline tcu::Mat4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4(s_constInMat4x4[inputNdx]); } >-- >--template <> inline float getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.x(); } >--template <> inline tcu::Vec2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1); } >--template <> inline tcu::Vec3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2); } >--template <> inline tcu::Vec4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2, 3); } >-+template <> inline float getInputValue<INPUTTYPE_CONST, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInFloat[inputNdx]; } >-+template <> inline tcu::Vec2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec2[inputNdx]; } >-+template <> inline tcu::Vec3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec3[inputNdx]; } >-+template <> inline tcu::Vec4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec4[inputNdx]; } >-+ >-+template <> inline tcu::Mat2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2(s_constInMat2x2[inputNdx]); } >-+template <> inline tcu::Mat2x3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2X3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2x3(s_constInMat2x3[inputNdx]); } >-+template <> inline tcu::Mat2x4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2X4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2x4(s_constInMat2x4[inputNdx]); } >-+template <> inline tcu::Mat3x2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3X2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3x2(s_constInMat3x2[inputNdx]); } >-+template <> inline tcu::Mat3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3(s_constInMat3x3[inputNdx]); } >-+template <> inline tcu::Mat3x4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3X4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3x4(s_constInMat3x4[inputNdx]); } >-+template <> inline tcu::Mat4x2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4X2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4x2(s_constInMat4x2[inputNdx]); } >-+template <> inline tcu::Mat4x3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4X3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4x3(s_constInMat4x3[inputNdx]); } >-+template <> inline tcu::Mat4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4(s_constInMat4x4[inputNdx]); } >-+ >-+template <> inline float getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.x(); } >-+template <> inline tcu::Vec2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1); } >-+template <> inline tcu::Vec3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2); } >-+template <> inline tcu::Vec4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2, 3); } >- >- template <> inline tcu::Mat2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) >- { >-- DE_UNREF(inputNdx); // Not used. >-- tcu::Mat2 m; >-- m.setColumn(0, evalCtx.in[0].swizzle(0,1)); >-- m.setColumn(1, evalCtx.in[1].swizzle(0,1)); >-- return m; >-+ DE_UNREF(inputNdx); // Not used. >-+ tcu::Mat2 m; >-+ m.setColumn(0, evalCtx.in[0].swizzle(0,1)); >-+ m.setColumn(1, evalCtx.in[1].swizzle(0,1)); >-+ return m; >- } >- >- template <> inline tcu::Mat2x3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT2X3> (const ShaderEvalContext& evalCtx, int inputNdx) >- { >-- DE_UNREF(inputNdx); // Not used. >-- tcu::Mat2x3 m; >-- m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); >-- m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); >-- return m; >-+ DE_UNREF(inputNdx); // Not used. >-+ tcu::Mat2x3 m; >-+ m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); >-+ m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); >-+ return m; >- } >- >- template <> inline tcu::Mat2x4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT2X4> (const ShaderEvalContext& evalCtx, int inputNdx) >- { >-- DE_UNREF(inputNdx); // Not used. >-- tcu::Mat2x4 m; >-- m.setColumn(0, evalCtx.in[0]); >-- m.setColumn(1, evalCtx.in[1]); >-- return m; >-+ DE_UNREF(inputNdx); // Not used. >-+ tcu::Mat2x4 m; >-+ m.setColumn(0, evalCtx.in[0]); >-+ m.setColumn(1, evalCtx.in[1]); >-+ return m; >- } >- >- template <> inline tcu::Mat3x2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT3X2> (const ShaderEvalContext& evalCtx, int inputNdx) >- { >-- DE_UNREF(inputNdx); // Not used. >-- tcu::Mat3x2 m; >-- m.setColumn(0, evalCtx.in[0].swizzle(0,1)); >-- m.setColumn(1, evalCtx.in[1].swizzle(0,1)); >-- m.setColumn(2, evalCtx.in[2].swizzle(0,1)); >-- return m; >-+ DE_UNREF(inputNdx); // Not used. >-+ tcu::Mat3x2 m; >-+ m.setColumn(0, evalCtx.in[0].swizzle(0,1)); >-+ m.setColumn(1, evalCtx.in[1].swizzle(0,1)); >-+ m.setColumn(2, evalCtx.in[2].swizzle(0,1)); >-+ return m; >- } >- >- template <> inline tcu::Mat3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) >- { >-- DE_UNREF(inputNdx); // Not used. >-- tcu::Mat3 m; >-- m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); >-- m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); >-- m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); >-- return m; >-+ DE_UNREF(inputNdx); // Not used. >-+ tcu::Mat3 m; >-+ m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); >-+ m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); >-+ m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); >-+ return m; >- } >- >- template <> inline tcu::Mat3x4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT3X4> (const ShaderEvalContext& evalCtx, int inputNdx) >- { >-- DE_UNREF(inputNdx); // Not used. >-- tcu::Mat3x4 m; >-- m.setColumn(0, evalCtx.in[0]); >-- m.setColumn(1, evalCtx.in[1]); >-- m.setColumn(2, evalCtx.in[2]); >-- return m; >-+ DE_UNREF(inputNdx); // Not used. >-+ tcu::Mat3x4 m; >-+ m.setColumn(0, evalCtx.in[0]); >-+ m.setColumn(1, evalCtx.in[1]); >-+ m.setColumn(2, evalCtx.in[2]); >-+ return m; >- } >- >- template <> inline tcu::Mat4x2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT4X2> (const ShaderEvalContext& evalCtx, int inputNdx) >- { >-- DE_UNREF(inputNdx); // Not used. >-- tcu::Mat4x2 m; >-- m.setColumn(0, evalCtx.in[0].swizzle(0,1)); >-- m.setColumn(1, evalCtx.in[1].swizzle(0,1)); >-- m.setColumn(2, evalCtx.in[2].swizzle(0,1)); >-- m.setColumn(3, evalCtx.in[3].swizzle(0,1)); >-- return m; >-+ DE_UNREF(inputNdx); // Not used. >-+ tcu::Mat4x2 m; >-+ m.setColumn(0, evalCtx.in[0].swizzle(0,1)); >-+ m.setColumn(1, evalCtx.in[1].swizzle(0,1)); >-+ m.setColumn(2, evalCtx.in[2].swizzle(0,1)); >-+ m.setColumn(3, evalCtx.in[3].swizzle(0,1)); >-+ return m; >- } >- >- template <> inline tcu::Mat4x3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT4X3> (const ShaderEvalContext& evalCtx, int inputNdx) >- { >-- DE_UNREF(inputNdx); // Not used. >-- tcu::Mat4x3 m; >-- m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); >-- m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); >-- m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); >-- m.setColumn(3, evalCtx.in[3].swizzle(0,1,2)); >-- return m; >-+ DE_UNREF(inputNdx); // Not used. >-+ tcu::Mat4x3 m; >-+ m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); >-+ m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); >-+ m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); >-+ m.setColumn(3, evalCtx.in[3].swizzle(0,1,2)); >-+ return m; >- } >- >- template <> inline tcu::Mat4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) >- { >-- DE_UNREF(inputNdx); // Not used. >-- tcu::Mat4 m; >-- m.setColumn(0, evalCtx.in[0]); >-- m.setColumn(1, evalCtx.in[1]); >-- m.setColumn(2, evalCtx.in[2]); >-- m.setColumn(3, evalCtx.in[3]); >-- return m; >-+ DE_UNREF(inputNdx); // Not used. >-+ tcu::Mat4 m; >-+ m.setColumn(0, evalCtx.in[0]); >-+ m.setColumn(1, evalCtx.in[1]); >-+ m.setColumn(2, evalCtx.in[2]); >-+ m.setColumn(3, evalCtx.in[3]); >-+ return m; >- } >- >- // Reduction from expression result to vec3. >- >--inline tcu::Vec3 reduceToVec3 (const tcu::Vec2& value) { return value.swizzle(0,1,0); } >--inline tcu::Vec3 reduceToVec3 (const tcu::Vec3& value) { return value; } >--inline tcu::Vec3 reduceToVec3 (const tcu::Vec4& value) { return tcu::Vec3(value.x(), value.y(), value.z()+value.w()); } >--inline tcu::Vec3 reduceToVec3 (const tcu::Mat2& value) { return tcu::Vec3(value(0, 0), value(0, 1), value(1, 0)+value(1, 1)); } >--inline tcu::Vec3 reduceToVec3 (const tcu::Mat2x3& value) { return value.getColumn(0) + value.getColumn(1); } >--inline tcu::Vec3 reduceToVec3 (const tcu::Mat2x4& value) { return value.getColumn(0).swizzle(0,1,2) + value.getColumn(1).swizzle(1,2,3); } >--inline tcu::Vec3 reduceToVec3 (const tcu::Mat3x2& value) { return tcu::Vec3(value(0,0)+value(1,0), value(0,1)+value(1,1), value(0,2)+value(1,2)); } >--inline tcu::Vec3 reduceToVec3 (const tcu::Mat3& value) { return value.getColumn(0) + value.getColumn(1) + value.getColumn(2); } >--inline tcu::Vec3 reduceToVec3 (const tcu::Mat3x4& value) { return value.getColumn(0).swizzle(0,1,2) + value.getColumn(1).swizzle(1,2,3) + value.getColumn(2).swizzle(2,3,0); } >--inline tcu::Vec3 reduceToVec3 (const tcu::Mat4x2& value) { return tcu::Vec3(value(0,0)+value(1,0)+value(0,3), value(0,1)+value(1,1)+value(1,3), value(0,2)+value(1,2)); } >--inline tcu::Vec3 reduceToVec3 (const tcu::Mat4x3& value) { return value.getColumn(0) + value.getColumn(1) + value.getColumn(2) + value.getColumn(3); } >--inline tcu::Vec3 reduceToVec3 (const tcu::Mat4& value) { return value.getColumn(0).swizzle(0,1,2) + value.getColumn(1).swizzle(1,2,3) + value.getColumn(2).swizzle(2,3,0) + value.getColumn(3).swizzle(3,0,1); } >-+inline tcu::Vec3 reduceToVec3 (const tcu::Vec2& value) { return value.swizzle(0,1,0); } >-+inline tcu::Vec3 reduceToVec3 (const tcu::Vec3& value) { return value; } >-+inline tcu::Vec3 reduceToVec3 (const tcu::Vec4& value) { return tcu::Vec3(value.x(), value.y(), value.z()+value.w()); } >-+inline tcu::Vec3 reduceToVec3 (const tcu::Mat2& value) { return tcu::Vec3(value(0, 0), value(0, 1), value(1, 0)+value(1, 1)); } >-+inline tcu::Vec3 reduceToVec3 (const tcu::Mat2x3& value) { return value.getColumn(0) + value.getColumn(1); } >-+inline tcu::Vec3 reduceToVec3 (const tcu::Mat2x4& value) { return value.getColumn(0).swizzle(0,1,2) + value.getColumn(1).swizzle(1,2,3); } >-+inline tcu::Vec3 reduceToVec3 (const tcu::Mat3x2& value) { return tcu::Vec3(value(0,0)+value(1,0), value(0,1)+value(1,1), value(0,2)+value(1,2)); } >-+inline tcu::Vec3 reduceToVec3 (const tcu::Mat3& value) { return value.getColumn(0) + value.getColumn(1) + value.getColumn(2); } >-+inline tcu::Vec3 reduceToVec3 (const tcu::Mat3x4& value) { return value.getColumn(0).swizzle(0,1,2) + value.getColumn(1).swizzle(1,2,3) + value.getColumn(2).swizzle(2,3,0); } >-+inline tcu::Vec3 reduceToVec3 (const tcu::Mat4x2& value) { return tcu::Vec3(value(0,0)+value(1,0)+value(0,3), value(0,1)+value(1,1)+value(1,3), value(0,2)+value(1,2)); } >-+inline tcu::Vec3 reduceToVec3 (const tcu::Mat4x3& value) { return value.getColumn(0) + value.getColumn(1) + value.getColumn(2) + value.getColumn(3); } >-+inline tcu::Vec3 reduceToVec3 (const tcu::Mat4& value) { return value.getColumn(0).swizzle(0,1,2) + value.getColumn(1).swizzle(1,2,3) + value.getColumn(2).swizzle(2,3,0) + value.getColumn(3).swizzle(3,0,1); } >- >- // matrixCompMult >- >- template <typename T, int Rows, int Cols> >- tcu::Matrix<T, Rows, Cols> matrixCompMult (const tcu::Matrix<T, Rows, Cols>& a, const tcu::Matrix<T, Rows, Cols>& b) >- { >-- tcu::Matrix<T, Rows, Cols> retVal; >-+ tcu::Matrix<T, Rows, Cols> retVal; >- >-- for (int r = 0; r < Rows; ++r) >-- for (int c = 0; c < Cols; ++c) >-- retVal(r,c) = a(r,c) * b(r, c); >-+ for (int r = 0; r < Rows; ++r) >-+ for (int c = 0; c < Cols; ++c) >-+ retVal(r,c) = a(r,c) * b(r, c); >- >-- return retVal; >-+ return retVal; >- } >- >- // transpose >-@@ -637,13 +637,13 @@ tcu::Matrix<T, Rows, Cols> matrixCompMult (const tcu::Matrix<T, Rows, Cols>& a, >- template <typename T, int Rows, int Cols> >- tcu::Matrix<T, Cols, Rows> transpose (const tcu::Matrix<T, Rows, Cols>& mat) >- { >-- tcu::Matrix<T, Cols, Rows> retVal; >-+ tcu::Matrix<T, Cols, Rows> retVal; >- >-- for (int r = 0; r < Rows; ++r) >-- for (int c = 0; c < Cols; ++c) >-- retVal(c, r) = mat(r, c); >-+ for (int r = 0; r < Rows; ++r) >-+ for (int c = 0; c < Cols; ++c) >-+ retVal(c, r) = mat(r, c); >- >-- return retVal; >-+ return retVal; >- } >- >- // outerProduct >-@@ -651,13 +651,13 @@ tcu::Matrix<T, Cols, Rows> transpose (const tcu::Matrix<T, Rows, Cols>& mat) >- template <typename T, int Rows, int Cols> >- tcu::Matrix<T, Cols, Rows> outerProduct (const tcu::Vector<T, Cols>& a, const tcu::Vector<T, Rows>& b) >- { >-- tcu::Matrix<T, Rows, Cols> retVal; >-+ tcu::Matrix<T, Rows, Cols> retVal; >- >-- for (int r = 0; r < Rows; ++r) >-- for (int c = 0; c < Cols; ++c) >-- retVal(r,c) = a[c] * b[r]; >-+ for (int r = 0; r < Rows; ++r) >-+ for (int c = 0; c < Cols; ++c) >-+ retVal(r,c) = a[c] * b[r]; >- >-- return transpose(retVal); // to gl-form (column-major) >-+ return transpose(retVal); // to gl-form (column-major) >- } >- >- // Determinant >-@@ -668,51 +668,51 @@ float determinant (const tcu::Matrix<float, Size, Size>& mat); >- template <> >- float determinant<2> (const tcu::Matrix<float, 2, 2>& mat) >- { >-- return mat(0,0) * mat(1,1) - mat(1,0) * mat(0,1); >-+ return mat(0,0) * mat(1,1) - mat(1,0) * mat(0,1); >- } >- >- template <> >- float determinant<3> (const tcu::Matrix<float, 3, 3>& mat) >- { >-- return + mat(0,0) * mat(1,1) * mat(2,2) >-- + mat(0,1) * mat(1,2) * mat(2,0) >-- + mat(0,2) * mat(1,0) * mat(2,1) >-- - mat(0,0) * mat(1,2) * mat(2,1) >-- - mat(0,1) * mat(1,0) * mat(2,2) >-- - mat(0,2) * mat(1,1) * mat(2,0); >-+ return + mat(0,0) * mat(1,1) * mat(2,2) >-+ + mat(0,1) * mat(1,2) * mat(2,0) >-+ + mat(0,2) * mat(1,0) * mat(2,1) >-+ - mat(0,0) * mat(1,2) * mat(2,1) >-+ - mat(0,1) * mat(1,0) * mat(2,2) >-+ - mat(0,2) * mat(1,1) * mat(2,0); >- } >- >- template <> >- float determinant<4> (const tcu::Matrix<float, 4, 4>& mat) >- { >-- const float minorMatrices[4][3*3] = >-- { >-- { >-- mat(1,1), mat(2,1), mat(3,1), >-- mat(1,2), mat(2,2), mat(3,2), >-- mat(1,3), mat(2,3), mat(3,3), >-- }, >-- { >-- mat(1,0), mat(2,0), mat(3,0), >-- mat(1,2), mat(2,2), mat(3,2), >-- mat(1,3), mat(2,3), mat(3,3), >-- }, >-- { >-- mat(1,0), mat(2,0), mat(3,0), >-- mat(1,1), mat(2,1), mat(3,1), >-- mat(1,3), mat(2,3), mat(3,3), >-- }, >-- { >-- mat(1,0), mat(2,0), mat(3,0), >-- mat(1,1), mat(2,1), mat(3,1), >-- mat(1,2), mat(2,2), mat(3,2), >-- } >-- }; >-- >-- return + mat(0,0) * determinant(tcu::Mat3(minorMatrices[0])) >-- - mat(0,1) * determinant(tcu::Mat3(minorMatrices[1])) >-- + mat(0,2) * determinant(tcu::Mat3(minorMatrices[2])) >-- - mat(0,3) * determinant(tcu::Mat3(minorMatrices[3])); >-+ const float minorMatrices[4][3*3] = >-+ { >-+ { >-+ mat(1,1), mat(2,1), mat(3,1), >-+ mat(1,2), mat(2,2), mat(3,2), >-+ mat(1,3), mat(2,3), mat(3,3), >-+ }, >-+ { >-+ mat(1,0), mat(2,0), mat(3,0), >-+ mat(1,2), mat(2,2), mat(3,2), >-+ mat(1,3), mat(2,3), mat(3,3), >-+ }, >-+ { >-+ mat(1,0), mat(2,0), mat(3,0), >-+ mat(1,1), mat(2,1), mat(3,1), >-+ mat(1,3), mat(2,3), mat(3,3), >-+ }, >-+ { >-+ mat(1,0), mat(2,0), mat(3,0), >-+ mat(1,1), mat(2,1), mat(3,1), >-+ mat(1,2), mat(2,2), mat(3,2), >-+ } >-+ }; >-+ >-+ return + mat(0,0) * determinant(tcu::Mat3(minorMatrices[0])) >-+ - mat(0,1) * determinant(tcu::Mat3(minorMatrices[1])) >-+ + mat(0,2) * determinant(tcu::Mat3(minorMatrices[2])) >-+ - mat(0,3) * determinant(tcu::Mat3(minorMatrices[3])); >- } >- >- // Inverse >-@@ -723,120 +723,120 @@ tcu::Matrix<float, Size, Size> inverse (const tcu::Matrix<float, Size, Size>& ma >- template <> >- tcu::Matrix<float, 2, 2> inverse<2> (const tcu::Matrix<float, 2, 2>& mat) >- { >-- const float det = determinant(mat); >-- tcu::Matrix<float, 2, 2> retVal; >-+ const float det = determinant(mat); >-+ tcu::Matrix<float, 2, 2> retVal; >- >-- DE_ASSERT(det != 0.0f); >-+ DE_ASSERT(det != 0.0f); >- >-- retVal(0, 0) = mat(1, 1) / det; >-- retVal(0, 1) = -mat(0, 1) / det; >-- retVal(1, 0) = -mat(1, 0) / det; >-- retVal(1, 1) = mat(0, 0) / det; >-+ retVal(0, 0) = mat(1, 1) / det; >-+ retVal(0, 1) = -mat(0, 1) / det; >-+ retVal(1, 0) = -mat(1, 0) / det; >-+ retVal(1, 1) = mat(0, 0) / det; >- >-- return retVal; >-+ return retVal; >- } >- >- template <> >- tcu::Matrix<float, 3, 3> inverse<3> (const tcu::Matrix<float, 3, 3>& mat) >- { >-- // Blockwise inversion >-- >-- DE_ASSERT(determinant(mat) != 0.0f); >-- >-- const float areaA[2*2] = >-- { >-- mat(0,0), mat(0,1), >-- mat(1,0), mat(1,1) >-- }; >-- const float areaB[2] = >-- { >-- mat(0,2), >-- mat(1,2), >-- }; >-- const float areaC[2] = >-- { >-- mat(2,0), mat(2,1), >-- }; >-- const float areaD[1] = >-- { >-- mat(2,2) >-- }; >-- const float nullField[4] = { 0.0f }; >-- >-- const tcu::Matrix<float, 2, 2> invA = inverse(tcu::Matrix<float, 2, 2>(areaA)); >-- const tcu::Matrix<float, 2, 1> matB = tcu::Matrix<float, 2, 1>(areaB); >-- const tcu::Matrix<float, 1, 2> matC = tcu::Matrix<float, 1, 2>(areaC); >-- const tcu::Matrix<float, 1, 1> matD = tcu::Matrix<float, 1, 1>(areaD); >-- >-- const float schurComplement = 1.0f / (matD - matC*invA*matB)(0,0); >-- const tcu::Matrix<float, 2, 2> zeroMat = Mat2(nullField); >-- >-- const tcu::Matrix<float, 2, 2> blockA = invA + invA*matB*schurComplement*matC*invA; >-- const tcu::Matrix<float, 2, 1> blockB = (zeroMat-invA)*matB*schurComplement; >-- const tcu::Matrix<float, 1, 2> blockC = matC*invA*(-schurComplement); >-- const float blockD = schurComplement; >-- >-- const float result[3*3] = >-- { >-- blockA(0,0), blockA(0,1), blockB(0,0), >-- blockA(1,0), blockA(1,1), blockB(1,0), >-- blockC(0,0), blockC(0,1), blockD, >-- }; >-- >-- return Mat3(result); >-+ // Blockwise inversion >-+ >-+ DE_ASSERT(determinant(mat) != 0.0f); >-+ >-+ const float areaA[2*2] = >-+ { >-+ mat(0,0), mat(0,1), >-+ mat(1,0), mat(1,1) >-+ }; >-+ const float areaB[2] = >-+ { >-+ mat(0,2), >-+ mat(1,2), >-+ }; >-+ const float areaC[2] = >-+ { >-+ mat(2,0), mat(2,1), >-+ }; >-+ const float areaD[1] = >-+ { >-+ mat(2,2) >-+ }; >-+ const float nullField[4] = { 0.0f }; >-+ >-+ const tcu::Matrix<float, 2, 2> invA = inverse(tcu::Matrix<float, 2, 2>(areaA)); >-+ const tcu::Matrix<float, 2, 1> matB = tcu::Matrix<float, 2, 1>(areaB); >-+ const tcu::Matrix<float, 1, 2> matC = tcu::Matrix<float, 1, 2>(areaC); >-+ const tcu::Matrix<float, 1, 1> matD = tcu::Matrix<float, 1, 1>(areaD); >-+ >-+ const float schurComplement = 1.0f / (matD - matC*invA*matB)(0,0); >-+ const tcu::Matrix<float, 2, 2> zeroMat = Mat2(nullField); >-+ >-+ const tcu::Matrix<float, 2, 2> blockA = invA + invA*matB*schurComplement*matC*invA; >-+ const tcu::Matrix<float, 2, 1> blockB = (zeroMat-invA)*matB*schurComplement; >-+ const tcu::Matrix<float, 1, 2> blockC = matC*invA*(-schurComplement); >-+ const float blockD = schurComplement; >-+ >-+ const float result[3*3] = >-+ { >-+ blockA(0,0), blockA(0,1), blockB(0,0), >-+ blockA(1,0), blockA(1,1), blockB(1,0), >-+ blockC(0,0), blockC(0,1), blockD, >-+ }; >-+ >-+ return Mat3(result); >- } >- >- template <> >- tcu::Matrix<float, 4, 4> inverse<4> (const tcu::Matrix<float, 4, 4>& mat) >- { >-- // Blockwise inversion >-- >-- DE_ASSERT(determinant(mat) != 0.0f); >-- >-- const float areaA[2*2] = >-- { >-- mat(0,0), mat(0,1), >-- mat(1,0), mat(1,1) >-- }; >-- const float areaB[2*2] = >-- { >-- mat(0,2), mat(0,3), >-- mat(1,2), mat(1,3) >-- }; >-- const float areaC[2*2] = >-- { >-- mat(2,0), mat(2,1), >-- mat(3,0), mat(3,1) >-- }; >-- const float areaD[2*2] = >-- { >-- mat(2,2), mat(2,3), >-- mat(3,2), mat(3,3) >-- }; >-- const float nullField[4] = { 0.0f }; >-- >-- const tcu::Matrix<float, 2, 2> invA = inverse(Mat2(areaA)); >-- const tcu::Matrix<float, 2, 2> matB = Mat2(areaB); >-- const tcu::Matrix<float, 2, 2> matC = Mat2(areaC); >-- const tcu::Matrix<float, 2, 2> matD = Mat2(areaD); >-- >-- const tcu::Matrix<float, 2, 2> schurComplement = inverse(matD - matC*invA*matB); >-- const tcu::Matrix<float, 2, 2> zeroMat = Mat2(nullField); >-- >-- const tcu::Matrix<float, 2, 2> blockA = invA + invA*matB*schurComplement*matC*invA; >-- const tcu::Matrix<float, 2, 2> blockB = (zeroMat-invA)*matB*schurComplement; >-- const tcu::Matrix<float, 2, 2> blockC = (zeroMat-schurComplement)*matC*invA; >-- const tcu::Matrix<float, 2, 2> blockD = schurComplement; >-- >-- const float result[4*4] = >-- { >-- blockA(0,0), blockA(0,1), blockB(0,0), blockB(0,1), >-- blockA(1,0), blockA(1,1), blockB(1,0), blockB(1,1), >-- blockC(0,0), blockC(0,1), blockD(0,0), blockD(0,1), >-- blockC(1,0), blockC(1,1), blockD(1,0), blockD(1,1), >-- }; >-- >-- return Mat4(result); >-+ // Blockwise inversion >-+ >-+ DE_ASSERT(determinant(mat) != 0.0f); >-+ >-+ const float areaA[2*2] = >-+ { >-+ mat(0,0), mat(0,1), >-+ mat(1,0), mat(1,1) >-+ }; >-+ const float areaB[2*2] = >-+ { >-+ mat(0,2), mat(0,3), >-+ mat(1,2), mat(1,3) >-+ }; >-+ const float areaC[2*2] = >-+ { >-+ mat(2,0), mat(2,1), >-+ mat(3,0), mat(3,1) >-+ }; >-+ const float areaD[2*2] = >-+ { >-+ mat(2,2), mat(2,3), >-+ mat(3,2), mat(3,3) >-+ }; >-+ const float nullField[4] = { 0.0f }; >-+ >-+ const tcu::Matrix<float, 2, 2> invA = inverse(Mat2(areaA)); >-+ const tcu::Matrix<float, 2, 2> matB = Mat2(areaB); >-+ const tcu::Matrix<float, 2, 2> matC = Mat2(areaC); >-+ const tcu::Matrix<float, 2, 2> matD = Mat2(areaD); >-+ >-+ const tcu::Matrix<float, 2, 2> schurComplement = inverse(matD - matC*invA*matB); >-+ const tcu::Matrix<float, 2, 2> zeroMat = Mat2(nullField); >-+ >-+ const tcu::Matrix<float, 2, 2> blockA = invA + invA*matB*schurComplement*matC*invA; >-+ const tcu::Matrix<float, 2, 2> blockB = (zeroMat-invA)*matB*schurComplement; >-+ const tcu::Matrix<float, 2, 2> blockC = (zeroMat-schurComplement)*matC*invA; >-+ const tcu::Matrix<float, 2, 2> blockD = schurComplement; >-+ >-+ const float result[4*4] = >-+ { >-+ blockA(0,0), blockA(0,1), blockB(0,0), blockB(0,1), >-+ blockA(1,0), blockA(1,1), blockB(1,0), blockB(1,1), >-+ blockC(0,0), blockC(0,1), blockD(0,0), blockD(0,1), >-+ blockC(1,0), blockC(1,1), blockD(1,0), blockD(1,1), >-+ }; >-+ >-+ return Mat4(result); >- } >- >- // negate >-@@ -844,13 +844,13 @@ tcu::Matrix<float, 4, 4> inverse<4> (const tcu::Matrix<float, 4, 4>& mat) >- template <typename T, int Rows, int Cols> >- tcu::Matrix<T, Rows, Cols> negate (const tcu::Matrix<T, Rows, Cols>& mat) >- { >-- tcu::Matrix<T, Rows, Cols> retVal; >-+ tcu::Matrix<T, Rows, Cols> retVal; >- >-- for (int r = 0; r < Rows; ++r) >-- for (int c = 0; c < Cols; ++c) >-- retVal(r,c) = -mat(r, c); >-+ for (int r = 0; r < Rows; ++r) >-+ for (int c = 0; c < Cols; ++c) >-+ retVal(r,c) = -mat(r, c); >- >-- return retVal; >-+ return retVal; >- } >- >- // increment/decrement >-@@ -858,25 +858,25 @@ tcu::Matrix<T, Rows, Cols> negate (const tcu::Matrix<T, Rows, Cols>& mat) >- template <typename T, int Rows, int Cols> >- tcu::Matrix<T, Rows, Cols> increment (const tcu::Matrix<T, Rows, Cols>& mat) >- { >-- tcu::Matrix<T, Rows, Cols> retVal; >-+ tcu::Matrix<T, Rows, Cols> retVal; >- >-- for (int r = 0; r < Rows; ++r) >-- for (int c = 0; c < Cols; ++c) >-- retVal(r,c) = mat(r, c) + 1.0f; >-+ for (int r = 0; r < Rows; ++r) >-+ for (int c = 0; c < Cols; ++c) >-+ retVal(r,c) = mat(r, c) + 1.0f; >- >-- return retVal; >-+ return retVal; >- } >- >- template <typename T, int Rows, int Cols> >- tcu::Matrix<T, Rows, Cols> decrement (const tcu::Matrix<T, Rows, Cols>& mat) >- { >-- tcu::Matrix<T, Rows, Cols> retVal; >-+ tcu::Matrix<T, Rows, Cols> retVal; >- >-- for (int r = 0; r < Rows; ++r) >-- for (int c = 0; c < Cols; ++c) >-- retVal(r,c) = mat(r, c) - 1.0f; >-+ for (int r = 0; r < Rows; ++r) >-+ for (int c = 0; c < Cols; ++c) >-+ retVal(r,c) = mat(r, c) - 1.0f; >- >-- return retVal; >-+ return retVal; >- } >- >- // Evaluator template. >-@@ -889,423 +889,423 @@ struct Evaluator; >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_ADD, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-- : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-- evalCtx.color.xyz() = reduceToVec3(in0 + in1); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-+ : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-+ evalCtx.color.xyz() = reduceToVec3(in0 + in1); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_SUB, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-- : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-- evalCtx.color.xyz() = reduceToVec3(in0 - in1); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-+ : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-+ evalCtx.color.xyz() = reduceToVec3(in0 - in1); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_MUL, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-- : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-- evalCtx.color.xyz() = reduceToVec3(in0 * in1); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-+ : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-+ evalCtx.color.xyz() = reduceToVec3(in0 * in1); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_DIV, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-- : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-- evalCtx.color.xyz() = reduceToVec3(in0 / in1); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-+ : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-+ evalCtx.color.xyz() = reduceToVec3(in0 / in1); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_COMP_MUL, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-- : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-- evalCtx.color.xyz() = reduceToVec3(matrixCompMult(in0, in1)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-+ : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-+ evalCtx.color.xyz() = reduceToVec3(matrixCompMult(in0, in1)); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_OUTER_PRODUCT, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-- : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-- evalCtx.color.xyz() = reduceToVec3(outerProduct(in0, in1)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-+ : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-+ evalCtx.color.xyz() = reduceToVec3(outerProduct(in0, in1)); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_TRANSPOSE, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- DE_UNREF(in1Type); >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- evalCtx.color.xyz() = reduceToVec3(transpose(in0)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ DE_UNREF(in1Type); >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ evalCtx.color.xyz() = reduceToVec3(transpose(in0)); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_INVERSE, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- DE_UNREF(in1Type); >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- evalCtx.color.xyz() = reduceToVec3(inverse(in0)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ DE_UNREF(in1Type); >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ evalCtx.color.xyz() = reduceToVec3(inverse(in0)); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_DETERMINANT, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- DE_UNREF(in1Type); >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- evalCtx.color.xyz() = Vec3(determinant(in0)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ DE_UNREF(in1Type); >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ evalCtx.color.xyz() = Vec3(determinant(in0)); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_UNARY_PLUS, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- DE_UNREF(in1Type); >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- evalCtx.color.xyz() = reduceToVec3(in0); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ DE_UNREF(in1Type); >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ evalCtx.color.xyz() = reduceToVec3(in0); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_NEGATION, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- DE_UNREF(in1Type); >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- evalCtx.color.xyz() = reduceToVec3(negate(in0)); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ DE_UNREF(in1Type); >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ evalCtx.color.xyz() = reduceToVec3(negate(in0)); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_PRE_INCREMENT, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- DE_UNREF(in1Type); >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ DE_UNREF(in1Type); >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >- >-- // modifying reduction: sum modified value too >-- evalCtx.color.xyz() = reduceToVec3(increment(in0)) + reduceToVec3(increment(in0)); >-- } >-+ // modifying reduction: sum modified value too >-+ evalCtx.color.xyz() = reduceToVec3(increment(in0)) + reduceToVec3(increment(in0)); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_PRE_DECREMENT, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- DE_UNREF(in1Type); >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ DE_UNREF(in1Type); >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >- >-- // modifying reduction: sum modified value too >-- evalCtx.color.xyz() = reduceToVec3(decrement(in0)) + reduceToVec3(decrement(in0)); >-- } >-+ // modifying reduction: sum modified value too >-+ evalCtx.color.xyz() = reduceToVec3(decrement(in0)) + reduceToVec3(decrement(in0)); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_POST_INCREMENT, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- DE_UNREF(in1Type); >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ DE_UNREF(in1Type); >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >- >-- // modifying reduction: sum modified value too >-- evalCtx.color.xyz() = reduceToVec3(in0) + reduceToVec3(increment(in0)); >-- } >-+ // modifying reduction: sum modified value too >-+ evalCtx.color.xyz() = reduceToVec3(in0) + reduceToVec3(increment(in0)); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_POST_DECREMENT, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- DE_UNREF(in1Type); >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ DE_UNREF(in1Type); >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >- >-- // modifying reduction: sum modified value too >-- evalCtx.color.xyz() = reduceToVec3(in0) + reduceToVec3(decrement(in0)); >-- } >-+ // modifying reduction: sum modified value too >-+ evalCtx.color.xyz() = reduceToVec3(in0) + reduceToVec3(decrement(in0)); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_ADD_INTO, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-- : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-- evalCtx.color.xyz() = reduceToVec3(in0 + in1); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-+ : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-+ evalCtx.color.xyz() = reduceToVec3(in0 + in1); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_SUBTRACT_FROM, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-- : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-- evalCtx.color.xyz() = reduceToVec3(in0 - in1); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-+ : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-+ evalCtx.color.xyz() = reduceToVec3(in0 - in1); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_MULTIPLY_INTO, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-- : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-- evalCtx.color.xyz() = reduceToVec3(in0 * in1); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-+ : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-+ evalCtx.color.xyz() = reduceToVec3(in0 * in1); >-+ } >- }; >- >- template <int In0DataType, int In1DataType> >- struct Evaluator<OP_DIVIDE_INTO, In0DataType, In1DataType> >- { >-- static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-- { >-- typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-- : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-- typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-- : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-- evalCtx.color.xyz() = reduceToVec3(in0 / in1); >-- } >-+ static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) >-+ { >-+ typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) >-+ : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); >-+ typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) >-+ : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); >-+ evalCtx.color.xyz() = reduceToVec3(in0 / in1); >-+ } >- }; >- >- MatrixShaderEvalFunc getEvalFunc (const ShaderInput& in0, const ShaderInput& in1, MatrixOp op) >- { >-- // Evaluator is selected based on op and input data types. >-- // For efficient lookup the types and op enums are packed together to form a 19-bit key: >-- // [18..14 OP] [13..7 TYPE0] [6..0 TYPE1] >-- >-- DE_STATIC_ASSERT(TYPE_LAST <= (1<<7)); >-- DE_STATIC_ASSERT(OP_LAST <= (1<<5)); >-- >--#define PACK_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE) (((OP) << 14) | ((IN0DATATYPE) << 7) | (IN1DATATYPE)) >-- >--#define MAKE_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE) \ >-- case PACK_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE): \ >-- return Evaluator<OP, IN0DATATYPE, IN1DATATYPE>::evaluate >-- >--#define MAKE_SCALAR_OPS(IN0DATATYPE, IN1DATATYPE) \ >-- MAKE_EVAL_CASE(OP_ADD, IN0DATATYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_SUB, IN0DATATYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_MUL, IN0DATATYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_DIV, IN0DATATYPE, IN1DATATYPE) >-- >--#define MAKE_CWISE_OPS(IN0DATATYPE, IN1DATATYPE) \ >-- MAKE_EVAL_CASE(OP_ADD, IN0DATATYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_SUB, IN0DATATYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_DIV, IN0DATATYPE, IN1DATATYPE); \ >-- MAKE_EVAL_CASE(OP_COMP_MUL, IN0DATATYPE, IN1DATATYPE) >-- >--#define MAKE_MUL_OP(IN0DATATYPE, IN1DATATYPE) \ >-- MAKE_EVAL_CASE(OP_MUL, IN0DATATYPE, IN1DATATYPE) >-- >--#define MAKE_VECVEC_OP(IN0DATATYPE, IN1DATATYPE) \ >-- MAKE_EVAL_CASE(OP_OUTER_PRODUCT, IN0DATATYPE, IN1DATATYPE) >-- >--#define MAKE_UNARY_OP(IN0DATATYPE) \ >-- MAKE_EVAL_CASE(OP_TRANSPOSE, IN0DATATYPE, TYPE_LAST); \ >-- MAKE_EVAL_CASE(OP_UNARY_PLUS, IN0DATATYPE, TYPE_LAST); \ >-- MAKE_EVAL_CASE(OP_NEGATION, IN0DATATYPE, TYPE_LAST); \ >-- MAKE_EVAL_CASE(OP_PRE_INCREMENT, IN0DATATYPE, TYPE_LAST); \ >-- MAKE_EVAL_CASE(OP_PRE_DECREMENT, IN0DATATYPE, TYPE_LAST); \ >-- MAKE_EVAL_CASE(OP_POST_INCREMENT, IN0DATATYPE, TYPE_LAST); \ >-- MAKE_EVAL_CASE(OP_POST_DECREMENT, IN0DATATYPE, TYPE_LAST) >-- >--#define MAKE_UNARY_SYMMETRIC_OP(IN0DATATYPE) \ >-- MAKE_UNARY_OP(IN0DATATYPE); \ >-- MAKE_EVAL_CASE(OP_DETERMINANT, IN0DATATYPE, TYPE_LAST); \ >-- MAKE_EVAL_CASE(OP_INVERSE, IN0DATATYPE, TYPE_LAST) >-- >--#define MAKE_ASSIGNMENT_OP(IN0DATATYPE) \ >-- MAKE_EVAL_CASE(OP_ADD_INTO, IN0DATATYPE, IN0DATATYPE); \ >-- MAKE_EVAL_CASE(OP_SUBTRACT_FROM, IN0DATATYPE, IN0DATATYPE); \ >-- MAKE_EVAL_CASE(OP_DIVIDE_INTO, IN0DATATYPE, IN0DATATYPE) >-- >--#define MAKE_ASSIGNMENT_SYMMETRIC_OP(IN0DATATYPE) \ >-- MAKE_ASSIGNMENT_OP(IN0DATATYPE); \ >-- MAKE_EVAL_CASE(OP_MULTIPLY_INTO, IN0DATATYPE, IN0DATATYPE) >-- >-- switch (PACK_EVAL_CASE(op, in0.dataType, in1.dataType)) >-- { >-- // Matrix-scalar. >-- MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2, TYPE_FLOAT); >-- MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2X3, TYPE_FLOAT); >-- MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2X4, TYPE_FLOAT); >-- MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3X2, TYPE_FLOAT); >-- MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3, TYPE_FLOAT); >-- MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3X4, TYPE_FLOAT); >-- MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4X2, TYPE_FLOAT); >-- MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4X3, TYPE_FLOAT); >-- MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4, TYPE_FLOAT); >-- >-- // Matrix-vector. >-- MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_VEC2); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_VEC2); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_VEC2); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_VEC3); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_VEC3); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_VEC3); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_VEC4); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_VEC4); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_VEC4); >-- >-- // Vector-matrix. >-- MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT2); >-- MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT2X3); >-- MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT2X4); >-- MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT3X2); >-- MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT3); >-- MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT3X4); >-- MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT4X2); >-- MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT4X3); >-- MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT4); >-- >-- // Matrix-matrix. >-- MAKE_CWISE_OPS(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT2); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT2); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT3X2); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT4X2); >-- >-- MAKE_CWISE_OPS(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT2X3); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT2); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT3X2); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT4X2); >-- >-- MAKE_CWISE_OPS(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT2X4); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT2); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT3X2); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT4X2); >-- >-- MAKE_CWISE_OPS(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT3X2); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT2X3); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT3); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT4X3); >-- >-- MAKE_CWISE_OPS(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT3); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT2X3); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT3); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT4X3); >-- >-- MAKE_CWISE_OPS(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT3X4); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT2X3); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT3); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT4X3); >-- >-- MAKE_CWISE_OPS(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT4X2); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT2X4); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT3X4); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT4); >-- >-- MAKE_CWISE_OPS(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT4X3); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT2X4); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT3X4); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT4); >-- >-- MAKE_CWISE_OPS(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT4); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT2X4); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT3X4); >-- MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT4); >-- >-- // Vector-vector. >-- MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC2); >-- MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC3); >-- MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC4); >-- MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC2); >-- MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC3); >-- MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC4); >-- MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC2); >-- MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC3); >-- MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC4); >-- >-- // Unary Matrix. >-- MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT2); >-- MAKE_UNARY_OP(TYPE_FLOAT_MAT2X3); >-- MAKE_UNARY_OP(TYPE_FLOAT_MAT2X4); >-- MAKE_UNARY_OP(TYPE_FLOAT_MAT3X2); >-- MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT3); >-- MAKE_UNARY_OP(TYPE_FLOAT_MAT3X4); >-- MAKE_UNARY_OP(TYPE_FLOAT_MAT4X2); >-- MAKE_UNARY_OP(TYPE_FLOAT_MAT4X3); >-- MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT4); >-- >-- // Assignments >-- MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT2); >-- MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT2X3); >-- MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT2X4); >-- MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT3X2); >-- MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT3); >-- MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT3X4); >-- MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT4X2); >-- MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT4X3); >-- MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT4); >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- return DE_NULL; >-- } >-+ // Evaluator is selected based on op and input data types. >-+ // For efficient lookup the types and op enums are packed together to form a 19-bit key: >-+ // [18..14 OP] [13..7 TYPE0] [6..0 TYPE1] >-+ >-+ DE_STATIC_ASSERT(TYPE_LAST <= (1<<7)); >-+ DE_STATIC_ASSERT(OP_LAST <= (1<<5)); >-+ >-+#define PACK_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE) (((OP) << 14) | ((IN0DATATYPE) << 7) | (IN1DATATYPE)) >-+ >-+#define MAKE_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE) \ >-+ case PACK_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE): \ >-+ return Evaluator<OP, IN0DATATYPE, IN1DATATYPE>::evaluate >-+ >-+#define MAKE_SCALAR_OPS(IN0DATATYPE, IN1DATATYPE) \ >-+ MAKE_EVAL_CASE(OP_ADD, IN0DATATYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_SUB, IN0DATATYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_MUL, IN0DATATYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_DIV, IN0DATATYPE, IN1DATATYPE) >-+ >-+#define MAKE_CWISE_OPS(IN0DATATYPE, IN1DATATYPE) \ >-+ MAKE_EVAL_CASE(OP_ADD, IN0DATATYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_SUB, IN0DATATYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_DIV, IN0DATATYPE, IN1DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_COMP_MUL, IN0DATATYPE, IN1DATATYPE) >-+ >-+#define MAKE_MUL_OP(IN0DATATYPE, IN1DATATYPE) \ >-+ MAKE_EVAL_CASE(OP_MUL, IN0DATATYPE, IN1DATATYPE) >-+ >-+#define MAKE_VECVEC_OP(IN0DATATYPE, IN1DATATYPE) \ >-+ MAKE_EVAL_CASE(OP_OUTER_PRODUCT, IN0DATATYPE, IN1DATATYPE) >-+ >-+#define MAKE_UNARY_OP(IN0DATATYPE) \ >-+ MAKE_EVAL_CASE(OP_TRANSPOSE, IN0DATATYPE, TYPE_LAST); \ >-+ MAKE_EVAL_CASE(OP_UNARY_PLUS, IN0DATATYPE, TYPE_LAST); \ >-+ MAKE_EVAL_CASE(OP_NEGATION, IN0DATATYPE, TYPE_LAST); \ >-+ MAKE_EVAL_CASE(OP_PRE_INCREMENT, IN0DATATYPE, TYPE_LAST); \ >-+ MAKE_EVAL_CASE(OP_PRE_DECREMENT, IN0DATATYPE, TYPE_LAST); \ >-+ MAKE_EVAL_CASE(OP_POST_INCREMENT, IN0DATATYPE, TYPE_LAST); \ >-+ MAKE_EVAL_CASE(OP_POST_DECREMENT, IN0DATATYPE, TYPE_LAST) >-+ >-+#define MAKE_UNARY_SYMMETRIC_OP(IN0DATATYPE) \ >-+ MAKE_UNARY_OP(IN0DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_DETERMINANT, IN0DATATYPE, TYPE_LAST); \ >-+ MAKE_EVAL_CASE(OP_INVERSE, IN0DATATYPE, TYPE_LAST) >-+ >-+#define MAKE_ASSIGNMENT_OP(IN0DATATYPE) \ >-+ MAKE_EVAL_CASE(OP_ADD_INTO, IN0DATATYPE, IN0DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_SUBTRACT_FROM, IN0DATATYPE, IN0DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_DIVIDE_INTO, IN0DATATYPE, IN0DATATYPE) >-+ >-+#define MAKE_ASSIGNMENT_SYMMETRIC_OP(IN0DATATYPE) \ >-+ MAKE_ASSIGNMENT_OP(IN0DATATYPE); \ >-+ MAKE_EVAL_CASE(OP_MULTIPLY_INTO, IN0DATATYPE, IN0DATATYPE) >-+ >-+ switch (PACK_EVAL_CASE(op, in0.dataType, in1.dataType)) >-+ { >-+ // Matrix-scalar. >-+ MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2, TYPE_FLOAT); >-+ MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2X3, TYPE_FLOAT); >-+ MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2X4, TYPE_FLOAT); >-+ MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3X2, TYPE_FLOAT); >-+ MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3, TYPE_FLOAT); >-+ MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3X4, TYPE_FLOAT); >-+ MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4X2, TYPE_FLOAT); >-+ MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4X3, TYPE_FLOAT); >-+ MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4, TYPE_FLOAT); >-+ >-+ // Matrix-vector. >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_VEC2); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_VEC2); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_VEC2); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_VEC3); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_VEC3); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_VEC3); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_VEC4); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_VEC4); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_VEC4); >-+ >-+ // Vector-matrix. >-+ MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT2); >-+ MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT2X3); >-+ MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT2X4); >-+ MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT3X2); >-+ MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT3); >-+ MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT3X4); >-+ MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT4X2); >-+ MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT4X3); >-+ MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT4); >-+ >-+ // Matrix-matrix. >-+ MAKE_CWISE_OPS(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT2); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT2); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT3X2); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT4X2); >-+ >-+ MAKE_CWISE_OPS(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT2X3); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT2); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT3X2); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT4X2); >-+ >-+ MAKE_CWISE_OPS(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT2X4); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT2); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT3X2); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT4X2); >-+ >-+ MAKE_CWISE_OPS(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT3X2); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT2X3); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT3); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT4X3); >-+ >-+ MAKE_CWISE_OPS(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT3); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT2X3); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT3); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT4X3); >-+ >-+ MAKE_CWISE_OPS(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT3X4); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT2X3); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT3); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT4X3); >-+ >-+ MAKE_CWISE_OPS(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT4X2); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT2X4); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT3X4); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT4); >-+ >-+ MAKE_CWISE_OPS(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT4X3); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT2X4); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT3X4); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT4); >-+ >-+ MAKE_CWISE_OPS(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT4); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT2X4); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT3X4); >-+ MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT4); >-+ >-+ // Vector-vector. >-+ MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC2); >-+ MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC3); >-+ MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC4); >-+ MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC2); >-+ MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC3); >-+ MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC4); >-+ MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC2); >-+ MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC3); >-+ MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC4); >-+ >-+ // Unary Matrix. >-+ MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT2); >-+ MAKE_UNARY_OP(TYPE_FLOAT_MAT2X3); >-+ MAKE_UNARY_OP(TYPE_FLOAT_MAT2X4); >-+ MAKE_UNARY_OP(TYPE_FLOAT_MAT3X2); >-+ MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT3); >-+ MAKE_UNARY_OP(TYPE_FLOAT_MAT3X4); >-+ MAKE_UNARY_OP(TYPE_FLOAT_MAT4X2); >-+ MAKE_UNARY_OP(TYPE_FLOAT_MAT4X3); >-+ MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT4); >-+ >-+ // Assignments >-+ MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT2); >-+ MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT2X3); >-+ MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT2X4); >-+ MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT3X2); >-+ MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT3); >-+ MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT3X4); >-+ MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT4X2); >-+ MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT4X3); >-+ MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT4); >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ return DE_NULL; >-+ } >- >- #undef PACK_EVAL_CASE >- #undef MAKE_EVAL_CASE >-@@ -1320,35 +1320,35 @@ MatrixShaderEvalFunc getEvalFunc (const ShaderInput& in0, const ShaderInput& in1 >- template <int Size> >- void writeVectorConstructor (std::ostream& str, const tcu::Vector<float, Size>& v) >- { >-- str << "vec" << Size << "("; >-- for (int ndx = 0; ndx < Size; ndx++) >-- { >-- if (ndx != 0) >-- str << ", "; >-- str << de::floatToString(v[ndx], 1); >-- } >-- str << ")"; >-+ str << "vec" << Size << "("; >-+ for (int ndx = 0; ndx < Size; ndx++) >-+ { >-+ if (ndx != 0) >-+ str << ", "; >-+ str << de::floatToString(v[ndx], 1); >-+ } >-+ str << ")"; >- } >- >- template <int Cols, int Rows> >- void writeMatrixConstructor (std::ostream& str, const tcu::Matrix<float, Rows, Cols>& m) >- { >-- if (Rows == Cols) >-- str << "mat" << Cols; >-- else >-- str << "mat" << Cols << "x" << Rows; >-- >-- str << "("; >-- for (int colNdx = 0; colNdx < Cols; colNdx++) >-- { >-- for (int rowNdx = 0; rowNdx < Rows; rowNdx++) >-- { >-- if (rowNdx > 0 || colNdx > 0) >-- str << ", "; >-- str << de::floatToString(m(rowNdx, colNdx), 1); >-- } >-- } >-- str << ")"; >-+ if (Rows == Cols) >-+ str << "mat" << Cols; >-+ else >-+ str << "mat" << Cols << "x" << Rows; >-+ >-+ str << "("; >-+ for (int colNdx = 0; colNdx < Cols; colNdx++) >-+ { >-+ for (int rowNdx = 0; rowNdx < Rows; rowNdx++) >-+ { >-+ if (rowNdx > 0 || colNdx > 0) >-+ str << ", "; >-+ str << de::floatToString(m(rowNdx, colNdx), 1); >-+ } >-+ } >-+ str << ")"; >- } >- >- } // MatrixCaseUtils >-@@ -1358,53 +1358,53 @@ using namespace MatrixCaseUtils; >- class MatrixShaderEvaluator : public ShaderEvaluator >- { >- public: >-- MatrixShaderEvaluator (MatrixShaderEvalFunc evalFunc, InputType inType0, InputType inType1); >-+ MatrixShaderEvaluator (MatrixShaderEvalFunc evalFunc, InputType inType0, InputType inType1); >- >-- virtual void evaluate (ShaderEvalContext& evalCtx); >-+ virtual void evaluate (ShaderEvalContext& evalCtx); >- >- private: >-- MatrixShaderEvalFunc m_matEvalFunc; >-- InputType m_inType0; >-- InputType m_inType1; >-+ MatrixShaderEvalFunc m_matEvalFunc; >-+ InputType m_inType0; >-+ InputType m_inType1; >- }; >- >- MatrixShaderEvaluator::MatrixShaderEvaluator (MatrixShaderEvalFunc evalFunc, InputType inType0, InputType inType1) >-- : m_matEvalFunc (evalFunc) >-- , m_inType0 (inType0) >-- , m_inType1 (inType1) >-+ : m_matEvalFunc (evalFunc) >-+ , m_inType0 (inType0) >-+ , m_inType1 (inType1) >- { >- } >- >- void MatrixShaderEvaluator::evaluate (ShaderEvalContext& evalCtx) >- { >-- m_matEvalFunc(evalCtx, m_inType0, m_inType1); >-+ m_matEvalFunc(evalCtx, m_inType0, m_inType1); >- } >- >- class ShaderMatrixCase : public ShaderRenderCase >- { >- public: >-- ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase); >-- ~ShaderMatrixCase (void); >-+ ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase); >-+ ~ShaderMatrixCase (void); >- >-- void init (void); >-+ void init (void); >- >- protected: >-- std::string genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName); >-- void setupUniforms (int programID, const tcu::Vec4& constCoords); >-+ std::string genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName); >-+ void setupUniforms (int programID, const tcu::Vec4& constCoords); >- >- private: >-- ShaderInput m_in0; >-- ShaderInput m_in1; >-- MatrixOp m_op; >-- MatrixShaderEvaluator m_matEvaluator; >-+ ShaderInput m_in0; >-+ ShaderInput m_in1; >-+ MatrixOp m_op; >-+ MatrixShaderEvaluator m_matEvaluator; >- }; >- >- ShaderMatrixCase::ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase) >-- : ShaderRenderCase (context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc, isVertexCase, m_matEvaluator) >-- , m_in0 (in0) >-- , m_in1 (in1) >-- , m_op (op) >-- , m_matEvaluator (getEvalFunc(in0, in1, op), in0.inputType, in1.inputType) >-+ : ShaderRenderCase (context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc, isVertexCase, m_matEvaluator) >-+ , m_in0 (in0) >-+ , m_in1 (in1) >-+ , m_op (op) >-+ , m_matEvaluator (getEvalFunc(in0, in1, op), in0.inputType, in1.inputType) >- { >- } >- >-@@ -1414,374 +1414,374 @@ ShaderMatrixCase::~ShaderMatrixCase (void) >- >- void ShaderMatrixCase::init (void) >- { >-- std::ostringstream vtx; >-- std::ostringstream frag; >-- std::ostringstream& op = m_isVertexCase ? vtx : frag; >-- >-- bool isInDynMat0 = isDataTypeMatrix(m_in0.dataType) && m_in0.inputType == INPUTTYPE_DYNAMIC; >-- bool isInDynMat1 = isDataTypeMatrix(m_in1.dataType) && m_in1.inputType == INPUTTYPE_DYNAMIC; >-- string inValue0; >-- string inValue1; >-- DataType resultType = TYPE_LAST; >-- Precision resultPrec = m_in0.precision; >-- vector<string> passVars; >-- int numInputs = (isOperationBinary(m_op)) ? (2) : (1); >-- >-- std::string operationValue0; >-- std::string operationValue1; >-- >-- DE_ASSERT(!isInDynMat0 || !isInDynMat1); // Only single dynamic matrix input is allowed. >-- DE_UNREF(isInDynMat0 && isInDynMat1); >-- >-- // Compute result type. >-- if (m_op == OP_MUL && isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) >-- { >-- resultType = getDataTypeMatrix(getDataTypeMatrixNumColumns(m_in1.dataType), getDataTypeMatrixNumRows(m_in0.dataType)); >-- } >-- else if (m_op == OP_OUTER_PRODUCT) >-- { >-- resultType = getDataTypeMatrix(getDataTypeScalarSize(m_in1.dataType), getDataTypeScalarSize(m_in0.dataType)); >-- } >-- else if (m_op == OP_TRANSPOSE) >-- { >-- resultType = getDataTypeMatrix(getDataTypeMatrixNumRows(m_in0.dataType), getDataTypeMatrixNumColumns(m_in0.dataType)); >-- } >-- else if (m_op == OP_INVERSE) >-- { >-- resultType = m_in0.dataType; >-- } >-- else if (m_op == OP_DETERMINANT) >-- { >-- resultType = TYPE_FLOAT; >-- } >-- else if (getOperationType(m_op) == OPERATIONTYPE_UNARY_PREFIX_OPERATOR || >-- getOperationType(m_op) == OPERATIONTYPE_UNARY_POSTFIX_OPERATOR) >-- { >-- resultType = m_in0.dataType; >-- } >-- else if (isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) >-- { >-- DE_ASSERT(m_in0.dataType == m_in1.dataType); >-- resultType = m_in0.dataType; >-- } >-- else if (isDataTypeMatrix(m_in0.dataType) || isDataTypeMatrix(m_in1.dataType)) >-- { >-- int matNdx = isDataTypeMatrix(m_in0.dataType) ? 0 : 1; >-- DataType matrixType = matNdx == 0 ? m_in0.dataType : m_in1.dataType; >-- DataType otherType = matNdx == 0 ? m_in1.dataType : m_in0.dataType; >-- >-- if (otherType == TYPE_FLOAT) >-- resultType = matrixType; >-- else >-- { >-- DE_ASSERT(isDataTypeVector(otherType)); >-- resultType = getDataTypeFloatVec(matNdx == 0 ? getDataTypeMatrixNumRows(matrixType) : getDataTypeMatrixNumColumns(matrixType)); >-- } >-- } >-- else >-- { >-- DE_ASSERT(DE_FALSE); >-- } >-- >-- vtx << "#version 300 es\n"; >-- frag << "#version 300 es\n"; >-- >-- vtx << "in highp vec4 a_position;\n"; >-- frag << "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"; >-- if (m_isVertexCase) >-- { >-- vtx << "out mediump vec4 v_color;\n"; >-- frag << "in mediump vec4 v_color;\n"; >-- } >-- >-- // Input declarations. >-- for (int inNdx = 0; inNdx < numInputs; inNdx++) >-- { >-- const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; >-- const char* precName = getPrecisionName(in.precision); >-- const char* typeName = getDataTypeName(in.dataType); >-- string& inValue = inNdx > 0 ? inValue1 : inValue0; >-- >-- if (in.inputType == INPUTTYPE_DYNAMIC) >-- { >-- vtx << "in " << precName << " " << typeName << " a_"; >-- >-- if (isDataTypeMatrix(in.dataType)) >-- { >-- // a_matN, v_matN >-- vtx << typeName << ";\n"; >-- if (!m_isVertexCase) >-- { >-- vtx << "out " << precName << " " << typeName << " v_" << typeName << ";\n"; >-- frag << "in " << precName << " " << typeName << " v_" << typeName << ";\n"; >-- passVars.push_back(typeName); >-- } >-- >-- inValue = string(m_isVertexCase ? "a_" : "v_") + getDataTypeName(in.dataType); >-- } >-- else >-- { >-- // a_coords, v_coords >-- vtx << "coords;\n"; >-- if (!m_isVertexCase) >-- { >-- vtx << "out " << precName << " " << typeName << " v_coords;\n"; >-- frag << "in " << precName << " " << typeName << " v_coords;\n"; >-- passVars.push_back("coords"); >-- } >-- >-- inValue = m_isVertexCase ? "a_coords" : "v_coords"; >-- } >-- } >-- else if (in.inputType == INPUTTYPE_UNIFORM) >-- { >-- op << "uniform " << precName << " " << typeName << " u_in" << inNdx << ";\n"; >-- inValue = string("u_in") + de::toString(inNdx); >-- } >-- else if (in.inputType == INPUTTYPE_CONST) >-- { >-- op << "const " << precName << " " << typeName << " in" << inNdx << " = "; >-- >-- // Generate declaration. >-- switch (in.dataType) >-- { >-- case TYPE_FLOAT: op << de::floatToString(s_constInFloat[inNdx], 1); break; >-- case TYPE_FLOAT_VEC2: writeVectorConstructor<2>(op, s_constInVec2[inNdx]); break; >-- case TYPE_FLOAT_VEC3: writeVectorConstructor<3>(op, s_constInVec3[inNdx]); break; >-- case TYPE_FLOAT_VEC4: writeVectorConstructor<4>(op, s_constInVec4[inNdx]); break; >-- case TYPE_FLOAT_MAT2: writeMatrixConstructor<2, 2>(op, Mat2(s_constInMat2x2[inNdx])); break; >-- case TYPE_FLOAT_MAT2X3: writeMatrixConstructor<2, 3>(op, Mat2x3(s_constInMat2x3[inNdx])); break; >-- case TYPE_FLOAT_MAT2X4: writeMatrixConstructor<2, 4>(op, Mat2x4(s_constInMat2x4[inNdx])); break; >-- case TYPE_FLOAT_MAT3X2: writeMatrixConstructor<3, 2>(op, Mat3x2(s_constInMat3x2[inNdx])); break; >-- case TYPE_FLOAT_MAT3: writeMatrixConstructor<3, 3>(op, Mat3(s_constInMat3x3[inNdx])); break; >-- case TYPE_FLOAT_MAT3X4: writeMatrixConstructor<3, 4>(op, Mat3x4(s_constInMat3x4[inNdx])); break; >-- case TYPE_FLOAT_MAT4X2: writeMatrixConstructor<4, 2>(op, Mat4x2(s_constInMat4x2[inNdx])); break; >-- case TYPE_FLOAT_MAT4X3: writeMatrixConstructor<4, 3>(op, Mat4x3(s_constInMat4x3[inNdx])); break; >-- case TYPE_FLOAT_MAT4: writeMatrixConstructor<4, 4>(op, Mat4(s_constInMat4x4[inNdx])); break; >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- } >-- >-- op << ";\n"; >-- >-- inValue = string("in") + de::toString(inNdx); >-- } >-- } >-- >-- vtx << "\n" >-- << "void main (void)\n" >-- << "{\n" >-- << " gl_Position = a_position;\n"; >-- frag << "\n" >-- << "void main (void)\n" >-- << "{\n"; >-- >-- if (m_isVertexCase) >-- frag << " dEQP_FragColor = v_color;\n"; >-- else >-- { >-- for (vector<string>::const_iterator copyIter = passVars.begin(); copyIter != passVars.end(); copyIter++) >-- vtx << " v_" << *copyIter << " = " << "a_" << *copyIter << ";\n"; >-- } >-- >-- // Operation. >-- >-- switch (getOperationNature(m_op)) >-- { >-- case OPERATIONNATURE_PURE: >-- DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); >-- >-- operationValue0 = inValue0; >-- operationValue1 = inValue1; >-- break; >-- >-- case OPERATIONNATURE_MUTATING: >-- DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); >-- >-- op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " tmpValue = " << inValue0 << ";\n"; >-- >-- operationValue0 = "tmpValue"; >-- operationValue1 = inValue1; >-- break; >-- >-- case OPERATIONNATURE_ASSIGNMENT: >-- DE_ASSERT(getOperationType(m_op) == OPERATIONTYPE_ASSIGNMENT); >-- >-- operationValue0 = inValue0; >-- operationValue1 = inValue1; >-- break; >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- } >-- >-- switch (getOperationType(m_op)) >-- { >-- case OPERATIONTYPE_BINARY_OPERATOR: >-- op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << " " << getOperationName(m_op) << " " << operationValue1 << ";\n"; >-- break; >-- >-- case OPERATIONTYPE_UNARY_PREFIX_OPERATOR: >-- op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << operationValue0 << ";\n"; >-- break; >-- >-- case OPERATIONTYPE_UNARY_POSTFIX_OPERATOR: >-- op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << getOperationName(m_op) << ";\n"; >-- break; >-- >-- case OPERATIONTYPE_BINARY_FUNCTION: >-- op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ", " << operationValue1 << ");\n"; >-- break; >-- >-- case OPERATIONTYPE_UNARY_FUNCTION: >-- op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ");\n"; >-- break; >-- >-- case OPERATIONTYPE_ASSIGNMENT: >-- op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << ";\n"; >-- op << " res " << getOperationName(m_op) << " " << operationValue1 << ";\n"; >-- break; >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- } >-- >-- // Reduction to vec3 (rgb). Check the used value too if it was modified >-- op << " " << (m_isVertexCase ? "v_color" : "dEQP_FragColor") << " = "; >-- >-- if (isOperationValueModifying(m_op)) >-- op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0) + vec4(" << genGLSLMatToVec3Reduction(resultType, "tmpValue") << ", 0.0);\n"; >-- else >-- op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0);\n"; >-- >-- vtx << "}\n"; >-- frag << "}\n"; >-- >-- m_vertShaderSource = vtx.str(); >-- m_fragShaderSource = frag.str(); >-- >-- // \todo [2012-02-14 pyry] Compute better values for matrix tests. >-- m_userAttribTransforms.resize(4); >-- for (int attribNdx = 0; attribNdx < 4; attribNdx++) >-- { >-- m_userAttribTransforms[attribNdx] = Mat4(0.0f); >-- m_userAttribTransforms[attribNdx]( 0, 3) = 0.2f; // !< prevent matrix*vec from going into zero (assuming vec.w != 0) >-- m_userAttribTransforms[attribNdx]( 1, 3) = 0.1f; // !< >-- m_userAttribTransforms[attribNdx]( 2, 3) = 0.4f + 0.15f * float(attribNdx); // !< >-- m_userAttribTransforms[attribNdx]( 3, 3) = 0.7f; // !< >-- m_userAttribTransforms[attribNdx]((0 + attribNdx) % 4, 0) = 1.0f; >-- m_userAttribTransforms[attribNdx]((1 + attribNdx) % 4, 1) = 1.0f; >-- m_userAttribTransforms[attribNdx]((2 + attribNdx) % 4, 2) = 1.0f; >-- m_userAttribTransforms[attribNdx]((3 + attribNdx) % 4, 3) = 1.0f; >-- } >-- >-- // prevent bad reference cases such as black result images by fine-tuning used matrices >-- if (getOperationTestMatrixType(m_op) != TESTMATRIXTYPE_DEFAULT) >-- { >-- for (int attribNdx = 0; attribNdx < 4; attribNdx++) >-- { >-- for (int row = 0; row < 4; row++) >-- for (int col = 0; col < 4; col++) >-- { >-- switch (getOperationTestMatrixType(m_op)) >-- { >-- case TESTMATRIXTYPE_NEGATED: >-- m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col); >-- break; >-- case TESTMATRIXTYPE_INCREMENTED: >-- m_userAttribTransforms[attribNdx](row, col) += 0.3f; >-- break; >-- case TESTMATRIXTYPE_DECREMENTED: >-- m_userAttribTransforms[attribNdx](row, col) -= 0.3f; >-- break; >-- case TESTMATRIXTYPE_NEGATED_INCREMENTED: >-- m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col) + 0.3f; >-- break; >-- case TESTMATRIXTYPE_INCREMENTED_LESS: >-- m_userAttribTransforms[attribNdx](row, col) -= 0.1f; >-- break; >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- break; >-- } >-- } >-- } >-- } >-- >-- ShaderRenderCase::init(); >-+ std::ostringstream vtx; >-+ std::ostringstream frag; >-+ std::ostringstream& op = m_isVertexCase ? vtx : frag; >-+ >-+ bool isInDynMat0 = isDataTypeMatrix(m_in0.dataType) && m_in0.inputType == INPUTTYPE_DYNAMIC; >-+ bool isInDynMat1 = isDataTypeMatrix(m_in1.dataType) && m_in1.inputType == INPUTTYPE_DYNAMIC; >-+ string inValue0; >-+ string inValue1; >-+ DataType resultType = TYPE_LAST; >-+ Precision resultPrec = m_in0.precision; >-+ vector<string> passVars; >-+ int numInputs = (isOperationBinary(m_op)) ? (2) : (1); >-+ >-+ std::string operationValue0; >-+ std::string operationValue1; >-+ >-+ DE_ASSERT(!isInDynMat0 || !isInDynMat1); // Only single dynamic matrix input is allowed. >-+ DE_UNREF(isInDynMat0 && isInDynMat1); >-+ >-+ // Compute result type. >-+ if (m_op == OP_MUL && isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) >-+ { >-+ resultType = getDataTypeMatrix(getDataTypeMatrixNumColumns(m_in1.dataType), getDataTypeMatrixNumRows(m_in0.dataType)); >-+ } >-+ else if (m_op == OP_OUTER_PRODUCT) >-+ { >-+ resultType = getDataTypeMatrix(getDataTypeScalarSize(m_in1.dataType), getDataTypeScalarSize(m_in0.dataType)); >-+ } >-+ else if (m_op == OP_TRANSPOSE) >-+ { >-+ resultType = getDataTypeMatrix(getDataTypeMatrixNumRows(m_in0.dataType), getDataTypeMatrixNumColumns(m_in0.dataType)); >-+ } >-+ else if (m_op == OP_INVERSE) >-+ { >-+ resultType = m_in0.dataType; >-+ } >-+ else if (m_op == OP_DETERMINANT) >-+ { >-+ resultType = TYPE_FLOAT; >-+ } >-+ else if (getOperationType(m_op) == OPERATIONTYPE_UNARY_PREFIX_OPERATOR || >-+ getOperationType(m_op) == OPERATIONTYPE_UNARY_POSTFIX_OPERATOR) >-+ { >-+ resultType = m_in0.dataType; >-+ } >-+ else if (isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) >-+ { >-+ DE_ASSERT(m_in0.dataType == m_in1.dataType); >-+ resultType = m_in0.dataType; >-+ } >-+ else if (isDataTypeMatrix(m_in0.dataType) || isDataTypeMatrix(m_in1.dataType)) >-+ { >-+ int matNdx = isDataTypeMatrix(m_in0.dataType) ? 0 : 1; >-+ DataType matrixType = matNdx == 0 ? m_in0.dataType : m_in1.dataType; >-+ DataType otherType = matNdx == 0 ? m_in1.dataType : m_in0.dataType; >-+ >-+ if (otherType == TYPE_FLOAT) >-+ resultType = matrixType; >-+ else >-+ { >-+ DE_ASSERT(isDataTypeVector(otherType)); >-+ resultType = getDataTypeFloatVec(matNdx == 0 ? getDataTypeMatrixNumRows(matrixType) : getDataTypeMatrixNumColumns(matrixType)); >-+ } >-+ } >-+ else >-+ { >-+ DE_ASSERT(DE_FALSE); >-+ } >-+ >-+ vtx << "#version 300 es\n"; >-+ frag << "#version 300 es\n"; >-+ >-+ vtx << "in highp vec4 a_position;\n"; >-+ frag << "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"; >-+ if (m_isVertexCase) >-+ { >-+ vtx << "out mediump vec4 v_color;\n"; >-+ frag << "in mediump vec4 v_color;\n"; >-+ } >-+ >-+ // Input declarations. >-+ for (int inNdx = 0; inNdx < numInputs; inNdx++) >-+ { >-+ const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; >-+ const char* precName = getPrecisionName(in.precision); >-+ const char* typeName = getDataTypeName(in.dataType); >-+ string& inValue = inNdx > 0 ? inValue1 : inValue0; >-+ >-+ if (in.inputType == INPUTTYPE_DYNAMIC) >-+ { >-+ vtx << "in " << precName << " " << typeName << " a_"; >-+ >-+ if (isDataTypeMatrix(in.dataType)) >-+ { >-+ // a_matN, v_matN >-+ vtx << typeName << ";\n"; >-+ if (!m_isVertexCase) >-+ { >-+ vtx << "out " << precName << " " << typeName << " v_" << typeName << ";\n"; >-+ frag << "in " << precName << " " << typeName << " v_" << typeName << ";\n"; >-+ passVars.push_back(typeName); >-+ } >-+ >-+ inValue = string(m_isVertexCase ? "a_" : "v_") + getDataTypeName(in.dataType); >-+ } >-+ else >-+ { >-+ // a_coords, v_coords >-+ vtx << "coords;\n"; >-+ if (!m_isVertexCase) >-+ { >-+ vtx << "out " << precName << " " << typeName << " v_coords;\n"; >-+ frag << "in " << precName << " " << typeName << " v_coords;\n"; >-+ passVars.push_back("coords"); >-+ } >-+ >-+ inValue = m_isVertexCase ? "a_coords" : "v_coords"; >-+ } >-+ } >-+ else if (in.inputType == INPUTTYPE_UNIFORM) >-+ { >-+ op << "uniform " << precName << " " << typeName << " u_in" << inNdx << ";\n"; >-+ inValue = string("u_in") + de::toString(inNdx); >-+ } >-+ else if (in.inputType == INPUTTYPE_CONST) >-+ { >-+ op << "const " << precName << " " << typeName << " in" << inNdx << " = "; >-+ >-+ // Generate declaration. >-+ switch (in.dataType) >-+ { >-+ case TYPE_FLOAT: op << de::floatToString(s_constInFloat[inNdx], 1); break; >-+ case TYPE_FLOAT_VEC2: writeVectorConstructor<2>(op, s_constInVec2[inNdx]); break; >-+ case TYPE_FLOAT_VEC3: writeVectorConstructor<3>(op, s_constInVec3[inNdx]); break; >-+ case TYPE_FLOAT_VEC4: writeVectorConstructor<4>(op, s_constInVec4[inNdx]); break; >-+ case TYPE_FLOAT_MAT2: writeMatrixConstructor<2, 2>(op, Mat2(s_constInMat2x2[inNdx])); break; >-+ case TYPE_FLOAT_MAT2X3: writeMatrixConstructor<2, 3>(op, Mat2x3(s_constInMat2x3[inNdx])); break; >-+ case TYPE_FLOAT_MAT2X4: writeMatrixConstructor<2, 4>(op, Mat2x4(s_constInMat2x4[inNdx])); break; >-+ case TYPE_FLOAT_MAT3X2: writeMatrixConstructor<3, 2>(op, Mat3x2(s_constInMat3x2[inNdx])); break; >-+ case TYPE_FLOAT_MAT3: writeMatrixConstructor<3, 3>(op, Mat3(s_constInMat3x3[inNdx])); break; >-+ case TYPE_FLOAT_MAT3X4: writeMatrixConstructor<3, 4>(op, Mat3x4(s_constInMat3x4[inNdx])); break; >-+ case TYPE_FLOAT_MAT4X2: writeMatrixConstructor<4, 2>(op, Mat4x2(s_constInMat4x2[inNdx])); break; >-+ case TYPE_FLOAT_MAT4X3: writeMatrixConstructor<4, 3>(op, Mat4x3(s_constInMat4x3[inNdx])); break; >-+ case TYPE_FLOAT_MAT4: writeMatrixConstructor<4, 4>(op, Mat4(s_constInMat4x4[inNdx])); break; >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ } >-+ >-+ op << ";\n"; >-+ >-+ inValue = string("in") + de::toString(inNdx); >-+ } >-+ } >-+ >-+ vtx << "\n" >-+ << "void main (void)\n" >-+ << "{\n" >-+ << " gl_Position = a_position;\n"; >-+ frag << "\n" >-+ << "void main (void)\n" >-+ << "{\n"; >-+ >-+ if (m_isVertexCase) >-+ frag << " dEQP_FragColor = v_color;\n"; >-+ else >-+ { >-+ for (vector<string>::const_iterator copyIter = passVars.begin(); copyIter != passVars.end(); copyIter++) >-+ vtx << " v_" << *copyIter << " = " << "a_" << *copyIter << ";\n"; >-+ } >-+ >-+ // Operation. >-+ >-+ switch (getOperationNature(m_op)) >-+ { >-+ case OPERATIONNATURE_PURE: >-+ DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); >-+ >-+ operationValue0 = inValue0; >-+ operationValue1 = inValue1; >-+ break; >-+ >-+ case OPERATIONNATURE_MUTATING: >-+ DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); >-+ >-+ op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " tmpValue = " << inValue0 << ";\n"; >-+ >-+ operationValue0 = "tmpValue"; >-+ operationValue1 = inValue1; >-+ break; >-+ >-+ case OPERATIONNATURE_ASSIGNMENT: >-+ DE_ASSERT(getOperationType(m_op) == OPERATIONTYPE_ASSIGNMENT); >-+ >-+ operationValue0 = inValue0; >-+ operationValue1 = inValue1; >-+ break; >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ } >-+ >-+ switch (getOperationType(m_op)) >-+ { >-+ case OPERATIONTYPE_BINARY_OPERATOR: >-+ op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << " " << getOperationName(m_op) << " " << operationValue1 << ";\n"; >-+ break; >-+ >-+ case OPERATIONTYPE_UNARY_PREFIX_OPERATOR: >-+ op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << operationValue0 << ";\n"; >-+ break; >-+ >-+ case OPERATIONTYPE_UNARY_POSTFIX_OPERATOR: >-+ op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << getOperationName(m_op) << ";\n"; >-+ break; >-+ >-+ case OPERATIONTYPE_BINARY_FUNCTION: >-+ op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ", " << operationValue1 << ");\n"; >-+ break; >-+ >-+ case OPERATIONTYPE_UNARY_FUNCTION: >-+ op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ");\n"; >-+ break; >-+ >-+ case OPERATIONTYPE_ASSIGNMENT: >-+ op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << ";\n"; >-+ op << " res " << getOperationName(m_op) << " " << operationValue1 << ";\n"; >-+ break; >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ } >-+ >-+ // Reduction to vec3 (rgb). Check the used value too if it was modified >-+ op << " " << (m_isVertexCase ? "v_color" : "dEQP_FragColor") << " = "; >-+ >-+ if (isOperationValueModifying(m_op)) >-+ op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0) + vec4(" << genGLSLMatToVec3Reduction(resultType, "tmpValue") << ", 0.0);\n"; >-+ else >-+ op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0);\n"; >-+ >-+ vtx << "}\n"; >-+ frag << "}\n"; >-+ >-+ m_vertShaderSource = vtx.str(); >-+ m_fragShaderSource = frag.str(); >-+ >-+ // \todo [2012-02-14 pyry] Compute better values for matrix tests. >-+ m_userAttribTransforms.resize(4); >-+ for (int attribNdx = 0; attribNdx < 4; attribNdx++) >-+ { >-+ m_userAttribTransforms[attribNdx] = Mat4(0.0f); >-+ m_userAttribTransforms[attribNdx]( 0, 3) = 0.2f; // !< prevent matrix*vec from going into zero (assuming vec.w != 0) >-+ m_userAttribTransforms[attribNdx]( 1, 3) = 0.1f; // !< >-+ m_userAttribTransforms[attribNdx]( 2, 3) = 0.4f + 0.15f * float(attribNdx); // !< >-+ m_userAttribTransforms[attribNdx]( 3, 3) = 0.7f; // !< >-+ m_userAttribTransforms[attribNdx]((0 + attribNdx) % 4, 0) = 1.0f; >-+ m_userAttribTransforms[attribNdx]((1 + attribNdx) % 4, 1) = 1.0f; >-+ m_userAttribTransforms[attribNdx]((2 + attribNdx) % 4, 2) = 1.0f; >-+ m_userAttribTransforms[attribNdx]((3 + attribNdx) % 4, 3) = 1.0f; >-+ } >-+ >-+ // prevent bad reference cases such as black result images by fine-tuning used matrices >-+ if (getOperationTestMatrixType(m_op) != TESTMATRIXTYPE_DEFAULT) >-+ { >-+ for (int attribNdx = 0; attribNdx < 4; attribNdx++) >-+ { >-+ for (int row = 0; row < 4; row++) >-+ for (int col = 0; col < 4; col++) >-+ { >-+ switch (getOperationTestMatrixType(m_op)) >-+ { >-+ case TESTMATRIXTYPE_NEGATED: >-+ m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col); >-+ break; >-+ case TESTMATRIXTYPE_INCREMENTED: >-+ m_userAttribTransforms[attribNdx](row, col) += 0.3f; >-+ break; >-+ case TESTMATRIXTYPE_DECREMENTED: >-+ m_userAttribTransforms[attribNdx](row, col) -= 0.3f; >-+ break; >-+ case TESTMATRIXTYPE_NEGATED_INCREMENTED: >-+ m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col) + 0.3f; >-+ break; >-+ case TESTMATRIXTYPE_INCREMENTED_LESS: >-+ m_userAttribTransforms[attribNdx](row, col) -= 0.1f; >-+ break; >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ break; >-+ } >-+ } >-+ } >-+ } >-+ >-+ ShaderRenderCase::init(); >- } >- >- std::string ShaderMatrixCase::genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName) >- { >-- std::ostringstream op; >-- >-- switch (matType) >-- { >-- case TYPE_FLOAT: op << varName << ", " << varName << ", " << varName << ""; break; >-- case TYPE_FLOAT_VEC2: op << varName << ".x, " << varName << ".y, " << varName << ".x"; break; >-- case TYPE_FLOAT_VEC3: op << varName << ""; break; >-- case TYPE_FLOAT_VEC4: op << varName << ".x, " << varName << ".y, " << varName << ".z+" << varName << ".w"; break; >-- case TYPE_FLOAT_MAT2: op << varName << "[0][0], " << varName << "[1][0], " << varName << "[0][1]+" << varName << "[1][1]"; break; >-- case TYPE_FLOAT_MAT2X3: op << varName << "[0] + " << varName << "[1]"; break; >-- case TYPE_FLOAT_MAT2X4: op << varName << "[0].xyz + " << varName << "[1].yzw"; break; >-- case TYPE_FLOAT_MAT3X2: op << varName << "[0][0]+" << varName << "[0][1], " << varName << "[1][0]+" << varName << "[1][1], " << varName << "[2][0]+" << varName << "[2][1]"; break; >-- case TYPE_FLOAT_MAT3: op << varName << "[0] + " << varName << "[1] + " << varName << "[2]"; break; >-- case TYPE_FLOAT_MAT3X4: op << varName << "[0].xyz + " << varName << "[1].yzw + " << varName << "[2].zwx"; break; >-- case TYPE_FLOAT_MAT4X2: op << varName << "[0][0]+" << varName << "[0][1]+" << varName << "[3][0], " << varName << "[1][0]+" << varName << "[1][1]+" << varName << "[3][1], " << varName << "[2][0]+" << varName << "[2][1]"; break; >-- case TYPE_FLOAT_MAT4X3: op << varName << "[0] + " << varName << "[1] + " << varName << "[2] + " << varName << "[3]"; break; >-- case TYPE_FLOAT_MAT4: op << varName << "[0].xyz+" << varName << "[1].yzw+" << varName << "[2].zwx+" << varName << "[3].wxy"; break; >-- >-- default: >-- DE_ASSERT(DE_FALSE); >-- } >-- >-- return op.str(); >-+ std::ostringstream op; >-+ >-+ switch (matType) >-+ { >-+ case TYPE_FLOAT: op << varName << ", " << varName << ", " << varName << ""; break; >-+ case TYPE_FLOAT_VEC2: op << varName << ".x, " << varName << ".y, " << varName << ".x"; break; >-+ case TYPE_FLOAT_VEC3: op << varName << ""; break; >-+ case TYPE_FLOAT_VEC4: op << varName << ".x, " << varName << ".y, " << varName << ".z+" << varName << ".w"; break; >-+ case TYPE_FLOAT_MAT2: op << varName << "[0][0], " << varName << "[1][0], " << varName << "[0][1]+" << varName << "[1][1]"; break; >-+ case TYPE_FLOAT_MAT2X3: op << varName << "[0] + " << varName << "[1]"; break; >-+ case TYPE_FLOAT_MAT2X4: op << varName << "[0].xyz + " << varName << "[1].yzw"; break; >-+ case TYPE_FLOAT_MAT3X2: op << varName << "[0][0]+" << varName << "[0][1], " << varName << "[1][0]+" << varName << "[1][1], " << varName << "[2][0]+" << varName << "[2][1]"; break; >-+ case TYPE_FLOAT_MAT3: op << varName << "[0] + " << varName << "[1] + " << varName << "[2]"; break; >-+ case TYPE_FLOAT_MAT3X4: op << varName << "[0].xyz + " << varName << "[1].yzw + " << varName << "[2].zwx"; break; >-+ case TYPE_FLOAT_MAT4X2: op << varName << "[0][0]+" << varName << "[0][1]+" << varName << "[3][0], " << varName << "[1][0]+" << varName << "[1][1]+" << varName << "[3][1], " << varName << "[2][0]+" << varName << "[2][1]"; break; >-+ case TYPE_FLOAT_MAT4X3: op << varName << "[0] + " << varName << "[1] + " << varName << "[2] + " << varName << "[3]"; break; >-+ case TYPE_FLOAT_MAT4: op << varName << "[0].xyz+" << varName << "[1].yzw+" << varName << "[2].zwx+" << varName << "[3].wxy"; break; >-+ >-+ default: >-+ DE_ASSERT(DE_FALSE); >-+ } >-+ >-+ return op.str(); >- } >- >- void ShaderMatrixCase::setupUniforms (int programID, const tcu::Vec4& constCoords) >- { >-- const glw::Functions& gl = m_renderCtx.getFunctions(); >-- >-- DE_UNREF(constCoords); >-- >-- for (int inNdx = 0; inNdx < 2; inNdx++) >-- { >-- const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; >-- >-- if (in.inputType == INPUTTYPE_UNIFORM) >-- { >-- int loc = gl.getUniformLocation(programID, (string("u_in") + de::toString(inNdx)).c_str()); >-- >-- if (loc < 0) >-- continue; >-- >-- switch (in.dataType) >-- { >-- case TYPE_FLOAT: gl.uniform1f(loc, s_constInFloat[inNdx]); break; >-- case TYPE_FLOAT_VEC2: gl.uniform2fv(loc, 1, s_constInVec2[inNdx].getPtr()); break; >-- case TYPE_FLOAT_VEC3: gl.uniform3fv(loc, 1, s_constInVec3[inNdx].getPtr()); break; >-- case TYPE_FLOAT_VEC4: gl.uniform4fv(loc, 1, s_constInVec4[inNdx].getPtr()); break; >-- // \note GLES3 supports transpose in matrix upload. >-- case TYPE_FLOAT_MAT2: gl.uniformMatrix2fv (loc, 1, GL_TRUE, s_constInMat2x2[inNdx]); break; >-- case TYPE_FLOAT_MAT2X3: gl.uniformMatrix2x3fv(loc, 1, GL_TRUE, s_constInMat2x3[inNdx]); break; >-- case TYPE_FLOAT_MAT2X4: gl.uniformMatrix2x4fv(loc, 1, GL_TRUE, s_constInMat2x4[inNdx]); break; >-- case TYPE_FLOAT_MAT3X2: gl.uniformMatrix3x2fv(loc, 1, GL_TRUE, s_constInMat3x2[inNdx]); break; >-- case TYPE_FLOAT_MAT3: gl.uniformMatrix3fv (loc, 1, GL_TRUE, s_constInMat3x3[inNdx]); break; >-- case TYPE_FLOAT_MAT3X4: gl.uniformMatrix3x4fv(loc, 1, GL_TRUE, s_constInMat3x4[inNdx]); break; >-- case TYPE_FLOAT_MAT4X2: gl.uniformMatrix4x2fv(loc, 1, GL_TRUE, s_constInMat4x2[inNdx]); break; >-- case TYPE_FLOAT_MAT4X3: gl.uniformMatrix4x3fv(loc, 1, GL_TRUE, s_constInMat4x3[inNdx]); break; >-- case TYPE_FLOAT_MAT4: gl.uniformMatrix4fv (loc, 1, GL_TRUE, s_constInMat4x4[inNdx]); break; >-- default: >-- DE_ASSERT(false); >-- } >-- } >-- } >-+ const glw::Functions& gl = m_renderCtx.getFunctions(); >-+ >-+ DE_UNREF(constCoords); >-+ >-+ for (int inNdx = 0; inNdx < 2; inNdx++) >-+ { >-+ const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; >-+ >-+ if (in.inputType == INPUTTYPE_UNIFORM) >-+ { >-+ int loc = gl.getUniformLocation(programID, (string("u_in") + de::toString(inNdx)).c_str()); >-+ >-+ if (loc < 0) >-+ continue; >-+ >-+ switch (in.dataType) >-+ { >-+ case TYPE_FLOAT: gl.uniform1f(loc, s_constInFloat[inNdx]); break; >-+ case TYPE_FLOAT_VEC2: gl.uniform2fv(loc, 1, s_constInVec2[inNdx].getPtr()); break; >-+ case TYPE_FLOAT_VEC3: gl.uniform3fv(loc, 1, s_constInVec3[inNdx].getPtr()); break; >-+ case TYPE_FLOAT_VEC4: gl.uniform4fv(loc, 1, s_constInVec4[inNdx].getPtr()); break; >-+ // \note GLES3 supports transpose in matrix upload. >-+ case TYPE_FLOAT_MAT2: gl.uniformMatrix2fv (loc, 1, GL_TRUE, s_constInMat2x2[inNdx]); break; >-+ case TYPE_FLOAT_MAT2X3: gl.uniformMatrix2x3fv(loc, 1, GL_TRUE, s_constInMat2x3[inNdx]); break; >-+ case TYPE_FLOAT_MAT2X4: gl.uniformMatrix2x4fv(loc, 1, GL_TRUE, s_constInMat2x4[inNdx]); break; >-+ case TYPE_FLOAT_MAT3X2: gl.uniformMatrix3x2fv(loc, 1, GL_TRUE, s_constInMat3x2[inNdx]); break; >-+ case TYPE_FLOAT_MAT3: gl.uniformMatrix3fv (loc, 1, GL_TRUE, s_constInMat3x3[inNdx]); break; >-+ case TYPE_FLOAT_MAT3X4: gl.uniformMatrix3x4fv(loc, 1, GL_TRUE, s_constInMat3x4[inNdx]); break; >-+ case TYPE_FLOAT_MAT4X2: gl.uniformMatrix4x2fv(loc, 1, GL_TRUE, s_constInMat4x2[inNdx]); break; >-+ case TYPE_FLOAT_MAT4X3: gl.uniformMatrix4x3fv(loc, 1, GL_TRUE, s_constInMat4x3[inNdx]); break; >-+ case TYPE_FLOAT_MAT4: gl.uniformMatrix4fv (loc, 1, GL_TRUE, s_constInMat4x4[inNdx]); break; >-+ default: >-+ DE_ASSERT(false); >-+ } >-+ } >-+ } >- } >- >- ShaderMatrixTests::ShaderMatrixTests (Context& context) >-- : TestCaseGroup(context, "matrix", "Matrix Tests") >-+ : TestCaseGroup(context, "matrix", "Matrix Tests") >- { >- } >- >-@@ -1791,181 +1791,181 @@ ShaderMatrixTests::~ShaderMatrixTests (void) >- >- void ShaderMatrixTests::init (void) >- { >-- static const struct >-- { >-- const char* name; >-- const char* desc; >-- MatrixOp op; >-- bool extendedInputTypeCases; // !< test with const and uniform types too >-- bool createInputTypeGroup; // !< create group for input types >-- } ops[] = >-- { >-- { "add", "Matrix addition tests", OP_ADD, true, true }, >-- { "sub", "Matrix subtraction tests", OP_SUB, true, true }, >-- { "mul", "Matrix multiplication tests", OP_MUL, true, true }, >-- { "div", "Matrix division tests", OP_DIV, true, true }, >-- { "matrixcompmult", "Matrix component-wise multiplication tests", OP_COMP_MUL, false, true }, >-- { "outerproduct", "Matrix outerProduct() tests", OP_OUTER_PRODUCT, false, true }, >-- { "transpose", "Matrix transpose() tests", OP_TRANSPOSE, false, true }, >-- { "determinant", "Matrix determinant() tests", OP_DETERMINANT, false, true }, >-- { "inverse", "Matrix inverse() tests", OP_INVERSE, false, true }, >-- { "unary_addition", "Matrix unary addition tests", OP_UNARY_PLUS, false, false }, >-- { "negation", "Matrix negation tests", OP_NEGATION, false, false }, >-- { "pre_increment", "Matrix prefix increment tests", OP_PRE_INCREMENT, false, false }, >-- { "pre_decrement", "Matrix prefix decrement tests", OP_PRE_DECREMENT, false, false }, >-- { "post_increment", "Matrix postfix increment tests", OP_POST_INCREMENT, false, false }, >-- { "post_decrement", "Matrix postfix decrement tests", OP_POST_DECREMENT, false, false }, >-- { "add_assign", "Matrix add into tests", OP_ADD_INTO, false, false }, >-- { "sub_assign", "Matrix subtract from tests", OP_SUBTRACT_FROM, false, false }, >-- { "mul_assign", "Matrix multiply into tests", OP_MULTIPLY_INTO, false, false }, >-- { "div_assign", "Matrix divide into tests", OP_DIVIDE_INTO, false, false }, >-- }; >-- >-- struct InputTypeSpec >-- { >-- const char* name; >-- const char* desc; >-- InputType type; >-- }; >-- static const InputTypeSpec extendedInputTypes[] = >-- { >-- { "const", "Constant matrix input", INPUTTYPE_CONST }, >-- { "uniform", "Uniform matrix input", INPUTTYPE_UNIFORM }, >-- { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } >-- }; >-- static const InputTypeSpec reducedInputTypes[] = >-- { >-- { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } >-- }; >-- >-- static const DataType matrixTypes[] = >-- { >-- TYPE_FLOAT_MAT2, >-- TYPE_FLOAT_MAT2X3, >-- TYPE_FLOAT_MAT2X4, >-- TYPE_FLOAT_MAT3X2, >-- TYPE_FLOAT_MAT3, >-- TYPE_FLOAT_MAT3X4, >-- TYPE_FLOAT_MAT4X2, >-- TYPE_FLOAT_MAT4X3, >-- TYPE_FLOAT_MAT4 >-- }; >-- >-- static const Precision precisions[] = >-- { >-- PRECISION_LOWP, >-- PRECISION_MEDIUMP, >-- PRECISION_HIGHP >-- }; >-- >-- for (int opNdx = 0; opNdx < DE_LENGTH_OF_ARRAY(ops); opNdx++) >-- { >-- const InputTypeSpec* inTypeList = (ops[opNdx].extendedInputTypeCases) ? (extendedInputTypes) : (reducedInputTypes); >-- const int inTypeListSize = (ops[opNdx].extendedInputTypeCases) ? (DE_LENGTH_OF_ARRAY(extendedInputTypes)) : (DE_LENGTH_OF_ARRAY(reducedInputTypes)); >-- const MatrixOp op = ops[opNdx].op; >-- tcu::TestCaseGroup* opGroup = new tcu::TestCaseGroup(m_testCtx, ops[opNdx].name, ops[opNdx].desc); >-- >-- addChild(opGroup); >-- >-- for (int inTypeNdx = 0; inTypeNdx < inTypeListSize; inTypeNdx++) >-- { >-- const InputType inputType = inTypeList[inTypeNdx].type; >-- tcu::TestCaseGroup* inGroup; >-- >-- if (ops[opNdx].createInputTypeGroup) >-- { >-- inGroup = new tcu::TestCaseGroup(m_testCtx, inTypeList[inTypeNdx].name, inTypeList[inTypeNdx].desc); >-- opGroup->addChild(inGroup); >-- } >-- else >-- inGroup = opGroup; >-- >-- for (int matTypeNdx = 0; matTypeNdx < DE_LENGTH_OF_ARRAY(matrixTypes); matTypeNdx++) >-- { >-- DataType matType = matrixTypes[matTypeNdx]; >-- int numCols = getDataTypeMatrixNumColumns(matType); >-- int numRows = getDataTypeMatrixNumRows(matType); >-- const char* matTypeName = getDataTypeName(matType); >-- >-- for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisions); precNdx++) >-- { >-- Precision precision = precisions[precNdx]; >-- const char* precName = getPrecisionName(precision); >-- string baseName = string(precName) + "_" + matTypeName + "_"; >-- ShaderInput matIn (inputType, matType, precision); >-- >-- if (isOperationMatrixScalar(op)) >-- { >-- // Matrix-scalar \note For div cases we use uniform input. >-- ShaderInput scalarIn(op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, TYPE_FLOAT, precision); >-- inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix-scalar case", matIn, scalarIn, op, true)); >-- inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix-scalar case", matIn, scalarIn, op, false)); >-- } >-- >-- if (isOperationMatrixVector(op)) >-- { >-- // Matrix-vector. >-- DataType colVecType = getDataTypeFloatVec(numCols); >-- ShaderInput colVecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, colVecType, precision); >-- >-- inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(colVecType) + "_vertex").c_str(), "Matrix-vector case", matIn, colVecIn, op, true)); >-- inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(colVecType) + "_fragment").c_str(), "Matrix-vector case", matIn, colVecIn, op, false)); >-- >-- // Vector-matrix. >-- DataType rowVecType = getDataTypeFloatVec(numRows); >-- ShaderInput rowVecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, rowVecType, precision); >-- string vecMatName = string(precName) + "_" + getDataTypeName(rowVecType) + "_" + matTypeName; >-- >-- inGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_vertex").c_str(), "Vector-matrix case", rowVecIn, matIn, op, true)); >-- inGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_fragment").c_str(), "Vector-matrix case", rowVecIn, matIn, op, false)); >-- } >-- >-- if (isOperationArithmeticMatrixMatrix(op)) >-- { >-- // Arithmetic matrix-matrix multiplication. >-- for (int otherCols = 2; otherCols <= 4; otherCols++) >-- { >-- ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, getDataTypeMatrix(otherCols, numCols /* rows */), precision); >-- inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(otherMatIn.dataType) + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); >-- inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(otherMatIn.dataType) + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); >-- } >-- } >-- else if (isOperationComponentwiseMatrixMatrix(op)) >-- { >-- // Component-wise. >-- ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); >-- inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); >-- inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); >-- } >-- >-- if (isOperationVectorVector(op)) >-- { >-- ShaderInput vec1In(inputType, getDataTypeFloatVec(numRows), precision); >-- ShaderInput vec2In((inputType == INPUTTYPE_DYNAMIC) ? (INPUTTYPE_UNIFORM) : (inputType), getDataTypeFloatVec(numCols), precision); >-- >-- inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Vector-vector case", vec1In, vec2In, op, true)); >-- inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Vector-vector case", vec1In, vec2In, op, false)); >-- } >-- >-- if ((isOperationUnaryAnyMatrix(op)) || >-- (isOperationUnarySymmetricMatrix(op) && numCols == numRows)) >-- { >-- ShaderInput voidInput(INPUTTYPE_LAST, TYPE_LAST, PRECISION_LAST); >-- inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix case", matIn, voidInput, op, true)); >-- inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix case", matIn, voidInput, op, false)); >-- } >-- >-- if ((isOperationAssignmentAnyMatrix(op)) || >-- (isOperationAssignmentSymmetricMatrix(op) && numCols == numRows)) >-- { >-- ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); >-- inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix assignment case", matIn, otherMatIn, op, true)); >-- inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix assignment case", matIn, otherMatIn, op, false)); >-- } >-- } >-- } >-- } >-- } >-+ static const struct >-+ { >-+ const char* name; >-+ const char* desc; >-+ MatrixOp op; >-+ bool extendedInputTypeCases; // !< test with const and uniform types too >-+ bool createInputTypeGroup; // !< create group for input types >-+ } ops[] = >-+ { >-+ { "add", "Matrix addition tests", OP_ADD, true, true }, >-+ { "sub", "Matrix subtraction tests", OP_SUB, true, true }, >-+ { "mul", "Matrix multiplication tests", OP_MUL, true, true }, >-+ { "div", "Matrix division tests", OP_DIV, true, true }, >-+ { "matrixcompmult", "Matrix component-wise multiplication tests", OP_COMP_MUL, false, true }, >-+ { "outerproduct", "Matrix outerProduct() tests", OP_OUTER_PRODUCT, false, true }, >-+ { "transpose", "Matrix transpose() tests", OP_TRANSPOSE, false, true }, >-+ { "determinant", "Matrix determinant() tests", OP_DETERMINANT, false, true }, >-+ { "inverse", "Matrix inverse() tests", OP_INVERSE, false, true }, >-+ { "unary_addition", "Matrix unary addition tests", OP_UNARY_PLUS, false, false }, >-+ { "negation", "Matrix negation tests", OP_NEGATION, false, false }, >-+ { "pre_increment", "Matrix prefix increment tests", OP_PRE_INCREMENT, false, false }, >-+ { "pre_decrement", "Matrix prefix decrement tests", OP_PRE_DECREMENT, false, false }, >-+ { "post_increment", "Matrix postfix increment tests", OP_POST_INCREMENT, false, false }, >-+ { "post_decrement", "Matrix postfix decrement tests", OP_POST_DECREMENT, false, false }, >-+ { "add_assign", "Matrix add into tests", OP_ADD_INTO, false, false }, >-+ { "sub_assign", "Matrix subtract from tests", OP_SUBTRACT_FROM, false, false }, >-+ { "mul_assign", "Matrix multiply into tests", OP_MULTIPLY_INTO, false, false }, >-+ { "div_assign", "Matrix divide into tests", OP_DIVIDE_INTO, false, false }, >-+ }; >-+ >-+ struct InputTypeSpec >-+ { >-+ const char* name; >-+ const char* desc; >-+ InputType type; >-+ }; >-+ static const InputTypeSpec extendedInputTypes[] = >-+ { >-+ { "const", "Constant matrix input", INPUTTYPE_CONST }, >-+ { "uniform", "Uniform matrix input", INPUTTYPE_UNIFORM }, >-+ { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } >-+ }; >-+ static const InputTypeSpec reducedInputTypes[] = >-+ { >-+ { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } >-+ }; >-+ >-+ static const DataType matrixTypes[] = >-+ { >-+ TYPE_FLOAT_MAT2, >-+ TYPE_FLOAT_MAT2X3, >-+ TYPE_FLOAT_MAT2X4, >-+ TYPE_FLOAT_MAT3X2, >-+ TYPE_FLOAT_MAT3, >-+ TYPE_FLOAT_MAT3X4, >-+ TYPE_FLOAT_MAT4X2, >-+ TYPE_FLOAT_MAT4X3, >-+ TYPE_FLOAT_MAT4 >-+ }; >-+ >-+ static const Precision precisions[] = >-+ { >-+ PRECISION_LOWP, >-+ PRECISION_MEDIUMP, >-+ PRECISION_HIGHP >-+ }; >-+ >-+ for (int opNdx = 0; opNdx < DE_LENGTH_OF_ARRAY(ops); opNdx++) >-+ { >-+ const InputTypeSpec* inTypeList = (ops[opNdx].extendedInputTypeCases) ? (extendedInputTypes) : (reducedInputTypes); >-+ const int inTypeListSize = (ops[opNdx].extendedInputTypeCases) ? (DE_LENGTH_OF_ARRAY(extendedInputTypes)) : (DE_LENGTH_OF_ARRAY(reducedInputTypes)); >-+ const MatrixOp op = ops[opNdx].op; >-+ tcu::TestCaseGroup* opGroup = new tcu::TestCaseGroup(m_testCtx, ops[opNdx].name, ops[opNdx].desc); >-+ >-+ addChild(opGroup); >-+ >-+ for (int inTypeNdx = 0; inTypeNdx < inTypeListSize; inTypeNdx++) >-+ { >-+ const InputType inputType = inTypeList[inTypeNdx].type; >-+ tcu::TestCaseGroup* inGroup; >-+ >-+ if (ops[opNdx].createInputTypeGroup) >-+ { >-+ inGroup = new tcu::TestCaseGroup(m_testCtx, inTypeList[inTypeNdx].name, inTypeList[inTypeNdx].desc); >-+ opGroup->addChild(inGroup); >-+ } >-+ else >-+ inGroup = opGroup; >-+ >-+ for (int matTypeNdx = 0; matTypeNdx < DE_LENGTH_OF_ARRAY(matrixTypes); matTypeNdx++) >-+ { >-+ DataType matType = matrixTypes[matTypeNdx]; >-+ int numCols = getDataTypeMatrixNumColumns(matType); >-+ int numRows = getDataTypeMatrixNumRows(matType); >-+ const char* matTypeName = getDataTypeName(matType); >-+ >-+ for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisions); precNdx++) >-+ { >-+ Precision precision = precisions[precNdx]; >-+ const char* precName = getPrecisionName(precision); >-+ string baseName = string(precName) + "_" + matTypeName + "_"; >-+ ShaderInput matIn (inputType, matType, precision); >-+ >-+ if (isOperationMatrixScalar(op)) >-+ { >-+ // Matrix-scalar \note For div cases we use uniform input. >-+ ShaderInput scalarIn(op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, TYPE_FLOAT, precision); >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix-scalar case", matIn, scalarIn, op, true)); >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix-scalar case", matIn, scalarIn, op, false)); >-+ } >-+ >-+ if (isOperationMatrixVector(op)) >-+ { >-+ // Matrix-vector. >-+ DataType colVecType = getDataTypeFloatVec(numCols); >-+ ShaderInput colVecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, colVecType, precision); >-+ >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(colVecType) + "_vertex").c_str(), "Matrix-vector case", matIn, colVecIn, op, true)); >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(colVecType) + "_fragment").c_str(), "Matrix-vector case", matIn, colVecIn, op, false)); >-+ >-+ // Vector-matrix. >-+ DataType rowVecType = getDataTypeFloatVec(numRows); >-+ ShaderInput rowVecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, rowVecType, precision); >-+ string vecMatName = string(precName) + "_" + getDataTypeName(rowVecType) + "_" + matTypeName; >-+ >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_vertex").c_str(), "Vector-matrix case", rowVecIn, matIn, op, true)); >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_fragment").c_str(), "Vector-matrix case", rowVecIn, matIn, op, false)); >-+ } >-+ >-+ if (isOperationArithmeticMatrixMatrix(op)) >-+ { >-+ // Arithmetic matrix-matrix multiplication. >-+ for (int otherCols = 2; otherCols <= 4; otherCols++) >-+ { >-+ ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, getDataTypeMatrix(otherCols, numCols /* rows */), precision); >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(otherMatIn.dataType) + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(otherMatIn.dataType) + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); >-+ } >-+ } >-+ else if (isOperationComponentwiseMatrixMatrix(op)) >-+ { >-+ // Component-wise. >-+ ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); >-+ } >-+ >-+ if (isOperationVectorVector(op)) >-+ { >-+ ShaderInput vec1In(inputType, getDataTypeFloatVec(numRows), precision); >-+ ShaderInput vec2In((inputType == INPUTTYPE_DYNAMIC) ? (INPUTTYPE_UNIFORM) : (inputType), getDataTypeFloatVec(numCols), precision); >-+ >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Vector-vector case", vec1In, vec2In, op, true)); >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Vector-vector case", vec1In, vec2In, op, false)); >-+ } >-+ >-+ if ((isOperationUnaryAnyMatrix(op)) || >-+ (isOperationUnarySymmetricMatrix(op) && numCols == numRows)) >-+ { >-+ ShaderInput voidInput(INPUTTYPE_LAST, TYPE_LAST, PRECISION_LAST); >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix case", matIn, voidInput, op, true)); >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix case", matIn, voidInput, op, false)); >-+ } >-+ >-+ if ((isOperationAssignmentAnyMatrix(op)) || >-+ (isOperationAssignmentSymmetricMatrix(op) && numCols == numRows)) >-+ { >-+ ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix assignment case", matIn, otherMatIn, op, true)); >-+ inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix assignment case", matIn, otherMatIn, op, false)); >-+ } >-+ } >-+ } >-+ } >-+ } >- } >- >- } // Functional >-diff --git a/src/tests/deqp_support/qpTestLog.c b/src/tests/deqp_support/qpTestLog.c >-index 7252ae049..e3eaa9b14 100644 >---- a/src/tests/deqp_support/qpTestLog.c >-+++ b/src/tests/deqp_support/qpTestLog.c >-@@ -33,7 +33,7 @@ >- #include "deMutex.h" >- >- #if defined(QP_SUPPORT_PNG) >--# include <png.h> >-+# include <png.h> >- #endif >- >- #include <stdio.h> >-@@ -41,8 +41,8 @@ >- #include <stdarg.h> >- >- #if (DE_OS == DE_OS_WIN32) >--# include <windows.h> >--# include <io.h> >-+# include <windows.h> >-+# include <io.h> >- #endif >- >- #if defined(DE_DEBUG) >-@@ -51,70 +51,70 @@ >- >- typedef enum ContainerType_e >- { >-- CONTAINERTYPE_SECTION = 0, >-- CONTAINERTYPE_IMAGESET, >-- CONTAINERTYPE_EGLCONFIGSET, >-- CONTAINERTYPE_SHADERPROGRAM, >-- CONTAINERTYPE_SAMPLELIST, >-- CONTAINERTYPE_SAMPLEINFO, >-- CONTAINERTYPE_SAMPLE, >-+ CONTAINERTYPE_SECTION = 0, >-+ CONTAINERTYPE_IMAGESET, >-+ CONTAINERTYPE_EGLCONFIGSET, >-+ CONTAINERTYPE_SHADERPROGRAM, >-+ CONTAINERTYPE_SAMPLELIST, >-+ CONTAINERTYPE_SAMPLEINFO, >-+ CONTAINERTYPE_SAMPLE, >- >-- CONTAINERTYPE_LAST >-+ CONTAINERTYPE_LAST >- } ContainerType; >- >- DE_INLINE deBool childContainersOk (ContainerType type) >- { >-- return type == CONTAINERTYPE_SECTION || type == CONTAINERTYPE_SAMPLELIST; >-+ return type == CONTAINERTYPE_SECTION || type == CONTAINERTYPE_SAMPLELIST; >- } >- >- enum >- { >-- MAX_CONTAINER_STACK_DEPTH = 32 >-+ MAX_CONTAINER_STACK_DEPTH = 32 >- }; >- >- typedef struct ContainerStack_s >- { >-- int numElements; >-- ContainerType elements[MAX_CONTAINER_STACK_DEPTH]; >-+ int numElements; >-+ ContainerType elements[MAX_CONTAINER_STACK_DEPTH]; >- } ContainerStack; >- >- DE_INLINE void ContainerStack_reset (ContainerStack* stack) >- { >-- deMemset(stack, 0, sizeof(ContainerStack)); >-+ deMemset(stack, 0, sizeof(ContainerStack)); >- } >- >- DE_INLINE deBool ContainerStack_isEmpty (const ContainerStack* stack) >- { >-- return stack->numElements == 0; >-+ return stack->numElements == 0; >- } >- >- DE_INLINE deBool ContainerStack_push (ContainerStack* stack, ContainerType type) >- { >-- if (stack->numElements == MAX_CONTAINER_STACK_DEPTH) >-- return DE_FALSE; >-+ if (stack->numElements == MAX_CONTAINER_STACK_DEPTH) >-+ return DE_FALSE; >- >-- if (stack->numElements > 0 && !childContainersOk(stack->elements[stack->numElements-1])) >-- return DE_FALSE; >-+ if (stack->numElements > 0 && !childContainersOk(stack->elements[stack->numElements-1])) >-+ return DE_FALSE; >- >-- stack->elements[stack->numElements] = type; >-- stack->numElements += 1; >-+ stack->elements[stack->numElements] = type; >-+ stack->numElements += 1; >- >-- return DE_TRUE; >-+ return DE_TRUE; >- } >- >- DE_INLINE ContainerType ContainerStack_pop (ContainerStack* stack) >- { >-- DE_ASSERT(stack->numElements > 0); >-- stack->numElements -= 1; >-- return stack->elements[stack->numElements]; >-+ DE_ASSERT(stack->numElements > 0); >-+ stack->numElements -= 1; >-+ return stack->elements[stack->numElements]; >- } >- >- DE_INLINE ContainerType ContainerStack_getTop (const ContainerStack* stack) >- { >-- if (stack->numElements > 0) >-- return stack->elements[stack->numElements-1]; >-- else >-- return CONTAINERTYPE_LAST; >-+ if (stack->numElements > 0) >-+ return stack->elements[stack->numElements-1]; >-+ else >-+ return CONTAINERTYPE_LAST; >- } >- >- #endif >-@@ -122,26 +122,26 @@ DE_INLINE ContainerType ContainerStack_getTop (const ContainerStack* stack) >- /* qpTestLog instance */ >- struct qpTestLog_s >- { >-- deUint32 flags; /*!< Logging flags. */ >-+ deUint32 flags; /*!< Logging flags. */ >- >-- deMutex lock; /*!< Lock for mutable state below. */ >-+ deMutex lock; /*!< Lock for mutable state below. */ >- >-- /* State protected by lock. */ >-- FILE* outputFile; >-- qpXmlWriter* writer; >-- deBool isSessionOpen; >-- deBool isCaseOpen; >-+ /* State protected by lock. */ >-+ FILE* outputFile; >-+ qpXmlWriter* writer; >-+ deBool isSessionOpen; >-+ deBool isCaseOpen; >- >- #if defined(DE_DEBUG) >-- ContainerStack containerStack; /*!< For container usage verification. */ >-+ ContainerStack containerStack; /*!< For container usage verification. */ >- #endif >- }; >- >- /* Maps integer to string. */ >- typedef struct qpKeyStringMap_s >- { >-- int key; >-- char* string; >-+ int key; >-+ char* string; >- } qpKeyStringMap; >- >- static const char* LOG_FORMAT_VERSION = "0.3.4"; >-@@ -149,32 +149,32 @@ static const char* LOG_FORMAT_VERSION = "0.3.4"; >- /* Mapping enum to above strings... */ >- static const qpKeyStringMap s_qpTestTypeMap[] = >- { >-- { QP_TEST_CASE_TYPE_SELF_VALIDATE, "SelfValidate" }, >-- { QP_TEST_CASE_TYPE_PERFORMANCE, "Performance" }, >-- { QP_TEST_CASE_TYPE_CAPABILITY, "Capability" }, >-- { QP_TEST_CASE_TYPE_ACCURACY, "Accuracy" }, >-+ { QP_TEST_CASE_TYPE_SELF_VALIDATE, "SelfValidate" }, >-+ { QP_TEST_CASE_TYPE_PERFORMANCE, "Performance" }, >-+ { QP_TEST_CASE_TYPE_CAPABILITY, "Capability" }, >-+ { QP_TEST_CASE_TYPE_ACCURACY, "Accuracy" }, >- >-- { QP_TEST_CASE_TYPE_LAST, DE_NULL } >-+ { QP_TEST_CASE_TYPE_LAST, DE_NULL } >- }; >- >- DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTestTypeMap) == QP_TEST_CASE_TYPE_LAST + 1); >- >- static const qpKeyStringMap s_qpTestResultMap[] = >- { >-- { QP_TEST_RESULT_PASS, "Pass" }, >-- { QP_TEST_RESULT_FAIL, "Fail" }, >-- { QP_TEST_RESULT_QUALITY_WARNING, "QualityWarning" }, >-- { QP_TEST_RESULT_COMPATIBILITY_WARNING, "CompatibilityWarning" }, >-- { QP_TEST_RESULT_PENDING, "Pending" }, /* should not be needed here */ >-- { QP_TEST_RESULT_NOT_SUPPORTED, "NotSupported" }, >-- { QP_TEST_RESULT_RESOURCE_ERROR, "ResourceError" }, >-- { QP_TEST_RESULT_INTERNAL_ERROR, "InternalError" }, >-- { QP_TEST_RESULT_CRASH, "Crash" }, >-- { QP_TEST_RESULT_TIMEOUT, "Timeout" }, >-+ { QP_TEST_RESULT_PASS, "Pass" }, >-+ { QP_TEST_RESULT_FAIL, "Fail" }, >-+ { QP_TEST_RESULT_QUALITY_WARNING, "QualityWarning" }, >-+ { QP_TEST_RESULT_COMPATIBILITY_WARNING, "CompatibilityWarning" }, >-+ { QP_TEST_RESULT_PENDING, "Pending" }, /* should not be needed here */ >-+ { QP_TEST_RESULT_NOT_SUPPORTED, "NotSupported" }, >-+ { QP_TEST_RESULT_RESOURCE_ERROR, "ResourceError" }, >-+ { QP_TEST_RESULT_INTERNAL_ERROR, "InternalError" }, >-+ { QP_TEST_RESULT_CRASH, "Crash" }, >-+ { QP_TEST_RESULT_TIMEOUT, "Timeout" }, >- >-- /* Add new values here if needed, remember to update qpTestResult enumeration. */ >-+ /* Add new values here if needed, remember to update qpTestResult enumeration. */ >- >-- { QP_TEST_RESULT_LAST, DE_NULL } >-+ { QP_TEST_RESULT_LAST, DE_NULL } >- }; >- >- DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTestResultMap) == QP_TEST_RESULT_LAST + 1); >-@@ -183,13 +183,13 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTestResultMap) == QP_TEST_RESULT_LAST + >- >- static const qpKeyStringMap s_qpTagMap[] = >- { >-- { QP_KEY_TAG_NONE, DE_NULL }, >-- { QP_KEY_TAG_PERFORMANCE, "Performance" }, >-- { QP_KEY_TAG_QUALITY, "Quality" }, >-- { QP_KEY_TAG_PRECISION, "Precision" }, >-- { QP_KEY_TAG_TIME, "Time" }, >-+ { QP_KEY_TAG_NONE, DE_NULL }, >-+ { QP_KEY_TAG_PERFORMANCE, "Performance" }, >-+ { QP_KEY_TAG_QUALITY, "Quality" }, >-+ { QP_KEY_TAG_PRECISION, "Precision" }, >-+ { QP_KEY_TAG_TIME, "Time" }, >- >-- { QP_KEY_TAG_LAST, DE_NULL } >-+ { QP_KEY_TAG_LAST, DE_NULL } >- }; >- >- DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTagMap) == QP_KEY_TAG_LAST + 1); >-@@ -198,10 +198,10 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTagMap) == QP_KEY_TAG_LAST + 1); >- >- static const qpKeyStringMap s_qpSampleValueTagMap[] = >- { >-- { QP_SAMPLE_VALUE_TAG_PREDICTOR, "Predictor" }, >-- { QP_SAMPLE_VALUE_TAG_RESPONSE, "Response" }, >-+ { QP_SAMPLE_VALUE_TAG_PREDICTOR, "Predictor" }, >-+ { QP_SAMPLE_VALUE_TAG_RESPONSE, "Response" }, >- >-- { QP_SAMPLE_VALUE_TAG_LAST, DE_NULL } >-+ { QP_SAMPLE_VALUE_TAG_LAST, DE_NULL } >- }; >- >- DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpSampleValueTagMap) == QP_SAMPLE_VALUE_TAG_LAST + 1); >-@@ -210,12 +210,12 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpSampleValueTagMap) == QP_SAMPLE_VALUE_TA >- >- static const qpKeyStringMap s_qpImageCompressionModeMap[] = >- { >-- { QP_IMAGE_COMPRESSION_MODE_NONE, "None" }, >-- { QP_IMAGE_COMPRESSION_MODE_PNG, "PNG" }, >-+ { QP_IMAGE_COMPRESSION_MODE_NONE, "None" }, >-+ { QP_IMAGE_COMPRESSION_MODE_PNG, "PNG" }, >- >-- { QP_IMAGE_COMPRESSION_MODE_BEST, DE_NULL }, /* not allowed to be written! */ >-+ { QP_IMAGE_COMPRESSION_MODE_BEST, DE_NULL }, /* not allowed to be written! */ >- >-- { QP_IMAGE_COMPRESSION_MODE_LAST, DE_NULL } >-+ { QP_IMAGE_COMPRESSION_MODE_LAST, DE_NULL } >- }; >- >- DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpImageCompressionModeMap) == QP_IMAGE_COMPRESSION_MODE_LAST + 1); >-@@ -224,10 +224,10 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpImageCompressionModeMap) == QP_IMAGE_COM >- >- static const qpKeyStringMap s_qpImageFormatMap[] = >- { >-- { QP_IMAGE_FORMAT_RGB888, "RGB888" }, >-- { QP_IMAGE_FORMAT_RGBA8888, "RGBA8888" }, >-+ { QP_IMAGE_FORMAT_RGB888, "RGB888" }, >-+ { QP_IMAGE_FORMAT_RGBA8888, "RGBA8888" }, >- >-- { QP_IMAGE_FORMAT_LAST, DE_NULL } >-+ { QP_IMAGE_FORMAT_LAST, DE_NULL } >- }; >- >- DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpImageFormatMap) == QP_IMAGE_FORMAT_LAST + 1); >-@@ -236,91 +236,91 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpImageFormatMap) == QP_IMAGE_FORMAT_LAST >- >- static const qpKeyStringMap s_qpShaderTypeMap[] = >- { >-- { QP_SHADER_TYPE_VERTEX, "VertexShader" }, >-- { QP_SHADER_TYPE_FRAGMENT, "FragmentShader" }, >-- { QP_SHADER_TYPE_GEOMETRY, "GeometryShader" }, >-- { QP_SHADER_TYPE_TESS_CONTROL, "TessControlShader" }, >-- { QP_SHADER_TYPE_TESS_EVALUATION, "TessEvaluationShader" }, >-- { QP_SHADER_TYPE_COMPUTE, "ComputeShader" }, >-+ { QP_SHADER_TYPE_VERTEX, "VertexShader" }, >-+ { QP_SHADER_TYPE_FRAGMENT, "FragmentShader" }, >-+ { QP_SHADER_TYPE_GEOMETRY, "GeometryShader" }, >-+ { QP_SHADER_TYPE_TESS_CONTROL, "TessControlShader" }, >-+ { QP_SHADER_TYPE_TESS_EVALUATION, "TessEvaluationShader" }, >-+ { QP_SHADER_TYPE_COMPUTE, "ComputeShader" }, >- >-- { QP_SHADER_TYPE_LAST, DE_NULL } >-+ { QP_SHADER_TYPE_LAST, DE_NULL } >- }; >- >- DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpShaderTypeMap) == QP_SHADER_TYPE_LAST + 1); >- >- static void qpTestLog_flushFile (qpTestLog* log) >- { >-- DE_ASSERT(log && log->outputFile); >-- fflush(log->outputFile); >-+ DE_ASSERT(log && log->outputFile); >-+ fflush(log->outputFile); >- #if (DE_OS == DE_OS_WIN32) && (DE_COMPILER == DE_COMPILER_MSC) >-- /* \todo [petri] Is this really necessary? */ >-- FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(log->outputFile))); >-+ /* \todo [petri] Is this really necessary? */ >-+ FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(log->outputFile))); >- #endif >- } >- >--#define QP_LOOKUP_STRING(KEYMAP, KEY) qpLookupString(KEYMAP, DE_LENGTH_OF_ARRAY(KEYMAP), (int)(KEY)) >-+#define QP_LOOKUP_STRING(KEYMAP, KEY) qpLookupString(KEYMAP, DE_LENGTH_OF_ARRAY(KEYMAP), (int)(KEY)) >- >- static const char* qpLookupString (const qpKeyStringMap* keyMap, int keyMapSize, int key) >- { >-- DE_ASSERT(keyMap); >-- DE_ASSERT(deInBounds32(key, 0, keyMapSize)); >-- DE_ASSERT(keyMap[key].key == key); >-- DE_UNREF(keyMapSize); /* for asserting only */ >-- return keyMap[key].string; >-+ DE_ASSERT(keyMap); >-+ DE_ASSERT(deInBounds32(key, 0, keyMapSize)); >-+ DE_ASSERT(keyMap[key].key == key); >-+ DE_UNREF(keyMapSize); /* for asserting only */ >-+ return keyMap[key].string; >- } >- >- DE_INLINE void int32ToString (int val, char buf[32]) >- { >-- deSprintf(&buf[0], 32, "%d", val); >-+ deSprintf(&buf[0], 32, "%d", val); >- } >- >- DE_INLINE void int64ToString (deInt64 val, char buf[32]) >- { >-- deSprintf(&buf[0], 32, "%lld", (long long int)val); >-+ deSprintf(&buf[0], 32, "%lld", (long long int)val); >- } >- >- DE_INLINE void floatToString (float value, char* buf, size_t bufSize) >- { >-- deSprintf(buf, bufSize, "%f", value); >-+ deSprintf(buf, bufSize, "%f", value); >- } >- >- DE_INLINE void doubleToString (double value, char* buf, size_t bufSize) >- { >-- deSprintf(buf, bufSize, "%f", value); >-+ deSprintf(buf, bufSize, "%f", value); >- } >- >- static deBool beginSession (qpTestLog* log) >- { >-- DE_ASSERT(log && !log->isSessionOpen); >-+ DE_ASSERT(log && !log->isSessionOpen); >- >-- /* Write session info. */ >-- fprintf(log->outputFile, "#sessionInfo releaseName %s\n", qpGetReleaseName()); >-- fprintf(log->outputFile, "#sessionInfo releaseId 0x%08x\n", qpGetReleaseId()); >-- fprintf(log->outputFile, "#sessionInfo targetName \"%s\"\n", qpGetTargetName()); >-+ /* Write session info. */ >-+ fprintf(log->outputFile, "#sessionInfo releaseName %s\n", qpGetReleaseName()); >-+ fprintf(log->outputFile, "#sessionInfo releaseId 0x%08x\n", qpGetReleaseId()); >-+ fprintf(log->outputFile, "#sessionInfo targetName \"%s\"\n", qpGetTargetName()); >- >- /* Write out #beginSession. */ >-- fprintf(log->outputFile, "#beginSession\n"); >-- qpTestLog_flushFile(log); >-+ fprintf(log->outputFile, "#beginSession\n"); >-+ qpTestLog_flushFile(log); >- >-- log->isSessionOpen = DE_TRUE; >-+ log->isSessionOpen = DE_TRUE; >- >-- return DE_TRUE; >-+ return DE_TRUE; >- } >- >- static deBool endSession (qpTestLog* log) >- { >-- DE_ASSERT(log && log->isSessionOpen); >-+ DE_ASSERT(log && log->isSessionOpen); >- >- /* Make sure xml is flushed. */ >- qpXmlWriter_flush(log->writer); >- >- /* Write out #endSession. */ >-- fprintf(log->outputFile, "\n#endSession\n"); >-- qpTestLog_flushFile(log); >-+ fprintf(log->outputFile, "\n#endSession\n"); >-+ qpTestLog_flushFile(log); >- >-- log->isSessionOpen = DE_FALSE; >-+ log->isSessionOpen = DE_FALSE; >- >-- return DE_TRUE; >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >-@@ -330,117 +330,117 @@ static deBool endSession (qpTestLog* log) >- *//*--------------------------------------------------------------------*/ >- qpTestLog* qpTestLog_createFileLog (const char* fileName, deUint32 flags) >- { >-- qpTestLog* log = (qpTestLog*)deCalloc(sizeof(qpTestLog)); >-- if (!log) >-- return DE_NULL; >-+ qpTestLog* log = (qpTestLog*)deCalloc(sizeof(qpTestLog)); >-+ if (!log) >-+ return DE_NULL; >- >-- DE_ASSERT(fileName && fileName[0]); /* must have filename. */ >-+ DE_ASSERT(fileName && fileName[0]); /* must have filename. */ >- >- #if defined(DE_DEBUG) >-- ContainerStack_reset(&log->containerStack); >-+ ContainerStack_reset(&log->containerStack); >- #endif >- >-- qpPrintf("Writing test log into %s\n", fileName); >-- >-- /* Create output file. */ >-- log->outputFile = fopen(fileName, "wb"); >-- if (!log->outputFile) >-- { >-- qpPrintf("ERROR: Unable to open test log output file '%s'.\n", fileName); >-- qpTestLog_destroy(log); >-- return DE_NULL; >-- } >-- >-- log->flags = flags; >-- log->writer = qpXmlWriter_createFileWriter(log->outputFile, 0, !(flags & QP_TEST_LOG_NO_FLUSH)); >-- log->lock = deMutex_create(DE_NULL); >-- log->isSessionOpen = DE_FALSE; >-- log->isCaseOpen = DE_FALSE; >-- >-- if (!log->writer) >-- { >-- qpPrintf("ERROR: Unable to create output XML writer to file '%s'.\n", fileName); >-- qpTestLog_destroy(log); >-- return DE_NULL; >-- } >-- >-- if (!log->lock) >-- { >-- qpPrintf("ERROR: Unable to create mutex.\n"); >-- qpTestLog_destroy(log); >-- return DE_NULL; >-- } >-- >-- beginSession(log); >-- >-- return log; >-+ qpPrintf("Writing test log into %s\n", fileName); >-+ >-+ /* Create output file. */ >-+ log->outputFile = fopen(fileName, "wb"); >-+ if (!log->outputFile) >-+ { >-+ qpPrintf("ERROR: Unable to open test log output file '%s'.\n", fileName); >-+ qpTestLog_destroy(log); >-+ return DE_NULL; >-+ } >-+ >-+ log->flags = flags; >-+ log->writer = qpXmlWriter_createFileWriter(log->outputFile, 0, !(flags & QP_TEST_LOG_NO_FLUSH)); >-+ log->lock = deMutex_create(DE_NULL); >-+ log->isSessionOpen = DE_FALSE; >-+ log->isCaseOpen = DE_FALSE; >-+ >-+ if (!log->writer) >-+ { >-+ qpPrintf("ERROR: Unable to create output XML writer to file '%s'.\n", fileName); >-+ qpTestLog_destroy(log); >-+ return DE_NULL; >-+ } >-+ >-+ if (!log->lock) >-+ { >-+ qpPrintf("ERROR: Unable to create mutex.\n"); >-+ qpTestLog_destroy(log); >-+ return DE_NULL; >-+ } >-+ >-+ beginSession(log); >-+ >-+ return log; >- } >- >- /*--------------------------------------------------------------------*//*! >- * \brief Destroy a logger instance >-- * \param a qpTestLog instance >-+ * \param a qpTestLog instance >- *//*--------------------------------------------------------------------*/ >- void qpTestLog_destroy (qpTestLog* log) >- { >-- DE_ASSERT(log); >-+ DE_ASSERT(log); >- >-- if (log->isSessionOpen) >-- endSession(log); >-+ if (log->isSessionOpen) >-+ endSession(log); >- >-- if (log->writer) >-- qpXmlWriter_destroy(log->writer); >-+ if (log->writer) >-+ qpXmlWriter_destroy(log->writer); >- >-- if (log->outputFile) >-- fclose(log->outputFile); >-+ if (log->outputFile) >-+ fclose(log->outputFile); >- >-- if (log->lock) >-- deMutex_destroy(log->lock); >-+ if (log->lock) >-+ deMutex_destroy(log->lock); >- >-- deFree(log); >-+ deFree(log); >- } >- >- /*--------------------------------------------------------------------*//*! >- * \brief Log start of test case >- * \param log qpTestLog instance >-- * \param testCasePath Full test case path (as seen in Candy). >-- * \param testCaseType Test case type >-+ * \param testCasePath Full test case path (as seen in Candy). >-+ * \param testCaseType Test case type >- * \return true if ok, false otherwise >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_startCase (qpTestLog* log, const char* testCasePath, qpTestCaseType testCaseType) >- { >-- const char* typeStr = QP_LOOKUP_STRING(s_qpTestTypeMap, testCaseType); >-- int numResultAttribs = 0; >-- qpXmlAttribute resultAttribs[8]; >-+ const char* typeStr = QP_LOOKUP_STRING(s_qpTestTypeMap, testCaseType); >-+ int numResultAttribs = 0; >-+ qpXmlAttribute resultAttribs[8]; >- >-- DE_ASSERT(log && testCasePath && (testCasePath[0] != 0)); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log && testCasePath && (testCasePath[0] != 0)); >-+ deMutex_lock(log->lock); >- >-- DE_ASSERT(!log->isCaseOpen); >-- DE_ASSERT(ContainerStack_isEmpty(&log->containerStack)); >-+ DE_ASSERT(!log->isCaseOpen); >-+ DE_ASSERT(ContainerStack_isEmpty(&log->containerStack)); >- >-- /* Flush XML and write out #beginTestCaseResult. */ >-- qpXmlWriter_flush(log->writer); >-- fprintf(log->outputFile, "\n#beginTestCaseResult %s\n", testCasePath); >-- if (!(log->flags & QP_TEST_LOG_NO_FLUSH)) >-- qpTestLog_flushFile(log); >-- >-- log->isCaseOpen = DE_TRUE; >-- >-- /* Fill in attributes. */ >-- resultAttribs[numResultAttribs++] = qpSetStringAttrib("Version", LOG_FORMAT_VERSION); >-- resultAttribs[numResultAttribs++] = qpSetStringAttrib("CasePath", testCasePath); >-- resultAttribs[numResultAttribs++] = qpSetStringAttrib("CaseType", typeStr); >-- >-- if (!qpXmlWriter_startDocument(log->writer) || >-- !qpXmlWriter_startElement(log->writer, "TestCaseResult", numResultAttribs, resultAttribs)) >-- { >-- qpPrintf("qpTestLog_startCase(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ /* Flush XML and write out #beginTestCaseResult. */ >-+ qpXmlWriter_flush(log->writer); >-+ fprintf(log->outputFile, "\n#beginTestCaseResult %s\n", testCasePath); >-+ if (!(log->flags & QP_TEST_LOG_NO_FLUSH)) >-+ qpTestLog_flushFile(log); >-+ >-+ log->isCaseOpen = DE_TRUE; >-+ >-+ /* Fill in attributes. */ >-+ resultAttribs[numResultAttribs++] = qpSetStringAttrib("Version", LOG_FORMAT_VERSION); >-+ resultAttribs[numResultAttribs++] = qpSetStringAttrib("CasePath", testCasePath); >-+ resultAttribs[numResultAttribs++] = qpSetStringAttrib("CaseType", typeStr); >-+ >-+ if (!qpXmlWriter_startDocument(log->writer) || >-+ !qpXmlWriter_startElement(log->writer, "TestCaseResult", numResultAttribs, resultAttribs)) >-+ { >-+ qpPrintf("qpTestLog_startCase(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >-+ >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >-@@ -452,600 +452,600 @@ deBool qpTestLog_startCase (qpTestLog* log, const char* testCasePath, qpTestCase >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_endCase (qpTestLog* log, qpTestResult result, const char* resultDetails) >- { >-- const char* statusStr = QP_LOOKUP_STRING(s_qpTestResultMap, result); >-- qpXmlAttribute statusAttrib = qpSetStringAttrib("StatusCode", statusStr); >-- >-- deMutex_lock(log->lock); >-- >-- DE_ASSERT(log->isCaseOpen); >-- DE_ASSERT(ContainerStack_isEmpty(&log->containerStack)); >-- >-- /* <Result StatusCode="Pass">Result details</Result> >-- * </TestCaseResult> >-- */ >-- if (!qpXmlWriter_startElement(log->writer, "Result", 1, &statusAttrib) || >-- (resultDetails && !qpXmlWriter_writeString(log->writer, resultDetails)) || >-- !qpXmlWriter_endElement(log->writer, "Result") || >-- !qpXmlWriter_endElement(log->writer, "TestCaseResult") || >-- !qpXmlWriter_endDocument(log->writer)) /* Close any XML elements still open */ >-- { >-- qpPrintf("qpTestLog_endCase(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-- >-- /* Flush XML and write #endTestCaseResult. */ >-- qpXmlWriter_flush(log->writer); >-- fprintf(log->outputFile, "\n#endTestCaseResult\n"); >-- if (!(log->flags & QP_TEST_LOG_NO_FLUSH)) >-- qpTestLog_flushFile(log); >-- >-- log->isCaseOpen = DE_FALSE; >-- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ const char* statusStr = QP_LOOKUP_STRING(s_qpTestResultMap, result); >-+ qpXmlAttribute statusAttrib = qpSetStringAttrib("StatusCode", statusStr); >-+ >-+ deMutex_lock(log->lock); >-+ >-+ DE_ASSERT(log->isCaseOpen); >-+ DE_ASSERT(ContainerStack_isEmpty(&log->containerStack)); >-+ >-+ /* <Result StatusCode="Pass">Result details</Result> >-+ * </TestCaseResult> >-+ */ >-+ if (!qpXmlWriter_startElement(log->writer, "Result", 1, &statusAttrib) || >-+ (resultDetails && !qpXmlWriter_writeString(log->writer, resultDetails)) || >-+ !qpXmlWriter_endElement(log->writer, "Result") || >-+ !qpXmlWriter_endElement(log->writer, "TestCaseResult") || >-+ !qpXmlWriter_endDocument(log->writer)) /* Close any XML elements still open */ >-+ { >-+ qpPrintf("qpTestLog_endCase(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >-+ >-+ /* Flush XML and write #endTestCaseResult. */ >-+ qpXmlWriter_flush(log->writer); >-+ fprintf(log->outputFile, "\n#endTestCaseResult\n"); >-+ if (!(log->flags & QP_TEST_LOG_NO_FLUSH)) >-+ qpTestLog_flushFile(log); >-+ >-+ log->isCaseOpen = DE_FALSE; >-+ >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >- * \brief Abrupt termination of logging. >-- * \param log qpTestLog instance >-- * \param result Result code, only Crash and Timeout are allowed. >-+ * \param log qpTestLog instance >-+ * \param result Result code, only Crash and Timeout are allowed. >- * \return true if ok, false otherwise >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_terminateCase (qpTestLog* log, qpTestResult result) >- { >-- const char* resultStr = QP_LOOKUP_STRING(s_qpTestResultMap, result); >-+ const char* resultStr = QP_LOOKUP_STRING(s_qpTestResultMap, result); >- >-- DE_ASSERT(log); >-- DE_ASSERT(result == QP_TEST_RESULT_CRASH || result == QP_TEST_RESULT_TIMEOUT); >-+ DE_ASSERT(log); >-+ DE_ASSERT(result == QP_TEST_RESULT_CRASH || result == QP_TEST_RESULT_TIMEOUT); >- >-- deMutex_lock(log->lock); >-+ deMutex_lock(log->lock); >- >-- if (!log->isCaseOpen) >-- { >-- deMutex_unlock(log->lock); >-- return DE_FALSE; /* Soft error. This is called from error handler. */ >-- } >-+ if (!log->isCaseOpen) >-+ { >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; /* Soft error. This is called from error handler. */ >-+ } >- >-- /* Flush XML and write #terminateTestCaseResult. */ >-- qpXmlWriter_flush(log->writer); >-- fprintf(log->outputFile, "\n#terminateTestCaseResult %s\n", resultStr); >-- qpTestLog_flushFile(log); >-+ /* Flush XML and write #terminateTestCaseResult. */ >-+ qpXmlWriter_flush(log->writer); >-+ fprintf(log->outputFile, "\n#terminateTestCaseResult %s\n", resultStr); >-+ qpTestLog_flushFile(log); >- >-- log->isCaseOpen = DE_FALSE; >-+ log->isCaseOpen = DE_FALSE; >- >- #if defined(DE_DEBUG) >-- ContainerStack_reset(&log->containerStack); >-+ ContainerStack_reset(&log->containerStack); >- #endif >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- static deBool qpTestLog_writeKeyValuePair (qpTestLog* log, const char* elementName, const char* name, const char* description, const char* unit, qpKeyValueTag tag, const char* text) >- { >-- const char* tagString = QP_LOOKUP_STRING(s_qpTagMap, tag); >-- qpXmlAttribute attribs[8]; >-- int numAttribs = 0; >-- >-- DE_ASSERT(log && elementName && text); >-- deMutex_lock(log->lock); >-- >-- /* Fill in attributes. */ >-- if (name) attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-- if (description) attribs[numAttribs++] = qpSetStringAttrib("Description", description); >-- if (tagString) attribs[numAttribs++] = qpSetStringAttrib("Tag", tagString); >-- if (unit) attribs[numAttribs++] = qpSetStringAttrib("Unit", unit); >-- >-- if (!qpXmlWriter_startElement(log->writer, elementName, numAttribs, attribs) || >-- !qpXmlWriter_writeString(log->writer, text) || >-- !qpXmlWriter_endElement(log->writer, elementName)) >-- { >-- qpPrintf("qpTestLog_writeKeyValuePair(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ const char* tagString = QP_LOOKUP_STRING(s_qpTagMap, tag); >-+ qpXmlAttribute attribs[8]; >-+ int numAttribs = 0; >-+ >-+ DE_ASSERT(log && elementName && text); >-+ deMutex_lock(log->lock); >-+ >-+ /* Fill in attributes. */ >-+ if (name) attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-+ if (description) attribs[numAttribs++] = qpSetStringAttrib("Description", description); >-+ if (tagString) attribs[numAttribs++] = qpSetStringAttrib("Tag", tagString); >-+ if (unit) attribs[numAttribs++] = qpSetStringAttrib("Unit", unit); >-+ >-+ if (!qpXmlWriter_startElement(log->writer, elementName, numAttribs, attribs) || >-+ !qpXmlWriter_writeString(log->writer, text) || >-+ !qpXmlWriter_endElement(log->writer, elementName)) >-+ { >-+ qpPrintf("qpTestLog_writeKeyValuePair(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >-+ >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >- * \brief Write a message to output log >-- * \param log qpTestLog instance >-- * \param format Format string of message >-- * \param ... Parameters for message >-+ * \param log qpTestLog instance >-+ * \param format Format string of message >-+ * \param ... Parameters for message >- * \return true if ok, false otherwise >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_writeMessage (qpTestLog* log, const char* format, ...) >- { >-- char buffer[1024]; >-- va_list args; >-+ char buffer[1024]; >-+ va_list args; >- >-- /* \todo [petri] Handle buffer overflows! */ >-+ /* \todo [petri] Handle buffer overflows! */ >- >-- va_start(args, format); >-- buffer[DE_LENGTH_OF_ARRAY(buffer) - 1] = 0; >-- vsnprintf(buffer, sizeof(buffer), format, args); >-- va_end(args); >-+ va_start(args, format); >-+ buffer[DE_LENGTH_OF_ARRAY(buffer) - 1] = 0; >-+ vsnprintf(buffer, sizeof(buffer), format, args); >-+ va_end(args); >- >-- /* <Text>text</Text> */ >-- return qpTestLog_writeKeyValuePair(log, "Text", DE_NULL, DE_NULL, DE_NULL, QP_KEY_TAG_LAST, buffer); >-+ /* <Text>text</Text> */ >-+ return qpTestLog_writeKeyValuePair(log, "Text", DE_NULL, DE_NULL, DE_NULL, QP_KEY_TAG_LAST, buffer); >- } >- >- /*--------------------------------------------------------------------*//*! >- * \brief Write key-value-pair into log >-- * \param log qpTestLog instance >-- * \param name Unique identifier for entry >-- * \param description Human readable description >-- * \param tag Optional tag >-- * \param value Value of the key-value-pair >-+ * \param log qpTestLog instance >-+ * \param name Unique identifier for entry >-+ * \param description Human readable description >-+ * \param tag Optional tag >-+ * \param value Value of the key-value-pair >- * \return true if ok, false otherwise >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_writeText (qpTestLog* log, const char* name, const char* description, qpKeyValueTag tag, const char* text) >- { >-- /* <Text Name="name" Description="description" Tag="tag">text</Text> */ >-- return qpTestLog_writeKeyValuePair(log, "Text", name, description, DE_NULL, tag, text); >-+ /* <Text Name="name" Description="description" Tag="tag">text</Text> */ >-+ return qpTestLog_writeKeyValuePair(log, "Text", name, description, DE_NULL, tag, text); >- } >- >- /*--------------------------------------------------------------------*//*! >- * \brief Write key-value-pair into log >-- * \param log qpTestLog instance >-- * \param name Unique identifier for entry >-- * \param description Human readable description >-- * \param tag Optional tag >-- * \param value Value of the key-value-pair >-+ * \param log qpTestLog instance >-+ * \param name Unique identifier for entry >-+ * \param description Human readable description >-+ * \param tag Optional tag >-+ * \param value Value of the key-value-pair >- * \return true if ok, false otherwise >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_writeInteger (qpTestLog* log, const char* name, const char* description, const char* unit, qpKeyValueTag tag, deInt64 value) >- { >-- char tmpString[64]; >-- int64ToString(value, tmpString); >-+ char tmpString[64]; >-+ int64ToString(value, tmpString); >- >-- /* <Number Name="name" Description="description" Tag="Performance">15</Number> */ >-- return qpTestLog_writeKeyValuePair(log, "Number", name, description, unit, tag, tmpString); >-+ /* <Number Name="name" Description="description" Tag="Performance">15</Number> */ >-+ return qpTestLog_writeKeyValuePair(log, "Number", name, description, unit, tag, tmpString); >- } >- >- /*--------------------------------------------------------------------*//*! >- * \brief Write key-value-pair into log >-- * \param log qpTestLog instance >-- * \param name Unique identifier for entry >-- * \param description Human readable description >-- * \param tag Optional tag >-- * \param value Value of the key-value-pair >-+ * \param log qpTestLog instance >-+ * \param name Unique identifier for entry >-+ * \param description Human readable description >-+ * \param tag Optional tag >-+ * \param value Value of the key-value-pair >- * \return true if ok, false otherwise >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_writeFloat (qpTestLog* log, const char* name, const char* description, const char* unit, qpKeyValueTag tag, float value) >- { >-- char tmpString[64]; >-- floatToString(value, tmpString, sizeof(tmpString)); >-+ char tmpString[64]; >-+ floatToString(value, tmpString, sizeof(tmpString)); >- >-- /* <Number Name="name" Description="description" Tag="Performance">15</Number> */ >-- return qpTestLog_writeKeyValuePair(log, "Number", name, description, unit, tag, tmpString); >-+ /* <Number Name="name" Description="description" Tag="Performance">15</Number> */ >-+ return qpTestLog_writeKeyValuePair(log, "Number", name, description, unit, tag, tmpString); >- } >- >- typedef struct Buffer_s >- { >-- size_t capacity; >-- size_t size; >-- deUint8* data; >-+ size_t capacity; >-+ size_t size; >-+ deUint8* data; >- } Buffer; >- >- void Buffer_init (Buffer* buffer) >- { >-- buffer->capacity = 0; >-- buffer->size = 0; >-- buffer->data = DE_NULL; >-+ buffer->capacity = 0; >-+ buffer->size = 0; >-+ buffer->data = DE_NULL; >- } >- >- void Buffer_deinit (Buffer* buffer) >- { >-- deFree(buffer->data); >-- Buffer_init(buffer); >-+ deFree(buffer->data); >-+ Buffer_init(buffer); >- } >- >- deBool Buffer_resize (Buffer* buffer, size_t newSize) >- { >-- /* Grow buffer if necessary. */ >-- if (newSize > buffer->capacity) >-- { >-- size_t newCapacity = (size_t)deAlign32(deMax32(2*(int)buffer->capacity, (int)newSize), 512); >-- deUint8* newData = (deUint8*)deMalloc(newCapacity); >-- if (!newData) >-- return DE_FALSE; >-- >-- memcpy(newData, buffer->data, buffer->size); >-- deFree(buffer->data); >-- buffer->data = newData; >-- buffer->capacity = newCapacity; >-- } >-- >-- buffer->size = newSize; >-- return DE_TRUE; >-+ /* Grow buffer if necessary. */ >-+ if (newSize > buffer->capacity) >-+ { >-+ size_t newCapacity = (size_t)deAlign32(deMax32(2*(int)buffer->capacity, (int)newSize), 512); >-+ deUint8* newData = (deUint8*)deMalloc(newCapacity); >-+ if (!newData) >-+ return DE_FALSE; >-+ >-+ memcpy(newData, buffer->data, buffer->size); >-+ deFree(buffer->data); >-+ buffer->data = newData; >-+ buffer->capacity = newCapacity; >-+ } >-+ >-+ buffer->size = newSize; >-+ return DE_TRUE; >- } >- >- deBool Buffer_append (Buffer* buffer, const deUint8* data, size_t numBytes) >- { >-- size_t offset = buffer->size; >-+ size_t offset = buffer->size; >- >-- if (!Buffer_resize(buffer, buffer->size + numBytes)) >-- return DE_FALSE; >-+ if (!Buffer_resize(buffer, buffer->size + numBytes)) >-+ return DE_FALSE; >- >-- /* Append bytes. */ >-- memcpy(&buffer->data[offset], data, numBytes); >-- return DE_TRUE; >-+ /* Append bytes. */ >-+ memcpy(&buffer->data[offset], data, numBytes); >-+ return DE_TRUE; >- } >- >- #if defined(QP_SUPPORT_PNG) >- void pngWriteData (png_structp png, png_bytep dataPtr, png_size_t numBytes) >- { >-- Buffer* buffer = (Buffer*)png_get_io_ptr(png); >-- if (!Buffer_append(buffer, (const deUint8*)dataPtr, numBytes)) >-- png_error(png, "unable to resize PNG write buffer!"); >-+ Buffer* buffer = (Buffer*)png_get_io_ptr(png); >-+ if (!Buffer_append(buffer, (const deUint8*)dataPtr, numBytes)) >-+ png_error(png, "unable to resize PNG write buffer!"); >- } >- >- void pngFlushData (png_structp png) >- { >-- DE_UNREF(png); >-- /* nada */ >-+ DE_UNREF(png); >-+ /* nada */ >- } >- >- static deBool writeCompressedPNG (png_structp png, png_infop info, png_byte** rowPointers, int width, int height, int colorFormat) >- { >-- if (setjmp(png_jmpbuf(png)) == 0) >-- { >-- /* Write data. */ >-- png_set_IHDR(png, info, (png_uint_32)width, (png_uint_32)height, >-- 8, >-- colorFormat, >-- PNG_INTERLACE_NONE, >-- PNG_COMPRESSION_TYPE_BASE, >-- PNG_FILTER_TYPE_BASE); >-- png_write_info(png, info); >-- png_write_image(png, rowPointers); >-- png_write_end(png, NULL); >-- >-- return DE_TRUE; >-- } >-- else >-- return DE_FALSE; >-+ if (setjmp(png_jmpbuf(png)) == 0) >-+ { >-+ /* Write data. */ >-+ png_set_IHDR(png, info, (png_uint_32)width, (png_uint_32)height, >-+ 8, >-+ colorFormat, >-+ PNG_INTERLACE_NONE, >-+ PNG_COMPRESSION_TYPE_BASE, >-+ PNG_FILTER_TYPE_BASE); >-+ png_write_info(png, info); >-+ png_write_image(png, rowPointers); >-+ png_write_end(png, NULL); >-+ >-+ return DE_TRUE; >-+ } >-+ else >-+ return DE_FALSE; >- } >- >- static deBool compressImagePNG (Buffer* buffer, qpImageFormat imageFormat, int width, int height, int rowStride, const void* data) >- { >-- deBool compressOk = DE_FALSE; >-- png_structp png = DE_NULL; >-- png_infop info = DE_NULL; >-- png_byte** rowPointers = DE_NULL; >-- deBool hasAlpha = imageFormat == QP_IMAGE_FORMAT_RGBA8888; >-- int ndx; >-- >-- /* Handle format. */ >-- DE_ASSERT(imageFormat == QP_IMAGE_FORMAT_RGB888 || imageFormat == QP_IMAGE_FORMAT_RGBA8888); >-- >-- /* Allocate & set row pointers. */ >-- rowPointers = (png_byte**)deMalloc((size_t)height * sizeof(png_byte*)); >-- if (!rowPointers) >-- return DE_FALSE; >-- >-- for (ndx = 0; ndx < height; ndx++) >-- rowPointers[ndx] = (png_byte*)((const deUint8*)data + ndx*rowStride); >-- >-- /* Initialize PNG compressor. */ >-- png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); >-- info = png ? png_create_info_struct(png) : DE_NULL; >-- if (png && info) >-- { >-- /* Set our own write function. */ >-- png_set_write_fn(png, buffer, pngWriteData, pngFlushData); >-- >-- compressOk = writeCompressedPNG(png, info, rowPointers, width, height, >-- hasAlpha ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB); >-- } >-- >-- /* Cleanup & return. */ >-- if (png && info) >-- { >-- png_destroy_info_struct(png, &info); >-- png_destroy_write_struct(&png, DE_NULL); >-- } >-- else if (png) >-- png_destroy_write_struct(&png, &info); >-- >-- deFree(rowPointers); >-- return compressOk; >-+ deBool compressOk = DE_FALSE; >-+ png_structp png = DE_NULL; >-+ png_infop info = DE_NULL; >-+ png_byte** rowPointers = DE_NULL; >-+ deBool hasAlpha = imageFormat == QP_IMAGE_FORMAT_RGBA8888; >-+ int ndx; >-+ >-+ /* Handle format. */ >-+ DE_ASSERT(imageFormat == QP_IMAGE_FORMAT_RGB888 || imageFormat == QP_IMAGE_FORMAT_RGBA8888); >-+ >-+ /* Allocate & set row pointers. */ >-+ rowPointers = (png_byte**)deMalloc((size_t)height * sizeof(png_byte*)); >-+ if (!rowPointers) >-+ return DE_FALSE; >-+ >-+ for (ndx = 0; ndx < height; ndx++) >-+ rowPointers[ndx] = (png_byte*)((const deUint8*)data + ndx*rowStride); >-+ >-+ /* Initialize PNG compressor. */ >-+ png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); >-+ info = png ? png_create_info_struct(png) : DE_NULL; >-+ if (png && info) >-+ { >-+ /* Set our own write function. */ >-+ png_set_write_fn(png, buffer, pngWriteData, pngFlushData); >-+ >-+ compressOk = writeCompressedPNG(png, info, rowPointers, width, height, >-+ hasAlpha ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB); >-+ } >-+ >-+ /* Cleanup & return. */ >-+ if (png && info) >-+ { >-+ png_destroy_info_struct(png, &info); >-+ png_destroy_write_struct(&png, DE_NULL); >-+ } >-+ else if (png) >-+ png_destroy_write_struct(&png, &info); >-+ >-+ deFree(rowPointers); >-+ return compressOk; >- } >- #endif /* QP_SUPPORT_PNG */ >- >- /*--------------------------------------------------------------------*//*! >- * \brief Start image set >-- * \param log qpTestLog instance >-- * \param name Unique identifier for the set >-- * \param description Human readable description >-+ * \param log qpTestLog instance >-+ * \param name Unique identifier for the set >-+ * \param description Human readable description >- * \return true if ok, false otherwise >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_startImageSet (qpTestLog* log, const char* name, const char* description) >- { >-- qpXmlAttribute attribs[4]; >-- int numAttribs = 0; >-+ qpXmlAttribute attribs[4]; >-+ int numAttribs = 0; >- >-- DE_ASSERT(log && name); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log && name); >-+ deMutex_lock(log->lock); >- >-- attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-- if (description) >-- attribs[numAttribs++] = qpSetStringAttrib("Description", description); >-+ attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-+ if (description) >-+ attribs[numAttribs++] = qpSetStringAttrib("Description", description); >- >-- /* <ImageSet Name="<name>"> */ >-- if (!qpXmlWriter_startElement(log->writer, "ImageSet", numAttribs, attribs)) >-- { >-- qpPrintf("qpTestLog_startImageSet(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ /* <ImageSet Name="<name>"> */ >-+ if (!qpXmlWriter_startElement(log->writer, "ImageSet", numAttribs, attribs)) >-+ { >-+ qpPrintf("qpTestLog_startImageSet(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_IMAGESET)); >-+ DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_IMAGESET)); >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >- * \brief End image set >-- * \param log qpTestLog instance >-+ * \param log qpTestLog instance >- * \return true if ok, false otherwise >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_endImageSet (qpTestLog* log) >- { >-- DE_ASSERT(log); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log); >-+ deMutex_lock(log->lock); >- >-- /* <ImageSet Name="<name>"> */ >-- if (!qpXmlWriter_endElement(log->writer, "ImageSet")) >-- { >-- qpPrintf("qpTestLog_endImageSet(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ /* <ImageSet Name="<name>"> */ >-+ if (!qpXmlWriter_endElement(log->writer, "ImageSet")) >-+ { >-+ qpPrintf("qpTestLog_endImageSet(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_IMAGESET); >-+ DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_IMAGESET); >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >- * \brief Write base64 encoded raw image data into log >-- * \param log qpTestLog instance >-- * \param name Unique name (matching names can be compared across BatchResults). >-- * \param description Textual description (shown in Candy). >-- * \param compressionMode Compression mode >-- * \param imageFormat Color format >-- * \param width Width in pixels >-- * \param height Height in pixels >-- * \param stride Data stride (offset between rows) >-- * \param data Pointer to pixel data >-+ * \param log qpTestLog instance >-+ * \param name Unique name (matching names can be compared across BatchResults). >-+ * \param description Textual description (shown in Candy). >-+ * \param compressionMode Compression mode >-+ * \param imageFormat Color format >-+ * \param width Width in pixels >-+ * \param height Height in pixels >-+ * \param stride Data stride (offset between rows) >-+ * \param data Pointer to pixel data >- * \return 0 if OK, otherwise <0 >- *//*--------------------------------------------------------------------*/ >--deBool qpTestLog_writeImage ( >-- qpTestLog* log, >-- const char* name, >-- const char* description, >-- qpImageCompressionMode compressionMode, >-- qpImageFormat imageFormat, >-- int width, >-- int height, >-- int stride, >-- const void* data) >--{ >-- char widthStr[32]; >-- char heightStr[32]; >-- qpXmlAttribute attribs[8]; >-- int numAttribs = 0; >-- Buffer compressedBuffer; >-- const void* writeDataPtr = DE_NULL; >-- size_t writeDataBytes = ~(size_t)0; >-- >-- DE_ASSERT(log && name); >-- DE_ASSERT(deInRange32(width, 1, 16384)); >-- DE_ASSERT(deInRange32(height, 1, 16384)); >-- DE_ASSERT(data); >-- >-- if (log->flags & QP_TEST_LOG_EXCLUDE_IMAGES) >-- return DE_TRUE; /* Image not logged. */ >-- >-- Buffer_init(&compressedBuffer); >-- >-- /* BEST compression mode defaults to PNG. */ >-- if (compressionMode == QP_IMAGE_COMPRESSION_MODE_BEST) >-- { >-+deBool qpTestLog_writeImage ( >-+ qpTestLog* log, >-+ const char* name, >-+ const char* description, >-+ qpImageCompressionMode compressionMode, >-+ qpImageFormat imageFormat, >-+ int width, >-+ int height, >-+ int stride, >-+ const void* data) >-+{ >-+ char widthStr[32]; >-+ char heightStr[32]; >-+ qpXmlAttribute attribs[8]; >-+ int numAttribs = 0; >-+ Buffer compressedBuffer; >-+ const void* writeDataPtr = DE_NULL; >-+ size_t writeDataBytes = ~(size_t)0; >-+ >-+ DE_ASSERT(log && name); >-+ DE_ASSERT(deInRange32(width, 1, 16384)); >-+ DE_ASSERT(deInRange32(height, 1, 16384)); >-+ DE_ASSERT(data); >-+ >-+ if (log->flags & QP_TEST_LOG_EXCLUDE_IMAGES) >-+ return DE_TRUE; /* Image not logged. */ >-+ >-+ Buffer_init(&compressedBuffer); >-+ >-+ /* BEST compression mode defaults to PNG. */ >-+ if (compressionMode == QP_IMAGE_COMPRESSION_MODE_BEST) >-+ { >- #if defined(QP_SUPPORT_PNG) >-- compressionMode = QP_IMAGE_COMPRESSION_MODE_PNG; >-+ compressionMode = QP_IMAGE_COMPRESSION_MODE_PNG; >- #else >-- compressionMode = QP_IMAGE_COMPRESSION_MODE_NONE; >-+ compressionMode = QP_IMAGE_COMPRESSION_MODE_NONE; >- #endif >-- } >-+ } >- >- #if defined(QP_SUPPORT_PNG) >-- /* Try storing with PNG compression. */ >-- if (compressionMode == QP_IMAGE_COMPRESSION_MODE_PNG) >-- { >-- deBool compressOk = compressImagePNG(&compressedBuffer, imageFormat, width, height, stride, data); >-- if (compressOk) >-- { >-- writeDataPtr = compressedBuffer.data; >-- writeDataBytes = compressedBuffer.size; >-- } >-- else >-- { >-- /* Fall-back to default compression. */ >-- qpPrintf("WARNING: PNG compression failed -- storing image uncompressed.\n"); >-- compressionMode = QP_IMAGE_COMPRESSION_MODE_NONE; >-- } >-- } >-+ /* Try storing with PNG compression. */ >-+ if (compressionMode == QP_IMAGE_COMPRESSION_MODE_PNG) >-+ { >-+ deBool compressOk = compressImagePNG(&compressedBuffer, imageFormat, width, height, stride, data); >-+ if (compressOk) >-+ { >-+ writeDataPtr = compressedBuffer.data; >-+ writeDataBytes = compressedBuffer.size; >-+ } >-+ else >-+ { >-+ /* Fall-back to default compression. */ >-+ qpPrintf("WARNING: PNG compression failed -- storing image uncompressed.\n"); >-+ compressionMode = QP_IMAGE_COMPRESSION_MODE_NONE; >-+ } >-+ } >- #endif >- >-- /* Handle image compression. */ >-- switch (compressionMode) >-- { >-- case QP_IMAGE_COMPRESSION_MODE_NONE: >-- { >-- int pixelSize = imageFormat == QP_IMAGE_FORMAT_RGB888 ? 3 : 4; >-- int packedStride = pixelSize*width; >-- >-- if (packedStride == stride) >-- writeDataPtr = data; >-- else >-- { >-- /* Need to re-pack pixels. */ >-- if (Buffer_resize(&compressedBuffer, (size_t)(packedStride*height))) >-- { >-- int row; >-- for (row = 0; row < height; row++) >-- memcpy(&compressedBuffer.data[packedStride*row], &((const deUint8*)data)[row*stride], (size_t)(pixelSize*width)); >-- } >-- else >-- { >-- qpPrintf("ERROR: Failed to pack pixels for writing.\n"); >-- Buffer_deinit(&compressedBuffer); >-- return DE_FALSE; >-- } >-- } >-- >-- writeDataBytes = (size_t)(packedStride*height); >-- break; >-- } >-+ /* Handle image compression. */ >-+ switch (compressionMode) >-+ { >-+ case QP_IMAGE_COMPRESSION_MODE_NONE: >-+ { >-+ int pixelSize = imageFormat == QP_IMAGE_FORMAT_RGB888 ? 3 : 4; >-+ int packedStride = pixelSize*width; >-+ >-+ if (packedStride == stride) >-+ writeDataPtr = data; >-+ else >-+ { >-+ /* Need to re-pack pixels. */ >-+ if (Buffer_resize(&compressedBuffer, (size_t)(packedStride*height))) >-+ { >-+ int row; >-+ for (row = 0; row < height; row++) >-+ memcpy(&compressedBuffer.data[packedStride*row], &((const deUint8*)data)[row*stride], (size_t)(pixelSize*width)); >-+ } >-+ else >-+ { >-+ qpPrintf("ERROR: Failed to pack pixels for writing.\n"); >-+ Buffer_deinit(&compressedBuffer); >-+ return DE_FALSE; >-+ } >-+ } >-+ >-+ writeDataBytes = (size_t)(packedStride*height); >-+ break; >-+ } >- >- #if defined(QP_SUPPORT_PNG) >-- case QP_IMAGE_COMPRESSION_MODE_PNG: >-- DE_ASSERT(writeDataPtr); /* Already handled. */ >-- break; >-+ case QP_IMAGE_COMPRESSION_MODE_PNG: >-+ DE_ASSERT(writeDataPtr); /* Already handled. */ >-+ break; >- #endif >- >-- default: >-- qpPrintf("qpTestLog_writeImage(): Unknown compression mode: %s\n", QP_LOOKUP_STRING(s_qpImageCompressionModeMap, compressionMode)); >-- Buffer_deinit(&compressedBuffer); >-- return DE_FALSE; >-- } >-- >-- /* Fill in attributes. */ >-- int32ToString(width, widthStr); >-- int32ToString(height, heightStr); >-- attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-- attribs[numAttribs++] = qpSetStringAttrib("Width", widthStr); >-- attribs[numAttribs++] = qpSetStringAttrib("Height", heightStr); >-- attribs[numAttribs++] = qpSetStringAttrib("Format", QP_LOOKUP_STRING(s_qpImageFormatMap, imageFormat)); >-- attribs[numAttribs++] = qpSetStringAttrib("CompressionMode", QP_LOOKUP_STRING(s_qpImageCompressionModeMap, compressionMode)); >-- if (description) attribs[numAttribs++] = qpSetStringAttrib("Description", description); >-- >-- /* \note Log lock is acquired after compression! */ >-- deMutex_lock(log->lock); >-- >-- /* <Image ID="result" Name="Foobar" Width="640" Height="480" Format="RGB888" CompressionMode="None">base64 data</Image> */ >-- if (!qpXmlWriter_startElement(log->writer, "Image", numAttribs, attribs) || >-- !qpXmlWriter_writeBase64(log->writer, (const deUint8*)writeDataPtr, writeDataBytes) || >-- !qpXmlWriter_endElement(log->writer, "Image")) >-- { >-- qpPrintf("qpTestLog_writeImage(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- Buffer_deinit(&compressedBuffer); >-- return DE_FALSE; >-- } >-- >-- deMutex_unlock(log->lock); >-- >-- /* Free compressed data if allocated. */ >-- Buffer_deinit(&compressedBuffer); >-- >-- return DE_TRUE; >-+ default: >-+ qpPrintf("qpTestLog_writeImage(): Unknown compression mode: %s\n", QP_LOOKUP_STRING(s_qpImageCompressionModeMap, compressionMode)); >-+ Buffer_deinit(&compressedBuffer); >-+ return DE_FALSE; >-+ } >-+ >-+ /* Fill in attributes. */ >-+ int32ToString(width, widthStr); >-+ int32ToString(height, heightStr); >-+ attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-+ attribs[numAttribs++] = qpSetStringAttrib("Width", widthStr); >-+ attribs[numAttribs++] = qpSetStringAttrib("Height", heightStr); >-+ attribs[numAttribs++] = qpSetStringAttrib("Format", QP_LOOKUP_STRING(s_qpImageFormatMap, imageFormat)); >-+ attribs[numAttribs++] = qpSetStringAttrib("CompressionMode", QP_LOOKUP_STRING(s_qpImageCompressionModeMap, compressionMode)); >-+ if (description) attribs[numAttribs++] = qpSetStringAttrib("Description", description); >-+ >-+ /* \note Log lock is acquired after compression! */ >-+ deMutex_lock(log->lock); >-+ >-+ /* <Image ID="result" Name="Foobar" Width="640" Height="480" Format="RGB888" CompressionMode="None">base64 data</Image> */ >-+ if (!qpXmlWriter_startElement(log->writer, "Image", numAttribs, attribs) || >-+ !qpXmlWriter_writeBase64(log->writer, (const deUint8*)writeDataPtr, writeDataBytes) || >-+ !qpXmlWriter_endElement(log->writer, "Image")) >-+ { >-+ qpPrintf("qpTestLog_writeImage(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ Buffer_deinit(&compressedBuffer); >-+ return DE_FALSE; >-+ } >-+ >-+ deMutex_unlock(log->lock); >-+ >-+ /* Free compressed data if allocated. */ >-+ Buffer_deinit(&compressedBuffer); >-+ >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >- * \brief Write a OpenGL ES shader program into the log. >-- * \param linkOk Shader program link result, false on failure >-- * \param linkInfoLog Implementation provided linkage log >-+ * \param linkOk Shader program link result, false on failure >-+ * \param linkInfoLog Implementation provided linkage log >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_startShaderProgram (qpTestLog* log, deBool linkOk, const char* linkInfoLog) >- { >-- qpXmlAttribute programAttribs[4]; >-- int numProgramAttribs = 0; >-+ qpXmlAttribute programAttribs[4]; >-+ int numProgramAttribs = 0; >- >-- DE_ASSERT(log); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log); >-+ deMutex_lock(log->lock); >- >-- programAttribs[numProgramAttribs++] = qpSetStringAttrib("LinkStatus", linkOk ? "OK" : "Fail"); >-+ programAttribs[numProgramAttribs++] = qpSetStringAttrib("LinkStatus", linkOk ? "OK" : "Fail"); >- >-- if (!qpXmlWriter_startElement(log->writer, "ShaderProgram", numProgramAttribs, programAttribs) || >-- !qpXmlWriter_writeStringElement(log->writer, "InfoLog", linkInfoLog)) >-- { >-- qpPrintf("qpTestLog_startShaderProgram(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ if (!qpXmlWriter_startElement(log->writer, "ShaderProgram", numProgramAttribs, programAttribs) || >-+ !qpXmlWriter_writeStringElement(log->writer, "InfoLog", linkInfoLog)) >-+ { >-+ qpPrintf("qpTestLog_startShaderProgram(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SHADERPROGRAM)); >-+ DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SHADERPROGRAM)); >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >- * \brief End shader program >-- * \param log qpTestLog instance >-+ * \param log qpTestLog instance >- * \return true if ok, false otherwise >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_endShaderProgram (qpTestLog* log) >- { >-- DE_ASSERT(log); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log); >-+ deMutex_lock(log->lock); >- >-- /* </ShaderProgram> */ >-- if (!qpXmlWriter_endElement(log->writer, "ShaderProgram")) >-- { >-- qpPrintf("qpTestLog_endShaderProgram(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ /* </ShaderProgram> */ >-+ if (!qpXmlWriter_endElement(log->writer, "ShaderProgram")) >-+ { >-+ qpPrintf("qpTestLog_endShaderProgram(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); >-+ DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >- * \brief Write a OpenGL ES shader into the log. >-- * \param type Shader type >-- * \param source Shader source >-- * \param compileOk Shader compilation result, false on failure >-- * \param infoLog Implementation provided shader compilation log >-+ * \param type Shader type >-+ * \param source Shader source >-+ * \param compileOk Shader compilation result, false on failure >-+ * \param infoLog Implementation provided shader compilation log >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_writeShader (qpTestLog* log, qpShaderType type, const char* source, deBool compileOk, const char* infoLog) >- { >-- const char* tagName = QP_LOOKUP_STRING(s_qpShaderTypeMap, type); >-- const char* sourceStr = ((log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) == 0 || !compileOk) ? source : ""; >-- int numShaderAttribs = 0; >-- qpXmlAttribute shaderAttribs[4]; >-+ const char* tagName = QP_LOOKUP_STRING(s_qpShaderTypeMap, type); >-+ const char* sourceStr = ((log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) == 0 || !compileOk) ? source : ""; >-+ int numShaderAttribs = 0; >-+ qpXmlAttribute shaderAttribs[4]; >- >-- deMutex_lock(log->lock); >-+ deMutex_lock(log->lock); >- >-- DE_ASSERT(source); >-- DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); >-+ DE_ASSERT(source); >-+ DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); >- >-- shaderAttribs[numShaderAttribs++] = qpSetStringAttrib("CompileStatus", compileOk ? "OK" : "Fail"); >-+ shaderAttribs[numShaderAttribs++] = qpSetStringAttrib("CompileStatus", compileOk ? "OK" : "Fail"); >- >-- if (!qpXmlWriter_startElement(log->writer, tagName, numShaderAttribs, shaderAttribs) || >-- !qpXmlWriter_writeStringElement(log->writer, "ShaderSource", sourceStr) || >-- !qpXmlWriter_writeStringElement(log->writer, "InfoLog", infoLog) || >-- !qpXmlWriter_endElement(log->writer, tagName)) >-- { >-- qpPrintf("qpTestLog_writeShader(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ if (!qpXmlWriter_startElement(log->writer, tagName, numShaderAttribs, shaderAttribs) || >-+ !qpXmlWriter_writeStringElement(log->writer, "ShaderSource", sourceStr) || >-+ !qpXmlWriter_writeStringElement(log->writer, "InfoLog", infoLog) || >-+ !qpXmlWriter_endElement(log->writer, tagName)) >-+ { >-+ qpPrintf("qpTestLog_writeShader(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >-@@ -1053,28 +1053,28 @@ deBool qpTestLog_writeShader (qpTestLog* log, qpShaderType type, const char* sou >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_startEglConfigSet (qpTestLog* log, const char* name, const char* description) >- { >-- qpXmlAttribute attribs[4]; >-- int numAttribs = 0; >-+ qpXmlAttribute attribs[4]; >-+ int numAttribs = 0; >- >-- DE_ASSERT(log && name); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log && name); >-+ deMutex_lock(log->lock); >- >-- attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-- if (description) >-- attribs[numAttribs++] = qpSetStringAttrib("Description", description); >-+ attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-+ if (description) >-+ attribs[numAttribs++] = qpSetStringAttrib("Description", description); >- >-- /* <EglConfigSet Name="<name>"> */ >-- if (!qpXmlWriter_startElement(log->writer, "EglConfigSet", numAttribs, attribs)) >-- { >-- qpPrintf("qpTestLog_startEglImageSet(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ /* <EglConfigSet Name="<name>"> */ >-+ if (!qpXmlWriter_startElement(log->writer, "EglConfigSet", numAttribs, attribs)) >-+ { >-+ qpPrintf("qpTestLog_startEglImageSet(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_EGLCONFIGSET)); >-+ DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_EGLCONFIGSET)); >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >-@@ -1082,21 +1082,21 @@ deBool qpTestLog_startEglConfigSet (qpTestLog* log, const char* name, const char >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_endEglConfigSet (qpTestLog* log) >- { >-- DE_ASSERT(log); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log); >-+ deMutex_lock(log->lock); >- >-- /* <EglConfigSet Name="<name>"> */ >-- if (!qpXmlWriter_endElement(log->writer, "EglConfigSet")) >-- { >-- qpPrintf("qpTestLog_endEglImageSet(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ /* <EglConfigSet Name="<name>"> */ >-+ if (!qpXmlWriter_endElement(log->writer, "EglConfigSet")) >-+ { >-+ qpPrintf("qpTestLog_endEglImageSet(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_EGLCONFIGSET); >-+ DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_EGLCONFIGSET); >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >-@@ -1105,111 +1105,111 @@ deBool qpTestLog_endEglConfigSet (qpTestLog* log) >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_writeEglConfig (qpTestLog* log, const qpEglConfigInfo* config) >- { >-- qpXmlAttribute attribs[64]; >-- int numAttribs = 0; >-- >-- DE_ASSERT(log && config); >-- deMutex_lock(log->lock); >-- >-- attribs[numAttribs++] = qpSetIntAttrib ("BufferSize", config->bufferSize); >-- attribs[numAttribs++] = qpSetIntAttrib ("RedSize", config->redSize); >-- attribs[numAttribs++] = qpSetIntAttrib ("GreenSize", config->greenSize); >-- attribs[numAttribs++] = qpSetIntAttrib ("BlueSize", config->blueSize); >-- attribs[numAttribs++] = qpSetIntAttrib ("LuminanceSize", config->luminanceSize); >-- attribs[numAttribs++] = qpSetIntAttrib ("AlphaSize", config->alphaSize); >-- attribs[numAttribs++] = qpSetIntAttrib ("AlphaMaskSize", config->alphaMaskSize); >-- attribs[numAttribs++] = qpSetBoolAttrib ("BindToTextureRGB", config->bindToTextureRGB); >-- attribs[numAttribs++] = qpSetBoolAttrib ("BindToTextureRGBA", config->bindToTextureRGBA); >-- attribs[numAttribs++] = qpSetStringAttrib ("ColorBufferType", config->colorBufferType); >-- attribs[numAttribs++] = qpSetStringAttrib ("ConfigCaveat", config->configCaveat); >-- attribs[numAttribs++] = qpSetIntAttrib ("ConfigID", config->configID); >-- attribs[numAttribs++] = qpSetStringAttrib ("Conformant", config->conformant); >-- attribs[numAttribs++] = qpSetIntAttrib ("DepthSize", config->depthSize); >-- attribs[numAttribs++] = qpSetIntAttrib ("Level", config->level); >-- attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferWidth", config->maxPBufferWidth); >-- attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferHeight", config->maxPBufferHeight); >-- attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferPixels", config->maxPBufferPixels); >-- attribs[numAttribs++] = qpSetIntAttrib ("MaxSwapInterval", config->maxSwapInterval); >-- attribs[numAttribs++] = qpSetIntAttrib ("MinSwapInterval", config->minSwapInterval); >-- attribs[numAttribs++] = qpSetBoolAttrib ("NativeRenderable", config->nativeRenderable); >-- attribs[numAttribs++] = qpSetStringAttrib ("RenderableType", config->renderableType); >-- attribs[numAttribs++] = qpSetIntAttrib ("SampleBuffers", config->sampleBuffers); >-- attribs[numAttribs++] = qpSetIntAttrib ("Samples", config->samples); >-- attribs[numAttribs++] = qpSetIntAttrib ("StencilSize", config->stencilSize); >-- attribs[numAttribs++] = qpSetStringAttrib ("SurfaceTypes", config->surfaceTypes); >-- attribs[numAttribs++] = qpSetStringAttrib ("TransparentType", config->transparentType); >-- attribs[numAttribs++] = qpSetIntAttrib ("TransparentRedValue", config->transparentRedValue); >-- attribs[numAttribs++] = qpSetIntAttrib ("TransparentGreenValue", config->transparentGreenValue); >-- attribs[numAttribs++] = qpSetIntAttrib ("TransparentBlueValue", config->transparentBlueValue); >-- DE_ASSERT(numAttribs <= DE_LENGTH_OF_ARRAY(attribs)); >-- >-- if (!qpXmlWriter_startElement(log->writer, "EglConfig", numAttribs, attribs) || >-- !qpXmlWriter_endElement(log->writer, "EglConfig")) >-- { >-- qpPrintf("qpTestLog_writeEglConfig(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ qpXmlAttribute attribs[64]; >-+ int numAttribs = 0; >-+ >-+ DE_ASSERT(log && config); >-+ deMutex_lock(log->lock); >-+ >-+ attribs[numAttribs++] = qpSetIntAttrib ("BufferSize", config->bufferSize); >-+ attribs[numAttribs++] = qpSetIntAttrib ("RedSize", config->redSize); >-+ attribs[numAttribs++] = qpSetIntAttrib ("GreenSize", config->greenSize); >-+ attribs[numAttribs++] = qpSetIntAttrib ("BlueSize", config->blueSize); >-+ attribs[numAttribs++] = qpSetIntAttrib ("LuminanceSize", config->luminanceSize); >-+ attribs[numAttribs++] = qpSetIntAttrib ("AlphaSize", config->alphaSize); >-+ attribs[numAttribs++] = qpSetIntAttrib ("AlphaMaskSize", config->alphaMaskSize); >-+ attribs[numAttribs++] = qpSetBoolAttrib ("BindToTextureRGB", config->bindToTextureRGB); >-+ attribs[numAttribs++] = qpSetBoolAttrib ("BindToTextureRGBA", config->bindToTextureRGBA); >-+ attribs[numAttribs++] = qpSetStringAttrib ("ColorBufferType", config->colorBufferType); >-+ attribs[numAttribs++] = qpSetStringAttrib ("ConfigCaveat", config->configCaveat); >-+ attribs[numAttribs++] = qpSetIntAttrib ("ConfigID", config->configID); >-+ attribs[numAttribs++] = qpSetStringAttrib ("Conformant", config->conformant); >-+ attribs[numAttribs++] = qpSetIntAttrib ("DepthSize", config->depthSize); >-+ attribs[numAttribs++] = qpSetIntAttrib ("Level", config->level); >-+ attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferWidth", config->maxPBufferWidth); >-+ attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferHeight", config->maxPBufferHeight); >-+ attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferPixels", config->maxPBufferPixels); >-+ attribs[numAttribs++] = qpSetIntAttrib ("MaxSwapInterval", config->maxSwapInterval); >-+ attribs[numAttribs++] = qpSetIntAttrib ("MinSwapInterval", config->minSwapInterval); >-+ attribs[numAttribs++] = qpSetBoolAttrib ("NativeRenderable", config->nativeRenderable); >-+ attribs[numAttribs++] = qpSetStringAttrib ("RenderableType", config->renderableType); >-+ attribs[numAttribs++] = qpSetIntAttrib ("SampleBuffers", config->sampleBuffers); >-+ attribs[numAttribs++] = qpSetIntAttrib ("Samples", config->samples); >-+ attribs[numAttribs++] = qpSetIntAttrib ("StencilSize", config->stencilSize); >-+ attribs[numAttribs++] = qpSetStringAttrib ("SurfaceTypes", config->surfaceTypes); >-+ attribs[numAttribs++] = qpSetStringAttrib ("TransparentType", config->transparentType); >-+ attribs[numAttribs++] = qpSetIntAttrib ("TransparentRedValue", config->transparentRedValue); >-+ attribs[numAttribs++] = qpSetIntAttrib ("TransparentGreenValue", config->transparentGreenValue); >-+ attribs[numAttribs++] = qpSetIntAttrib ("TransparentBlueValue", config->transparentBlueValue); >-+ DE_ASSERT(numAttribs <= DE_LENGTH_OF_ARRAY(attribs)); >-+ >-+ if (!qpXmlWriter_startElement(log->writer, "EglConfig", numAttribs, attribs) || >-+ !qpXmlWriter_endElement(log->writer, "EglConfig")) >-+ { >-+ qpPrintf("qpTestLog_writeEglConfig(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >-+ >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >- * \brief Start section in log. >-- * \param log qpTestLog instance >-- * \param name Section name >-- * \param description Human readable description >-+ * \param log qpTestLog instance >-+ * \param name Section name >-+ * \param description Human readable description >- * \return true if ok, false otherwise >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_startSection (qpTestLog* log, const char* name, const char* description) >- { >-- qpXmlAttribute attribs[2]; >-- int numAttribs = 0; >-+ qpXmlAttribute attribs[2]; >-+ int numAttribs = 0; >- >-- DE_ASSERT(log && name); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log && name); >-+ deMutex_lock(log->lock); >- >-- attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-- if (description) >-- attribs[numAttribs++] = qpSetStringAttrib("Description", description); >-+ attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-+ if (description) >-+ attribs[numAttribs++] = qpSetStringAttrib("Description", description); >- >-- /* <Section Name="<name>" Description="<description>"> */ >-- if (!qpXmlWriter_startElement(log->writer, "Section", numAttribs, attribs)) >-- { >-- qpPrintf("qpTestLog_startSection(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ /* <Section Name="<name>" Description="<description>"> */ >-+ if (!qpXmlWriter_startElement(log->writer, "Section", numAttribs, attribs)) >-+ { >-+ qpPrintf("qpTestLog_startSection(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SECTION)); >-+ DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SECTION)); >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >- * \brief End section in log. >-- * \param log qpTestLog instance >-+ * \param log qpTestLog instance >- * \return true if ok, false otherwise >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_endSection (qpTestLog* log) >- { >-- DE_ASSERT(log); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log); >-+ deMutex_lock(log->lock); >- >-- /* </Section> */ >-- if (!qpXmlWriter_endElement(log->writer, "Section")) >-- { >-- qpPrintf("qpTestLog_endSection(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ /* </Section> */ >-+ if (!qpXmlWriter_endElement(log->writer, "Section")) >-+ { >-+ qpPrintf("qpTestLog_endSection(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SECTION); >-+ DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SECTION); >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >-@@ -1217,20 +1217,20 @@ deBool qpTestLog_endSection (qpTestLog* log) >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_writeKernelSource (qpTestLog* log, const char* source) >- { >-- const char* sourceStr = (log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) != 0 ? "" : source; >-+ const char* sourceStr = (log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) != 0 ? "" : source; >- >-- DE_ASSERT(log); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log); >-+ deMutex_lock(log->lock); >- >-- if (!qpXmlWriter_writeStringElement(log->writer, "KernelSource", sourceStr)) >-- { >-- qpPrintf("qpTestLog_writeKernelSource(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ if (!qpXmlWriter_writeStringElement(log->writer, "KernelSource", sourceStr)) >-+ { >-+ qpPrintf("qpTestLog_writeKernelSource(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >-@@ -1238,21 +1238,21 @@ deBool qpTestLog_writeKernelSource (qpTestLog* log, const char* source) >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_writeSpirVAssemblySource (qpTestLog* log, const char* source) >- { >-- const char* const sourceStr = (log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) != 0 ? "" : source; >-+ const char* const sourceStr = (log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) != 0 ? "" : source; >- >-- deMutex_lock(log->lock); >-+ deMutex_lock(log->lock); >- >-- DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); >-+ DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); >- >-- if (!qpXmlWriter_writeStringElement(log->writer, "SpirVAssemblySource", sourceStr)) >-- { >-- qpPrintf("qpTestLog_writeSpirVAssemblySource(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ if (!qpXmlWriter_writeStringElement(log->writer, "SpirVAssemblySource", sourceStr)) >-+ { >-+ qpPrintf("qpTestLog_writeSpirVAssemblySource(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- /*--------------------------------------------------------------------*//*! >-@@ -1260,222 +1260,222 @@ deBool qpTestLog_writeSpirVAssemblySource (qpTestLog* log, const char* source) >- *//*--------------------------------------------------------------------*/ >- deBool qpTestLog_writeCompileInfo (qpTestLog* log, const char* name, const char* description, deBool compileOk, const char* infoLog) >- { >-- int numAttribs = 0; >-- qpXmlAttribute attribs[3]; >-+ int numAttribs = 0; >-+ qpXmlAttribute attribs[3]; >- >-- DE_ASSERT(log && name && description && infoLog); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log && name && description && infoLog); >-+ deMutex_lock(log->lock); >- >-- attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-- attribs[numAttribs++] = qpSetStringAttrib("Description", description); >-- attribs[numAttribs++] = qpSetStringAttrib("CompileStatus", compileOk ? "OK" : "Fail"); >-+ attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-+ attribs[numAttribs++] = qpSetStringAttrib("Description", description); >-+ attribs[numAttribs++] = qpSetStringAttrib("CompileStatus", compileOk ? "OK" : "Fail"); >- >-- if (!qpXmlWriter_startElement(log->writer, "CompileInfo", numAttribs, attribs) || >-- !qpXmlWriter_writeStringElement(log->writer, "InfoLog", infoLog) || >-- !qpXmlWriter_endElement(log->writer, "CompileInfo")) >-- { >-- qpPrintf("qpTestLog_writeCompileInfo(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ if (!qpXmlWriter_startElement(log->writer, "CompileInfo", numAttribs, attribs) || >-+ !qpXmlWriter_writeStringElement(log->writer, "InfoLog", infoLog) || >-+ !qpXmlWriter_endElement(log->writer, "CompileInfo")) >-+ { >-+ qpPrintf("qpTestLog_writeCompileInfo(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- deBool qpTestLog_startSampleList (qpTestLog* log, const char* name, const char* description) >- { >-- int numAttribs = 0; >-- qpXmlAttribute attribs[2]; >-+ int numAttribs = 0; >-+ qpXmlAttribute attribs[2]; >- >-- DE_ASSERT(log && name && description); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log && name && description); >-+ deMutex_lock(log->lock); >- >-- attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-- attribs[numAttribs++] = qpSetStringAttrib("Description", description); >-+ attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-+ attribs[numAttribs++] = qpSetStringAttrib("Description", description); >- >-- if (!qpXmlWriter_startElement(log->writer, "SampleList", numAttribs, attribs)) >-- { >-- qpPrintf("qpTestLog_startSampleList(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ if (!qpXmlWriter_startElement(log->writer, "SampleList", numAttribs, attribs)) >-+ { >-+ qpPrintf("qpTestLog_startSampleList(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLELIST)); >-+ DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLELIST)); >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- deBool qpTestLog_startSampleInfo (qpTestLog* log) >- { >-- DE_ASSERT(log); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log); >-+ deMutex_lock(log->lock); >- >-- if (!qpXmlWriter_startElement(log->writer, "SampleInfo", 0, DE_NULL)) >-- { >-- qpPrintf("qpTestLog_startSampleInfo(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ if (!qpXmlWriter_startElement(log->writer, "SampleInfo", 0, DE_NULL)) >-+ { >-+ qpPrintf("qpTestLog_startSampleInfo(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLEINFO)); >-+ DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLEINFO)); >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- deBool qpTestLog_writeValueInfo (qpTestLog* log, const char* name, const char* description, const char* unit, qpSampleValueTag tag) >- { >-- const char* tagName = QP_LOOKUP_STRING(s_qpSampleValueTagMap, tag); >-- int numAttribs = 0; >-- qpXmlAttribute attribs[4]; >-+ const char* tagName = QP_LOOKUP_STRING(s_qpSampleValueTagMap, tag); >-+ int numAttribs = 0; >-+ qpXmlAttribute attribs[4]; >- >-- DE_ASSERT(log && name && description && tagName); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log && name && description && tagName); >-+ deMutex_lock(log->lock); >- >-- DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLEINFO); >-+ DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLEINFO); >- >-- attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-- attribs[numAttribs++] = qpSetStringAttrib("Description", description); >-- attribs[numAttribs++] = qpSetStringAttrib("Tag", tagName); >-+ attribs[numAttribs++] = qpSetStringAttrib("Name", name); >-+ attribs[numAttribs++] = qpSetStringAttrib("Description", description); >-+ attribs[numAttribs++] = qpSetStringAttrib("Tag", tagName); >- >-- if (unit) >-- attribs[numAttribs++] = qpSetStringAttrib("Unit", unit); >-+ if (unit) >-+ attribs[numAttribs++] = qpSetStringAttrib("Unit", unit); >- >-- if (!qpXmlWriter_startElement(log->writer, "ValueInfo", numAttribs, attribs) || >-- !qpXmlWriter_endElement(log->writer, "ValueInfo")) >-- { >-- qpPrintf("qpTestLog_writeValueInfo(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ if (!qpXmlWriter_startElement(log->writer, "ValueInfo", numAttribs, attribs) || >-+ !qpXmlWriter_endElement(log->writer, "ValueInfo")) >-+ { >-+ qpPrintf("qpTestLog_writeValueInfo(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- deBool qpTestLog_endSampleInfo (qpTestLog* log) >- { >-- DE_ASSERT(log); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log); >-+ deMutex_lock(log->lock); >- >-- if (!qpXmlWriter_endElement(log->writer, "SampleInfo")) >-- { >-- qpPrintf("qpTestLog_endSampleInfo(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ if (!qpXmlWriter_endElement(log->writer, "SampleInfo")) >-+ { >-+ qpPrintf("qpTestLog_endSampleInfo(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLEINFO); >-+ DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLEINFO); >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- deBool qpTestLog_startSample (qpTestLog* log) >- { >-- DE_ASSERT(log); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log); >-+ deMutex_lock(log->lock); >- >-- DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLELIST); >-+ DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLELIST); >- >-- if (!qpXmlWriter_startElement(log->writer, "Sample", 0, DE_NULL)) >-- { >-- qpPrintf("qpTestLog_startSample(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ if (!qpXmlWriter_startElement(log->writer, "Sample", 0, DE_NULL)) >-+ { >-+ qpPrintf("qpTestLog_startSample(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLE)); >-+ DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLE)); >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- deBool qpTestLog_writeValueFloat (qpTestLog* log, double value) >- { >-- char tmpString[512]; >-- doubleToString(value, tmpString, (int)sizeof(tmpString)); >-+ char tmpString[512]; >-+ doubleToString(value, tmpString, (int)sizeof(tmpString)); >- >-- deMutex_lock(log->lock); >-+ deMutex_lock(log->lock); >- >-- DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLE); >-+ DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLE); >- >-- if (!qpXmlWriter_writeStringElement(log->writer, "Value", &tmpString[0])) >-- { >-- qpPrintf("qpTestLog_writeSampleValue(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ if (!qpXmlWriter_writeStringElement(log->writer, "Value", &tmpString[0])) >-+ { >-+ qpPrintf("qpTestLog_writeSampleValue(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- deBool qpTestLog_writeValueInteger (qpTestLog* log, deInt64 value) >- { >-- char tmpString[64]; >-- int64ToString(value, tmpString); >-+ char tmpString[64]; >-+ int64ToString(value, tmpString); >- >-- deMutex_lock(log->lock); >-+ deMutex_lock(log->lock); >- >-- DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLE); >-+ DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLE); >- >-- if (!qpXmlWriter_writeStringElement(log->writer, "Value", &tmpString[0])) >-- { >-- qpPrintf("qpTestLog_writeSampleValue(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ if (!qpXmlWriter_writeStringElement(log->writer, "Value", &tmpString[0])) >-+ { >-+ qpPrintf("qpTestLog_writeSampleValue(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- deBool qpTestLog_endSample (qpTestLog* log) >- { >-- DE_ASSERT(log); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log); >-+ deMutex_lock(log->lock); >- >-- if (!qpXmlWriter_endElement(log->writer, "Sample")) >-- { >-- qpPrintf("qpTestLog_endSample(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ if (!qpXmlWriter_endElement(log->writer, "Sample")) >-+ { >-+ qpPrintf("qpTestLog_endSample(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLE); >-+ DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLE); >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- deBool qpTestLog_endSampleList (qpTestLog* log) >- { >-- DE_ASSERT(log); >-- deMutex_lock(log->lock); >-+ DE_ASSERT(log); >-+ deMutex_lock(log->lock); >- >-- if (!qpXmlWriter_endElement(log->writer, "SampleList")) >-- { >-- qpPrintf("qpTestLog_endSampleList(): Writing XML failed\n"); >-- deMutex_unlock(log->lock); >-- return DE_FALSE; >-- } >-+ if (!qpXmlWriter_endElement(log->writer, "SampleList")) >-+ { >-+ qpPrintf("qpTestLog_endSampleList(): Writing XML failed\n"); >-+ deMutex_unlock(log->lock); >-+ return DE_FALSE; >-+ } >- >-- DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLELIST); >-+ DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLELIST); >- >-- deMutex_unlock(log->lock); >-- return DE_TRUE; >-+ deMutex_unlock(log->lock); >-+ return DE_TRUE; >- } >- >- deUint32 qpTestLog_getLogFlags (const qpTestLog* log) >- { >-- DE_ASSERT(log); >-- return log->flags; >-+ DE_ASSERT(log); >-+ return log->flags; >- } >- >- const char* qpGetTestResultName (qpTestResult result) >- { >-- return QP_LOOKUP_STRING(s_qpTestResultMap, result); >-+ return QP_LOOKUP_STRING(s_qpTestResultMap, result); >- } >-diff --git a/src/tests/perf_tests/MultiviewPerf.cpp b/src/tests/perf_tests/MultiviewPerf.cpp >-index 8c106b493..c3d99d23d 100644 >---- a/src/tests/perf_tests/MultiviewPerf.cpp >-+++ b/src/tests/perf_tests/MultiviewPerf.cpp >-@@ -273,7 +273,7 @@ void MultiviewCPUBoundBenchmark::initializeBenchmark() >- "{\n" >- " vec4 v = vPosition;\n" >- " v.xy += uOffset;\n" >-- " gl_Position = v;\n" >-+ " gl_Position = v;\n" >- "}\n"; >- >- const std::string &fs = >-@@ -371,7 +371,7 @@ void MultiviewGPUBoundBenchmark::initializeBenchmark() >- " frag_Col3 = vert_Col3;\n" >- " frag_Col4 = vert_Col4;\n" >- " frag_Col5 = vert_Col5;\n" >-- " gl_Position = vPosition;\n" >-+ " gl_Position = vPosition;\n" >- "}\n"; >- >- const std::string &fs = >-diff --git a/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h b/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h >-index ce2dac5a1..1d7c70f02 100644 >---- a/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h >-+++ b/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h >-@@ -89,7 +89,7 @@ public: >- } >- >- bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } >-- >-+ >- bool EndObject(SizeType memberCount = 0) { >- (void)memberCount; >- RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); >-diff --git a/src/tests/third_party/rapidjson/include/rapidjson/reader.h b/src/tests/third_party/rapidjson/include/rapidjson/reader.h >-index 08425eb9e..bc5cdcf2d 100644 >---- a/src/tests/third_party/rapidjson/include/rapidjson/reader.h >-+++ b/src/tests/third_party/rapidjson/include/rapidjson/reader.h >-@@ -261,23 +261,23 @@ void SkipWhitespace(InputStream& is) { >- #ifdef RAPIDJSON_SSE42 >- //! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. >- inline const char *SkipWhitespace_SIMD(const char* p) { >-- // Fast return for single non-whitespace >-- if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') >-- ++p; >-- else >-- return p; >-- >-- // 16-byte align to the next boundary >-- const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & ~15); >-- while (p != nextAligned) >-- if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') >-- ++p; >-- else >-- return p; >-+ // Fast return for single non-whitespace >-+ if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') >-+ ++p; >-+ else >-+ return p; >-+ >-+ // 16-byte align to the next boundary >-+ const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & ~15); >-+ while (p != nextAligned) >-+ if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') >-+ ++p; >-+ else >-+ return p; >- >- // The rest of string using SIMD >-- static const char whitespace[16] = " \n\r\t"; >-- const __m128i w = _mm_loadu_si128((const __m128i *)&whitespace[0]); >-+ static const char whitespace[16] = " \n\r\t"; >-+ const __m128i w = _mm_loadu_si128((const __m128i *)&whitespace[0]); >- >- for (;; p += 16) { >- const __m128i s = _mm_load_si128((const __m128i *)p); >-@@ -298,31 +298,31 @@ inline const char *SkipWhitespace_SIMD(const char* p) { >- >- //! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. >- inline const char *SkipWhitespace_SIMD(const char* p) { >-- // Fast return for single non-whitespace >-- if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') >-- ++p; >-- else >-- return p; >-+ // Fast return for single non-whitespace >-+ if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') >-+ ++p; >-+ else >-+ return p; >- >- // 16-byte align to the next boundary >-- const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & ~15); >-- while (p != nextAligned) >-- if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') >-- ++p; >-- else >-- return p; >-+ const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & ~15); >-+ while (p != nextAligned) >-+ if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') >-+ ++p; >-+ else >-+ return p; >- >- // The rest of string >-- static const char whitespaces[4][17] = { >-- " ", >-- "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", >-- "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r", >-- "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"}; >-- >-- const __m128i w0 = _mm_loadu_si128((const __m128i *)&whitespaces[0][0]); >-- const __m128i w1 = _mm_loadu_si128((const __m128i *)&whitespaces[1][0]); >-- const __m128i w2 = _mm_loadu_si128((const __m128i *)&whitespaces[2][0]); >-- const __m128i w3 = _mm_loadu_si128((const __m128i *)&whitespaces[3][0]); >-+ static const char whitespaces[4][17] = { >-+ " ", >-+ "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", >-+ "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r", >-+ "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"}; >-+ >-+ const __m128i w0 = _mm_loadu_si128((const __m128i *)&whitespaces[0][0]); >-+ const __m128i w1 = _mm_loadu_si128((const __m128i *)&whitespaces[1][0]); >-+ const __m128i w2 = _mm_loadu_si128((const __m128i *)&whitespaces[2][0]); >-+ const __m128i w3 = _mm_loadu_si128((const __m128i *)&whitespaces[3][0]); >- >- for (;; p += 16) { >- const __m128i s = _mm_load_si128((const __m128i *)p); >-diff --git a/src/tests/third_party/rapidjson/include/rapidjson/writer.h b/src/tests/third_party/rapidjson/include/rapidjson/writer.h >-index 6daa78330..98931fe31 100644 >---- a/src/tests/third_party/rapidjson/include/rapidjson/writer.h >-+++ b/src/tests/third_party/rapidjson/include/rapidjson/writer.h >-@@ -134,7 +134,7 @@ public: >- } >- >- bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } >-- >-+ >- bool EndObject(SizeType memberCount = 0) { >- (void)memberCount; >- RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); >-diff --git a/include/EGL/eglplatform.h b/include/EGL/eglplatform.h >-index 333448be348..47d18093c96 100644 >---- a/include/EGL/eglplatform.h >-+++ b/include/EGL/eglplatform.h >-@@ -100,7 +100,7 @@ typedef struct ANativeWindow* EGLNativeWindowType; >- typedef struct egl_native_pixmap_t* EGLNativePixmapType; >- typedef void* EGLNativeDisplayType; >- >--#elif defined(USE_OZONE) >-+#elif defined(USE_OZONE) || defined(USE_WPE) >- >- typedef intptr_t EGLNativeDisplayType; >- typedef intptr_t EGLNativeWindowType; >-diff --git a/include/EGL/eglplatform.h b/include/EGL/eglplatform.h >-index 47d18093c96..e781564891d 100644 >---- a/include/EGL/eglplatform.h >-+++ b/include/EGL/eglplatform.h >-@@ -114,6 +114,8 @@ typedef struct wl_egl_window *EGLNativeWindowType; >- >- #elif defined(__unix__) >- >-+#if defined(ANGLE_USE_X11) && !defined(MESA_EGL_NO_X11_HEADERS) >-+ >- /* X11 (tentative) */ >- #include <X11/Xlib.h> >- #include <X11/Xutil.h> >-@@ -122,6 +124,14 @@ typedef Display *EGLNativeDisplayType; >- typedef Pixmap EGLNativePixmapType; >- typedef Window EGLNativeWindowType; >- >-+#else >-+ >-+typedef void *EGLNativeDisplayType; >-+typedef khronos_uintptr_t EGLNativePixmapType; >-+typedef khronos_uintptr_t EGLNativeWindowType; >-+ >-+#endif /* ANGLE_USE_X11 && !MESA_EGL_NO_X11_HEADERS */ >-+ >- #else >- #error "Platform not recognized" >- #endif >diff --git a/Source/ThirdParty/ANGLE/doc/64BitSafety.md b/Source/ThirdParty/ANGLE/doc/64BitSafety.md >new file mode 100644 >index 00000000000..94ed06414cd >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/64BitSafety.md >@@ -0,0 +1,15 @@ >+# 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. >diff --git a/Source/ThirdParty/ANGLE/doc/BranchingAndRolling.md b/Source/ThirdParty/ANGLE/doc/BranchingAndRolling.md >new file mode 100644 >index 00000000000..19e2abc3513 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/BranchingAndRolling.md >@@ -0,0 +1,55 @@ >+# How to Branch and Roll Chromium's ANGLE Dependency >+ >+ANGLE provides an implementation of OpenGL ES on Windows, which Chromium relies >+upon for hardware accelerated rendering and WebGL support. Chromium specifies >+its dependency on a specific version of ANGLE in the repository; this document >+describes how to update that dependency, and, if necessary, create an ANGLE >+branch to correspond to a branched release of Chrome. >+ >+## Rolling DEPS >+ >+Chromium's dependency on third-party projects is tracked in [the Chromium >+repository's src/DEPS file] >+(http://src.chromium.org/viewvc/chrome/trunk/src/DEPS). To update the ANGLE >+dependency: >+ >+ * Find the line in this file that defines "src/third\_party/angle" >+for deps (**not** deps\_os) >+ * Change the [git SHA-1 revision number] >+(http://git-scm.com/book/ch6-1.html) to be that of the commit on which Chromium >+should depend. Please 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 [the public repository viewer] >+(https://chromium.googlesource.com/angle/angle). >+ * If using the public repository viewer, 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/+/master/`) >+ >+## 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##'. >diff --git a/Source/ThirdParty/ANGLE/doc/BufferImplementation.md b/Source/ThirdParty/ANGLE/doc/BufferImplementation.md >new file mode 100644 >index 00000000000..99eaf0038f2 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/BufferImplementation.md >@@ -0,0 +1,122 @@ >+# 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. >diff --git a/Source/ThirdParty/ANGLE/doc/BuildingAngleForChromiumDevelopment.md b/Source/ThirdParty/ANGLE/doc/BuildingAngleForChromiumDevelopment.md >new file mode 100644 >index 00000000000..35fd95a52e5 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/BuildingAngleForChromiumDevelopment.md >@@ -0,0 +1,66 @@ >+# 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 >+python 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/+/master/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. >diff --git a/Source/ThirdParty/ANGLE/doc/ChoosingANGLEBranch.md b/Source/ThirdParty/ANGLE/doc/ChoosingANGLEBranch.md >new file mode 100644 >index 00000000000..c2ac1ae2c40 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/ChoosingANGLEBranch.md >@@ -0,0 +1,68 @@ >+# 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. >diff --git a/Source/ThirdParty/ANGLE/doc/CodeReviewProcess.md b/Source/ThirdParty/ANGLE/doc/CodeReviewProcess.md >new file mode 100644 >index 00000000000..9a53e2aa1d0 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/CodeReviewProcess.md >@@ -0,0 +1,57 @@ >+# 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. >diff --git a/Source/ThirdParty/ANGLE/doc/CodingStandard.md b/Source/ThirdParty/ANGLE/doc/CodingStandard.md >new file mode 100644 >index 00000000000..b5b78e2876f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/CodingStandard.md >@@ -0,0 +1,177 @@ >+# 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) >+ >+* {DEV} all parameters passed by reference, except for STL containers (e.g. >+ std::vector, std::list), must be labeled `const`. For return parameters >+ other than STL containers, use a pointer. >+* {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 according to the [Chromium c++ 11/14 guide] >+ (http://chromium-cpp.appspot.com/). >+ >+### [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 >+* Enum Names: use class enums when possible. The values should be uppercase with underscores or CamelCase. >+* Macros: all uppercase with underscores >+* Exceptions to naming: use common sense! >+ >+### [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. >diff --git a/Source/ThirdParty/ANGLE/doc/CompilingTranslatorWithEmscripten.md b/Source/ThirdParty/ANGLE/doc/CompilingTranslatorWithEmscripten.md >new file mode 100644 >index 00000000000..8b6654201a6 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/CompilingTranslatorWithEmscripten.md >@@ -0,0 +1,108 @@ >+# 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. >diff --git a/Source/ThirdParty/ANGLE/doc/ContributingCode.md b/Source/ThirdParty/ANGLE/doc/ContributingCode.md >new file mode 100644 >index 00000000000..c0eecb242c1 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/ContributingCode.md >@@ -0,0 +1,113 @@ >+# 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](https://groups.google.com/forum/?fromgroups#!forum/angleproject)) and propose it or talk with the ANGLE team on IRC in the #ANGLEproject channel on FreeNode. >+ * Not all bugs in our [bug system](https://bugs.chromium.org/p/angleproject/issues/list) 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](http://anglebug.com/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 disussion group. >+ >+## Get your code ready >+### Code >+ 1. Must conform to the [ANGLE style](CodingStandard.md) guidelines. >+ 2. Must be tested. (see the 'Testing' section below) >+ 3. Should be a reasonable size to review. Giant patches are unlikely to get reviewed quickly. >+ >+### Build maintenance >+ 1. If you added or removed source files: >+ * You _must_ update the build files with your changes. See `src/libGLESv2.gni` and `src/compiler.gni`. >+ 2. ANGLE's BUILD.gn script is used by [Chromium's gn build](https://www.chromium.org/developers/gn-build-configuration). 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. If you modified `glslang.y` or `glslang.l`: >+ * You _must_ update the bison-generated compiler sources. Download and install the latest 64-bit Bison and flex from official [Cygwin](https://cygwin.com/install.html) on _Windows_. From the Cygwin shell run `generate_parser.sh` in `src/compiler/translator` and update your CL. Do not edit the generated files by hand. >+ * _NOTE:_ You can ignore failing chunk messages if there are no compile errors. >+ * If you modified `ExpressionParser.y` or `Tokenizer.l`, follow the same process by running `src/compiler/preprocessor/generate_parser.sh`. >+ >+### 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 of 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 [Top-of-Tree WebGL Conformance tests](https://www.khronos.org/registry/webgl/sdk/tests/webgl-conformance-tests.html). >+ * If you are a Chromium developer, see [Building ANGLE for Chromium Development](BuildingAngleForChromiumDevelopment.md) 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](https://www.google.com/chrome/browser/canary.html) 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](../src/tests/perf_tests/README.md). >+ * The [Chromium GPU FYI bot waterfall](http://build.chromium.org/p/chromium.gpu.fyi/console) 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. >+ * ANGLE also includes the [drawElements Quality Program (dEQP)](dEQP.md) for additional testing. If you're working on a new feature, there may be some extensive tests for it already written. >+ >+### Legal >+ 1. You must complete the [Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual). 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](https://cla.developers.google.com/about/google-corporate) 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](http://www.chromium.org/developers/contributing-code/external-contributor-checklist). >+ >+## Life of a Change List >+ >+### Getting started with Gerrit for ANGLE >+ 1. Go to [https://chromium-review.googlesource.com/new-password](https://chromium-review.googlesource.com/new-password) >+ 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](https://chromium-review.googlesource.com/#/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](https://chromium-review.googlesource.com/tools/hooks/commit-msg) 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. >+ >+### 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. >+ * If your changes are associated with an issue in the issue tracker (e.g. a fix for a reported bug), please associate the CL with that issue by adding the following line to the commit message: `BUG=angleproject:<issue number>`. >+ * 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](https://chromium-review.googlesource.com/q/project:angle/angle). >+ * 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` >+ >+### Selecting reviewers >+When your CL is ready to review, add any of the following reviewers. They will be able to route your CL to additional reviewers as neccssary and answer any questions you may have about the process. >+ * `geofflang at chromium dot org` >+ * `jmadill at chromium dot org` >+ * `syoussefi at chromium dot org` >+ * `ynovikov at chromium dot org` >+ >+### Committer status >+Similar to [Chromium's committer status](https://dev.chromium.org/getting-involved/become-a-committer), 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 may ask at any time. >+ >+See also: >+ >+* [ANGLE Gerrit](https://chromium-review.googlesource.com/q/project:angle/angle) >+* [Chromium Projects: 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) >+* [angle_perftests README](../src/tests/perf_tests/README.md) >diff --git a/Source/ThirdParty/ANGLE/doc/DebuggingTips.md b/Source/ThirdParty/ANGLE/doc/DebuggingTips.md >new file mode 100644 >index 00000000000..fdae9174312 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/DebuggingTips.md >@@ -0,0 +1,230 @@ >+# 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 >+``` >+ >+## Running ANGLE under GAPID on Linux >+ >+[GAPID](https://github.com/google/gapid) can be used to capture trace of Vulkan commands on Linux. >+For it to work, libvulkan has to be a shared library, instead of being statically linked into ANGLE, >+which is the default behavior. This is done with the gn arg: >+ >+``` >+angle_shared_libvulkan = true >+``` >+ >+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 >+[NativeTest](https://chromium.googlesource.com/chromium/src/+/master/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java) >+based tests share the same activity name, `org.chromium.native_test.NativeUnitTestNativeActivity`. >+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:org.chromium.native_test/org.chromium.native_test.NativeUnitTestNativeActivity >+``` >+ >+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.Shard` 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 --esal org.chromium.native_test.NativeTest.Shard 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 >+``` >+ >+Additionally, libvulkan has to be a shared library, instead of being statically linked into ANGLE, >+which is the default behavior. This is done with the gn arg: >+ >+``` >+angle_shared_libvulkan = true >+``` >+ >+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 >+ >+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. >+ >+Define the following environment variables, for example in `.bashrc` (values are examples): >+ >+``` >+export JAVA_HOME=/usr/local/buildtools/java/jdk >+export ANDROID_SDK=$HOME/chromium/src/third_party/android_sdk/public >+export ANDROID_NDK=$HOME/chromium/src/third_party/android_ndk >+export ANDROID_NDK_HOME=$HOME/chromium/src/third_party/android_ndk >+``` >+ >+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 `org.chromium.native_test` 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" >+``` >diff --git a/Source/ThirdParty/ANGLE/doc/DevSetup.md b/Source/ThirdParty/ANGLE/doc/DevSetup.md >new file mode 100644 >index 00000000000..0308f5d9d69 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/DevSetup.md >@@ -0,0 +1,184 @@ >+# ANGLE Development >+ >+ANGLE provides OpenGL ES 2.0 and EGL 1.4 libraries and dlls. You can use these to build and run OpenGL ES 2.0 applications on Windows, Linux, Mac and Android. >+ >+## Development setup >+ >+### Version Control >+ANGLE uses git for version control. If you are not familiar with git, helpful documentation can be found at [http://git-scm.com/documentation](http://git-scm.com/documentation). >+ >+### Required Tools >+On all platforms: >+ >+ * GN is the build system. GYP support has been removed. >+ * Clang will be set up by the build system and used by default. See below for platform-specific compiler choices. >+ * [depot_tools](http://dev.chromium.org/developers/how-tos/install-depot-tools) >+ * Required to generate projects and build files, contribute patches, run the unit tests or build the shader compiler on non-Windows systems. >+ >+On Windows: >+ >+ * [Visual Studio Community 2017 Update 3.2](https://www.visualstudio.com/en-us/news/releasenotes/vs2017-relnotes) >+ * Put `is_clang = false` in your gn args to compile with the Microsoft Visual C++ compiler instead of clang. >+ * See the [Chromium Windows build instructions](https://chromium.googlesource.com/chromium/src/+/master/docs/windows_build_instructions.md) for more info. >+ * Required for the packaged Windows 10 SDK. >+ * [Windows 10 Standalone SDK version 10.0.17134 exactly](https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk). >+ * Comes with additional features that aid development, such as the Debug runtime for D3D11. Required for the D3D Compiler DLL. >+ * [Cygwin's Bison, flex, and patch](https://cygwin.com/setup-x86_64.exe) (optional) >+ * This is only required if you need to modify GLSL ES grammar files (`glslang.l` and `glslang.y` under `src/compiler/translator`, or `ExpressionParser.y` and `Tokenizer.l` in `src/compiler/preprocessor`). >+ Use the latest versions of bison, flex and patch from the 64-bit cygwin distribution. >+ * **IMPORTANT**: Non-googlers need to set `DEPOT_TOOLS_WIN_TOOLCHAIN` environment variable to 0. >+ >+On Linux: >+ >+ * Development packages for OpenGL, X11 and libpci (all of these dependencies should be installed automatically when running `install-build-deps.sh` later on). >+ * Bison and flex are not needed as we only support generating the translator grammar on Windows. >+ >+On MacOS: >+ >+ * [XCode](https://developer.apple.com/xcode/) for Clang and development files. >+ * Bison and flex are not needed as we only support generating the translator grammar on Windows. >+ >+### Getting the source >+ >+``` >+git clone https://chromium.googlesource.com/angle/angle >+cd angle >+python scripts/bootstrap.py >+gclient sync >+git checkout master >+``` >+ >+On Linux only, you need to install all the necessary dependencies before going further by running this command: >+``` >+./build/install-build-deps.sh >+``` >+ >+After this completes successfully, you are ready to generate the ninja files: >+``` >+gn gen out/Debug >+``` >+ >+GN will generate ninja files by default. To change the default build options run `gn args out/Debug`. Some commonly used options are: >+``` >+target_cpu = "x64" (or "x86") >+is_clang = false (to use system default compiler instead of clang) >+is_debug = true (enable debugging, true is the default) >+``` >+For a release build run `gn args out/Release` and set `is_debug = false`. >+ >+For more information on GN run `gn help`. >+ >+Ninja can be used to compile on all platforms with one of the following commands: >+``` >+ninja -C out/Debug >+ninja -C out/Release >+``` >+Ninja automatically calls GN to regenerate the build files on any configuration change. >+Ensure `depot_tools` is in your path as it provides ninja. >+ >+### Building with Visual Studio >+ >+Run `scripts/msvs_projects.py` to generate a Visual Studio solution in `out/sln/ANGLE.sln`. >+This script runs GN and consolidates all the targets in `out` into a single meta-solution. >+ >+In Visual Studio: >+ 1. Open the ANGLE solution file `out/sln/ANGLE.sln`. >+ 2. The configurations found in your `out` directory will be mapped to configurations in the configuration manager. For compatibility reasons all configurations are listed as 64-bits. >+ 3. Right click the "all" solution and select build. "Build Solution" is not functional with GN; instead build one target at a time." >+Once the build completes the output directory for your selected configuration (e.g. `out/Release_x64`) will contain the required libraries and dlls to build and run an OpenGL ES 2.0 application. ANGLE executables (tests and samples) are under out/sln. >+ >+### Building ANGLE for Android >+Building ANGLE for Android is heavily dependent on the Chromium toolchain. It is not currently possible to build ANGLE for Android without a Chromium checkout. See http://anglebug.com/2344 for more details on why. >+Please follow the steps in >+[Checking out and building Chromium for Android](https://chromium.googlesource.com/chromium/src/+/master/docs/android_build_instructions.md). >+This must be done on Linux, the only platform that Chromium for Android supports. >+Name your output directories `out/Debug` and `out/Release`, because Chromium GPU tests look for browser binaries in these folders. Replacing `out` with other names seems to be OK when working with multiple build configurations. >+It's best to use a build configuration of some Android bot on [GPU.FYI waterfall](https://ci.chromium.org/p/chromium/g/chromium.gpu.fyi/console). Look for `generate_build_files` step output of that bot. Remove `goma_dir` flag. >+For example, these are the build flags from Nexus 5X bot: >+``` >+build_angle_deqp_tests = true >+dcheck_always_on = true >+ffmpeg_branding = "Chrome" >+is_component_build = false >+is_debug = false >+proprietary_codecs = true >+symbol_level = 1 >+target_cpu = "arm64" # Nexus 5X is 64 bit, remove this on 32 bit devices >+target_os = "android" >+use_goma = true # Remove this if you don't have goma >+``` >+Additional flags to build the Vulkan backend, enable only if running on Android O or higher: >+``` >+android32_ndk_api_level = 26 >+android64_ndk_api_level = 26 >+``` >+ >+These ANGLE targets are supported: >+`ninja -C out/Release translator libEGL libGLESv2 angle_unittests angle_end2end_tests angle_white_box_tests angle_deqp_gles2_tests angle_deqp_gles3_tests angle_deqp_egl_tests angle_perftests angle_white_box_perftests` >+ >+In order to run ANGLE tests, prepend `bin/run_` to the test name, for example: `./out/Release/bin/run_angle_unittests`. >+Additional details are in [Android Test Instructions](https://chromium.googlesource.com/chromium/src/+/master/docs/android_test_instructions.md). >+ >+**dEQP Note**: 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 (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 >+``` >+adb pull /sdcard/chromium_tests_root/third_party/deqp/src/data/TestResults.qpa . >+``` >+ >+In order to run GPU telemetry tests, build `chrome_public_apk` target. Then follow [GPU Testing](http://www.chromium.org/developers/testing/gpu-testing#TOC-Running-the-GPU-Tests-Locally) doc, using `--browser=android-chromium` argument. Make sure to set your `CHROMIUM_OUT_DIR` environment variable, so that your browser is found, otherwise the stock one will run. >+ >+Also, follow [How to build ANGLE in Chromium for dev](BuildingAngleForChromiumDevelopment.md) to work with Top of Tree ANGLE in Chromium. >+ >+## 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 it's specification in `extensions/ANGLE_platform_angle.txt` and `extensions/ANGLE_platform_angle_*.txt` and examples of it's 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 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 to GLSL Translator >+In addition to OpenGL ES 2.0 and EGL 1.4 libraries, ANGLE also provides a GLSL ES to GLSL translator. This is useful for implementing OpenGL ES emulators on top of desktop OpenGL. >+ >+### Source and Building >+The translator code is included with ANGLE but fully independent; it resides in `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 basic usage is shown in `essl_to_glsl` sample under `samples/translator`. To translate a GLSL ES shader, following functions need to be called in the same order: >+ >+ * `ShInitialize()` initializes the translator library and must be called only once from each process using the translator. >+ * `ShContructCompiler()` creates a translator object for vertex or fragment shader. >+ * `ShCompile()` translates the given shader. >+ * `ShDestruct()` destroys the given translator. >+ * `ShFinalize()` shuts down the translator library and must be called only once from each process using the translator. >diff --git a/Source/ThirdParty/ANGLE/doc/DirtyBits.md b/Source/ThirdParty/ANGLE/doc/DirtyBits.md >new file mode 100644 >index 00000000000..8c19b13f1d6 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/DirtyBits.md >@@ -0,0 +1,110 @@ >+# 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 the [Vulkan README][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 >+[VulkanREADME]: ../src/libANGLE/renderer/vulkan/README.md#fast-opengl-state-transitions >diff --git a/Source/ThirdParty/ANGLE/doc/DynamicShaderCompilation.md b/Source/ThirdParty/ANGLE/doc/DynamicShaderCompilation.md >new file mode 100644 >index 00000000000..894142f7e08 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/DynamicShaderCompilation.md >@@ -0,0 +1,24 @@ >+# 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. >diff --git a/Source/ThirdParty/ANGLE/doc/ExtensionSupport.md b/Source/ThirdParty/ANGLE/doc/ExtensionSupport.md >new file mode 100644 >index 00000000000..1df3c5808c4 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/ExtensionSupport.md >@@ -0,0 +1,65 @@ >+# Introduction >+ >+This page details the extensions that are supported by ANGLE. >+ >+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) >+ >+# Details >+ >+## GLES extensions >+ >+* GL\_OES\_element\_index\_uint (fn1) >+* GL\_OES\_get\_program\_binary >+* GL\_OES\_packed\_depth\_stencil >+* GL\_OES\_rgb8\_rgba8 >+* GL\_OES\_standard\_derivatives >+* GL\_OES\_texture\_half\_float (fn1) >+* GL\_OES\_texture\_half\_float\_linear (fn1) >+* GL\_OES\_texture\_float (fn1) >+* GL\_OES\_texture\_float\_linear (fn1) >+* GL\_OES\_texture\_npot (fn1) >+* GL\_EXT\_occlusion\_query\_boolean (fn1) >+* GL\_EXT\_read\_format\_bgra >+* GL\_EXT\_robustness >+ * reset notifications and sized queries only, no robust buffer access >+* GL\_EXT\_texture\_compression\_dxt1 (fn1) >+* GL\_EXT\_texture\_filter\_anisotropic (fn1) >+* GL\_EXT\_texture\_format\_BGRA8888 >+* GL\_EXT\_texture\_storage >+* GL\_ANGLE\_depth\_texture >+ * requires support for INTZ and NULL surfaces in D3D9 (see >+ http://aras-p.info/texts/D3D9GPUHacks.html) >+* GL\_ANGLE\_framebuffer\_blit >+* GL\_ANGLE\_framebuffer\_multisample (fn1) >+* GL\_ANGLE\_instanced\_arrays >+ * requires SM3 support >+* GL\_ANGLE\_pack\_reverse\_row\_order >+* GL\_ANGLE\_texture\_compression\_dxt3 (fn1) >+* GL\_ANGLE\_texture\_compression\_dxt5 (fn1) >+* GL\_ANGLE\_texture\_usage >+* GL\_ANGLE\_translated\_shader\_source >+* GL\_NV\_fence (fn1) >+ >+## EGL Extensions >+ >+* EGL\_EXT\_create\_context\_robustness >+ * only reset notifications supported >+* EGL\_ANGLE\_d3d\_share\_handle\_client\_buffer (fn2) >+* EGL\_ANGLE\_query\_surface\_pointer >+* EGL\_ANGLE\_software\_display (fn3) >+* EGL\_ANGLE\_surface\_d3d\_texture\_2d\_share\_handle (fn2) >+* EGL\_NV\_post\_sub\_buffer >+ >+### Notes >+ >+* fn1: extensions are only exposed if underlying D3D9 device has support for >+ the required features >+* fn2: extensions are only exposed when running on D3D9Ex (ie Win Vista/7) >+* fn3: extension is only exposed when swiftshader is present >diff --git a/Source/ThirdParty/ANGLE/doc/ExternalBenchmarks.md b/Source/ThirdParty/ANGLE/doc/ExternalBenchmarks.md >new file mode 100644 >index 00000000000..bb98394058a >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/ExternalBenchmarks.md >@@ -0,0 +1,124 @@ >+# 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 >+``` >diff --git a/Source/ThirdParty/ANGLE/doc/MANGLE.md b/Source/ThirdParty/ANGLE/doc/MANGLE.md >new file mode 100644 >index 00000000000..132a7763030 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/MANGLE.md >@@ -0,0 +1,9 @@ >+# 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). >diff --git a/Source/ThirdParty/ANGLE/doc/Orientation.md b/Source/ThirdParty/ANGLE/doc/Orientation.md >new file mode 100644 >index 00000000000..ecaf25d56dd >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/Orientation.md >@@ -0,0 +1,146 @@ >+# 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 2017 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/+/master/doc/DevSetup.md#Development-setup-Getting-the-source) >+ to set up the ANGLE solution for the first time. >+ >+- The VS 2017 solution will be in `c:/src/angle/out/sln/ANGLE.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/+/master/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/master/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/+/master/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 >+ >+- You can use `scripts/perf_test_runner.py` to run any target of `./angle_perftests` (see script >+ source for details). >+ >+### 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_canary_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. >diff --git a/Source/ThirdParty/ANGLE/doc/ResourceLimits.md b/Source/ThirdParty/ANGLE/doc/ResourceLimits.md >new file mode 100644 >index 00000000000..bc44a495b8f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/ResourceLimits.md >@@ -0,0 +1,34 @@ >+# 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 >diff --git a/Source/ThirdParty/ANGLE/doc/SourceAccess.md b/Source/ThirdParty/ANGLE/doc/SourceAccess.md >new file mode 100644 >index 00000000000..89a5b1866c9 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/SourceAccess.md >@@ -0,0 +1,15 @@ >+# 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. >diff --git a/Source/ThirdParty/ANGLE/doc/Starter-Projects.md b/Source/ThirdParty/ANGLE/doc/Starter-Projects.md >new file mode 100644 >index 00000000000..4ce1aa71b0d >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/Starter-Projects.md >@@ -0,0 +1,111 @@ >+# ANGLE Starter Projects >+ >+For the most up-to-date list of starter projects, see >+[anglebug.com](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. >+ >+## Refactors >+ >+### EGL Validation Refactoring >+ >+[anglebug.com/798](http://anglebug.com/798) >+ >+Move all EGL validation into separate functions in ValidationEGL.h. This opens up many possibilities >+for auto-generation of entry points and is simply a cleaner structure. >+ >+### EGL Entry Point Auto-generation >+ >+[anglebug.com/2621](http://anglebug.com/2621) >+ >+Auto-generate EGL entry points and stub functions. This greatly reduces the chance of bugs in this >+highly repetitive code and reduces the friction to adding new extensions. >+ >+### Support Separate Read and Draw Surfaces >+ >+[anglebug.com/2620](http://anglebug.com/2620) >+ >+ANGLE has never supported binding separate read and draw surfaces with eglMakeCurrent due to its >+architecture. Some refactoring could be done to support this use case. >+ >+### Convert GLenums into typed internal Enums >+ >+[anglebug.com/2169](http://anglebug.com/2169) >+ >+Using a compact enum instead of GLenum offers type safety. Flat enums can also index into flat >+arrays. We are in the process of migrating all internal GLenums into packed enums. >+ >+## Medium Features >+ >+### Add an AST Validator to the Shader Translator >+ >+[anglebug.com/2733](http://anglebug.com/2733) >+ >+An AST validator will reduce the number of bugs in our AST transforms and allow us to be more >+confident about all ASTs generated by the translator. >+ >+## Small Features >+ >+### Fix shader source viewing in RenderDoc/NSIGHT >+ >+[anglebug.com/2734](http://anglebug.com/2734) >+ >+It used to be possible to view the shader source when debugging shaders in graphics debuggers but >+now only the shader disassembly is available. >+ >+### Implement Android CDD Extensions >+ >+[anglebug.com/2506](http://anglebug.com/2506) >+ >+The Android CDD requires some EGL and OpenGL ES extensions from every driver. Many of them are >+simply exposing the native driver's extension to ANGLE's frontend. >+ >+## Performance >+ >+### Add perf test for eglMakeCurrent >+ >+[anglebug.com/2556](http://anglebug.com/2556) >+ >+Many customers switch Contexts frequently. MakeCurrent shows up as a hotspot. A performance test >+would protect against regressions. >+ >+### Refactor std::maps into Static Arrays >+ >+[anglebug.com/1389](http://anglebug.com/1389) >+ >+ANGLE uses internal global maps for texture tables. We should rewrite them to save on binary size >+and optimize startup time. >+ >+## Maintenance >+ >+### Add a presubmit python script >+ >+[anglebug.com/2626](http://anglebug.com/2626) >+ >+This simple script could verify that there is no diff on git cl upload. This saves developer time >+in the long run. >+ >+## Conformance >+ >+### Vulkan ES2 fixes >+ >+[anglebug.com/2615](http://anglebug.com/2615) - see open blocking bugs. Also >+[this link](https://bugs.chromium.org/p/angleproject/issues/list?can=2&q=Renderer%3DVulkan+-has%3Aowner&colspec=ID+Type+Status+Priority+Feature+Owner+Summary&cells=ids) >+for open issues. >+ >+Many small edge cases still need attention. >+ >+### WebGL Conformance on Windows >+ >+[tracking document](https://docs.google.com/spreadsheets/d/1NQePFOdCKT1WKG2P4Qt8igLrLVy4U3vLOLvVWwbkllw/edit?usp=sharing) >+ >+ANGLE is preparing to release its OpenGL backend on Windows in Chrome using the passthrough command >+decoder. There are still some failing WebGL tests. >+ >+### EGL Conformance >+ >+[anglebug.com/2623](http://anglebug.com/2623) >+ >+ANGLE's EGL implementation has a lot of holes in it's conformance. There are many tests that fail on >+all platforms due to bugs in ANGLE's EGL frontend. >diff --git a/Source/ThirdParty/ANGLE/doc/Update20120704.md b/Source/ThirdParty/ANGLE/doc/Update20120704.md >new file mode 100644 >index 00000000000..c3d80333f6e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/Update20120704.md >@@ -0,0 +1,119 @@ >+# 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. >diff --git a/Source/ThirdParty/ANGLE/doc/Update20130618.md b/Source/ThirdParty/ANGLE/doc/Update20130618.md >new file mode 100644 >index 00000000000..576c76185b7 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/Update20130618.md >@@ -0,0 +1,26 @@ >+# 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. >diff --git a/Source/ThirdParty/ANGLE/doc/Update20131120.md b/Source/ThirdParty/ANGLE/doc/Update20131120.md >new file mode 100644 >index 00000000000..968e5f6b89c >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/Update20131120.md >@@ -0,0 +1,15 @@ >+# 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. >diff --git a/Source/ThirdParty/ANGLE/doc/Update20140325.md b/Source/ThirdParty/ANGLE/doc/Update20140325.md >new file mode 100644 >index 00000000000..763b539e929 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/Update20140325.md >@@ -0,0 +1,30 @@ >+# 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! >diff --git a/Source/ThirdParty/ANGLE/doc/Update20150105.md b/Source/ThirdParty/ANGLE/doc/Update20150105.md >new file mode 100644 >index 00000000000..e0e41b02522 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/Update20150105.md >@@ -0,0 +1,45 @@ >+# 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! >diff --git a/Source/ThirdParty/ANGLE/doc/VTF.md b/Source/ThirdParty/ANGLE/doc/VTF.md >new file mode 100644 >index 00000000000..ebf3c56e3de >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/VTF.md >@@ -0,0 +1,76 @@ >+# 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. >diff --git a/Source/ThirdParty/ANGLE/doc/WritingShaderASTTransformations.md b/Source/ThirdParty/ANGLE/doc/WritingShaderASTTransformations.md >new file mode 100644 >index 00000000000..fed9b44519b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/WritingShaderASTTransformations.md >@@ -0,0 +1,50 @@ >+# 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_autogen.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. >diff --git a/Source/ThirdParty/ANGLE/doc/dEQP-Charts.md b/Source/ThirdParty/ANGLE/doc/dEQP-Charts.md >new file mode 100644 >index 00000000000..f8f5d7fc874 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/dEQP-Charts.md >@@ -0,0 +1,144 @@ >+# 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/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw >+ >+[TOC] >+ >+## Win Desktop OpenGL Charts >+ >+[https://docs.google.com/spreadsheets/d/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw/edit#gid=594707611](https://docs.google.com/spreadsheets/d/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw/edit#gid=594707611) >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1998734038&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1544220508&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1149595028&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=348149668&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1599260099&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1933215664&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=2041081385&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1660391707&format=interactive"></iframe> >+ >+## Win Vulkan Charts >+ >+[https://docs.google.com/spreadsheets/d/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw/edit#gid=1309999426](https://docs.google.com/spreadsheets/d/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw/edit#gid=1309999426) >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1898485969&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1062362791&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1220829706&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1890226161&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=2116243008&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1562925234&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1787463364&format=interactive"></iframe> >+ >+## Win D3D11 Charts >+ >+[https://docs.google.com/spreadsheets/d/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw/edit#gid=1992689006](https://docs.google.com/spreadsheets/d/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw/edit#gid=1992689006) >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1518262999&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=97125514&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1060253235&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=246254186&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1271554861&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1056966792&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=520899822&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1801387528&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1672704177&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=618835896&format=interactive"></iframe> >+ >+## Mac Desktop Open GL Charts >+ >+[https://docs.google.com/spreadsheets/d/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw/edit#gid=88498958](https://docs.google.com/spreadsheets/d/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw/edit#gid=88498958) >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1082337120&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1360910790&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=800492117&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1963521198&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=969157188&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1793044649&format=interactive"></iframe> >+ >+## Linux Desktop Open GL Charts >+ >+[https://docs.google.com/spreadsheets/d/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw/edit#gid=399484153](https://docs.google.com/spreadsheets/d/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw/edit#gid=399484153) >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=128497133&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=701825003&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1832030107&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=685804323&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1485502774&format=interactive"></iframe> >+ >+## Linux Vulkan Charts >+ >+[https://docs.google.com/spreadsheets/d/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw/edit#gid=1599548256](https://docs.google.com/spreadsheets/d/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw/edit#gid=1599548256) >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=479459897&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=928302537&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1745663833&format=interactive"></iframe> >+ >+## Android Vulkan Charts >+ >+[https://docs.google.com/spreadsheets/d/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw/edit#gid=1077550384](https://docs.google.com/spreadsheets/d/1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw/edit#gid=1077550384) >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=897493509&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1225937714&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=2095717740&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=2090897373&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1842182124&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=592534104&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=759272530&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1826530566&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1075893765&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=872522689&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=332316384&format=interactive"></iframe> >+ >+<iframe width="600px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubchart?oid=1867448905&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 src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubhtml?gid=227024905&single=true&widget=true&headers=false" width="100%" height="600px"></iframe> >+ >+<iframe src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSVry_ITbQWPOeDkQcnwGAceB-9uwDY43edtgwa8yS48muFZSddlPKfuLC6v85DpF1xFZivWpslUZFv/pubhtml?gid=101098052&single=true&widget=true&headers=false" width="100%" height="600px"></iframe> >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/doc/dEQP.md b/Source/ThirdParty/ANGLE/doc/dEQP.md >new file mode 100644 >index 00000000000..80d21702d16 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/dEQP.md >@@ -0,0 +1,71 @@ >+# 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/deqp/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-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`. When >+you fix tests, please remove the suppression(s) from the relevant files! >diff --git a/Source/ThirdParty/ANGLE/doc/img/StateChangeNotificationFlow.svg b/Source/ThirdParty/ANGLE/doc/img/StateChangeNotificationFlow.svg >new file mode 100644 >index 00000000000..df65f9dac4e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/img/StateChangeNotificationFlow.svg >@@ -0,0 +1,2 @@ >+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> >+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="642px" height="682px" viewBox="-0.5 -0.5 642 682" content="<mxfile modified="2019-05-01T19:07:07.556Z" host="www.draw.io" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36" etag="7MVQbu2uo8iAHLBw1ZlM" version="10.6.5" type="google"><diagram id="6a731a19-8d31-9384-78a2-239565b7b9f0" name="Page-1">7Vxbc+I2GP01PIbRzbfHQJLdTrdNJ2m7m74pIIyzwqJGJCS/fmVbxja+YAg4MDGTSaxPsix/53zS0YX08HC2+hLQ+fQPMWa8h8B41cNXPYQQwET9CS2v2kLs2OAG3jg2wdRw770xbQTauvTGbJErKIXg0pvnjSPh+2wkczYaBOIlX2wieP6pc+qyguF+RHnR+t0by6m2QtNJM74yz53qR9vIijMe6einG4ilr5/XQ3gSfeLsGU3q0i+6mNKxeMmY8HUPDwMhZHw1Ww0ZD32buC2+76Yid93ugPmyyQ2GGd/xTPlSv/u9pJIp03BKfTe8+FNIb+KNqPSEr5I3XDU4brx8TRy2kIH4yYaCiyAy4MHl0L7CPTyYeJxn7AgTYlyFduFLDTwiKh3XkHgb6RI3dObxkERfGX9mUrVCZUzljCsT1GUytd9En6R23TwQ1j6nI893B0JKMVM2O7XdaRgzxb6xSWKh3HN9dT1SDmXqKYOih7XTn1kg2Spj0h7/wsSMyeBVFdG5RIOvg8MmuoaXlGpmUmaaZZm2Uc1ud11zirC60CCXA27aBcC3g5m6NQ9mCnIKJrT3BlOE3pdhARMcxdMOauhpCA7hauccXO0cx9UQtOprC5yDr49Eawjb9TU8B18fi9eoXV+jc/D1sXiN2/U1PgdfH4vXpFVf207BtWysJLhOikBOhSt8yq9T6yDS1WysXfK0nM2T8r7wWd5hbOXJH5nrh1DP9Y0w5au2/tDyLkqkeZw+Mj5Ya/gMnlrFh/jRQF6Gc4xQFXK6WHijxHzj8fXz/XFSSDfuiUn5qplAl1KEqK5f85sQc31ngWJgiAm+KlAH11Eny7oSnQyiT9xM3ei1N65WudSrTlVSTr24y2QisGJbiGUtCQPG1XziOT/dKiNUdKvyJH3NFJgLz5eLTM1/hYaU2yiJ3ET3WRuzoC3lIbDMDTbHTSi/HTpW6ePW7V2IZTBi+q66dlj2xsC+WVPs7EJNUbit3dsoAp2iYnJV2Uv1M1RkYStZiNB8/FVN7PL81eTfr9dzAzr2WMpcXVntpE+T3jhML2mBPnaIYVg2wlDRO4+PylHdxmavCZPFgGyvaRyg03SKwitYxZANlpMJC36bzXmHmnI2NPoOIJYJ9e+N6DaKQ93xQCsquCTOYtA6wKKOr48NbBFIHNNwbPMDAXt+mEnj++31wLcRtB7+sdDj8gIa1nZxuIuCAVXDf4lMyEC1t/rID/SVkMUjlWYuLhngzUMP8I3jqKjOkzi6CeiMPXbBlAkmUt37oZYHLVI5aP2tRMYyYN2o1WjUwi3jZlTG2z1ViHWx1mDgIi1jVtzNSTDTsdZhthWzluMMgmIHydaRtgwmdNShpntHy7ANgAmA2ARGHjXYMmqwwcJsVg8y/iheslIwMqiMqQi8N+UuyktXeKpXg5rAtk0HNpSTzeQieIdc1CBfQAf3DQMCBAiwoYlRHmYbgTKUMew7lgprB0LDJCYiRdBrVy3LV2O2NcZJG7PrQs+FCfvrNQUDmo5T9ZpbFn7euzIGoY31o0rXuvZYWIKwwTp6FxqJvupC41RDAzjo4KFRHOs/e2igktCAXWgcNTT2om5xPniS1E0299K9vods3q67W9u4WrFaCDoGnx6Di7PjE2RwMyaaJb0m7jh3epzbcdvgEwz4ZdQlHXVPjrqoeEDgE1L3LClJgFG7A2Ttzchtq3DFmg/HyHKpRc6kh60+dFanSw9E75rTcCqVPjtM7CaJdxa6NqwNE9ximCCQPwO5/7kte+Mw5fqM9NGX7/Lf73n3CsX97dsDHw0n1/T3/+gtvHt5MvgFTPz9wYcfSqm2laL1M7SsDKl4eVzO6IOfcKhvaMme3r/R5onmkMnVWwwegxwq5v/L8JtkURd1sYj8eqkKQGO+ivyZ5KsrV649/Lk3muq3B1s+8ldHyY4Tu3CiQIASmlQfA4V5SqCP5ERFP1F9XuNOaQYWdAekGh4AaHkruRxOs8GXrE5B1p7M7Muok5VWm7MvXPjKWEqoXZVloa7oRRtpy8OpP/TpqLhdY1ZTkRDUBzVUTLbHj0/EA34vxamvaG8KqmT6zw7i4ul/lMDXvwA=</diagram></mxfile>"><defs/><g><rect x="1" y="1" width="640" height="80" fill="#23445d" stroke="#bac8d3" stroke-width="2" pointer-events="none"/><g transform="translate(155.5,23.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="330" height="26" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 24px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">State Change Notification Flow</div></div></foreignObject><text x="165" y="25" fill="#FFFFFF" text-anchor="middle" font-size="24px" font-family="Helvetica">State Change Notification Flow</text></switch></g><rect x="1" y="81" width="640" height="100" fill-opacity="0.6" fill="#bac8d3" stroke="#ffffff" stroke-opacity="0.6" stroke-width="2" pointer-events="none"/><rect x="1" y="181" width="640" height="100" fill-opacity="0.9" fill="#bac8d3" stroke="#ffffff" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><rect x="1" y="281" width="640" height="100" fill-opacity="0.6" fill="#bac8d3" stroke="#ffffff" stroke-opacity="0.6" stroke-width="2" pointer-events="none"/><rect x="1" y="381" width="640" height="100" fill-opacity="0.9" fill="#bac8d3" stroke="#ffffff" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><rect x="1" y="481" width="640" height="100" fill-opacity="0.6" fill="#bac8d3" stroke="#ffffff" stroke-opacity="0.6" stroke-width="2" pointer-events="none"/><rect x="1" y="581" width="640" height="100" fill-opacity="0.9" fill="#bac8d3" stroke="#ffffff" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><path d="M 168.1 130 L 175.55 130 Q 183 130 183 140 L 183 226 Q 183 236 193 236 L 239 236" fill="none" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 161.35 130 L 170.35 125.5 L 168.1 130 L 170.35 134.5 Z" fill="#0c343d" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><rect x="31.39" y="105.5" width="127" height="50" rx="7.5" ry="7.5" fill="#23445d" stroke="none" pointer-events="none"/><g transform="translate(58.5,122.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="72" height="16" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">gl::Context</div></div></foreignObject><text x="36" y="16" fill="#FFFFFF" text-anchor="middle" font-size="15px" font-family="Helvetica">gl::Context</text></switch></g><rect x="476.9" y="211" width="127" height="50" rx="7.5" ry="7.5" fill="#23445d" stroke="none" pointer-events="none"/><g transform="translate(495.5,227.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="89" height="16" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">rx::BufferImpl</div></div></foreignObject><text x="45" y="16" fill="#FFFFFF" text-anchor="middle" font-size="15px" font-family="Helvetica">rx::BufferImpl</text></switch></g><rect x="239.35" y="211" width="127" height="50" rx="7.5" ry="7.5" fill="#23445d" stroke="none" pointer-events="none"/><g transform="translate(272.5,227.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="60" height="16" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">gl::Buffer</div></div></foreignObject><text x="30" y="16" fill="#FFFFFF" text-anchor="middle" font-size="15px" font-family="Helvetica">gl::Buffer</text></switch></g><path d="M 302.9 461.87 L 302.9 505.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 302.9 456.62 L 306.4 463.62 L 302.9 461.87 L 299.4 463.62 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="239.4" y="405.5" width="127" height="50" rx="7.5" ry="7.5" fill="#23445d" stroke="none" pointer-events="none"/><g transform="translate(251.5,422.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="101" height="16" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">gl::Framebuffer</div></div></foreignObject><text x="51" y="16" fill="#FFFFFF" text-anchor="middle" font-size="15px" font-family="Helvetica">gl::Framebuffer</text></switch></g><rect x="476.9" y="505.5" width="127" height="50" rx="7.5" ry="7.5" fill="#23445d" stroke="none" pointer-events="none"/><g transform="translate(490.5,522.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="98" height="16" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">rx::TextureImpl</div></div></foreignObject><text x="49" y="16" fill="#FFFFFF" text-anchor="middle" font-size="15px" font-family="Helvetica">rx::TextureImpl</text></switch></g><rect x="239.35" y="605.5" width="127" height="50" rx="7.5" ry="7.5" fill="#23445d" stroke="none" pointer-events="none"/><g transform="translate(264.5,622.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="76" height="16" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">gl::Sampler</div></div></foreignObject><text x="38" y="16" fill="#FFFFFF" text-anchor="middle" font-size="15px" font-family="Helvetica">gl::Sampler</text></switch></g><rect x="239.35" y="505.5" width="127" height="50" rx="7.5" ry="7.5" fill="#23445d" stroke="none" pointer-events="none"/><g transform="translate(267.5,522.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="69" height="16" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">gl::Texture</div></div></foreignObject><text x="35" y="16" fill="#FFFFFF" text-anchor="middle" font-size="15px" font-family="Helvetica">gl::Texture</text></switch></g><rect x="476.76" y="305.5" width="127" height="50" rx="7.5" ry="7.5" fill="#23445d" stroke="none" pointer-events="none"/><g transform="translate(499.5,322.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="80" height="16" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">egl::Surface</div></div></foreignObject><text x="40" y="16" fill="#FFFFFF" text-anchor="middle" font-size="15px" font-family="Helvetica">egl::Surface</text></switch></g><path d="M 168.5 130.5 L 175.75 130.5 Q 183 130.5 183 140.5 L 183 520.5 Q 183 530.5 193 530.5 L 239.35 530.5" fill="none" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 161.75 130.5 L 170.75 126 L 168.5 130.5 L 170.75 135 Z" fill="#0c343d" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 168.5 130.5 L 175.75 130.5 Q 183 130.5 183 140.5 L 183 620.5 Q 183 630.5 193 630.5 L 239.35 630.5" fill="none" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 161.75 130.5 L 170.75 126 L 168.5 130.5 L 170.75 135 Z" fill="#0c343d" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 376.46 236 L 412 236 Q 422 236 432 236 L 476.9 236" fill="none" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 369.71 236 L 378.71 231.5 L 376.46 236 L 378.71 240.5 Z" fill="#0c343d" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 303 211 L 303 193.5 Q 303 183.5 303 174.8 L 303 166.1" fill="none" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 303 159.35 L 307.5 168.35 L 303 166.1 L 298.5 168.35 Z" fill="#0c343d" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 303 505.5 L 303 490.5 Q 303 480.5 303 473.05 L 303 465.6" fill="none" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 303 458.85 L 307.5 467.85 L 303 465.6 L 298.5 467.85 Z" fill="#0c343d" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 376.46 530.5 L 412 530.5 Q 422 530.5 432 530.5 L 476.9 530.5" fill="none" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 369.71 530.5 L 378.71 526 L 376.46 530.5 L 378.71 535 Z" fill="#0c343d" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 376.51 430.5 L 412 430.5 Q 422 430.5 422 420.5 L 422 340.5 Q 422 330.5 432 330.5 L 476.76 330.5" fill="none" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 369.76 430.5 L 378.76 426 L 376.51 430.5 L 378.76 435 Z" fill="#0c343d" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 168.1 131 L 175.55 131 Q 183 131 183 141 L 183 421 Q 183 431 193 431 L 241 431" fill="none" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 161.35 131 L 170.35 126.5 L 168.1 131 L 170.35 135.5 Z" fill="#0c343d" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 239.35 130.5 L 165.72 130.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 160.47 130.5 L 167.47 127 L 165.72 130.5 L 167.47 134 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="239.35" y="105.5" width="127" height="50" rx="7.5" ry="7.5" fill="#23445d" stroke="none" pointer-events="none"/><g transform="translate(253.5,122.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="98" height="16" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">gl::VertexArray<br style="font-size: 15px" /></div></div></foreignObject><text x="49" y="16" fill="#FFFFFF" text-anchor="middle" font-size="15px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="32.35" y="105.5" width="127" height="50" rx="7.5" ry="7.5" fill="#23445d" stroke="none" pointer-events="none"/><g transform="translate(46.5,122.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="98" height="16" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">gl::VertexArray<br style="font-size: 15px" /></div></div></foreignObject><text x="49" y="16" fill="#FFFFFF" text-anchor="middle" font-size="15px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="239.35" y="305.5" width="127" height="50" rx="7.5" ry="7.5" fill="#23445d" stroke="none" pointer-events="none"/><g transform="translate(248.5,322.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="107" height="16" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">gl::Renderbuffer</div></div></foreignObject><text x="54" y="16" fill="#FFFFFF" text-anchor="middle" font-size="15px" font-family="Helvetica">gl::Renderbuffer</text></switch></g><path d="M 301 395.4 L 301 387.95 Q 301 380.5 301 370.5 L 301 355.5" fill="none" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 301 402.15 L 296.5 393.15 L 301 395.4 L 305.5 393.15 Z" fill="#0c343d" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 168.1 130 L 189 130 Q 199 130 209 130 L 240 130" fill="none" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/><path d="M 161.35 130 L 170.35 125.5 L 168.1 130 L 170.35 134.5 Z" fill="#0c343d" stroke="#0c343d" stroke-width="3" stroke-miterlimit="10" pointer-events="none"/></g></svg> >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/doc/img/StateNotificationExample.svg b/Source/ThirdParty/ANGLE/doc/img/StateNotificationExample.svg >new file mode 100644 >index 00000000000..44bcb66dcdd >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/doc/img/StateNotificationExample.svg >@@ -0,0 +1,11 @@ >+<?xml version="1.0" encoding="utf-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"><svg xmlns="http://www.w3.org/2000/svg" width="621" height="390" xmlns:xlink="http://www.w3.org/1999/xlink"><source><![CDATA[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 >+]]></source><desc></desc><defs><marker viewBox="0 0 5 5" markerWidth="5" markerHeight="5" orient="auto" refX="5" refY="2.5" id="markerArrowBlock"><path d="M 0 0 L 5 2.5 L 0 5 z"></path></marker><marker viewBox="0 0 9.6 16" markerWidth="4" markerHeight="16" orient="auto" refX="9.6" refY="8" id="markerArrowOpen"><path d="M 9.6,8 1.92,16 0,13.7 5.76,8 0,2.286 1.92,0 9.6,8 z"></path></marker></defs><g class="title"></g><g class="actor"><rect x="10" y="20" width="46.953125" height="38.84375" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="20.5625" y="44.84375" style="font-size: 16px; font-family: "Andale Mono", monospace;"><tspan x="20">App</tspan></text></g><g class="actor"><rect x="10" y="331.90625" width="46.953125" height="38.84375" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="20.5625" y="356.75" style="font-size: 16px; font-family: "Andale Mono", monospace;"><tspan x="20">App</tspan></text></g><line x1="33.4765625" x2="33.4765625" y1="58.84375" y2="331.90625" stroke="#000000" fill="none" style="stroke-width: 2;"></line><g class="actor"><rect x="118.25" y="20" width="81.578125" height="38.84375" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="128.25" y="44.84375" style="font-size: 16px; font-family: "Andale Mono", monospace;"><tspan x="128.25">Context</tspan></text></g><g class="actor"><rect x="118.25" y="331.90625" width="81.578125" height="38.84375" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="128.25" y="356.75" style="font-size: 16px; font-family: "Andale Mono", monospace;"><tspan x="128.25">Context</tspan></text></g><line x1="159.0390625" x2="159.0390625" y1="58.84375" y2="331.90625" stroke="#000000" fill="none" style="stroke-width: 2;"></line><g class="actor"><rect x="296.59375" y="20" width="116.765625" height="38.84375" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="306.59375" y="44.84375" style="font-size: 16px; font-family: "Andale Mono", monospace;"><tspan x="306.59375">Framebuffer</tspan></text></g><g class="actor"><rect x="296.59375" y="331.90625" width="116.765625" height="38.84375" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="306.59375" y="356.75" style="font-size: 16px; font-family: "Andale Mono", monospace;"><tspan x="306.59375">Framebuffer</tspan></text></g><line x1="354.9765625" x2="354.9765625" y1="58.84375" y2="331.90625" stroke="#000000" fill="none" style="stroke-width: 2;"></line><g class="actor"><rect x="510.125" y="20" width="81.578125" height="38.84375" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="520.125" y="44.84375" style="font-size: 16px; font-family: "Andale Mono", monospace;"><tspan x="520.125">Texture</tspan></text></g><g class="actor"><rect x="510.125" y="331.90625" width="81.578125" height="38.84375" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="520.125" y="356.75" style="font-size: 16px; font-family: "Andale Mono", monospace;"><tspan x="520.125">Texture</tspan></text></g><line x1="550.9140625" x2="550.9140625" y1="58.84375" y2="331.90625" stroke="#000000" fill="none" style="stroke-width: 2;"></line><g class="signal"><text x="43.4765625" y="89.265625" style="font-size: 16px; font-family: "Andale Mono", monospace;"><tspan x="43.4765625">glTexImage2D</tspan></text><line x1="33.4765625" x2="159.0390625" y1="97.6875" y2="97.6875" stroke="#000000" fill="none" style="stroke-width: 2; marker-end: url("#markerArrowBlock");"></line></g><g class="signal"><text x="319.7890625" y="128.109375" style="font-size: 16px; font-family: "Andale Mono", monospace;"><tspan x="319.7890625">setImage</tspan></text><line x1="159.0390625" x2="550.9140625" y1="136.53125" y2="136.53125" stroke="#000000" fill="none" style="stroke-width: 2; marker-end: url("#markerArrowBlock");"></line></g><g class="signal"><text x="364.9765625" y="166.953125" style="font-size: 16px; font-family: "Andale Mono", monospace;"><tspan x="364.9765625">onSubjectStateChange</tspan></text><line x1="550.9140625" x2="354.9765625" y1="175.375" y2="175.375" stroke="#000000" fill="none" style="stroke-width: 2; stroke-dasharray: 6, 2; marker-end: url("#markerArrowBlock");"></line></g><g class="note"><rect x="297.1953125" y="195.375" width="115.5625" height="28.84375" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="302.1953125" y="215.21875" style="font-size: 16px; font-family: "Andale Mono", monospace;"><tspan x="302.1953125">cache update</tspan></text></g><g class="signal"><text x="169.0390625" y="254.640625" style="font-size: 16px; font-family: "Andale Mono", monospace;"><tspan x="169.0390625">onSubjectStateChange</tspan></text><line x1="354.9765625" x2="159.0390625" y1="263.0625" y2="263.0625" stroke="#000000" fill="none" style="stroke-width: 2; stroke-dasharray: 6, 2; marker-end: url("#markerArrowBlock");"></line></g><g class="note"><rect x="101.2578125" y="283.0625" width="115.5625" height="28.84375" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="106.2578125" y="302.90625" style="font-size: 16px; font-family: "Andale Mono", monospace;"><tspan x="106.2578125">cache update</tspan></text></g></svg> >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/dotfile_settings.gni b/Source/ThirdParty/ANGLE/dotfile_settings.gni >new file mode 100644 >index 00000000000..8c370c36f51 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/dotfile_settings.gni >@@ -0,0 +1,16 @@ >+# 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"), >+ get_path_info("third_party/vulkan-headers/BUILD.gn", "abspath"), >+ get_path_info("third_party/vulkan-loader/BUILD.gn", "abspath"), >+ get_path_info("third_party/vulkan-tools/BUILD.gn", "abspath"), >+ get_path_info("third_party/vulkan-validation-layers/BUILD.gn", "abspath"), >+ ] >+} >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_client_arrays.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_client_arrays.txt >new file mode 100644 >index 00000000000..c8074b5a335 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_client_arrays.txt >@@ -0,0 +1,103 @@ >+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 >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_copy_texture_3d.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_copy_texture_3d.txt >new file mode 100644 >index 00000000000..dfa8f1e680f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_copy_texture_3d.txt >@@ -0,0 +1,225 @@ >+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. >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_depth_texture.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_depth_texture.txt >new file mode 100644 >index 00000000000..067ecc5ed2a >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_depth_texture.txt >@@ -0,0 +1,402 @@ >+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 >+ >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_explicit_context.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_explicit_context.txt >new file mode 100644 >index 00000000000..32f0459304f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_explicit_context.txt >@@ -0,0 +1,81 @@ >+Name >+ >+ ANGLE_explicit_context >+ >+Name Strings >+ >+ GL_ANGLE_explicit_context >+ >+Contributors >+ >+ Brandon Jones, Intel >+ >+Contacts >+ >+ Brandon Jones, Intel (brandon1.jones 'at' intel 'dot' com) >+ >+Status >+ >+ Complete. >+ >+Version >+ >+ Version 1, 2018-5-22 >+ >+Number >+ >+ GL Extension XXX >+ >+Dependencies >+ >+ OpenGL ES 3.1 is required. >+ >+ EGL_ANGLE_explicit_context is required. >+ >+Overview >+ >+ This extension adds new OpenGL ES entry points that allow the user to pass the current EGL >+ context as a function parameter. This allows users to skip lookup of the thread's current >+ context upon entry. >+ >+New Types >+ >+ typedef void* GLeglContextANGLE >+ >+New Procedures and Functions >+ >+ For every OpenGL ES entry point available in OpenGL ES 2.0, 3.0 and 3.1, an additional entry >+ point is made available. The entry points have the form of: >+ >+ <return value> gl<entry point name>ContextANGLE(GLeglContextANGLE context, <entry point parameters>) >+ >+ If a function already has an extension suffix, this form still applies. >+ >+New Tokens >+ >+ None. >+ >+Additions to Chapter 2 of the OpenGL ES 3.1 Specification (OpenGL ES Fundamentals) >+ >+ The ContextANGLE entry points allow the user to pass the current EGL context as a function >+ parameter to provide better performance than looking up the current EGL context at every GL >+ entry point. >+ >+ Calls made with an explicit context provide no additional validation for the passed context >+ parameter. >+ >+ Calls made with an explicit context will generate errors under the same conditions as they >+ would without an explicit context. Any instances of undefined behaviour without specifying >+ an explicit context are still undefined when specifying an explicit context. >+ >+ When an EGL context that is not current is explicitly passed, the resulting behavior is >+ undefined. >+ >+Issues >+ >+ None. >+ >+Revision History >+ >+ Version 1, 2018-5-22 (Brandon Jones) >+ - Initial draft >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_explicit_context_gles1.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_explicit_context_gles1.txt >new file mode 100644 >index 00000000000..3c7e9d875dc >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_explicit_context_gles1.txt >@@ -0,0 +1,81 @@ >+Name >+ >+ ANGLE_explicit_context_gles1 >+ >+Name Strings >+ >+ GL_ANGLE_explicit_context_gles1 >+ >+Contributors >+ >+ Brandon Jones, Intel >+ >+Contacts >+ >+ Brandon Jones, Intel (brandon1.jones 'at' intel 'dot' com) >+ >+Status >+ >+ Complete. >+ >+Version >+ >+ Version 1, 2018-5-22 >+ >+Number >+ >+ GL Extension XXX >+ >+Dependencies >+ >+ OpenGL ES 1.0 is required. >+ >+ EGL_ANGLE_explicit_context is required. >+ >+Overview >+ >+ This extension adds new OpenGL ES entry points that allow the user to pass the current EGL >+ context as a function parameter. This allows users to skip lookup of the thread's current >+ context upon entry. >+ >+New Types >+ >+ typedef void* GLeglContextANGLE >+ >+New Procedures and Functions >+ >+ For every OpenGL ES entry point available in OpenGL ES 1.0, an additional entry point is made >+ available. The entry points have the form of: >+ >+ <return value> gl<entry point name>ContextANGLE(GLeglContextANGLE context, <entry point parameters>) >+ >+ If a function already has an extension suffix, this form still applies. >+ >+New Tokens >+ >+ None. >+ >+Additions to Chapter 2 of the OpenGL ES 1.0 Specification (OpenGL ES Operation) >+ >+ The ContextANGLE entry points allow the user to pass the current EGL context as a function >+ parameter to provide better performance than looking up the current EGL context at every GL >+ entry point. >+ >+ Calls made with an explicit context provide no additional validation for the passed context >+ parameter. >+ >+ Calls made with an explicit context will generate errors under the same conditions as they >+ would without an explicit context. Any instances of undefined behaviour without specifying >+ an explicit context are still undefined when specifying an explicit context. >+ >+ When an EGL context that is not current is explicitly passed, the resulting behavior is >+ undefined. >+ >+Issues >+ >+ None. >+ >+Revision History >+ >+ Version 1, 2018-5-22 (Brandon Jones) >+ - Initial draft >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_framebuffer_blit.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_framebuffer_blit.txt >new file mode 100644 >index 00000000000..53056c44977 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_framebuffer_blit.txt >@@ -0,0 +1,437 @@ >+Name >+ >+ ANGLE_framebuffer_blit >+ >+Name Strings >+ >+ GL_ANGLE_framebuffer_blit >+ >+Contributors >+ >+ Contributors to EXT_framebuffer_blit >+ Daniel Koch, TransGaming Inc. >+ Shannon Woods, TransGaming Inc. >+ Kenneth Russell, Google Inc. >+ Vangelis Kokkevis, Google Inc. >+ >+Contact >+ >+ Daniel Koch, TransGaming Inc. (daniel 'at' transgaming 'dot' com) >+ >+Status >+ >+ Implemented in ANGLE ES2 >+ >+Version >+ >+ Last Modified Date: Sept 22, 2012 >+ Author Revision: 4 >+ >+Number >+ >+ OpenGL ES Extension #83 >+ >+Dependencies >+ >+ OpenGL ES 2.0 is required. >+ >+ The extension is written against the OpenGL ES 2.0 specification. >+ >+ OES_texture_3D affects the definition of this extension. >+ >+Overview >+ >+ This extension modifies framebuffer objects by splitting the >+ framebuffer object binding point into separate DRAW and READ >+ bindings. This allows copying directly from one framebuffer to >+ another. In addition, a new high performance blit function is >+ added to facilitate these blits and perform some data conversion >+ where allowed. >+ >+IP Status >+ >+ No known IP claims. >+ >+New Procedures and Functions >+ >+ void BlitFramebufferANGLE(int srcX0, int srcY0, int srcX1, int srcY1, >+ int dstX0, int dstY0, int dstX1, int dstY1, >+ bitfield mask, enum filter); >+ >+New Tokens >+ >+ Accepted by the <target> parameter of BindFramebuffer, >+ CheckFramebufferStatus, FramebufferTexture2D, FramebufferTexture3DOES, >+ FramebufferRenderbuffer, and >+ GetFramebufferAttachmentParameteriv: >+ >+ // (reusing the tokens from EXT_framebuffer_blit) >+ READ_FRAMEBUFFER_ANGLE 0x8CA8 >+ DRAW_FRAMEBUFFER_ANGLE 0x8CA9 >+ >+ Accepted by the <pname> parameters of GetIntegerv and GetFloatv: >+ >+ // (reusing the tokens from EXT_framebuffer_blit) >+ DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 // alias FRAMEBUFFER_BINDING >+ READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA >+ >+ >+Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization) >+ >+ Change the last paragraph of section 3.7.2 (Alternate Texture Image >+ Specification Commands) to: >+ >+ "Calling CopyTexSubImage3DOES, CopyTexImage2D or CopyTexSubImage2D will >+ result in an INVALID_FRAMEBUFFER_OPERATION error if the object bound >+ to READ_FRAMEBUFFER_BINDING_ANGLE is not "framebuffer complete" >+ (section 4.4.4.2)." >+ >+Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment >+Operations and the Framebuffer) >+ >+ Change the first word of Chapter 4 from "The" to "A". >+ >+ Append to the introduction of Chapter 4: >+ >+ "Conceptually, the GL has two active framebuffers; the draw >+ framebuffer is the destination for rendering operations, and the >+ read framebuffer is the source for readback operations. The same >+ framebuffer may be used for both drawing and reading. Section >+ 4.4.1 describes the mechanism for controlling framebuffer usage." >+ >+ Modify the first sentence of the last paragraph of section 4.1.1 as follows: >+ >+ "While an application-created framebuffer object is bound to >+ DRAW_FRAMEBUFFER_ANGLE, the pixel ownership test always passes." >+ >+ Add to 4.3.1 (Reading Pixels), right before the subsection titled >+ "Obtaining Pixels from the Framebuffer": >+ >+ "Calling ReadPixels generates INVALID_FRAMEBUFFER_OPERATION if >+ the object bound to READ_FRAMEBUFFER_BINDING_ANGLE is not "framebuffer >+ complete" (section 4.4.4.2). GetIntegerv generates an INVALID_OPERATION >+ error if the object bound to READ_FRAMEBUFFER_BINDING_ANGLE is not >+ framebuffer complete, or if the GL is using a framebuffer object >+ (i.e. READ_FRAMEBUFFER_BINDING_ANGLE is non-zero) and there is no color >+ attachment." >+ >+ Insert a new section 4.3.2 titled "Copying Pixels" and renumber the >+ subsequent sections. Add the following text: >+ >+ "BlitFramebufferANGLE transfers a rectangle of pixel values from one >+ region of the read framebuffer to another in the draw framebuffer. >+ >+ BlitFramebufferANGLE(int srcX0, int srcY0, int srcX1, int srcY1, >+ int dstX0, int dstY0, int dstX1, int dstY1, >+ bitfield mask, enum filter); >+ >+ <mask> is the bitwise OR of a number of values indicating which >+ buffers are to be copied. The values are COLOR_BUFFER_BIT, >+ DEPTH_BUFFER_BIT, and STENCIL_BUFFER_BIT, which are described in >+ section 4.2.3. The pixels corresponding to these buffers are >+ copied from the source rectangle, bound by the locations (srcX0, >+ srcY0) and (srcX1, srcY1), to the destination rectangle, bound by >+ the locations (dstX0, dstY0) and (dstX1, dstY1). The lower bounds >+ of the rectangle are inclusive, while the upper bounds are >+ exclusive. >+ >+ The actual region taken from the read framebuffer is limited to the >+ intersection of the source buffers being transferred, which may include >+ the color buffer, the depth buffer, and/or the stencil buffer depending on >+ <mask>. The actual region written to the draw framebuffer is limited to the >+ intersection of the destination buffers being written, which may include >+ the color buffer, the depth buffer, and/or the stencil buffer >+ depending on <mask>. Whether or not the source or destination regions are >+ altered due to these limits, the offset applied to pixels being transferred >+ is performed as though no such limits were present. >+ >+ Stretching and scaling during a copy are not supported. If the source >+ and destination rectangle dimensions do not match, no copy is >+ performed and an INVALID_OPERATION error is generated. >+ Because stretching is not supported, <filter> must be NEAREST and >+ no filtering is applied. >+ >+ Flipping during a copy is not supported. If either the source or >+ destination rectangle specifies a negative dimension, the error >+ INVALID_OPERATION is generated. If both the source and >+ destination rectangles specify a negative dimension for the same >+ direction, no reversal is required and the operation is supported. >+ >+ If the source and destination buffers are identical, and the >+ source and destination rectangles overlap, the result of the blit >+ operation is undefined. >+ >+ The pixel copy bypasses the fragment pipeline. The only fragment >+ operations which affect the blit are the pixel ownership test and >+ the scissor test. >+ >+ If a buffer is specified in <mask> and does not exist in both the >+ read and draw framebuffers, the corresponding bit is silently >+ ignored. >+ >+ Calling BlitFramebufferANGLE will result in an >+ INVALID_FRAMEBUFFER_OPERATION error if the objects bound to >+ DRAW_FRAMEBUFFER_BINDING_ANGLE and READ_FRAMEBUFFER_BINDING_ANGLE are >+ not "framebuffer complete" (section 4.4.4.2)." >+ >+ Calling BlitFramebufferANGLE will result in an INVALID_OPERATION >+ error if <mask> includes COLOR_BUFFER_BIT and the source and >+ destination color formats to not match. >+ >+ Calling BlitFramebufferANGLE will result in an INVALID_OPERATION >+ error if <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT >+ and the source and destination depth and stencil buffer formats do >+ not match. >+ >+ If <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT, only >+ complete buffers can be copied. If the source rectangle does not >+ specify the complete source buffer or the destination rectangle >+ (after factoring the scissor region, if applicable) does not specify >+ the complete destination buffer, an INVALID_OPERATION >+ error is generated. >+ >+ Modify the beginning of section 4.4.1 as follows: >+ >+ "The default framebuffer for rendering and readback operations is >+ provided by the windowing system. In addition, named framebuffer >+ objects can be created and operated upon. The namespace for >+ framebuffer objects is the unsigned integers, with zero reserved >+ by the GL for the default framebuffer. >+ >+ A framebuffer object is created by binding an unused name to >+ DRAW_FRAMEBUFFER_ANGLE or READ_FRAMEBUFFER_ANGLE. The binding is >+ effected by calling >+ >+ void BindFramebuffer(enum target, uint framebuffer); >+ >+ with <target> set to the desired framebuffer target and >+ <framebuffer> set to the unused name. The resulting framebuffer >+ object is a new state vector, comprising one set of the state values >+ listed in table 6.23 for each attachment point of the >+ framebuffer, set to the same initial values. There is one >+ color attachment point, plus one each >+ for the depth and stencil attachment points. >+ >+ BindFramebuffer may also be used to bind an existing >+ framebuffer object to DRAW_FRAMEBUFFER_ANGLE or >+ READ_FRAMEBUFFER_ANGLE. If the bind is successful no change is made >+ to the state of the bound framebuffer object, and any previous >+ binding to <target> is broken. >+ >+ If a framebuffer object is bound to DRAW_FRAMEBUFFER_ANGLE or >+ READ_FRAMEBUFFER_ANGLE, it becomes the target for rendering or >+ readback operations, respectively, until it is deleted or another >+ framebuffer is bound to the corresponding bind point. Calling >+ BindFramebuffer with <target> set to FRAMEBUFFER binds the >+ framebuffer to both DRAW_FRAMEBUFFER_ANGLE and READ_FRAMEBUFFER_ANGLE. >+ >+ While a framebuffer object is bound, GL operations on the target >+ to which it is bound affect the images attached to the bound >+ framebuffer object, and queries of the target to which it is bound >+ return state from the bound object. Queries of the values >+ specified in table 6.20 (Implementation Dependent Pixel Depths) >+ and table 6.yy (Framebuffer Dependent Values) are >+ derived from the framebuffer object bound to DRAW_FRAMEBUFFER_ANGLE. >+ >+ The initial state of DRAW_FRAMEBUFFER_ANGLE and READ_FRAMEBUFFER_ANGLE >+ refers to the default framebuffer provided by the windowing >+ system. In order that access to the default framebuffer is not >+ lost, it is treated as a framebuffer object with the name of 0. >+ The default framebuffer is therefore rendered to and read from >+ while 0 is bound to the corresponding targets. On some >+ implementations, the properties of the default framebuffer can >+ change over time (e.g., in response to windowing system events >+ such as attaching the context to a new windowing system drawable.)" >+ >+ Change the description of DeleteFramebuffers as follows: >+ >+ "<framebuffers> contains <n> names of framebuffer objects to be >+ deleted. After a framebuffer object is deleted, it has no >+ attachments, and its name is again unused. If a framebuffer that >+ is currently bound to one or more of the targets >+ DRAW_FRAMEBUFFER_ANGLE or READ_FRAMEBUFFER_ANGLE is deleted, it is as >+ though BindFramebuffer had been executed with the corresponding >+ <target> and <framebuffer> zero. Unused names in <framebuffers> >+ are silently ignored, as is the value zero." >+ >+ >+ In section 4.4.3 (Renderbuffer Objects), modify the first two sentences >+ of the description of FramebufferRenderbuffer as follows: >+ >+ "<target> must be DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE, or >+ FRAMEBUFFER. If <target> is FRAMEBUFFER, it behaves as >+ though DRAW_FRAMEBUFFER_ANGLE was specified. The INVALID_OPERATION >+ error is generated if the value of the corresponding binding is zero." >+ >+ In section 4.4.3 (Renderbuffer Objects), modify the first two sentences >+ of the description of FramebufferTexture2D as follows: >+ >+ "<target> must be DRAW_FRAMEBUFFER_ANGLE, >+ READ_FRAMEBUFFER_ANGLE, or FRAMEBUFFER. If <target> is >+ FRAMEBUFFER, it behaves as though DRAW_FRAMEBUFFER_ANGLE was >+ specified. The INVALID_OPERATION error is generated if the value of the >+ corresponding binding is zero." >+ >+ In section 4.4.5 (Framebuffer Completeness), modify the first sentence >+ of the description of CheckFramebufferStatus as follows: >+ >+ "If <target> is not DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE or >+ FRAMEBUFFER, the error INVALID_ENUM is generated. If <target> is >+ FRAMEBUFFER, it behaves as though DRAW_FRAMEBUFFER_ANGLE was >+ specified." >+ >+ Modify the first sentence of the subsection titled "Effects of Framebuffer >+ Completeness on Framebuffer Operations" to be: >+ >+ "Attempting to render to or read from a framebuffer which is not >+ framebuffer complete will generate an >+ INVALID_FRAMEBUFFER_OPERATION error." >+ >+ >+ >+Additions to Chapter 6 of the OpenGL 1.5 Specification (State and State >+Requests) >+ >+ In section 6.1.3, modify the first sentence of the description of >+ GetFramebufferAttachmentParameteriv as follows: >+ >+ "<target> must be DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE or >+ FRAMEBUFFER. If <target> is FRAMEBUFFER, it behaves as >+ though DRAW_FRAMEBUFFER_ANGLE was specified." >+ >+ Modify the title of Table 6.23 (Framebuffer State) to be "Framebuffer >+ (state per attachment point)". >+ >+ >+Dependencies on OES_texture_3D >+ >+ On an OpenGL ES implementation, in the absense of OES_texture_3D, >+ omit references to FramebufferTexture3DOES and CopyTexSubImage3DOES. >+ >+Errors >+ >+ The error INVALID_FRAMEBUFFER_OPERATION is generated if >+ BlitFramebufferANGLE is called while the >+ draw framebuffer is not framebuffer complete. >+ >+ The error INVALID_FRAMEBUFFER_OPERATION is generated if >+ BlitFramebufferANGLE, ReadPixels, CopyTex{Sub}Image*, is called while the >+ read framebuffer is not framebuffer complete. >+ >+ The error INVALID_OPERATION is generated if GetIntegerv is called >+ while the read framebuffer is not framebuffer complete, or if there >+ is no color attachment present on the read framebuffer object. >+ >+ The error INVALID_VALUE is generated by BlitFramebufferANGLE if >+ <mask> has any bits set other than those named by >+ COLOR_BUFFER_BIT, DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT. >+ >+ The error INVALID_OPERATION is generated if BlitFramebufferANGLE is >+ called and <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT >+ and the source and destination depth or stencil buffer formats do >+ not match. >+ >+ The error INVALID_OPERATION is generated if BlitFramebufferANGLE is >+ called and any of the following conditions are true: >+ - the source and destination rectangle dimensions do not match >+ (ie scaling or flipping is required). >+ - <mask> includes COLOR_BUFFER_BIT and the source and destination >+ buffer formats do not match. >+ - <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT and the >+ source or destination rectangles do not specify the entire source >+ or destination buffer (after applying any scissor region). >+ >+ The error INVALID_ENUM is generated by BlitFramebufferANGLE if >+ <filter> is not NEAREST. >+ >+ The error INVALID_ENUM is generated if BindFramebuffer, >+ CheckFramebufferStatus, FramebufferTexture{2D|3DOES}, >+ FramebufferRenderbuffer, or >+ GetFramebufferAttachmentParameteriv is called and <target> is >+ not DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE or FRAMEBUFFER. >+ >+New State >+ >+ (Add a new table 6.xx, "Framebuffer (state per framebuffer target binding point)") >+ >+ Get Value Type Get Command Initial Value Description Section >+ ------------------------------ ---- ----------- -------------- ------------------- ------------ >+ DRAW_FRAMEBUFFER_BINDING_ANGLE Z+ GetIntegerv 0 framebuffer object bound 4.4.1 >+ to DRAW_FRAMEBUFFER_ANGLE >+ READ_FRAMEBUFFER_BINDING_ANGLE Z+ GetIntegerv 0 framebuffer object 4.4.1 >+ to READ_FRAMEBUFFER_ANGLE >+ >+ Remove reference to FRAMEBUFFER_BINDING from Table 6.23. >+ >+ (Add a new table 6.yy, "Framebuffer Dependent Values") >+ >+ Get Value Type Get Command Initial Value Description Section >+ ---------------------------- ---- ----------- -------------- ------------------- ------------ >+ SAMPLE_BUFFERS Z+ GetIntegerv 0 Number of multisample 3.2 >+ buffers >+ SAMPLES Z+ GetIntegerv 0 Coverage mask size 3.2 >+ >+ Remove the references to SAMPLE_BUFFERS and SAMPLES from Table 6.17. >+ >+ >+Issues >+ >+ 1) What should we call this extension? >+ >+ Resolved: ANGLE_framebuffer_blit. >+ >+ This extension is a result of a collaboration between Google and >+ TransGaming for the open-source ANGLE project. Typically one would >+ label a multi-vendor extension as EXT, but EXT_framebuffer_blit >+ is already the name for this on Desktop GL. Additionally this >+ isn't truely a multi-vendor extension because there is only one >+ implementation of this. We'll follow the example of the open-source >+ MESA project which uses the project name for the vendor suffix. >+ >+ 2) Why is this done as a separate extension instead of just supporting >+ EXT_framebuffer_blit? >+ >+ To date, EXT_framebuffer_blit has not had interactions with OpenGL ES >+ specified and, as far as we know, it has not previously been exposed on >+ an ES 1.1 or ES 2.0 implementation. Because there are enough >+ differences between Desktop GL and OpenGL ES, and since OpenGL ES 2.0 >+ has already subsumed the EXT_framebuffer_object functionality (with >+ some changes) it was deemed a worthwhile exercise to fully specify the >+ interactions. Additionally, some of the choices in exactly which >+ functionality is supported by BlitFramebufferANGLE is dictated by >+ what is reasonable to support on a implementation which is >+ layered on Direct3D9. It is not expected that other implementations >+ will necessary have the same set of restrictions or requirements. >+ >+ 3) How does this extension differ from EXT_framebuffer_blit? >+ >+ This extension is designed to be a pure subset of the >+ EXT_framebuffer_blit functionality as applicable to OpenGL ES 2.0. >+ >+ Functionality that is unchanged: >+ - the split DRAW and READ framebuffer attachment points and related sematics. >+ - the token values for the DRAW/READ_FRAMEBUFFER and DRAW/READ_FRAMBUFFER_BINDING >+ - the signature of the BlitFramebuffer entry-point. >+ >+ Additional restrictions imposed by BlitFramebufferANGLE: >+ - no color conversions are supported >+ - no scaling, stretching or flipping are supported >+ - no filtering is supported (a consequence of no stretching) >+ - only whole depth and/or stencil buffers can be copied >+ >+Revision History >+ >+ Revision 1, 2010/07/06 >+ - copied from revision 15 of EXT_framebuffer_object >+ - removed language that was clearly not relevant to ES2 >+ - rebased changes against the OpenGL ES 2.0 specification >+ - added ANGLE-specific restrictions >+ Revision 2, 2010/07/15 >+ - clarifications of implicit clamping to buffer sizes (from ARB_fbo) >+ - clarify that D/S restricts apply after the scissor is applied >+ - improve some error language >+ Revision 3, 2010/08/06 >+ - add additional contributors, update implementation status >+ Revision 4, 2012/09/22 >+ - document errors for GetIntegerv. >+ >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_framebuffer_multisample.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_framebuffer_multisample.txt >new file mode 100644 >index 00000000000..cf5e45830cb >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_framebuffer_multisample.txt >@@ -0,0 +1,363 @@ >+Name >+ >+ ANGLE_framebuffer_multisample >+ >+Name Strings >+ >+ GL_ANGLE_framebuffer_multisample >+ >+Contributors >+ >+ Contributors to EXT_framebuffer_multisample >+ Daniel Koch, TransGaming Inc. >+ Shannon Woods, TransGaming Inc. >+ Kenneth Russell, Google Inc. >+ Vangelis Kokkevis, Google Inc. >+ >+Contacts >+ >+ Daniel Koch, TransGaming Inc. (daniel 'at' transgaming 'dot' com) >+ >+Status >+ >+ Implemented in ANGLE ES2 >+ >+Version >+ >+ Last Modified Date: Aug 6, 2010 >+ Author Revision: #3 >+ >+Number >+ >+ OpenGL ES Extension #84 >+ >+Dependencies >+ >+ Requires OpenGL ES 2.0. >+ >+ Requires GL_ANGLE_framebuffer_blit (or equivalent functionality). >+ >+ The extension is written against the OpenGL ES 2.0 specification. >+ >+ OES_texture_3D affects the definition of this extension. >+ >+Overview >+ >+ This extension extends the framebuffer object framework to >+ enable multisample rendering. >+ >+ The new operation RenderbufferStorageMultisampleANGLE() allocates >+ storage for a renderbuffer object that can be used as a multisample >+ buffer. A multisample render buffer image differs from a >+ single-sample render buffer image in that a multisample image has a >+ number of SAMPLES that is greater than zero. No method is provided >+ for creating multisample texture images. >+ >+ All of the framebuffer-attachable images attached to a framebuffer >+ object must have the same number of SAMPLES or else the framebuffer >+ object is not "framebuffer complete". If a framebuffer object with >+ multisample attachments is "framebuffer complete", then the >+ framebuffer object behaves as if SAMPLE_BUFFERS is one. >+ >+ The resolve operation is affected by calling >+ BlitFramebufferANGLE (provided by the ANGLE_framebuffer_blit >+ extension) where the source is a multisample application-created >+ framebuffer object and the destination is a single-sample >+ framebuffer object (either application-created or window-system >+ provided). >+ >+New Procedures and Functions >+ >+ void RenderbufferStorageMultisampleANGLE( >+ enum target, sizei samples, >+ enum internalformat, >+ sizei width, sizei height); >+ >+New Types >+ >+ None. >+ >+New Tokens >+ >+ Accepted by the <pname> parameter of GetRenderbufferParameteriv: >+ >+ RENDERBUFFER_SAMPLES_ANGLE 0x8CAB >+ >+ Returned by CheckFramebufferStatus: >+ >+ FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 >+ >+ Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, >+ and GetFloatv: >+ >+ MAX_SAMPLES_ANGLE 0x8D57 >+ >+Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL Operation) >+ >+Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization) >+ >+ Add to the last paragraph of 3.7.2 (Alternate Texture Image Specification) >+ (as modified by ANGLE_framebuffer_blit) the following: >+ >+ "Calling CopyTexSubImage3DOES, CopyTexImage2D or CopyTexSubImage2D will >+ result in INVALID_OPERATION being generated if the object bound to >+ READ_FRAMEBUFFER_BINDING_ANGLE is "framebuffer complete" and the value >+ of SAMPLE_BUFFERS is greater than zero." >+ >+Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment >+Operations and the Framebuffer) >+ >+ Add to 4.3.1 (Reading Pixels), right before the subsection titled >+ "Obtaining Pixels from the Framebuffer": >+ >+ "ReadPixels generates INVALID_OPERATION if READ_FRAMEBUFFER_BINDING_ANGLE >+ (section 4.4) is non-zero, the read framebuffer is framebuffer >+ complete, and the value of SAMPLE_BUFFERS for the read framebuffer >+ is greater than zero." >+ >+ In 4.3.2 (Copying Pixels), add to the section describing BlitFramebuffer >+ that was added by ANGLE_framebuffer_blit. >+ >+ "If SAMPLE_BUFFERS for the read framebuffer is greater than zero and >+ SAMPLE_BUFFERS for the draw framebuffer is zero, the samples >+ corresponding to each pixel location in the source are converted to >+ a single sample before being written to the destination. >+ >+ If SAMPLE_BUFFERS for the draw framebuffer is greater than zero, >+ no copy is performed and an INVALID_OPERATION error is generated. >+ >+ If SAMPLE_BUFFERS for the read framebuffer is greater than zero and >+ <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT, no copy is >+ performed and an INVALID_OPERATION error is generated. >+ >+ If SAMPLE_BUFFERS for the read framebuffer is greater than zero and >+ the format of the read and draw framebuffers are not identical, no >+ copy is performed and an INVALID_OPERATION error is generated. >+ >+ If SAMPLE_BUFFERS for the read framebuffer is greater than zero, the >+ dimensions of the source and destination rectangles provided to >+ BlitFramebufferANGLE must be identical and must specify the complete >+ source and destination buffers, otherwise no copy is performed and >+ an INVALID_OPERATION error is generated." >+ >+ Modification to 4.4.3 (Renderbuffer Objects) >+ >+ Add, just above the definition of RenderbufferStorage: >+ >+ "The command >+ >+ void RenderbufferStorageMultisampleANGLE( >+ enum target, sizei samples, >+ enum internalformat, >+ sizei width, sizei height); >+ >+ establishes the data storage, format, dimensions, and number of >+ samples of a renderbuffer object's image. <target> must be >+ RENDERBUFFER. <internalformat> must be one of the color-renderable, >+ depth-renderable, or stencil-renderable formats described in table 4.5. >+ <width> and <height> are the dimensions in pixels of the renderbuffer. If >+ either <width> or <height> is greater than the value of >+ MAX_RENDERBUFFER_SIZE, or if <samples> is greater than MAX_SAMPLES_ANGLE, >+ then the error INVALID_VALUE is generated. If OpenGL ES is unable to >+ create a data store of the requested size, the error OUT_OF_MEMORY >+ is generated. >+ >+ Upon success, RenderbufferStorageMultisampleANGLE deletes any existing >+ data store for the renderbuffer image and the contents of the data >+ store after calling RenderbufferStorageMultisampleANGLE are undefined. >+ RENDERBUFFER_WIDTH is set to <width>, RENDERBUFFER_HEIGHT is >+ set to <height>, and RENDERBUFFER_INTERNAL_FORMAT is set to >+ <internalformat>. >+ >+ If <samples> is zero, then RENDERBUFFER_SAMPLES_ANGLE is set to zero. >+ Otherwise <samples> represents a request for a desired minimum >+ number of samples. Since different implementations may support >+ different sample counts for multisampled rendering, the actual >+ number of samples allocated for the renderbuffer image is >+ implementation dependent. However, the resulting value for >+ RENDERBUFFER_SAMPLES_ANGLE is guaranteed to be greater than or equal >+ to <samples> and no more than the next larger sample count supported >+ by the implementation. >+ >+ An OpenGL ES implementation may vary its allocation of internal component >+ resolution based on any RenderbufferStorageMultisampleANGLE parameter (except >+ target), but the allocation and chosen internal format must not be a >+ function of any other state and cannot be changed once they are >+ established. The actual resolution in bits of each component of the >+ allocated image can be queried with GetRenderbufferParameteriv." >+ >+ Modify the definiton of RenderbufferStorage as follows: >+ >+ "The command >+ >+ void RenderbufferStorage(enum target, enum internalformat, >+ sizei width, sizei height); >+ >+ is equivalent to calling RenderbufferStorageMultisampleANGLE with >+ <samples> equal to zero." >+ >+ In section 4.4.5 (Framebuffer Completeness) in the subsection >+ titled "Framebuffer Completeness" add an entry to the bullet list: >+ >+ * The value of RENDERBUFFER_SAMPLES_ANGLE is the same for all attached >+ images. >+ { FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE } >+ >+ Also add a paragraph to the end of the section after the definition >+ of CheckFramebufferStatus: >+ >+ "The values of SAMPLE_BUFFERS and SAMPLES are derived from the >+ attachments of the currently bound framebuffer object. If the >+ current DRAW_FRAMEBUFFER_BINDING_ANGLE is not "framebuffer complete", >+ then both SAMPLE_BUFFERS and SAMPLES are undefined. Otherwise, >+ SAMPLES is equal to the value of RENDERBUFFER_SAMPLES_ANGLE for the >+ attached images (which all must have the same value for >+ RENDERBUFFER_SAMPLES_ANGLE). Further, SAMPLE_BUFFERS is one if >+ SAMPLES is non-zero. Otherwise, SAMPLE_BUFFERS is zero. >+ >+Additions to Chapter 5 of the OpenGL ES 2.0 Specification (Special Functions) >+ >+ >+Additions to Chapter 6 of the OpenGL ES 2.0 Specification (State and State >+Requests) >+ >+ In section 6.1.3 (Enumeraged Queries), modify the third paragraph >+ of the description of GetRenderbufferParameteriv as follows: >+ >+ "Upon successful return from GetRenderbufferParameteriv, if >+ <pname> is RENDERBUFFER_WIDTH, RENDERBUFFER_HEIGHT, >+ RENDERBUFFER_INTERNAL_FORMAT, or RENDERBUFFER_SAMPLES_ANGLE, then <params> >+ will contain the width in pixels, height in pixels, internal format, or >+ number of samples, respectively, of the image of the renderbuffer >+ currently bound to <target>." >+ >+ >+Dependencies on ANGLE_framebuffer_blit >+ >+ ANGLE_framebuffer_blit is required. Technically, ANGLE_framebuffer_blit >+ would not be required to support multisampled rendering, except for >+ the fact that it provides the only method of doing a multisample >+ resovle from a multisample renderbuffer. >+ >+Dependencies on OES_texture_3D >+ >+ On an OpenGL ES implementation, in the absense of OES_texture_3D, >+ omit references to CopyTexSubImage3DOES. >+ >+Errors >+ >+ The error INVALID_OPERATION is generated if ReadPixels or >+ CopyTex{Sub}Image* is called while READ_FRAMEBUFFER_BINDING_ANGLE >+ is non-zero, the read framebuffer is framebuffer complete, and the >+ value of SAMPLE_BUFFERS for the read framebuffer is greater than >+ zero. >+ >+ If both the draw and read framebuffers are framebuffer complete and >+ the draw framebuffer has a value of SAMPLE_BUFFERS that is greater >+ than zero, then the error INVALID_OPERATION is generated if >+ BlitFramebufferANGLE is called. >+ >+ If both the draw and read framebuffers are framebuffer complete and >+ the read framebuffer has a value of SAMPLE_BUFFERS that is greater >+ than zero, the error INVALID_OPERATION is generated if >+ BlitFramebufferANGLE is called and any of the following conditions >+ are true: >+ - <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT. >+ - the source or destination rectangles do not specify the entire >+ source or destination buffer. >+ >+ If both the draw and read framebuffers are framebuffer complete and >+ either has a value of SAMPLE_BUFFERS that is greater than zero, then >+ the error INVALID_OPERATION is generated if BlitFramebufferANGLE is >+ called and the formats of the draw and read framebuffers are not >+ identical. >+ >+ If either the draw or read framebuffer is framebuffer complete and >+ has a value of SAMPLE_BUFFERS that is greater than zero, then the >+ error INVALID_OPERATION is generated if BlitFramebufferANGLE is called >+ and the specified source and destination dimensions are not >+ identical. >+ >+ If RenderbufferStorageMultisampleANGLE is called with <target> not >+ equal to RENDERBUFFER, the error INVALID_ENUM is generated. >+ >+ If RenderbufferStorageMultisampleANGLE is called with an >+ <internalformat> that is not listed as one of the color-, depth- >+ or stencil-renderable formats in Table 4.5, then the error >+ INVALID_ENUM is generated. >+ >+ If RenderbufferStorageMultisampleANGLE is called with <width> or >+ <height> greater than MAX_RENDERBUFFER_SIZE, then the error >+ INVALID_VALUE is generated. >+ >+ If RenderbufferStorageMultisampleANGLE is called with a value of >+ <samples> that is greater than MAX_SAMPLES_ANGLE or less than zero, >+ then the error INVALID_VALUE is generated. >+ >+ The error OUT_OF_MEMORY is generated when >+ RenderbufferStorageMultisampleANGLE cannot create storage of the >+ specified size. >+ >+New State >+ >+ Add to table 6.22 (Renderbuffer State) >+ >+ Get Value Type Get Command Initial Value Description Section >+ ------------------------------- ------ -------------------------- ------------- -------------------- ------- >+ RENDERBUFFER_SAMPLES_ANGLE Z+ GetRenderbufferParameteriv 0 number of samples 4.4.3 >+ >+ >+ Add to table 6.yy (Framebuffer Dependent Vaues) (added by >+ ANGLE_framebuffer_blit), the following new framebuffer dependent state. >+ >+ Get Value Type Get Command Minimum Value Description Section >+ ----------------- ---- ----------- ------------- ------------------- ------- >+ MAX_SAMPLES_ANGLE Z+ GetIntegerv 1 Maximum number of 4.4.3 >+ samples supported >+ for multisampling >+ >+ >+ >+Issues >+ >+ Issues from EXT_framebuffer_multisample have been removed. >+ >+ 1) What should we call this extension? >+ >+ Resolved: ANGLE_framebuffer_blit. >+ >+ This extension is a result of a collaboration between Google and >+ TransGaming for the open-source ANGLE project. Typically one would >+ label a multi-vendor extension as EXT, but EXT_framebuffer_mulitsample >+ is already the name for this on Desktop GL. Additionally this >+ isn't truely a multi-vendor extension because there is only one >+ implementation of this. We'll follow the example of the open-source >+ MESA project which uses the project name for the vendor suffix. >+ >+ 2) How does this extension differ from EXT_framebuffer_multisample? >+ >+ This is designed to be a proper subset of EXT_framebuffer_multisample >+ functionality as applicable to OpenGL ES 2.0. >+ >+ Functionality that is unchanged: >+ - creation of multisample renderbuffers. >+ - whole buffer multi-sample->single-sample resolve. >+ - no format conversions, stretching or flipping supported on multisample blits. >+ >+ Additional restrictions on BlitFramebufferANGLE: >+ - multisample resolve is only supported on color buffers. >+ - no blits to multisample destinations (no single->multi or multi-multi). >+ - only entire buffers can be resolved. >+ >+Revision History >+ >+ Revision 1, 2010/07/08 >+ - copied from revision 7 of EXT_framebuffer_multisample >+ - removed language that was not relevant to ES2 >+ - rebase changes against the Open GL ES 2.0 specification >+ - added ANGLE-specific restrictions >+ Revision 2, 2010/07/19 >+ - fix missing error code >+ Revision 3, 2010/08/06 >+ - add additional contributors, update implementation status >+ - disallow negative samples >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_instanced_arrays.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_instanced_arrays.txt >new file mode 100644 >index 00000000000..69d11504536 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_instanced_arrays.txt >@@ -0,0 +1,359 @@ >+Name >+ >+ ANGLE_instanced_arrays >+ >+Name Strings >+ >+ GL_ANGLE_instanced_arrays >+ >+Contributors >+ >+ Contributors to ARB_instanced_arrays >+ Nicolas Capens, TransGaming Inc. >+ James Helferty, TransGaming Inc. >+ Kenneth Russell, Google Inc. >+ Vangelis Kokkevis, Google Inc. >+ >+Contact >+ >+ Daniel Koch, TransGaming Inc. (daniel 'at' transgaming.com) >+ >+Status >+ >+ Implemented in ANGLE r976. >+ >+Version >+ >+ Last Modified Date: February 8, 2012 >+ Author Revision: 3 >+ >+Number >+ >+ OpenGL ES Extension #109 >+ >+Dependencies >+ >+ OpenGL ES 2.0 is required. >+ >+ This extension is written against the OpenGL ES 2.0 Specification. >+ >+Overview >+ >+ A common use case in GL for some applications is to be able to >+ draw the same object, or groups of similar objects that share >+ vertex data, primitive count and type, multiple times. This >+ extension provides a means of accelerating such use cases while >+ restricting the number of API calls, and keeping the amount of >+ duplicate data to a minimum. >+ >+ This extension introduces an array "divisor" for generic >+ vertex array attributes, which when non-zero specifies that the >+ attribute is "instanced." An instanced attribute does not >+ advance per-vertex as usual, but rather after every <divisor> >+ conceptual draw calls. >+ >+ (Attributes which aren't instanced are repeated in their entirety >+ for every conceptual draw call.) >+ >+ By specifying transform data in an instanced attribute or series >+ of instanced attributes, vertex shaders can, in concert with the >+ instancing draw calls, draw multiple instances of an object with >+ one draw call. >+ >+IP Status >+ >+ No known IP claims. >+ >+New Tokens >+ >+ Accepted by the <pname> parameters of GetVertexAttribfv and >+ GetVertexAttribiv: >+ >+ VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE >+ >+New Procedures and Functions >+ >+ void DrawArraysInstancedANGLE(enum mode, int first, sizei count, >+ sizei primcount); >+ >+ void DrawElementsInstancedANGLE(enum mode, sizei count, enum type, >+ const void *indices, sizei primcount); >+ >+ void VertexAttribDivisorANGLE(uint index, uint divisor); >+ >+Additions to Chapter 2 of the OpenGL ES 2.0 Specification >+(OpenGL ES Operation) >+ >+ Modify section 2.8 (Vertex Arrays), p. 21 >+ >+ After description of EnableVertexAttribArray / DisableVertexAttribArray >+ add the following: >+ >+ "The command >+ >+ void VertexAttribDivisorANGLE(uint index, uint divisor); >+ >+ modifies the rate at which generic vertex attributes advance when >+ rendering multiple instances of primitives in a single draw call >+ (see DrawArraysInstancedANGLE and DrawElementsInstancedANGLE below). >+ If <divisor> is zero, the attribute at slot <index> advances once >+ per vertex. If <divisor> is non-zero, the attribute advances once >+ per <divisor> instances of the primitives being rendered. >+ An attribute is referred to as "instanced" if its <divisor> value is >+ non-zero." >+ >+ Replace the text describing DrawArrays and DrawElements in the >+ "Transferring Array Elements" subsection of 2.8, from the second paragraph >+ through the end of the section with the following: >+ >+ "The command >+ >+ void DrawArraysOneInstance( enum mode, int first, sizei count, int instance ); >+ >+ does not exist in the GL, but is used to describe functionality in >+ the rest of this section. This function constructs a sequence of >+ geometric primitives by transferring elements <first> through <first> + >+ <count> - 1 of each enabled non-instanced array to the GL. <mode> >+ specifies what kind of primitives are constructed, as defined in section >+ 2.6.1. >+ >+ If an enabled vertex attribute array is instanced (it has a non-zero >+ attribute <divisor> as specified by VertexAttribDivisorANGLE), the element >+ that is transferred to the GL is given by: >+ >+ floor( <instance> / <divisor> ). >+ >+ If an array corresponding to a generic attribute required by a vertex shader >+ is not enabled, then the corresponding element is taken from the current >+ generic attribute state (see section 2.7). >+ >+ If an array corresponding to a generic attribute required by a vertex shader >+ is enabled, the corresponding current generic attribute value is unaffected >+ by the execution of DrawArraysOneInstance. >+ >+ Specifying <first> < 0 results in undefined behavior. Generating the error >+ INVALID_VALUE is recommended in this case. >+ >+ The command >+ >+ void DrawArrays( enum mode, int first, sizei count ); >+ >+ is equivalent to the command sequence >+ >+ DrawArraysOneInstance(mode, first, count, 0); >+ >+ The command >+ >+ void DrawArraysInstancedANGLE(enum mode, int first, sizei count, >+ sizei primcount); >+ >+ behaves identically to DrawArrays except that <primcount> >+ instances of the range of elements are executed, and the >+ <instance> advances for each iteration. Instanced attributes that >+ have <divisor> N, (where N > 0, as specified by >+ VertexAttribDivisorANGLE) advance once every N instances. >+ >+ It has the same effect as: >+ >+ if (mode, count, or primcount is invalid) >+ generate appropriate error >+ else { >+ for (i = 0; i < primcount; i++) { >+ DrawArraysOneInstance(mode, first, count, i); >+ } >+ } >+ >+ The command >+ >+ void DrawElementsOneInstance( enum mode, sizei count, enum type, >+ void *indices, int instance ); >+ >+ does not exist in the GL, but is used to describe functionality in >+ the rest of this section. This command constructs a sequence of >+ geometric primitives by successively transferring the <count> elements >+ whose indices are stored in the currently bound element array buffer >+ (see section 2.9.2) at the offset defined by <indices> to the GL. >+ The <i>-th element transferred by DrawElementsOneInstance will be taken >+ from element <indices>[i] of each enabled non-instanced array. >+ <type> must be one of UNSIGNED_BYTE, UNSIGNED_SHORT, or UNSIGNED_INT, >+ indicating that the index values are of GL type ubyte, ushort, or uint >+ respectively. <mode> specifies what kind of primitives are constructed, >+ as defined in section 2.6.1. >+ >+ If an enabled vertex attribute array is instanced (it has a non-zero >+ attribute <divisor> as specified by VertexAttribDivisorANGLE), the element >+ that is transferred to the GL is given by: >+ >+ floor( <instance> / <divisor> ); >+ >+ If an array corresponding to a generic attribute required by a vertex >+ shader is not enabled, then the corresponding element is taken from the >+ current generic attribute state (see section 2.7). Otherwise, if an array >+ is enabled, the corresponding current generic attribute value is >+ unaffected by the execution of DrawElementsOneInstance. >+ >+ The command >+ >+ void DrawElements( enum mode, sizei count, enum type, >+ const void *indices); >+ >+ behaves identically to DrawElementsOneInstance with the <instance> >+ parameter set to zero; the effect of calling >+ >+ DrawElements(mode, count, type, indices); >+ >+ is equivalent to the command sequence: >+ >+ if (mode, count or type is invalid ) >+ generate appropriate error >+ else >+ DrawElementsOneInstance(mode, count, type, indices, 0); >+ >+ The command >+ >+ void DrawElementsInstancedANGLE(enum mode, sizei count, enum type, >+ const void *indices, sizei primcount); >+ >+ behaves identically to DrawElements except that <primcount> >+ instances of the set of elements are executed and the instance >+ advances between each set. Instanced attributes are advanced as they do >+ during the execution of DrawArraysInstancedANGLE. It has the same effect as: >+ >+ if (mode, count, primcount, or type is invalid ) >+ generate appropriate error >+ else { >+ for (int i = 0; i < primcount; i++) { >+ DrawElementsOneInstance(mode, count, type, indices, i); >+ } >+ } >+ >+ If the number of supported generic vertex attributes (the value of >+ MAX_VERTEX_ATTRIBS) is <n>, then the client state required to implement >+ vertex arrays consists of <n> boolean values, <n> memory pointers, <n> >+ integer stride values, <n> symbolic constants representing array types, >+ <n> integers representing values per element, <n> boolean values >+ indicating normalization, and <n> integers representing vertex attribute >+ divisors. >+ >+ In the initial state, the boolean values are each false, the memory >+ pointers are each NULL, the strides are each zero, the array types are >+ each FLOAT, the integers representing values per element are each four, >+ and the divisors are each zero." >+ >+Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization) >+ >+ None >+ >+Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment >+Operations and the Framebuffer) >+ >+ None >+ >+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) >+ >+ In section 6.1.8, add VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE to the list of >+ pnames accepted by GetVertexAttribfv and GetVertexAttribiv. >+ >+Additions to the AGL/EGL/GLX/WGL Specifications >+ >+ None >+ >+Dependencies on OES_element_index_uint >+ >+ If OES_element_index_uint is not supported, removed all references >+ to UNSIGNED_INT indices and the associated GL data type uint in >+ the description of DrawElementsOneInstance. >+ >+Errors >+ >+ INVALID_VALUE is generated by VertexAttribDivisorANGLE if <index> >+ is greater than or equal to MAX_VERTEX_ATTRIBS. >+ >+ INVALID_ENUM is generated by DrawElementsInstancedANGLE if <type> is >+ not one of UNSIGNED_BYTE, UNSIGNED_SHORT or UNSIGNED_INT. >+ >+ INVALID_VALUE is generated by DrawArraysInstancedANGLE if <first>, >+ <count>, or <primcount> is less than zero. >+ >+ INVALID_ENUM is generated by DrawArraysInstancedANGLE or >+ DrawElementsInstancedANGLE if <mode> is not one of the modes described in >+ section 2.6.1. >+ >+ INVALID_VALUE is generated by DrawElementsInstancedANGLE if <count> or >+ <primcount> is less than zero. >+ >+ INVALID_OPERATION is generated by DrawArraysInstancedANGLE or >+ DrawElementsInstancedANGLE if there is not at least one enabled >+ vertex attribute array that has a <divisor> of zero and is bound to an >+ active generic attribute value in the program used for the draw command. >+ >+New State >+ >+ Changes to table 6.7, p. 268 (Vertex Array Data) >+ >+ Initial >+ Get Value Type Get Command Value Description Sec. >+ --------- ----- ----------- ------- ----------- ---- >+ VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 8*xZ+ GetVertexAttrib 0 Instance Divisor 2.8 >+ >+Issues >+ >+ 1) Should vertex attribute zero be instance-able? >+ >+ Resolved: Yes. >+ Discussion: In Direct3D 9 stream 0 must be specified as indexed data >+ and it cannot be instanced. In ANGLE we can work around this by >+ remapping any other stream that does have indexed data (ie a zero >+ attribute divisor) to stream 0 in D3D9. This works because the HLSL >+ vertex shader matches attributes against the stream by using the >+ shader semantic index. >+ >+ 2) Can all vertex attributes be instanced simultaneously? >+ >+ Resolved: No >+ Discussion: In rare cases it is possible for no attribute to have a >+ divisor of 0, meaning that all attributes are instanced and none of >+ them are regularly indexed. This in turn means each instance can only >+ have a single position element, and so it only actually renders >+ something when rendering point primitives. This is not a very >+ meaningful way of using instancing (which is likely why D3D restricts >+ stream 0 to be indexed regularly for position data in the first place). >+ We could implement it by drawing these points one at a time (essentially >+ emulating instancing), but it would not be very efficient and there >+ seems to be little-to-no value in doing so. >+ >+ If all of the enabled vertex attribute arrays that are bound to active >+ generic attributes in the program have a non-zero divisor, the draw >+ call should return INVALID_OPERATION. >+ >+ 3) Direct3D 9 only supports instancing for DrawIndexedPrimitive which >+ corresponds to DrawElementsInstanced. Should we support >+ DrawArraysInstanced? >+ >+ Resolved: Yes >+ Discussion: This can be supported easily enough by simply manufacturing >+ a linear index buffer of sufficient size and using that to do indexed >+ D3D9 drawing. >+ >+ 4) How much data is needed in a buffer for an instanced attribute? >+ >+ Resolved: Where stride is the value passed to VertexAttribPointer: >+ >+ if stride > 0 >+ size = stride * ceil(primcount / divisor); >+ else >+ size = elementsize * ceil(primcount / divisor); >+ >+Revision History >+ >+ #3 February 8, 2012 dgkoch >+ - clarify Issue 3 and the error condition for no indexed attributes >+ #2 January 24, 2012 dgkoch >+ - fix typos, add clarifications, and more errors >+ #1 January 17, 2012 dgkoch >+ - initial GLES2 version from ARB_instanced_arrays >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_lossy_etc_decode.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_lossy_etc_decode.txt >new file mode 100644 >index 00000000000..14881922e04 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_lossy_etc_decode.txt >@@ -0,0 +1,159 @@ >+Name >+ >+ ANGLE_lossy_etc_decode >+ >+Name Strings >+ >+ GL_ANGLE_lossy_etc_decode >+ >+Contributors >+ >+ Minmin Gong (mgong 'at' microsoft.com) >+ >+Contacts >+ >+ Minmin Gong (mgong 'at' microsoft.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Last Modified Date: Nov 25, 2015 >+ Author Revision: 1 >+ >+Number >+ >+ TBD >+ >+Dependencies >+ >+ Requires OpenGL ES 3.0 for ETC2 and EAC formats, or OpenGL ES 2.0 and >+ OES_compressed_ETC1_RGB8_texture for ETC1 format. >+ The extension is written against the OpenGL ES 2.0 specification. >+ >+Overview >+ >+ Both the OpenGL ES 3.0 specification and OES_compressed_ETC1_RGB8_texture >+ specify that Ericsson Texture Compression (ETC) decoding must not be lossy. >+ The goal of this extension is to allow a lossy decode of >+ compressed textures in the ETC formats in OpenGL ES, for lower memory >+ and bandwidth consumption. >+ >+ This extension uses the same ETC compression format as OpenGL ES 3.0 >+ and OES_compressed_ETC1_RGB8_texture, with the restriction that the texture >+ dimensions must be a multiple of four (except for mip levels where the >+ dimensions are either 2 or 1). And the requirement that ETC decoding must >+ not be lossy is relaxed. >+ >+ See OES_compressed_ETC1_RGB8_texture for a description of the ETC1 format. >+ Also see OpenGL ES 3.0 specification appendix C.2 (ETC Compressed Texture >+ ImageFormats) for a description of ETC2 and EAC formats. >+ >+IP Status >+ >+ See Ericsson's "IP Statement" >+ >+New Procedures and Functions >+ >+ None. >+ >+New Types >+ >+ None. >+ >+New Tokens >+ >+ Accepted by the <internalformat> parameter of CompressedTexImage2D >+ and the <format> parameter of CompressedTexSubImage2D: >+ >+ ETC1_RGB8_LOSSY_DECODE_ANGLE 0x9690 >+ COMPRESSED_R11_LOSSY_DECODE_EAC_ANGLE 0x9691 >+ COMPRESSED_SIGNED_R11_LOSSY_DECODE_EAC_ANGLE 0x9692 >+ COMPRESSED_RG11_LOSSY_DECODE_EAC_ANGLE 0x9693 >+ COMPRESSED_SIGNED_RG11_LOSSY_DECODE_EAC_ANGLE 0x9694 >+ COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE 0x9695 >+ COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE 0x9696 >+ COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE 0x9697 >+ COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE 0x9698 >+ COMPRESSED_RGBA8_LOSSY_DECODE_ETC2_EAC_ANGLE 0x9699 >+ COMPRESSED_SRGB8_ALPHA8_LOSSY_DECODE_ETC2_EAC_ANGLE 0x969A >+ >+Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization) >+ >+ Add the following to Section 3.7.3 (Compressed Texture Images) >+ (at the end of the description of the CompressedTexImage2D command): >+ >+ Compressed Internal Format Base Internal Format >+ ========================== ==================== >+ ETC1_RGB8_LOSSY_DECODE_ANGLE RGB >+ COMPRESSED_R11_LOSSY_DECODE_EAC_ANGLE R >+ COMPRESSED_SIGNED_R11_LOSSY_DECODE_EAC_ANGLE R >+ COMPRESSED_RG11_LOSSY_DECODE_EAC_ANGLE RG >+ COMPRESSED_SIGNED_RG11_LOSSY_DECODE_EAC_ANGLE RG >+ COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE RGB >+ COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE RGB >+ COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE RGBA >+ COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE RGBA >+ COMPRESSED_RGBA8_LOSSY_DECODE_ETC2_EAC_ANGLE RGBA >+ COMPRESSED_SRGB8_ALPHA8_LOSSY_DECODE_ETC2_EAC_ANGLE RGBA >+ >+ Table 3.x: Specific Compressed Internal Formats >+ >+ If <internalformat> is one of the ETC lossy decode formats listed in >+ Table 3.x, the compressed texture is stored in an unspecified compressed >+ texture format, that may introduce losses of precision in the texture data. >+ The GL and the ETC texture compression algorithm support only 2D images >+ without borders. >+ >+ CompressedTexImage2D will produce the INVALID_OPERATION error when >+ <internalformat> is one of the lossy decode ETC-format values from >+ Table 3.x under the following conditions: >+ >+ * <border> is non-zero. >+ * <width> is not one, two, nor a multiple of four. >+ * <height> is not one, two, nor a multiple of four. >+ >+ Add the following to Section 3.7.3 (Compressed Texture Images) >+ (at the end of the description of the CompressedTexSubImage2D command): >+ >+ If the internal format of the texture image being modified is an ETC-format >+ listed in Table 3.x, the compressed texture is stored in an unspecified >+ compressed texture format. The xoffset and yoffset must also be aligned to >+ 4x4 texel block boundaries, since ETC encoding makes it difficult to modify >+ non-aligned regions. CompressedTexSubImage2D will result in an >+ INVALID_OPERATION error only if one of the following conditions occurs: >+ >+ * <width> is not a multiple of four nor equal to TEXTURE_WIDTH. >+ * <height> is not a multiple of four nor equal to TEXTURE_HEIGHT. >+ * <xoffset> or <yoffset> is not a multiple of four. >+ * <format> does not match the internal format of the texture image >+ being modified. >+ >+Errors >+ >+ INVALID_OPERATION is generated by CompressedTexImage2D if >+ lossy decode ETC-format is used and <internalformat> is one of the >+ compressed internal formats from Table 3.x and any of the following apply: >+ - <border> is not equal to zero. >+ - <width> is not one, two, nor a multiple of four. >+ - <height> is not one, two, nor a multiple of four. >+ >+ INVALID_OPERATION is generated by CompressedTexSubImage2D if >+ lossy decode ETC-format is used and <format> is one of the compressed >+ interal formats from Table 3.x and any of the following apply: >+ - <width> is not a multiple of four nor equal to TEXTURE_WIDTH; >+ - <height> is not a multiple of four nor equal to TEXTURE_HEIGHT; >+ - <xoffset> or <yoffset> is not a multiple of four; >+ - <format> does not match the internal format of the texture image >+ being modified. >+ >+New State >+ >+ None. >+ >+Revision History >+ >+ Revision 1, 2015/11/25 - mgong >+ - Initial revision >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_memory_size.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_memory_size.txt >new file mode 100644 >index 00000000000..d6e824ebfc2 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_memory_size.txt >@@ -0,0 +1,128 @@ >+Name >+ >+ ANGLE_memory_size >+ >+Name Strings >+ >+ GL_ANGLE_memory_size >+ >+Contributors >+ >+ Geoff Lang >+ >+Contact >+ >+ Geoff Lang (geofflang 'at' google.com) >+ >+Notice >+ >+ Copyright (c) 2018 The Khronos Group Inc. Copyright terms at >+ http://www.khronos.org/registry/speccopyright.html >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, November 1, 2018 >+ >+Number >+ >+ OpenGL ES Extension #?? >+ >+Dependencies >+ >+ Requires OpenGL ES 2.0 >+ >+ Written against the OpenGL ES 3.1 specification. >+ >+Overview >+ >+ This extension allows the user to query the estimated memory internally >+ allocated for an OpenGL resource. This information can be useful for >+ determining which resources should be deleted under memory pressure. >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted by the <name> parameter of GetTexParameter*, >+ GetTexLevelParameter*, GetBufferParameter* and GetRenderbufferParameter* >+ functions: >+ >+ GL_MEMORY_SIZE_ANGLE 0x93AD >+ >+Additions to the OpenGL ES 3.1 Specification >+ >+ Add an entry to Table 6.2, Buffer object parameters and their values: >+ >+ Name Type Initial Value Legal Values >+ ----------------- ----- ------------- ------------------------ >+ MEMORY_SIZE_ANGLE int64 0 any non-negative integer >+ >+ Change the last sentence of the first paragraph of section 8.10.2, >+ Texture Parameter Queries: >+ >+ - pname must be IMAGE_FORMAT_COMPATIBILITY_TYPE, TEXTURE_- >+ - IMMUTABLE_FORMAT, TEXTURE_IMMUTABLE_LEVELS, or one of the symbolic >+ - values in table 8.20. >+ + pname must be IMAGE_FORMAT_COMPATIBILITY_TYPE, TEXTURE_- >+ + IMMUTABLE_FORMAT, TEXTURE_IMMUTABLE_LEVELS, MEMORY_SIZE_ANGLE, >+ + or one of the symbolic values in table 8.20. >+ >+ Add to the end of the fifth paragraph of section 8.10.3, Texture Level >+ Parameter Queries: >+ >+ + queries of pname MEMORY_SIZE_ANGLE return the estimated number of bytes >+ + allocated for level of the texture bound to target. >+ >+ Add a new paragraph after paragraph 3 in section 9.2.6, Renderbuffer >+ Object Queries: >+ >+ If pname is MEMORY_SIZE_ANGLE, then params will contain the esimated >+ number of bytes allocated for the renderbuffer bound to target. >+ >+New State >+ >+ Add to Table 20.4: Buffer Object State >+ >+ Get value Type Get Cmd Min Value Description Sec. >+ ------------------- ---- --------------------- --------- ------------------------- ---- >+ MEMORY_SIZE_ANGLE Z+ GetBufferParameter64v - Estimated bytes allocated 6 >+ >+ Add to Table 20.9: Textures (state per texture object) >+ >+ Get value Type Get Cmd Min Value Description Sec. >+ ------------------- ---- -------------------- --------- ------------------------- ----- >+ MEMORY_SIZE_ANGLE Z+ GetTexParameter - Estimated bytes allocated 6.1.3 >+ GetTexLevelParameter >+ >+ Add to Table 20.16: Renderbuffer (state per renderbuffer object) >+ >+ Get value Type Get Cmd Min Value Description Sec. >+ ------------------- ---- -------------------------- --------- ------------------------- ----- >+ MEMORY_SIZE_ANGLE Z+ GetRenderbufferParameteriv - Estimated bytes allocated 9.2.6 >+ >+ >+Interactions with the OpenGL ES 2.0 and 3.0 specifications: >+ >+ Remove all references to GetTexLevelParameter and replace references to >+ GetBufferParameter64v with GetBufferParameteriv. >+ >+Issues >+ >+ (1) Could the estimated number of bytes be specified more tightly to an >+ upper or lower bound? >+ >+ RESOLVED: Implementations should attempt to return the lower bound on >+ the allocated memory if exact numbers are not known. The lower bound is >+ the most actionable value for making decisions when caching. >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------- --------- ---------------------------------------- >+ 1 Nov 1, 2018 geofflang Initial version >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_multi_draw.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_multi_draw.txt >new file mode 100644 >index 00000000000..b0ab240130b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_multi_draw.txt >@@ -0,0 +1,232 @@ >+Name >+ >+ ANGLE_multi_draw >+ >+Name Strings >+ >+ GL_ANGLE_multi_draw >+ >+Contributors >+ >+ Austin Eng, Google Inc. >+ Kai Ninomiya, Google Inc. >+ Kenneth Russell, Google Inc. >+ Contributors to the EXT_multi_draw_arrays specification >+ Contributors to the ARB_shader_draw_parameters specification >+ >+Contact >+ >+ Austin Eng (enga 'at' google.com) >+ >+Status >+ >+ Incomplete >+ >+Version >+ >+ Last Modified Date: October 24, 2018 >+ Author Revision: 1 >+ >+Number >+ >+ OpenGL ES Extension XX >+ >+Dependencies >+ >+ OpenGL ES 2.0 is required. >+ >+ This extension is written against the OpenGL ES 2.0 specification, >+ the OpenGL ES 3.0 specification, and the OpenGL ES Shading Language 3.0 >+ specification. >+ >+ The presence of the GL_ANGLE_instanced_arrays or GL_EXT_instanced_arrays >+ extensions affects the definition of this extension. >+ >+Overview >+ >+ This extension exposes the Multi* draw call variants in >+ EXT_multi_draw_arrays functionality in addition to the vertex shader builtin >+ gl_DrawID exposed by ARB_shader_draw_parameters for OpenGL. >+ >+ These functions behave identically to the standard functions >+ DrawArrays() and DrawElements() except they handle multiple lists of >+ vertices in one call. Their main purpose is to allow one function call >+ to render more than one primitive such as triangle strip, triangle fan, >+ etc. >+ >+ Additionally, this extension adds a further built-in variable, gl_DrawID >+ to the shading language. This variable contains the index of the draw >+ currently being processed by a Multi* variant of a drawing command. >+ >+IP Status >+ >+ No known IP claims. >+ >+New Procedures and Functions >+ >+ void MultiDrawArraysANGLE(enum mode, >+ const GLint* firsts, >+ const GLsizei* counts, >+ const GLsizei drawcount); >+ >+ void MultiDrawElementsANGLE(enum mode, >+ const GLint* counts, >+ GLenum type, >+ const GLvoid* const* indices, >+ const GLsizei drawcount); >+ >+ void MultiDrawArraysInstancedANGLE(enum mode, >+ const GLint* firsts, >+ const GLsizei* counts, >+ const GLsizei* instanceCounts, >+ const GLsizei drawcount); >+ >+ void MultiDrawElementsInstancedANGLE(enum mode, >+ const GLint* counts, >+ GLenum type, >+ const GLvoid* const* indices, >+ const GLsizei* instanceCounts, >+ const GLsizei drawcount); >+ >+New Tokens >+ >+ None. >+ >+Additions to Chapter 2 of the OpenGL ES 2.0 Specification >+ >+ Section 2.8 Vertex Arrays: >+ >+ The command >+ >+ void MultiDrawArraysANGLE(GLenum mode, >+ const GLint* firsts, >+ const GLsizei *counts, >+ GLsizei drawcount) >+ >+ Behaves identically to DrawArrays 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) DrawArrays(mode, *(firsts+i), *(counts+i)); >+ } >+ >+ The index of the draw (<i> in the above pseudo-code) may be read by >+ a vertex shader as <gl_DrawID>. >+ >+ The command >+ >+ void MultiDrawElementsANGLE(GLenum mode, >+ GLsizei* counts, >+ GLenum type, >+ const GLvoid* const* indices, >+ GLsizei drawcount) >+ >+ Behaves identically to DrawElements 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) { >+ DrawElements(mode, *(counts+i), type, *(indices+i)); >+ } >+ } >+ >+ The index of the draw (<i> in the above pseudo-code) may be read by >+ a vertex shader as <gl_DrawID>. >+ >+Additions to Chapter 2 of the OpenGL ES 3.0 Specification >+ >+ Section 2.9.3 Drawing Commands: >+ >+ The command >+ >+ void MultiDrawArraysInstancedANGLE( >+ GLenum mode, >+ const GLint* firsts, >+ const GLsizei *counts, >+ const GLsizei* instanceCounts, >+ GLsizei drawcount) >+ >+ Behaves identically to DrawArraysInstanced 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) DrawArraysInstanced(mode, *(firsts+i), *(counts+i), >+ *(instanceCounts+1)); >+ } >+ >+ The index of the draw (<i> in the above pseudo-code) may be read by >+ a vertex shader as <gl_DrawID>. >+ >+ The command >+ >+ void MultiDrawElementsInstancedANGLE( >+ GLenum mode, >+ GLsizei* counts, >+ GLenum type, >+ const GLvoid* const* indices, >+ const GLsizei* instanceCounts, >+ GLsizei drawcount) >+ >+ Behaves identically to DrawElementsInstanced 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) { >+ DrawElementsInstanced(mode, *(counts+i), type, >+ *(indices+i), *(instanceCounts+1)); >+ } >+ } >+ >+ The index of the draw (<i> in the above pseudo-code) may be read by >+ a vertex shader as <gl_DrawID>. >+ >+Errors >+ >+ The error INVALID_VALUE is generated by the new functions if <drawcount> >+ is less than 0. >+ >+ MultiDrawArraysANGLE, MultiDrawElementsANGLE, >+ MultiDrawArraysInstancedANGLE, and MultiDrawElementsInstancedANGLE generate >+ the same errors as DrawArrays, DrawElements, DrawArraysInstanced, >+ and DrawElementsInstanced, respectively, for any draw <i> where an error >+ is generated. If any call would produce an error, no drawing is performed. >+ >+Modifications to the OpenGL ES Shading Language Specification, Version 3.00 >+ >+ Including the following line in a shader can be used to control the >+ language featured described in this extension: >+ >+ #extension GL_ANGLE_multi_draw : <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_multi_draw 1 >+ >+Dependencies on GL_ANGLE_instanced_arrays >+ >+ If GL_ANGLE_instanced_arrays or GL_EXT_instanced_arrays is enabled, >+ append the lanuage in "Additions to Chapter 2 of the OpenGL ES 3.0 >+ Specification, Section 2.9.3 Drawing Commands" to the language in >+ "Additions to Chapter 2 of the OpenGL ES 2.0 Specification, Section >+ 2.8 Vertex Arrays". >+ >+ If GL_ANGLE_instanced_arrays or GL_EXT_instanced_arrays is not enabled >+ and the context is less than a OpenGL ES 3.0 context, the error >+ INVALID_OPERATION is generated by any call to the functions >+ MultiDrawArraysInstancedANGLE and MultiDrawElementsInstancedANGLE. >+ >+Issues >+ None >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- -------- ---------- -------------------------------------------- >+ 1 10/24/18 Austin Eng First revision. >+ 2 10/25/18 Austin Eng Second revision. Add instanced variants >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_multiview_multisample.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_multiview_multisample.txt >new file mode 100644 >index 00000000000..6b3d4ab5682 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_multiview_multisample.txt >@@ -0,0 +1,99 @@ >+Name >+ >+ ANGLE_multiview_multisample >+ >+Name Strings >+ >+ GL_ANGLE_multiview_multisample >+ >+Contributors >+ >+ Olli Etuaho, NVIDIA Corporation >+ >+Contact >+ >+ Olli Etuaho (oetuaho 'at' nvidia.com) >+ >+Status >+ >+ Incomplete >+ >+Version >+ >+ Last Modified Date: September 12, 2018 >+ Author Revision: 1 >+ >+Number >+ >+ OpenGL ES Extension XX >+ >+Dependencies >+ >+ OpenGL ES 3.0 and the extensions ANGLE_texture_multisample, OVR_multiview2 >+ and OES_texture_storage_multisample_2d_array are required. >+ >+ With OpenGL ES 3.1, only the extensions ANGLE_multiview and >+ OES_texture_storage_multisample_2d_array are required. >+ >+Overview >+ >+ This extension enhances the functionality introduced in ANGLE_multiview by >+ enabling rendering into multisample texture arrays in addition to regular >+ non-multisampled texture arrays. >+ >+IP Status >+ >+ No known IP claims. >+ >+New Tokens >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+Additions to Chapter 4 of the OpenGL ES 3.0 Specification >+(Per-Fragment Operations and the Framebuffer) >+ >+ Modify section 4.4.2 (Attaching Images to Framebuffer Objects), p. 202 >+ >+ Add the following bullet point: >+ >+ "* Layers of a two-dimensional multisample array texture which can be used >+ for multi-view rendering." >+ >+ Modify the error list of FramebufferTextureMultiviewOVR: >+ >+ Change >+ >+ "An INVALID_OPERATION error is generated if texture is not zero, >+ and does not name an existing texture object of type TEXTURE_2D_ARRAY." >+ >+ to >+ >+ "An INVALID_OPERATION error is generated if texture is not zero, >+ and does not name an existing texture object of type TEXTURE_2D_ARRAY or >+ TEXTURE_2D_MULTISAMPLE_ARRAY_OES." >+ >+ >+ Modify section 4.4.4.1 (Framebuffer Attachment Completeness), p. 213 >+ >+ Change the bullet point about num_views and base_view_index: >+ >+ "If the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is TEXTURE and >+ the value of FRAMEBUFFER_ATTACHMENT_OBJECT_NAME names a two-dimensional >+ array texture or a two-dimensional multisample array texture, then the sum >+ of FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE and >+ FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE must be less than the >+ number of layers in the texture." >+ >+Additions to the AGL/EGL/GLX/WGL Specifications >+ >+ None >+ >+Errors >+ >+ None >+ >+Issues >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_pack_reverse_row_order.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_pack_reverse_row_order.txt >new file mode 100644 >index 00000000000..6ec06491e8e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_pack_reverse_row_order.txt >@@ -0,0 +1,168 @@ >+Name >+ >+ ANGLE_pack_reverse_row_order >+ >+Name Strings >+ >+ GL_ANGLE_pack_reverse_row_order >+ >+Contact >+ >+ Daniel Koch, TransGaming (daniel 'at' transgaming.com) >+ >+Contributors >+ >+ Brian Salomon >+ Daniel Koch >+ >+Status >+ >+ Implemented in ANGLE ES2 >+ >+Version >+ >+ Last Modified Date: February 22, 2011 >+ Author Revision: 22 >+ >+Number >+ >+ OpenGL ES Extension #110 >+ >+Dependencies >+ >+ OpenGL 1.5 or OpenGL ES 1.0 are required. >+ >+ Some of the functionality of this extension is not supported >+ when implemented against OpenGL ES. >+ >+ EXT_texture_rg interacts with this extension. >+ >+ The extension is written against the OpenGL 3.2 Specification >+ (Core Profile). >+ >+Overview >+ >+ This extension introduces a mechanism to allow reversing the order >+ in which image rows are written into a pack destination. This >+ effectively allows an application to flip the results of a ReadPixels >+ in the y direction operation without having to render upside down. >+ >+ The coordinate system of OpenGL is vertically reversed in comparison to a >+ number of other graphics systems such as native windowing APIs. Applications >+ that perform ReadPixels may have to either render to an intermediate color >+ buffer before calling ReadPixels or perform a flip in software after >+ ReadPixels. In some systems the GL can perform the row reversal during >+ ReadPixels without incurring additional cost. >+ >+IP Status >+ >+ No known IP claims. >+ >+New Procedures and Functions >+ >+ None >+ >+New Types >+ >+ None >+ >+New Tokens >+ >+ Accepted by the <pname> parameter of PixelStore{if}, GetIntegerv(), >+ GetBooleanv(), and GetFloatv(): >+ >+ PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 >+ >+Additions to Chapter 3 of the OpenGL 3.2 Specification (Rasterization) >+ >+ In Section 4.3.1 (Reading Pixels) add a row to table 4.7: >+ >+ +------------------------------+---------+---------------+-------------+ >+ | Parameter Name | Type | Initial Value | Valid Range | >+ +------------------------------+---------+---------------+-------------+ >+ | PACK_REVERSE_ROW_ORDER_ANGLE | boolean | FALSE | TRUE/FALSE | >+ +------------------------------+---------+---------------+-------------+ >+ >+ In Section 4.3.1 (Reading Pixels) modify the second paragraph of subsection >+ "Placement in Pixel Pack Buffer or Client Memory" to read: >+ >+ When PACK_REVERSE_ROW_ORDER_ANGLE is FALSE groups of elements are placed >+ in memory just as they are taken from memory when transferring pixel >+ rectangles to the GL. That is, the ith group of the jth row >+ (corresponding to the ith pixel in the jth row) is placed in memory just >+ where the ith group of the jth row would be taken from when transferring >+ pixels. See Unpacking under section 3.7.2. The only difference is that >+ the storage mode parameters whose names begin with PACK_ are used >+ instead of those whose names begin with UNPACK_. If the format is RED, >+ GREEN, BLUE, or ALPHA, only the corresponding single element is written. >+ Likewise if the format is RG, RGB, or BGR, only the corresponding two or >+ three elements are written. Otherwise all the elements of each group are >+ written. When PACK_REVERSE_ROW_ORDER_ANGLE is TRUE the order of the rows >+ of elements is reversed before the data is packed. That is, the element >+ corresponding to pixel (x, y + height - 1) becomes the first element >+ packed, followed by (x + 1, y + height - 1), etc. Otherwise, pixel data >+ is packed in the same manner as when PACK_REVERSE_ROW_ORDER_ANGLE is >+ FALSE. >+ >+Additions to Chapter 6 of the OpenGL 3.2 Specification (State and State Requests) >+ >+ In Section 6.1.4 add the following sentence to the fifth paragraph >+ (beginning with "For three-dimensional and two-dimensional array >+ textures..."): >+ When PACK_REVERSE_ROW_ORDER_ANGLE is TRUE the order of rows within >+ each image are reversed without reordering the images themselves. >+ >+Dependencies on OpenGL ES >+ >+ If implemented for OpenGL ES, this extension behaves as specified, except: >+ >+ -Delete all references to formats RED, GREEN, BLUE, RG, and BGR. >+ >+ -The language about image order in Section 6.1.4 does not apply as OpenGL ES >+ does not have GetTexImage. >+ >+Dependencies on EXT_texture_rg >+ >+ If EXT_texture_rg is present reinsert language about formats RED and RG >+ into the OpenGL ES 2.0 specification. >+ >+Errors >+ >+ None >+ >+New State >+ Initial >+ Get Value Type Get Command Value Description Sec. >+ --------- ---- ----------- ------- ----------- ---- >+ PACK_REVERSE_ROW_ORDER_ANGLE B GetIntegerv FALSE Pixel pack row order reversal 4.3.1 >+ >+New Implementation Dependent State >+ >+ None >+ >+Issues >+ >+ None >+ >+Sample Code >+ >+ /* Allocate space to hold the pixel data */ >+ const GLvoid* pixels = malloc(width * height * 4); >+ >+ /* Bind the framebuffer object to be read */ >+ glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer); >+ >+ /* Enable row order reversal */ >+ glPixelStore(GL_PACK_REVERSE_ROW_ORDER_ANGLE, TRUE); >+ >+ /* The pixel data stored in pixels will be in top-down order, ready for >+ * use with a windowing system API that expects this order. >+ */ >+ glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); >+ >+Revision History >+ >+ Revision 1, 2011/11/22 (Brian Salomon) >+ - First version >+ Revision 2, 2012/02/22 (dgkoch) >+ - prepare for publishing >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_program_binary.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_program_binary.txt >new file mode 100644 >index 00000000000..67550bc1182 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_program_binary.txt >@@ -0,0 +1,94 @@ >+Name >+ >+ ANGLE_program_binary >+ >+Name Strings >+ >+ GL_ANGLE_program_binary >+ >+Contributors >+ >+ Alastair Patrick, Google Inc. >+ Daniel Koch, TransGaming Inc. >+ >+Contact >+ >+ Alastair Patrick, Google Inc. (apatrick 'at' google 'dot' com) >+ >+Status >+ >+ Under development. >+ >+Version >+ >+ Last Modifed Date: June 6, 2012 >+ Revision: #1 >+ >+Number >+ >+ TBD >+ >+Dependencies >+ >+ OpenGL ES 2.0 is required. >+ OES_get_program_binary is required. >+ This extension is written against the OpenGL ES 2.0.25 specification. >+ >+Overview >+ >+ This extension makes available a program binary format, >+ PROGRAM_BINARY_ANGLE. It enables retrieving and loading of pre-linked >+ ANGLE program objects. >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted by the <binaryFormat> parameter of ProgramBinaryOES: >+ >+ PROGRAM_BINARY_ANGLE 0x93A6 >+ >+Additions to Chapter 2 of the OpenGL-ES 2.0 Specification (OpenGL Operation) >+ >+ Add the following paragraph to the end of section 2.15.4, Program Binaries: >+ >+ "PROGRAM_BINARY_ANGLE, returned in the list of PROGRAM_BINARY_FORMATS_OES, >+ is a format that may be loaded into a program object via ProgramBinaryOES." >+ >+Additions to Chapter 3 of the OpenGL ES 2.0 specification (Rasterizatoin) >+ >+ None. >+ >+Additions to Chapter 4 of the OpenGL ES 2.0 specification (Per-Fragment >+Operations and the Framebuffer) >+ >+ None. >+ >+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. >+ >+Errors >+ >+ None >+ >+New State >+ >+ None. >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ 06/06/2012 apatrick intial revision >+ >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_program_cache_control.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_program_cache_control.txt >new file mode 100644 >index 00000000000..ed46c6b9287 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_program_cache_control.txt >@@ -0,0 +1,75 @@ >+Name >+ >+ ANGLE_program_cache_control >+ >+Name Strings >+ >+ GL_ANGLE_program_cache_control >+ >+Contributors >+ >+ Jamie Madill, Google >+ >+Contacts >+ >+ Jamie Madill (jmadill 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, June 29, 2017 >+ >+Number >+ >+ OpenGL ES Extension #?? >+ >+Dependencies >+ >+ OpenGL ES 3.0 is required. >+ >+ This extension is written against the wording of the OpenGL ES >+ 3.0 specification. >+ >+Overview >+ >+ With the program cache enabled, created OpenGL ES contexts will use an >+ internal program binary cache to save linking time. The extension allows the >+ application to determine if a particular Context has this feature enabled. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted by the <cap> parameter to IsEnabled and the <pname> parameter to >+ GetBooleanv, GetIntegerv, GetFloatv, and GetInteger64v: >+ >+ PROGRAM_CACHE_ENABLED_ANGLE 0x93AC >+ >+Additions to the OpenGL ES Specification: >+ >+ Add to section 2.12.3 (Program Objects), p. 52, after paragraph 4: >+ >+ Contexts with PROGRAM_CACHE_ENABLED_ANGLE set to TRUE will query the >+ internal program cache on any LinkProgram call, and re-use program binaries >+ if matching values are found. LinkProgram will succeed in this case. If the >+ binary load fails for any reason, LinkProgram will fall back to linking >+ normally. >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------- --------- ------------------------------------------- >+ 1 June 29, 2017 jmadill Initial version >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_request_extension.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_request_extension.txt >new file mode 100644 >index 00000000000..6536035fa7e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_request_extension.txt >@@ -0,0 +1,116 @@ >+Name >+ >+ ANGLE_request_extension >+ >+Name Strings >+ >+ GL_ANGLE_request_extension >+ >+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, November 28, 2016 >+ >+Number >+ >+ OpenGL ES Extension #?? >+ >+Dependencies >+ >+ Requires OpenGL ES 2.0 >+ >+ Written against the OpenGL ES 3.0 specification. >+ >+Overview >+ >+ This extension allows the client to query extensions that can be enabled and >+ explicitly request than an extension be enabled. >+ >+New Procedures and Functions >+ >+ void RequestExtension(const char *name) >+ >+New Tokens >+ >+ Accepted by the <name> parameter of GetString and GetStringi: >+ >+ REQUESTABLE_EXTENSIONS_ANGLE 0x93A8 >+ >+ Accepted by the <value> parameter of the GetInteger* functions: >+ >+ NUM_REQUESTABLE_EXTENSIONS_ANGLE 0x93A9 >+ >+Additions to the OpenGL ES 3.0 Specification >+ >+ Add the following paragraph to the end paragraph 4 of section 6.1.6, String >+ Queries: >+ >+ "REQUESTABLE_EXTENSIONS_ANGLE returns a list of extensions that can be >+ enabled at runtime by calling RequestExtension." >+ >+ Change the following section of paragraph 6 of section 6.1.6, String Queries: >+ >+ - "name may only be EXTENSIONS, indicating that the extension name >+ - corresponding to the indexth supported extension should be returned. >+ - <index> may range from zero to the value of NUM_EXTENSIONS minus one" >+ + "name may be EXTENSIONS or REQUESTABLE_EXTENSIONS_ANGLE, indicating that >+ + the extension name corresponding to the indexth supported or requestable >+ + extension should be returned. <index> may range from zero to the value of >+ + NUM_EXTENSIONS and NUM_REQUESTABLE_EXTENSIONS_ANGLE minus one" >+ >+ The command >+ >+ void RequestExtension(const char *name) >+ >+ enables the requestable OpenGL ES extension named <name>. If the extension >+ was not requestable, INVALID_OPERATION is generated. >+ >+New State >+ >+ Add to Table 6.30 (Implementation Dependent Version and Extension Support) >+ >+ Get value Type Get Cmd Min Value Description Sec. >+ -------------------------------- ---- ----------- --------- -------------------------------- ----- >+ NUM_REQUESTABLE_EXTENSIONS_ANGLE Z+ GetIntegerv - Number of individual requestable 6.1.6 >+ extension names >+ >+Interactions with the OpenGL ES 2.0 specification: >+ >+ Remove all references to GetStringi and NUM_REQUESTABLE_EXTENSIONS_ANGLE. >+ >+Issues >+ >+ (1) How can the user determine which extensions can be enabled without >+ potentially generating errors? >+ >+ This can be solved by: >+ a) Never generate an error in EnableExtensions, simply return false when >+ the extension is not recognized or cannot be enabled. >+ b) Add another query for the extensions that the context supports >+ enabling. >+ >+ RESOLVED: Use (b) because it allows the context to explicity advertise >+ which extensions support enabling and doesn't generate errors in the >+ normal use case. >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------- --------- ---------------------------------------- >+ 1 Nov 28, 2016 geofflang Initial version >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_robust_client_memory.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_robust_client_memory.txt >new file mode 100644 >index 00000000000..933deb0f49a >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_robust_client_memory.txt >@@ -0,0 +1,180 @@ >+Name >+ >+ ANGLE_robust_client_memory >+ >+Name Strings >+ >+ GL_ANGLE_robust_client_memory >+ >+Contributors >+ >+ Geoff Lang, Google >+ >+Contacts >+ >+ Geoff Lang, Google (geofflang 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 4, March 30, 2017 >+ >+Number >+ >+ OpenGL ES Extension #?? >+ >+Dependencies >+ >+ OpenGL ES 2.0 is required. >+ >+ This extension is written against the wording of the OpenGL ES >+ 3.2 specification. >+ >+ Interacts with GL_KHR_debug, GL_EXT_disjoint_timer_queries, >+ GL_KHR_robustness. >+ >+Overview >+ >+ This extension adds overloads of many OpenGL ES functions that read from >+ and write to client memory to ensure that all reads and writes done by the >+ OpenGL ES implementation are safe. When the OpenGL ES API is exposed to >+ users through complex bindings such as WebGL, allowing undefined behaviour >+ that may result in crashing the implementation is not acceptable. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ void GetBooleanvRobustANGLE(enum pname, sizei bufSize, sizei *length, boolean *data) >+ void GetBufferParameterivRobustANGLE(enum target, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetFloatvRobustANGLE(enum pname, sizei bufSize, sizei *length, float *data) >+ void GetFramebufferAttachmentParameterivRobustANGLE(enum target, enum attachment, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetIntegervRobustANGLE(enum pname, sizei bufSize, sizei *length, int *data) >+ void GetProgramivRobustANGLE(uint program, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetRenderbufferParameterivRobustANGLE(enum target, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetShaderivRobustANGLE(uint shader, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetTexParameterfvRobustANGLE(enum target, enum pname, sizei bufSize, sizei *length, float *params) >+ void GetTexParameterivRobustANGLE(enum target, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetUniformfvRobustANGLE(uint program, int location, sizei bufSize, sizei *length, float *params) >+ void GetUniformivRobustANGLE(uint program, int location, sizei bufSize, sizei *length, int *params) >+ void GetVertexAttribfvRobustANGLE(uint index, enum pname, sizei bufSize, sizei *length, float *params) >+ void GetVertexAttribivRobustANGLE(uint index, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetVertexAttribPointervRobustANGLE(uint index, enum pname, sizei bufSize, sizei *length, void **pointer) >+ void ReadPixelsRobustANGLE(int x, int y, sizei width, sizei height, enum format, enum type, sizei bufSize, sizei *length, sizei *columns, sizei *rows, void *pixels) >+ void TexImage2DRobustANGLE(enum target, int level, int internalformat, sizei width, sizei height, int border, enum format, enum type, sizei bufSize, const void *pixels) >+ void TexParameterfvRobustANGLE(enum target, enum pname, sizei bufSize, const GLfloat *params) >+ void TexParameterivRobustANGLE(enum target, enum pname, sizei bufSize, const GLint *params) >+ void TexSubImage2DRobustANGLE(enum target, int level, int xoffset, int yoffset, sizei width, sizei height, enum format, enum type, sizei bufSize, const void *pixels) >+ void CompressedTexImage2D(enum target, int level, enum internalformat, sizei width, sizei height, int border, sizei imageSize, sizei bufSize, const void* data) >+ void CompressedTexSubImage2D(enum target, int level, int xoffset, int yoffset, sizei width, sizei height, enum format, sizei imageSize, sizei bufSize, const void* data) >+ void CompressedTexImage3D(enum target, int level, enum internalformat, sizei width, sizei height, sizei depth, int border, sizei imageSize, sizei bufSize, const void* data) >+ void CompressedTexSubImage3D(enum target, int level, int xoffset, int yoffset, int zoffset, sizei width, sizei height, sizei depth, enum format, sizei imageSize, sizei bufSize, const void* data) >+ >+ void TexImage3DRobustANGLE(enum target, int level, int internalformat, sizei width, sizei height, sizei depth, int border, enum format, enum type, sizei bufSize, const void *pixels); >+ void TexSubImage3DRobustANGLE(enum target, int level, int xoffset, int yoffset, int zoffset, sizei width, sizei height, sizei depth, enum format, enum type, sizei bufSize, const void *pixels); >+ void GetQueryivRobustANGLE(enum target, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetQueryObjectuivRobustANGLE(uint id, enum pname, sizei bufSize, sizei *length, uint *params) >+ void GetBufferPointervRobustANGLE(enum target, enum pname, sizei bufSize, sizei *length, void **params) >+ void GetIntegeri_vRobustANGLE(enum target, uint index, sizei bufSize, sizei *length, int *data) >+ void GetInternalformativRobustANGLE(enum target, enum internalformat, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetVertexAttribIivRobustANGLE(uint index, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetVertexAttribIuivRobustANGLE(uint index, enum pname, sizei bufSize, sizei *length, uint *params) >+ void GetUniformuivRobustANGLE(uint program, int location, sizei bufSize, sizei *length, uint *params) >+ void GetActiveUniformBlockivRobustANGLE(uint program, uint uniformBlockIndex, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetInteger64vRobustANGLE(enum pname, sizei bufSize, sizei *length, int64 *data) >+ void GetInteger64i_vRobustANGLE(enum target, uint index, sizei bufSize, sizei *length, int64 *data) >+ void GetBufferParameteri64vRobustANGLE(enum target, enum pname, sizei bufSize, sizei *length, int64 *params) >+ void SamplerParameterivRobustANGLE(uint sampler, enum pname, sizei bufSize, const GLint *param) >+ void SamplerParameterfvRobustANGLE(uint sampler, enum pname, sizei bufSize, const GLfloat *param) >+ void GetSamplerParameterivRobustANGLE(uint sampler, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetSamplerParameterfvRobustANGLE(uint sampler, enum pname, sizei bufSize, sizei *length, float *params) >+ >+ void GetFramebufferParameterivRobustANGLE(enum target, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetProgramInterfaceivRobustANGLE(uint program, enum programInterface, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetBooleani_vRobustANGLE(enum target, uint index, sizei bufSize, sizei *length, boolean *data) >+ void GetMultisamplefvRobustANGLE(enum pname, uint index, sizei bufSize, sizei *length, float *val) >+ void GetTexLevelParameterivRobustANGLE(enum target, int level, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetTexLevelParameterfvRobustANGLE(enum target, int level, enum pname, sizei bufSize, sizei *length, float *params) >+ >+ void GetPointervRobustANGLERobustANGLE(enum pname, sizei bufSize, sizei *length, void **params) >+ void ReadnPixelsRobustANGLE(int x, int y, sizei width, sizei height, enum format, enum type, sizei bufSize, sizei *length, sizei *columns, sizei *rows, void *data) >+ void GetnUniformfvRobustANGLE(uint program, int location, sizei bufSize, sizei *length, float *params) >+ void GetnUniformivRobustANGLE(uint program, int location, sizei bufSize, sizei *length, int *params) >+ void GetnUniformuivRobustANGLE(uint program, int location, sizei bufSize, sizei *length, uint *params) >+ void TexParameterIivRobustANGLE(enum target, enum pname, sizei bufSize, const GLint *params) >+ void TexParameterIuivRobustANGLE(enum target, enum pname, sizei bufSize, const GLuint *params) >+ void GetTexParameterIivRobustANGLE(enum target, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetTexParameterIuivRobustANGLE(enum target, enum pname, sizei bufSize, sizei *length, uint *params) >+ void SamplerParameterIivRobustANGLE(uint sampler, enum pname, sizei bufSize, const GLint *param) >+ void SamplerParameterIuivRobustANGLE(uint sampler, enum pname, sizei bufSize, const GLuint *param) >+ void GetSamplerParameterIivRobustANGLE(uint sampler, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetSamplerParameterIuivRobustANGLE(uint sampler, enum pname, sizei bufSize, sizei *length, uint *params) >+ >+ void GetQueryObjectivRobustANGLE(uint id, enum pname, sizei bufSize, sizei *length, int *params) >+ void GetQueryObjecti64vRobustANGLE(uint id, enum pname, sizei bufSize, sizei *length, int64 *params) >+ void GetQueryObjectui64vRobustANGLE(uint id, enum pname, sizei bufSize, sizei *length, uint64 *params) >+ >+New Tokens >+ >+ None >+ >+Additions to the OpenGL ES Specification: >+ >+ The xRobustANGLE entry points perform additional validation using <bufSize> >+ to indicate the maximum number of values that can be read from or written >+ to the provided buffer. INVALID_OPERATION is generated if <bufSize> is not >+ large enough. The optional <length> specifies an address of a variable to >+ recieve the number of values written to the buffer. When an error is >+ generated nothing will be written to <length>. >+ >+ The <columns> and <rows> parameters of ReadPixelsRobustANGLE and >+ ReadnPixelsRobustANGLE specify addresses of variables to recieve the number >+ of columns and rows of pixels written to the buffer which may be less than >+ the <width> and <height> parameters if they would have read outside of the >+ framebuffer. >+ >+ Calls to "xRobustANGLE" will generate errors under the same conditions as >+ "x". Any instances of undefined behaviour in "x" will also be undefined in >+ "xRobustANGLE". For example, it is invalid to call >+ GetPointervRobustANGLERobustANGLE without first verifying that the context >+ is at least OpenGL ES version 3.2 or the GL_KHR_debug extension is present. >+ >+Issues >+ >+ 1) Should additional entry points be added to specify sizes of client side >+ data provided to the VertexAttribPointer functions? >+ >+ 2) Should <length> be allowed to be null? >+ >+ RESOLVED: Yes, <length> will not be written to when it is a null >+ pointer. >+ >+ 3) Should <bufSize> be specified in bytes or values (uint, int, float, >+ etc)? >+ >+ There is no consistancy in current entry points for this. For example, >+ glGetnUniformuiv indicates that bufSize is in bytes while GetSynciv >+ uses values despite GetnUniformuiv having a clear value type. >+ >+ RESOLOVED: <bufSize> always indicates size in values. Functions that >+ specify data by void* such as TexImage2DRobustANGLE treat the client >+ data as bytes. >+ >+ 4) Should <length> be written to if an error is generated? >+ >+ RESOLVED: No, using the prescedent set by glGetSynciv. >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------- --------- ------------------------------------------- >+ 1 Sept 26, 2016 geofflang Initial version >+ 2 Sept 28, 2016 geofflang Changed name from ANGLE_robust_queries to >+ ANGLE_robust_client_memory, added issue 3. >+ 3 Oct 7, 2016 geofflang Added and resolved issue 4. >+ 4 Mar 30, 2017 geofflang Added columns and rows to ReadPixels. >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_robust_resource_initialization.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_robust_resource_initialization.txt >new file mode 100644 >index 00000000000..30372ec8c67 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_robust_resource_initialization.txt >@@ -0,0 +1,144 @@ >+Name >+ >+ ANGLE_robust_resource_initialization >+ >+Name Strings >+ >+ GL_ANGLE_robust_resource_intialization >+ >+Contributors >+ >+ Geoff Lang, Google >+ Ken Russell, Google >+ >+Contacts >+ >+ Shannon Woods, Google (shannonwoods 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 3, September 19, 2017 >+ >+Number >+ >+ OpenGL ES Extension TBD >+ >+Dependencies >+ >+ OpenGL ES 2.0 is required. >+ >+ This extension is written against the wording of the OpenGL ES >+ 3.1 specification. >+ >+ EGL_ANGLE_robust_initialization is required to request a >+ context that supports this extension, and resource initialization. >+ >+Overview >+ >+ This extension specifies the behavior for initialization of >+ resources such as textures and buffers to default values. This >+ initialization ensures that access will not be provided by the >+ GL to previously allocated data not owned by the application. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted by the <value> parameter of GetBooleanv, GetIntegerv, >+ GetFloatv, GetDoublev, GetInteger64v, and IsEnabled: >+ >+ ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x93A7 >+ >+Additions to Chapter 6 of the OpenGL ES 3.1 Specification (Buffer >+Objects) >+ >+ Replace the last sentence of the first paragraph of section 6.2 >+ "BufferData": >+ >+ If <data> is NULL, and robust resource initialization is enabled, >+ the contents of the buffer object's data store are set to zero. >+ Otherwise, the contents of the buffer object's data store are >+ undefined. >+ >+Additions to Chapter 8 of the OpenGL ES 3.1 Specification (Textures and >+Samplers) >+ >+ Replace the first two sentances of the final paragraph in section >+ 8.5.3 "Texture Image Structure": >+ >+ If the <data> argument of TexImage2D or TexImage3D is NULL, and the >+ pixel unpack buffer object is zero, a two- or three-dimensional >+ texel array is created with the specified <target>, <level>, >+ <internalformat>, <border>, <width>, <height>, and <depth>. If >+ robust resource initialization is enabled, the contents of the image >+ are initialized as though a zero value were provided for each >+ component of each pixel, and processed and transferred to the GL >+ as described above. The components comprising this zero-filled data >+ are determined by <internalformat>. If robust resource >+ initialization is not enabled, the image contents are undefined, and >+ no pixel processing is performed. In either case, no pixel values >+ are accessed in client memory. >+ >+ Replace the first sentence of the fifth paragraph in section 8.8 >+ "Multisample Textures": >+ >+ Upon success, TexStorage2DMultisample deletes any existing image >+ for target. If robust resource initialization is enabled, the >+ contents of each texel are initialized as though a zero value were >+ written to each channel of each sample; otherwise the contents of >+ texels are undefined. >+ >+ Add to the final paragraph of section 8.17 "Immutable-Format Texture >+ Images": >+ >+ If robust resource initialization is enabled, the contents of each >+ texel is initialized as though a zero value were provided for each >+ component of each pixel, and processed and transferred to the GL >+ as for a call to the appropriate TexSubImage* call for <target>. >+ Otherwise, the contents of texels are undefined. >+ >+Additions to Chapter 9 of the OpenGL ES 3.1 Specification (Framebuffers >+and Framebuffer Objects) >+ >+ Replace the sentence in section 9.2.4 "Renderbuffer Objects" >+ beginning "Upon success, RenderbufferStorageMultisample": >+ >+ Upon success, RenderbufferStorageMultisample deletes any existing >+ data store for the renderbuffer image. If robust resource >+ initialization is enabled, the contents of each pixel in the data >+ store are initialized as though a zero value was written to each >+ channel of each sample; otherwise, the contents of the data store >+ are undefined. >+ >+Interactions with EGL_ANGLE_create_context_robust_resource_initialization >+ >+ If the EGL window-system binding API is used to create a context, >+ the EGL_ANGLE_create_context_robust_initialization extension is >+ supported, and the attribute >+ EGL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE is set to >+ EGL_TRUE when eglCreateContext is called, the resulting context >+ will perform robust resource initialization as described above in >+ section <section>, and the >+ CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE >+ query will return GL_TRUE as described above in section 2.6.1.1. >+ Otherwise queries will return GL_FALSE. >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ Version 1, 2015/01/07 - first draft. >+ Version 2, 2017/03/07 - fixed EGL naming and added IsEnabled. >+ Version 3, 2017/09/19 - name cleanup. >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_texture_compression_dxt.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_texture_compression_dxt.txt >new file mode 100644 >index 00000000000..0e844bfec0e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_texture_compression_dxt.txt >@@ -0,0 +1,163 @@ >+Name >+ >+ ANGLE_texture_compression_dxt >+ >+Name Strings >+ >+ GL_ANGLE_texture_compression_dxt1 >+ GL_ANGLE_texture_compression_dxt3 >+ GL_ANGLE_texture_compression_dxt5 >+ >+Contributors >+ >+ Gregg Tavares, Google Inc. >+ Daniel Koch, TransGaming Inc. >+ Al Patrick, Google Inc. >+ >+Contacts >+ >+ Gregg Tavares, Google Inc. (gman 'at' google 'dot' com) >+ >+Status >+ >+ Implemented in ANGLE ES2 >+ >+Version >+ >+ Last Modified Date: Sept 22, 2012 >+ Author Revision: 2 >+ >+Number >+ >+ OpenGL ES Extension #111 >+ >+Dependencies >+ >+ Requires OpenGL ES 1.0. >+ >+ The extension is written against the OpenGL ES 2.0 specification. >+ >+Overview >+ >+ These extensions are exactly the same as EXT_texture_compression_dxt1 >+ except they additionally expose the COMPRESSED_RGBA_S3TC_DXT3_ANGLE and >+ COMPRESSED_RGBA_S3TC_DXT5_ANGLE formats and have a size restrictions >+ such that the size must be a multiple of four (except for mip levels >+ where the dimensions are either 2 or 1). >+ >+ See EXT_texture_compression_dxt1 for the full list of changes. Also >+ see EXT_texture_compression_s3tc for a description of the formats. >+ >+IP Status >+ >+ A license to the S3TC Intellectual Property may be necessary for >+ implementation of this extension. You should consult with your >+ Attorney to determine the need for a license. >+ >+New Procedures and Functions >+ >+ None. >+ >+New Types >+ >+ None. >+ >+New Tokens >+ >+ Accepted by the <internalformat> parameter of CompressedTexImage2D >+ and the <format> parameter of CompressedTexSubImage2D: >+ >+ COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 >+ COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 >+ COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 >+ COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 >+ >+Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization) >+ >+ Add the following to Section 3.7.3 (Compressed Texture Images) >+ (at the end of the description of the CompressedTexImage2D command): >+ >+ Compressed Internal Format Base Internal Format >+ ========================== ==================== >+ COMPRESSED_RGB_S3TC_DXT1_ANGLE RGB >+ COMPRESSED_RGBA_S3TC_DXT1_ANGLE RGBA >+ COMPRESSED_RGBA_S3TC_DXT3_ANGLE RGBA >+ COMPRESSED_RGBA_S3TC_DXT5_ANGLE RGBA >+ >+ Table 3.x: Specific Compressed Internal Formats >+ >+ If <internalformat> is one of the S3TC formats listed in Table 3.x, >+ the compressed texture is stored in the appropriate S3TC compressed >+ texture format (see Appendix). The GL and the S3TC texture compression >+ algorithm support only 2D images without borders. >+ >+ CompressedTexImage2D will produce the INVALID_OPERATION error when >+ <internalformat> is one of the values from Table 3.x under the following >+ conditions: >+ >+ * <border> is non-zero. >+ * <width> is not one, two, or a multiple of four. >+ * <height> is not one, two, or a multiple of four. >+ >+ Add the following to Section 3.7.3 (Compressed Texture Images) >+ (at the end of the description of the CompressedTexSubImage2D command): >+ >+ If the internal format of the texture image being modified is listed >+ in Table 3.x, the texture is stored in the appropriate S3TC compressed >+ texture format (see Appendix). Since DXT/S3TC images are easily edited >+ along 4x4 texel boundaries, the limitations of CompressedTexSubImage2D >+ are relaxed. CompressedTexSubImage2D will result in an INVALID_OPERATION >+ error only if one of the following conditions occurs: >+ >+ * <width> is not a multiple of four or equal to TEXTURE_WIDTH. >+ * <height> is not a multipls of four or equal to TEXTURE_HEIGHT. >+ * <xoffset> or <yoffset> is not a multiple of four. >+ * <format> does not match the internal format of the texture image >+ being modified. >+ >+ The following restrictions at the end of section 3.7.3 do not apply >+ to S3TC DXT texture formats, since subimage modification is straightforward >+ as long as the subimage is properly aligned. >+ >+Errors >+ >+ INVALID_OPERATION is generated by CompressedTexImage2D if <internalformat> >+ is one of the compressed internal formats from Table 3.x and any of the >+ following apply: >+ - <border> is not equal to zero. >+ - <width> is not one, two, or a multiple of four. >+ - <height> is not one, two, or a multiple of four. >+ >+ INVALID_OPERATION is generated by TexImage2D and CopyTexImage2D if >+ <internalformat> is one of the compressed internal formats from >+ Table 3.x. >+ >+ INVALID_OPERATION is generated by TexSubImage2D and CopyTexSubImage2D >+ if the internal format of the texture currently bound to <target> is >+ one of the compressed internal formats from Table 3.x. >+ >+ INVALID_OPERATION is generated by CompressedTexSubImage2D if <format> >+ is one of the compressed interal formats from Table 3.x and any of the >+ following apply: >+ - <width> is not a multiple of four or equal to TEXTURE_WIDTH; >+ - <height> is not a multiple of four or equal to TEXTURE_HEIGHT; >+ - <xoffset> or <yoffset> is not a multiple of four; >+ - <format> does not match the internal format of the texture image >+ being modified. >+ >+New State >+ >+ None. >+ >+Appendix: >+ >+ The format for the S3TC Compressed Texture Images Formats is documented >+ in the appendix of EXT_texture_compression_s3tc. >+ >+Revision History >+ >+ Revision 1, 2010/08/06 - gman >+ - Initial revision >+ Revision 2, 2012/09/22 - dgkoch >+ - Added DXT1 formats and documented multiple of 4 restriction. >+ >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_texture_multisample.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_texture_multisample.txt >new file mode 100644 >index 00000000000..246a5bbf2ed >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_texture_multisample.txt >@@ -0,0 +1,764 @@ >+Name >+ >+ ANGLE_texture_multisample >+ >+Name Strings >+ >+ GL_ANGLE_texture_multisample >+ >+Contributors >+ >+ Yunchao He, Intel Corporation >+ Yizhou Jiang, Intel Corporation >+ Contributors to the OpenGL ES 3.1, GLSL ES 3.1, and ARB_texture_multisample >+ >+Contact >+ >+ Yunchao He (yunchao.he 'at' intel.com) >+ >+Status >+ >+ Incomplete >+ >+Version >+ >+ Last Modified Date: August 27, 2018 >+ Author Revision: 1 >+ >+Number >+ >+ OpenGL ES Extension XX >+ >+Dependencies >+ >+ OpenGL ES 3.0 is required. >+ >+ This extension is written against the OpenGL ES 3.0.5 and OpenGL ES >+ Shading Language 3.0 (Document Revision 6) specifications. >+ >+ KHR_robustness affects the behavior of this specification. >+ >+Overview >+ >+ This extension provides support for a new type of texture - >+ two-dimensional multisample textures - as well as mechanisms to >+ allocate storage and attach such textures to FBOs for rendering. >+ It also add supports using such textures in a shader, fetching specific >+ samples from such textures in a shader, and querying the dimensions of >+ such textures in a shader. >+ >+ This extension also includes the following functionality, some of which >+ was first described in NV_explicit_multisample: >+ >+ * An API to query the location of samples within the pixel >+ >+ * An explicit control for the multisample sample mask to augment the >+ control provided by SampleCoverage >+ >+ * An API to query the texture's level-of-detail information for various >+ parameters >+ >+ * A mechanism to support the SAMPLE_MASK capability >+ >+ * A mechanism to return corresponding types for multisample textures when >+ the uniform type is queried by getActiveUniform >+ >+ This extension does not expose multisampled 2D array textures, because they >+ are not supported in OpenGL ES 3.1. >+ >+IP Status >+ >+ No known IP claims. >+ >+New Procedures and Functions >+ >+ void TexStorage2DMultisampleANGLE(enum target, >+ sizei samples, >+ enum sizedinternalformat, >+ sizei width, >+ sizei height, >+ boolean fixedsamplelocations); >+ >+ void GetMultisamplefvANGLE(enum pname, uint index, float *val); >+ >+ void SampleMaskiANGLE(uint maskNumber, bitfield mask); >+ >+ void GetTexLevelParameter{if}vANGLE(enum target, int level, >+ enum pname, T *params ); >+ >+New Tokens >+ >+ Accepted by the <target> parameter of BindTexture, >+ TexStorage2DMultisampleANGLE, GetInternalformativ, TexParameter{if}*, >+ GetTexParameter{if}v, GetTexLevelParameter{if}vANGLE and >+ by the <textarget> parameter of FramebufferTexture2D: >+ >+ TEXTURE_2D_MULTISAMPLE_ANGLE 0x9100 >+ >+ Accepted by the <pname> parameter of GetMultisamplefvANGLE: >+ >+ SAMPLE_POSITION_ANGLE 0x8E50 >+ >+ Accepted by the <cap> parameter of Enable, Disable, and IsEnabled: >+ >+ SAMPLE_MASK_ANGLE 0x8E51 >+ >+ Accepted by the <target> parameter of GetIntegeri_v: >+ >+ SAMPLE_MASK_VALUE_ANGLE 0x8E52 >+ >+ Accepted by the <pname> parameter of GetIntegerv: >+ >+ MAX_SAMPLE_MASK_WORDS_ANGLE 0x8E59 >+ MAX_COLOR_TEXTURE_SAMPLES_ANGLE 0x910E >+ MAX_DEPTH_TEXTURE_SAMPLES_ANGLE 0x910F >+ MAX_INTEGER_SAMPLES_ANGLE 0x9110 >+ TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE 0x9104 >+ >+ Accepted by the <pname> parameter of GetTexLevelParameter{if}vANGLE: >+ >+ TEXTURE_SAMPLES_ANGLE 0x9106 >+ TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE 0x9107 >+ TEXTURE_WIDTH 0x1000 >+ TEXTURE_HEIGHT 0x1001 >+ TEXTURE_DEPTH 0x8071 >+ TEXTURE_INTERNAL_FORMAT 0x1003 >+ TEXTURE_RED_SIZE 0x805C >+ TEXTURE_GREEN_SIZE 0x805D >+ TEXTURE_BLUE_SIZE 0x805E >+ TEXTURE_ALPHA_SIZE 0x805F >+ TEXTURE_DEPTH_SIZE 0x884A >+ TEXTURE_STENCIL_SIZE 0x88F1 >+ TEXTURE_SHARED_SIZE 0x8C3F >+ TEXTURE_RED_TYPE 0x8C10 >+ TEXTURE_GREEN_TYPE 0x8C11 >+ TEXTURE_BLUE_TYPE 0x8C12 >+ TEXTURE_ALPHA_TYPE 0x8C13 >+ TEXTURE_DEPTH_TYPE 0x8C16 >+ TEXTURE_COMPRESSED 0x86A1 >+ >+ Returned by the <type> parameter of GetActiveUniform: >+ >+ SAMPLER_2D_MULTISAMPLE_ANGLE 0x9108 >+ INT_SAMPLER_2D_MULTISAMPLE_ANGLE 0x9109 >+ UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ANGLE 0x910A >+ >+Additions to Chapter 2 of the OpenGL ES 3.0.5 Specification (OpenGL ES >+Operation) >+ >+ Add to table 2.10 "OpenGL ES Shading Language type tokens" page 64: >+ >+ Type Name Token Keyword >+ ----------------------------------------- ------------ >+ SAMPLER_2D_MULTISAMPLE_ANGLE sampler2DMS >+ INT_SAMPLER_2D_MULTISAMPLE_ANGLE isampler2DMS >+ UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ANGLE usampler2DMS >+ >+ Add to section 2.12.9, after subsection "Texel Fetches": >+ >+ Multisample Texel Fetches >+ >+ Multisample buffers do not have mipmaps, and there is no level of >+ detail parameter for multisample texel fetches. Instead, an integer >+ parameter selects the sample number to be fetched from the buffer. >+ The number identifying the sample is the same as the value used to >+ query the sample location using GetMultisamplefvANGLE. Multisample >+ textures are not filtered when samples are fetched, and filter state >+ is ignored. >+ >+ If the context was created with robust buffer access enabled, the result >+ of the texel fetch in the following cases is zero. If robust buffer >+ access is not enabled, the result of the texel fetch is undefined if >+ any of the following conditions hold: >+ >+ * the texel coordinate (i, j) refer to a texel outside the extents >+ of the multisample texture image, where any of >+ i < 0 i >= W >+ j < 0 j >= H >+ and the size parameter W and H refer to the width and height of >+ the image. >+ >+ * the specified sample number does not exist (is negative, or greater >+ than or equal to the number of samples in the texture). >+ >+ Additionally, these fetches may only be performed on a multisample >+ texture sampler. No other sample or fetch commands may be performed >+ on a multisample texture sampler. >+ >+Additions to Chapter 3 of the OpenGL ES 3.0.5 Specification (Rasterization) >+ >+ Insert into section 3.3, "Multisampling" after the discussion of >+ the query for SAMPLES: >+ >+ (..., and is queried by calling GetIntegerv with pname set to SAMPLES.) >+ >+ The location at which shading is performed for a given sample (the >+ shading sample location) is queried with the command >+ >+ void GetMultisamplefvANGLE(enum pname, uint index, float *val); >+ >+ <pname> must be SAMPLE_POSITION_ANGLE, and <index> corresponds to the >+ sample for which the location should be returned. The shading sample >+ location (x, y) is returned as two floating-point values in (val[0], >+ val[1]) respectively. x and y each lie in the range [0, 1] and >+ represent a location in pixel space at which depth and associated >+ data for that sample are evaluated for a fragment (e.g. where sample >+ shading is performed). (0.5, 0.5) thus corresponds to the pixel center. >+ If the multisample mode does not have fixed sample locations, the returned >+ values may only reflect the locations of samples within some pixels. >+ >+ An INVALID_ENUM error is generated if <pname> is not SAMPLE_LOCATION. >+ An INVALID_VALUE error is generated if <index> is greater than or equal to >+ the value of SAMPLES. >+ >+ Modify Section 3.8.1, "Texture Objects": >+ >+ (modify first paragraph of section, p. 122, simply adding >+ references to multisample textures) >+ >+ Textures in GL are represented by named objects. The name space for texture >+ objects is the unsigned integers, with zero reserved by the GL to represent >+ the default texture object. The default texture object is bound to each of >+ the TEXTURE_2D, TEXTURE_3D, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, and >+ TEXTURE_2D_MULTISAMPLE_ANGLE targets during context initialization. >+ >+ (modify the last paragraph, p. 123) >+ >+ The texture object name space, including the initial two- and >+ three-dimensional, two-dimensional array, cube map, and two-dimensional >+ multisample texture objects, is shared among all texture units. A texture >+ object may be bound to more than one texture unit simultaneously. After a >+ texture object is bound, any GL operations on that target object affect >+ any other texture units to which the same texture object is bound. >+ >+ Modify Section 3.8.3, "Texture Image Specification" (p. 134): >+ >+ (add the new target to MAX_TEXTURE_SIZE description) >+ >+ In a similar fashion, the maximum allowable width of a texel array >+ for a two-dimensional texture, two-dimensional array texture, >+ or two-dimensional multisample texture, and the maximum allowable >+ height of a two-dimensional texture, two-dimensional array texture, >+ or two-dimensional multisample texture, must be at least 2^(k-lod) >+ for image arrays of level 0 through k, where k is the log base 2 of >+ MAX_TEXTURE_SIZE. >+ >+ Insert new Section 3.8.5, "Multisample Textures". Renumber subsequent >+ sections: >+ >+ In addition to the texture types described in previous sections, an >+ additional type of texture is supported. A multisample texture is >+ similar to a two-dimensional texture, except it contains multiple >+ samples per texel. Multisample textures do not have multiple image >+ levels, and are immutable. >+ >+ The command >+ >+ void TexStorage2DMultisampleANGLE(enum target, sizei samples, >+ int sizedinternalformat, >+ sizei width, sizei height, >+ boolean fixedsamplelocations); >+ >+ establishes the data storage, format, dimensions, and number of samples >+ of a multisample texture's image. <target> must be >+ TEXTURE_2D_MULTISAMPLE_ANGLE. <width> and <height> are the dimensions >+ in texels of the texture. >+ >+ <samples> represents a request for a desired minimum number of samples. >+ Since different implementations may support different sample counts for >+ multisampled textures, the actual number of samples allocated for the >+ texture image is implementation-dependent. However, the resulting value >+ for TEXTURE_SAMPLES_ANGLE is guaranteed to be greater than or equal to >+ <samples> and no more than the next larger sample count supported by the >+ implementation. >+ >+ If <fixedsamplelocations> is TRUE, the image will use identical sample >+ locations and the same number of samples for all texels in the image, >+ and the sample locations will not depend on the sizedinternalformat or >+ size of the image. >+ >+ Upon success, TexStorage2DMultisampleANGLE deletes any existing image >+ for <target> and the contents of texels are undefined. The values of >+ TEXTURE_WIDTH, TEXTURE_HEIGHT, TEXTURE_SAMPLES_ANGLE, >+ TEXTURE_INTERNAL_FORMAT and TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE are >+ set to <width>, <height>, the actual number of samples allocated, >+ <sizedinternalformat>, and <fixedsamplelocations> respectively. >+ >+ When a multisample texture is accessed in a shader, the access takes one >+ vector of integers describing which texel to fetch and an integer >+ corresponding to the sample numbers described in section 3.3 describing >+ which sample within the texel to fetch. No standard sampling instructions >+ are allowed on the multisample texture targets, and no filtering is >+ performed by the fetch. Fetching a sample number less than zero, or >+ greater than or equal to the number of samples in the texture, produces >+ undefined results. >+ >+ An INVALID_ENUM error is generated if target is not >+ TEXTURE_2D_MULTISAMPLE_ANGLE. >+ An INVALID_OPERATION error is generated if zero is bound to <target>. >+ An INVALID_VALUE is generated if <width> or <height> is less than 1. >+ An INVALID_VALUE is generated if <width> or <height> is greater than >+ the value of MAX_TEXTURE_SIZE. >+ An INVALID_VALUE is generated if samples is zero. >+ An INVALID_ENUM error is generated if <sizedinternalformat> is not >+ color-renderable, depth-renderable, or stencil-renderable (as defined >+ in section 4.4.4). >+ An INVALID_ENUM error is generated if <sizedinternalformat> is one of the >+ unsized base internal formats listed in table 3.11. >+ An INVALID_OPERATION is generated if <samples> is greater than the maximum >+ number of samples supported for this <target> and <sizedinternalformat>, >+ The maximum number of samples supported can be determined by calling >+ GetInternalformativ with a <pname> of SAMPLES (see section 6.1.15). >+ An INVALID_OPERATION is generated if the value of TEXTURE_IMMUTABLE_FORMAT >+ for the texture currently bound to <target> on the active texture unit is >+ TRUE. >+ An OUT_OF_MEMORY error is generated if the GL is unable to create a texture >+ image of the requested size. >+ >+ Modify Section 3.8.7, "Texture Parameters": >+ >+ (add TEXTURE_2D_MULTISAMPLE_ANGLE to the texture targets accepted by >+ TexParameter*) >+ >+ <target> is the target, either TEXTURE_2D, TEXTURE_3D, TEXTURE_2D_ARRAY, >+ TEXTURE_CUBE_MAP, or TEXTURE_2D_MULTISAMPLE_ANGLE. >+ >+ Add the following paragraph to the end of Section 3.8.7: >+ >+ An INVALID_ENUM is generated if <target> is TEXTURE_2D_MULTISAMPLE_ANGLE >+ and <pname> is any sampler state from table 6.10. An INVALID_OPERATION >+ error is generated if <target> is TEXTURE_2D_MULTISAMPLE_ANGLE, and >+ <pname> TEXTURE_BASE_LEVEL is set to any value other than zero. >+ >+ Modify Section 3.8.14, "Texture State" (p. 162): >+ >+ (... the compressed flag set to FALSE, and a zero compressed size). >+ >+ Multisample textures also contain an integer identifying the number of >+ samples in each texel, and a boolean indicating whether identical sample >+ locations and number of samples will be used for all texels in the image. >+ >+Additions to Chapter 4 of the OpenGL ES 3.0.5 Specification (Per-Fragment >+Operations and the Framebuffer) >+ >+ Modify Section 4.1.3, "Multisample Fragment Operations" (p. 174): >+ >+ (modify the first paragraph to include SAMPLE_MASK_ANGLE and >+ SAMPLE_MASK_VALUE_ANGLE on the list of values the coverage value is >+ modified based on.) >+ >+ This step modifies fragment alpha and coverage values based on the values >+ of SAMPLE_ALPHA_TO_COVERAGE, SAMPLE_COVERAGE, SAMPLE_COVERAGE_VALUE, >+ SAMPLE_COVERAGE_INVERT, SAMPLE_MASK_ANGLE, and SAMPLE_MASK_VALUE_ANGLE. >+ >+ Add to the end of Section 4.1.3, after the discussion of SAMPLE_COVERAGE: >+ >+ If SAMPLE_MASK_ANGLE is enabled, the fragment coverage is ANDed >+ with the coverage value SAMPLE_MASK_VALUE_ANGLE. >+ >+ The value of SAMPLE_MASK_VALUE_ANGLE is specified using >+ >+ void SampleMaskiANGLE(GLuint maskNumber, GLbitfield mask); >+ >+ with <mask> set to the desired mask for mask word <maskNumber>. Bit B of >+ mask word M corresponds to sample 32*M+B as described in Section 3.3. The >+ sample mask value is queried by calling GetIntegeri_v with <target> set to >+ SAMPLE_MASK_VALUE_ANGLE and the index set to <maskNumber>. >+ >+ An INVALID_VALUE error is generated if <maskNumber> is greater than or >+ equal to the value of MAX_SAMPLE_MASK_WORDS_ANGLE. >+ >+ Modify Section 4.4.2, "Attaching Images to Framebuffer Objects": >+ >+ (the first paragraph of RenderbufferStorageMultisample p. 204) >+ >+ ... If either <width> or <height> is greater than the value of >+ MAX_RENDERBUFFER_SIZE, then the error INVALID_VALUE is generated. If >+ <samples> is greater than the maximum number of samples supported for >+ <sizedinternalformat>, then the error INVALID_OPERATION is generated (see >+ GetInternalformativ in section 6.1.15). If the GL is unable to create >+ a data store of the requested size, the error OUT_OF_MEMORY is generated. >+ >+ (the third paragraph of "Required Renderbuffer Formats" p. 205): >+ >+ Implementations must support creation of renderbuffers in these >+ required formats with up to the value of MAX_SAMPLES multisamples, >+ with the exception that the signed and unsigned integer formats are >+ required only to support creation of renderbuffers with up to the >+ value of MAX_INTEGER_SAMPLES_ANGLE multisamples, which must be at >+ least one. >+ >+ (modify section 4.4.2.4 "Attaching Texture Images to a Framebuffer", >+ describing FrameBufferTexture2D p. 207) >+ >+ If texture is not zero, then texture must either name an existing >+ two-dimensional texture object and textarget must be TEXTURE_2D, texture >+ must name an existing cube map texture and textarget must be one of the >+ cube map face targets from table 3.21, or texture must name an existing >+ multisample texture and textarget must be TEXTURE_2D_MULTISAMPLE_ANGLE. >+ Otherwise, an INVALID_OPERATION error is generated. >+ >+ <level> specifies ... >+ >+ If <textarget> is TEXTURE_2D_MULTISAMPLE_ANGLE, then <level> must be zero. >+ Otherwise, an INVALID_VALUE error is generated. If textarget is one of ... >+ >+ >+ Modify Section 4.4.4.2, "Whole Framebuffer Completeness": >+ >+ (modify the last bullet at the top of p. 215) >+ >+ - The value of RENDERBUFFER_SAMPLES is the same for all attached >+ renderbuffers; the value of TEXTURE_SAMPLES_ANGLE is the same for all >+ attached textures; and, if the attached images are a mix of >+ renderbuffers and textures, the value of RENDERBUFFER_SAMPLES >+ matches the value of TEXTURE_SAMPLES_ANGLE. >+ >+ { FRAMEBUFFER_INCOMPLETE_MULTISAMPLE } >+ >+ (add one more bullet after the last bullet, p. 215) >+ >+ - The value of TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE is the same for all >+ attached textures; and, if the attached images are a mix of renderbuffers >+ and textures, the value of TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE must be >+ TRUE for all attached textures. >+ >+ { FRAMEBUFFER_INCOMPLETE_MULTISAMPLE } >+ >+Additions to Chapter 6 of the OpenGL ES 3.0.5 Specification (State and State >+Requests) >+ >+ Modify Section 6.1.3, "Enumerated Queries": >+ >+ (modify the paragraph describing the <target> parameter of >+ GetTexParameter*) >+ >+ <target> may be one of TEXTURE_2D, TEXTURE_3D, TEXTURE_2D_ARRAY, >+ TEXTURE_CUBE_MAP, or TEXTURE_2D_MULTISAMPLE_ANGLE, indicating the >+ currently bound two-dimensional, three-dimensional, two-dimensional >+ array, cube map, or two-dimensional multisample texture object, >+ respectively. >+ >+ An INVALID_ENUM is generated if <target> is not one of the texture >+ targets described above. >+ An INVALID_ENUM is generated if <pname> is not one of the texture >+ parameters described above. >+ >+ Modify Section 6.1.4 "Texture Queries": >+ >+ (Add the following text to the end of the section) >+ >+ The commands >+ >+ void GetTexLevelParameter{if}vANGLE(enum target, int level, >+ enum pname, T *params ); >+ >+ place information about texture image parameter <pname> for level-of-detail >+ <level> of the specified target into <params>. <pname> must be one of the >+ symbolic values in table 6.11. >+ >+ <target> may be one of TEXTURE_2D, TEXTURE_3D, TEXTURE_2D_ARRAY, one of >+ the cube map face targets from table 3.18, or TEXTURE_2D_MULTISAMPLE_ANGLE, >+ indicating the two- or three-dimensional texture, two-dimensional array >+ texture, one of the six distinct 2D images making up the cube map texture >+ object, or two-dimensional multisample texture. Otherwise an INVALID_ENUM is >+ generated. >+ >+ <level> determines which level-of-detail's state is returned. If <level> >+ is negative or larger than the maximum allowable level-of-detail, then an >+ INVALID_VALUE error is generated. >+ >+ Note that TEXTURE_CUBE_MAP is not a valid <target> parameter for >+ GetTexLevelParameter{if}vANGLE, because it does not specify a particular >+ cube map face. >+ >+ For texture images with uncompressed internal formats, queries of >+ <pname> TEXTURE_RED_TYPE, TEXTURE_GREEN_TYPE, TEXTURE_BLUE_TYPE, >+ TEXTURE_ALPHA_TYPE, and TEXTURE_DEPTH_TYPE return the data type used >+ to store the component. Types NONE, SIGNED_NORMALIZED, UNSIGNED_- >+ NORMALIZED, FLOAT, INT, and UNSIGNED_INT respectively indicate missing, >+ signed normalized fixed-point, unsigned normalized fixed-point, >+ floating-point, signed unnormalized integer, and unsigned unnormalized >+ integer components. Queries of <pname> TEXTURE_RED_SIZE, TEXTURE_GREEN_SIZE, >+ TEXTURE_BLUE_SIZE, TEXTURE_ALPHA_SIZE, TEXTURE_DEPTH_SIZE, >+ TEXTURE_STENCIL_SIZE, and TEXTURE_SHARED_SIZE return the actual resolutions >+ of the stored image components, not the resolutions specified when the image >+ was defined. Invalid <pname> generate an INVALID_ENUM error. >+ >+ For texture images with compressed internal formats, the types returned >+ specify how components are interpreted after decompression, while the >+ resolutions returned specify the component resolution of an uncompressed >+ internal format that produces an image of roughly the same quality as the >+ compressed image in question. Since the quality of the implementation's >+ compression algorithm is likely data-dependent, the returned component sizes >+ should be treated only as rough approximations. >+ >+ Queries of <pname> TEXTURE_INTERNAL_FORMAT, TEXTURE_WIDTH, TEXTURE_HEIGHT, >+ and TEXTURE_DEPTH return the internal format, width, height, and depth, >+ respectively, as specified when the image array was created. >+ >+ Queries of <pname> TEXTURE_SAMPLES_ANGLE, and >+ TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE on multisample textures return the >+ number of samples and whether texture sample fixed locations are enabled, >+ respectively. For non-multisample texture, the default values 0 and TRUE >+ as in new added table 6.11 are returned respectively. >+ >+ Modify Section 6.1.15, "Internal Format Queries": >+ >+ (modify the paragraph describing target as follows, p. 244) >+ >+ <target> indicates the usage of the internalformat, and must be either >+ RENDERBUFFER or TEXTURE_2D_MULTISAMPLE_ANGLE, indicating the renderbuffer, >+ or two-dimensional multisample texture. Otherwise an INVALID_ENUM error >+ is generated. >+ >+ (add the following paragraph after "Querying SAMPLES with a <bufSize> >+ ...") >+ >+ The maximum value of SAMPLES is guaranteed to be at least the lowest of >+ the value of MAX_INTEGER_SAMPLES_ANGLE if internal format is a signed or >+ unsigned integer format, the value of MAX_DEPTH_TEXTURE_SAMPLES_ANGLE if >+ internalformat is a depth or stencil-renderable format and target is >+ TEXTURE_2D_MULTISAMPLE_ANGLE, the value of MAX_COLOR_TEXTURE_SAMPLES_ANGLE >+ if internal format is a color-renderable format and target is >+ TEXTURE_2D_MULTISAMPLE_ANGLE, or the value of MAX_SAMPLES. >+ >+ (remove the last paragraph on p. 244) >+ "Since multisampling is not supported for signed and unsigned integer >+ internal formats, the value of NUM_SAMPLE_COUNTS will be zero for such >+ formats." >+ >+ (modify to the first paragraph on p. 245) >+ When query every accepted <internalformat> on multisample renderbuffer or >+ texture, the value of NUM_SAMPLE_COUNTS is guaranteed to be at least >+ one, and the maximum value in SAMPLES is guaranteed to be at least the >+ value of MAX_SAMPLES. If <target> does not support multisample (is not >+ multisample renderbuffer or texture), the value of NUM_SAMPLE_COUNTS will >+ be zero for any accepted <internalformat>. >+ >+Errors >+ >+ The error INVALID_VALUE is generated by GetIntegeri_v if <target> is >+ SAMPLE_MASK_VALUE_ANGLE and <index> is greater than or equal to >+ MAX_SAMPLE_MASK_WORDS_ANGLE. >+ >+ The error INVALID_VALUE is generated by SampleMaskiANGLE if <index> is >+ greater than or equal to MAX_SAMPLE_MASK_WORDS_ANGLE. >+ >+ The error INVALID_ENUM is generated by TexStorage2DMultisampleANGLE if >+ <target> is not TEXTURE_2D_MULTISAMPLE_ANGLE. >+ >+ The error INVALID_OPERATION is generated by TexStorage2DMultisampleANGLE >+ if zero is bound to <target>. >+ >+ The error INVALID_VALUE is generated by TexStorage2DMultisampleANGLE if >+ <width> or <height> is less than 1 or greater than the value of >+ MAX_TEXTURE_SIZE. >+ >+ The error INVALID_VALUE is generated by TexStorage2DMultisampleANGLE if >+ <samples> is zero. >+ >+ The error INVALID_ENUM is generated by TexStorage2DMultisampleANGLE if >+ <sizedinternalformat> is not color-renderable, depth-renderable, or >+ stencil-renderable (as defined >+ in section 4.4.4). >+ >+ The error INVALID_ENUM is generated by TexStorage2DMultisampleANGLE if >+ <sizedinternalformat> is one of the unsized base internal formats listed >+ in table 3.11. >+ >+ The error INVALID_OPERATION is generated by TexStorage2DMultisampleANGLE >+ if <samples> is greater than the maximum number of samples supported for >+ this <target> and <sizedinternalformat>, The maximum number of samples >+ supported can be determined by calling GetInternalformativ with a <pname> >+ of SAMPLES (see section 6.1.15). >+ >+ The error INVALID_OPERATION is generated by TexStorage2DMultisampleANGLE >+ if the value of TEXTURE_IMMUTABLE_FORMAT for the texture currently bound >+ to <target> on the active texture unit is TRUE. >+ >+ The error OUT_OF_MEMORY is generated by TexStorage2DMultisampleANGLE >+ if the GL is unable to create a texture image of the requested size. >+ >+ The error INVALID_ENUM is generated by GetMultisamplefvANGLE if <pname> >+ is not SAMPLE_POSITION_ANGLE. >+ >+ The error INVALID_VALUE is generated by GetMultisamplefvANGLE if <index> >+ is greater than or equal to the value of SAMPLES. >+ >+ The error INVALID_OPERATION is generated by RenderbufferStorageMultisample >+ if <sizedinternalformat> is a signed or unsigned integer format and >+ <samples> is greater than the value of MAX_INTEGER_SAMPLES_ANGLE. >+ >+ The error INVALID_OPERATION is generated by TexParameter* if <target> is >+ TEXTURE_2D_MULTISAMPLE_ANGLE, <pname> is TEXTURE_BASE_LEVEL, and <value> >+ is not zero. >+ >+ The error INVALID_OPERATION is generated by TexParameter* if <target> is >+ TEXTURE_2D_MULTISAMPLE_ANGLE and <pname> is sampler state value from table >+ 6.10. >+ >+ The error INVALID_ENUM is generated by GetTexLevelParameter{if}vANGLE >+ if <target> is not one of TEXTURE_2D, TEXTURE_3D, TEXTURE_2D_ARRAY, one of >+ the cube map face targets from table 3.18, or TEXTURE_2D_MULTISAMPLE_ANGLE. >+ >+ The error INVALID_VALUE is generated by GetTexLevelParameter{if}vANGLE >+ if <level> is negative or larger than the maximum allowable level-of-detail. >+ >+ The error INVALID_ENUM is generated by GetTexLevelParameter{if}vANGLE >+ if <value> is not one of TEXTURE_RED_TYPE, TEXTURE_GREEN_TYPE, >+ TEXTURE_BLUE_TYPE, TEXTURE_ALPHA_TYPE, TEXTURE_DEPTH_TYPE, >+ TEXTURE_DEPTH_SIZE, TEXTURE_STENCIL_SIZE, TEXTURE_SHARED_SIZE, >+ TEXTURE_SAMPLES_ANGLE, TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE, TEXTURE_WIDTH, >+ TEXTURE_HEIGHT, TEXTURE_DEPTH, TEXTURE_INTERNAL_FORMAT, TEXTURE_RED_SIZE, >+ TEXTURE_GREEN_SIZE, TEXTURE_BLUE_SIZE, TEXTURE_ALPHA_SIZE, >+ or TEXTURE_COMPRESSED. >+ >+New State >+ >+ (add to table 6.7, Multisampling p. 252) >+ >+ Initial >+ Get Value Type Get Command Value Description Sec. >+ --------- ---- ----------- ------- ---------------------- ----- >+ SAMPLE_MASK_ANGLE B IsEnabled FALSE Additional sample mask 4.1.3 >+ SAMPLE_MASK_VALUE_ANGLE nxZ+ GetIntegeri_v ~0 Additional sample mask value 4.1.3 >+ >+ Where n is the number of sample mask words (the value of >+ MAX_SAMPLE_MASK_WORDS_ANGLE) the implementation supports. >+ >+ (add to table 6.8, Textures (selector, state per texture unit) p. 253) >+ >+ Initial >+ Get Value Type Get Command Value Description Sec. >+ ------------------------------------ ---- ----------- ------ --------------------------- ----- >+ TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE 32*xZ+ GetIntegerv 0 Texture object bound to 3.8.1 >+ TEXTURE_2D_MULTISAMPLE_ANGLE >+ >+ (add new table 6.10, Textures (state per texture image), renumber subsequent tables) >+ >+ Initial >+ Get Value Type Get Command Value Description Sec. >+ ---------------------- ---- ------------------- ------ --------------------------- ------ >+ TEXTURE_SAMPLES_ANGLE Z+ GetTexLevelParameterANGLE 0 Number of samples per texel 3.8.5 >+ TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE B GetTexLevelParameterANGLE TRUE Whether the image uses a 3.8.5 >+ fixed sample pattern >+ >+ TEXTURE_WIDTH Z+ GetTexLevelParameterANGLE 0 Specified width 3.8 >+ TEXTURE_HEIGHT Z+ GetTexLevelParameterANGLE 0 Specified height (2D/3D) 3.8 >+ TEXTURE_DEPTH Z+ GetTexLevelParameterANGLE 0 Specified depth (3D) 3.8 >+ TEXTURE_INTERNAL_FORMAT E GetTexLevelParameterANGLE RGBA Internal format 3.8 >+ or R8 (see section 3.8.14) >+ TEXTURE_x_SIZE 6xZ+ GetTexLevelParameterANGLE 0 Component resolution (x is 3.8 >+ RED, GREEN, BLUE, ALPHA, >+ DEPTH, or STENCIL) >+ TEXTURE_SHARED_SIZE Z+ GetTexLevelParameterANGLE 0 Shared exponent field 3.8 >+ resolution >+ TEXTURE_x_TYPE E GetTexLevelParameterANGLE NONE Component type (x is RED, 6.1.4 >+ GREEN, BLUE, ALPHA, or >+ DEPTH) >+ TEXTURE_COMPRESSED B GetTexLevelParameterANGLE FALSE True if image has a 3.8.6 >+ compressed internal format >+ >+ (add to table 6.35, Framebuffer dependent Values, p. 280) >+ >+ Initial >+ Get Value Type Get Command Value Description Sec. >+ ------------------ ---------- ------------------ -------------- --------------- ------ >+ SAMPLE_POSITION_ANGLE N*2*R[0,1] GetMultisamplefvANGLE implementation Explicit sample 3.3.1 >+ dependent positions >+ >+ Where N is the number of samples (the value of SAMPLES) the framebuffer supports. >+ >+New Implementation Dependent State >+ >+ Minimum >+ Get Value Type Get Command Value Description Sec. >+ --------- ------- ----------- ------- ------------------------ ------ >+ MAX_SAMPLE_MASK_WORDS_ANGLE Z+ GetIntegerv 1 maximum number of sample 4.1.3 >+ mask words >+ MAX_COLOR_TEXTURE_SAMPLES_ANGLE Z+ GetIntegerv 1 maximum number of samples 4.1.3 >+ in a color multisample >+ texture >+ MAX_DEPTH_TEXTURE_SAMPLES_ANGLE Z+ GetIntegerv 1 maximum number of samples 4.1.3 >+ in a depth/stencil >+ multisample texture >+ MAX_INTEGER_SAMPLES_ANGLE Z+ GetIntegerv 1 Maximum number of samples 4.4.2 >+ in integer format >+ multisample buffers >+ >+Modifications to the OpenGL ES Shading Language Specification, Version 3.00, >+Document Revision 6 >+ >+ Including the following line in a shader can be used to control the >+ language featured described in this extension: >+ >+ #extension GL_ANGLE_texture_multisample : <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_texture_multisample 1 >+ >+ Add to section 3.8 "Keywords": >+ >+ The following new sampler types are added: >+ >+ sampler2DMS, isampler2DMS, usampler2DMS, >+ >+ Add to section 4.1 "Basic Types": >+ >+ Add the following sampler type to the "Floating Point Sampler >+ Types (opaque)" table: >+ >+ sampler2DMS handle for accessing a 2D multisample texture >+ >+ Add the following sampler type to the "Unsigned Integer Sampler >+ Types (opaque)" table: >+ >+ usampler2DMS handle for accessing an unsigned integer 2D >+ multisample texture >+ >+ Add the following sampler type to the "Integer Sampler Types" table: >+ >+ isampler2DMS handle for accessing an integer 2D >+ multisample texture >+ >+ Add to section 8.8 "Texture Lookup Functions": >+ >+ Add new functions to the set of allowed texture lookup functions: >+ >+ Syntax: >+ >+ gvec4 texelFetch(gsampler2DMS sampler, ivec2 P, int sample) >+ >+ Description: >+ >+ Use integer texture coordinate <P> to lookup a single sample >+ <sample> on the texture bound to <sampler> as described in section >+ 2.12.9.3 of the OpenGL ES specification "Multisample Texel Fetches". >+ >+ Syntax: >+ >+ ivec2 textureSize(gsampler2DMS sampler) >+ >+ Description: >+ >+ Returns the dimensions, width and height of level 0 for the >+ texture bound to <sampler>, as described in section 2.12.9.4 of >+ the OpenGL ES specification section "Texture Size Query". >+ >+Examples >+ >+Issues >+ None >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- -------- ---------- -------------------------------------------- >+ 1 08/27/18 Yunchao He First revision. Adapted from OpenGL ES >+ specification 3.1, OpenGLSL ES specification >+ 3.10 at document revision 4, and >+ ARB_texture_multisample at revision 12. >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_texture_usage.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_texture_usage.txt >new file mode 100644 >index 00000000000..17936538f7d >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_texture_usage.txt >@@ -0,0 +1,202 @@ >+Name >+ >+ ANGLE_texture_usage >+ >+Name Strings >+ >+ GL_ANGLE_texture_usage >+ >+Contributors >+ >+ Nicolas Capens, TransGaming >+ Daniel Koch, TransGaming >+ >+Contact >+ >+ Daniel Koch, TransGaming (daniel 'at' transgaming.com) >+ >+Status >+ >+ Complete >+ >+Version >+ >+ Last Modified Date: November 10, 2011 >+ Version: 2 >+ >+Number >+ >+ OpenGL ES Extension #112 >+ >+Dependencies >+ >+ This extension is written against the OpenGL ES 2.0 Specification. >+ >+Overview >+ >+ In some implementations it is advantageous to know the expected >+ usage of a texture before the backing storage for it is allocated. >+ This can help to inform the implementation's choice of format >+ and type of memory used for the allocation. If the usage is not >+ known in advance, the implementation essentially has to make a >+ guess as to how it will be used. If it is later proven wrong, >+ it may need to perform costly re-allocations and/or reformatting >+ of the texture data, resulting in reduced performance. >+ >+ This extension adds a texture usage flag that is specified via >+ the TEXTURE_USAGE_ANGLE TexParameter. This can be used to >+ indicate that the application knows that this texture will be >+ used for rendering. >+ >+IP Status >+ >+ No known IP claims. >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as a value for <pname> for the TexParameter{if} and >+ TexParameter{if}v commands and for the <value> parameter of >+ GetTexParameter{if}v: >+ >+ TEXTURE_USAGE_ANGLE 0x93A2 >+ >+ Accepted as a value to <param> for the TexParameter{if} and >+ to <params> for the TexParameter{if}v commands with a <pname> of >+ TEXTURE_USAGE_ANGLE; returned as possible values for <data> when >+ GetTexParameter{if}v is queried with a <value> of TEXTURE_USAGE_ANGLE: >+ >+ NONE 0x0000 >+ FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 >+ >+Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL ES Operation) >+ >+ None >+ >+Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization) >+ >+ Add a new row to Table 3.10 (Texture parameters and their values): >+ >+ Name | Type | Legal Values >+ ------------------------------------------------------------ >+ TEXTURE_USAGE_ANGLE | enum | NONE, FRAMEBUFFER_ATTACHMENT_ANGLE >+ >+ Add a new section 3.7.x (Texture Usage) before section 3.7.12 and >+ renumber the subsequent sections: >+ >+ "3.7.x Texture Usage >+ >+ Texture usage can be specified via the TEXTURE_USAGE_ANGLE value >+ for the <pname> argument to TexParameter{if}[v]. In order to take effect, >+ the texture usage must be specified before the texture contents are >+ defined either via TexImage2D or TexStorage2DEXT. >+ >+ The usage values can impact the layout and type of memory used for the >+ texture data. Specifying incorrect usage values may result in reduced >+ functionality and/or significantly degraded performance. >+ >+ Possible values for <params> when <pname> is TEXTURE_USAGE_ANGLE are: >+ >+ NONE - the default. No particular usage has been specified and it is >+ up to the implementation to determine the usage of the texture. >+ Leaving the usage unspecified means that the implementation may >+ have to reallocate the texture data as the texture is used in >+ various ways. >+ >+ FRAMEBUFFER_ATTACHMENT_ANGLE - this texture will be attached to a >+ framebuffer object and used as a desination for rendering or blits." >+ >+ Modify section 3.7.12 (Texture State) and place the last 3 sentences >+ with the following: >+ >+ "Next, there are the three sets of texture properties; each consists of >+ the selected minification and magnification filters, the wrap modes for >+ <s> and <t>, and the usage flags. In the initial state, the value assigned >+ to TEXTURE_MIN_FILTER is NEAREST_MIPMAP_LINEAR, and the value for >+ TEXTURE_MAG_FILTER is LINEAR. <s> and <t> wrap modes are both set to >+ REPEAT. The initial value for TEXTURE_USAGE_ANGLE is NONE." >+ >+ >+Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment >+Operations and the Framebuffer) >+ >+ None >+ >+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 >+ >+Dependencies on EXT_texture_storage >+ >+ If EXT_texture_storage is not supported, omit any references to >+ TexStorage2DEXT. >+ >+Errors >+ >+ If TexParameter{if} or TexParamter{if}v is called with a <pname> >+ of TEXTURE_USAGE_ANGLE and the value of <param> or <params> is not >+ NONE or FRAMEBUFFER_ATTACHMENT_ANGLE the error INVALID_VALUE is >+ generated. >+ >+Usage Example >+ >+ /* create and bind texture */ >+ glGenTextures(1, &texture); >+ glActiveTexture(GL_TEXTURE0); >+ glBindTexture(GL_TEXTURE_2D, texture); >+ >+ /* specify texture parameters */ >+ glTexParameteri(GL_TEXTURE_2D, GL_*, ...); /* as before */ >+ >+ /* specify that we'll be rendering to the texture */ >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE); >+ >+ glTexStorage2DEXT(GL_TEXTURE_2D, levels, ...); // Allocation >+ for(int level = 0; level < levels; ++level) >+ glTexSubImage2D(GL_TEXTURE_2D, level, ...); // Initialisation >+ >+Issues >+ >+ 1. Should there be a dynamic usage value? >+ >+ DISCUSSION: We could accept a dynamic flag to indicate that a texture will >+ be updated frequently. We could map this to D3D9 dynamic textures. This would >+ allow us to avoid creating temporary surfaces when updating the texture. >+ However renderable textures cannot be dynamic in D3D9, which eliminates the >+ primary use case for this. Furthermore, the memory usage of dynamic textures >+ typically increases threefold when you lock it. >+ >+ 2. Should the texture usage be an enum or a bitfield? >+ >+ UNRESOLVED. Using a bitfield would allow combination of values to be specified. >+ On the other hand, if combinations are really required, additional <pnames> >+ could be added as necessary. Querying a bitfield via the GetTexParameter command >+ feels a bit odd. >+ >+ 3. What should happen if TEXTURE_USAGE_ANGLE is set/changed after the texture >+ contents have been specified? >+ >+ RESOLVED: It will have no effect. However, if the texture is redefined (for >+ example by TexImage2D) the new allocation will use the updated usage. >+ GetTexParameter is used to query the value of the TEXTURE_USAGE_ANGLE >+ state that was last set by TexParameter for the currently bound texture, or >+ the default value if it has never been set. There is no way to determine the >+ usage that was in effect at the time the texture was defined. >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ----------- --------- ---------------------------------------- >+ 1 10 Nov 2011 dgkoch Initial revision >+ 2 10 Nov 2011 dgkoch Add overview >+ >+ >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_timer_query.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_timer_query.txt >new file mode 100644 >index 00000000000..c1371ad8bb2 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_timer_query.txt >@@ -0,0 +1,591 @@ >+Name >+ >+ ANGLE_timer_query >+ >+Name Strings >+ >+ GL_ANGLE_timer_query >+ >+Contributors >+ >+ Contributors to ARB_occlusion_query >+ Contributors to EXT_timer_query >+ Contributors to ARB_timer_query >+ Ben Vanik, Google Inc. >+ Daniel Koch, TransGaming Inc. >+ >+Contact >+ >+ Ben Vanik, Google Inc. (benvanik 'at' google 'dot' com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Last Modified Date: Apr 28, 2011 >+ Author Revision: 1 >+ >+Number >+ >+ OpenGL ES Extension #?? >+ >+Dependencies >+ >+ OpenGL ES 2.0 is required. >+ >+ The extension is written against the OpenGL ES 2.0 specification. >+ >+Overview >+ >+ Applications can benefit from accurate timing information in a number of >+ different ways. During application development, timing information can >+ help identify application or driver bottlenecks. At run time, >+ applications can use timing information to dynamically adjust the amount >+ of detail in a scene to achieve constant frame rates. OpenGL >+ implementations have historically provided little to no useful timing >+ information. Applications can get some idea of timing by reading timers >+ on the CPU, but these timers are not synchronized with the graphics >+ rendering pipeline. Reading a CPU timer does not guarantee the completion >+ of a potentially large amount of graphics work accumulated before the >+ timer is read, and will thus produce wildly inaccurate results. >+ glFinish() can be used to determine when previous rendering commands have >+ been completed, but will idle the graphics pipeline and adversely affect >+ application performance. >+ >+ This extension provides a query mechanism that can be used to determine >+ the amount of time it takes to fully complete a set of GL commands, and >+ without stalling the rendering pipeline. It uses the query object >+ mechanisms first introduced in the occlusion query extension, which allow >+ time intervals to be polled asynchronously by the application. >+ >+IP Status >+ >+ No known IP claims. >+ >+New Procedures and Functions >+ >+ void GenQueriesANGLE(sizei n, uint *ids); >+ void DeleteQueriesANGLE(sizei n, const uint *ids); >+ boolean IsQueryANGLE(uint id); >+ void BeginQueryANGLE(enum target, uint id); >+ void EndQueryANGLE(enum target); >+ void QueryCounterANGLE(uint id, enum target); >+ void GetQueryivANGLE(enum target, enum pname, int *params); >+ void GetQueryObjectivANGLE(uint id, enum pname, int *params); >+ void GetQueryObjectuivANGLE(uint id, enum pname, uint *params); >+ void GetQueryObjecti64vANGLE(uint id, enum pname, int64 *params); >+ void GetQueryObjectui64vANGLE(uint id, enum pname, uint64 *params); >+ >+New Tokens >+ >+ Accepted by the <pname> parameter of GetQueryivANGLE: >+ >+ QUERY_COUNTER_BITS_ANGLE 0x8864 >+ CURRENT_QUERY_ANGLE 0x8865 >+ >+ Accepted by the <pname> parameter of GetQueryObjectivANGLE, >+ GetQueryObjectuivANGLE, GetQueryObjecti64vANGLE, and >+ GetQueryObjectui64vANGLE: >+ >+ QUERY_RESULT_ANGLE 0x8866 >+ QUERY_RESULT_AVAILABLE_ANGLE 0x8867 >+ >+ Accepted by the <target> parameter of BeginQueryANGLE, EndQueryANGLE, and >+ GetQueryivANGLE: >+ >+ TIME_ELAPSED_ANGLE 0x88BF >+ >+ Accepted by the <target> parameter of GetQueryivANGLE and >+ QueryCounterANGLE: >+ >+ TIMESTAMP_ANGLE 0x8E28 >+ >+Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL ES Operation) >+ >+ (Modify table 2.1, Correspondence of command suffix letters to GL argument) >+ Add two new types: >+ >+ Letter Corresponding GL Type >+ ------ --------------------- >+ i64 int64ANGLE >+ ui64 uint64ANGLE >+ >+ (Modify table 2.2, GL data types) Add two new types: >+ >+ GL Type Minimum Bit Width Description >+ ------- ----------------- ----------------------------- >+ int64ANGLE 64 Signed 2's complement integer >+ uint64ANGLE 64 Unsigned binary integer >+ >+Additions to Chapter 5 of the OpenGL ES 2.0 Specification (Special Functions) >+ >+ Add a new section 5.3 "Timer Queries": >+ >+ "5.3 Timer Queries >+ >+ Timer queries use query objects to track the amount of time needed to >+ fully complete a set of GL commands, or to determine the current time >+ of the GL. >+ >+ Timer queries are associated with query objects. The command >+ >+ void GenQueriesANGLE(sizei n, uint *ids); >+ >+ returns <n> previously unused query object names in <ids>. These >+ names are marked as used, but no object is associated with them until >+ the first time they are used by BeginQueryANGLE. Query objects contain >+ one piece of state, an integer result value. This result value is >+ initialized to zero when the object is created. Any positive integer >+ except for zero (which is reserved for the GL) is a valid query >+ object name. >+ >+ Query objects are deleted by calling >+ >+ void DeleteQueriesANGLE(sizei n, const uint *ids); >+ >+ <ids> contains <n> names of query objects to be deleted. After a >+ query object is deleted, its name is again unused. Unused names in >+ <ids> are silently ignored. >+ If an active query object is deleted its name immediately becomes unused, >+ but the underlying object is not deleted until it is no longer active. >+ >+ A timer query can be started and finished by calling >+ >+ void BeginQueryANGLE(enum target, uint id); >+ void EndQueryANGLE(enum target); >+ >+ where <target> is TIME_ELAPSED_ANGLE. If BeginQueryANGLE is called >+ with an unused <id>, that name is marked as used and associated with >+ a new query object. >+ >+ If BeginQueryANGLE is called with an <id> of zero, if the active query >+ object name for <target> is non-zero, if <id> is the name of an existing >+ query object whose type does not match <target>, or if <id> is the active >+ query object name for any query type, the error INVALID_OPERATION is >+ generated. If EndQueryANGLE is called while no query with the same target >+ is in progress, an INVALID_OPERATION error is generated. >+ >+ When BeginQueryANGLE and EndQueryANGLE are called with a <target> of >+ TIME_ELAPSED_ANGLE, the GL prepares to start and stop the timer used for >+ timer queries. The timer is started or stopped when the effects from all >+ previous commands on the GL client and server state and the framebuffer >+ have been fully realized. The BeginQueryANGLE and EndQueryANGLE commands >+ may return before the timer is actually started or stopped. When the timer >+ query timer is finally stopped, the elapsed time (in nanoseconds) is >+ written to the corresponding query object as the query result value, and >+ the query result for that object is marked as available. >+ >+ If the elapsed time overflows the number of bits, <n>, available to hold >+ elapsed time, its value becomes undefined. It is recommended, but not >+ required, that implementations handle this overflow case by saturating at >+ 2^n - 1. >+ >+ The necessary state is a single bit indicating whether an timer >+ query is active, the identifier of the currently active timer >+ query, and a counter keeping track of the time that has passed. >+ >+ When the command >+ >+ void QueryCounterANGLE(uint id, enum target); >+ >+ is called with <target> TIMESTAMP_ANGLE, the GL records the current time >+ into the corresponding query object. The time is recorded after all >+ previous commands on the GL client and server state and the framebuffer >+ have been fully realized. When the time is recorded, the query result for >+ that object is marked available. QueryCounterANGLE timer queries can be >+ used within a BeginQueryANGLE / EndQueryANGLE block where the <target> is >+ TIME_ELAPSED_ANGLE and it does not affect the result of that query object. >+ The error INVALID_OPERATION is generated if the <id> is already in use >+ within a BeginQueryANGLE/EndQueryANGLE block." >+ >+Additions to Chapter 6 of the OpenGL ES 2.0 Specification (State and State >+Requests) >+ >+ Add a new section 6.1.9 "Timer Queries": >+ >+ "The command >+ >+ boolean IsQueryANGLE(uint id); >+ >+ returns TRUE if <id> is the name of a query object. If <id> is zero, >+ or if <id> is a non-zero value that is not the name of a query >+ object, IsQueryANGLE returns FALSE. >+ >+ Information about a query target can be queried with the command >+ >+ void GetQueryivANGLE(enum target, enum pname, int *params); >+ >+ <target> identifies the query target and can be TIME_ELAPSED_ANGLE or >+ TIMESTAMP_ANGLE for timer queries. >+ >+ If <pname> is CURRENT_QUERY_ANGLE, the name of the currently active query >+ for <target>, or zero if no query is active, will be placed in <params>. >+ >+ If <pname> is QUERY_COUNTER_BITS_ANGLE, the implementation-dependent number >+ of bits used to hold the query result for <target> will be placed in >+ <params>. The number of query counter bits may be zero, in which case >+ the counter contains no useful information. >+ >+ For timer queries (TIME_ELAPSED_ANGLE and TIMESTAMP_ANGLE), if the number >+ of bits is non-zero, the minimum number of bits allowed is 30 which >+ will allow at least 1 second of timing. >+ >+ The state of a query object can be queried with the commands >+ >+ void GetQueryObjectivANGLE(uint id, enum pname, int *params); >+ void GetQueryObjectuivANGLE(uint id, enum pname, uint *params); >+ void GetQueryObjecti64vANGLE(uint id, enum pname, int64 *params); >+ void GetQueryObjectui64vANGLE(uint id, enum pname, uint64 *params); >+ >+ If <id> is not the name of a query object, or if the query object >+ named by <id> is currently active, then an INVALID_OPERATION error is >+ generated. >+ >+ If <pname> is QUERY_RESULT_ANGLE, then the query object's result >+ value is returned as a single integer in <params>. If the value is so >+ large in magnitude that it cannot be represented with the requested type, >+ then the nearest value representable using the requested type is >+ returned. If the number of query counter bits for target is zero, then >+ the result is returned as a single integer with the value zero. >+ >+ There may be an indeterminate delay before the above query returns. If >+ <pname> is QUERY_RESULT_AVAILABLE_ANGLE, FALSE is returned if such a delay >+ would be required; otherwise TRUE is returned. It must always be true >+ that if any query object returns a result available of TRUE, all queries >+ of the same type issued prior to that query must also return TRUE. >+ >+ Querying the state for a given timer query forces that timer query to >+ complete within a finite amount of time. >+ >+ If multiple queries are issued on the same target and id prior to >+ calling GetQueryObject[u]i[64]vANGLE, the result returned will always be >+ from the last query issued. The results from any queries before the >+ last one will be lost if the results are not retrieved before starting >+ a new query on the same <target> and <id>." >+ >+Errors >+ >+ The error INVALID_VALUE is generated if GenQueriesANGLE is called where >+ <n> is negative. >+ >+ The error INVALID_VALUE is generated if DeleteQueriesANGLE is called >+ where <n> is negative. >+ >+ The error INVALID_OPERATION is generated if BeginQueryANGLE is called >+ when a query of the given <target> is already active. >+ >+ The error INVALID_OPERATION is generated if EndQueryANGLE is called >+ when a query of the given <target> is not active. >+ >+ The error INVALID_OPERATION is generated if BeginQueryANGLE is called >+ where <id> is zero. >+ >+ The error INVALID_OPERATION is generated if BeginQueryANGLE is called >+ where <id> is the name of a query currently in progress. >+ >+ The error INVALID_OPERATION is generated if BeginQueryANGLE is called >+ where <id> is the name of an existing query object whose type does not >+ match <target>. >+ >+ The error INVALID_ENUM is generated if BeginQueryANGLE or EndQueryANGLE >+ is called where <target> is not TIME_ELAPSED_ANGLE. >+ >+ The error INVALID_ENUM is generated if GetQueryivANGLE is called where >+ <target> is not TIME_ELAPSED_ANGLE or TIMESTAMP_ANGLE. >+ >+ The error INVALID_ENUM is generated if GetQueryivANGLE is called where >+ <pname> is not QUERY_COUNTER_BITS_ANGLE or CURRENT_QUERY_ANGLE. >+ >+ The error INVALID_ENUM is generated if QueryCounterANGLE is called where >+ <target> is not TIMESTAMP_ANGLE. >+ >+ The error INVALID_OPERATION is generated if QueryCounterANGLE is called >+ on a query object that is already in use inside a >+ BeginQueryANGLE/EndQueryANGLE. >+ >+ The error INVALID_OPERATION is generated if GetQueryObjectivANGLE, >+ GetQueryObjectuivANGLE, GetQueryObjecti64vANGLE, or >+ GetQueryObjectui64vANGLE is called where <id> is not the name of a query >+ object. >+ >+ The error INVALID_OPERATION is generated if GetQueryObjectivANGLE, >+ GetQueryObjectuivANGLE, GetQueryObjecti64vANGLE, or >+ GetQueryObjectui64vANGLE is called where <id> is the name of a currently >+ active query object. >+ >+ The error INVALID_ENUM is generated if GetQueryObjectivANGLE, >+ GetQueryObjectuivANGLE, GetQueryObjecti64vANGLE, or >+ GetQueryObjectui64vANGLE is called where <pname> is not >+ QUERY_RESULT_ANGLE or QUERY_RESULT_AVAILABLE_ANGLE. >+ >+New State >+ >+ (Add a new table 6.xx, "Query Operations") >+ >+ Get Value Type Get Command Initial Value Description Sec >+ --------- ---- ----------- ------------- ----------- ------ >+ - B - FALSE query active 5.3 >+ CURRENT_QUERY_ANGLE Z+ GetQueryivANGLE 0 active query ID 5.3 >+ QUERY_RESULT_ANGLE Z+ GetQueryObjectuivANGLE, 0 samples-passed count 5.3 >+ GetQueryObjectui64vANGLE >+ QUERY_RESULT_AVAILABLE_ANGLE B GetQueryObjectivANGLE FALSE query result available 5.3 >+ >+New Implementation Dependent State >+ >+ (Add the following entry to table 6.18): >+ >+ Get Value Type Get Command Minimum Value Description Sec >+ -------------------------- ---- ----------- ------------- ---------------- ------ >+ QUERY_COUNTER_BITS_ANGLE Z+ GetQueryivANGLE see 6.1.9 Number of bits in 6.1.9 >+ query counter >+ >+Examples >+ >+ (1) Here is some rough sample code that demonstrates the intended usage >+ of this extension. >+ >+ GLint queries[N]; >+ GLint available = 0; >+ // timer queries can contain more than 32 bits of data, so always >+ // query them using the 64 bit types to avoid overflow >+ GLuint64ANGLE timeElapsed = 0; >+ >+ // Create a query object. >+ glGenQueriesANGLE(N, queries); >+ >+ // Start query 1 >+ glBeginQueryANGLE(GL_TIME_ELAPSED_ANGLE, queries[0]); >+ >+ // Draw object 1 >+ .... >+ >+ // End query 1 >+ glEndQueryANGLE(GL_TIME_ELAPSED_ANGLE); >+ >+ ... >+ >+ // Start query N >+ glBeginQueryANGLE(GL_TIME_ELAPSED_ANGLE, queries[N-1]); >+ >+ // Draw object N >+ .... >+ >+ // End query N >+ glEndQueryANGLE(GL_TIME_ELAPSED_ANGLE); >+ >+ // Wait for all results to become available >+ while (!available) { >+ glGetQueryObjectivANGLE(queries[N-1], GL_QUERY_RESULT_AVAILABLE_ANGLE, &available); >+ } >+ >+ for (i = 0; i < N; i++) { >+ // See how much time the rendering of object i took in nanoseconds. >+ glGetQueryObjectui64vANGLE(queries[i], GL_QUERY_RESULT_ANGLE, &timeElapsed); >+ >+ // Do something useful with the time. Note that care should be >+ // taken to use all significant bits of the result, not just the >+ // least significant 32 bits. >+ AdjustObjectLODBasedOnDrawTime(i, timeElapsed); >+ } >+ >+ This example is sub-optimal in that it stalls at the end of every >+ frame to wait for query results. Ideally, the collection of results >+ would be delayed one frame to minimize the amount of time spent >+ waiting for the GPU to finish rendering. >+ >+ (2) This example is basically the same as the example above but uses >+ QueryCounter instead. >+ >+ GLint queries[N+1]; >+ GLint available = 0; >+ // timer queries can contain more than 32 bits of data, so always >+ // query them using the 64 bit types to avoid overflow >+ GLuint64ANGLE timeStart, timeEnd, timeElapsed = 0; >+ >+ // Create a query object. >+ glGenQueriesANGLE(N+1, queries); >+ >+ // Query current timestamp 1 >+ glQueryCounterANGLE(queries[0], GL_TIMESTAMP_ANGLE); >+ >+ // Draw object 1 >+ .... >+ >+ // Query current timestamp N >+ glQueryCounterANGLE(queries[N-1], GL_TIMESTAMP_ANGLE); >+ >+ // Draw object N >+ .... >+ >+ // Query current timestamp N+1 >+ glQueryCounterANGLE(queries[N], GL_TIMESTAMP_ANGLE); >+ >+ // Wait for all results to become available >+ while (!available) { >+ glGetQueryObjectivANGLE(queries[N], GL_QUERY_RESULT_AVAILABLE_ANGLE, &available); >+ } >+ >+ for (i = 0; i < N; i++) { >+ // See how much time the rendering of object i took in nanoseconds. >+ glGetQueryObjectui64vANGLE(queries[i], GL_QUERY_RESULT_ANGLE, &timeStart); >+ glGetQueryObjectui64vANGLE(queries[i+1], GL_QUERY_RESULT_ANGLE, &timeEnd); >+ timeElapsed = timeEnd - timeStart; >+ >+ // Do something useful with the time. Note that care should be >+ // taken to use all significant bits of the result, not just the >+ // least significant 32 bits. >+ AdjustObjectLODBasedOnDrawTime(i, timeElapsed); >+ } >+ >+Issues from EXT_timer_query >+ >+ (1) What time interval is being measured? >+ >+ RESOLVED: The timer starts when all commands prior to BeginQuery() have >+ been fully executed. At that point, everything that should be drawn by >+ those commands has been written to the framebuffer. The timer stops >+ when all commands prior to EndQuery() have been fully executed. >+ >+ (2) What unit of time will time intervals be returned in? >+ >+ RESOLVED: Nanoseconds (10^-9 seconds). This unit of measurement allows >+ for reasonably accurate timing of even small blocks of rendering >+ commands. The granularity of the timer is implementation-dependent. A >+ 32-bit query counter can express intervals of up to approximately 4 >+ seconds. >+ >+ (3) What should be the minimum number of counter bits for timer queries? >+ >+ RESOLVED: 30 bits, which will allow timing sections that take up to 1 >+ second to render. >+ >+ (4) How are counter results of more than 32 bits returned? >+ >+ RESOLVED: Via two new datatypes, int64ANGLE and uint64ANGLE, and their >+ corresponding GetQueryObject entry points. These types hold integer >+ values and have a minimum bit width of 64. >+ >+ (5) Should the extension measure total time elapsed between the full >+ completion of the BeginQuery and EndQuery commands, or just time >+ spent in the graphics library? >+ >+ RESOLVED: This extension will measure the total time elapsed between >+ the full completion of these commands. Future extensions may implement >+ a query to determine time elapsed at different stages of the graphics >+ pipeline. >+ >+ (6) If multiple query types are supported, can multiple query types be >+ active simultaneously? >+ >+ RESOLVED: Yes; an application may perform a timer query and another >+ type of query simultaneously. An application can not perform multiple >+ timer queries or multiple queries of other types simultaneously. An >+ application also can not use the same query object for another query >+ and a timer query simultaneously. >+ >+ (7) Do query objects have a query type permanently associated with them? >+ >+ RESOLVED: No. A single query object can be used to perform different >+ types of queries, but not at the same time. >+ >+ Having a fixed type for each query object simplifies some aspects of the >+ implementation -- not having to deal with queries with different result >+ sizes, for example. It would also mean that BeginQuery() with a query >+ object of the "wrong" type would result in an INVALID_OPERATION error. >+ >+ UPDATE: This resolution was relevant for EXT_timer_query and OpenGL 2.0. >+ Since EXT_transform_feedback has since been incorporated into the core, >+ the resolution is that BeginQuery will generate error INVALID_OPERATION >+ if <id> represents a query object of a different type. >+ >+ (8) How predictable/repeatable are the results returned by the timer >+ query? >+ >+ RESOLVED: In general, the amount of time needed to render the same >+ primitives should be fairly constant. But there may be many other >+ system issues (e.g., context switching on the CPU and GPU, virtual >+ memory page faults, memory cache behavior on the CPU and GPU) that can >+ cause times to vary wildly. >+ >+ Note that modern GPUs are generally highly pipelined, and may be >+ processing different primitives in different pipeline stages >+ simultaneously. In this extension, the timers start and stop when the >+ BeginQuery/EndQuery commands reach the bottom of the rendering pipeline. >+ What that means is that by the time the timer starts, the GL driver on >+ the CPU may have started work on GL commands issued after BeginQuery, >+ and the higher pipeline stages (e.g., vertex transformation) may have >+ started as well. >+ >+ (9) What should the new 64 bit integer type be called? >+ >+ RESOLVED: The new types will be called GLint64ANGLE/GLuint64ANGLE. The new >+ command suffixes will be i64 and ui64. These names clearly convey the >+ minimum size of the types. These types are similar to the C99 standard >+ type int_least64_t, but we use names similar to the C99 optional type >+ int64_t for simplicity. >+ >+Issues from ARB_timer_query >+ >+ (10) What about tile-based implementations? The effects of a command are >+ not complete until the frame is completely rendered. Timing recorded >+ before the frame is complete may not be what developers expect. Also >+ the amount of time needed to render the same primitives is not >+ consistent, which conflicts with issue (8) above. The time depends on >+ how early or late in the scene it is placed. >+ >+ RESOLVED: The current language supports tile-based rendering okay as it >+ is written. Developers are warned that using timers on tile-based >+ implementation may not produce results they expect since rendering is not >+ done in a linear order. Timing results are calculated when the frame is >+ completed and may depend on how early or late in the scene it is placed. >+ >+ (11) Can the GL implementation use different clocks to implement the >+ TIME_ELAPSED and TIMESTAMP queries? >+ >+ RESOLVED: Yes, the implemenation can use different internal clocks to >+ implement TIME_ELAPSED and TIMESTAMP. If different clocks are >+ used it is possible there is a slight discrepancy when comparing queries >+ made from TIME_ELAPSED and TIMESTAMP; they may have slight >+ differences when both are used to measure the same sequence. However, this >+ is unlikely to affect real applications since comparing the two queries is >+ not expected to be useful. >+ >+Issues >+ >+ (12) What should we call this extension? >+ >+ RESOLVED: ANGLE_timer_query >+ >+ (13) Why is this done as a separate extension instead of just supporting >+ ARB_timer_query? >+ >+ ARB_timer_query is written against OpenGL 3.2, which includes a lot of >+ the required support for dealing with query objects. None of these >+ functions or tokens exist in OpenGL ES, and as such have to be added in >+ this specification. >+ >+ (14) How does this extension differ from ARB_timer_query? >+ >+ This extension contains most ARB_timer_query behavior unchanged as well >+ as a subset of the query support required to use it from the core >+ OpenGL 3.2 spec. It omits the glGetInteger(TIMESTAMP) functionality used to >+ query the current time on the GPU, but the behavior for all remaining >+ functionality taken from ARB_timer_query is the same. >+ >+ (15) Are query objects shareable between multiple contexts? >+ >+ RESOLVED: No. Query objects are lightweight and we normally share >+ large data across contexts. Also, being able to share query objects >+ across contexts is not particularly useful. In order to do the async >+ query across contexts, a query on one context would have to be finished >+ before the other context could query it. >+ >+Revision History >+ >+ Revision 1, 2011/04/28 >+ - copied from revision 9 of ARB_timer_query and revision 7 of >+ ARB_occlusion_query >+ - removed language that was clearly not relevant to ES2 >+ - rebased changes against the OpenGL ES 2.0 specification >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_translated_shader_source.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_translated_shader_source.txt >new file mode 100644 >index 00000000000..69161156fc5 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_translated_shader_source.txt >@@ -0,0 +1,118 @@ >+Name >+ >+ ANGLE_translated_shader_source >+ >+Name Strings >+ >+ GL_ANGLE_translated_shader_source >+ >+Contributors >+ >+ Daniel Koch, TransGaming Inc. >+ Gregg Tavares, Google Inc. >+ Kenneth Russell, Google Inc. >+ Zhenyao Mo, Google Inc. >+ >+Contact >+ >+ Zhenyao Mo, Google Inc. (zmo 'at' google 'dot' com) >+ >+Status >+ >+ Implemented in ANGLE ES2 >+ >+Version >+ >+ Last Modified Date: October 5, 2011 >+ Author Revision: 2 >+ >+Number >+ >+ OpenGL ES Extension #113 >+ >+Dependencies >+ >+ OpenGL ES 2.0 is required. >+ >+ The extension is written against the OpenGL ES 2.0 specification. >+ >+Overview >+ >+ WebGL uses the GLSL ES 2.0 spec on all platforms, and translates these >+ shaders to the host platform's native language (HLSL, GLSL, and even GLSL >+ ES). For debugging purposes, it is useful to be able to examine the shader >+ after translation. >+ >+ This extension addes a new function to query the translated shader source, >+ and adds a new enum for GetShaderiv's <pname> parameter to query the >+ translated shader source length. >+ >+IP Status >+ >+ No known IP claims. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ void GetTranslatedShaderSourceANGLE(uint shader, sizei bufsize, >+ sizei* length, char* source); >+ >+New Tokens >+ >+ Accepted by the <pname> parameter of GetShaderiv: >+ >+ TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 >+ >+Additions to Chapter 6 of the OpenGL ES 2.0 Specification (State and State >+Requests) >+ >+ Append in the end of the fourth paragraph of section 6.1.8 (Shader and >+ Program Queries): >+ >+ " If <pname> is TRANSLATED_SHADER_LENGTH_ANGLE, the length of the translated >+ source string, including a null terminator, is returned. If no source has >+ been defined, CompileShader has not been called, or the translation has >+ failed for <shader>, zero is returned." >+ >+ Append after the last paragraph of section 6.1.8 (Shader and Program >+ Queries): >+ >+ "The command >+ >+ void GetTranslatedShaderSourceANGLE( uint shader, sizei bufSize, >+ sizei *length, char *source ); >+ >+ returns in <source> the string making up the translated source code for >+ the shader object <shader>. The string <source> will be null terminated. >+ The actual number of characters written into <source>, excluding the null >+ terminator, is returned in <length>. If <length> is NULL, no length is >+ returned. The maximum number of characters that may be written into >+ <source>, including the null terminator, is speciï¬ed by <bufSize>. The >+ string <source> is the translated string of a concatenation of the strings >+ passed to the GL using ShaderSource. The length of this translated string >+ is given by TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, which can be queried >+ with GetShaderiv. >+ >+ If no source has been defined, CompileShader has not been called, or the >+ translation has failed for <shader>, zero is returned for <length>, and >+ an empty string is returned for <source>. >+ >+ If the value of SHADER_COMPILER is not TRUE, then the error INVALID_- >+ OPERATION is generated." >+ >+Issues >+ >+ 1) What enum value should be used for TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE? >+ >+ RESOLVED: The first draft used a temporary enum value. This been replaced >+ with a enum allocated from the ANGLE range of GL enums. >+ >+Revision History >+ >+ Revision 1, 2011/09/29, zmo >+ - first draft >+ Revision 2, 2011/10/05, dgkoch >+ - assigned enum >diff --git a/Source/ThirdParty/ANGLE/extensions/ANGLE_webgl_compatibility.txt b/Source/ThirdParty/ANGLE/extensions/ANGLE_webgl_compatibility.txt >new file mode 100644 >index 00000000000..cc013136fea >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/ANGLE_webgl_compatibility.txt >@@ -0,0 +1,81 @@ >+Name >+ >+ ANGLE_webgl_compatibility >+ >+Name Strings >+ >+ GL_ANGLE_webgl_compatibility >+ >+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 2, November 28, 2016 >+ >+Number >+ >+ OpenGL ES Extension #?? >+ >+Dependencies >+ >+ Requires OpenGL ES 2.0 >+ >+ Written against the OpenGL ES 2.0 specification. >+ >+ Interacts with EGL_ANGLE_create_context_webgl_compatibility (or equivalent) >+ extension. >+ >+Overview >+ >+ With this extension enabled, the OpenGL ES context will have additional >+ features and validation to be compatible with the WebGL specification. >+ >+New Procedures and Functions >+ >+ None >+ >+ >+New Tokens >+ >+ None >+ >+Additions to the OpenGL ES Specification >+ >+ Additional validation will be performed according to the the sections of >+ the WebGL specification entitled "Differences Between WebGL and OpenGL ES >+ 2.0" and "Differences Between WebGL and OpenGL ES 3.0". >+ >+New State >+ >+ None >+ >+Conformance Tests >+ >+ TBD >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------- --------- ---------------------------------------- >+ 1 Sept 16, 2016 geofflang Initial version >+ 2 Nov 28, 2016 geofflang Break the extension requests into a >+ separate extension. >diff --git a/Source/ThirdParty/ANGLE/extensions/CHROMIUM_bind_generates_resource.txt b/Source/ThirdParty/ANGLE/extensions/CHROMIUM_bind_generates_resource.txt >new file mode 100644 >index 00000000000..498acad1fdb >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/CHROMIUM_bind_generates_resource.txt >@@ -0,0 +1,118 @@ >+Name >+ >+ CHROMIUM_bind_generates_resource >+ >+Name Strings >+ >+ GL_CHROMIUM_bind_generates_resource >+ >+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, September 19, 2016 >+ >+Number >+ >+ OpenGL ES Extension #?? >+ >+Dependencies >+ >+ Requires OpenGL ES 2.0 >+ >+ Written against the OpenGL ES 2.0 specification. >+ >+Overview >+ >+ This extension allows the user to control the behaviour when binding an >+ object that has not been generated. This functionality is useful to >+ notify the user of potential use-after-free errors or support other APIs >+ such as WebGL on top of an OpenGL ES context. >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted by the <cap> parameter to IsEnabled and the <pname> parameter to >+ GetBooleanv, GetIntegerv, GetFloatv, and GetInteger64v: >+ >+ BIND_GENERATES_RESOURCE_CHROMIUM 0x9244 >+ >+Additions to the OpenGL ES Specification >+ >+ Add to the end of Section 2.9 "Buffer Objects": >+ >+ If BIND_GENERATES_RESOURCE_CHROMIUM is false, BindBuffer fails and an >+ INVALID_OPERATION error is generated if buffer is not zero or a name >+ returned from a previous call to GenBuffers, or if such a name has since >+ been deleted with DeleteBuffers. >+ >+ Add to the end of Section 3.7.13 "Texture Objects": >+ >+ If BIND_GENERATES_RESOURCE_CHROMIUM is false, BindTexture fails and an >+ INVALID_OPERATION error is generated if texture is not zero or a name >+ returned from a previous call to GenTextures, or if such a name has since >+ been deleted with DeleteTextures. >+ >+ Add to the end of Section 4.4.1 "Binding and Managing Framebuffer Objects": >+ >+ If BIND_GENERATES_RESOURCE_CHROMIUM is false, BindFramebuffer fails and an >+ INVALID_OPERATION error is generated if framebuffer is not zero or a name >+ returned from a previous call to GenFramebuffers, or if such a name has >+ since been deleted with DeleteFramebuffers. >+ >+ Add to the end of Section 4.4.3 "Renderbuffer Objects": >+ >+ If BIND_GENERATES_RESOURCE_CHROMIUM is false, BindRenderbuffer fails and an >+ INVALID_OPERATION error is generated if renderbuffer is not zero or a name >+ returned from a previous call to GenRenderbuffers, or if such a name has >+ since been deleted with DeleteRenderbuffers. >+ >+New State >+ >+ Modify Table 6.22, Miscellaneous >+ >+ Add: >+ >+ Initial >+ Get Value Type Get Command Value Description >+ ----------------------- ---- ----------- ------- -------------- >+ BIND_GENERATES_RESOURCE_CHROMIUM B IsEnabled TRUE Bind generates >+ new resources >+ >+Conformance Tests >+ >+ TBD >+ >+Issues >+ >+ (1) Should the BIND_GENERATES_RESOURCE_CHROMIUM state be enabled at context >+ creation time or dynamically through the Enable and Disable functions? >+ >+ RESOLOVED: BIND_GENERATES_RESOURCE_CHROMIUM is initialized by a context >+ creation attribute and cannot be modified. One of the major use cases of >+ this extension is to back WebGL contexts and the end user should not be >+ allowed to modify this state. >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------- --------- ---------------------------------------- >+ 1 Sept 19, 2016 geofflang Initial version >diff --git a/Source/ThirdParty/ANGLE/extensions/CHROMIUM_bind_uniform_location.txt b/Source/ThirdParty/ANGLE/extensions/CHROMIUM_bind_uniform_location.txt >new file mode 100644 >index 00000000000..33187af3217 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/CHROMIUM_bind_uniform_location.txt >@@ -0,0 +1,141 @@ >+Name >+ >+ CHROMIUM_bind_uniform_location >+ >+Name Strings >+ >+ GL_CHROMIUM_bind_uniform_location >+ >+Version >+ >+ Last Modifed Date: September 8, 2015 >+ >+Dependencies >+ >+ OpenGL ES 2.0 is required. >+ >+Overview >+ >+ This extension is simlar to glBindAttribLocation but instead >+ lets you choose a location for a uniform. This allows you >+ to not have to query the locations of uniforms. >+ >+ This allows the client program to know the locations of uniforms >+ without having to wait for shaders to compile or GLSL programs to >+ link to query the locations and therefore have no blocking calls >+ when initializing programs. >+ >+Issues >+ >+ If a uniform is an array you can only call glBindUniformLocation >+ for the location of the first element. Other elements' locations >+ must be queried if you need them. Often this is not an issue >+ because you can set all the elements with a single gl call from >+ the first location. >+ >+ Good Example: >+ >+ --shader-- >+ uniform float u_someArray[4]; >+ >+ --C-- >+ GLint location = 123; >+ glBindUniformLocation(program, location, "u_someArray"); >+ glLinkProgram(program); >+ glUseProgram(program); >+ >+ // set all 4 floats in u_someArray >+ float values[] = { 0.1f, 0.2f, 0.3f, 0.4f, }; >+ glUniform1fv(location, 4, values); >+ >+ Bad example 1: >+ >+ GLint location = 123; >+ glBindUniformLocation(program, location, "u_someArray"); >+ glLinkProgram(program); >+ glUseProgram(program); >+ >+ // set floats in u_someArray one at a time >+ glUniform1f(location, 0.1f); >+ glUniform1f(location + 1, 0.2f); // ERROR! math not allowed on locations >+ >+ Bad example 2: >+ >+ GLint location0 = 123; >+ GLint location1 = 124; >+ glBindUniformLocation(program, location0, "u_someArray[0]"); >+ glBindUniformLocation(program, location1, "u_someArray[1]"); // ERROR! >+ // not allowed to assign locations to array elements >+ >+ If you need to set individual elements of a uniform array you must query the >+ location of the each element you wish to set. >+ >+ If a uniform has its location explicitly set within the shader text and a >+ different location set via the API, the assignment in the shader text is >+ used. >+ >+ If the location of a statically used uniform set via the API conflicts with >+ the location of a different uniform set in the shader text, linking must >+ fail. >+ >+New Tokens >+ >+ None >+ >+New Procedures and Functions >+ >+ void BindUniformLocationCHROMIUM (GLuint program, GLint location, >+ const GLhchar* name); >+ >+ specifes that the uniform variable named <name> in program <program> >+ should be bound to uniform location <location> when the program is next >+ linked. If <name> was bound previously, its assigned binding is replaced >+ with <location>. <name> must be a null terminated string. The error >+ INVALID_VALUE is generated if <location> is equal or greater than >+ >+ (MAX_VERTEX_UNIFORM_VECTORS + MAX_FRAGMENT_UNIFORM_VECTORS) * 4 >+ >+ or less than 0. BindUniformLocation has no effect until the program is >+ linked. In particular, it doesn't modify the bindings of uniform >+ variables in a program that has already been linked. >+ >+ The error INVALID_OPERATION is generated if name starts with the reserved >+ "gl_" prefix. The error INVALID_VALUE is generated if name ends with >+ an array element expression other than "[0]". >+ >+ When a program is linked, any active uniforms without a binding specified >+ through BindUniformLocation will be automatically be bound to locations by >+ the GL. Such bindings can be queried using the command >+ GetUniformLocation. >+ >+ BindUniformLocation may be issued before any shader objects are attached >+ to a program object. Hence it is allowed to bind any name (except a name >+ starting with "gl_") to an index, including a name that is never used as a >+ uniform in any shader object. Assigned bindings for uniform variables >+ that do not exist or are not active are ignored. Using such bindings >+ behaves as if passed location was -1. >+ >+ It is possible for an application to bind more than one uniform name to >+ the same location. This is referred to as aliasing. This will only work >+ if only one of the aliased uniforms is statically used in the executable >+ program. If two statically used uniforms in a program are bound to the same >+ location, link must fail. >+ >+Errors >+ >+ None. >+ >+New State >+ >+ None. >+ >+Revision History >+ >+ 7/20/2012 Documented the extension >+ 9/8/2015 Require program link to fail if two statically used uniforms >+ are bound to the same location. >+ 11/6/2015 Require inactive and non-existing, bound uniform locations >+ to behave like location -1. >+ 3/9/2017 Locations set in the shader override ones set by the binding >+ API. >+ 3/26/2018 Clarify that aliasing rules apply to statically used uniforms. >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/extensions/CHROMIUM_compressed_copy_texture.txt b/Source/ThirdParty/ANGLE/extensions/CHROMIUM_compressed_copy_texture.txt >new file mode 100644 >index 00000000000..a2cfb2c7620 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/CHROMIUM_compressed_copy_texture.txt >@@ -0,0 +1,88 @@ >+Name >+ >+ CHROMIUM_copy_compressed_texture >+ >+Name Strings >+ >+ GL_CHROMIUM_copy_compressed_texture >+ >+Version >+ >+ Last Modifed Date: August 5, 2015 >+ >+Dependencies >+ >+ OpenGL ES 2.0 is required. >+ >+ GL_AMD_compressed_ATC_texture, GL_ATI_texture_compression_atitc, >+ GL_EXT_texture_compression_dxt1, GL_ANGLE_texture_compression_dxt5, >+ GL_EXT_texture_compression_s3tc and GL_OES_compressed_ETC1_RGB8_texture >+ affects the definition of this extension. >+ >+Overview >+ >+ This extension provides functionality for copying compressed textures. It >+ adds a new function glCompressedCopyTextureCHROMIUM that works similarily >+ to glCopyTextureCHROMIUM, but for compressed textures. >+ >+ Which compressed texture formats that this extension supports depends on >+ the supported texture compression formats of the host GPU. >+ >+Issues >+ >+ glCompressedCopyTextureCHROMIUM will first try to copy into a compressed >+ texture of the same format as the source texture. If unsucessful, the >+ destination texture format will be changed to GL_RGBA and the texture will >+ be stored uncompressed. >+ >+New Procedures and Functions >+ >+ The command >+ >+ void glCompressedCopyTextureCHROMIUM (GLuint source_id, GLuint dest_id) >+ >+ Copies the contents of a compressed texture referred to by <source_id> to >+ <dest_id> texture. >+ >+ Texture level 0 is copied from the source image to level 0 of the >+ destination texture. >+ >+ The internal format of the source texture must be one of the following >+ symbolic constants: GL_ATC_RGB_AMD, GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD, >+ GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, >+ GL_ETC1_RGB8_OES >+ >+ The destination texture will be created or replaced with the same internal >+ format as the source texture. >+ >+ INVALID_OPERATION is generated if internal format of source texture is not >+ one of the valid formats described above. >+ >+ INVALID_OPERATION is generated if destination texture is immutable. >+ >+ INVALID_VALUE is generated if <source_id> or <dest_id> are not valid texture >+ objects. >+ >+ INVALID_VALUE is generated if textures corresponding to <dest_id> have not >+ been bound as GL_TEXTURE_2D object. >+ >+ INVALID_VALUE is generated if level 0 of the source texture is not defined. >+ >+Errors >+ >+ None. >+ >+New Tokens >+ >+ None. >+ >+New State >+ >+ None. >+ >+Revision History >+ >+ 15/6/2015 Documented the extension. >+ 5/8/2015 Added glCompressedCopySubTextureCHROMIUM. >+ 1/6/2016 Remove glCompressedCopySubTextureCHROMIUM. >+ 1/8/2016 Remove <target> argument. >diff --git a/Source/ThirdParty/ANGLE/extensions/CHROMIUM_copy_texture.txt b/Source/ThirdParty/ANGLE/extensions/CHROMIUM_copy_texture.txt >new file mode 100644 >index 00000000000..dfdafc92707 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/CHROMIUM_copy_texture.txt >@@ -0,0 +1,263 @@ >+Name >+ >+ CHROMIUM_copy_texture >+ >+Name Strings >+ >+ GL_CHROMIUM_copy_texture >+ >+Version >+ >+ Last Modifed Date: March 24, 2017 >+ >+Dependencies >+ >+ OpenGL ES 2.0 or OpenGL ES 3.0 is required. >+ >+ EXT_texture_format_BGRA8888 affects the definition of this extension. >+ ARB_texture_rg affects the definition of this extension. >+ CHROMIUM_ycbcr_422_image affects the definition of this extension. >+ >+Overview >+ >+ This extension expands on the functionality provided by the >+ glCopyTexImage2D command. A new function is exported, >+ glCopyTextureCHROMIUM, that performs the same copy operation as >+ glCopyTexImage2D. >+ >+ The extension also supports copying BGRA textures and copying >+ EXTERNAL_OES texture to BGRA texture, which is not explicitly >+ granted by EXT_texture_format_BGRA8888. >+ >+New Procedures and Functions >+ >+ void CopyTextureCHROMIUM(uint sourceId, >+ int sourceLevel, >+ enum destTarget, >+ uint destId, >+ int destLevel, >+ int internalFormat, >+ enum destType, >+ boolean unpackFlipY, >+ boolean unpackPremultiplyAlpha, >+ boolean unpackUnmultiplyAlpha) >+ >+ >+ void CopySubTextureCHROMIUM(uint sourceId, >+ int sourceLevel, >+ enum destTarget, >+ uint destId, >+ int destLevel, >+ int xoffset, >+ int yoffset, >+ int x, >+ int y, >+ sizei width, >+ sizei height, >+ boolean unpackFlipY, >+ boolean unpackPremultiplyAlpha, >+ boolean unpackUnmultiplyAlpha) >+ >+Additions to the OpenGL ES 2.0 Specification >+ >+ The command >+ >+ CopyTextureCHROMIUM >+ >+ Copies the contents of <sourceLevel> level of <sourceId> texture to >+ <destLevel> level and <destTarget> target of <destId> texture. >+ >+ <destTarget> must be TEXTURE_2D, >+ TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_X, >+ TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_NEGATIVE_Y, >+ TEXTURE_CUBE_MAP_POSITIVE_Z, TEXTURE_CUBE_MAP_NEGATIVE_Z, >+ TEXTURE_RECTANGLE_ARB. >+ >+ The internal format of the destination texture is converted to that >+ specified by <internalFormat>. >+ >+ When source texture doens't contain a superset of the component >+ required by <internalFormat>, fill the components by following rules. >+ >+ source format color components >+ ---------------------------------------- >+ ALPHA (0, 0, 0, A) >+ RED (R, 0, 0, 1) >+ LUMINANCE (L, L, L, 1) >+ LUMINANCE_ALPHA (L, L, L, A) >+ RGB (R, G, B, 1) >+ RGB8 (R, G, B, 1) >+ RGBA (R, G, B, A) >+ RGBA8 (R, G, B, A) >+ BGRA_EXT (R, G, B, A) >+ BGRA8_EXT (R, G, B, A) >+ RGB_YCBCR_420V_CHROMIUM (R, G, B, 1) >+ RGB_YCBCR_422_CHROMIUM (R, G, B, 1) >+ >+ The format type of the destination texture is converted to that specified >+ by <destType>. >+ >+ If <flipY> is true, vertically flip texture image data. >+ >+ If <unpackPremultiplyAlpha> and <unpackUnmultiplyAlpha> are true, >+ no alpha processing occurs. This is the equivalent of having neither flag >+ set. >+ >+ When <sourceId> refers to a stream texture, the texture matrix will be >+ applied as part of the copy operation. >+ >+ INVALID_OPERATION is generated if <internalFormat> is not one of the >+ formats in Table 1.0. >+ >+ INVALID_OPERATION is generated if the internal format of <sourceId> is not >+ one of formats in Table 1.1. >+ >+ INVALID_VALUE is generated if <sourceId> or <destId> are not valid texture >+ objects. >+ >+ INVALID_ENUM is generated if <destTarget> is not one of the valid targets >+ described above. >+ >+ INVALID_OPERATION is generated if the bound target of destination texture >+ does not match <target>. >+ >+ INVALID_VALUE is generated if textures corresponding to <destId> have not >+ been bound as TEXTURE_2D, TEXTURE_CUBE_MAP, or >+ TEXTURE_RECTANGLE_ARB objects. >+ >+ INVALID_VALUE is generated if textures corresponding to <sourceId> have not >+ been bound as TEXTURE_2D, TEXTURE_RECTANGLE_ARB or >+ TEXTURE_EXTERNAL_OES objects. >+ >+ INVALID_VALUE is generated if <sourceLevel> is not 0 for ES 2.0, or if >+ <sourceLevel> or <destLevel> is less than 0 for ES 3.0. >+ >+ INVALID_VALUE is generated if <sourceLevel> of the source texture is not >+ defined. >+ >+ The command >+ >+ CopySubTextureCHROMIUM >+ >+ Copies the sub contents of texture referred to by <sourceId> to <destId> >+ texture without redefining <destId> texture. >+ >+ See CopyTextureCHROMIUM for the interpretation of the <destTarget>, >+ <sourceLevel>, <destLevel>, <flipY>, <premultiplyAlpha>, and >+ <unmultiplyAlpha> arguments. >+ >+ <xoffset> and <yoffset> specify a texel offset in the x and y direction >+ respectively within the destination texture. >+ >+ <x> and <y> specify specify a texel offset in the x and y direction >+ respectively within the source texture. >+ >+ <width> specifies the width of the texture subimage. >+ >+ <height> specifies the width of the texture subimage. >+ >+ INVALID_VALUE is generated if either <sourceId> texture or <destId> >+ texture is not defined. >+ >+ INVALID_OPERATION is generated if the internal format of <sourceId> or >+ <destId> is not one of formats in Table 1.1. >+ >+ INVALID_OPERATION is generated if the destination texture array has not >+ been defined. >+ >+ INVALID_VALUE is generated if <destId> texture is not bound as >+ TEXTURE_2D or TEXTURE_RECTANGLE_ARB. >+ >+ INVALID_VALUE is generated if level 0 of the source texture or >+ the destination texture is not defined. >+ >+ INVALID_VALUE is generated if (<xoffset> + <width>) > destWidth, >+ or (<yoffset> + <height>) > destHeight. >+ >+ Table 1.0 Valid internal formats for CopyTextureCHROMIUM: >+ >+ <internalFormat> >+ --------------- >+ RGB >+ RGBA >+ RGB8 >+ RGBA8 >+ BGRA_EXT >+ BGRA8_EXT >+ SRGB_EXT >+ SRGB_ALPHA_EXT >+ R8 >+ R8UI >+ RG8 >+ RG8UI >+ SRGB8 >+ RGB565 >+ RGB8UI >+ SRGB8_ALPHA8 >+ RGB5_A1 >+ RGBA4 >+ RGBA8UI >+ RGB9_E5 >+ R16F >+ R32F >+ RG16F >+ RG32F >+ RGB16F >+ RGB32F >+ RGBA16F >+ RGBA32F >+ R11F_G11F_B10F >+ >+ Table 1.1 Valid source texture internal formats for CopyTextureCHROMIUM and >+ source and destination formats for CopySubTextureCHROMIUM: >+ >+ internal format >+ --------------- >+ RED >+ ALPHA >+ LUMINANCE >+ LUMINANCE_ALPHA >+ RGB >+ RGBA >+ RGB8 >+ RGBA8 >+ BGRA_EXT >+ BGRA8_EXT >+ RGB_YCBCR_420V_CHROMIUM >+ RGB_YCBCR_422_CHROMIUM >+ >+Dependencies on ARB_texture_rg >+ >+ If ARB_texture_rg is not supported: >+ * delete any reference to the R8 format. >+ >+Dependencies on CHROMIUM_ycbcr_422_image >+ >+ If CHROMIUM_ycbcr_422_image is not supported: >+ * delete any reference to the RGB_YCBCR_422_CHROMIUM format. >+ >+Errors >+ >+ None. >+ >+New Tokens >+ >+ None. >+ >+New State >+ >+ None. >+ >+Revision History >+ >+ 8/1/2011 Documented the extension >+ 7/4/2013 Add a new parameter dest_type to glCopyTextureCHROMIUM() >+ 16/7/2014 Add TEXTURE_RECTANGLE_ARB as valid source_id target >+ 19/6/2015 Add arguments unpack_flip_y, unpack_premultiply_alpha, and >+ unpack_unmultiply_alpha to both commands. >+ 4/1/2016 Removed the argument target. >+ 4/1/2016 Added TEXTURE_RECTANGLE_ARB as valid dest_id target. >+ 19/12/2016 Supported more ES 3.0 formats. >+ 18/1/2017 Supported source_level and dest_level. >+ 19/1/2017 Added TEXTURE_CUBE_MAP as valid dest_id target. >+ 24/3/2017 Clean up naming and move formats into tables. >diff --git a/Source/ThirdParty/ANGLE/extensions/CHROMIUM_sync_query.txt b/Source/ThirdParty/ANGLE/extensions/CHROMIUM_sync_query.txt >new file mode 100644 >index 00000000000..98763d0a383 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/CHROMIUM_sync_query.txt >@@ -0,0 +1,53 @@ >+Name >+ >+ CHROMIUM_sync_query >+ >+Name Strings >+ >+ GL_CHROMIUM_sync_query >+ >+Version >+ >+ Last Modifed Date: April 15, 2014 >+ >+Dependencies >+ >+ OpenGL ES 2.0 is required. >+ >+ EXT_occlusion_query_boolean is required. >+ >+Overview >+ >+ This extension provides a query mechanism that allow for synchronization >+ between the host CPU and the GPU, which may be accessing the same >+ resources (typically memory). >+ >+ This extension is useful in conjunction with CHROMIUM_map_image to >+ determine when it is safe to access a mapped image. Once the result of >+ a COMMANDS_COMPLETED_CHROMIUM query is available, all drawing commands >+ issued before the query must have finished. This ensures that the memory >+ corresponding to the issued commands can be safely modified (assuming no >+ other outstanding drawing commands are issued subsequent to the query). >+ >+New Procedures and Functions >+ >+ None. >+ >+Errors >+ >+ None. >+ >+New Tokens >+ >+ Accepted by the <target> parameter of BeginQueryEXT, EndQueryEXT, >+ and GetQueryivEXT: >+ >+ COMMANDS_COMPLETED_CHROMIUM 0x84F7 >+ >+New State >+ >+ None. >+ >+Revision History >+ >+ 4/15/2014 Documented the extension >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_create_context_client_arrays.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_create_context_client_arrays.txt >new file mode 100644 >index 00000000000..994695a5dcf >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_create_context_client_arrays.txt >@@ -0,0 +1,87 @@ >+Name >+ >+ ANGLE_create_context_client_arrays >+ >+Name Strings >+ >+ EGL_ANGLE_create_context_client_arrays >+ >+Contributors >+ >+ Geoff Lang >+ >+Contacts >+ >+ Geoff Lang (geofflang 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, February 13, 2016 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ Requires EGL 1.4. >+ >+ Written against the EGL 1.4 specification. >+ >+ An OpenGL ES implementation supporting GL_ANGLE_client_arrays or equivalent >+ functionality is required. >+ >+Overview >+ >+ This extension allows the creation of an OpenGL or OpenGL ES context that >+ allows or disallows drawing with client-side vertex or index data. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as an attribute name in the <*attrib_list> argument to >+ eglCreateContext: >+ >+ EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE 0x3452 >+ >+Additions to the EGL 1.4 Specification >+ >+ Add the following to section 3.7.1 "Creating Rendering Contexts": >+ >+ EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE indicates whether the context >+ should be created with the GL_CLIENT_ARRAYS_ANGLE state initialized to >+ GL_TRUE or GL_FALSE. The default value of >+ EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE is EGL_FALSE. >+ >+Errors >+ >+ None >+ >+New State >+ >+ None >+ >+Conformance Tests >+ >+ TBD >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------- --------- ---------------------------------------- >+ 1 Feb 13, 2016 geofflang Initial version >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_create_context_extensions_enabled.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_create_context_extensions_enabled.txt >new file mode 100644 >index 00000000000..898559f644c >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_create_context_extensions_enabled.txt >@@ -0,0 +1,88 @@ >+Name >+ >+ ANGLE_create_context_extensions_enabled >+ >+Name Strings >+ >+ EGL_ANGLE_create_context_extensions_enabled >+ >+Contributors >+ >+ Geoff Lang >+ >+Contacts >+ >+ Geoff Lang (geofflang 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, Marchh 14, 2018 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ This extension is written against the wording of the EGL 1.4 >+ Specification. >+ >+ This extension has interactions with >+ EGL_ANGLE_create_context_webgl_compatibility. >+ >+Overview >+ >+ This extension allows the creation of an OpenGL or OpenGL ES context that >+ enables or disables all requestable extensions by default. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as an attribute name in the <*attrib_list> argument to >+ eglCreateContext: >+ >+ EGL_EXTENSIONS_ENABLED_ANGLE 0x345F >+ >+Additions to the EGL 1.4 Specification >+ >+ Add the following to section 3.7.1 "Creating Rendering Contexts": >+ >+ EGL_EXTENSIONS_ENABLED_ANGLE indicates whether the context should be >+ created with all requestable extensions initially enabled or disabled. The >+ default value of EGL_EXTENSIONS_ENABLED_ANGLE is EGL_TRUE. However, if >+ EGL_ANGLE_create_context_webgl_compatibility is also supported and >+ EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE has a value of EGL_TRUE, the default >+ value of EGL_EXTENSIONS_ENABLED_ANGLE is EGL_FALSE. >+ >+Errors >+ >+ None >+ >+New State >+ >+ None >+ >+Conformance Tests >+ >+ TBD >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------- --------- ---------------------------------------- >+ 1 Mar 14, 2018 geofflang Initial version >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_create_context_webgl_compatibility.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_create_context_webgl_compatibility.txt >new file mode 100644 >index 00000000000..4245d6ca732 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_create_context_webgl_compatibility.txt >@@ -0,0 +1,88 @@ >+Name >+ >+ ANGLE_create_context_webgl_compatibility >+ >+Name Strings >+ >+ EGL_ANGLE_create_context_webgl_compatibility >+ >+Contributors >+ >+ Geoff Lang >+ >+Contacts >+ >+ Geoff Lang (geofflang 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, September 16, 2016 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ Requires EGL 1.4. >+ >+ Written against the EGL 1.4 specification. >+ >+ This spec interacts with GL_ANGLE_webgl_compatibility (or equivalent) >+ extension. >+ >+Overview >+ >+ This extension allows the creation of an OpenGL or OpenGL ES context that >+ provides additional WebGL features and validation. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as an attribute name in the <*attrib_list> argument to >+ eglCreateContext: >+ >+ EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE 0x33AC >+ >+Additions to the EGL 1.4 Specification >+ >+ Add the following to section 3.7.1 "Creating Rendering Contexts": >+ >+ EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE indicates whether a WebGL mode should >+ be enabled for the OpenGL ES context. In this mode, the OpenGL ES context >+ will provide additional features and validation to be compatible with the >+ WebGL specification. The default value of >+ EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE is EGL_FALSE. >+ >+Errors >+ >+ None >+ >+New State >+ >+ None >+ >+Conformance Tests >+ >+ TBD >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------- --------- ---------------------------------------- >+ 1 Sept 16, 2016 geofflang Initial version >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_d3d_share_handle_client_buffer.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_d3d_share_handle_client_buffer.txt >new file mode 100644 >index 00000000000..d54eaca66de >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_d3d_share_handle_client_buffer.txt >@@ -0,0 +1,98 @@ >+Name >+ >+ ANGLE_d3d_share_handle_client_buffer >+ >+Name Strings >+ >+ EGL_ANGLE_d3d_share_handle_client_buffer >+ >+Contributors >+ >+ John Bauman >+ Alastair Patrick >+ Daniel Koch >+ >+Contacts >+ >+ John Bauman, Google Inc. (jbauman 'at' chromium.org) >+ >+Status >+ >+ Complete >+ Implemented (ANGLE r650) >+ >+Version >+ >+ Version 3, May 12, 2011 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ Requires the EGL_ANGLE_surface_d3d_texture_2d_share_handle extension. >+ >+ This extension is written against the wording of the EGL 1.4 >+ Specification. >+ >+Overview >+ >+ This extension allows creating EGL surfaces from handles to textures >+ shared from the Direct3D API or from >+ EGL_ANGLE_surface_texture_2d_share_handle. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted in the <buftype> parameter of eglCreatePbufferFromClientBuffer: >+ >+ EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200 >+ >+Additions to Chapter 3 of the EGL 1.4 Specification (EGL Functions and Errors) >+ >+ Replace the last sentence of paragraph 1 of Section 3.5.3 with the >+ following text. >+ "Currently, the only client API resources which may be bound in this >+ fashion are OpenVG VGImage objects and Direct3D share handles." >+ >+ Replace the last sentence of paragraph 2 ("To bind a client API...") of >+ Section 3.5.3 with the following text. >+ "When <buftype> is EGL_OPENVG_IMAGE, the width and height of the pbuffer >+ are determined by the width and height of <buffer>. When <buftype> is >+ EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE, the width and height are specified >+ using EGL_WIDTH and EGL_HEIGHT, or else they default to zero. The width >+ and height must match the dimensions of the texture which the share handle >+ was created from or else an EGL_BAD_ALLOC error is generated." >+ >+ Replace the third paragraph of Section 3.5.3 with the following text. >+ "<buftype> specifies the type of buffer to be bound. The only allowed values >+ of <buftype> are EGL_OPENVG_IMAGE and >+ EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE". >+ >+ Append the following text to the fourth paragraph of Section 3.5.3. >+ "When <buftype> is EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE, <buffer> must be >+ a valid D3D share handle, cast into the type EGLClientBuffer. The handle >+ may be obtained from the Direct3D9Ex CreateTexture function, from DXGI's >+ GetSharedHandle method on an ID3D10Texture2D, or from the >+ EGL_ANGLE_surface_d3d_texture_2d_share_handle extension." >+ >+Issues >+ >+Revision History >+ >+ Version 3, 2011/05/12 >+ - publish >+ >+ Version 2, 2011/05/03 >+ - specify EGL_D3D_TEXTURE_2D_SHARE_HANDLE >+ - specify error if dimensions don't match >+ >+ Version 1, 2011/04/12 - first draft. >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_d3d_texture_client_buffer.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_d3d_texture_client_buffer.txt >new file mode 100644 >index 00000000000..ba102b22480 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_d3d_texture_client_buffer.txt >@@ -0,0 +1,146 @@ >+Name >+ >+ ANGLE_d3d_texture_client_buffer >+ >+Name Strings >+ >+ EGL_ANGLE_d3d_texture_client_buffer >+ >+Contributors >+ >+ Geoff Lang >+ Olli Etuaho >+ Sunny Sachanandani >+ >+Contacts >+ >+ Geoff Lang, Google Inc. (geofflang 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 3, Jan 23, 2018 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ This extension is written against the wording of the EGL 1.5 >+ Specification. >+ >+ References the EGL_ANGLE_device_d3d extension. >+ >+Overview >+ >+ This extension allows creating EGL surfaces from D3D texture objects. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted in the <buftype> parameter of eglCreatePbufferFromClientBuffer: >+ >+ EGL_D3D_TEXTURE_ANGLE 0x33A3 >+ >+Additions to Chapter 3 of the EGL 1.5 Specification (EGL Functions and Errors) >+ >+ Replace the last sentence of paragraph 1 of Section 3.5.3 with the >+ following text. >+ "Currently, the only client API resources which may be bound in this >+ fashion are OpenVG VGImage objects and Direct3D texture objects." >+ >+ Replace the last sentence of paragraph 2 ("To bind a client API...") of >+ Section 3.5.3 with the following text. >+ "When <buftype> is EGL_OPENVG_IMAGE or EGL_D3D_TEXTURE_ANGLE, the width and >+ height of the pbuffer are determined by the width and height of <buffer>." >+ >+ Replace the third paragraph of Section 3.5.3 with the following text. >+ "<buftype> specifies the type of buffer to be bound. The only allowed values >+ of <buftype> are EGL_OPENVG_IMAGE and EGL_D3D_TEXTURE_ANGLE". >+ >+ Append the following text to the fourth paragraph of Section 3.5.3. >+ "When <buftype> is EGL_D3D_TEXTURE_ANGLE, <buffer> must be >+ a valid D3D texture object, cast into the type EGLClientBuffer. See table >+ egl.restrictions for acceptable texture object types and formats. If the >+ EGL_ANGLE_device_d3d extension is present, the provided D3D texture object >+ must have been created by the same D3D device queried from the display. >+ If these requirements are not met, an EGL_BAD_PARAMETER error is >+ generated." >+ >+ --------------------------------------------------------------------------- >+ Resource Type Resource Restrictions >+ --------------------------------------------------------------------------- >+ IDirect3DTexture9 Memory pool must be D3DPOOL_DEFAULT. Format must be >+ D3DFMT_R8G8B8, D3DFMT_A8R8G8B8, D3DFMT_A16B16G16R16F or >+ D3DFMT_A32B32G32R32F. >+ ID3D11Texture2D Usage flags must be D3D11_USAGE_DEFAULT. Format must be >+ DXGI_FORMAT_R8G8B8A8_UNORM, >+ DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, >+ DXGI_FORMAT_B8G8R8A8_UNORM, >+ DXGI_FORMAT_B8G8R8A8_UNORM_SRGB (support is optional), >+ DXGI_FORMAT_R8G8B8A8_TYPELESS (support is optional), >+ DXGI_FORMAT_B8G8R8A8_TYPELESS (support is optional), >+ DXGI_FORMAT_R16G16B16A16_FLOAT, >+ DXGI_FORMAT_R32G32B32A32_FLOAT or >+ DXGI_FORMAT_R10G10B10A2_UNORM. >+ -------------------------------------------------------------------------- >+ Table egl.restrictions - Restrictions on D3D resources that can be used >+ as a <buffer>. >+ -------------------------------------------------------------------------- >+ >+ Append to the fifth paragraph of Section 3.5.3. >+ "In addition, in case buftype is EGL_D3D_TEXTURE_ANGLE and the D3D resource >+ has a typeless DXGI format, attrib_list may contain the attribute >+ EGL_GL_COLORSPACE." >+ >+ Append to the end of Section 3.5.3. >+ "When a pbuffer is created with type EGL_D3D_TEXTURE_ANGLE, the contents >+ of the associcated D3D texture object are undefined while the pbuffer is >+ the current read surface, draw surface or bound to a client texture." >+ >+ Append to the end of Section 3.5.3. >+ "When a pbuffer is created with type EGL_D3D_TEXTURE_ANGLE, and the >+ EGL_GL_COLORSPACE attribute is not specified in attrib_list, the >+ EGL_GL_COLORSPACE attribute of the surface is determined by the DXGI format >+ of the Direct3D texture. For *_SRGB DXGI formats, the value of >+ EGL_GL_COLORSPACE is EGL_GL_COLORSPACE_SRGB. For other formats including >+ *_TYPELESS DXGI formats, the value of EGL_GL_COLORSPACE defaults to >+ EGL_GL_COLORSPACE_LINEAR." >+ >+Issues >+ >+ 1. What renderers allow the use of a multi-sampled texture? >+ >+ PROPOSED: Mutli-sampled texture support is currently limited to D3D11. Additionally, >+ the client is responsible for resolving the texture. >+ >+ 2. How does this extension interact with EXT_sRGB_write_control? >+ >+ If GL_FRAMEBUFFER_SRGB_EXT is disabled and a pbuffer created from a D3D >+ texture with an *_SRGB format is being rendered to, it is undefined whether >+ SRGB conversion will be performed. >+ >+ 3. What renderers allow the use of typeless textures? >+ >+ PROPOSED: Support for typeless textures is currently limited to D3D11. >+ >+Revision History >+ >+ Version 4, 2019/04/15 - added support for DXGI_FORMAT_R10G10B10A2_UNORM. >+ >+ Version 3, 2018/01/23 - added support for typeless textures. >+ >+ Version 2, 2018/01/15 - clarified SRGB conversion handling. >+ >+ Version 1, 2016/10/05 - first draft. >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_device_creation.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_device_creation.txt >new file mode 100644 >index 00000000000..2401a094d17 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_device_creation.txt >@@ -0,0 +1,120 @@ >+Name >+ >+ ANGLE_device_creation >+ >+Name Strings >+ >+ EGL_ANGLE_device_creation >+ >+Contributors >+ >+ Austin Kinross (aukinros 'at' microsoft.com) >+ >+Contact >+ >+ Austin Kinross (aukinros 'at' microsoft.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, Nov 02, 2015 >+ >+Number >+ >+ EGL Extension #XXX >+ >+Extension Type >+ >+ EGL client extension >+ >+Dependencies >+ >+ Requires EGL_EXT_device_query. >+ >+ Written against the wording of EGL 1.5 as modified by EGL_EXT_device_query. >+ >+Overview >+ >+ Increasingly, EGL and its client APIs are being used in place of "native" >+ rendering APIs to implement the basic graphics functionality of native >+ windowing systems. This extension defines a way to create an EGL device >+ which maps to an inputted "native" rendering API device. >+ >+ This extension is intended to be used with EGL_EXT_platform_device to >+ initialize a display using an existing "native" rendering device, but >+ EGL_EXT_platform_device is not required. >+ >+IP Status >+ >+ No known claims. >+ >+New Types >+ >+ None. >+ >+New Procedures and Functions >+ >+ EGLDeviceEXT eglCreateDeviceANGLE(EGLint device_type, >+ void *native_device, >+ cost EGLAttrib *attrib_list) >+ >+ EGLBoolean eglReleaseDeviceANGLE(EGLDeviceEXT device) >+ >+New Tokens >+ >+ None. >+ >+Changes to section 3.2 (Devices) >+ >+ Add the following after the final paragraph to section 3.2 (Devices): >+ >+ To create an EGL device wrapping an existing native rendering device, use: >+ >+ EGLDeviceEXT eglCreateDeviceANGLE(EGLint device_type, >+ void *native_device, >+ cost EGLAttrib *attrib_list); >+ >+ On success, a valid EGLDeviceEXT is returned. On failure, EGL_NO_DEVICE_EXT >+ is returned. >+ >+ An EGL_BAD_ATTRIBUTE error is generated if <device_type> is not a valid >+ device type. This extension defines no valid values for <device_type>. >+ >+ All attribute names in <attrib_list> are immediately followed by the >+ corresponding desired value. The list is terminated with EGL_NONE. The >+ <attrib_list> is considered empty if either <attrib_list> is NULL or if its >+ first element is EGL_NONE. This specification defines no valid attribute >+ names for inclusion in <attrib_list>. If <attrib_list> is not empty then >+ an EGL_BAD_ATTRIBUTE error is generated. >+ >+ If a device is created using eglCreateDeviceANGLE then it is the >+ caller's responsibility to manage the lifetime of the device, and to call >+ eglReleaseDeviceANGLE at an appropriate time. >+ >+ To release a device, use: >+ >+ EGLBoolean eglReleaseDeviceANGLE(EGLDeviceEXT device); >+ >+ On success, EGL_TRUE is returned. On failure, EGL_FALSE is returned. >+ >+ If <device> equals EGL_NO_DEVICE_EXT then an EGL_BAD_DEVICE_EXT error is >+ generated. If <device> is not a valid device then the behavior is undefined. >+ >+ <device> must have been created using eglGetDeviceANGLE. If <device> was >+ obtained by other means, such as through eglQueryDisplayAttribEXT, then an >+ EGL_BAD_DEVICE_EXT error is generated. >+ >+ If eglReleaseDeviceANGLE is called on a device that is still in use by other >+ EGL objects, then the resulting behavior of those objects is undefined. >+ >+Issues >+ >+ None. >+ >+Revision History >+ >+ Version 1, Nov 2, 2015 (Austin Kinross) >+ - Initial Draft >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_device_creation_d3d11.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_device_creation_d3d11.txt >new file mode 100644 >index 00000000000..6f25f53b10b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_device_creation_d3d11.txt >@@ -0,0 +1,92 @@ >+Name >+ >+ ANGLE_device_creation_d3d11 >+ >+Name Strings >+ >+ EGL_ANGLE_device_creation_d3d11 >+ >+Contributors >+ >+ Austin Kinross (aukinros 'at' microsoft.com) >+ >+Contact >+ >+ Austin Kinross (aukinros 'at' microsoft.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, Nov 02, 2015 >+ >+Number >+ >+ EGL Extension #XXX >+ >+Extension Type >+ >+ EGL client extension >+ >+Dependencies >+ >+ Requires EGL_ANGLE_device_d3d and EGL_ANGLE_device_creation. >+ >+ Written against the wording of EGL 1.5 as modified by EGL_ANGLE_device_d3d >+ and EGL_ANGLE_device_creation. >+ >+Overview >+ >+ ANGLE has the ability to run GPU commands on a native D3D device. This >+ extension defines a way to create a EGL device which maps to an inputted >+ Direct3D 11 device. >+ >+ This extension is intended to be used with EGL_EXT_platform_device to >+ initialize a display using an existing Direct3D 11 device, but >+ EGL_EXT_platform_device is not required. >+ >+IP Status >+ >+ No known claims. >+ >+New Types >+ >+ None. >+ >+New Procedures and Functions >+ >+ None. >+ >+New Tokens >+ >+ None. >+ >+Changes to section 3.2 (Devices) >+ >+ Modify the language in section 3.2 (Devices) describing valid attribute >+ names passed into eglCreateDeviceANGLE via <device_type>: >+ >+ "This specification defines one value for <device_type>: >+ EGL_D3D11_DEVICE_ANGLE. If this device type is specified then >+ <native_device> must be a valid pointer to a Direct3D 11 device. If >+ <native_device> is not a valid pointer to a Direct3D 11 device then the >+ resulting behavior is undefined." >+ >+ Append the following to the end of section 3.2 (Devices): >+ >+ "If a Direct3D 11 device used to create a device experiences a "lost device" >+ then all resulting behavior of the device (and any dependent EGL objects) is >+ undefined. It is the caller's responsibility to monitor for "lost device" >+ and to create a new device (and dependent EGL objects) as appropriate. For >+ more information on "lost device", see the Direct3D documentation." >+ >+Issues >+ >+ None. >+ >+Revision History >+ >+ Version 1, Nov 2, 2015 (Austin Kinross) >+ - Initial Draft >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_device_d3d.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_device_d3d.txt >new file mode 100644 >index 00000000000..6e562473fef >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_device_d3d.txt >@@ -0,0 +1,93 @@ >+Name >+ >+ ANGLE_device_d3d >+ >+Name Strings >+ >+ EGL_ANGLE_device_d3d >+ >+Contributors >+ >+ Jamie Madill (jmadill 'at' google.com) >+ >+Contact >+ >+ Jamie Madill (jmadill 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, Mar 25, 2015 >+ >+Number >+ >+ EGL Extension #XXX >+ >+Extension Type >+ >+ EGL device extension >+ >+Dependencies >+ >+ This extension is written against the language of EGL 1.5 as >+ modified by EGL_EXT_device_query. >+ >+ EGL_EXT_device_query is required. >+ >+Overview >+ >+ ANGLE has the ability to run GPU commands on a native D3D device. >+ This extension defines a mapping from an EGL device to a D3D >+ device, after it's queried from an EGL display. >+ >+IP Status >+ >+ No known claims. >+ >+New Types >+ >+ None. >+ >+New Procedures and Functions >+ >+ None. >+ >+New Tokens >+ >+ Accepted as a queried <attribute> in eglQueryDeviceAttribEXT: >+ >+ EGL_D3D9_DEVICE_ANGLE 0x33A0 >+ EGL_D3D11_DEVICE_ANGLE 0x33A1 >+ >+Add a new section 2.1.3 (D3D Devices) after 2.1.2 (Devices) >+ >+ Somewhat analogous to an EGL device, a D3D device establishes a >+ namespace for D3D operations. In the D3D APIs, such devices are >+ represented by pointers. For more details, see the D3D >+ documentation. >+ >+Changes to section 3.2 (Devices) >+ >+ Replace the paragraph immediately following the prototype for >+ eglQueryDeviceAttribEXT: >+ >+ <attribute> may be either EGL_D3D9_DEVICE_ANGLE or EGL_D3D11_DEVICE_ANGLE. >+ On success, EGL_TRUE is returned, and a valid D3D9 or D3D11 device pointer >+ corresponding to the EGL device is returned in <value>. This handle >+ is compatible with D3D API functions. If the EGL device is not currently >+ associated with a D3D9 device and <attribute> is EGL_D3D9_DEVICE_ANGLE, >+ or if the EGL device is not currently associated with a D3D11 device and >+ <attribute> is EGL_D3D11_DEVICE_ANGLE, EGL_BAD_ATTRIBUTE is returned, >+ and <value> is left unchanged. >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ Version 1, Mar 25, 2015 (Jamie Madill) >+ - Initial Draft >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_direct3d_display.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_direct3d_display.txt >new file mode 100644 >index 00000000000..267ca9ce9d9 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_direct3d_display.txt >@@ -0,0 +1,68 @@ >+Name >+ >+ ANGLE_direct3d_display >+ >+Name Strings >+ >+ EGL_ANGLE_direct3d_display >+ >+Contributors >+ >+ Nicolas Capens >+ Shannon Woods >+ >+Contacts >+ >+ Shannon Woods, Google Inc. (shannonwoods 'at' chromium.org) >+ >+Status >+ >+ In progress >+ >+Version >+ >+ Version 1, May 15, 2013 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ This extension is written against the wording of the EGL 1.4 >+ Specification. >+ >+Overview >+ >+ This extension allows for specifying the behavior of the renderer backing the display. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE (EGLNativeDisplayType)-2 >+ EGL_D3D11_ONLY_DISPLAY_ANGLE (EGLNativeDisplayType)-3 >+ >+Additions to Chapter 3 of the EGL 1.4 Specification (EGL Functions and Errors) >+ >+ Add before the last sentence of the first paragraph of section 3.2, >+ "Initialization": >+ >+ "If <display_id> is EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE, the display returned >+ will be backed by a Direct3D 11 renderer if one is available, or by a >+ Direct3D 9 renderer otherwise. If <display_id> is EGL_D3D11_ONLY_DISPLAY_ANGLE, >+ the display returned will be backed by a Direct3D 11 renderer if one is >+ available, or will return NULL otherwise." >+ >+Issues >+ >+Revision History >+ >+ Version 1, 2013/05/15 - First draft. >+ >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_direct_composition.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_direct_composition.txt >new file mode 100644 >index 00000000000..72bbfc319f5 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_direct_composition.txt >@@ -0,0 +1,97 @@ >+Name >+ >+ ANGLE_direct_composition >+ >+Name Strings >+ >+ EGL_ANGLE_direct_composition >+ >+Contributors >+ >+ John Bauman >+ >+Contacts >+ >+ John Bauman (jbauman 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 2, Dec 14, 2015 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ This extension is written against the wording of the EGL 1.5 Specification. >+ >+Overview >+ >+ This extension allows specifying that the contents of a window surface be >+ posted to the screen using the DirectComposition API. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted by the <attribute> parameter of eglQuerySurface and by the >+ <attrib_list> parameter of eglCreateWindowSurface and >+ eglCreatePlatformWindowSurface >+ >+ EGL_DIRECT_COMPOSITION_ANGLE 0x33A5 >+ >+Changes to Chapter 3 of the EGL 1.5 Specification (EGL Functions and Errors) >+ >+ Modify the fourth paragraph of Section 3.5.1, page 32 >+ (Creating On-Screen rendering Surfaces) >+ >+ "<attrib_list> specifies a list of attributes for the window. The list has >+ the same structure as described for eglChooseConfig. Attributes that can >+ be specified in <attrib_list> include EGL_DIRECT_COMPOSITION_ANGLE, >+ EGL_GL_COLORSPACE, EGL_RENDER_BUFFER, EGL_VG_COLORSPACE, and >+ EGL_VG_ALPHA_FORMAT." >+ >+ Add the following between paragraphs 6 and 7 of Section 3.5.1, page 32 >+ (Creating On-Screen Rendering Surfaces) >+ >+ "EGL_DIRECT_COMPOSITION_ANGLE specifies whether the surface will be posted >+ to the window using DirectComposition. The default is EGL_FALSE. If >+ EGL_TRUE is specified, <native_window> must be owned by the current >+ process, and contents drawn by native APIs or EGLSurfaces with >+ EGL_DIRECT_COMPOSITION_ANGLE as EGL_FALSE will appear underneath the >+ contents of this surface." >+ >+ >+ Add the following entry to Table 3.5, page 44 (Queryable surface >+ attributes and types) >+ >+ Attribute Type Description >+ ---------------------------- ------- -------------------------------------- >+ EGL_DIRECT_COMPOSITION_ANGLE boolean Surface will be posted to the window >+ using DirectComposition >+ >+Issues >+ 1. Should a surface attrib or config be used to specify that >+ DirectComposition is needed. >+ >+ PROPOSED: A surface attrib would work and avoids creating >+ otherwise-duplicate configs. >+ >+Revision History >+ >+ Version 2, 2015/12/14 >+ - Use attrib instead of config. >+ >+ Version 1, 2015/12/10 >+ - Initial draft. >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_display_texture_share_group.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_display_texture_share_group.txt >new file mode 100644 >index 00000000000..90f75ec3601 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_display_texture_share_group.txt >@@ -0,0 +1,82 @@ >+Name >+ >+ ANGLE_display_texture_share_group >+ >+Name Strings >+ >+ EGL_ANGLE_display_texture_share_group >+ >+Contributors >+ >+ Geoff Lang, Google >+ >+Contacts >+ >+ Geoff Lang, Google (geofflang 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, February 7, 2017 >+ >+Number >+ >+ EGL Extension TBD >+ >+Dependencies >+ >+ This extension is written against the wording of the EGL 1.5 specification. >+ >+Overview >+ >+ This extension allows for the creation of OpenGL ES contexts that share >+ texture objects with other contexts owned by the same display. This method >+ of sharing textures can be used in conjuction with regular share groups. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as an attribute name in the <*attrib_list> argument to >+ eglCreateContext: >+ >+ EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE 0x33AF >+ >+Additions to the EGL 1.5 Specification >+ >+ Add a new section entitled "OpenGL ES Global Texture Share Groups" >+ to section 3.7.1: >+ >+ "If the attribute EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE is set to EGL_TRUE, >+ a context that shares textures with other contexts owned by the same >+ display and created with EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE set to >+ EGL_TRUE will be created. If the share_context parameter to >+ eglCreateContext is not NULL, all contexts within the share group must have >+ been created with the same value of EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE. >+ The default value of EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE is EGL_FALSE." >+ >+Issues >+ >+ (1) What happens to the shared textures when a context in the global share >+ group is destroyed? >+ >+ RESOLOVED: When the last context in the global texture share group is >+ destroyed, all textures in the global texture share group are released. If >+ a new context is created in the global texture share group, no textures >+ will exist. >+ >+ This mirrors how regular share groups work, releasing all objects when the >+ last context is destroyed. >+ >+Revision History >+ >+ Version 1, 2017/02/07 - first draft. >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_experimental_present_path.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_experimental_present_path.txt >new file mode 100644 >index 00000000000..4f96c1fa2bc >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_experimental_present_path.txt >@@ -0,0 +1,106 @@ >+Name >+ >+ ANGLE_experimental_present_path >+ >+Name Strings >+ >+ EGL_ANGLE_experimental_present_path >+ >+Contributors >+ >+ Austin Kinross >+ >+Contacts >+ >+ Austin Kinross (aukinros 'at' microsoft 'dot' com) >+ >+Status >+ >+ Experimental >+ >+Version >+ >+ Version 1, Jan 22 2016 >+ >+Number >+ >+ EGL Extension #XXX >+ >+Extension Type >+ >+ EGL display extension >+ >+Dependencies >+ >+ Requires ANGLE_platform_angle_d3d. >+ >+ Written against the wording of EGL 1.4 as modified by >+ ANGLE_platform_angle_d3d. >+ >+Overview >+ >+ This extension exposes an optimized, but potentially non-conformant, >+ rendering path for ANGLE's D3D11 renderer on Windows. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as an attribute name in the <attrib_list> argument of >+ eglGetPlatformDisplayEXT: >+ >+ EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE 0x33A4 >+ >+ Accepted as values for the EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE attribute: >+ >+ EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE 0x33A9 >+ EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE 0x33AA >+ >+Additions to the EGL Specification >+ >+ None. >+ >+New Behavior >+ >+ To request a display that enables this optimized rendering path, >+ the value of EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE should be set to >+ EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE. Setting this value may impact >+ OpenGL ES conformance (see Issue 1 below). >+ >+ The only valid values for the attribute >+ EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE are >+ EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE and >+ EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE. If any other value is specified >+ then an EGL_BAD_ATTRIBUTE error is generated and EGL_NO_DISPLAY is >+ returned. >+ >+ If a value for EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE is specified and >+ EGL_PLATFORM_ANGLE_TYPE_ANGLE is not set to >+ EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE then an EGL_BAD_ATTRIBUTE error is >+ generated and EGL_NO_DISPLAY is returned. >+ >+ If the attribute EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE >+ is unspecified then it is implicitly set to >+ EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE. >+ >+Issues >+ >+ 1) Does setting EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE to be >+ EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE maintain OpenGL ES >+ conformance? >+ >+ RESOLVED: Not necessarily, that is implementation-specific. Check then >+ EGL_CONFORMANT attribute to see if the implementation supports any >+ conformant EGL configs when EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE >+ is specified. >+ >+Revision History >+ >+ Version 1, Jan 22 2016 (Austin Kinross) >+ - Initial draft >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_explicit_context.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_explicit_context.txt >new file mode 100644 >index 00000000000..42287e36171 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_explicit_context.txt >@@ -0,0 +1,87 @@ >+Name >+ >+ ANGLE_explicit_context >+ >+Name Strings >+ >+ EGL_ANGLE_explicit_context >+ >+Contributors >+ >+ Brandon Jones, Intel >+ >+Contacts >+ >+ Brandon Jones, Intel (brandon1.jones 'at' intel 'dot' com) >+ >+Status >+ >+ Complete. >+ >+Version >+ >+ Version 1, 2018-5-22 >+ >+Number >+ >+ EGL Extension XXX >+ >+Extension Type >+ >+ EGL Client Extension >+ >+Dependencies >+ >+ OpenGL ES 3.1 is required. >+ >+ EGL_KHR_get_all_proc_addresses is required. >+ >+ EGL_EXT_client_extensions is required. >+ >+Overview >+ >+ This extension adds new OpenGL ES entry points that allow the user to pass the current EGL >+ context as a function parameter. This allows users to skip lookup of the thread's current >+ context upon entry. >+ >+New Types >+ >+ None. >+ >+New Procedures and Functions >+ >+ For every OpenGL ES entry point available through eglGetProcAddress, an additional entry point >+ is made available. The entry points have the form of: >+ >+ <return value> gl<entry point name>ContextANGLE(GLeglContextANGLE context, <entry point parameters>) >+ >+ If a function already has an extension suffix, this form still applies. >+ >+New Tokens >+ >+ None. >+ >+Additions to the EGL Specification >+ >+ When using OpenGL ES as a client library, the ContextANGLE entry points allow the user to >+ pass the current EGL context as a function parameter to provide better performance than >+ looking up the current EGL context at every GL entry point. >+ >+ Calls made with an explicit context provide no additional validation for the passed context >+ parameter. >+ >+ Calls made with an explicit context will generate errors under the same conditions as they >+ would without an explicit context. Any instances of undefined behaviour without specifying >+ an explicit context are still undefined when specifying an explicit context. >+ >+ When an EGL context that is not current is explicitly passed, the resulting behavior is >+ undefined. >+ >+Issues >+ >+ None. >+ >+Revision History >+ >+ Version 1, 2018-5-22 (Brandon Jones) >+ - Initial draft >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_flexible_surface_compatibility.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_flexible_surface_compatibility.txt >new file mode 100644 >index 00000000000..55d94636d8f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_flexible_surface_compatibility.txt >@@ -0,0 +1,154 @@ >+Name >+ >+ ANGLE_flexible_surface_compatibility >+ >+Name Strings >+ >+ EGL_ANGLE_flexible_surface_compatibility >+ >+Contributors >+ >+ John Bauman (jbauman 'at' google.com) >+ Shannon Woods (shannonwoods 'at' google.com) >+ >+Contact >+ >+ John Bauman (jbauman 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 3, Dec 15, 2015 >+ >+Number >+ >+ EGL Extension #XXX >+ >+Extension Type >+ >+ EGL display extension >+ >+Dependencies >+ >+ This extension is written against the language of EGL 1.5. >+ >+Overview >+ >+ Some EGL implementations may allow any surface to be made current with any >+ context from the same display, without restrictions due to bit depth. >+ >+IP Status >+ >+ No known claims. >+ >+New Types >+ >+ None. >+ >+New Procedures and Functions >+ >+ None. >+ >+New Tokens >+ >+ Accepted by the <attribute> parameter of eglQuerySurface and by the >+ <attrib_list> parameter of eglCreateWindowSurface, >+ eglCreatePlatformWindowSurface, eglCreatePbufferSurface, and >+ eglCreatePbufferFromClientBuffer: >+ >+ EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE 0x33A6 >+ >+Changes to Chapter 2 of the EGL 1.5 Specification (EGL Operation) >+ >+ Replace the first paragraph of the first bulleted list item in section >+ 2.2, page 4 >+ (Rendering Contexts and Drawing Surfaces) >+ >+ "They support the same type of color buffer (RGB or luminance), or the >+ surface has the EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE >+ attribute set to EGL_TRUE." >+ >+ Replace the first paragraph of the second bulleted list item in section >+ 2.2, page 4 >+ (Rendering Contexts and Drawing Surfaces) >+ >+ "They have color buffers and ancillary buffers of the same depth, or the >+ surface has the EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE >+ attribute set to EGL_TRUE." >+ >+Changes to Chapter 3 of the EGL 1.5 Specification (EGL Functions and Errors) >+ >+ Modify the fourth paragraph of Section 3.5.1, page 32 >+ (Creating On-Screen rendering Surfaces) >+ >+ "<attrib_list> specifies a list of attributes for the window. The list has >+ the same structure as described for eglChooseConfig. Attributes that can >+ be specified in <attrib_list> include >+ EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE, EGL_GL_COLORSPACE, >+ EGL_RENDER_BUFFER, EGL_VG_COLORSPACE, and EGL_VG_ALPHA_FORMAT." >+ >+ Add the following between paragraphs 6 and 7 of Section 3.5.1, page 32 >+ (Creating On-Screen Rendering Surfaces) >+ >+ "EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE specifies whether the >+ surface can be made current with a context with a config of different bit >+ depth. Its values can be EGL_TRUE, in which case that is supported, or >+ EGL_FALSE, in which case that is not supported." >+ >+ Modify the fourth paragraph of Section 3.5.2, page 35 >+ (Creating Off-Screen Rendering Surfaces) >+ >+ "<attrib_list> specifies a list of attributes for the pbuffer. The list >+ has the same structure as described for eglChooseConfig. Attributes that >+ can be specified in <attrib_list> include EGL_WIDTH, EGL_HEIGHT, >+ EGL_LARGEST_PBUFFER, EGL_TEXTURE_FORMAT, EGL_TEXTURE_TARGET, >+ EGL_MIPMAP_TEXTURE, EGL_GL_COLORSPACE, EGL_VG_COLORSPACE, >+ EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE, and >+ EGL_VG_ALPHA_FORMAT." >+ >+ Modify paragraph twelve of Section 3.5.2, page 36 >+ >+ "EGL_GL_COLORSPACE, EGL_VG_COLORSPACE, >+ EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE, and >+ EGL_VG_ALPHA_FORMAT have the same meaning and default values as when used >+ with eglCreatePlatformWindowSurface." >+ >+ Modify the fifth paragraph of Section 3.5.3, page 37 >+ (Binding Off-Screen Rendering Surfaces To Client Buffers) >+ >+ "<attrib_list> specifies a list of attributes for the pbuffer. The list >+ has the same structure as described for eglChooseConfig. Attributes that >+ can be specified in <attrib_list> include EGL_TEXTURE_FORMAT, >+ EGL_TEXTURE_TARGET, EGL_- MIPMAP_TEXTURE, and >+ EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE. The meaning of these >+ attributes is as described above for eglCreatePbufferSurface. The >+ EGL_VG_COLORSPACE and EGL_VG_ALPHA_FORMAT attributes of the surface are >+ determined by the VGImageFormat of buffer." >+ >+ Add the following entry to Table 3.5, page 44 (Queryable surface >+ attributes and types) >+ >+ Attribute Type Description >+ -------------------------------------------------- ------- ------------------------ >+ EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE boolean Surface can be made >+ current with contexts >+ of a different bit depth >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ Version 3, Dec 15, 2015 (John Bauman) >+ - Modify EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE value. >+ >+ Version 2, Dec 1, 2015 (John Bauman) >+ - Add EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE to specify >+ new behavior. >+ >+ Version 1, Nov 24, 2015 (John Bauman) >+ - Initial Draft >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_iosurface_client_buffer.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_iosurface_client_buffer.txt >new file mode 100644 >index 00000000000..0ec5beae05f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_iosurface_client_buffer.txt >@@ -0,0 +1,118 @@ >+Name >+ >+ ANGLE_iosurface_client_buffer >+ >+Name Strings >+ >+ EGL_ANGLE_iosurface_client_buffer >+ >+Contributors >+ >+ Corentin Wallez >+ Geoff Lang >+ James Darpinian >+ >+Contacts >+ >+ Corentin Wallez, Google Inc. (cwallez 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ Version 2, Apr 1, 2019 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ This extension is written against the wording of the EGL 1.4 >+ Specification. >+ >+Overview >+ >+ This extension allows creating EGL surfaces from IOSurface objects. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted in the <buftype> parameter of eglCreatePbufferFromClientBuffer: >+ >+ EGL_IOSURFACE_ANGLE 0x3454 >+ EGL_IOSURFACE_PLANE_ANGLE 0x345A >+ EGL_TEXTURE_RECTANGLE_ANGLE 0x345B >+ EGL_TEXTURE_TYPE_ANGLE 0x345C >+ EGL_TEXTURE_INTERNAL_FORMAT_ANGLE 0x345D >+ >+Additions to Chapter 3 of the EGL 1.4 Specification (EGL Functions and Errors) >+ >+ Replace the last sentence of paragraph 1 of Section 3.5.3 with the >+ following text. >+ "Currently, the only client API resources which may be bound in this >+ fashion are OpenVG VGImage objects and IOSurface objects." >+ >+ Replace the third paragraph of Section 3.5.3 with the following text. >+ "<buftype> specifies the type of buffer to be bound. The only allowed values >+ of <buftype> are EGL_OPENVG_IMAGE and EGL_IOSURFACE_ANGLE". >+ >+ Append the following text to the fourth paragraph of Section 3.5.3. >+ "When <buftype> is EGL_IOSURFACE_ANGLE, <buffer> must be a valid IOSurface >+ object case into the type EGLClientBuffer." >+ >+ Append to the end of Section 3.5.3. >+ "When <buftype> is EGL_IOSURFACE_ANGLE, <attrib_list> must contain all the >+ following attributes otherwise EGL_BAD_PARAMETER is generated. The >+ attributes must satisfy the following constraints otherwise >+ EGL_BAD_ATTRIBUTE is generated: >+ - EGL_TEXTURE_TYPE_ANGLE, and EGL_TEXTURE_INTERNAL_FORMAT_ANGLE followed >+ by OpenGL enums for texture types, and texture internal format >+ respectively. >+ - EGL_TEXTURE_FORMAT with a value of EGL_TEXTURE_RGBA >+ - EGL_WIDTH with a value between 1 and the width of <buffer>. >+ - EGL_HEIGHT with a value between 1 and the height of <buffer>. >+ - EGL_TEXTURE_TARGET with a value of EGL_TEXTURE_RECTANGLE_ANGLE >+ - EGL_IOSURFACE_PLANE_ANGLE with a value between 0 and the number of >+ planes of <buffer> (exclusive). >+ >+ In addition the EGL_TEXTURE_TYPE_ANGLE and >+ EGL_TEXTURE_INTERNAL_FORMAT_ANGLE attributes must be one of the >+ combinations listed in table egl.iosurface.formats or an >+ EGL_BAD_PARAMETER is generated. The combination must also be a valid >+ combinations for glTexImage2D or EGL_BAD_PARAMETER is generated." >+ >+ --------------------------------------------------------------------------- >+ Texture Type Texture Internal Format >+ --------------------------------------------------------------------------- >+ GL_UNSIGNED_BYTE GL_RED >+ GL_UNSIGNED_SHORT GL_R16UI >+ GL_UNSIGNED_BYTE GL_RG >+ GL_UNSIGNED_BYTE GL_BGRA_EXT >+ GL_HALF_FLOAT GL_RGBA >+ --------------------------------------------------------------------------- >+ Table egl.iosurface.formats - Valid combinations of format, type and >+ internal format for IOSurface-backed pbuffers. >+ --------------------------------------------------------------------------- >+ >+ Append to the end of Section 3.5.3. >+ "When a pbuffer is created with type EGL_IOSURFACE_ANGLE, the contents >+ of the associcated IOSurface object are undefined while the pbuffer is >+ bound to a client texture." >+ >+Issues >+ >+ There are no issues, please move on. >+ >+Revision History >+ >+ Version 1, 2017/12/06 - first draft. >+ Version 2, 2019/04/01 - Allow MakeCurrent. >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_keyed_mutex.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_keyed_mutex.txt >new file mode 100644 >index 00000000000..647af90df8e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_keyed_mutex.txt >@@ -0,0 +1,75 @@ >+Name >+ >+ ANGLE_keyed_mutex >+ >+Name Strings >+ >+ EGL_ANGLE_keyed_mutex >+ >+Contributors >+ >+ Jeff Muizelaar >+ >+Contacts >+ >+ Jeff Muizelaar, Mozilla (jmuizelaar 'at' mozilla.org) >+ >+Status >+ >+ Implemented in ANGLE. >+ >+Version >+ >+ Version 1, Oct 29, 2014 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ Requires the EGL_ANGLE_query_surface_pointer extension. >+ >+ This extension is written against the wording of the EGL 1.4 >+ Specification. >+ >+Overview >+ >+ Some EGL implementations generate EGLSurface handles that are >+ backed by Direct3D 11 2D textures. This extension allows >+ obtaining the IDXGIKeyedMutex for such EGL surfaces. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted in the <attribute> parameter of eglQuerySurfacePointerANGLE: >+ >+ EGL_DXGI_KEYED_MUTEX_ANGLE 0x33A2 >+ >+ Add to table 3.5, "Queryable surface attributes and types": >+ >+ Attribute Type Description >+ --------- ---- ----------- >+ EGL_DXGI_KEYED_MUTEX_ANGLE pointer IDXGIKeyedMutex >+ >+ Add before the last paragraph in section 3.5, "Surface attributes": >+ >+ "Querying EGL_DXGI_KEYED_MUTEX_ANGLE returns a IDXGIKeyedMutex, or NULL >+ if a keyed mutex for the surface is not available. The keyed mutex >+ must be queried using eglQuerySurfaceAttribPointerANGLE. Keyed Mutexes >+ are only available from EGL surfaces backed by Direct3D 11 surfaces. >+ Before using the keyed mutex, ensure that all rendering to the EGLSurface >+ with EGL client APIs has completed." >+ >+Issues >+ >+Revision History >+ >+ Version 1, 2014/10/29 - first draft. >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle.txt >new file mode 100644 >index 00000000000..69f8dbc17fd >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle.txt >@@ -0,0 +1,163 @@ >+Name >+ >+ ANGLE_platform_angle >+ >+Name Strings >+ >+ EGL_ANGLE_platform_angle >+ >+Contributors >+ >+ Scott Graham, Google >+ Shannon Woods, Google >+ Geoff Lang, Google >+ >+Contacts >+ >+ Scott Graham, Google (scottmg 'at' google 'dot' com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 5, 2017-12-28 >+ >+Number >+ >+ EGL Extension XXX >+ >+Extension Type >+ >+ EGL client extension >+ >+Dependencies >+ >+ Requires EGL_EXT_client_extensions to query its existence without >+ a display. >+ >+ Requires EGL_EXT_platform_base. >+ >+ This extension is written against the wording of version 9 of the >+ EGL_EXT_platform_base specification. >+ >+ ANGLE_platform_angle_d3d affects the definition of this extension. >+ ANGLE_platform_angle_opengl affects the definition of this extension. >+ >+Overview >+ >+ This extension defines how to create EGL resources from native resources >+ using the functions defined by EGL_EXT_platform_base. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as the <platform> argument of eglGetPlatformDisplayEXT: >+ >+ EGL_PLATFORM_ANGLE_ANGLE 0x3202 >+ >+ Accepted as an attribute name in the <attrib_list> argument of >+ eglGetPlatformDisplayEXT: >+ >+ EGL_PLATFORM_ANGLE_TYPE_ANGLE 0x3203 >+ EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE 0x3204 >+ EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE 0x3205 >+ EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED 0x3451 >+ >+ Accepted as values for the EGL_PLATFORM_ANGLE_TYPE_ANGLE attribute: >+ >+ EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE 0x3206 >+ >+ Accepted as values for the EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE attribute: >+ >+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE 0x320A >+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE 0x345E >+ >+Additions to the EGL Specification >+ >+ None. >+ >+New Behavior >+ >+ To determine if the EGL implementation supports this extension, clients >+ should query the EGL_EXTENSIONS string of EGL_NO_DISPLAY. >+ >+ To obtain an EGLDisplay backed by a ANGLE display, call >+ eglGetPlatformDisplayEXT with <platform> set to EGL_PLATFORM_ANGLE_ANGLE. >+ >+ The <native_display> parameter is of type EGLNativeDisplayType. If >+ <native_display> is EGL_DEFAULT_DISPLAY a default display is returned. >+ Multiple calls with the same <native_display> will return the same >+ EGLDisplay handle. If <platform> is set to EGL_PLATFORM_ANGLE_ANGLE and >+ the returned display is in an uninitialized state, its attributes are >+ overwritten by those provided in the <attrib_list>, if any. >+ >+ If no <attrib_list> is specified, the value of >+ EGL_PLATFORM_ANGLE_TYPE_ANGLE is implicitly set to >+ EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE. >+ >+ If no <attrib_list> is specified, the values of >+ EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE and >+ EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE are implicitly set to >+ EGL_DONT_CARE. >+ >+ If no <attrib_list> is specified, the value of >+ EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED is implicitly set to >+ EGL_DONT_CARE. >+ >+ If no <attrib_list> is specified to eglGetPlatformDisplayEXT, the value of >+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE is implicitly set to >+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE. Otherwise, the value of >+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE should be: >+ - EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE to request a hardware >+ accelerated device. >+ - EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE to request a no-op driver >+ for testing. If unavailable, the implementation will fall back to >+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE. >+ >+ If EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE is set to EGL_DONT_CARE and >+ EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE is not set to EGL_DONT_CARE, >+ an EGL_BAD_ATTRIBUTE error is generated and EGL_NO_DISPLAY is returned. >+ >+ If no display matching the requested <native_display> or of the type >+ requested by the value of EGL_PLATFORM_ANGLE_TYPE_ANGLE is available, >+ EGL_NO_DISPLAY is returned. No error condition is raised in this case. >+ >+ If EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED is specified, it >+ controls enabling back-end validation layers. EGL_TRUE enables >+ validation and EGL_FALSE disables it. If it is set to EGL_DONT_CARE, the >+ default setting depends on the implementation. Any value other than these >+ will result in an error. >+ >+Issues >+ >+ 1) Should the validation layers default to on, off, or no guarantee? >+ >+ Defaulting to off offers some consistency. However, it's customary for >+ some applications like ANGLE to turn on debugging features by default >+ in Debug builds. >+ >+ RESOLVED: default to implementation-dependent behaviour. >+ >+Revision History >+ >+ Version 1, 2014-02-04 (Scott Graham) >+ - Initial draft >+ Version 2, 2014-06-05 (Geoff Lang) >+ - Rename extension from ANGLE_platform_angle_d3d to ANGLE_platform_angle. >+ - Add sub-extensions for specific platforms. >+ Version 3, 2014-10-20 (Geoff Lang) >+ - Add attributes to request specific feature level and context versions. >+ - Moved descriptions of platforms to child extension specs. >+ Version 4, 2017-07-19 (Jamie Madill) >+ - Add a debug layers enabled attribute to control runtime validation. >+ Version 5, 2017-12-28 (Jamie Madill) >+ - Expose device type selection. >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_context_virtualization.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_context_virtualization.txt >new file mode 100644 >index 00000000000..8a714dd9248 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_context_virtualization.txt >@@ -0,0 +1,80 @@ >+Name >+ >+ ANGLE_platform_angle_context_virtualization >+ >+Name Strings >+ >+ EGL_ANGLE_platform_angle_context_virtualization >+ >+Contributors >+ >+ Geoff Lang, Google >+ >+Contacts >+ >+ Geoff Lang, Google (geofflang 'at' chromium 'dot' org) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, 2018-06-11 >+ >+Number >+ >+ EGL Extension XXX >+ >+Extension Type >+ >+ EGL client extension >+ >+Dependencies >+ >+ Requires ANGLE_platform_angle. >+ >+Overview >+ >+ This extension allows the client to request a Display that internally >+ virtualizes contexts. Requesting virtualized contexts may impact >+ performance or ability to render from multiple threads simultaneously. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as an attribute name in the <attrib_list> argument of >+ eglGetPlatformDisplayEXT: >+ >+ EGL_PLATFORM_ANGLE_CONTEXT_VIRTUALIZATION_ANGLE 0x3481 >+ >+Additions to the EGL Specification >+ >+ None. >+ >+New Behavior >+ >+ To request a display that internally utilizes context virtualization, >+ use the attribute EGL_PLATFORM_ANGLE_CONTEXT_VIRTUALIZATION_ANGLE. >+ EGL_TRUE enables context virtualization and EGL false disables it. >+ If it is set to EGL_DONT_CARE, the default setting depends on the >+ implementation. Any value other than these will result in an error. >+ The default value for EGL_PLATFORM_ANGLE_CONTEXT_VIRTUALIZATION_ANGLE >+ is EGL_DONT_CARE. Display creation may fail if hardware limitations >+ prohibit the requested setting. >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ Version 1, 2018-06-11 (Geoff Lang) >+ - Initial draft >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_d3d.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_d3d.txt >new file mode 100644 >index 00000000000..27536572243 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_d3d.txt >@@ -0,0 +1,141 @@ >+Name >+ >+ ANGLE_platform_angle_d3d >+ >+Name Strings >+ >+ EGL_ANGLE_platform_angle_d3d >+ >+Contributors >+ >+ Shannon Woods, Google >+ Geoff Lang, Google >+ >+Contacts >+ >+ Geoff Lang, Google (geofflang 'at' chromium 'dot' org) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 3, 2014-11-26 >+ >+Number >+ >+ EGL Extension XXX >+ >+Extension Type >+ >+ EGL client extension >+ >+Dependencies >+ >+ Requires ANGLE_platform_angle. >+ >+Overview >+ >+ This extension enables selection of D3D display types. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as values for the EGL_PLATFORM_ANGLE_TYPE_ANGLE attribute: >+ >+ EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 0x3207 >+ EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3208 >+ >+ Accepted as an attribute name in the <attrib_list> argument of >+ eglGetPlatformDisplayEXT: >+ >+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE 0x3209 >+ EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE 0x320F >+ >+ Accepted as values for the EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE attribute: >+ >+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_WARP_ANGLE 0x320B >+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_REFERENCE_ANGLE 0x320C >+ >+Additions to the EGL Specification >+ >+ None. >+ >+New Behavior >+ >+ To request a display that is backed by Direct3D resources, the value of >+ EGL_PLATFORM_ANGLE_TYPE_ANGLE should be: >+ - EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE for a D3D9 display, >+ - EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE for a D3D11 display. >+ >+ To request a specific maximum feature level to be used by the D3D11 >+ display, EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE and >+ EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE can be used. Only feature >+ levels that are capable of supporting all available client APIs will be >+ used unless explicitly requested. >+ EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE and >+ EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE have no effect when requesting >+ a D3D9 display. >+ >+ If no <attrib_list> is specified to eglGetPlatformDisplayEXT, the value of >+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE is implicitly set to >+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE. Otherwise, the value of >+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE should be: >+ - EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE to request a hardware >+ accelerated device. >+ - EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE to request a no-op driver >+ for testing. >+ - EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_WARP_ANGLE to request an >+ optimized software rasterizer. >+ - EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_REFERENCE_ANGLE to request a >+ reference rasterizer. >+ >+ If EGL_PLATFORM_ANGLE_TYPE_ANGLE is set to >+ EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, the display can automatically respond >+ to trim events from the operating system. If the attribute >+ EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE is unspecified, it is >+ implicitly set to EGL_FALSE. Otherwise, the value of >+ EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE should be EGL_TRUE or >+ EGL_FALSE. >+ >+ If EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE is set to >+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE and EGL_PLATFORM_ANGLE_TYPE_ANGLE >+ is not set to EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, an EGL_BAD_ATTRIBUTE >+ error is generated and EGL_NO_DISPLAY is returned. >+ >+ If EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE is specified when >+ EGL_PLATFORM_ANGLE_TYPE_ANGLE is not EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE >+ or a value other than EGL_TRUE or EGL_FALSE is used, an EGL_BAD_ATTRIBUTE >+ error is generated and EGL_NO_DISPLAY is returned. >+ >+Issues >+ >+ 1) Some multithreaded applications can crash if the display automatically >+ responds to trim events while the application is rendering from another >+ thread. >+ >+ RESOLVED: Added an EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE >+ enum to specify if the display should respond to trim events. >+ Applications that do multithreaded rendering should disable automatic >+ trim and handle the trim events on their own. >+ >+Revision History >+ >+ Version 1, 2014-06-05 (Geoff Lang) >+ - Initial draft >+ Version 2, 2014-10-27 (Geoff Lang) >+ - Separate WARP devices into a new attribute instead of a platform type. >+ - Moved descriptions of platforms and major/minor versions from >+ EGL_ANGLE_platform_angle spec to EGL_ANGLE_platform_angle_d3d. >+ Version 3, 2014-11-26 (Geoff Lang) >+ - Remove the USE_WARP bool and replace it with a DEVICE_TYPE enum. >+ Version 4, 2015-03-11 (Geoff Lang) >+ - Add the ENABLE_AUTOMATIC_TRIM enum. >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_null.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_null.txt >new file mode 100644 >index 00000000000..e9b8ee2cddb >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_null.txt >@@ -0,0 +1,73 @@ >+Name >+ >+ ANGLE_platform_angle_null >+ >+Name Strings >+ >+ EGL_ANGLE_platform_angle_null >+ >+Contributors >+ >+ Geoff Lang, Google >+ >+Contacts >+ >+ Geoff Lang, Google (geofflang 'at' google 'dot' com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, September 23, 2016 >+ >+Number >+ >+ EGL Extension #?? >+ >+Extension Type >+ >+ EGL client extension >+ >+Dependencies >+ >+ Requires ANGLE_platform_angle. >+ >+Overview >+ >+ This extension enables selection of null display types which perform state >+ tracking and validation but do not render any content. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as values for the EGL_PLATFORM_ANGLE_TYPE_ANGLE attribute: >+ >+ EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE 0x33AE >+ >+Additions to the EGL Specification >+ >+ None. >+ >+New Behavior >+ >+ To request a display that performs no rendering and has no platform >+ dependencies, the value of EGL_PLATFORM_ANGLE_TYPE_ANGLE should be >+ EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE. >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ Version 1, 2016-09-23 (Geoff Lang) >+ - Initial draft >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_opengl.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_opengl.txt >new file mode 100644 >index 00000000000..52ef4ee277f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_opengl.txt >@@ -0,0 +1,100 @@ >+Name >+ >+ ANGLE_platform_angle_opengl >+ >+Name Strings >+ >+ EGL_ANGLE_platform_angle_opengl >+ >+Contributors >+ >+ Shannon Woods, Google >+ Geoff Lang, Google >+ Courtney Goeltzenleuchter, Google >+ >+Contacts >+ >+ Geoff Lang, Google (geofflang 'at' chromium 'dot' org) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 4, 2018-05-17 >+ >+Number >+ >+ EGL Extension XXX >+ >+Extension Type >+ >+ EGL client extension >+ >+Dependencies >+ >+ Requires ANGLE_platform_angle. >+ >+Overview >+ >+ This extension enables selection of OpenGL display types and, >+ for OpenGL ES display types, allows the application to pass >+ in a handle to the EGL library to use. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as values for the EGL_PLATFORM_ANGLE_TYPE_ANGLE attribute: >+ >+ EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE 0x320D >+ EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE 0x320E >+ >+ Accepted as an attribute name in the <attrib_list> argument of >+ eglGetPlatformDisplayEXT: >+ EGL_PLATFORM_ANGLE_EGL_HANDLE_ANGLE 0x3480 >+ >+Additions to the EGL Specification >+ >+ None. >+ >+New Behavior >+ >+ To request a display that translates to OpenGL or OpenGL ES, the value of >+ EGL_PLATFORM_ANGLE_TYPE_ANGLE should be: >+ - EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE for an OpenGL display, >+ - EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE for a native OpenGL ES display. >+ >+ To request a specific maximum context version to use for the underlying >+ API, EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE and >+ EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE can be used. >+ >+ To pass in a handle to the system EGL library, use the attribute >+ EGL_PLATFORM_ANGLE_EGL_HANDLE_ANGLE. If EGL_PLATFORM_ANGLE_TYPE_ANGLE >+ is not equal to EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE, an >+ EGL_BAD_ATTRIBUTE is generated. If the handle provided with >+ EGL_PLATFORM_ANGLE_EGL_HANDLE_ANGLE is not a valid EGL handle, >+ behaviour is undefined. >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ Version 1, 2014-06-05 (Geoff Lang) >+ - Initial draft >+ Version 2, 2014-10-27 (Geoff Lang) >+ - Moved descriptions of platforms and major/minor versions from >+ EGL_ANGLE_platform_angle spec to EGL_ANGLE_platform_angle_opengl. >+ Version 3, 2014-11-26 (Geoff Lang) >+ - Updated enum values. >+ Version 4, 2018-05-17 (Courtney Goeltzenleuchter) >+ - Add attribute for specifying underlying EGL library. >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_vulkan.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_vulkan.txt >new file mode 100644 >index 00000000000..b677532b5dc >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_vulkan.txt >@@ -0,0 +1,86 @@ >+Name >+ >+ ANGLE_platform_angle_vulkan >+ >+Name Strings >+ >+ EGL_ANGLE_platform_angle_vulkan >+ >+Contributors >+ >+ Jamie Madill, Google >+ >+Contacts >+ >+ Jamie Madill, Google (jmadill 'at' google 'dot' com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 2, 2017-07-19 >+ >+Number >+ >+ EGL Extension XXX >+ >+Extension Type >+ >+ EGL client extension >+ >+Dependencies >+ >+ Requires ANGLE_platform_angle. >+ >+Overview >+ >+ This extension enables selection of Vulkan display types. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as values for the EGL_PLATFORM_ANGLE_TYPE_ANGLE attribute: >+ >+ EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE 0x3450 >+ >+Additions to the EGL Specification >+ >+ None. >+ >+New Behavior >+ >+ To request a display that is backed by a Vulkan driver, the value of >+ EGL_PLATFORM_ANGLE_TYPE_ANGLE should be >+ EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE. >+ >+ If EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE and >+ EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE are not specified, the >+ implementation will decide which version of Vulkan to instantiate. If they >+ are specified, it will choose a version that is lower or equal to the >+ specified major and minor versions. The only current values accepted for >+ major and minor version are 1 for major and 0 for minor. >+ >+Issues >+ >+ 1) Should ANGLE always instantiate the highest available version of Vulkan? >+ >+ RESOLVED: It's possible that in a future implementation of Vulkan there >+ may be driver issues present only on some version of Vulkan, and there's >+ no explicit guarantee higher versions will be more stable. Hence, we should >+ give ANGLE some flexiblity in this regard and leave this unspecified. >+ >+Revision History >+ >+ Version 1, 2016-11-17 (Jamie Madill) >+ - Initial draft >+ Version 2, 2017-07-19 (Jamie Madill) >+ - Moved debug layer control to EGL_ANGLE_platform_angle >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_power_preference.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_power_preference.txt >new file mode 100644 >index 00000000000..43bdc959bd0 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_power_preference.txt >@@ -0,0 +1,85 @@ >+Name >+ >+ ANGLE_power_preference >+ >+Name Strings >+ >+ EGL_ANGLE_power_preference >+ >+Contributors >+ >+ Kenneth Russell >+ >+Contacts >+ >+ Kenneth Russell, Google Inc. (kbr 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, April 16, 2019 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ This extension is written against the wording of the EGL 1.4 >+ Specification. >+ >+Overview >+ >+ This extension allows selection of the high- or low-power GPU on >+ dual-GPU systems, specifically on macOS. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as an attribute name in the <*attrib_list> argument to >+ eglCreateContext: >+ >+ EGL_POWER_PREFERENCE_ANGLE 0x3482 >+ >+ Accepted as an attribute value in the <*attrib_list> argument to >+ eglCreateContext: >+ >+ EGL_LOW_POWER_ANGLE 0x0001 >+ EGL_HIGH_POWER_ANGLE 0x0002 >+ >+Additions to the EGL 1.4 Specification >+ >+ Add the following to section 3.7.1 "Creating Rendering Contexts": >+ >+ EGL_POWER_PREFERENCE_ANGLE indicates whether the context should be >+ created on the integrated (low-power) or discrete (high-power) GPU >+ on dual-GPU systems. EGL_POWER_PREFERENCE_ANGLE is only a legal >+ context creation attribute when the EGL_ANGLE_power_preference >+ extension is advertised. The valid values for this attribute are >+ EGL_LOW_POWER_ANGLE and EGL_HIGH_POWER_ANGLE. If this extension is >+ advertised and this context creation attribute is not specified, >+ the default value is EGL_LOW_POWER_ANGLE. >+ >+ The containing application must set the >+ NSSupportsAutomaticGraphicsSwitching attribute to true in its >+ Info.plist in order for this extension to operate as advertised. >+ >+Issues >+ >+ None yet. >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------- --------- ---------------------------------------- >+ 1 Apr 16, 2019 kbr Initial version >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_program_cache_control.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_program_cache_control.txt >new file mode 100644 >index 00000000000..184f0e503c8 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_program_cache_control.txt >@@ -0,0 +1,233 @@ >+Name >+ >+ EGL_ANGLE_program_cache_control >+ >+Name Strings >+ >+ EGL_ANGLE_program_cache_control >+ >+Contributors >+ >+ Jamie Madill, Google >+ >+Contacts >+ >+ Jamie Madill (jmadill 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, June 29, 2017 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ Requires EGL 1.5. >+ >+ Written against the EGL 1.5 specification. >+ >+Overview >+ >+ This extension allows the for creation of an OpenGL or OpenGL ES contexts >+ that have access to an internal binary program cache. It also allows for >+ querying and populating the contents of the binary cache. >+ >+ An OpenGL ES implementation supporting GL_ANGLE_program_cache_control or >+ equivalent functionality is required. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ EGLint eglProgramCacheGetAttribANGLE( >+ EGLDisplay dpy, >+ EGLenum attrib); >+ >+ void eglProgramCacheQueryANGLE( >+ EGLDisplay dpy, >+ EGLint index, >+ void *key, >+ EGLint *keysize, >+ void *binary, >+ EGLint *binarysize); >+ >+ void eglProgramCachePopulateANGLE( >+ EGLDisplay dpy, >+ const void *key, >+ EGLint keysize, >+ const void *binary, >+ EGLint binarysize); >+ >+ EGLint eglProgramCacheResizeANGLE( >+ EGLDisplay dpy, >+ EGLint limit, >+ EGLenum mode); >+ >+New Tokens >+ >+ Accepted as a value for 'attrib' in eglProgramCacheGetAttribANGLE: >+ >+ EGL_PROGRAM_CACHE_SIZE_ANGLE 0x3455 >+ EGL_PROGRAM_CACHE_KEY_LENGTH_ANGLE 0x3456 >+ >+ Accepted as a value for 'mode' in eglProgramCacheResizeANGLE: >+ >+ EGL_PROGRAM_CACHE_RESIZE_ANGLE 0x3457 >+ EGL_PROGRAM_CACHE_TRIM_ANGLE 0x3458 >+ >+ Accepted as an attribute name in the <*attrib_list> argument to >+ eglCreateContext: >+ >+ EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE 0x3459 >+ >+Additions to the EGL 1.5 Specification >+ >+ Add the following to section 3.7.1 "Creating Rendering Contexts": >+ >+ EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE indicates whether the context >+ should be created with the GL_PROGRAM_BINARY_CACHE_ENABLE_ANGLE state >+ initialized to GL_TRUE or GL_FALSE. The default value of >+ EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE is EGL_TRUE. See section 3.13 >+ for details on the program binary cache. >+ >+ Add a section 3.13 to the end of section 3 "EGL Program Binary Cache": >+ >+ Each display has an associated program binary cache. This cache stores >+ compiled programs for re-use on subsequent calls to glLinkProgram. The >+ application can control the behaviour of the cache by enabling or disabling >+ its use per-context (see section 3.7.1) and specifying a cache size. It >+ can also query the current cache values and populate the cache during start- >+ up. >+ >+ Program binary cache properties may be queried using >+ >+ EGLint eglProgramCacheGetAttribANGLE(EGLDisplay dpy, EGLenum attrib); >+ >+ The only accepted values for 'attrib' are EGL_PROGRAM_CACHE_SIZE_ANGLE and >+ EGL_PROGRAM_CACHE_KEY_LENGTH_ANGLE. A query for EGL_PROGRAM_CACHE_SIZE_ANGLE >+ will return the number of cache entries in the program cache. A >+ query of EGL_PROGRAM_CACHE_KEY_LENGTH_ANGLE will return the required length >+ (in bytes) of the 'key' parameter to eglProgramCacheQueryANGLE and >+ eglPopulateProgramCacheANGLE. Any other value for 'attrib' will produce an >+ error of EGL_BAD_ATTRIBUTE, and an invalid display for 'dpy' will produce an >+ error of EGL_BAD_DISPLAY. All error cases will return zero. >+ >+ Cache contents may be queried by using >+ >+ void eglProgramCacheQueryANGLE(EGLDisplay dpy, EGLint index, >+ void *key, EGLint *keysize, void *binary, EGLint *binarysize); >+ >+ If 'dpy' is not a valid display an EGL_BAD_DISPLAY error is generated. If >+ 'index' is not equal to or greater than zero and less than >+ EGL_PROGRAM_CACHE_SIZE_ANGLE, an EGL_BAD_PARAMETER error is generated. If >+ 'dpy' is not a valid display EGL_BAD_DISPLAY is generated. If 'binarysize' >+ and 'keysize' are non-null, and 'binary' and 'key' are null, the size of the >+ binary at 'index' is written to 'binarysize', and the key size to 'keysize'. >+ If 'binary' is not null, 'binarysize' specifies the maximum size of the >+ 'binary' out parameter, and if 'keysize' is not null, the size of the 'key' >+ out parameter. Any attempt to write more than 'binarysize' or 'keysize' >+ bytes will produce an EGL_BAD_ACCESS error in this case. If 'keysize' or >+ 'binarysize' is null, an EGL_BAD_PARAMETER error is generated. If 'key' is >+ not null, 'binary' must also be non-null, and vice versa, or an >+ EGL_BAD_PARAMETER error is generated. If the cache contents change such that >+ a cache entry at 'index' is not retrievable, either EGL_BAD_ACCESS is >+ generated or a null key and binary are returned. Valid entries returned are >+ not guaranteed to be in the cache. Otherwise, the binary is written to >+ 'binary' and the program key is written to 'key'. >+ >+ The cache may be warmed up on startup with >+ >+ void eglProgramCachePopulateANGLE(EGLDisplay dpy, const void *key, >+ EGLint keysize, const void *binary, EGLint binarysize); >+ >+ If 'dpy' is not a valid display an EGL_BAD_DISPLAY error is generated. If >+ 'binarysize' is not positive or is greater than an internally defined >+ maximum size, EGL_BAD_PARAMETER is generated. If 'keysize' does not equal >+ EGL_PROGRAM_CACHE_KEY_LENGTH_ANGLE, EGL_BAD_PARAMETER is generated. If the >+ program binary is invalid for any reason, behaviour is undefined. Otherwise >+ the program will be loaded into the internal binary cache with the key >+ 'key'. If 'binary' or 'key' are null, an EGL_BAD_PARAMETER error is >+ generated. >+ >+ The cache contents size may be changed using >+ >+ EGLint eglProgramCacheResizeANGLE(EGLDisplay dpy, EGLint limit, >+ EGLenum mode); >+ >+ If 'dpy' is not a valid display an EGL_BAD_DISPLAY error is generated. If >+ limit is negative then EGL_BAD_PARAMETER is generated. If 'mode' is >+ EGL_PROGRAM_CACHE_RESIZE, cache contents are discarded and a new maximum >+ cache size is set to 'limit'. If 'limit' is larget than an implementation- >+ defined internal constant, EGL_BAD_PARAMETER is generated. Otherwise the >+ initial cache size is returned. If 'mode' is EGL_PROGRAM_CACHE_TRIM, cache >+ resources are released until the total cache size, in bytes, is less than or >+ equal to 'limit', and the number of bytes of memory released is returned. >+ In any error case, zero is returned. >+ >+ Errors >+ >+ None >+ >+New State >+ >+ None >+ >+Conformance Tests >+ >+ TBD >+ >+Issues >+ >+ 1. Should the cache control be a property of the display or the contexts? >+ >+ The cache itself will internally be a property of the display, since we >+ want to share caches between contexts. It is possible to design an >+ implementation with other kinds of cache sharing, such as between share >+ groups. >+ >+ We can choose to prefer simplicity of design in this case. >+ >+ RESOLVED: the cache should be a property of the display. >+ >+ 2. What should happen if the cache is modified as the user is querying its >+ contents? >+ >+ It is more difficult to design a query API such that it can be returned >+ atomically. Hence the cache can change in some cases while it is being >+ queried. This can be controlled in the application layer. It can also be >+ locked using OS-level synchronization. >+ >+ Introducing undefined behaviour can be very problematic. >+ >+ RESOLVED: we should use a mutex or similar lock to allow for multithreaded >+ access, and not expose undefined behaviour. >+ >+ 3. Should we expose the key/value semantics or just have a binary value? >+ >+ Having just the binary would eliminate one query enum, and make the APIs >+ simpler. Having both key and value represents the implementation exactly. >+ >+ RESOLVED: we should expose the key to mirror the implementation. >+ >+ 4. Should the extension allow for setting cache size limits? >+ >+ If caches are a property of the display, they could be set in >+ eglGetPlatformDisplay as an attribute. >+ >+ Cache controls can be a necessary feature for memory management. >+ >+ RESOLVED: yes, we should expose cache size controls. >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------- --------- ---------------------------------------- >+ 1 June 29, 2017 jmadill Initial version >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_query_surface_pointer.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_query_surface_pointer.txt >new file mode 100644 >index 00000000000..75126fcbc31 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_query_surface_pointer.txt >@@ -0,0 +1,88 @@ >+Name >+ >+ ANGLE_query_surface_pointer >+ >+Name Strings >+ >+ EGL_ANGLE_query_surface_pointer >+ >+Contributors >+ >+ Vladimir Vukicevic >+ Daniel Koch >+ >+Contacts >+ >+ Vladimir Vukicevic (vladimir 'at' pobox.com) >+ >+Status >+ >+ Complete >+ Implemented (ANGLE r558) >+ >+Version >+ >+ Version 3, February 11, 2011 >+ >+Number >+ >+ EGL Extension #28 >+ >+Dependencies >+ >+ This extension is written against the wording of the EGL 1.4 >+ Specification. >+ >+Overview >+ >+ This extension allows querying pointer-sized surface attributes, >+ thus avoiding problems with coercing 64-bit pointers into a 32-bit >+ integer. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ EGLBoolean eglQuerySurfacePointerANGLE( >+ EGLDisplay dpy, >+ EGLSurface surface, >+ EGLint attribute, >+ void **value); >+ >+New Tokens >+ >+ None >+ >+Additions to Chapter 3 of the EGL 1.4 Specification (EGL Functions and Errors) >+ >+ Add to the end of the paragraph starting with "To query an >+ attribute associated with an EGLSurface" in section 3.5.6, >+ "Surface Attributes": >+ >+ "If the attribute type in table 3.5 is 'pointer', then >+ eglQuerySurface returns EGL_FALSE and an EGL_BAD_PARAMETER error >+ is generated. To query pointer attributes, call: >+ >+ EGLBoolean eglQuerySurfacePointerANGLE( >+ EGLDisplay dpy, >+ EGLSurface surface, >+ EGLint attribute, >+ void **value); >+ >+ eglQuerySurfacePointerANGLE behaves identically to eglQuerySurface, >+ except that only attributes of type 'pointer' can be queried. >+ If an attribute queried via eglQuerySurfacePointerANGLE is not >+ of type 'pointer', then eglQuerySurfacePointer returns EGL_FALSE >+ and an EGL_BAD_PARAMETER error is generated." >+ >+Issues >+ >+Revision History >+ >+ Version 3, 2011/02/11 - publish >+ >+ Version 2, 2010/12/21 - fix typos. >+ >+ Version 1, 2010/12/07 - first draft. >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_robust_resource_initialization.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_robust_resource_initialization.txt >new file mode 100644 >index 00000000000..125a3edbf16 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_robust_resource_initialization.txt >@@ -0,0 +1,121 @@ >+Name >+ >+ ANGLE_robust_resource_initialization >+ >+Name Strings >+ >+ EGL_ANGLE_robust_resource_initialization >+ >+Contributors >+ >+ Geoff Lang, Google >+ Ken Russell, Google >+ >+Contacts >+ >+ Shannon Woods, Google (shannonwoods 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 4, September 19, 2017 >+ >+Number >+ >+ EGL Extension TBD >+ >+Dependencies >+ >+ This extension is written against the wording of the EGL 1.5 >+ specification. >+ >+ An OpenGL ES implementation supporting ANGLE_robust_resource_initialization >+ or an implementation supporting equivalent functionality is required. >+ >+Overview >+ >+ This extension allows creating an OpenGL ES context or EGL surface >+ supporting robust resource initialization. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as an attribute name by eglCreateContext, eglQueryContext, >+ eglCreateWindowSurface, eglCreatePbufferSurface, eglCreatePixmapSurface, >+ and eglQuerySurface: >+ >+ EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x3453 >+ >+Additions to the EGL 1.5 Specification >+ >+ Add a new section entitled "OpenGL ES Robust Resource Initialization" >+ to section 3.7.1: >+ >+ "If the attribute EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE >+ is set to EGL_TRUE, a context supporting <robust resource initialization> >+ will be created. OpenGL ES contexts must support the >+ ANGLE_robust_resource_initialization extension, or equivalent core API >+ functionality. This attribute is supported only for OpenGL ES contexts. >+ The default value of EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE >+ is EGL_FALSE." >+ >+ Add a new paragraph to section 3.7.4 "Context Queries" under >+ eglQueryContext: >+ >+ "Querying EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE returns if >+ the context was created using robust initialization." >+ >+ Add a new paragrah to section 3.5.1 "Creating On-Screen Rendering >+ Surfaces" and section 3.5.2 "Creating Off-Screen Rendering Surfaces": >+ >+ "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE specifies if the pixel >+ values of the surface are initialized. If its value is EGL_TRUE then all >+ pixel values in the surface are initialized to zero, otherwise the contents >+ are undefined. The default value of >+ EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE is EGL_FALSE." >+ >+ Add a new paragrah to section 3.5.6 "Surface Attributes" under >+ eglQuerySurface: >+ >+ "Querying EGL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE returns if >+ the surface was created using robust initialization." >+ >+ Modify the 2nd paragraph of section 3.10.1 "Posting to a Window": >+ >+ "... The contents of the color buffer are undefined if the value of the >+ EGL_SWAP_BEHAVIOR attribute of surface is not EGL_BUFFER_PRESERVED and >+ the value of the EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE is >+ EGL_FALSE. ..." >+ >+Issues >+ >+ (1) Should this be a Display or Context creation extension? >+ >+ RESOLVED (3): Making this a Context creation extension has complications in >+ the implementation - what happens to resources shared between Contexts >+ with and without the extension enabled? Also for display-created resources, >+ such as those used in the D3D11 SwapChain, there's no way to specify if >+ we want them robustly initialized. Hence it is clearer to specify this >+ extension as a Display extension. >+ >+ RESOLVED (4): This extension has been moved back to a context/surface >+ creation attribute. This makes the extension much easier to detect before >+ the GL context is created. >+ >+Revision History >+ >+ Version 1, 2015/01/07 - first draft. >+ Version 2, 2017/03/01 - renamed extension and enum. >+ Version 3, 2017/05/31 - renamed extension and made into display extension. >+ Version 4, 2017/09/19 - renamed extension and changed into a >+ context/surface creation attribute. >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_software_display.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_software_display.txt >new file mode 100644 >index 00000000000..556e1bee505 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_software_display.txt >@@ -0,0 +1,65 @@ >+Name >+ >+ ANGLE_software_display >+ >+Name Strings >+ >+ EGL_ANGLE_software_display >+ >+Contributors >+ >+ John Bauman >+ Daniel Koch >+ >+Contacts >+ >+ John Bauman, Google Inc. (jbauman 'at' chromium.org) >+ >+Status >+ >+ In progress >+ >+Version >+ >+ Version 2, October 19, 2011 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ This extension is written against the wording of the EGL 1.4 >+ Specification. >+ >+Overview >+ >+ This extension allows for receiving a device that uses software rendering. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ EGL_SOFTWARE_DISPLAY_ANGLE (EGLNativeDisplayType)-1 >+ >+Additions to Chapter 3 of the EGL 1.4 Specification (EGL Functions and Errors) >+ >+ Add before the last sentence of the first paragraph of section 3.2, >+ "Initialization": >+ >+ "If <display_id> is EGL_SOFTWARE_DISPLAY_ANGLE, a display that will render >+ everything in software will be returned." >+ >+Issues >+ >+Revision History >+ >+ Version 1, 2011/07/12 - first draft. >+ Version 2, 2011/10/18 - add token definition >+ >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_stream_producer_d3d_texture.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_stream_producer_d3d_texture.txt >new file mode 100644 >index 00000000000..67581b41855 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_stream_producer_d3d_texture.txt >@@ -0,0 +1,165 @@ >+Name >+ >+ ANGLE_stream_producer_d3d_texture >+ >+Name Strings >+ >+ EGL_ANGLE_stream_producer_d3d_texture >+ >+Contributors >+ >+ Ian Ewell >+ Geoff Lang >+ John Bauman >+ Jeff Gilbert >+ >+Contacts >+ >+ Geoff Lang, Google (geofflang âatâ google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 2, November 15, 2017 >+ >+Number >+ >+ EGL Extension #XXX >+ >+Dependencies >+ >+ Requires EGL 1.4. >+ Requires OpenGL ES 2.0. >+ >+ Requires the EGL_KHR_stream extension. >+ Requires the EGL_NV_stream_consumer_gltexture_yuv extension. >+ Requires the EGL_KHR_stream_consumer_gltexture extension. >+ Requires the EGL_ANGLE_device_d3d extension. >+ >+Overview >+ >+ This extension allows D3D11 textures to be inserted into an EGL stream >+ with the expectation that the stream consumer will be either an RGB GL >+ texture consumer, or a YUV GL texture consumer using a two plane >+ configuration (i.e. a Y plane and a UV plane). >+ This will act as the producer of the stream. >+ >+New procedures and functions >+ >+ EGLBoolean eglCreateStreamProducerD3DTextureANGLE( >+ EGLDisplay dpy, >+ EGLStreamKHR stream, >+ const EGLAttrib *attrib_list) >+ EGLBoolean eglStreamPostD3DTextureANGLE(EGLDisplay dpy, >+ EGLStreamKHR stream, >+ void *texture, >+ const EGLAttrib *attrib_list) >+ >+New Tokens >+ >+ Accepted as an <attribute> in eglStreamPostD3DTextureANGLE: >+ >+ EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE 0x33AB >+ >+Replace section "3.10.3.1 No way to connect producer to EGLStream" in the >+EGL_KHR_stream extension with this: >+ >+ 3.10.3.1 Stream Surface Producer >+ >+ Call >+ >+ EGLBoolean eglCreateStreamProducerD3DTextureANGLE( >+ EGLDisplay dpy, >+ EGLStreamKHR stream, >+ const EGLAttrib *attrib_list) >+ >+ to create a producer that accepts D3D11 textures and connect it as the >+ producer of <stream>. <attrib_list> is used to specify attributes for the >+ stream producer. Currently there are no attributes to specify, and the >+ attribute list is used as a placeholder for future additions. >+ >+ On failure, eglCreateStreamProducerD3DTextureANGLE returns EGL_FALSE and >+ generates an error. >+ >+ - EGL_BAD_STATE_KHR is generated if <stream> is not in the state >+ EGL_STREAM_STATE_CONNECTING_KHR. >+ >+ - EGL_BAD_MATCH is generated if <stream> does not have a connected GL >+ texture consumer. >+ >+ - EGL_BAD_STREAM_KHR is generated if <stream> is not a valid EGLStream >+ generated for <dpy>. >+ >+ - EGL_BAD_DISPLAY is generated if <dpy> is not a valid, initialized >+ display. >+ >+Add a section preceding "3.9.3 Posting Semantics" in the EGL specification: >+ >+ 3.9.x Posting to a Stream >+ >+ To post a D3D11 texture to a stream, call >+ >+ EGLBoolean eglStreamPostD3DTextureANGLE( >+ EGLDisplay dpy, >+ EGLStreamKHR stream, >+ void *texture, >+ const EGLAttrib *attrib_list); >+ >+ If <stream> is an appropriately configured stream and <texture> points to a >+ valid ID3D11Texture2D object of a supported format that is owned >+ by the same ID3D11Device that is queried with the EGL_ANGLE_device_d3d >+ extension, the texture will be posted to the stream and can be bound as one >+ or more OpenGL texture objects. >+ >+ The parameter <attrib_list> allows for per-frame attributes to be specified >+ along with the texture. The only parameter currently available is >+ EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE, which allows the subresource id of >+ the texture that will be used to be specified. If this attribute is not >+ explicitly specified, it will default to the value of 0. >+ >+ It is the responsibility of the application to perform any synchronization >+ between the insertion of the frame into the stream and the use of the >+ consumer textures output by the stream. The EGL_CONSUMER_LATENCY_USEC_KHR >+ attribute will have no effect on the function of the implementation of this >+ extension, but can still be used for communication between components of >+ the application. >+ >+ The implementation will hold a reference to the D3D11 texture object if the >+ insertion is successful and will release the texture object when a new frame >+ is inserted or when the stream is destroyed. >+ >+ On failure, eglStreamInsertD3DTexture returns EGL_FALSE and generates an >+ error. >+ >+ - EGL_BAD_STATE is generated if <stream> is not in the state >+ EGL_STREAM_STATE_EMPTY_KHR, EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR, >+ or EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR. >+ >+ - EGL_BAD_MATCH is generated if the stream is not associated with a >+ D3D11 texture producer. >+ >+ - EGL_BAD_PARAMETER is generated if <texture> is not owned by the >+ queried device, is not a supported format, is not compatible with the >+ implementation, or if the specified value for >+ EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE is not a valid subresource id for >+ the texture. >+ >+ - EGL_BAD_STREAM_KHR is generated if <stream> is not a valid EGLStream. >+ >+ - EGL_BAD_ATTRIBUTE is generated if an attribute other than >+ EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE is specified in <attrib_list>. >+ >+Revision History >+ >+ #1 (April 6, 2016) Ian Ewell >+ - initial draft >+ >+ #2 (November 15, 2017) Jeff Gilbert >+ - Rename from EGL_ANGLE_stream_producer_d3d_texture_nv12 to >+ EGL_ANGLE_stream_producer_d3d_texture >+ - Remove NV12 suffix from function names >+ - add RGB GL texture consumer support >+ - reduce required EGL version to 1.4 (from 1.5) >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_surface_d3d_texture_2d_share_handle.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_surface_d3d_texture_2d_share_handle.txt >new file mode 100644 >index 00000000000..917e4456589 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_surface_d3d_texture_2d_share_handle.txt >@@ -0,0 +1,95 @@ >+Name >+ >+ ANGLE_surface_d3d_texture_2d_share_handle >+ >+Name Strings >+ >+ EGL_ANGLE_surface_d3d_texture_2d_share_handle >+ >+Contributors >+ >+ Vladimir Vukicevic >+ Daniel Koch >+ >+Contacts >+ >+ Vladimir Vukicevic (vladimir 'at' pobox.com) >+ >+Status >+ >+ Complete >+ Implemented (ANGLE r558) >+ >+Version >+ >+ Version 2, December 21, 2010 >+ >+Number >+ >+ EGL Extension #29 >+ >+Dependencies >+ >+ Requires the EGL_ANGLE_query_surface_pointer extension. >+ >+ This extension is written against the wording of the EGL 1.4 >+ Specification. >+ >+Overview >+ >+ Some EGL implementations generate EGLSurface handles that are >+ backed by Direct3D 2D textures. For such surfaces, a D3D share >+ handle can be generated, allowing access to the same surface >+ from the Direct3D API. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted in the <attribute> parameter of eglQuerySurfacePointerANGLE: >+ >+ EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200 >+ >+Additions to Chapter 3 of the EGL 1.4 Specification (EGL Functions and Errors) >+ >+ Add to table 3.5, "Queryable surface attributes and types": >+ >+ Attribute Type Description >+ --------- ---- ----------- >+ EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE pointer Direct3D share handle >+ >+ Add before the last paragraph in section 3.5, "Surface attributes": >+ >+ "Querying EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE returns a Direct3D >+ share handle, or NULL if a share handle for the surface is not >+ available. The share handle must be queried using >+ eglQuerySurfaceAttribPointerANGLE. Before using a Direct3D surface >+ created with this share handle, ensure that all rendering >+ to the EGLSurface with EGL client APIs has completed. >+ >+ The Direct3D share handle may be passed as the pSharedHandle >+ parameter of the Direct3D9Ex CreateTexture function, or via the >+ Direct3D10 OpenSharedResource function. If used with Direct3D 9, >+ the level argument to CreateTexture must be 1, and the dimensions >+ must match the dimensions of the EGL surface. If used with >+ Direct3D 10, OpenSharedResource should be called with the >+ ID3D10Texture2D uuid to obtain an ID3D10Texture2D object. >+ >+Issues >+ >+Revision History >+ >+ Version 3, 2011/02/11 - publish >+ >+ Version 2, 2010/12/21 >+ - renamed token to EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE (adding "2D") >+ - renamed extension to ANGLE_surface_d3d_texture_2d_share_handle >+ - added language about supported usage of the shared handle from D3D >+ >+ Version 1, 2010/12/07 - first draft. >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_surface_orientation.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_surface_orientation.txt >new file mode 100644 >index 00000000000..c6e3b27fe5a >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_surface_orientation.txt >@@ -0,0 +1,133 @@ >+Name >+ >+ ANGLE_surface_orientation >+ >+Name Strings >+ >+ EGL_ANGLE_surface_orientation >+ >+Contributors >+ >+ Geoff Lang, Google >+ >+Contacts >+ >+ Geoff Lang, Google (geofflang 'at' google 'dot' com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, 2015-12-15 >+ >+Number >+ >+ EGL Extension XXX >+ >+Extension Type >+ >+ EGL display extension >+ >+Dependencies >+ >+ Written based on the wording of the EGL 1.5 Specification >+ (August 7 2014). >+ >+Overview >+ >+ This extension provides a mechanism for querying the most optimal >+ orientation of a window surface and creating window sufraces with >+ non-default orientations for the most performant rendering. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ New EGLConfig bitmask attribute name: >+ >+ EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE 0x33A7 >+ >+ Accepted as an attribute name in the <attrib_list> argument of >+ eglCreateWindowSurface and attribute name in the <attribute> >+ argument of eglQuerySurface: >+ >+ EGL_SURFACE_ORIENTATION_ANGLE 0x33A8 >+ >+ Valid bitfields in the EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE bitmask >+ attribute of EGLConfig and EGL_SURFACE_ORIENTATION_ANGLE bitmask attribute >+ of eglCreateWindowSurface: >+ >+ EGL_SURFACE_ORIENTATION_INVERT_X_ANGLE 0x0001 >+ EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE 0x0002 >+ >+Additions to the EGL Specification >+ >+ Additions to Chapter 3 of the EGL 1.5 Specification (EGL Functions and Errors) >+ >+ Add to table 3.1 (EGLConfig Attributes) >+ >+ Attribute Type Notes >+ ------------------------------------- ------- ---------------------- >+ EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE bitmask Optimal window surface >+ orientation. >+ >+ >+ Add a paragraph to section 3.4, section Other EGLConfig Attribute >+ Descriptions. >+ >+ "EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE is a mask indicating which >+ window surface orientation will provide the best performance." >+ >+ Add to table 3.4 (Default values and match criteria for EGLConfig >+ attributes): >+ >+ Attribute Default Selection Sort Sort >+ Criteria Order Priority >+ ------------------------------------- ------- --------- ------- -------- >+ EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE 0 Exact None >+ >+ Add a paragraph to section 3.5.1, section Creating On-Screen Rendering >+ Surfaces. >+ >+ EGL_SURFACE_ORIENTATION_ANGLE attribute specifies how the surface's content >+ will appear on the screen. If its value contains >+ EGL_SURFACE_ORIENTATION_INVERT_X_ANGLE then all displayed content will be >+ inverted along the vertical axis. Similarly, if its value contains >+ EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE then all displayed content will be >+ inverted along the horizontal axis. >+ >+ Add to table 3.5 (Queryable surface attributes and types): >+ >+ Attribute Type Description >+ ----------------------------- ------- ---------------------- >+ EGL_SURFACE_ORIENTATION_ANGLE bitmask Orientation of surface >+ >+ Add a paragraph to section 3.5.6, Surface Attributes: >+ >+ "Querying EGL_SURFACE_ORIENTATION_ANGLE returns the orientation of the >+ surface. For a window surface, this is the same attribute value specified >+ when the surface was created. For other types of surfaces, it is always >+ 0." >+ >+Issues >+ >+ 1) What about dirty regions and sub regions specified by extensions such as >+ NV_post_sub_buffer? >+ >+ These regions will be applied to the same region of the window as >+ before because they are often specified based on events from the >+ operating system. The content in these regions will be displayed >+ according to the value of EGL_SURFACE_ORIENTATION_ANGLE. >+ >+Revision History >+ >+ Version 1, 2015-12-15 (Geoff Lang) >+ - Initial draft >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_window_fixed_size.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_window_fixed_size.txt >new file mode 100644 >index 00000000000..f6a86ab0362 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_window_fixed_size.txt >@@ -0,0 +1,160 @@ >+Name >+ >+ ANGLE_window_fixed_size >+ >+Name Strings >+ >+ EGL_ANGLE_window_fixed_size >+ >+Contributors >+ >+ John Bauman >+ Shannon Woods >+ Geoff Lang >+ >+Contacts >+ >+ John Bauman, Google Inc. (jbauman 'at' google.com) >+ >+Status >+ >+ Complete >+ >+Version >+ >+ Version 5, July 23, 2018 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ This extension is written against the wording of the EGL 1.4 >+ Specification. >+ >+Overview >+ >+ This extension allows creating a window surface that does not resize >+ automatically. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted by the <attribute> parameter of eglQuerySurface and by the >+ <attrib_list> parameter of eglCreateWindowSurface: >+ >+ EGL_FIXED_SIZE_ANGLE 0x3201 >+ >+Additions to Chapter 3 of the EGL 1.4 Specification: >+ >+ Modify the third paragraph of Section 3.5.1 (Creating On-Screen Rendering >+ Surfaces) >+ >+ "<attrib_list> specifies a list of attributes for the window. The list has >+ the same structure as described for eglChooseConfig. Attributes that can >+ be specified in <attrib_list> include EGL_RENDER_BUFFER, >+ EGL_VG_COLORSPACE, EGL_VG_ALPHA_FORMAT, EGL_FIXED_SIZE_ANGLE, EGL_WIDTH, >+ and EGL_HEIGHT." >+ >+ Add before the last paragraph of Section 3.5.1 >+ >+ "EGL_FIXED_SIZE_ANGLE specifies whether the surface must be resized by the >+ implementation when the native window is resized. The default value is >+ EGL_FALSE. Its value can be EGL_TRUE, in which case the size must be >+ specified when the window is created, or EGL_FALSE, in which case the size >+ is taken from the native window. Its default value is EGL_FALSE. >+ >+ If the value of EGL_FIXED_SIZE_ANGLE is EGL_TRUE, the window surface's >+ size in pixels is specified by the EGL_WIDTH and EGL_HEIGHT attributes. >+ If its value is EGL_FALSE, then the values of EGL_WIDTH and EGL_HEIGHT >+ are ignored and the window surface must be resized by the implementation >+ subsequent to the native window being resized, and prior to copying its >+ contents to the native window (e.g. in eglSwapBuffers, as described in >+ section 3.9.1.1). The default values for EGL_WIDTH and EGL_HEIGHT are zero. >+ If the value specified for either of EGL_WIDTH or EGL_HEIGHT is less than >+ zero then an EGL_BAD_PARAMETER error is generated." >+ >+ Add the following entry to Table 3.5 >+ (Queryable surface attributes and types) >+ >+ Attribute Type Description >+ -------------------- ------- --------------------------------------------- >+ EGL_FIXED_SIZE_ANGLE boolean Surface will not be resized with a native >+ window >+ >+ Replace the last paragraph on page 37 in Section 3.5.6 (Surface Attributes) >+ >+ "Querying EGL_WIDTH and EGL_HEIGHT returns respectively the width and >+ height, in pixels, of the surface. For a pixmap surface or window surface >+ with EGL_FIXED_SIZE_ANGLE set to EGL_FALSE, these values are initially >+ equal to the width and height of the native window or pixmap with respect >+ to which the surface was created. If the native window is resized and the >+ corresponding window surface is not fixed size, the corresponding window >+ surface will eventually be resized by the implementation to match (as >+ discussed in section 3.9.1). If there is a discrepancy because EGL has not >+ yet resized the window surface, the size returned by eglQuerySurface will >+ always be that of the EGL surface, not the corresponding native window." >+ >+ Alter the beginning of the first paragraph of Section 3.5.6 (Surface >+ Attributes) >+ >+ "The specified attribute of surface is set to value. Attributes that can >+ be specified are EGL_MIPMAP_LEVEL, EGL_MULTISAMPLE_RESOLVE, >+ EGL_SWAP_BEHAVIOR, EGL_WIDTH, and EGL_HEIGHT." >+ >+ Add the following paragraph to Section 3.5.6 (Surface Attributes) >+ >+ "If attribute is EGL_WIDTH or EGL_HEIGHT then the value specifies the new >+ surface width or height respectively. The new width and height are not >+ guarenteed to be applied until the next call to eglSwapBuffers or >+ eglWaitNative. If the surface does not have EGL_FIXED_SIZE_ANGLE set then >+ an EGL_BAD_MATCH error is generated." >+ >+ Add the following paragraph to Section 3.5.6 (Surface Attributes) >+ >+ "Querying EGL_FIXED_SIZE_ANGLE returns EGL_FALSE if the surface will be >+ resized to match a native window, and EGL_TRUE if the surface cannot be >+ resized." >+ >+ Alter the beginning of the first paragraph of Section 3.9.1.1 (Native >+ Window Resizing) >+ >+ "If the surface has EGL_FIXED_SIZE_ANGLE set and EGL_WIDTH or EGL_HEIGHT >+ have changed or the surface does not have EGL_FIXED_SIZE_ANGLE set and its >+ corresponding native window has been resized prior to the swap, surface >+ must be resized to match". >+ >+Issues >+ >+ 1. Should there be a way to resize a window surface that had its size >+ specified initially. >+ >+ RESOLVED: No. Surfaces that have their sizes specified initially must have >+ EGL_FIXED_SIZE_ANGLE set and can never be resized. >+ >+ RESOLVED(rev 5): Fixed size surfaces can now be resized by setting >+ EGL_WIDTH and EGL_HEIGHT surface attributes. This is the best way to give >+ users explicit control of the size of window surfaces without re-creating >+ them on each resize. >+ >+Revision History >+ >+ Version 5, 2018/07/23 - Allow reizing fixed size surfaces. >+ >+ Version 4, 2014/02/24 - formatting changes. >+ >+ Version 3, 2014/02/12 - ignore EGL_WIDTH and EGL_HEIGHT if >+ EGL_FIXED_SIZE_ANGLE is EGL_FALSE >+ >+ Version 2, 2014/02/07 - rename to EGL_ANGLE_window_fixed_size, and add an >+ EGL_FIXED_SIZE_ANGLE token. >+ >+ Version 1, 2014/02/05 - first draft. >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_x11_visual.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_x11_visual.txt >new file mode 100644 >index 00000000000..d77561e4326 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_x11_visual.txt >@@ -0,0 +1,106 @@ >+Name >+ >+ ANGLE_x11_visual >+ >+Name Strings >+ >+ EGL_ANGLE_x11_visual >+ >+Contributors >+ >+ Corentin Wallez, Google >+ Shannon Woods, Google >+ Jamie Madill, Google >+ Geoff Lang, Google >+ >+Contacts >+ >+ Corentin Wallez, Google (cwallez 'at' chromium 'dot' org) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, 2015-11-13 >+ >+Number >+ >+ EGL Extension XXX >+ >+Extension Type >+ >+ EGL client extension >+ >+Dependencies >+ >+ Requires EGL_EXT_client_extensions to query its existence without >+ a display. >+ >+ Requires EGL_EXT_platform_base. >+ >+ This extension is written against the wording of version 9 of the >+ EGL_EXT_platform_base specification. >+ >+ Written based on the wording of the EGL 1.5 Specification >+ (August 7 2014). >+ >+Overview >+ >+ This extension allows passing the X11 visual ID used by the native >+ EGL surface types at display creation time. This will restrict >+ EGLSurfaces to be created from native types with this visual ID, >+ which may allow the created display to be more compatible and >+ performant. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as an attribute name in the <attrib_list> argument of >+ eglGetPlatformDisplayEXT: >+ >+ EGL_X11_VISUAL_ID_ANGLE 0x33A3 >+ >+Additions to the EGL Specification >+ >+ Modify section 3.5.1 (Creating On-Screen Rendering Surfaces), p. 34 >+ >+ Append the following to the errors of CreateWindowSurface: >+ >+ "If an X11 visual was specified at display creation time using >+ EGL_ANGLE_X11_VISUAL_ID that is not equal to the ID of the >+ native_window's visual, an EGL_BAD_MATCH error is generated and >+ EGL_NO_SURFACE is returned." >+ >+New Behavior >+ >+ To request a display created with a X11 visual ID, the value of >+ EGL_ANGLE_X11_VISUAL_ID should be set to a valid X11 visual ID. If >+ present, this ID will be used during display creation to make a >+ display that is more compatible and potentially more performant when >+ used with EGLsurfaces created from native types with this ID. If the >+ visual ID passed isn't a valid visual ID, eglGetPlatformDisplay will >+ return EGL_NO_DISPLAY and generate an EGL_NOT_INITIALIZED error. >+ >+Issues >+ >+ 1) When the hint is present, should EGLsurface creation functions >+ only accept native types with the hint's visual ID? >+ >+ RESOLVED: Yes, generate an error when the visual of the native >+ surface doesn't match. This will avoid having hidden performance >+ or compatibility losses when using this extension. >+ >+Revision History >+ >+ Version 1, 2015-11-13 (Corentin Wallez) >+ - Initial draft >+ >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_CHROMIUM_create_context_bind_generates_resource.txt b/Source/ThirdParty/ANGLE/extensions/EGL_CHROMIUM_create_context_bind_generates_resource.txt >new file mode 100644 >index 00000000000..7b623e924a3 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_CHROMIUM_create_context_bind_generates_resource.txt >@@ -0,0 +1,87 @@ >+Name >+ >+ CHROMIUM_create_context_bind_generates_resource >+ >+Name Strings >+ >+ EGL_CHROMIUM_create_context_bind_generates_resource >+ >+Contributors >+ >+ Geoff Lang >+ >+Contacts >+ >+ Geoff Lang (geofflang 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, September 21, 2016 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ Requires EGL 1.4. >+ >+ Written against the EGL 1.4 specification. >+ >+ This spec interacts with GL_CHROMIUM_bind_generates_resource (or >+ equivalent) extension. >+ >+Overview >+ >+ This extension allows the creation of an OpenGL or OpenGL ES context that >+ allows or disallows implicit creation of OpenGL resources on bind. >+ >+New Types >+ >+ None >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as an attribute name in the <*attrib_list> argument to >+ eglCreateContext: >+ >+ EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM 0x33AD >+ >+Additions to the EGL 1.4 Specification >+ >+ Add the following to section 3.7.1 "Creating Rendering Contexts": >+ >+ EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM indicates whether the context >+ should be created with the GL_BIND_GENERATES_RESOURCE_CHROMIUM state >+ initialized to GL_TRUE or GL_FALSE. The default value of >+ EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM is EGL_TRUE. >+ >+Errors >+ >+ None >+ >+New State >+ >+ None >+ >+Conformance Tests >+ >+ TBD >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------- --------- ---------------------------------------- >+ 1 Sept 21, 2016 geofflang Initial version >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_CHROMIUM_get_sync_values.txt b/Source/ThirdParty/ANGLE/extensions/EGL_CHROMIUM_get_sync_values.txt >new file mode 100644 >index 00000000000..d95b348c845 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_CHROMIUM_get_sync_values.txt >@@ -0,0 +1,131 @@ >+Name >+ >+ CHROMIUM_get_sync_values >+ >+Name Strings >+ >+ EGL_CHROMIUM_get_sync_values >+ >+Contact >+ >+ Stéphane Marchesin, Google (marcheu 'at' google.com) >+ >+Status >+ >+ Draft. >+ >+Version >+ >+ Last Modified Date: N/A Revision: 1.0 >+ >+ Based on GLX_OML_sync_control Revision 6.0 >+ >+Number >+ >+ ??? >+ >+Dependencies >+ >+ The extension is written against the EGL 1.2 Specification, although it >+ should work on other versions of these specifications. This extension >+ also requires an operating system which supports CLOCK_MONOTONIC. >+ >+Overview >+ >+ This extension provides counters which let applications know about the >+ timing of the last vertical retrace. By looking at the system clock, as >+ well as the refresh rate of the monitor, this should enable applications >+ to predict the position of future retraces so as to schedule an optimal >+ workload. >+ >+ This extension incorporates the use of three counters that provide >+ the necessary synchronization. The Unadjusted System Time (or UST) >+ is the 64-bit CLOCK_MONOTONIC clock; in particular this lets the >+ application schedule future vertical retraces by querying this clock. >+ The graphics Media Stream Counter (or graphics MSC) is a counter >+ that is unique to the graphics subsystem and increments for each >+ vertical retrace that occurs. The Swap Buffer Counter (SBC) is an >+ attribute of an EGLSurface and is incremented each time a swap >+ buffer action is performed on the associated surface. >+ >+ The use of these three counters allows the application to >+ synchronize graphics rendering to vertical retraces and/or swap >+ buffer actions. For example, by querying the synchronization values for >+ a given surface, the application can accurately predict the timing for >+ the next vertical retraces and schedule rendering accordingly. >+ >+Issues >+ >+ None. >+ >+IP Status >+ >+ No known issues. >+ >+New Procedures and Functions >+ >+ Bool eglGetSyncValuesCHROMIUM(EGLDisplay dpy, >+ EGLSurface surface, >+ int64_t* ust, >+ int64_t* msc, >+ int64_t* sbc) >+ >+ >+New Tokens >+ >+ None >+ >+Additions to the EGL 1.3 Specification >+ >+ eglGetSyncValuesCHROMIUM returns the current UST/MSC/SBC triple. A UST >+ timestamp is obtained each time the graphics MSC is incremented. >+ If this value does not reflect the value of the UST at the time the >+ first scan line of the display begins passing through the video >+ output port, it will be adjusted by the graphics driver to do so >+ prior to being returned by any of the functions defined by this >+ extension. >+ >+ This UST timestamp, together with the current graphics MSC and the >+ current SBC, comprise the current UST/MSC/SBC triple. The UST, >+ graphics MSC, and SBC values are not part of the render context >+ state. These values cannot be pushed or popped. The graphics MSC >+ value is initialized to 0 when the graphics device is initialized. >+ The SBC is per-surface state and is initialized to 0 when the >+ EGLSurface data structure is initialized. >+ >+ The SBC value is incremented by the graphics driver at the completion >+ of each buffer swap (e.g., the pixel copy has been completed or the >+ hardware register that swaps memory banks has been written). For pixel >+ formats that do not contain a back buffer, the SBC will always be >+ returned as 0. >+ >+ The graphics MSC value is incremented once for each screen refresh. >+ For a non-interlaced display, this means that the graphics MSC value >+ is incremented for each frame. For an interlaced display, it means >+ that it will be incremented for each field. For a multi-monitor >+ system, the monitor used to determine MSC is the one where the surface >+ is located. If the surface spans multiple monitors, the monitor used >+ to determine MSC is the one with the biggest coverage in pixels. >+ >+ The function eglGetSyncValuesCHROMIUM will return TRUE if the function >+ completed successfully, FALSE otherwise. >+ >+ Each time eglSwapBuffer succeeds, the SBC will be increased within a >+ finite time period. >+ >+Errors >+ >+ eglGetSyncValuesCHROMIUM will return FALSE if there is no current >+ EGLContext. >+ >+New State >+ >+ Get Value Get Command Type Initial Value >+ --------- ----------- ---- ------------- >+ [UST] eglGetSyncValuesCHROMIUM Z unspecified >+ [MSC] eglGetSyncValuesCHROMIUM Z 0 >+ [SBC] eglGetSyncValuesCHROMIUM Z 0 >+ >+New Implementation Dependent State >+ >+ None >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_EXT_create_context_robustness.txt b/Source/ThirdParty/ANGLE/extensions/EGL_EXT_create_context_robustness.txt >new file mode 100644 >index 00000000000..a78f8789ea1 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_EXT_create_context_robustness.txt >@@ -0,0 +1,169 @@ >+Name >+ >+ EXT_create_context_robustness >+ >+Name Strings >+ >+ EGL_EXT_create_context_robustness >+ >+Contributors >+ >+ Daniel Koch, TransGaming >+ Contributors to EGL_KHR_create_context >+ >+Contact >+ >+ Greg Roth (groth 'at' nvidia.com) >+ >+Status >+ >+ Complete. >+ >+Version >+ >+ Version 3, 2011/10/31 >+ >+Number >+ >+ EGL Extension #37 >+ >+Dependencies >+ >+ Requires EGL 1.4 >+ >+ Written against the EGL 1.4 specification. >+ >+ An OpenGL implementation supporting GL_ARB_robustness, an OpenGL ES >+ implementation supporting GL_EXT_robustness, or an implementation >+ supporting equivalent functionality is required. >+ >+Overview >+ >+ This extension allows creating an OpenGL or OpenGL ES context >+ supporting robust buffer access behavior and a specified graphics >+ reset notification behavior. >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted as an attribute name in the <*attrib_list> argument to >+ eglCreateContext: >+ >+ EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT 0x30BF >+ EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138 >+ >+ Accepted as an attribute value for EGL_CONTEXT_RESET_NOTIFICATION_- >+ STRATEGY_EXT in the <*attrib_list> argument to eglCreateContext: >+ >+ EGL_NO_RESET_NOTIFICATION_EXT 0x31BE >+ EGL_LOSE_CONTEXT_ON_RESET_EXT 0x31BF >+ >+Additions to the EGL 1.4 Specification >+ >+ Replace section 3.7.1 "Creating Rendering Contexts" from the >+ fifth paragraph through the seventh paragraph: >+ >+ <attrib_list> specifies a list of attributes for the context. The >+ list has the same structure as described for eglChooseConfig. If an >+ attribute is not specified in <attrib_list>, then the default value >+ specified below is used instead. <attrib_list> may be NULL or empty >+ (first attribute is EGL_NONE), in which case attributes assume their >+ default values as described below. Most attributes are only meaningful >+ for specific client APIs, and will generate an EGL_BAD_ATTRIBUTE >+ error when specified to create for another client API context. >+ >+ Context Versions >+ ---------------- >+ >+ EGL_CONTEXT_CLIENT_VERSION determines which version of an OpenGL ES >+ context to create. This attribute may only be specified when creating >+ an OpenGL ES context (e.g. when the current rendering API is >+ EGL_OPENGL_ES_API). An attribute value of 1 specifies creation of an >+ OpenGL ES 1.x context. An attribute value of 2 specifies creation of an >+ Open GL ES 2.x context. The default value for EGL_CONTEXT_CLIENT_VERSION >+ is 1. >+ >+ Context Robust Access >+ ------------- >+ >+ EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT indicates whether <robust buffer >+ access> should be enabled for the OpenGL ES context. Robust buffer >+ access is defined in the GL_EXT_robustness extension specification, >+ and the resulting context must support GL_EXT_robustness and robust >+ buffer access as described therein. The default value of >+ EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT is EGL_FALSE. >+ >+ Context Reset Notification >+ -------------------------- >+ >+ The attribute name EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_- >+ EXT specifies the <reset notification behavior> of the rendering >+ context. This attribute is only meaningful for OpenGL ES contexts, >+ and specifying it for other types of contexts will generate an >+ EGL_BAD_ATTRIBUTE error. >+ >+ Reset notification behavior is defined in the GL_EXT_robustness >+ extension for OpenGL ES, and the resulting context must support >+ GL_EXT_robustness and the specified reset strategy. The attribute >+ value may be either EGL_NO_RESET_NOTIFICATION_EXT or EGL_LOSE_- >+ CONTEXT_ON_RESET_EXT, which respectively result in disabling >+ delivery of reset notifications or the loss of all context state >+ upon reset notification as described by the GL_EXT_robustness. The >+ default value for EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT >+ is EGL_NO_RESET_NOTIFICATION_EXT. >+ >+ Add to the eglCreateContext context creation errors: >+ >+ * If <config> does not support a client API context compatible >+ with the requested context flags and context reset notification >+ behavior (for client API types where these attributes are >+ supported), then an EGL_BAD_CONFIG error is generated. >+ >+ * If the reset notification behavior of <share_context> and the >+ newly created context are different then an EGL_BAD_MATCH error is >+ generated. >+ >+ >+Errors >+ >+ EGL_BAD_CONFIG is generated if EGL_CONTEXT_OPENGL_ROBUST_ACCESS_- >+ EXT is set to EGL_TRUE and no GL context supporting the GL_EXT_- >+ robustness extension and robust access as described therein can be >+ created. >+ >+ EGL_BAD_CONFIG is generated if no GL context supporting the >+ GL_EXT_robustness extension and the specified reset notification >+ behavior (the value of attribute EGL_CONTEXT_RESET_NOTIFICATION_- >+ STRATEGY_EXT) can be created. >+ >+ BAD_MATCH is generated if the reset notification behavior of >+ <share_context> does not match the reset notification behavior of >+ the context being created. >+ >+New State >+ >+ None >+ >+Conformance Tests >+ >+ TBD >+ >+Sample Code >+ >+ TBD >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------ --------- ---------------------------------------- >+ 3 31 Oct 2011 groth Reverted to attribute for robust access. Now it's a >+ companion to rather than subset of KHR_create_context >+ 2 11 Oct 2011 groth Merged ANGLE and NV extensions. >+ 1 15 July 2011 groth Initial version >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_EXT_device_query.txt b/Source/ThirdParty/ANGLE/extensions/EGL_EXT_device_query.txt >new file mode 100644 >index 00000000000..d92fb6dceeb >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_EXT_device_query.txt >@@ -0,0 +1,188 @@ >+Name >+ >+ EXT_device_query >+ >+Name Strings >+ >+ EGL_EXT_device_query >+ >+Contributors >+ >+ James Jones, NVIDIA (jajones 'at' nvidia.com) >+ Jamie Madill, Google (jmadill 'at' google.com) >+ >+Contacts >+ >+ Jamie Madill, Google (jmadill 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1 - Mar 25rd, 2015 >+ >+Number >+ >+ EGL Extension #XXX >+ >+Extension Type >+ >+ EGL client extension >+ >+Dependencies >+ >+ Written against the wording of EGL 1.5. >+ >+ Requires EGL 1.5 or an earlier verison of EGL with the >+ EGL_EXT_client_extensions extension. >+ >+Overview >+ >+ Increasingly, EGL and its client APIs are being used in place of >+ "native" rendering APIs to implement the basic graphics >+ functionality of native windowing systems. This creates demand >+ for a method to access native GPU or device objects directly >+ rather than calling EGL or GL entry points. >+ >+ This extension defines the method for an application to query >+ native device objects from an EGL Display. >+ >+New Types >+ >+ This is the type of a handle that represents an EGLDeviceEXT >+ object. >+ >+ typedef void* EGLDeviceEXT; >+ >+ If EGL 1.5 is not supported, the following type is added, as >+ defined in the EGL 1.5 specification: >+ >+ typedef intptr_t EGLAttrib; >+ >+New Functions >+ >+ EGLBoolean eglQueryDeviceAttribEXT(EGLDeviceEXT device, >+ EGLint attribute, >+ EGLAttrib *value); >+ >+ const char *eglQueryDeviceStringEXT(EGLDeviceEXT device, >+ EGLint name); >+ >+ EGLBoolean eglQueryDisplayAttribEXT(EGLDisplay dpy, >+ EGLint attribute, >+ EGLAttrib *value); >+ >+New Tokens >+ >+ Functions with a return type of EGLDeviceEXT will return this >+ value on failure: >+ >+ EGL_NO_DEVICE_EXT ((EGLDeviceEXT)0) >+ >+ This error value will be generated by functions that take an >+ EGLDeviceEXT object as a parameter: >+ >+ EGL_BAD_DEVICE_EXT 0x322B >+ >+ Accepted by the <attribute> parameter of >+ eglQueryDisplayAttribEXT: >+ >+ EGL_DEVICE_EXT 0x322C >+ >+Add a new section "2.1.2 Devices" after "2.1.1 Scalar Types" >+ >+ All EGL operations occur on an EGLDeviceEXT. However, devices >+ themselves expose no functionality. They are simple abstract >+ objects that exist only for the sake of enumeration and >+ defining a namespace. >+ >+Modify the last sentence of section "2.1.3" Displays" to read: >+ >+ Besides devices, objects are always specified by the combination >+ of an EGLDisplay parameter with a parameter representing the >+ handle of the object. >+ >+Add a new extension type to the list in section "2.8 Extensions" >+ >+ Device Extensions >+ A *device extension* adds functionality to an individual >+ EGLDeviceEXT. Different instances of EGLDeviceEXT may support >+ different sets of device extensions >+ >+Add a new error to section "3.1 Errors" >+ >+ EGL_BAD_DEVICE_EXT >+ An EGLDeviceEXT argument does not refer to a valid >+ EGLDeviceEXT. Any command taking an EGLDeviceEXT parameter >+ may generate this error. >+ >+Add a section "3.2 Devices" after "3.1 Errors" >+ >+ To query the properties of a device, use: >+ >+ EGLBoolean eglQueryDeviceAttribEXT(EGLDeviceEXT device, >+ EGLint attribute, >+ EGLAttrib *value); >+ >+ On success, EGL_TRUE is returned and the requested attribute value >+ is returned in <value>. Currently there are no valid values of >+ <attribute> defined. >+ >+ On failure, EGL_FALSE is returned. An EGL_BAD_ATTRIBUTE error is >+ generated if <attribute> is not a valid attribute. An >+ EGL_BAD_DEVICE_EXT error is generated if <device> is not a valid >+ EGLDeviceEXT. >+ >+ const char *eglQueryDeviceStringEXT(EGLDeviceEXT device, >+ EGLint name); >+ >+ returns a pointer to a static, zero-terminated string describing >+ some aspect of the specified EGLDeviceEXT. <name> must be >+ EGL_EXTENSIONS. >+ >+ The EGL_EXTENSIONS string describes which device extensions are >+ supported by <device>. The string is of the same format specified >+ for display and client extension strings in section 3.4. Note that >+ device extensions are properties of the device, and are distinct >+ from other extension strings. >+ >+ On failure, NULL is returned. An EGL_BAD_DEVICE_EXT error is >+ generated if <device> is not a valid EGLDeviceEXT. An >+ EGL_BAD_PARAMETER error is generated if <name> is not one of the >+ values described above. >+ >+Add a section "3.4 Display Attributes" after "3.3 EGL Versioning" >+ >+ To query attributes of an initialized display, use: >+ >+ EGLBoolean eglQueryDisplayAttribEXT(EGLDisplay dpy, >+ EGLint name, >+ EGLAttrib *value); >+ >+ On success, EGL_TRUE is returned. If <name> is EGL_DEVICE_EXT, >+ the EGLDeviceEXT associated with <dpy> is returned in <value>. >+ All displays have an associated EGLDeviceEXT, regardless of how >+ they were created. A successful query of EGL_DEVICE_EXT will >+ never return EGL_NO_DEVICE_EXT. >+ >+ On failure, EGL_FALSE is returned. An EGL_NOT_INITIALIZED error >+ is generated if EGL is not initialized for <dpy>. An >+ EGL_BAD_ATTRIBUTE error is generated if <name> is not a valid >+ value. >+ >+ Because the EGLDeviceEXT is a property of <dpy>, any use of an >+ associated EGLDeviceEXT after <dpy> has been terminated gives >+ undefined results. Querying an EGL_DEVICE_EXT from <dpy> after a >+ call to eglTerminate() (and subsequent re-initialization) may >+ return a different value. >+ >+Issues >+ >+ None. >+ >+Revision History: >+ >+ #1 (Mar 25rd, 2015) Jamie Madill >+ - Initial Draft based on EGL_EXT_device_base >diff --git a/Source/ThirdParty/ANGLE/extensions/EXT_blend_func_extended.txt b/Source/ThirdParty/ANGLE/extensions/EXT_blend_func_extended.txt >new file mode 100644 >index 00000000000..13f93e68851 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EXT_blend_func_extended.txt >@@ -0,0 +1,771 @@ >+Name >+ >+ EXT_blend_func_extended >+ >+Name Strings >+ >+ GL_EXT_blend_func_extended >+ >+Contact >+ >+ Mark Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com) >+ >+Contributors >+ >+ Daniel Koch, NVIDIA >+ Slawomir Grajewski, Intel >+ Chris Dalton, NVIDIA >+ Brian Salomon, Google >+ >+ From ARB_blend_func_extended... >+ >+ Graham Sellers, AMD >+ Mark Young, AMD >+ Nick Haemel, AMD >+ Pierre Boudier, AMD >+ Mais Alnasser, AMD >+ Jeff Bolz, NVIDIA >+ Pat Brown, NVIDIA >+ Ian Stewart, NVIDIA >+ Jon Leech, Khronos >+ >+Status >+ >+ Draft, almost complete >+ >+Version >+ >+ Last Modified Date: July 29, 2015 >+ Revision: 5 >+ >+Number >+ >+ XXX >+ >+Dependencies >+ >+ This extension is written against the OpenGL ES 3.1 (June 4, 2014) >+ specification, but can apply to earlier versions back to ES 2.0. >+ >+ GLSL version 300 and 310 language is written against The OpenGL ES >+ Shading Language (July 11, 2012). >+ >+ GLSL version 100 language is written against The OpenGL ES Shading >+ Language (May 12, 2009). >+ >+ The NV_draw_buffers and EXT_draw_buffers extensions trivially affect >+ the definition of this extension. >+ >+ The EXT_draw_buffers_indexed extension affects the definition of >+ this extension. >+ >+Overview >+ >+ This extension provides an ES version of the ARB_blend_func_extended >+ functionality. >+ >+ Traditional OpenGL includes fixed-function blending that combines >+ source colors with the existing content of a render buffer in >+ a variety of ways. A number of extensions have enhanced this >+ functionality by adding further sources of blending weights and >+ methods to combine them. However, the inputs to the fixed-function >+ blending units are constrained to a source color (as output from >+ fragment shading), destination color (as the current content of the >+ frame buffer) or constants that may be used in their place. >+ >+ This extension adds new blending functions whereby a fragment >+ shader may output two colors, one of which is treated as the >+ source color, and the other used as a blending factor for either >+ source or destination colors. Furthermore, this extension increases >+ orthogonality by allowing the SRC_ALPHA_SATURATE function to be used >+ as the destination weight. >+ >+ Because of the limitations of the OpenGL ES 2.0 shading language, >+ new built-in variables (gl_SecondaryFragColorEXT, >+ gl_SecondaryFragDataEXT) are added to the ES 1.00 shading language >+ rather than introduce more complex features for user-defined fragment >+ outputs. Because such built-in variable are deprecated in ES 3.0, >+ these variables are NOT available in the OpenGL ES 3.xx shading >+ language verisons. >+ >+IP Status >+ >+ No known IP claims. >+ >+New Procedures and Functions >+ >+ void BindFragDataLocationIndexedEXT(uint program, uint colorNumber, >+ uint index, const char * name); >+ >+ int GetFragDataIndexEXT(uint program, const char * name); >+ >+ void BindFragDataLocationEXT(uint program, uint colorNumber, const char * name) >+ >+ int GetProgramResourceLocationIndexEXT(uint program, enum programInterface, const char *name); >+ >+New Tokens >+ >+ Accepted by the <src> and <dst> parameters of BlendFunc and >+ BlendFunciEXT, and by the <srcRGB>, <dstRGB>, <srcAlpha> and <dstAlpha> >+ parameters of BlendFuncSeparate and BlendFuncSeparateiEXT: >+ >+ SRC1_COLOR_EXT 0x88F9 >+ SRC1_ALPHA_EXT 0x8589 // OpenGL 1.5 token value >+ ONE_MINUS_SRC1_COLOR_EXT 0x88FA >+ ONE_MINUS_SRC1_ALPHA_EXT 0x88FB >+ SRC_ALPHA_SATURATE_EXT 0x0308 >+ >+ Accepted in the <props> array of GetProgramResourceiv: >+ >+ LOCATION_INDEX_EXT 0x930F >+ >+ Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, >+ and GetFloatv: >+ >+ MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC >+ >+Additions to Chapter 7 of the OpenGL ES 3.1 Specification (Programs and >+Shaders) >+ >+ Add a row to table 7.2 "GetProgramResourceiv properties and supported >+ interfaces" (page 82): >+ >+ Property Supported Interfaces >+ ------------------ -------------------- >+ LOCATION_INDEX_EXT PROGRAM_OUTPUT >+ >+ Modify section 7.3.1.1 "Naming Active Resources" subsection to include >+ after the LOCATION paragraph (page 84): >+ >+ "For the property LOCATION_INDEX_EXT, a single integer identifying the >+ fragment color index of an active fragment shader output variable >+ is written to params. If the active variable is not an output for a >+ fragment shader, the value -1 will be written to params." >+ >+ Modify (page 87) the paragraph introducing GetProgramResourceLocation >+ to begin: >+ >+ "The commands >+ >+ int GetProgramResourceLocation( uint program, >+ enum programInterface, const char *name ); >+ int GetProgramResourceLocationIndexEXT( uint program, >+ enum programInterface, const char *name ); >+ >+ return the location or the fragment color index, respectively, >+ assigned to the variable named name in interface programInterface >+ of program object program." >+ >+ Change the ending of the same paragraph to read: >+ >+ "For GetProgramResourceLocationIndexEXT, programInterface must be >+ PROGRAM_OUTPUT. The value -1 will be returned by either command if >+ an error occurs, if name does not identify an active variable on >+ programInterface, or if name identifies an active variable that >+ does not have a valid location assigned, as described above. The >+ locations returned by these commands are the same locations returned >+ when querying the LOCATION and LOCATION_INDEX resource properties." >+ >+ Change the next paragaph to begin: >+ >+ "A string provided to GetProgramResourceLocation or >+ GetProgramResourceLocationIndexEXT is considered to match an active >+ variable if ..." >+ >+ Change the last paragraph of the section (page 88) to read: >+ >+ ... "If the string specifies an element of an array variable, >+ GetProgramResourceLocation and GetProgramResourceLocationIndexEXT >+ return the location or fragment color index assigned to that >+ element. If it specifies the base name of an array, it identifies >+ the resources associated with the first element of the array." >+ >+Additions to Chapter 14 of the OpenGL ES 3.1 Specification (Programmable >+Fragment Processing) >+ >+ Modify section 14.2.3 "Shader Outputs" subsection to include: >+ >+ "The binding of a user-defined varying out variable to a fragment color number >+ can be specified explicitly. The command >+ >+ void BindFragDataLocationIndexedEXT(uint program, uint colorNumber, >+ uint index, const char * name); >+ >+ specifies that the varying out variable name in <program> should >+ be bound to fragment color <colorNumber> when the program is next >+ linked. <index> may be zero or one to specify that the color >+ be used as either the first or second color input to the blend >+ equation, respectively, as described in Section 15.1.5 (Blending). >+ If <name> was bound previously, its assigned binding is replaced >+ with colorNumber. <name> must be a null-terminated string. The error >+ INVALID_VALUE is generated if <colorNumber> is equal or greater >+ than the value of MAX_DRAW_BUFFERS and <index> is zero, >+ or if <colorNumber> is equal or greater than the value of >+ MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT and <index> is greater than or >+ equal to one. The command >+ >+ void BindFragDataLocationEXT(uint program, uint colorNumber, >+ const char * name) >+ >+ is equivalent to calling BindFragDataLocationIndexedEXT with the >+ same values for <program>, <colorNumber> and <name>, and with <index> >+ set to zero. >+ >+ When a program is linked, any varying out variables without >+ a binding specified through BindFragDataLocationIndexedEXT or >+ BindFragDataLocationEXT will automatically be bound to fragment >+ colors and indices by the GL. All such assignments will use color >+ indices of zero. Such bindings can be queried using the commands >+ GetFragDataLocation and GetFragDataIndexEXT. Output binding >+ assignments will cause LinkProgram to fail: >+ >+ * if the number of active outputs is greater than the value of >+ MAX_DRAW_BUFFERS_EXT; >+ >+ * if the program has an active output assigned to a location greater >+ than or equal to the value of MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT >+ and has an active output assigned an index greater than or equal >+ to one; >+ >+ * if more than one varying out variable is bound to the same number >+ and index; or >+ >+ * if the explicit binding assignments do not leave enough space >+ for the linker to automatically assign a location for a varying >+ out array, which requires multiple contiguous locations. >+ >+ BindFragDataLocationIndexedEXT may be issued before any shader objects >+ are attached to a program object. Hence it is allowed to bind any >+ name (except a name starting with gl_) to a color number and index, >+ including a name that is never used as a varying out variable in >+ any fragment shader object. Assigned bindings for variables that >+ do not exist are ignored." >+ >+ Add to end of section: >+ >+ "The command >+ >+ int GetFragDataIndexEXT(uint program, const char * name); >+ >+ returns the index of the fragment color to which the variable <name> >+ was bound when the program object <program> was last linked. If >+ program has not been successfully linked, the error INVALID_OPERATION >+ is generated. If name is not a varying out variable, or if an error >+ occurs, -1 will be returned. The command is equivalent to >+ >+ GetProgramResourceLocationIndex(program, PROGRAM_OUTPUT, name);" >+ >+Additions to Chapter 15 of the OpenGL ES 3.1 Specification (Writing >+Fragments and Samples to the Framebuffer) >+ >+ Modify section 15.1.5.2 "Blend Functions": >+ >+ Change the first paragraph to read: >+ >+ "The weighting factors used by the blend equation are determined by >+ the blend functions. There are four possible sources for weighting >+ factors. These are the constant color (Rc, Gc, Bc, Ac) (see >+ BlendColor, p. 211), the first source color (Rs0, Gs0, Bs0, As0), >+ the second source color (Rs1, Gs1, Bs1, As1), and the destination >+ color (the existing content of the draw buffer). Additionally the >+ special constants ZERO and ONE are available as weighting factors." >+ >+ Modify Table 15.2 (RGB and ALPHA source and destination blend >+ functions ...) as follows >+ >+ RGB Blend Factors Alpha Blend Factors >+ Value (Sr, Sg, Sb) or (Dr, Dg, Db) Sa or Da >+ ----- ---------------------------- ------------------- >+ ZERO (0, 0, 0) 0 >+ ONE (1, 1, 1) 1 >+ SRC_COLOR (Rs0, Gs0, Bs0) As0 >+ ONE_MINUS_SRC_COLOR (1, 1, 1) - (Rs0, Gs0, Bs0) 1 - As0 >+ DST_COLOR (Rd, Gd, Bd) Ad >+ ONE_MINUS_DST_COLOR (1, 1, 1) - (Rd, Gd, Bd) 1 - Ad >+ SRC_ALPHA (As0, As0, As0) As0 >+ ONE_MINUS_SRC_ALPHA (1, 1, 1) - (As0, As0, As0) 1 - As0 >+ DST_ALPHA (Ad, Ad, Ad) Ad >+ ONE_MINUS_DST_ALPHA (1, 1, 1) - (Ad, Ad, Ad) 1 - Ad >+ CONSTANT_COLOR (Rc, Gc, Bc) Ac >+ ONE_MINUS_CONSTANT_COLOR (1, 1, 1) - (Rc, Gc, Bc) 1 - Ac >+ CONSTANT_ALPHA (Ac, Ac, Ac) Ac >+ ONE_MINUS_CONSTANT_ALPHA (1, 1, 1) - (Ac, Ac, Ac) 1 - Ac >+ SRC_ALPHA_SATURATE (f, f, f) 1 New (for ES 2.x) >+ SRC1_COLOR_EXT (Rs1, Gs1, Bs1) As1 New >+ ONE_MINUS_SRC1_COLOR_EXT (1, 1, 1) - (Rs1, Gs1, Bs1) 1 - As1 New >+ SRC1_ALPHA_EXT (As1, As1, As1) As1 New >+ ONE_MINUS_SRC1_ALPHA_EXT (1, 1, 1) - (As1, As1, As1) 1 - As1 New >+ >+ For ES 2.0, remove table's footnote saying (ES 3.x already has this >+ removed): >+ >+ SRC_ALPHA_SATURATE is valid only for source RGB and alpha >+ blending functions. >+ >+ Add the following subsections to Section 5.1.5 Blending, at the end >+ of the subsection 15.1.5.2 "Blend Functions": >+ >+ "15.1.5.X Dual Source Blending and Multiple Draw Buffers >+ >+ Blend functions that require the second color input, <Rs1, Gs1, Bs1, >+ As1> (SRC1_COLOR_EXT, SRC1_ALPHA_EXT, ONE_MINUS_SRC1_COLOR_EXT, or >+ ONE_MINUS_SRC1_ALPHA_EXT) may consume hardware resources that could >+ otherwise be used for rendering to multiple draw buffers. Therefore, >+ the number of draw buffers that can be attached to a frame buffer >+ may be lower when using dual-source blending. >+ >+ The maximum number of draw buffers that may be attached to a >+ single frame buffer when using dual-source blending functions is >+ implementation dependent and can be queried by calling GetIntegerv >+ with the symbolic constant MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT. When >+ using dual-source blending, MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT should be >+ used in place of MAX_DRAW_BUFFERS_EXT to determine the maximum number >+ of draw buffers that may be attached to a single frame buffer. The >+ value of MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT must be at least 1. If >+ the value of MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT is 1, then dual-source >+ blending and multiple draw buffers cannot be used simultaneously. >+ >+ If either blend function is set to one of the second source factors >+ (SRC1_COLOR_EXT, SRC1_ALPHA_EXT, ONE_MINUS_SRC1_COLOR_EXT, or >+ ONE_MINUS_SRC1_ALPHA_EXT) for any draw buffer and any draw buffers >+ equal to or greater than the value of MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT >+ have values other than NONE, the error INVALID_OPERATION is generated >+ by drawing commands. >+ >+ 15.1.5.Y Generation of Second Color Source for Blending >+ >+ Rendering using any of the blend functions that consume the second >+ input color (SRC1_COLOR_EXT, ONE_MINUS_SRC1_COLOR_EXT, SRC1_ALPHA_EXT >+ or ONE_MINUS_SRC1_ALPHA_EXT) using a shader that does not output >+ a second source color will produce undefined results. To produce >+ input for the second source color, a shader must be used that outputs >+ a second source color. >+ >+ When using a GLSL version 300 es or higher fragment shader with >+ dual-source blending functions, the color output varyings are bound >+ to the first (index 0) and second (index 1) inputs of a draw buffer >+ using BindFragDataLocationIndexedEXT as described in the "Shader >+ Outputs" subsection of Section 3.12.2 or by layout qualifiers for >+ location=/n/ and index=/m/. Data written to the first of these outputs >+ becomes the first source color input to the blender (corresponding >+ to SRC_COLOR and SRC_ALPHA). Data written to the second of these >+ outputs generates the second source color input to the blender >+ (corresponding to SRC1_COLOR_EXT and SRC1_ALPHA_EXT). >+ >+ Alternatively if the GLSL version 100 fragment shader is used (where >+ user-defined color outputs are unsupported, hence a user-defined >+ color output is not available for BindFragDataLocationIndexEXT), the >+ gl_FragColor and gl_SecondaryFragColorEXT fragment outputs correspond >+ to the first and second source color respectively. Similarly the >+ gl_FragData and gl_SecondaryFragDataEXT fragment output arrays >+ correspond to the first and second source color respectively of each >+ color buffer output. >+ >+ If the second color input to the blender is not written in the >+ shader, or if no output is bound to the second input of a blender, >+ the result of the blending operation is not defined. >+ >+ Other shading languages may define similar methods for producing >+ the first and second color inputs to blending equations." >+ >+Additions to the OpenGL ES Shading Language 1.00 Specification >+ >+ Including the following line in a shader can be used to control the >+ language features described in this extension: >+ >+ #extension GL_EXT_blend_func_extended : <behavior> >+ >+ where <behavior> is as specified in section 3.4. >+ >+ A new preprocessor #define is added to the OpenGL ES Shading Language: >+ >+ #define GL_EXT_blend_func_extended 1 >+ >+ Modify paragraphs in section 7.2 "Fragment Shader Special Variables" as follows: >+ >+ First paragraph, second sentence: >+ >+ "Fragment shaders output values to the OpenGL ES pipeline using >+ the built-in variables gl_FragColor, gl_SecondaryFragColorEXT, >+ gl_FragData, and gl_SecondaryFragDataEXT, unless the discard keyword >+ is executed." >+ >+ Second paragraph, first sentence: >+ >+ "It is not a requirement for the fragment shader to write to >+ either gl_FragColor, gl_SecondaryFragColorEXT, gl_FragData, or >+ gl_SecondaryFragDataEXT." >+ >+ Add after the fourth paragraph: >+ >+ "Writing to gl_SecondaryFragColorEXT specifies a second fragment color >+ that will be used by the subsequent fixed functionality pipeline for >+ dual source blending. If subsequent fixed functionality consumes the >+ second fragment color and an execution of a fragment shader does >+ not write a value to gl_SecondaryFragColorEXT then the secondary >+ fragment color consumed is undefined." >+ >+ Add after the fifth paragraph: >+ >+ "The variable gl_SecondaryFragDataEXT is an array. Writing to >+ gl_SecondaryFragDataEXT[n] specifies the secondary fragment data that >+ will be used by the subsequent fixed functionality pipeline for data n >+ for dual source blending. If subsequent fixed functionality consumes >+ secondary fragment data and an execution of a fragment shader does >+ not write a value to it, then the secondary fragment data consumed >+ is undefined." >+ >+ Modify the sixth paragraph to read: >+ >+ "If a shader statically assigns a value to gl_FragColor or >+ gl_SecondaryFragColorEXT, it may not assign a value to any >+ element of gl_FragData or gl_SecondaryFragDataEXT. If a shader >+ statically writes a value to any element of gl_FragData or >+ gl_SecondaryFragDataEXT, it may not assign a value to gl_FragColor >+ or gl_SecondaryFragColorEXT. That is, a shader may assign values to >+ either the set of gl_FragColor and gl_SecondaryFragColorEXT or the >+ set of gl_FragData and gl_SecondaryFragDataEXT, but not both." >+ >+ Modify the eighth paragraph to read: >+ >+ "If a shader executes the discard keyword, the fragment is discarded, >+ and the values of gl_FragColor, gl_SecondaryFragColorEXT, gl_FragData, >+ and gl_SecondaryFragDataEXT become irrelevant." >+ >+ Add these built-in variable to the list "accessible from a fragment shader": >+ >+ mediump vec4 gl_SecondaryFragColorEXT; >+ mediump vec4 gl_SecondaryFragDataEXT[gl_MaxDualSourceDrawBuffersEXT]; >+ >+ Add to section 7.4 "Built-In Constants" the following constant: >+ >+ const mediump int gl_MaxDualSourceDrawBuffersEXT = 1; >+ >+Additions to the OpenGL ES Shading Language 3.00 and 3.10 Specification >+ >+ Including the following line in a shader can be used to control the >+ language features described in this extension: >+ >+ #extension GL_EXT_blend_func_extended : <behavior> >+ >+ where <behavior> is as specified in section 3.4. >+ >+ A new preprocessor #define is added to the OpenGL ES Shading Language: >+ >+ #define GL_EXT_blend_func_extended 1 >+ >+ Modify section 4.4.2 "Output Layout Qualifiers": >+ >+ Change the second paragraph to read: >+ >+ "Fragment shaders allow output layout qualifiers only on the interface >+ qualifier out. The layout qualifier identifier for fragment shader >+ outputs is: >+ >+ layout-qualifier-id >+ location = integer-constant >+ index = integer-constant >+ >+ Each of these qualifiers may appear at most once. If index is >+ specified, location must also be specified. If index is not >+ specified, the value 0 is used." >+ >+ Add an additional example to the end of the fourth paragraph's example: >+ >+ "And, >+ >+ layout(location = 3, index = 1) out vec4 factor; >+ >+ will establish that the fragment shader output factor is copied out >+ to fragment color 3 as the second (index one) input to the blend >+ equation." >+ >+ Change the first sentence of the second to last paragraph to read: >+ >+ "If there is more than one fragment output, the location must >+ be specified for all outputs unless the EXT_blend_func_extended >+ extension is enabled in which case more than one unassigned fragment >+ output locations are allowed though they must be assigned to unique >+ locations assigned with glBindFragDataLocationIndexedEXT prior to >+ linking." >+ >+ Add to section 7.4 "Built-In Constants" the following constant: >+ >+ const mediump int gl_MaxDualSourceDrawBuffersEXT = 1; >+ >+Dependencies on OpenGL ES 3.0 >+ >+ If OpenGL ES 3.0 or higher is not supported (meaning OpenGL ES 2.0 >+ support only), remove all references to the functions: >+ >+ BindFragDataLocationIndexedEXT >+ GetFragDataIndexEXT >+ BindFragDataLocationEXT >+ GetProgramResourceLocationIndexEXT >+ >+ Also ignore the additions to chapters 7 and 14 and the paragraph in >+ section 15.1.5.Y related to GLSL version 300 es or higher. >+ >+ When OpenGL ES 3.0 or higher, the "Additions to the OpenGL ES >+ Shading Language 1.00 Specification" applies to the version 100 >+ shading language, but not later versions. >+ >+Dependencies on OpenGL ES 3.1 >+ >+ If OpenGL ES 3.1 or higher is not supported (meaning OpenGL ES 3.0 >+ or earlier), remove all references to the function >+ >+ GetProgramResourceLocationIndexEXT >+ >+ because program resource queries are added by ES 3.1. >+ >+ Also ignore the additions to chapter 7. >+ >+Dependencies on EXT_draw_buffers or NV_draw_buffers >+ >+ Using dual-source blending functions may consume additional outputs >+ from hardware shading units and therefore can reduce the number >+ of draw buffers that may be attached to a single frame buffer when >+ dual-source blending functions are enabled. In this case, the value >+ of MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT may be less than the value of >+ MAX_DRAW_BUFFERS_EXT. If EXT_draw_buffers or NV_draw_buffers is not >+ supported then the value of MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT must >+ be 1. Furthermore, the discussion in the subsection entitled "Dual >+ Source Blending and Multiple Draw Buffers" may be discarded. >+ >+Dependencies on EXT_draw_buffers_indexed >+ >+ If EXT_draw_buffers_indexed is not supported, all references to >+ BlendFunciEXT and BlendFuncSeparateiEXT should be removed. In this >+ case, the blend functions for all attached draw buffers will be the >+ same. >+ >+Errors >+ >+ The error INVALID_OPERATION is generated by Begin or any >+ procedure that implicitly calls Begin if any draw buffer has a >+ blend function requiring the second color input (SRC1_COLOR_EXT, >+ ONE_MINUS_SRC1_COLOR_EXT, SRC1_ALPHA_EXT or ONE_MINUS_SRC1_ALPHA_EXT), >+ and a framebuffer is bound that has more than the value of >+ MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT-1 active color attachments. >+ >+New State >+ >+ None >+ >+ While no changes to table 20.12 (Pixel Operations) are strictly >+ necessary, new enumerations are supported for the BLEND_SRC_RGB, >+ BLEND_SRC_ALPHA, BLEND_DST_RGB, and BLEND_DST_ALPHA state to support >+ SRC1_COLOR_EXT, SRC1_ALPHA_EXT, ONE_MINUS_SRC1_COLOR_EXT, and >+ ONE_MINUS_SRC1_ALPHA_EXT (and for ES 2.0, SRC_ALPHA_SATURATE_EXT). >+ >+New Implementation Dependent State >+ >+ Get Value Type Get Command Minimum Value Description Sec. >+ --------- ---- ----------- ------------- ------------------- ------ >+ MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT Z+ GetIntegerv 1 Maximum number of 15.1.5 >+ active draw buffers >+ when using dual-source >+ blending >+ >+Example Use Cases >+ >+ There are several potential uses for this functionality. A first >+ example is in the implementation of sub-pixel accurate font rendering >+ algorithms. Given a known layout of pixel elements (red, green >+ and blue components), coverage may be calculated independently for >+ each element and passed to the blender in the second source color >+ as a per-channel opacity. To use this mode, use the following blend >+ functions: >+ >+ glBlendFunc(GL_SRC1_COLOR_EXT, GL_ONE_MINUS_SRC1_COLOR_EXT); >+ >+ As a second example, consider a partially reflective colored glass >+ window. It will attenuate light passing through it, and reflect >+ some of the light that strikes it. Using an appropriate combination >+ of functions, this effect may be simulated in a single pass using >+ only fixed-function blending hardware. In this case, the following >+ blend functions may be used: >+ >+ glBlendFunc(GL_SRC_ALPHA, GL_SRC1_COLOR_EXT); >+ >+Issues >+ >+ 0. What should this extension be named? >+ >+ RESOLVED: EXT_blend_func_extended, matching the name of >+ ARB_blend_func_extended upon which this extension is based but >+ providing a multi-vendor extension for ES implementations. >+ >+ 1. Is this extension compatible with the ARB_blend_func_extended >+ version? >+ >+ RESOLVED: Yes. This extension is 100% functionally identical to >+ ARB_blend_func_extended but for the ES 2.x and 3.x APIs. >+ >+ The token values are _EXT suffixed but have the same values as >+ the ARB_blend_func_extended tokens. >+ >+ Philosophically if this extension is going for 100% parity and >+ functionality with ARB_blend_func_extended, it should simply add >+ all the stuff in ARB_blend_func_extended... >+ >+ 2. Should the next commands be EXT suffixed? >+ >+ RESOLVED: Yes. This is not an OES extension. >+ >+ This means source code coming from a desktop environment should >+ call eglGetProcAddress on function names with the EXT suffix. >+ However because extension functions are called through function >+ pointers, this is only a minor change isolated to function pointer >+ initialization. >+ >+ 2. Should this extension allow ES 2.0 contexts to use >+ GL_SRC_ALPHA_SATURATE for the destination blend function? >+ >+ RESOLVED: Yes, the ARB_blend_func_extended extension adds support >+ for using GL_SRC_ALPHA_SATURATE as the destination factor as "bonus" >+ functionality. >+ >+ ES 3.x already allows GL_SRC_ALPHA_SATURATE for the destination >+ factor so this additional functionality is new only to ES 2.0 contexts >+ supporting this extension. >+ >+ We expect no GPU hardware capable of dual-source blending to not >+ also support GL_SRC_ALPHA_SATURATE as the destination factor. >+ >+ 3. Should this extension provide the glBindFragDataLocation and >+ glBindFragDataLocationIndexed functionality? >+ >+ RESOLVED: Yes. With EXT suffixes. >+ >+ 4. Should this really be OES_blend_func_extended? >+ >+ RESOLVED: Go with EXT is for expediency. >+ >+ Additionally this extension supports functionality such >+ GL_SRC_ALPHA_SATURATE that all desktop GPU hardware is assumed to >+ have. ES-only vendors might not want this in an OES extension. >+ >+ The same could be said for the glBindFragDataLocation* functionality. >+ >+ 5. Does this extension need an interaction with >+ OES_blend_equation_separate? >+ >+ RESOLVED: No, that's an ES 1.1 extension. ES 2.0 and on all support >+ separate blend functions. >+ >+ 6. Are there any OpenGL ES Shading Language interactions? >+ >+ RESOLVED: Yes, to use this extension, a #extension line will be needed >+ in the shader requesting the EXT_blend_func_extended functionality. >+ Example: >+ >+ #extension GL_EXT_blend_func_extended : require >+ >+ The ARB_blend_func_extended functionality does NOT require a special >+ #extension line to use its functionality because the ARB version >+ relies on existing GLSL functionality that allows for multiple >+ fragment outputs as part of supporting multiple render targets. >+ In the ARB version, then glBindFragDataLocationIndexed can bind >+ these unassigned locations to different source output colors. >+ But GLSL OpenGL ES 3.00 and 3.10 both explicitly preclude more than >+ one fragment shader output with an unassigned location. Hence a >+ #extension is needed to relax this error condition. And then this >+ extension's glBindFragDataLocationIndexedEXT must be used to assign >+ locations as necessary. >+ >+ 7. Can the indexed location be assigned explicitly in the shader? >+ >+ RESOLVED: Yes, for ES 3.x shaders where the GLSL ES 3.x supports >+ layout qualifiers. ES 2.0 does not support the layout qualifier or >+ user-defined fragment outputs. >+ >+ 8. Should both the layout qualifier mechanism and the >+ glBindFragDataLocationIndexed-style API for specifying the index of >+ a user-defined fragment shader output be supported? >+ >+ RESOLVED: Yes, both should be supported. This makes it easier >+ for existing applications to port to ES 3.0 as both mechanisms are >+ available. >+ >+ FYI: The "layout(location=0,index=1)" type syntax for dual-source >+ blending was introduced to OpenGL in GLSL 3.30 and 4.00 in >+ conjunction with OpenGL 3.3 and 4.0 respectively. The original >+ ARB_blend_func_extended was written with respect to OpenGL 3.2 and >+ intended to support dual-source blending without the need to extend >+ the GLSL language by instead supporting assignment if the fragment >+ output index via glBindFragDataLocationIndexed. >+ >+ 9. How to support OpenGL ES 2.0 where user-defined fragment shader >+ outputs are not supported? >+ >+ RESOLVED: Introduce new gl_SecondaryFragColorEXT and >+ gl_SecondaryFragDataEXT built-in variables for specifying the second >+ source color. >+ >+ These built-ins are only available in the ES 1.00 shader language >+ version. >+ >+ It is important to provide an ES 2.0 mechanism because WebGL 1.0 is >+ based on ES 2.0. Chrome's internal command buffer mechanism is also >+ based around ES 2.0 and Skia intends to use this extension. >+ >+ This includes adding a gl_MaxDualSourceDrawBuffersEXT >+ implementation-dependent constant. >+ >+ 10. Does the version 100 syntax (gl_SecondaryFragColorEXT, >+ gl_SecondaryFragDataEXT) work in an ES 3.0 context? >+ >+ RESOLVED: Yes. For compatibility reasons, an ES 3.0 context >+ advertising EXT_blend_func_extended must support the built-ins for >+ the fragment shader secondary color outputs. >+ >+ 11. How many elements should be in the gl_SecondaryFragDataEXT array? >+ >+ RESOLVED: The gl_SecondaryFragDataEXT array should have as >+ many elements as the GLSL built-in implementation constant >+ gl_MaxDualSourceDrawBuffersEXT which should be the value of the >+ context's GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT implementation-dependent >+ constant. >+ >+ This means the number of elements in gl_SecondaryFragDataEXT is >+ different than the number of gl_FragData elements. >+ >+ 12. What precision should the gl_SecondaryFragColorEXT and >+ gl_SecondaryFragDataEXT be? >+ >+ RESOLVED: mediump. This is consistent with gl_FragColor and >+ gl_FragData. >+ >+ 13. Should gl_MaxDualSourceDrawBuffersEXT be exposed in both ES 2.0 >+ (where it sizes the gl_SecondaryFragDataEXT array) and also 3.x >+ contexts (where there is no fixed-function array)? >+ >+ RESOLVED: Implementation-wise, it is easiest to expose this >+ implementation-dependent constant for all ES contexts. >+ >+ As a practical matter, we don't expect any implementations will >+ advertise any value other than 1 for this constant. >+ >+ Note: There is no implementation-dependent GLSL constant comparable >+ to gl_MaxDualSourceDrawBuffersEXT in ARB_blend_func_extended >+ (or OpenGL 3.3/4.0 introducing the ARB_blend_func_extended >+ functionality). >+ >+ 14. Any more issues? >+ >+ RESOLVED: See the issues in the ARB_blend_func_extended >+ specification. This extension resolves those issues to match the >+ ARB extension version. >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- -------- --------- ----------------------------------------- >+ 1 05/22/15 mjk Initial revision. >+ 2 07/06/15 mjk Proper ES 2.0 interactions; complete. >+ 3 07/08/15 mjk Feedback from Brian >+ 4 07/08/15 mjk Feedback from Daniel >+ 5 07/29/15 mjk ES 3.x contexts (as well as 2.0) expose >+ gl_MaxDualSourceDrawBuffersEXT >diff --git a/Source/ThirdParty/ANGLE/extensions/EXT_blend_minmax.txt b/Source/ThirdParty/ANGLE/extensions/EXT_blend_minmax.txt >new file mode 100644 >index 00000000000..522ac202233 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EXT_blend_minmax.txt >@@ -0,0 +1,164 @@ >+Name >+ >+ EXT_blend_minmax >+ >+Name Strings >+ >+ GL_EXT_blend_minmax >+ >+Version >+ >+ Last Modified Date: September 17, 2009 >+ Version: 1.5 >+ >+Number >+ >+ OpenGL Extension #37 >+ OpenGL ES Extension #65 >+ >+Dependencies >+ >+ There is an interaction with OpenGL ES. >+ >+Overview >+ >+ Blending capability is extended by respecifying the entire blend >+ equation. While this document defines only two new equations, the >+ BlendEquationEXT procedure that it defines will be used by subsequent >+ extensions to define additional blending equations. >+ >+ The two new equations defined by this extension produce the minimum >+ (or maximum) color components of the source and destination colors. >+ Taking the maximum is useful for applications such as maximum projection >+ in medical imaging. >+ >+Issues >+ >+ * I've prefixed the ADD token with FUNC, to indicate that the blend >+ equation includes the parameters specified by BlendFunc. (The min >+ and max equations don't.) Is this necessary? Is it too ugly? >+ Is there a better way to accomplish the same thing? >+ >+New Procedures and Functions >+ >+ void BlendEquationEXT(enum mode); >+ >+New Tokens >+ >+ Accepted by the <mode> parameter of BlendEquationEXT: >+ >+ FUNC_ADD_EXT 0x8006 >+ MIN_EXT 0x8007 >+ MAX_EXT 0x8008 >+ >+ Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, >+ GetFloatv, and GetDoublev: >+ >+ BLEND_EQUATION_EXT 0x8009 >+ >+Additions to Chapter 2 of the GL Specification (OpenGL Operation) >+ >+ None >+ >+Additions to Chapter 3 of the GL Specification (Rasterization) >+ >+ None >+ >+Additions to Chapter 4 of the GL Specification (Per-Fragment Operations >+and the Framebuffer) >+ >+ The GL Specification defines a single blending equation. This >+ extension introduces a blend equation mode that is specified by calling >+ BlendEquationEXT with one of three enumerated values. The default >+ value FUNC_ADD_EXT specifies that the blending equation defined in >+ the GL Specification be used. This equation is >+ >+ C' = (Cs * S) + (Cd * D) >+ >+ / 1.0 C' > 1.0 >+ C = ( >+ \ C' C' <= 1.0 >+ >+ where Cs and Cd are the source and destination colors, and S and D are >+ as specified by BlendFunc. >+ >+ If BlendEquationEXT is called with <mode> set to MIN_EXT, the >+ blending equation becomes >+ >+ C = min (Cs, Cd) >+ >+ Finally, if BlendEquationEXT is called with <mode> set to MAX_EXT, the >+ blending equation becomes >+ >+ C = max (Cs, Cd) >+ >+ In all cases the blending equation is evaluated separately for each >+ color component. >+ >+Additions to Chapter 5 of the GL Specification (Special Functions) >+ >+ None >+ >+Additions to Chapter 6 of the GL Specification (State and State Requests) >+ >+ None >+ >+Additions to the GLX Specification >+ >+ None >+ >+GLX Protocol >+ >+ A new GL rendering command is added. The following command is sent to the >+ server as part of a glXRender request: >+ >+ BlendEquationEXT >+ 2 8 rendering command length >+ 2 4097 rendering command opcode >+ 4 ENUM mode >+ >+Dependencies on OpenGL ES >+ >+ If the GL is OpenGL ES, only the new MIN_EXT and MAX_EXT blend equations >+ are introduced by this extension. BlendEquationOES, FUNC_ADD_OES, and >+ BLEND_EQUATION_OES are introduced by the OES_blend_subtract extension, >+ which is required for this extension to operate. Alternatively, >+ OpenGL ES 2.0 is required, which introduces BlendEquation, FUNC_ADD, and >+ BLEND_EQUATION without the suffixes. >+ >+ MIN_EXT and MAX_EXT should be added to Table 4.blendeq described in the >+ OES_blend_subtract extension specification, and Table 4.1 of the OpenGL >+ ES 2.0 specification. >+ >+ Mentions of GetDoublev, Begin/End, and GLX in this extension specification >+ can be ignored for OpenGL ES. Also, BlendEquationEXT and FUNC_ADD_EXT >+ instead have the OES suffix courtesy of OES_blend_subtract, or no suffix >+ courtesy of core OpenGL ES 2.0. >+ >+Errors >+ >+ INVALID_ENUM is generated by BlendEquationEXT if its single parameter >+ is not FUNC_ADD_EXT, MIN_EXT, or MAX_EXT. >+ >+ INVALID_OPERATION is generated if BlendEquationEXT is executed between >+ the execution of Begin and the corresponding execution to End. >+ >+New State >+ >+ Get Value Get Command Type Initial Value Attribute >+ --------- ----------- ---- ------------- --------- >+ BLEND_EQUATION_EXT GetIntegerv Z3 FUNC_ADD_EXT color-buffer >+ >+New Implementation Dependent State >+ >+ None >+ >+Revision History >+ >+ Version 1.5, September 17, 2009 (Jon Leech) - >+ Merge into OpenGL Registry version of the extension and assign >+ OpenGL ES extension number. >+ Version 1.4, May 19, 2009 (Benj Lipchak) - >+ Adapted for OpenGL ES. >+ Version 1.3, May 31, 1995 - >+ Last SGI revision. >diff --git a/Source/ThirdParty/ANGLE/extensions/EXT_color_buffer_float.txt b/Source/ThirdParty/ANGLE/extensions/EXT_color_buffer_float.txt >new file mode 100644 >index 00000000000..2eb163dba15 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EXT_color_buffer_float.txt >@@ -0,0 +1,230 @@ >+Name >+ >+ EXT_color_buffer_float >+ >+Name Strings >+ >+ GL_EXT_color_buffer_float >+ >+Contributors >+ >+ OpenGL ES Working Group members >+ >+Contact >+ >+ Mark Callow, HI Corp. (callow.mark 'at' artspark.co.jp) >+ >+Notice >+ >+ ©2012 The Khronos Group Inc. >+ >+Status >+ >+ Complete >+ >+IP Status >+ >+ Graphics Properties Holdings (GPH, formerly SGI) owns US Patent >+ #6,650,327, issued November 18, 2003. GPH believes this patent >+ contains necessary IP for graphics systems implementing floating >+ point (FP) rasterization and FP framebuffer capabilities. >+ >+ GPH will not grant Khronos royalty-free use of this IP for use >+ in OpenGL ES, but will discuss licensing on RAND terms, on an >+ individual basis with companies wishing to use this IP in the >+ context of conformant OpenGL ES implementations. GPH does not >+ plan to make any special exemption for open source >+ implementations. >+ >+ See >+ https://www.khronos.org/files/ip-disclosures/opengl/SGI%20IP%20Disclosure%20Mar05_clean.pdf >+ for the full disclosure. >+ >+Version >+ >+ Date: January 11th, 2013 >+ Revision: 5 >+ >+Number >+ >+ OpenGL ES Extension #137 >+ >+Dependencies >+ >+ Requires OpenGL ES 3.0. >+ >+ Written based on the wording of the OpenGL ES 3.0.1 Specification >+ (January 10th, 2013). >+ >+Overview >+ >+ This extension allows a variety of floating point formats to be >+ rendered to via framebuffer objects. >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ None >+ >+Additions to Chapter 3 of the OpenGL ES 3.0 Specification >+(Rasterization) >+ >+ 3.8.3 Texture Image Specification, unnumbered subsection "Required >+ Texture Formats", p. 126 >+ >+ Change the first two bullet items to the following: >+ >+ - Texture and renderbuffer color formats (see section 4.4.2). >+ - RGBA32F, RGBA32I, RGBA32UI, RGBA16F, RGBA16I, RGBA16UI, >+ RGBA8, RGBA8I, RGBA8UI, SRGB8_ALPHA8, RGB10_A2, RGB10_- >+ A2UI, RGBA4, and RGB5_A1. >+ - RGB8 and RGB565. >+ - R11F G11F B10F. >+ - RG32F, RG32I, RG32UI, RG16F, RG16I, RG16UI, RG8, RG8I, and >+ RG8UI. >+ - R32F, R32I, R32UI, R16F, R16I, R16UI, R8, R8I, and R8UI. >+ >+ - Texture-only color formats: >+ - RGBA8_SNORM. >+ - RGB32F, RGB32I, and RGB32UI. >+ - RGB16F, RGB16I, and RGB16UI. >+ - RGB8_SNORM, RGB8I, RGB8UI, and SRGB8. >+ - RGB9_E5. >+ - RG8_SNORM. >+ - R8_SNORM. >+ >+ Table 3.12, p. 128 & 129 >+ >+ Convert the dash under 'Color-renderable' to a 'check' for the >+ following internal formats: R16F, RG16F, RGBA16F, R32F, RG32F, >+ RGBA32F and R11F_G11F_B10F. >+ >+Additions to Chapter 4 of the OpenGL ES 3.0 Specification (Per-Fragment >+Operations and the Framebuffer) >+ >+ (changed lines marked with *; added lines marked with +) >+ >+ Chapter 4 Introduction, p. 167 >+ >+ Paragraph 5, sentence 3, p 168, insert "floating point" as shown: >+ "R, G, B, and A components may be represented as unsigned >+ * normalized fixed-point, floating point or signed or unsigned >+ integer values; ..." ^^^^^^^^^^^^^^ >+ >+ 4.1.7 Blending, p. 174 >+ >+ Modify paragraphs 3 & 4: >+ >+ * "If the color buffer is fixed-point, the components of the >+ source and destination values and blend factors are clamped >+ * to [0; 1] prior to evaluating the blend equation. If the color >+ + buffer is floating-point, no clamping occurs. The resulting four >+ + values are sent to the next operation. >+ >+ Blending applies only if the color buffer has a fixed-point or >+ * or floating-point format. If the color buffer has an integer >+ * format, proceed to the next operation. Furthermore, an >+ + INVALID_OPERATION error is generated by DrawArrays and the other >+ + drawing commands defined in section 2.8.3 if blending is enabled >+ + (see below) and any draw buffer has a 32-bit floating-point >+ + format." >+ >+ 4.2.3 Clearing the Buffers, p. 183 >+ >+ Modify second paragraph, inserting "floating point": >+ >+ " void ClearColor(float r, float g, float b, float a); >+ >+ * sets the clear value for fixed- and floating-point color buffers. >+ ..." ^^^^^^^^^^^^^^^^^^ >+ >+ 4.3.1 Reading Pixels, p. 186 >+ >+ In paragraph 4, beginning "Only two combinations of format >+ and type are accepted ...", after the sentence ending "... type >+ UNSIGNED_BYTE is accepted." insert the following sentence: >+ "For floating-point rendering surfaces, the combination >+ format RGBA and type FLOAT is accepted." >+ >+ 4.3.1 unnumbered subsection "Obtaining Pixels from the Framebuffer", >+ p. 188 >+ >+ Modify penultimate paragraph, p189, "If format is an integer ..." >+ >+ "If format is an integer format and the color buffer is not an >+ integer format; if the color buffer is an integer format and >+ * format is not an integer format; if format is an integer format >+ * and type is FLOAT, HALF_FLOAT, or UNSIGNED_INT_10F_11F_11F_REV; >+ + or if the color buffer is a floating-point format and type is >+ + not FLOAT, HALF FLOAT, or UNSIGNED_INT_10F_11F_11F_REV, the error >+ INVALID_OPERATION occurs." >+ >+ 4.3.1 unnumbered subsection "Conversion of RGBA values", p.190 >+ >+ Sole paragraph, sentence 3, insert "or floating point" as shown: >+ * "For an integer or floating point color buffer, the elements >+ are unmodified."^^^^^^^^^^^^^^^^^ >+ >+ 4.3.2 Copying Pixels, p192 >+ >+ Modify first error condition, at bottom of p193, "The read buffer >+ contains ..." to encompass floating-point buffers. >+ >+ * "- The read buffer contains fixed-point or floating-point values >+ * and any draw buffer contains neither fixed-point nor >+ * floating-point values." >+ >+ 4.4.2 Attaching Images to Framebuffer Objects, p. 197, unnumbered >+ subsection "Required Renderbuffer Formats", p. 200 >+ >+ In the last paragraph beginning "Implementations must support >+ creation ...", modify the final phrase to >+ >+ * "with the exception of signed and unsigned integer, RGBA16F, >+ + R32F, RG32F and RGBA32F formats. >+ >+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) >+ >+ 6.1.15 Internal Format Queries, p. 237 >+ >+ P. 238, paragraph 8 after "Since multisampling is not supported >+ for signed and unsigned integer internal formats, the value of >+ NUM_SAMPLE_COUNTS will be zero for such formats.", insert new >+ one-sentence paragraph: >+ >+ "If <internalformat> is RGBA16F, R32F, RG32F, or RGBA32F, the >+ value of NUM_SAMPLE_COUNTS may be zero, or else the maximum >+ value in SAMPLES may be less than the value of MAX_SAMPLES." >+ >+New Implementation Dependent State >+ >+ None >+ >+Issues >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- -------- --------- ----------------------------------------- >+ 1 10/16/12 markc Initial version >+ 2 10/18/12 markc Referenced preliminary version of OpenGL >+ ES 3.0.1 specification and updated page >+ numbers. >+ 3 11/21/12 markc Corrected IP status. >+ 4 01/09/13 markc Changed date of referenced OpenGL ES >+ 3.0.1 specification. Made minor language >+ simplification. >+ 5 01/11/13 markc Changed date to release version of >+ OpenGL ES 3.0.1 specification. >+ Clarified change to "Required >+ renderbuffer formats" section. >+ >+# vim:ai:ts=4:sts=4:sw=4:expandtab:textwidth=70 >diff --git a/Source/ThirdParty/ANGLE/extensions/EXT_draw_buffers.txt b/Source/ThirdParty/ANGLE/extensions/EXT_draw_buffers.txt >new file mode 100644 >index 00000000000..735460212d5 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EXT_draw_buffers.txt >@@ -0,0 +1,542 @@ >+Name >+ >+ EXT_draw_buffers >+ >+Name Strings >+ >+ GL_EXT_draw_buffers >+ >+Contributors >+ >+ Contributors to GL_NV_draw_buffers >+ Contributors to GL_NV_fbo_color_attachments >+ Contributors to the OpenGL ES 2.0 specification >+ Contributors to the OpenGLSL ES 1.0.17 specification >+ Contributors to the OpenGL ES 3.0 specification >+ Nicolas Capens, TransGaming Inc. >+ Daniel Koch, TransGaming Inc. >+ Alastair Patrick, Google Inc. >+ Kenneth Russell, Google Inc. >+ Greg Roth, NVIDIA Corporation >+ Ben Bowman, Imagination Technologies >+ Members of the WebGL and OpenGL ES working groups >+ >+Contact >+ >+ Daniel Koch (daniel 'at' transgaming.com) >+ >+Status >+ >+ Draft Complete >+ >+Version >+ >+ Last Modified Date: January 30, 2013 >+ Revision: #7 >+ >+Number >+ >+ TBD >+ >+Dependencies >+ >+ OpenGL ES 2.0 is required. >+ >+ The extension is written against the OpenGL ES 2.0 specification. >+ >+ ANGLE_framebuffer_blit affects the definition of this extension. >+ APPLE_framebuffer_multisample affects the definitin of this extension. >+ >+Overview >+ >+ This extension increases the number of available framebuffer object >+ color attachment points, extends OpenGL ES 2.0 to allow multiple output >+ colors, and provides a mechanism for directing those outputs to >+ multiple color buffers. >+ >+ This extension is similar to the combination of the GL_NV_draw_buffers >+ and GL_NV_fbo_color_attachments extensions, but imposes certain >+ restrictions informed by the OpenGL ES 3.0 API. >+ >+New Procedures and Functions >+ >+ void DrawBuffersEXT(sizei n, const enum *bufs); >+ >+New Tokens >+ >+ Accepted by the <pname> parameter of GetIntegerv: >+ >+ MAX_COLOR_ATTACHMENTS_EXT 0x8CDF >+ >+ Accepted by the <pname> parameters of GetIntegerv and GetFloatv: >+ >+ MAX_DRAW_BUFFERS_EXT 0x8824 >+ DRAW_BUFFER0_EXT 0x8825 >+ DRAW_BUFFER1_EXT 0x8826 >+ DRAW_BUFFER2_EXT 0x8827 >+ DRAW_BUFFER3_EXT 0x8828 >+ DRAW_BUFFER4_EXT 0x8829 >+ DRAW_BUFFER5_EXT 0x882A >+ DRAW_BUFFER6_EXT 0x882B >+ DRAW_BUFFER7_EXT 0x882C >+ DRAW_BUFFER8_EXT 0x882D >+ DRAW_BUFFER9_EXT 0x882E >+ DRAW_BUFFER10_EXT 0x882F >+ DRAW_BUFFER11_EXT 0x8830 >+ DRAW_BUFFER12_EXT 0x8831 >+ DRAW_BUFFER13_EXT 0x8832 >+ DRAW_BUFFER14_EXT 0x8833 >+ DRAW_BUFFER15_EXT 0x8834 >+ >+ Accepted by the <attachment> parameter of FramebufferRenderbuffer, >+ FramebufferTexture2D and GetFramebufferAttachmentParameteriv, and by >+ the <bufs> parameter of DrawBuffersEXT: >+ >+ COLOR_ATTACHMENT0_EXT 0x8CE0 >+ COLOR_ATTACHMENT1_EXT 0x8CE1 >+ COLOR_ATTACHMENT2_EXT 0x8CE2 >+ COLOR_ATTACHMENT3_EXT 0x8CE3 >+ COLOR_ATTACHMENT4_EXT 0x8CE4 >+ COLOR_ATTACHMENT5_EXT 0x8CE5 >+ COLOR_ATTACHMENT6_EXT 0x8CE6 >+ COLOR_ATTACHMENT7_EXT 0x8CE7 >+ COLOR_ATTACHMENT8_EXT 0x8CE8 >+ COLOR_ATTACHMENT9_EXT 0x8CE9 >+ COLOR_ATTACHMENT10_EXT 0x8CEA >+ COLOR_ATTACHMENT11_EXT 0x8CEB >+ COLOR_ATTACHMENT12_EXT 0x8CEC >+ COLOR_ATTACHMENT13_EXT 0x8CED >+ COLOR_ATTACHMENT14_EXT 0x8CEE >+ COLOR_ATTACHMENT15_EXT 0x8CEF >+ >+ The COLOR_ATTACHMENT0_EXT constant is equal to the >+ COLOR_ATTACHMENT0 constant. >+ >+ Each COLOR_ATTACHMENT<i>_EXT adheres to COLOR_ATTACHMENT<i>_EXT >+ = COLOR_ATTACHMENT0_EXT + <i>. >+ >+Changes to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization) >+ >+ Section 3.2, (Multisampling). Replace the second paragraph: >+ >+ An additional buffer, called the multisample buffer, is added to the >+ window system-provided framebuffer. Pixel sample values, including >+ color, depth, and stencil values, are stored in this buffer. Samples >+ contain separate color values for each fragment color. When the >+ window system-provided framebuffer includes a multisample buffer, it >+ does not include depth or stencil buffers, even if the multisample >+ buffer does not store depth or stencil values. Color buffers do >+ coexist with the multisample buffer, however. >+ >+ Section 3.8.2, (Shader Execution) Replace subsection "Shader >+ Outputs": >+ >+ The OpenGL ES Shading Language specification describes the values >+ that may be output by a fragment shader. These are gl_FragColor and >+ gl_FragData[n]. The final fragment color values or the final >+ fragment data values written by a fragment shader are clamped to the >+ range [0, 1] and then converted to fixed-point as described in >+ section 2.1.2 for framebuffer color components. >+ >+ Writing to gl_FragColor specifies the fragment color (color number >+ zero) that will be used by subsequent stages of the pipeline. >+ Writing to gl_FragData[n] specifies the value of fragment color >+ number n. Any colors, or color components, associated with a >+ fragment that are not written by the fragment shader are undefined. >+ A fragment shader may not statically assign values to both >+ gl_FragColor and gl_FragData. In this case, a compile or link error >+ will result. A shader statically assigns a value to a variable if, >+ after preprocessing, it contains a statement that would write to the >+ variable, whether or not run-time flow of control will cause that >+ statement to be executed. >+ >+Changes to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment >+Operations and the Frame Buffer) >+ >+ Modify the overview of Chapter 4 and replace the sentences >+ of the fifth paragraph which read: >+ >+ "The name of the color buffer of an application-created framebuffer >+ object is COLOR_ATTACHMENT0. The names of the depth and stencil buffers >+ are DEPTH_ATTACHMENT and STENCIL_ATTACHMENT." >+ >+ With the following: >+ >+ "A framebuffer object has an array of color buffer attachment points, >+ numbered zero through <n>, a depth buffer attachment point, and a >+ stencil buffer attachment point." >+ >+ Insert Table 4.3 to Section 4.2.1 (and renumber subsequent tables): >+ >+ Symbolic Constant Meaning >+ ----------------- --------------------- >+ NONE No buffer >+ >+ COLOR_ATTACHMENT<i>_EXT (see caption) Output fragment color to image >+ attached at color attachment >+ point i >+ >+ Table 4.3: Arguments to DrawBuffersEXT when the context is bound to a >+ framebuffer object, and the buffers they indicate. <i> in >+ COLOR_ATTACHMENT<i>_EXT may range from zero to the value of >+ MAX_COLOR_ATTACHMENTS_EXT minus one. >+ >+ Replace Section 4.2.1, "Selecting a Buffer for Writing" with the following: >+ >+ "By default, color values are written into the front buffer for >+ single buffered surfaces or into the back buffer for back buffered >+ surfaces as determined when making the context current. To control >+ the color buffer into which each of the fragment color values is >+ written, DrawBuffersEXT is used. >+ >+ The command >+ >+ void DrawBuffersEXT(sizei n, const enum *bufs); >+ >+ defines the draw buffers to which all fragment colors are written. >+ <n> specifies the number of buffers in <bufs>. <bufs> is a pointer >+ to an array of symbolic constants specifying the buffer to which >+ each fragment color is written. >+ >+ Each buffer listed in <bufs> must be BACK, NONE, or one of the >+ values from table 4.3. Further, acceptable values for the constants >+ in <bufs> depend on whether the GL is using the default framebuffer >+ (i.e., DRAW_FRAMEBUFFER_BINDING is zero), or a framebuffer object >+ (i.e., DRAW_FRAMEBUFFER_BINDING is non-zero). For more information >+ about framebuffer objects, see section 4.4. >+ >+ If the GL is bound to the default framebuffer, then <n> must be 1 >+ and the constant must be BACK or NONE. When draw buffer zero is >+ BACK, color values are written into the sole buffer for single- >+ buffered contexts, or into the back buffer for double-buffered >+ contexts. If DrawBuffersEXT is supplied with a constant other than >+ BACK and NONE, the error INVALID_OPERATION is generated. >+ >+ If the GL is bound to a draw framebuffer object, then each of the >+ constants must be one of the values listed in table 4.3. >+ >+ In both cases, the draw buffers being defined correspond in order to >+ the respective fragment colors. The draw buffer for fragment >+ colors beyond <n> is set to NONE. >+ >+ The maximum number of draw buffers is implementation-dependent. The >+ number of draw buffers supported can be queried by calling >+ GetIntegerv with the symbolic constant MAX_DRAW_BUFFERS_EXT. An >+ INVALID_VALUE error is generated if <n> is greater than >+ MAX_DRAW_BUFFERS_EXT. >+ >+ If the GL is bound to a draw framebuffer object, the <i>th buffer listed >+ in <bufs> must be COLOR_ATTACHMENT<i>_EXT or NONE. Specifying a >+ buffer out of order, BACK, or COLOR_ATTACHMENT<m>_EXT where <m> is >+ greater than or equal to the value of MAX_COLOR_ATTACHMENTS_EXT, >+ will generate the error INVALID_OPERATION. >+ >+ If a fragment shader writes to "gl_FragColor", DrawBuffersEXT >+ specifies the set of draw buffers into which the color >+ written to "gl_FragColor" is written. If a fragment shader writes to >+ "gl_FragData", DrawBuffersEXT specifies a set of draw buffers >+ into which each of the multiple output colors defined by these >+ variables are separately written. If a fragment shader writes to >+ neither "gl_FragColor" nor "gl_FragData" the values of the >+ fragment colors following shader execution are undefined, and may >+ differ for each fragment color. >+ >+ Indicating a buffer or buffers using DrawBuffersEXT causes >+ subsequent pixel color value writes to affect the indicated >+ buffers. If the GL is bound to a draw framebuffer object and a draw >+ buffer selects an attachment that has no image attached, then that >+ fragment color is not written. >+ >+ Specifying NONE as the draw buffer for a fragment color will inhibit >+ that fragment color from being written. >+ >+ The state required to handle color buffer selection for each >+ framebuffer is an integer for each supported fragment color. For the >+ default framebuffer, in the initial state the draw buffer for >+ fragment color zero is BACK if there is a default framebuffer >+ associated with the context, otherwise NONE. For framebuffer >+ objects, in the initial state the draw buffer for fragment color >+ zero is COLOR_ATTACHMENT0_EXT. >+ >+ For both the default framebuffer and framebuffer objects, the >+ initial state of draw buffers for fragment colors other than zero is >+ NONE. >+ >+ The value of the draw buffer selected for fragment color <i> can be >+ queried by calling GetIntegerv with the symbolic constant >+ DRAW_BUFFER<i>_EXT." >+ >+ Modify Section 4.2.3 (Clearing the Buffers) and replace the first >+ two paragraphs with the following: >+ >+ "The GL provides a means for setting portions of every pixel in a >+ particular buffer to the same value. The argument to >+ >+ void Clear(bitfield buf); >+ >+ is the bitwise OR of a number of values indicating which buffers are >+ to be cleared. The values are COLOR_BUFFER_BIT, DEPTH_BUFFER_BIT, and >+ STENCIL_BUFFER_BIT, indicating the buffers currently enabled for color >+ writing, the depth buffer, and the stencil buffer (see below), >+ respectively. The value to which each buffer is cleared depends on >+ the setting of the clear value for that buffer. If the mask is not a >+ bitwise OR of the specified values, then the error INVALID_VALUE is >+ generated. >+ >+ void ClearColor(clampf r, clampf, g, clampf b, clampf a); >+ >+ sets the clear value for fixed-point color buffers. Each of the >+ specified components is clamped to [0, 1] and converted to fixed-point >+ as described in section 2.1.2 for framebuffer color components." >+ >+ Replace the second paragraph of Section 4.4.1 (Binding and Managing >+ Framebuffer Objects) with the following: >+ >+ "The namespace for framebuffer objects is the unsigned integers, with >+ zero reserved by OpenGL ES to refer to the default framebuffer. A >+ framebuffer object is created by binding an unused name to the >+ target FRAMEBUFFER, DRAW_FRAMEBUFFER, or READ_FRAMEBUFFER. The binding >+ is effected by calling >+ >+ void BindFramebuffer(enum target, uint framebuffer); >+ >+ with <target> set the desired framebuffer target and <framebuffer> set >+ to the unused name. The resulting framebuffer object is a new state >+ vector. There is a number of color attachment points, plus one each >+ for the depth and stencil attachment points. The number of color attachment >+ points is equal to the value of MAX_COLOR_ATTACHMENTS_EXT." >+ >+ Replace the third item in the bulleted list in Section 4.4.1 (Binding >+ and Managing Framebuffer Objects) with the following: >+ >+ " * The only color buffer bitplanes are the ones defined by the >+ framebuffer attachments points named COLOR_ATTACHMENT0_EXT through >+ COLOR_ATTACHMENT<n>_EXT." >+ >+ Modify Section 4.4.3 (Renderbuffer Objects) in the >+ "Attaching Renderbuffer Images to a Framebuffer" subsection as follows: >+ >+ Insert the following table: >+ >+ Name of attachment >+ --------------------------------------- >+ COLOR_ATTACHMENT<i>_EXT (see caption) >+ DEPTH_ATTACHMENT >+ STENCIL_ATTACHMENT >+ >+ Table 4.x: Framebuffer attachment points. <i> in COLOR_ATTACHMENT<i>_EXT >+ may range from zero to the value of MAX_COLOR_ATTACHMENTS_EXT minus 1. >+ >+ Modify the third sentence of the paragraph following the definition of >+ FramebufferRenderbuffer to be as follows: >+ >+ "<attachment> should be set to one of the attachment points of the >+ framebuffer listed in Table 4.x." >+ >+ Modify Section 4.4.3 (Renderbuffer Objects) in the "Attaching Texture >+ Images to a Framebuffer" subsection as follows: >+ >+ Modify the last sentence of the paragraph following the definition of >+ FramebufferTexture2D to be as follows: >+ >+ "<attachment> must be one of the attachment points of the framebuffer >+ listed in Table 4.x." >+ >+ Modify Section 4.4.5 (Framebuffer Completeness) and replace the 3rd >+ item in the bulleted list in the "Framebuffer Attachment Completeness" >+ subsection with the following: >+ >+ " * If <attachment> is COLOR_ATTACHMENT<i>_EXT, then <image> must >+ have a color-renderable internal format." >+ >+Changes to Chapter 6 of the OpenGL ES 2.0 Specification (State and >+State Requests) >+ >+ In section 6.1.3 (Enumerated Queries) modify the third sentence in >+ the definition of GetFramebufferAttachmentParameteriv to be as follows: >+ >+ "<attachment> must be one of the attachment points of the framebuffer >+ listed in Table 4.x." >+ >+Changes to Chapter 3 of the OpenGL ES Shading Language 1.0.17 Specification (Basics) >+ >+ Add a new section: >+ >+ 3.4.1 GL_EXT_draw_buffers Extension >+ >+ To use the GL_EXT_draw_buffers extension in a shader it >+ must be enabled using the #extension directive. >+ >+ The shading language preprocessor #define >+ GL_EXT_draw_buffers will be defined to 1, if the >+ GL_EXT_draw_buffers extension is supported. >+ >+Dependencies on ANGLE_framebuffer_blit and APPLE_framebuffer_multisample: >+ >+ If neither ANGLE_framebuffer_blit nor APPLE_framebuffer_multisample are >+ supported, then all references to "draw framebuffers" should be replaced >+ with references to "framebuffers". References to DRAW_FRAMEBUFFER_BINDING >+ should be replaced with references to FRAMEBUFFER_BINDING. References to >+ DRAW_FRAMEBUFFER and READ_FRAMEBUFFER should be removed. >+ >+ If ANGLE_framebuffer_blit is supported, DRAW_FRAMEBUFFER_BINDING, DRAW_FRAMEBUFFER >+ and READ_FRAMEBUFFER all refer to corresponding _ANGLE suffixed names >+ (they have the same token values). >+ >+ If APPLE_framebuffer_multisample is supported, DRAW_FRAMEBUFFER_BINDING, >+ DRAW_FRAMEBUFFER and READ_FRAMEBUFFER all refer to the corresponding _APPLE >+ suffixed names (they have the same token values). >+ >+Errors >+ >+ The INVALID_OPERATION error is generated if DrawBuffersEXT is called >+ when the default framebuffer is bound and any of the following conditions >+ hold: >+ - <n> is greater than 1 and less than MAX_DRAW_BUFFERS_EXT, >+ - <bufs> contains a value other than BACK or NONE. >+ >+ The INVALID_OPERATION error is generated if DrawBuffersEXT is called >+ when bound to a draw framebuffer object and any of the following >+ conditions hold: >+ - the <i>th value in <bufs> is not COLOR_ATTACHMENT<i>_EXT or NONE. >+ >+ The INVALID_VALUE error is generated if DrawBuffersEXT is called >+ with a value of <n> which is greater than MAX_DRAW_BUFFERS_EXT. >+ >+ The INVALID_ENUM error is generated by FramebufferRenderbuffer if >+ the <attachment> parameter is not one of the values listed in Table 4.x. >+ >+ The INVALID_ENUM error is generated by FramebufferTexture2D if >+ the <attachment> parameter is not one of the values listed in Table 4.x. >+ >+ The INVALID_ENUM error is generated by GetFramebufferAttachmentParameteriv >+ if the <attachment> parameter is not one of the values listed in Table 4.x. >+ >+New State >+ >+ Add Table 6.X Framebuffer (State per framebuffer object): >+ >+ State Type Get Command Initial Value Description >+ ------------------ ---- ------------ ------------- ----------- >+ DRAW_BUFFER<i>_EXT Z10* GetIntegerv see 4.2.1 Draw buffer selected >+ for fragment color i >+ >+ Add to Table 6.18 (Implementation Dependent Values) >+ >+ Get value Type Get Cmnd Minimum Value Description Sec. >+ -------------------- ---- ----------- ------------- ----------- ----- >+ MAX_DRAW_BUFFERS_EXT Z+ GetIntegerv 1 Maximum number of 4.2.1 >+ active draw buffers >+ MAX_COLOR_ATTACHMENTS_EXT Z+ GetIntegerv 1 Number of framebuffer 4.4.1 >+ color attachment points >+Issues >+ >+ See ARB_draw_buffers for relevant issues. >+ >+ 1) What are the differences between this extension and NV_draw_buffers >+ + NV_fbo_color_attachments? >+ >+ RESOLVED. This extension: >+ - adds interactions with blit_framebuffer and the separate >+ draw/read binding points >+ - The draw buffer and color attachment limits are global instead >+ of per-fbo (see Issue 2) >+ - can be used to with default framebuffer to set NONE/BACK (see Issue 4) >+ - retains the ordering restrictions on color attachments that are >+ imposed by ES 3.0. >+ >+ 2) Should the MAX_DRAW_BUFFERS_EXT and MAX_COLOR_ATTACHMENTS_EXT limits >+ be per-framebuffer values or implementation dependent constants? >+ >+ DISCUSSION: In ARB_draw_buffers this was per-context (see Issue 2). >+ EXT_framebuffer_object (and subsequently ARB_framebuffer_object, and GL 3.0 >+ through GL 4.2) made these queries framebuffer-dependent. >+ However in GL 4.3 and GLES 3.0, these limits were changed from >+ framebuffer-dependent state to implementation-dependent state after >+ much discussion (Bug 7990). >+ >+ NV_draw_buffers has MAX_DRAW_BUFFERS listed as per-framebuffer state, >+ but NV_fbo_color_attachments has MAX_COLOR_ATTACHMENTS as an >+ implementation-dependent constant. >+ >+ This is relevant because some implementations are not able to support >+ multisampling in conjuction with multiple color attachments. If the >+ query is per-framebuffer, they can report a maximum of one attachment >+ when there are multisampled attachments, but a higher limit when only >+ single-sampled attachments are present. >+ >+ RESOLVED. Make this global context state as this is most consistent >+ with GLES 3.0 and updated GL drivers. In an implementation cannot >+ support multisampling in conjunction with multiple color attachments, >+ perhaps such an implementation could report FBO incomplete in this >+ situation, but this is less than desirable. >+ >+ 3) Should we support broadcast from gl_FragColor to all gl_FragData[x] >+ or should it be synonymous with gl_FragData[0]? >+ >+ DISCUSSION: With NV_draw_buffers, writing to gl_FragColor writes to all >+ the enabled draw buffers (ie broadcast). In OpenGL ES 3.0 when using >+ ESSL 1.0, gl_FragColor is equivalent to writing a single output to >+ gl_FragData[0] and multiple outputs are not possible. When using ESSL 3.0, >+ only user-defined out variables may be used. >+ >+ If broadcast is supported, some implementations may have to replace >+ writes to gl_FragColor with replicated writes to all possible gl_FragData >+ locations when this extension is enabled. >+ >+ RESOLVED: Writes to gl_FragColor are broadcast to all enabled color >+ buffers. ES 3.0 using ESSL 1.0 doesn't support broadcast because >+ ESSL 1.0 was not extended to have multiple color outputs (but that is >+ what this extension adds). ESSL 3.0 doesn't support the broadcast because >+ it doesn't have the gl_FragColor variable at all, and only has user- >+ defined out variables. This extension extends ESSL 1.0 to have multiple >+ color outputs. Broadcasting from gl_FragColor to all enabled color >+ buffers is the most consistent with existing draw buffer extensions to >+ date (both NV_draw_buffers and desktop GL). >+ >+ 4) Should we allow DrawBuffersEXT to be called when the default FBO is >+ bound? >+ >+ DISCUSSION: NV_draw_buffers specifies that DrawBuffersNV errors with >+ INVALID_OPERATION when the default FBO is bound. OpenGL ES 3.0 allows >+ DrawBuffers to toggle between BACK and NONE on the default FBO. >+ >+ An implementation that does not natively support disabling the drawbuffer >+ on the default FBO could emulate this by disabling color writes. >+ >+ RESOLVED: Allow DrawBuffersEXT to be called for the default FBO. This >+ is more forward looking and is compatible with ES 3.0. >+ >+ 5) What are the requirements on the color attachment sizes and formats? >+ >+ RESOLVED: ES 2.0 requires that all color buffers attached to application- >+ created framebuffer objects must have the same number of bitplanes >+ (Chapter 4 overview p91). ES 2.0 also requires that all attached images >+ have the same width and height (Section 4.4.5 Framebuffer Completeness). >+ This extension does not lift those requirements, and failing to meet >+ them will result in an incomplete FBO. >+ >+ 6) Does this have any interactions with glClear? >+ >+ RESOLVED: Yes. When multiple color buffers are enabled for writing, >+ glClear clears all of the color buffers. Added language clarifying >+ that glClear and glClearColor may affect multiple color buffers. >+ >+Revision History >+ >+ 01/30/2013 dgkoch add issue 6 and clear interactions >+ renamed to EXT_draw_buffers based on feedback >+ changed resolution of issue 3. >+ 01/23/2013 dgkoch add resolutions to issues 2-4. >+ add issue 5. >+ Add Table 4.x and update various explicit >+ references to COLOR_ATTACHMENT0. >+ Add errors. >+ 11/13/2012 dgkoch add revision history >+ add text from updated ES 3.0 spec >+ add issues for discussion >+ 10/16/2012 kbr update name string >+ 10/16/2012 kbr remove restrition requiring draw buffer 0 to be non-NULL >+ 10/12/2012 kbr remove references to GetDoublev and ReadBuffer >+ 10/11/2012 kbr initial draft extension >+ >diff --git a/Source/ThirdParty/ANGLE/extensions/EXT_robustness.txt b/Source/ThirdParty/ANGLE/extensions/EXT_robustness.txt >new file mode 100644 >index 00000000000..1c26a55889a >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EXT_robustness.txt >@@ -0,0 +1,365 @@ >+Name >+ >+ EXT_robustness >+ >+Name Strings >+ >+ GL_EXT_robustness >+ >+Contributors >+ >+ Daniel Koch, TransGaming >+ Nicolas Capens, TransGaming >+ Contributors to ARB_robustness >+ >+Contact >+ >+ Greg Roth, NVIDIA (groth 'at' nvidia.com) >+ >+Status >+ >+ Complete. >+ >+Version >+ >+ Version 3, 2011/10/31 >+ >+Number >+ >+ OpenGL ES Extension #107 >+ >+Dependencies >+ >+ This extension is written against the OpenGL ES 2.0 Specification >+ but can apply to OpenGL ES 1.1 and up. >+ >+ EGL_EXT_create_context_robustness is used to determine if a context >+ implementing this extension supports robust buffer access, and if it >+ supports reset notification. >+ >+Overview >+ >+ Several recent trends in how OpenGL integrates into modern computer >+ systems have created new requirements for robustness and security >+ for OpenGL rendering contexts. >+ >+ Additionally GPU architectures now support hardware fault detection; >+ for example, video memory supporting ECC (error correcting codes) >+ and error detection. OpenGL contexts should be capable of recovering >+ from hardware faults such as uncorrectable memory errors. Along with >+ recovery from such hardware faults, the recovery mechanism can >+ also allow recovery from video memory access exceptions and system >+ software failures. System software failures can be due to device >+ changes or driver failures. >+ >+ OpenGL queries that that return (write) some number of bytes to a >+ buffer indicated by a pointer parameter introduce risk of buffer >+ overflows that might be exploitable by malware. To address this, >+ queries with return value sizes that are not expressed directly by >+ the parameters to the query itself are given additional API >+ functions with an additional parameter that specifies the number of >+ bytes in the buffer and never writing bytes beyond that limit. This >+ is particularly useful for multi-threaded usage of OpenGL contexts >+ in a "share group" where one context can change objects in ways that >+ can cause buffer overflows for another context's OpenGL queries. >+ >+ The original ARB_vertex_buffer_object extension includes an issue >+ that explicitly states program termination is allowed when >+ out-of-bounds vertex buffer object fetches occur. Modern graphics >+ hardware is capable well-defined behavior in the case of out-of- >+ bounds vertex buffer object fetches. Older hardware may require >+ extra checks to enforce well-defined (and termination free) >+ behavior, but this expense is warranted when processing potentially >+ untrusted content. >+ >+ The intent of this extension is to address some specific robustness >+ goals: >+ >+ * For all existing OpenGL queries, provide additional "safe" APIs >+ that limit data written to user pointers to a buffer size in >+ bytes that is an explicit additional parameter of the query. >+ >+ * Provide a mechanism for an OpenGL application to learn about >+ graphics resets that affect the context. When a graphics reset >+ occurs, the OpenGL context becomes unusable and the application >+ must create a new context to continue operation. Detecting a >+ graphics reset happens through an inexpensive query. >+ >+ * Provide an enable to guarantee that out-of-bounds buffer object >+ accesses by the GPU will have deterministic behavior and preclude >+ application instability or termination due to an incorrect buffer >+ access. Such accesses include vertex buffer fetches of >+ attributes and indices, and indexed reads of uniforms or >+ parameters from buffers. >+ >+New Procedures and Functions >+ >+ enum GetGraphicsResetStatusEXT(); >+ >+ void ReadnPixelsEXT(int x, int y, sizei width, sizei height, >+ enum format, enum type, sizei bufSize, >+ void *data); >+ >+ void GetnUniformfvEXT(uint program, int location, sizei bufSize, >+ float *params); >+ void GetnUniformivEXT(uint program, int location, sizei bufSize, >+ int *params); >+ >+New Tokens >+ >+ Returned by GetGraphicsResetStatusEXT: >+ >+ NO_ERROR 0x0000 >+ GUILTY_CONTEXT_RESET_EXT 0x8253 >+ INNOCENT_CONTEXT_RESET_EXT 0x8254 >+ UNKNOWN_CONTEXT_RESET_EXT 0x8255 >+ >+ Accepted by the <value> parameter of GetBooleanv, GetIntegerv, >+ and GetFloatv: >+ >+ CONTEXT_ROBUST_ACCESS_EXT 0x90F3 >+ RESET_NOTIFICATION_STRATEGY_EXT 0x8256 >+ >+ Returned by GetIntegerv and related simple queries when <value> is >+ RESET_NOTIFICATION_STRATEGY_EXT : >+ >+ LOSE_CONTEXT_ON_RESET_EXT 0x8252 >+ NO_RESET_NOTIFICATION_EXT 0x8261 >+ >+Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL ES Operation) >+ >+Add a new subsection after 2.5 "GL Errors" and renumber subsequent >+sections accordingly. >+ >+ 2.6 "Graphics Reset Recovery" >+ >+ Certain events can result in a reset of the GL context. Such a reset >+ causes all context state to be lost. Recovery from such events >+ requires recreation of all objects in the affected context. The >+ current status of the graphics reset state is returned by >+ >+ enum GetGraphicsResetStatusEXT(); >+ >+ The symbolic constant returned indicates if the GL context has been >+ in a reset state at any point since the last call to >+ GetGraphicsResetStatusEXT. NO_ERROR indicates that the GL context >+ has not been in a reset state since the last call. >+ GUILTY_CONTEXT_RESET_EXT indicates that a reset has been detected >+ that is attributable to the current GL context. >+ INNOCENT_CONTEXT_RESET_EXT indicates a reset has been detected that >+ is not attributable to the current GL context. >+ UNKNOWN_CONTEXT_RESET_EXT indicates a detected graphics reset whose >+ cause is unknown. >+ >+ If a reset status other than NO_ERROR is returned and subsequent >+ calls return NO_ERROR, the context reset was encountered and >+ completed. If a reset status is repeatedly returned, the context may >+ be in the process of resetting. >+ >+ Reset notification behavior is determined at context creation time, >+ and may be queried by calling GetIntegerv with the symbolic constant >+ RESET_NOTIFICATION_STRATEGY_EXT. >+ >+ If the reset notification behavior is NO_RESET_NOTIFICATION_EXT, >+ then the implementation will never deliver notification of reset >+ events, and GetGraphicsResetStatusEXT will always return >+ NO_ERROR[fn1]. >+ [fn1: In this case it is recommended that implementations should >+ not allow loss of context state no matter what events occur. >+ However, this is only a recommendation, and cannot be relied >+ upon by applications.] >+ >+ If the behavior is LOSE_CONTEXT_ON_RESET_EXT, a graphics reset will >+ result in the loss of all context state, requiring the recreation of >+ all associated objects. In this case GetGraphicsResetStatusEXT may >+ return any of the values described above. >+ >+ If a graphics reset notification occurs in a context, a notification >+ must also occur in all other contexts which share objects with that >+ context[fn2]. >+ [fn2: The values returned by GetGraphicsResetStatusEXT in the >+ different contexts may differ.] >+ >+ Add to Section 2.8 "Vertex Arrays" before subsection "Transferring >+ Array Elements" >+ >+ Robust buffer access is enabled by creating a context with robust >+ access enabled through the window system binding APIs. When enabled, >+ indices within the vertex array that lie outside the arrays defined >+ for enabled attributes result in undefined values for the >+ corresponding attributes, but cannot result in application failure. >+ Robust buffer access behavior may be queried by calling GetIntegerv >+ with the symbolic constant CONTEXT_ROBUST_ACCESS_EXT. >+ >+Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment >+Operations and the Frame Buffer) >+ >+ Modify section 4.3.1 "Reading Pixels" >+ >+ Pixels are read using >+ >+ void ReadPixels(int x, int y, sizei width, sizei height, >+ enum format, enum type, void *data); >+ void ReadnPixelsEXT(int x, int y, sizei width, sizei height, >+ enum format, enum type, sizei bufSize, >+ void *data); >+ >+ Add to the description of ReadPixels: >+ >+ ReadnPixelsEXT behaves identically to ReadPixels except that it does >+ not write more than <bufSize> bytes into <data>. If the buffer size >+ required to fill all the requested data is greater than <bufSize> an >+ INVALID_OPERATION error is generated and <data> is not altered. >+ >+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) >+ >+ Modify Section 6.1.8 "Shader and Program Queries" >+ >+ The commands >+ >+ void GetUniformfv(uint program, int location, float *params); >+ void GetnUniformfvEXT(uint program, int location, sizei bufSize, >+ float *params); >+ void GetUniformiv(uint program, int location, int *params); >+ void GetnUniformivEXT(uint program, int location, sizei bufSize, >+ int *params); >+ >+ return the value or values of the uniform at location <location> >+ for program object <program> in the array <params>. Calling >+ GetnUniformfvEXT or GetnUniformivEXT ensures that no more than >+ <bufSize> bytes are written into <params>. If the buffer size >+ required to fill all the requested data is greater than <bufSize> an >+ INVALID_OPERATION error is generated and <params> is not altered. >+ ... >+ >+Additions to The OpenGL ES Shading Language Specification, Version 1. >+ >+ Append to the third paragraph of section 4.1.9 "Arrays" >+ >+ If robust buffer access is enabled via the OpenGL ES API, such >+ indexing must not result in abnormal program termination. The >+ results are still undefined, but implementations are encouraged to >+ produce zero values for such accesses. >+ >+Interactions with EGL_EXT_create_context_robustness >+ >+ If the EGL window-system binding API is used to create a context, >+ the EGL_EXT_create_context_robustness extension is supported, and >+ the attribute EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT is set to >+ EGL_TRUE when eglCreateContext is called, the resulting context will >+ perform robust buffer access as described above in section 2.8, and >+ the CONTEXT_ROBUST_ACCESS_EXT query will return GL_TRUE as described >+ above in section 6.1.5. >+ >+ If the EGL window-system binding API is used to create a context and >+ the EGL_EXT_create_context_robustness extension is supported, then >+ the value of attribute EGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_EXT >+ determines the reset notification behavior and the value of >+ RESET_NOTIFICATION_STRATEGY_EXT, as described in section 2.6. >+ >+Errors >+ >+ ReadnPixelsEXT, GetnUniformfvEXT, and GetnUniformivEXT share all the >+ errors of their unsized buffer query counterparts with the addition >+ that INVALID_OPERATION is generated if the buffer size required to >+ fill all the requested data is greater than <bufSize>. >+ >+New Implementation Dependent State >+ >+ Get Value Type Get Command Minimum Value Description Sec. Attribute >+ --------- ---- ----------- ------------- --------------------------- ----- --------- >+ CONTEXT_ROBUST_ACCESS_EXT B GetIntegerv - Robust access enabled 6.1.5 - >+ RESET_NOTIFICATION_STRATEGY_EXT Z_2 GetIntegerv See sec. 2.6 Reset notification behavior 2.6 - >+ >+Issues >+ >+ >+ 1. What should this extension be called? >+ >+ RESOLVED: EXT_robustness >+ >+ Since this is intended to be a version of ARB_robustness for >+ OpenGL ES, it should be named accordingly. >+ >+ 2. How does this extension differ from Desktop GL's ARB_robustness? >+ >+ RESOLVED: Because EGL_EXT_create_context_robustness uses a >+ separate attribute to enable robust buffer access, a >+ corresponding query is added here. >+ >+ 3. Should we provide a context creation mechanism to enable this extension? >+ >+ RESOLVED. Yes. >+ >+ Currently, EGL_EXT_create_context_robustness provides this >+ mechanism via two unique attributes. These attributes differ >+ from those specified by KHR_create_context to allow for >+ differences in what functionality those attributes define. >+ >+ 4. What can cause a graphics reset? >+ >+ Either user or implementor errors may result in a graphics reset. >+ If the application attempts to perform a rendering that takes too long >+ whether due to an infinite loop in a shader or even just a rendering >+ operation that takes too long on the given hardware. Implementation >+ errors may produce badly formed hardware commands. Memory access errors >+ may result from user or implementor mistakes. On some systems, power >+ management events such as system sleep, screen saver activation, or >+ pre-emption may also context resets to occur. Any of these events may >+ result in a graphics reset event that will be detectable by the >+ mechanism described in this extension. >+ >+ 5. How should the application react to a reset context event? >+ >+ RESOLVED: For this extension, the application is expected to query >+ the reset status until NO_ERROR is returned. If a reset is encountered, >+ at least one *RESET* status will be returned. Once NO_ERROR is again >+ encountered, the application can safely destroy the old context and >+ create a new one. >+ >+ After a reset event, apps should not use a context for any purpose >+ other than determining its reset status, and then destroying it. If a >+ context receives a reset event, all other contexts in its share group >+ will also receive reset events, and should be destroyed and >+ recreated. >+ >+ Apps should be cautious in interpreting the GUILTY and INNOCENT reset >+ statuses. These are guidelines to the immediate cause of a reset, but >+ not guarantees of the ultimate cause. >+ >+ 6. If a graphics reset occurs in a shared context, what happens in >+ shared contexts? >+ >+ RESOLVED: A reset in one context will result in a reset in all other >+ contexts in its share group. >+ >+ 7. How can an application query for robust buffer access support, >+ since this is now determined at context creation time? >+ >+ RESOLVED. The application can query the value of ROBUST_ACCESS_EXT >+ using GetIntegerv. If true, this functionality is enabled. >+ >+ 8. How is the reset notification behavior controlled? >+ >+ RESOLVED: Reset notification behavior is determined at context >+ creation time using EGL/GLX/WGL/etc. mechanisms. In order that shared >+ objects be handled predictably, a context cannot share with >+ another context unless both have the same reset notification >+ behavior. >+ >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------ --------- ---------------------------------------- >+ 3 31 Oct 2011 groth Reverted to attribute for robust access. Now it's a >+ companion to rather than subset of KHR_create_context >+ 2 11 Oct 2011 groth Merged ANGLE and NV extensions. >+ Convert to using flag to indicate robust access. >+ 1 15 July 2011 groth Initial version >diff --git a/Source/ThirdParty/ANGLE/extensions/EXT_texture_rg.txt b/Source/ThirdParty/ANGLE/extensions/EXT_texture_rg.txt >new file mode 100644 >index 00000000000..968b28d1003 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EXT_texture_rg.txt >@@ -0,0 +1,195 @@ >+Name >+ >+ EXT_texture_rg >+ >+Name Strings >+ >+ GL_EXT_texture_rg >+ >+Contributors >+ >+ Contributors to ARB_texture_rg, on which this extension is based >+ Kyle Haughey >+ Richard Schreyer >+ >+Contact >+ >+ Benj Lipchak, Apple (lipchak 'at' apple.com) >+ >+Status >+ >+ Complete >+ >+Version >+ >+ Date: July 22, 2011 >+ Revision: 3 >+ >+Number >+ >+ OpenGL ES Extension #103 >+ >+Dependencies >+ >+ Requires OpenGL ES 2.0. >+ >+ Written based on the wording of the OpenGL ES 2.0.25 Full Specification >+ (November 2, 2010). >+ >+ OES_texture_float affects the definition of this extension. >+ >+ OES_texture_half_float affects the definition of this extension. >+ >+ APPLE_framebuffer_multisample affects the definition of this extension. >+ >+Overview >+ >+ Historically one- and two-component textures have been specified in OpenGL >+ ES using the luminance or luminance-alpha (L/LA) formats. With the advent >+ of programmable shaders and render-to-texture capabilities these legacy >+ formats carry some historical artifacts which are no longer useful. >+ >+ For example, when sampling from such textures, the luminance values are >+ replicated across the color components. This is no longer necessary with >+ programmable shaders. >+ >+ It is also desirable to be able to render to one- and two-component format >+ textures using capabilities such as framebuffer objects (FBO), but >+ rendering to L/LA formats is under-specified (specifically how to map >+ R/G/B/A values to L/A texture channels). >+ >+ This extension adds new base internal formats for one-component RED and >+ two-component RG (red green) textures as well as sized RED and RG internal >+ formats for renderbuffers. The RED and RG texture formats can be used for >+ both texturing and rendering into with framebuffer objects. >+ >+New Procedures and Functions >+ >+ None >+ >+New Tokens >+ >+ Accepted by the <internalformat> parameter of TexImage2D and CopyTexImage2D, >+ and the <format> parameter of TexImage2D, TexSubImage2D, and ReadPixels: >+ >+ RED_EXT 0x1903 >+ RG_EXT 0x8227 >+ >+ Accepted by the <internalformat> parameter of RenderbufferStorage and >+ RenderbufferStorageMultisampleAPPLE: >+ >+ R8_EXT 0x8229 >+ RG8_EXT 0x822B >+ >+Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL ES Operation) >+ >+ None >+ >+Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization) >+ >+ (Add the following to Table 3.3: "TexImage2D and ReadPixels formats") >+ >+ Format Name Element Meaning and Order Target Buffer >+ ----------- ------------------------- ------------- >+ RED_EXT R Color >+ RG_EXT R, G Color >+ >+ (Add the following to Table 3.4: "Valid pixel format and type combinations") >+ (as modified by OES_texture_float and OES_texture_half_float) >+ >+ Format Type Bytes per Pixel >+ ----------- ------------------------- --------------- >+ RED_EXT FLOAT 4 >+ RED_EXT HALF_FLOAT_OES 2 >+ RED_EXT UNSIGNED_BYTE 1 >+ RG_EXT FLOAT 8 >+ RG_EXT HALF_FLOAT_OES 4 >+ RG_EXT UNSIGNED_BYTE 2 >+ >+ (Add the following to Table 3.8: "Conversion from RGBA and depth pixel >+ components to internal texture") >+ >+ Base Internal Format RGBA Internal Components >+ -------------------- ------ ------------------- >+ RED_EXT R R >+ RG_EXT R,G R,G >+ >+ (Modify Table 3.9: "CopyTexImage internal format/color buffer combinations") >+ >+ Texture Format >+ Color Buffer A L LA R RG RGB RGBA >+ ------------ - - -- - -- --- ---- >+ A X >+ R X X >+ RG X X X >+ RGB X X X X >+ RGBA X X X X X X X >+ >+ (Add the following to Table 3.12: "Correspondence of filtered texture >+ components to texture source color components") >+ >+ Texture Base Texture source color >+ Internal Format C_s A_s >+ --------------- ------------- ------ >+ RED_EXT (R_t, 0, 0) 1 >+ RG_EXT (R_t, G_t, 0) 1 >+ >+Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment >+Operations and the Framebuffer) >+ >+ In section 4.3.1 "Reading Pixels", subsection "Obtaining Pixels from the >+ Framebuffer", modify the last sentence to read: >+ >+ "If the framebuffer does not support G, B, or A values then the G, B, and A >+ values that are obtained are 0.0, 0.0, and 1.0 respectively." >+ >+ In section 4.4.5 "Framebuffer Completeness", modify the last sentence of >+ the second paragraph to read: >+ >+ "Color-renderable formats contain red, and possibly green, blue, and alpha >+ components; depth-renderable formats contain depth components; and >+ stencil-renderable formats contain stencil components." >+ >+ (Add the following to Table 4.5: "Renderbuffer image formats, showing their >+ renderable type (color-, depth-, or stencil-renderable) and the number of >+ bits each format contains for color (R, G, B, A), depth (D), and stencil >+ (S) components") >+ >+ Sized Internal Renderable Type R bits G bits B bits A bits D bits S bits >+ Format >+ -------------- ---------------- ------ ------ ------ ------ ------ ------ >+ R8_EXT color-renderable 8 >+ RG8_EXT color-renderable 8 8 >+ >+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 >+ >+Dependencies on OES_texture_float >+ >+ If OES_texture_float is not supported, then omit the rows of >+ Table 3.4 that have Type FLOAT. >+ >+Dependencies on OES_texture_half_float >+ >+ If OES_texture_half_float is not supported, then omit the rows of >+ Table 3.4 that have Type HALF_FLOAT_OES. >+ >+Dependencies on APPLE_framebuffer_multisample >+ >+ If APPLE_framebuffer_multisample is not supported, then all references to >+ RenderbufferStorageMultisampleAPPLE should be ignored. >+ >+Revision History >+ >+ #1 February 22, 2011, khaughey >+ - initial version adapted from ARB_texture_rg. >+ #2 June 16, 2011, benj >+ - add interaction with APPLE_framebuffer_multisample >+ #3 July 22, 2011, benj >+ - rename from APPLE to EXT >diff --git a/Source/ThirdParty/ANGLE/extensions/EXT_texture_storage.txt b/Source/ThirdParty/ANGLE/extensions/EXT_texture_storage.txt >new file mode 100644 >index 00000000000..fd629e7b3a5 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EXT_texture_storage.txt >@@ -0,0 +1,1090 @@ >+Name >+ >+ EXT_texture_storage >+ >+Name Strings >+ >+ GL_EXT_texture_storage >+ >+Contact >+ >+ Bruce Merry (bmerry 'at' gmail.com) >+ Ian Romanick, Intel (ian.d.romanick 'at' intel.com) >+ >+Contributors >+ >+ Jeremy Sandmel, Apple >+ Bruce Merry, ARM >+ Tom Olson, ARM >+ Benji Bowman, Imagination Technologies >+ Ian Romanick, Intel >+ Jeff Bolz, NVIDIA >+ Pat Brown, NVIDIA >+ Maurice Ribble, Qualcomm >+ Lingjun Chen, Qualcomm >+ Daniel Koch, Transgaming Inc >+ >+Status >+ >+ Complete. >+ >+Version >+ >+ Last Modified Date: November 11, 2011 >+ Author Revision: 24 >+ >+Number >+ >+ OpenGL ES Extension #108 >+ >+Dependencies >+ >+ OpenGL ES 1.0, OpenGL ES 2.0 or OpenGL 1.2 is required. >+ >+ OES_texture_npot, OES_texture_cube_map, OES_texture_3D, >+ OES_depth_texture, OES_packed_depth_stencil, >+ OES_compressed_paletted_texture, OES_texture_float, OES_texture_half_float >+ EXT_texture_type_2_10_10_10_REV, EXT_texture_format_BGRA8888, >+ EXT_texture3D, OES_texture_npot, APPLE_texture_2D_limited_npot, >+ ARB_texture_cube_map, ARB_texture_cube_map_array, >+ ARB_texture_rectangle, SGIS_generate_mipmap, >+ EXT_direct_state_access, OES_EGL_image, WGL_ARB_render_texture, >+ GLX_EXT_texture_from_pixmap, and core specifications that >+ incorporate these extensions affect the definition of this >+ extension. >+ >+ This extension is written against the OpenGL 3.2 Core Profile >+ specification. >+ >+Overview >+ >+ The texture image specification commands in OpenGL allow each level >+ to be separately specified with different sizes, formats, types and >+ so on, and only imposes consistency checks at draw time. This adds >+ overhead for implementations. >+ >+ This extension provides a mechanism for specifying the entire >+ structure of a texture in a single call, allowing certain >+ consistency checks and memory allocations to be done up front. Once >+ specified, the format and dimensions of the image array become >+ immutable, to simplify completeness checks in the implementation. >+ >+ When using this extension, it is no longer possible to supply texture >+ data using TexImage*. Instead, data can be uploaded using TexSubImage*, >+ or produced by other means (such as render-to-texture, mipmap generation, >+ or rendering to a sibling EGLImage). >+ >+ This extension has complicated interactions with other extensions. >+ The goal of most of these interactions is to ensure that a texture >+ is always mipmap complete (and cube complete for cubemap textures). >+ >+IP Status >+ >+ No known IP claims >+ >+New Procedures and Functions >+ >+ void TexStorage1DEXT(enum target, sizei levels, >+ enum internalformat, >+ sizei width); >+ >+ void TexStorage2DEXT(enum target, sizei levels, >+ enum internalformat, >+ sizei width, sizei height); >+ >+ void TexStorage3DEXT(enum target, sizei levels, >+ enum internalformat, >+ sizei width, sizei height, sizei depth); >+ >+ void TextureStorage1DEXT(uint texture, enum target, sizei levels, >+ enum internalformat, >+ sizei width); >+ >+ void TextureStorage2DEXT(uint texture, enum target, sizei levels, >+ enum internalformat, >+ sizei width, sizei height); >+ >+ void TextureStorage3DEXT(uint texture, enum target, sizei levels, >+ enum internalformat, >+ sizei width, sizei height, sizei depth); >+ >+New Types >+ >+ None >+ >+New Tokens >+ >+ Accepted by the <value> parameter of GetTexParameter{if}v: >+ >+ TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F >+ >+ Accepted by the <internalformat> parameter of TexStorage* when >+ implemented on OpenGL ES: >+ >+ ALPHA8_EXT 0x803C /* reuse tokens from EXT_texture */ >+ LUMINANCE8_EXT 0x8040 >+ LUMINANCE8_ALPHA8_EXT 0x8045 >+ >+ (if OES_texture_float is supported) >+ RGBA32F_EXT 0x8814 /* reuse tokens from ARB_texture_float */ >+ RGB32F_EXT 0x8815 >+ ALPHA32F_EXT 0x8816 >+ LUMINANCE32F_EXT 0x8818 >+ LUMINANCE_ALPHA32F_EXT 0x8819 >+ >+ (if OES_texture_half_float is supported) >+ RGBA16F_EXT 0x881A /* reuse tokens from ARB_texture_float */ >+ RGB16F_EXT 0x881B >+ ALPHA16F_EXT 0x881C >+ LUMINANCE16F_EXT 0x881E >+ LUMINANCE_ALPHA16F_EXT 0x881F >+ >+ (if EXT_texture_type_2_10_10_10_REV is supported) >+ RGB10_A2_EXT 0x8059 /* reuse tokens from EXT_texture */ >+ RGB10_EXT 0x8052 >+ >+ (if EXT_texture_format_BGRA8888 is supported) >+ BGRA8_EXT 0x93A1 >+ >+ >+Additions to Chapter 2 of the OpenGL 3.2 Core Profile Specification >+(OpenGL Operation) >+ >+ None >+ >+Additions to Chapter 3 of the OpenGL 3.2 Core Profile Specification >+(Rasterization) >+ >+ After section 3.8.1 (Texture Image Specification) add a new >+ subsection called "Immutable-format texture images": >+ >+ "An alterative set of commands is provided for specifying the >+ properties of all levels of a texture at once. Once a texture is >+ specified with such a command, the format and dimensions of all >+ levels becomes immutable, unless it is a proxy texture (since >+ otherwise it would no longer be possible to use the proxy). The >+ contents of the images and the parameters can still be modified. >+ Such a texture is referred to as an "immutable-format" texture. The >+ immutability status of a texture can be determined by calling >+ GetTexParameter with <pname> TEXTURE_IMMUTABLE_FORMAT_EXT. >+ >+ Each of the commands below is described by pseudo-code which >+ indicates the effect on the dimensions and format of the texture. >+ For all of the commands, the following apply in addition to the >+ pseudo-code: >+ >+ - If the default texture object is bound to <target>, an >+ INVALID_OPERATION error is generated. >+ - If executing the pseudo-code would lead to an error, the error is >+ generated and the command will have no effect. >+ - Any existing levels that are not replaced are reset to their >+ initial state. >+ - If <width>, <height>, <depth> or <levels> is less than 1, the >+ error INVALID_VALUE is generated. >+ - Since no pixel data are provided, the <format> and <type> values >+ used in the pseudo-code are irrelevant; they can be considered to >+ be any values that are legal to use with <internalformat>. >+ - If the command is successful, TEXTURE_IMMUTABLE_FORMAT_EXT becomes >+ TRUE. >+ - If <internalformat> is a specific compressed texture format, then >+ references to TexImage* should be replaced by CompressedTexImage*, >+ with <format>, <type> and <data> replaced by any valid <imageSize> and >+ <data>. If there is no <imageSize> for which this command would have >+ been valid, an INVALID_OPERATION error is generated [fn: This >+ condition is not required for OpenGL, but is necessary for OpenGL >+ ES which does not support on-the-fly compression.] >+ - If <internalformat> is one of the internal formats listed in table >+ 3.11, an INVALID_ENUM error is generated. [fn: The corresponding table >+ in OpenGL ES 2.0 is table 3.8.] >+ >+ The command >+ >+ void TexStorage1DEXT(enum target, sizei levels, >+ enum internalformat, >+ sizei width); >+ >+ specifies all the levels of a one-dimensional texture (or proxy) at >+ the same time. It is described by the pseudo-code below: >+ >+ for (i = 0; i < levels; i++) >+ { >+ TexImage1D(target, i, internalformat, width, 0, >+ format, type, NULL); >+ width = max(1, floor(width / 2)); >+ } >+ >+ If <target> is not TEXTURE_1D or PROXY_TEXTURE_1D then INVALID_ENUM >+ is generated. If <levels> is greater than floor(log_2(width)) + 1 >+ then INVALID_OPERATION is generated. >+ >+ The command >+ >+ void TexStorage2DEXT(enum target, sizei levels, >+ enum internalformat, >+ sizei width, sizei height); >+ >+ specifies all the levels of a two-dimensional, cube-map, >+ one-dimension array or rectangle texture (or proxy) at the same >+ time. The pseudo-code depends on the <target>: >+ >+ [PROXY_]TEXTURE_2D, [PROXY_]TEXTURE_RECTANGLE or >+ PROXY_TEXTURE_CUBE_MAP: >+ >+ for (i = 0; i < levels; i++) >+ { >+ TexImage2D(target, i, internalformat, width, height, 0, >+ format, type, NULL); >+ width = max(1, floor(width / 2)); >+ height = max(1, floor(height / 2)); >+ } >+ >+ TEXTURE_CUBE_MAP: >+ >+ for (i = 0; i < levels; i++) >+ { >+ for face in (+X, -X, +Y, -Y, +Z, -Z) >+ { >+ TexImage2D(face, i, internalformat, width, height, 0, >+ format, type, NULL); >+ } >+ width = max(1, floor(width / 2)); >+ height = max(1, floor(height / 2)); >+ } >+ >+ [PROXY_]TEXTURE_1D_ARRAY: >+ >+ for (i = 0; i < levels; i++) >+ { >+ TexImage2D(target, i, internalformat, width, height, 0, >+ format, type, NULL); >+ width = max(1, floor(width / 2)); >+ } >+ >+ If <target> is not one of those listed above, the error INVALID_ENUM >+ is generated. >+ >+ The error INVALID_OPERATION is generated if any of the following >+ conditions hold: >+ - <target> is [PROXY_]TEXTURE_1D_ARRAY and <levels> is greater than >+ floor(log_2(width)) + 1 >+ - <target> is not [PROXY_]TEXTURE_1D_ARRAY and <levels> is greater >+ than floor(log_2(max(width, height))) + 1 >+ >+ The command >+ >+ void TexStorage3DEXT(enum target, sizei levels, enum internalformat, >+ sizei width, sizei height, sizei depth); >+ >+ specifies all the levels of a three-dimensional, two-dimensional >+ array texture, or cube-map array texture (or proxy). The pseudo-code >+ depends on <target>: >+ >+ [PROXY_]TEXTURE_3D: >+ >+ for (i = 0; i < levels; i++) >+ { >+ TexImage3D(target, i, internalformat, width, height, depth, 0, >+ format, type, NULL); >+ width = max(1, floor(width / 2)); >+ height = max(1, floor(height / 2)); >+ depth = max(1, floor(depth / 2)); >+ } >+ >+ [PROXY_]TEXTURE_2D_ARRAY, [PROXY_]TEXTURE_CUBE_MAP_ARRAY_ARB: >+ >+ for (i = 0; i < levels; i++) >+ { >+ TexImage3D(target, i, internalformat, width, height, depth, 0, >+ format, type, NULL); >+ width = max(1, floor(width / 2)); >+ height = max(1, floor(height / 2)); >+ } >+ >+ If <target> is not one of those listed above, the error INVALID_ENUM >+ is generated. >+ >+ The error INVALID_OPERATION is generated if any of the following >+ conditions hold: >+ - <target> is [PROXY_]TEXTURE_3D and <levels> is greater than >+ floor(log_2(max(width, height, depth))) + 1 >+ - <target> is [PROXY_]TEXTURE_2D_ARRAY or >+ [PROXY_]TEXTURE_CUBE_MAP_ARRAY_EXT and <levels> is greater than >+ floor(log_2(max(width, height))) + 1 >+ >+ After a successful call to any TexStorage* command with a non-proxy >+ target, the value of TEXTURE_IMMUTABLE_FORMAT_EXT for this texture >+ object is set to TRUE, and no further changes to the dimensions or >+ format of the texture object may be made. Other commands may only >+ alter the texel values and texture parameters. Using any of the >+ following commands with the same texture will result in the error >+ INVALID_OPERATION being generated, even if it does not affect the >+ dimensions or format: >+ >+ - TexImage* >+ - CompressedTexImage* >+ - CopyTexImage* >+ - TexStorage* >+ >+ The TextureStorage* commands operate identically to the >+ corresponding command where "Texture" is substituted for "Tex" >+ except, rather than updating the current bound texture for the >+ texture unit indicated by the current active texture state and the >+ target parameter, these "Texture" commands update the texture object >+ named by the initial texture parameter. The error INVALID_VALUE >+ is generated if <texture> is zero. >+ " >+ >+ In section 3.8.6 (Texture Parameters), after the sentence >+ >+ "In the remainder of section 3.8, denote by lod_min, lod_max, >+ level_base, and level_max the values of the texture parameters >+ TEXTURE_MIN_LOD, TEXTURE_MAX_LOD, TEXTURE_BASE_LEVEL, and >+ TEXTURE_MAX_LEVEL respectively." >+ >+ add >+ >+ "However, if TEXTURE_IMMUTABLE_FORMAT_EXT is >+ TRUE, then level_base is clamped to the range [0, <levels> - 1] and >+ level_max is then clamped to the range [level_base, <levels> - 1], >+ where <levels> is the parameter passed the call to TexStorage* for >+ the texture object. >+ >+ In section 3.8.9 (Rendering feedback loops) replace all references >+ to TEXTURE_BASE_LEVEL by level_base. >+ >+ In section 3.8.9 (Mipmapping), replace the paragraph starting "Each >+ array in a mipmap is defined..." by >+ >+ "Each array in a mipmap is defined using TexImage3D, TexImage2D, >+ CopyTexImage2D, TexImage1D, CopyTexImage1D, or by functions that are >+ defined in terms of these functions. Level-of-detail numbers proceed >+ from level_base for the original texel array through the maximum >+ level p, with each unit increase indicating an array of half the >+ dimensions of the previous one (rounded down to the next integer if >+ fractional) as already described. For immutable-format textures, >+ p is one less than the <levels> parameter passed to TexStorage*; >+ otherwise p = floor(log_2(maxsize)) + level_base. All arrays from >+ level_base through q = min(p, level_max) must be defined, as >+ discussed in section 3.8.12." >+ >+ In section 3.8.12 (Texture Completeness), modify the last sentence >+ to avoid refering to level_base and level_max: >+ >+ "An implementation may allow a texture image array of level 1 or >+ greater to be created only if a mipmap complete set of image arrays >+ consistent with the requested array can be supported where the >+ values of TEXTURE_BASE_LEVEL and TEXTURE_MAX_LEVEL are 0 and 1000 >+ respectively." >+ >+ Modify section 3.8.13 (Texture State and Proxy State) to add the new >+ state: >+ >+ "Each set consists of ..., and a boolean flag indicating whether the >+ format and dimensions of the texture are immutable." >+ >+ Add >+ "The initial value of TEXTURE_IMMUTABLE_FORMAT_EXT is FALSE." >+ >+Additions to Chapter 4 of the OpenGL 3.2 Core Profile Specification >+(Per-Fragment Operations and the Frame Buffer) >+ >+ None >+ >+Additions to Chapter 5 of the OpenGL 3.2 Compatibility Profile Specification >+(Special Functions) >+ >+ In section 5.4.1 (Commands Not Usable in Display Lists), add >+ TexStorage* to the list of commands that cannot be used. >+ >+Additions to Chapter 6 of the OpenGL 3.2 Core Profile Specification >+(State and State Requests) >+ >+ Replace the following statement in 6.1.3 (Enumerated Queries): >+ >+ "<value> must be one of the symbolic values in table 3.10." >+ >+ with >+ >+ "<value> must be TEXTURE_IMMUTABLE_FORMAT_EXT or one of the symbolic >+ values in table 3.22." >+ >+Additions to the AGL/EGL/GLX/WGL Specifications >+ >+ None >+ >+Additions to OES_compressed_ETC1_RGB8_texture >+ >+ Add the following to the additions to Chapter 3: >+ >+ "Since ETC1 images are easily edited along 4x4 texel boundaries, the >+ limitations on CompressedTexSubImage2D are relaxed. >+ CompressedTexSubImage2D will result in an INVALID_OPERATION error >+ only if one of the following conditions occurs: >+ >+ * <width> is not a multiple of four, and <width> plus <xoffset> is not >+ equal to the texture width; >+ >+ * <height> is not a multiple of four, and <height> plus <yoffset> is >+ not equal to the texture height; or >+ >+ * <xoffset> or <yoffset> is not a multiple of four. >+ >+ Remove CompressedTexSubImage2D from this error: >+ >+ "INVALID_OPERATION is generated by CompressedTexSubImage2D, >+ TexSubImage2D, or CopyTexSubImage2D if the texture image <level> >+ bound to <target> has internal format ETC1_RGB8_OES." >+ >+ Add the following error: >+ >+ "INVALID_OPERATION is generated by CompressedTexSubImage2D >+ if the region to be modified is not aligned to block boundaries >+ (refer to the extension text for details)." >+ >+Additions to AMD_compressed_ATC_texture and AMD_compressed_3DC_texture: >+ >+ Apply the same changes as for OES_compressed_ETC1_RGB8_texture >+ above, substituting the appropriate internal format tokens from >+ these extensions. >+ >+Dependencies on EXT_direct_state_access >+ >+ If EXT_direct_state_access is not present, references to >+ TextureStorage* should be ignored. >+ >+Dependencies on OpenGL ES >+ >+ On OpenGL ES without extensions introducing TEXTURE_MAX_LEVEL, >+ mipmapped textures specified with TexStorage are required to have a >+ full set of mipmaps. If TEXTURE_MAX_LEVEL is not supported, this >+ extension is modified as follows: >+ >+ - Where an upper bound is placed on <levels> in this extension (i.e. >+ the maximum number of mipmap levels for a texture of the given >+ target and dimensions), an INVALID_OPERATION error is generated if >+ <levels> is neither 1 nor this upper bound. >+ - q (the effective maximum number of levels) is redefined to clamp >+ to the number of levels present in immutable-format textures. >+ >+ OpenGL ES does not accept sized internal formats (e.g., RGBA8) and >+ instead derives an internal format from the <format> and <type> >+ parameters of TexImage2D. Since TexStorage* does not specify texel >+ data, the API doesn't include <format> and <type> parameters. >+ On an OpenGL ES implementation, the values in the <internalformat> >+ column in the tables below are accepted as <internalformat> >+ parameters, and base internal formats are not accepted. The >+ TexImage* calls in the TexStorage* pseudocode are modified so that >+ the <internalformat>, <format> and <type> parameters are >+ taken from the <format>, <format> and <type> columns (respectively) >+ in the tables below, according to the <internalformat> >+ specified in the TexStorage* command. >+ >+ <internalformat> <format> <type> >+ ---------------- -------- ------ >+ RGB565 RGB UNSIGNED_SHORT_5_6_5 >+ RGBA4 RGBA UNSIGNED_SHORT_4_4_4_4 >+ RGB5_A1 RGBA UNSIGNED_SHORT_5_5_5_1 >+ RGB8_OES RGB UNSIGNED_BYTE >+ RGBA8_OES RGBA UNSIGNED_BYTE >+ LUMINANCE8_ALPHA8_EXT LUMINANCE_ALPHA UNSIGNED_BYTE >+ LUMINANCE8_EXT LUMINANCE UNSIGNED_BYTE >+ ALPHA8_EXT ALPHA UNSIGNED_BYTE >+ >+ If OES_depth_texture is supported: >+ >+ <internalformat> <format> <type> >+ ---------------- -------- ------ >+ DEPTH_COMPONENT16_OES DEPTH_COMPONENT UNSIGNED_SHORT >+ DEPTH_COMPONENT32_OES DEPTH_COMPONENT UNSIGNED_INT >+ >+ If OES_packed_depth_stencil is supported: >+ >+ <internalformat> <format> <type> >+ ---------------- -------- ------ >+ DEPTH24_STENCIL8_OES DEPTH_STENCIL_OES UNSIGNED_INT >+ >+ If OES_texture_float is supported: >+ >+ <internalformat> <format> <type> >+ ---------------- -------- ------ >+ RGBA32F_EXT RGBA FLOAT >+ RGB32F_EXT RGB FLOAT >+ LUMINANCE_ALPHA32F_EXT LUMINANCE_ALPHA FLOAT >+ LUMINANCE32F_EXT LUMINANCE FLOAT >+ ALPHA32F_EXT ALPHA FLOAT >+ >+ If OES_texture_half_float is supported: >+ >+ <internalformat> <format> <type> >+ ---------------- -------- ------ >+ RGBA16F_EXT RGBA HALF_FLOAT_OES >+ RGB16F_EXT RGB HALF_FLOAT_OES >+ LUMINANCE_ALPHA16F_EXT LUMINANCE_ALPHA HALF_FLOAT_OES >+ LUMINANCE16F_EXT LUMINANCE HALF_FLOAT_OES >+ ALPHA16F_EXT ALPHA HALF_FLOAT_OES >+ >+ If EXT_texture_type_2_10_10_10_REV is supported: >+ >+ <internalformat> <format> <type> >+ ---------------- -------- ------ >+ RGB10_A2_EXT RGBA UNSIGNED_INT_2_10_10_10_REV_EXT >+ RGB10_EXT RGB UNSIGNED_INT_2_10_10_10_REV_EXT >+ >+ If EXT_texture_format_BGRA8888 is supported: >+ >+ <internalformat> <format> <type> >+ ---------------- -------- ------ >+ BGRA8_EXT BGRA_EXT UNSIGNED_BYTE >+ >+ >+Dependencies on texture targets >+ >+ If a particular texture target is not supported by the >+ implementation, passing it as a <target> to TexStorage* will >+ generate an INVALID_ENUM error. If as a result, any of the commands >+ defined in this extension would no longer have any valid <target>, >+ all references to the command should be ignored. >+ >+ In particular, note that OpenGL ES 1.x/2.0 do not have proxy textures, >+ 1D textures, or 3D textures, and thus only the TexStorage2DEXT >+ entry point is required. If OES_texture_3D is supported, the >+ TexStorage3DEXT entry point is also required. >+ >+Dependencies on OES_texture_npot >+ >+ If OpenGL ES 2.0 or APPLE_texture_2D_limited_npot is present but >+ OES_texture_npot is not present, then INVALID_OPERATION is >+ generated by TexStorage* and TexStorage3DEXT if <levels> is >+ not one and <width>, <height> or <depth> is not a power of >+ two. >+ >+Dependencies on WGL_ARB_render_texture, GLX_EXT_texture_from_pixmap, EGL >+1.4 and GL_OES_EGL_image >+ >+ The commands eglBindTexImage, wglBindTexImageARB, glXBindTexImageEXT or >+ EGLImageTargetTexture2DOES are not permitted on an immutable-format >+ texture. >+ They will generate the following errors: >+ - EGLImageTargetTexture2DOES: INVALID_OPERATION >+ - eglBindTexImage: EGL_BAD_MATCH >+ - wglBindTexImage: ERROR_INVALID_OPERATION >+ - glXBindTexImageEXT: BadMatch >+ >+Dependencies on OES_compressed_paletted_texture >+ >+ The compressed texture formats exposed by >+ OES_compressed_paletted_texture are not supported by TexStorage*. >+ Passing one of these tokens to TexStorage* will generate an >+ INVALID_ENUM error. >+ >+Errors >+ >+ Note that dependencies above modify the errors. >+ >+ If TexStorage* is called with a <width>, <height>, <depth> or >+ <levels> parameter that is less than one, then the error >+ INVALID_VALUE is generated. >+ >+ If the <target> parameter to TexStorage1DEXT is not >+ [PROXY_]TEXTURE_1D, then the error INVALID_ENUM is generated. >+ >+ If the <target> parameter to TexStorage2DEXT is not >+ [PROXY_]TEXTURE_2D, [PROXY_]TEXTURE_CUBE_MAP, >+ [PROXY_]TEXTURE_RECTANGLE or [PROXY_]TEXTURE_1D_ARRAY, then the >+ error INVALID_ENUM is generated. >+ >+ If the <target> parameter to TexStorage3DEXT is not >+ [PROXY_]TEXTURE_3D, [PROXY_]TEXTURE_2D_ARRAY or >+ [PROXY_]TEXTURE_CUBE_MAP_ARRAY then the error INVALID_ENUM is >+ generated. >+ >+ If the <levels> parameter to TexStorage* is greater than the >+ <target>-specific value listed below then the error >+ INVALID_OPERATION is generated: >+ [PROXY_]TEXTURE_{1D,1D_ARRAY}: >+ floor(log_2(width)) + 1 >+ [PROXY_]TEXTURE_{2D,2D_ARRAY,CUBE_MAP,CUBE_MAP_ARRAY}: >+ floor(log_2(max(width, height))) + 1 >+ [PROXY_]TEXTURE_3D: >+ floor(log_2(max(width, height, depth))) + 1 >+ [PROXY_]TEXTURE_RECTANGLE: >+ 1 >+ >+ If the default texture object is bound to the <target> passed to >+ TexStorage*, then the error INVALID_OPERATION is generated. >+ >+ If the <target> parameter to TextureStorage* does not match the >+ dimensionality of <texture>, then the error INVALID_OPERATION is >+ generated. >+ >+ If the <texture> parameter to TextureStorage* is zero, then the >+ INVALID_VALUE is generated. >+ >+ If any pseudo-code listed in this extension would generate an error, >+ then that error is generated. >+ >+ Calling any of the following functions on a texture for which >+ TEXTURE_IMMUTABLE_FORMAT_EXT is TRUE will generate an >+ INVALID_OPERATION error: >+ - TexImage* >+ - CompressedTexImage* >+ - CopyTexImage* >+ >+New State >+ >+ Additions to Table 6.8 Textures (state per texture object) >+ >+ Initial >+ Get Value Type Get Command Value Description Sec. >+ --------- ---- ----------- ------- ----------- ---- >+ TEXTURE_IMMUTABLE_FORMAT_EXT B GetTexParameter FALSE Size and format immutable 2.6 >+ >+New Implementation Dependent State >+ >+ None >+ >+Issues >+ >+ 1. What should this extension be called? >+ >+ RESOLVED: EXT_texture_storage is chosen for consistency with the >+ glRenderbufferStorage entry point. >+ >+ 2. Should TexStorage* accept a border parameter? >+ >+ RESOLVED: no. >+ >+ DISCUSSION: Currently it does not, since borders are a deprecated >+ feature which is not supported by all hardware. Users of the >+ compatibility profile can continue to use the existing texture >+ specification functions, but there is an argument that users of >+ compatibility profile may also want to use this extension. >+ >+ 3. What is the correct error when <levels> specifies a partial >+ mipmap pyramid for OpenGL ES? >+ >+ RESOLVED: INVALID_OPERATION, since it is an interaction between >+ parameters rather than a single value being invalid. It also makes >+ sense to relax this condition for desktop GL where it makes sense to >+ use a truncated pyramid with TEXTURE_MAX_LEVEL. >+ >+ 4. Should use of these entry-points make the metadata (format and >+ dimensions) immutable? >+ >+ RESOLVED: Yes. >+ >+ DISCUSSION: The benefits of knowing metadata can't change will >+ probably outweigh the extra cost of checking the >+ TEXTURE_IMMUTABLE_FORMAT_EXT flag on each texture specification >+ call. >+ >+ 5. Should it be legal to completely replace the texture using a new call >+ to TexStorage*? >+ >+ RESOLVED. It will not be allowed. >+ >+ DISCUSSION: This is useful to invalidate all levels of a texture. >+ Allowing the metadata to be changed here seems easier than trying to >+ define a portable definition of what it means to change the metadata >+ (e.g. what if you used an unsized internal format the first time and >+ the corresponding sized internal format the second time, or vice >+ versa)? >+ >+ However, while this is largely similar to deleting the old texture >+ object and replacing it with a new one, it does lose some of the >+ advantages of immutability. Specifically, because doing so does not >+ reset bindings, it doesn't allow a migration path to an API that >+ validates the texture format at bind time. >+ >+ 6. Should it be legal to use TexImage* after TexStorage* if it doesn't >+ affect the metadata? >+ >+ RESOLVED: No. >+ >+ DISCUSSION: A potential use case is to allow a single level of a >+ texture to be invalidated using a NULL pointer. However, as noted >+ above it is non-trivial to determine what constitutes a change. >+ >+ 7. How does this extension interact with APPLE_texture_2D_limited_npot? >+ >+ RESOLVED. APPLE_texture_2D_limited_npot is equivalent to the NPOT >+ support in OpenGL ES 2.0. >+ >+ 8. Should this extension be written to work with desktop OpenGL? >+ >+ RESOLVED: Yes. >+ >+ DISCUSSION: There has been been interest and it will future-proof it >+ against further additions to OpenGL ES. >+ >+ 9. Which texture targets should be supported? >+ >+ RESOLVED. All targets except multisample and buffer textures are >+ supported. >+ >+ Initially all targets except TEXTURE_BUFFER were supported. It was >+ noted that the entrypoints for multisample targets added no useful >+ functionality, since multisample textures have no completeness >+ checks beyond being non-empty. >+ >+ Rectangle textures have completeness checks to prevent filtering of >+ integer textures. However, since we decided to only force mipmap >+ completeness, this becomes less useful. >+ >+ 10. Should this extension support proxy textures? >+ >+ RESOLVED: Yes. >+ >+ DISCUSSION: It should be orthogonal. >+ >+ 11. Are the <format> and <type> parameters necessary? >+ >+ RESOLVED. No, they will be removed. >+ >+ DISCUSSION: For OpenGL ES the type parameter was necessary to >+ determine the precision of the texture, but this can be solved by >+ having these functions accept sized internal formats (which are >+ already accepted by renderbuffers). >+ >+ 12. Should it be legal to make the default texture (id 0) >+ immutable-format? >+ >+ RESOLVED: No. >+ >+ DISCUSSION: This would make it impossible to restore the context to >+ it's default state, which is deemed undesirable. There is no good >+ reason not to use named texture objects. >+ >+ 13. Should we try to guarantee that textures made through this path >+ will always be complete? >+ >+ RESOLVED: It should be guaranteed that the texture will be mipmap >+ complete. >+ >+ DISCUSSION: Future separation between images and samplers will still >+ allow users to create combinations that are invalid, but >+ constraining the simple cases will make these APIs easier to use for >+ beginners. >+ >+ 14. Should these functions use a EXT_direct_state_access approach to >+ specifying the texture objects? >+ >+ UNRESOLVED. >+ >+ DISCUSSION: as a standalone extension, no DSA-like functions will be >+ added. However, interactions with EXT_direct_state_access and >+ ARB_direct_state_access need to be resolved. >+ >+ 15. Should these functions accept generic compressed formats? >+ >+ RESOLVED: Yes. Note that the spec language will need to be modified >+ to allow this for ES, since the pseudocode is written in terms of >+ TexImage2D, which does not allow compressed texture formats in ES. >+ See also issues 23 and 27. >+ >+ 16. How should completeness be forced when TEXTURE_MAX_LEVEL is not >+ present? >+ >+ RESOLVED. The maximum level q will be redefined to clamp to the >+ highest level available. >+ >+ DISCUSSION: A single-level texture can be made complete either by >+ making it mipmap complete (by setting TEXTURE_MAX_LEVEL to 0) or by >+ turning off mipmapping (by choose an appropriate minification >+ filter). >+ >+ Some options: >+ >+ A: Specify that TexStorage* changes the default minification filter >+ for OpenGL ES. This makes it awkward to add TEXTURE_MAX_LEVEL >+ support to OpenGL ES later, since switching to match GL would break >+ compatibility. The two mechanisms also do not give identical >+ results, since the magnification threshold depends on the >+ minification filter. >+ >+ B: Specify that the texture behaves as though TEXTURE_MAX_LEVEL were >+ zero. To specify this properly probably requires fairly intrusive >+ changes to the OpenGL ES full specification to add back all the >+ language relating to the max level. It also does not solve the >+ similar problem of what to do with NPOT textures; and it may have >+ hardware impacts due to the change in the min/mag crossover. >+ >+ C: Specify that TexStorage* changes the default minification filter >+ for all implementations when a single-level texture is specified. >+ This may be slightly counter-intuitive to desktop GL users, but will >+ give consistent behaviour across variants of GL and avoids changing >+ the functional behaviour of this extension based on the presence or >+ absence of some other feature. >+ >+ Currently B is specified. This has potential hardware implications >+ for OpenGL ES because of the effect of the minification filter on >+ the min/mag crossover. However, C has potential hardware implications >+ for OpenGL due to the separation of texture and sampler state. >+ >+ 17. How should completeness be forced when only ES2-style NPOT is >+ available? >+ >+ RESOLVED. It is not worth trying to do this, in light of issue 13. >+ >+ Previous revisions of this extension overrode the minification >+ filter and wrap modes, but that is no longer the case. Since >+ OES_texture_npot removes the caveats on NPOT textures anyway, it >+ might not be worth trying to "fix" this. >+ >+ 18. For OpenGL ES, how do the new sized internal formats interact >+ with OES_required_internal_format? >+ >+ RESOLVED. >+ >+ If OES_required_internal_format is not present, then the >+ <internalformat> parameter is intended merely to indicate what the >+ corresponding <format> and <type> would have been, had TexImage* >+ been used instead. If OES_required_internal_format is present, then >+ it is intended that the <internalformat> will be interpreted as if >+ it had been passed directly to TexImage*. >+ >+ 19. Should there be some hinting mechanism to indicate whether data >+ is coming immediately or later? >+ >+ RESOLVED. No parameter is needed. An extension can be added to provide >+ a TexParameter value which is latched at TexStorage time. >+ >+ DISCUSSION: Some members felt that this would be useful so that they >+ could defer allocation when suitable, particularly if higher- >+ resolution images will be streamed in later; or to choose a memory >+ type or layout appropriate to the usage. However, implementation >+ experience with BufferData is that developers frequently provide >+ wrong values and implementations have to guess anyway. >+ >+ One option suggested was the <usage> parameter currently passed to >+ BufferData. Another option was to set it with TexParameter. >+ >+ 20. How should this extension interact with >+ EGLImageTargetTexture2DOES, eglBindTexImage, glXBindTexImage and >+ wglBindTexImage? >+ >+ RESOLVED. These functions will not be permitted after glTexStorage*. >+ >+ Several options are possible: >+ >+ A) Disallow these functions. >+ B) Allow them, but have them reset the TEXTURE_IMMUTABLE_FORMAT_EXT >+ flag. >+ C) Allow them unconditionally. >+ >+ C would violate the design principle that the dimensions and format >+ of the mipmap array are immutable. B does not so much modify the >+ dimension and formats as replace them with an entirely different >+ set. >+ >+ 21. Should there be a single function for specifying 1D, 2D and 3D >+ targets? >+ >+ RESOLVED. No, we will stick with existing precedent. >+ >+ 22. Is it possible to use GenerateMipmap with an incomplete mipmap >+ pyramid? >+ >+ RESOLVED. Yes, because the effective max level is limited to the >+ levels that were specified, and so GenerateMipmap does not generate >+ any new levels. >+ >+ However, to make automatic mipmap generation work, it is necessary >+ to redefine p rather than q, since automatic mipmap generation >+ ignores the max level. >+ >+ 23. How should this extension interact with >+ OES_compressed_paletted_texture? >+ >+ RESOLVED. Paletted textures will not be permitted, and will >+ generate INVALID_ENUM. >+ >+ DISCUSSION: OES_compressed_paletted_texture supplies all the mipmaps >+ in a single function call, with the palette specified once. That's >+ incompatible with the upload model in this extension. >+ >+ 24. How can ETC1 textures be used with this extension? >+ >+ RESOLVED. Add language in this extension to allow subregion uploads >+ for ETC1. >+ >+ DISCUSSION: GL_OES_compressed_ETC1_RGB8_texture doesn't allow >+ CompressedTexSubImage*, so it would be impossible to use this >+ extension with ETC1. This is seen as an oversight in the ETC1 >+ extension. While it cannot be fixed in that extension (since it is >+ already shipping), this extension can add that capability. >+ >+ 25. Should any other compressed formats be similarly modified? >+ >+ RESOLVED. Yes, AMD_compressed_ATC_texture and >+ AMD_compressed_3DC_texture can be modified similarly to ETC1 >+ (Maurice Ribble indicated that both formats use 4x4 blocks). Desktop >+ OpenGL requires that whole-image replacement is supported for any >+ compressed texture format, and the OpenGL ES extensions >+ EXT_texture_compression_dxt1 and IMG_texture_compression_pvrtc >+ already allow whole-image replacement, so it is not necessary to >+ modify them to be used with this extension. >+ >+ 26. Should these commands be permitted in display lists? >+ >+ RESOLVED. No. >+ >+ DISCUSSION: Display lists are most useful for repeating commands, >+ and TexStorage* commands cannot be repeated because the first call >+ makes the format immutable. >+ >+ 27. Should these commands accept unsized internal formats? >+ >+ RESOLVED: No, for both OpenGL and OpenGL ES. >+ >+ DISCUSSION: normally the <type> parameter to TexImage* can serve as >+ a hint to select a sized format (and in OpenGL ES, this is the only >+ mechanism available); since TexStorage* does not have a <type> >+ parameter, the implementation has no information on which to base a >+ decision. >+ >+Revision History >+ >+ Revision 24, 2011/11/11 (dgkoch) >+ - Mark complete. Clarify ES clarifications. >+ >+ Revision 23, 2011/11/10 (dgkoch) >+ - Add GLES clarifcations and interactions with more GLES extensions >+ >+ Revision 22, 2011/11/10 (bmerry) >+ - Update my contact details >+ >+ Revision 21, 2011/07/25 (bmerry) >+ - Remove dangling references to MultiTexStorage in Errors section >+ >+ Revision 20, 2011/07/21 (bmerry) >+ - Remove dangling reference to <samples> in Errors section >+ >+ Revision 19, 2011/05/02 (Jon Leech) >+ - Assign enum value >+ >+ Revision 18, 2011/01/24 (bmerry) >+ - Disallow unsized internal formats (oversight in revision 17). >+ >+ Revision 17, 2011/01/24 (bmerry) >+ - Added and resolved issue 26. >+ - Split issue 27 out from issue 15. >+ - Disallow TexStorage* in display lists. >+ - Use the term "immutable-format" consistently (bug 7281). >+ >+ Revision 16, 2010/11/23 (bmerry) >+ - Disallowed TexStorage on an immutable-format texture >+ (resolves issue 5). >+ - Deleted MultiTexStorage* commands (other DSA functions still >+ unresolved). >+ - Some minor wording changes suggested by Pat Brown (bug 7002). >+ >+ Revision 15, 2010/11/09 (bmerry) >+ - Reopened issue 5. >+ - Reopened issue 14, pending stabilisation of >+ ARB_direct_state_access. >+ - Marked issue 9 resolved, pending any objections. >+ - Fix references to no object being bound (was meant to refer to >+ the default object). >+ - Adding missing pseudocode for TEXTURE_1D_ARRAY. >+ - Corrected TEXTURE_2D_ARRAY -> TEXTURE_1D_ARRAY in error checks. >+ - Changed "levels... are removed" to "levels... are reset to their >+ init state", since desktop GL has per-level state apart from the >+ texels. >+ - Miscellaneous wording fixes. >+ >+ Revision 14, 2010/09/25 (bmerry) >+ - Add issues 24-25 and alterations to >+ OES_compressed_ETC1_RGB8_texture, AMD_compressed_ATC_texture and >+ AMD_compressed_3DC_texture. >+ >+ Revision 13, 2010/09/19 (bmerry) >+ - Two typo fixes from Daniel Koch >+ >+ Revision 12, 2010/09/18 (bmerry) >+ - Changed resolution to issue 20 >+ - Added and resolved issue 23 >+ - Added explanation of how to upload data (in overview) >+ - Added spec language to implement resolution to issue 15 >+ >+ Revision 11, 2010/07/21 (bmerry) >+ - Resolved issue 16 >+ - Reopen issue 20 >+ - Fix some typos >+ >+ Revision 10, 2010/07/15 (bmerry) >+ - Update some issues to match core text >+ - Resolved issue 17 >+ >+ Revision 9, 2010/05/24 (bmerry) >+ - Marked issue 2 as resolved >+ - Resolved issue 19 (as no change) >+ - Resolved issue 20 >+ - Add issues 21-22 >+ - Add in spec language to forbid use on default textures >+ - Redefine level_base, level_max to be clamped forms of >+ TEXTURE_BASE_LEVEL/TEXTURE_MAX_LEVEL when using immutable >+ textures >+ - Redefine p to also be clamped to the provided levels for >+ immutable textures, to support automatic mipmap generation >+ - Removed multisample functions >+ - Removed language stating that texture parameters were reset to >+ defaults >+ >+ Revision 8, 2010/05/18 (bmerry) >+ - Added issue about EGLimage >+ - Marked issue 14 as resolved >+ >+ Revision 7, 2010/05/04 (bmerry) >+ - Removed some lingering <format>, <type> parameters to the new >+ functions that should have been removed in revision 4 >+ - Trivial typo fixes >+ >+ Revision 6, 2010/02/18 (bmerry) >+ - Resolved issues 5, 6 and 18 >+ - Added MultiTexStorage* functions for DSA interaction >+ - Added error for texture-target mismatch in DSA >+ - Allowed TexStorage* to be called again >+ >+ Revision 5, 2010/01/25 (bmerry) >+ - Added to contributors list >+ - Require OpenGL 1.2, to simplify interactions with >+ TEXTURE_BASE_LEVEL/TEXTURE_MAX_LEVEL and CLAMP_TO_EDGE >+ - Change default wrap modes to always be CLAMP_TO_EDGE >+ - Change default filters to always be NEAREST >+ - Moved language about generating new levels into an interaction, >+ since it can only happen on OpenGL ES >+ - Added interaction with EXT_direct_state_access >+ - Added extra <internalformats> for GL ES when OES_depth_texture, >+ OES_packed_depth_stencil and EXT_texture_type_2_10_10_10_REV are >+ present. >+ - Minor non-functional wording fixes and typos >+ - Resolved issue 16 >+ - Added issues 17-19 >+ >+ Revision 4, 2010/01/13 (bmerry) >+ - Changed suffix from ARM to EXT >+ - Added list of contributors >+ - Added language to force the texture to always be complete >+ - Removed <format> and <type> arguments >+ - Added issues 14-16 >+ - Reopened issue 2 >+ - Reformatted issues to separate resolution and discussion >+ - Resolved issues 1, 9 and 11-13 >+ - Fixed the max number of levels in a cube map array >+ >+ Revision 3, 2009/12/17 (bmerry) >+ - Added missing vendor suffix to TEXTURE_IMMUTABLE_FORMAT_ARM >+ - Rewritten to against desktop OpenGL >+ - Added prototypes for 1D and multisample storage functions >+ - Added issues 8-13 >+ >+ Revision 2, 2009/08/20 (bmerry) >+ - Resolved issue 2 (no border parameter) >+ - Resolved issue 4 (metadata becomes immutable) >+ - Added interaction with OES_texture_cube_map >+ - Added error if width != height in a cube map >+ - Added issues 5-7 >+ >+ Revision 1, 2009/05/06 (bmerry) >+ - First draft >diff --git a/Source/ThirdParty/ANGLE/extensions/KHR_parallel_shader_compile.txt b/Source/ThirdParty/ANGLE/extensions/KHR_parallel_shader_compile.txt >new file mode 100644 >index 00000000000..559dc3dca08 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/KHR_parallel_shader_compile.txt >@@ -0,0 +1,167 @@ >+Name >+ >+ KHR_parallel_shader_compile >+ >+Name Strings >+ >+ GL_KHR_parallel_shader_compile >+ >+Contact >+ >+ Geoff Lang, (geofflang 'at' google.com) >+ >+Contributors >+ >+ Timothy Lottes, AMD >+ Graham Sellers, AMD >+ Eric Werness, NVIDIA >+ Geoff Lang, Google >+ Daniel Koch, NVIDIA >+ >+Notice >+ >+ Copyright (c) 2015 The Khronos Group Inc. Copyright terms at >+ http://www.khronos.org/registry/speccopyright.html >+ >+Status >+ >+ Complete >+ >+Version >+ >+ Last Modified Date: 2017-04-24 >+ Revision: 2 >+ >+Number >+ >+ ARB Extension #192 >+ OpenGL ES Extension #288 >+ >+Dependencies >+ >+ This extension is written against OpenGL 4.5 (CoreProfile) dated >+ May 28 2015. >+ >+ OpenGL ES 2.0 is required (for mobile). >+ >+Overview >+ >+ Compiling GLSL into implementation-specific code can be a time consuming >+ process, so a GL implementation may wish to perform the compilation in a >+ separate CPU thread. This extension provides a mechanism for the application >+ to provide a hint to limit the number of threads it wants to be used to >+ compile shaders, as well as a query to determine if the compilation process >+ is complete. >+ >+New Procedures and Functions >+ >+ void MaxShaderCompilerThreadsKHR(uint count); >+ >+New Tokens >+ >+ Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, >+ GetInteger64v, GetFloatv, and GetDoublev: >+ >+ MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 >+ >+ Accepted as part of the <pname> parameter to GetShaderiv and >+ accepted as part of the <pname> parameter to GetProgramiv: >+ >+ COMPLETION_STATUS_KHR 0x91B1 >+ >+IP Status >+ >+ None. >+ >+Additions to Chapter 7 "Programs and Shaders", >+ >+ Append to the end of 7.1 "Shader Objects", >+ >+ Applications may use the following to hint to the driver the maximum >+ number background threads it would like to be used in the process of >+ compiling shaders or linking programs, >+ >+ void MaxShaderCompilerThreadsKHR(uint count); >+ >+ where <count> is the number of background threads. A <count> of zero >+ specifies a request for no parallel compiling or linking and a <count> of >+ 0xFFFFFFFF requests an implementation-specific maximum. >+ >+ An implementation may combine the maximum compiler thread request from >+ multiple contexts in a share group in an implementation-specific way. >+ >+ An application can query the current MaxShaderCompilerThreadsKHR <count> >+ by calling GetIntegerv with <pname> set to MAX_SHADER_COMPILER_THREADS_KHR, >+ which returns the value of the current state (Table 23.51). >+ >+ >+ Add to 7.13 "Shader, Program, and Program Pipeline Queries" under the >+ descriptions for "pname" for "GetShaderiv", >+ >+ If <pname> is COMPLETION_STATUS_KHR, TRUE is returned if the shader >+ compilation has completed, FALSE otherwise. >+ >+ Add to 7.13 "Shader, Program, and Program Pipeline Queries" under the >+ descriptions for "pname" for "GetProgramiv", >+ >+ If <pname> is COMPLETION_STATUS_KHR, TRUE is returned if the program >+ linking has completed, FALSE otherwise. >+ >+New State >+ >+ Add to Table 23.51: Hints >+ Get Value Type Get Command Initial Value Description Sec >+ ------------------------------- ---- ------------ ------------- -------------------- ---- >+ MAX_SHADER_COMPILER_THREADS_KHR Z+ GetIntegerv 0xFFFFFFFF Max compile threads 7.13 >+ >+ Add to Table 23.32: Program Object State >+ Get Value Type Get Command Initial Value Description Sec >+ ---------------------- ---- ------------ ------------- -------------------- ---- >+ COMPLETION_STATUS_KHR B GetProgramiv TRUE Program linking has 7.13 >+ completed >+ >+ Add to Table 23.30: Shader Object State >+ Get Value Type Get Command Initial Value Description Sec >+ --------------------- ---- ------------ ------------- -------------------- ---- >+ COMPLETION_STATUS_KHR B GetShaderiv TRUE Shader compilation 7.13 >+ has completed >+ >+Interactions with OpenGL ES >+ >+ If implemented in OpenGL ES ignore all references to GetDoublev. >+ >+ If the supported ES version is less than 3.0, ignore all references to >+ GetInteger64v. >+ >+Issues >+ >+ 1) Where should the hint state be stored? >+ >+ UNRESOLVED: Each context has its own value which may be specified and >+ queried, but an implementation may choose to combine the hints from multiple >+ contexts in an implementation-specific manner. There isn't really any >+ precedent for per-share group state. >+ >+ 2) Can we make the requirements more strict? >+ >+ RESOLVED: We could, but making sure all of the error behavior is correct and >+ fully specified would likely take more time than we have. This spec allows >+ an application to clearly request its intent even if there aren't guarantees >+ that the implementation will exactly obey the request. >+ >+ 3) Does glGetIntegerv(MAX_SHADER_COMPILER_THREADS_KHR) just return the >+ value set by MaxShaderCompilerThreadsKHR? Or, if the state is 0xFFFFFFFF >+ ("do something implementation specific"), does it return the number of >+ threads the implementation has actually chosen to use? >+ >+ RESOLVED: As with other state queries, this returns the value that was last >+ set, or if no value was set by the application it returns the default state >+ value (0xFFFFFFFF). >+ >+Revision History >+ >+ Rev Date Author Changes >+ --- ---------- -------- --------------------------------------------- >+ 1 2017-03-23 glang Cast as KHR based on v6 of >+ ARB_parallel_shader_compile. >+ 2 2017-04-24 dgkoch Spec clarifications, add issue 3. >diff --git a/Source/ThirdParty/ANGLE/gni/angle.gni b/Source/ThirdParty/ANGLE/gni/angle.gni >new file mode 100644 >index 00000000000..9e76b75e319 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/gni/angle.gni >@@ -0,0 +1,243 @@ >+# 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/config/sanitizers/sanitizers.gni") >+import("//build/config/ui.gni") # import the use_x11 variable >+import("//build_overrides/angle.gni") >+import("//build_overrides/build.gni") >+import("//testing/test.gni") >+if (is_android) { >+ import("//build/config/android/config.gni") >+} >+ >+if (build_with_chromium) { >+ angle_root = "//third_party/angle" >+ >+ import("//ui/ozone/ozone.gni") >+} else { >+ angle_root = "//" >+ >+ declare_args() { >+ ozone_platform_gbm = false >+ } >+} >+ >+# Subdirectory to place data files (e.g. layer JSON files). >+data_dir = "angledata" >+ >+declare_args() { >+ if (current_cpu == "arm64" || current_cpu == "x64" || >+ current_cpu == "mips64el" || current_cpu == "s390x" || >+ current_cpu == "ppc64") { >+ angle_64bit_current_cpu = true >+ } else if (current_cpu == "arm" || current_cpu == "x86" || >+ current_cpu == "mipsel" || current_cpu == "s390" || >+ current_cpu == "ppc") { >+ angle_64bit_current_cpu = false >+ } else { >+ assert(false, "Unknown current CPU: $current_cpu") >+ } >+} >+ >+declare_args() { >+ if (!is_android) { >+ ndk_api_level_at_least_26 = false >+ } else { >+ ndk_api_level_at_least_26 = >+ (!angle_64bit_current_cpu && android32_ndk_api_level >= 26) || >+ (angle_64bit_current_cpu && android64_ndk_api_level >= 26) >+ } >+ angle_shared_libvulkan = false >+ angle_libs_suffix = "" >+} >+ >+declare_args() { >+ angle_enable_d3d9 = is_win >+ angle_enable_d3d11 = is_win >+ angle_enable_gl = (ozone_platform_gbm || !is_linux || >+ (use_x11 && !is_chromeos)) && !is_fuchsia >+ >+ # ANGLE Vulkan backend on Android requires API level 26, i.e. Oreo, due to >+ # Vulkan Validation Layers compatibility issues, see http://crrev/c/1405714. >+ # Otherwise, API level 24 would have been enough. >+ angle_enable_vulkan = is_win || (is_linux && use_x11 && !is_chromeos) || >+ (is_android && ndk_api_level_at_least_26) || is_fuchsia >+ angle_enable_null = true >+ angle_enable_essl = true >+ angle_enable_glsl = true >+ angle_force_thread_safety = false >+} >+ >+declare_args() { >+ angle_enable_gl_null = angle_enable_gl >+ angle_enable_hlsl = angle_enable_d3d9 || angle_enable_d3d11 >+ angle_enable_trace = false >+ >+ # Disable the layers in ubsan builds because of really slow builds. >+ angle_enable_vulkan_validation_layers = >+ angle_enable_vulkan && !is_ubsan && !is_tsan && !is_asan >+ >+ if (angle_enable_vulkan) { >+ # Enable Vulkan GPU trace event capability >+ angle_enable_vulkan_gpu_trace_events = false >+ >+ # Disallow non-conformant configurations in official builds. >+ angle_vulkan_conformant_configs_only = is_official_build >+ >+ # Enable custom (cpu-side) secondary command buffers >+ angle_enable_custom_vulkan_cmd_buffers = true >+ } >+} >+ >+if (is_win) { >+ import("//build/config/win/visual_studio_version.gni") >+} >+ >+angle_common_configs = [ >+ angle_root + ":extra_warnings", >+ angle_root + ":internal_config", >+] >+ >+angle_remove_configs = [ "//build/config/compiler:default_include_dirs" ] >+ >+if (is_clang) { >+ angle_remove_configs += [ "//build/config/clang:find_bad_constructs" ] >+} >+ >+set_defaults("angle_executable") { >+ configs = angle_common_configs >+ public_configs = [] >+ suppressed_configs = angle_remove_configs >+} >+ >+set_defaults("angle_shared_library") { >+ configs = angle_common_configs >+ public_configs = [] >+ suppressed_configs = angle_remove_configs >+} >+ >+set_defaults("angle_source_set") { >+ configs = angle_common_configs >+ public_configs = [] >+ suppressed_configs = angle_remove_configs >+} >+ >+set_defaults("angle_static_library") { >+ configs = angle_common_configs >+ public_configs = [] >+ suppressed_configs = angle_remove_configs >+} >+ >+set_defaults("angle_test") { >+ configs = angle_common_configs >+ public_configs = [] >+ suppressed_configs = angle_remove_configs >+} >+ >+template("angle_executable") { >+ executable(target_name) { >+ forward_variables_from(invoker, >+ "*", >+ [ >+ "configs", >+ "suppressed_configs", >+ "visibility", >+ ]) >+ >+ # Needed because visibility is global. >+ forward_variables_from(invoker, [ "visibility" ]) >+ >+ configs += invoker.configs >+ configs -= invoker.suppressed_configs >+ } >+} >+ >+template("angle_shared_library") { >+ shared_library(target_name) { >+ forward_variables_from(invoker, >+ "*", >+ [ >+ "configs", >+ "suppressed_configs", >+ "visibility", >+ ]) >+ >+ # Needed because visibility is global. >+ forward_variables_from(invoker, [ "visibility" ]) >+ >+ configs += invoker.configs >+ configs -= invoker.suppressed_configs >+ >+ public_configs += [ angle_root + ":shared_library_public_config" ] >+ >+ if (is_android) { >+ configs += [ angle_root + ":build_id_config" ] >+ configs -= [ "//build/config/android:hide_all_but_jni_onload" ] >+ } >+ } >+} >+ >+template("angle_source_set") { >+ source_set(target_name) { >+ forward_variables_from(invoker, >+ "*", >+ [ >+ "configs", >+ "suppressed_configs", >+ "visibility", >+ ]) >+ >+ # Needed because visibility is global. >+ forward_variables_from(invoker, [ "visibility" ]) >+ >+ configs += invoker.configs >+ configs -= invoker.suppressed_configs >+ } >+} >+ >+template("angle_static_library") { >+ static_library(target_name) { >+ forward_variables_from(invoker, >+ "*", >+ [ >+ "configs", >+ "suppressed_configs", >+ "visibility", >+ ]) >+ >+ # Needed because visibility is global. >+ forward_variables_from(invoker, [ "visibility" ]) >+ >+ configs += invoker.configs >+ configs -= invoker.suppressed_configs >+ } >+} >+ >+template("angle_test") { >+ test(target_name) { >+ forward_variables_from(invoker, >+ "*", >+ [ >+ "configs", >+ "suppressed_configs", >+ "visibility", >+ ]) >+ >+ # Needed because visibility is global. >+ forward_variables_from(invoker, [ "visibility" ]) >+ >+ configs += invoker.configs >+ configs -= invoker.suppressed_configs >+ >+ if (is_linux && !is_component_build) { >+ # Set rpath to find shared libs in a non-component build. >+ configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ] >+ } >+ >+ if (is_android) { >+ configs += [ angle_root + ":build_id_config" ] >+ configs -= [ "//build/config/android:hide_all_but_jni" ] >+ } >+ } >+} >diff --git a/Source/ThirdParty/ANGLE/include/CMakeLists.txt b/Source/ThirdParty/ANGLE/include/CMakeLists.txt >new file mode 100644 >index 00000000000..7249db38444 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/CMakeLists.txt >@@ -0,0 +1,59 @@ >+set(egl_headers >+ EGL/egl.h >+ EGL/eglext.h >+ EGL/eglext_angle.h >+ EGL/eglplatform.h >+) >+ >+set(gles_headers >+ GLES/egl.h >+ GLES/gl.h >+ GLES/glext.h >+ GLES/glext_explicit_context_autogen.inc >+ GLES/glext_angle.h >+ GLES/glplatform.h >+) >+ >+set(gles2_headers >+ GLES2/gl2.h >+ GLES2/gl2ext.h >+ GLES2/gl2ext_explicit_context_autogen.inc >+ GLES2/gl2ext_angle.h >+ GLES2/gl2platform.h >+) >+ >+set(gles3_headers >+ GLES3/gl3.h >+ GLES3/gl3ext_explicit_context_autogen.inc >+ GLES3/gl31.h >+ GLES3/gl31ext_explicit_context_autogen.inc >+ GLES3/gl32.h >+ GLES3/gl3platform.h >+) >+ >+set(glslang_headers >+ GLSLANG/ShaderLang.h >+ GLSLANG/ShaderVars.h >+) >+ >+set(khr_headers KHR/khrplatform.h) >+ >+# All ports require GLSLANG headers >+set(ANGLE_PUBLIC_HEADERS ${glslang_headers}) >+ >+if (USE_ANGLE_EGL) >+ list(APPEND ANGLE_PUBLIC_HEADERS >+ ${egl_headers} >+ ${gles_headers} >+ ${gles2_headers} >+ ${gles3_headers} >+ ${khr_headers} >+ ) >+elseif (NOT USE_EGL) >+ list(APPEND ANGLE_PUBLIC_HEADERS ${khr_headers}) >+endif () >+ >+WEBKIT_COPY_FILES(ANGLEHeaders >+ DESTINATION ${ANGLE_FRAMEWORK_HEADERS_DIR} >+ FILES ${ANGLE_PUBLIC_HEADERS} >+) >diff --git a/Source/ThirdParty/ANGLE/include/EGL/.clang-format b/Source/ThirdParty/ANGLE/include/EGL/.clang-format >new file mode 100644 >index 00000000000..06147100144 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/EGL/.clang-format >@@ -0,0 +1,3 @@ >+ >+ >+DisableFormat: true >diff --git a/Source/ThirdParty/ANGLE/include/EGL/README.md b/Source/ThirdParty/ANGLE/include/EGL/README.md >new file mode 100644 >index 00000000000..519ef3e9b74 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/EGL/README.md >@@ -0,0 +1,19 @@ >+# ANGLE EGL Headers >+ >+The EGL headers ANGLE uses are generated using the Khronos tools but modified to include function pointer types and function prototype guards. >+ >+### Regenerating EGL.h >+ >+1. Install **Python 3** (not 2) with the **lxml** addon. You can do this using `pip install lxml` from your Python's Scripts folder. >+1. Clone [https://github.com/KhronosGroup/EGL-Registry.git](https://github.com/KhronosGroup/EGL-Registry.git). >+1. Edit `EGL-Registry/api/genheaders.py`: >+ >+ 1. Look for the section titled `# EGL API - EGL/egl.h (no function pointers, yet @@@)` >+ 1. Change `genFuncPointers = False,` to `genFuncPointers = True,` >+ 1. Change `protectProto = False,` to `protectProto = 'nonzero',` >+ 1. Change `protectProtoStr = 'EGL_EGLEXT_PROTOTYPES',` to `protectProtoStr = 'EGL_EGL_PROTOTYPES',` >+ >+1. Set your working directory to `EGL-Registry/api/`. >+1. Run `python genheaders.py -registry egl.xml EGL/egl.h` >+1. The generated header will now be in `EGL-Registry/api/EGL/egl.h`. You can copy the header over to this folder. >+1. Also update `scripts/egl.xml` with the latest version from `EGL-Registry/api/`. >diff --git a/Source/ThirdParty/ANGLE/include/EGL/egl.h b/Source/ThirdParty/ANGLE/include/EGL/egl.h >index 29f30d94de1..21cb210d235 100644 >--- a/Source/ThirdParty/ANGLE/include/EGL/egl.h >+++ b/Source/ThirdParty/ANGLE/include/EGL/egl.h >@@ -28,17 +28,17 @@ extern "C" { > ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. > */ > /* >-** This header is generated from the Khronos OpenGL / OpenGL ES XML >-** API Registry. The current version of the Registry, generator scripts >+** This header is generated from the Khronos EGL XML API Registry. >+** The current version of the Registry, generator scripts > ** used to make the header, and the header can be found at >-** http://www.opengl.org/registry/egl >+** http://www.khronos.org/registry/egl > ** >-** Khronos $Revision$ on $Date$ >+** Khronos $Git commit SHA1: 4136522c4d $ on $Git commit date: 2018-12-06 03:51:22 -0800 $ > */ > > #include <EGL/eglplatform.h> > >-/* Generated on date 20161230 */ >+/* Generated on date 20181214 */ > > /* Generated C header for: > * API: egl >@@ -53,8 +53,8 @@ extern "C" { > #define EGL_VERSION_1_0 1 > typedef unsigned int EGLBoolean; > typedef void *EGLDisplay; >-#include <KHR/khrplatform.h> > #include <EGL/eglplatform.h> >+#include <KHR/khrplatform.h> > typedef void *EGLConfig; > typedef void *EGLSurface; > typedef void *EGLContext; >@@ -118,6 +118,31 @@ typedef void (*__eglMustCastToProperFunctionPointerType)(void); > #define EGL_VERSION 0x3054 > #define EGL_WIDTH 0x3057 > #define EGL_WINDOW_BIT 0x0004 >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLCHOOSECONFIGPROC) (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOPYBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); >+typedef EGLContext (EGLAPIENTRYP PFNEGLCREATECONTEXTPROC) (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list); >+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERSURFACEPROC) (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); >+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list); >+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGATTRIBPROC) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGSPROC) (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config); >+typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETCURRENTDISPLAYPROC) (void); >+typedef EGLSurface (EGLAPIENTRYP PFNEGLGETCURRENTSURFACEPROC) (EGLint readdraw); >+typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETDISPLAYPROC) (EGLNativeDisplayType display_id); >+typedef EGLint (EGLAPIENTRYP PFNEGLGETERRORPROC) (void); >+typedef __eglMustCastToProperFunctionPointerType (EGLAPIENTRYP PFNEGLGETPROCADDRESSPROC) (const char *procname); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLINITIALIZEPROC) (EGLDisplay dpy, EGLint *major, EGLint *minor); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLMAKECURRENTPROC) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value); >+typedef const char *(EGLAPIENTRYP PFNEGLQUERYSTRINGPROC) (EGLDisplay dpy, EGLint name); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLTERMINATEPROC) (EGLDisplay dpy); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITGLPROC) (void); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITNATIVEPROC) (EGLint engine); >+#if EGL_EGL_PROTOTYPES > EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); > EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); > EGLAPI EGLContext EGLAPIENTRY eglCreateContext (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list); >@@ -142,6 +167,7 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers (EGLDisplay dpy, EGLSurface surface > EGLAPI EGLBoolean EGLAPIENTRY eglTerminate (EGLDisplay dpy); > EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL (void); > EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative (EGLint engine); >+#endif > #endif /* EGL_VERSION_1_0 */ > > #ifndef EGL_VERSION_1_1 >@@ -160,10 +186,16 @@ EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative (EGLint engine); > #define EGL_TEXTURE_RGB 0x305D > #define EGL_TEXTURE_RGBA 0x305E > #define EGL_TEXTURE_TARGET 0x3081 >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDTEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASETEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSURFACEATTRIBPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPINTERVALPROC) (EGLDisplay dpy, EGLint interval); >+#if EGL_EGL_PROTOTYPES > EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer); > EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer); > EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); > EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval (EGLDisplay dpy, EGLint interval); >+#endif > #endif /* EGL_VERSION_1_1 */ > > #ifndef EGL_VERSION_1_2 >@@ -199,11 +231,18 @@ typedef void *EGLClientBuffer; > #define EGL_SWAP_BEHAVIOR 0x3093 > #define EGL_UNKNOWN EGL_CAST(EGLint,-1) > #define EGL_VERTICAL_RESOLUTION 0x3091 >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDAPIPROC) (EGLenum api); >+typedef EGLenum (EGLAPIENTRYP PFNEGLQUERYAPIPROC) (void); >+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASETHREADPROC) (void); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITCLIENTPROC) (void); >+#if EGL_EGL_PROTOTYPES > EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI (EGLenum api); > EGLAPI EGLenum EGLAPIENTRY eglQueryAPI (void); > EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list); > EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread (void); > EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient (void); >+#endif > #endif /* EGL_VERSION_1_2 */ > > #ifndef EGL_VERSION_1_3 >@@ -232,7 +271,10 @@ EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient (void); > #define EGL_OPENGL_API 0x30A2 > #define EGL_OPENGL_BIT 0x0008 > #define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 >+typedef EGLContext (EGLAPIENTRYP PFNEGLGETCURRENTCONTEXTPROC) (void); >+#if EGL_EGL_PROTOTYPES > EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext (void); >+#endif > #endif /* EGL_VERSION_1_4 */ > > #ifndef EGL_VERSION_1_5 >@@ -284,6 +326,17 @@ typedef void *EGLImage; > #define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8 > #define EGL_IMAGE_PRESERVED 0x30D2 > #define EGL_NO_IMAGE EGL_CAST(EGLImage,0) >+typedef EGLSync (EGLAPIENTRYP PFNEGLCREATESYNCPROC) (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCPROC) (EGLDisplay dpy, EGLSync sync); >+typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBPROC) (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value); >+typedef EGLImage (EGLAPIENTRYP PFNEGLCREATEIMAGEPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEPROC) (EGLDisplay dpy, EGLImage image); >+typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYPROC) (EGLenum platform, void *native_display, const EGLAttrib *attrib_list); >+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list); >+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags); >+#if EGL_EGL_PROTOTYPES > EGLAPI EGLSync EGLAPIENTRY eglCreateSync (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list); > EGLAPI EGLBoolean EGLAPIENTRY eglDestroySync (EGLDisplay dpy, EGLSync sync); > EGLAPI EGLint EGLAPIENTRY eglClientWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); >@@ -294,6 +347,7 @@ EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplay (EGLenum platform, void *nat > EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurface (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list); > EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurface (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list); > EGLAPI EGLBoolean EGLAPIENTRY eglWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags); >+#endif > #endif /* EGL_VERSION_1_5 */ > > #ifdef __cplusplus >diff --git a/Source/ThirdParty/ANGLE/include/EGL/eglext.h b/Source/ThirdParty/ANGLE/include/EGL/eglext.h >index 79f6ccd418d..87e9d90ca36 100644 >--- a/Source/ThirdParty/ANGLE/include/EGL/eglext.h >+++ b/Source/ThirdParty/ANGLE/include/EGL/eglext.h >@@ -33,12 +33,12 @@ extern "C" { > ** used to make the header, and the header can be found at > ** http://www.khronos.org/registry/egl > ** >-** Khronos $Git commit SHA1: a732b061e7 $ on $Git commit date: 2017-06-17 23:27:53 +0100 $ >+** Khronos $Git commit SHA1: bae3518c48 $ on $Git commit date: 2018-05-17 10:56:57 -0700 $ > */ > > #include <EGL/eglplatform.h> > >-#define EGL_EGLEXT_VERSION 20170627 >+#define EGL_EGLEXT_VERSION 20180517 > > /* Generated C header for: > * API: egl >@@ -495,6 +495,47 @@ EGLAPI EGLClientBuffer EGLAPIENTRY eglCreateNativeClientBufferANDROID (const EGL > #define EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID 0x314C > #endif /* EGL_ANDROID_front_buffer_auto_refresh */ > >+#ifndef EGL_ANDROID_get_frame_timestamps >+#define EGL_ANDROID_get_frame_timestamps 1 >+typedef khronos_stime_nanoseconds_t EGLnsecsANDROID; >+#define EGL_TIMESTAMP_PENDING_ANDROID EGL_CAST(EGLnsecsANDROID,-2) >+#define EGL_TIMESTAMP_INVALID_ANDROID EGL_CAST(EGLnsecsANDROID,-1) >+#define EGL_TIMESTAMPS_ANDROID 0x3430 >+#define EGL_COMPOSITE_DEADLINE_ANDROID 0x3431 >+#define EGL_COMPOSITE_INTERVAL_ANDROID 0x3432 >+#define EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID 0x3433 >+#define EGL_REQUESTED_PRESENT_TIME_ANDROID 0x3434 >+#define EGL_RENDERING_COMPLETE_TIME_ANDROID 0x3435 >+#define EGL_COMPOSITION_LATCH_TIME_ANDROID 0x3436 >+#define EGL_FIRST_COMPOSITION_START_TIME_ANDROID 0x3437 >+#define EGL_LAST_COMPOSITION_START_TIME_ANDROID 0x3438 >+#define EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID 0x3439 >+#define EGL_DISPLAY_PRESENT_TIME_ANDROID 0x343A >+#define EGL_DEQUEUE_READY_TIME_ANDROID 0x343B >+#define EGL_READS_DONE_TIME_ANDROID 0x343C >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCOMPOSITORTIMINGSUPPORTEDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint name); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCOMPOSITORTIMINGANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numTimestamps, const EGLint *names, EGLnsecsANDROID *values); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETNEXTFRAMEIDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR *frameId); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETFRAMETIMESTAMPSUPPORTEDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint timestamp); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETFRAMETIMESTAMPSANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR frameId, EGLint numTimestamps, const EGLint *timestamps, EGLnsecsANDROID *values); >+#ifdef EGL_EGLEXT_PROTOTYPES >+EGLAPI EGLBoolean EGLAPIENTRY eglGetCompositorTimingSupportedANDROID (EGLDisplay dpy, EGLSurface surface, EGLint name); >+EGLAPI EGLBoolean EGLAPIENTRY eglGetCompositorTimingANDROID (EGLDisplay dpy, EGLSurface surface, EGLint numTimestamps, const EGLint *names, EGLnsecsANDROID *values); >+EGLAPI EGLBoolean EGLAPIENTRY eglGetNextFrameIdANDROID (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR *frameId); >+EGLAPI EGLBoolean EGLAPIENTRY eglGetFrameTimestampSupportedANDROID (EGLDisplay dpy, EGLSurface surface, EGLint timestamp); >+EGLAPI EGLBoolean EGLAPIENTRY eglGetFrameTimestampsANDROID (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR frameId, EGLint numTimestamps, const EGLint *timestamps, EGLnsecsANDROID *values); >+#endif >+#endif /* EGL_ANDROID_get_frame_timestamps */ >+ >+#ifndef EGL_ANDROID_get_native_client_buffer >+#define EGL_ANDROID_get_native_client_buffer 1 >+struct AHardwareBuffer; >+typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLGETNATIVECLIENTBUFFERANDROIDPROC) (const struct AHardwareBuffer *buffer); >+#ifdef EGL_EGLEXT_PROTOTYPES >+EGLAPI EGLClientBuffer EGLAPIENTRY eglGetNativeClientBufferANDROID (const struct AHardwareBuffer *buffer); >+#endif >+#endif /* EGL_ANDROID_get_native_client_buffer */ >+ > #ifndef EGL_ANDROID_image_native_buffer > #define EGL_ANDROID_image_native_buffer 1 > #define EGL_NATIVE_BUFFER_ANDROID 0x3140 >@@ -514,7 +555,6 @@ EGLAPI EGLint EGLAPIENTRY eglDupNativeFenceFDANDROID (EGLDisplay dpy, EGLSyncKHR > > #ifndef EGL_ANDROID_presentation_time > #define EGL_ANDROID_presentation_time 1 >-typedef khronos_stime_nanoseconds_t EGLnsecsANDROID; > typedef EGLBoolean (EGLAPIENTRYP PFNEGLPRESENTATIONTIMEANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time); > #ifdef EGL_EGLEXT_PROTOTYPES > EGLAPI EGLBoolean EGLAPIENTRY eglPresentationTimeANDROID (EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time); >@@ -578,6 +618,16 @@ EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE (EGLDisplay dpy, EGLSu > #define EGL_EXT_client_extensions 1 > #endif /* EGL_EXT_client_extensions */ > >+#ifndef EGL_EXT_client_sync >+#define EGL_EXT_client_sync 1 >+#define EGL_SYNC_CLIENT_EXT 0x3364 >+#define EGL_SYNC_CLIENT_SIGNAL_EXT 0x3365 >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLCLIENTSIGNALSYNCEXTPROC) (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); >+#ifdef EGL_EGLEXT_PROTOTYPES >+EGLAPI EGLBoolean EGLAPIENTRY eglClientSignalSyncEXT (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); >+#endif >+#endif /* EGL_EXT_client_sync */ >+ > #ifndef EGL_EXT_compositor > #define EGL_EXT_compositor 1 > #define EGL_PRIMARY_COMPOSITOR_CONTEXT_EXT 0x3460 >@@ -723,6 +773,11 @@ EGLAPI EGLBoolean EGLAPIENTRY eglQueryDmaBufModifiersEXT (EGLDisplay dpy, EGLint > #endif > #endif /* EGL_EXT_image_dma_buf_import_modifiers */ > >+#ifndef EGL_EXT_image_gl_colorspace >+#define EGL_EXT_image_gl_colorspace 1 >+#define EGL_GL_COLORSPACE_DEFAULT_EXT 0x314D >+#endif /* EGL_EXT_image_gl_colorspace */ >+ > #ifndef EGL_EXT_image_implicit_sync_control > #define EGL_EXT_image_implicit_sync_control 1 > #define EGL_IMPORT_SYNC_TYPE_EXT 0x3470 >@@ -858,6 +913,14 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageEXT (EGLDisplay dpy, EGLSu > #endif > #endif /* EGL_EXT_swap_buffers_with_damage */ > >+#ifndef EGL_EXT_sync_reuse >+#define EGL_EXT_sync_reuse 1 >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNSIGNALSYNCEXTPROC) (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); >+#ifdef EGL_EGLEXT_PROTOTYPES >+EGLAPI EGLBoolean EGLAPIENTRY eglUnsignalSyncEXT (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); >+#endif >+#endif /* EGL_EXT_sync_reuse */ >+ > #ifndef EGL_EXT_yuv_surface > #define EGL_EXT_yuv_surface 1 > #define EGL_YUV_ORDER_EXT 0x3301 >@@ -933,6 +996,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurfaceHI (EGLDisplay dpy, EGLConfi > #define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4 > #define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001 > #define EGL_DRM_BUFFER_USE_SHARE_MESA 0x00000002 >+#define EGL_DRM_BUFFER_USE_CURSOR_MESA 0x00000004 > typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint *attrib_list); > typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride); > #ifdef EGL_EGLEXT_PROTOTYPES >@@ -987,6 +1051,11 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegion2NOK (EGLDisplay dpy, EGLSurfa > #define EGL_AUTO_STEREO_NV 0x3136 > #endif /* EGL_NV_3dvision_surface */ > >+#ifndef EGL_NV_context_priority_realtime >+#define EGL_NV_context_priority_realtime 1 >+#define EGL_CONTEXT_PRIORITY_REALTIME_NV 0x3357 >+#endif /* EGL_NV_context_priority_realtime */ >+ > #ifndef EGL_NV_coverage_sample > #define EGL_NV_coverage_sample 1 > #define EGL_COVERAGE_BUFFERS_NV 0x30E0 >@@ -1054,9 +1123,9 @@ EGLAPI EGLBoolean EGLAPIENTRY eglPostSubBufferNV (EGLDisplay dpy, EGLSurface sur > #define EGL_YUV_PLANE0_TEXTURE_UNIT_NV 0x332C > #define EGL_YUV_PLANE1_TEXTURE_UNIT_NV 0x332D > #define EGL_YUV_PLANE2_TEXTURE_UNIT_NV 0x332E >-typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLAttrib *attrib_list); >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); > #ifdef EGL_EGLEXT_PROTOTYPES >-EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalAttribsNV (EGLDisplay dpy, EGLStreamKHR stream, EGLAttrib *attrib_list); >+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalAttribsNV (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); > #endif > #endif /* EGL_NV_stream_consumer_gltexture_yuv */ > >@@ -1096,6 +1165,14 @@ EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalAttribsNV (EGLDi > #define EGL_STREAM_FIFO_SYNCHRONOUS_NV 0x3336 > #endif /* EGL_NV_stream_fifo_synchronous */ > >+#ifndef EGL_NV_stream_flush >+#define EGL_NV_stream_flush 1 >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMFLUSHNVPROC) (EGLDisplay dpy, EGLStreamKHR stream); >+#ifdef EGL_EGLEXT_PROTOTYPES >+EGLAPI EGLBoolean EGLAPIENTRY eglStreamFlushNV (EGLDisplay dpy, EGLStreamKHR stream); >+#endif >+#endif /* EGL_NV_stream_flush */ >+ > #ifndef EGL_NV_stream_frame_limits > #define EGL_NV_stream_frame_limits 1 > #define EGL_PRODUCER_MAX_FRAME_HINT_NV 0x3337 >diff --git a/Source/ThirdParty/ANGLE/include/EGL/eglext_angle.h b/Source/ThirdParty/ANGLE/include/EGL/eglext_angle.h >index 95f0902838b..86943264133 100644 >--- a/Source/ThirdParty/ANGLE/include/EGL/eglext_angle.h >+++ b/Source/ThirdParty/ANGLE/include/EGL/eglext_angle.h >@@ -51,16 +51,17 @@ > #define EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE 0x3205 > #define EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE 0x3206 > #define EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE 0x3451 >+#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE 0x3209 >+#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE 0x320A >+#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE 0x345E > #endif /* EGL_ANGLE_platform_angle */ > > #ifndef EGL_ANGLE_platform_angle_d3d > #define EGL_ANGLE_platform_angle_d3d 1 > #define EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 0x3207 > #define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3208 >-#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE 0x3209 >-#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE 0x320A >-#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE 0x320B >-#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE 0x320C >+#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_WARP_ANGLE 0x320B >+#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_REFERENCE_ANGLE 0x320C > #define EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE 0x320F > #endif /* EGL_ANGLE_platform_angle_d3d */ > >@@ -68,6 +69,7 @@ > #define EGL_ANGLE_platform_angle_opengl 1 > #define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE 0x320D > #define EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE 0x320E >+#define EGL_PLATFORM_ANGLE_EGL_HANDLE_ANGLE 0x3480 > #endif /* EGL_ANGLE_platform_angle_opengl */ > > #ifndef EGL_ANGLE_platform_angle_null >@@ -80,6 +82,11 @@ > #define EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE 0x3450 > #endif /* EGL_ANGLE_platform_angle_vulkan */ > >+#ifndef EGL_ANGLE_platform_angle_context_virtualization >+#define EGL_ANGLE_platform_angle_context_virtualization 1 >+#define EGL_PLATFORM_ANGLE_CONTEXT_VIRTUALIZATION_ANGLE 0x3481 >+#endif /* EGL_ANGLE_platform_angle_context_virtualization */ >+ > #ifndef EGL_ANGLE_x11_visual > #define EGL_ANGLE_x11_visual > #define EGL_X11_VISUAL_ID_ANGLE 0x33A3 >@@ -105,30 +112,30 @@ > #define EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE 0x33AA > #endif /* EGL_ANGLE_experimental_present_path */ > >-#ifndef EGL_ANGLE_stream_producer_d3d_texture_nv12 >-#define EGL_ANGLE_stream_producer_d3d_texture_nv12 >+#ifndef EGL_ANGLE_stream_producer_d3d_texture >+#define EGL_ANGLE_stream_producer_d3d_texture > #define EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE 0x33AB >-typedef EGLBoolean(EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERD3DTEXTURENV12ANGLEPROC)(EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); >-typedef EGLBoolean(EGLAPIENTRYP PFNEGLSTREAMPOSTD3DTEXTURENV12ANGLEPROC)(EGLDisplay dpy, EGLStreamKHR stream, void *texture, const EGLAttrib *attrib_list); >+typedef EGLBoolean(EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERD3DTEXTUREANGLEPROC)(EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); >+typedef EGLBoolean(EGLAPIENTRYP PFNEGLSTREAMPOSTD3DTEXTUREANGLEPROC)(EGLDisplay dpy, EGLStreamKHR stream, void *texture, const EGLAttrib *attrib_list); > #ifdef EGL_EGLEXT_PROTOTYPES >-EGLAPI EGLBoolean EGLAPIENTRY eglCreateStreamProducerD3DTextureNV12ANGLE(EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); >-EGLAPI EGLBoolean EGLAPIENTRY eglStreamPostD3DTextureNV12ANGLE(EGLDisplay dpy, EGLStreamKHR stream, void *texture, const EGLAttrib *attrib_list); >+EGLAPI EGLBoolean EGLAPIENTRY eglCreateStreamProducerD3DTextureANGLE(EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); >+EGLAPI EGLBoolean EGLAPIENTRY eglStreamPostD3DTextureANGLE(EGLDisplay dpy, EGLStreamKHR stream, void *texture, const EGLAttrib *attrib_list); > #endif >-#endif /* EGL_ANGLE_stream_producer_d3d_texture_nv12 */ >+#endif /* EGL_ANGLE_stream_producer_d3d_texture */ > > #ifndef EGL_ANGLE_create_context_webgl_compatibility > #define EGL_ANGLE_create_context_webgl_compatibility 1 >-#define EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE 0x3AAC >+#define EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE 0x33AC > #endif /* EGL_ANGLE_create_context_webgl_compatibility */ > > #ifndef EGL_ANGLE_display_texture_share_group > #define EGL_ANGLE_display_texture_share_group 1 >-#define EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE 0x3AAF >+#define EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE 0x33AF > #endif /* EGL_ANGLE_display_texture_share_group */ > > #ifndef EGL_CHROMIUM_create_context_bind_generates_resource > #define EGL_CHROMIUM_create_context_bind_generates_resource 1 >-#define EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM 0x3AAD >+#define EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM 0x33AD > #endif /* EGL_CHROMIUM_create_context_bind_generates_resource */ > > #ifndef EGL_ANGLE_create_context_client_arrays >@@ -155,7 +162,7 @@ EGLAPI EGLBoolean EGLAPIENTRY eglReleaseDeviceANGLE(EGLDeviceEXT device); > #define EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE 0x3459 > typedef EGLint (EGLAPIENTRYP PFNEGLPROGRAMCACHEGETATTRIBANGLEPROC) (EGLDisplay dpy, EGLenum attrib); > typedef void (EGLAPIENTRYP PFNEGLPROGRAMCACHEQUERYANGLEPROC) (EGLDisplay dpy, EGLint index, void *key, EGLint *keysize, void *binary, EGLint *binarysize); >-typedef void (EGLAPIENTRYP PFNEGPROGRAMCACHELPOPULATEANGLEPROC) (EGLDisplay dpy, const void *key, EGLint keysize, const void *binary, EGLint binarysize); >+typedef void (EGLAPIENTRYP PFNEGLPROGRAMCACHEPOPULATEANGLEPROC) (EGLDisplay dpy, const void *key, EGLint keysize, const void *binary, EGLint binarysize); > typedef EGLint (EGLAPIENTRYP PFNEGLPROGRAMCACHERESIZEANGLEPROC) (EGLDisplay dpy, EGLint limit, EGLenum mode); > #ifdef EGL_EGLEXT_PROTOTYPES > EGLAPI EGLint EGLAPIENTRY eglProgramCacheGetAttribANGLE(EGLDisplay dpy, EGLenum attrib); >@@ -165,6 +172,43 @@ EGLAPI EGLint EGLAPIENTRY eglProgramCacheResizeANGLE(EGLDisplay dpy, EGLint limi > #endif > #endif /* EGL_ANGLE_program_cache_control */ > >+#ifndef EGL_ANGLE_iosurface_client_buffer >+#define EGL_ANGLE_iosurface_client_buffer 1 >+#define EGL_IOSURFACE_ANGLE 0x3454 >+#define EGL_IOSURFACE_PLANE_ANGLE 0x345A >+#define EGL_TEXTURE_RECTANGLE_ANGLE 0x345B >+#define EGL_TEXTURE_TYPE_ANGLE 0x345C >+#define EGL_TEXTURE_INTERNAL_FORMAT_ANGLE 0x345D >+#endif /* EGL_ANGLE_iosurface_client_buffer */ >+ >+#ifndef EGL_ANGLE_create_context_extensions_enabled >+#define EGL_ANGLE_create_context_extensions_enabled 1 >+#define EGL_EXTENSIONS_ENABLED_ANGLE 0x345F >+#endif /* EGL_ANGLE_create_context_extensions_enabled */ >+ >+#ifndef EGL_CHROMIUM_get_sync_values >+#define EGL_CHROMIUM_get_sync_values 1 >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCVALUESCHROMIUMPROC) (EGLDisplay dpy, >+ EGLSurface surface, >+ EGLuint64KHR *ust, >+ EGLuint64KHR *msc, >+ EGLuint64KHR *sbc); >+#ifdef EGL_EGLEXT_PROTOTYPES >+EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncValuesCHROMIUM(EGLDisplay dpy, >+ EGLSurface surface, >+ EGLuint64KHR *ust, >+ EGLuint64KHR *msc, >+ EGLuint64KHR *sbc); >+#endif >+#endif /* EGL_CHROMIUM_get_sync_values */ >+ >+#ifndef EGL_ANGLE_power_preference >+#define EGL_ANGLE_power_preference 1 >+#define EGL_POWER_PREFERENCE_ANGLE 0x3482 >+#define EGL_LOW_POWER_ANGLE 0x0001 >+#define EGL_HIGH_POWER_ANGLE 0x0002 >+#endif /* EGL_ANGLE_power_preference */ >+ > // clang-format on > > #endif // INCLUDE_EGL_EGLEXT_ANGLE_ >diff --git a/Source/ThirdParty/ANGLE/include/EGL/eglplatform.h b/Source/ThirdParty/ANGLE/include/EGL/eglplatform.h >index e781564891d..9203604a3ad 100644 >--- a/Source/ThirdParty/ANGLE/include/EGL/eglplatform.h >+++ b/Source/ThirdParty/ANGLE/include/EGL/eglplatform.h >@@ -83,38 +83,40 @@ typedef HWND EGLNativeWindowType; > typedef IInspectable* EGLNativeWindowType; > #endif > >-#elif defined(__APPLE__) || defined(__WINSCW__) || defined(__SYMBIAN32__) || \ >- defined(__Fuchsia__) || defined(__HAIKU__) >+#elif defined(__WINSCW__) || defined(__SYMBIAN32__) /* Symbian */ > > typedef int EGLNativeDisplayType; >-typedef void *EGLNativeWindowType; > typedef void *EGLNativePixmapType; >+typedef void *EGLNativeWindowType; > >-#elif defined(__ANDROID__) || defined(ANDROID) >+#elif defined(WL_EGL_PLATFORM) >+ >+typedef struct wl_display *EGLNativeDisplayType; >+typedef struct wl_egl_pixmap *EGLNativePixmapType; >+typedef struct wl_egl_window *EGLNativeWindowType; >+ >+#elif defined(__GBM__) >+ >+typedef struct gbm_device *EGLNativeDisplayType; >+typedef struct gbm_bo *EGLNativePixmapType; >+typedef void *EGLNativeWindowType; > >-#include <android/native_window.h> >+#elif defined(__ANDROID__) || defined(ANDROID) > >+struct ANativeWindow; > struct egl_native_pixmap_t; > >-typedef struct ANativeWindow* EGLNativeWindowType; >-typedef struct egl_native_pixmap_t* EGLNativePixmapType; > typedef void* EGLNativeDisplayType; >+typedef struct egl_native_pixmap_t* EGLNativePixmapType; >+typedef struct ANativeWindow* EGLNativeWindowType; > > #elif defined(USE_OZONE) || defined(USE_WPE) > > typedef intptr_t EGLNativeDisplayType; >-typedef intptr_t EGLNativeWindowType; > typedef intptr_t EGLNativePixmapType; >+typedef intptr_t EGLNativeWindowType; > >-#elif defined(WL_EGL_PLATFORM) >- >-typedef struct wl_display *EGLNativeDisplayType; >-typedef struct wl_egl_pixmap *EGLNativePixmapType; >-typedef struct wl_egl_window *EGLNativeWindowType; >- >-#elif defined(__unix__) >- >-#if defined(ANGLE_USE_X11) && !defined(MESA_EGL_NO_X11_HEADERS) >+#elif defined(__unix__) || defined(USE_X11) > > /* X11 (tentative) */ > #include <X11/Xlib.h> >@@ -124,13 +126,25 @@ typedef Display *EGLNativeDisplayType; > typedef Pixmap EGLNativePixmapType; > typedef Window EGLNativeWindowType; > >-#else >+#elif defined(__APPLE__) >+ >+typedef int EGLNativeDisplayType; >+typedef void *EGLNativePixmapType; >+typedef void *EGLNativeWindowType; >+ >+#elif defined(__HAIKU__) >+ >+#include <kernel/image.h> > >-typedef void *EGLNativeDisplayType; >-typedef khronos_uintptr_t EGLNativePixmapType; >-typedef khronos_uintptr_t EGLNativeWindowType; >+typedef void *EGLNativeDisplayType; >+typedef khronos_uintptr_t EGLNativePixmapType; >+typedef khronos_uintptr_t EGLNativeWindowType; > >-#endif /* ANGLE_USE_X11 && !MESA_EGL_NO_X11_HEADERS */ >+#elif defined(__Fuchsia__) >+ >+typedef int EGLNativeDisplayType; >+typedef void *EGLNativePixmapType; >+typedef void *EGLNativeWindowType > > #else > #error "Platform not recognized" >diff --git a/Source/ThirdParty/ANGLE/include/GLES/.clang-format b/Source/ThirdParty/ANGLE/include/GLES/.clang-format >new file mode 100644 >index 00000000000..06147100144 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/GLES/.clang-format >@@ -0,0 +1,3 @@ >+ >+ >+DisableFormat: true >diff --git a/Source/ThirdParty/ANGLE/include/GLES/README.md b/Source/ThirdParty/ANGLE/include/GLES/README.md >new file mode 100644 >index 00000000000..1aa31f5ac2e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/GLES/README.md >@@ -0,0 +1,20 @@ >+# ANGLE GLES 1.0 Headers >+ >+The GLES 1.0 headers ANGLE uses are generated using the Khronos tools but modified to include function pointer types and function prototype guards. >+ >+### Regenerating gl.h >+ >+1. Install **Python 3** (not 2) with the **lxml** addon. You can do this using `pip install lxml` from your Python's Scripts folder. >+1. Clone [https://github.com/KhronosGroup/OpenGL-Registry.git](https://github.com/KhronosGroup/OpenGL-Registry.git). >+1. Edit `OpenGL-Registry/xml/genheaders.py`: >+ >+ 1. Look for the section titled `# GLES 1.x API + mandatory extensions - GLES/gl.h (no function pointers)` >+ 1. Change `prefixText = prefixStrings + gles1PlatformStrings + genDateCommentString,` to `prefixText = prefixStrings + gles1PlatformStrings + apiEntryPrefixStrings + genDateCommentString,` >+ 1. Change `genFuncPointers = False,` to `genFuncPointers = True,` >+ 1. Change `protectProto = False,` to `protectProto = 'nonzero',` >+ 1. Change `protectProtoStr = 'GL_GLEXT_PROTOTYPES',` to `protectProtoStr = 'GL_GLES_PROTOTYPES',` >+ >+1. Set your working directory to `OpenGL-Registry/xml/`. >+1. Run `python genheaders.py ../api/GLES/gl.h` >+1. The generated header will now be in `OpenGL-Registry/api/GLES/gl.h`. You can copy the header over to this folder. >+1. Also update `scripts/gl.xml` with the latest version from `OpenGL-Registry/xml/`. >diff --git a/Source/ThirdParty/ANGLE/include/GLES/egl.h b/Source/ThirdParty/ANGLE/include/GLES/egl.h >new file mode 100644 >index 00000000000..86f644c923b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/GLES/egl.h >@@ -0,0 +1,29 @@ >+/* >+** Copyright (c) 2008-2017 The Khronos Group Inc. >+** >+** Licensed under the Apache License, Version 2.0 (the "License"); >+** you may not use this file except in compliance with the License. >+** You may obtain a copy of the License at >+** >+** http://www.apache.org/licenses/LICENSE-2.0 >+** >+** Unless required by applicable law or agreed to in writing, software >+** distributed under the License is distributed on an "AS IS" BASIS, >+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. >+** See the License for the specific language governing permissions and >+** limitations under the License. >+*/ >+ >+/* >+ * Skeleton egl.h to provide compatibility for early GLES 1.0 >+ * applications. Several early implementations included gl.h >+ * in egl.h leading applications to include only egl.h >+ */ >+ >+#ifndef __legacy_egl_h_ >+#define __legacy_egl_h_ >+ >+#include <EGL/egl.h> >+#include <GLES/gl.h> >+ >+#endif /* __legacy_egl_h_ */ >diff --git a/Source/ThirdParty/ANGLE/include/GLES/gl.h b/Source/ThirdParty/ANGLE/include/GLES/gl.h >new file mode 100644 >index 00000000000..9f3ed3438a9 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/GLES/gl.h >@@ -0,0 +1,743 @@ >+#ifndef __gles1_gl_h_ >+#define __gles1_gl_h_ 1 >+ >+#ifdef __cplusplus >+extern "C" { >+#endif >+ >+/* >+** Copyright (c) 2013-2018 The Khronos Group Inc. >+** >+** Permission is hereby granted, free of charge, to any person obtaining a >+** copy of this software and/or associated documentation files (the >+** "Materials"), to deal in the Materials without restriction, including >+** without limitation the rights to use, copy, modify, merge, publish, >+** distribute, sublicense, and/or sell copies of the Materials, and to >+** permit persons to whom the Materials are furnished to do so, subject to >+** the following conditions: >+** >+** The above copyright notice and this permission notice shall be included >+** in all copies or substantial portions of the Materials. >+** >+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, >+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF >+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. >+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY >+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, >+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE >+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. >+*/ >+/* >+** This header is generated from the Khronos OpenGL / OpenGL ES XML >+** API Registry. The current version of the Registry, generator scripts >+** used to make the header, and the header can be found at >+** https://github.com/KhronosGroup/OpenGL-Registry >+*/ >+ >+#include <GLES/glplatform.h> >+ >+#ifndef GL_APIENTRYP >+#define GL_APIENTRYP GL_APIENTRY* >+#endif >+ >+/* Generated on date 20181204 */ >+ >+/* Generated C header for: >+ * API: gles1 >+ * Profile: common >+ * Versions considered: .* >+ * Versions emitted: .* >+ * Default extensions included: None >+ * Additional extensions included: ^(GL_OES_read_format|GL_OES_compressed_paletted_texture|GL_OES_point_size_array|GL_OES_point_sprite)$ >+ * Extensions removed: _nomatch_^ >+ */ >+ >+#ifndef GL_VERSION_ES_CM_1_0 >+#define GL_VERSION_ES_CM_1_0 1 >+#include <KHR/khrplatform.h> >+typedef khronos_int8_t GLbyte; >+typedef khronos_float_t GLclampf; >+typedef khronos_int16_t GLshort; >+typedef khronos_uint16_t GLushort; >+typedef void GLvoid; >+typedef unsigned int GLenum; >+typedef khronos_float_t GLfloat; >+typedef khronos_int32_t GLfixed; >+typedef unsigned int GLuint; >+typedef khronos_ssize_t GLsizeiptr; >+typedef khronos_intptr_t GLintptr; >+typedef unsigned int GLbitfield; >+typedef int GLint; >+typedef khronos_uint8_t GLubyte; >+typedef unsigned char GLboolean; >+typedef int GLsizei; >+typedef khronos_int32_t GLclampx; >+#define GL_VERSION_ES_CL_1_0 1 >+#define GL_VERSION_ES_CM_1_1 1 >+#define GL_VERSION_ES_CL_1_1 1 >+#define GL_DEPTH_BUFFER_BIT 0x00000100 >+#define GL_STENCIL_BUFFER_BIT 0x00000400 >+#define GL_COLOR_BUFFER_BIT 0x00004000 >+#define GL_FALSE 0 >+#define GL_TRUE 1 >+#define GL_POINTS 0x0000 >+#define GL_LINES 0x0001 >+#define GL_LINE_LOOP 0x0002 >+#define GL_LINE_STRIP 0x0003 >+#define GL_TRIANGLES 0x0004 >+#define GL_TRIANGLE_STRIP 0x0005 >+#define GL_TRIANGLE_FAN 0x0006 >+#define GL_NEVER 0x0200 >+#define GL_LESS 0x0201 >+#define GL_EQUAL 0x0202 >+#define GL_LEQUAL 0x0203 >+#define GL_GREATER 0x0204 >+#define GL_NOTEQUAL 0x0205 >+#define GL_GEQUAL 0x0206 >+#define GL_ALWAYS 0x0207 >+#define GL_ZERO 0 >+#define GL_ONE 1 >+#define GL_SRC_COLOR 0x0300 >+#define GL_ONE_MINUS_SRC_COLOR 0x0301 >+#define GL_SRC_ALPHA 0x0302 >+#define GL_ONE_MINUS_SRC_ALPHA 0x0303 >+#define GL_DST_ALPHA 0x0304 >+#define GL_ONE_MINUS_DST_ALPHA 0x0305 >+#define GL_DST_COLOR 0x0306 >+#define GL_ONE_MINUS_DST_COLOR 0x0307 >+#define GL_SRC_ALPHA_SATURATE 0x0308 >+#define GL_CLIP_PLANE0 0x3000 >+#define GL_CLIP_PLANE1 0x3001 >+#define GL_CLIP_PLANE2 0x3002 >+#define GL_CLIP_PLANE3 0x3003 >+#define GL_CLIP_PLANE4 0x3004 >+#define GL_CLIP_PLANE5 0x3005 >+#define GL_FRONT 0x0404 >+#define GL_BACK 0x0405 >+#define GL_FRONT_AND_BACK 0x0408 >+#define GL_FOG 0x0B60 >+#define GL_LIGHTING 0x0B50 >+#define GL_TEXTURE_2D 0x0DE1 >+#define GL_CULL_FACE 0x0B44 >+#define GL_ALPHA_TEST 0x0BC0 >+#define GL_BLEND 0x0BE2 >+#define GL_COLOR_LOGIC_OP 0x0BF2 >+#define GL_DITHER 0x0BD0 >+#define GL_STENCIL_TEST 0x0B90 >+#define GL_DEPTH_TEST 0x0B71 >+#define GL_POINT_SMOOTH 0x0B10 >+#define GL_LINE_SMOOTH 0x0B20 >+#define GL_SCISSOR_TEST 0x0C11 >+#define GL_COLOR_MATERIAL 0x0B57 >+#define GL_NORMALIZE 0x0BA1 >+#define GL_RESCALE_NORMAL 0x803A >+#define GL_VERTEX_ARRAY 0x8074 >+#define GL_NORMAL_ARRAY 0x8075 >+#define GL_COLOR_ARRAY 0x8076 >+#define GL_TEXTURE_COORD_ARRAY 0x8078 >+#define GL_MULTISAMPLE 0x809D >+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E >+#define GL_SAMPLE_ALPHA_TO_ONE 0x809F >+#define GL_SAMPLE_COVERAGE 0x80A0 >+#define GL_NO_ERROR 0 >+#define GL_INVALID_ENUM 0x0500 >+#define GL_INVALID_VALUE 0x0501 >+#define GL_INVALID_OPERATION 0x0502 >+#define GL_STACK_OVERFLOW 0x0503 >+#define GL_STACK_UNDERFLOW 0x0504 >+#define GL_OUT_OF_MEMORY 0x0505 >+#define GL_EXP 0x0800 >+#define GL_EXP2 0x0801 >+#define GL_FOG_DENSITY 0x0B62 >+#define GL_FOG_START 0x0B63 >+#define GL_FOG_END 0x0B64 >+#define GL_FOG_MODE 0x0B65 >+#define GL_FOG_COLOR 0x0B66 >+#define GL_CW 0x0900 >+#define GL_CCW 0x0901 >+#define GL_CURRENT_COLOR 0x0B00 >+#define GL_CURRENT_NORMAL 0x0B02 >+#define GL_CURRENT_TEXTURE_COORDS 0x0B03 >+#define GL_POINT_SIZE 0x0B11 >+#define GL_POINT_SIZE_MIN 0x8126 >+#define GL_POINT_SIZE_MAX 0x8127 >+#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 >+#define GL_POINT_DISTANCE_ATTENUATION 0x8129 >+#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 >+#define GL_LINE_WIDTH 0x0B21 >+#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 >+#define GL_ALIASED_POINT_SIZE_RANGE 0x846D >+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E >+#define GL_CULL_FACE_MODE 0x0B45 >+#define GL_FRONT_FACE 0x0B46 >+#define GL_SHADE_MODEL 0x0B54 >+#define GL_DEPTH_RANGE 0x0B70 >+#define GL_DEPTH_WRITEMASK 0x0B72 >+#define GL_DEPTH_CLEAR_VALUE 0x0B73 >+#define GL_DEPTH_FUNC 0x0B74 >+#define GL_STENCIL_CLEAR_VALUE 0x0B91 >+#define GL_STENCIL_FUNC 0x0B92 >+#define GL_STENCIL_VALUE_MASK 0x0B93 >+#define GL_STENCIL_FAIL 0x0B94 >+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 >+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 >+#define GL_STENCIL_REF 0x0B97 >+#define GL_STENCIL_WRITEMASK 0x0B98 >+#define GL_MATRIX_MODE 0x0BA0 >+#define GL_VIEWPORT 0x0BA2 >+#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 >+#define GL_PROJECTION_STACK_DEPTH 0x0BA4 >+#define GL_TEXTURE_STACK_DEPTH 0x0BA5 >+#define GL_MODELVIEW_MATRIX 0x0BA6 >+#define GL_PROJECTION_MATRIX 0x0BA7 >+#define GL_TEXTURE_MATRIX 0x0BA8 >+#define GL_ALPHA_TEST_FUNC 0x0BC1 >+#define GL_ALPHA_TEST_REF 0x0BC2 >+#define GL_BLEND_DST 0x0BE0 >+#define GL_BLEND_SRC 0x0BE1 >+#define GL_LOGIC_OP_MODE 0x0BF0 >+#define GL_SCISSOR_BOX 0x0C10 >+#define GL_COLOR_CLEAR_VALUE 0x0C22 >+#define GL_COLOR_WRITEMASK 0x0C23 >+#define GL_MAX_LIGHTS 0x0D31 >+#define GL_MAX_CLIP_PLANES 0x0D32 >+#define GL_MAX_TEXTURE_SIZE 0x0D33 >+#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 >+#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 >+#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 >+#define GL_MAX_VIEWPORT_DIMS 0x0D3A >+#define GL_MAX_TEXTURE_UNITS 0x84E2 >+#define GL_SUBPIXEL_BITS 0x0D50 >+#define GL_RED_BITS 0x0D52 >+#define GL_GREEN_BITS 0x0D53 >+#define GL_BLUE_BITS 0x0D54 >+#define GL_ALPHA_BITS 0x0D55 >+#define GL_DEPTH_BITS 0x0D56 >+#define GL_STENCIL_BITS 0x0D57 >+#define GL_POLYGON_OFFSET_UNITS 0x2A00 >+#define GL_POLYGON_OFFSET_FILL 0x8037 >+#define GL_POLYGON_OFFSET_FACTOR 0x8038 >+#define GL_TEXTURE_BINDING_2D 0x8069 >+#define GL_VERTEX_ARRAY_SIZE 0x807A >+#define GL_VERTEX_ARRAY_TYPE 0x807B >+#define GL_VERTEX_ARRAY_STRIDE 0x807C >+#define GL_NORMAL_ARRAY_TYPE 0x807E >+#define GL_NORMAL_ARRAY_STRIDE 0x807F >+#define GL_COLOR_ARRAY_SIZE 0x8081 >+#define GL_COLOR_ARRAY_TYPE 0x8082 >+#define GL_COLOR_ARRAY_STRIDE 0x8083 >+#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 >+#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 >+#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A >+#define GL_VERTEX_ARRAY_POINTER 0x808E >+#define GL_NORMAL_ARRAY_POINTER 0x808F >+#define GL_COLOR_ARRAY_POINTER 0x8090 >+#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 >+#define GL_SAMPLE_BUFFERS 0x80A8 >+#define GL_SAMPLES 0x80A9 >+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA >+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB >+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 >+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 >+#define GL_DONT_CARE 0x1100 >+#define GL_FASTEST 0x1101 >+#define GL_NICEST 0x1102 >+#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 >+#define GL_POINT_SMOOTH_HINT 0x0C51 >+#define GL_LINE_SMOOTH_HINT 0x0C52 >+#define GL_FOG_HINT 0x0C54 >+#define GL_GENERATE_MIPMAP_HINT 0x8192 >+#define GL_LIGHT_MODEL_AMBIENT 0x0B53 >+#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 >+#define GL_AMBIENT 0x1200 >+#define GL_DIFFUSE 0x1201 >+#define GL_SPECULAR 0x1202 >+#define GL_POSITION 0x1203 >+#define GL_SPOT_DIRECTION 0x1204 >+#define GL_SPOT_EXPONENT 0x1205 >+#define GL_SPOT_CUTOFF 0x1206 >+#define GL_CONSTANT_ATTENUATION 0x1207 >+#define GL_LINEAR_ATTENUATION 0x1208 >+#define GL_QUADRATIC_ATTENUATION 0x1209 >+#define GL_BYTE 0x1400 >+#define GL_UNSIGNED_BYTE 0x1401 >+#define GL_SHORT 0x1402 >+#define GL_UNSIGNED_SHORT 0x1403 >+#define GL_FLOAT 0x1406 >+#define GL_FIXED 0x140C >+#define GL_CLEAR 0x1500 >+#define GL_AND 0x1501 >+#define GL_AND_REVERSE 0x1502 >+#define GL_COPY 0x1503 >+#define GL_AND_INVERTED 0x1504 >+#define GL_NOOP 0x1505 >+#define GL_XOR 0x1506 >+#define GL_OR 0x1507 >+#define GL_NOR 0x1508 >+#define GL_EQUIV 0x1509 >+#define GL_INVERT 0x150A >+#define GL_OR_REVERSE 0x150B >+#define GL_COPY_INVERTED 0x150C >+#define GL_OR_INVERTED 0x150D >+#define GL_NAND 0x150E >+#define GL_SET 0x150F >+#define GL_EMISSION 0x1600 >+#define GL_SHININESS 0x1601 >+#define GL_AMBIENT_AND_DIFFUSE 0x1602 >+#define GL_MODELVIEW 0x1700 >+#define GL_PROJECTION 0x1701 >+#define GL_TEXTURE 0x1702 >+#define GL_ALPHA 0x1906 >+#define GL_RGB 0x1907 >+#define GL_RGBA 0x1908 >+#define GL_LUMINANCE 0x1909 >+#define GL_LUMINANCE_ALPHA 0x190A >+#define GL_UNPACK_ALIGNMENT 0x0CF5 >+#define GL_PACK_ALIGNMENT 0x0D05 >+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 >+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 >+#define GL_UNSIGNED_SHORT_5_6_5 0x8363 >+#define GL_FLAT 0x1D00 >+#define GL_SMOOTH 0x1D01 >+#define GL_KEEP 0x1E00 >+#define GL_REPLACE 0x1E01 >+#define GL_INCR 0x1E02 >+#define GL_DECR 0x1E03 >+#define GL_VENDOR 0x1F00 >+#define GL_RENDERER 0x1F01 >+#define GL_VERSION 0x1F02 >+#define GL_EXTENSIONS 0x1F03 >+#define GL_MODULATE 0x2100 >+#define GL_DECAL 0x2101 >+#define GL_ADD 0x0104 >+#define GL_TEXTURE_ENV_MODE 0x2200 >+#define GL_TEXTURE_ENV_COLOR 0x2201 >+#define GL_TEXTURE_ENV 0x2300 >+#define GL_NEAREST 0x2600 >+#define GL_LINEAR 0x2601 >+#define GL_NEAREST_MIPMAP_NEAREST 0x2700 >+#define GL_LINEAR_MIPMAP_NEAREST 0x2701 >+#define GL_NEAREST_MIPMAP_LINEAR 0x2702 >+#define GL_LINEAR_MIPMAP_LINEAR 0x2703 >+#define GL_TEXTURE_MAG_FILTER 0x2800 >+#define GL_TEXTURE_MIN_FILTER 0x2801 >+#define GL_TEXTURE_WRAP_S 0x2802 >+#define GL_TEXTURE_WRAP_T 0x2803 >+#define GL_GENERATE_MIPMAP 0x8191 >+#define GL_TEXTURE0 0x84C0 >+#define GL_TEXTURE1 0x84C1 >+#define GL_TEXTURE2 0x84C2 >+#define GL_TEXTURE3 0x84C3 >+#define GL_TEXTURE4 0x84C4 >+#define GL_TEXTURE5 0x84C5 >+#define GL_TEXTURE6 0x84C6 >+#define GL_TEXTURE7 0x84C7 >+#define GL_TEXTURE8 0x84C8 >+#define GL_TEXTURE9 0x84C9 >+#define GL_TEXTURE10 0x84CA >+#define GL_TEXTURE11 0x84CB >+#define GL_TEXTURE12 0x84CC >+#define GL_TEXTURE13 0x84CD >+#define GL_TEXTURE14 0x84CE >+#define GL_TEXTURE15 0x84CF >+#define GL_TEXTURE16 0x84D0 >+#define GL_TEXTURE17 0x84D1 >+#define GL_TEXTURE18 0x84D2 >+#define GL_TEXTURE19 0x84D3 >+#define GL_TEXTURE20 0x84D4 >+#define GL_TEXTURE21 0x84D5 >+#define GL_TEXTURE22 0x84D6 >+#define GL_TEXTURE23 0x84D7 >+#define GL_TEXTURE24 0x84D8 >+#define GL_TEXTURE25 0x84D9 >+#define GL_TEXTURE26 0x84DA >+#define GL_TEXTURE27 0x84DB >+#define GL_TEXTURE28 0x84DC >+#define GL_TEXTURE29 0x84DD >+#define GL_TEXTURE30 0x84DE >+#define GL_TEXTURE31 0x84DF >+#define GL_ACTIVE_TEXTURE 0x84E0 >+#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 >+#define GL_REPEAT 0x2901 >+#define GL_CLAMP_TO_EDGE 0x812F >+#define GL_LIGHT0 0x4000 >+#define GL_LIGHT1 0x4001 >+#define GL_LIGHT2 0x4002 >+#define GL_LIGHT3 0x4003 >+#define GL_LIGHT4 0x4004 >+#define GL_LIGHT5 0x4005 >+#define GL_LIGHT6 0x4006 >+#define GL_LIGHT7 0x4007 >+#define GL_ARRAY_BUFFER 0x8892 >+#define GL_ELEMENT_ARRAY_BUFFER 0x8893 >+#define GL_ARRAY_BUFFER_BINDING 0x8894 >+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 >+#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 >+#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 >+#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 >+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A >+#define GL_STATIC_DRAW 0x88E4 >+#define GL_DYNAMIC_DRAW 0x88E8 >+#define GL_BUFFER_SIZE 0x8764 >+#define GL_BUFFER_USAGE 0x8765 >+#define GL_SUBTRACT 0x84E7 >+#define GL_COMBINE 0x8570 >+#define GL_COMBINE_RGB 0x8571 >+#define GL_COMBINE_ALPHA 0x8572 >+#define GL_RGB_SCALE 0x8573 >+#define GL_ADD_SIGNED 0x8574 >+#define GL_INTERPOLATE 0x8575 >+#define GL_CONSTANT 0x8576 >+#define GL_PRIMARY_COLOR 0x8577 >+#define GL_PREVIOUS 0x8578 >+#define GL_OPERAND0_RGB 0x8590 >+#define GL_OPERAND1_RGB 0x8591 >+#define GL_OPERAND2_RGB 0x8592 >+#define GL_OPERAND0_ALPHA 0x8598 >+#define GL_OPERAND1_ALPHA 0x8599 >+#define GL_OPERAND2_ALPHA 0x859A >+#define GL_ALPHA_SCALE 0x0D1C >+#define GL_SRC0_RGB 0x8580 >+#define GL_SRC1_RGB 0x8581 >+#define GL_SRC2_RGB 0x8582 >+#define GL_SRC0_ALPHA 0x8588 >+#define GL_SRC1_ALPHA 0x8589 >+#define GL_SRC2_ALPHA 0x858A >+#define GL_DOT3_RGB 0x86AE >+#define GL_DOT3_RGBA 0x86AF >+typedef void (GL_APIENTRYP PFNGLALPHAFUNCPROC) (GLenum func, GLfloat ref); >+typedef void (GL_APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); >+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); >+typedef void (GL_APIENTRYP PFNGLCLIPPLANEFPROC) (GLenum p, const GLfloat *eqn); >+typedef void (GL_APIENTRYP PFNGLCOLOR4FPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); >+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); >+typedef void (GL_APIENTRYP PFNGLFOGFPROC) (GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLFOGFVPROC) (GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLFRUSTUMFPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); >+typedef void (GL_APIENTRYP PFNGLGETCLIPPLANEFPROC) (GLenum plane, GLfloat *equation); >+typedef void (GL_APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data); >+typedef void (GL_APIENTRYP PFNGLGETLIGHTFVPROC) (GLenum light, GLenum pname, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETMATERIALFVPROC) (GLenum face, GLenum pname, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXENVFVPROC) (GLenum target, GLenum pname, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLLIGHTMODELFPROC) (GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLLIGHTMODELFVPROC) (GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLLIGHTFPROC) (GLenum light, GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLLIGHTFVPROC) (GLenum light, GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width); >+typedef void (GL_APIENTRYP PFNGLLOADMATRIXFPROC) (const GLfloat *m); >+typedef void (GL_APIENTRYP PFNGLMATERIALFPROC) (GLenum face, GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLMATERIALFVPROC) (GLenum face, GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLMULTMATRIXFPROC) (const GLfloat *m); >+typedef void (GL_APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); >+typedef void (GL_APIENTRYP PFNGLNORMAL3FPROC) (GLfloat nx, GLfloat ny, GLfloat nz); >+typedef void (GL_APIENTRYP PFNGLORTHOFPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); >+typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLPOINTSIZEPROC) (GLfloat size); >+typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units); >+typedef void (GL_APIENTRYP PFNGLROTATEFPROC) (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); >+typedef void (GL_APIENTRYP PFNGLSCALEFPROC) (GLfloat x, GLfloat y, GLfloat z); >+typedef void (GL_APIENTRYP PFNGLTEXENVFPROC) (GLenum target, GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLTEXENVFVPROC) (GLenum target, GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLTRANSLATEFPROC) (GLfloat x, GLfloat y, GLfloat z); >+typedef void (GL_APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); >+typedef void (GL_APIENTRYP PFNGLALPHAFUNCXPROC) (GLenum func, GLfixed ref); >+typedef void (GL_APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); >+typedef void (GL_APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture); >+typedef void (GL_APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor); >+typedef void (GL_APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); >+typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); >+typedef void (GL_APIENTRYP PFNGLCLEARPROC) (GLbitfield mask); >+typedef void (GL_APIENTRYP PFNGLCLEARCOLORXPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); >+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHXPROC) (GLfixed depth); >+typedef void (GL_APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s); >+typedef void (GL_APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); >+typedef void (GL_APIENTRYP PFNGLCLIPPLANEXPROC) (GLenum plane, const GLfixed *equation); >+typedef void (GL_APIENTRYP PFNGLCOLOR4UBPROC) (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); >+typedef void (GL_APIENTRYP PFNGLCOLOR4XPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); >+typedef void (GL_APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); >+typedef void (GL_APIENTRYP PFNGLCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); >+typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); >+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode); >+typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); >+typedef void (GL_APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); >+typedef void (GL_APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func); >+typedef void (GL_APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag); >+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEXPROC) (GLfixed n, GLfixed f); >+typedef void (GL_APIENTRYP PFNGLDISABLEPROC) (GLenum cap); >+typedef void (GL_APIENTRYP PFNGLDISABLECLIENTSTATEPROC) (GLenum array); >+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count); >+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices); >+typedef void (GL_APIENTRYP PFNGLENABLEPROC) (GLenum cap); >+typedef void (GL_APIENTRYP PFNGLENABLECLIENTSTATEPROC) (GLenum array); >+typedef void (GL_APIENTRYP PFNGLFINISHPROC) (void); >+typedef void (GL_APIENTRYP PFNGLFLUSHPROC) (void); >+typedef void (GL_APIENTRYP PFNGLFOGXPROC) (GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLFOGXVPROC) (GLenum pname, const GLfixed *param); >+typedef void (GL_APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode); >+typedef void (GL_APIENTRYP PFNGLFRUSTUMXPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); >+typedef void (GL_APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data); >+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETCLIPPLANEXPROC) (GLenum plane, GLfixed *equation); >+typedef void (GL_APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); >+typedef void (GL_APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); >+typedef GLenum (GL_APIENTRYP PFNGLGETERRORPROC) (void); >+typedef void (GL_APIENTRYP PFNGLGETFIXEDVPROC) (GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data); >+typedef void (GL_APIENTRYP PFNGLGETLIGHTXVPROC) (GLenum light, GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLGETMATERIALXVPROC) (GLenum face, GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLGETPOINTERVPROC) (GLenum pname, void **params); >+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGPROC) (GLenum name); >+typedef void (GL_APIENTRYP PFNGLGETTEXENVIVPROC) (GLenum target, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXENVXVPROC) (GLenum target, GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERXVPROC) (GLenum target, GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode); >+typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); >+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDPROC) (GLenum cap); >+typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture); >+typedef void (GL_APIENTRYP PFNGLLIGHTMODELXPROC) (GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLLIGHTMODELXVPROC) (GLenum pname, const GLfixed *param); >+typedef void (GL_APIENTRYP PFNGLLIGHTXPROC) (GLenum light, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLLIGHTXVPROC) (GLenum light, GLenum pname, const GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLLINEWIDTHXPROC) (GLfixed width); >+typedef void (GL_APIENTRYP PFNGLLOADIDENTITYPROC) (void); >+typedef void (GL_APIENTRYP PFNGLLOADMATRIXXPROC) (const GLfixed *m); >+typedef void (GL_APIENTRYP PFNGLLOGICOPPROC) (GLenum opcode); >+typedef void (GL_APIENTRYP PFNGLMATERIALXPROC) (GLenum face, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLMATERIALXVPROC) (GLenum face, GLenum pname, const GLfixed *param); >+typedef void (GL_APIENTRYP PFNGLMATRIXMODEPROC) (GLenum mode); >+typedef void (GL_APIENTRYP PFNGLMULTMATRIXXPROC) (const GLfixed *m); >+typedef void (GL_APIENTRYP PFNGLMULTITEXCOORD4XPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); >+typedef void (GL_APIENTRYP PFNGLNORMAL3XPROC) (GLfixed nx, GLfixed ny, GLfixed nz); >+typedef void (GL_APIENTRYP PFNGLNORMALPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); >+typedef void (GL_APIENTRYP PFNGLORTHOXPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); >+typedef void (GL_APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param); >+typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERXPROC) (GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERXVPROC) (GLenum pname, const GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLPOINTSIZEXPROC) (GLfixed size); >+typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETXPROC) (GLfixed factor, GLfixed units); >+typedef void (GL_APIENTRYP PFNGLPOPMATRIXPROC) (void); >+typedef void (GL_APIENTRYP PFNGLPUSHMATRIXPROC) (void); >+typedef void (GL_APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); >+typedef void (GL_APIENTRYP PFNGLROTATEXPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); >+typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); >+typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEXPROC) (GLclampx value, GLboolean invert); >+typedef void (GL_APIENTRYP PFNGLSCALEXPROC) (GLfixed x, GLfixed y, GLfixed z); >+typedef void (GL_APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLSHADEMODELPROC) (GLenum mode); >+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask); >+typedef void (GL_APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask); >+typedef void (GL_APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass); >+typedef void (GL_APIENTRYP PFNGLTEXCOORDPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); >+typedef void (GL_APIENTRYP PFNGLTEXENVIPROC) (GLenum target, GLenum pname, GLint param); >+typedef void (GL_APIENTRYP PFNGLTEXENVXPROC) (GLenum target, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLTEXENVIVPROC) (GLenum target, GLenum pname, const GLint *params); >+typedef void (GL_APIENTRYP PFNGLTEXENVXVPROC) (GLenum target, GLenum pname, const GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERXPROC) (GLenum target, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERXVPROC) (GLenum target, GLenum pname, const GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); >+typedef void (GL_APIENTRYP PFNGLTRANSLATEXPROC) (GLfixed x, GLfixed y, GLfixed z); >+typedef void (GL_APIENTRYP PFNGLVERTEXPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); >+typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); >+#if GL_GLES_PROTOTYPES >+GL_API void GL_APIENTRY glAlphaFunc (GLenum func, GLfloat ref); >+GL_API void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); >+GL_API void GL_APIENTRY glClearDepthf (GLfloat d); >+GL_API void GL_APIENTRY glClipPlanef (GLenum p, const GLfloat *eqn); >+GL_API void GL_APIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); >+GL_API void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f); >+GL_API void GL_APIENTRY glFogf (GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glFogfv (GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glFrustumf (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); >+GL_API void GL_APIENTRY glGetClipPlanef (GLenum plane, GLfloat *equation); >+GL_API void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data); >+GL_API void GL_APIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); >+GL_API void GL_APIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); >+GL_API void GL_APIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); >+GL_API void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); >+GL_API void GL_APIENTRY glLightModelf (GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glLightModelfv (GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glLineWidth (GLfloat width); >+GL_API void GL_APIENTRY glLoadMatrixf (const GLfloat *m); >+GL_API void GL_APIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glMultMatrixf (const GLfloat *m); >+GL_API void GL_APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); >+GL_API void GL_APIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); >+GL_API void GL_APIENTRY glOrthof (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); >+GL_API void GL_APIENTRY glPointParameterf (GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glPointSize (GLfloat size); >+GL_API void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); >+GL_API void GL_APIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); >+GL_API void GL_APIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); >+GL_API void GL_APIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); >+GL_API void GL_APIENTRY glActiveTexture (GLenum texture); >+GL_API void GL_APIENTRY glAlphaFuncx (GLenum func, GLfixed ref); >+GL_API void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer); >+GL_API void GL_APIENTRY glBindTexture (GLenum target, GLuint texture); >+GL_API void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); >+GL_API void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); >+GL_API void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); >+GL_API void GL_APIENTRY glClear (GLbitfield mask); >+GL_API void GL_APIENTRY glClearColorx (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); >+GL_API void GL_APIENTRY glClearDepthx (GLfixed depth); >+GL_API void GL_APIENTRY glClearStencil (GLint s); >+GL_API void GL_APIENTRY glClientActiveTexture (GLenum texture); >+GL_API void GL_APIENTRY glClipPlanex (GLenum plane, const GLfixed *equation); >+GL_API void GL_APIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); >+GL_API void GL_APIENTRY glColor4x (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); >+GL_API void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); >+GL_API void GL_APIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); >+GL_API void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); >+GL_API void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); >+GL_API void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); >+GL_API void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); >+GL_API void GL_APIENTRY glCullFace (GLenum mode); >+GL_API void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); >+GL_API void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); >+GL_API void GL_APIENTRY glDepthFunc (GLenum func); >+GL_API void GL_APIENTRY glDepthMask (GLboolean flag); >+GL_API void GL_APIENTRY glDepthRangex (GLfixed n, GLfixed f); >+GL_API void GL_APIENTRY glDisable (GLenum cap); >+GL_API void GL_APIENTRY glDisableClientState (GLenum array); >+GL_API void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); >+GL_API void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); >+GL_API void GL_APIENTRY glEnable (GLenum cap); >+GL_API void GL_APIENTRY glEnableClientState (GLenum array); >+GL_API void GL_APIENTRY glFinish (void); >+GL_API void GL_APIENTRY glFlush (void); >+GL_API void GL_APIENTRY glFogx (GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glFogxv (GLenum pname, const GLfixed *param); >+GL_API void GL_APIENTRY glFrontFace (GLenum mode); >+GL_API void GL_APIENTRY glFrustumx (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); >+GL_API void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data); >+GL_API void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); >+GL_API void GL_APIENTRY glGetClipPlanex (GLenum plane, GLfixed *equation); >+GL_API void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); >+GL_API void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures); >+GL_API GLenum GL_APIENTRY glGetError (void); >+GL_API void GL_APIENTRY glGetFixedv (GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data); >+GL_API void GL_APIENTRY glGetLightxv (GLenum light, GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glGetMaterialxv (GLenum face, GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glGetPointerv (GLenum pname, void **params); >+GL_API const GLubyte *GL_APIENTRY glGetString (GLenum name); >+GL_API void GL_APIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); >+GL_API void GL_APIENTRY glGetTexEnvxv (GLenum target, GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); >+GL_API void GL_APIENTRY glGetTexParameterxv (GLenum target, GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glHint (GLenum target, GLenum mode); >+GL_API GLboolean GL_APIENTRY glIsBuffer (GLuint buffer); >+GL_API GLboolean GL_APIENTRY glIsEnabled (GLenum cap); >+GL_API GLboolean GL_APIENTRY glIsTexture (GLuint texture); >+GL_API void GL_APIENTRY glLightModelx (GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glLightModelxv (GLenum pname, const GLfixed *param); >+GL_API void GL_APIENTRY glLightx (GLenum light, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glLightxv (GLenum light, GLenum pname, const GLfixed *params); >+GL_API void GL_APIENTRY glLineWidthx (GLfixed width); >+GL_API void GL_APIENTRY glLoadIdentity (void); >+GL_API void GL_APIENTRY glLoadMatrixx (const GLfixed *m); >+GL_API void GL_APIENTRY glLogicOp (GLenum opcode); >+GL_API void GL_APIENTRY glMaterialx (GLenum face, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glMaterialxv (GLenum face, GLenum pname, const GLfixed *param); >+GL_API void GL_APIENTRY glMatrixMode (GLenum mode); >+GL_API void GL_APIENTRY glMultMatrixx (const GLfixed *m); >+GL_API void GL_APIENTRY glMultiTexCoord4x (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); >+GL_API void GL_APIENTRY glNormal3x (GLfixed nx, GLfixed ny, GLfixed nz); >+GL_API void GL_APIENTRY glNormalPointer (GLenum type, GLsizei stride, const void *pointer); >+GL_API void GL_APIENTRY glOrthox (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); >+GL_API void GL_APIENTRY glPixelStorei (GLenum pname, GLint param); >+GL_API void GL_APIENTRY glPointParameterx (GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glPointParameterxv (GLenum pname, const GLfixed *params); >+GL_API void GL_APIENTRY glPointSizex (GLfixed size); >+GL_API void GL_APIENTRY glPolygonOffsetx (GLfixed factor, GLfixed units); >+GL_API void GL_APIENTRY glPopMatrix (void); >+GL_API void GL_APIENTRY glPushMatrix (void); >+GL_API void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); >+GL_API void GL_APIENTRY glRotatex (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); >+GL_API void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); >+GL_API void GL_APIENTRY glSampleCoveragex (GLclampx value, GLboolean invert); >+GL_API void GL_APIENTRY glScalex (GLfixed x, GLfixed y, GLfixed z); >+GL_API void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); >+GL_API void GL_APIENTRY glShadeModel (GLenum mode); >+GL_API void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); >+GL_API void GL_APIENTRY glStencilMask (GLuint mask); >+GL_API void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); >+GL_API void GL_APIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); >+GL_API void GL_APIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); >+GL_API void GL_APIENTRY glTexEnvx (GLenum target, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); >+GL_API void GL_APIENTRY glTexEnvxv (GLenum target, GLenum pname, const GLfixed *params); >+GL_API void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); >+GL_API void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); >+GL_API void GL_APIENTRY glTexParameterx (GLenum target, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); >+GL_API void GL_APIENTRY glTexParameterxv (GLenum target, GLenum pname, const GLfixed *params); >+GL_API void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); >+GL_API void GL_APIENTRY glTranslatex (GLfixed x, GLfixed y, GLfixed z); >+GL_API void GL_APIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); >+GL_API void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); >+#endif >+#endif /* GL_VERSION_ES_CM_1_0 */ >+ >+#ifndef GL_OES_compressed_paletted_texture >+#define GL_OES_compressed_paletted_texture 1 >+#define GL_PALETTE4_RGB8_OES 0x8B90 >+#define GL_PALETTE4_RGBA8_OES 0x8B91 >+#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 >+#define GL_PALETTE4_RGBA4_OES 0x8B93 >+#define GL_PALETTE4_RGB5_A1_OES 0x8B94 >+#define GL_PALETTE8_RGB8_OES 0x8B95 >+#define GL_PALETTE8_RGBA8_OES 0x8B96 >+#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 >+#define GL_PALETTE8_RGBA4_OES 0x8B98 >+#define GL_PALETTE8_RGB5_A1_OES 0x8B99 >+#endif /* GL_OES_compressed_paletted_texture */ >+ >+#ifndef GL_OES_point_size_array >+#define GL_OES_point_size_array 1 >+#define GL_POINT_SIZE_ARRAY_OES 0x8B9C >+#define GL_POINT_SIZE_ARRAY_TYPE_OES 0x898A >+#define GL_POINT_SIZE_ARRAY_STRIDE_OES 0x898B >+#define GL_POINT_SIZE_ARRAY_POINTER_OES 0x898C >+#define GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES 0x8B9F >+typedef void (GL_APIENTRYP PFNGLPOINTSIZEPOINTEROESPROC) (GLenum type, GLsizei stride, const void *pointer); >+#if GL_GLES_PROTOTYPES >+GL_API void GL_APIENTRY glPointSizePointerOES (GLenum type, GLsizei stride, const void *pointer); >+#endif >+#endif /* GL_OES_point_size_array */ >+ >+#ifndef GL_OES_point_sprite >+#define GL_OES_point_sprite 1 >+#define GL_POINT_SPRITE_OES 0x8861 >+#define GL_COORD_REPLACE_OES 0x8862 >+#endif /* GL_OES_point_sprite */ >+ >+#ifndef GL_OES_read_format >+#define GL_OES_read_format 1 >+#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A >+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B >+#endif /* GL_OES_read_format */ >+ >+#ifdef __cplusplus >+} >+#endif >+ >+#endif >diff --git a/Source/ThirdParty/ANGLE/include/GLES/glext.h b/Source/ThirdParty/ANGLE/include/GLES/glext.h >new file mode 100644 >index 00000000000..ddd4078166e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/GLES/glext.h >@@ -0,0 +1,965 @@ >+#ifndef __glext_h_ >+#define __glext_h_ 1 >+ >+#ifdef __cplusplus >+extern "C" { >+#endif >+ >+/* >+** Copyright (c) 2013-2017 The Khronos Group Inc. >+** >+** Permission is hereby granted, free of charge, to any person obtaining a >+** copy of this software and/or associated documentation files (the >+** "Materials"), to deal in the Materials without restriction, including >+** without limitation the rights to use, copy, modify, merge, publish, >+** distribute, sublicense, and/or sell copies of the Materials, and to >+** permit persons to whom the Materials are furnished to do so, subject to >+** the following conditions: >+** >+** The above copyright notice and this permission notice shall be included >+** in all copies or substantial portions of the Materials. >+** >+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, >+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF >+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. >+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY >+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, >+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE >+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. >+*/ >+/* >+** This header is generated from the Khronos OpenGL / OpenGL ES XML >+** API Registry. The current version of the Registry, generator scripts >+** used to make the header, and the header can be found at >+** https://github.com/KhronosGroup/OpenGL-Registry >+*/ >+ >+#ifndef GL_APIENTRYP >+#define GL_APIENTRYP GL_APIENTRY* >+#endif >+ >+/* Generated on date 20171212 */ >+ >+/* Generated C header for: >+ * API: gles1 >+ * Profile: common >+ * Versions considered: .* >+ * Versions emitted: _nomatch_^ >+ * Default extensions included: gles1 >+ * Additional extensions included: _nomatch_^ >+ * Extensions removed: ^(GL_OES_read_format|GL_OES_compressed_paletted_texture|GL_OES_point_size_array|GL_OES_point_sprite)$ >+ */ >+ >+#ifndef GL_OES_EGL_image >+#define GL_OES_EGL_image 1 >+typedef void *GLeglImageOES; >+typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); >+typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image); >+GL_API void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image); >+#endif >+#endif /* GL_OES_EGL_image */ >+ >+#ifndef GL_OES_blend_equation_separate >+#define GL_OES_blend_equation_separate 1 >+#define GL_BLEND_EQUATION_RGB_OES 0x8009 >+#define GL_BLEND_EQUATION_ALPHA_OES 0x883D >+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEOESPROC) (GLenum modeRGB, GLenum modeAlpha); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glBlendEquationSeparateOES (GLenum modeRGB, GLenum modeAlpha); >+#endif >+#endif /* GL_OES_blend_equation_separate */ >+ >+#ifndef GL_OES_blend_func_separate >+#define GL_OES_blend_func_separate 1 >+#define GL_BLEND_DST_RGB_OES 0x80C8 >+#define GL_BLEND_SRC_RGB_OES 0x80C9 >+#define GL_BLEND_DST_ALPHA_OES 0x80CA >+#define GL_BLEND_SRC_ALPHA_OES 0x80CB >+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEOESPROC) (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glBlendFuncSeparateOES (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); >+#endif >+#endif /* GL_OES_blend_func_separate */ >+ >+#ifndef GL_OES_blend_subtract >+#define GL_OES_blend_subtract 1 >+#define GL_BLEND_EQUATION_OES 0x8009 >+#define GL_FUNC_ADD_OES 0x8006 >+#define GL_FUNC_SUBTRACT_OES 0x800A >+#define GL_FUNC_REVERSE_SUBTRACT_OES 0x800B >+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONOESPROC) (GLenum mode); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glBlendEquationOES (GLenum mode); >+#endif >+#endif /* GL_OES_blend_subtract */ >+ >+#ifndef GL_OES_byte_coordinates >+#define GL_OES_byte_coordinates 1 >+#endif /* GL_OES_byte_coordinates */ >+ >+#ifndef GL_OES_compressed_ETC1_RGB8_sub_texture >+#define GL_OES_compressed_ETC1_RGB8_sub_texture 1 >+#endif /* GL_OES_compressed_ETC1_RGB8_sub_texture */ >+ >+#ifndef GL_OES_compressed_ETC1_RGB8_texture >+#define GL_OES_compressed_ETC1_RGB8_texture 1 >+#define GL_ETC1_RGB8_OES 0x8D64 >+#endif /* GL_OES_compressed_ETC1_RGB8_texture */ >+ >+#ifndef GL_OES_depth24 >+#define GL_OES_depth24 1 >+#define GL_DEPTH_COMPONENT24_OES 0x81A6 >+#endif /* GL_OES_depth24 */ >+ >+#ifndef GL_OES_depth32 >+#define GL_OES_depth32 1 >+#define GL_DEPTH_COMPONENT32_OES 0x81A7 >+#endif /* GL_OES_depth32 */ >+ >+#ifndef GL_OES_draw_texture >+#define GL_OES_draw_texture 1 >+#define GL_TEXTURE_CROP_RECT_OES 0x8B9D >+typedef void (GL_APIENTRYP PFNGLDRAWTEXSOESPROC) (GLshort x, GLshort y, GLshort z, GLshort width, GLshort height); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXIOESPROC) (GLint x, GLint y, GLint z, GLint width, GLint height); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXXOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXSVOESPROC) (const GLshort *coords); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXIVOESPROC) (const GLint *coords); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXXVOESPROC) (const GLfixed *coords); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXFOESPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXFVOESPROC) (const GLfloat *coords); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glDrawTexsOES (GLshort x, GLshort y, GLshort z, GLshort width, GLshort height); >+GL_API void GL_APIENTRY glDrawTexiOES (GLint x, GLint y, GLint z, GLint width, GLint height); >+GL_API void GL_APIENTRY glDrawTexxOES (GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height); >+GL_API void GL_APIENTRY glDrawTexsvOES (const GLshort *coords); >+GL_API void GL_APIENTRY glDrawTexivOES (const GLint *coords); >+GL_API void GL_APIENTRY glDrawTexxvOES (const GLfixed *coords); >+GL_API void GL_APIENTRY glDrawTexfOES (GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height); >+GL_API void GL_APIENTRY glDrawTexfvOES (const GLfloat *coords); >+#endif >+#endif /* GL_OES_draw_texture */ >+ >+#ifndef GL_OES_element_index_uint >+#define GL_OES_element_index_uint 1 >+#define GL_UNSIGNED_INT 0x1405 >+#endif /* GL_OES_element_index_uint */ >+ >+#ifndef GL_OES_extended_matrix_palette >+#define GL_OES_extended_matrix_palette 1 >+#endif /* GL_OES_extended_matrix_palette */ >+ >+#ifndef GL_OES_fbo_render_mipmap >+#define GL_OES_fbo_render_mipmap 1 >+#endif /* GL_OES_fbo_render_mipmap */ >+ >+#ifndef GL_OES_fixed_point >+#define GL_OES_fixed_point 1 >+#define GL_FIXED_OES 0x140C >+typedef void (GL_APIENTRYP PFNGLALPHAFUNCXOESPROC) (GLenum func, GLfixed ref); >+typedef void (GL_APIENTRYP PFNGLCLEARCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); >+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHXOESPROC) (GLfixed depth); >+typedef void (GL_APIENTRYP PFNGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation); >+typedef void (GL_APIENTRYP PFNGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); >+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEXOESPROC) (GLfixed n, GLfixed f); >+typedef void (GL_APIENTRYP PFNGLFOGXOESPROC) (GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLFOGXVOESPROC) (GLenum pname, const GLfixed *param); >+typedef void (GL_APIENTRYP PFNGLFRUSTUMXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); >+typedef void (GL_APIENTRYP PFNGLGETCLIPPLANEXOESPROC) (GLenum plane, GLfixed *equation); >+typedef void (GL_APIENTRYP PFNGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXENVXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *param); >+typedef void (GL_APIENTRYP PFNGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLLINEWIDTHXOESPROC) (GLfixed width); >+typedef void (GL_APIENTRYP PFNGLLOADMATRIXXOESPROC) (const GLfixed *m); >+typedef void (GL_APIENTRYP PFNGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *param); >+typedef void (GL_APIENTRYP PFNGLMULTMATRIXXOESPROC) (const GLfixed *m); >+typedef void (GL_APIENTRYP PFNGLMULTITEXCOORD4XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); >+typedef void (GL_APIENTRYP PFNGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz); >+typedef void (GL_APIENTRYP PFNGLORTHOXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); >+typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLPOINTSIZEXOESPROC) (GLfixed size); >+typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units); >+typedef void (GL_APIENTRYP PFNGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); >+typedef void (GL_APIENTRYP PFNGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); >+typedef void (GL_APIENTRYP PFNGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); >+typedef void (GL_APIENTRYP PFNGLGETLIGHTXVOESPROC) (GLenum light, GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLGETMATERIALXVOESPROC) (GLenum face, GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERXOESPROC) (GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEXOESPROC) (GLclampx value, GLboolean invert); >+typedef void (GL_APIENTRYP PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glAlphaFuncxOES (GLenum func, GLfixed ref); >+GL_API void GL_APIENTRY glClearColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); >+GL_API void GL_APIENTRY glClearDepthxOES (GLfixed depth); >+GL_API void GL_APIENTRY glClipPlanexOES (GLenum plane, const GLfixed *equation); >+GL_API void GL_APIENTRY glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); >+GL_API void GL_APIENTRY glDepthRangexOES (GLfixed n, GLfixed f); >+GL_API void GL_APIENTRY glFogxOES (GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glFogxvOES (GLenum pname, const GLfixed *param); >+GL_API void GL_APIENTRY glFrustumxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); >+GL_API void GL_APIENTRY glGetClipPlanexOES (GLenum plane, GLfixed *equation); >+GL_API void GL_APIENTRY glGetFixedvOES (GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glGetTexEnvxvOES (GLenum target, GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glLightModelxOES (GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glLightModelxvOES (GLenum pname, const GLfixed *param); >+GL_API void GL_APIENTRY glLightxOES (GLenum light, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glLightxvOES (GLenum light, GLenum pname, const GLfixed *params); >+GL_API void GL_APIENTRY glLineWidthxOES (GLfixed width); >+GL_API void GL_APIENTRY glLoadMatrixxOES (const GLfixed *m); >+GL_API void GL_APIENTRY glMaterialxOES (GLenum face, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *param); >+GL_API void GL_APIENTRY glMultMatrixxOES (const GLfixed *m); >+GL_API void GL_APIENTRY glMultiTexCoord4xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); >+GL_API void GL_APIENTRY glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz); >+GL_API void GL_APIENTRY glOrthoxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); >+GL_API void GL_APIENTRY glPointParameterxvOES (GLenum pname, const GLfixed *params); >+GL_API void GL_APIENTRY glPointSizexOES (GLfixed size); >+GL_API void GL_APIENTRY glPolygonOffsetxOES (GLfixed factor, GLfixed units); >+GL_API void GL_APIENTRY glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); >+GL_API void GL_APIENTRY glScalexOES (GLfixed x, GLfixed y, GLfixed z); >+GL_API void GL_APIENTRY glTexEnvxOES (GLenum target, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params); >+GL_API void GL_APIENTRY glTexParameterxOES (GLenum target, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); >+GL_API void GL_APIENTRY glTranslatexOES (GLfixed x, GLfixed y, GLfixed z); >+GL_API void GL_APIENTRY glGetLightxvOES (GLenum light, GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glGetMaterialxvOES (GLenum face, GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glPointParameterxOES (GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glSampleCoveragexOES (GLclampx value, GLboolean invert); >+GL_API void GL_APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params); >+#endif >+#endif /* GL_OES_fixed_point */ >+ >+#ifndef GL_OES_framebuffer_object >+#define GL_OES_framebuffer_object 1 >+#define GL_NONE_OES 0 >+#define GL_FRAMEBUFFER_OES 0x8D40 >+#define GL_RENDERBUFFER_OES 0x8D41 >+#define GL_RGBA4_OES 0x8056 >+#define GL_RGB5_A1_OES 0x8057 >+#define GL_RGB565_OES 0x8D62 >+#define GL_DEPTH_COMPONENT16_OES 0x81A5 >+#define GL_RENDERBUFFER_WIDTH_OES 0x8D42 >+#define GL_RENDERBUFFER_HEIGHT_OES 0x8D43 >+#define GL_RENDERBUFFER_INTERNAL_FORMAT_OES 0x8D44 >+#define GL_RENDERBUFFER_RED_SIZE_OES 0x8D50 >+#define GL_RENDERBUFFER_GREEN_SIZE_OES 0x8D51 >+#define GL_RENDERBUFFER_BLUE_SIZE_OES 0x8D52 >+#define GL_RENDERBUFFER_ALPHA_SIZE_OES 0x8D53 >+#define GL_RENDERBUFFER_DEPTH_SIZE_OES 0x8D54 >+#define GL_RENDERBUFFER_STENCIL_SIZE_OES 0x8D55 >+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES 0x8CD0 >+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES 0x8CD1 >+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES 0x8CD2 >+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES 0x8CD3 >+#define GL_COLOR_ATTACHMENT0_OES 0x8CE0 >+#define GL_DEPTH_ATTACHMENT_OES 0x8D00 >+#define GL_STENCIL_ATTACHMENT_OES 0x8D20 >+#define GL_FRAMEBUFFER_COMPLETE_OES 0x8CD5 >+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES 0x8CD6 >+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES 0x8CD7 >+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES 0x8CD9 >+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES 0x8CDA >+#define GL_FRAMEBUFFER_UNSUPPORTED_OES 0x8CDD >+#define GL_FRAMEBUFFER_BINDING_OES 0x8CA6 >+#define GL_RENDERBUFFER_BINDING_OES 0x8CA7 >+#define GL_MAX_RENDERBUFFER_SIZE_OES 0x84E8 >+#define GL_INVALID_FRAMEBUFFER_OPERATION_OES 0x0506 >+typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFEROESPROC) (GLuint renderbuffer); >+typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFEROESPROC) (GLenum target, GLuint renderbuffer); >+typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSOESPROC) (GLsizei n, const GLuint *renderbuffers); >+typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSOESPROC) (GLsizei n, GLuint *renderbuffers); >+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVOESPROC) (GLenum target, GLenum pname, GLint *params); >+typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFEROESPROC) (GLuint framebuffer); >+typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFEROESPROC) (GLenum target, GLuint framebuffer); >+typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSOESPROC) (GLsizei n, const GLuint *framebuffers); >+typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSOESPROC) (GLsizei n, GLuint *framebuffers); >+typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSOESPROC) (GLenum target); >+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEROESPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); >+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); >+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPOESPROC) (GLenum target); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API GLboolean GL_APIENTRY glIsRenderbufferOES (GLuint renderbuffer); >+GL_API void GL_APIENTRY glBindRenderbufferOES (GLenum target, GLuint renderbuffer); >+GL_API void GL_APIENTRY glDeleteRenderbuffersOES (GLsizei n, const GLuint *renderbuffers); >+GL_API void GL_APIENTRY glGenRenderbuffersOES (GLsizei n, GLuint *renderbuffers); >+GL_API void GL_APIENTRY glRenderbufferStorageOES (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); >+GL_API void GL_APIENTRY glGetRenderbufferParameterivOES (GLenum target, GLenum pname, GLint *params); >+GL_API GLboolean GL_APIENTRY glIsFramebufferOES (GLuint framebuffer); >+GL_API void GL_APIENTRY glBindFramebufferOES (GLenum target, GLuint framebuffer); >+GL_API void GL_APIENTRY glDeleteFramebuffersOES (GLsizei n, const GLuint *framebuffers); >+GL_API void GL_APIENTRY glGenFramebuffersOES (GLsizei n, GLuint *framebuffers); >+GL_API GLenum GL_APIENTRY glCheckFramebufferStatusOES (GLenum target); >+GL_API void GL_APIENTRY glFramebufferRenderbufferOES (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); >+GL_API void GL_APIENTRY glFramebufferTexture2DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); >+GL_API void GL_APIENTRY glGetFramebufferAttachmentParameterivOES (GLenum target, GLenum attachment, GLenum pname, GLint *params); >+GL_API void GL_APIENTRY glGenerateMipmapOES (GLenum target); >+#endif >+#endif /* GL_OES_framebuffer_object */ >+ >+#ifndef GL_OES_mapbuffer >+#define GL_OES_mapbuffer 1 >+#define GL_WRITE_ONLY_OES 0x88B9 >+#define GL_BUFFER_ACCESS_OES 0x88BB >+#define GL_BUFFER_MAPPED_OES 0x88BC >+#define GL_BUFFER_MAP_POINTER_OES 0x88BD >+typedef void *(GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access); >+typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target); >+typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void **params); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void *GL_APIENTRY glMapBufferOES (GLenum target, GLenum access); >+GL_API GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target); >+GL_API void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, void **params); >+#endif >+#endif /* GL_OES_mapbuffer */ >+ >+#ifndef GL_OES_matrix_get >+#define GL_OES_matrix_get 1 >+#define GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES 0x898D >+#define GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES 0x898E >+#define GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES 0x898F >+#endif /* GL_OES_matrix_get */ >+ >+#ifndef GL_OES_matrix_palette >+#define GL_OES_matrix_palette 1 >+#define GL_MAX_VERTEX_UNITS_OES 0x86A4 >+#define GL_MAX_PALETTE_MATRICES_OES 0x8842 >+#define GL_MATRIX_PALETTE_OES 0x8840 >+#define GL_MATRIX_INDEX_ARRAY_OES 0x8844 >+#define GL_WEIGHT_ARRAY_OES 0x86AD >+#define GL_CURRENT_PALETTE_MATRIX_OES 0x8843 >+#define GL_MATRIX_INDEX_ARRAY_SIZE_OES 0x8846 >+#define GL_MATRIX_INDEX_ARRAY_TYPE_OES 0x8847 >+#define GL_MATRIX_INDEX_ARRAY_STRIDE_OES 0x8848 >+#define GL_MATRIX_INDEX_ARRAY_POINTER_OES 0x8849 >+#define GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES 0x8B9E >+#define GL_WEIGHT_ARRAY_SIZE_OES 0x86AB >+#define GL_WEIGHT_ARRAY_TYPE_OES 0x86A9 >+#define GL_WEIGHT_ARRAY_STRIDE_OES 0x86AA >+#define GL_WEIGHT_ARRAY_POINTER_OES 0x86AC >+#define GL_WEIGHT_ARRAY_BUFFER_BINDING_OES 0x889E >+typedef void (GL_APIENTRYP PFNGLCURRENTPALETTEMATRIXOESPROC) (GLuint matrixpaletteindex); >+typedef void (GL_APIENTRYP PFNGLLOADPALETTEFROMMODELVIEWMATRIXOESPROC) (void); >+typedef void (GL_APIENTRYP PFNGLMATRIXINDEXPOINTEROESPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); >+typedef void (GL_APIENTRYP PFNGLWEIGHTPOINTEROESPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glCurrentPaletteMatrixOES (GLuint matrixpaletteindex); >+GL_API void GL_APIENTRY glLoadPaletteFromModelViewMatrixOES (void); >+GL_API void GL_APIENTRY glMatrixIndexPointerOES (GLint size, GLenum type, GLsizei stride, const void *pointer); >+GL_API void GL_APIENTRY glWeightPointerOES (GLint size, GLenum type, GLsizei stride, const void *pointer); >+#endif >+#endif /* GL_OES_matrix_palette */ >+ >+#ifndef GL_OES_packed_depth_stencil >+#define GL_OES_packed_depth_stencil 1 >+#define GL_DEPTH_STENCIL_OES 0x84F9 >+#define GL_UNSIGNED_INT_24_8_OES 0x84FA >+#define GL_DEPTH24_STENCIL8_OES 0x88F0 >+#endif /* GL_OES_packed_depth_stencil */ >+ >+#ifndef GL_OES_query_matrix >+#define GL_OES_query_matrix 1 >+typedef GLbitfield (GL_APIENTRYP PFNGLQUERYMATRIXXOESPROC) (GLfixed *mantissa, GLint *exponent); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API GLbitfield GL_APIENTRY glQueryMatrixxOES (GLfixed *mantissa, GLint *exponent); >+#endif >+#endif /* GL_OES_query_matrix */ >+ >+#ifndef GL_OES_required_internalformat >+#define GL_OES_required_internalformat 1 >+#define GL_ALPHA8_OES 0x803C >+#define GL_LUMINANCE4_ALPHA4_OES 0x8043 >+#define GL_LUMINANCE8_ALPHA8_OES 0x8045 >+#define GL_LUMINANCE8_OES 0x8040 >+#define GL_RGB8_OES 0x8051 >+#define GL_RGBA8_OES 0x8058 >+#define GL_RGB10_EXT 0x8052 >+#define GL_RGB10_A2_EXT 0x8059 >+#endif /* GL_OES_required_internalformat */ >+ >+#ifndef GL_OES_rgb8_rgba8 >+#define GL_OES_rgb8_rgba8 1 >+#endif /* GL_OES_rgb8_rgba8 */ >+ >+#ifndef GL_OES_single_precision >+#define GL_OES_single_precision 1 >+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); >+typedef void (GL_APIENTRYP PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation); >+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); >+typedef void (GL_APIENTRYP PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); >+typedef void (GL_APIENTRYP PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat *equation); >+typedef void (GL_APIENTRYP PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glClearDepthfOES (GLclampf depth); >+GL_API void GL_APIENTRY glClipPlanefOES (GLenum plane, const GLfloat *equation); >+GL_API void GL_APIENTRY glDepthRangefOES (GLclampf n, GLclampf f); >+GL_API void GL_APIENTRY glFrustumfOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); >+GL_API void GL_APIENTRY glGetClipPlanefOES (GLenum plane, GLfloat *equation); >+GL_API void GL_APIENTRY glOrthofOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); >+#endif >+#endif /* GL_OES_single_precision */ >+ >+#ifndef GL_OES_stencil1 >+#define GL_OES_stencil1 1 >+#define GL_STENCIL_INDEX1_OES 0x8D46 >+#endif /* GL_OES_stencil1 */ >+ >+#ifndef GL_OES_stencil4 >+#define GL_OES_stencil4 1 >+#define GL_STENCIL_INDEX4_OES 0x8D47 >+#endif /* GL_OES_stencil4 */ >+ >+#ifndef GL_OES_stencil8 >+#define GL_OES_stencil8 1 >+#define GL_STENCIL_INDEX8_OES 0x8D48 >+#endif /* GL_OES_stencil8 */ >+ >+#ifndef GL_OES_stencil_wrap >+#define GL_OES_stencil_wrap 1 >+#define GL_INCR_WRAP_OES 0x8507 >+#define GL_DECR_WRAP_OES 0x8508 >+#endif /* GL_OES_stencil_wrap */ >+ >+#ifndef GL_OES_surfaceless_context >+#define GL_OES_surfaceless_context 1 >+#define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219 >+#endif /* GL_OES_surfaceless_context */ >+ >+#ifndef GL_OES_texture_cube_map >+#define GL_OES_texture_cube_map 1 >+#define GL_NORMAL_MAP_OES 0x8511 >+#define GL_REFLECTION_MAP_OES 0x8512 >+#define GL_TEXTURE_CUBE_MAP_OES 0x8513 >+#define GL_TEXTURE_BINDING_CUBE_MAP_OES 0x8514 >+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES 0x8515 >+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES 0x8516 >+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES 0x8517 >+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES 0x8518 >+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES 0x8519 >+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES 0x851A >+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES 0x851C >+#define GL_TEXTURE_GEN_MODE_OES 0x2500 >+#define GL_TEXTURE_GEN_STR_OES 0x8D60 >+typedef void (GL_APIENTRYP PFNGLTEXGENFOESPROC) (GLenum coord, GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLTEXGENFVOESPROC) (GLenum coord, GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLTEXGENIOESPROC) (GLenum coord, GLenum pname, GLint param); >+typedef void (GL_APIENTRYP PFNGLTEXGENIVOESPROC) (GLenum coord, GLenum pname, const GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXGENFVOESPROC) (GLenum coord, GLenum pname, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXGENIVOESPROC) (GLenum coord, GLenum pname, GLint *params); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glTexGenfOES (GLenum coord, GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glTexGenfvOES (GLenum coord, GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glTexGeniOES (GLenum coord, GLenum pname, GLint param); >+GL_API void GL_APIENTRY glTexGenivOES (GLenum coord, GLenum pname, const GLint *params); >+GL_API void GL_APIENTRY glGetTexGenfvOES (GLenum coord, GLenum pname, GLfloat *params); >+GL_API void GL_APIENTRY glGetTexGenivOES (GLenum coord, GLenum pname, GLint *params); >+#endif >+#endif /* GL_OES_texture_cube_map */ >+ >+#ifndef GL_OES_texture_env_crossbar >+#define GL_OES_texture_env_crossbar 1 >+#endif /* GL_OES_texture_env_crossbar */ >+ >+#ifndef GL_OES_texture_mirrored_repeat >+#define GL_OES_texture_mirrored_repeat 1 >+#define GL_MIRRORED_REPEAT_OES 0x8370 >+#endif /* GL_OES_texture_mirrored_repeat */ >+ >+#ifndef GL_OES_texture_npot >+#define GL_OES_texture_npot 1 >+#endif /* GL_OES_texture_npot */ >+ >+#ifndef GL_OES_vertex_array_object >+#define GL_OES_vertex_array_object 1 >+#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 >+typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array); >+typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays); >+typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays); >+typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glBindVertexArrayOES (GLuint array); >+GL_API void GL_APIENTRY glDeleteVertexArraysOES (GLsizei n, const GLuint *arrays); >+GL_API void GL_APIENTRY glGenVertexArraysOES (GLsizei n, GLuint *arrays); >+GL_API GLboolean GL_APIENTRY glIsVertexArrayOES (GLuint array); >+#endif >+#endif /* GL_OES_vertex_array_object */ >+ >+#ifndef GL_AMD_compressed_3DC_texture >+#define GL_AMD_compressed_3DC_texture 1 >+#define GL_3DC_X_AMD 0x87F9 >+#define GL_3DC_XY_AMD 0x87FA >+#endif /* GL_AMD_compressed_3DC_texture */ >+ >+#ifndef GL_AMD_compressed_ATC_texture >+#define GL_AMD_compressed_ATC_texture 1 >+#define GL_ATC_RGB_AMD 0x8C92 >+#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 >+#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE >+#endif /* GL_AMD_compressed_ATC_texture */ >+ >+#ifndef GL_APPLE_copy_texture_levels >+#define GL_APPLE_copy_texture_levels 1 >+typedef void (GL_APIENTRYP PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glCopyTextureLevelsAPPLE (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); >+#endif >+#endif /* GL_APPLE_copy_texture_levels */ >+ >+#ifndef GL_APPLE_framebuffer_multisample >+#define GL_APPLE_framebuffer_multisample 1 >+#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB >+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 >+#define GL_MAX_SAMPLES_APPLE 0x8D57 >+#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 >+#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 >+#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 >+#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA >+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); >+GL_API void GL_APIENTRY glResolveMultisampleFramebufferAPPLE (void); >+#endif >+#endif /* GL_APPLE_framebuffer_multisample */ >+ >+#ifndef GL_APPLE_sync >+#define GL_APPLE_sync 1 >+typedef struct __GLsync *GLsync; >+typedef khronos_uint64_t GLuint64; >+typedef khronos_int64_t GLint64; >+#define GL_SYNC_OBJECT_APPLE 0x8A53 >+#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 >+#define GL_OBJECT_TYPE_APPLE 0x9112 >+#define GL_SYNC_CONDITION_APPLE 0x9113 >+#define GL_SYNC_STATUS_APPLE 0x9114 >+#define GL_SYNC_FLAGS_APPLE 0x9115 >+#define GL_SYNC_FENCE_APPLE 0x9116 >+#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 >+#define GL_UNSIGNALED_APPLE 0x9118 >+#define GL_SIGNALED_APPLE 0x9119 >+#define GL_ALREADY_SIGNALED_APPLE 0x911A >+#define GL_TIMEOUT_EXPIRED_APPLE 0x911B >+#define GL_CONDITION_SATISFIED_APPLE 0x911C >+#define GL_WAIT_FAILED_APPLE 0x911D >+#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 >+#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull >+typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); >+typedef GLboolean (GL_APIENTRYP PFNGLISSYNCAPPLEPROC) (GLsync sync); >+typedef void (GL_APIENTRYP PFNGLDELETESYNCAPPLEPROC) (GLsync sync); >+typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); >+typedef void (GL_APIENTRYP PFNGLWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); >+typedef void (GL_APIENTRYP PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64 *params); >+typedef void (GL_APIENTRYP PFNGLGETSYNCIVAPPLEPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API GLsync GL_APIENTRY glFenceSyncAPPLE (GLenum condition, GLbitfield flags); >+GL_API GLboolean GL_APIENTRY glIsSyncAPPLE (GLsync sync); >+GL_API void GL_APIENTRY glDeleteSyncAPPLE (GLsync sync); >+GL_API GLenum GL_APIENTRY glClientWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); >+GL_API void GL_APIENTRY glWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); >+GL_API void GL_APIENTRY glGetInteger64vAPPLE (GLenum pname, GLint64 *params); >+GL_API void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); >+#endif >+#endif /* GL_APPLE_sync */ >+ >+#ifndef GL_APPLE_texture_2D_limited_npot >+#define GL_APPLE_texture_2D_limited_npot 1 >+#endif /* GL_APPLE_texture_2D_limited_npot */ >+ >+#ifndef GL_APPLE_texture_format_BGRA8888 >+#define GL_APPLE_texture_format_BGRA8888 1 >+#define GL_BGRA_EXT 0x80E1 >+#define GL_BGRA8_EXT 0x93A1 >+#endif /* GL_APPLE_texture_format_BGRA8888 */ >+ >+#ifndef GL_APPLE_texture_max_level >+#define GL_APPLE_texture_max_level 1 >+#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D >+#endif /* GL_APPLE_texture_max_level */ >+ >+#ifndef GL_ARM_rgba8 >+#define GL_ARM_rgba8 1 >+#endif /* GL_ARM_rgba8 */ >+ >+#ifndef GL_EXT_blend_minmax >+#define GL_EXT_blend_minmax 1 >+#define GL_MIN_EXT 0x8007 >+#define GL_MAX_EXT 0x8008 >+#endif /* GL_EXT_blend_minmax */ >+ >+#ifndef GL_EXT_debug_marker >+#define GL_EXT_debug_marker 1 >+typedef char GLchar; >+typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); >+typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); >+typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); >+GL_API void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); >+GL_API void GL_APIENTRY glPopGroupMarkerEXT (void); >+#endif >+#endif /* GL_EXT_debug_marker */ >+ >+#ifndef GL_EXT_discard_framebuffer >+#define GL_EXT_discard_framebuffer 1 >+#define GL_COLOR_EXT 0x1800 >+#define GL_DEPTH_EXT 0x1801 >+#define GL_STENCIL_EXT 0x1802 >+typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments); >+#endif >+#endif /* GL_EXT_discard_framebuffer */ >+ >+#ifndef GL_EXT_map_buffer_range >+#define GL_EXT_map_buffer_range 1 >+#define GL_MAP_READ_BIT_EXT 0x0001 >+#define GL_MAP_WRITE_BIT_EXT 0x0002 >+#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 >+#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 >+#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 >+#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 >+typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); >+typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void *GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); >+GL_API void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length); >+#endif >+#endif /* GL_EXT_map_buffer_range */ >+ >+#ifndef GL_EXT_multi_draw_arrays >+#define GL_EXT_multi_draw_arrays 1 >+typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); >+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); >+GL_API void GL_APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); >+#endif >+#endif /* GL_EXT_multi_draw_arrays */ >+ >+#ifndef GL_EXT_multisampled_render_to_texture >+#define GL_EXT_multisampled_render_to_texture 1 >+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C >+#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB >+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 >+#define GL_MAX_SAMPLES_EXT 0x8D57 >+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); >+GL_API void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); >+#endif >+#endif /* GL_EXT_multisampled_render_to_texture */ >+ >+#ifndef GL_EXT_read_format_bgra >+#define GL_EXT_read_format_bgra 1 >+#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 >+#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 >+#endif /* GL_EXT_read_format_bgra */ >+ >+#ifndef GL_EXT_robustness >+#define GL_EXT_robustness 1 >+#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 >+#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254 >+#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255 >+#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3 >+#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256 >+#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252 >+#define GL_NO_RESET_NOTIFICATION_EXT 0x8261 >+typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void); >+typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); >+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void); >+GL_API void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); >+GL_API void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); >+GL_API void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params); >+#endif >+#endif /* GL_EXT_robustness */ >+ >+#ifndef GL_EXT_sRGB >+#define GL_EXT_sRGB 1 >+#define GL_SRGB_EXT 0x8C40 >+#define GL_SRGB_ALPHA_EXT 0x8C42 >+#define GL_SRGB8_ALPHA8_EXT 0x8C43 >+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 >+#endif /* GL_EXT_sRGB */ >+ >+#ifndef GL_EXT_texture_compression_dxt1 >+#define GL_EXT_texture_compression_dxt1 1 >+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 >+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 >+#endif /* GL_EXT_texture_compression_dxt1 */ >+ >+#ifndef GL_EXT_texture_filter_anisotropic >+#define GL_EXT_texture_filter_anisotropic 1 >+#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE >+#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF >+#endif /* GL_EXT_texture_filter_anisotropic */ >+ >+#ifndef GL_EXT_texture_format_BGRA8888 >+#define GL_EXT_texture_format_BGRA8888 1 >+#endif /* GL_EXT_texture_format_BGRA8888 */ >+ >+#ifndef GL_EXT_texture_lod_bias >+#define GL_EXT_texture_lod_bias 1 >+#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD >+#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 >+#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 >+#endif /* GL_EXT_texture_lod_bias */ >+ >+#ifndef GL_EXT_texture_storage >+#define GL_EXT_texture_storage 1 >+#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F >+#define GL_ALPHA8_EXT 0x803C >+#define GL_LUMINANCE8_EXT 0x8040 >+#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 >+#define GL_RGBA32F_EXT 0x8814 >+#define GL_RGB32F_EXT 0x8815 >+#define GL_ALPHA32F_EXT 0x8816 >+#define GL_LUMINANCE32F_EXT 0x8818 >+#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 >+#define GL_RGBA16F_EXT 0x881A >+#define GL_RGB16F_EXT 0x881B >+#define GL_ALPHA16F_EXT 0x881C >+#define GL_LUMINANCE16F_EXT 0x881E >+#define GL_LUMINANCE_ALPHA16F_EXT 0x881F >+#define GL_R8_EXT 0x8229 >+#define GL_RG8_EXT 0x822B >+#define GL_R32F_EXT 0x822E >+#define GL_RG32F_EXT 0x8230 >+#define GL_R16F_EXT 0x822D >+#define GL_RG16F_EXT 0x822F >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); >+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); >+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); >+GL_API void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); >+GL_API void GL_APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); >+GL_API void GL_APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); >+GL_API void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); >+GL_API void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); >+#endif >+#endif /* GL_EXT_texture_storage */ >+ >+#ifndef GL_IMG_multisampled_render_to_texture >+#define GL_IMG_multisampled_render_to_texture 1 >+#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133 >+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134 >+#define GL_MAX_SAMPLES_IMG 0x9135 >+#define GL_TEXTURE_SAMPLES_IMG 0x9136 >+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); >+GL_API void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); >+#endif >+#endif /* GL_IMG_multisampled_render_to_texture */ >+ >+#ifndef GL_IMG_read_format >+#define GL_IMG_read_format 1 >+#define GL_BGRA_IMG 0x80E1 >+#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365 >+#endif /* GL_IMG_read_format */ >+ >+#ifndef GL_IMG_texture_compression_pvrtc >+#define GL_IMG_texture_compression_pvrtc 1 >+#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 >+#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 >+#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 >+#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 >+#endif /* GL_IMG_texture_compression_pvrtc */ >+ >+#ifndef GL_IMG_texture_env_enhanced_fixed_function >+#define GL_IMG_texture_env_enhanced_fixed_function 1 >+#define GL_MODULATE_COLOR_IMG 0x8C04 >+#define GL_RECIP_ADD_SIGNED_ALPHA_IMG 0x8C05 >+#define GL_TEXTURE_ALPHA_MODULATE_IMG 0x8C06 >+#define GL_FACTOR_ALPHA_MODULATE_IMG 0x8C07 >+#define GL_FRAGMENT_ALPHA_MODULATE_IMG 0x8C08 >+#define GL_ADD_BLEND_IMG 0x8C09 >+#define GL_DOT3_RGBA_IMG 0x86AF >+#endif /* GL_IMG_texture_env_enhanced_fixed_function */ >+ >+#ifndef GL_IMG_user_clip_plane >+#define GL_IMG_user_clip_plane 1 >+#define GL_CLIP_PLANE0_IMG 0x3000 >+#define GL_CLIP_PLANE1_IMG 0x3001 >+#define GL_CLIP_PLANE2_IMG 0x3002 >+#define GL_CLIP_PLANE3_IMG 0x3003 >+#define GL_CLIP_PLANE4_IMG 0x3004 >+#define GL_CLIP_PLANE5_IMG 0x3005 >+#define GL_MAX_CLIP_PLANES_IMG 0x0D32 >+typedef void (GL_APIENTRYP PFNGLCLIPPLANEFIMGPROC) (GLenum p, const GLfloat *eqn); >+typedef void (GL_APIENTRYP PFNGLCLIPPLANEXIMGPROC) (GLenum p, const GLfixed *eqn); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glClipPlanefIMG (GLenum p, const GLfloat *eqn); >+GL_API void GL_APIENTRY glClipPlanexIMG (GLenum p, const GLfixed *eqn); >+#endif >+#endif /* GL_IMG_user_clip_plane */ >+ >+#ifndef GL_NV_fence >+#define GL_NV_fence 1 >+#define GL_ALL_COMPLETED_NV 0x84F2 >+#define GL_FENCE_STATUS_NV 0x84F3 >+#define GL_FENCE_CONDITION_NV 0x84F4 >+typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); >+typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); >+typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); >+typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); >+typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); >+typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); >+GL_API void GL_APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); >+GL_API GLboolean GL_APIENTRY glIsFenceNV (GLuint fence); >+GL_API GLboolean GL_APIENTRY glTestFenceNV (GLuint fence); >+GL_API void GL_APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); >+GL_API void GL_APIENTRY glFinishFenceNV (GLuint fence); >+GL_API void GL_APIENTRY glSetFenceNV (GLuint fence, GLenum condition); >+#endif >+#endif /* GL_NV_fence */ >+ >+#ifndef GL_QCOM_driver_control >+#define GL_QCOM_driver_control 1 >+typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls); >+typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); >+typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); >+typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls); >+GL_API void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); >+GL_API void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl); >+GL_API void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl); >+#endif >+#endif /* GL_QCOM_driver_control */ >+ >+#ifndef GL_QCOM_extended_get >+#define GL_QCOM_extended_get 1 >+#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 >+#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 >+#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 >+#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 >+#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 >+#define GL_TEXTURE_TYPE_QCOM 0x8BD7 >+#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 >+#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 >+#define GL_TEXTURE_TARGET_QCOM 0x8BDA >+#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB >+#define GL_STATE_RESTORE 0x8BDC >+typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures); >+typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); >+typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); >+typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); >+typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); >+typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); >+typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void **params); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures); >+GL_API void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); >+GL_API void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); >+GL_API void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); >+GL_API void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); >+GL_API void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param); >+GL_API void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); >+GL_API void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, void **params); >+#endif >+#endif /* GL_QCOM_extended_get */ >+ >+#ifndef GL_QCOM_extended_get2 >+#define GL_QCOM_extended_get2 1 >+typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders); >+typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms); >+typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); >+typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders); >+GL_API void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms); >+GL_API GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program); >+GL_API void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length); >+#endif >+#endif /* GL_QCOM_extended_get2 */ >+ >+#ifndef GL_QCOM_perfmon_global_mode >+#define GL_QCOM_perfmon_global_mode 1 >+#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 >+#endif /* GL_QCOM_perfmon_global_mode */ >+ >+#ifndef GL_QCOM_tiled_rendering >+#define GL_QCOM_tiled_rendering 1 >+#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 >+#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 >+#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 >+#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 >+#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 >+#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 >+#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 >+#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 >+#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 >+#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 >+#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 >+#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 >+#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 >+#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 >+#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 >+#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 >+#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 >+#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 >+#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 >+#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 >+#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 >+#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 >+#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 >+#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 >+#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 >+#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 >+#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 >+#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 >+#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 >+#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 >+#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 >+#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 >+typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); >+typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); >+GL_API void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask); >+#endif >+#endif /* GL_QCOM_tiled_rendering */ >+ >+#ifndef GL_QCOM_writeonly_rendering >+#define GL_QCOM_writeonly_rendering 1 >+#define GL_WRITEONLY_RENDERING_QCOM 0x8823 >+#endif /* GL_QCOM_writeonly_rendering */ >+ >+/* ANGLE GLES1 extensions */ >+#include "glext_angle.h" >+ >+#ifdef __cplusplus >+} >+#endif >+ >+#endif >diff --git a/Source/ThirdParty/ANGLE/include/GLES/glext_angle.h b/Source/ThirdParty/ANGLE/include/GLES/glext_angle.h >new file mode 100644 >index 00000000000..2f8ae9208d8 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/GLES/glext_angle.h >@@ -0,0 +1,23 @@ >+// >+// Copyright (c) 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. >+// >+// glext_angle.h: ANGLE modifications to the glext.h header file. >+// Currently we don't include this file directly, we patch glext.h >+// to include it implicitly so it is visible throughout our code. >+ >+#ifndef INCLUDE_GLES_GLEXT_ANGLE_H_ >+#define INCLUDE_GLES_GLEXT_ANGLE_H_ >+ >+// clang-format off >+ >+#ifndef GL_ANGLE_explicit_context_gles1 >+#define GL_ANGLE_explicit_context_gles1 >+typedef void *GLeglContext; >+#include "glext_explicit_context_autogen.inc" >+#endif /* GL_ANGLE_explicit_context_gles1 */ >+ >+// clang-format on >+ >+#endif // INCLUDE_GLES_GLEXT_ANGLE_H_ >diff --git a/Source/ThirdParty/ANGLE/include/GLES/glext_explicit_context_autogen.inc b/Source/ThirdParty/ANGLE/include/GLES/glext_explicit_context_autogen.inc >new file mode 100644 >index 00000000000..c1f0c21d409 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/GLES/glext_explicit_context_autogen.inc >@@ -0,0 +1,260 @@ >+// GENERATED FILE - DO NOT EDIT. >+// Generated by generate_entry_points.py using data from gl.xml and gl_angle_ext.xml. >+// >+// 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. >+// >+// glext_explicit_context_autogen.inc: >+// Function declarations for the EGL_ANGLE_explicit_context extension >+ >+typedef void (GL_APIENTRYP PFNGLALPHAFUNCCONTEXTANGLEPROC)(GLeglContext ctx, GLenum func, GLfloat ref); >+typedef void (GL_APIENTRYP PFNGLALPHAFUNCXCONTEXTANGLEPROC)(GLeglContext ctx, GLenum func, GLfixed ref); >+typedef void (GL_APIENTRYP PFNGLCLEARCOLORXCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); >+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHXCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed depth); >+typedef void (GL_APIENTRYP PFNGLCLIENTACTIVETEXTURECONTEXTANGLEPROC)(GLeglContext ctx, GLenum texture); >+typedef void (GL_APIENTRYP PFNGLCLIPPLANEFCONTEXTANGLEPROC)(GLeglContext ctx, GLenum p, const GLfloat *eqn); >+typedef void (GL_APIENTRYP PFNGLCLIPPLANEXCONTEXTANGLEPROC)(GLeglContext ctx, GLenum plane, const GLfixed *equation); >+typedef void (GL_APIENTRYP PFNGLCOLOR4FCONTEXTANGLEPROC)(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); >+typedef void (GL_APIENTRYP PFNGLCOLOR4UBCONTEXTANGLEPROC)(GLeglContext ctx, GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); >+typedef void (GL_APIENTRYP PFNGLCOLOR4XCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); >+typedef void (GL_APIENTRYP PFNGLCOLORPOINTERCONTEXTANGLEPROC)(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer); >+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEXCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed n, GLfixed f); >+typedef void (GL_APIENTRYP PFNGLDISABLECLIENTSTATECONTEXTANGLEPROC)(GLeglContext ctx, GLenum array); >+typedef void (GL_APIENTRYP PFNGLENABLECLIENTSTATECONTEXTANGLEPROC)(GLeglContext ctx, GLenum array); >+typedef void (GL_APIENTRYP PFNGLFOGFCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLFOGFVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLFOGXCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLFOGXVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, const GLfixed *param); >+typedef void (GL_APIENTRYP PFNGLFRUSTUMFCONTEXTANGLEPROC)(GLeglContext ctx, GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); >+typedef void (GL_APIENTRYP PFNGLFRUSTUMXCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); >+typedef void (GL_APIENTRYP PFNGLGETCLIPPLANEFCONTEXTANGLEPROC)(GLeglContext ctx, GLenum plane, GLfloat *equation); >+typedef void (GL_APIENTRYP PFNGLGETCLIPPLANEXCONTEXTANGLEPROC)(GLeglContext ctx, GLenum plane, GLfixed *equation); >+typedef void (GL_APIENTRYP PFNGLGETFIXEDVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLGETLIGHTFVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum light, GLenum pname, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETLIGHTXVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum light, GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLGETMATERIALFVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum face, GLenum pname, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETMATERIALXVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum face, GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLGETPOINTERVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, void **params); >+typedef void (GL_APIENTRYP PFNGLGETTEXENVFVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXENVIVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXENVXVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERXVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLLIGHTMODELFCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLLIGHTMODELFVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLLIGHTMODELXCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLLIGHTMODELXVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, const GLfixed *param); >+typedef void (GL_APIENTRYP PFNGLLIGHTFCONTEXTANGLEPROC)(GLeglContext ctx, GLenum light, GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLLIGHTFVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum light, GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLLIGHTXCONTEXTANGLEPROC)(GLeglContext ctx, GLenum light, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLLIGHTXVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum light, GLenum pname, const GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLLINEWIDTHXCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed width); >+typedef void (GL_APIENTRYP PFNGLLOADIDENTITYCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef void (GL_APIENTRYP PFNGLLOADMATRIXFCONTEXTANGLEPROC)(GLeglContext ctx, const GLfloat *m); >+typedef void (GL_APIENTRYP PFNGLLOADMATRIXXCONTEXTANGLEPROC)(GLeglContext ctx, const GLfixed *m); >+typedef void (GL_APIENTRYP PFNGLLOGICOPCONTEXTANGLEPROC)(GLeglContext ctx, GLenum opcode); >+typedef void (GL_APIENTRYP PFNGLMATERIALFCONTEXTANGLEPROC)(GLeglContext ctx, GLenum face, GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLMATERIALFVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum face, GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLMATERIALXCONTEXTANGLEPROC)(GLeglContext ctx, GLenum face, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLMATERIALXVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum face, GLenum pname, const GLfixed *param); >+typedef void (GL_APIENTRYP PFNGLMATRIXMODECONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode); >+typedef void (GL_APIENTRYP PFNGLMULTMATRIXFCONTEXTANGLEPROC)(GLeglContext ctx, const GLfloat *m); >+typedef void (GL_APIENTRYP PFNGLMULTMATRIXXCONTEXTANGLEPROC)(GLeglContext ctx, const GLfixed *m); >+typedef void (GL_APIENTRYP PFNGLMULTITEXCOORD4FCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); >+typedef void (GL_APIENTRYP PFNGLMULTITEXCOORD4XCONTEXTANGLEPROC)(GLeglContext ctx, GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); >+typedef void (GL_APIENTRYP PFNGLNORMAL3FCONTEXTANGLEPROC)(GLeglContext ctx, GLfloat nx, GLfloat ny, GLfloat nz); >+typedef void (GL_APIENTRYP PFNGLNORMAL3XCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed nx, GLfixed ny, GLfixed nz); >+typedef void (GL_APIENTRYP PFNGLNORMALPOINTERCONTEXTANGLEPROC)(GLeglContext ctx, GLenum type, GLsizei stride, const void *pointer); >+typedef void (GL_APIENTRYP PFNGLORTHOFCONTEXTANGLEPROC)(GLeglContext ctx, GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); >+typedef void (GL_APIENTRYP PFNGLORTHOXCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); >+typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERFCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERFVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERXCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERXVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, const GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLPOINTSIZECONTEXTANGLEPROC)(GLeglContext ctx, GLfloat size); >+typedef void (GL_APIENTRYP PFNGLPOINTSIZEXCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed size); >+typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETXCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed factor, GLfixed units); >+typedef void (GL_APIENTRYP PFNGLPOPMATRIXCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef void (GL_APIENTRYP PFNGLPUSHMATRIXCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef void (GL_APIENTRYP PFNGLROTATEFCONTEXTANGLEPROC)(GLeglContext ctx, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); >+typedef void (GL_APIENTRYP PFNGLROTATEXCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed angle, GLfixed x, GLfixed y, GLfixed z); >+typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEXCONTEXTANGLEPROC)(GLeglContext ctx, GLclampx value, GLboolean invert); >+typedef void (GL_APIENTRYP PFNGLSCALEFCONTEXTANGLEPROC)(GLeglContext ctx, GLfloat x, GLfloat y, GLfloat z); >+typedef void (GL_APIENTRYP PFNGLSCALEXCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z); >+typedef void (GL_APIENTRYP PFNGLSHADEMODELCONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode); >+typedef void (GL_APIENTRYP PFNGLTEXCOORDPOINTERCONTEXTANGLEPROC)(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer); >+typedef void (GL_APIENTRYP PFNGLTEXENVFCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLTEXENVFVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLTEXENVICONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint param); >+typedef void (GL_APIENTRYP PFNGLTEXENVIVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, const GLint *params); >+typedef void (GL_APIENTRYP PFNGLTEXENVXCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLTEXENVXVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, const GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERXCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERXVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, const GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLTRANSLATEFCONTEXTANGLEPROC)(GLeglContext ctx, GLfloat x, GLfloat y, GLfloat z); >+typedef void (GL_APIENTRYP PFNGLTRANSLATEXCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z); >+typedef void (GL_APIENTRYP PFNGLVERTEXPOINTERCONTEXTANGLEPROC)(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer); >+typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFEROESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint framebuffer); >+typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFEROESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint renderbuffer); >+typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target); >+typedef void (GL_APIENTRYP PFNGLCURRENTPALETTEMATRIXOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint matrixpaletteindex); >+typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSOESCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *framebuffers); >+typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSOESCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *renderbuffers); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXFOESCONTEXTANGLEPROC)(GLeglContext ctx, GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXFVOESCONTEXTANGLEPROC)(GLeglContext ctx, const GLfloat *coords); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXIOESCONTEXTANGLEPROC)(GLeglContext ctx, GLint x, GLint y, GLint z, GLint width, GLint height); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXIVOESCONTEXTANGLEPROC)(GLeglContext ctx, const GLint *coords); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXSOESCONTEXTANGLEPROC)(GLeglContext ctx, GLshort x, GLshort y, GLshort z, GLshort width, GLshort height); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXSVOESCONTEXTANGLEPROC)(GLeglContext ctx, const GLshort *coords); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXXOESCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height); >+typedef void (GL_APIENTRYP PFNGLDRAWTEXXVOESCONTEXTANGLEPROC)(GLeglContext ctx, const GLfixed *coords); >+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEROESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); >+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); >+typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSOESCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *framebuffers); >+typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSOESCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *renderbuffers); >+typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target); >+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum attachment, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXGENFVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum coord, GLenum pname, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXGENIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum coord, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXGENXVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum coord, GLenum pname, GLfixed *params); >+typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFEROESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint framebuffer); >+typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFEROESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint renderbuffer); >+typedef void (GL_APIENTRYP PFNGLLOADPALETTEFROMMODELVIEWMATRIXOESCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef void (GL_APIENTRYP PFNGLMATRIXINDEXPOINTEROESCONTEXTANGLEPROC)(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer); >+typedef void (GL_APIENTRYP PFNGLPOINTSIZEPOINTEROESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum type, GLsizei stride, const void *pointer); >+typedef GLbitfield (GL_APIENTRYP PFNGLQUERYMATRIXXOESCONTEXTANGLEPROC)(GLeglContext ctx, GLfixed *mantissa, GLint *exponent); >+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum internalformat, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLTEXGENFOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum coord, GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLTEXGENFVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum coord, GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLTEXGENIOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum coord, GLenum pname, GLint param); >+typedef void (GL_APIENTRYP PFNGLTEXGENIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum coord, GLenum pname, const GLint *params); >+typedef void (GL_APIENTRYP PFNGLTEXGENXOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum coord, GLenum pname, GLfixed param); >+typedef void (GL_APIENTRYP PFNGLTEXGENXVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum coord, GLenum pname, const GLfixed *params); >+typedef void (GL_APIENTRYP PFNGLWEIGHTPOINTEROESCONTEXTANGLEPROC)(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_API void GL_APIENTRY glAlphaFuncContextANGLE(GLeglContext ctx, GLenum func, GLfloat ref); >+GL_API void GL_APIENTRY glAlphaFuncxContextANGLE(GLeglContext ctx, GLenum func, GLfixed ref); >+GL_API void GL_APIENTRY glClearColorxContextANGLE(GLeglContext ctx, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); >+GL_API void GL_APIENTRY glClearDepthxContextANGLE(GLeglContext ctx, GLfixed depth); >+GL_API void GL_APIENTRY glClientActiveTextureContextANGLE(GLeglContext ctx, GLenum texture); >+GL_API void GL_APIENTRY glClipPlanefContextANGLE(GLeglContext ctx, GLenum p, const GLfloat *eqn); >+GL_API void GL_APIENTRY glClipPlanexContextANGLE(GLeglContext ctx, GLenum plane, const GLfixed *equation); >+GL_API void GL_APIENTRY glColor4fContextANGLE(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); >+GL_API void GL_APIENTRY glColor4ubContextANGLE(GLeglContext ctx, GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); >+GL_API void GL_APIENTRY glColor4xContextANGLE(GLeglContext ctx, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); >+GL_API void GL_APIENTRY glColorPointerContextANGLE(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer); >+GL_API void GL_APIENTRY glDepthRangexContextANGLE(GLeglContext ctx, GLfixed n, GLfixed f); >+GL_API void GL_APIENTRY glDisableClientStateContextANGLE(GLeglContext ctx, GLenum array); >+GL_API void GL_APIENTRY glEnableClientStateContextANGLE(GLeglContext ctx, GLenum array); >+GL_API void GL_APIENTRY glFogfContextANGLE(GLeglContext ctx, GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glFogfvContextANGLE(GLeglContext ctx, GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glFogxContextANGLE(GLeglContext ctx, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glFogxvContextANGLE(GLeglContext ctx, GLenum pname, const GLfixed *param); >+GL_API void GL_APIENTRY glFrustumfContextANGLE(GLeglContext ctx, GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); >+GL_API void GL_APIENTRY glFrustumxContextANGLE(GLeglContext ctx, GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); >+GL_API void GL_APIENTRY glGetClipPlanefContextANGLE(GLeglContext ctx, GLenum plane, GLfloat *equation); >+GL_API void GL_APIENTRY glGetClipPlanexContextANGLE(GLeglContext ctx, GLenum plane, GLfixed *equation); >+GL_API void GL_APIENTRY glGetFixedvContextANGLE(GLeglContext ctx, GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glGetLightfvContextANGLE(GLeglContext ctx, GLenum light, GLenum pname, GLfloat *params); >+GL_API void GL_APIENTRY glGetLightxvContextANGLE(GLeglContext ctx, GLenum light, GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glGetMaterialfvContextANGLE(GLeglContext ctx, GLenum face, GLenum pname, GLfloat *params); >+GL_API void GL_APIENTRY glGetMaterialxvContextANGLE(GLeglContext ctx, GLenum face, GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glGetPointervContextANGLE(GLeglContext ctx, GLenum pname, void **params); >+GL_API void GL_APIENTRY glGetTexEnvfvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfloat *params); >+GL_API void GL_APIENTRY glGetTexEnvivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+GL_API void GL_APIENTRY glGetTexEnvxvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glGetTexParameterxvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfixed *params); >+GL_API void GL_APIENTRY glLightModelfContextANGLE(GLeglContext ctx, GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glLightModelfvContextANGLE(GLeglContext ctx, GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glLightModelxContextANGLE(GLeglContext ctx, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glLightModelxvContextANGLE(GLeglContext ctx, GLenum pname, const GLfixed *param); >+GL_API void GL_APIENTRY glLightfContextANGLE(GLeglContext ctx, GLenum light, GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glLightfvContextANGLE(GLeglContext ctx, GLenum light, GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glLightxContextANGLE(GLeglContext ctx, GLenum light, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glLightxvContextANGLE(GLeglContext ctx, GLenum light, GLenum pname, const GLfixed *params); >+GL_API void GL_APIENTRY glLineWidthxContextANGLE(GLeglContext ctx, GLfixed width); >+GL_API void GL_APIENTRY glLoadIdentityContextANGLE(GLeglContext ctx); >+GL_API void GL_APIENTRY glLoadMatrixfContextANGLE(GLeglContext ctx, const GLfloat *m); >+GL_API void GL_APIENTRY glLoadMatrixxContextANGLE(GLeglContext ctx, const GLfixed *m); >+GL_API void GL_APIENTRY glLogicOpContextANGLE(GLeglContext ctx, GLenum opcode); >+GL_API void GL_APIENTRY glMaterialfContextANGLE(GLeglContext ctx, GLenum face, GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glMaterialfvContextANGLE(GLeglContext ctx, GLenum face, GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glMaterialxContextANGLE(GLeglContext ctx, GLenum face, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glMaterialxvContextANGLE(GLeglContext ctx, GLenum face, GLenum pname, const GLfixed *param); >+GL_API void GL_APIENTRY glMatrixModeContextANGLE(GLeglContext ctx, GLenum mode); >+GL_API void GL_APIENTRY glMultMatrixfContextANGLE(GLeglContext ctx, const GLfloat *m); >+GL_API void GL_APIENTRY glMultMatrixxContextANGLE(GLeglContext ctx, const GLfixed *m); >+GL_API void GL_APIENTRY glMultiTexCoord4fContextANGLE(GLeglContext ctx, GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); >+GL_API void GL_APIENTRY glMultiTexCoord4xContextANGLE(GLeglContext ctx, GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); >+GL_API void GL_APIENTRY glNormal3fContextANGLE(GLeglContext ctx, GLfloat nx, GLfloat ny, GLfloat nz); >+GL_API void GL_APIENTRY glNormal3xContextANGLE(GLeglContext ctx, GLfixed nx, GLfixed ny, GLfixed nz); >+GL_API void GL_APIENTRY glNormalPointerContextANGLE(GLeglContext ctx, GLenum type, GLsizei stride, const void *pointer); >+GL_API void GL_APIENTRY glOrthofContextANGLE(GLeglContext ctx, GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); >+GL_API void GL_APIENTRY glOrthoxContextANGLE(GLeglContext ctx, GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); >+GL_API void GL_APIENTRY glPointParameterfContextANGLE(GLeglContext ctx, GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glPointParameterfvContextANGLE(GLeglContext ctx, GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glPointParameterxContextANGLE(GLeglContext ctx, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glPointParameterxvContextANGLE(GLeglContext ctx, GLenum pname, const GLfixed *params); >+GL_API void GL_APIENTRY glPointSizeContextANGLE(GLeglContext ctx, GLfloat size); >+GL_API void GL_APIENTRY glPointSizexContextANGLE(GLeglContext ctx, GLfixed size); >+GL_API void GL_APIENTRY glPolygonOffsetxContextANGLE(GLeglContext ctx, GLfixed factor, GLfixed units); >+GL_API void GL_APIENTRY glPopMatrixContextANGLE(GLeglContext ctx); >+GL_API void GL_APIENTRY glPushMatrixContextANGLE(GLeglContext ctx); >+GL_API void GL_APIENTRY glRotatefContextANGLE(GLeglContext ctx, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); >+GL_API void GL_APIENTRY glRotatexContextANGLE(GLeglContext ctx, GLfixed angle, GLfixed x, GLfixed y, GLfixed z); >+GL_API void GL_APIENTRY glSampleCoveragexContextANGLE(GLeglContext ctx, GLclampx value, GLboolean invert); >+GL_API void GL_APIENTRY glScalefContextANGLE(GLeglContext ctx, GLfloat x, GLfloat y, GLfloat z); >+GL_API void GL_APIENTRY glScalexContextANGLE(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z); >+GL_API void GL_APIENTRY glShadeModelContextANGLE(GLeglContext ctx, GLenum mode); >+GL_API void GL_APIENTRY glTexCoordPointerContextANGLE(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer); >+GL_API void GL_APIENTRY glTexEnvfContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glTexEnvfvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glTexEnviContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint param); >+GL_API void GL_APIENTRY glTexEnvivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLint *params); >+GL_API void GL_APIENTRY glTexEnvxContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glTexEnvxvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLfixed *params); >+GL_API void GL_APIENTRY glTexParameterxContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glTexParameterxvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLfixed *params); >+GL_API void GL_APIENTRY glTranslatefContextANGLE(GLeglContext ctx, GLfloat x, GLfloat y, GLfloat z); >+GL_API void GL_APIENTRY glTranslatexContextANGLE(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z); >+GL_API void GL_APIENTRY glVertexPointerContextANGLE(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer); >+GL_API void GL_APIENTRY glBindFramebufferOESContextANGLE(GLeglContext ctx, GLenum target, GLuint framebuffer); >+GL_API void GL_APIENTRY glBindRenderbufferOESContextANGLE(GLeglContext ctx, GLenum target, GLuint renderbuffer); >+GL_API GLenum GL_APIENTRY glCheckFramebufferStatusOESContextANGLE(GLeglContext ctx, GLenum target); >+GL_API void GL_APIENTRY glCurrentPaletteMatrixOESContextANGLE(GLeglContext ctx, GLuint matrixpaletteindex); >+GL_API void GL_APIENTRY glDeleteFramebuffersOESContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *framebuffers); >+GL_API void GL_APIENTRY glDeleteRenderbuffersOESContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *renderbuffers); >+GL_API void GL_APIENTRY glDrawTexfOESContextANGLE(GLeglContext ctx, GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height); >+GL_API void GL_APIENTRY glDrawTexfvOESContextANGLE(GLeglContext ctx, const GLfloat *coords); >+GL_API void GL_APIENTRY glDrawTexiOESContextANGLE(GLeglContext ctx, GLint x, GLint y, GLint z, GLint width, GLint height); >+GL_API void GL_APIENTRY glDrawTexivOESContextANGLE(GLeglContext ctx, const GLint *coords); >+GL_API void GL_APIENTRY glDrawTexsOESContextANGLE(GLeglContext ctx, GLshort x, GLshort y, GLshort z, GLshort width, GLshort height); >+GL_API void GL_APIENTRY glDrawTexsvOESContextANGLE(GLeglContext ctx, const GLshort *coords); >+GL_API void GL_APIENTRY glDrawTexxOESContextANGLE(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height); >+GL_API void GL_APIENTRY glDrawTexxvOESContextANGLE(GLeglContext ctx, const GLfixed *coords); >+GL_API void GL_APIENTRY glFramebufferRenderbufferOESContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); >+GL_API void GL_APIENTRY glFramebufferTexture2DOESContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); >+GL_API void GL_APIENTRY glGenFramebuffersOESContextANGLE(GLeglContext ctx, GLsizei n, GLuint *framebuffers); >+GL_API void GL_APIENTRY glGenRenderbuffersOESContextANGLE(GLeglContext ctx, GLsizei n, GLuint *renderbuffers); >+GL_API void GL_APIENTRY glGenerateMipmapOESContextANGLE(GLeglContext ctx, GLenum target); >+GL_API void GL_APIENTRY glGetFramebufferAttachmentParameterivOESContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLenum pname, GLint *params); >+GL_API void GL_APIENTRY glGetRenderbufferParameterivOESContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+GL_API void GL_APIENTRY glGetTexGenfvOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLfloat *params); >+GL_API void GL_APIENTRY glGetTexGenivOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLint *params); >+GL_API void GL_APIENTRY glGetTexGenxvOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLfixed *params); >+GL_API GLboolean GL_APIENTRY glIsFramebufferOESContextANGLE(GLeglContext ctx, GLuint framebuffer); >+GL_API GLboolean GL_APIENTRY glIsRenderbufferOESContextANGLE(GLeglContext ctx, GLuint renderbuffer); >+GL_API void GL_APIENTRY glLoadPaletteFromModelViewMatrixOESContextANGLE(GLeglContext ctx); >+GL_API void GL_APIENTRY glMatrixIndexPointerOESContextANGLE(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer); >+GL_API void GL_APIENTRY glPointSizePointerOESContextANGLE(GLeglContext ctx, GLenum type, GLsizei stride, const void *pointer); >+GL_API GLbitfield GL_APIENTRY glQueryMatrixxOESContextANGLE(GLeglContext ctx, GLfixed *mantissa, GLint *exponent); >+GL_API void GL_APIENTRY glRenderbufferStorageOESContextANGLE(GLeglContext ctx, GLenum target, GLenum internalformat, GLsizei width, GLsizei height); >+GL_API void GL_APIENTRY glTexGenfOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLfloat param); >+GL_API void GL_APIENTRY glTexGenfvOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, const GLfloat *params); >+GL_API void GL_APIENTRY glTexGeniOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLint param); >+GL_API void GL_APIENTRY glTexGenivOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, const GLint *params); >+GL_API void GL_APIENTRY glTexGenxOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLfixed param); >+GL_API void GL_APIENTRY glTexGenxvOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, const GLfixed *params); >+GL_API void GL_APIENTRY glWeightPointerOESContextANGLE(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer); >+#endif >diff --git a/Source/ThirdParty/ANGLE/include/GLES/glplatform.h b/Source/ThirdParty/ANGLE/include/GLES/glplatform.h >new file mode 100644 >index 00000000000..16060a9a73b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/GLES/glplatform.h >@@ -0,0 +1,38 @@ >+#ifndef __glplatform_h_ >+#define __glplatform_h_ >+ >+/* >+** Copyright (c) 2017 The Khronos Group Inc. >+** >+** Licensed under the Apache License, Version 2.0 (the "License"); >+** you may not use this file except in compliance with the License. >+** You may obtain a copy of the License at >+** >+** http://www.apache.org/licenses/LICENSE-2.0 >+** >+** Unless required by applicable law or agreed to in writing, software >+** distributed under the License is distributed on an "AS IS" BASIS, >+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. >+** See the License for the specific language governing permissions and >+** limitations under the License. >+*/ >+ >+/* Platform-specific types and definitions for OpenGL ES 1.X gl.h >+ * >+ * Adopters may modify khrplatform.h and this file to suit their platform. >+ * Please contribute modifications back to Khronos as pull requests on the >+ * public github repository: >+ * https://github.com/KhronosGroup/OpenGL-Registry >+ */ >+ >+#include <KHR/khrplatform.h> >+ >+#ifndef GL_API >+#define GL_API KHRONOS_APICALL >+#endif >+ >+#ifndef GL_APIENTRY >+#define GL_APIENTRY KHRONOS_APIENTRY >+#endif >+ >+#endif /* __glplatform_h_ */ >diff --git a/Source/ThirdParty/ANGLE/include/GLES2/.clang-format b/Source/ThirdParty/ANGLE/include/GLES2/.clang-format >new file mode 100644 >index 00000000000..06147100144 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/GLES2/.clang-format >@@ -0,0 +1,3 @@ >+ >+ >+DisableFormat: true >diff --git a/Source/ThirdParty/ANGLE/include/GLES2/gl2ext.h b/Source/ThirdParty/ANGLE/include/GLES2/gl2ext.h >index 4def3ced4b8..0ee082a3d0f 100644 >--- a/Source/ThirdParty/ANGLE/include/GLES2/gl2ext.h >+++ b/Source/ThirdParty/ANGLE/include/GLES2/gl2ext.h >@@ -1,12 +1,12 @@ >-#ifndef __gl2ext_h_ >-#define __gl2ext_h_ 1 >+#ifndef __gles2_gl2ext_h_ >+#define __gles2_gl2ext_h_ 1 > > #ifdef __cplusplus > extern "C" { > #endif > > /* >-** Copyright (c) 2013-2017 The Khronos Group Inc. >+** Copyright (c) 2013-2018 The Khronos Group Inc. > ** > ** Permission is hereby granted, free of charge, to any person obtaining a > ** copy of this software and/or associated documentation files (the >@@ -38,7 +38,7 @@ extern "C" { > #define GL_APIENTRYP GL_APIENTRY* > #endif > >-/* Generated on date 20170613 */ >+/* Generated on date 20180525 */ > > /* Generated C header for: > * API: gles2 >@@ -159,6 +159,16 @@ GL_APICALL void GL_APIENTRY glGetPointervKHR (GLenum pname, void **params); > #define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 > #endif /* GL_KHR_no_error */ > >+#ifndef GL_KHR_parallel_shader_compile >+#define GL_KHR_parallel_shader_compile 1 >+#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 >+#define GL_COMPLETION_STATUS_KHR 0x91B1 >+typedef void (GL_APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glMaxShaderCompilerThreadsKHR (GLuint count); >+#endif >+#endif /* GL_KHR_parallel_shader_compile */ >+ > #ifndef GL_KHR_robust_buffer_access_behavior > #define GL_KHR_robust_buffer_access_behavior 1 > #endif /* GL_KHR_robust_buffer_access_behavior */ >@@ -324,12 +334,12 @@ GL_APICALL GLboolean GL_APIENTRY glIsEnablediOES (GLenum target, GLuint index); > typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); > typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); > typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); >-typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); >+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); > #ifdef GL_GLEXT_PROTOTYPES > GL_APICALL void GL_APIENTRY glDrawElementsBaseVertexOES (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); > GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertexOES (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); > GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexOES (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); >-GL_APICALL void GL_APIENTRY glMultiDrawElementsBaseVertexOES (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); >+GL_APICALL void GL_APIENTRY glMultiDrawElementsBaseVertexEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); > #endif > #endif /* GL_OES_draw_elements_base_vertex */ > >@@ -1055,6 +1065,16 @@ GL_APICALL void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei > #define GL_EXT_EGL_image_array 1 > #endif /* GL_EXT_EGL_image_array */ > >+#ifndef GL_EXT_EGL_image_storage >+#define GL_EXT_EGL_image_storage 1 >+typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC) (GLenum target, GLeglImageOES image, const GLint* attrib_list); >+typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC) (GLuint texture, GLeglImageOES image, const GLint* attrib_list); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glEGLImageTargetTexStorageEXT (GLenum target, GLeglImageOES image, const GLint* attrib_list); >+GL_APICALL void GL_APIENTRY glEGLImageTargetTextureStorageEXT (GLuint texture, GLeglImageOES image, const GLint* attrib_list); >+#endif >+#endif /* GL_EXT_EGL_image_storage */ >+ > #ifndef GL_EXT_YUV_target > #define GL_EXT_YUV_target 1 > #define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT 0x8BE7 >@@ -1126,6 +1146,20 @@ GL_APICALL void GL_APIENTRY glClearTexSubImageEXT (GLuint texture, GLint level, > #endif > #endif /* GL_EXT_clear_texture */ > >+#ifndef GL_EXT_clip_control >+#define GL_EXT_clip_control 1 >+#define GL_LOWER_LEFT_EXT 0x8CA1 >+#define GL_UPPER_LEFT_EXT 0x8CA2 >+#define GL_NEGATIVE_ONE_TO_ONE_EXT 0x935E >+#define GL_ZERO_TO_ONE_EXT 0x935F >+#define GL_CLIP_ORIGIN_EXT 0x935C >+#define GL_CLIP_DEPTH_MODE_EXT 0x935D >+typedef void (GL_APIENTRYP PFNGLCLIPCONTROLEXTPROC) (GLenum origin, GLenum depth); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glClipControlEXT (GLenum origin, GLenum depth); >+#endif >+#endif /* GL_EXT_clip_control */ >+ > #ifndef GL_EXT_clip_cull_distance > #define GL_EXT_clip_cull_distance 1 > #define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 >@@ -1311,12 +1345,10 @@ GL_APICALL GLboolean GL_APIENTRY glIsEnablediEXT (GLenum target, GLuint index); > typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); > typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); > typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); >-typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); > #ifdef GL_GLEXT_PROTOTYPES > GL_APICALL void GL_APIENTRY glDrawElementsBaseVertexEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); > GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertexEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); > GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); >-GL_APICALL void GL_APIENTRY glMultiDrawElementsBaseVertexEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); > #endif > #endif /* GL_EXT_draw_elements_base_vertex */ > >@@ -1682,6 +1714,8 @@ GL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, > #define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 > #define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 > #define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 >+#define GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT 0x9530 >+#define GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT 0x9531 > typedef void (GL_APIENTRYP PFNGLGENSEMAPHORESEXTPROC) (GLsizei n, GLuint *semaphores); > typedef void (GL_APIENTRYP PFNGLDELETESEMAPHORESEXTPROC) (GLsizei n, const GLuint *semaphores); > typedef GLboolean (GL_APIENTRYP PFNGLISSEMAPHOREEXTPROC) (GLuint semaphore); >@@ -1825,6 +1859,14 @@ GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLin > #define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 > #endif /* GL_EXT_shader_framebuffer_fetch */ > >+#ifndef GL_EXT_shader_framebuffer_fetch_non_coherent >+#define GL_EXT_shader_framebuffer_fetch_non_coherent 1 >+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC) (void); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glFramebufferFetchBarrierEXT (void); >+#endif >+#endif /* GL_EXT_shader_framebuffer_fetch_non_coherent */ >+ > #ifndef GL_EXT_shader_group_vote > #define GL_EXT_shader_group_vote 1 > #endif /* GL_EXT_shader_group_vote */ >@@ -2012,18 +2054,42 @@ GL_APICALL void GL_APIENTRY glTexBufferRangeEXT (GLenum target, GLenum internalf > #define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 > #endif /* GL_EXT_texture_compression_astc_decode_mode */ > >+#ifndef GL_EXT_texture_compression_bptc >+#define GL_EXT_texture_compression_bptc 1 >+#define GL_COMPRESSED_RGBA_BPTC_UNORM_EXT 0x8E8C >+#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT 0x8E8D >+#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E >+#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F >+#endif /* GL_EXT_texture_compression_bptc */ >+ > #ifndef GL_EXT_texture_compression_dxt1 > #define GL_EXT_texture_compression_dxt1 1 > #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 > #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 > #endif /* GL_EXT_texture_compression_dxt1 */ > >+#ifndef GL_EXT_texture_compression_rgtc >+#define GL_EXT_texture_compression_rgtc 1 >+#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB >+#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC >+#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD >+#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE >+#endif /* GL_EXT_texture_compression_rgtc */ >+ > #ifndef GL_EXT_texture_compression_s3tc > #define GL_EXT_texture_compression_s3tc 1 > #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 > #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 > #endif /* GL_EXT_texture_compression_s3tc */ > >+#ifndef GL_EXT_texture_compression_s3tc_srgb >+#define GL_EXT_texture_compression_s3tc_srgb 1 >+#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C >+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D >+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E >+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F >+#endif /* GL_EXT_texture_compression_s3tc_srgb */ >+ > #ifndef GL_EXT_texture_cube_map_array > #define GL_EXT_texture_cube_map_array 1 > #define GL_TEXTURE_CUBE_MAP_ARRAY_EXT 0x9009 >@@ -2045,12 +2111,24 @@ GL_APICALL void GL_APIENTRY glTexBufferRangeEXT (GLenum target, GLenum internalf > > #ifndef GL_EXT_texture_filter_minmax > #define GL_EXT_texture_filter_minmax 1 >+#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 >+#define GL_WEIGHTED_AVERAGE_EXT 0x9367 > #endif /* GL_EXT_texture_filter_minmax */ > > #ifndef GL_EXT_texture_format_BGRA8888 > #define GL_EXT_texture_format_BGRA8888 1 > #endif /* GL_EXT_texture_format_BGRA8888 */ > >+#ifndef GL_EXT_texture_format_sRGB_override >+#define GL_EXT_texture_format_sRGB_override 1 >+#define GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT 0x8FBF >+#endif /* GL_EXT_texture_format_sRGB_override */ >+ >+#ifndef GL_EXT_texture_mirror_clamp_to_edge >+#define GL_EXT_texture_mirror_clamp_to_edge 1 >+#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 >+#endif /* GL_EXT_texture_mirror_clamp_to_edge */ >+ > #ifndef GL_EXT_texture_norm16 > #define GL_EXT_texture_norm16 1 > #define GL_R16_EXT 0x822A >@@ -2253,6 +2331,11 @@ GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum target, > #define GL_CUBIC_MIPMAP_LINEAR_IMG 0x913B > #endif /* GL_IMG_texture_filter_cubic */ > >+#ifndef GL_INTEL_blackhole_render >+#define GL_INTEL_blackhole_render 1 >+#define GL_BLACKHOLE_RENDER_INTEL 0x83FC >+#endif /* GL_INTEL_blackhole_render */ >+ > #ifndef GL_INTEL_conservative_rasterization > #define GL_INTEL_conservative_rasterization 1 > #define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE >@@ -2295,7 +2378,7 @@ typedef void (GL_APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); > typedef void (GL_APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); > typedef void (GL_APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); > typedef void (GL_APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); >-typedef void (GL_APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); >+typedef void (GL_APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); > typedef void (GL_APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); > typedef void (GL_APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); > #ifdef GL_GLEXT_PROTOTYPES >@@ -2306,12 +2389,17 @@ GL_APICALL void GL_APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); > GL_APICALL void GL_APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); > GL_APICALL void GL_APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); > GL_APICALL void GL_APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); >-GL_APICALL void GL_APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); >+GL_APICALL void GL_APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); > GL_APICALL void GL_APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); > GL_APICALL void GL_APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); > #endif > #endif /* GL_INTEL_performance_query */ > >+#ifndef GL_MESA_program_binary_formats >+#define GL_MESA_program_binary_formats 1 >+#define GL_PROGRAM_BINARY_FORMAT_MESA 0x875F >+#endif /* GL_MESA_program_binary_formats */ >+ > #ifndef GL_MESA_shader_integer_functions > #define GL_MESA_shader_integer_functions 1 > #endif /* GL_MESA_shader_integer_functions */ >@@ -2416,6 +2504,23 @@ GL_APICALL void GL_APIENTRY glBlendBarrierNV (void); > #define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 > #endif /* GL_NV_blend_equation_advanced_coherent */ > >+#ifndef GL_NV_blend_minmax_factor >+#define GL_NV_blend_minmax_factor 1 >+#define GL_FACTOR_MIN_AMD 0x901C >+#define GL_FACTOR_MAX_AMD 0x901D >+#endif /* GL_NV_blend_minmax_factor */ >+ >+#ifndef GL_NV_clip_space_w_scaling >+#define GL_NV_clip_space_w_scaling 1 >+#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C >+#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D >+#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E >+typedef void (GL_APIENTRYP PFNGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glViewportPositionWScaleNV (GLuint index, GLfloat xcoeff, GLfloat ycoeff); >+#endif >+#endif /* GL_NV_clip_space_w_scaling */ >+ > #ifndef GL_NV_conditional_render > #define GL_NV_conditional_render 1 > #define GL_QUERY_WAIT_NV 0x8E13 >@@ -2442,6 +2547,11 @@ GL_APICALL void GL_APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybit > #endif > #endif /* GL_NV_conservative_raster */ > >+#ifndef GL_NV_conservative_raster_pre_snap >+#define GL_NV_conservative_raster_pre_snap 1 >+#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV 0x9550 >+#endif /* GL_NV_conservative_raster_pre_snap */ >+ > #ifndef GL_NV_conservative_raster_pre_snap_triangles > #define GL_NV_conservative_raster_pre_snap_triangles 1 > #define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D >@@ -2813,6 +2923,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x3fvNV (GLint location, GLsizei coun > > #ifndef GL_NV_path_rendering > #define GL_NV_path_rendering 1 >+typedef double GLdouble; > #define GL_PATH_FORMAT_SVG_NV 0x9070 > #define GL_PATH_FORMAT_PS_NV 0x9071 > #define GL_STANDARD_FONT_NAME_NV 0x9072 >@@ -3023,6 +3134,25 @@ typedef GLenum (GL_APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathNa > typedef GLenum (GL_APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); > typedef void (GL_APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); > typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); >+typedef void (GL_APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); >+typedef void (GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); >+typedef void (GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); >+typedef void (GL_APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); >+typedef void (GL_APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); >+typedef void (GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); >+typedef void (GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); >+typedef void (GL_APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); >+typedef void (GL_APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); >+typedef void (GL_APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); >+typedef void (GL_APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); >+typedef void (GL_APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); >+typedef void (GL_APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); >+typedef void (GL_APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); >+typedef void (GL_APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); >+typedef void (GL_APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); >+typedef void (GL_APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); >+typedef void (GL_APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); > #ifdef GL_GLEXT_PROTOTYPES > GL_APICALL GLuint GL_APIENTRY glGenPathsNV (GLsizei range); > GL_APICALL void GL_APIENTRY glDeletePathsNV (GLuint path, GLsizei range); >@@ -3081,6 +3211,25 @@ GL_APICALL GLenum GL_APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLe > GL_APICALL GLenum GL_APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); > GL_APICALL void GL_APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); > GL_APICALL void GL_APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); >+GL_APICALL void GL_APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); >+GL_APICALL void GL_APIENTRY glMatrixLoadIdentityEXT (GLenum mode); >+GL_APICALL void GL_APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); >+GL_APICALL void GL_APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); >+GL_APICALL void GL_APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); >+GL_APICALL void GL_APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); >+GL_APICALL void GL_APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); >+GL_APICALL void GL_APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); >+GL_APICALL void GL_APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); >+GL_APICALL void GL_APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); >+GL_APICALL void GL_APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); >+GL_APICALL void GL_APIENTRY glMatrixPopEXT (GLenum mode); >+GL_APICALL void GL_APIENTRY glMatrixPushEXT (GLenum mode); >+GL_APICALL void GL_APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); >+GL_APICALL void GL_APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); >+GL_APICALL void GL_APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); >+GL_APICALL void GL_APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); >+GL_APICALL void GL_APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); >+GL_APICALL void GL_APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); > #endif > #endif /* GL_NV_path_rendering */ > >@@ -3089,6 +3238,14 @@ GL_APICALL void GL_APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum pro > #define GL_SHARED_EDGE_NV 0xC0 > #endif /* GL_NV_path_rendering_shared_edge */ > >+#ifndef GL_NV_pixel_buffer_object >+#define GL_NV_pixel_buffer_object 1 >+#define GL_PIXEL_PACK_BUFFER_NV 0x88EB >+#define GL_PIXEL_UNPACK_BUFFER_NV 0x88EC >+#define GL_PIXEL_PACK_BUFFER_BINDING_NV 0x88ED >+#define GL_PIXEL_UNPACK_BUFFER_BINDING_NV 0x88EF >+#endif /* GL_NV_pixel_buffer_object */ >+ > #ifndef GL_NV_polygon_mode > #define GL_NV_polygon_mode 1 > #define GL_POLYGON_MODE_NV 0x0B40 >@@ -3184,6 +3341,10 @@ GL_APICALL void GL_APIENTRY glResolveDepthValuesNV (void); > #define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 > #endif /* GL_NV_shadow_samplers_cube */ > >+#ifndef GL_NV_stereo_view_rendering >+#define GL_NV_stereo_view_rendering 1 >+#endif /* GL_NV_stereo_view_rendering */ >+ > #ifndef GL_NV_texture_border_clamp > #define GL_NV_texture_border_clamp 1 > #define GL_TEXTURE_BORDER_COLOR_NV 0x1004 >@@ -3386,6 +3547,19 @@ GL_APICALL void GL_APIENTRY glFramebufferFetchBarrierQCOM (void); > #endif > #endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ > >+#ifndef GL_QCOM_texture_foveated >+#define GL_QCOM_texture_foveated 1 >+#define GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM 0x8BFB >+#define GL_TEXTURE_FOVEATED_MIN_PIXEL_DENSITY_QCOM 0x8BFC >+#define GL_TEXTURE_FOVEATED_FEATURE_QUERY_QCOM 0x8BFD >+#define GL_TEXTURE_FOVEATED_NUM_FOCAL_POINTS_QUERY_QCOM 0x8BFE >+#define GL_FRAMEBUFFER_INCOMPLETE_FOVEATION_QCOM 0x8BFF >+typedef void (GL_APIENTRYP PFNGLTEXTUREFOVEATIONPARAMETERSQCOMPROC) (GLuint texture, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glTextureFoveationParametersQCOM (GLuint texture, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); >+#endif >+#endif /* GL_QCOM_texture_foveated */ >+ > #ifndef GL_QCOM_tiled_rendering > #define GL_QCOM_tiled_rendering 1 > #define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 >diff --git a/Source/ThirdParty/ANGLE/include/GLES2/gl2ext_angle.h b/Source/ThirdParty/ANGLE/include/GLES2/gl2ext_angle.h >index fc5a4bf35db..d0cbaa425e2 100644 >--- a/Source/ThirdParty/ANGLE/include/GLES2/gl2ext_angle.h >+++ b/Source/ThirdParty/ANGLE/include/GLES2/gl2ext_angle.h >@@ -32,6 +32,17 @@ GL_APICALL void GL_APIENTRY glRequestExtensionANGLE (const GLchar *name); > #define GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x93AB > #endif /* GL_ANGLE_robust_resource_initialization */ > >+#ifndef GL_ANGLE_provoking_vertex >+#define GL_ANGLE_provoking_vertex 1 >+#define GL_FIRST_VERTEX_CONVENTION 0x8E4D >+#define GL_LAST_VERTEX_CONVENTION 0x8E4E >+#define GL_PROVOKING_VERTEX 0x8E4F >+typedef void (GL_APIENTRYP PFNGLPROVOKINGVERTEXANGLEPROC) (GLenum); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glProvokingVertexANGLE(GLenum mode); >+#endif >+#endif /* GL_ANGLE_provoking_vertex */ >+ > #ifndef GL_CHROMIUM_framebuffer_mixed_samples > #define GL_CHROMIUM_frambuffer_mixed_samples 1 > #define GL_COVERAGE_MODULATION_CHROMIUM 0x9332 >@@ -46,6 +57,11 @@ GL_APICALL void GL_APIENTRY glCoverageModulationCHROMIUM(GLenum components); > #define GL_BIND_GENERATES_RESOURCE_CHROMIUM 0x9244 > #endif /* GL_CHROMIUM_bind_generates_resource */ > >+#ifndef GL_ANGLE_memory_size >+#define GL_ANGLE_memory_size >+#define GL_MEMORY_SIZE_ANGLE 0x93AD >+#endif /* GL_ANGLE_memory_size */ >+ > // needed by NV_path_rendering (and thus CHROMIUM_path_rendering) > // but CHROMIUM_path_rendering only needs MatrixLoadfEXT, MatrixLoadIdentityEXT > #ifndef GL_EXT_direct_state_access >@@ -188,7 +204,7 @@ typedef void(GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDCHROMIUMPROC)( > GLenum transformType, > const GLfloat *transformValues); > >-typedef void(GL_APIENTRY PFNGLBINDFRAGMENTINPUTLOCATIONCHROMIUMPROC)(GLuint program, >+typedef void(GL_APIENTRYP PFNGLBINDFRAGMENTINPUTLOCATIONCHROMIUMPROC)(GLuint program, > GLint location, > const GLchar *name); > typedef void(GL_APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENCHROMIUMPROC)(GLuint program, >@@ -351,6 +367,67 @@ GL_APICALL void GL_APIENTRY glCompressedCopyTextureCHROMIUM(GLuint sourceId, GLu > #endif > #endif /* GL_CHROMIUM_compressed_copy_texture */ > >+ >+#ifndef GL_ANGLE_copy_texture_3d >+#define GL_ANGLE_copy_texture_3d 1 >+typedef void(GL_APIENTRYP PFNGLCOPYTEXTURE3DANGLEPROC)(GLuint sourceId, >+ GLint sourceLevel, >+ GLenum destTarget, >+ GLuint destId, >+ GLint destLevel, >+ GLint internalFormat, >+ GLenum destType, >+ GLboolean unpackFlipY, >+ GLboolean unpackPremultiplyAlpha, >+ GLboolean unpackUnmultiplyAlpha); >+typedef void(GL_APIENTRYP PFNGLCOPYSUBTEXTURE3DANGLEPROC)(GLuint sourceId, >+ GLint sourceLevel, >+ GLenum destTarget, >+ GLuint destId, >+ GLint destLevel, >+ GLint xoffset, >+ GLint yoffset, >+ GLint zoffset, >+ GLint x, >+ GLint y, >+ GLint z, >+ GLsizei width, >+ GLsizei height, >+ GLsizei depth, >+ GLboolean unpackFlipY, >+ GLboolean unpackPremultiplyAlpha, >+ GLboolean unpackUnmultiplyAlpha); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glCopyTexture3DANGLE(GLuint sourceId, >+ GLint sourceLevel, >+ GLenum destTarget, >+ GLuint destId, >+ GLint destLevel, >+ GLint internalFormat, >+ GLenum destType, >+ GLboolean unpackFlipY, >+ GLboolean unpackPremultiplyAlpha, >+ GLboolean unpackUnmultiplyAlpha); >+GL_APICALL void GL_APIENTRY glCopySubTexture3DANGLE(GLuint sourceId, >+ GLint sourceLevel, >+ GLenum destTarget, >+ GLuint destId, >+ GLint destLevel, >+ GLint xoffset, >+ GLint yoffset, >+ GLint zoffset, >+ GLint x, >+ GLint y, >+ GLint z, >+ GLsizei width, >+ GLsizei height, >+ GLsizei depth, >+ GLboolean unpackFlipY, >+ GLboolean unpackPremultiplyAlpha, >+ GLboolean unpackUnmultiplyAlpha); >+#endif >+#endif /* GL_ANGLE_copy_texture_3d */ >+ > #ifndef GL_CHROMIUM_sync_query > #define GL_CHROMIUM_sync_query 1 > #define GL_COMMANDS_COMPLETED_CHROMIUM 0x84F7 >@@ -381,70 +458,70 @@ GL_APICALL void GL_APIENTRY glCompressedCopyTextureCHROMIUM(GLuint sourceId, GLu > > #ifndef GL_ANGLE_robust_client_memory > #define GL_ANGLE_robust_client_memory 1 >-typedef void (GL_APIENTRYP PFNGLGETBOOLEANVROBUSTANGLE) (GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *data); >-typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETFLOATVROBUSTANGLE) (GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *data); >-typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVROBUSTANGLE) (GLenum target, GLenum attachment, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETINTEGERVROBUSTANGLE) (GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data); >-typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVROBUSTANGLE) (GLuint program, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETSHADERIVROBUSTANGLE) (GLuint shader, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params); >-typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVROBUSTANGLE) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLfloat *params); >-typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVROBUSTANGLE) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVROBUSTANGLE) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params); >-typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVROBUSTANGLE) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVROBUSTANGLE) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, void **pointer); >-typedef void (GL_APIENTRYP PFNGLREADPIXELSROBUSTANGLE) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei *length, GLsizei *columns, GLsizei *rows, void *pixels); >-typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DROBUSTANGLE) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void *pixels); >-typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, const GLfloat *params); >-typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, const GLint *params); >-typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DROBUSTANGLE) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, const void *pixels); >-typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DROBUSTANGLE) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void *pixels); >-typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DROBUSTANGLE) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, const void *pixels); >-typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DROBUSTANGLE) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, GLsizei bufSize, const void *data); >-typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DROBUSTANGLE) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLsizei bufSize, const void *data); >-typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DROBUSTANGLE) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLsizei bufSize, const void *data); >-typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DROBUSTANGLE) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, GLsizei bufSize, const void *data); >-typedef void (GL_APIENTRYP PFNGLGETQUERYIVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVROBUSTANGLE) (GLuint id, GLenum pname, GLsizei bufSize, GLsizei *length, GLuint *params); >-typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, void **params); >-typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VROBUSTANGLE) (GLenum target, GLuint index, GLsizei bufSize, GLsizei *length, GLint *data); >-typedef void (GL_APIENTRYP PFNGETINTERNALFORMATIVROBUSTANGLE) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIIVROBUSTANGLE) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIUIVROBUSTANGLE) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLuint *params); >-typedef void (GL_APIENTRYP PFNGLGETUNIFORMUIVROBUSTANGLE) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLuint *params); >-typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVROBUSTANGLE) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETINTEGER64VROBUSTANGLE) (GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data); >-typedef void (GL_APIENTRYP PFNGLGETINTEGER64I_VROBUSTANGLE) (GLenum target, GLuint index, GLsizei bufSize, GLsizei *length, GLint64 *data); >-typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERI64VROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *params); >-typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIVROBUSTANGLE) (GLuint sampler, GLenum pname, GLsizei bufSize, const GLint *param); >-typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVROBUSTANGLE) (GLuint sampler, GLenum pname, GLsizei bufSize, const GLfloat *param); >-typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIVROBUSTANGLE) (GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERFVROBUSTANGLE) (GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params); >-typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETPROGRAMINTERFACEIVROBUSTANGLE) (GLuint program, GLenum programInterface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETBOOLEANI_VROBUSTANGLE) (GLenum target, GLuint index, GLsizei bufSize, GLsizei *length, GLboolean *data); >-typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVROBUSTANGLE) (GLenum pname, GLuint index, GLsizei bufSize, GLsizei *length, GLfloat *val); >-typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVROBUSTANGLE) (GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVROBUSTANGLE) (GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params); >-typedef void (GL_APIENTRYP PFNGLGETPOINTERVROBUSTANGLEROBUSTANGLE) (GLenum pname, GLsizei bufSize, GLsizei *length, void **params); >-typedef void (GL_APIENTRYP PFNGLREADNPIXELSROBUSTANGLE) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei *length, GLsizei *columns, GLsizei *rows, void *data); >-typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVROBUSTANGLE) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLfloat *params); >-typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVROBUSTANGLE) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVROBUSTANGLE) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLuint *params); >-typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, const GLint *params); >-typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, const GLuint *params); >-typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLuint *params); >-typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVROBUSTANGLE) (GLuint sampler, GLenum pname, GLsizei bufSize, const GLint *param); >-typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVROBUSTANGLE) (GLuint sampler, GLenum pname, GLsizei bufSize, const GLuint *param); >-typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVROBUSTANGLE) (GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVROBUSTANGLE) (GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei *length, GLuint *params); >-typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVROBUSTANGLE)(GLuint id, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >-typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VROBUSTANGLE)(GLuint id, GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *params); >-typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VROBUSTANGLE)(GLuint id, GLenum pname, GLsizei bufSize, GLsizei *length, GLuint64 *params); >+typedef void (GL_APIENTRYP PFNGLGETBOOLEANVROBUSTANGLEPROC) (GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *data); >+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVROBUSTANGLEPROC) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETFLOATVROBUSTANGLEPROC) (GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *data); >+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVROBUSTANGLEPROC) (GLenum target, GLenum attachment, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETINTEGERVROBUSTANGLEPROC) (GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data); >+typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVROBUSTANGLEPROC) (GLuint program, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVROBUSTANGLEPROC) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETSHADERIVROBUSTANGLEPROC) (GLuint shader, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVROBUSTANGLEPROC) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVROBUSTANGLEPROC) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVROBUSTANGLEPROC) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVROBUSTANGLEPROC) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVROBUSTANGLEPROC) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVROBUSTANGLEPROC) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVROBUSTANGLEPROC) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, void **pointer); >+typedef void (GL_APIENTRYP PFNGLREADPIXELSROBUSTANGLEPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei *length, GLsizei *columns, GLsizei *rows, void *pixels); >+typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DROBUSTANGLEPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void *pixels); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVROBUSTANGLEPROC) (GLenum target, GLenum pname, GLsizei bufSize, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVROBUSTANGLEPROC) (GLenum target, GLenum pname, GLsizei bufSize, const GLint *params); >+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DROBUSTANGLEPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, const void *pixels); >+typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DROBUSTANGLEPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void *pixels); >+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DROBUSTANGLEPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, const void *pixels); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DROBUSTANGLEPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, GLsizei bufSize, const void *data); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DROBUSTANGLEPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLsizei bufSize, const void *data); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DROBUSTANGLEPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLsizei bufSize, const void *data); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DROBUSTANGLEPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, GLsizei bufSize, const void *data); >+typedef void (GL_APIENTRYP PFNGLGETQUERYIVROBUSTANGLEPROC) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVROBUSTANGLEPROC) (GLuint id, GLenum pname, GLsizei bufSize, GLsizei *length, GLuint *params); >+typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVROBUSTANGLEPROC) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, void **params); >+typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VROBUSTANGLEPROC) (GLenum target, GLuint index, GLsizei bufSize, GLsizei *length, GLint *data); >+typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVROBUSTANGLEPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIIVROBUSTANGLEPROC) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIUIVROBUSTANGLEPROC) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLuint *params); >+typedef void (GL_APIENTRYP PFNGLGETUNIFORMUIVROBUSTANGLEPROC) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLuint *params); >+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVROBUSTANGLEPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETINTEGER64VROBUSTANGLEPROC) (GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data); >+typedef void (GL_APIENTRYP PFNGLGETINTEGER64I_VROBUSTANGLEPROC) (GLenum target, GLuint index, GLsizei bufSize, GLsizei *length, GLint64 *data); >+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERI64VROBUSTANGLEPROC) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *params); >+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIVROBUSTANGLEPROC) (GLuint sampler, GLenum pname, GLsizei bufSize, const GLint *param); >+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVROBUSTANGLEPROC) (GLuint sampler, GLenum pname, GLsizei bufSize, const GLfloat *param); >+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIVROBUSTANGLEPROC) (GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERFVROBUSTANGLEPROC) (GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVROBUSTANGLEPROC) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINTERFACEIVROBUSTANGLEPROC) (GLuint program, GLenum programInterface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETBOOLEANI_VROBUSTANGLEPROC) (GLenum target, GLuint index, GLsizei bufSize, GLsizei *length, GLboolean *data); >+typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVROBUSTANGLEPROC) (GLenum pname, GLuint index, GLsizei bufSize, GLsizei *length, GLfloat *val); >+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVROBUSTANGLEPROC) (GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVROBUSTANGLEPROC) (GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETPOINTERVROBUSTANGLEROBUSTANGLEPROC) (GLenum pname, GLsizei bufSize, GLsizei *length, void **params); >+typedef void (GL_APIENTRYP PFNGLREADNPIXELSROBUSTANGLEPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei *length, GLsizei *columns, GLsizei *rows, void *data); >+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVROBUSTANGLEPROC) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVROBUSTANGLEPROC) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVROBUSTANGLEPROC) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLuint *params); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVROBUSTANGLEPROC) (GLenum target, GLenum pname, GLsizei bufSize, const GLint *params); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVROBUSTANGLEPROC) (GLenum target, GLenum pname, GLsizei bufSize, const GLuint *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVROBUSTANGLEPROC) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVROBUSTANGLEPROC) (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLuint *params); >+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVROBUSTANGLEPROC) (GLuint sampler, GLenum pname, GLsizei bufSize, const GLint *param); >+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVROBUSTANGLEPROC) (GLuint sampler, GLenum pname, GLsizei bufSize, const GLuint *param); >+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVROBUSTANGLEPROC) (GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVROBUSTANGLEPROC) (GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei *length, GLuint *params); >+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVROBUSTANGLEPROC)(GLuint id, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VROBUSTANGLEPROC)(GLuint id, GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *params); >+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VROBUSTANGLEPROC)(GLuint id, GLenum pname, GLsizei bufSize, GLsizei *length, GLuint64 *params); > #ifdef GL_GLEXT_PROTOTYPES > GL_APICALL void GL_APIENTRY glGetBooleanvRobustANGLE (GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *data); > GL_APICALL void GL_APIENTRY glGetBufferParameterivRobustANGLE (GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); >@@ -518,26 +595,6 @@ GL_APICALL void GL_APIENTRY glGetQueryObjectui64vRobustANGLE(GLuint id, GLenum p > #define GL_PROGRAM_CACHE_ENABLED_ANGLE 0x93AC > #endif /* GL_ANGLE_program_cache_control */ > >-#ifndef GL_ANGLE_multiview >-#define GL_ANGLE_multiview 1 >-// The next four enums coincide with the enums introduced by the GL_OVR_multiview extension and use the values reserved by that extension. >-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE 0x9630 >-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE 0x9632 >-#define GL_MAX_VIEWS_ANGLE 0x9631 >-#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_ANGLE 0x9633 >-// The next four enums are reserved specifically for ANGLE. >-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE 0x969B >-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE 0x969C >-#define GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE 0x969D >-#define GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE 0x969E >-typedef void(GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWLAYEREDANGLE)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); >-typedef void(GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWSIDEBYSIDEANGLE)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei numViews, const GLint *viewportOffsets); >-#ifdef GL_GLEXT_PROTOTYPES >-GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewLayeredANGLE(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); >-GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewSideBySideANGLE(GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei numViews, const GLint *viewportOffsets); >-#endif >-#endif /* GL_ANGLE_multiview */ >- > #ifndef GL_ANGLE_texture_rectangle > #define GL_ANGLE_texture_rectangle 1 > #define GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE 0x84F8 >@@ -546,6 +603,72 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewSideBySideANGLE(GLenum > #define GL_SAMPLER_2D_RECT_ANGLE 0x8B63 > #endif /* GL_ANGLE_texture_rectangle */ > >+#ifndef GL_ANGLE_texture_multisample >+#define GL_ANGLE_texture_multisample 1 >+#define GL_SAMPLE_POSITION_ANGLE 0x8E50 >+#define GL_SAMPLE_MASK_ANGLE 0x8E51 >+#define GL_SAMPLE_MASK_VALUE_ANGLE 0x8E52 >+#define GL_TEXTURE_2D_MULTISAMPLE_ANGLE 0x9100 >+#define GL_MAX_SAMPLE_MASK_WORDS_ANGLE 0x8E59 >+#define GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE 0x910E >+#define GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE 0x910F >+#define GL_MAX_INTEGER_SAMPLES_ANGLE 0x9110 >+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE 0x9104 >+#define GL_TEXTURE_SAMPLES_ANGLE 0x9106 >+#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE 0x9107 >+typedef void(GL_APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEANGLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); >+typedef void(GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVANGLEPROC)(GLenum target, GLint level, GLenum pname, GLfloat *params); >+typedef void(GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVANGLEPROC)(GLenum target, GLint level, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVANGLEPROC)(GLenum pname, GLuint index, GLfloat *val); >+typedef void (GL_APIENTRYP PFNGLSAMPLEMASKIANGLEPROC)(GLuint maskNumber, GLbitfield mask); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glTexStorage2DMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); >+GL_APICALL void GL_APIENTRY glGetTexLevelParameterfvANGLE(GLenum target, GLint level, GLenum pname, GLfloat *params); >+GL_APICALL void GL_APIENTRY glGetTexLevelParameterivANGLE(GLenum target, GLint level, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetMultisamplefvANGLE(GLenum pname, GLuint index, GLfloat *val); >+GL_APICALL void GL_APIENTRY glSampleMaskiANGLE(GLuint maskNumber, GLbitfield mask); >+#endif >+#endif // !GL_ANGLE_texture_multisample >+ >+#ifndef GL_ANGLE_explicit_context >+#define GL_ANGLE_explicit_context >+typedef void *GLeglContext; >+#include "gl2ext_explicit_context_autogen.inc" >+#include "../GLES3/gl3ext_explicit_context_autogen.inc" >+#include "../GLES3/gl31ext_explicit_context_autogen.inc" >+#endif /* GL_ANGLE_explicit_context */ >+ >+#ifndef GL_ANGLE_multi_draw >+#define GL_ANGLE_multi_draw 1 >+typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSANGLEPROC) (GLenum mode, const GLint *firsts, const GLsizei *counts, GLsizei drawcount); >+typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, const GLint *firsts, const GLsizei *counts, const GLsizei *instanceCounts, GLsizei drawcount); >+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSANGLEPROC) (GLenum mode, const GLsizei *counts, GLenum type, const GLvoid* const *indices, GLsizei drawcount); >+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, const GLsizei *counts, GLenum type, const GLvoid* const *indices, const GLsizei *instanceCounts, GLsizei drawcount); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glMultiDrawArraysANGLE (GLenum mode, const GLint *firsts, const GLsizei *counts, GLsizei drawcount); >+GL_APICALL void GL_APIENTRY glMultiDrawArraysInstancedANGLE (GLenum mode, const GLint *firsts, const GLsizei *counts, const GLsizei *instanceCounts, GLsizei drawcount); >+GL_APICALL void GL_APIENTRY glMultiDrawElementsANGLE (GLenum mode, const GLsizei *counts, GLenum type, const GLvoid* const *indices, GLsizei drawcount); >+GL_APICALL void GL_APIENTRY glMultiDrawElementsInstancedANGLE (GLenum mode, const GLsizei *counts, GLenum type, const GLvoid* const *indices, const GLsizei *instanceCounts, GLsizei drawcount); >+#endif >+#endif /* GL_ANGLE_multi_draw */ >+ >+#ifndef GL_CHROMIUM_bind_uniform_location >+#define GL_CHROMIUM_bind_uniform_location 1 >+typedef void (GL_APIENTRYP PFNGLBINDUNIFORMLOCATIONCHROMIUMPROC)(GLuint program, GLint location, const GLchar *name); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glBindUniformLocationCHROMIUM(GLuint program, GLint location, const GLchar *name); >+#endif >+#endif /* GL_CHROMIUM_bind_uniform_location */ >+ >+/* GL_CHROMIUM_lose_context */ >+#ifndef GL_CHROMIUM_lose_context >+#define GL_CHROMIUM_lose_context 1 >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glLoseContextCHROMIUM(GLenum current, GLenum other); >+#endif >+typedef void (GL_APIENTRYP PFNGLLOSECONTEXTCHROMIUMPROC) (GLenum current, GLenum other); >+#endif /* GL_CHROMIUM_lose_context */ >+ > // clang-format on > > #endif // INCLUDE_GLES2_GL2EXT_ANGLE_H_ >diff --git a/Source/ThirdParty/ANGLE/include/GLES2/gl2ext_explicit_context_autogen.inc b/Source/ThirdParty/ANGLE/include/GLES2/gl2ext_explicit_context_autogen.inc >new file mode 100644 >index 00000000000..749224d58b0 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/GLES2/gl2ext_explicit_context_autogen.inc >@@ -0,0 +1,712 @@ >+// GENERATED FILE - DO NOT EDIT. >+// Generated by generate_entry_points.py using data from gl.xml and gl_angle_ext.xml. >+// >+// 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. >+// >+// gl2ext_explicit_context_autogen.inc: >+// Function declarations for the EGL_ANGLE_explicit_context extension >+ >+typedef void (GL_APIENTRYP PFNGLACTIVETEXTURECONTEXTANGLEPROC)(GLeglContext ctx, GLenum texture); >+typedef void (GL_APIENTRYP PFNGLATTACHSHADERCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLuint shader); >+typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLuint index, const GLchar *name); >+typedef void (GL_APIENTRYP PFNGLBINDBUFFERCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint buffer); >+typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint framebuffer); >+typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint renderbuffer); >+typedef void (GL_APIENTRYP PFNGLBINDTEXTURECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint texture); >+typedef void (GL_APIENTRYP PFNGLBLENDCOLORCONTEXTANGLEPROC)(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); >+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONCONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode); >+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATECONTEXTANGLEPROC)(GLeglContext ctx, GLenum modeRGB, GLenum modeAlpha); >+typedef void (GL_APIENTRYP PFNGLBLENDFUNCCONTEXTANGLEPROC)(GLeglContext ctx, GLenum sfactor, GLenum dfactor); >+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATECONTEXTANGLEPROC)(GLeglContext ctx, GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); >+typedef void (GL_APIENTRYP PFNGLBUFFERDATACONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizeiptr size, const void *data, GLenum usage); >+typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATACONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr size, const void *data); >+typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target); >+typedef void (GL_APIENTRYP PFNGLCLEARCONTEXTANGLEPROC)(GLeglContext ctx, GLbitfield mask); >+typedef void (GL_APIENTRYP PFNGLCLEARCOLORCONTEXTANGLEPROC)(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); >+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFCONTEXTANGLEPROC)(GLeglContext ctx, GLfloat d); >+typedef void (GL_APIENTRYP PFNGLCLEARSTENCILCONTEXTANGLEPROC)(GLeglContext ctx, GLint s); >+typedef void (GL_APIENTRYP PFNGLCOLORMASKCONTEXTANGLEPROC)(GLeglContext ctx, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); >+typedef void (GL_APIENTRYP PFNGLCOMPILESHADERCONTEXTANGLEPROC)(GLeglContext ctx, GLuint shader); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); >+typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); >+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); >+typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERCONTEXTANGLEPROC)(GLeglContext ctx, GLenum type); >+typedef void (GL_APIENTRYP PFNGLCULLFACECONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode); >+typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *buffers); >+typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *framebuffers); >+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program); >+typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *renderbuffers); >+typedef void (GL_APIENTRYP PFNGLDELETESHADERCONTEXTANGLEPROC)(GLeglContext ctx, GLuint shader); >+typedef void (GL_APIENTRYP PFNGLDELETETEXTURESCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *textures); >+typedef void (GL_APIENTRYP PFNGLDEPTHFUNCCONTEXTANGLEPROC)(GLeglContext ctx, GLenum func); >+typedef void (GL_APIENTRYP PFNGLDEPTHMASKCONTEXTANGLEPROC)(GLeglContext ctx, GLboolean flag); >+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFCONTEXTANGLEPROC)(GLeglContext ctx, GLfloat n, GLfloat f); >+typedef void (GL_APIENTRYP PFNGLDETACHSHADERCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLuint shader); >+typedef void (GL_APIENTRYP PFNGLDISABLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum cap); >+typedef void (GL_APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index); >+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSCONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, GLint first, GLsizei count); >+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSCONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, GLsizei count, GLenum type, const void *indices); >+typedef void (GL_APIENTRYP PFNGLENABLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum cap); >+typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index); >+typedef void (GL_APIENTRYP PFNGLFINISHCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef void (GL_APIENTRYP PFNGLFLUSHCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); >+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); >+typedef void (GL_APIENTRYP PFNGLFRONTFACECONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode); >+typedef void (GL_APIENTRYP PFNGLGENBUFFERSCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *buffers); >+typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *framebuffers); >+typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *renderbuffers); >+typedef void (GL_APIENTRYP PFNGLGENTEXTURESCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *textures); >+typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target); >+typedef void (GL_APIENTRYP PFNGLGETACTIVEATTRIBCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); >+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); >+typedef void (GL_APIENTRYP PFNGLGETATTACHEDSHADERSCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); >+typedef GLint (GL_APIENTRYP PFNGLGETATTRIBLOCATIONCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, const GLchar *name); >+typedef void (GL_APIENTRYP PFNGLGETBOOLEANVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLboolean *data); >+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+typedef GLenum (GL_APIENTRYP PFNGLGETERRORCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef void (GL_APIENTRYP PFNGLGETFLOATVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLfloat *data); >+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum attachment, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETINTEGERVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLint *data); >+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); >+typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGCONTEXTANGLEPROC)(GLeglContext ctx, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); >+typedef void (GL_APIENTRYP PFNGLGETSHADERPRECISIONFORMATCONTEXTANGLEPROC)(GLeglContext ctx, GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); >+typedef void (GL_APIENTRYP PFNGLGETSHADERSOURCECONTEXTANGLEPROC)(GLeglContext ctx, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); >+typedef void (GL_APIENTRYP PFNGLGETSHADERIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint shader, GLenum pname, GLint *params); >+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGCONTEXTANGLEPROC)(GLeglContext ctx, GLenum name); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+typedef GLint (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, const GLchar *name); >+typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLenum pname, void **pointer); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLenum pname, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLHINTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum mode); >+typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERCONTEXTANGLEPROC)(GLeglContext ctx, GLuint buffer); >+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDCONTEXTANGLEPROC)(GLeglContext ctx, GLenum cap); >+typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFERCONTEXTANGLEPROC)(GLeglContext ctx, GLuint framebuffer); >+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program); >+typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFERCONTEXTANGLEPROC)(GLeglContext ctx, GLuint renderbuffer); >+typedef GLboolean (GL_APIENTRYP PFNGLISSHADERCONTEXTANGLEPROC)(GLeglContext ctx, GLuint shader); >+typedef GLboolean (GL_APIENTRYP PFNGLISTEXTURECONTEXTANGLEPROC)(GLeglContext ctx, GLuint texture); >+typedef void (GL_APIENTRYP PFNGLLINEWIDTHCONTEXTANGLEPROC)(GLeglContext ctx, GLfloat width); >+typedef void (GL_APIENTRYP PFNGLLINKPROGRAMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program); >+typedef void (GL_APIENTRYP PFNGLPIXELSTOREICONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLint param); >+typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETCONTEXTANGLEPROC)(GLeglContext ctx, GLfloat factor, GLfloat units); >+typedef void (GL_APIENTRYP PFNGLREADPIXELSCONTEXTANGLEPROC)(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); >+typedef void (GL_APIENTRYP PFNGLRELEASESHADERCOMPILERCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum internalformat, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGECONTEXTANGLEPROC)(GLeglContext ctx, GLfloat value, GLboolean invert); >+typedef void (GL_APIENTRYP PFNGLSCISSORCONTEXTANGLEPROC)(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLSHADERBINARYCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); >+typedef void (GL_APIENTRYP PFNGLSHADERSOURCECONTEXTANGLEPROC)(GLeglContext ctx, GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); >+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCCONTEXTANGLEPROC)(GLeglContext ctx, GLenum func, GLint ref, GLuint mask); >+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCSEPARATECONTEXTANGLEPROC)(GLeglContext ctx, GLenum face, GLenum func, GLint ref, GLuint mask); >+typedef void (GL_APIENTRYP PFNGLSTENCILMASKCONTEXTANGLEPROC)(GLeglContext ctx, GLuint mask); >+typedef void (GL_APIENTRYP PFNGLSTENCILMASKSEPARATECONTEXTANGLEPROC)(GLeglContext ctx, GLenum face, GLuint mask); >+typedef void (GL_APIENTRYP PFNGLSTENCILOPCONTEXTANGLEPROC)(GLeglContext ctx, GLenum fail, GLenum zfail, GLenum zpass); >+typedef void (GL_APIENTRYP PFNGLSTENCILOPSEPARATECONTEXTANGLEPROC)(GLeglContext ctx, GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); >+typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, const GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERICONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint param); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, const GLint *params); >+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); >+typedef void (GL_APIENTRYP PFNGLUNIFORM1FCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLfloat v0); >+typedef void (GL_APIENTRYP PFNGLUNIFORM1FVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORM1ICONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLint v0); >+typedef void (GL_APIENTRYP PFNGLUNIFORM1IVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, const GLint *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORM2FCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLfloat v0, GLfloat v1); >+typedef void (GL_APIENTRYP PFNGLUNIFORM2FVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORM2ICONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLint v0, GLint v1); >+typedef void (GL_APIENTRYP PFNGLUNIFORM2IVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, const GLint *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORM3FCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); >+typedef void (GL_APIENTRYP PFNGLUNIFORM3FVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORM3ICONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLint v0, GLint v1, GLint v2); >+typedef void (GL_APIENTRYP PFNGLUNIFORM3IVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, const GLint *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORM4FCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); >+typedef void (GL_APIENTRYP PFNGLUNIFORM4FVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORM4ICONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); >+typedef void (GL_APIENTRYP PFNGLUNIFORM4IVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, const GLint *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2FVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3FVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program); >+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLfloat x); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, const GLfloat *v); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLfloat x, GLfloat y); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, const GLfloat *v); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLfloat x, GLfloat y, GLfloat z); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, const GLfloat *v); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, const GLfloat *v); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); >+typedef void (GL_APIENTRYP PFNGLVIEWPORTCONTEXTANGLEPROC)(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint id); >+typedef void (GL_APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLuint color, const GLchar *name); >+typedef void (GL_APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); >+typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint array); >+typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); >+typedef void (GL_APIENTRYP PFNGLBUFFERSTORAGEMEMEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); >+typedef void (GL_APIENTRYP PFNGLCREATEMEMORYOBJECTSEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *memoryObjects); >+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLDEBUGPROCKHR callback, const void *userParam); >+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); >+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); >+typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *fences); >+typedef void (GL_APIENTRYP PFNGLDELETEMEMORYOBJECTSEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *memoryObjects); >+typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *ids); >+typedef void (GL_APIENTRYP PFNGLDELETESEMAPHORESEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *semaphores); >+typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *arrays); >+typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei numAttachments, const GLenum *attachments); >+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, GLint first, GLsizei count, GLsizei primcount); >+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, GLint start, GLsizei count, GLsizei primcount); >+typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLenum *bufs); >+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); >+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); >+typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLeglImageOES image); >+typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLeglImageOES image); >+typedef void (GL_APIENTRYP PFNGLENDQUERYEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target); >+typedef void (GL_APIENTRYP PFNGLFINISHFENCENVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint fence); >+typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length); >+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level); >+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); >+typedef void (GL_APIENTRYP PFNGLGENFENCESNVCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *fences); >+typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *ids); >+typedef void (GL_APIENTRYP PFNGLGENSEMAPHORESEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *semaphores); >+typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *arrays); >+typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, void **params); >+typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); >+typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint fence, GLenum pname, GLint *params); >+typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATAINDEXEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, const GLchar *name); >+typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef void (GL_APIENTRYP PFNGLGETMEMORYOBJECTPARAMETERIVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint memoryObject, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); >+typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELKHRCONTEXTANGLEPROC)(GLeglContext ctx, const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); >+typedef void (GL_APIENTRYP PFNGLGETPOINTERVKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, void **params); >+typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); >+typedef GLint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLenum programInterface, const GLchar *name); >+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint id, GLenum pname, GLint64 *params); >+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint id, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint id, GLenum pname, GLuint64 *params); >+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint id, GLenum pname, GLuint *params); >+typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLuint *params); >+typedef void (GL_APIENTRYP PFNGLGETSEMAPHOREPARAMETERUI64VEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint semaphore, GLenum pname, GLuint64 *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLuint *params); >+typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source); >+typedef void (GL_APIENTRYP PFNGLGETUNSIGNEDBYTEVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLubyte *data); >+typedef void (GL_APIENTRYP PFNGLGETUNSIGNEDBYTEI_VEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint index, GLubyte *data); >+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLint *params); >+typedef void (GL_APIENTRYP PFNGLIMPORTMEMORYFDEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint memory, GLuint64 size, GLenum handleType, GLint fd); >+typedef void (GL_APIENTRYP PFNGLIMPORTSEMAPHOREFDEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint semaphore, GLenum handleType, GLint fd); >+typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei length, const GLchar *marker); >+typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint fence); >+typedef GLboolean (GL_APIENTRYP PFNGLISMEMORYOBJECTEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint memoryObject); >+typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint id); >+typedef GLboolean (GL_APIENTRYP PFNGLISSEMAPHOREEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint semaphore); >+typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint array); >+typedef void *(GL_APIENTRYP PFNGLMAPBUFFEROESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum access); >+typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); >+typedef void (GL_APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLuint count); >+typedef void (GL_APIENTRYP PFNGLMEMORYOBJECTPARAMETERIVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint memoryObject, GLenum pname, const GLint *params); >+typedef void (GL_APIENTRYP PFNGLOBJECTLABELKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum identifier, GLuint name, GLsizei length, const GLchar *label); >+typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELKHRCONTEXTANGLEPROC)(GLeglContext ctx, const void *ptr, GLsizei length, const GLchar *label); >+typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPKHRCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLenum binaryFormat, const void *binary, GLint length); >+typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum source, GLuint id, GLsizei length, const GLchar *message); >+typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei length, const GLchar *marker); >+typedef void (GL_APIENTRYP PFNGLQUERYCOUNTEREXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint id, GLenum target); >+typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); >+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, const GLint *param); >+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, const GLuint *param); >+typedef void (GL_APIENTRYP PFNGLSEMAPHOREPARAMETERUI64VEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint semaphore, GLenum pname, const GLuint64 *params); >+typedef void (GL_APIENTRYP PFNGLSETFENCENVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint fence, GLenum condition); >+typedef void (GL_APIENTRYP PFNGLSIGNALSEMAPHOREEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); >+typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint fence); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, const GLint *params); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, const GLuint *params); >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM2DEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM3DEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); >+typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLuint divisor); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLuint divisor); >+typedef void (GL_APIENTRYP PFNGLWAITSEMAPHOREEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); >+typedef void (GL_APIENTRYP PFNGLBINDUNIFORMLOCATIONCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, const GLchar* name); >+typedef void (GL_APIENTRYP PFNGLCOVERAGEMODULATIONCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLenum components); >+typedef void (GL_APIENTRYP PFNGLMATRIXLOADFCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLenum matrixMode, const GLfloat * matrix); >+typedef void (GL_APIENTRYP PFNGLMATRIXLOADIDENTITYCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLenum matrixMode); >+typedef GLuint (GL_APIENTRYP PFNGLGENPATHSCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei range); >+typedef void (GL_APIENTRYP PFNGLDELETEPATHSCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint first, GLsizei range); >+typedef GLboolean (GL_APIENTRYP PFNGLISPATHCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint path); >+typedef void (GL_APIENTRYP PFNGLPATHCOMMANDSCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint path, GLsizei numCommands, const GLubyte * commands, GLsizei numCoords, GLenum coordType, const void* coords); >+typedef void (GL_APIENTRYP PFNGLPATHPARAMETERFCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint path, GLenum pname, GLfloat value); >+typedef void (GL_APIENTRYP PFNGLPATHPARAMETERICHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint path, GLenum pname, GLint value); >+typedef void (GL_APIENTRYP PFNGLGETPATHPARAMETERFVCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint path, GLenum pname, GLfloat * value); >+typedef void (GL_APIENTRYP PFNGLGETPATHPARAMETERIVCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint path, GLenum pname, GLint * value); >+typedef void (GL_APIENTRYP PFNGLPATHSTENCILFUNCCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLenum func, GLint ref, GLuint mask); >+typedef void (GL_APIENTRYP PFNGLSTENCILFILLPATHCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint path, GLenum fillMode, GLuint mask); >+typedef void (GL_APIENTRYP PFNGLSTENCILSTROKEPATHCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint path, GLint reference, GLuint mask); >+typedef void (GL_APIENTRYP PFNGLCOVERFILLPATHCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint path, GLenum coverMode); >+typedef void (GL_APIENTRYP PFNGLCOVERSTROKEPATHCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint path, GLenum coverMode); >+typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); >+typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint path, GLint reference, GLuint mask, GLenum coverMode); >+typedef void (GL_APIENTRYP PFNGLCOVERFILLPATHINSTANCEDCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei numPath, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat * transformValues); >+typedef void (GL_APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei numPath, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat * transformValues); >+typedef void (GL_APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei numPath, GLenum pathNameType, const void * paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat * transformValues); >+typedef void (GL_APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat * transformValues); >+typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat * transformValues); >+typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat * transformValues); >+typedef void (GL_APIENTRYP PFNGLBINDFRAGMENTINPUTLOCATIONCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint programs, GLint location, const GLchar * name); >+typedef void (GL_APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat * coeffs); >+typedef void (GL_APIENTRYP PFNGLCOPYTEXTURECHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint internalFormat, GLenum destType, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha); >+typedef void (GL_APIENTRYP PFNGLCOPYSUBTEXTURECHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint xoffset, GLint yoffset, GLint x, GLint y, GLint width, GLint height, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDCOPYTEXTURECHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sourceId, GLuint destId); >+typedef void (GL_APIENTRYP PFNGLREQUESTEXTENSIONANGLECONTEXTANGLEPROC)(GLeglContext ctx, const GLchar * name); >+typedef void (GL_APIENTRYP PFNGLGETBOOLEANVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLboolean * params); >+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETFLOATVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params); >+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum attachment, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETINTEGERVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * data); >+typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETSHADERIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint shader, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLfloat * params); >+typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, void ** pointer); >+typedef void (GL_APIENTRYP PFNGLREADPIXELSROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei * length, GLsizei * columns, GLsizei * rows, void * pixels); >+typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void * pixels); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLfloat * params); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLint * params); >+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, const void * pixels); >+typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void * pixels); >+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, const void * pixels); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, GLsizei dataSize, const GLvoid * data); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLsizei xoffset, GLsizei yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLsizei dataSize, const GLvoid * data); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLsizei dataSize, const GLvoid * data); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, GLsizei dataSize, const GLvoid * data); >+typedef void (GL_APIENTRYP PFNGLGETQUERYIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params); >+typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, void ** params); >+typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint index, GLsizei bufSize, GLsizei * length, GLint * data); >+typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIUIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params); >+typedef void (GL_APIENTRYP PFNGLGETUNIFORMUIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLuint * params); >+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETINTEGER64VROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLint64 * data); >+typedef void (GL_APIENTRYP PFNGLGETINTEGER64I_VROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint index, GLsizei bufSize, GLsizei * length, GLint64 * data); >+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERI64VROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint64 * params); >+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLuint pname, GLsizei bufSize, const GLint * param); >+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, const GLfloat * param); >+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERFVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params); >+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINTERFACEIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLenum programInterface, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETBOOLEANI_VROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint index, GLsizei bufSize, GLsizei * length, GLboolean * data); >+typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLuint index, GLsizei bufSize, GLsizei * length, GLfloat * val); >+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params); >+typedef void (GL_APIENTRYP PFNGLGETPOINTERVROBUSTANGLEROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, void ** params); >+typedef void (GL_APIENTRYP PFNGLREADNPIXELSROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei * length, GLsizei * columns, GLsizei * rows, void * data); >+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLfloat * params); >+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLuint * params); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLint * params); >+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLuint * params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params); >+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, const GLint * param); >+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, const GLuint * param); >+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params); >+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLint64 * params); >+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint64 * params); >+typedef void (GL_APIENTRYP PFNGLCOPYTEXTURE3DANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint internalFormat, GLenum destType, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha); >+typedef void (GL_APIENTRYP PFNGLCOPYSUBTEXTURE3DANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLint z, GLint width, GLint height, GLint depth, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha); >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); >+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLint * params); >+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLfloat * params); >+typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, const GLint *firsts, const GLsizei *counts, GLsizei drawcount); >+typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSINSTANCEDANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, const GLint *firsts, const GLsizei *counts, const GLsizei *instanceCounts, GLsizei drawcount); >+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, const GLsizei *counts, GLenum type, const GLvoid *const*indices, GLsizei drawcount); >+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSINSTANCEDANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, const GLsizei *counts, GLenum type, const GLvoid *const*indices, const GLsizei*instanceCounts, GLsizei drawcount); >+typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLuint index, GLfloat * val); >+typedef void (GL_APIENTRYP PFNGLSAMPLEMASKIANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint maskNumber, GLbitfield mask); >+typedef void (GL_APIENTRYP PFNGLPROVOKINGVERTEXANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode); >+typedef void (GL_APIENTRYP PFNGLLOSECONTEXTCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLenum current, GLenum other); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glActiveTextureContextANGLE(GLeglContext ctx, GLenum texture); >+GL_APICALL void GL_APIENTRY glAttachShaderContextANGLE(GLeglContext ctx, GLuint program, GLuint shader); >+GL_APICALL void GL_APIENTRY glBindAttribLocationContextANGLE(GLeglContext ctx, GLuint program, GLuint index, const GLchar *name); >+GL_APICALL void GL_APIENTRY glBindBufferContextANGLE(GLeglContext ctx, GLenum target, GLuint buffer); >+GL_APICALL void GL_APIENTRY glBindFramebufferContextANGLE(GLeglContext ctx, GLenum target, GLuint framebuffer); >+GL_APICALL void GL_APIENTRY glBindRenderbufferContextANGLE(GLeglContext ctx, GLenum target, GLuint renderbuffer); >+GL_APICALL void GL_APIENTRY glBindTextureContextANGLE(GLeglContext ctx, GLenum target, GLuint texture); >+GL_APICALL void GL_APIENTRY glBlendColorContextANGLE(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); >+GL_APICALL void GL_APIENTRY glBlendEquationContextANGLE(GLeglContext ctx, GLenum mode); >+GL_APICALL void GL_APIENTRY glBlendEquationSeparateContextANGLE(GLeglContext ctx, GLenum modeRGB, GLenum modeAlpha); >+GL_APICALL void GL_APIENTRY glBlendFuncContextANGLE(GLeglContext ctx, GLenum sfactor, GLenum dfactor); >+GL_APICALL void GL_APIENTRY glBlendFuncSeparateContextANGLE(GLeglContext ctx, GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); >+GL_APICALL void GL_APIENTRY glBufferDataContextANGLE(GLeglContext ctx, GLenum target, GLsizeiptr size, const void *data, GLenum usage); >+GL_APICALL void GL_APIENTRY glBufferSubDataContextANGLE(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr size, const void *data); >+GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatusContextANGLE(GLeglContext ctx, GLenum target); >+GL_APICALL void GL_APIENTRY glClearContextANGLE(GLeglContext ctx, GLbitfield mask); >+GL_APICALL void GL_APIENTRY glClearColorContextANGLE(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); >+GL_APICALL void GL_APIENTRY glClearDepthfContextANGLE(GLeglContext ctx, GLfloat d); >+GL_APICALL void GL_APIENTRY glClearStencilContextANGLE(GLeglContext ctx, GLint s); >+GL_APICALL void GL_APIENTRY glColorMaskContextANGLE(GLeglContext ctx, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); >+GL_APICALL void GL_APIENTRY glCompileShaderContextANGLE(GLeglContext ctx, GLuint shader); >+GL_APICALL void GL_APIENTRY glCompressedTexImage2DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); >+GL_APICALL void GL_APIENTRY glCompressedTexSubImage2DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); >+GL_APICALL void GL_APIENTRY glCopyTexImage2DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); >+GL_APICALL void GL_APIENTRY glCopyTexSubImage2DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); >+GL_APICALL GLuint GL_APIENTRY glCreateProgramContextANGLE(GLeglContext ctx); >+GL_APICALL GLuint GL_APIENTRY glCreateShaderContextANGLE(GLeglContext ctx, GLenum type); >+GL_APICALL void GL_APIENTRY glCullFaceContextANGLE(GLeglContext ctx, GLenum mode); >+GL_APICALL void GL_APIENTRY glDeleteBuffersContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *buffers); >+GL_APICALL void GL_APIENTRY glDeleteFramebuffersContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *framebuffers); >+GL_APICALL void GL_APIENTRY glDeleteProgramContextANGLE(GLeglContext ctx, GLuint program); >+GL_APICALL void GL_APIENTRY glDeleteRenderbuffersContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *renderbuffers); >+GL_APICALL void GL_APIENTRY glDeleteShaderContextANGLE(GLeglContext ctx, GLuint shader); >+GL_APICALL void GL_APIENTRY glDeleteTexturesContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *textures); >+GL_APICALL void GL_APIENTRY glDepthFuncContextANGLE(GLeglContext ctx, GLenum func); >+GL_APICALL void GL_APIENTRY glDepthMaskContextANGLE(GLeglContext ctx, GLboolean flag); >+GL_APICALL void GL_APIENTRY glDepthRangefContextANGLE(GLeglContext ctx, GLfloat n, GLfloat f); >+GL_APICALL void GL_APIENTRY glDetachShaderContextANGLE(GLeglContext ctx, GLuint program, GLuint shader); >+GL_APICALL void GL_APIENTRY glDisableContextANGLE(GLeglContext ctx, GLenum cap); >+GL_APICALL void GL_APIENTRY glDisableVertexAttribArrayContextANGLE(GLeglContext ctx, GLuint index); >+GL_APICALL void GL_APIENTRY glDrawArraysContextANGLE(GLeglContext ctx, GLenum mode, GLint first, GLsizei count); >+GL_APICALL void GL_APIENTRY glDrawElementsContextANGLE(GLeglContext ctx, GLenum mode, GLsizei count, GLenum type, const void *indices); >+GL_APICALL void GL_APIENTRY glEnableContextANGLE(GLeglContext ctx, GLenum cap); >+GL_APICALL void GL_APIENTRY glEnableVertexAttribArrayContextANGLE(GLeglContext ctx, GLuint index); >+GL_APICALL void GL_APIENTRY glFinishContextANGLE(GLeglContext ctx); >+GL_APICALL void GL_APIENTRY glFlushContextANGLE(GLeglContext ctx); >+GL_APICALL void GL_APIENTRY glFramebufferRenderbufferContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); >+GL_APICALL void GL_APIENTRY glFramebufferTexture2DContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); >+GL_APICALL void GL_APIENTRY glFrontFaceContextANGLE(GLeglContext ctx, GLenum mode); >+GL_APICALL void GL_APIENTRY glGenBuffersContextANGLE(GLeglContext ctx, GLsizei n, GLuint *buffers); >+GL_APICALL void GL_APIENTRY glGenFramebuffersContextANGLE(GLeglContext ctx, GLsizei n, GLuint *framebuffers); >+GL_APICALL void GL_APIENTRY glGenRenderbuffersContextANGLE(GLeglContext ctx, GLsizei n, GLuint *renderbuffers); >+GL_APICALL void GL_APIENTRY glGenTexturesContextANGLE(GLeglContext ctx, GLsizei n, GLuint *textures); >+GL_APICALL void GL_APIENTRY glGenerateMipmapContextANGLE(GLeglContext ctx, GLenum target); >+GL_APICALL void GL_APIENTRY glGetActiveAttribContextANGLE(GLeglContext ctx, GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); >+GL_APICALL void GL_APIENTRY glGetActiveUniformContextANGLE(GLeglContext ctx, GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); >+GL_APICALL void GL_APIENTRY glGetAttachedShadersContextANGLE(GLeglContext ctx, GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); >+GL_APICALL GLint GL_APIENTRY glGetAttribLocationContextANGLE(GLeglContext ctx, GLuint program, const GLchar *name); >+GL_APICALL void GL_APIENTRY glGetBooleanvContextANGLE(GLeglContext ctx, GLenum pname, GLboolean *data); >+GL_APICALL void GL_APIENTRY glGetBufferParameterivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+GL_APICALL GLenum GL_APIENTRY glGetErrorContextANGLE(GLeglContext ctx); >+GL_APICALL void GL_APIENTRY glGetFloatvContextANGLE(GLeglContext ctx, GLenum pname, GLfloat *data); >+GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameterivContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetIntegervContextANGLE(GLeglContext ctx, GLenum pname, GLint *data); >+GL_APICALL void GL_APIENTRY glGetProgramInfoLogContextANGLE(GLeglContext ctx, GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); >+GL_APICALL void GL_APIENTRY glGetProgramivContextANGLE(GLeglContext ctx, GLuint program, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetRenderbufferParameterivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetShaderInfoLogContextANGLE(GLeglContext ctx, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); >+GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormatContextANGLE(GLeglContext ctx, GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); >+GL_APICALL void GL_APIENTRY glGetShaderSourceContextANGLE(GLeglContext ctx, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); >+GL_APICALL void GL_APIENTRY glGetShaderivContextANGLE(GLeglContext ctx, GLuint shader, GLenum pname, GLint *params); >+GL_APICALL const GLubyte *GL_APIENTRY glGetStringContextANGLE(GLeglContext ctx, GLenum name); >+GL_APICALL void GL_APIENTRY glGetTexParameterfvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfloat *params); >+GL_APICALL void GL_APIENTRY glGetTexParameterivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+GL_APICALL GLint GL_APIENTRY glGetUniformLocationContextANGLE(GLeglContext ctx, GLuint program, const GLchar *name); >+GL_APICALL void GL_APIENTRY glGetUniformfvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLfloat *params); >+GL_APICALL void GL_APIENTRY glGetUniformivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLint *params); >+GL_APICALL void GL_APIENTRY glGetVertexAttribPointervContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, void **pointer); >+GL_APICALL void GL_APIENTRY glGetVertexAttribfvContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLfloat *params); >+GL_APICALL void GL_APIENTRY glGetVertexAttribivContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glHintContextANGLE(GLeglContext ctx, GLenum target, GLenum mode); >+GL_APICALL GLboolean GL_APIENTRY glIsBufferContextANGLE(GLeglContext ctx, GLuint buffer); >+GL_APICALL GLboolean GL_APIENTRY glIsEnabledContextANGLE(GLeglContext ctx, GLenum cap); >+GL_APICALL GLboolean GL_APIENTRY glIsFramebufferContextANGLE(GLeglContext ctx, GLuint framebuffer); >+GL_APICALL GLboolean GL_APIENTRY glIsProgramContextANGLE(GLeglContext ctx, GLuint program); >+GL_APICALL GLboolean GL_APIENTRY glIsRenderbufferContextANGLE(GLeglContext ctx, GLuint renderbuffer); >+GL_APICALL GLboolean GL_APIENTRY glIsShaderContextANGLE(GLeglContext ctx, GLuint shader); >+GL_APICALL GLboolean GL_APIENTRY glIsTextureContextANGLE(GLeglContext ctx, GLuint texture); >+GL_APICALL void GL_APIENTRY glLineWidthContextANGLE(GLeglContext ctx, GLfloat width); >+GL_APICALL void GL_APIENTRY glLinkProgramContextANGLE(GLeglContext ctx, GLuint program); >+GL_APICALL void GL_APIENTRY glPixelStoreiContextANGLE(GLeglContext ctx, GLenum pname, GLint param); >+GL_APICALL void GL_APIENTRY glPolygonOffsetContextANGLE(GLeglContext ctx, GLfloat factor, GLfloat units); >+GL_APICALL void GL_APIENTRY glReadPixelsContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); >+GL_APICALL void GL_APIENTRY glReleaseShaderCompilerContextANGLE(GLeglContext ctx); >+GL_APICALL void GL_APIENTRY glRenderbufferStorageContextANGLE(GLeglContext ctx, GLenum target, GLenum internalformat, GLsizei width, GLsizei height); >+GL_APICALL void GL_APIENTRY glSampleCoverageContextANGLE(GLeglContext ctx, GLfloat value, GLboolean invert); >+GL_APICALL void GL_APIENTRY glScissorContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height); >+GL_APICALL void GL_APIENTRY glShaderBinaryContextANGLE(GLeglContext ctx, GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); >+GL_APICALL void GL_APIENTRY glShaderSourceContextANGLE(GLeglContext ctx, GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); >+GL_APICALL void GL_APIENTRY glStencilFuncContextANGLE(GLeglContext ctx, GLenum func, GLint ref, GLuint mask); >+GL_APICALL void GL_APIENTRY glStencilFuncSeparateContextANGLE(GLeglContext ctx, GLenum face, GLenum func, GLint ref, GLuint mask); >+GL_APICALL void GL_APIENTRY glStencilMaskContextANGLE(GLeglContext ctx, GLuint mask); >+GL_APICALL void GL_APIENTRY glStencilMaskSeparateContextANGLE(GLeglContext ctx, GLenum face, GLuint mask); >+GL_APICALL void GL_APIENTRY glStencilOpContextANGLE(GLeglContext ctx, GLenum fail, GLenum zfail, GLenum zpass); >+GL_APICALL void GL_APIENTRY glStencilOpSeparateContextANGLE(GLeglContext ctx, GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); >+GL_APICALL void GL_APIENTRY glTexImage2DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); >+GL_APICALL void GL_APIENTRY glTexParameterfContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfloat param); >+GL_APICALL void GL_APIENTRY glTexParameterfvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLfloat *params); >+GL_APICALL void GL_APIENTRY glTexParameteriContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint param); >+GL_APICALL void GL_APIENTRY glTexParameterivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLint *params); >+GL_APICALL void GL_APIENTRY glTexSubImage2DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); >+GL_APICALL void GL_APIENTRY glUniform1fContextANGLE(GLeglContext ctx, GLint location, GLfloat v0); >+GL_APICALL void GL_APIENTRY glUniform1fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glUniform1iContextANGLE(GLeglContext ctx, GLint location, GLint v0); >+GL_APICALL void GL_APIENTRY glUniform1ivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLint *value); >+GL_APICALL void GL_APIENTRY glUniform2fContextANGLE(GLeglContext ctx, GLint location, GLfloat v0, GLfloat v1); >+GL_APICALL void GL_APIENTRY glUniform2fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glUniform2iContextANGLE(GLeglContext ctx, GLint location, GLint v0, GLint v1); >+GL_APICALL void GL_APIENTRY glUniform2ivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLint *value); >+GL_APICALL void GL_APIENTRY glUniform3fContextANGLE(GLeglContext ctx, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); >+GL_APICALL void GL_APIENTRY glUniform3fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glUniform3iContextANGLE(GLeglContext ctx, GLint location, GLint v0, GLint v1, GLint v2); >+GL_APICALL void GL_APIENTRY glUniform3ivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLint *value); >+GL_APICALL void GL_APIENTRY glUniform4fContextANGLE(GLeglContext ctx, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); >+GL_APICALL void GL_APIENTRY glUniform4fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glUniform4iContextANGLE(GLeglContext ctx, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); >+GL_APICALL void GL_APIENTRY glUniform4ivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLint *value); >+GL_APICALL void GL_APIENTRY glUniformMatrix2fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glUniformMatrix3fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glUniformMatrix4fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glUseProgramContextANGLE(GLeglContext ctx, GLuint program); >+GL_APICALL void GL_APIENTRY glValidateProgramContextANGLE(GLeglContext ctx, GLuint program); >+GL_APICALL void GL_APIENTRY glVertexAttrib1fContextANGLE(GLeglContext ctx, GLuint index, GLfloat x); >+GL_APICALL void GL_APIENTRY glVertexAttrib1fvContextANGLE(GLeglContext ctx, GLuint index, const GLfloat *v); >+GL_APICALL void GL_APIENTRY glVertexAttrib2fContextANGLE(GLeglContext ctx, GLuint index, GLfloat x, GLfloat y); >+GL_APICALL void GL_APIENTRY glVertexAttrib2fvContextANGLE(GLeglContext ctx, GLuint index, const GLfloat *v); >+GL_APICALL void GL_APIENTRY glVertexAttrib3fContextANGLE(GLeglContext ctx, GLuint index, GLfloat x, GLfloat y, GLfloat z); >+GL_APICALL void GL_APIENTRY glVertexAttrib3fvContextANGLE(GLeglContext ctx, GLuint index, const GLfloat *v); >+GL_APICALL void GL_APIENTRY glVertexAttrib4fContextANGLE(GLeglContext ctx, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); >+GL_APICALL void GL_APIENTRY glVertexAttrib4fvContextANGLE(GLeglContext ctx, GLuint index, const GLfloat *v); >+GL_APICALL void GL_APIENTRY glVertexAttribPointerContextANGLE(GLeglContext ctx, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); >+GL_APICALL void GL_APIENTRY glViewportContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height); >+GL_APICALL void GL_APIENTRY glBeginQueryEXTContextANGLE(GLeglContext ctx, GLenum target, GLuint id); >+GL_APICALL void GL_APIENTRY glBindFragDataLocationEXTContextANGLE(GLeglContext ctx, GLuint program, GLuint color, const GLchar *name); >+GL_APICALL void GL_APIENTRY glBindFragDataLocationIndexedEXTContextANGLE(GLeglContext ctx, GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); >+GL_APICALL void GL_APIENTRY glBindVertexArrayOESContextANGLE(GLeglContext ctx, GLuint array); >+GL_APICALL void GL_APIENTRY glBlitFramebufferANGLEContextANGLE(GLeglContext ctx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); >+GL_APICALL void GL_APIENTRY glBufferStorageMemEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); >+GL_APICALL void GL_APIENTRY glCreateMemoryObjectsEXTContextANGLE(GLeglContext ctx, GLsizei n, GLuint *memoryObjects); >+GL_APICALL void GL_APIENTRY glDebugMessageCallbackKHRContextANGLE(GLeglContext ctx, GLDEBUGPROCKHR callback, const void *userParam); >+GL_APICALL void GL_APIENTRY glDebugMessageControlKHRContextANGLE(GLeglContext ctx, GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); >+GL_APICALL void GL_APIENTRY glDebugMessageInsertKHRContextANGLE(GLeglContext ctx, GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); >+GL_APICALL void GL_APIENTRY glDeleteFencesNVContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *fences); >+GL_APICALL void GL_APIENTRY glDeleteMemoryObjectsEXTContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *memoryObjects); >+GL_APICALL void GL_APIENTRY glDeleteQueriesEXTContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *ids); >+GL_APICALL void GL_APIENTRY glDeleteSemaphoresEXTContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *semaphores); >+GL_APICALL void GL_APIENTRY glDeleteVertexArraysOESContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *arrays); >+GL_APICALL void GL_APIENTRY glDiscardFramebufferEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei numAttachments, const GLenum *attachments); >+GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLEContextANGLE(GLeglContext ctx, GLenum mode, GLint first, GLsizei count, GLsizei primcount); >+GL_APICALL void GL_APIENTRY glDrawArraysInstancedEXTContextANGLE(GLeglContext ctx, GLenum mode, GLint start, GLsizei count, GLsizei primcount); >+GL_APICALL void GL_APIENTRY glDrawBuffersEXTContextANGLE(GLeglContext ctx, GLsizei n, const GLenum *bufs); >+GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLEContextANGLE(GLeglContext ctx, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); >+GL_APICALL void GL_APIENTRY glDrawElementsInstancedEXTContextANGLE(GLeglContext ctx, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); >+GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOESContextANGLE(GLeglContext ctx, GLenum target, GLeglImageOES image); >+GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOESContextANGLE(GLeglContext ctx, GLenum target, GLeglImageOES image); >+GL_APICALL void GL_APIENTRY glEndQueryEXTContextANGLE(GLeglContext ctx, GLenum target); >+GL_APICALL void GL_APIENTRY glFinishFenceNVContextANGLE(GLeglContext ctx, GLuint fence); >+GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXTContextANGLE(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length); >+GL_APICALL void GL_APIENTRY glFramebufferTextureEXTContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level); >+GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewOVRContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); >+GL_APICALL void GL_APIENTRY glGenFencesNVContextANGLE(GLeglContext ctx, GLsizei n, GLuint *fences); >+GL_APICALL void GL_APIENTRY glGenQueriesEXTContextANGLE(GLeglContext ctx, GLsizei n, GLuint *ids); >+GL_APICALL void GL_APIENTRY glGenSemaphoresEXTContextANGLE(GLeglContext ctx, GLsizei n, GLuint *semaphores); >+GL_APICALL void GL_APIENTRY glGenVertexArraysOESContextANGLE(GLeglContext ctx, GLsizei n, GLuint *arrays); >+GL_APICALL void GL_APIENTRY glGetBufferPointervOESContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, void **params); >+GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLogKHRContextANGLE(GLeglContext ctx, GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); >+GL_APICALL void GL_APIENTRY glGetFenceivNVContextANGLE(GLeglContext ctx, GLuint fence, GLenum pname, GLint *params); >+GL_APICALL GLint GL_APIENTRY glGetFragDataIndexEXTContextANGLE(GLeglContext ctx, GLuint program, const GLchar *name); >+GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXTContextANGLE(GLeglContext ctx); >+GL_APICALL void GL_APIENTRY glGetMemoryObjectParameterivEXTContextANGLE(GLeglContext ctx, GLuint memoryObject, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetObjectLabelKHRContextANGLE(GLeglContext ctx, GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); >+GL_APICALL void GL_APIENTRY glGetObjectPtrLabelKHRContextANGLE(GLeglContext ctx, const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); >+GL_APICALL void GL_APIENTRY glGetPointervKHRContextANGLE(GLeglContext ctx, GLenum pname, void **params); >+GL_APICALL void GL_APIENTRY glGetProgramBinaryOESContextANGLE(GLeglContext ctx, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); >+GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocationIndexEXTContextANGLE(GLeglContext ctx, GLuint program, GLenum programInterface, const GLchar *name); >+GL_APICALL void GL_APIENTRY glGetQueryObjecti64vEXTContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLint64 *params); >+GL_APICALL void GL_APIENTRY glGetQueryObjectivEXTContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetQueryObjectui64vEXTContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLuint64 *params); >+GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXTContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLuint *params); >+GL_APICALL void GL_APIENTRY glGetQueryivEXTContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetSamplerParameterIivOESContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivOESContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLuint *params); >+GL_APICALL void GL_APIENTRY glGetSemaphoreParameterui64vEXTContextANGLE(GLeglContext ctx, GLuint semaphore, GLenum pname, GLuint64 *params); >+GL_APICALL void GL_APIENTRY glGetTexParameterIivOESContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetTexParameterIuivOESContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLuint *params); >+GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLEContextANGLE(GLeglContext ctx, GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source); >+GL_APICALL void GL_APIENTRY glGetUnsignedBytevEXTContextANGLE(GLeglContext ctx, GLenum pname, GLubyte *data); >+GL_APICALL void GL_APIENTRY glGetUnsignedBytei_vEXTContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLubyte *data); >+GL_APICALL void GL_APIENTRY glGetnUniformfvEXTContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLfloat *params); >+GL_APICALL void GL_APIENTRY glGetnUniformivEXTContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLint *params); >+GL_APICALL void GL_APIENTRY glImportMemoryFdEXTContextANGLE(GLeglContext ctx, GLuint memory, GLuint64 size, GLenum handleType, GLint fd); >+GL_APICALL void GL_APIENTRY glImportSemaphoreFdEXTContextANGLE(GLeglContext ctx, GLuint semaphore, GLenum handleType, GLint fd); >+GL_APICALL void GL_APIENTRY glInsertEventMarkerEXTContextANGLE(GLeglContext ctx, GLsizei length, const GLchar *marker); >+GL_APICALL GLboolean GL_APIENTRY glIsFenceNVContextANGLE(GLeglContext ctx, GLuint fence); >+GL_APICALL GLboolean GL_APIENTRY glIsMemoryObjectEXTContextANGLE(GLeglContext ctx, GLuint memoryObject); >+GL_APICALL GLboolean GL_APIENTRY glIsQueryEXTContextANGLE(GLeglContext ctx, GLuint id); >+GL_APICALL GLboolean GL_APIENTRY glIsSemaphoreEXTContextANGLE(GLeglContext ctx, GLuint semaphore); >+GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOESContextANGLE(GLeglContext ctx, GLuint array); >+GL_APICALL void *GL_APIENTRY glMapBufferOESContextANGLE(GLeglContext ctx, GLenum target, GLenum access); >+GL_APICALL void *GL_APIENTRY glMapBufferRangeEXTContextANGLE(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); >+GL_APICALL void GL_APIENTRY glMaxShaderCompilerThreadsKHRContextANGLE(GLeglContext ctx, GLuint count); >+GL_APICALL void GL_APIENTRY glMemoryObjectParameterivEXTContextANGLE(GLeglContext ctx, GLuint memoryObject, GLenum pname, const GLint *params); >+GL_APICALL void GL_APIENTRY glObjectLabelKHRContextANGLE(GLeglContext ctx, GLenum identifier, GLuint name, GLsizei length, const GLchar *label); >+GL_APICALL void GL_APIENTRY glObjectPtrLabelKHRContextANGLE(GLeglContext ctx, const void *ptr, GLsizei length, const GLchar *label); >+GL_APICALL void GL_APIENTRY glPopDebugGroupKHRContextANGLE(GLeglContext ctx); >+GL_APICALL void GL_APIENTRY glPopGroupMarkerEXTContextANGLE(GLeglContext ctx); >+GL_APICALL void GL_APIENTRY glProgramBinaryOESContextANGLE(GLeglContext ctx, GLuint program, GLenum binaryFormat, const void *binary, GLint length); >+GL_APICALL void GL_APIENTRY glPushDebugGroupKHRContextANGLE(GLeglContext ctx, GLenum source, GLuint id, GLsizei length, const GLchar *message); >+GL_APICALL void GL_APIENTRY glPushGroupMarkerEXTContextANGLE(GLeglContext ctx, GLsizei length, const GLchar *marker); >+GL_APICALL void GL_APIENTRY glQueryCounterEXTContextANGLE(GLeglContext ctx, GLuint id, GLenum target); >+GL_APICALL void GL_APIENTRY glReadnPixelsEXTContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); >+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLEContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); >+GL_APICALL void GL_APIENTRY glSamplerParameterIivOESContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, const GLint *param); >+GL_APICALL void GL_APIENTRY glSamplerParameterIuivOESContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, const GLuint *param); >+GL_APICALL void GL_APIENTRY glSemaphoreParameterui64vEXTContextANGLE(GLeglContext ctx, GLuint semaphore, GLenum pname, const GLuint64 *params); >+GL_APICALL void GL_APIENTRY glSetFenceNVContextANGLE(GLeglContext ctx, GLuint fence, GLenum condition); >+GL_APICALL void GL_APIENTRY glSignalSemaphoreEXTContextANGLE(GLeglContext ctx, GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); >+GL_APICALL GLboolean GL_APIENTRY glTestFenceNVContextANGLE(GLeglContext ctx, GLuint fence); >+GL_APICALL void GL_APIENTRY glTexParameterIivOESContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLint *params); >+GL_APICALL void GL_APIENTRY glTexParameterIuivOESContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLuint *params); >+GL_APICALL void GL_APIENTRY glTexStorage1DEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); >+GL_APICALL void GL_APIENTRY glTexStorage2DEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); >+GL_APICALL void GL_APIENTRY glTexStorage3DEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); >+GL_APICALL void GL_APIENTRY glTexStorage3DMultisampleOESContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); >+GL_APICALL void GL_APIENTRY glTexStorageMem2DEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); >+GL_APICALL void GL_APIENTRY glTexStorageMem2DMultisampleEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); >+GL_APICALL void GL_APIENTRY glTexStorageMem3DEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); >+GL_APICALL void GL_APIENTRY glTexStorageMem3DMultisampleEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); >+GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOESContextANGLE(GLeglContext ctx, GLenum target); >+GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLEContextANGLE(GLeglContext ctx, GLuint index, GLuint divisor); >+GL_APICALL void GL_APIENTRY glVertexAttribDivisorEXTContextANGLE(GLeglContext ctx, GLuint index, GLuint divisor); >+GL_APICALL void GL_APIENTRY glWaitSemaphoreEXTContextANGLE(GLeglContext ctx, GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); >+GL_APICALL void GL_APIENTRY glBindUniformLocationCHROMIUMContextANGLE(GLeglContext ctx, GLuint program, GLint location, const GLchar* name); >+GL_APICALL void GL_APIENTRY glCoverageModulationCHROMIUMContextANGLE(GLeglContext ctx, GLenum components); >+GL_APICALL void GL_APIENTRY glMatrixLoadfCHROMIUMContextANGLE(GLeglContext ctx, GLenum matrixMode, const GLfloat * matrix); >+GL_APICALL void GL_APIENTRY glMatrixLoadIdentityCHROMIUMContextANGLE(GLeglContext ctx, GLenum matrixMode); >+GL_APICALL GLuint GL_APIENTRY glGenPathsCHROMIUMContextANGLE(GLeglContext ctx, GLsizei range); >+GL_APICALL void GL_APIENTRY glDeletePathsCHROMIUMContextANGLE(GLeglContext ctx, GLuint first, GLsizei range); >+GL_APICALL GLboolean GL_APIENTRY glIsPathCHROMIUMContextANGLE(GLeglContext ctx, GLuint path); >+GL_APICALL void GL_APIENTRY glPathCommandsCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLsizei numCommands, const GLubyte * commands, GLsizei numCoords, GLenum coordType, const void* coords); >+GL_APICALL void GL_APIENTRY glPathParameterfCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum pname, GLfloat value); >+GL_APICALL void GL_APIENTRY glPathParameteriCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum pname, GLint value); >+GL_APICALL void GL_APIENTRY glGetPathParameterfvCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum pname, GLfloat * value); >+GL_APICALL void GL_APIENTRY glGetPathParameterivCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum pname, GLint * value); >+GL_APICALL void GL_APIENTRY glPathStencilFuncCHROMIUMContextANGLE(GLeglContext ctx, GLenum func, GLint ref, GLuint mask); >+GL_APICALL void GL_APIENTRY glStencilFillPathCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum fillMode, GLuint mask); >+GL_APICALL void GL_APIENTRY glStencilStrokePathCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLint reference, GLuint mask); >+GL_APICALL void GL_APIENTRY glCoverFillPathCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum coverMode); >+GL_APICALL void GL_APIENTRY glCoverStrokePathCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum coverMode); >+GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); >+GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLint reference, GLuint mask, GLenum coverMode); >+GL_APICALL void GL_APIENTRY glCoverFillPathInstancedCHROMIUMContextANGLE(GLeglContext ctx, GLsizei numPath, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat * transformValues); >+GL_APICALL void GL_APIENTRY glCoverStrokePathInstancedCHROMIUMContextANGLE(GLeglContext ctx, GLsizei numPath, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat * transformValues); >+GL_APICALL void GL_APIENTRY glStencilStrokePathInstancedCHROMIUMContextANGLE(GLeglContext ctx, GLsizei numPath, GLenum pathNameType, const void * paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat * transformValues); >+GL_APICALL void GL_APIENTRY glStencilFillPathInstancedCHROMIUMContextANGLE(GLeglContext ctx, GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat * transformValues); >+GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathInstancedCHROMIUMContextANGLE(GLeglContext ctx, GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat * transformValues); >+GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathInstancedCHROMIUMContextANGLE(GLeglContext ctx, GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat * transformValues); >+GL_APICALL void GL_APIENTRY glBindFragmentInputLocationCHROMIUMContextANGLE(GLeglContext ctx, GLuint programs, GLint location, const GLchar * name); >+GL_APICALL void GL_APIENTRY glProgramPathFragmentInputGenCHROMIUMContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat * coeffs); >+GL_APICALL void GL_APIENTRY glCopyTextureCHROMIUMContextANGLE(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint internalFormat, GLenum destType, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha); >+GL_APICALL void GL_APIENTRY glCopySubTextureCHROMIUMContextANGLE(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint xoffset, GLint yoffset, GLint x, GLint y, GLint width, GLint height, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha); >+GL_APICALL void GL_APIENTRY glCompressedCopyTextureCHROMIUMContextANGLE(GLeglContext ctx, GLuint sourceId, GLuint destId); >+GL_APICALL void GL_APIENTRY glRequestExtensionANGLEContextANGLE(GLeglContext ctx, const GLchar * name); >+GL_APICALL void GL_APIENTRY glGetBooleanvRobustANGLEContextANGLE(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLboolean * params); >+GL_APICALL void GL_APIENTRY glGetBufferParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetFloatvRobustANGLEContextANGLE(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params); >+GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetIntegervRobustANGLEContextANGLE(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * data); >+GL_APICALL void GL_APIENTRY glGetProgramivRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetRenderbufferParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetShaderivRobustANGLEContextANGLE(GLeglContext ctx, GLuint shader, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetTexParameterfvRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params); >+GL_APICALL void GL_APIENTRY glGetTexParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetUniformfvRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLfloat * params); >+GL_APICALL void GL_APIENTRY glGetUniformivRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetVertexAttribfvRobustANGLEContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params); >+GL_APICALL void GL_APIENTRY glGetVertexAttribivRobustANGLEContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetVertexAttribPointervRobustANGLEContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, void ** pointer); >+GL_APICALL void GL_APIENTRY glReadPixelsRobustANGLEContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei * length, GLsizei * columns, GLsizei * rows, void * pixels); >+GL_APICALL void GL_APIENTRY glTexImage2DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void * pixels); >+GL_APICALL void GL_APIENTRY glTexParameterfvRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLfloat * params); >+GL_APICALL void GL_APIENTRY glTexParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLint * params); >+GL_APICALL void GL_APIENTRY glTexSubImage2DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, const void * pixels); >+GL_APICALL void GL_APIENTRY glTexImage3DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void * pixels); >+GL_APICALL void GL_APIENTRY glTexSubImage3DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, const void * pixels); >+GL_APICALL void GL_APIENTRY glCompressedTexImage2DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, GLsizei dataSize, const GLvoid * data); >+GL_APICALL void GL_APIENTRY glCompressedTexSubImage2DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLsizei xoffset, GLsizei yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLsizei dataSize, const GLvoid * data); >+GL_APICALL void GL_APIENTRY glCompressedTexImage3DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLsizei dataSize, const GLvoid * data); >+GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, GLsizei dataSize, const GLvoid * data); >+GL_APICALL void GL_APIENTRY glGetQueryivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetQueryObjectuivRobustANGLEContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params); >+GL_APICALL void GL_APIENTRY glGetBufferPointervRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, void ** params); >+GL_APICALL void GL_APIENTRY glGetIntegeri_vRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLsizei bufSize, GLsizei * length, GLint * data); >+GL_APICALL void GL_APIENTRY glGetInternalformativRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetVertexAttribIivRobustANGLEContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetVertexAttribIuivRobustANGLEContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params); >+GL_APICALL void GL_APIENTRY glGetUniformuivRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLuint * params); >+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockivRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetInteger64vRobustANGLEContextANGLE(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLint64 * data); >+GL_APICALL void GL_APIENTRY glGetInteger64i_vRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLsizei bufSize, GLsizei * length, GLint64 * data); >+GL_APICALL void GL_APIENTRY glGetBufferParameteri64vRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint64 * params); >+GL_APICALL void GL_APIENTRY glSamplerParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLuint pname, GLsizei bufSize, const GLint * param); >+GL_APICALL void GL_APIENTRY glSamplerParameterfvRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, const GLfloat * param); >+GL_APICALL void GL_APIENTRY glGetSamplerParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetSamplerParameterfvRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params); >+GL_APICALL void GL_APIENTRY glGetFramebufferParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetProgramInterfaceivRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLenum programInterface, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetBooleani_vRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLsizei bufSize, GLsizei * length, GLboolean * data); >+GL_APICALL void GL_APIENTRY glGetMultisamplefvRobustANGLEContextANGLE(GLeglContext ctx, GLenum pname, GLuint index, GLsizei bufSize, GLsizei * length, GLfloat * val); >+GL_APICALL void GL_APIENTRY glGetTexLevelParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetTexLevelParameterfvRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params); >+GL_APICALL void GL_APIENTRY glGetPointervRobustANGLERobustANGLEContextANGLE(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, void ** params); >+GL_APICALL void GL_APIENTRY glReadnPixelsRobustANGLEContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei * length, GLsizei * columns, GLsizei * rows, void * data); >+GL_APICALL void GL_APIENTRY glGetnUniformfvRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLfloat * params); >+GL_APICALL void GL_APIENTRY glGetnUniformivRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetnUniformuivRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLuint * params); >+GL_APICALL void GL_APIENTRY glTexParameterIivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLint * params); >+GL_APICALL void GL_APIENTRY glTexParameterIuivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLuint * params); >+GL_APICALL void GL_APIENTRY glGetTexParameterIivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetTexParameterIuivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params); >+GL_APICALL void GL_APIENTRY glSamplerParameterIivRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, const GLint * param); >+GL_APICALL void GL_APIENTRY glSamplerParameterIuivRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, const GLuint * param); >+GL_APICALL void GL_APIENTRY glGetSamplerParameterIivRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params); >+GL_APICALL void GL_APIENTRY glGetQueryObjectivRobustANGLEContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params); >+GL_APICALL void GL_APIENTRY glGetQueryObjecti64vRobustANGLEContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLint64 * params); >+GL_APICALL void GL_APIENTRY glGetQueryObjectui64vRobustANGLEContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint64 * params); >+GL_APICALL void GL_APIENTRY glCopyTexture3DANGLEContextANGLE(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint internalFormat, GLenum destType, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha); >+GL_APICALL void GL_APIENTRY glCopySubTexture3DANGLEContextANGLE(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLint z, GLint width, GLint height, GLint depth, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha); >+GL_APICALL void GL_APIENTRY glTexStorage2DMultisampleANGLEContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); >+GL_APICALL void GL_APIENTRY glGetTexLevelParameterivANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLint * params); >+GL_APICALL void GL_APIENTRY glGetTexLevelParameterfvANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLfloat * params); >+GL_APICALL void GL_APIENTRY glMultiDrawArraysANGLEContextANGLE(GLeglContext ctx, GLenum mode, const GLint *firsts, const GLsizei *counts, GLsizei drawcount); >+GL_APICALL void GL_APIENTRY glMultiDrawArraysInstancedANGLEContextANGLE(GLeglContext ctx, GLenum mode, const GLint *firsts, const GLsizei *counts, const GLsizei *instanceCounts, GLsizei drawcount); >+GL_APICALL void GL_APIENTRY glMultiDrawElementsANGLEContextANGLE(GLeglContext ctx, GLenum mode, const GLsizei *counts, GLenum type, const GLvoid *const*indices, GLsizei drawcount); >+GL_APICALL void GL_APIENTRY glMultiDrawElementsInstancedANGLEContextANGLE(GLeglContext ctx, GLenum mode, const GLsizei *counts, GLenum type, const GLvoid *const*indices, const GLsizei*instanceCounts, GLsizei drawcount); >+GL_APICALL void GL_APIENTRY glGetMultisamplefvANGLEContextANGLE(GLeglContext ctx, GLenum pname, GLuint index, GLfloat * val); >+GL_APICALL void GL_APIENTRY glSampleMaskiANGLEContextANGLE(GLeglContext ctx, GLuint maskNumber, GLbitfield mask); >+GL_APICALL void GL_APIENTRY glProvokingVertexANGLEContextANGLE(GLeglContext ctx, GLenum mode); >+GL_APICALL void GL_APIENTRY glLoseContextCHROMIUMContextANGLE(GLeglContext ctx, GLenum current, GLenum other); >+#endif >diff --git a/Source/ThirdParty/ANGLE/include/GLES3/.clang-format b/Source/ThirdParty/ANGLE/include/GLES3/.clang-format >new file mode 100644 >index 00000000000..06147100144 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/GLES3/.clang-format >@@ -0,0 +1,3 @@ >+ >+ >+DisableFormat: true >diff --git a/Source/ThirdParty/ANGLE/include/GLES3/gl3.h b/Source/ThirdParty/ANGLE/include/GLES3/gl3.h >index 53c59b85fed..45707856d29 100644 >--- a/Source/ThirdParty/ANGLE/include/GLES3/gl3.h >+++ b/Source/ThirdParty/ANGLE/include/GLES3/gl3.h >@@ -1,12 +1,12 @@ >-#ifndef __gl3_h_ >-#define __gl3_h_ 1 >+#ifndef __gles2_gl3_h_ >+#define __gles2_gl3_h_ 1 > > #ifdef __cplusplus > extern "C" { > #endif > > /* >-** Copyright (c) 2013-2015 The Khronos Group Inc. >+** Copyright (c) 2013-2018 The Khronos Group Inc. > ** > ** Permission is hereby granted, free of charge, to any person obtaining a > ** copy of this software and/or associated documentation files (the >@@ -31,9 +31,7 @@ extern "C" { > ** This header is generated from the Khronos OpenGL / OpenGL ES XML > ** API Registry. The current version of the Registry, generator scripts > ** used to make the header, and the header can be found at >-** http://www.opengl.org/registry/ >-** >-** Khronos $Revision: 31811 $ on $Date: 2015-08-10 00:01:11 -0700 (Mon, 10 Aug 2015) $ >+** https://github.com/KhronosGroup/OpenGL-Registry > */ > > #include <GLES3/gl3platform.h> >@@ -42,7 +40,11 @@ extern "C" { > #define GL_APIENTRYP GL_APIENTRY* > #endif > >-/* Generated on date 20150809 */ >+#ifndef GL_GLES_PROTOTYPES >+#define GL_GLES_PROTOTYPES 1 >+#endif >+ >+/* Generated on date 20181130 */ > > /* Generated C header for: > * API: gles2 >@@ -60,8 +62,8 @@ extern "C" { > typedef khronos_int8_t GLbyte; > typedef khronos_float_t GLclampf; > typedef khronos_int32_t GLfixed; >-typedef short GLshort; >-typedef unsigned short GLushort; >+typedef khronos_int16_t GLshort; >+typedef khronos_uint16_t GLushort; > typedef void GLvoid; > typedef struct __GLsync *GLsync; > typedef khronos_int64_t GLint64; >@@ -520,7 +522,7 @@ typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GL > typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); > typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); > typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); >-#ifdef GL_GLEXT_PROTOTYPES >+#if GL_GLES_PROTOTYPES > GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture); > GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader); > GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); >@@ -668,7 +670,7 @@ GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei > > #ifndef GL_ES_VERSION_3_0 > #define GL_ES_VERSION_3_0 1 >-typedef unsigned short GLhalf; >+typedef khronos_uint16_t GLhalf; > #define GL_READ_BUFFER 0x0C02 > #define GL_UNPACK_ROW_LENGTH 0x0CF2 > #define GL_UNPACK_SKIP_ROWS 0x0CF3 >@@ -1094,7 +1096,7 @@ typedef void (GL_APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GL > typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); > typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); > typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); >-#ifdef GL_GLEXT_PROTOTYPES >+#if GL_GLES_PROTOTYPES > GL_APICALL void GL_APIENTRY glReadBuffer (GLenum src); > GL_APICALL void GL_APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); > GL_APICALL void GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); >diff --git a/Source/ThirdParty/ANGLE/include/GLES3/gl31.h b/Source/ThirdParty/ANGLE/include/GLES3/gl31.h >index 26f869b781d..4806181e042 100644 >--- a/Source/ThirdParty/ANGLE/include/GLES3/gl31.h >+++ b/Source/ThirdParty/ANGLE/include/GLES3/gl31.h >@@ -6,7 +6,7 @@ extern "C" { > #endif > > /* >-** Copyright (c) 2013-2015 The Khronos Group Inc. >+** Copyright (c) 2013-2016 The Khronos Group Inc. > ** > ** Permission is hereby granted, free of charge, to any person obtaining a > ** copy of this software and/or associated documentation files (the >@@ -42,7 +42,11 @@ extern "C" { > #define GL_APIENTRYP GL_APIENTRY* > #endif > >-/* Generated on date 20150809 */ >+#ifndef GL_GLES_PROTOTYPES >+#define GL_GLES_PROTOTYPES 1 >+#endif >+ >+/* Generated on date 20161024 */ > > /* Generated C header for: > * API: gles2 >@@ -520,7 +524,7 @@ typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GL > typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); > typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); > typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); >-#ifdef GL_GLEXT_PROTOTYPES >+#if GL_GLES_PROTOTYPES > GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture); > GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader); > GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); >@@ -1094,7 +1098,7 @@ typedef void (GL_APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GL > typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); > typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); > typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); >-#ifdef GL_GLEXT_PROTOTYPES >+#if GL_GLES_PROTOTYPES > GL_APICALL void GL_APIENTRY glReadBuffer (GLenum src); > GL_APICALL void GL_APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); > GL_APICALL void GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); >@@ -1445,7 +1449,7 @@ typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLi > typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); > typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); > typedef void (GL_APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); >-#ifdef GL_GLEXT_PROTOTYPES >+#if GL_GLES_PROTOTYPES > GL_APICALL void GL_APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); > GL_APICALL void GL_APIENTRY glDispatchComputeIndirect (GLintptr indirect); > GL_APICALL void GL_APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect); >diff --git a/Source/ThirdParty/ANGLE/include/GLES3/gl31ext_explicit_context_autogen.inc b/Source/ThirdParty/ANGLE/include/GLES3/gl31ext_explicit_context_autogen.inc >new file mode 100644 >index 00000000000..62db01b3f81 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/GLES3/gl31ext_explicit_context_autogen.inc >@@ -0,0 +1,148 @@ >+// GENERATED FILE - DO NOT EDIT. >+// Generated by generate_entry_points.py using data from gl.xml and gl_angle_ext.xml. >+// >+// 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. >+// >+// gl31ext_explicit_context_autogen.inc: >+// Function declarations for the EGL_ANGLE_explicit_context extension >+ >+typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint pipeline, GLuint program); >+typedef void (GL_APIENTRYP PFNGLBINDIMAGETEXTURECONTEXTANGLEPROC)(GLeglContext ctx, GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); >+typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINECONTEXTANGLEPROC)(GLeglContext ctx, GLuint pipeline); >+typedef void (GL_APIENTRYP PFNGLBINDVERTEXBUFFERCONTEXTANGLEPROC)(GLeglContext ctx, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); >+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum type, GLsizei count, const GLchar *const*strings); >+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *pipelines); >+typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTECONTEXTANGLEPROC)(GLeglContext ctx, GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); >+typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTCONTEXTANGLEPROC)(GLeglContext ctx, GLintptr indirect); >+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINDIRECTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, const void *indirect); >+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINDIRECTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, GLenum type, const void *indirect); >+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERPARAMETERICONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint param); >+typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *pipelines); >+typedef void (GL_APIENTRYP PFNGLGETBOOLEANI_VCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint index, GLboolean *data); >+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLuint index, GLfloat *val); >+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINTERFACEIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLenum programInterface, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGCONTEXTANGLEPROC)(GLeglContext ctx, GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); >+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint pipeline, GLenum pname, GLint *params); >+typedef GLuint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLenum programInterface, const GLchar *name); >+typedef GLint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLenum programInterface, const GLchar *name); >+typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCENAMECONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); >+typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLint *params); >+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINECONTEXTANGLEPROC)(GLeglContext ctx, GLuint pipeline); >+typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERCONTEXTANGLEPROC)(GLeglContext ctx, GLbitfield barriers); >+typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERBYREGIONCONTEXTANGLEPROC)(GLeglContext ctx, GLbitfield barriers); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLfloat v0); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1ICONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLint v0); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UICONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLuint v0); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLfloat v0, GLfloat v1); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2ICONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLint v0, GLint v1); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UICONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLuint v0, GLuint v1); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3ICONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLint v0, GLint v1, GLint v2); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UICONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4ICONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UICONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLSAMPLEMASKICONTEXTANGLEPROC)(GLeglContext ctx, GLuint maskNumber, GLbitfield mask); >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); >+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint pipeline, GLbitfield stages, GLuint program); >+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINECONTEXTANGLEPROC)(GLeglContext ctx, GLuint pipeline); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBBINDINGCONTEXTANGLEPROC)(GLeglContext ctx, GLuint attribindex, GLuint bindingindex); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBFORMATCONTEXTANGLEPROC)(GLeglContext ctx, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIFORMATCONTEXTANGLEPROC)(GLeglContext ctx, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); >+typedef void (GL_APIENTRYP PFNGLVERTEXBINDINGDIVISORCONTEXTANGLEPROC)(GLeglContext ctx, GLuint bindingindex, GLuint divisor); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glActiveShaderProgramContextANGLE(GLeglContext ctx, GLuint pipeline, GLuint program); >+GL_APICALL void GL_APIENTRY glBindImageTextureContextANGLE(GLeglContext ctx, GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); >+GL_APICALL void GL_APIENTRY glBindProgramPipelineContextANGLE(GLeglContext ctx, GLuint pipeline); >+GL_APICALL void GL_APIENTRY glBindVertexBufferContextANGLE(GLeglContext ctx, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); >+GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvContextANGLE(GLeglContext ctx, GLenum type, GLsizei count, const GLchar *const*strings); >+GL_APICALL void GL_APIENTRY glDeleteProgramPipelinesContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *pipelines); >+GL_APICALL void GL_APIENTRY glDispatchComputeContextANGLE(GLeglContext ctx, GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); >+GL_APICALL void GL_APIENTRY glDispatchComputeIndirectContextANGLE(GLeglContext ctx, GLintptr indirect); >+GL_APICALL void GL_APIENTRY glDrawArraysIndirectContextANGLE(GLeglContext ctx, GLenum mode, const void *indirect); >+GL_APICALL void GL_APIENTRY glDrawElementsIndirectContextANGLE(GLeglContext ctx, GLenum mode, GLenum type, const void *indirect); >+GL_APICALL void GL_APIENTRY glFramebufferParameteriContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint param); >+GL_APICALL void GL_APIENTRY glGenProgramPipelinesContextANGLE(GLeglContext ctx, GLsizei n, GLuint *pipelines); >+GL_APICALL void GL_APIENTRY glGetBooleani_vContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLboolean *data); >+GL_APICALL void GL_APIENTRY glGetFramebufferParameterivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetMultisamplefvContextANGLE(GLeglContext ctx, GLenum pname, GLuint index, GLfloat *val); >+GL_APICALL void GL_APIENTRY glGetProgramInterfaceivContextANGLE(GLeglContext ctx, GLuint program, GLenum programInterface, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogContextANGLE(GLeglContext ctx, GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); >+GL_APICALL void GL_APIENTRY glGetProgramPipelineivContextANGLE(GLeglContext ctx, GLuint pipeline, GLenum pname, GLint *params); >+GL_APICALL GLuint GL_APIENTRY glGetProgramResourceIndexContextANGLE(GLeglContext ctx, GLuint program, GLenum programInterface, const GLchar *name); >+GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocationContextANGLE(GLeglContext ctx, GLuint program, GLenum programInterface, const GLchar *name); >+GL_APICALL void GL_APIENTRY glGetProgramResourceNameContextANGLE(GLeglContext ctx, GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); >+GL_APICALL void GL_APIENTRY glGetProgramResourceivContextANGLE(GLeglContext ctx, GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); >+GL_APICALL void GL_APIENTRY glGetTexLevelParameterfvContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLfloat *params); >+GL_APICALL void GL_APIENTRY glGetTexLevelParameterivContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLint *params); >+GL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineContextANGLE(GLeglContext ctx, GLuint pipeline); >+GL_APICALL void GL_APIENTRY glMemoryBarrierContextANGLE(GLeglContext ctx, GLbitfield barriers); >+GL_APICALL void GL_APIENTRY glMemoryBarrierByRegionContextANGLE(GLeglContext ctx, GLbitfield barriers); >+GL_APICALL void GL_APIENTRY glProgramUniform1fContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLfloat v0); >+GL_APICALL void GL_APIENTRY glProgramUniform1fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glProgramUniform1iContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLint v0); >+GL_APICALL void GL_APIENTRY glProgramUniform1ivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value); >+GL_APICALL void GL_APIENTRY glProgramUniform1uiContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLuint v0); >+GL_APICALL void GL_APIENTRY glProgramUniform1uivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value); >+GL_APICALL void GL_APIENTRY glProgramUniform2fContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLfloat v0, GLfloat v1); >+GL_APICALL void GL_APIENTRY glProgramUniform2fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glProgramUniform2iContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLint v0, GLint v1); >+GL_APICALL void GL_APIENTRY glProgramUniform2ivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value); >+GL_APICALL void GL_APIENTRY glProgramUniform2uiContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLuint v0, GLuint v1); >+GL_APICALL void GL_APIENTRY glProgramUniform2uivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value); >+GL_APICALL void GL_APIENTRY glProgramUniform3fContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); >+GL_APICALL void GL_APIENTRY glProgramUniform3fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glProgramUniform3iContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLint v0, GLint v1, GLint v2); >+GL_APICALL void GL_APIENTRY glProgramUniform3ivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value); >+GL_APICALL void GL_APIENTRY glProgramUniform3uiContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); >+GL_APICALL void GL_APIENTRY glProgramUniform3uivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value); >+GL_APICALL void GL_APIENTRY glProgramUniform4fContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); >+GL_APICALL void GL_APIENTRY glProgramUniform4fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glProgramUniform4iContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); >+GL_APICALL void GL_APIENTRY glProgramUniform4ivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value); >+GL_APICALL void GL_APIENTRY glProgramUniform4uiContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); >+GL_APICALL void GL_APIENTRY glProgramUniform4uivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value); >+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glSampleMaskiContextANGLE(GLeglContext ctx, GLuint maskNumber, GLbitfield mask); >+GL_APICALL void GL_APIENTRY glTexStorage2DMultisampleContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); >+GL_APICALL void GL_APIENTRY glUseProgramStagesContextANGLE(GLeglContext ctx, GLuint pipeline, GLbitfield stages, GLuint program); >+GL_APICALL void GL_APIENTRY glValidateProgramPipelineContextANGLE(GLeglContext ctx, GLuint pipeline); >+GL_APICALL void GL_APIENTRY glVertexAttribBindingContextANGLE(GLeglContext ctx, GLuint attribindex, GLuint bindingindex); >+GL_APICALL void GL_APIENTRY glVertexAttribFormatContextANGLE(GLeglContext ctx, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); >+GL_APICALL void GL_APIENTRY glVertexAttribIFormatContextANGLE(GLeglContext ctx, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); >+GL_APICALL void GL_APIENTRY glVertexBindingDivisorContextANGLE(GLeglContext ctx, GLuint bindingindex, GLuint divisor); >+#endif >diff --git a/Source/ThirdParty/ANGLE/include/GLES3/gl32.h b/Source/ThirdParty/ANGLE/include/GLES3/gl32.h >index 2975a6f4e74..a1af7c6970d 100644 >--- a/Source/ThirdParty/ANGLE/include/GLES3/gl32.h >+++ b/Source/ThirdParty/ANGLE/include/GLES3/gl32.h >@@ -6,7 +6,7 @@ extern "C" { > #endif > > /* >-** Copyright (c) 2013-2015 The Khronos Group Inc. >+** Copyright (c) 2013-2016 The Khronos Group Inc. > ** > ** Permission is hereby granted, free of charge, to any person obtaining a > ** copy of this software and/or associated documentation files (the >@@ -42,7 +42,11 @@ extern "C" { > #define GL_APIENTRYP GL_APIENTRY* > #endif > >-/* Generated on date 20150809 */ >+#ifndef GL_GLES_PROTOTYPES >+#define GL_GLES_PROTOTYPES 1 >+#endif >+ >+/* Generated on date 20161024 */ > > /* Generated C header for: > * API: gles2 >@@ -520,7 +524,7 @@ typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GL > typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); > typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); > typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); >-#ifdef GL_GLEXT_PROTOTYPES >+#if GL_GLES_PROTOTYPES > GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture); > GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader); > GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); >@@ -1094,7 +1098,7 @@ typedef void (GL_APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GL > typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); > typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); > typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); >-#ifdef GL_GLEXT_PROTOTYPES >+#if GL_GLES_PROTOTYPES > GL_APICALL void GL_APIENTRY glReadBuffer (GLenum src); > GL_APICALL void GL_APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); > GL_APICALL void GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); >@@ -1445,7 +1449,7 @@ typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLi > typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); > typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); > typedef void (GL_APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); >-#ifdef GL_GLEXT_PROTOTYPES >+#if GL_GLES_PROTOTYPES > GL_APICALL void GL_APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); > GL_APICALL void GL_APIENTRY glDispatchComputeIndirect (GLintptr indirect); > GL_APICALL void GL_APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect); >@@ -1770,7 +1774,7 @@ typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GL > typedef void (GL_APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); > typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); > typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); >-#ifdef GL_GLEXT_PROTOTYPES >+#if GL_GLES_PROTOTYPES > GL_APICALL void GL_APIENTRY glBlendBarrier (void); > GL_APICALL void GL_APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); > GL_APICALL void GL_APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); >diff --git a/Source/ThirdParty/ANGLE/include/GLES3/gl3ext_explicit_context_autogen.inc b/Source/ThirdParty/ANGLE/include/GLES3/gl3ext_explicit_context_autogen.inc >new file mode 100644 >index 00000000000..1e765792712 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/GLES3/gl3ext_explicit_context_autogen.inc >@@ -0,0 +1,220 @@ >+// GENERATED FILE - DO NOT EDIT. >+// Generated by generate_entry_points.py using data from gl.xml and gl_angle_ext.xml. >+// >+// 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. >+// >+// gl3ext_explicit_context_autogen.inc: >+// Function declarations for the EGL_ANGLE_explicit_context extension >+ >+typedef void (GL_APIENTRYP PFNGLBEGINQUERYCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint id); >+typedef void (GL_APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKCONTEXTANGLEPROC)(GLeglContext ctx, GLenum primitiveMode); >+typedef void (GL_APIENTRYP PFNGLBINDBUFFERBASECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint index, GLuint buffer); >+typedef void (GL_APIENTRYP PFNGLBINDBUFFERRANGECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); >+typedef void (GL_APIENTRYP PFNGLBINDSAMPLERCONTEXTANGLEPROC)(GLeglContext ctx, GLuint unit, GLuint sampler); >+typedef void (GL_APIENTRYP PFNGLBINDTRANSFORMFEEDBACKCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint id); >+typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYCONTEXTANGLEPROC)(GLeglContext ctx, GLuint array); >+typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERCONTEXTANGLEPROC)(GLeglContext ctx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); >+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFICONTEXTANGLEPROC)(GLeglContext ctx, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); >+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum buffer, GLint drawbuffer, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERIVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum buffer, GLint drawbuffer, const GLint *value); >+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERUIVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum buffer, GLint drawbuffer, const GLuint *value); >+typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCCONTEXTANGLEPROC)(GLeglContext ctx, GLsync sync, GLbitfield flags, GLuint64 timeout); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); >+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); >+typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATACONTEXTANGLEPROC)(GLeglContext ctx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); >+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLDELETEQUERIESCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *ids); >+typedef void (GL_APIENTRYP PFNGLDELETESAMPLERSCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei count, const GLuint *samplers); >+typedef void (GL_APIENTRYP PFNGLDELETESYNCCONTEXTANGLEPROC)(GLeglContext ctx, GLsync sync); >+typedef void (GL_APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *ids); >+typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *arrays); >+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDCONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, GLint first, GLsizei count, GLsizei instancecount); >+typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLenum *bufs); >+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDCONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); >+typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSCONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); >+typedef void (GL_APIENTRYP PFNGLENDQUERYCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target); >+typedef void (GL_APIENTRYP PFNGLENDTRANSFORMFEEDBACKCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCCONTEXTANGLEPROC)(GLeglContext ctx, GLenum condition, GLbitfield flags); >+typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length); >+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); >+typedef void (GL_APIENTRYP PFNGLGENQUERIESCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *ids); >+typedef void (GL_APIENTRYP PFNGLGENSAMPLERSCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei count, GLuint *samplers); >+typedef void (GL_APIENTRYP PFNGLGENTRANSFORMFEEDBACKSCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *ids); >+typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *arrays); >+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMECONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); >+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMSIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERI64VCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint64 *params); >+typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, void **params); >+typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATALOCATIONCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, const GLchar *name); >+typedef void (GL_APIENTRYP PFNGLGETINTEGER64I_VCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint index, GLint64 *data); >+typedef void (GL_APIENTRYP PFNGLGETINTEGER64VCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLint64 *data); >+typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint index, GLint *data); >+typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); >+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint id, GLenum pname, GLuint *params); >+typedef void (GL_APIENTRYP PFNGLGETQUERYIVCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERFVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLfloat *params); >+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLint *params); >+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGICONTEXTANGLEPROC)(GLeglContext ctx, GLenum name, GLuint index); >+typedef void (GL_APIENTRYP PFNGLGETSYNCIVCONTEXTANGLEPROC)(GLeglContext ctx, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); >+typedef void (GL_APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); >+typedef GLuint (GL_APIENTRYP PFNGLGETUNIFORMBLOCKINDEXCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, const GLchar *uniformBlockName); >+typedef void (GL_APIENTRYP PFNGLGETUNIFORMINDICESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); >+typedef void (GL_APIENTRYP PFNGLGETUNIFORMUIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLuint *params); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLenum pname, GLint *params); >+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIUIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLenum pname, GLuint *params); >+typedef void (GL_APIENTRYP PFNGLINVALIDATEFRAMEBUFFERCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei numAttachments, const GLenum *attachments); >+typedef void (GL_APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); >+typedef GLboolean (GL_APIENTRYP PFNGLISQUERYCONTEXTANGLEPROC)(GLeglContext ctx, GLuint id); >+typedef GLboolean (GL_APIENTRYP PFNGLISSAMPLERCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler); >+typedef GLboolean (GL_APIENTRYP PFNGLISSYNCCONTEXTANGLEPROC)(GLeglContext ctx, GLsync sync); >+typedef GLboolean (GL_APIENTRYP PFNGLISTRANSFORMFEEDBACKCONTEXTANGLEPROC)(GLeglContext ctx, GLuint id); >+typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYCONTEXTANGLEPROC)(GLeglContext ctx, GLuint array); >+typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); >+typedef void (GL_APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); >+typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERICONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLenum pname, GLint value); >+typedef void (GL_APIENTRYP PFNGLREADBUFFERCONTEXTANGLEPROC)(GLeglContext ctx, GLenum src); >+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKCONTEXTANGLEPROC)(GLeglContext ctx); >+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLfloat param); >+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, const GLfloat *param); >+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERICONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLint param); >+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, const GLint *param); >+typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); >+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); >+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); >+typedef void (GL_APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); >+typedef void (GL_APIENTRYP PFNGLUNIFORM1UICONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLuint v0); >+typedef void (GL_APIENTRYP PFNGLUNIFORM1UIVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORM2UICONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLuint v0, GLuint v1); >+typedef void (GL_APIENTRYP PFNGLUNIFORM2UIVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORM3UICONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLuint v0, GLuint v1, GLuint v2); >+typedef void (GL_APIENTRYP PFNGLUNIFORM3UIVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORM4UICONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); >+typedef void (GL_APIENTRYP PFNGLUNIFORM4UIVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORMBLOCKBINDINGCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); >+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVCONTEXTANGLEPROC)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFERCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLuint divisor); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4ICONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLint x, GLint y, GLint z, GLint w); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, const GLint *v); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UICONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, const GLuint *v); >+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIPOINTERCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); >+typedef void (GL_APIENTRYP PFNGLWAITSYNCCONTEXTANGLEPROC)(GLeglContext ctx, GLsync sync, GLbitfield flags, GLuint64 timeout); >+#ifdef GL_GLEXT_PROTOTYPES >+GL_APICALL void GL_APIENTRY glBeginQueryContextANGLE(GLeglContext ctx, GLenum target, GLuint id); >+GL_APICALL void GL_APIENTRY glBeginTransformFeedbackContextANGLE(GLeglContext ctx, GLenum primitiveMode); >+GL_APICALL void GL_APIENTRY glBindBufferBaseContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLuint buffer); >+GL_APICALL void GL_APIENTRY glBindBufferRangeContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); >+GL_APICALL void GL_APIENTRY glBindSamplerContextANGLE(GLeglContext ctx, GLuint unit, GLuint sampler); >+GL_APICALL void GL_APIENTRY glBindTransformFeedbackContextANGLE(GLeglContext ctx, GLenum target, GLuint id); >+GL_APICALL void GL_APIENTRY glBindVertexArrayContextANGLE(GLeglContext ctx, GLuint array); >+GL_APICALL void GL_APIENTRY glBlitFramebufferContextANGLE(GLeglContext ctx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); >+GL_APICALL void GL_APIENTRY glClearBufferfiContextANGLE(GLeglContext ctx, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); >+GL_APICALL void GL_APIENTRY glClearBufferfvContextANGLE(GLeglContext ctx, GLenum buffer, GLint drawbuffer, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glClearBufferivContextANGLE(GLeglContext ctx, GLenum buffer, GLint drawbuffer, const GLint *value); >+GL_APICALL void GL_APIENTRY glClearBufferuivContextANGLE(GLeglContext ctx, GLenum buffer, GLint drawbuffer, const GLuint *value); >+GL_APICALL GLenum GL_APIENTRY glClientWaitSyncContextANGLE(GLeglContext ctx, GLsync sync, GLbitfield flags, GLuint64 timeout); >+GL_APICALL void GL_APIENTRY glCompressedTexImage3DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); >+GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); >+GL_APICALL void GL_APIENTRY glCopyBufferSubDataContextANGLE(GLeglContext ctx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); >+GL_APICALL void GL_APIENTRY glCopyTexSubImage3DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); >+GL_APICALL void GL_APIENTRY glDeleteQueriesContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *ids); >+GL_APICALL void GL_APIENTRY glDeleteSamplersContextANGLE(GLeglContext ctx, GLsizei count, const GLuint *samplers); >+GL_APICALL void GL_APIENTRY glDeleteSyncContextANGLE(GLeglContext ctx, GLsync sync); >+GL_APICALL void GL_APIENTRY glDeleteTransformFeedbacksContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *ids); >+GL_APICALL void GL_APIENTRY glDeleteVertexArraysContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *arrays); >+GL_APICALL void GL_APIENTRY glDrawArraysInstancedContextANGLE(GLeglContext ctx, GLenum mode, GLint first, GLsizei count, GLsizei instancecount); >+GL_APICALL void GL_APIENTRY glDrawBuffersContextANGLE(GLeglContext ctx, GLsizei n, const GLenum *bufs); >+GL_APICALL void GL_APIENTRY glDrawElementsInstancedContextANGLE(GLeglContext ctx, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); >+GL_APICALL void GL_APIENTRY glDrawRangeElementsContextANGLE(GLeglContext ctx, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); >+GL_APICALL void GL_APIENTRY glEndQueryContextANGLE(GLeglContext ctx, GLenum target); >+GL_APICALL void GL_APIENTRY glEndTransformFeedbackContextANGLE(GLeglContext ctx); >+GL_APICALL GLsync GL_APIENTRY glFenceSyncContextANGLE(GLeglContext ctx, GLenum condition, GLbitfield flags); >+GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeContextANGLE(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length); >+GL_APICALL void GL_APIENTRY glFramebufferTextureLayerContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); >+GL_APICALL void GL_APIENTRY glGenQueriesContextANGLE(GLeglContext ctx, GLsizei n, GLuint *ids); >+GL_APICALL void GL_APIENTRY glGenSamplersContextANGLE(GLeglContext ctx, GLsizei count, GLuint *samplers); >+GL_APICALL void GL_APIENTRY glGenTransformFeedbacksContextANGLE(GLeglContext ctx, GLsizei n, GLuint *ids); >+GL_APICALL void GL_APIENTRY glGenVertexArraysContextANGLE(GLeglContext ctx, GLsizei n, GLuint *arrays); >+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockNameContextANGLE(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); >+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockivContextANGLE(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetActiveUniformsivContextANGLE(GLeglContext ctx, GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetBufferParameteri64vContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint64 *params); >+GL_APICALL void GL_APIENTRY glGetBufferPointervContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, void **params); >+GL_APICALL GLint GL_APIENTRY glGetFragDataLocationContextANGLE(GLeglContext ctx, GLuint program, const GLchar *name); >+GL_APICALL void GL_APIENTRY glGetInteger64i_vContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLint64 *data); >+GL_APICALL void GL_APIENTRY glGetInteger64vContextANGLE(GLeglContext ctx, GLenum pname, GLint64 *data); >+GL_APICALL void GL_APIENTRY glGetIntegeri_vContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLint *data); >+GL_APICALL void GL_APIENTRY glGetInternalformativContextANGLE(GLeglContext ctx, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); >+GL_APICALL void GL_APIENTRY glGetProgramBinaryContextANGLE(GLeglContext ctx, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); >+GL_APICALL void GL_APIENTRY glGetQueryObjectuivContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLuint *params); >+GL_APICALL void GL_APIENTRY glGetQueryivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetSamplerParameterfvContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLfloat *params); >+GL_APICALL void GL_APIENTRY glGetSamplerParameterivContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLint *params); >+GL_APICALL const GLubyte *GL_APIENTRY glGetStringiContextANGLE(GLeglContext ctx, GLenum name, GLuint index); >+GL_APICALL void GL_APIENTRY glGetSyncivContextANGLE(GLeglContext ctx, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); >+GL_APICALL void GL_APIENTRY glGetTransformFeedbackVaryingContextANGLE(GLeglContext ctx, GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); >+GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndexContextANGLE(GLeglContext ctx, GLuint program, const GLchar *uniformBlockName); >+GL_APICALL void GL_APIENTRY glGetUniformIndicesContextANGLE(GLeglContext ctx, GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); >+GL_APICALL void GL_APIENTRY glGetUniformuivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLuint *params); >+GL_APICALL void GL_APIENTRY glGetVertexAttribIivContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLint *params); >+GL_APICALL void GL_APIENTRY glGetVertexAttribIuivContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLuint *params); >+GL_APICALL void GL_APIENTRY glInvalidateFramebufferContextANGLE(GLeglContext ctx, GLenum target, GLsizei numAttachments, const GLenum *attachments); >+GL_APICALL void GL_APIENTRY glInvalidateSubFramebufferContextANGLE(GLeglContext ctx, GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); >+GL_APICALL GLboolean GL_APIENTRY glIsQueryContextANGLE(GLeglContext ctx, GLuint id); >+GL_APICALL GLboolean GL_APIENTRY glIsSamplerContextANGLE(GLeglContext ctx, GLuint sampler); >+GL_APICALL GLboolean GL_APIENTRY glIsSyncContextANGLE(GLeglContext ctx, GLsync sync); >+GL_APICALL GLboolean GL_APIENTRY glIsTransformFeedbackContextANGLE(GLeglContext ctx, GLuint id); >+GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayContextANGLE(GLeglContext ctx, GLuint array); >+GL_APICALL void *GL_APIENTRY glMapBufferRangeContextANGLE(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); >+GL_APICALL void GL_APIENTRY glPauseTransformFeedbackContextANGLE(GLeglContext ctx); >+GL_APICALL void GL_APIENTRY glProgramBinaryContextANGLE(GLeglContext ctx, GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); >+GL_APICALL void GL_APIENTRY glProgramParameteriContextANGLE(GLeglContext ctx, GLuint program, GLenum pname, GLint value); >+GL_APICALL void GL_APIENTRY glReadBufferContextANGLE(GLeglContext ctx, GLenum src); >+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); >+GL_APICALL void GL_APIENTRY glResumeTransformFeedbackContextANGLE(GLeglContext ctx); >+GL_APICALL void GL_APIENTRY glSamplerParameterfContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLfloat param); >+GL_APICALL void GL_APIENTRY glSamplerParameterfvContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, const GLfloat *param); >+GL_APICALL void GL_APIENTRY glSamplerParameteriContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLint param); >+GL_APICALL void GL_APIENTRY glSamplerParameterivContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, const GLint *param); >+GL_APICALL void GL_APIENTRY glTexImage3DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); >+GL_APICALL void GL_APIENTRY glTexStorage2DContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); >+GL_APICALL void GL_APIENTRY glTexStorage3DContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); >+GL_APICALL void GL_APIENTRY glTexSubImage3DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); >+GL_APICALL void GL_APIENTRY glTransformFeedbackVaryingsContextANGLE(GLeglContext ctx, GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); >+GL_APICALL void GL_APIENTRY glUniform1uiContextANGLE(GLeglContext ctx, GLint location, GLuint v0); >+GL_APICALL void GL_APIENTRY glUniform1uivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value); >+GL_APICALL void GL_APIENTRY glUniform2uiContextANGLE(GLeglContext ctx, GLint location, GLuint v0, GLuint v1); >+GL_APICALL void GL_APIENTRY glUniform2uivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value); >+GL_APICALL void GL_APIENTRY glUniform3uiContextANGLE(GLeglContext ctx, GLint location, GLuint v0, GLuint v1, GLuint v2); >+GL_APICALL void GL_APIENTRY glUniform3uivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value); >+GL_APICALL void GL_APIENTRY glUniform4uiContextANGLE(GLeglContext ctx, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); >+GL_APICALL void GL_APIENTRY glUniform4uivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value); >+GL_APICALL void GL_APIENTRY glUniformBlockBindingContextANGLE(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); >+GL_APICALL void GL_APIENTRY glUniformMatrix2x3fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glUniformMatrix2x4fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glUniformMatrix3x2fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glUniformMatrix3x4fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glUniformMatrix4x2fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL void GL_APIENTRY glUniformMatrix4x3fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); >+GL_APICALL GLboolean GL_APIENTRY glUnmapBufferContextANGLE(GLeglContext ctx, GLenum target); >+GL_APICALL void GL_APIENTRY glVertexAttribDivisorContextANGLE(GLeglContext ctx, GLuint index, GLuint divisor); >+GL_APICALL void GL_APIENTRY glVertexAttribI4iContextANGLE(GLeglContext ctx, GLuint index, GLint x, GLint y, GLint z, GLint w); >+GL_APICALL void GL_APIENTRY glVertexAttribI4ivContextANGLE(GLeglContext ctx, GLuint index, const GLint *v); >+GL_APICALL void GL_APIENTRY glVertexAttribI4uiContextANGLE(GLeglContext ctx, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); >+GL_APICALL void GL_APIENTRY glVertexAttribI4uivContextANGLE(GLeglContext ctx, GLuint index, const GLuint *v); >+GL_APICALL void GL_APIENTRY glVertexAttribIPointerContextANGLE(GLeglContext ctx, GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); >+GL_APICALL void GL_APIENTRY glWaitSyncContextANGLE(GLeglContext ctx, GLsync sync, GLbitfield flags, GLuint64 timeout); >+#endif >diff --git a/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderLang.h b/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderLang.h >index 2875c02aba3..c804715d27f 100644 >--- a/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderLang.h >+++ b/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderLang.h >@@ -8,10 +8,11 @@ > > #include <stddef.h> > >-#include "khrplatform.h" >+#include "KHR/khrplatform.h" > > #include <array> > #include <map> >+#include <set> > #include <string> > #include <vector> > >@@ -25,7 +26,7 @@ > > // Version number for shader translation API. > // It is incremented every time the API changes. >-#define ANGLE_SH_VERSION 190 >+#define ANGLE_SH_VERSION 206 > > enum ShShaderSpec > { >@@ -71,13 +72,13 @@ enum ShShaderOutput > // The Compile options type is defined in ShaderVars.h, to allow ANGLE to import the ShaderVars > // header without needing the ShaderLang header. This avoids some conflicts with glslang. > >-const ShCompileOptions SH_VALIDATE = 0; >-const ShCompileOptions SH_VALIDATE_LOOP_INDEXING = UINT64_C(1) << 0; >-const ShCompileOptions SH_INTERMEDIATE_TREE = UINT64_C(1) << 1; >-const ShCompileOptions SH_OBJECT_CODE = UINT64_C(1) << 2; >-const ShCompileOptions SH_VARIABLES = UINT64_C(1) << 3; >-const ShCompileOptions SH_LINE_DIRECTIVES = UINT64_C(1) << 4; >-const ShCompileOptions SH_SOURCE_PATH = UINT64_C(1) << 5; >+const ShCompileOptions SH_VALIDATE = 0; >+const ShCompileOptions SH_VALIDATE_LOOP_INDEXING = UINT64_C(1) << 0; >+const ShCompileOptions SH_INTERMEDIATE_TREE = UINT64_C(1) << 1; >+const ShCompileOptions SH_OBJECT_CODE = UINT64_C(1) << 2; >+const ShCompileOptions SH_VARIABLES = UINT64_C(1) << 3; >+const ShCompileOptions SH_LINE_DIRECTIVES = UINT64_C(1) << 4; >+const ShCompileOptions SH_SOURCE_PATH = UINT64_C(1) << 5; > > // This flag will keep invariant declaration for input in fragment shader for GLSL >=4.20 on AMD. > // From GLSL >= 4.20, it's optional to add invariant for fragment input, but GPU vendors have >@@ -214,13 +215,9 @@ const ShCompileOptions SH_REWRITE_FLOAT_UNARY_MINUS_OPERATOR = UINT64_C(1) << 29 > // It works by using an expression to emulate this function. > const ShCompileOptions SH_EMULATE_ATAN2_FLOAT_FUNCTION = UINT64_C(1) << 30; > >-// Set to 1 to translate gl_ViewID_OVR to an uniform so that the extension can be emulated. >-// "uniform highp uint ViewID_OVR". >-const ShCompileOptions SH_TRANSLATE_VIEWID_OVR_TO_UNIFORM = UINT64_C(1) << 31; >- > // Set to initialize uninitialized local and global temporary variables. Should only be used with > // GLSL output. In HLSL output variables are initialized regardless of if this flag is set. >-const ShCompileOptions SH_INITIALIZE_UNINITIALIZED_LOCALS = UINT64_C(1) << 32; >+const ShCompileOptions SH_INITIALIZE_UNINITIALIZED_LOCALS = UINT64_C(1) << 31; > > // The flag modifies the shader in the following way: > // Every occurrence of gl_InstanceID is replaced by the global temporary variable InstanceID. >@@ -229,7 +226,7 @@ const ShCompileOptions SH_INITIALIZE_UNINITIALIZED_LOCALS = UINT64_C(1) << 32; > // ViewID_OVR = uint(gl_InstanceID) % num_views; > // InstanceID = gl_InstanceID / num_views; > // ViewID_OVR is added as a varying variable to both the vertex and fragment shaders. >-const ShCompileOptions SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW = UINT64_C(1) << 33; >+const ShCompileOptions SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW = UINT64_C(1) << 32; > > // With the flag enabled the GLSL/ESSL vertex shader is modified to include code for viewport > // selection in the following way: >@@ -239,11 +236,11 @@ const ShCompileOptions SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW = UINT64_C > // - A declaration of the uniform multiviewBaseViewLayerIndex. > // Note: The SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW flag also has to be enabled to have the > // temporary variable ViewID_OVR declared and initialized. >-const ShCompileOptions SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER = UINT64_C(1) << 34; >+const ShCompileOptions SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER = UINT64_C(1) << 33; > > // If the flag is enabled, gl_PointSize is clamped to the maximum point size specified in > // ShBuiltInResources in vertex shaders. >-const ShCompileOptions SH_CLAMP_POINT_SIZE = UINT64_C(1) << 35; >+const ShCompileOptions SH_CLAMP_POINT_SIZE = UINT64_C(1) << 34; > > // Turn some arithmetic operations that operate on a float vector-scalar pair into vector-vector > // operations. This is done recursively. Some scalar binary operations inside vector constructors >@@ -251,11 +248,38 @@ const ShCompileOptions SH_CLAMP_POINT_SIZE = UINT64_C(1) << 35; > // > // This is targeted to work around a bug in NVIDIA OpenGL drivers that was reproducible on NVIDIA > // driver version 387.92. It works around the most common occurrences of the bug. >-const ShCompileOptions SH_REWRITE_VECTOR_SCALAR_ARITHMETIC = UINT64_C(1) << 36; >+const ShCompileOptions SH_REWRITE_VECTOR_SCALAR_ARITHMETIC = UINT64_C(1) << 35; > > // Don't use loops to initialize uninitialized variables. Only has an effect if some kind of > // variable initialization is turned on. >-const ShCompileOptions SH_DONT_USE_LOOPS_TO_INITIALIZE_VARIABLES = UINT64_C(1) << 37; >+const ShCompileOptions SH_DONT_USE_LOOPS_TO_INITIALIZE_VARIABLES = UINT64_C(1) << 36; >+ >+// Don't use D3D constant register zero when allocating space for uniforms. This is targeted to work >+// around a bug in NVIDIA D3D driver version 388.59 where in very specific cases the driver would >+// not handle constant register zero correctly. Only has an effect on HLSL translation. >+const ShCompileOptions SH_SKIP_D3D_CONSTANT_REGISTER_ZERO = UINT64_C(1) << 37; >+ >+// Clamp gl_FragDepth to the range [0.0, 1.0] in case it is statically used. >+const ShCompileOptions SH_CLAMP_FRAG_DEPTH = UINT64_C(1) << 38; >+ >+// Rewrite expressions like "v.x = z = expression;". Works around a bug in NVIDIA OpenGL drivers >+// prior to version 397.31. >+const ShCompileOptions SH_REWRITE_REPEATED_ASSIGN_TO_SWIZZLED = UINT64_C(1) << 39; >+ >+// Rewrite gl_DrawID as a uniform int >+const ShCompileOptions SH_EMULATE_GL_DRAW_ID = UINT64_C(1) << 40; >+ >+// This flag initializes shared variables to 0. >+// It is to avoid ompute shaders being able to read undefined values that could be coming from >+// another webpage/application. >+const ShCompileOptions SH_INIT_SHARED_VARIABLES = UINT64_C(1) << 41; >+ >+// Forces the value returned from an atomic operations to be always be resolved. This is targeted to >+// workaround a bug in NVIDIA D3D driver where the return value from >+// RWByteAddressBuffer.InterlockedAdd does not get resolved when used in the .yzw components of a >+// RWByteAddressBuffer.Store operation. Only has an effect on HLSL translation. >+// http://anglebug.com/3246 >+const ShCompileOptions SH_FORCE_ATOMIC_VALUE_RESOLUTION = UINT64_C(1) << 42; > > // Defines alternate strategies for implementing array index clamping. > enum ShArrayIndexClampingStrategy >@@ -302,9 +326,12 @@ struct ShBuiltInResources > int EXT_shader_framebuffer_fetch; > int NV_shader_framebuffer_fetch; > int ARM_shader_framebuffer_fetch; >- int OVR_multiview; >+ int OVR_multiview2; > int EXT_YUV_target; >- int OES_geometry_shader; >+ int EXT_geometry_shader; >+ int OES_texture_storage_multisample_2d_array; >+ int ANGLE_texture_multisample; >+ int ANGLE_multi_draw; > > // Set to 1 to enable replacing GL_EXT_draw_buffers #extension directives > // with GL_NV_draw_buffers in ESSL output. This flag can be used to emulate >@@ -430,7 +457,7 @@ struct ShBuiltInResources > // maximum point size (higher limit from ALIASED_POINT_SIZE_RANGE) > float MaxPointSize; > >- // OES_geometry_shader constants >+ // EXT_geometry_shader constants > int MaxGeometryUniformComponents; > int MaxGeometryUniformBlocks; > int MaxGeometryInputComponents; >@@ -583,6 +610,17 @@ int GetVertexShaderNumViews(const ShHandle handle); > bool CheckVariablesWithinPackingLimits(int maxVectors, > const std::vector<sh::ShaderVariable> &variables); > >+// Gives the compiler-assigned register for a shader storage block. >+// The method writes the value to the output variable "indexOut". >+// Returns true if it found a valid shader storage block, false otherwise. >+// Parameters: >+// handle: Specifies the compiler >+// shaderStorageBlockName: Specifies the shader storage block >+// indexOut: output variable that stores the assigned register >+bool GetShaderStorageBlockRegister(const ShHandle handle, >+ const std::string &shaderStorageBlockName, >+ unsigned int *indexOut); >+ > // Gives the compiler-assigned register for a uniform block. > // The method writes the value to the output variable "indexOut". > // Returns true if it found a valid uniform block, false otherwise. >@@ -598,11 +636,34 @@ bool GetUniformBlockRegister(const ShHandle handle, > // Note that the map contains also registers of samplers that have been extracted from structs. > const std::map<std::string, unsigned int> *GetUniformRegisterMap(const ShHandle handle); > >+// Sampler, image and atomic counters share registers(t type and u type), >+// GetReadonlyImage2DRegisterIndex and GetImage2DRegisterIndex return the first index into >+// a range of reserved registers for image2D/iimage2D/uimage2D variables. >+// Parameters: handle: Specifies the compiler >+unsigned int GetReadonlyImage2DRegisterIndex(const ShHandle handle); >+unsigned int GetImage2DRegisterIndex(const ShHandle handle); >+ >+// The method records these used function names related with image2D/iimage2D/uimage2D, these >+// functions will be dynamically generated. >+// Parameters: >+// handle: Specifies the compiler >+const std::set<std::string> *GetUsedImage2DFunctionNames(const ShHandle handle); >+ >+bool HasValidGeometryShaderInputPrimitiveType(const ShHandle handle); >+bool HasValidGeometryShaderOutputPrimitiveType(const ShHandle handle); >+bool HasValidGeometryShaderMaxVertices(const ShHandle handle); > GLenum GetGeometryShaderInputPrimitiveType(const ShHandle handle); > GLenum GetGeometryShaderOutputPrimitiveType(const ShHandle handle); > int GetGeometryShaderInvocations(const ShHandle handle); > int GetGeometryShaderMaxVertices(const ShHandle handle); > >+// >+// Helper function to identify specs that are based on the WebGL spec. >+// >+inline bool IsWebGLBasedSpec(ShShaderSpec spec) >+{ >+ return (spec == SH_WEBGL_SPEC || spec == SH_WEBGL2_SPEC || spec == SH_WEBGL3_SPEC); >+} > } // namespace sh > >-#endif // GLSLANG_SHADERLANG_H_ >+#endif // GLSLANG_SHADERLANG_H_ >diff --git a/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h b/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h >index acd9c358f8c..2bb267e93f8 100644 >--- a/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h >+++ b/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h >@@ -71,6 +71,12 @@ struct ShaderVariable > bool isArrayOfArrays() const { return arraySizes.size() >= 2u; } > bool isArray() const { return !arraySizes.empty(); } > unsigned int getArraySizeProduct() const; >+ // Return the inner array size product. >+ // For example, if there's a variable declared as size 3 array of size 4 array of size 5 array >+ // of int: >+ // int a[3][4][5]; >+ // then getInnerArraySizeProduct of a would be 4*5. >+ unsigned int getInnerArraySizeProduct() const; > > // Array size 0 means not an array when passed to or returned from these functions. > // Note that setArraySize() is deprecated and should not be used inside ANGLE. >@@ -106,9 +112,10 @@ struct ShaderVariable > // If no match is found, return false. > bool findInfoByMappedName(const std::string &mappedFullName, > const ShaderVariable **leafVar, >- std::string* originalFullName) const; >+ std::string *originalFullName) const; > > bool isBuiltIn() const; >+ bool isEmulatedBuiltIn() const; > > GLenum type; > GLenum precision; >@@ -124,22 +131,36 @@ struct ShaderVariable > // int a[3][4]; > // then the flattenedOffsetInParentArrays of a[2] would be 2. > // and flattenedOffsetInParentArrays of a[2][1] would be 2*4 + 1 = 9. >- unsigned int flattenedOffsetInParentArrays; >+ int parentArrayIndex() const >+ { >+ return hasParentArrayIndex() ? flattenedOffsetInParentArrays : 0; >+ } >+ >+ void setParentArrayIndex(int index) { flattenedOffsetInParentArrays = index; } > >+ bool hasParentArrayIndex() const { return flattenedOffsetInParentArrays != -1; } >+ >+ // Static use means that the variable is accessed somewhere in the shader source. > bool staticUse; >+ // A variable is active unless the compiler determined that it is not accessed by the shader. >+ // All active variables are statically used, but not all statically used variables are >+ // necessarily active. GLES 3.0.5 section 2.12.6. GLES 3.1 section 7.3.1. >+ bool active; > std::vector<ShaderVariable> fields; > std::string structName; > >+ // Only applies to interface block fields. Kept here for simplicity. >+ bool isRowMajorLayout; >+ > protected: > bool isSameVariableAtLinkTime(const ShaderVariable &other, > bool matchPrecision, > bool matchName) const; > > bool operator==(const ShaderVariable &other) const; >- bool operator!=(const ShaderVariable &other) const >- { >- return !operator==(other); >- } >+ bool operator!=(const ShaderVariable &other) const { return !operator==(other); } >+ >+ int flattenedOffsetInParentArrays; > }; > > // A variable with an integer location to pass back to the GL API: either uniform (can have location >@@ -163,13 +184,13 @@ struct Uniform : public VariableWithLocation > Uniform(const Uniform &other); > Uniform &operator=(const Uniform &other); > bool operator==(const Uniform &other) const; >- bool operator!=(const Uniform &other) const >- { >- return !operator==(other); >- } >+ bool operator!=(const Uniform &other) const { return !operator==(other); } > > int binding; >+ GLenum imageUnitFormat; > int offset; >+ bool readonly; >+ bool writeonly; > > // Decide whether two uniforms are the same at shader link time, > // assuming one from vertex shader and the other from fragment shader. >@@ -196,6 +217,9 @@ struct OutputVariable : public VariableWithLocation > OutputVariable &operator=(const OutputVariable &other); > bool operator==(const OutputVariable &other) const; > bool operator!=(const OutputVariable &other) const { return !operator==(other); } >+ >+ // From EXT_blend_func_extended. >+ int index; > }; > > struct InterfaceBlockField : public ShaderVariable >@@ -205,32 +229,23 @@ struct InterfaceBlockField : public ShaderVariable > InterfaceBlockField(const InterfaceBlockField &other); > InterfaceBlockField &operator=(const InterfaceBlockField &other); > bool operator==(const InterfaceBlockField &other) const; >- bool operator!=(const InterfaceBlockField &other) const >- { >- return !operator==(other); >- } >+ bool operator!=(const InterfaceBlockField &other) const { return !operator==(other); } > > // Decide whether two InterfaceBlock fields are the same at shader > // link time, assuming one from vertex shader and the other from > // fragment shader. > // See GLSL ES Spec 3.00.3, sec 4.3.7. >- bool isSameInterfaceBlockFieldAtLinkTime( >- const InterfaceBlockField &other) const; >- >- bool isRowMajorLayout; >+ bool isSameInterfaceBlockFieldAtLinkTime(const InterfaceBlockField &other) const; > }; > > struct Varying : public VariableWithLocation > { > Varying(); > ~Varying(); >- Varying(const Varying &otherg); >+ Varying(const Varying &other); > Varying &operator=(const Varying &other); > bool operator==(const Varying &other) const; >- bool operator!=(const Varying &other) const >- { >- return !operator==(other); >- } >+ bool operator!=(const Varying &other) const { return !operator==(other); } > > // Decide whether two varyings are the same at shader link time, > // assuming one from vertex shader and the other from fragment shader. >@@ -270,9 +285,14 @@ struct InterfaceBlock > std::string instanceName; > unsigned int arraySize; > BlockLayoutType layout; >+ >+ // Deprecated. Matrix packing should only be queried from individual fields of the block. >+ // TODO(oetuaho): Remove this once it is no longer used in Chromium. > bool isRowMajorLayout; >+ > int binding; > bool staticUse; >+ bool active; > BlockType blockType; > std::vector<InterfaceBlockField> fields; > }; >@@ -280,18 +300,8 @@ struct InterfaceBlock > struct WorkGroupSize > { > // Must have a trivial default constructor since it is used in YYSTYPE. >- WorkGroupSize() = default; >-#if defined(__clang__) >-#pragma clang diagnostic push >-#pragma clang diagnostic ignored "-Wmissing-braces" >-#endif >- explicit constexpr WorkGroupSize(int initialSize) >- : localSizeQualifiers{initialSize, initialSize, initialSize} >- { >- } >-#if defined(__clang__) >-#pragma clang diagnostic pop >-#endif >+ inline WorkGroupSize() = default; >+ inline explicit constexpr WorkGroupSize(int initialSize); > > void fill(int fillValue); > void setLocalSize(int localSizeX, int localSizeY, int localSizeZ); >@@ -314,9 +324,13 @@ struct WorkGroupSize > // Checks whether either all of the values are set, or none of them are. > bool isLocalSizeValid() const; > >- std::array<int, 3> localSizeQualifiers; >+ int localSizeQualifiers[3]; > }; > >+inline constexpr WorkGroupSize::WorkGroupSize(int initialSize) >+ : localSizeQualifiers{initialSize, initialSize, initialSize} >+{} >+ > } // namespace sh > >-#endif // GLSLANG_SHADERVARS_H_ >+#endif // GLSLANG_SHADERVARS_H_ >diff --git a/Source/ThirdParty/ANGLE/include/KHR/.clang-format b/Source/ThirdParty/ANGLE/include/KHR/.clang-format >new file mode 100644 >index 00000000000..06147100144 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/KHR/.clang-format >@@ -0,0 +1,3 @@ >+ >+ >+DisableFormat: true >diff --git a/Source/ThirdParty/ANGLE/include/KHR/khrplatform.h b/Source/ThirdParty/ANGLE/include/KHR/khrplatform.h >index 07b61b9bd60..975bbffed67 100644 >--- a/Source/ThirdParty/ANGLE/include/KHR/khrplatform.h >+++ b/Source/ThirdParty/ANGLE/include/KHR/khrplatform.h >@@ -2,7 +2,7 @@ > #define __khrplatform_h_ > > /* >-** Copyright (c) 2008-2009 The Khronos Group Inc. >+** Copyright (c) 2008-2018 The Khronos Group Inc. > ** > ** Permission is hereby granted, free of charge, to any person obtaining a > ** copy of this software and/or associated documentation files (the >@@ -26,18 +26,16 @@ > > /* Khronos platform-specific types and definitions. > * >- * $Revision: 32517 $ on $Date: 2016-03-11 02:41:19 -0800 (Fri, 11 Mar 2016) $ >+ * The master copy of khrplatform.h is maintained in the Khronos EGL >+ * Registry repository at https://github.com/KhronosGroup/EGL-Registry >+ * The last semantic modification to khrplatform.h was at commit ID: >+ * 67a3e0864c2d75ea5287b9f3d2eb74a745936692 > * > * Adopters may modify this file to suit their platform. Adopters are > * encouraged to submit platform specific modifications to the Khronos > * group so that they can be included in future versions of this file. >- * Please submit changes by sending them to the public Khronos Bugzilla >- * (http://khronos.org/bugzilla) by filing a bug against product >- * "Khronos (general)" component "Registry". >- * >- * A predefined template which fills in some of the bug fields can be >- * reached using http://tinyurl.com/khrplatform-h-bugreport, but you >- * must create a Bugzilla login first. >+ * Please submit changes by filing pull requests or issues on >+ * the EGL Registry repository linked above. > * > * > * See the Implementer's Guidelines for information about where this file >@@ -102,8 +100,7 @@ > #elif defined (__SYMBIAN32__) > # define KHRONOS_APICALL IMPORT_C > #elif defined(__ANDROID__) >-# include <sys/cdefs.h> >-# define KHRONOS_APICALL __attribute__((visibility("default"))) __NDK_FPABI__ >+# define KHRONOS_APICALL __attribute__((visibility("default"))) > #else > # define KHRONOS_APICALL > #endif >diff --git a/Source/ThirdParty/ANGLE/include/WGL/.clang-format b/Source/ThirdParty/ANGLE/include/WGL/.clang-format >new file mode 100644 >index 00000000000..06147100144 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/WGL/.clang-format >@@ -0,0 +1,3 @@ >+ >+ >+DisableFormat: true >diff --git a/Source/ThirdParty/ANGLE/include/WGL/wgl.h b/Source/ThirdParty/ANGLE/include/WGL/wgl.h >new file mode 100644 >index 00000000000..0bae52bddae >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/WGL/wgl.h >@@ -0,0 +1,946 @@ >+#ifndef __wgl_wgl_h_ >+#define __wgl_wgl_h_ 1 >+ >+#ifdef __cplusplus >+extern "C" { >+#endif >+ >+/* >+** Copyright (c) 2013-2018 The Khronos Group Inc. >+** >+** Permission is hereby granted, free of charge, to any person obtaining a >+** copy of this software and/or associated documentation files (the >+** "Materials"), to deal in the Materials without restriction, including >+** without limitation the rights to use, copy, modify, merge, publish, >+** distribute, sublicense, and/or sell copies of the Materials, and to >+** permit persons to whom the Materials are furnished to do so, subject to >+** the following conditions: >+** >+** The above copyright notice and this permission notice shall be included >+** in all copies or substantial portions of the Materials. >+** >+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, >+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF >+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. >+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY >+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, >+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE >+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. >+*/ >+/* >+** This header is generated from the Khronos OpenGL / OpenGL ES XML >+** API Registry. The current version of the Registry, generator scripts >+** used to make the header, and the header can be found at >+** https://github.com/KhronosGroup/OpenGL-Registry >+*/ >+ >+#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) >+#define WIN32_LEAN_AND_MEAN 1 >+#include <windows.h> >+#endif >+ >+/* Generated on date 20181206 */ >+ >+/* Generated C header for: >+ * API: wgl >+ * Versions considered: .* >+ * Versions emitted: .* >+ * Default extensions included: wgl >+ * Additional extensions included: _nomatch_^ >+ * Extensions removed: _nomatch_^ >+ */ >+ >+#ifndef WGL_VERSION_1_0 >+#define WGL_VERSION_1_0 1 >+#define WGL_FONT_LINES 0 >+#define WGL_FONT_POLYGONS 1 >+#define WGL_SWAP_MAIN_PLANE 0x00000001 >+#define WGL_SWAP_OVERLAY1 0x00000002 >+#define WGL_SWAP_OVERLAY2 0x00000004 >+#define WGL_SWAP_OVERLAY3 0x00000008 >+#define WGL_SWAP_OVERLAY4 0x00000010 >+#define WGL_SWAP_OVERLAY5 0x00000020 >+#define WGL_SWAP_OVERLAY6 0x00000040 >+#define WGL_SWAP_OVERLAY7 0x00000080 >+#define WGL_SWAP_OVERLAY8 0x00000100 >+#define WGL_SWAP_OVERLAY9 0x00000200 >+#define WGL_SWAP_OVERLAY10 0x00000400 >+#define WGL_SWAP_OVERLAY11 0x00000800 >+#define WGL_SWAP_OVERLAY12 0x00001000 >+#define WGL_SWAP_OVERLAY13 0x00002000 >+#define WGL_SWAP_OVERLAY14 0x00004000 >+#define WGL_SWAP_OVERLAY15 0x00008000 >+#define WGL_SWAP_UNDERLAY1 0x00010000 >+#define WGL_SWAP_UNDERLAY2 0x00020000 >+#define WGL_SWAP_UNDERLAY3 0x00040000 >+#define WGL_SWAP_UNDERLAY4 0x00080000 >+#define WGL_SWAP_UNDERLAY5 0x00100000 >+#define WGL_SWAP_UNDERLAY6 0x00200000 >+#define WGL_SWAP_UNDERLAY7 0x00400000 >+#define WGL_SWAP_UNDERLAY8 0x00800000 >+#define WGL_SWAP_UNDERLAY9 0x01000000 >+#define WGL_SWAP_UNDERLAY10 0x02000000 >+#define WGL_SWAP_UNDERLAY11 0x04000000 >+#define WGL_SWAP_UNDERLAY12 0x08000000 >+#define WGL_SWAP_UNDERLAY13 0x10000000 >+#define WGL_SWAP_UNDERLAY14 0x20000000 >+#define WGL_SWAP_UNDERLAY15 0x40000000 >+typedef int (WINAPI * PFNCHOOSEPIXELFORMATPROC) (HDC hDc, const PIXELFORMATDESCRIPTOR *pPfd); >+typedef int (WINAPI * PFNDESCRIBEPIXELFORMATPROC) (HDC hdc, int ipfd, UINT cjpfd, const PIXELFORMATDESCRIPTOR *ppfd); >+typedef UINT (WINAPI * PFNGETENHMETAFILEPIXELFORMATPROC) (HENHMETAFILE hemf, const PIXELFORMATDESCRIPTOR *ppfd); >+typedef int (WINAPI * PFNGETPIXELFORMATPROC) (HDC hdc); >+typedef BOOL (WINAPI * PFNSETPIXELFORMATPROC) (HDC hdc, int ipfd, const PIXELFORMATDESCRIPTOR *ppfd); >+typedef BOOL (WINAPI * PFNSWAPBUFFERSPROC) (HDC hdc); >+typedef BOOL (WINAPI * PFNWGLCOPYCONTEXTPROC) (HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask); >+typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTPROC) (HDC hDc); >+typedef HGLRC (WINAPI * PFNWGLCREATELAYERCONTEXTPROC) (HDC hDc, int level); >+typedef BOOL (WINAPI * PFNWGLDELETECONTEXTPROC) (HGLRC oldContext); >+typedef BOOL (WINAPI * PFNWGLDESCRIBELAYERPLANEPROC) (HDC hDc, int pixelFormat, int layerPlane, UINT nBytes, const LAYERPLANEDESCRIPTOR *plpd); >+typedef HGLRC (WINAPI * PFNWGLGETCURRENTCONTEXTPROC) (void); >+typedef HDC (WINAPI * PFNWGLGETCURRENTDCPROC) (void); >+typedef int (WINAPI * PFNWGLGETLAYERPALETTEENTRIESPROC) (HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF *pcr); >+typedef PROC (WINAPI * PFNWGLGETPROCADDRESSPROC) (LPCSTR lpszProc); >+typedef BOOL (WINAPI * PFNWGLMAKECURRENTPROC) (HDC hDc, HGLRC newContext); >+typedef BOOL (WINAPI * PFNWGLREALIZELAYERPALETTEPROC) (HDC hdc, int iLayerPlane, BOOL bRealize); >+typedef int (WINAPI * PFNWGLSETLAYERPALETTEENTRIESPROC) (HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF *pcr); >+typedef BOOL (WINAPI * PFNWGLSHARELISTSPROC) (HGLRC hrcSrvShare, HGLRC hrcSrvSource); >+typedef BOOL (WINAPI * PFNWGLSWAPLAYERBUFFERSPROC) (HDC hdc, UINT fuFlags); >+typedef BOOL (WINAPI * PFNWGLUSEFONTBITMAPSPROC) (HDC hDC, DWORD first, DWORD count, DWORD listBase); >+typedef BOOL (WINAPI * PFNWGLUSEFONTBITMAPSAPROC) (HDC hDC, DWORD first, DWORD count, DWORD listBase); >+typedef BOOL (WINAPI * PFNWGLUSEFONTBITMAPSWPROC) (HDC hDC, DWORD first, DWORD count, DWORD listBase); >+typedef BOOL (WINAPI * PFNWGLUSEFONTOUTLINESPROC) (HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); >+typedef BOOL (WINAPI * PFNWGLUSEFONTOUTLINESAPROC) (HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); >+typedef BOOL (WINAPI * PFNWGLUSEFONTOUTLINESWPROC) (HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); >+#ifdef WGL_WGLEXT_PROTOTYPES >+int WINAPI ChoosePixelFormat (HDC hDc, const PIXELFORMATDESCRIPTOR *pPfd); >+int WINAPI DescribePixelFormat (HDC hdc, int ipfd, UINT cjpfd, const PIXELFORMATDESCRIPTOR *ppfd); >+UINT WINAPI GetEnhMetaFilePixelFormat (HENHMETAFILE hemf, const PIXELFORMATDESCRIPTOR *ppfd); >+int WINAPI GetPixelFormat (HDC hdc); >+BOOL WINAPI SetPixelFormat (HDC hdc, int ipfd, const PIXELFORMATDESCRIPTOR *ppfd); >+BOOL WINAPI SwapBuffers (HDC hdc); >+BOOL WINAPI wglCopyContext (HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask); >+HGLRC WINAPI wglCreateContext (HDC hDc); >+HGLRC WINAPI wglCreateLayerContext (HDC hDc, int level); >+BOOL WINAPI wglDeleteContext (HGLRC oldContext); >+BOOL WINAPI wglDescribeLayerPlane (HDC hDc, int pixelFormat, int layerPlane, UINT nBytes, const LAYERPLANEDESCRIPTOR *plpd); >+HGLRC WINAPI wglGetCurrentContext (void); >+HDC WINAPI wglGetCurrentDC (void); >+int WINAPI wglGetLayerPaletteEntries (HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF *pcr); >+PROC WINAPI wglGetProcAddress (LPCSTR lpszProc); >+BOOL WINAPI wglMakeCurrent (HDC hDc, HGLRC newContext); >+BOOL WINAPI wglRealizeLayerPalette (HDC hdc, int iLayerPlane, BOOL bRealize); >+int WINAPI wglSetLayerPaletteEntries (HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF *pcr); >+BOOL WINAPI wglShareLists (HGLRC hrcSrvShare, HGLRC hrcSrvSource); >+BOOL WINAPI wglSwapLayerBuffers (HDC hdc, UINT fuFlags); >+BOOL WINAPI wglUseFontBitmaps (HDC hDC, DWORD first, DWORD count, DWORD listBase); >+BOOL WINAPI wglUseFontBitmapsA (HDC hDC, DWORD first, DWORD count, DWORD listBase); >+BOOL WINAPI wglUseFontBitmapsW (HDC hDC, DWORD first, DWORD count, DWORD listBase); >+BOOL WINAPI wglUseFontOutlines (HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); >+BOOL WINAPI wglUseFontOutlinesA (HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); >+BOOL WINAPI wglUseFontOutlinesW (HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); >+#endif >+#endif /* WGL_VERSION_1_0 */ >+ >+#ifndef WGL_ARB_buffer_region >+#define WGL_ARB_buffer_region 1 >+#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 >+#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 >+#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 >+#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 >+typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); >+typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); >+typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); >+typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); >+#ifdef WGL_WGLEXT_PROTOTYPES >+HANDLE WINAPI wglCreateBufferRegionARB (HDC hDC, int iLayerPlane, UINT uType); >+VOID WINAPI wglDeleteBufferRegionARB (HANDLE hRegion); >+BOOL WINAPI wglSaveBufferRegionARB (HANDLE hRegion, int x, int y, int width, int height); >+BOOL WINAPI wglRestoreBufferRegionARB (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); >+#endif >+#endif /* WGL_ARB_buffer_region */ >+ >+#ifndef WGL_ARB_context_flush_control >+#define WGL_ARB_context_flush_control 1 >+#define WGL_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097 >+#define WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0 >+#define WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098 >+#endif /* WGL_ARB_context_flush_control */ >+ >+#ifndef WGL_ARB_create_context >+#define WGL_ARB_create_context 1 >+#define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001 >+#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002 >+#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 >+#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 >+#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 >+#define WGL_CONTEXT_FLAGS_ARB 0x2094 >+#define ERROR_INVALID_VERSION_ARB 0x2095 >+typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList); >+#ifdef WGL_WGLEXT_PROTOTYPES >+HGLRC WINAPI wglCreateContextAttribsARB (HDC hDC, HGLRC hShareContext, const int *attribList); >+#endif >+#endif /* WGL_ARB_create_context */ >+ >+#ifndef WGL_ARB_create_context_no_error >+#define WGL_ARB_create_context_no_error 1 >+#define WGL_CONTEXT_OPENGL_NO_ERROR_ARB 0x31B3 >+#endif /* WGL_ARB_create_context_no_error */ >+ >+#ifndef WGL_ARB_create_context_profile >+#define WGL_ARB_create_context_profile 1 >+#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 >+#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 >+#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 >+#define ERROR_INVALID_PROFILE_ARB 0x2096 >+#endif /* WGL_ARB_create_context_profile */ >+ >+#ifndef WGL_ARB_create_context_robustness >+#define WGL_ARB_create_context_robustness 1 >+#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 >+#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 >+#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 >+#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261 >+#endif /* WGL_ARB_create_context_robustness */ >+ >+#ifndef WGL_ARB_extensions_string >+#define WGL_ARB_extensions_string 1 >+typedef const char *(WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); >+#ifdef WGL_WGLEXT_PROTOTYPES >+const char *WINAPI wglGetExtensionsStringARB (HDC hdc); >+#endif >+#endif /* WGL_ARB_extensions_string */ >+ >+#ifndef WGL_ARB_framebuffer_sRGB >+#define WGL_ARB_framebuffer_sRGB 1 >+#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 >+#endif /* WGL_ARB_framebuffer_sRGB */ >+ >+#ifndef WGL_ARB_make_current_read >+#define WGL_ARB_make_current_read 1 >+#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 >+#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 >+typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); >+typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (void); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglMakeContextCurrentARB (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); >+HDC WINAPI wglGetCurrentReadDCARB (void); >+#endif >+#endif /* WGL_ARB_make_current_read */ >+ >+#ifndef WGL_ARB_multisample >+#define WGL_ARB_multisample 1 >+#define WGL_SAMPLE_BUFFERS_ARB 0x2041 >+#define WGL_SAMPLES_ARB 0x2042 >+#endif /* WGL_ARB_multisample */ >+ >+#ifndef WGL_ARB_pbuffer >+#define WGL_ARB_pbuffer 1 >+DECLARE_HANDLE(HPBUFFERARB); >+#define WGL_DRAW_TO_PBUFFER_ARB 0x202D >+#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E >+#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F >+#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 >+#define WGL_PBUFFER_LARGEST_ARB 0x2033 >+#define WGL_PBUFFER_WIDTH_ARB 0x2034 >+#define WGL_PBUFFER_HEIGHT_ARB 0x2035 >+#define WGL_PBUFFER_LOST_ARB 0x2036 >+typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); >+typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); >+typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); >+typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); >+typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); >+#ifdef WGL_WGLEXT_PROTOTYPES >+HPBUFFERARB WINAPI wglCreatePbufferARB (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); >+HDC WINAPI wglGetPbufferDCARB (HPBUFFERARB hPbuffer); >+int WINAPI wglReleasePbufferDCARB (HPBUFFERARB hPbuffer, HDC hDC); >+BOOL WINAPI wglDestroyPbufferARB (HPBUFFERARB hPbuffer); >+BOOL WINAPI wglQueryPbufferARB (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); >+#endif >+#endif /* WGL_ARB_pbuffer */ >+ >+#ifndef WGL_ARB_pixel_format >+#define WGL_ARB_pixel_format 1 >+#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 >+#define WGL_DRAW_TO_WINDOW_ARB 0x2001 >+#define WGL_DRAW_TO_BITMAP_ARB 0x2002 >+#define WGL_ACCELERATION_ARB 0x2003 >+#define WGL_NEED_PALETTE_ARB 0x2004 >+#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 >+#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 >+#define WGL_SWAP_METHOD_ARB 0x2007 >+#define WGL_NUMBER_OVERLAYS_ARB 0x2008 >+#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 >+#define WGL_TRANSPARENT_ARB 0x200A >+#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 >+#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 >+#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 >+#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A >+#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B >+#define WGL_SHARE_DEPTH_ARB 0x200C >+#define WGL_SHARE_STENCIL_ARB 0x200D >+#define WGL_SHARE_ACCUM_ARB 0x200E >+#define WGL_SUPPORT_GDI_ARB 0x200F >+#define WGL_SUPPORT_OPENGL_ARB 0x2010 >+#define WGL_DOUBLE_BUFFER_ARB 0x2011 >+#define WGL_STEREO_ARB 0x2012 >+#define WGL_PIXEL_TYPE_ARB 0x2013 >+#define WGL_COLOR_BITS_ARB 0x2014 >+#define WGL_RED_BITS_ARB 0x2015 >+#define WGL_RED_SHIFT_ARB 0x2016 >+#define WGL_GREEN_BITS_ARB 0x2017 >+#define WGL_GREEN_SHIFT_ARB 0x2018 >+#define WGL_BLUE_BITS_ARB 0x2019 >+#define WGL_BLUE_SHIFT_ARB 0x201A >+#define WGL_ALPHA_BITS_ARB 0x201B >+#define WGL_ALPHA_SHIFT_ARB 0x201C >+#define WGL_ACCUM_BITS_ARB 0x201D >+#define WGL_ACCUM_RED_BITS_ARB 0x201E >+#define WGL_ACCUM_GREEN_BITS_ARB 0x201F >+#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 >+#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 >+#define WGL_DEPTH_BITS_ARB 0x2022 >+#define WGL_STENCIL_BITS_ARB 0x2023 >+#define WGL_AUX_BUFFERS_ARB 0x2024 >+#define WGL_NO_ACCELERATION_ARB 0x2025 >+#define WGL_GENERIC_ACCELERATION_ARB 0x2026 >+#define WGL_FULL_ACCELERATION_ARB 0x2027 >+#define WGL_SWAP_EXCHANGE_ARB 0x2028 >+#define WGL_SWAP_COPY_ARB 0x2029 >+#define WGL_SWAP_UNDEFINED_ARB 0x202A >+#define WGL_TYPE_RGBA_ARB 0x202B >+#define WGL_TYPE_COLORINDEX_ARB 0x202C >+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); >+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); >+typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglGetPixelFormatAttribivARB (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); >+BOOL WINAPI wglGetPixelFormatAttribfvARB (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); >+BOOL WINAPI wglChoosePixelFormatARB (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); >+#endif >+#endif /* WGL_ARB_pixel_format */ >+ >+#ifndef WGL_ARB_pixel_format_float >+#define WGL_ARB_pixel_format_float 1 >+#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 >+#endif /* WGL_ARB_pixel_format_float */ >+ >+#ifndef WGL_ARB_render_texture >+#define WGL_ARB_render_texture 1 >+#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 >+#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 >+#define WGL_TEXTURE_FORMAT_ARB 0x2072 >+#define WGL_TEXTURE_TARGET_ARB 0x2073 >+#define WGL_MIPMAP_TEXTURE_ARB 0x2074 >+#define WGL_TEXTURE_RGB_ARB 0x2075 >+#define WGL_TEXTURE_RGBA_ARB 0x2076 >+#define WGL_NO_TEXTURE_ARB 0x2077 >+#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 >+#define WGL_TEXTURE_1D_ARB 0x2079 >+#define WGL_TEXTURE_2D_ARB 0x207A >+#define WGL_MIPMAP_LEVEL_ARB 0x207B >+#define WGL_CUBE_MAP_FACE_ARB 0x207C >+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D >+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E >+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F >+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 >+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 >+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 >+#define WGL_FRONT_LEFT_ARB 0x2083 >+#define WGL_FRONT_RIGHT_ARB 0x2084 >+#define WGL_BACK_LEFT_ARB 0x2085 >+#define WGL_BACK_RIGHT_ARB 0x2086 >+#define WGL_AUX0_ARB 0x2087 >+#define WGL_AUX1_ARB 0x2088 >+#define WGL_AUX2_ARB 0x2089 >+#define WGL_AUX3_ARB 0x208A >+#define WGL_AUX4_ARB 0x208B >+#define WGL_AUX5_ARB 0x208C >+#define WGL_AUX6_ARB 0x208D >+#define WGL_AUX7_ARB 0x208E >+#define WGL_AUX8_ARB 0x208F >+#define WGL_AUX9_ARB 0x2090 >+typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); >+typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); >+typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int *piAttribList); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglBindTexImageARB (HPBUFFERARB hPbuffer, int iBuffer); >+BOOL WINAPI wglReleaseTexImageARB (HPBUFFERARB hPbuffer, int iBuffer); >+BOOL WINAPI wglSetPbufferAttribARB (HPBUFFERARB hPbuffer, const int *piAttribList); >+#endif >+#endif /* WGL_ARB_render_texture */ >+ >+#ifndef WGL_ARB_robustness_application_isolation >+#define WGL_ARB_robustness_application_isolation 1 >+#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 >+#endif /* WGL_ARB_robustness_application_isolation */ >+ >+#ifndef WGL_ARB_robustness_share_group_isolation >+#define WGL_ARB_robustness_share_group_isolation 1 >+#endif /* WGL_ARB_robustness_share_group_isolation */ >+ >+#ifndef WGL_3DFX_multisample >+#define WGL_3DFX_multisample 1 >+#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 >+#define WGL_SAMPLES_3DFX 0x2061 >+#endif /* WGL_3DFX_multisample */ >+ >+#ifndef WGL_3DL_stereo_control >+#define WGL_3DL_stereo_control 1 >+#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 >+#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 >+#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 >+#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 >+typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglSetStereoEmitterState3DL (HDC hDC, UINT uState); >+#endif >+#endif /* WGL_3DL_stereo_control */ >+ >+#ifndef WGL_AMD_gpu_association >+#define WGL_AMD_gpu_association 1 >+#define WGL_GPU_VENDOR_AMD 0x1F00 >+#define WGL_GPU_RENDERER_STRING_AMD 0x1F01 >+#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 >+#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 >+#define WGL_GPU_RAM_AMD 0x21A3 >+#define WGL_GPU_CLOCK_AMD 0x21A4 >+#define WGL_GPU_NUM_PIPES_AMD 0x21A5 >+#define WGL_GPU_NUM_SIMD_AMD 0x21A6 >+#define WGL_GPU_NUM_RB_AMD 0x21A7 >+#define WGL_GPU_NUM_SPI_AMD 0x21A8 >+typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT *ids); >+typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, int property, GLenum dataType, UINT size, void *data); >+typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc); >+typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id); >+typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int *attribList); >+typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc); >+typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc); >+typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); >+typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); >+#ifdef WGL_WGLEXT_PROTOTYPES >+UINT WINAPI wglGetGPUIDsAMD (UINT maxCount, UINT *ids); >+INT WINAPI wglGetGPUInfoAMD (UINT id, int property, GLenum dataType, UINT size, void *data); >+UINT WINAPI wglGetContextGPUIDAMD (HGLRC hglrc); >+HGLRC WINAPI wglCreateAssociatedContextAMD (UINT id); >+HGLRC WINAPI wglCreateAssociatedContextAttribsAMD (UINT id, HGLRC hShareContext, const int *attribList); >+BOOL WINAPI wglDeleteAssociatedContextAMD (HGLRC hglrc); >+BOOL WINAPI wglMakeAssociatedContextCurrentAMD (HGLRC hglrc); >+HGLRC WINAPI wglGetCurrentAssociatedContextAMD (void); >+VOID WINAPI wglBlitContextFramebufferAMD (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); >+#endif >+#endif /* WGL_AMD_gpu_association */ >+ >+#ifndef WGL_ATI_pixel_format_float >+#define WGL_ATI_pixel_format_float 1 >+#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 >+#endif /* WGL_ATI_pixel_format_float */ >+ >+#ifndef WGL_ATI_render_texture_rectangle >+#define WGL_ATI_render_texture_rectangle 1 >+#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 >+#endif /* WGL_ATI_render_texture_rectangle */ >+ >+#ifndef WGL_EXT_colorspace >+#define WGL_EXT_colorspace 1 >+#define WGL_COLORSPACE_EXT 0x309D >+#define WGL_COLORSPACE_SRGB_EXT 0x3089 >+#define WGL_COLORSPACE_LINEAR_EXT 0x308A >+#endif /* WGL_EXT_colorspace */ >+ >+#ifndef WGL_EXT_create_context_es2_profile >+#define WGL_EXT_create_context_es2_profile 1 >+#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 >+#endif /* WGL_EXT_create_context_es2_profile */ >+ >+#ifndef WGL_EXT_create_context_es_profile >+#define WGL_EXT_create_context_es_profile 1 >+#define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 >+#endif /* WGL_EXT_create_context_es_profile */ >+ >+#ifndef WGL_EXT_depth_float >+#define WGL_EXT_depth_float 1 >+#define WGL_DEPTH_FLOAT_EXT 0x2040 >+#endif /* WGL_EXT_depth_float */ >+ >+#ifndef WGL_EXT_display_color_table >+#define WGL_EXT_display_color_table 1 >+typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); >+typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (const GLushort *table, GLuint length); >+typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); >+typedef VOID (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); >+#ifdef WGL_WGLEXT_PROTOTYPES >+GLboolean WINAPI wglCreateDisplayColorTableEXT (GLushort id); >+GLboolean WINAPI wglLoadDisplayColorTableEXT (const GLushort *table, GLuint length); >+GLboolean WINAPI wglBindDisplayColorTableEXT (GLushort id); >+VOID WINAPI wglDestroyDisplayColorTableEXT (GLushort id); >+#endif >+#endif /* WGL_EXT_display_color_table */ >+ >+#ifndef WGL_EXT_extensions_string >+#define WGL_EXT_extensions_string 1 >+typedef const char *(WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); >+#ifdef WGL_WGLEXT_PROTOTYPES >+const char *WINAPI wglGetExtensionsStringEXT (void); >+#endif >+#endif /* WGL_EXT_extensions_string */ >+ >+#ifndef WGL_EXT_framebuffer_sRGB >+#define WGL_EXT_framebuffer_sRGB 1 >+#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 >+#endif /* WGL_EXT_framebuffer_sRGB */ >+ >+#ifndef WGL_EXT_make_current_read >+#define WGL_EXT_make_current_read 1 >+#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 >+typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); >+typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (void); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglMakeContextCurrentEXT (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); >+HDC WINAPI wglGetCurrentReadDCEXT (void); >+#endif >+#endif /* WGL_EXT_make_current_read */ >+ >+#ifndef WGL_EXT_multisample >+#define WGL_EXT_multisample 1 >+#define WGL_SAMPLE_BUFFERS_EXT 0x2041 >+#define WGL_SAMPLES_EXT 0x2042 >+#endif /* WGL_EXT_multisample */ >+ >+#ifndef WGL_EXT_pbuffer >+#define WGL_EXT_pbuffer 1 >+DECLARE_HANDLE(HPBUFFEREXT); >+#define WGL_DRAW_TO_PBUFFER_EXT 0x202D >+#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E >+#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F >+#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 >+#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 >+#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 >+#define WGL_PBUFFER_LARGEST_EXT 0x2033 >+#define WGL_PBUFFER_WIDTH_EXT 0x2034 >+#define WGL_PBUFFER_HEIGHT_EXT 0x2035 >+typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); >+typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); >+typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); >+typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); >+typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue); >+#ifdef WGL_WGLEXT_PROTOTYPES >+HPBUFFEREXT WINAPI wglCreatePbufferEXT (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); >+HDC WINAPI wglGetPbufferDCEXT (HPBUFFEREXT hPbuffer); >+int WINAPI wglReleasePbufferDCEXT (HPBUFFEREXT hPbuffer, HDC hDC); >+BOOL WINAPI wglDestroyPbufferEXT (HPBUFFEREXT hPbuffer); >+BOOL WINAPI wglQueryPbufferEXT (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue); >+#endif >+#endif /* WGL_EXT_pbuffer */ >+ >+#ifndef WGL_EXT_pixel_format >+#define WGL_EXT_pixel_format 1 >+#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 >+#define WGL_DRAW_TO_WINDOW_EXT 0x2001 >+#define WGL_DRAW_TO_BITMAP_EXT 0x2002 >+#define WGL_ACCELERATION_EXT 0x2003 >+#define WGL_NEED_PALETTE_EXT 0x2004 >+#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 >+#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 >+#define WGL_SWAP_METHOD_EXT 0x2007 >+#define WGL_NUMBER_OVERLAYS_EXT 0x2008 >+#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 >+#define WGL_TRANSPARENT_EXT 0x200A >+#define WGL_TRANSPARENT_VALUE_EXT 0x200B >+#define WGL_SHARE_DEPTH_EXT 0x200C >+#define WGL_SHARE_STENCIL_EXT 0x200D >+#define WGL_SHARE_ACCUM_EXT 0x200E >+#define WGL_SUPPORT_GDI_EXT 0x200F >+#define WGL_SUPPORT_OPENGL_EXT 0x2010 >+#define WGL_DOUBLE_BUFFER_EXT 0x2011 >+#define WGL_STEREO_EXT 0x2012 >+#define WGL_PIXEL_TYPE_EXT 0x2013 >+#define WGL_COLOR_BITS_EXT 0x2014 >+#define WGL_RED_BITS_EXT 0x2015 >+#define WGL_RED_SHIFT_EXT 0x2016 >+#define WGL_GREEN_BITS_EXT 0x2017 >+#define WGL_GREEN_SHIFT_EXT 0x2018 >+#define WGL_BLUE_BITS_EXT 0x2019 >+#define WGL_BLUE_SHIFT_EXT 0x201A >+#define WGL_ALPHA_BITS_EXT 0x201B >+#define WGL_ALPHA_SHIFT_EXT 0x201C >+#define WGL_ACCUM_BITS_EXT 0x201D >+#define WGL_ACCUM_RED_BITS_EXT 0x201E >+#define WGL_ACCUM_GREEN_BITS_EXT 0x201F >+#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 >+#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 >+#define WGL_DEPTH_BITS_EXT 0x2022 >+#define WGL_STENCIL_BITS_EXT 0x2023 >+#define WGL_AUX_BUFFERS_EXT 0x2024 >+#define WGL_NO_ACCELERATION_EXT 0x2025 >+#define WGL_GENERIC_ACCELERATION_EXT 0x2026 >+#define WGL_FULL_ACCELERATION_EXT 0x2027 >+#define WGL_SWAP_EXCHANGE_EXT 0x2028 >+#define WGL_SWAP_COPY_EXT 0x2029 >+#define WGL_SWAP_UNDEFINED_EXT 0x202A >+#define WGL_TYPE_RGBA_EXT 0x202B >+#define WGL_TYPE_COLORINDEX_EXT 0x202C >+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues); >+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues); >+typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglGetPixelFormatAttribivEXT (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues); >+BOOL WINAPI wglGetPixelFormatAttribfvEXT (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues); >+BOOL WINAPI wglChoosePixelFormatEXT (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); >+#endif >+#endif /* WGL_EXT_pixel_format */ >+ >+#ifndef WGL_EXT_pixel_format_packed_float >+#define WGL_EXT_pixel_format_packed_float 1 >+#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 >+#endif /* WGL_EXT_pixel_format_packed_float */ >+ >+#ifndef WGL_EXT_swap_control >+#define WGL_EXT_swap_control 1 >+typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); >+typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglSwapIntervalEXT (int interval); >+int WINAPI wglGetSwapIntervalEXT (void); >+#endif >+#endif /* WGL_EXT_swap_control */ >+ >+#ifndef WGL_EXT_swap_control_tear >+#define WGL_EXT_swap_control_tear 1 >+#endif /* WGL_EXT_swap_control_tear */ >+ >+#ifndef WGL_I3D_digital_video_control >+#define WGL_I3D_digital_video_control 1 >+#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 >+#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 >+#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 >+#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 >+typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int *piValue); >+typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int *piValue); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglGetDigitalVideoParametersI3D (HDC hDC, int iAttribute, int *piValue); >+BOOL WINAPI wglSetDigitalVideoParametersI3D (HDC hDC, int iAttribute, const int *piValue); >+#endif >+#endif /* WGL_I3D_digital_video_control */ >+ >+#ifndef WGL_I3D_gamma >+#define WGL_I3D_gamma 1 >+#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E >+#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F >+typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int *piValue); >+typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int *piValue); >+typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue); >+typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglGetGammaTableParametersI3D (HDC hDC, int iAttribute, int *piValue); >+BOOL WINAPI wglSetGammaTableParametersI3D (HDC hDC, int iAttribute, const int *piValue); >+BOOL WINAPI wglGetGammaTableI3D (HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue); >+BOOL WINAPI wglSetGammaTableI3D (HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue); >+#endif >+#endif /* WGL_I3D_gamma */ >+ >+#ifndef WGL_I3D_genlock >+#define WGL_I3D_genlock 1 >+#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 >+#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 >+#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 >+#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 >+#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 >+#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 >+#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A >+#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B >+#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C >+typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); >+typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); >+typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL *pFlag); >+typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); >+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT *uSource); >+typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); >+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT *uEdge); >+typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); >+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT *uRate); >+typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); >+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT *uDelay); >+typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglEnableGenlockI3D (HDC hDC); >+BOOL WINAPI wglDisableGenlockI3D (HDC hDC); >+BOOL WINAPI wglIsEnabledGenlockI3D (HDC hDC, BOOL *pFlag); >+BOOL WINAPI wglGenlockSourceI3D (HDC hDC, UINT uSource); >+BOOL WINAPI wglGetGenlockSourceI3D (HDC hDC, UINT *uSource); >+BOOL WINAPI wglGenlockSourceEdgeI3D (HDC hDC, UINT uEdge); >+BOOL WINAPI wglGetGenlockSourceEdgeI3D (HDC hDC, UINT *uEdge); >+BOOL WINAPI wglGenlockSampleRateI3D (HDC hDC, UINT uRate); >+BOOL WINAPI wglGetGenlockSampleRateI3D (HDC hDC, UINT *uRate); >+BOOL WINAPI wglGenlockSourceDelayI3D (HDC hDC, UINT uDelay); >+BOOL WINAPI wglGetGenlockSourceDelayI3D (HDC hDC, UINT *uDelay); >+BOOL WINAPI wglQueryGenlockMaxSourceDelayI3D (HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay); >+#endif >+#endif /* WGL_I3D_genlock */ >+ >+#ifndef WGL_I3D_image_buffer >+#define WGL_I3D_image_buffer 1 >+#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 >+#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 >+typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); >+typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); >+typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count); >+typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const LPVOID *pAddress, UINT count); >+#ifdef WGL_WGLEXT_PROTOTYPES >+LPVOID WINAPI wglCreateImageBufferI3D (HDC hDC, DWORD dwSize, UINT uFlags); >+BOOL WINAPI wglDestroyImageBufferI3D (HDC hDC, LPVOID pAddress); >+BOOL WINAPI wglAssociateImageBufferEventsI3D (HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count); >+BOOL WINAPI wglReleaseImageBufferEventsI3D (HDC hDC, const LPVOID *pAddress, UINT count); >+#endif >+#endif /* WGL_I3D_image_buffer */ >+ >+#ifndef WGL_I3D_swap_frame_lock >+#define WGL_I3D_swap_frame_lock 1 >+typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (void); >+typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (void); >+typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL *pFlag); >+typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL *pFlag); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglEnableFrameLockI3D (void); >+BOOL WINAPI wglDisableFrameLockI3D (void); >+BOOL WINAPI wglIsEnabledFrameLockI3D (BOOL *pFlag); >+BOOL WINAPI wglQueryFrameLockMasterI3D (BOOL *pFlag); >+#endif >+#endif /* WGL_I3D_swap_frame_lock */ >+ >+#ifndef WGL_I3D_swap_frame_usage >+#define WGL_I3D_swap_frame_usage 1 >+typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float *pUsage); >+typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); >+typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); >+typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglGetFrameUsageI3D (float *pUsage); >+BOOL WINAPI wglBeginFrameTrackingI3D (void); >+BOOL WINAPI wglEndFrameTrackingI3D (void); >+BOOL WINAPI wglQueryFrameTrackingI3D (DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); >+#endif >+#endif /* WGL_I3D_swap_frame_usage */ >+ >+#ifndef WGL_NV_DX_interop >+#define WGL_NV_DX_interop 1 >+#define WGL_ACCESS_READ_ONLY_NV 0x00000000 >+#define WGL_ACCESS_READ_WRITE_NV 0x00000001 >+#define WGL_ACCESS_WRITE_DISCARD_NV 0x00000002 >+typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void *dxObject, HANDLE shareHandle); >+typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void *dxDevice); >+typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice); >+typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void *dxObject, GLuint name, GLenum type, GLenum access); >+typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject); >+typedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access); >+typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE *hObjects); >+typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE *hObjects); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglDXSetResourceShareHandleNV (void *dxObject, HANDLE shareHandle); >+HANDLE WINAPI wglDXOpenDeviceNV (void *dxDevice); >+BOOL WINAPI wglDXCloseDeviceNV (HANDLE hDevice); >+HANDLE WINAPI wglDXRegisterObjectNV (HANDLE hDevice, void *dxObject, GLuint name, GLenum type, GLenum access); >+BOOL WINAPI wglDXUnregisterObjectNV (HANDLE hDevice, HANDLE hObject); >+BOOL WINAPI wglDXObjectAccessNV (HANDLE hObject, GLenum access); >+BOOL WINAPI wglDXLockObjectsNV (HANDLE hDevice, GLint count, HANDLE *hObjects); >+BOOL WINAPI wglDXUnlockObjectsNV (HANDLE hDevice, GLint count, HANDLE *hObjects); >+#endif >+#endif /* WGL_NV_DX_interop */ >+ >+#ifndef WGL_NV_DX_interop2 >+#define WGL_NV_DX_interop2 1 >+#endif /* WGL_NV_DX_interop2 */ >+ >+#ifndef WGL_NV_copy_image >+#define WGL_NV_copy_image 1 >+typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglCopyImageSubDataNV (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); >+#endif >+#endif /* WGL_NV_copy_image */ >+ >+#ifndef WGL_NV_delay_before_swap >+#define WGL_NV_delay_before_swap 1 >+typedef BOOL (WINAPI * PFNWGLDELAYBEFORESWAPNVPROC) (HDC hDC, GLfloat seconds); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglDelayBeforeSwapNV (HDC hDC, GLfloat seconds); >+#endif >+#endif /* WGL_NV_delay_before_swap */ >+ >+#ifndef WGL_NV_float_buffer >+#define WGL_NV_float_buffer 1 >+#define WGL_FLOAT_COMPONENTS_NV 0x20B0 >+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 >+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 >+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 >+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 >+#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 >+#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 >+#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 >+#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 >+#endif /* WGL_NV_float_buffer */ >+ >+#ifndef WGL_NV_gpu_affinity >+#define WGL_NV_gpu_affinity 1 >+DECLARE_HANDLE(HGPUNV); >+struct _GPU_DEVICE { >+ DWORD cb; >+ CHAR DeviceName[32]; >+ CHAR DeviceString[128]; >+ DWORD Flags; >+ RECT rcVirtualScreen; >+}; >+typedef struct _GPU_DEVICE *PGPU_DEVICE; >+#define ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 >+#define ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 >+typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu); >+typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); >+typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList); >+typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); >+typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglEnumGpusNV (UINT iGpuIndex, HGPUNV *phGpu); >+BOOL WINAPI wglEnumGpuDevicesNV (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); >+HDC WINAPI wglCreateAffinityDCNV (const HGPUNV *phGpuList); >+BOOL WINAPI wglEnumGpusFromAffinityDCNV (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); >+BOOL WINAPI wglDeleteDCNV (HDC hdc); >+#endif >+#endif /* WGL_NV_gpu_affinity */ >+ >+#ifndef WGL_NV_multisample_coverage >+#define WGL_NV_multisample_coverage 1 >+#define WGL_COVERAGE_SAMPLES_NV 0x2042 >+#define WGL_COLOR_SAMPLES_NV 0x20B9 >+#endif /* WGL_NV_multisample_coverage */ >+ >+#ifndef WGL_NV_present_video >+#define WGL_NV_present_video 1 >+DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); >+#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 >+typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDC, HVIDEOOUTPUTDEVICENV *phDeviceList); >+typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int *piAttribList); >+typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int *piValue); >+#ifdef WGL_WGLEXT_PROTOTYPES >+int WINAPI wglEnumerateVideoDevicesNV (HDC hDC, HVIDEOOUTPUTDEVICENV *phDeviceList); >+BOOL WINAPI wglBindVideoDeviceNV (HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int *piAttribList); >+BOOL WINAPI wglQueryCurrentContextNV (int iAttribute, int *piValue); >+#endif >+#endif /* WGL_NV_present_video */ >+ >+#ifndef WGL_NV_render_depth_texture >+#define WGL_NV_render_depth_texture 1 >+#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 >+#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 >+#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 >+#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 >+#define WGL_DEPTH_COMPONENT_NV 0x20A7 >+#endif /* WGL_NV_render_depth_texture */ >+ >+#ifndef WGL_NV_render_texture_rectangle >+#define WGL_NV_render_texture_rectangle 1 >+#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 >+#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 >+#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 >+#endif /* WGL_NV_render_texture_rectangle */ >+ >+#ifndef WGL_NV_swap_group >+#define WGL_NV_swap_group 1 >+typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); >+typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); >+typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint *group, GLuint *barrier); >+typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint *maxGroups, GLuint *maxBarriers); >+typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint *count); >+typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglJoinSwapGroupNV (HDC hDC, GLuint group); >+BOOL WINAPI wglBindSwapBarrierNV (GLuint group, GLuint barrier); >+BOOL WINAPI wglQuerySwapGroupNV (HDC hDC, GLuint *group, GLuint *barrier); >+BOOL WINAPI wglQueryMaxSwapGroupsNV (HDC hDC, GLuint *maxGroups, GLuint *maxBarriers); >+BOOL WINAPI wglQueryFrameCountNV (HDC hDC, GLuint *count); >+BOOL WINAPI wglResetFrameCountNV (HDC hDC); >+#endif >+#endif /* WGL_NV_swap_group */ >+ >+#ifndef WGL_NV_vertex_array_range >+#define WGL_NV_vertex_array_range 1 >+typedef void *(WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); >+typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); >+#ifdef WGL_WGLEXT_PROTOTYPES >+void *WINAPI wglAllocateMemoryNV (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); >+void WINAPI wglFreeMemoryNV (void *pointer); >+#endif >+#endif /* WGL_NV_vertex_array_range */ >+ >+#ifndef WGL_NV_video_capture >+#define WGL_NV_video_capture 1 >+DECLARE_HANDLE(HVIDEOINPUTDEVICENV); >+#define WGL_UNIQUE_ID_NV 0x20CE >+#define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF >+typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); >+typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV *phDeviceList); >+typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); >+typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int *piValue); >+typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglBindVideoCaptureDeviceNV (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); >+UINT WINAPI wglEnumerateVideoCaptureDevicesNV (HDC hDc, HVIDEOINPUTDEVICENV *phDeviceList); >+BOOL WINAPI wglLockVideoCaptureDeviceNV (HDC hDc, HVIDEOINPUTDEVICENV hDevice); >+BOOL WINAPI wglQueryVideoCaptureDeviceNV (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int *piValue); >+BOOL WINAPI wglReleaseVideoCaptureDeviceNV (HDC hDc, HVIDEOINPUTDEVICENV hDevice); >+#endif >+#endif /* WGL_NV_video_capture */ >+ >+#ifndef WGL_NV_video_output >+#define WGL_NV_video_output 1 >+DECLARE_HANDLE(HPVIDEODEV); >+#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 >+#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 >+#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 >+#define WGL_VIDEO_OUT_COLOR_NV 0x20C3 >+#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 >+#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 >+#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 >+#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 >+#define WGL_VIDEO_OUT_FRAME 0x20C8 >+#define WGL_VIDEO_OUT_FIELD_1 0x20C9 >+#define WGL_VIDEO_OUT_FIELD_2 0x20CA >+#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB >+#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC >+typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV *hVideoDevice); >+typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); >+typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); >+typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); >+typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long *pulCounterPbuffer, BOOL bBlock); >+typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglGetVideoDeviceNV (HDC hDC, int numDevices, HPVIDEODEV *hVideoDevice); >+BOOL WINAPI wglReleaseVideoDeviceNV (HPVIDEODEV hVideoDevice); >+BOOL WINAPI wglBindVideoImageNV (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); >+BOOL WINAPI wglReleaseVideoImageNV (HPBUFFERARB hPbuffer, int iVideoBuffer); >+BOOL WINAPI wglSendPbufferToVideoNV (HPBUFFERARB hPbuffer, int iBufferType, unsigned long *pulCounterPbuffer, BOOL bBlock); >+BOOL WINAPI wglGetVideoInfoNV (HPVIDEODEV hpVideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); >+#endif >+#endif /* WGL_NV_video_output */ >+ >+#ifndef WGL_OML_sync_control >+#define WGL_OML_sync_control 1 >+typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc); >+typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32 *numerator, INT32 *denominator); >+typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); >+typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); >+typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc); >+typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc); >+#ifdef WGL_WGLEXT_PROTOTYPES >+BOOL WINAPI wglGetSyncValuesOML (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc); >+BOOL WINAPI wglGetMscRateOML (HDC hdc, INT32 *numerator, INT32 *denominator); >+INT64 WINAPI wglSwapBuffersMscOML (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); >+INT64 WINAPI wglSwapLayerBuffersMscOML (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); >+BOOL WINAPI wglWaitForMscOML (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc); >+BOOL WINAPI wglWaitForSbcOML (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc); >+#endif >+#endif /* WGL_OML_sync_control */ >+ >+#ifdef __cplusplus >+} >+#endif >+ >+#endif >diff --git a/Source/ThirdParty/ANGLE/include/angle_gl.h b/Source/ThirdParty/ANGLE/include/angle_gl.h >index b70a31c2738..d2ec0a36079 100644 >--- a/Source/ThirdParty/ANGLE/include/angle_gl.h >+++ b/Source/ThirdParty/ANGLE/include/angle_gl.h >@@ -10,10 +10,12 @@ > #ifndef ANGLEGL_H_ > #define ANGLEGL_H_ > >+#include "GLES/gl.h" >+#include "GLES/glext.h" > #include "GLES2/gl2.h" > #include "GLES2/gl2ext.h" > #include "GLES3/gl3.h" > #include "GLES3/gl31.h" > #include "GLES3/gl32.h" > >-#endif // ANGLEGL_H_ >+#endif // ANGLEGL_H_ >diff --git a/Source/ThirdParty/ANGLE/include/export.h b/Source/ThirdParty/ANGLE/include/export.h >index cf144f92a54..8ddffd9647d 100644 >--- a/Source/ThirdParty/ANGLE/include/export.h >+++ b/Source/ThirdParty/ANGLE/include/export.h >@@ -10,23 +10,23 @@ > #define LIBGLESV2_EXPORT_H_ > > #if !defined(ANGLE_EXPORT) >-#if defined(_WIN32) >-#if defined(LIBGLESV2_IMPLEMENTATION) || defined(LIBANGLE_IMPLEMENTATION) || \ >- defined(LIBANGLE_UTIL_IMPLEMENTATION) >-# define ANGLE_EXPORT __declspec(dllexport) >-# else >-# define ANGLE_EXPORT __declspec(dllimport) >-# endif >-#elif defined(__GNUC__) >-#if defined(LIBGLESV2_IMPLEMENTATION) || defined(LIBANGLE_IMPLEMENTATION) || \ >- defined(LIBANGLE_UTIL_IMPLEMENTATION) >-# define ANGLE_EXPORT __attribute__((visibility ("default"))) >-# else >-# define ANGLE_EXPORT >-# endif >-#else >-# define ANGLE_EXPORT >-#endif >+# if defined(_WIN32) >+# if defined(LIBGLESV2_IMPLEMENTATION) || defined(LIBANGLE_IMPLEMENTATION) || \ >+ defined(LIBFEATURE_SUPPORT_IMPLEMENTATION) >+# define ANGLE_EXPORT __declspec(dllexport) >+# else >+# define ANGLE_EXPORT __declspec(dllimport) >+# endif >+# elif defined(__GNUC__) >+# if defined(LIBGLESV2_IMPLEMENTATION) || defined(LIBANGLE_IMPLEMENTATION) || \ >+ defined(LIBFEATURE_SUPPORT_IMPLEMENTATION) >+# define ANGLE_EXPORT __attribute__((visibility("default"))) >+# else >+# define ANGLE_EXPORT >+# endif >+# else >+# define ANGLE_EXPORT >+# endif > #endif // !defined(ANGLE_EXPORT) > >-#endif // LIBGLESV2_EXPORT_H_ >+#endif // LIBGLESV2_EXPORT_H_ >diff --git a/Source/ThirdParty/ANGLE/include/id/commit.h b/Source/ThirdParty/ANGLE/include/id/commit.h >deleted file mode 100644 >index 3b30105a4a6..00000000000 >--- a/Source/ThirdParty/ANGLE/include/id/commit.h >+++ /dev/null >@@ -1,3 +0,0 @@ >-#define ANGLE_COMMIT_HASH "57ea533f79a7" >-#define ANGLE_COMMIT_HASH_SIZE 12 >-#define ANGLE_COMMIT_DATE "2017-11-28 23:33:41 +0000" >diff --git a/Source/ThirdParty/ANGLE/include/platform/FeaturesVk.h b/Source/ThirdParty/ANGLE/include/platform/FeaturesVk.h >new file mode 100644 >index 00000000000..92698eac167 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/include/platform/FeaturesVk.h >@@ -0,0 +1,91 @@ >+// >+// 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. >+// >+// FeaturesVk.h: Optional features for the Vulkan renderer. >+// >+ >+#ifndef ANGLE_PLATFORM_FEATURESVK_H_ >+#define ANGLE_PLATFORM_FEATURESVK_H_ >+ >+namespace angle >+{ >+ >+struct FeaturesVk >+{ >+ FeaturesVk(); >+ >+ // Line segment rasterization must follow OpenGL rules. This means using an algorithm similar >+ // to Bresenham's. Vulkan uses a different algorithm. This feature enables the use of pixel >+ // shader patching to implement OpenGL basic line rasterization rules. This feature will >+ // normally always be enabled. Exposing it as an option enables performance testing. >+ bool basicGLLineRasterization = false; >+ >+ // Flips the viewport to render upside-down. This has the effect to render the same way as >+ // OpenGL. If this feature gets enabled, we enable the KHR_MAINTENANCE_1 extension to allow >+ // negative viewports. We inverse rendering to the backbuffer by reversing the height of the >+ // viewport and increasing Y by the height. So if the viewport was (0,0,width,height), it >+ // becomes (0, height, width, -height). Unfortunately, when we start doing this, we also need >+ // to adjust a lot of places since the rendering now happens upside-down. Affected places so >+ // far: >+ // -readPixels >+ // -copyTexImage >+ // -framebuffer blit >+ // -generating mipmaps >+ // -Point sprites tests >+ // -texStorage >+ bool flipViewportY = false; >+ >+ // Add an extra copy region when using vkCmdCopyBuffer as the Windows Intel driver seems >+ // to have a bug where the last region is ignored. >+ bool extraCopyBufferRegion = false; >+ >+ // This flag is added for the sole purpose of end2end tests, to test the correctness >+ // of various algorithms when a fallback format is used, such as using a packed format to >+ // emulate a depth- or stencil-only format. >+ bool forceFallbackFormat = false; >+ >+ // On some NVIDIA drivers the point size range reported from the API is inconsistent with the >+ // actual behavior. Clamp the point size to the value from the API to fix this. >+ // Tracked in http://anglebug.com/2970. >+ bool clampPointSize = false; >+ >+ // On some android devices, the memory barrier between the compute shader that converts vertex >+ // attributes and the vertex shader that reads from it is ineffective. Only known workaround is >+ // to perform a flush after the conversion. http://anglebug.com/3016 >+ bool flushAfterVertexConversion = false; >+ >+ // Whether the VkDevice supports the VK_KHR_incremental_present extension, on which the >+ // EGL_KHR_swap_buffers_with_damage extension can be layered. >+ bool supportsIncrementalPresent = false; >+ >+ // Whether texture copies on cube map targets should be done on GPU. This is a workaround for >+ // Intel drivers on windows that have an issue with creating single-layer views on cube map >+ // textures. >+ bool forceCpuPathForCubeMapCopy = false; >+ >+ // Whether the VkDevice supports the VK_ANDROID_external_memory_android_hardware_buffer >+ // extension, on which the EGL_ANDROID_image_native_buffer extension can be layered. >+ bool supportsAndroidHardwareBuffer = false; >+ >+ // Whether the VkDevice supports the VK_KHR_external_memory_fd >+ // extension, on which the GL_EXT_memory_object_fd extension can be layered. >+ bool supportsExternalMemoryFd = false; >+ >+ // Whether the VkDevice supports the VK_KHR_external_semaphore_fd >+ // extension, on which the GL_EXT_semaphore_fd extension can be layered. >+ bool supportsExternalSemaphoreFd = false; >+ >+ // VK_PRESENT_MODE_FIFO_KHR causes random timeouts on Linux Intel. http://anglebug.com/3153 >+ bool disableFifoPresentMode = false; >+ >+ // On Qualcomm, a bug is preventing us from using loadOp=Clear with inline commands in the >+ // render pass. http://anglebug.com/2361 >+ bool restartRenderPassAfterLoadOpClear = false; >+}; >+ >+inline FeaturesVk::FeaturesVk() = default; >+} // namespace angle >+ >+#endif // ANGLE_PLATFORM_FEATURESVK_H_ >diff --git a/Source/ThirdParty/ANGLE/include/platform/Platform.h b/Source/ThirdParty/ANGLE/include/platform/Platform.h >index aa1221a86e8..837892f7303 100644 >--- a/Source/ThirdParty/ANGLE/include/platform/Platform.h >+++ b/Source/ThirdParty/ANGLE/include/platform/Platform.h >@@ -12,28 +12,31 @@ > #include <stdint.h> > #include <array> > >+#define EGL_PLATFORM_ANGLE_PLATFORM_METHODS_ANGLEX 0x3482 >+ > #if defined(_WIN32) >-# if !defined(LIBANGLE_IMPLEMENTATION) >-# define ANGLE_PLATFORM_EXPORT __declspec(dllimport) >-# else >-# define ANGLE_PLATFORM_EXPORT __declspec(dllexport) >-# endif >+# if !defined(LIBANGLE_IMPLEMENTATION) >+# define ANGLE_PLATFORM_EXPORT __declspec(dllimport) >+# else >+# define ANGLE_PLATFORM_EXPORT __declspec(dllexport) >+# endif > #elif defined(__GNUC__) || defined(__clang__) >-# define ANGLE_PLATFORM_EXPORT __attribute__((visibility ("default"))) >+# define ANGLE_PLATFORM_EXPORT __attribute__((visibility("default"))) > #endif > #if !defined(ANGLE_PLATFORM_EXPORT) >-# define ANGLE_PLATFORM_EXPORT >+# define ANGLE_PLATFORM_EXPORT > #endif > > #if defined(_WIN32) >-# define ANGLE_APIENTRY __stdcall >+# define ANGLE_APIENTRY __stdcall > #else >-# define ANGLE_APIENTRY >+# define ANGLE_APIENTRY > #endif > > namespace angle > { > struct WorkaroundsD3D; >+struct FeaturesVk; > using TraceEventHandle = uint64_t; > using EGLDisplayType = void *; > struct PlatformMethods; >@@ -65,21 +68,15 @@ inline double DefaultMonotonicallyIncreasingTime(PlatformMethods *platform) > > // Log an error message within the platform implementation. > using LogErrorFunc = void (*)(PlatformMethods *platform, const char *errorMessage); >-inline void DefaultLogError(PlatformMethods *platform, const char *errorMessage) >-{ >-} >+inline void DefaultLogError(PlatformMethods *platform, const char *errorMessage) {} > > // Log a warning message within the platform implementation. > using LogWarningFunc = void (*)(PlatformMethods *platform, const char *warningMessage); >-inline void DefaultLogWarning(PlatformMethods *platform, const char *warningMessage) >-{ >-} >+inline void DefaultLogWarning(PlatformMethods *platform, const char *warningMessage) {} > > // Log an info message within the platform implementation. > using LogInfoFunc = void (*)(PlatformMethods *platform, const char *infoMessage); >-inline void DefaultLogInfo(PlatformMethods *platform, const char *infoMessage) >-{ >-} >+inline void DefaultLogInfo(PlatformMethods *platform, const char *infoMessage) {} > > // Tracing -------- > >@@ -120,7 +117,7 @@ inline const unsigned char *DefaultGetTraceCategoryEnabledFlag(PlatformMethods * > // - name is the name of the event. Also used to match BEGIN/END and > // START/FINISH pairs. > // - id optionally allows events of the same name to be distinguished from >-// each other. For example, to trace the consutruction and destruction of >+// each other. For example, to trace the construction and destruction of > // objects, specify the pointer as the id parameter. > // - timestamp should be a time value returned from monotonicallyIncreasingTime. > // - numArgs specifies the number of elements in argNames, argTypes, and >@@ -180,8 +177,7 @@ inline void DefaultUpdateTraceEventDuration(PlatformMethods *platform, > const unsigned char *categoryEnabledFlag, > const char *name, > angle::TraceEventHandle eventHandle) >-{ >-} >+{} > > // Callbacks for reporting histogram data. > // CustomCounts histogram has exponential bucket sizes, so that min=1, max=1000000, bucketCount=50 >@@ -198,8 +194,7 @@ inline void DefaultHistogramCustomCounts(PlatformMethods *platform, > int min, > int max, > int bucketCount) >-{ >-} >+{} > // Enumeration histogram buckets are linear, boundaryValue should be larger than any possible sample > // value. > using HistogramEnumerationFunc = void (*)(PlatformMethods *platform, >@@ -210,26 +205,26 @@ inline void DefaultHistogramEnumeration(PlatformMethods *platform, > const char *name, > int sample, > int boundaryValue) >-{ >-} >+{} > // Unlike enumeration histograms, sparse histograms only allocate memory for non-empty buckets. > using HistogramSparseFunc = void (*)(PlatformMethods *platform, const char *name, int sample); >-inline void DefaultHistogramSparse(PlatformMethods *platform, const char *name, int sample) >-{ >-} >+inline void DefaultHistogramSparse(PlatformMethods *platform, const char *name, int sample) {} > // Boolean histograms track two-state variables. > using HistogramBooleanFunc = void (*)(PlatformMethods *platform, const char *name, bool sample); >-inline void DefaultHistogramBoolean(PlatformMethods *platform, const char *name, bool sample) >-{ >-} >+inline void DefaultHistogramBoolean(PlatformMethods *platform, const char *name, bool sample) {} > > // Allows us to programatically override ANGLE's default workarounds for testing purposes. > using OverrideWorkaroundsD3DFunc = void (*)(PlatformMethods *platform, > angle::WorkaroundsD3D *workaroundsD3D); > inline void DefaultOverrideWorkaroundsD3D(PlatformMethods *platform, > angle::WorkaroundsD3D *workaroundsD3D) >-{ >-} >+{} >+ >+using OverrideFeaturesVkFunc = void (*)(PlatformMethods *platform, >+ angle::FeaturesVk *workaroundsVulkan); >+inline void DefaultOverrideFeaturesVk(PlatformMethods *platform, >+ angle::FeaturesVk *workaroundsVulkan) >+{} > > // Callback on a successful program link with the program binary. Can be used to store > // shaders to disk. Keys are a 160-bit SHA-1 hash. >@@ -242,8 +237,7 @@ inline void DefaultCacheProgram(PlatformMethods *platform, > const ProgramKeyType &key, > size_t programSize, > const uint8_t *programBytes) >-{ >-} >+{} > > // Platform methods are enumerated here once. > #define ANGLE_PLATFORM_OP(OP) \ >@@ -260,22 +254,25 @@ inline void DefaultCacheProgram(PlatformMethods *platform, > OP(histogramSparse, HistogramSparse) \ > OP(histogramBoolean, HistogramBoolean) \ > OP(overrideWorkaroundsD3D, OverrideWorkaroundsD3D) \ >+ OP(overrideFeaturesVk, OverrideFeaturesVk) \ > OP(cacheProgram, CacheProgram) > > #define ANGLE_PLATFORM_METHOD_DEF(Name, CapsName) CapsName##Func Name = Default##CapsName; > > struct ANGLE_PLATFORM_EXPORT PlatformMethods > { >- PlatformMethods(); >+ inline PlatformMethods(); > > // User data pointer for any implementation specific members. Put it at the start of the > // platform structure so it doesn't become overwritten if one version of the platform > // adds or removes new members. > void *context = 0; > >- ANGLE_PLATFORM_OP(ANGLE_PLATFORM_METHOD_DEF); >+ ANGLE_PLATFORM_OP(ANGLE_PLATFORM_METHOD_DEF) > }; > >+inline PlatformMethods::PlatformMethods() = default; >+ > #undef ANGLE_PLATFORM_METHOD_DEF > > // Subtract one to account for the context pointer. >@@ -324,4 +321,4 @@ typedef void(ANGLE_APIENTRY *ResetDisplayPlatformFunc)(angle::EGLDisplayType); > // This function is not exported > angle::PlatformMethods *ANGLEPlatformCurrent(); > >-#endif // ANGLE_PLATFORM_H >+#endif // ANGLE_PLATFORM_H >diff --git a/Source/ThirdParty/ANGLE/include/platform/WorkaroundsD3D.h b/Source/ThirdParty/ANGLE/include/platform/WorkaroundsD3D.h >index cc2abbf1d28..f70ac4eed91 100644 >--- a/Source/ThirdParty/ANGLE/include/platform/WorkaroundsD3D.h >+++ b/Source/ThirdParty/ANGLE/include/platform/WorkaroundsD3D.h >@@ -26,6 +26,9 @@ struct CompilerWorkaroundsD3D > > struct WorkaroundsD3D > { >+ WorkaroundsD3D(); >+ WorkaroundsD3D(const WorkaroundsD3D &other); >+ > // On some systems, having extra rendertargets than necessary slows down the shader. > // We can fix this by optimizing those out of the shader. At the same time, we can > // work around a bug on some nVidia drivers that they ignore "null" render targets >@@ -123,8 +126,23 @@ struct WorkaroundsD3D > // then rendering samples also pass neglecting discard statements in pixel shader. > // So we add a dummy texture as render target in such case. See http://anglebug.com/2152 > bool addDummyTextureNoRenderTarget = false; >+ >+ // Don't use D3D constant register zero when allocating space for uniforms in the vertex shader. >+ // This is targeted to work around a bug in NVIDIA D3D driver version 388.59 where in very >+ // specific cases the driver would not handle constant register zero correctly. >+ bool skipVSConstantRegisterZero = false; >+ >+ // Forces the value returned from an atomic operations to be always be resolved. This is >+ // targeted to workaround a bug in NVIDIA D3D driver where the return value from >+ // RWByteAddressBuffer.InterlockedAdd does not get resolved when used in the .yzw components of >+ // a RWByteAddressBuffer.Store operation. Only has an effect on HLSL translation. >+ // http://anglebug.com/3246 >+ bool forceAtomicValueResolution = false; > }; > >+inline WorkaroundsD3D::WorkaroundsD3D() = default; >+inline WorkaroundsD3D::WorkaroundsD3D(const WorkaroundsD3D &other) = default; >+ > } // namespace angle > > #endif // ANGLE_PLATFORM_WORKAROUNDSD3D_H_ >diff --git a/Source/ThirdParty/ANGLE/infra/ANGLEWrangling.md b/Source/ThirdParty/ANGLE/infra/ANGLEWrangling.md >new file mode 100644 >index 00000000000..fec5d75ee68 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/ANGLEWrangling.md >@@ -0,0 +1,88 @@ >+# ANGLE Wrangling >+ >+As an ANGLE Sheriff. Your job is to: >+ >+ 1. Keep the [ANGLE Try Waterfall](https://ci.chromium.org/p/chromium/g/angle.try/builders) in good >+ working order. >+ 1. Monitor the >+ [Chromium GPU FYI Waterfall](https://ci.chromium.org/p/chromium/g/chromium.gpu.fyi/console) >+ and respond to ANGLE bugs. >+ 1. Control and monitor the [ANGLE auto-rollers](#task-3_the-auto_rollers). >+ 1. Keep the [ANGLE Standalone Testers](README.md) in good working order. >+ >+If you're not an ANGLE team member, you can contact us on the public ANGLE project >+[Google group](https://groups.google.com/forum/#!forum/angleproject). >+ >+## Task 1: The Try Waterfall >+ >+Your first job is to keep the >+[ANGLE Try Waterfall](https://ci.chromium.org/p/chromium/g/angle.try/builders) healthy. Some >+failures are expected on this waterfall. Developers might be testing expectedly buggy code. But >+persistent flakiness and failures should be reported and reverted. >+ >+When encoutering an unexpected failure in your CLs please >+[file an ANGLE bug](http://anglebug.com/new) and cc the current ANGLE wrangler. If the failure is >+unrelated to ANGLE [file a Chromium bug](http://crbug.com/new) and mark the bug as >+`Hotlist-PixelWrangler`. Refer to >+[build.chromium.org](https://ci.chromium.org/p/chromium/g/main/console) to find the current ANGLE >+wrangler and GPU Pixel Wrangler. >+ >+**NOTE: When all builds seem to be purple or otherwise broken:** >+ >+This could be a major infrastructure outage. File a high-priority bug using >+[g.co/bugatrooper](http://g.co/bugatrooper). >+ >+## Task 2: Respond to Bugs >+ >+ANGLE bugs sometimes make it past the commit queue testing and into the master branch. This can be >+because of flaky tests or because the failures are specific to system configurations for which we >+lack full pre-commit testing support. >+ >+The [Chromium GPU FYI Waterfall](https://ci.chromium.org/p/chromium/g/chromium.gpu.fyi/console) >+waterfall includes a number of these one-off specialized configurations. Monitor this console for >+persistent breakage that could be related to ANGLE. Also follow the `Internals>GPU>ANGLE` component >+on the Chromium issue tracker to be alerted to reports of breakage on the GPU.FYI waterfall. >+Googlers can use [sheriff-o-matic](https://sheriff-o-matic.appspot.com/chromium.gpu.fyi) to monitor >+the health of the GPU.FYI waterfall. >+ >+Note that the GPU Pixel Wrangler is responsible for the *Chromium* bugs. Please file issues with >+the tag `Hotlist-PixelWrangler` for bugs that aren't caused by ANGLE regressions. >+ >+*IMPORTANT*: Info to include in bug reports: >+ >+ * Links to all first failing builds (eg first windows failure, first mac failure, etc). >+ * Related regression ranges. See below on how to determine the ANGLE regression range. >+ * Relevant error messages. >+ * Set components: `Internals>GPU` and/or `Internals>GPU>ANGLE`. >+ * cc relevant sheriffs or blame suspects. >+ * Set the `Hotlist-PixelWrangler` label. >+ >+### How to determine the ANGLE regression range on the GPU.FYI bots: >+ >+ 1. Open the first failing and last passing builds. >+ 1. For test failures: record `parent_got_angle_revision` in both builds. >+ 1. For compile failures record `got_angle_revision`. >+ 1. Use this URL: >+ `https://chromium.googlesource.com/angle/angle.git/+log/<last passing revision>..<first failing revision>` >+ >+## Task 3: The Auto-Rollers >+ >+The [ANGLE auto-roller](https://autoroll.skia.org/r/angle-chromium-autoroll) automatically updates >+Chrome with the latest ANGLE changes. >+ >+ 1. **Roller health**: You will be cc'ed on all rolls. Please check failed rolls to verify there is no blocking >+ breakage. >+ 1. **Chrome Branching**: You are responsible for pausing the roller 24h before branch days, and resuming afterwards. >+ See the [Chrome Release Schedule](https://chromiumdash.appspot.com/schedule). >+ >+We also use additional auto-rollers to roll third party libraries into ANGLE once per day: >+ >+ * [SPIRV-Headers into ANGLE](https://autoroll.skia.org/r/spirv-headers-angle-autoroll), >+ * [SPIRV-Tools into ANGLE](https://autoroll.skia.org/r/spirv-tools-angle-autoroll) and >+ * [glslang into ANGLE](https://autoroll.skia.org/r/glslang-angle-autoroll) >+ >+Please ensure these rollers are also healthy and unblocked. >+ >+## Task 4: ANGLE Standalone Testing >+ >+See more detailed instructions on by following [this link](README.md). >diff --git a/Source/ThirdParty/ANGLE/infra/README.md b/Source/ThirdParty/ANGLE/infra/README.md >new file mode 100644 >index 00000000000..45f562ee77d >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/README.md >@@ -0,0 +1,56 @@ >+# ANGLE Standalone Testing Infrastructure >+ >+In addition to the ANGLE try bots using Chrome, and the GPU.FYI bots, ANGLE >+has standalone testing on the Chrome infrastructure. Currently these tests are >+compile-only. This page is for maintaining the configurations that don't use >+Chromium. Also see the main instructions for [ANGLE Wrangling](ANGLEWrangling.md). >+ >+It's the ANGLE team's responsibility for maintaining this testing >+infrastructure. The bot configurations live in four different repos and six >+branches. >+ >+## Info Consoles >+ >+Continuous builders for every ANGLE revision are found on the CI console: >+ >+[https://ci.chromium.org/p/angle/g/ci/console](https://ci.chromium.org/p/angle/g/ci/console) >+ >+Try jobs from pre-commit builds are found on the builders console: >+ >+[https://ci.chromium.org/p/angle/g/try/builders](https://ci.chromium.org/p/angle/g/try/builders) >+ >+## How to add a new build configuration >+ >+ 1. [`bugs.chromium.org/p/chromium/issues/entry?template=Build+Infrastructure`](http://bugs.chromium.org/p/chromium/issues/entry?template=Build+Infrastructure): >+ >+ * Request new slaves by filing an infra issue. >+ >+ 1. [`chromium.googlesource.com/chromium/tools/build`](https://chromium.googlesource.com/chromium/tools/build): >+ >+ * Update **`scripts/slave/recipes/angle.py`** with new the config. >+ * The recipe code requires 100% code coverage through mock bots, so add mock bot config to GenTests. >+ * Maybe run `./scripts/slave/recipes.py test train` to update checked-in golden files. This might no longer be necessary. >+ >+ 1. [`chrome-internal.googlesource.com/infradata/config`](http://chrome-internal.googlesource.com/infradata/config): >+ >+ * Update **`configs/chromium-swarm/bots.cfg`** to map from the slaves requested in step 1 to the builder configured in step 2. >+ >+ 1. [`chromium.googlesource.com/angle/angle`](http://chromium.googlesource.com/angle/angle): >+ >+ * Update **`infra/config/global/cr-buildbucket.cfg`** to add the new builder (to ci and try), and set the new config option. >+ * Update **`infra/config/global/luci-milo.cfg`** to make the builders show up on the ci and try waterfalls. >+ * Update **`infra/config/global/luci-scheduler.cfg`** to make the builders trigger on new commits or try jobs respectively. >+ * Update **`infra/config/cq.cfg`** to add the builder to the default CQ jobs (if desired). >+ >+## Other Configuration >+ >+There are other places where configuration for ANGLE infra lives. These are files that we shouldn't need to modify very often: >+ >+ 1. [`chrome-internal.googlesource.com/infradata/config`](http://chrome-internal.googlesource.com/infradata/config): >+ >+ * **`configs/luci-token-server/service_accounts.cfg`** (service account names) >+ * **`configs/chromium-swarm/pools.cfg`** (swarming pools) >+ >+ 1. [`chromium.googlesource.com/chromium/tools/depot_tools`](http://chromium.googlesource.com/chromium/tools/depot_tools): >+ >+ * **`recipes/recipe_modules/gclient/config.py`** (gclient config) >diff --git a/Source/ThirdParty/ANGLE/infra/config/OWNERS b/Source/ThirdParty/ANGLE/infra/config/OWNERS >new file mode 100644 >index 00000000000..9a1736e904e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/config/OWNERS >@@ -0,0 +1,2 @@ >+geofflang@chromium.org >+jmadill@chromium.org >diff --git a/Source/ThirdParty/ANGLE/infra/config/README.md b/Source/ThirdParty/ANGLE/infra/config/README.md >new file mode 100644 >index 00000000000..8aae5da6ada >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/config/README.md >@@ -0,0 +1,27 @@ >+## Configurations files for chrome-infra services. >+ >+There are two kinds of configs: **global** and **ref-specific**. >+ >+ >+## Global configs. >+ >+Apply to the whole repo regardless of the ref (branch). >+ >+Located in [global](global) directory. >+ >+Currently active version can be checked at >+https://luci-config.appspot.com/#/projects/angle . >+ >+ >+## Ref-specific configs. >+ >+Apply only to a ref(branch) they are located in. >+ >+Located in [branch](branch) directory. >+ >+Currently active version can be checked at >+ >+ https://luci-config.appspot.com/#/projects/angle/<ref> >+ # For example, for master branch: >+ # https://luci-config.appspot.com/#/projects/angle/refs/heads/master >+ >diff --git a/Source/ThirdParty/ANGLE/infra/config/branch/OWNERS b/Source/ThirdParty/ANGLE/infra/config/branch/OWNERS >new file mode 100644 >index 00000000000..9a1736e904e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/config/branch/OWNERS >@@ -0,0 +1,2 @@ >+geofflang@chromium.org >+jmadill@chromium.org >diff --git a/Source/ThirdParty/ANGLE/infra/config/branch/README.md b/Source/ThirdParty/ANGLE/infra/config/branch/README.md >new file mode 100644 >index 00000000000..a46a2e7f34e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/config/branch/README.md >@@ -0,0 +1 @@ >+This directory contains configuration files for chrome infrastructure services. >diff --git a/Source/ThirdParty/ANGLE/infra/config/global/OWNERS b/Source/ThirdParty/ANGLE/infra/config/global/OWNERS >new file mode 100644 >index 00000000000..9a1736e904e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/config/global/OWNERS >@@ -0,0 +1,2 @@ >+geofflang@chromium.org >+jmadill@chromium.org >diff --git a/Source/ThirdParty/ANGLE/infra/config/global/README.md b/Source/ThirdParty/ANGLE/infra/config/global/README.md >new file mode 100644 >index 00000000000..cbccc969bc6 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/config/global/README.md >@@ -0,0 +1,14 @@ >+## Global configs. >+ >+**IMPORTANT:** If you see this in a branch which is not `master`, >+**this directory has no effect and should be ignored.** >+ >+This branch contains ANGLE project-wide configurations >+for chrome-infra services. >+For example, [cr-buildbucket.cfg](cr-buildbucket.cfg) defines builders. >+ >+**Remember** Change these configs on `master` branch only! >+ >+Currently active version can be checked at >+https://luci-config.appspot.com/#/projects/angle . >+ >diff --git a/Source/ThirdParty/ANGLE/infra/config/global/commit-queue.cfg b/Source/ThirdParty/ANGLE/infra/config/global/commit-queue.cfg >new file mode 100644 >index 00000000000..5bef04bba2d >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/config/global/commit-queue.cfg >@@ -0,0 +1,113 @@ >+# See http://luci-config.appspot.com/schemas/projects:commit-queue.cfg for the >+# documentation of this file format. >+ >+cq_status_host: "chromium-cq-status.appspot.com" >+submit_options { >+ max_burst: 4 >+ burst_delay { >+ seconds: 480 >+ } >+} >+config_groups { >+ gerrit { >+ url: "https://chromium-review.googlesource.com" >+ projects { >+ name: "angle/angle" >+ ref_regexp: "refs/heads/.+" >+ } >+ } >+ verifiers { >+ gerrit_cq_ability { >+ committer_list: "project-angle-committers" >+ dry_run_access_list: "project-angle-tryjob-access" >+ } >+ tryjob { >+ builders { >+ name: "angle/try/linux-clang-dbg" >+ } >+ builders { >+ name: "angle/try/linux-clang-rel" >+ } >+ builders { >+ name: "angle/try/mac-dbg" >+ } >+ builders { >+ name: "angle/try/mac-rel" >+ } >+ builders { >+ name: "angle/try/presubmit" >+ disable_reuse: true >+ } >+ builders { >+ name: "angle/try/win-clang-x64-dbg" >+ } >+ builders { >+ name: "angle/try/win-clang-x64-rel" >+ } >+ builders { >+ name: "angle/try/win-clang-x86-dbg" >+ } >+ builders { >+ name: "angle/try/win-clang-x86-rel" >+ } >+ builders { >+ name: "angle/try/win-msvc-x64-dbg" >+ } >+ builders { >+ name: "angle/try/win-msvc-x64-rel" >+ } >+ builders { >+ name: "angle/try/win-msvc-x86-dbg" >+ } >+ builders { >+ name: "angle/try/win-msvc-x86-rel" >+ } >+ builders { >+ name: "chromium/try/android_angle_deqp_rel_ng" >+ } >+ builders { >+ name: "chromium/try/android_angle_rel_ng" >+ } >+ builders { >+ name: "chromium/try/android_angle_vk32_deqp_rel_ng" >+ } >+ builders { >+ name: "chromium/try/android_angle_vk32_rel_ng" >+ } >+ builders { >+ name: "chromium/try/android_angle_vk64_deqp_rel_ng" >+ } >+ builders { >+ name: "chromium/try/android_angle_vk64_rel_ng" >+ } >+ builders { >+ name: "chromium/try/fuchsia_x64" >+ } >+ builders { >+ name: "chromium/try/linux_angle_deqp_rel_ng" >+ } >+ builders { >+ name: "chromium/try/linux_angle_ozone_rel_ng" >+ } >+ builders { >+ name: "chromium/try/linux-angle-rel" >+ } >+ builders { >+ name: "chromium/try/mac-angle-rel" >+ } >+ builders { >+ name: "chromium/try/win-angle-rel" >+ } >+ builders { >+ name: "chromium/try/win_angle_deqp_rel_ng" >+ } >+ retry_config { >+ single_quota: 1 >+ global_quota: 2 >+ failure_weight: 1 >+ transient_failure_weight: 1 >+ timeout_weight: 2 >+ } >+ } >+ } >+} >diff --git a/Source/ThirdParty/ANGLE/infra/config/global/cr-buildbucket.cfg b/Source/ThirdParty/ANGLE/infra/config/global/cr-buildbucket.cfg >new file mode 100644 >index 00000000000..4378cf11a28 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/config/global/cr-buildbucket.cfg >@@ -0,0 +1,381 @@ >+# Defines buckets on cr-buildbucket.appspot.com, used to schedule builds >+# on buildbot. In particular, CQ uses some of these buckets to schedule tryjobs. >+# >+# See http://luci-config.appspot.com/schemas/projects:cr-buildbucket.cfg for >+# schema of this file and documentation. >+# >+# Please keep this list sorted by bucket name. >+ >+acl_sets { >+ name: "ci" >+ acls { >+ role: READER >+ group: "all" >+ } >+ acls { >+ role: SCHEDULER >+ identity: "luci-scheduler@appspot.gserviceaccount.com" >+ } >+ acls { >+ role: SCHEDULER >+ identity: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com" >+ } >+} >+ >+acl_sets { >+ name: "try" >+ acls { >+ role: READER >+ group: "all" >+ } >+ acls { >+ role: SCHEDULER >+ group: "project-angle-tryjob-access" >+ } >+ acls { >+ role: SCHEDULER >+ group: "service-account-cq" >+ } >+} >+ >+builder_mixins { >+ name: "linux" >+ dimensions: "os:Ubuntu-14.04" >+} >+ >+builder_mixins { >+ name: "win" >+ dimensions: "os:Windows" >+} >+ >+builder_mixins { >+ name: "mac" >+ dimensions: "os:Mac" >+} >+ >+builder_mixins { >+ name: "clang" >+ recipe { >+ properties_j: "clang:true" >+ } >+} >+ >+builder_mixins { >+ name: "no_clang" >+ recipe { >+ properties_j: "clang:false" >+ } >+} >+ >+builder_mixins { >+ name: "rel" >+ recipe { >+ properties_j: "debug:false" >+ } >+} >+ >+builder_mixins { >+ name: "dbg" >+ recipe { >+ properties_j: "debug:true" >+ } >+} >+ >+builder_mixins { >+ name: "x86" >+ recipe { >+ properties: "target_cpu:x86" >+ } >+} >+ >+builder_mixins { >+ name: "x64" >+ recipe { >+ properties: "target_cpu:x64" >+ } >+} >+ >+buckets { >+ name: "luci.angle.ci" >+ acl_sets: "ci" >+ >+ swarming { >+ hostname: "chromium-swarm.appspot.com" >+ >+ builder_defaults { >+ recipe: { >+ cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" >+ cipd_version: "refs/heads/master" >+ name: "angle" >+ } >+ build_numbers: YES >+ service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com" >+ >+ caches { >+ path: "win_toolchain" >+ name: "win_toolchain" >+ } >+ } >+ >+ builders { >+ name: "linux-clang-dbg" >+ mixins: "linux" >+ mixins: "clang" >+ mixins: "dbg" >+ } >+ >+ builders { >+ name: "linux-clang-rel" >+ mixins: "linux" >+ mixins: "clang" >+ mixins: "rel" >+ } >+ >+ builders { >+ name: "linux-gcc-dbg" >+ mixins: "linux" >+ mixins: "no_clang" >+ mixins: "dbg" >+ } >+ >+ builders { >+ name: "linux-gcc-rel" >+ mixins: "linux" >+ mixins: "no_clang" >+ mixins: "rel" >+ } >+ >+ builders { >+ name: "mac-dbg" >+ mixins: "mac" >+ mixins: "dbg" >+ } >+ >+ builders { >+ name: "mac-rel" >+ mixins: "mac" >+ mixins: "rel" >+ } >+ >+ builders { >+ name: "win-msvc-x86-dbg" >+ mixins: "win" >+ mixins: "no_clang" >+ mixins: "x86" >+ mixins: "dbg" >+ } >+ >+ builders { >+ name: "win-msvc-x86-rel" >+ mixins: "win" >+ mixins: "no_clang" >+ mixins: "x86" >+ mixins: "rel" >+ } >+ >+ builders { >+ name: "win-msvc-x64-dbg" >+ mixins: "win" >+ mixins: "no_clang" >+ mixins: "x64" >+ mixins: "dbg" >+ } >+ >+ builders { >+ name: "win-msvc-x64-rel" >+ mixins: "win" >+ mixins: "no_clang" >+ mixins: "x64" >+ mixins: "rel" >+ } >+ >+ builders { >+ name: "win-clang-x86-dbg" >+ mixins: "win" >+ mixins: "clang" >+ mixins: "x86" >+ mixins: "dbg" >+ } >+ >+ builders { >+ name: "win-clang-x86-rel" >+ mixins: "win" >+ mixins: "clang" >+ mixins: "x86" >+ mixins: "rel" >+ } >+ >+ builders { >+ name: "win-clang-x64-dbg" >+ mixins: "win" >+ mixins: "clang" >+ mixins: "x64" >+ mixins: "dbg" >+ } >+ >+ builders { >+ name: "win-clang-x64-rel" >+ mixins: "win" >+ mixins: "clang" >+ mixins: "x64" >+ mixins: "rel" >+ } >+ } >+} >+ >+# Note that many angle trybots are defined in the luci.chromium.try bucket >+# over in chromium. >+buckets { >+ name: "luci.angle.try" >+ acl_sets: "try" >+ >+ swarming { >+ hostname: "chromium-swarm.appspot.com" >+ >+ builder_defaults { >+ recipe: { >+ cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" >+ cipd_version: "refs/heads/master" >+ name: "angle" >+ properties_j: "$depot_tools/bot_update:{\"apply_patch_on_gclient\":true}" >+ } >+ build_numbers: YES >+ service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com" >+ >+ caches { >+ path: "win_toolchain" >+ name: "win_toolchain" >+ } >+ } >+ >+ builders { >+ name: "presubmit" >+ dimensions: "os:Ubuntu-14.04" >+ recipe { >+ name: "run_presubmit" >+ properties: "repo_name:angle" >+ properties_j: "runhooks:true" >+ } >+ } >+ >+ builders { >+ name: "linux-clang-dbg" >+ mixins: "linux" >+ mixins: "clang" >+ mixins: "dbg" >+ } >+ >+ builders { >+ name: "linux-clang-rel" >+ mixins: "linux" >+ mixins: "clang" >+ mixins: "rel" >+ } >+ >+ builders { >+ name: "linux-gcc-dbg" >+ mixins: "linux" >+ mixins: "no_clang" >+ mixins: "dbg" >+ } >+ >+ builders { >+ name: "linux-gcc-rel" >+ mixins: "linux" >+ mixins: "no_clang" >+ mixins: "rel" >+ } >+ >+ builders { >+ name: "mac-dbg" >+ mixins: "mac" >+ mixins: "dbg" >+ } >+ >+ builders { >+ name: "mac-rel" >+ mixins: "mac" >+ mixins: "rel" >+ } >+ >+ builders { >+ name: "win-msvc-x86-dbg" >+ mixins: "win" >+ mixins: "no_clang" >+ mixins: "x86" >+ mixins: "dbg" >+ } >+ >+ builders { >+ name: "win-msvc-x86-rel" >+ mixins: "win" >+ mixins: "no_clang" >+ mixins: "x86" >+ mixins: "rel" >+ } >+ >+ builders { >+ name: "win-msvc-x64-dbg" >+ mixins: "win" >+ mixins: "no_clang" >+ mixins: "x64" >+ mixins: "dbg" >+ } >+ >+ builders { >+ name: "win-msvc-x64-rel" >+ mixins: "win" >+ mixins: "no_clang" >+ mixins: "x64" >+ mixins: "rel" >+ } >+ >+ builders { >+ name: "win-clang-x86-dbg" >+ mixins: "win" >+ mixins: "clang" >+ mixins: "x86" >+ mixins: "dbg" >+ } >+ >+ builders { >+ name: "win-clang-x86-rel" >+ mixins: "win" >+ mixins: "clang" >+ mixins: "x86" >+ mixins: "rel" >+ } >+ >+ builders { >+ name: "win-clang-x64-dbg" >+ mixins: "win" >+ mixins: "clang" >+ mixins: "x64" >+ mixins: "dbg" >+ } >+ >+ builders { >+ name: "win-clang-x64-rel" >+ mixins: "win" >+ mixins: "clang" >+ mixins: "x64" >+ mixins: "rel" >+ } >+ } >+} >+ >+buckets { >+ name: "master.tryserver.chromium.angle" >+ acls { >+ role: READER >+ group: "all" >+ } >+ acls { >+ role: SCHEDULER >+ group: "project-angle-tryjob-access" >+ } >+ acls { >+ role: WRITER >+ group: "service-account-chromium-tryserver" >+ } >+} >diff --git a/Source/ThirdParty/ANGLE/infra/config/global/luci-logdog.cfg b/Source/ThirdParty/ANGLE/infra/config/global/luci-logdog.cfg >new file mode 100644 >index 00000000000..ee321e6c46c >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/config/global/luci-logdog.cfg >@@ -0,0 +1,10 @@ >+# See http://luci-config.appspot.com/schemas/services/luci-logdog:logdog.cfg >+# for schema of this file and documentation. >+ >+reader_auth_groups: "all" >+writer_auth_groups: "luci-logdog-angle-writers" >+ >+# The base Google Storage archival path for this project. >+# >+# Archived LogDog logs will be written to this bucket/path. >+archive_gs_bucket: "chromium-luci-logdog" >diff --git a/Source/ThirdParty/ANGLE/infra/config/global/luci-milo.cfg b/Source/ThirdParty/ANGLE/infra/config/global/luci-milo.cfg >new file mode 100644 >index 00000000000..32be53a795d >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/config/global/luci-milo.cfg >@@ -0,0 +1,165 @@ >+# See http://luci-config.appspot.com/schemas/projects:luci-milo.cfg for >+# schema of this file and documentation. >+ >+logo_url: "https://storage.googleapis.com/chrome-infra/OpenGL%20ES_RGB_June16.svg" >+ >+consoles { >+ id: "ci" >+ name: "ANGLE CI builders" >+ repo_url: "https://chromium.googlesource.com/angle/angle" >+ refs: "refs/heads/master" >+ manifest_name: "REVISION" >+ >+ builders { >+ name: "buildbucket/luci.angle.ci/linux-clang-dbg" >+ category: "linux|clang" >+ short_name: "dbg" >+ } >+ builders { >+ name: "buildbucket/luci.angle.ci/linux-clang-rel" >+ category: "linux|clang" >+ short_name: "rel" >+ } >+ builders { >+ name: "buildbucket/luci.angle.ci/linux-gcc-dbg" >+ category: "linux|gcc" >+ short_name: "dbg" >+ } >+ builders { >+ name: "buildbucket/luci.angle.ci/linux-gcc-rel" >+ category: "linux|gcc" >+ short_name: "rel" >+ } >+ builders { >+ name: "buildbucket/luci.angle.ci/mac-dbg" >+ category: "mac" >+ short_name: "dbg" >+ } >+ builders { >+ name: "buildbucket/luci.angle.ci/mac-rel" >+ category: "mac" >+ short_name: "rel" >+ } >+ builders { >+ name: "buildbucket/luci.angle.ci/win-clang-x86-dbg" >+ category: "win|clang|x86" >+ short_name: "dbg" >+ } >+ builders { >+ name: "buildbucket/luci.angle.ci/win-clang-x86-rel" >+ category: "win|clang|x86" >+ short_name: "rel" >+ } >+ builders { >+ name: "buildbucket/luci.angle.ci/win-clang-x64-dbg" >+ category: "win|clang|x64" >+ short_name: "dbg" >+ } >+ builders { >+ name: "buildbucket/luci.angle.ci/win-clang-x64-rel" >+ category: "win|clang|x64" >+ short_name: "rel" >+ } >+ builders { >+ name: "buildbucket/luci.angle.ci/win-msvc-x86-dbg" >+ category: "win|msvc|x86" >+ short_name: "dbg" >+ } >+ builders { >+ name: "buildbucket/luci.angle.ci/win-msvc-x86-rel" >+ category: "win|msvc|x86" >+ short_name: "rel" >+ } >+ builders { >+ name: "buildbucket/luci.angle.ci/win-msvc-x64-dbg" >+ category: "win|msvc|x64" >+ short_name: "dbg" >+ } >+ builders { >+ name: "buildbucket/luci.angle.ci/win-msvc-x64-rel" >+ category: "win|msvc|x64" >+ short_name: "rel" >+ } >+} >+ >+consoles { >+ id: "try" >+ name: "ANGLE try builders" >+ repo_url: "https://chromium.googlesource.com/angle/angle" >+ refs: "refs/heads/master" >+ manifest_name: "PATCHED" >+ >+ builders { >+ name: "buildbucket/luci.angle.try/presubmit" >+ } >+ builders { >+ name: "buildbucket/luci.angle.try/linux-clang-dbg" >+ category: "linux|clang" >+ short_name: "dbg" >+ } >+ builders { >+ name: "buildbucket/luci.angle.try/linux-clang-rel" >+ category: "linux|clang" >+ short_name: "rel" >+ } >+ builders { >+ name: "buildbucket/luci.angle.try/linux-gcc-dbg" >+ category: "linux|gcc" >+ short_name: "dbg" >+ } >+ builders { >+ name: "buildbucket/luci.angle.try/linux-gcc-rel" >+ category: "linux|gcc" >+ short_name: "rel" >+ } >+ builders { >+ name: "buildbucket/luci.angle.try/mac-dbg" >+ category: "mac" >+ short_name: "dbg" >+ } >+ builders { >+ name: "buildbucket/luci.angle.try/mac-rel" >+ category: "mac" >+ short_name: "rel" >+ } >+ builders { >+ name: "buildbucket/luci.angle.try/win-clang-x86-dbg" >+ category: "mac|clang|x86" >+ short_name: "dbg" >+ } >+ builders { >+ name: "buildbucket/luci.angle.try/win-clang-x86-rel" >+ category: "win|clang|x86" >+ short_name: "rel" >+ } >+ builders { >+ name: "buildbucket/luci.angle.try/win-clang-x64-dbg" >+ category: "win|clang|x64" >+ short_name: "dbg" >+ } >+ builders { >+ name: "buildbucket/luci.angle.try/win-clang-x64-rel" >+ category: "win|clang|x64" >+ short_name: "rel" >+ } >+ builders { >+ name: "buildbucket/luci.angle.try/win-msvc-x86-dbg" >+ category: "win|msvc|x86" >+ short_name: "dbg" >+ } >+ builders { >+ name: "buildbucket/luci.angle.try/win-msvc-x86-rel" >+ category: "win|msvc|x86" >+ short_name: "rel" >+ } >+ builders { >+ name: "buildbucket/luci.angle.try/win-msvc-x64-dbg" >+ category: "win|msvc|x64" >+ short_name: "dbg" >+ } >+ builders { >+ name: "buildbucket/luci.angle.try/win-msvc-x64-rel" >+ category: "win|msvc|x64" >+ short_name: "rel" >+ } >+} >diff --git a/Source/ThirdParty/ANGLE/infra/config/global/luci-scheduler.cfg b/Source/ThirdParty/ANGLE/infra/config/global/luci-scheduler.cfg >new file mode 100644 >index 00000000000..de913530c81 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/config/global/luci-scheduler.cfg >@@ -0,0 +1,182 @@ >+# Defines jobs on luci-scheduler.appspot.com. >+# >+# For schema of this file and documentation see ProjectConfig message in >+# >+# https://chromium.googlesource.com/infra/luci/luci-go/+/master/scheduler/appengine/messages/cron.proto >+ >+acl_sets { >+ name: "default" >+ acls { >+ role: READER >+ granted_to: "group:all" >+ } >+ acls { >+ role: OWNER >+ granted_to: "group:project-angle-admins" >+ } >+} >+ >+trigger { >+ id: "master-gitiles-trigger" >+ acl_sets: "default" >+ >+ gitiles { >+ repo: "https://chromium.googlesource.com/angle/angle.git" >+ refs: "refs/heads/master" >+ } >+ >+ triggers: "linux-clang-dbg" >+ triggers: "linux-clang-rel" >+ triggers: "linux-gcc-dbg" >+ triggers: "linux-gcc-rel" >+ triggers: "mac-dbg" >+ triggers: "mac-rel" >+ triggers: "win-clang-x86-dbg" >+ triggers: "win-clang-x86-rel" >+ triggers: "win-clang-x64-dbg" >+ triggers: "win-clang-x64-rel" >+ triggers: "win-msvc-x86-dbg" >+ triggers: "win-msvc-x86-rel" >+ triggers: "win-msvc-x64-dbg" >+ triggers: "win-msvc-x64-rel" >+} >+ >+job { >+ id: "linux-clang-dbg" >+ acl_sets: "default" >+ buildbucket: { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "linux-clang-dbg" >+ } >+} >+ >+job { >+ id: "linux-clang-rel" >+ acl_sets: "default" >+ buildbucket: { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "linux-clang-rel" >+ } >+} >+ >+job { >+ id: "linux-gcc-dbg" >+ acl_sets: "default" >+ buildbucket: { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "linux-gcc-dbg" >+ } >+} >+ >+job { >+ id: "linux-gcc-rel" >+ acl_sets: "default" >+ buildbucket: { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "linux-gcc-rel" >+ } >+} >+ >+job { >+ id: "mac-dbg" >+ acl_sets: "default" >+ buildbucket: { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "mac-dbg" >+ } >+} >+ >+job { >+ id: "mac-rel" >+ acl_sets: "default" >+ buildbucket: { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "mac-rel" >+ } >+} >+ >+job { >+ id: "win-clang-x86-dbg" >+ acl_sets: "default" >+ buildbucket: { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "win-clang-x86-dbg" >+ } >+} >+ >+job { >+ id: "win-clang-x86-rel" >+ acl_sets: "default" >+ buildbucket: { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "win-clang-x86-rel" >+ } >+} >+ >+job { >+ id: "win-clang-x64-dbg" >+ acl_sets: "default" >+ buildbucket: { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "win-clang-x64-dbg" >+ } >+} >+ >+job { >+ id: "win-clang-x64-rel" >+ acl_sets: "default" >+ buildbucket: { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "win-clang-x64-rel" >+ } >+} >+ >+job { >+ id: "win-msvc-x86-dbg" >+ acl_sets: "default" >+ buildbucket: { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "win-msvc-x86-dbg" >+ } >+} >+ >+job { >+ id: "win-msvc-x86-rel" >+ acl_sets: "default" >+ buildbucket: { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "win-msvc-x86-rel" >+ } >+} >+ >+job { >+ id: "win-msvc-x64-dbg" >+ acl_sets: "default" >+ buildbucket: { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "win-msvc-x64-dbg" >+ } >+} >+ >+job { >+ id: "win-msvc-x64-rel" >+ acl_sets: "default" >+ buildbucket: { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "win-msvc-x64-rel" >+ } >+} >diff --git a/Source/ThirdParty/ANGLE/infra/config/global/project.cfg b/Source/ThirdParty/ANGLE/infra/config/global/project.cfg >new file mode 100644 >index 00000000000..e266c98bf59 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/config/global/project.cfg >@@ -0,0 +1,4 @@ >+# For the schema of this file and documentation, see ProjectCfg message in >+# https://luci-config.appspot.com/schemas/projects:project.cfg >+name: "angle" >+access: "group:all" # public >diff --git a/Source/ThirdParty/ANGLE/infra/config/global/refs.cfg b/Source/ThirdParty/ANGLE/infra/config/global/refs.cfg >new file mode 100644 >index 00000000000..b287e225083 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/infra/config/global/refs.cfg >@@ -0,0 +1,6 @@ >+# Refs configuration file. The documentation of the format can be found >+# at https://luci-config.appspot.com/schemas/projects:refs.cfg. >+refs { >+ name: "refs/heads/master" >+ config_path: "infra/config/branch" >+} >diff --git a/Source/ThirdParty/ANGLE/samples/BUILD.gn b/Source/ThirdParty/ANGLE/samples/BUILD.gn >new file mode 100644 >index 00000000000..13022bfd39c >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/BUILD.gn >@@ -0,0 +1,239 @@ >+# 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. >+ >+import("../gni/angle.gni") >+ >+angle_executable("shader_translator") { >+ sources = [ >+ "shader_translator/shader_translator.cpp", >+ ] >+ include_dirs = [ "../include" ] >+ deps = [ >+ "../:translator", >+ ] >+} >+ >+config("sample_util_config") { >+ include_dirs = [ "sample_util" ] >+} >+ >+angle_static_library("sample_util") { >+ sources = [ >+ "sample_util/SampleApplication.cpp", >+ "sample_util/SampleApplication.h", >+ "sample_util/texture_utils.cpp", >+ "sample_util/texture_utils.h", >+ "sample_util/tga_utils.cpp", >+ "sample_util/tga_utils.h", >+ ] >+ data_deps = [ >+ "../:libEGL${angle_libs_suffix}", >+ "../:libGLESv1_CM${angle_libs_suffix}", >+ "../:libGLESv2${angle_libs_suffix}", >+ ] >+ public_deps = [ >+ "../:angle_common", >+ "../:angle_util", >+ "../:angle_util_loader_headers", >+ ] >+ configs += [ "../:library_name_config" ] >+ public_configs = [ >+ ":sample_util_config", >+ "../:no_gl_prototypes", >+ ] >+} >+ >+template("angle_sample") { >+ if (defined(invoker.data)) { >+ copy(target_name + "_data") { >+ sources = invoker.data >+ outputs = [ >+ "$root_out_dir/{{source_file_part}}", >+ ] >+ } >+ } >+ >+ angle_executable(target_name) { >+ deps = [ >+ ":sample_util", >+ ] >+ if (defined(invoker.data)) { >+ deps += [ ":${target_name}_data" ] >+ } >+ sources = invoker.sources >+ } >+} >+ >+angle_sample("hello_triangle") { >+ sources = [ >+ "hello_triangle/HelloTriangle.cpp", >+ ] >+} >+ >+angle_sample("mip_map_2d") { >+ sources = [ >+ "mip_map_2d/MipMap2D.cpp", >+ ] >+} >+ >+angle_sample("multi_texture") { >+ sources = [ >+ "multi_texture/MultiTexture.cpp", >+ ] >+ data = [ >+ "multi_texture/basemap.tga", >+ "multi_texture/lightmap.tga", >+ ] >+} >+ >+angle_sample("multi_window") { >+ sources = [ >+ "multi_window/MultiWindow.cpp", >+ ] >+} >+ >+angle_sample("multiple_draw_buffers") { >+ sources = [ >+ "multiple_draw_buffers/MultipleDrawBuffers.cpp", >+ ] >+ data = [ >+ "multiple_draw_buffers/multiple_draw_buffers_copy_fs.glsl", >+ "multiple_draw_buffers/multiple_draw_buffers_fs.glsl", >+ "multiple_draw_buffers/multiple_draw_buffers_vs.glsl", >+ ] >+} >+ >+angle_sample("multiview") { >+ sources = [ >+ "multiview/Multiview.cpp", >+ ] >+} >+ >+angle_sample("particle_system") { >+ sources = [ >+ "particle_system/ParticleSystem.cpp", >+ ] >+ data = [ >+ "particle_system/smoke.tga", >+ ] >+} >+ >+angle_sample("post_sub_buffer") { >+ sources = [ >+ "post_sub_buffer/PostSubBuffer.cpp", >+ ] >+} >+ >+angle_sample("simple_instancing") { >+ sources = [ >+ "simple_instancing/SimpleInstancing.cpp", >+ ] >+} >+ >+angle_sample("simple_texture_2d") { >+ sources = [ >+ "simple_texture_2d/SimpleTexture2D.cpp", >+ ] >+} >+ >+angle_sample("simple_texture_cubemap") { >+ sources = [ >+ "simple_texture_cubemap/SimpleTextureCubemap.cpp", >+ ] >+} >+ >+angle_sample("simple_vertex_shader") { >+ sources = [ >+ "simple_vertex_shader/SimpleVertexShader.cpp", >+ ] >+} >+ >+angle_sample("stencil_operations") { >+ sources = [ >+ "stencil_operations/StencilOperations.cpp", >+ ] >+} >+ >+angle_sample("tex_redef_microbench") { >+ sources = [ >+ "tex_redef_microbench/TexRedefMicroBench.cpp", >+ ] >+} >+ >+angle_sample("texture_wrap") { >+ sources = [ >+ "texture_wrap/TextureWrap.cpp", >+ ] >+} >+ >+angle_sample("tri_fan_microbench") { >+ sources = [ >+ "tri_fan_microbench/TriFanMicroBench.cpp", >+ ] >+} >+ >+angle_sample("window_test") { >+ sources = [ >+ "WindowTest/WindowTest.cpp", >+ ] >+} >+ >+angle_sample("gles1_hello_triangle") { >+ sources = [ >+ "gles1/HelloTriangle.cpp", >+ ] >+} >+ >+angle_sample("gles1_simple_texture_2d") { >+ sources = [ >+ "gles1/SimpleTexture2D.cpp", >+ ] >+} >+ >+angle_sample("gles1_simple_lighting") { >+ sources = [ >+ "gles1/SimpleLighting.cpp", >+ ] >+} >+ >+angle_sample("gles1_flat_shading") { >+ sources = [ >+ "gles1/FlatShading.cpp", >+ ] >+} >+ >+angle_sample("gles1_draw_texture") { >+ sources = [ >+ "gles1/DrawTexture.cpp", >+ ] >+} >+ >+group("all") { >+ testonly = true >+ deps = [ >+ ":gles1_draw_texture", >+ ":gles1_flat_shading", >+ ":gles1_hello_triangle", >+ ":gles1_simple_lighting", >+ ":gles1_simple_texture_2d", >+ ":hello_triangle", >+ ":mip_map_2d", >+ ":multi_texture", >+ ":multi_window", >+ ":multiple_draw_buffers", >+ ":multiview", >+ ":particle_system", >+ ":post_sub_buffer", >+ ":sample_util", >+ ":simple_instancing", >+ ":simple_texture_2d", >+ ":simple_texture_cubemap", >+ ":simple_vertex_shader", >+ ":stencil_operations", >+ ":tex_redef_microbench", >+ ":texture_wrap", >+ ":tri_fan_microbench", >+ ":window_test", >+ ] >+} >diff --git a/Source/ThirdParty/ANGLE/samples/WindowTest/WindowTest.cpp b/Source/ThirdParty/ANGLE/samples/WindowTest/WindowTest.cpp >new file mode 100644 >index 00000000000..0cf426cc8b1 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/WindowTest/WindowTest.cpp >@@ -0,0 +1,139 @@ >+// >+// Copyright 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. >+// >+ >+// WindowTest.cpp: Sample used to test various function of OSWindow >+ >+#include <algorithm> >+#include <iostream> >+ >+#include "util/OSWindow.h" >+#include "util/system_utils.h" >+ >+int main(int argc, char *argv[]) >+{ >+ OSWindow *window = OSWindow::New(); >+ int width = 400; >+ int height = 400; >+ int x = 0; >+ int y = 0; >+ >+ if (!window->initialize("Window Test", width, height)) >+ { >+ return -1; >+ } >+ window->setVisible(true); >+ window->setPosition(x, y); >+ >+ bool running = true; >+ while (running) >+ { >+ Event event; >+ while (window->popEvent(&event)) >+ { >+ if (event.Type == Event::EVENT_CLOSED) >+ { >+ running = false; >+ break; >+ } >+ >+ if (event.Type == Event::EVENT_KEY_PRESSED) >+ { >+ int newWidth = width; >+ int newHeight = height; >+ int newX = x; >+ int newY = y; >+ switch (event.Key.Code) >+ { >+ case KEY_ESCAPE: >+ running = false; >+ break; >+ >+ case KEY_W: >+ newWidth = std::max(0, width + (event.Key.Shift ? -20 : 20)); >+ break; >+ case KEY_H: >+ newHeight = std::max(0, height + (event.Key.Shift ? -20 : 20)); >+ break; >+ >+ case KEY_LEFT: >+ newX = x - 20; >+ break; >+ case KEY_RIGHT: >+ newX = x + 20; >+ break; >+ case KEY_UP: >+ newY = y - 20; >+ break; >+ case KEY_DOWN: >+ newY = y + 20; >+ break; >+ >+ case KEY_C: >+ window->setMousePosition(width / 2, height / 2); >+ break; >+ case KEY_T: >+ window->signalTestEvent(); >+ window->messageLoop(); >+ if (window->didTestEventFire()) >+ { >+ std::cout << "Test event did fire" << std::endl; >+ } >+ else >+ { >+ std::cout << "Test event did not fire" << std::endl; >+ } >+ break; >+ case KEY_S: >+ window->setVisible(false); >+ window->messageLoop(); >+ angle::Sleep(1000); >+ window->setVisible(true); >+ window->messageLoop(); >+ break; >+ >+ default: >+ break; >+ } >+ >+ if (newWidth != width || newHeight != height) >+ { >+ width = newWidth; >+ height = newHeight; >+ window->resize(width, height); >+ } >+ if (newX != x || newY != y) >+ { >+ x = newX; >+ y = newY; >+ window->setPosition(x, y); >+ } >+ >+ angle::Sleep(0); >+ window->messageLoop(); >+ if (window->getWidth() != width || window->getHeight() != height) >+ { >+ std::cout << "Discrepancy between set dimensions and retrieved dimensions" >+ << std::endl; >+ std::cout << "Width: " << width << " vs. " << window->getWidth() << std::endl; >+ std::cout << "Height: " << height << " vs. " << window->getHeight() >+ << std::endl; >+ } >+ if (window->getX() != x || window->getY() != y) >+ { >+ std::cout << "Discrepancy between set position and retrieved position" >+ << std::endl; >+ std::cout << "X: " << x << " vs. " << window->getX() << std::endl; >+ std::cout << "Y: " << y << " vs. " << window->getY() << std::endl; >+ } >+ } >+ } >+ >+ angle::Sleep(0); >+ window->messageLoop(); >+ } >+ >+ window->destroy(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/gles1/DrawTexture.cpp b/Source/ThirdParty/ANGLE/samples/gles1/DrawTexture.cpp >new file mode 100644 >index 00000000000..aa062b6a630 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/gles1/DrawTexture.cpp >@@ -0,0 +1,108 @@ >+// >+// 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. >+// >+ >+// Based on Simple_Texture2D.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+#include "texture_utils.h" >+#include "util/shader_utils.h" >+#include "util/system_utils.h" >+ >+#include <GLES/gl.h> >+#include <GLES/glext.h> >+ >+class GLES1DrawTextureSample : public SampleApplication >+{ >+ public: >+ GLES1DrawTextureSample(int argc, char **argv) >+ : SampleApplication("GLES1DrawTexture", argc, argv, 1, 0, 1280, 800) >+ {} >+ >+ bool initialize() override >+ { >+ // Load the texture >+ mTexture = CreateSimpleTexture2D(); >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ glActiveTexture(GL_TEXTURE0); >+ glEnable(GL_TEXTURE_2D); >+ >+ glActiveTexture(GL_TEXTURE0); >+ glEnable(GL_TEXTURE_2D); >+ glBindTexture(GL_TEXTURE_2D, mTexture); >+ >+ GLint crop[4] = {0, 0, 2, 2}; >+ glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ return true; >+ } >+ >+ void destroy() override { glDeleteTextures(1, &mTexture); } >+ >+ void draw() override >+ { >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ GLint windowWidth = getWindow()->getWidth(); >+ GLint windowHeight = getWindow()->getHeight(); >+ >+ glDrawTexiOES(mX, mY, 0, mWidth, mHeight); >+ glDrawTexiOES(windowWidth - mX, mY, 0, mWidth, mHeight); >+ glDrawTexiOES(mX, windowHeight - mY, 0, mWidth, mHeight); >+ glDrawTexiOES(windowWidth - mX, windowHeight - mY, 0, mWidth, mHeight); >+ >+ mX += mReverseX ? -1 : 1; >+ mY += mReverseY ? -1 : 1; >+ >+ if (mX + mWidth >= windowWidth) >+ mReverseX = true; >+ if (mX < 0) >+ mReverseX = false; >+ >+ if (mY + mHeight >= windowHeight) >+ mReverseY = true; >+ if (mY < 0) >+ mReverseY = false; >+ >+ ++mWidth; >+ ++mHeight; >+ if (mWidth >= windowWidth) >+ mWidth = 0; >+ if (mHeight >= windowHeight) >+ mHeight = 0; >+ >+ angle::Sleep(16); >+ } >+ >+ private: >+ // Texture handle >+ GLuint mTexture = 0; >+ >+ // Draw texture coordinates and dimensions to loop through >+ GLint mX = 0; >+ GLint mY = 0; >+ GLint mWidth = 0; >+ GLint mHeight = 0; >+ >+ bool mReverseX = false; >+ bool mReverseY = false; >+}; >+ >+int main(int argc, char **argv) >+{ >+ GLES1DrawTextureSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/gles1/FlatShading.cpp b/Source/ThirdParty/ANGLE/samples/gles1/FlatShading.cpp >new file mode 100644 >index 00000000000..56be7ddd913 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/gles1/FlatShading.cpp >@@ -0,0 +1,103 @@ >+// >+// 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. >+// >+ >+// Based on Hello_Triangle.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include <algorithm> >+ >+#include "util/gles_loader_autogen.h" >+ >+class FlatShadingSample : public SampleApplication >+{ >+ public: >+ FlatShadingSample(int argc, char **argv) >+ : SampleApplication("FlatShadingSample", argc, argv, 1, 0) >+ {} >+ >+ bool initialize() override >+ { >+ glClearColor(0.1f, 0.1f, 0.2f, 1.0f); >+ mRotDeg = 0.0f; >+ >+ return true; >+ } >+ >+ void draw() override >+ { >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); >+ >+ GLfloat vertices[] = { >+ -0.5f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, >+ 0.0f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f, -1.0f, >+ }; >+ >+ GLfloat colors[] = { >+ 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, >+ 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, >+ }; >+ >+ GLuint indices[] = { >+ 0, 1, 2, 2, 3, 0, >+ >+ 4, 1, 0, 4, 2, 1, 4, 3, 2, 4, 0, 3, >+ }; >+ >+ glEnable(GL_DEPTH_TEST); >+ >+ glEnableClientState(GL_VERTEX_ARRAY); >+ glEnableClientState(GL_COLOR_ARRAY); >+ glVertexPointer(3, GL_FLOAT, 0, vertices); >+ glColorPointer(4, GL_FLOAT, 0, colors); >+ >+ for (int i = 0; i < 6; i++) >+ { >+ for (int j = 0; j < 6; j++) >+ { >+ if ((i + j * 6) % 2 == 0) >+ { >+ glShadeModel(GL_FLAT); >+ } >+ else >+ { >+ glShadeModel(GL_SMOOTH); >+ } >+ >+ glPushMatrix(); >+ >+ glTranslatef(-0.7f + i * 0.3f, -0.7f + j * 0.3f, 0.0f); >+ >+ glRotatef(mRotDeg + (5.0f * (6.0f * i + j)), 0.0f, 1.0f, 0.0f); >+ glRotatef(20.0f + (10.0f * (6.0f * i + j)), 1.0f, 0.0f, 0.0f); >+ GLfloat scale = 0.2f; >+ glScalef(scale, scale, scale); >+ glDrawElements(GL_TRIANGLES, sizeof(indices) / sizeof(GLuint), GL_UNSIGNED_INT, >+ indices); >+ >+ glPopMatrix(); >+ } >+ } >+ >+ mRotDeg += 0.1f; >+ } >+ >+ private: >+ float mRotDeg = 0.0f; >+}; >+ >+int main(int argc, char **argv) >+{ >+ FlatShadingSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/gles1/HelloTriangle.cpp b/Source/ThirdParty/ANGLE/samples/gles1/HelloTriangle.cpp >new file mode 100644 >index 00000000000..472ac48925e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/gles1/HelloTriangle.cpp >@@ -0,0 +1,55 @@ >+// >+// 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. >+// >+ >+// Based on Hello_Triangle.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+#include "util/shader_utils.h" >+ >+class GLES1HelloTriangleSample : public SampleApplication >+{ >+ public: >+ GLES1HelloTriangleSample(int argc, char **argv) >+ : SampleApplication("GLES1HelloTriangle", argc, argv, 1, 0) >+ {} >+ >+ bool initialize() override >+ { >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ >+ return true; >+ } >+ >+ void draw() override >+ { >+ GLfloat vertices[] = { >+ 0.0f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, >+ }; >+ >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ glEnableClientState(GL_VERTEX_ARRAY); >+ glVertexPointer(3, GL_FLOAT, 0, vertices); >+ >+ glColor4f(1.0f, 0.0f, 0.0f, 1.0f); >+ >+ glDrawArrays(GL_TRIANGLES, 0, 3); >+ } >+}; >+ >+int main(int argc, char **argv) >+{ >+ GLES1HelloTriangleSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/gles1/SimpleLighting.cpp b/Source/ThirdParty/ANGLE/samples/gles1/SimpleLighting.cpp >new file mode 100644 >index 00000000000..6981b26a8e2 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/gles1/SimpleLighting.cpp >@@ -0,0 +1,115 @@ >+// >+// 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. >+// >+ >+// Based on Hello_Triangle.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include <algorithm> >+ >+#include "util/gles_loader_autogen.h" >+ >+class SimpleLightingSample : public SampleApplication >+{ >+ public: >+ SimpleLightingSample(int argc, char **argv) >+ : SampleApplication("SimpleLightingSample", argc, argv, 1, 0) >+ {} >+ >+ virtual bool initialize() >+ { >+ glClearColor(0.4f, 0.3f, 0.2f, 1.0f); >+ mRotDeg = 0.0f; >+ >+ return true; >+ } >+ >+ virtual void destroy() {} >+ >+ virtual void draw() >+ { >+ >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); >+ glColor4f(0.2f, 0.6f, 0.8f, 1.0f); >+ >+ GLfloat mat_ambient[] = {0.7f, 0.4f, 0.2f, 1.0f}; >+ GLfloat mat_specular[] = {0.5f, 0.5f, 0.5f, 1.0f}; >+ GLfloat mat_diffuse[] = {0.3f, 0.4f, 0.6f, 1.0f}; >+ GLfloat lightpos[] = {0.0f, 1.0f, 0.0f, 0.0f}; >+ >+ GLfloat normals[] = { >+ -0.4f, 0.4f, -0.4f, -0.4f, -0.4f, -0.4f, 0.2f, 0.0f, -0.4f, >+ >+ -0.4f, 0.4f, 0.4f, -0.4f, -0.4f, 0.4f, 0.2f, 0.0f, 0.4f, >+ }; >+ >+ GLfloat vertices[] = { >+ -0.5f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, 0.0f, 0.0f, >+ >+ -0.5f, 0.5f, 0.3f, -0.5f, -0.5f, 0.3f, 0.5f, 0.0f, 0.3f, >+ }; >+ >+ GLuint indices[] = { >+ 0, 1, 2, 3, 4, 5, >+ >+ 0, 4, 3, 4, 0, 1, >+ >+ 4, 1, 2, 2, 5, 4, >+ >+ 5, 2, 3, 3, 2, 0, >+ }; >+ >+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient); >+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); >+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse); >+ >+ glEnable(GL_DEPTH_TEST); >+ glEnable(GL_LIGHTING); >+ glEnable(GL_LIGHT0); >+ glLightfv(GL_LIGHT0, GL_POSITION, lightpos); >+ >+ glEnableClientState(GL_VERTEX_ARRAY); >+ glEnableClientState(GL_NORMAL_ARRAY); >+ glVertexPointer(3, GL_FLOAT, 0, vertices); >+ glNormalPointer(GL_FLOAT, 0, normals); >+ >+ for (int i = 0; i < 3; i++) >+ { >+ for (int j = 0; j < 3; j++) >+ { >+ glPushMatrix(); >+ >+ glTranslatef(-0.6f + i * 0.6f, -0.6f + j * 0.6f, 0.0f); >+ >+ glRotatef(mRotDeg + (10.0f * (3.0f * i + j)), 0.0f, 1.0f, 0.0f); >+ glRotatef(20.0f + (20.0f * (3.0f * i + j)), 1.0f, 0.0f, 0.0f); >+ GLfloat scale = 0.5; >+ glScalef(scale, scale, scale); >+ glDrawElements(GL_TRIANGLES, 3 * 8, GL_UNSIGNED_INT, indices); >+ >+ glPopMatrix(); >+ } >+ } >+ >+ mRotDeg += 0.03f; >+ } >+ >+ private: >+ float mRotDeg; >+}; >+ >+int main(int argc, char **argv) >+{ >+ SimpleLightingSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/gles1/SimpleTexture2D.cpp b/Source/ThirdParty/ANGLE/samples/gles1/SimpleTexture2D.cpp >new file mode 100644 >index 00000000000..87a37031cc7 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/gles1/SimpleTexture2D.cpp >@@ -0,0 +1,86 @@ >+// >+// 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. >+// >+ >+// Based on Simple_Texture2D.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include "texture_utils.h" >+#include "util/gles_loader_autogen.h" >+#include "util/shader_utils.h" >+ >+class GLES1SimpleTexture2DSample : public SampleApplication >+{ >+ public: >+ GLES1SimpleTexture2DSample(int argc, char **argv) >+ : SampleApplication("GLES1SimpleTexture2D", argc, argv, 1, 0) >+ {} >+ >+ bool initialize() override >+ { >+ // Load the texture >+ mTexture = CreateSimpleTexture2D(); >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ glEnable(GL_TEXTURE_2D); >+ >+ return true; >+ } >+ >+ void destroy() override { glDeleteTextures(1, &mTexture); } >+ >+ void draw() override >+ { >+ GLfloat vertices[] = { >+ -0.5f, 0.5f, 0.0f, // Position 0 >+ 0.0f, 0.0f, // TexCoord 0 >+ -0.5f, -0.5f, 0.0f, // Position 1 >+ 0.0f, 1.0f, // TexCoord 1 >+ 0.5f, -0.5f, 0.0f, // Position 2 >+ 1.0f, 1.0f, // TexCoord 2 >+ 0.5f, 0.5f, 0.0f, // Position 3 >+ 1.0f, 0.0f // TexCoord 3 >+ }; >+ GLushort indices[] = {0, 1, 2, 0, 2, 3}; >+ >+ // Set the viewport >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Load the vertex position >+ glVertexPointer(3, GL_FLOAT, 5 * sizeof(GLfloat), vertices); >+ // Load the texture coordinate >+ glTexCoordPointer(2, GL_FLOAT, 5 * sizeof(GLfloat), vertices + 3); >+ >+ glEnableClientState(GL_VERTEX_ARRAY); >+ glEnableClientState(GL_TEXTURE_COORD_ARRAY); >+ >+ // Bind the texture >+ glActiveTexture(GL_TEXTURE0); >+ glBindTexture(GL_TEXTURE_2D, mTexture); >+ >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ } >+ >+ private: >+ // Texture handle >+ GLuint mTexture = 0; >+}; >+ >+int main(int argc, char **argv) >+{ >+ GLES1SimpleTexture2DSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/hello_triangle/HelloTriangle.cpp b/Source/ThirdParty/ANGLE/samples/hello_triangle/HelloTriangle.cpp >new file mode 100644 >index 00000000000..8e949b4bbaa >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/hello_triangle/HelloTriangle.cpp >@@ -0,0 +1,84 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+// Based on Hello_Triangle.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include "util/shader_utils.h" >+ >+class HelloTriangleSample : public SampleApplication >+{ >+ public: >+ HelloTriangleSample(int argc, char **argv) >+ : SampleApplication("HelloTriangle", argc, argv, 2, 0) >+ {} >+ >+ bool initialize() override >+ { >+ constexpr char kVS[] = R"(attribute vec4 vPosition; >+void main() >+{ >+ gl_Position = vPosition; >+})"; >+ >+ constexpr char kFS[] = R"(precision mediump float; >+void main() >+{ >+ gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); >+})"; >+ >+ mProgram = CompileProgram(kVS, kFS); >+ if (!mProgram) >+ { >+ return false; >+ } >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ >+ return true; >+ } >+ >+ void destroy() override { glDeleteProgram(mProgram); } >+ >+ void draw() override >+ { >+ GLfloat vertices[] = { >+ 0.0f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, >+ }; >+ >+ // Set the viewport >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ // Load the vertex data >+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices); >+ glEnableVertexAttribArray(0); >+ >+ glDrawArrays(GL_TRIANGLES, 0, 3); >+ } >+ >+ private: >+ GLuint mProgram; >+}; >+ >+int main(int argc, char **argv) >+{ >+ HelloTriangleSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/mip_map_2d/MipMap2D.cpp b/Source/ThirdParty/ANGLE/samples/mip_map_2d/MipMap2D.cpp >new file mode 100644 >index 00000000000..f541dd79e99 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/mip_map_2d/MipMap2D.cpp >@@ -0,0 +1,161 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+// Based on MipMap2D.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include "texture_utils.h" >+#include "util/shader_utils.h" >+ >+class MipMap2DSample : public SampleApplication >+{ >+ public: >+ MipMap2DSample(int argc, char **argv) : SampleApplication("MipMap2D", argc, argv) {} >+ >+ bool initialize() override >+ { >+ constexpr char kVS[] = R"(uniform float u_offset; >+attribute vec4 a_position; >+attribute vec2 a_texCoord; >+varying vec2 v_texCoord; >+void main() >+{ >+ gl_Position = a_position; >+ gl_Position.x += u_offset; >+ v_texCoord = a_texCoord; >+})"; >+ >+ constexpr char kFS[] = R"(precision mediump float; >+varying vec2 v_texCoord; >+uniform sampler2D s_texture; >+void main() >+{ >+ gl_FragColor = texture2D(s_texture, v_texCoord); >+})"; >+ >+ mProgram = CompileProgram(kVS, kFS); >+ if (!mProgram) >+ { >+ return false; >+ } >+ >+ // Get the attribute locations >+ mPositionLoc = glGetAttribLocation(mProgram, "a_position"); >+ mTexCoordLoc = glGetAttribLocation(mProgram, "a_texCoord"); >+ >+ // Get the sampler location >+ mSamplerLoc = glGetUniformLocation(mProgram, "s_texture"); >+ >+ // Get the offset location >+ mOffsetLoc = glGetUniformLocation(mProgram, "u_offset"); >+ >+ // Load the texture >+ mTextureID = CreateMipMappedTexture2D(); >+ >+ // Check Anisotropy limits >+ glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &mMaxAnisotropy); >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ >+ return true; >+ } >+ >+ void destroy() override >+ { >+ glDeleteProgram(mProgram); >+ glDeleteTextures(1, &mTextureID); >+ } >+ >+ void draw() override >+ { >+ const GLfloat vertices[] = { >+ -0.25f, 0.5f, 0.0f, 5.0f, // Position 0 >+ 0.0f, 0.0f, // TexCoord 0 >+ -0.25f, -0.5f, 0.0f, 1.0f, // Position 1 >+ 0.0f, 1.0f, // TexCoord 1 >+ 0.25f, -0.5f, 0.0f, 1.0f, // Position 2 >+ 1.0f, 1.0f, // TexCoord 2 >+ 0.25f, 0.5f, 0.0f, 5.0f, // Position 3 >+ 1.0f, 0.0f // TexCoord 3 >+ }; >+ const GLushort indices[] = {0, 1, 2, 0, 2, 3}; >+ >+ // Set the viewport >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ // Load the vertex position >+ glVertexAttribPointer(mPositionLoc, 4, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), vertices); >+ // Load the texture coordinate >+ glVertexAttribPointer(mTexCoordLoc, 2, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), >+ vertices + 4); >+ >+ glEnableVertexAttribArray(mPositionLoc); >+ glEnableVertexAttribArray(mTexCoordLoc); >+ >+ // Bind the texture >+ glActiveTexture(GL_TEXTURE0); >+ glBindTexture(GL_TEXTURE_2D, mTextureID); >+ >+ // Set the sampler texture unit to 0 >+ glUniform1i(mSamplerLoc, 0); >+ >+ // Draw quad with nearest sampling >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ glUniform1f(mOffsetLoc, -0.6f); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ >+ // Draw quad with trilinear filtering >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); >+ glUniform1f(mOffsetLoc, 0.0f); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ >+ // Draw quad with anisotropic filtering >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); >+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, mMaxAnisotropy); >+ glUniform1f(mOffsetLoc, 0.6f); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); >+ } >+ >+ private: >+ // Handle to a program object >+ GLuint mProgram; >+ >+ // Attribute locations >+ GLint mPositionLoc; >+ GLint mTexCoordLoc; >+ >+ // Sampler location >+ GLint mSamplerLoc; >+ >+ // Offset location >+ GLint mOffsetLoc; >+ >+ // Texture handle >+ GLuint mTextureID; >+ >+ float mMaxAnisotropy; >+}; >+ >+int main(int argc, char **argv) >+{ >+ MipMap2DSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/multi_texture/MultiTexture.cpp b/Source/ThirdParty/ANGLE/samples/multi_texture/MultiTexture.cpp >new file mode 100644 >index 00000000000..ffadfaed4f7 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/multi_texture/MultiTexture.cpp >@@ -0,0 +1,171 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+// Based on MultiTexture.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include "tga_utils.h" >+#include "util/shader_utils.h" >+#include "util/system_utils.h" >+ >+class MultiTextureSample : public SampleApplication >+{ >+ public: >+ MultiTextureSample(int argc, char **argv) : SampleApplication("MultiTexture", argc, argv) {} >+ >+ GLuint loadTexture(const std::string &path) >+ { >+ TGAImage img; >+ if (!LoadTGAImageFromFile(path, &img)) >+ { >+ return 0; >+ } >+ >+ return LoadTextureFromTGAImage(img); >+ } >+ >+ bool initialize() override >+ { >+ constexpr char kVS[] = R"(attribute vec4 a_position; >+attribute vec2 a_texCoord; >+varying vec2 v_texCoord; >+void main() >+{ >+ gl_Position = a_position; >+ v_texCoord = a_texCoord; >+})"; >+ >+ constexpr char kFS[] = R"(precision mediump float; >+varying vec2 v_texCoord; >+uniform sampler2D s_baseMap; >+uniform sampler2D s_lightMap; >+void main() >+{ >+ vec4 baseColor; >+ vec4 lightColor; >+ >+ baseColor = texture2D(s_baseMap, v_texCoord); >+ lightColor = texture2D(s_lightMap, v_texCoord); >+ gl_FragColor = baseColor * (lightColor + 0.25); >+})"; >+ >+ mProgram = CompileProgram(kVS, kFS); >+ if (!mProgram) >+ { >+ return false; >+ } >+ >+ // Get the attribute locations >+ mPositionLoc = glGetAttribLocation(mProgram, "a_position"); >+ mTexCoordLoc = glGetAttribLocation(mProgram, "a_texCoord"); >+ >+ // Get the sampler location >+ mBaseMapLoc = glGetUniformLocation(mProgram, "s_baseMap"); >+ mLightMapLoc = glGetUniformLocation(mProgram, "s_lightMap"); >+ >+ // Load the textures >+ std::stringstream baseStr; >+ baseStr << angle::GetExecutableDirectory() << "/basemap.tga"; >+ >+ std::stringstream lightStr; >+ lightStr << angle::GetExecutableDirectory() << "/lightmap.tga"; >+ >+ mBaseMapTexID = loadTexture(baseStr.str()); >+ mLightMapTexID = loadTexture(lightStr.str()); >+ if (mBaseMapTexID == 0 || mLightMapTexID == 0) >+ { >+ return false; >+ } >+ >+ return true; >+ } >+ >+ void destroy() override >+ { >+ glDeleteProgram(mProgram); >+ glDeleteTextures(1, &mBaseMapTexID); >+ glDeleteTextures(1, &mLightMapTexID); >+ } >+ >+ void draw() override >+ { >+ GLfloat vertices[] = { >+ -0.5f, 0.5f, 0.0f, // Position 0 >+ 0.0f, 0.0f, // TexCoord 0 >+ -0.5f, -0.5f, 0.0f, // Position 1 >+ 0.0f, 1.0f, // TexCoord 1 >+ 0.5f, -0.5f, 0.0f, // Position 2 >+ 1.0f, 1.0f, // TexCoord 2 >+ 0.5f, 0.5f, 0.0f, // Position 3 >+ 1.0f, 0.0f // TexCoord 3 >+ }; >+ GLushort indices[] = {0, 1, 2, 0, 2, 3}; >+ >+ // Set the viewport >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ // Load the vertex position >+ glVertexAttribPointer(mPositionLoc, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), vertices); >+ // Load the texture coordinate >+ glVertexAttribPointer(mTexCoordLoc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), >+ vertices + 3); >+ >+ glEnableVertexAttribArray(mPositionLoc); >+ glEnableVertexAttribArray(mTexCoordLoc); >+ >+ // Bind the base map >+ glActiveTexture(GL_TEXTURE0); >+ glBindTexture(GL_TEXTURE_2D, mBaseMapTexID); >+ >+ // Set the base map sampler to texture unit to 0 >+ glUniform1i(mBaseMapLoc, 0); >+ >+ // Bind the light map >+ glActiveTexture(GL_TEXTURE1); >+ glBindTexture(GL_TEXTURE_2D, mLightMapTexID); >+ >+ // Set the light map sampler to texture unit 1 >+ glUniform1i(mLightMapLoc, 1); >+ >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ } >+ >+ private: >+ // Handle to a program object >+ GLuint mProgram; >+ >+ // Attribute locations >+ GLint mPositionLoc; >+ GLint mTexCoordLoc; >+ >+ // Sampler locations >+ GLint mBaseMapLoc; >+ GLint mLightMapLoc; >+ >+ // Texture handle >+ GLuint mBaseMapTexID; >+ GLuint mLightMapTexID; >+}; >+ >+int main(int argc, char **argv) >+{ >+ MultiTextureSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/multi_texture/basemap.tga b/Source/ThirdParty/ANGLE/samples/multi_texture/basemap.tga >new file mode 100644 >index 00000000000..8acafae236c >Binary files /dev/null and b/Source/ThirdParty/ANGLE/samples/multi_texture/basemap.tga differ >diff --git a/Source/ThirdParty/ANGLE/samples/multi_texture/lightmap.tga b/Source/ThirdParty/ANGLE/samples/multi_texture/lightmap.tga >new file mode 100644 >index 00000000000..d95b262837d >Binary files /dev/null and b/Source/ThirdParty/ANGLE/samples/multi_texture/lightmap.tga differ >diff --git a/Source/ThirdParty/ANGLE/samples/multi_window/MultiWindow.cpp b/Source/ThirdParty/ANGLE/samples/multi_window/MultiWindow.cpp >new file mode 100644 >index 00000000000..d71751d83ed >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/multi_window/MultiWindow.cpp >@@ -0,0 +1,199 @@ >+// >+// Copyright (c) 2015 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. >+// >+ >+#include "SampleApplication.h" >+ >+#include <algorithm> >+#include <cmath> >+#include <vector> >+ >+#include "util/Matrix.h" >+#include "util/random_utils.h" >+#include "util/shader_utils.h" >+ >+using namespace angle; >+ >+class MultiWindowSample : public SampleApplication >+{ >+ public: >+ MultiWindowSample(int argc, char **argv) >+ : SampleApplication("MultiWindow", argc, argv, 2, 0, 256, 256) >+ {} >+ >+ bool initialize() override >+ { >+ constexpr char kVS[] = R"(attribute vec4 vPosition; >+void main() >+{ >+ gl_Position = vPosition; >+})"; >+ >+ constexpr char kFS[] = R"(precision mediump float; >+void main() >+{ >+ gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); >+})"; >+ >+ mProgram = CompileProgram(kVS, kFS); >+ if (!mProgram) >+ { >+ return false; >+ } >+ >+ // Set an initial rotation >+ mRotation = 45.0f; >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ >+ window rootWindow; >+ rootWindow.osWindow = getWindow(); >+ rootWindow.surface = getSurface(); >+ mWindows.push_back(rootWindow); >+ >+ const size_t numWindows = 5; >+ for (size_t i = 1; i < numWindows; i++) >+ { >+ window window; >+ >+ window.osWindow = OSWindow::New(); >+ if (!window.osWindow->initialize("MultiWindow", 256, 256)) >+ { >+ return false; >+ } >+ >+ window.surface = eglCreateWindowSurface(getDisplay(), getConfig(), >+ window.osWindow->getNativeWindow(), nullptr); >+ if (window.surface == EGL_NO_SURFACE) >+ { >+ return false; >+ } >+ >+ window.osWindow->setVisible(true); >+ >+ mWindows.push_back(window); >+ } >+ >+ int baseX = rootWindow.osWindow->getX(); >+ int baseY = rootWindow.osWindow->getY(); >+ for (auto &window : mWindows) >+ { >+ int x = baseX + mRNG.randomIntBetween(0, 512); >+ int y = baseY + mRNG.randomIntBetween(0, 512); >+ int width = mRNG.randomIntBetween(128, 512); >+ int height = mRNG.randomIntBetween(128, 512); >+ window.osWindow->setPosition(x, y); >+ window.osWindow->resize(width, height); >+ } >+ >+ return true; >+ } >+ >+ void destroy() override { glDeleteProgram(mProgram); } >+ >+ void step(float dt, double totalTime) override >+ { >+ mRotation = fmod(mRotation + (dt * 40.0f), 360.0f); >+ >+ for (auto &window : mWindows) >+ { >+ window.osWindow->messageLoop(); >+ } >+ } >+ >+ void draw() override >+ { >+ OSWindow *rootWindow = mWindows[0].osWindow; >+ int left = rootWindow->getX(); >+ int right = rootWindow->getX() + rootWindow->getWidth(); >+ int top = rootWindow->getY(); >+ int bottom = rootWindow->getY() + rootWindow->getHeight(); >+ >+ for (auto &windowRecord : mWindows) >+ { >+ OSWindow *window = windowRecord.osWindow; >+ left = std::min(left, window->getX()); >+ right = std::max(right, window->getX() + window->getWidth()); >+ top = std::min(top, window->getY()); >+ bottom = std::max(bottom, window->getY() + window->getHeight()); >+ } >+ >+ float midX = (left + right) * 0.5f; >+ float midY = (top + bottom) * 0.5f; >+ >+ Matrix4 modelMatrix = Matrix4::translate(Vector3(midX, midY, 0.0f)) * >+ Matrix4::rotate(mRotation, Vector3(0.0f, 0.0f, 1.0f)) * >+ Matrix4::translate(Vector3(-midX, -midY, 0.0f)); >+ Matrix4 viewMatrix = Matrix4::identity(); >+ >+ for (auto &windowRecord : mWindows) >+ { >+ OSWindow *window = windowRecord.osWindow; >+ EGLSurface surface = windowRecord.surface; >+ >+ eglMakeCurrent(getDisplay(), surface, surface, getContext()); >+ >+ Matrix4 orthoMatrix = >+ Matrix4::ortho(static_cast<float>(window->getX()), >+ static_cast<float>(window->getX() + window->getWidth()), >+ static_cast<float>(window->getY() + window->getHeight()), >+ static_cast<float>(window->getY()), 0.0f, 1.0f); >+ Matrix4 mvpMatrix = orthoMatrix * viewMatrix * modelMatrix; >+ >+ Vector3 vertices[] = { >+ Matrix4::transform(mvpMatrix, Vector4(midX, static_cast<float>(top), 0.0f, 1.0f)), >+ Matrix4::transform(mvpMatrix, Vector4(static_cast<float>(left), >+ static_cast<float>(bottom), 0.0f, 1.0f)), >+ Matrix4::transform(mvpMatrix, Vector4(static_cast<float>(right), >+ static_cast<float>(bottom), 0.0f, 1.0f)), >+ }; >+ >+ // Set the viewport >+ glViewport(0, 0, window->getWidth(), window->getHeight()); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ // Load the vertex data >+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices[0].data()); >+ glEnableVertexAttribArray(0); >+ >+ glDrawArrays(GL_TRIANGLES, 0, 3); >+ >+ eglSwapBuffers(getDisplay(), surface); >+ } >+ } >+ >+ // Override swap to do nothing as we already swapped the root >+ // window in draw() and swapping another time would invalidate >+ // the content of the default framebuffer. >+ void swap() override {} >+ >+ private: >+ // Handle to a program object >+ GLuint mProgram; >+ >+ // Current rotation >+ float mRotation; >+ >+ // Window and surface data >+ struct window >+ { >+ OSWindow *osWindow; >+ EGLSurface surface; >+ }; >+ std::vector<window> mWindows; >+ >+ RNG mRNG; >+}; >+ >+int main(int argc, char **argv) >+{ >+ MultiWindowSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/multiple_draw_buffers/MultipleDrawBuffers.cpp b/Source/ThirdParty/ANGLE/samples/multiple_draw_buffers/MultipleDrawBuffers.cpp >new file mode 100644 >index 00000000000..84571b2e520 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/multiple_draw_buffers/MultipleDrawBuffers.cpp >@@ -0,0 +1,222 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+// Based on Simple_Texture2D.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include "texture_utils.h" >+#include "util/shader_utils.h" >+#include "util/system_utils.h" >+ >+#include <cstring> >+#include <iostream> >+ >+class MultipleDrawBuffersSample : public SampleApplication >+{ >+ public: >+ MultipleDrawBuffersSample(int argc, char **argv) >+ : SampleApplication("MultipleDrawBuffers", argc, argv) >+ {} >+ >+ virtual bool initialize() >+ { >+ // Check EXT_draw_buffers is supported >+ char *extensionString = (char *)glGetString(GL_EXTENSIONS); >+ if (strstr(extensionString, "GL_EXT_draw_buffers") != nullptr) >+ { >+ // Retrieve the address of glDrawBuffersEXT from EGL >+ mDrawBuffers = (PFNGLDRAWBUFFERSEXTPROC)eglGetProcAddress("glDrawBuffersEXT"); >+ } >+ else >+ { >+ mDrawBuffers = glDrawBuffers; >+ } >+ >+ if (!mDrawBuffers) >+ { >+ std::cerr << "Unable to load glDrawBuffers[EXT] entry point."; >+ return false; >+ } >+ >+ std::stringstream vsStream; >+ vsStream << angle::GetExecutableDirectory() << "/multiple_draw_buffers_vs.glsl"; >+ >+ std::stringstream fsStream; >+ fsStream << angle::GetExecutableDirectory() << "/multiple_draw_buffers_fs.glsl"; >+ >+ std::stringstream copyFsStream; >+ fsStream << angle::GetExecutableDirectory() << "/multiple_draw_buffers_copy_fs.glsl"; >+ >+ mMRTProgram = CompileProgramFromFiles(vsStream.str(), fsStream.str()); >+ if (!mMRTProgram) >+ { >+ return false; >+ } >+ >+ mCopyProgram = CompileProgramFromFiles(vsStream.str(), copyFsStream.str()); >+ if (!mCopyProgram) >+ { >+ return false; >+ } >+ >+ // Get the attribute locations >+ mPositionLoc = glGetAttribLocation(mCopyProgram, "a_position"); >+ mTexCoordLoc = glGetAttribLocation(mCopyProgram, "a_texCoord"); >+ >+ // Get the sampler location >+ mSamplerLoc = glGetUniformLocation(mCopyProgram, "s_texture"); >+ >+ // Load the texture >+ mTexture = CreateSimpleTexture2D(); >+ >+ // Initialize the user framebuffer >+ glGenFramebuffers(1, &mFramebuffer); >+ glGenTextures(mFramebufferAttachmentCount, mFramebufferTextures); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); >+ for (size_t i = 0; i < mFramebufferAttachmentCount; i++) >+ { >+ // Create textures for the four color attachments >+ glBindTexture(GL_TEXTURE_2D, mFramebufferTextures[i]); >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindow()->getWidth(), >+ getWindow()->getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, >+ static_cast<GLenum>(GL_COLOR_ATTACHMENT0_EXT + i), GL_TEXTURE_2D, >+ mFramebufferTextures[i], 0); >+ } >+ >+ glBindTexture(GL_TEXTURE_2D, 0); >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ >+ return true; >+ } >+ >+ virtual void destroy() >+ { >+ glDeleteProgram(mCopyProgram); >+ glDeleteProgram(mMRTProgram); >+ glDeleteTextures(1, &mTexture); >+ glDeleteTextures(mFramebufferAttachmentCount, mFramebufferTextures); >+ glDeleteFramebuffers(1, &mFramebuffer); >+ } >+ >+ virtual void draw() >+ { >+ GLfloat vertices[] = { >+ -0.8f, 0.8f, 0.0f, // Position 0 >+ 0.0f, 0.0f, // TexCoord 0 >+ -0.8f, -0.8f, 0.0f, // Position 1 >+ 0.0f, 1.0f, // TexCoord 1 >+ 0.8f, -0.8f, 0.0f, // Position 2 >+ 1.0f, 1.0f, // TexCoord 2 >+ 0.8f, 0.8f, 0.0f, // Position 3 >+ 1.0f, 0.0f // TexCoord 3 >+ }; >+ GLushort indices[] = {0, 1, 2, 0, 2, 3}; >+ GLenum drawBuffers[mFramebufferAttachmentCount] = { >+ GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_COLOR_ATTACHMENT2_EXT, >+ GL_COLOR_ATTACHMENT3_EXT}; >+ >+ // Enable drawing to the four color attachments of the user framebuffer >+ glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); >+ mDrawBuffers(mFramebufferAttachmentCount, drawBuffers); >+ >+ // Set the viewport >+ GLint width = static_cast<GLint>(getWindow()->getWidth()); >+ GLint height = static_cast<GLint>(getWindow()->getHeight()); >+ glViewport(0, 0, width, height); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mMRTProgram); >+ >+ // Load the vertex position >+ glVertexAttribPointer(mPositionLoc, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), vertices); >+ glEnableVertexAttribArray(mPositionLoc); >+ >+ // Load the texture coordinate >+ glVertexAttribPointer(mTexCoordLoc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), >+ vertices + 3); >+ glEnableVertexAttribArray(mTexCoordLoc); >+ >+ // Bind the texture >+ glActiveTexture(GL_TEXTURE0); >+ glBindTexture(GL_TEXTURE_2D, mTexture); >+ >+ // Set the sampler texture unit to 0 >+ glUniform1i(mSamplerLoc, 0); >+ >+ // Draw the textured quad to the four render targets >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ >+ // Enable the default framebuffer and single textured drawing >+ glBindFramebuffer(GL_FRAMEBUFFER, 0); >+ glUseProgram(mCopyProgram); >+ >+ // Draw the four textured quads to a separate region in the viewport >+ glBindTexture(GL_TEXTURE_2D, mFramebufferTextures[0]); >+ glViewport(0, 0, width / 2, height / 2); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ >+ glBindTexture(GL_TEXTURE_2D, mFramebufferTextures[1]); >+ glViewport(width / 2, 0, width / 2, height / 2); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ >+ glBindTexture(GL_TEXTURE_2D, mFramebufferTextures[2]); >+ glViewport(0, height / 2, width / 2, height / 2); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ >+ glBindTexture(GL_TEXTURE_2D, mFramebufferTextures[3]); >+ glViewport(width / 2, height / 2, width / 2, height / 2); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ } >+ >+ private: >+ // Handle to a program object >+ GLuint mMRTProgram; >+ GLuint mCopyProgram; >+ >+ // Attribute locations >+ GLint mPositionLoc; >+ GLint mTexCoordLoc; >+ >+ // Sampler location >+ GLint mSamplerLoc; >+ >+ // Texture handle >+ GLuint mTexture; >+ >+ // Framebuffer object handle >+ GLuint mFramebuffer; >+ >+ // Framebuffer color attachments >+ static const size_t mFramebufferAttachmentCount = 4; >+ GLuint mFramebufferTextures[mFramebufferAttachmentCount]; >+ >+ // Loaded draw buffer entry points >+ PFNGLDRAWBUFFERSEXTPROC mDrawBuffers; >+}; >+ >+int main(int argc, char **argv) >+{ >+ MultipleDrawBuffersSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/multiple_draw_buffers/multiple_draw_buffers_copy_fs.glsl b/Source/ThirdParty/ANGLE/samples/multiple_draw_buffers/multiple_draw_buffers_copy_fs.glsl >new file mode 100644 >index 00000000000..59deb61ce04 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/multiple_draw_buffers/multiple_draw_buffers_copy_fs.glsl >@@ -0,0 +1,8 @@ >+precision mediump float; >+varying vec2 v_texCoord; >+uniform sampler2D s_texture; >+void main() >+{ >+ vec4 color = texture2D(s_texture, v_texCoord); >+ gl_FragColor = color; >+} >diff --git a/Source/ThirdParty/ANGLE/samples/multiple_draw_buffers/multiple_draw_buffers_fs.glsl b/Source/ThirdParty/ANGLE/samples/multiple_draw_buffers/multiple_draw_buffers_fs.glsl >new file mode 100644 >index 00000000000..d0143d5dc63 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/multiple_draw_buffers/multiple_draw_buffers_fs.glsl >@@ -0,0 +1,12 @@ >+#extension GL_EXT_draw_buffers : enable >+precision mediump float; >+varying vec2 v_texCoord; >+uniform sampler2D s_texture; >+void main() >+{ >+ vec4 color = texture2D(s_texture, v_texCoord); >+ gl_FragData[0] = color; >+ gl_FragData[1] = vec4(1.0, 1.0, 1.0, 1.0) - color.brga; >+ gl_FragData[2] = vec4(0.2, 1.0, 0.5, 1.0) * color.gbra; >+ gl_FragData[3] = color.rrra; >+} >diff --git a/Source/ThirdParty/ANGLE/samples/multiple_draw_buffers/multiple_draw_buffers_vs.glsl b/Source/ThirdParty/ANGLE/samples/multiple_draw_buffers/multiple_draw_buffers_vs.glsl >new file mode 100644 >index 00000000000..0978752573f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/multiple_draw_buffers/multiple_draw_buffers_vs.glsl >@@ -0,0 +1,8 @@ >+attribute vec4 a_position; >+attribute vec2 a_texCoord; >+varying vec2 v_texCoord; >+void main() >+{ >+ gl_Position = a_position; >+ v_texCoord = a_texCoord; >+} >diff --git a/Source/ThirdParty/ANGLE/samples/multiview/Multiview.cpp b/Source/ThirdParty/ANGLE/samples/multiview/Multiview.cpp >new file mode 100644 >index 00000000000..fd5e30ecbd4 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/multiview/Multiview.cpp >@@ -0,0 +1,382 @@ >+// >+// Copyright (c) 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. >+// >+// This sample shows basic usage of the GL_OVR_multiview2 extension. >+ >+#include "SampleApplication.h" >+ >+#include "util/geometry_utils.h" >+#include "util/shader_utils.h" >+ >+#include <iostream> >+ >+namespace >+{ >+ >+void FillTranslationMatrix(float xOffset, float yOffset, float zOffset, float *matrix) >+{ >+ matrix[0] = 1.0f; >+ matrix[1] = 0.0f; >+ matrix[2] = 0.0f; >+ matrix[3] = xOffset; >+ >+ matrix[4] = 0.0f; >+ matrix[5] = 1.0f; >+ matrix[6] = 0.0f; >+ matrix[7] = yOffset; >+ >+ matrix[8] = 0.0f; >+ matrix[9] = 0.0f; >+ matrix[10] = 1.0f; >+ matrix[11] = zOffset; >+ >+ matrix[12] = 0.0f; >+ matrix[13] = 0.0f; >+ matrix[14] = 0.0f; >+ matrix[15] = 1.0f; >+} >+ >+} // namespace >+ >+class MultiviewSample : public SampleApplication >+{ >+ public: >+ MultiviewSample(int argc, char **argv) >+ : SampleApplication("Multiview", argc, argv, 3, 0), >+ mMultiviewProgram(0), >+ mMultiviewPersperiveUniformLoc(-1), >+ mMultiviewLeftEyeCameraUniformLoc(-1), >+ mMultiviewRightEyeCameraUniformLoc(-1), >+ mMultiviewTranslationUniformLoc(-1), >+ mMultiviewFBO(0), >+ mColorTexture(0), >+ mDepthTexture(0), >+ mQuadVAO(0), >+ mQuadVBO(0), >+ mCubeVAO(0), >+ mCubePosVBO(0), >+ mCubeNormalVBO(0), >+ mCubeIBO(0), >+ mCombineProgram(0) >+ {} >+ >+ bool initialize() override >+ { >+ // Check whether the GL_OVR_multiview2 extension is supported. If not, abort >+ // initialization. >+ const char *allExtensions = reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)); >+ const std::string paddedExtensions = std::string(" ") + allExtensions + std::string(" "); >+ if (paddedExtensions.find(std::string(" GL_OVR_multiview2 ")) == std::string::npos) >+ { >+ std::cout << "GL_OVR_multiview2 is not available." << std::endl; >+ return false; >+ } >+ >+ // A view covers horizontally half of the screen. >+ int viewWidth = getWindow()->getWidth() / 2; >+ int viewHeight = getWindow()->getHeight(); >+ >+ // Create color and depth texture arrays with two layers to which we render each view. >+ glGenTextures(1, &mColorTexture); >+ glBindTexture(GL_TEXTURE_2D_ARRAY, mColorTexture); >+ glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, viewWidth, viewHeight, 2, 0, GL_RGBA, >+ GL_UNSIGNED_BYTE, nullptr); >+ glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ >+ glGenTextures(1, &mDepthTexture); >+ glBindTexture(GL_TEXTURE_2D_ARRAY, mDepthTexture); >+ glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_DEPTH_COMPONENT32F, viewWidth, viewHeight, 2, 0, >+ GL_DEPTH_COMPONENT, GL_FLOAT, nullptr); >+ >+ // Generate multiview framebuffer for layered rendering. >+ glGenFramebuffers(1, &mMultiviewFBO); >+ glBindFramebuffer(GL_FRAMEBUFFER, mMultiviewFBO); >+ glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mColorTexture, 0, 0, >+ 2); >+ glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, mDepthTexture, 0, 0, >+ 2); >+ GLenum drawBuffer = GL_COLOR_ATTACHMENT0; >+ glDrawBuffers(1, &drawBuffer); >+ >+ // Check that the framebuffer is complete. Abort initialization otherwise. >+ if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) >+ { >+ return false; >+ } >+ >+ // Create multiview program and query the uniform locations. >+ // The program has two code paths based on the gl_ViewID_OVR attribute which tells us which >+ // view is currently being rendered to. Based on it we decide which eye's camera matrix to >+ // use. >+ constexpr char kMultiviewVS[] = >+ "#version 300 es\n" >+ "#extension GL_OVR_multiview2 : require\n" >+ "layout(num_views = 2) in;\n" >+ "layout(location=0) in vec3 posIn;\n" >+ "layout(location=1) in vec3 normalIn;\n" >+ "uniform mat4 uPerspective;\n" >+ "uniform mat4 uCameraLeftEye;\n" >+ "uniform mat4 uCameraRightEye;\n" >+ "uniform mat4 uTranslation;\n" >+ "out vec3 oNormal;\n" >+ "void main()\n" >+ "{\n" >+ " vec4 p = uTranslation * vec4(posIn,1.);\n" >+ " if (gl_ViewID_OVR == 0u) {\n" >+ " p = uCameraLeftEye * p;\n" >+ " } else {\n" >+ " p = uCameraRightEye * p;\n" >+ " }\n" >+ " oNormal = normalIn;\n" >+ " gl_Position = uPerspective * p;\n" >+ "}\n"; >+ >+ constexpr char kMultiviewFS[] = >+ "#version 300 es\n" >+ "#extension GL_OVR_multiview2 : require\n" >+ "precision mediump float;\n" >+ "out vec4 color;\n" >+ "in vec3 oNormal;\n" >+ "void main()\n" >+ "{\n" >+ " vec3 col = 0.5 * oNormal + vec3(0.5);\n" >+ " color = vec4(col, 1.);\n" >+ "}\n"; >+ >+ mMultiviewProgram = CompileProgram(kMultiviewVS, kMultiviewFS); >+ if (!mMultiviewProgram) >+ { >+ return false; >+ } >+ mMultiviewPersperiveUniformLoc = glGetUniformLocation(mMultiviewProgram, "uPerspective"); >+ mMultiviewLeftEyeCameraUniformLoc = >+ glGetUniformLocation(mMultiviewProgram, "uCameraLeftEye"); >+ mMultiviewRightEyeCameraUniformLoc = >+ glGetUniformLocation(mMultiviewProgram, "uCameraRightEye"); >+ mMultiviewTranslationUniformLoc = glGetUniformLocation(mMultiviewProgram, "uTranslation"); >+ >+ // Create a normal program to combine both layers of the color array texture. >+ constexpr char kCombineVS[] = >+ "#version 300 es\n" >+ "in vec2 vIn;\n" >+ "out vec2 uv;\n" >+ "void main()\n" >+ "{\n" >+ " gl_Position = vec4(vIn, 0., 1.);\n" >+ " uv = vIn * .5 + vec2(.5);\n" >+ "}\n"; >+ >+ constexpr char kCombineFS[] = >+ "#version 300 es\n" >+ "precision mediump float;\n" >+ "precision mediump sampler2DArray;\n" >+ "uniform sampler2DArray uMultiviewTex;\n" >+ "in vec2 uv;\n" >+ "out vec4 color;\n" >+ "void main()\n" >+ "{\n" >+ " float scaledX = 2.0 * uv.x;\n" >+ " float layer = floor(scaledX);\n" >+ " vec2 adjustedUV = vec2(fract(scaledX), uv.y);\n" >+ " vec3 texColor = texture(uMultiviewTex, vec3(adjustedUV, layer)).rgb;\n" >+ " color = vec4(texColor, 1.);\n" >+ "}\n"; >+ >+ mCombineProgram = CompileProgram(kCombineVS, kCombineFS); >+ if (!mCombineProgram) >+ { >+ return false; >+ } >+ >+ // Generate a quad which covers the whole screen. >+ glGenVertexArrays(1, &mQuadVAO); >+ glBindVertexArray(mQuadVAO); >+ >+ glGenBuffers(1, &mQuadVBO); >+ glBindBuffer(GL_ARRAY_BUFFER, mQuadVBO); >+ const float kQuadPositionData[] = {1.f, -1.f, 1.f, 1.f, -1.f, -1.f, -1.f, 1.f}; >+ glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 8, kQuadPositionData, GL_STATIC_DRAW); >+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr); >+ glEnableVertexAttribArray(0); >+ glBindVertexArray(0); >+ >+ // Generate a cube. >+ GenerateCubeGeometry(1.0f, &mCube); >+ glGenVertexArrays(1, &mCubeVAO); >+ glBindVertexArray(mCubeVAO); >+ >+ glGenBuffers(1, &mCubePosVBO); >+ glBindBuffer(GL_ARRAY_BUFFER, mCubePosVBO); >+ glBufferData(GL_ARRAY_BUFFER, sizeof(angle::Vector3) * mCube.positions.size(), >+ mCube.positions.data(), GL_STATIC_DRAW); >+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr); >+ glEnableVertexAttribArray(0); >+ >+ glGenBuffers(1, &mCubeNormalVBO); >+ glBindBuffer(GL_ARRAY_BUFFER, mCubeNormalVBO); >+ glBufferData(GL_ARRAY_BUFFER, sizeof(angle::Vector3) * mCube.normals.size(), >+ mCube.normals.data(), GL_STATIC_DRAW); >+ glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, nullptr); >+ glEnableVertexAttribArray(1); >+ >+ glGenBuffers(1, &mCubeIBO); >+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mCubeIBO); >+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort) * mCube.indices.size(), >+ mCube.indices.data(), GL_STATIC_DRAW); >+ >+ glBindVertexArray(0); >+ >+ glEnable(GL_DEPTH_TEST); >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ >+ return true; >+ } >+ >+ void destroy() override >+ { >+ glDeleteProgram(mMultiviewProgram); >+ glDeleteFramebuffers(1, &mMultiviewFBO); >+ glDeleteTextures(1, &mColorTexture); >+ glDeleteTextures(1, &mDepthTexture); >+ glDeleteVertexArrays(1, &mQuadVAO); >+ glDeleteBuffers(1, &mQuadVBO); >+ glDeleteVertexArrays(1, &mCubeVAO); >+ glDeleteBuffers(1, &mQuadVBO); >+ glDeleteBuffers(1, &mCubePosVBO); >+ glDeleteBuffers(1, &mCubeNormalVBO); >+ glDeleteBuffers(1, &mCubeIBO); >+ glDeleteProgram(mCombineProgram); >+ } >+ >+ void draw() override >+ { >+ // Draw to multiview fbo. >+ { >+ // Generate the perspective projection matrix. >+ const int viewWidth = getWindow()->getWidth() / 2; >+ const int viewHeight = getWindow()->getHeight(); >+ const float kFOV = 90.f; >+ const float kNear = 1.0f; >+ const float kFar = 100.0f; >+ const float kPlaneDifference = kFar - kNear; >+ const float kXYScale = 1.f / (tanf(kFOV / 2.0f)); >+ const float kAspectRatio = static_cast<float>(viewWidth) / viewHeight; >+ float kPerspectiveProjectionMatrix[16]; >+ kPerspectiveProjectionMatrix[0] = kXYScale / kAspectRatio; >+ kPerspectiveProjectionMatrix[1] = .0f; >+ kPerspectiveProjectionMatrix[2] = .0f; >+ kPerspectiveProjectionMatrix[3] = .0f; >+ >+ kPerspectiveProjectionMatrix[4] = .0f; >+ kPerspectiveProjectionMatrix[5] = kXYScale; >+ kPerspectiveProjectionMatrix[6] = .0f; >+ kPerspectiveProjectionMatrix[7] = .0f; >+ >+ kPerspectiveProjectionMatrix[8] = .0f; >+ kPerspectiveProjectionMatrix[9] = .0; >+ kPerspectiveProjectionMatrix[10] = -kFar / kPlaneDifference; >+ kPerspectiveProjectionMatrix[11] = -1.f; >+ >+ kPerspectiveProjectionMatrix[12] = .0f; >+ kPerspectiveProjectionMatrix[13] = .0; >+ kPerspectiveProjectionMatrix[14] = -kFar * kNear / kPlaneDifference; >+ kPerspectiveProjectionMatrix[15] = .0; >+ >+ // Generate the camera matrices for the left and right eye. >+ const float kXOffset = 1.5f; >+ const float kYOffset = 1.5f; >+ const float kZOffset = 5.0f; >+ float kLeftCameraMatrix[16]; >+ FillTranslationMatrix(kXOffset, -kYOffset, -kZOffset, kLeftCameraMatrix); >+ float kRightCameraMatrix[16]; >+ FillTranslationMatrix(-kXOffset, -kYOffset, -kZOffset, kRightCameraMatrix); >+ >+ // Bind and clear the multiview framebuffer. >+ glBindFramebuffer(GL_FRAMEBUFFER, mMultiviewFBO); >+ glClearColor(0, 0, 0, 1); >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); >+ >+ // Set the viewport to be the size as one of the views. >+ glViewport(0, 0, viewWidth, viewHeight); >+ >+ // Bind multiview program and set matrices. >+ glUseProgram(mMultiviewProgram); >+ glUniformMatrix4fv(mMultiviewPersperiveUniformLoc, 1, GL_TRUE, >+ kPerspectiveProjectionMatrix); >+ glUniformMatrix4fv(mMultiviewLeftEyeCameraUniformLoc, 1, GL_TRUE, kLeftCameraMatrix); >+ glUniformMatrix4fv(mMultiviewRightEyeCameraUniformLoc, 1, GL_TRUE, kRightCameraMatrix); >+ >+ glBindVertexArray(mCubeVAO); >+ >+ // Draw first cube. >+ float kTranslationMatrix[16]; >+ FillTranslationMatrix(0.0f, 0.0f, 0.0f, kTranslationMatrix); >+ glUniformMatrix4fv(mMultiviewTranslationUniformLoc, 1, GL_TRUE, kTranslationMatrix); >+ glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(mCube.indices.size()), >+ GL_UNSIGNED_SHORT, nullptr); >+ >+ // Draw second cube. >+ FillTranslationMatrix(1.0f, 1.0f, -2.0f, kTranslationMatrix); >+ glUniformMatrix4fv(mMultiviewTranslationUniformLoc, 1, GL_TRUE, kTranslationMatrix); >+ glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(mCube.indices.size()), >+ GL_UNSIGNED_SHORT, nullptr); >+ >+ glBindVertexArray(0); >+ } >+ >+ // Combine both views. >+ { >+ // Bind the default framebuffer object and clear. >+ glBindFramebuffer(GL_FRAMEBUFFER, 0); >+ >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); >+ >+ // Set the viewport to cover the whole screen. >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ glUseProgram(mCombineProgram); >+ >+ // Bind the 2D array texture to be used as a sampler. >+ glUniform1i(glGetUniformLocation(mCombineProgram, "uMultiviewTex"), 0); >+ glBindTexture(GL_TEXTURE_2D_ARRAY, mMultiviewFBO); >+ glActiveTexture(GL_TEXTURE0); >+ >+ // Draw a quad which covers the whole screen. Layer and texture coordinates are >+ // calculated in the vertex shader based on the UV coordinates of the quad. >+ glBindVertexArray(mQuadVAO); >+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); >+ glBindVertexArray(0); >+ } >+ } >+ >+ private: >+ GLuint mMultiviewProgram; >+ GLint mMultiviewPersperiveUniformLoc; >+ GLint mMultiviewLeftEyeCameraUniformLoc; >+ GLint mMultiviewRightEyeCameraUniformLoc; >+ GLint mMultiviewTranslationUniformLoc; >+ >+ GLuint mMultiviewFBO; >+ GLuint mColorTexture; >+ GLuint mDepthTexture; >+ >+ GLuint mQuadVAO; >+ GLuint mQuadVBO; >+ >+ CubeGeometry mCube; >+ GLuint mCubeVAO; >+ GLuint mCubePosVBO; >+ GLuint mCubeNormalVBO; >+ GLuint mCubeIBO; >+ >+ GLuint mCombineProgram; >+}; >+ >+int main(int argc, char **argv) >+{ >+ MultiviewSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/particle_system/ParticleSystem.cpp b/Source/ThirdParty/ANGLE/samples/particle_system/ParticleSystem.cpp >new file mode 100644 >index 00000000000..934bc8d6917 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/particle_system/ParticleSystem.cpp >@@ -0,0 +1,227 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+// Based on ParticleSystem.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include "common/vector_utils.h" >+#include "tga_utils.h" >+#include "util/random_utils.h" >+#include "util/shader_utils.h" >+#include "util/system_utils.h" >+ >+#define _USE_MATH_DEFINES >+#include <math.h> >+ >+using namespace angle; >+ >+class ParticleSystemSample : public SampleApplication >+{ >+ public: >+ ParticleSystemSample(int argc, char **argv) : SampleApplication("ParticleSystem", argc, argv) {} >+ >+ bool initialize() override >+ { >+ constexpr char kVS[] = R"(uniform float u_time; >+uniform vec3 u_centerPosition; >+attribute float a_lifetime; >+attribute vec3 a_startPosition; >+attribute vec3 a_endPosition; >+varying float v_lifetime; >+void main() >+{ >+ if (u_time <= a_lifetime) >+ { >+ gl_Position.xyz = a_startPosition + (u_time * a_endPosition); >+ gl_Position.xyz += u_centerPosition; >+ gl_Position.w = 1.0; >+ } >+ else >+ { >+ gl_Position = vec4(-1000, -1000, 0, 0); >+ } >+ v_lifetime = 1.0 - (u_time / a_lifetime); >+ v_lifetime = clamp(v_lifetime, 0.0, 1.0); >+ gl_PointSize = (v_lifetime * v_lifetime) * 40.0; >+})"; >+ >+ constexpr char kFS[] = R"(precision mediump float; >+uniform vec4 u_color; >+varying float v_lifetime; >+uniform sampler2D s_texture; >+void main() >+{ >+ vec4 texColor; >+ texColor = texture2D(s_texture, gl_PointCoord); >+ gl_FragColor = vec4(u_color) * texColor; >+ gl_FragColor.a *= v_lifetime; >+})"; >+ >+ mProgram = CompileProgram(kVS, kFS); >+ if (!mProgram) >+ { >+ return false; >+ } >+ >+ // Get the attribute locations >+ mLifetimeLoc = glGetAttribLocation(mProgram, "a_lifetime"); >+ mStartPositionLoc = glGetAttribLocation(mProgram, "a_startPosition"); >+ mEndPositionLoc = glGetAttribLocation(mProgram, "a_endPosition"); >+ >+ // Get the uniform locations >+ mTimeLoc = glGetUniformLocation(mProgram, "u_time"); >+ mCenterPositionLoc = glGetUniformLocation(mProgram, "u_centerPosition"); >+ mColorLoc = glGetUniformLocation(mProgram, "u_color"); >+ mSamplerLoc = glGetUniformLocation(mProgram, "s_texture"); >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ >+ // Fill in particle data array >+ for (size_t i = 0; i < mParticleCount; i++) >+ { >+ mParticles[i].lifetime = mRNG.randomFloatBetween(0.0f, 1.0f); >+ >+ float endAngle = mRNG.randomFloatBetween(0, 2.0f * float(M_PI)); >+ float endRadius = mRNG.randomFloatBetween(0.0f, 2.0f); >+ mParticles[i].endPosition.x() = sinf(endAngle) * endRadius; >+ mParticles[i].endPosition.y() = cosf(endAngle) * endRadius; >+ mParticles[i].endPosition.z() = 0.0f; >+ >+ float startAngle = mRNG.randomFloatBetween(0, 2.0f * float(M_PI)); >+ float startRadius = mRNG.randomFloatBetween(0.0f, 0.25f); >+ mParticles[i].startPosition.x() = sinf(startAngle) * startRadius; >+ mParticles[i].startPosition.y() = cosf(startAngle) * startRadius; >+ mParticles[i].startPosition.z() = 0.0f; >+ } >+ >+ mParticleTime = 1.0f; >+ >+ std::stringstream smokeStr; >+ smokeStr << angle::GetExecutableDirectory() << "/smoke.tga"; >+ >+ TGAImage img; >+ if (!LoadTGAImageFromFile(smokeStr.str(), &img)) >+ { >+ return false; >+ } >+ mTextureID = LoadTextureFromTGAImage(img); >+ if (!mTextureID) >+ { >+ return false; >+ } >+ >+ return true; >+ } >+ >+ void destroy() override { glDeleteProgram(mProgram); } >+ >+ void step(float dt, double totalTime) override >+ { >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ mParticleTime += dt; >+ if (mParticleTime >= 1.0f) >+ { >+ mParticleTime = 0.0f; >+ >+ // Pick a new start location and color >+ Vector3 centerPos(mRNG.randomFloatBetween(-0.5f, 0.5f), >+ mRNG.randomFloatBetween(-0.5f, 0.5f), >+ mRNG.randomFloatBetween(-0.5f, 0.5f)); >+ glUniform3fv(mCenterPositionLoc, 1, centerPos.data()); >+ >+ // Random color >+ Vector4 color(mRNG.randomFloatBetween(0.0f, 1.0f), mRNG.randomFloatBetween(0.0f, 1.0f), >+ mRNG.randomFloatBetween(0.0f, 1.0f), 0.5f); >+ glUniform4fv(mColorLoc, 1, color.data()); >+ } >+ >+ // Load uniform time variable >+ glUniform1f(mTimeLoc, mParticleTime); >+ } >+ >+ void draw() override >+ { >+ // Set the viewport >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ // Load the vertex attributes >+ glVertexAttribPointer(mLifetimeLoc, 1, GL_FLOAT, GL_FALSE, sizeof(Particle), >+ &mParticles[0].lifetime); >+ glVertexAttribPointer(mEndPositionLoc, 3, GL_FLOAT, GL_FALSE, sizeof(Particle), >+ &mParticles[0].endPosition); >+ glVertexAttribPointer(mStartPositionLoc, 3, GL_FLOAT, GL_FALSE, sizeof(Particle), >+ &mParticles[0].startPosition); >+ >+ glEnableVertexAttribArray(mLifetimeLoc); >+ glEnableVertexAttribArray(mEndPositionLoc); >+ glEnableVertexAttribArray(mStartPositionLoc); >+ >+ // Blend particles >+ glEnable(GL_BLEND); >+ glBlendFunc(GL_SRC_ALPHA, GL_ONE); >+ >+ // Bind the texture >+ glActiveTexture(GL_TEXTURE0); >+ glBindTexture(GL_TEXTURE_2D, mTextureID); >+ >+ // Set the sampler texture unit to 0 >+ glUniform1i(mSamplerLoc, 0); >+ >+ glDrawArrays(GL_POINTS, 0, mParticleCount); >+ } >+ >+ private: >+ // Handle to a program object >+ GLuint mProgram; >+ >+ // Attribute locations >+ GLint mLifetimeLoc; >+ GLint mStartPositionLoc; >+ GLint mEndPositionLoc; >+ >+ // Uniform location >+ GLint mTimeLoc; >+ GLint mColorLoc; >+ GLint mCenterPositionLoc; >+ GLint mSamplerLoc; >+ >+ // Texture handle >+ GLuint mTextureID; >+ >+ // Particle vertex data >+ struct Particle >+ { >+ float lifetime; >+ Vector3 startPosition; >+ Vector3 endPosition; >+ }; >+ static const size_t mParticleCount = 1024; >+ std::array<Particle, mParticleCount> mParticles; >+ float mParticleTime; >+ RNG mRNG; >+}; >+ >+int main(int argc, char **argv) >+{ >+ ParticleSystemSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/particle_system/smoke.tga b/Source/ThirdParty/ANGLE/samples/particle_system/smoke.tga >new file mode 100644 >index 00000000000..06a0705c7e6 >Binary files /dev/null and b/Source/ThirdParty/ANGLE/samples/particle_system/smoke.tga differ >diff --git a/Source/ThirdParty/ANGLE/samples/post_sub_buffer/PostSubBuffer.cpp b/Source/ThirdParty/ANGLE/samples/post_sub_buffer/PostSubBuffer.cpp >new file mode 100644 >index 00000000000..eed4455277d >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/post_sub_buffer/PostSubBuffer.cpp >@@ -0,0 +1,167 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+// Based on Simple_VertexShader.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+#include "texture_utils.h" >+#include "util/Matrix.h" >+#include "util/geometry_utils.h" >+#include "util/shader_utils.h" >+ >+#include <cmath> >+#include <iostream> >+ >+class PostSubBufferSample : public SampleApplication >+{ >+ public: >+ PostSubBufferSample(int argc, char **argv) : SampleApplication("PostSubBuffer", argc, argv) {} >+ >+ bool initialize() override >+ { >+ mPostSubBufferNV = (PFNEGLPOSTSUBBUFFERNVPROC)eglGetProcAddress("eglPostSubBufferNV"); >+ if (!mPostSubBufferNV) >+ { >+ std::cerr << "Could not load eglPostSubBufferNV."; >+ return false; >+ } >+ >+ constexpr char kVS[] = R"(uniform mat4 u_mvpMatrix; >+attribute vec4 a_position; >+attribute vec2 a_texcoord; >+varying vec2 v_texcoord; >+void main() >+{ >+ gl_Position = u_mvpMatrix * a_position; >+ v_texcoord = a_texcoord; >+})"; >+ >+ constexpr char kFS[] = R"(precision mediump float; >+varying vec2 v_texcoord; >+void main() >+{ >+ gl_FragColor = vec4(v_texcoord.x, v_texcoord.y, 1.0, 1.0); >+})"; >+ >+ mProgram = CompileProgram(kVS, kFS); >+ if (!mProgram) >+ { >+ return false; >+ } >+ >+ // Get the attribute locations >+ mPositionLoc = glGetAttribLocation(mProgram, "a_position"); >+ mTexcoordLoc = glGetAttribLocation(mProgram, "a_texcoord"); >+ >+ // Get the uniform locations >+ mMVPMatrixLoc = glGetUniformLocation(mProgram, "u_mvpMatrix"); >+ >+ // Generate the geometry data >+ GenerateCubeGeometry(0.5f, &mCube); >+ >+ // Set an initial rotation >+ mRotation = 45.0f; >+ >+ // Clear the whole window surface to blue. >+ glClearColor(0.0f, 0.0f, 1.0f, 0.0f); >+ glClear(GL_COLOR_BUFFER_BIT); >+ SampleApplication::swap(); >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ glCullFace(GL_BACK); >+ glEnable(GL_CULL_FACE); >+ >+ return true; >+ } >+ >+ void destroy() override { glDeleteProgram(mProgram); } >+ >+ void step(float dt, double totalTime) override >+ { >+ mRotation = fmod(mRotation + (dt * 40.0f), 360.0f); >+ >+ Matrix4 perspectiveMatrix = Matrix4::perspective( >+ 60.0f, float(getWindow()->getWidth()) / getWindow()->getHeight(), 1.0f, 20.0f); >+ >+ Matrix4 modelMatrix = Matrix4::translate(angle::Vector3(0.0f, 0.0f, -2.0f)) * >+ Matrix4::rotate(mRotation, angle::Vector3(1.0f, 0.0f, 1.0f)); >+ >+ Matrix4 viewMatrix = Matrix4::identity(); >+ >+ Matrix4 mvpMatrix = perspectiveMatrix * viewMatrix * modelMatrix; >+ >+ // Load the matrices >+ glUniformMatrix4fv(mMVPMatrixLoc, 1, GL_FALSE, mvpMatrix.data); >+ } >+ >+ void draw() override >+ { >+ // Set the viewport >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ // Load the vertex position >+ glVertexAttribPointer(mPositionLoc, 3, GL_FLOAT, GL_FALSE, 0, mCube.positions.data()); >+ glEnableVertexAttribArray(mPositionLoc); >+ >+ // Load the texcoord data >+ glVertexAttribPointer(mTexcoordLoc, 2, GL_FLOAT, GL_FALSE, 0, mCube.texcoords.data()); >+ glEnableVertexAttribArray(mTexcoordLoc); >+ >+ // Draw the cube >+ glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(mCube.indices.size()), GL_UNSIGNED_SHORT, >+ mCube.indices.data()); >+ } >+ >+ void swap() override >+ { >+ // Instead of letting the application call eglSwapBuffers, call eglPostSubBufferNV here >+ // instead >+ EGLint windowWidth = static_cast<EGLint>(getWindow()->getWidth()); >+ EGLint windowHeight = static_cast<EGLint>(getWindow()->getHeight()); >+ EGLDisplay display = getDisplay(); >+ EGLSurface surface = getSurface(); >+ mPostSubBufferNV(display, surface, 60, 60, windowWidth - 120, windowHeight - 120); >+ } >+ >+ private: >+ // Handle to a program object >+ GLuint mProgram; >+ >+ // Attribute locations >+ GLint mPositionLoc; >+ GLint mTexcoordLoc; >+ >+ // Uniform locations >+ GLuint mMVPMatrixLoc; >+ >+ // Current rotation >+ float mRotation; >+ >+ // Geometry data >+ CubeGeometry mCube; >+ >+ // eglPostSubBufferNV entry point >+ PFNEGLPOSTSUBBUFFERNVPROC mPostSubBufferNV; >+}; >+ >+int main(int argc, char **argv) >+{ >+ PostSubBufferSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/sample_util/SampleApplication.cpp b/Source/ThirdParty/ANGLE/samples/sample_util/SampleApplication.cpp >new file mode 100644 >index 00000000000..6e7bb3b7088 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/sample_util/SampleApplication.cpp >@@ -0,0 +1,211 @@ >+// >+// Copyright (c) 2013 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. >+// >+ >+#include "SampleApplication.h" >+ >+#include "util/EGLWindow.h" >+#include "util/gles_loader_autogen.h" >+#include "util/random_utils.h" >+#include "util/system_utils.h" >+ >+#include <string.h> >+#include <iostream> >+#include <utility> >+ >+namespace >+{ >+const char *kUseAngleArg = "--use-angle="; >+ >+using DisplayTypeInfo = std::pair<const char *, EGLint>; >+ >+const DisplayTypeInfo kDisplayTypes[] = { >+ {"d3d9", EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE}, {"d3d11", EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE}, >+ {"gl", EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE}, {"gles", EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE}, >+ {"null", EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE}, {"vulkan", EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE}}; >+ >+EGLint GetDisplayTypeFromArg(const char *displayTypeArg) >+{ >+ for (const auto &displayTypeInfo : kDisplayTypes) >+ { >+ if (strcmp(displayTypeInfo.first, displayTypeArg) == 0) >+ { >+ std::cout << "Using ANGLE back-end API: " << displayTypeInfo.first << std::endl; >+ return displayTypeInfo.second; >+ } >+ } >+ >+ std::cout << "Unknown ANGLE back-end API: " << displayTypeArg << std::endl; >+ return EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE; >+} >+} // anonymous namespace >+ >+SampleApplication::SampleApplication(std::string name, >+ int argc, >+ char **argv, >+ EGLint glesMajorVersion, >+ EGLint glesMinorVersion, >+ size_t width, >+ size_t height) >+ : mName(std::move(name)), >+ mWidth(width), >+ mHeight(height), >+ mRunning(false), >+ mEGLWindow(nullptr), >+ mOSWindow(nullptr) >+{ >+ mPlatformParams.majorVersion = glesMajorVersion; >+ mPlatformParams.minorVersion = glesMinorVersion; >+ mPlatformParams.renderer = EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE; >+ >+ if (argc > 1 && strncmp(argv[1], kUseAngleArg, strlen(kUseAngleArg)) == 0) >+ { >+ mPlatformParams.renderer = GetDisplayTypeFromArg(argv[1] + strlen(kUseAngleArg)); >+ } >+ >+ // Load EGL library so we can initialize the display. >+ mEntryPointsLib.reset(angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME)); >+ >+ mEGLWindow = EGLWindow::New(glesMajorVersion, glesMinorVersion); >+ mTimer.reset(CreateTimer()); >+ mOSWindow = OSWindow::New(); >+} >+ >+SampleApplication::~SampleApplication() >+{ >+ EGLWindow::Delete(&mEGLWindow); >+ OSWindow::Delete(&mOSWindow); >+} >+ >+bool SampleApplication::initialize() >+{ >+ return true; >+} >+ >+void SampleApplication::destroy() {} >+ >+void SampleApplication::step(float dt, double totalTime) {} >+ >+void SampleApplication::draw() {} >+ >+void SampleApplication::swap() >+{ >+ mEGLWindow->swap(); >+} >+ >+OSWindow *SampleApplication::getWindow() const >+{ >+ return mOSWindow; >+} >+ >+EGLConfig SampleApplication::getConfig() const >+{ >+ return mEGLWindow->getConfig(); >+} >+ >+EGLDisplay SampleApplication::getDisplay() const >+{ >+ return mEGLWindow->getDisplay(); >+} >+ >+EGLSurface SampleApplication::getSurface() const >+{ >+ return mEGLWindow->getSurface(); >+} >+ >+EGLContext SampleApplication::getContext() const >+{ >+ return mEGLWindow->getContext(); >+} >+ >+int SampleApplication::run() >+{ >+ if (!mOSWindow->initialize(mName, mWidth, mHeight)) >+ { >+ return -1; >+ } >+ >+ mOSWindow->setVisible(true); >+ >+ ConfigParameters configParams; >+ configParams.redBits = 8; >+ configParams.greenBits = 8; >+ configParams.blueBits = 8; >+ configParams.alphaBits = 8; >+ configParams.depthBits = 24; >+ configParams.stencilBits = 8; >+ >+ if (!mEGLWindow->initializeGL(mOSWindow, mEntryPointsLib.get(), mPlatformParams, configParams)) >+ { >+ return -1; >+ } >+ >+ // Disable vsync >+ if (!mEGLWindow->setSwapInterval(0)) >+ { >+ return -1; >+ } >+ >+ angle::LoadGLES(eglGetProcAddress); >+ >+ mRunning = true; >+ int result = 0; >+ >+ if (!initialize()) >+ { >+ mRunning = false; >+ result = -1; >+ } >+ >+ mTimer->start(); >+ double prevTime = 0.0; >+ >+ while (mRunning) >+ { >+ double elapsedTime = mTimer->getElapsedTime(); >+ double deltaTime = elapsedTime - prevTime; >+ >+ step(static_cast<float>(deltaTime), elapsedTime); >+ >+ // Clear events that the application did not process from this frame >+ Event event; >+ while (popEvent(&event)) >+ { >+ // If the application did not catch a close event, close now >+ if (event.Type == Event::EVENT_CLOSED) >+ { >+ exit(); >+ } >+ } >+ >+ if (!mRunning) >+ { >+ break; >+ } >+ >+ draw(); >+ swap(); >+ >+ mOSWindow->messageLoop(); >+ >+ prevTime = elapsedTime; >+ } >+ >+ destroy(); >+ mEGLWindow->destroyGL(); >+ mOSWindow->destroy(); >+ >+ return result; >+} >+ >+void SampleApplication::exit() >+{ >+ mRunning = false; >+} >+ >+bool SampleApplication::popEvent(Event *event) >+{ >+ return mOSWindow->popEvent(event); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/sample_util/SampleApplication.h b/Source/ThirdParty/ANGLE/samples/sample_util/SampleApplication.h >new file mode 100644 >index 00000000000..65201d6747a >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/sample_util/SampleApplication.h >@@ -0,0 +1,74 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+#ifndef SAMPLE_UTIL_SAMPLE_APPLICATION_H >+#define SAMPLE_UTIL_SAMPLE_APPLICATION_H >+ >+#include <stdint.h> >+#include <list> >+#include <memory> >+#include <string> >+ >+#include "util/EGLPlatformParameters.h" >+#include "util/OSWindow.h" >+#include "util/Timer.h" >+#include "util/egl_loader_autogen.h" >+ >+class EGLWindow; >+ >+namespace angle >+{ >+class Library; >+} // namespace angle >+ >+class SampleApplication >+{ >+ public: >+ SampleApplication(std::string name, >+ int argc, >+ char **argv, >+ EGLint glesMajorVersion = 2, >+ EGLint glesMinorVersion = 0, >+ size_t width = 1280, >+ size_t height = 720); >+ virtual ~SampleApplication(); >+ >+ virtual bool initialize(); >+ virtual void destroy(); >+ >+ virtual void step(float dt, double totalTime); >+ virtual void draw(); >+ >+ virtual void swap(); >+ >+ OSWindow *getWindow() const; >+ EGLConfig getConfig() const; >+ EGLDisplay getDisplay() const; >+ EGLSurface getSurface() const; >+ EGLContext getContext() const; >+ >+ bool popEvent(Event *event); >+ >+ int run(); >+ void exit(); >+ >+ private: >+ std::string mName; >+ size_t mWidth; >+ size_t mHeight; >+ bool mRunning; >+ >+ std::unique_ptr<Timer> mTimer; >+ EGLWindow *mEGLWindow; >+ OSWindow *mOSWindow; >+ >+ EGLPlatformParameters mPlatformParams; >+ >+ // Handle to the entry point binding library. >+ std::unique_ptr<angle::Library> mEntryPointsLib; >+}; >+ >+#endif // SAMPLE_UTIL_SAMPLE_APPLICATION_H >diff --git a/Source/ThirdParty/ANGLE/samples/sample_util/texture_utils.cpp b/Source/ThirdParty/ANGLE/samples/sample_util/texture_utils.cpp >new file mode 100644 >index 00000000000..24cc66be796 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/sample_util/texture_utils.cpp >@@ -0,0 +1,130 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+#include "texture_utils.h" >+#include <array> >+ >+GLuint CreateSimpleTexture2D() >+{ >+ // Use tightly packed data >+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1); >+ >+ // Generate a texture object >+ GLuint texture; >+ glGenTextures(1, &texture); >+ >+ // Bind the texture object >+ glBindTexture(GL_TEXTURE_2D, texture); >+ >+ // Load the texture: 2x2 Image, 3 bytes per pixel (R, G, B) >+ const size_t width = 2; >+ const size_t height = 2; >+ GLubyte pixels[width * height * 3] = >+ { >+ 255, 0, 0, // Red >+ 0, 255, 0, // Green >+ 0, 0, 255, // Blue >+ 255, 255, 0, // Yellow >+ }; >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels); >+ >+ // Set the filtering mode >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); >+ >+ return texture; >+} >+ >+GLuint CreateSimpleTextureCubemap() >+{ >+ // Generate a texture object >+ GLuint texture; >+ glGenTextures(1, &texture); >+ >+ // Bind the texture object >+ glBindTexture(GL_TEXTURE_CUBE_MAP, texture); >+ >+ // Load the texture faces >+ GLubyte pixels[6][3] = >+ { >+ // Face 0 - Red >+ { 255, 0, 0 }, >+ // Face 1 - Green, >+ { 0, 255, 0 }, >+ // Face 3 - Blue >+ { 0, 0, 255 }, >+ // Face 4 - Yellow >+ { 255, 255, 0 }, >+ // Face 5 - Purple >+ { 255, 0, 255 }, >+ // Face 6 - White >+ { 255, 255, 255 } >+ }; >+ >+ for (size_t i = 0; i < 6; i++) >+ { >+ glTexImage2D(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i), 0, GL_RGB, 1, 1, 0, >+ GL_RGB, GL_UNSIGNED_BYTE, &pixels[i]); >+ } >+ >+ // Set the filtering mode >+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); >+ >+ return texture; >+} >+ >+GLuint CreateMipMappedTexture2D() >+{ >+ // Texture object handle >+ const size_t width = 256; >+ const size_t height = 256; >+ std::array<GLubyte, width * height * 3> pixels; >+ >+ const size_t checkerSize = 8; >+ for (size_t y = 0; y < height; y++) >+ { >+ for (size_t x = 0; x < width; x++) >+ { >+ GLubyte rColor = 0; >+ GLubyte bColor = 0; >+ >+ if ((x / checkerSize) % 2 == 0) >+ { >+ rColor = 255 * ((y / checkerSize) % 2); >+ bColor = 255 * (1 - ((y / checkerSize) % 2)); >+ } >+ else >+ { >+ bColor = 255 * ((y / checkerSize) % 2); >+ rColor = 255 * (1 - ((y / checkerSize) % 2)); >+ } >+ >+ pixels[(y * height + x) * 3] = rColor; >+ pixels[(y * height + x) * 3 + 1] = 0; >+ pixels[(y * height + x) * 3 + 2] = bColor; >+ } >+ } >+ >+ // Generate a texture object >+ GLuint texture; >+ glGenTextures(1, &texture); >+ >+ // Bind the texture object >+ glBindTexture(GL_TEXTURE_2D, texture); >+ >+ // Load mipmap level 0 >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels.data()); >+ >+ // Generate mipmaps >+ glGenerateMipmap(GL_TEXTURE_2D); >+ >+ // Set the filtering mode >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); >+ >+ return texture; >+} >diff --git a/Source/ThirdParty/ANGLE/samples/sample_util/texture_utils.h b/Source/ThirdParty/ANGLE/samples/sample_util/texture_utils.h >new file mode 100644 >index 00000000000..90bc1139494 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/sample_util/texture_utils.h >@@ -0,0 +1,17 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+#ifndef SAMPLE_UTIL_TEXTURE_UTILS_H >+#define SAMPLE_UTIL_TEXTURE_UTILS_H >+ >+#include "util/gles_loader_autogen.h" >+ >+GLuint CreateSimpleTexture2D(); >+GLuint CreateSimpleTextureCubemap(); >+ >+GLuint CreateMipMappedTexture2D(); >+ >+#endif // SAMPLE_UTIL_TEXTURE_UTILS_H >diff --git a/Source/ThirdParty/ANGLE/samples/sample_util/tga_utils.cpp b/Source/ThirdParty/ANGLE/samples/sample_util/tga_utils.cpp >new file mode 100644 >index 00000000000..41a6d244eb3 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/sample_util/tga_utils.cpp >@@ -0,0 +1,123 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+#include "tga_utils.h" >+ >+#include <fstream> >+#include <iostream> >+#include <limits.h> >+#include <stdint.h> >+#include <string> >+ >+TGAImage::TGAImage() >+ : width(0), height(0), data(0) >+{ >+} >+ >+struct TGAHeader >+{ >+ uint8_t idSize; >+ uint8_t mapType; >+ uint8_t imageType; >+ uint16_t paletteStart; >+ uint16_t paletteSize; >+ uint8_t paletteEntryDepth; >+ uint16_t x; >+ uint16_t y; >+ uint16_t width; >+ uint16_t height; >+ uint8_t colorDepth; >+ uint8_t descriptor; >+}; >+ >+#define INVERTED_BIT (1 << 5) >+ >+template <typename dataType> >+void readBinary(std::ifstream &stream, dataType &item) >+{ >+ stream.read(reinterpret_cast<char *>(&item), sizeof(dataType)); >+} >+ >+template <typename dataType> >+void readBinary(std::ifstream &stream, std::vector<dataType> &items) >+{ >+ stream.read(reinterpret_cast<char *>(items.data()), sizeof(dataType) * items.size()); >+} >+ >+bool LoadTGAImageFromFile(const std::string &path, TGAImage *image) >+{ >+ std::ifstream stream(path, std::ios::binary); >+ if (!stream) >+ { >+ std::cerr << "error opening tga file " << path << " for reading.\n"; >+ return false; >+ } >+ >+ TGAHeader header; >+ readBinary(stream, header.idSize); >+ readBinary(stream, header.mapType); >+ readBinary(stream, header.imageType); >+ readBinary(stream, header.paletteStart); >+ readBinary(stream, header.paletteSize); >+ readBinary(stream, header.paletteEntryDepth); >+ readBinary(stream, header.x); >+ readBinary(stream, header.y); >+ readBinary(stream, header.width); >+ readBinary(stream, header.height); >+ readBinary(stream, header.colorDepth); >+ readBinary(stream, header.descriptor); >+ >+ image->width = header.width; >+ image->height = header.height; >+ >+ size_t pixelComponentCount = header.colorDepth / CHAR_BIT; >+ std::vector<unsigned char> buffer(header.width * header.height * pixelComponentCount); >+ readBinary(stream, buffer); >+ >+ image->data.reserve(header.width * header.height); >+ >+ for (size_t y = 0; y < header.height; y++) >+ { >+ size_t rowIdx = ((header.descriptor & INVERTED_BIT) ? (header.height - 1 - y) : y) * header.width * pixelComponentCount; >+ for (size_t x = 0; x < header.width; x++) >+ { >+ size_t pixelIdx = rowIdx + x * pixelComponentCount; >+ >+ Byte4 pixel; >+ pixel[0] = (pixelComponentCount > 2) ? buffer[pixelIdx + 2] : 0; >+ pixel[2] = (pixelComponentCount > 0) ? buffer[pixelIdx + 0] : 0; >+ pixel[1] = (pixelComponentCount > 1) ? buffer[pixelIdx + 1] : 0; >+ pixel[3] = (pixelComponentCount > 3) ? buffer[pixelIdx + 3] : 255; >+ >+ image->data.push_back(pixel); >+ } >+ } >+ >+ std::cout << "loaded image " << path << ".\n"; >+ >+ return true; >+} >+ >+GLuint LoadTextureFromTGAImage(const TGAImage &image) >+{ >+ if (image.width > 0 && image.height > 0) >+ { >+ GLuint texture; >+ glGenTextures(1, &texture); >+ glBindTexture(GL_TEXTURE_2D, texture); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); >+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1); >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, static_cast<GLsizei>(image.width), static_cast<GLsizei>(image.height), 0, >+ GL_RGBA, GL_UNSIGNED_BYTE, image.data.data()); >+ glGenerateMipmap(GL_TEXTURE_2D); >+ return texture; >+ } >+ else >+ { >+ return 0; >+ } >+} >diff --git a/Source/ThirdParty/ANGLE/samples/sample_util/tga_utils.h b/Source/ThirdParty/ANGLE/samples/sample_util/tga_utils.h >new file mode 100644 >index 00000000000..53a42830301 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/sample_util/tga_utils.h >@@ -0,0 +1,29 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+#ifndef SAMPLE_UTIL_TGA_UTILS_HPP >+#define SAMPLE_UTIL_TGA_UTILS_HPP >+ >+#include <array> >+#include <vector> >+ >+#include "util/gles_loader_autogen.h" >+ >+typedef std::array<unsigned char, 4> Byte4; >+ >+struct TGAImage >+{ >+ size_t width; >+ size_t height; >+ std::vector<Byte4> data; >+ >+ TGAImage(); >+}; >+ >+bool LoadTGAImageFromFile(const std::string &path, TGAImage *image); >+GLuint LoadTextureFromTGAImage(const TGAImage &image); >+ >+#endif // SAMPLE_UTIL_TGA_UTILS_HPP >diff --git a/Source/ThirdParty/ANGLE/samples/shader_translator/shader_translator.cpp b/Source/ThirdParty/ANGLE/samples/shader_translator/shader_translator.cpp >new file mode 100644 >index 00000000000..a5528122968 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/shader_translator/shader_translator.cpp >@@ -0,0 +1,829 @@ >+// >+// Copyright (c) 2002-2013 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. >+// >+ >+#include "GLSLANG/ShaderLang.h" >+ >+#include <assert.h> >+#include <math.h> >+#include <stdio.h> >+#include <stdlib.h> >+#include <string.h> >+#include <sstream> >+#include <vector> >+#include "angle_gl.h" >+ >+// >+// Return codes from main. >+// >+enum TFailCode >+{ >+ ESuccess = 0, >+ EFailUsage, >+ EFailCompile, >+ EFailCompilerCreate, >+}; >+ >+static void usage(); >+static sh::GLenum FindShaderType(const char *fileName); >+static bool CompileFile(char *fileName, ShHandle compiler, ShCompileOptions compileOptions); >+static void LogMsg(const char *msg, const char *name, const int num, const char *logName); >+static void PrintVariable(const std::string &prefix, size_t index, const sh::ShaderVariable &var); >+static void PrintActiveVariables(ShHandle compiler); >+ >+// If NUM_SOURCE_STRINGS is set to a value > 1, the input file data is >+// broken into that many chunks. This will affect file/line numbering in >+// the preprocessor. >+const unsigned int NUM_SOURCE_STRINGS = 1; >+typedef std::vector<char *> ShaderSource; >+static bool ReadShaderSource(const char *fileName, ShaderSource &source); >+static void FreeShaderSource(ShaderSource &source); >+ >+static bool ParseGLSLOutputVersion(const std::string &, ShShaderOutput *outResult); >+static bool ParseIntValue(const std::string &, int emptyDefault, int *outValue); >+ >+// >+// Set up the per compile resources >+// >+void GenerateResources(ShBuiltInResources *resources) >+{ >+ sh::InitBuiltInResources(resources); >+ >+ resources->MaxVertexAttribs = 8; >+ resources->MaxVertexUniformVectors = 128; >+ resources->MaxVaryingVectors = 8; >+ resources->MaxVertexTextureImageUnits = 0; >+ resources->MaxCombinedTextureImageUnits = 8; >+ resources->MaxTextureImageUnits = 8; >+ resources->MaxFragmentUniformVectors = 16; >+ resources->MaxDrawBuffers = 1; >+ resources->MaxDualSourceDrawBuffers = 1; >+ >+ resources->OES_standard_derivatives = 0; >+ resources->OES_EGL_image_external = 0; >+ resources->EXT_geometry_shader = 1; >+ resources->ANGLE_texture_multisample = 0; >+} >+ >+int main(int argc, char *argv[]) >+{ >+ TFailCode failCode = ESuccess; >+ >+ ShCompileOptions compileOptions = 0; >+ int numCompiles = 0; >+ ShHandle vertexCompiler = 0; >+ ShHandle fragmentCompiler = 0; >+ ShHandle computeCompiler = 0; >+ ShHandle geometryCompiler = 0; >+ ShShaderSpec spec = SH_GLES2_SPEC; >+ ShShaderOutput output = SH_ESSL_OUTPUT; >+ >+ sh::Initialize(); >+ >+ ShBuiltInResources resources; >+ GenerateResources(&resources); >+ >+ argc--; >+ argv++; >+ for (; (argc >= 1) && (failCode == ESuccess); argc--, argv++) >+ { >+ if (argv[0][0] == '-') >+ { >+ switch (argv[0][1]) >+ { >+ case 'i': >+ compileOptions |= SH_INTERMEDIATE_TREE; >+ break; >+ case 'o': >+ compileOptions |= SH_OBJECT_CODE; >+ break; >+ case 'u': >+ compileOptions |= SH_VARIABLES; >+ break; >+ case 'p': >+ resources.WEBGL_debug_shader_precision = 1; >+ break; >+ case 's': >+ if (argv[0][2] == '=') >+ { >+ switch (argv[0][3]) >+ { >+ case 'e': >+ if (argv[0][4] == '3') >+ { >+ if (argv[0][5] == '1') >+ { >+ spec = SH_GLES3_1_SPEC; >+ } >+ else >+ { >+ spec = SH_GLES3_SPEC; >+ } >+ } >+ else >+ { >+ spec = SH_GLES2_SPEC; >+ } >+ break; >+ case 'w': >+ if (argv[0][4] == '3') >+ { >+ spec = SH_WEBGL3_SPEC; >+ } >+ else if (argv[0][4] == '2') >+ { >+ spec = SH_WEBGL2_SPEC; >+ } >+ else if (argv[0][4] == 'n') >+ { >+ spec = SH_WEBGL_SPEC; >+ } >+ else >+ { >+ spec = SH_WEBGL_SPEC; >+ resources.FragmentPrecisionHigh = 1; >+ } >+ break; >+ default: >+ failCode = EFailUsage; >+ } >+ } >+ else >+ { >+ failCode = EFailUsage; >+ } >+ break; >+ case 'b': >+ if (argv[0][2] == '=') >+ { >+ switch (argv[0][3]) >+ { >+ case 'e': >+ output = SH_ESSL_OUTPUT; >+ compileOptions |= SH_INITIALIZE_UNINITIALIZED_LOCALS; >+ break; >+ case 'g': >+ if (!ParseGLSLOutputVersion(&argv[0][sizeof("-b=g") - 1], &output)) >+ { >+ failCode = EFailUsage; >+ } >+ compileOptions |= SH_INITIALIZE_UNINITIALIZED_LOCALS; >+ break; >+ case 'h': >+ if (argv[0][4] == '1' && argv[0][5] == '1') >+ { >+ output = SH_HLSL_4_1_OUTPUT; >+ } >+ else >+ { >+ output = SH_HLSL_3_0_OUTPUT; >+ } >+ break; >+ default: >+ failCode = EFailUsage; >+ } >+ } >+ else >+ { >+ failCode = EFailUsage; >+ } >+ break; >+ case 'x': >+ if (argv[0][2] == '=') >+ { >+ // clang-format off >+ switch (argv[0][3]) >+ { >+ case 'i': resources.OES_EGL_image_external = 1; break; >+ case 'd': resources.OES_standard_derivatives = 1; break; >+ case 'r': resources.ARB_texture_rectangle = 1; break; >+ case 'b': >+ if (ParseIntValue(&argv[0][sizeof("-x=b") - 1], 1, >+ &resources.MaxDualSourceDrawBuffers)) >+ { >+ resources.EXT_blend_func_extended = 1; >+ } >+ else >+ { >+ failCode = EFailUsage; >+ } >+ break; >+ case 'w': >+ if (ParseIntValue(&argv[0][sizeof("-x=w") - 1], 1, >+ &resources.MaxDrawBuffers)) >+ { >+ resources.EXT_draw_buffers = 1; >+ } >+ else >+ { >+ failCode = EFailUsage; >+ } >+ break; >+ case 'g': resources.EXT_frag_depth = 1; break; >+ case 'l': resources.EXT_shader_texture_lod = 1; break; >+ case 'f': resources.EXT_shader_framebuffer_fetch = 1; break; >+ case 'n': resources.NV_shader_framebuffer_fetch = 1; break; >+ case 'a': resources.ARM_shader_framebuffer_fetch = 1; break; >+ case 'm': >+ resources.OVR_multiview2 = 1; >+ compileOptions |= SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW; >+ compileOptions |= SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER; >+ break; >+ case 'y': resources.EXT_YUV_target = 1; break; >+ default: failCode = EFailUsage; >+ } >+ // clang-format on >+ } >+ else >+ { >+ failCode = EFailUsage; >+ } >+ break; >+ default: >+ failCode = EFailUsage; >+ } >+ } >+ else >+ { >+ if (spec != SH_GLES2_SPEC && spec != SH_WEBGL_SPEC) >+ { >+ resources.MaxDrawBuffers = 8; >+ resources.MaxVertexTextureImageUnits = 16; >+ resources.MaxTextureImageUnits = 16; >+ } >+ ShHandle compiler = 0; >+ switch (FindShaderType(argv[0])) >+ { >+ case GL_VERTEX_SHADER: >+ if (vertexCompiler == 0) >+ { >+ vertexCompiler = >+ sh::ConstructCompiler(GL_VERTEX_SHADER, spec, output, &resources); >+ } >+ compiler = vertexCompiler; >+ break; >+ case GL_FRAGMENT_SHADER: >+ if (fragmentCompiler == 0) >+ { >+ fragmentCompiler = >+ sh::ConstructCompiler(GL_FRAGMENT_SHADER, spec, output, &resources); >+ } >+ compiler = fragmentCompiler; >+ break; >+ case GL_COMPUTE_SHADER: >+ if (computeCompiler == 0) >+ { >+ computeCompiler = >+ sh::ConstructCompiler(GL_COMPUTE_SHADER, spec, output, &resources); >+ } >+ compiler = computeCompiler; >+ break; >+ case GL_GEOMETRY_SHADER_EXT: >+ if (geometryCompiler == 0) >+ { >+ geometryCompiler = >+ sh::ConstructCompiler(GL_GEOMETRY_SHADER_EXT, spec, output, &resources); >+ } >+ compiler = geometryCompiler; >+ break; >+ default: >+ break; >+ } >+ if (compiler) >+ { >+ switch (output) >+ { >+ case SH_HLSL_3_0_OUTPUT: >+ case SH_HLSL_4_1_OUTPUT: >+ case SH_HLSL_4_0_FL9_3_OUTPUT: >+ compileOptions &= ~SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER; >+ break; >+ default: >+ break; >+ } >+ >+ bool compiled = CompileFile(argv[0], compiler, compileOptions); >+ >+ LogMsg("BEGIN", "COMPILER", numCompiles, "INFO LOG"); >+ std::string log = sh::GetInfoLog(compiler); >+ puts(log.c_str()); >+ LogMsg("END", "COMPILER", numCompiles, "INFO LOG"); >+ printf("\n\n"); >+ >+ if (compiled && (compileOptions & SH_OBJECT_CODE)) >+ { >+ LogMsg("BEGIN", "COMPILER", numCompiles, "OBJ CODE"); >+ std::string code = sh::GetObjectCode(compiler); >+ puts(code.c_str()); >+ LogMsg("END", "COMPILER", numCompiles, "OBJ CODE"); >+ printf("\n\n"); >+ } >+ if (compiled && (compileOptions & SH_VARIABLES)) >+ { >+ LogMsg("BEGIN", "COMPILER", numCompiles, "VARIABLES"); >+ PrintActiveVariables(compiler); >+ LogMsg("END", "COMPILER", numCompiles, "VARIABLES"); >+ printf("\n\n"); >+ } >+ if (!compiled) >+ failCode = EFailCompile; >+ ++numCompiles; >+ } >+ else >+ { >+ failCode = EFailCompilerCreate; >+ } >+ } >+ } >+ >+ if ((vertexCompiler == 0) && (fragmentCompiler == 0) && (computeCompiler == 0) && >+ (geometryCompiler == 0)) >+ failCode = EFailUsage; >+ if (failCode == EFailUsage) >+ usage(); >+ >+ if (vertexCompiler) >+ sh::Destruct(vertexCompiler); >+ if (fragmentCompiler) >+ sh::Destruct(fragmentCompiler); >+ if (computeCompiler) >+ sh::Destruct(computeCompiler); >+ if (geometryCompiler) >+ sh::Destruct(geometryCompiler); >+ >+ sh::Finalize(); >+ >+ return failCode; >+} >+ >+// >+// print usage to stdout >+// >+void usage() >+{ >+ // clang-format off >+ printf( >+ "Usage: translate [-i -o -u -l -p -b=e -b=g -b=h9 -x=i -x=d] file1 file2 ...\n" >+ "Where: filename : filename ending in .frag or .vert\n" >+ " -i : print intermediate tree\n" >+ " -o : print translated code\n" >+ " -u : print active attribs, uniforms, varyings and program outputs\n" >+ " -p : use precision emulation\n" >+ " -s=e2 : use GLES2 spec (this is by default)\n" >+ " -s=e3 : use GLES3 spec\n" >+ " -s=e31 : use GLES31 spec (in development)\n" >+ " -s=w : use WebGL 1.0 spec\n" >+ " -s=wn : use WebGL 1.0 spec with no highp support in fragment shaders\n" >+ " -s=w2 : use WebGL 2.0 spec\n" >+ " -b=e : output GLSL ES code (this is by default)\n" >+ " -b=g : output GLSL code (compatibility profile)\n" >+ " -b=g[NUM]: output GLSL code (NUM can be 130, 140, 150, 330, 400, 410, 420, 430, " >+ "440, 450)\n" >+ " -b=h9 : output HLSL9 code\n" >+ " -b=h11 : output HLSL11 code\n" >+ " -x=i : enable GL_OES_EGL_image_external\n" >+ " -x=d : enable GL_OES_EGL_standard_derivatives\n" >+ " -x=r : enable ARB_texture_rectangle\n" >+ " -x=b[NUM]: enable EXT_blend_func_extended (NUM default 1)\n" >+ " -x=w[NUM]: enable EXT_draw_buffers (NUM default 1)\n" >+ " -x=g : enable EXT_frag_depth\n" >+ " -x=l : enable EXT_shader_texture_lod\n" >+ " -x=f : enable EXT_shader_framebuffer_fetch\n" >+ " -x=n : enable NV_shader_framebuffer_fetch\n" >+ " -x=a : enable ARM_shader_framebuffer_fetch\n" >+ " -x=m : enable OVR_multiview\n" >+ " -x=y : enable YUV_target\n"); >+ // clang-format on >+} >+ >+// >+// Deduce the shader type from the filename. Files must end in one of the >+// following extensions: >+// >+// .frag* = fragment shader >+// .vert* = vertex shader >+// >+sh::GLenum FindShaderType(const char *fileName) >+{ >+ assert(fileName); >+ >+ const char *ext = strrchr(fileName, '.'); >+ >+ if (ext && strcmp(ext, ".sl") == 0) >+ for (; ext > fileName && ext[0] != '.'; ext--) >+ ; >+ >+ ext = strrchr(fileName, '.'); >+ if (ext) >+ { >+ if (strncmp(ext, ".frag", 5) == 0) >+ return GL_FRAGMENT_SHADER; >+ if (strncmp(ext, ".vert", 5) == 0) >+ return GL_VERTEX_SHADER; >+ if (strncmp(ext, ".comp", 5) == 0) >+ return GL_COMPUTE_SHADER; >+ if (strncmp(ext, ".geom", 5) == 0) >+ return GL_GEOMETRY_SHADER_EXT; >+ } >+ >+ return GL_FRAGMENT_SHADER; >+} >+ >+// >+// Read a file's data into a string, and compile it using sh::Compile >+// >+bool CompileFile(char *fileName, ShHandle compiler, ShCompileOptions compileOptions) >+{ >+ ShaderSource source; >+ if (!ReadShaderSource(fileName, source)) >+ return false; >+ >+ int ret = sh::Compile(compiler, &source[0], source.size(), compileOptions); >+ >+ FreeShaderSource(source); >+ return ret ? true : false; >+} >+ >+void LogMsg(const char *msg, const char *name, const int num, const char *logName) >+{ >+ printf("#### %s %s %d %s ####\n", msg, name, num, logName); >+} >+ >+void PrintVariable(const std::string &prefix, size_t index, const sh::ShaderVariable &var) >+{ >+ std::string typeName; >+ switch (var.type) >+ { >+ case GL_FLOAT: >+ typeName = "GL_FLOAT"; >+ break; >+ case GL_FLOAT_VEC2: >+ typeName = "GL_FLOAT_VEC2"; >+ break; >+ case GL_FLOAT_VEC3: >+ typeName = "GL_FLOAT_VEC3"; >+ break; >+ case GL_FLOAT_VEC4: >+ typeName = "GL_FLOAT_VEC4"; >+ break; >+ case GL_INT: >+ typeName = "GL_INT"; >+ break; >+ case GL_INT_VEC2: >+ typeName = "GL_INT_VEC2"; >+ break; >+ case GL_INT_VEC3: >+ typeName = "GL_INT_VEC3"; >+ break; >+ case GL_INT_VEC4: >+ typeName = "GL_INT_VEC4"; >+ break; >+ case GL_UNSIGNED_INT: >+ typeName = "GL_UNSIGNED_INT"; >+ break; >+ case GL_UNSIGNED_INT_VEC2: >+ typeName = "GL_UNSIGNED_INT_VEC2"; >+ break; >+ case GL_UNSIGNED_INT_VEC3: >+ typeName = "GL_UNSIGNED_INT_VEC3"; >+ break; >+ case GL_UNSIGNED_INT_VEC4: >+ typeName = "GL_UNSIGNED_INT_VEC4"; >+ break; >+ case GL_BOOL: >+ typeName = "GL_BOOL"; >+ break; >+ case GL_BOOL_VEC2: >+ typeName = "GL_BOOL_VEC2"; >+ break; >+ case GL_BOOL_VEC3: >+ typeName = "GL_BOOL_VEC3"; >+ break; >+ case GL_BOOL_VEC4: >+ typeName = "GL_BOOL_VEC4"; >+ break; >+ case GL_FLOAT_MAT2: >+ typeName = "GL_FLOAT_MAT2"; >+ break; >+ case GL_FLOAT_MAT3: >+ typeName = "GL_FLOAT_MAT3"; >+ break; >+ case GL_FLOAT_MAT4: >+ typeName = "GL_FLOAT_MAT4"; >+ break; >+ case GL_FLOAT_MAT2x3: >+ typeName = "GL_FLOAT_MAT2x3"; >+ break; >+ case GL_FLOAT_MAT3x2: >+ typeName = "GL_FLOAT_MAT3x2"; >+ break; >+ case GL_FLOAT_MAT4x2: >+ typeName = "GL_FLOAT_MAT4x2"; >+ break; >+ case GL_FLOAT_MAT2x4: >+ typeName = "GL_FLOAT_MAT2x4"; >+ break; >+ case GL_FLOAT_MAT3x4: >+ typeName = "GL_FLOAT_MAT3x4"; >+ break; >+ case GL_FLOAT_MAT4x3: >+ typeName = "GL_FLOAT_MAT4x3"; >+ break; >+ >+ case GL_SAMPLER_2D: >+ typeName = "GL_SAMPLER_2D"; >+ break; >+ case GL_SAMPLER_3D: >+ typeName = "GL_SAMPLER_3D"; >+ break; >+ case GL_SAMPLER_CUBE: >+ typeName = "GL_SAMPLER_CUBE"; >+ break; >+ case GL_SAMPLER_CUBE_SHADOW: >+ typeName = "GL_SAMPLER_CUBE_SHADOW"; >+ break; >+ case GL_SAMPLER_2D_SHADOW: >+ typeName = "GL_SAMPLER_2D_ARRAY_SHADOW"; >+ break; >+ case GL_SAMPLER_2D_ARRAY: >+ typeName = "GL_SAMPLER_2D_ARRAY"; >+ break; >+ case GL_SAMPLER_2D_ARRAY_SHADOW: >+ typeName = "GL_SAMPLER_2D_ARRAY_SHADOW"; >+ break; >+ case GL_SAMPLER_2D_MULTISAMPLE: >+ typeName = "GL_SAMPLER_2D_MULTISAMPLE"; >+ break; >+ case GL_IMAGE_2D: >+ typeName = "GL_IMAGE_2D"; >+ break; >+ case GL_IMAGE_3D: >+ typeName = "GL_IMAGE_3D"; >+ break; >+ case GL_IMAGE_CUBE: >+ typeName = "GL_IMAGE_CUBE"; >+ break; >+ case GL_IMAGE_2D_ARRAY: >+ typeName = "GL_IMAGE_2D_ARRAY"; >+ break; >+ >+ case GL_INT_SAMPLER_2D: >+ typeName = "GL_INT_SAMPLER_2D"; >+ break; >+ case GL_INT_SAMPLER_3D: >+ typeName = "GL_INT_SAMPLER_3D"; >+ break; >+ case GL_INT_SAMPLER_CUBE: >+ typeName = "GL_INT_SAMPLER_CUBE"; >+ break; >+ case GL_INT_SAMPLER_2D_ARRAY: >+ typeName = "GL_INT_SAMPLER_2D_ARRAY"; >+ break; >+ case GL_INT_SAMPLER_2D_MULTISAMPLE: >+ typeName = "GL_INT_SAMPLER_2D_MULTISAMPLE"; >+ break; >+ case GL_INT_IMAGE_2D: >+ typeName = "GL_INT_IMAGE_2D"; >+ break; >+ case GL_INT_IMAGE_3D: >+ typeName = "GL_INT_IMAGE_3D"; >+ break; >+ case GL_INT_IMAGE_CUBE: >+ typeName = "GL_INT_IMAGE_CUBE"; >+ break; >+ case GL_INT_IMAGE_2D_ARRAY: >+ typeName = "GL_INT_IMAGE_2D_ARRAY"; >+ break; >+ >+ case GL_UNSIGNED_INT_SAMPLER_2D: >+ typeName = "GL_UNSIGNED_INT_SAMPLER_2D"; >+ break; >+ case GL_UNSIGNED_INT_SAMPLER_3D: >+ typeName = "GL_UNSIGNED_INT_SAMPLER_3D"; >+ break; >+ case GL_UNSIGNED_INT_SAMPLER_CUBE: >+ typeName = "GL_UNSIGNED_INT_SAMPLER_CUBE"; >+ break; >+ case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: >+ typeName = "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY"; >+ break; >+ case GL_UNSIGNED_INT_ATOMIC_COUNTER: >+ typeName = "GL_UNSIGNED_INT_ATOMIC_COUNTER"; >+ break; >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: >+ typeName = "GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE"; >+ break; >+ case GL_UNSIGNED_INT_IMAGE_2D: >+ typeName = "GL_UNSIGNED_INT_IMAGE_2D"; >+ break; >+ case GL_UNSIGNED_INT_IMAGE_3D: >+ typeName = "GL_UNSIGNED_INT_IMAGE_3D"; >+ break; >+ case GL_UNSIGNED_INT_IMAGE_CUBE: >+ typeName = "GL_UNSIGNED_INT_IMAGE_CUBE"; >+ break; >+ case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: >+ typeName = "GL_UNSIGNED_INT_IMAGE_2D_ARRAY"; >+ break; >+ >+ case GL_SAMPLER_EXTERNAL_OES: >+ typeName = "GL_SAMPLER_EXTERNAL_OES"; >+ break; >+ case GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT: >+ typeName = "GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT"; >+ break; >+ default: >+ typeName = "UNKNOWN"; >+ break; >+ } >+ >+ printf("%s %u : name=%s, mappedName=%s, type=%s, arraySizes=", prefix.c_str(), >+ static_cast<unsigned int>(index), var.name.c_str(), var.mappedName.c_str(), >+ typeName.c_str()); >+ for (unsigned int arraySize : var.arraySizes) >+ { >+ printf("%u ", arraySize); >+ } >+ printf("\n"); >+ if (var.fields.size()) >+ { >+ std::string structPrefix; >+ for (size_t i = 0; i < prefix.size(); ++i) >+ structPrefix += ' '; >+ printf("%s struct %s\n", structPrefix.c_str(), var.structName.c_str()); >+ structPrefix += " field"; >+ for (size_t i = 0; i < var.fields.size(); ++i) >+ PrintVariable(structPrefix, i, var.fields[i]); >+ } >+} >+ >+static void PrintActiveVariables(ShHandle compiler) >+{ >+ const std::vector<sh::Uniform> *uniforms = sh::GetUniforms(compiler); >+ const std::vector<sh::Varying> *inputVaryings = sh::GetInputVaryings(compiler); >+ const std::vector<sh::Varying> *outputVaryings = sh::GetOutputVaryings(compiler); >+ const std::vector<sh::Attribute> *attributes = sh::GetAttributes(compiler); >+ const std::vector<sh::OutputVariable> *outputs = sh::GetOutputVariables(compiler); >+ for (size_t varCategory = 0; varCategory < 5; ++varCategory) >+ { >+ size_t numVars = 0; >+ std::string varCategoryName; >+ if (varCategory == 0) >+ { >+ numVars = uniforms->size(); >+ varCategoryName = "uniform"; >+ } >+ else if (varCategory == 1) >+ { >+ numVars = inputVaryings->size(); >+ varCategoryName = "input varying"; >+ } >+ else if (varCategory == 2) >+ { >+ numVars = outputVaryings->size(); >+ varCategoryName = "output varying"; >+ } >+ else if (varCategory == 3) >+ { >+ numVars = attributes->size(); >+ varCategoryName = "attribute"; >+ } >+ else >+ { >+ numVars = outputs->size(); >+ varCategoryName = "output"; >+ } >+ >+ for (size_t i = 0; i < numVars; ++i) >+ { >+ const sh::ShaderVariable *var; >+ if (varCategory == 0) >+ var = &((*uniforms)[i]); >+ else if (varCategory == 1) >+ var = &((*inputVaryings)[i]); >+ else if (varCategory == 2) >+ var = &((*outputVaryings)[i]); >+ else if (varCategory == 3) >+ var = &((*attributes)[i]); >+ else >+ var = &((*outputs)[i]); >+ >+ PrintVariable(varCategoryName, i, *var); >+ } >+ printf("\n"); >+ } >+} >+ >+static bool ReadShaderSource(const char *fileName, ShaderSource &source) >+{ >+ FILE *in = fopen(fileName, "rb"); >+ if (!in) >+ { >+ printf("Error: unable to open input file: %s\n", fileName); >+ return false; >+ } >+ >+ // Obtain file size. >+ fseek(in, 0, SEEK_END); >+ size_t count = ftell(in); >+ rewind(in); >+ >+ int len = (int)ceil((float)count / (float)NUM_SOURCE_STRINGS); >+ source.reserve(NUM_SOURCE_STRINGS); >+ // Notice the usage of do-while instead of a while loop here. >+ // It is there to handle empty files in which case a single empty >+ // string is added to vector. >+ do >+ { >+ char *data = new char[len + 1]; >+ size_t nread = fread(data, 1, len, in); >+ data[nread] = '\0'; >+ source.push_back(data); >+ >+ count -= nread; >+ } while (count > 0); >+ >+ fclose(in); >+ return true; >+} >+ >+static void FreeShaderSource(ShaderSource &source) >+{ >+ for (ShaderSource::size_type i = 0; i < source.size(); ++i) >+ { >+ delete[] source[i]; >+ } >+ source.clear(); >+} >+ >+static bool ParseGLSLOutputVersion(const std::string &num, ShShaderOutput *outResult) >+{ >+ if (num.length() == 0) >+ { >+ *outResult = SH_GLSL_COMPATIBILITY_OUTPUT; >+ return true; >+ } >+ std::istringstream input(num); >+ int value; >+ if (!(input >> value && input.eof())) >+ { >+ return false; >+ } >+ >+ switch (value) >+ { >+ case 130: >+ *outResult = SH_GLSL_130_OUTPUT; >+ return true; >+ case 140: >+ *outResult = SH_GLSL_140_OUTPUT; >+ return true; >+ case 150: >+ *outResult = SH_GLSL_150_CORE_OUTPUT; >+ return true; >+ case 330: >+ *outResult = SH_GLSL_330_CORE_OUTPUT; >+ return true; >+ case 400: >+ *outResult = SH_GLSL_400_CORE_OUTPUT; >+ return true; >+ case 410: >+ *outResult = SH_GLSL_410_CORE_OUTPUT; >+ return true; >+ case 420: >+ *outResult = SH_GLSL_420_CORE_OUTPUT; >+ return true; >+ case 430: >+ *outResult = SH_GLSL_430_CORE_OUTPUT; >+ return true; >+ case 440: >+ *outResult = SH_GLSL_440_CORE_OUTPUT; >+ return true; >+ case 450: >+ *outResult = SH_GLSL_450_CORE_OUTPUT; >+ return true; >+ default: >+ break; >+ } >+ return false; >+} >+ >+static bool ParseIntValue(const std::string &num, int emptyDefault, int *outValue) >+{ >+ if (num.length() == 0) >+ { >+ *outValue = emptyDefault; >+ return true; >+ } >+ >+ std::istringstream input(num); >+ int value; >+ if (!(input >> value && input.eof())) >+ { >+ return false; >+ } >+ *outValue = value; >+ return true; >+} >diff --git a/Source/ThirdParty/ANGLE/samples/simple_instancing/SimpleInstancing.cpp b/Source/ThirdParty/ANGLE/samples/simple_instancing/SimpleInstancing.cpp >new file mode 100644 >index 00000000000..847acc6c6a9 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/simple_instancing/SimpleInstancing.cpp >@@ -0,0 +1,203 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+// Based on Simple_Texture2D.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include "common/vector_utils.h" >+#include "texture_utils.h" >+#include "util/shader_utils.h" >+ >+#include <cstring> >+#include <iostream> >+#include <vector> >+ >+using namespace angle; >+ >+class SimpleInstancingSample : public SampleApplication >+{ >+ public: >+ SimpleInstancingSample(int argc, char **argv) >+ : SampleApplication("SimpleInstancing", argc, argv) >+ {} >+ >+ bool initialize() override >+ { >+ // init instancing functions >+ char *extensionString = (char *)glGetString(GL_EXTENSIONS); >+ if (strstr(extensionString, "GL_ANGLE_instanced_arrays")) >+ { >+ mVertexAttribDivisorANGLE = >+ (PFNGLVERTEXATTRIBDIVISORANGLEPROC)eglGetProcAddress("glVertexAttribDivisorANGLE"); >+ mDrawArraysInstancedANGLE = >+ (PFNGLDRAWARRAYSINSTANCEDANGLEPROC)eglGetProcAddress("glDrawArraysInstancedANGLE"); >+ mDrawElementsInstancedANGLE = (PFNGLDRAWELEMENTSINSTANCEDANGLEPROC)eglGetProcAddress( >+ "glDrawElementsInstancedANGLE"); >+ } >+ >+ if (!mVertexAttribDivisorANGLE || !mDrawArraysInstancedANGLE || >+ !mDrawElementsInstancedANGLE) >+ { >+ std::cerr << "Unable to load GL_ANGLE_instanced_arrays entry points."; >+ return false; >+ } >+ >+ constexpr char kVS[] = R"(attribute vec3 a_position; >+attribute vec2 a_texCoord; >+attribute vec3 a_instancePos; >+varying vec2 v_texCoord; >+void main() >+{ >+ gl_Position = vec4(a_position.xyz + a_instancePos.xyz, 1.0); >+ v_texCoord = a_texCoord; >+})"; >+ >+ constexpr char kFS[] = R"(precision mediump float; >+varying vec2 v_texCoord; >+uniform sampler2D s_texture; >+void main() >+{ >+ gl_FragColor = texture2D(s_texture, v_texCoord); >+})"; >+ >+ mProgram = CompileProgram(kVS, kFS); >+ if (!mProgram) >+ { >+ return false; >+ } >+ >+ // Get the attribute locations >+ mPositionLoc = glGetAttribLocation(mProgram, "a_position"); >+ mTexCoordLoc = glGetAttribLocation(mProgram, "a_texCoord"); >+ mInstancePosLoc = glGetAttribLocation(mProgram, "a_instancePos"); >+ >+ // Get the sampler location >+ mSamplerLoc = glGetUniformLocation(mProgram, "s_texture"); >+ >+ // Load the texture >+ mTextureID = CreateSimpleTexture2D(); >+ >+ // Initialize the vertex and index vectors >+ const GLfloat quadRadius = 0.01f; >+ >+ mVertices.push_back(Vector3(-quadRadius, quadRadius, 0.0f)); >+ mVertices.push_back(Vector3(-quadRadius, -quadRadius, 0.0f)); >+ mVertices.push_back(Vector3(quadRadius, -quadRadius, 0.0f)); >+ mVertices.push_back(Vector3(quadRadius, quadRadius, 0.0f)); >+ >+ mTexcoords.push_back(Vector2(0.0f, 0.0f)); >+ mTexcoords.push_back(Vector2(0.0f, 1.0f)); >+ mTexcoords.push_back(Vector2(1.0f, 1.0f)); >+ mTexcoords.push_back(Vector2(1.0f, 0.0f)); >+ >+ mIndices.push_back(0); >+ mIndices.push_back(1); >+ mIndices.push_back(2); >+ mIndices.push_back(0); >+ mIndices.push_back(2); >+ mIndices.push_back(3); >+ >+ // Tile thousands of quad instances >+ for (float y = -1.0f + quadRadius; y < 1.0f - quadRadius; y += quadRadius * 3) >+ { >+ for (float x = -1.0f + quadRadius; x < 1.0f - quadRadius; x += quadRadius * 3) >+ { >+ mInstances.push_back(Vector3(x, y, 0.0f)); >+ } >+ } >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ >+ return true; >+ } >+ >+ void destroy() override >+ { >+ glDeleteProgram(mProgram); >+ glDeleteTextures(1, &mTextureID); >+ } >+ >+ void draw() override >+ { >+ // Set the viewport >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ // Load the vertex position >+ glVertexAttribPointer(mPositionLoc, 3, GL_FLOAT, GL_FALSE, 0, mVertices.data()); >+ glEnableVertexAttribArray(mPositionLoc); >+ >+ // Load the texture coordinate >+ glVertexAttribPointer(mTexCoordLoc, 2, GL_FLOAT, GL_FALSE, 0, mTexcoords.data()); >+ glEnableVertexAttribArray(mTexCoordLoc); >+ >+ // Load the instance position >+ glVertexAttribPointer(mInstancePosLoc, 3, GL_FLOAT, GL_FALSE, 0, mInstances.data()); >+ glEnableVertexAttribArray(mInstancePosLoc); >+ >+ // Enable instancing >+ mVertexAttribDivisorANGLE(mInstancePosLoc, 1); >+ >+ // Bind the texture >+ glActiveTexture(GL_TEXTURE0); >+ glBindTexture(GL_TEXTURE_2D, mTextureID); >+ >+ // Set the sampler texture unit to 0 >+ glUniform1i(mSamplerLoc, 0); >+ >+ // Do the instanced draw >+ mDrawElementsInstancedANGLE(GL_TRIANGLES, static_cast<GLsizei>(mIndices.size()), >+ GL_UNSIGNED_SHORT, mIndices.data(), >+ static_cast<GLsizei>(mInstances.size())); >+ } >+ >+ private: >+ // Handle to a program object >+ GLuint mProgram; >+ >+ // Attribute locations >+ GLint mPositionLoc; >+ GLint mTexCoordLoc; >+ >+ // Sampler location >+ GLint mSamplerLoc; >+ >+ // Texture handle >+ GLuint mTextureID; >+ >+ // Instance VBO >+ GLint mInstancePosLoc; >+ >+ // Loaded entry points >+ PFNGLVERTEXATTRIBDIVISORANGLEPROC mVertexAttribDivisorANGLE; >+ PFNGLDRAWARRAYSINSTANCEDANGLEPROC mDrawArraysInstancedANGLE; >+ PFNGLDRAWELEMENTSINSTANCEDANGLEPROC mDrawElementsInstancedANGLE; >+ >+ // Vertex data >+ std::vector<Vector3> mVertices; >+ std::vector<Vector2> mTexcoords; >+ std::vector<Vector3> mInstances; >+ std::vector<GLushort> mIndices; >+}; >+ >+int main(int argc, char **argv) >+{ >+ SimpleInstancingSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/simple_texture_2d/SimpleTexture2D.cpp b/Source/ThirdParty/ANGLE/samples/simple_texture_2d/SimpleTexture2D.cpp >new file mode 100644 >index 00000000000..93da4a31f67 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/simple_texture_2d/SimpleTexture2D.cpp >@@ -0,0 +1,134 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+// Based on Simple_Texture2D.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include "texture_utils.h" >+#include "util/shader_utils.h" >+ >+class SimpleTexture2DSample : public SampleApplication >+{ >+ public: >+ SimpleTexture2DSample(int argc, char **argv) : SampleApplication("SimpleTexture2D", argc, argv) >+ {} >+ >+ bool initialize() override >+ { >+ constexpr char kVS[] = R"(attribute vec4 a_position; >+attribute vec2 a_texCoord; >+varying vec2 v_texCoord; >+void main() >+{ >+ gl_Position = a_position; >+ v_texCoord = a_texCoord; >+})"; >+ >+ constexpr char kFS[] = R"(precision mediump float; >+varying vec2 v_texCoord; >+uniform sampler2D s_texture; >+void main() >+{ >+ gl_FragColor = texture2D(s_texture, v_texCoord); >+})"; >+ >+ mProgram = CompileProgram(kVS, kFS); >+ if (!mProgram) >+ { >+ return false; >+ } >+ >+ // Get the attribute locations >+ mPositionLoc = glGetAttribLocation(mProgram, "a_position"); >+ mTexCoordLoc = glGetAttribLocation(mProgram, "a_texCoord"); >+ >+ // Get the sampler location >+ mSamplerLoc = glGetUniformLocation(mProgram, "s_texture"); >+ >+ // Load the texture >+ mTexture = CreateSimpleTexture2D(); >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ >+ return true; >+ } >+ >+ void destroy() override >+ { >+ glDeleteProgram(mProgram); >+ glDeleteTextures(1, &mTexture); >+ } >+ >+ void draw() override >+ { >+ GLfloat vertices[] = { >+ -0.5f, 0.5f, 0.0f, // Position 0 >+ 0.0f, 0.0f, // TexCoord 0 >+ -0.5f, -0.5f, 0.0f, // Position 1 >+ 0.0f, 1.0f, // TexCoord 1 >+ 0.5f, -0.5f, 0.0f, // Position 2 >+ 1.0f, 1.0f, // TexCoord 2 >+ 0.5f, 0.5f, 0.0f, // Position 3 >+ 1.0f, 0.0f // TexCoord 3 >+ }; >+ GLushort indices[] = {0, 1, 2, 0, 2, 3}; >+ >+ // Set the viewport >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ // Load the vertex position >+ glVertexAttribPointer(mPositionLoc, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), vertices); >+ // Load the texture coordinate >+ glVertexAttribPointer(mTexCoordLoc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), >+ vertices + 3); >+ >+ glEnableVertexAttribArray(mPositionLoc); >+ glEnableVertexAttribArray(mTexCoordLoc); >+ >+ // Bind the texture >+ glActiveTexture(GL_TEXTURE0); >+ glBindTexture(GL_TEXTURE_2D, mTexture); >+ >+ // Set the texture sampler to texture unit to 0 >+ glUniform1i(mSamplerLoc, 0); >+ >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ } >+ >+ private: >+ // Handle to a program object >+ GLuint mProgram; >+ >+ // Attribute locations >+ GLint mPositionLoc; >+ GLint mTexCoordLoc; >+ >+ // Sampler location >+ GLint mSamplerLoc; >+ >+ // Texture handle >+ GLuint mTexture; >+}; >+ >+int main(int argc, char **argv) >+{ >+ SimpleTexture2DSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/simple_texture_cubemap/SimpleTextureCubemap.cpp b/Source/ThirdParty/ANGLE/samples/simple_texture_cubemap/SimpleTextureCubemap.cpp >new file mode 100644 >index 00000000000..c3f4437afc2 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/simple_texture_cubemap/SimpleTextureCubemap.cpp >@@ -0,0 +1,132 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+// Based on Simple_TextureCubemap.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include "texture_utils.h" >+#include "util/geometry_utils.h" >+#include "util/shader_utils.h" >+ >+class SimpleTextureCubemapSample : public SampleApplication >+{ >+ public: >+ SimpleTextureCubemapSample(int argc, char **argv) >+ : SampleApplication("SimpleTextureCubemap", argc, argv) >+ {} >+ >+ bool initialize() override >+ { >+ constexpr char kVS[] = R"(attribute vec4 a_position; >+attribute vec3 a_normal; >+varying vec3 v_normal; >+void main() >+{ >+ gl_Position = a_position; >+ v_normal = a_normal; >+})"; >+ >+ constexpr char kFS[] = R"(precision mediump float; >+varying vec3 v_normal; >+uniform samplerCube s_texture; >+void main() >+{ >+ gl_FragColor = textureCube(s_texture, v_normal); >+})"; >+ >+ mProgram = CompileProgram(kVS, kFS); >+ if (!mProgram) >+ { >+ return false; >+ } >+ >+ // Get the attribute locations >+ mPositionLoc = glGetAttribLocation(mProgram, "a_position"); >+ mNormalLoc = glGetAttribLocation(mProgram, "a_normal"); >+ >+ // Get the sampler locations >+ mSamplerLoc = glGetUniformLocation(mProgram, "s_texture"); >+ >+ // Load the texture >+ mTexture = CreateSimpleTextureCubemap(); >+ >+ // Generate the geometry data >+ CreateSphereGeometry(128, 0.75f, &mSphere); >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ glCullFace(GL_BACK); >+ glEnable(GL_CULL_FACE); >+ >+ return true; >+ } >+ >+ void destroy() override >+ { >+ glDeleteProgram(mProgram); >+ glDeleteTextures(1, &mTexture); >+ } >+ >+ void draw() override >+ { >+ // Set the viewport >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ // Load the vertex position >+ glVertexAttribPointer(mPositionLoc, 3, GL_FLOAT, GL_FALSE, 0, mSphere.positions.data()); >+ glEnableVertexAttribArray(mPositionLoc); >+ >+ // Load the normal >+ glVertexAttribPointer(mNormalLoc, 3, GL_FLOAT, GL_FALSE, 0, mSphere.normals.data()); >+ glEnableVertexAttribArray(mNormalLoc); >+ >+ // Bind the texture >+ glActiveTexture(GL_TEXTURE0); >+ glBindTexture(GL_TEXTURE_CUBE_MAP, mTexture); >+ >+ // Set the texture sampler to texture unit to 0 >+ glUniform1i(mSamplerLoc, 0); >+ >+ glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(mSphere.indices.size()), >+ GL_UNSIGNED_SHORT, mSphere.indices.data()); >+ } >+ >+ private: >+ // Handle to a program object >+ GLuint mProgram; >+ >+ // Attribute locations >+ GLint mPositionLoc; >+ GLint mNormalLoc; >+ >+ // Sampler location >+ GLint mSamplerLoc; >+ >+ // Texture handle >+ GLuint mTexture; >+ >+ // Geometry data >+ SphereGeometry mSphere; >+}; >+ >+int main(int argc, char **argv) >+{ >+ SimpleTextureCubemapSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/simple_vertex_shader/SimpleVertexShader.cpp b/Source/ThirdParty/ANGLE/samples/simple_vertex_shader/SimpleVertexShader.cpp >new file mode 100644 >index 00000000000..8ef35d3b131 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/simple_vertex_shader/SimpleVertexShader.cpp >@@ -0,0 +1,143 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+// Based on Simple_VertexShader.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include "texture_utils.h" >+#include "util/Matrix.h" >+#include "util/geometry_utils.h" >+#include "util/shader_utils.h" >+ >+#include <cmath> >+ >+class SimpleVertexShaderSample : public SampleApplication >+{ >+ public: >+ SimpleVertexShaderSample(int argc, char **argv) >+ : SampleApplication("SimpleVertexShader", argc, argv) >+ {} >+ >+ bool initialize() override >+ { >+ constexpr char kVS[] = R"(uniform mat4 u_mvpMatrix; >+attribute vec4 a_position; >+attribute vec2 a_texcoord; >+varying vec2 v_texcoord; >+void main() >+{ >+ gl_Position = u_mvpMatrix * a_position; >+ v_texcoord = a_texcoord; >+})"; >+ >+ constexpr char kFS[] = R"(precision mediump float; >+varying vec2 v_texcoord; >+void main() >+{ >+ gl_FragColor = vec4(v_texcoord.x, v_texcoord.y, 1.0, 1.0); >+})"; >+ >+ mProgram = CompileProgram(kVS, kFS); >+ if (!mProgram) >+ { >+ return false; >+ } >+ >+ // Get the attribute locations >+ mPositionLoc = glGetAttribLocation(mProgram, "a_position"); >+ mTexcoordLoc = glGetAttribLocation(mProgram, "a_texcoord"); >+ >+ // Get the uniform locations >+ mMVPMatrixLoc = glGetUniformLocation(mProgram, "u_mvpMatrix"); >+ >+ // Generate the geometry data >+ GenerateCubeGeometry(0.5f, &mCube); >+ >+ // Set an initial rotation >+ mRotation = 45.0f; >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ glCullFace(GL_BACK); >+ glEnable(GL_CULL_FACE); >+ >+ return true; >+ } >+ >+ void destroy() override { glDeleteProgram(mProgram); } >+ >+ void step(float dt, double totalTime) override >+ { >+ mRotation = fmod(mRotation + (dt * 40.0f), 360.0f); >+ >+ Matrix4 perspectiveMatrix = Matrix4::perspective( >+ 60.0f, float(getWindow()->getWidth()) / getWindow()->getHeight(), 1.0f, 20.0f); >+ >+ Matrix4 modelMatrix = Matrix4::translate(angle::Vector3(0.0f, 0.0f, -2.0f)) * >+ Matrix4::rotate(mRotation, angle::Vector3(1.0f, 0.0f, 1.0f)); >+ >+ Matrix4 viewMatrix = Matrix4::identity(); >+ >+ Matrix4 mvpMatrix = perspectiveMatrix * viewMatrix * modelMatrix; >+ >+ // Load the matrices >+ glUniformMatrix4fv(mMVPMatrixLoc, 1, GL_FALSE, mvpMatrix.data); >+ } >+ >+ void draw() override >+ { >+ // Set the viewport >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ // Load the vertex position >+ glVertexAttribPointer(mPositionLoc, 3, GL_FLOAT, GL_FALSE, 0, mCube.positions.data()); >+ glEnableVertexAttribArray(mPositionLoc); >+ >+ // Load the texcoord data >+ glVertexAttribPointer(mTexcoordLoc, 2, GL_FLOAT, GL_FALSE, 0, mCube.texcoords.data()); >+ glEnableVertexAttribArray(mTexcoordLoc); >+ >+ // Draw the cube >+ glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(mCube.indices.size()), GL_UNSIGNED_SHORT, >+ mCube.indices.data()); >+ } >+ >+ private: >+ // Handle to a program object >+ GLuint mProgram; >+ >+ // Attribute locations >+ GLint mPositionLoc; >+ GLint mTexcoordLoc; >+ >+ // Uniform locations >+ GLuint mMVPMatrixLoc; >+ >+ // Current rotation >+ float mRotation; >+ >+ // Geometry data >+ CubeGeometry mCube; >+}; >+ >+int main(int argc, char **argv) >+{ >+ SimpleVertexShaderSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/stencil_operations/StencilOperations.cpp b/Source/ThirdParty/ANGLE/samples/stencil_operations/StencilOperations.cpp >new file mode 100644 >index 00000000000..0099a0ac1a5 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/stencil_operations/StencilOperations.cpp >@@ -0,0 +1,219 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+// Based on Stencil_Test.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include "util/shader_utils.h" >+ >+class StencilOperationsSample : public SampleApplication >+{ >+ public: >+ StencilOperationsSample(int argc, char **argv) >+ : SampleApplication("StencilOperations", argc, argv) >+ {} >+ >+ bool initialize() override >+ { >+ constexpr char kVS[] = R"(attribute vec4 a_position; >+void main() >+{ >+ gl_Position = a_position; >+})"; >+ >+ constexpr char kFS[] = R"(precision mediump float; >+uniform vec4 u_color; >+void main() >+{ >+ gl_FragColor = u_color; >+})"; >+ >+ mProgram = CompileProgram(kVS, kFS); >+ if (!mProgram) >+ { >+ return false; >+ } >+ >+ // Get the attribute locations >+ mPositionLoc = glGetAttribLocation(mProgram, "a_position"); >+ >+ // Get the sampler location >+ mColorLoc = glGetUniformLocation(mProgram, "u_color"); >+ >+ // Set the clear color >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ >+ // Set the stencil clear value >+ glClearStencil(0x01); >+ >+ // Set the depth clear value >+ glClearDepthf(0.75f); >+ >+ // Enable the depth and stencil tests >+ glEnable(GL_DEPTH_TEST); >+ glEnable(GL_STENCIL_TEST); >+ >+ return true; >+ } >+ >+ void destroy() override { glDeleteProgram(mProgram); } >+ >+ void draw() override >+ { >+ GLfloat vertices[] = { >+ -0.75f, 0.25f, 0.50f, // Quad #0 >+ -0.25f, 0.25f, 0.50f, -0.25f, 0.75f, 0.50f, -0.75f, 0.75f, 0.50f, >+ 0.25f, 0.25f, 0.90f, // Quad #1 >+ 0.75f, 0.25f, 0.90f, 0.75f, 0.75f, 0.90f, 0.25f, 0.75f, 0.90f, >+ -0.75f, -0.75f, 0.50f, // Quad #2 >+ -0.25f, -0.75f, 0.50f, -0.25f, -0.25f, 0.50f, -0.75f, -0.25f, 0.50f, >+ 0.25f, -0.75f, 0.50f, // Quad #3 >+ 0.75f, -0.75f, 0.50f, 0.75f, -0.25f, 0.50f, 0.25f, -0.25f, 0.50f, >+ -1.00f, -1.00f, 0.00f, // Big Quad >+ 1.00f, -1.00f, 0.00f, 1.00f, 1.00f, 0.00f, -1.00f, 1.00f, 0.00f, >+ }; >+ >+ GLubyte indices[][6] = { >+ {0, 1, 2, 0, 2, 3}, // Quad #0 >+ {4, 5, 6, 4, 6, 7}, // Quad #1 >+ {8, 9, 10, 8, 10, 11}, // Quad #2 >+ {12, 13, 14, 12, 14, 15}, // Quad #3 >+ {16, 17, 18, 16, 18, 19}, // Big Quad >+ }; >+ >+ static const size_t testCount = 4; >+ GLfloat colors[testCount][4] = { >+ {1.0f, 0.0f, 0.0f, 1.0f}, >+ {0.0f, 1.0f, 0.0f, 1.0f}, >+ {0.0f, 0.0f, 1.0f, 1.0f}, >+ {1.0f, 1.0f, 0.0f, 0.0f}, >+ }; >+ >+ GLuint stencilValues[testCount] = { >+ 0x7, // Result of test 0 >+ 0x0, // Result of test 1 >+ 0x2, // Result of test 2 >+ 0xff // Result of test 3. We need to fill this value in at run-time >+ }; >+ >+ // Set the viewport >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ // Clear the color, depth, and stencil buffers. At this point, the stencil >+ // buffer will be 0x1 for all pixels >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ // Load the vertex data >+ glVertexAttribPointer(mPositionLoc, 3, GL_FLOAT, GL_FALSE, 0, vertices); >+ glEnableVertexAttribArray(mPositionLoc); >+ >+ // Test 0: >+ // >+ // Initialize upper-left region. In this case, the stencil-buffer values will >+ // be replaced because the stencil test for the rendered pixels will fail the >+ // stencil test, which is >+ // >+ // ref mask stencil mask >+ // ( 0x7 & 0x3 ) < ( 0x1 & 0x7 ) >+ // >+ // The value in the stencil buffer for these pixels will be 0x7. >+ glStencilFunc(GL_LESS, 0x7, 0x3); >+ glStencilOp(GL_REPLACE, GL_DECR, GL_DECR); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices[0]); >+ >+ // Test 1: >+ // >+ // Initialize the upper-right region. Here, we'll decrement the stencil-buffer >+ // values where the stencil test passes but the depth test fails. The stencil test is >+ // >+ // ref mask stencil mask >+ // ( 0x3 & 0x3 ) > ( 0x1 & 0x3 ) >+ // >+ // but where the geometry fails the depth test. The stencil values for these pixels >+ // will be 0x0. >+ glStencilFunc(GL_GREATER, 0x3, 0x3); >+ glStencilOp(GL_KEEP, GL_DECR, GL_KEEP); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices[1]); >+ >+ // Test 2: >+ // >+ // Initialize the lower-left region. Here we'll increment (with saturation) the >+ // stencil value where both the stencil and depth tests pass. The stencil test for >+ // these pixels will be >+ // >+ // ref mask stencil mask >+ // ( 0x1 & 0x3 ) == ( 0x1 & 0x3 ) >+ // >+ // The stencil values for these pixels will be 0x2. >+ glStencilFunc(GL_EQUAL, 0x1, 0x3); >+ glStencilOp(GL_KEEP, GL_INCR, GL_INCR); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices[2]); >+ >+ // Test 3: >+ // >+ // Finally, initialize the lower-right region. We'll invert the stencil value >+ // where the stencil tests fails. The stencil test for these pixels will be >+ // >+ // ref mask stencil mask >+ // ( 0x2 & 0x1 ) == ( 0x1 & 0x1 ) >+ // >+ // The stencil value here will be set to ~((2^s-1) & 0x1), (with the 0x1 being >+ // from the stencil clear value), where 's' is the number of bits in the stencil >+ // buffer >+ glStencilFunc(GL_EQUAL, 0x2, 0x1); >+ glStencilOp(GL_INVERT, GL_KEEP, GL_KEEP); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices[3]); >+ >+ // Since we don't know at compile time how many stencil bits are present, we'll >+ // query, and update the value correct value in the stencilValues arrays for the >+ // fourth tests. We'll use this value later in rendering. >+ GLint stencilBitCount = 0; >+ glGetIntegerv(GL_STENCIL_BITS, &stencilBitCount); >+ stencilValues[3] = ~(((1 << stencilBitCount) - 1) & 0x1) & 0xff; >+ >+ // Use the stencil buffer for controlling where rendering will occur. We disable >+ // writing to the stencil buffer so we can test against them without modifying >+ // the values we generated. >+ glStencilMask(0x0); >+ >+ for (size_t i = 0; i < testCount; ++i) >+ { >+ glStencilFunc(GL_EQUAL, stencilValues[i], 0xff); >+ glUniform4fv(mColorLoc, 1, colors[i]); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices[4]); >+ } >+ >+ // Reset the stencil mask >+ glStencilMask(0xFF); >+ } >+ >+ private: >+ // Handle to a program object >+ GLuint mProgram; >+ >+ // Attribute locations >+ GLint mPositionLoc; >+ >+ // Uniform locations >+ GLint mColorLoc; >+}; >+ >+int main(int argc, char **argv) >+{ >+ StencilOperationsSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/tex_redef_microbench/TexRedefMicroBench.cpp b/Source/ThirdParty/ANGLE/samples/tex_redef_microbench/TexRedefMicroBench.cpp >new file mode 100644 >index 00000000000..52299a727fd >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/tex_redef_microbench/TexRedefMicroBench.cpp >@@ -0,0 +1,285 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+// Based on Hello_Triangle.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include "texture_utils.h" >+#include "util/shader_utils.h" >+ >+#include <cstring> >+#include <iostream> >+ >+// This sample demonstrates the differences in rendering efficiency when >+// drawing with already-created textures whose dimensions have been altered >+// versus drawing with newly created textures. >+// >+// In order to support GL's per-level texture creation semantics over the >+// D3D API in particular, which requires textures' full mip chains to be >+// created at texture object creation time, ANGLE maintains copies of the >+// constituent texture images in system memory until the texture is used in >+// a draw call, at which time, if the texture passes GL's mip completeness >+// rules, the D3D texture is created and the contents of the texture are >+// uploaded. Once the texture is created, redefinition of the dimensions or >+// format of the texture is costly-- a new D3D texture needs to be created, >+// and ANGLE may need to read the contents back into system memory. >+// >+// Creating an entirely new texture also requires that a new D3D texture be >+// created, but any overhead associated with tracking the already-present >+// texture images is eliminated, as it's a novel texture. This sample >+// demonstrates the contrast in draw call time between these two situations. >+// >+// The resizing & creation of a new texture is delayed until several frames >+// after startup, to eliminate draw time differences caused by caching of >+// rendering state subsequent to the first frame. >+ >+class TexRedefBenchSample : public SampleApplication >+{ >+ public: >+ TexRedefBenchSample(int argc, char **argv) >+ : SampleApplication("Microbench", argc, argv, 2, 0, 1280, 1280), >+ mPixelsResize(nullptr), >+ mPixelsNewTex(nullptr), >+ mTimeFrame(false), >+ mFrameCount(0) >+ {} >+ >+ void defineSquareTexture2D(GLuint texId, >+ GLsizei baseDimension, >+ GLenum format, >+ GLenum type, >+ void *data) >+ { >+ glBindTexture(GL_TEXTURE_2D, texId); >+ GLsizei curDim = baseDimension; >+ GLuint level = 0; >+ >+ while (curDim >= 1) >+ { >+ glTexImage2D(GL_TEXTURE_2D, level, format, curDim, curDim, 0, format, type, data); >+ curDim /= 2; >+ level++; >+ } >+ } >+ >+ void createPixelData() >+ { >+ mPixelsResize = new GLubyte[512 * 512 * 4]; >+ mPixelsNewTex = new GLubyte[512 * 512 * 4]; >+ GLubyte *pixPtr0 = mPixelsResize; >+ GLubyte *pixPtr1 = mPixelsNewTex; >+ GLubyte zeroPix[] = {0, 192, 192, 255}; >+ GLubyte onePix[] = {192, 0, 0, 255}; >+ for (int i = 0; i < 512 * 512; ++i) >+ { >+ memcpy(pixPtr0, zeroPix, 4 * sizeof(GLubyte)); >+ memcpy(pixPtr1, onePix, 4 * sizeof(GLubyte)); >+ pixPtr0 += 4; >+ pixPtr1 += 4; >+ } >+ } >+ >+ bool initialize() override >+ { >+ constexpr char kVS[] = R"(attribute vec4 a_position; >+attribute vec2 a_texCoord; >+varying vec2 v_texCoord; >+void main() >+{ >+ gl_Position = a_position; >+ v_texCoord = a_texCoord; >+})"; >+ >+ constexpr char kFS[] = R"(precision mediump float; >+varying vec2 v_texCoord; >+uniform sampler2D s_texture; >+void main() >+{ >+ gl_FragColor = texture2D(s_texture, v_texCoord); >+})"; >+ >+ mProgram = CompileProgram(kVS, kFS); >+ if (!mProgram) >+ { >+ return false; >+ } >+ >+ // Get the attribute locations >+ mPositionLoc = glGetAttribLocation(mProgram, "a_position"); >+ mTexCoordLoc = glGetAttribLocation(mProgram, "a_texCoord"); >+ >+ // Get the sampler location >+ mSamplerLoc = glGetUniformLocation(mProgram, "s_texture"); >+ >+ // Generate texture IDs, and create texture 0 >+ glGenTextures(3, mTextureIds); >+ >+ createPixelData(); >+ defineSquareTexture2D(mTextureIds[0], 256, GL_RGBA, GL_UNSIGNED_BYTE, mPixelsResize); >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ >+ mOrigTimer = CreateTimer(); >+ mResizeDrawTimer = CreateTimer(); >+ mResizeDefineTimer = CreateTimer(); >+ mNewTexDrawTimer = CreateTimer(); >+ mNewTexDefineTimer = CreateTimer(); >+ >+ return true; >+ } >+ >+ void destroy() override >+ { >+ glDeleteProgram(mProgram); >+ >+ delete[] mPixelsResize; >+ delete[] mPixelsNewTex; >+ } >+ >+ void draw() override >+ { >+ GLfloat vertices[] = { >+ -0.5f, 0.5f, 0.0f, // Position 0 >+ 0.0f, 0.0f, // TexCoord 0 >+ -0.5f, -0.5f, 0.0f, // Position 1 >+ 0.0f, 1.0f, // TexCoord 1 >+ 0.5f, -0.5f, 0.0f, // Position 2 >+ 1.0f, 1.0f, // TexCoord 2 >+ 0.5f, 0.5f, 0.0f, // Position 3 >+ 1.0f, 0.0f // TexCoord 3 >+ }; >+ GLushort indices[] = {0, 1, 2, 0, 2, 3}; >+ >+ // Set the viewport >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ // Load the vertex position >+ glVertexAttribPointer(mPositionLoc, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), vertices); >+ // Load the texture coordinate >+ glVertexAttribPointer(mTexCoordLoc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), >+ vertices + 3); >+ >+ glEnableVertexAttribArray(mPositionLoc); >+ glEnableVertexAttribArray(mTexCoordLoc); >+ >+ // Bind the texture >+ glActiveTexture(GL_TEXTURE0); >+ glBindTexture(GL_TEXTURE_2D, mTextureIds[0]); >+ >+ // Set the texture sampler to texture unit to 0 >+ glUniform1i(mSamplerLoc, 0); >+ >+ // We delay timing of texture resize/creation until after the first frame, as >+ // caching optimizations will reduce draw time for subsequent frames for reasons >+ // unreleated to texture creation. mTimeFrame is set to true on the fifth frame. >+ if (mTimeFrame) >+ { >+ mOrigTimer->start(); >+ } >+ >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ >+ if (mTimeFrame) >+ { >+ mOrigTimer->stop(); >+ // This timer indicates draw time for an already-created texture resident on the GPU, >+ // which needs no updates. It will be faster than the other draws. >+ std::cout << "Original texture draw: " << mOrigTimer->getElapsedTime() * 1000 << "msec" >+ << std::endl; >+ >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); >+ >+ // Now, change the texture dimensions of the original texture >+ mResizeDefineTimer->start(); >+ defineSquareTexture2D(mTextureIds[0], 512, GL_RGBA, GL_UNSIGNED_BYTE, mPixelsResize); >+ mResizeDefineTimer->stop(); >+ >+ mResizeDrawTimer->start(); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ mResizeDrawTimer->stop(); >+ // This timer indicates draw time for a texture which has already been used in a draw, >+ // causing the underlying resource to be allocated, and then resized, requiring resource >+ // reallocation and related overhead. >+ std::cout << "Resized texture definition: " >+ << mResizeDefineTimer->getElapsedTime() * 1000 << "msec" << std::endl; >+ std::cout << "Resized texture draw: " << mResizeDrawTimer->getElapsedTime() * 1000 >+ << "msec" << std::endl; >+ >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); >+ >+ // Create texure at same dimensions we resized previous texture to >+ mNewTexDefineTimer->start(); >+ defineSquareTexture2D(mTextureIds[1], 512, GL_RGBA, GL_UNSIGNED_BYTE, mPixelsNewTex); >+ mNewTexDefineTimer->stop(); >+ >+ mNewTexDrawTimer->start(); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ mNewTexDrawTimer->stop(); >+ // This timer indicates draw time for a texture newly created this frame. The underlying >+ // resource will need to be created, but because it has not previously been used, there >+ // is no already-resident texture object to manage. This draw is expected to be faster >+ // than the resized texture draw. >+ std::cout << "Newly created texture definition: " >+ << mNewTexDefineTimer->getElapsedTime() * 1000 << "msec" << std::endl; >+ std::cout << "Newly created texture draw: " << mNewTexDrawTimer->getElapsedTime() * 1000 >+ << "msec" << std::endl; >+ } >+ >+ if (mFrameCount == 5) >+ mTimeFrame = true; >+ else >+ mTimeFrame = false; >+ >+ mFrameCount++; >+ } >+ >+ private: >+ // Handle to a program object >+ GLuint mProgram; >+ >+ // Attribute locations >+ GLint mPositionLoc; >+ GLint mTexCoordLoc; >+ >+ // Sampler location >+ GLint mSamplerLoc; >+ >+ // Texture handle >+ GLuint mTextureIds[2]; // 0: texture created, then resized >+ // 1: texture newly created with TexImage >+ >+ // Texture pixel data >+ GLubyte *mPixelsResize; >+ GLubyte *mPixelsNewTex; >+ >+ Timer *mOrigTimer; >+ Timer *mResizeDrawTimer; >+ Timer *mResizeDefineTimer; >+ Timer *mNewTexDrawTimer; >+ Timer *mNewTexDefineTimer; >+ bool mTimeFrame; >+ unsigned int mFrameCount; >+}; >+ >+int main(int argc, char **argv) >+{ >+ TexRedefBenchSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/texture_wrap/TextureWrap.cpp b/Source/ThirdParty/ANGLE/samples/texture_wrap/TextureWrap.cpp >new file mode 100644 >index 00000000000..a8f812b9214 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/texture_wrap/TextureWrap.cpp >@@ -0,0 +1,149 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+// Based on TextureWrap.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include "texture_utils.h" >+#include "util/shader_utils.h" >+ >+class TextureWrapSample : public SampleApplication >+{ >+ public: >+ TextureWrapSample(int argc, char **argv) : SampleApplication("TextureWrap", argc, argv) {} >+ >+ bool initialize() override >+ { >+ constexpr char kVS[] = R"(uniform float u_offset; >+attribute vec4 a_position; >+attribute vec2 a_texCoord; >+varying vec2 v_texCoord; >+void main() >+{ >+ gl_Position = a_position; >+ gl_Position.x += u_offset; >+ v_texCoord = a_texCoord; >+})"; >+ >+ constexpr char kFS[] = R"(precision mediump float; >+varying vec2 v_texCoord; >+uniform sampler2D s_texture; >+void main() >+{ >+ gl_FragColor = texture2D(s_texture, v_texCoord); >+})"; >+ >+ mProgram = CompileProgram(kVS, kFS); >+ if (!mProgram) >+ { >+ return false; >+ } >+ >+ // Get the attribute locations >+ mPositionLoc = glGetAttribLocation(mProgram, "a_position"); >+ mTexCoordLoc = glGetAttribLocation(mProgram, "a_texCoord"); >+ >+ // Get the sampler location >+ mSamplerLoc = glGetUniformLocation(mProgram, "s_texture"); >+ >+ // Get the offset location >+ mOffsetLoc = glGetUniformLocation(mProgram, "u_offset"); >+ >+ // Load the texture >+ mTexture = CreateMipMappedTexture2D(); >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ >+ return true; >+ } >+ >+ void destroy() override { glDeleteProgram(mProgram); } >+ >+ void draw() override >+ { >+ GLfloat vertices[] = { >+ -0.3f, 0.3f, 0.0f, 1.0f, // Position 0 >+ -1.0f, -1.0f, // TexCoord 0 >+ -0.3f, -0.3f, 0.0f, 1.0f, // Position 1 >+ -1.0f, 2.0f, // TexCoord 1 >+ 0.3f, -0.3f, 0.0f, 1.0f, // Position 2 >+ 2.0f, 2.0f, // TexCoord 2 >+ 0.3f, 0.3f, 0.0f, 1.0f, // Position 3 >+ 2.0f, -1.0f // TexCoord 3 >+ }; >+ GLushort indices[] = {0, 1, 2, 0, 2, 3}; >+ >+ // Set the viewport >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ // Load the vertex position >+ glVertexAttribPointer(mPositionLoc, 4, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), vertices); >+ glEnableVertexAttribArray(mPositionLoc); >+ >+ // Load the texture coordinate >+ glVertexAttribPointer(mTexCoordLoc, 2, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), >+ vertices + 4); >+ glEnableVertexAttribArray(mTexCoordLoc); >+ >+ // Set the sampler texture unit to 0 >+ glUniform1i(mSamplerLoc, 0); >+ >+ // Draw quad with repeat wrap mode >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); >+ glUniform1f(mOffsetLoc, -0.7f); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ >+ // Draw quad with clamp to edge wrap mode >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); >+ glUniform1f(mOffsetLoc, 0.0f); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ >+ // Draw quad with mirrored repeat >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); >+ glUniform1f(mOffsetLoc, 0.7f); >+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); >+ } >+ >+ private: >+ // Handle to a program object >+ GLuint mProgram; >+ >+ // Attribute locations >+ GLint mPositionLoc; >+ GLint mTexCoordLoc; >+ >+ // Sampler location >+ GLint mSamplerLoc; >+ >+ // Offset location >+ GLint mOffsetLoc; >+ >+ // Texture handle >+ GLuint mTexture; >+}; >+ >+int main(int argc, char **argv) >+{ >+ TextureWrapSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/samples/tri_fan_microbench/TriFanMicroBench.cpp b/Source/ThirdParty/ANGLE/samples/tri_fan_microbench/TriFanMicroBench.cpp >new file mode 100644 >index 00000000000..d3874c15102 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/samples/tri_fan_microbench/TriFanMicroBench.cpp >@@ -0,0 +1,244 @@ >+// >+// Copyright (c) 2014 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. >+// >+ >+// Based on Hello_Triangle.c from >+// Book: OpenGL(R) ES 2.0 Programming Guide >+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner >+// ISBN-10: 0321502795 >+// ISBN-13: 9780321502797 >+// Publisher: Addison-Wesley Professional >+// URLs: http://safari.informit.com/9780321563835 >+// http://www.opengles-book.com >+ >+#include "SampleApplication.h" >+ >+#include "util/shader_utils.h" >+ >+#include <cstring> >+#include <iostream> >+ >+// This small sample compares the per-frame render time for a series of >+// squares drawn with TRIANGLE_FANS versus squares drawn with TRIANGLES. >+// To exacerbate differences between the two, we use a large collection >+// of short buffers with pre-translated vertex data. >+ >+class TriangleFanBenchSample : public SampleApplication >+{ >+ public: >+ TriangleFanBenchSample(int argc, char **argv) >+ : SampleApplication("Microbench", argc, argv, 2, 0, 1280, 1280), mFrameCount(0) >+ {} >+ >+ void createVertexBuffers() >+ { >+ const unsigned int slices = 8; >+ const unsigned int numFanVertices = slices + 2; >+ const unsigned int fanFloats = numFanVertices * 3; >+ >+ mNumFanVerts = numFanVertices; >+ >+ const GLfloat halfDim = 0.0625; >+ GLfloat fanVertices[] = { >+ 0.0f, 0.0f, 0.0f, // center >+ -halfDim, -halfDim, 0.0f, // LL >+ -halfDim, 0.0f, 0.0f, // CL >+ -halfDim, halfDim, 0.0f, // UL >+ 0.0f, halfDim, 0.0f, // UC >+ halfDim, halfDim, 0.0f, // UR >+ halfDim, 0.0f, 0.0f, // CR >+ halfDim, -halfDim, 0.0f, // LR >+ 0.0f, -halfDim, 0.0f, // LC >+ -halfDim, -halfDim, 0.0f // LL (closes the fan) >+ }; >+ >+ const GLfloat xMin = -1.0f; // We leave viewport/worldview untransformed in this sample >+ const GLfloat xMax = 1.0f; >+ const GLfloat yMin = -1.0f; >+ // const GLfloat yMax = 1.0f; >+ >+ glGenBuffers(mNumSquares, mFanBufId); >+ >+ GLfloat xOffset = xMin; >+ GLfloat yOffset = yMin; >+ for (unsigned int i = 0; i < mNumSquares; ++i) >+ { >+ GLfloat tempVerts[fanFloats] = {0}; >+ for (unsigned int j = 0; j < numFanVertices; ++j) >+ { >+ tempVerts[j * 3] = fanVertices[j * 3] + xOffset; >+ tempVerts[j * 3 + 1] = fanVertices[j * 3 + 1] + yOffset; >+ tempVerts[j * 3 + 2] = 0.0f; >+ } >+ >+ glBindBuffer(GL_ARRAY_BUFFER, mFanBufId[i]); >+ glBufferData(GL_ARRAY_BUFFER, fanFloats * sizeof(GLfloat), tempVerts, GL_STATIC_DRAW); >+ >+ xOffset += 2 * halfDim; >+ if (xOffset > xMax) >+ { >+ xOffset = xMin; >+ yOffset += 2 * halfDim; >+ } >+ } >+ >+ const unsigned int numTriVertices = slices * 3; >+ const unsigned int triFloats = numTriVertices * 3; >+ GLfloat triVertices[triFloats]; >+ GLfloat *triPointer = triVertices; >+ >+ mNumTriVerts = numTriVertices; >+ >+ for (unsigned int i = 0; i < slices; ++i) >+ { >+ memcpy(triPointer, fanVertices, >+ 3 * sizeof(GLfloat)); // copy center point as first vertex for this slice >+ triPointer += 3; >+ for (unsigned int j = 1; j < 3; ++j) >+ { >+ GLfloat *vertex = >+ &(fanVertices[(i + j) * 3]); // copy two outer vertices for this point >+ memcpy(triPointer, vertex, 3 * sizeof(GLfloat)); >+ triPointer += 3; >+ } >+ } >+ >+ // GLfloat triVertices2[triFloats]; >+ glGenBuffers(mNumSquares, mTriBufId); >+ xOffset = xMin; >+ yOffset = yMin; >+ >+ for (unsigned int i = 0; i < mNumSquares; ++i) >+ { >+ triPointer = triVertices; >+ GLfloat tempVerts[triFloats]; >+ for (unsigned int j = 0; j < numTriVertices; ++j) >+ { >+ tempVerts[j * 3] = triPointer[0] + xOffset; >+ tempVerts[j * 3 + 1] = triPointer[1] + yOffset; >+ tempVerts[j * 3 + 2] = 0.0f; >+ triPointer += 3; >+ } >+ >+ glBindBuffer(GL_ARRAY_BUFFER, mTriBufId[i]); >+ glBufferData(GL_ARRAY_BUFFER, triFloats * sizeof(GLfloat), tempVerts, GL_STATIC_DRAW); >+ xOffset += 2 * halfDim; >+ if (xOffset > xMax) >+ { >+ yOffset += 2 * halfDim; >+ xOffset = xMin; >+ } >+ } >+ } >+ >+ bool initialize() override >+ { >+ constexpr char kVS[] = R"(attribute vec4 vPosition; >+void main() >+{ >+ gl_Position = vPosition; >+})"; >+ >+ constexpr char kFS[] = R"(precision mediump float; >+void main() >+{ >+ gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); >+})"; >+ >+ mProgram = CompileProgram(kVS, kFS); >+ if (!mProgram) >+ { >+ return false; >+ } >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ >+ createVertexBuffers(); >+ >+ mFanTimer = CreateTimer(); >+ mTriTimer = CreateTimer(); >+ mFanTotalTime = 0; >+ mTriTotalTime = 0; >+ >+ return true; >+ } >+ >+ void destroy() override >+ { >+ std::cout << "Total draw time using TRIANGLE_FAN: " << mFanTotalTime << "ms (" >+ << (float)mFanTotalTime / (float)mFrameCount << " average per frame)" >+ << std::endl; >+ std::cout << "Total draw time using TRIANGLES: " << mTriTotalTime << "ms (" >+ << (float)mTriTotalTime / (float)mFrameCount << " average per frame)" >+ << std::endl; >+ glDeleteProgram(mProgram); >+ } >+ >+ void draw() override >+ { >+ // Set the viewport >+ glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); >+ >+ // Clear the color buffer >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Use the program object >+ glUseProgram(mProgram); >+ >+ // Bind the vertex data >+ glEnableVertexAttribArray(0); >+ >+ // Draw using triangle fans, stored in VBO >+ mFanTimer->start(); >+ for (unsigned i = 0; i < mNumSquares; ++i) >+ { >+ glBindBuffer(GL_ARRAY_BUFFER, mFanBufId[i]); >+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr); >+ glDrawArrays(GL_TRIANGLE_FAN, 0, mNumFanVerts); >+ } >+ mFanTimer->stop(); >+ >+ mFanTotalTime += static_cast<unsigned int>( >+ mFanTimer->getElapsedTime() * 1000); // convert from usec to msec when accumulating >+ >+ // Clear to eliminate driver-side gains from occlusion >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Draw using triangles, stored in VBO >+ mTriTimer->start(); >+ for (unsigned i = 1; i < mNumSquares; ++i) >+ { >+ glBindBuffer(GL_ARRAY_BUFFER, mTriBufId[i]); >+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr); >+ glDrawArrays(GL_TRIANGLES, 0, mNumTriVerts); >+ } >+ mTriTimer->stop(); >+ >+ mTriTotalTime += static_cast<unsigned int>( >+ mTriTimer->getElapsedTime() * 1000); // convert from usec to msec when accumulating >+ >+ mFrameCount++; >+ } >+ >+ private: >+ static const unsigned int mNumSquares = 289; >+ unsigned int mNumFanVerts; >+ unsigned int mNumTriVerts; >+ GLuint mProgram; >+ GLuint mFanBufId[mNumSquares]; >+ GLuint mTriBufId[mNumSquares]; >+ >+ Timer *mFanTimer; >+ Timer *mTriTimer; >+ unsigned int mFrameCount; >+ unsigned int mTriTotalTime; >+ unsigned int mFanTotalTime; >+}; >+ >+int main(int argc, char **argv) >+{ >+ TriangleFanBenchSample app(argc, argv); >+ return app.run(); >+} >diff --git a/Source/ThirdParty/ANGLE/scripts/bmp_to_nv12.py b/Source/ThirdParty/ANGLE/scripts/bmp_to_nv12.py >new file mode 100644 >index 00000000000..c76ac7af3b1 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/bmp_to_nv12.py >@@ -0,0 +1,89 @@ >+#!/usr/bin/python2 >+# >+# Copyright 2016 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. >+# >+# bmp_to_nv12.py: >+# Script to convert a simple BMP file to an NV12 format. Used to create >+# test images for the NV12 texture stream end to end tests >+ >+import sys >+import struct >+ >+if len(sys.argv) != 4: >+ print("Usage: bmp_to_nv12.py input output prefix") >+ exit(0) >+ >+bmp_file = open(sys.argv[1], "rb") >+ >+magic = bmp_file.read(2) >+if (magic != "BM"): >+ print("Invalid BMP magic") >+ exit(1) >+ >+file_size, = struct.unpack("I", bmp_file.read(4)) >+ >+# eat reserved bytes >+bmp_file.read(4) >+ >+offset, = struct.unpack("I", bmp_file.read(4)) >+ >+headersize, = struct.unpack("I", bmp_file.read(4)) >+width, = struct.unpack("i", bmp_file.read(4)) >+height, = struct.unpack("i", bmp_file.read(4)) >+planes, = struct.unpack("H", bmp_file.read(2)) >+bpp, = struct.unpack("H", bmp_file.read(2)) >+compression, = struct.unpack("i", bmp_file.read(4)) >+image_size, = struct.unpack("i", bmp_file.read(4)) >+ >+if (bpp != 24 or compression != 0): >+ print("Unsupported BMP file") >+ bmp_file.close() >+ exit(1) >+ >+bmp_file.seek(offset, 0) >+pixels = bmp_file.read(width * height * 3) >+bmp_file.close() >+ >+# convert to YUV 4:4:4 >+converted_pixels = bytearray(pixels) >+for i in range(0, width * height): >+ R, = struct.unpack("B", pixels[i*3+2]) >+ G, = struct.unpack("B", pixels[i*3+1]) >+ B, = struct.unpack("B", pixels[i*3]) >+ converted_pixels[i*3] = ((66*R + 129*G + 25*B + 128) >> 8) + 16 >+ converted_pixels[i*3+1] = ((-38*R - 74*G + 112*B + 128) >> 8) + 128 >+ converted_pixels[i*3+2] = ((112*R - 94*G - 18*B + 128) >> 8) + 128 >+ >+# downsample to packed UV buffer >+uv_buffer = bytearray(width * height / 2) >+for i in range(0, width * height / 2, 2): >+ U1 = converted_pixels[((((i / width) * 2) * width) + (i % width)) * 3 + 1] >+ U2 = converted_pixels[((((i / width) * 2) * width) + width + (i % width)) * 3 + 1] >+ V1 = converted_pixels[((((i / width) * 2) * width) + (i % width)) * 3 + 2] >+ V2 = converted_pixels[((((i / width) * 2) * width) + width + (i % width)) * 3 + 2] >+ uv_buffer[i] = (U1 + U2) / 2 >+ uv_buffer[i + 1] = (V1 + V2) / 2 >+ >+# extract the Y buffer >+y_buffer = bytearray(width * height) >+for i in range(0, width * height): >+ y_buffer[i] = converted_pixels[i * 3] >+ >+# write out the file as a C header >+nv12_file = open(sys.argv[2], "w") >+nv12_file.write("// Automatically generated from " + sys.argv[1] + "\n") >+nv12_file.write("static const size_t " + sys.argv[3] + "_width = " + str(width) + ";\n") >+nv12_file.write("static const size_t " + sys.argv[3] + "_height = " + str(height) + ";\n") >+nv12_file.write("static const unsigned char " + sys.argv[3] + "_data[] = \n{") >+for i in range(0, width * height): >+ if (i % 16) == 0: >+ nv12_file.write("\n ") >+ nv12_file.write(str(y_buffer[i]) + ",") >+for i in range(0, width * height / 2): >+ if (i % 16) == 0: >+ nv12_file.write("\n ") >+ nv12_file.write(str(uv_buffer[i]) + ",") >+nv12_file.write("\n};") >+nv12_file.close() >diff --git a/Source/ThirdParty/ANGLE/scripts/bootstrap.py b/Source/ThirdParty/ANGLE/scripts/bootstrap.py >new file mode 100644 >index 00000000000..e97a6b350b7 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/bootstrap.py >@@ -0,0 +1,38 @@ >+#!/usr/bin/python2 >+ >+# Copyright 2015 Google Inc. All rights reserved. >+# Use of this source code is governed by a BSD-style license that can be >+# found in the LICENSE file. >+ >+"""Generate .gclient file for Angle. >+ >+Because gclient won't accept "--name ." use a different name then edit. >+""" >+ >+import subprocess >+import sys >+ >+ >+def main(): >+ gclient_cmd = ('gclient config --name change2dot --unmanaged ' >+ 'https://chromium.googlesource.com/angle/angle.git') >+ try: >+ rc = subprocess.call(gclient_cmd, shell=True) >+ except OSError: >+ print 'could not run "%s" via shell' % gclient_cmd >+ sys.exit(1) >+ >+ if rc: >+ print 'failed command: "%s"' % gclient_cmd >+ sys.exit(1) >+ >+ with open('.gclient') as gclient_file: >+ content = gclient_file.read() >+ >+ with open('.gclient', 'w') as gclient_file: >+ gclient_file.write(content.replace('change2dot', '.')) >+ >+ print 'created .gclient' >+ >+if __name__ == '__main__': >+ main() >diff --git a/Source/ThirdParty/ANGLE/scripts/egl.xml b/Source/ThirdParty/ANGLE/scripts/egl.xml >new file mode 100644 >index 00000000000..ab0a6518b7f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/egl.xml >@@ -0,0 +1,3122 @@ >+<?xml version="1.0" encoding="UTF-8"?> >+<registry> >+ <!-- >+ Copyright (c) 2013-2017 The Khronos Group Inc. >+ >+ Permission is hereby granted, free of charge, to any person obtaining a >+ copy of this software and/or associated documentation files (the >+ "Materials"), to deal in the Materials without restriction, including >+ without limitation the rights to use, copy, modify, merge, publish, >+ distribute, sublicense, and/or sell copies of the Materials, and to >+ permit persons to whom the Materials are furnished to do so, subject to >+ the following conditions: >+ >+ The above copyright notice and this permission notice shall be included >+ in all copies or substantial portions of the Materials. >+ >+ THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, >+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF >+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. >+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY >+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, >+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE >+ MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. >+ --> >+ <!-- >+ This file, egl.xml, is the EGL API Registry. The older ".spec" file >+ format has been retired and will no longer be updated with new >+ extensions and API versions. The canonical version of the registry, >+ together with documentation, schema, and Python generator scripts used >+ to generate C header files for EGL, can be found in the Khronos Registry >+ at >+ https://www.github.com/KhronosGroup/EGL-Registry >+ --> >+ >+ <!-- SECTION: EGL type definitions. Does not include GL types. --> >+ <types> >+ <!-- These are dependencies EGL types require to be declared legally --> >+ <type name="khrplatform">#include <KHR/khrplatform.h></type> >+ <type name="eglplatform" requires="khrplatform">#include <EGL/eglplatform.h></type> >+ <type name="khronos_utime_nanoseconds_t" requires="khrplatform"/> >+ <type name="khronos_stime_nanoseconds_t" requires="khrplatform"/> >+ <type name="khronos_uint64_t" requires="khrplatform"/> >+ <type name="khronos_ssize_t" requires="khrplatform"/> >+ <type name="EGLNativeDisplayType" requires="eglplatform"/> >+ <type name="EGLNativePixmapType" requires="eglplatform"/> >+ <type name="EGLNativeWindowType" requires="eglplatform"/> >+ <type name="EGLint" requires="eglplatform"/> >+ <type name="NativeDisplayType" requires="eglplatform"/> >+ <type name="NativePixmapType" requires="eglplatform"/> >+ <type name="NativeWindowType" requires="eglplatform"/> >+ <type>struct <name>AHardwareBuffer</name>;</type> >+ <!-- Dummy placeholders for non-EGL types --> >+ <type name="Bool"/> >+ <!-- These are actual EGL types. --> >+ <type>typedef unsigned int <name>EGLBoolean</name>;</type> >+ <type>typedef unsigned int <name>EGLenum</name>;</type> >+ <type requires="khrplatform">typedef intptr_t <name>EGLAttribKHR</name>;</type> >+ <type requires="khrplatform">typedef intptr_t <name>EGLAttrib</name>;</type> >+ <type>typedef void *<name>EGLClientBuffer</name>;</type> >+ <type>typedef void *<name>EGLConfig</name>;</type> >+ <type>typedef void *<name>EGLContext</name>;</type> >+ <type>typedef void *<name>EGLDeviceEXT</name>;</type> >+ <type>typedef void *<name>EGLDisplay</name>;</type> >+ <type>typedef void *<name>EGLImage</name>;</type> >+ <type>typedef void *<name>EGLImageKHR</name>;</type> >+ <type>typedef void *<name>EGLLabelKHR</name>;</type> >+ <type>typedef void *<name>EGLObjectKHR</name>;</type> >+ <type>typedef void *<name>EGLOutputLayerEXT</name>;</type> >+ <type>typedef void *<name>EGLOutputPortEXT</name>;</type> >+ <type>typedef void *<name>EGLStreamKHR</name>;</type> >+ <type>typedef void *<name>EGLSurface</name>;</type> >+ <type>typedef void *<name>EGLSync</name>;</type> >+ <type>typedef void *<name>EGLSyncKHR</name>;</type> >+ <type>typedef void *<name>EGLSyncNV</name>;</type> >+ <type>typedef void (*<name>__eglMustCastToProperFunctionPointerType</name>)(void);</type> >+ <type requires="khrplatform">typedef khronos_utime_nanoseconds_t <name>EGLTimeKHR</name>;</type> >+ <type requires="khrplatform">typedef khronos_utime_nanoseconds_t <name>EGLTime</name>;</type> >+ <type requires="khrplatform">typedef khronos_utime_nanoseconds_t <name>EGLTimeNV</name>;</type> >+ <type requires="khrplatform">typedef khronos_utime_nanoseconds_t <name>EGLuint64NV</name>;</type> >+ <type requires="khrplatform">typedef khronos_uint64_t <name>EGLuint64KHR</name>;</type> >+ <type requires="khrplatform">typedef khronos_stime_nanoseconds_t <name>EGLnsecsANDROID</name>;</type> >+ <type>typedef int <name>EGLNativeFileDescriptorKHR</name>;</type> >+ <type requires="khrplatform">typedef khronos_ssize_t <name>EGLsizeiANDROID</name>;</type> >+ <type requires="EGLsizeiANDROID">typedef void (*<name>EGLSetBlobFuncANDROID</name>) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize);</type> >+ <type requires="EGLsizeiANDROID">typedef EGLsizeiANDROID (*<name>EGLGetBlobFuncANDROID</name>) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize);</type> >+ <type>struct <name>EGLClientPixmapHI</name> { >+ void *pData; >+ EGLint iWidth; >+ EGLint iHeight; >+ EGLint iStride; >+};</type> >+ <type>typedef void (<apientry/> *<name>EGLDEBUGPROCKHR</name>)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message);</type> >+ </types> >+ >+ <!-- SECTION: EGL enumerant (token) definitions. --> >+ >+ <!-- Bitmasks each have their own namespace, as do a few other >+ categories of enumeration --> >+ >+ <enums namespace="EGLSurfaceTypeMask" type="bitmask" comment="EGL_SURFACE_TYPE bits"> >+ <enum value="0x0001" name="EGL_PBUFFER_BIT"/> >+ <enum value="0x0002" name="EGL_PIXMAP_BIT"/> >+ <enum value="0x0004" name="EGL_WINDOW_BIT"/> >+ <enum value="0x0008" name="EGL_PBUFFER_IMAGE_BIT_TAO" comment="Unreleased TAO extension"/> >+ <enum value="0x0010" name="EGL_PBUFFER_PALETTE_IMAGE_BIT_TAO" comment="Unreleased TAO extension"/> >+ <enum value="0x0020" name="EGL_VG_COLORSPACE_LINEAR_BIT"/> >+ <enum value="0x0020" name="EGL_VG_COLORSPACE_LINEAR_BIT_KHR"/> >+ <enum value="0x0040" name="EGL_VG_ALPHA_FORMAT_PRE_BIT"/> >+ <enum value="0x0040" name="EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR"/> >+ <enum value="0x0080" name="EGL_LOCK_SURFACE_BIT_KHR"/> >+ <enum value="0x0100" name="EGL_OPTIMAL_FORMAT_BIT_KHR"/> >+ <enum value="0x0200" name="EGL_MULTISAMPLE_RESOLVE_BOX_BIT"/> >+ <enum value="0x0400" name="EGL_SWAP_BEHAVIOR_PRESERVED_BIT"/> >+ <enum value="0x0800" name="EGL_STREAM_BIT_KHR"/> >+ <!-- >+ <enum value="0x0800" name="EGL_STREAM_BIT_NV" comment="Draft EGL_NV_stream_producer_eglsurface extension (bug 8064)"/> >+ --> >+ <enum value="0x1000" name="EGL_MUTABLE_RENDER_BUFFER_BIT_KHR"/> >+ </enums> >+ >+ <enums namespace="EGLRenderableTypeMask" type="bitmask" comment="EGL_RENDERABLE_TYPE bits"> >+ <enum value="0x0001" name="EGL_OPENGL_ES_BIT"/> >+ <enum value="0x0002" name="EGL_OPENVG_BIT"/> >+ <enum value="0x0004" name="EGL_OPENGL_ES2_BIT"/> >+ <enum value="0x0008" name="EGL_OPENGL_BIT"/> >+ <enum value="0x0010" name="EGL_INTEROP_BIT_KHR" comment="EGL_KHR_interop"/> >+ <enum value="0x0020" name="EGL_OPENMAX_IL_BIT_KHR" comment="EGL_KHR_interop"/> >+ <enum value="0x00000040" name="EGL_OPENGL_ES3_BIT"/> >+ <enum value="0x00000040" name="EGL_OPENGL_ES3_BIT_KHR" alias="EGL_OPENGL_ES3_BIT"/> >+ </enums> >+ >+ <enums namespace="EGLLockUsageHintKHRMask" type="bitmask" comment="EGL_LOCK_USAGE_HINT_KHR bits"> >+ <enum value="0x0001" name="EGL_READ_SURFACE_BIT_KHR"/> >+ <enum value="0x0002" name="EGL_WRITE_SURFACE_BIT_KHR"/> >+ </enums> >+ >+ <enums namespace="EGLNativeBufferUsageFlags" type="bitmask" comment="EGL_NATIVE_BUFFER_USAGE_ANDROID bits"> >+ <enum value="0x00000001" name="EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID"/> >+ <enum value="0x00000002" name="EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID"/> >+ <enum value="0x00000004" name="EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID"/> >+ </enums> >+ >+ <enums namespace="EGLSyncFlagsKHR" type="bitmask" comment="Fence/reusable sync wait bits"> >+ <enum value="0x0001" name="EGL_SYNC_FLUSH_COMMANDS_BIT"/> >+ <enum value="0x0001" name="EGL_SYNC_FLUSH_COMMANDS_BIT_KHR" alias="EGL_SYNC_FLUSH_COMMANDS_BIT"/> >+ <enum value="0x0001" name="EGL_SYNC_FLUSH_COMMANDS_BIT_NV" alias="EGL_SYNC_FLUSH_COMMANDS_BIT"/> >+ </enums> >+ >+ <enums namespace="EGLDRMBufferUseMESAMask" type="bitmask" comment="EGL_DRM_BUFFER_USE_MESA bits"> >+ <enum value="0x00000001" name="EGL_DRM_BUFFER_USE_SCANOUT_MESA"/> >+ <enum value="0x00000002" name="EGL_DRM_BUFFER_USE_SHARE_MESA"/> >+ <enum value="0x00000004" name="EGL_DRM_BUFFER_USE_CURSOR_MESA"/> >+ </enums> >+ >+ <!-- Should be shared with GL, but aren't aren't since the >+ FORWARD_COMPATIBLE and DEBUG_BIT values are swapped in the >+ corresponding GL enums. Oops :-( --> >+ <enums namespace="EGLContextFlagMask" type="bitmask" comment="EGL_CONTEXT_FLAGS_KHR bits"> >+ <enum value="0x00000001" name="EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR"/> >+ <enum value="0x00000002" name="EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR"/> >+ <enum value="0x00000004" name="EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR"/> >+ </enums> >+ >+ <enums namespace="EGLContextProfileMask" type="bitmask" comment="Shared with GL"> >+ <enum value="0x00000001" name="EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT"/> >+ <enum value="0x00000001" name="EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR" alias="EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT"/> >+ <enum value="0x00000002" name="EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT"/> >+ <enum value="0x00000002" name="EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR" alias="EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT"/> >+ </enums> >+ >+ <!-- The default ("API") enum namespace starts here. While some >+ assigned values may overlap, and different parts of the >+ namespace are reserved for different purposes, it is a single >+ namespace. The "class" attribute indicates some of the reserved >+ purposes but is by no means complete (and cannot be, since many >+ tokens are reused for different purposes in different >+ extensions and API versions). --> >+ >+ <enums namespace="EGL" start="0x0000" end="0x2FFF" vendor="KHR" comment="Reserved for enumerants shared with WGL, GLX, and GL"> >+ <enum value="0" name="EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR"/> >+ <enum value="0x2097" name="EGL_CONTEXT_RELEASE_BEHAVIOR_KHR"/> >+ <enum value="0x2098" name="EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR"/> >+ </enums> >+ >+ <enums namespace="EGL" group="Boolean" vendor="ARB"> >+ <enum value="0" name="EGL_FALSE"/> >+ <enum value="1" name="EGL_TRUE"/> >+ </enums> >+ >+ <enums namespace="EGL" group="SpecialNumbers" vendor="ARB" comment="Tokens whose numeric value is intrinsically meaningful"> >+ <enum value="EGL_CAST(EGLint,-1)" name="EGL_DONT_CARE"/> >+ <enum value="EGL_CAST(EGLint,-1)" name="EGL_UNKNOWN"/> >+ <enum value="-1" name="EGL_NO_NATIVE_FENCE_FD_ANDROID"/> >+ <enum value="0" name="EGL_DEPTH_ENCODING_NONE_NV"/> >+ <enum value="EGL_CAST(EGLContext,0)" name="EGL_NO_CONTEXT"/> >+ <enum value="EGL_CAST(EGLDeviceEXT,0)" name="EGL_NO_DEVICE_EXT"/> >+ <enum value="EGL_CAST(EGLDisplay,0)" name="EGL_NO_DISPLAY"/> >+ <enum value="EGL_CAST(EGLImage,0)" name="EGL_NO_IMAGE"/> >+ <enum value="EGL_CAST(EGLImageKHR,0)" name="EGL_NO_IMAGE_KHR"/> >+ <enum value="EGL_CAST(EGLNativeDisplayType,0)" name="EGL_DEFAULT_DISPLAY"/> >+ <enum value="EGL_CAST(EGLNativeFileDescriptorKHR,-1)" name="EGL_NO_FILE_DESCRIPTOR_KHR"/> >+ <enum value="EGL_CAST(EGLOutputLayerEXT,0)" name="EGL_NO_OUTPUT_LAYER_EXT"/> >+ <enum value="EGL_CAST(EGLOutputPortEXT,0)" name="EGL_NO_OUTPUT_PORT_EXT"/> >+ <enum value="EGL_CAST(EGLStreamKHR,0)" name="EGL_NO_STREAM_KHR"/> >+ <enum value="EGL_CAST(EGLSurface,0)" name="EGL_NO_SURFACE"/> >+ <enum value="EGL_CAST(EGLSync,0)" name="EGL_NO_SYNC"/> >+ <enum value="EGL_CAST(EGLSyncKHR,0)" name="EGL_NO_SYNC_KHR" alias="EGL_NO_SYNC"/> >+ <enum value="EGL_CAST(EGLSyncNV,0)" name="EGL_NO_SYNC_NV" alias="EGL_NO_SYNC"/> >+ <enum value="EGL_CAST(EGLConfig,0)" name="EGL_NO_CONFIG_KHR"/> >+ <enum value="10000" name="EGL_DISPLAY_SCALING"/> >+ <enum value="0xFFFFFFFFFFFFFFFF" name="EGL_FOREVER" type="ull"/> >+ <enum value="0xFFFFFFFFFFFFFFFF" name="EGL_FOREVER_KHR" type="ull" alias="EGL_FOREVER"/> >+ <enum value="0xFFFFFFFFFFFFFFFF" name="EGL_FOREVER_NV" type="ull" alias="EGL_FOREVER"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3000" end="0x305F" vendor="KHR"> >+ <enum value="0x3000" name="EGL_SUCCESS"/> >+ <enum value="0x3001" name="EGL_NOT_INITIALIZED"/> >+ <enum value="0x3002" name="EGL_BAD_ACCESS"/> >+ <enum value="0x3003" name="EGL_BAD_ALLOC"/> >+ <enum value="0x3004" name="EGL_BAD_ATTRIBUTE"/> >+ <enum value="0x3005" name="EGL_BAD_CONFIG"/> >+ <enum value="0x3006" name="EGL_BAD_CONTEXT"/> >+ <enum value="0x3007" name="EGL_BAD_CURRENT_SURFACE"/> >+ <enum value="0x3008" name="EGL_BAD_DISPLAY"/> >+ <enum value="0x3009" name="EGL_BAD_MATCH"/> >+ <enum value="0x300A" name="EGL_BAD_NATIVE_PIXMAP"/> >+ <enum value="0x300B" name="EGL_BAD_NATIVE_WINDOW"/> >+ <enum value="0x300C" name="EGL_BAD_PARAMETER"/> >+ <enum value="0x300D" name="EGL_BAD_SURFACE"/> >+ <enum value="0x300E" name="EGL_CONTEXT_LOST"/> >+ <unused start="0x300F" end="0x301F" comment="for additional errors"/> >+ <enum value="0x3020" name="EGL_BUFFER_SIZE"/> >+ <enum value="0x3021" name="EGL_ALPHA_SIZE"/> >+ <enum value="0x3022" name="EGL_BLUE_SIZE"/> >+ <enum value="0x3023" name="EGL_GREEN_SIZE"/> >+ <enum value="0x3024" name="EGL_RED_SIZE"/> >+ <enum value="0x3025" name="EGL_DEPTH_SIZE"/> >+ <enum value="0x3026" name="EGL_STENCIL_SIZE"/> >+ <enum value="0x3027" name="EGL_CONFIG_CAVEAT"/> >+ <enum value="0x3028" name="EGL_CONFIG_ID"/> >+ <enum value="0x3029" name="EGL_LEVEL"/> >+ <enum value="0x302A" name="EGL_MAX_PBUFFER_HEIGHT"/> >+ <enum value="0x302B" name="EGL_MAX_PBUFFER_PIXELS"/> >+ <enum value="0x302C" name="EGL_MAX_PBUFFER_WIDTH"/> >+ <enum value="0x302D" name="EGL_NATIVE_RENDERABLE"/> >+ <enum value="0x302E" name="EGL_NATIVE_VISUAL_ID"/> >+ <enum value="0x302F" name="EGL_NATIVE_VISUAL_TYPE"/> >+ <enum value="0x3031" name="EGL_SAMPLES"/> >+ <enum value="0x3032" name="EGL_SAMPLE_BUFFERS"/> >+ <enum value="0x3033" name="EGL_SURFACE_TYPE"/> >+ <enum value="0x3034" name="EGL_TRANSPARENT_TYPE"/> >+ <enum value="0x3035" name="EGL_TRANSPARENT_BLUE_VALUE"/> >+ <enum value="0x3036" name="EGL_TRANSPARENT_GREEN_VALUE"/> >+ <enum value="0x3037" name="EGL_TRANSPARENT_RED_VALUE"/> >+ <enum value="0x3038" name="EGL_NONE" comment="Attribute list terminator"/> >+ <enum value="0x3039" name="EGL_BIND_TO_TEXTURE_RGB"/> >+ <enum value="0x303A" name="EGL_BIND_TO_TEXTURE_RGBA"/> >+ <enum value="0x303B" name="EGL_MIN_SWAP_INTERVAL"/> >+ <enum value="0x303C" name="EGL_MAX_SWAP_INTERVAL"/> >+ <enum value="0x303D" name="EGL_LUMINANCE_SIZE"/> >+ <enum value="0x303E" name="EGL_ALPHA_MASK_SIZE"/> >+ <enum value="0x303F" name="EGL_COLOR_BUFFER_TYPE"/> >+ <enum value="0x3040" name="EGL_RENDERABLE_TYPE"/> >+ <enum value="0x3041" name="EGL_MATCH_NATIVE_PIXMAP"/> >+ <enum value="0x3042" name="EGL_CONFORMANT"/> >+ <enum value="0x3042" name="EGL_CONFORMANT_KHR"/> >+ <enum value="0x3043" name="EGL_MATCH_FORMAT_KHR"/> >+ <unused start="0x3044" end="0x304F" comment="for additional config attributes"/> >+ <enum value="0x3050" name="EGL_SLOW_CONFIG"/> >+ <enum value="0x3051" name="EGL_NON_CONFORMANT_CONFIG"/> >+ <enum value="0x3052" name="EGL_TRANSPARENT_RGB"/> >+ <enum value="0x3053" name="EGL_VENDOR"/> >+ <enum value="0x3054" name="EGL_VERSION"/> >+ <enum value="0x3055" name="EGL_EXTENSIONS"/> >+ <enum value="0x3056" name="EGL_HEIGHT"/> >+ <enum value="0x3057" name="EGL_WIDTH"/> >+ <enum value="0x3058" name="EGL_LARGEST_PBUFFER"/> >+ <enum value="0x3059" name="EGL_DRAW"/> >+ <enum value="0x305A" name="EGL_READ"/> >+ <enum value="0x305B" name="EGL_CORE_NATIVE_ENGINE"/> >+ <enum value="0x305C" name="EGL_NO_TEXTURE"/> >+ <enum value="0x305D" name="EGL_TEXTURE_RGB"/> >+ <enum value="0x305E" name="EGL_TEXTURE_RGBA"/> >+ <enum value="0x305F" name="EGL_TEXTURE_2D"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3060-0x306F" vendor="TAO" comment="Reserved for Phil Huxley"> >+ <unused start="0x3060" end="0x306F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3070-0x307F" vendor="NOK" comment="Reserved for Jani Vaarala"> >+ <unused start="0x3070" end="0x307E"/> >+ <enum value="0x307F" name="EGL_Y_INVERTED_NOK"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3080-0x30AF" vendor="KHR"> >+ <enum value="0x3080" name="EGL_TEXTURE_FORMAT"/> >+ <enum value="0x3081" name="EGL_TEXTURE_TARGET"/> >+ <enum value="0x3082" name="EGL_MIPMAP_TEXTURE"/> >+ <enum value="0x3083" name="EGL_MIPMAP_LEVEL"/> >+ <enum value="0x3084" name="EGL_BACK_BUFFER"/> >+ <enum value="0x3085" name="EGL_SINGLE_BUFFER"/> >+ <enum value="0x3086" name="EGL_RENDER_BUFFER"/> >+ <enum value="0x3087" name="EGL_COLORSPACE" alias="EGL_VG_COLORSPACE"/> >+ <enum value="0x3087" name="EGL_VG_COLORSPACE"/> >+ <enum value="0x3088" name="EGL_ALPHA_FORMAT" alias="EGL_VG_ALPHA_FORMAT"/> >+ <enum value="0x3088" name="EGL_VG_ALPHA_FORMAT"/> >+ <enum value="0x3089" name="EGL_COLORSPACE_sRGB"/> >+ <enum value="0x3089" name="EGL_GL_COLORSPACE_SRGB" alias="EGL_COLORSPACE_sRGB"/> >+ <enum value="0x3089" name="EGL_GL_COLORSPACE_SRGB_KHR" alias="EGL_COLORSPACE_sRGB"/> >+ <enum value="0x3089" name="EGL_VG_COLORSPACE_sRGB" alias="EGL_COLORSPACE_sRGB"/> >+ <enum value="0x308A" name="EGL_COLORSPACE_LINEAR"/> >+ <enum value="0x308A" name="EGL_GL_COLORSPACE_LINEAR" alias="EGL_COLORSPACE_LINEAR"/> >+ <enum value="0x308A" name="EGL_GL_COLORSPACE_LINEAR_KHR" alias="EGL_COLORSPACE_LINEAR"/> >+ <enum value="0x308A" name="EGL_VG_COLORSPACE_LINEAR" alias="EGL_COLORSPACE_LINEAR"/> >+ <enum value="0x308B" name="EGL_ALPHA_FORMAT_NONPRE" alias="EGL_VG_ALPHA_FORMAT_NONPRE"/> >+ <enum value="0x308B" name="EGL_VG_ALPHA_FORMAT_NONPRE"/> >+ <enum value="0x308C" name="EGL_ALPHA_FORMAT_PRE" alias="EGL_VG_ALPHA_FORMAT_PRE"/> >+ <enum value="0x308C" name="EGL_VG_ALPHA_FORMAT_PRE"/> >+ <enum value="0x308D" name="EGL_CLIENT_APIS"/> >+ <enum value="0x308E" name="EGL_RGB_BUFFER"/> >+ <enum value="0x308F" name="EGL_LUMINANCE_BUFFER"/> >+ <enum value="0x3090" name="EGL_HORIZONTAL_RESOLUTION"/> >+ <enum value="0x3091" name="EGL_VERTICAL_RESOLUTION"/> >+ <enum value="0x3092" name="EGL_PIXEL_ASPECT_RATIO"/> >+ <enum value="0x3093" name="EGL_SWAP_BEHAVIOR"/> >+ <enum value="0x3094" name="EGL_BUFFER_PRESERVED"/> >+ <enum value="0x3095" name="EGL_BUFFER_DESTROYED"/> >+ <enum value="0x3096" name="EGL_OPENVG_IMAGE"/> >+ <enum value="0x3097" name="EGL_CONTEXT_CLIENT_TYPE"/> >+ <enum value="0x3098" name="EGL_CONTEXT_CLIENT_VERSION"/> >+ <enum value="0x3098" name="EGL_CONTEXT_MAJOR_VERSION" alias="EGL_CONTEXT_CLIENT_VERSION"/> >+ <enum value="0x3098" name="EGL_CONTEXT_MAJOR_VERSION_KHR" alias="EGL_CONTEXT_CLIENT_VERSION"/> >+ <enum value="0x3099" name="EGL_MULTISAMPLE_RESOLVE"/> >+ <enum value="0x309A" name="EGL_MULTISAMPLE_RESOLVE_DEFAULT"/> >+ <enum value="0x309B" name="EGL_MULTISAMPLE_RESOLVE_BOX"/> >+ <enum value="0x309C" name="EGL_CL_EVENT_HANDLE"/> >+ <enum value="0x309C" name="EGL_CL_EVENT_HANDLE_KHR" alias="EGL_CL_EVENT_HANDLE"/> >+ <enum value="0x309D" name="EGL_GL_COLORSPACE"/> >+ <enum value="0x309D" name="EGL_GL_COLORSPACE_KHR" alias="EGL_GL_COLORSPACE"/> >+ <unused start="0x309E" end="0x309F"/> >+ <enum value="0x30A0" name="EGL_OPENGL_ES_API"/> >+ <enum value="0x30A1" name="EGL_OPENVG_API"/> >+ <enum value="0x30A2" name="EGL_OPENGL_API"/> >+ <unused start="0x30A3" end="0x30AF" comment="for additional client API names"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x30B0-0x30BF" vendor="NV" comment="Reserved for Ignacio Llamas"> >+ <enum value="0x30B0" name="EGL_NATIVE_PIXMAP_KHR"/> >+ <enum value="0x30B1" name="EGL_GL_TEXTURE_2D"/> >+ <enum value="0x30B1" name="EGL_GL_TEXTURE_2D_KHR" alias="EGL_GL_TEXTURE_2D"/> >+ <enum value="0x30B2" name="EGL_GL_TEXTURE_3D"/> >+ <enum value="0x30B2" name="EGL_GL_TEXTURE_3D_KHR" alias="EGL_GL_TEXTURE_3D"/> >+ <enum value="0x30B3" name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X"/> >+ <enum value="0x30B3" name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR" alias="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X"/> >+ <enum value="0x30B4" name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X"/> >+ <enum value="0x30B4" name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR" alias="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X"/> >+ <enum value="0x30B5" name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y"/> >+ <enum value="0x30B5" name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR" alias="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y"/> >+ <enum value="0x30B6" name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y"/> >+ <enum value="0x30B6" name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR" alias="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y"/> >+ <enum value="0x30B7" name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z"/> >+ <enum value="0x30B7" name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR" alias="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z"/> >+ <enum value="0x30B8" name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z"/> >+ <enum value="0x30B8" name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR" alias="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z"/> >+ <enum value="0x30B9" name="EGL_GL_RENDERBUFFER"/> >+ <enum value="0x30B9" name="EGL_GL_RENDERBUFFER_KHR" alias="EGL_GL_RENDERBUFFER"/> >+ <enum value="0x30BA" name="EGL_VG_PARENT_IMAGE_KHR"/> >+ <enum value="0x30BC" name="EGL_GL_TEXTURE_LEVEL"/> >+ <enum value="0x30BC" name="EGL_GL_TEXTURE_LEVEL_KHR" alias="EGL_GL_TEXTURE_LEVEL"/> >+ <enum value="0x30BD" name="EGL_GL_TEXTURE_ZOFFSET"/> >+ <enum value="0x30BD" name="EGL_GL_TEXTURE_ZOFFSET_KHR" alias="EGL_GL_TEXTURE_ZOFFSET"/> >+ <enum value="0x30BE" name="EGL_POST_SUB_BUFFER_SUPPORTED_NV"/> >+ <enum value="0x30BF" name="EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x30C0-0x30CF" vendor="KHR"> >+ <enum value="0x30C0" name="EGL_FORMAT_RGB_565_EXACT_KHR"/> >+ <enum value="0x30C1" name="EGL_FORMAT_RGB_565_KHR"/> >+ <enum value="0x30C2" name="EGL_FORMAT_RGBA_8888_EXACT_KHR"/> >+ <enum value="0x30C3" name="EGL_FORMAT_RGBA_8888_KHR"/> >+ <enum value="0x30C4" name="EGL_MAP_PRESERVE_PIXELS_KHR"/> >+ <enum value="0x30C5" name="EGL_LOCK_USAGE_HINT_KHR"/> >+ <enum value="0x30C6" name="EGL_BITMAP_POINTER_KHR"/> >+ <enum value="0x30C7" name="EGL_BITMAP_PITCH_KHR"/> >+ <enum value="0x30C8" name="EGL_BITMAP_ORIGIN_KHR"/> >+ <enum value="0x30C9" name="EGL_BITMAP_PIXEL_RED_OFFSET_KHR"/> >+ <enum value="0x30CA" name="EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR"/> >+ <enum value="0x30CB" name="EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR"/> >+ <enum value="0x30CC" name="EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR"/> >+ <enum value="0x30CD" name="EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR"/> >+ <enum value="0x30CE" name="EGL_LOWER_LEFT_KHR"/> >+ <enum value="0x30CF" name="EGL_UPPER_LEFT_KHR"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x30D0" end="0x30DF" vendor="Symbian" comment="Reserved for Robert Palmer (bug #2545)"> >+ <unused start="0x30D0" end="0x30D1"/> >+ <enum value="0x30D2" name="EGL_IMAGE_PRESERVED"/> >+ <enum value="0x30D2" name="EGL_IMAGE_PRESERVED_KHR"/> >+ <unused start="0x30D3" end="0x30D9"/> >+ <enum value="0x30DA" name="EGL_SHARED_IMAGE_NOK" comment="Unreleased extension"/> >+ <unused start="0x30DB" end="0x30DF"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x30E0" end="0x30EF" vendor="NV" comment="Reserved for Russell Pflughaupt (bug #3314)"> >+ <enum value="0x30E0" name="EGL_COVERAGE_BUFFERS_NV"/> >+ <enum value="0x30E1" name="EGL_COVERAGE_SAMPLES_NV"/> >+ <enum value="0x30E2" name="EGL_DEPTH_ENCODING_NV"/> >+ <enum value="0x30E3" name="EGL_DEPTH_ENCODING_NONLINEAR_NV"/> >+ <unused start="0x30E4" end="0x30E5"/> >+ <enum value="0x30E6" name="EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV"/> >+ <enum value="0x30E7" name="EGL_SYNC_STATUS_NV"/> >+ <enum value="0x30E8" name="EGL_SIGNALED_NV"/> >+ <enum value="0x30E9" name="EGL_UNSIGNALED_NV"/> >+ <enum value="0x30EA" name="EGL_ALREADY_SIGNALED_NV"/> >+ <enum value="0x30EB" name="EGL_TIMEOUT_EXPIRED_NV"/> >+ <enum value="0x30EC" name="EGL_CONDITION_SATISFIED_NV"/> >+ <enum value="0x30ED" name="EGL_SYNC_TYPE_NV"/> >+ <enum value="0x30EE" name="EGL_SYNC_CONDITION_NV"/> >+ <enum value="0x30EF" name="EGL_SYNC_FENCE_NV"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x30F0" end="0x30FF" vendor="KHR"> >+ <enum value="0x30F0" name="EGL_SYNC_PRIOR_COMMANDS_COMPLETE"/> >+ <enum value="0x30F0" name="EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR" alias="EGL_SYNC_PRIOR_COMMANDS_COMPLETE"/> >+ <enum value="0x30F1" name="EGL_SYNC_STATUS"/> >+ <enum value="0x30F1" name="EGL_SYNC_STATUS_KHR" alias="EGL_SYNC_STATUS"/> >+ <enum value="0x30F2" name="EGL_SIGNALED"/> >+ <enum value="0x30F2" name="EGL_SIGNALED_KHR" alias="EGL_SIGNALED"/> >+ <enum value="0x30F3" name="EGL_UNSIGNALED"/> >+ <enum value="0x30F3" name="EGL_UNSIGNALED_KHR" alias="EGL_UNSIGNALED"/> >+ <enum value="0x30F5" name="EGL_TIMEOUT_EXPIRED"/> >+ <enum value="0x30F5" name="EGL_TIMEOUT_EXPIRED_KHR" alias="EGL_TIMEOUT_EXPIRED"/> >+ <enum value="0x30F6" name="EGL_CONDITION_SATISFIED"/> >+ <enum value="0x30F6" name="EGL_CONDITION_SATISFIED_KHR" alias="EGL_CONDITION_SATISFIED"/> >+ <enum value="0x30F7" name="EGL_SYNC_TYPE"/> >+ <enum value="0x30F7" name="EGL_SYNC_TYPE_KHR" alias="EGL_SYNC_TYPE"/> >+ <enum value="0x30F8" name="EGL_SYNC_CONDITION"/> >+ <enum value="0x30F8" name="EGL_SYNC_CONDITION_KHR" alias="EGL_SYNC_CONDITION"/> >+ <enum value="0x30F9" name="EGL_SYNC_FENCE"/> >+ <enum value="0x30F9" name="EGL_SYNC_FENCE_KHR" alias="EGL_SYNC_FENCE"/> >+ <enum value="0x30FA" name="EGL_SYNC_REUSABLE_KHR"/> >+ <enum value="0x30FB" name="EGL_CONTEXT_MINOR_VERSION"/> >+ <enum value="0x30FB" name="EGL_CONTEXT_MINOR_VERSION_KHR" alias="EGL_CONTEXT_MINOR_VERSION"/> >+ <enum value="0x30FC" name="EGL_CONTEXT_FLAGS_KHR"/> >+ <enum value="0x30FD" name="EGL_CONTEXT_OPENGL_PROFILE_MASK"/> >+ <enum value="0x30FD" name="EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR" alias="EGL_CONTEXT_OPENGL_PROFILE_MASK"/> >+ <enum value="0x30FE" name="EGL_SYNC_CL_EVENT"/> >+ <enum value="0x30FE" name="EGL_SYNC_CL_EVENT_KHR" alias="EGL_SYNC_CL_EVENT"/> >+ <enum value="0x30FF" name="EGL_SYNC_CL_EVENT_COMPLETE"/> >+ <enum value="0x30FF" name="EGL_SYNC_CL_EVENT_COMPLETE_KHR" alias="EGL_SYNC_CL_EVENT_COMPLETE"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3100" end="0x310F" vendor="IMG" comment="Reserved for Ben Bowman (Khronos bug 4748)"> >+ <enum value="0x3100" name="EGL_CONTEXT_PRIORITY_LEVEL_IMG"/> >+ <enum value="0x3101" name="EGL_CONTEXT_PRIORITY_HIGH_IMG"/> >+ <enum value="0x3102" name="EGL_CONTEXT_PRIORITY_MEDIUM_IMG"/> >+ <enum value="0x3103" name="EGL_CONTEXT_PRIORITY_LOW_IMG"/> >+ <unused start="0x3104"/> >+ <enum value="0x3105" name="EGL_NATIVE_BUFFER_MULTIPLANE_SEPARATE_IMG"/> >+ <enum value="0x3106" name="EGL_NATIVE_BUFFER_PLANE_OFFSET_IMG"/> >+ <unused start="0x3107" end="0x310F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3110" end="0x311F" vendor="ATX" comment="Reserved for Tim Renouf, Antix (Khronos bug 4949)"> >+ <enum value="0x3110" name="EGL_BITMAP_PIXEL_SIZE_KHR"/> >+ <unused start="0x3111" end="0x311F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3120" end="0x312F" vendor="AMD" comment="Reserved for David Garcia (Khronos bug 5149)"> >+ <unused start="0x3120" end="0x312F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3130" end="0x313F" vendor="NV" comment="Reserved for Greg Prisament (Khronos bug 5166)"> >+ <unused start="0x3130"/> >+ <enum value="0x3131" name="EGL_COVERAGE_SAMPLE_RESOLVE_NV"/> >+ <enum value="0x3132" name="EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV"/> >+ <enum value="0x3133" name="EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV"/> >+ <enum value="0x3134" name="EGL_MULTIVIEW_VIEW_COUNT_EXT"/> >+ <unused start="0x3135"/> >+ <enum value="0x3136" name="EGL_AUTO_STEREO_NV"/> >+ <unused start="0x3137"/> >+ <enum value="0x3138" name="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT"/> >+ <unused start="0x3139" end="0x313C"/> >+ <enum value="0x313D" name="EGL_BUFFER_AGE_KHR"/> >+ <enum value="0x313D" name="EGL_BUFFER_AGE_EXT" alias="EGL_BUFFER_AGE_KHR"/> >+ <unused start="0x313E" end="0x313F"/> >+ <enum value="0x313F" name="EGL_PLATFORM_DEVICE_EXT"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3140" end="0x314F" vendor="Google" comment="Reserved for Mathias Agopian (Khronos bug 5199)"> >+ <enum value="0x3140" name="EGL_NATIVE_BUFFER_ANDROID"/> >+ <enum value="0x3141" name="EGL_PLATFORM_ANDROID_KHR"/> >+ <enum value="0x3142" name="EGL_RECORDABLE_ANDROID"/> >+ <enum value="0x3143" name="EGL_NATIVE_BUFFER_USAGE_ANDROID"/> >+ <enum value="0x3144" name="EGL_SYNC_NATIVE_FENCE_ANDROID"/> >+ <enum value="0x3145" name="EGL_SYNC_NATIVE_FENCE_FD_ANDROID"/> >+ <enum value="0x3146" name="EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID"/> >+ <enum value="0x3147" name="EGL_FRAMEBUFFER_TARGET_ANDROID"/> >+ <unused start="0x3148" end="0x314B"/> >+ <enum value="0x314C" name="EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID"/> >+ <enum value="0x314D" name="EGL_GL_COLORSPACE_DEFAULT_EXT"/> >+ <unused start="0x314E" end="0x314F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3150" end="0x315F" vendor="NOK" comment="Reserved for Robert Palmer (Khronos bug 5368)"> >+ <unused start="0x3150" end="0x315F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3160" end="0x316F" vendor="Seaweed" comment="Reserved for Sree Sridharan (Khronos public bug 198)"> >+ <unused start="0x3160" end="0x316F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3170" end="0x318F" vendor="QNX" comment="Reserved for Joel Pilon (Khronos bug 5834)"> >+ <unused start="0x3170" end="0x318F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3190" end="0x31AF" vendor="FSL" comment="Reserved for Brian Murray, Freescale (Khronos bug 5939)"> >+ <unused start="0x3190" end="0x31AF"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x31B0" end="0x31BF" vendor="KHR" comment="Reserved for Marcus Lorentzon (Khronos bug 6437)"> >+ <enum value="0x31B0" name="EGL_CONTEXT_OPENGL_DEBUG"/> >+ <enum value="0x31B1" name="EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE"/> >+ <enum value="0x31B2" name="EGL_CONTEXT_OPENGL_ROBUST_ACCESS"/> >+ <enum value="0x31B3" name="EGL_CONTEXT_OPENGL_NO_ERROR_KHR"/> >+ <unused start="0x31B4" end="0x31BC" comment="0x31B3-0x31BC formerly reserved for EGL_image_stream"/> >+ <enum value="0x31BD" name="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR" alias="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY"/> >+ <enum value="0x31BD" name="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY"/> >+ <enum value="0x31BE" name="EGL_NO_RESET_NOTIFICATION"/> >+ <enum value="0x31BE" name="EGL_NO_RESET_NOTIFICATION_KHR" alias="EGL_NO_RESET_NOTIFICATION"/> >+ <enum value="0x31BE" name="EGL_NO_RESET_NOTIFICATION_EXT" alias="EGL_NO_RESET_NOTIFICATION"/> >+ <enum value="0x31BF" name="EGL_LOSE_CONTEXT_ON_RESET"/> >+ <enum value="0x31BF" name="EGL_LOSE_CONTEXT_ON_RESET_KHR" alias="EGL_LOSE_CONTEXT_ON_RESET"/> >+ <enum value="0x31BF" name="EGL_LOSE_CONTEXT_ON_RESET_EXT" alias="EGL_LOSE_CONTEXT_ON_RESET"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x31C0" end="0x31CF" vendor="QCOM" comment="Reserved for Maurice Ribble (Khronos bug 6644) - EGL_QCOM_create_image spec TBD"> >+ <unused start="0x31C0" end="0x31CF"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x31D0" end="0x31DF" vendor="MESA" comment="Reserved for Kristian Høgsberg (Khronos bug 6757)"> >+ <enum value="0x31D0" name="EGL_DRM_BUFFER_FORMAT_MESA"/> >+ <enum value="0x31D1" name="EGL_DRM_BUFFER_USE_MESA"/> >+ <enum value="0x31D2" name="EGL_DRM_BUFFER_FORMAT_ARGB32_MESA"/> >+ <enum value="0x31D3" name="EGL_DRM_BUFFER_MESA"/> >+ <enum value="0x31D4" name="EGL_DRM_BUFFER_STRIDE_MESA"/> >+ <enum value="0x31D5" name="EGL_PLATFORM_X11_KHR"/> >+ <enum value="0x31D5" name="EGL_PLATFORM_X11_EXT" alias="EGL_PLATFORM_X11_KHR"/> >+ <enum value="0x31D6" name="EGL_PLATFORM_X11_SCREEN_KHR"/> >+ <enum value="0x31D6" name="EGL_PLATFORM_X11_SCREEN_EXT" alias="EGL_PLATFORM_X11_SCREEN_KHR"/> >+ <enum value="0x31D7" name="EGL_PLATFORM_GBM_KHR"/> >+ <enum value="0x31D7" name="EGL_PLATFORM_GBM_MESA" alias="EGL_PLATFORM_GBM_KHR"/> >+ <enum value="0x31D8" name="EGL_PLATFORM_WAYLAND_KHR"/> >+ <enum value="0x31D8" name="EGL_PLATFORM_WAYLAND_EXT" alias="EGL_PLATFORM_WAYLAND_KHR"/> >+ <unused start="0x31D9" end="0x31DC"/> >+ <enum value="0x31DD" name="EGL_PLATFORM_SURFACELESS_MESA"/> >+ <unused start="0x31DE" end="0x31DF"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x31E0" end="0x31EF" vendor="HI" comment="Reserved for Mark Callow (Khronos bug 6799)"> >+ <unused start="0x31E0" end="0x31EF"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x31F0" end="0x31FF" vendor="KHR"> >+ <unused start="0x31F0" end="0x31FB" comment="Placeholders for draft extensions follow"/> >+ <!-- >+ <enum value="0x31F0" name="EGL_IMAGE_USE_AS_OPENGL_ES1_RENDERBUFFER_KHR" comment="Draft KHR_image_use_gl1_renderbuffer"/> >+ <enum value="0x31F1" name="EGL_IMAGE_USE_AS_OPENGL_ES1_TEXTURE_2D_KHR" comment="Draft KHR_image_use_gl1_texture_2d"/> >+ <enum value="0x31F2" name="EGL_IMAGE_USE_AS_OPENGL_ES1_TEXTURE_EXTERNAL_KHR" comment="Draft KHR_image_use_gl1_texture_external"/> >+ <enum value="0x31F3" name="EGL_IMAGE_USE_AS_OPENGL_ES2_RENDERBUFFER_KHR" comment="Draft KHR_image_use_gl2_renderbuffer"/> >+ <enum value="0x31F4" name="EGL_IMAGE_USE_AS_OPENGL_ES2_TEXTURE_2D_KHR" comment="Draft KHR_image_use_gl2_texture_2d"/> >+ <enum value="0x31F5" name="EGL_IMAGE_USE_AS_OPENGL_ES2_TEXTURE_EXTERNAL_KHR" comment="Draft KHR_image_use_gl2_texture_external"/> >+ <enum value="0x31F6" name="EGL_IMAGE_USE_AS_OPENVG_IMAGE_KHR" comment="Draft KHR_image_use_vg_vgimage"/> >+ <enum value="0x31F7" name="EGL_STREAM_CONSUMER_ATTACHMENT_MESA" comment="Draft EGL_MESA_image_stream_internal"/> >+ <enum value="0x31F8" name="EGL_NO_FORMAT_MESA" comment="Draft EGL_MESA_image_stream_internal"/> >+ <enum value="0x31F9" name="EGL_FORMAT_RGBA8888_MESA" comment="Draft EGL_MESA_image_stream_internal"/> >+ <enum value="0x31FA" name="EGL_FORMAT_RGB888_MESA" comment="Draft EGL_MESA_image_stream_internal"/> >+ <enum value="0x31FB" name="EGL_FORMAT_RGB565_MESA" comment="Draft EGL_MESA_image_stream_internal"/> >+ --> >+ <enum value="0x31FC" name="EGL_STREAM_FIFO_LENGTH_KHR"/> >+ <enum value="0x31FD" name="EGL_STREAM_TIME_NOW_KHR"/> >+ <enum value="0x31FE" name="EGL_STREAM_TIME_CONSUMER_KHR"/> >+ <enum value="0x31FF" name="EGL_STREAM_TIME_PRODUCER_KHR"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3200" end="0x320F" vendor="ANGLE" comment="Reserved for Daniel Koch, ANGLE Project (Khronos bug 7139)"> >+ <enum value="0x3200" name="EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE"/> >+ <enum value="0x3201" name="EGL_FIXED_SIZE_ANGLE"/> >+ <unused start="0x3202" end="0x320F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3210" end="0x321F" vendor="KHR"> >+ <enum value="0x3210" name="EGL_CONSUMER_LATENCY_USEC_KHR"/> >+ <unused start="0x3211"/> >+ <enum value="0x3212" name="EGL_PRODUCER_FRAME_KHR"/> >+ <enum value="0x3213" name="EGL_CONSUMER_FRAME_KHR"/> >+ <enum value="0x3214" name="EGL_STREAM_STATE_KHR"/> >+ <enum value="0x3215" name="EGL_STREAM_STATE_CREATED_KHR"/> >+ <enum value="0x3216" name="EGL_STREAM_STATE_CONNECTING_KHR"/> >+ <enum value="0x3217" name="EGL_STREAM_STATE_EMPTY_KHR"/> >+ <enum value="0x3218" name="EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR"/> >+ <enum value="0x3219" name="EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR"/> >+ <enum value="0x321A" name="EGL_STREAM_STATE_DISCONNECTED_KHR"/> >+ <enum value="0x321B" name="EGL_BAD_STREAM_KHR"/> >+ <enum value="0x321C" name="EGL_BAD_STATE_KHR"/> >+ <enum value="0x321D" name="EGL_BUFFER_COUNT_NV" comment="From EGL_NV_stream_producer_eglsurface, which has no known specification and was replaced by a KHR extension"/> >+ <enum value="0x321E" name="EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR"/> >+ <enum value="0x321F" name="EGL_SYNC_NEW_FRAME_NV"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3220" end="0x325F" vendor="NV" comment="Reserved for Greg Roth (Bug 8220)"> >+ <unused start="0x3220" end="0x322A"/> >+ <enum value="0x322B" name="EGL_BAD_DEVICE_EXT"/> >+ <enum value="0x322C" name="EGL_DEVICE_EXT"/> >+ <enum value="0x322D" name="EGL_BAD_OUTPUT_LAYER_EXT"/> >+ <enum value="0x322E" name="EGL_BAD_OUTPUT_PORT_EXT"/> >+ <enum value="0x322F" name="EGL_SWAP_INTERVAL_EXT"/> >+ <unused start="0x3230" end="0x3232"/> >+ <enum value="0x3233" name="EGL_DRM_DEVICE_FILE_EXT"/> >+ <enum value="0x3234" name="EGL_DRM_CRTC_EXT"/> >+ <enum value="0x3235" name="EGL_DRM_PLANE_EXT"/> >+ <enum value="0x3236" name="EGL_DRM_CONNECTOR_EXT"/> >+ <enum value="0x3237" name="EGL_OPENWF_DEVICE_ID_EXT"/> >+ <enum value="0x3238" name="EGL_OPENWF_PIPELINE_ID_EXT"/> >+ <enum value="0x3239" name="EGL_OPENWF_PORT_ID_EXT"/> >+ <enum value="0x323A" name="EGL_CUDA_DEVICE_NV"/> >+ <enum value="0x323B" name="EGL_CUDA_EVENT_HANDLE_NV"/> >+ <enum value="0x323C" name="EGL_SYNC_CUDA_EVENT_NV"/> >+ <enum value="0x323D" name="EGL_SYNC_CUDA_EVENT_COMPLETE_NV"/> >+ <unused start="0x323E"/> >+ <enum value="0x323F" name="EGL_STREAM_CROSS_PARTITION_NV"/> >+ <enum value="0x3240" name="EGL_STREAM_STATE_INITIALIZING_NV"/> >+ <enum value="0x3241" name="EGL_STREAM_TYPE_NV"/> >+ <enum value="0x3242" name="EGL_STREAM_PROTOCOL_NV"/> >+ <enum value="0x3243" name="EGL_STREAM_ENDPOINT_NV"/> >+ <enum value="0x3244" name="EGL_STREAM_LOCAL_NV"/> >+ <enum value="0x3245" name="EGL_STREAM_CROSS_PROCESS_NV"/> >+ <enum value="0x3246" name="EGL_STREAM_PROTOCOL_FD_NV"/> >+ <enum value="0x3247" name="EGL_STREAM_PRODUCER_NV"/> >+ <enum value="0x3248" name="EGL_STREAM_CONSUMER_NV"/> >+ <unused start="0x3239" end="0x324A"/> >+ <enum value="0x324B" name="EGL_STREAM_PROTOCOL_SOCKET_NV"/> >+ <enum value="0x324C" name="EGL_SOCKET_HANDLE_NV"/> >+ <enum value="0x324D" name="EGL_SOCKET_TYPE_NV"/> >+ <enum value="0x324E" name="EGL_SOCKET_TYPE_UNIX_NV"/> >+ <enum value="0x324F" name="EGL_SOCKET_TYPE_INET_NV"/> >+ <enum value="0x3250" name="EGL_MAX_STREAM_METADATA_BLOCKS_NV"/> >+ <enum value="0x3251" name="EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV"/> >+ <enum value="0x3252" name="EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV"/> >+ <enum value="0x3253" name="EGL_PRODUCER_METADATA_NV"/> >+ <enum value="0x3254" name="EGL_CONSUMER_METADATA_NV"/> >+ <enum value="0x3255" name="EGL_METADATA0_SIZE_NV"/> >+ <enum value="0x3256" name="EGL_METADATA1_SIZE_NV"/> >+ <enum value="0x3257" name="EGL_METADATA2_SIZE_NV"/> >+ <enum value="0x3258" name="EGL_METADATA3_SIZE_NV"/> >+ <enum value="0x3259" name="EGL_METADATA0_TYPE_NV"/> >+ <enum value="0x325A" name="EGL_METADATA1_TYPE_NV"/> >+ <enum value="0x325B" name="EGL_METADATA2_TYPE_NV"/> >+ <enum value="0x325C" name="EGL_METADATA3_TYPE_NV"/> >+ <unused start="0x325D" end="0x325F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3260" end="0x326F" vendor="BCOM" comment="Reserved for Gary Sweet, Broadcom (Public bug 620)"> >+ <unused start="0x3260" end="0x326F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3270" end="0x328F" vendor="ARM" comment="Reserved for Tom Cooksey (Bug 9963)"> >+ <enum value="0x3270" name="EGL_LINUX_DMA_BUF_EXT"/> >+ <enum value="0x3271" name="EGL_LINUX_DRM_FOURCC_EXT"/> >+ <enum value="0x3272" name="EGL_DMA_BUF_PLANE0_FD_EXT"/> >+ <enum value="0x3273" name="EGL_DMA_BUF_PLANE0_OFFSET_EXT"/> >+ <enum value="0x3274" name="EGL_DMA_BUF_PLANE0_PITCH_EXT"/> >+ <enum value="0x3275" name="EGL_DMA_BUF_PLANE1_FD_EXT"/> >+ <enum value="0x3276" name="EGL_DMA_BUF_PLANE1_OFFSET_EXT"/> >+ <enum value="0x3277" name="EGL_DMA_BUF_PLANE1_PITCH_EXT"/> >+ <enum value="0x3278" name="EGL_DMA_BUF_PLANE2_FD_EXT"/> >+ <enum value="0x3279" name="EGL_DMA_BUF_PLANE2_OFFSET_EXT"/> >+ <enum value="0x327A" name="EGL_DMA_BUF_PLANE2_PITCH_EXT"/> >+ <enum value="0x327B" name="EGL_YUV_COLOR_SPACE_HINT_EXT"/> >+ <enum value="0x327C" name="EGL_SAMPLE_RANGE_HINT_EXT"/> >+ <enum value="0x327D" name="EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT"/> >+ <enum value="0x327E" name="EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT"/> >+ <enum value="0x327F" name="EGL_ITU_REC601_EXT"/> >+ <enum value="0x3280" name="EGL_ITU_REC709_EXT"/> >+ <enum value="0x3281" name="EGL_ITU_REC2020_EXT"/> >+ <enum value="0x3282" name="EGL_YUV_FULL_RANGE_EXT"/> >+ <enum value="0x3283" name="EGL_YUV_NARROW_RANGE_EXT"/> >+ <enum value="0x3284" name="EGL_YUV_CHROMA_SITING_0_EXT"/> >+ <enum value="0x3285" name="EGL_YUV_CHROMA_SITING_0_5_EXT"/> >+ <enum value="0x3286" name="EGL_DISCARD_SAMPLES_ARM"/> >+ <unused start="0x3287" end="0x3289"/> >+ <enum value="0x328A" name="EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM"/> >+ <unused start="0x328B" end="0x328F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3290" end="0x329F" vendor="MESA" comment="Reserved for John Kåre Alsaker (Public bug 757)"> >+ <unused start="0x3290" end="0x329F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x32A0" end="0x32AF" vendor="Samsung" comment="Reserved for Dongyeon Kim (Public bug 880)"> >+ <enum value="0x32A0" name="EGL_NATIVE_BUFFER_TIZEN"/> >+ <enum value="0x32A1" name="EGL_NATIVE_SURFACE_TIZEN"/> >+ <unused start="0x32A2" end="0x32AF"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x32B0" end="0x32BF" vendor="QCOM" comment="Reserved for Jeff Vigil (Bug 10663) - EGL_QCOM_lock_image spec TBD"> >+ <unused start="0x32B0" end="0x32BF"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x32C0" end="0x32CF" vendor="Vivante" comment="Reserved for Yanjun Zhang (Bug 11498)"> >+ <enum value="0x32C0" name="EGL_PROTECTED_CONTENT_EXT"/> >+ <unused start="0x32C1" end="0x32CF"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x32D0" end="0x32EF" vendor="QCOM" comment="Reserved for Jeff Vigil (Bug 11735) - EGL_QCOM_gpu_perf spec TBD + Bug 12286 - EGL_QCOM_content_protection spec TBD"> >+ <unused start="0x32D0" end="0x32EF"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x32F0" end="0x32FF" vendor="BCOM" comment="Reserved for Gary Sweet, Broadcom (Bug 12870)"> >+ <unused start="0x32F0" end="0x32FF"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3300" end="0x331F" vendor="QCOM" comment="Reserved for Jeff Vigil (Bugs 12973,12849) - EGL_EXT_yuv_surface spec TBD"> >+ <enum value="0x3300" name="EGL_YUV_BUFFER_EXT"/> >+ <enum value="0x3301" name="EGL_YUV_ORDER_EXT"/> >+ <enum value="0x3302" name="EGL_YUV_ORDER_YUV_EXT"/> >+ <enum value="0x3303" name="EGL_YUV_ORDER_YVU_EXT"/> >+ <enum value="0x3304" name="EGL_YUV_ORDER_YUYV_EXT"/> >+ <enum value="0x3305" name="EGL_YUV_ORDER_UYVY_EXT"/> >+ <enum value="0x3306" name="EGL_YUV_ORDER_YVYU_EXT"/> >+ <enum value="0x3307" name="EGL_YUV_ORDER_VYUY_EXT"/> >+ <enum value="0x3308" name="EGL_YUV_ORDER_AYUV_EXT"/> >+ <unused start="0x3309"/> >+ <enum value="0x330A" name="EGL_YUV_CSC_STANDARD_EXT"/> >+ <enum value="0x330B" name="EGL_YUV_CSC_STANDARD_601_EXT"/> >+ <enum value="0x330C" name="EGL_YUV_CSC_STANDARD_709_EXT"/> >+ <enum value="0x330D" name="EGL_YUV_CSC_STANDARD_2020_EXT"/> >+ <unused start="0x330E" end="0x3310"/> >+ <enum value="0x3311" name="EGL_YUV_NUMBER_OF_PLANES_EXT"/> >+ <enum value="0x3312" name="EGL_YUV_SUBSAMPLE_EXT"/> >+ <enum value="0x3313" name="EGL_YUV_SUBSAMPLE_4_2_0_EXT"/> >+ <enum value="0x3314" name="EGL_YUV_SUBSAMPLE_4_2_2_EXT"/> >+ <enum value="0x3315" name="EGL_YUV_SUBSAMPLE_4_4_4_EXT"/> >+ <unused start="0x3316"/> >+ <enum value="0x3317" name="EGL_YUV_DEPTH_RANGE_EXT"/> >+ <enum value="0x3318" name="EGL_YUV_DEPTH_RANGE_LIMITED_EXT"/> >+ <enum value="0x3319" name="EGL_YUV_DEPTH_RANGE_FULL_EXT"/> >+ <enum value="0x331A" name="EGL_YUV_PLANE_BPP_EXT"/> >+ <enum value="0x331B" name="EGL_YUV_PLANE_BPP_0_EXT"/> >+ <enum value="0x331C" name="EGL_YUV_PLANE_BPP_8_EXT"/> >+ <enum value="0x331D" name="EGL_YUV_PLANE_BPP_10_EXT"/> >+ <unused start="0x331E" end="0x331F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3320" end="0x339F" vendor="NV" comment="Reserved for James Jones (Bug 13209)"> >+ <unused start="0x3320" end="0x3327"/> >+ <enum value="0x3328" name="EGL_PENDING_METADATA_NV"/> >+ <enum value="0x3329" name="EGL_PENDING_FRAME_NV"/> >+ <enum value="0x332A" name="EGL_STREAM_TIME_PENDING_NV"/> >+ <unused start="0x332B"/> >+ <enum value="0x332C" name="EGL_YUV_PLANE0_TEXTURE_UNIT_NV"/> >+ <enum value="0x332D" name="EGL_YUV_PLANE1_TEXTURE_UNIT_NV"/> >+ <enum value="0x332E" name="EGL_YUV_PLANE2_TEXTURE_UNIT_NV"/> >+ <unused start="0x332F" end="0x3333"/> >+ <enum value="0x3334" name="EGL_SUPPORT_RESET_NV"/> >+ <enum value="0x3335" name="EGL_SUPPORT_REUSE_NV"/> >+ <enum value="0x3336" name="EGL_STREAM_FIFO_SYNCHRONOUS_NV"/> >+ <enum value="0x3337" name="EGL_PRODUCER_MAX_FRAME_HINT_NV"/> >+ <enum value="0x3338" name="EGL_CONSUMER_MAX_FRAME_HINT_NV"/> >+ <enum value="0x3339" name="EGL_COLOR_COMPONENT_TYPE_EXT"/> >+ <enum value="0x333A" name="EGL_COLOR_COMPONENT_TYPE_FIXED_EXT"/> >+ <enum value="0x333B" name="EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT"/> >+ <enum value="0x333C" name="EGL_DRM_MASTER_FD_EXT"/> >+ <unused start="0x333D" end="0x333E"/> >+ <enum value="0x333F" name="EGL_GL_COLORSPACE_BT2020_LINEAR_EXT"/> >+ <enum value="0x3340" name="EGL_GL_COLORSPACE_BT2020_PQ_EXT"/> >+ <enum value="0x3341" name="EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT"/> >+ <enum value="0x3342" name="EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT"/> >+ <enum value="0x3343" name="EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT"/> >+ <enum value="0x3344" name="EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT"/> >+ <enum value="0x3345" name="EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT"/> >+ <enum value="0x3346" name="EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT"/> >+ <enum value="0x3347" name="EGL_SMPTE2086_WHITE_POINT_X_EXT"/> >+ <enum value="0x3348" name="EGL_SMPTE2086_WHITE_POINT_Y_EXT"/> >+ <enum value="0x3349" name="EGL_SMPTE2086_MAX_LUMINANCE_EXT"/> >+ <enum value="0x334A" name="EGL_SMPTE2086_MIN_LUMINANCE_EXT"/> >+ <enum value="50000" name="EGL_METADATA_SCALING_EXT"/> >+ <unused start="0x334B"/> >+ <enum value="0x334C" name="EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV"/> >+ <enum value="0x334D" name="EGL_STREAM_CROSS_OBJECT_NV"/> >+ <enum value="0x334E" name="EGL_STREAM_CROSS_DISPLAY_NV"/> >+ <enum value="0x334F" name="EGL_STREAM_CROSS_SYSTEM_NV"/> >+ <enum value="0x3350" name="EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT"/> >+ <enum value="0x3351" name="EGL_GL_COLORSPACE_SCRGB_EXT"/> >+ <enum value="0x3352" name="EGL_TRACK_REFERENCES_KHR"/> >+ <unused start="0x3353" end="0x3356"/> >+ <enum value="0x3357" name="EGL_CONTEXT_PRIORITY_REALTIME_NV"/> >+ <unused start="0x3358" end="0x335F"/> >+ <enum value="0x3360" name="EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT"/> >+ <enum value="0x3361" name="EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT"/> >+ <enum value="0x3362" name="EGL_GL_COLORSPACE_DISPLAY_P3_LINEAR_EXT"/> >+ <enum value="0x3363" name="EGL_GL_COLORSPACE_DISPLAY_P3_EXT"/> >+ <enum value="0x3364" name="EGL_SYNC_CLIENT_EXT"/> >+ <enum value="0x3365" name="EGL_SYNC_CLIENT_SIGNAL_EXT"/> >+ <unused start="0x3366" end="0x339F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x33A0" end="0x33AF" vendor="ANGLE" comment="Reserved for Shannon Woods (Bug 13175)"> >+ <enum value="0x33A0" name="EGL_D3D9_DEVICE_ANGLE"/> >+ <enum value="0x33A1" name="EGL_D3D11_DEVICE_ANGLE"/> >+ <unused start="0x33A2" end="0x33AF"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x33B0" end="0x33BF" vendor="KHR" comment="Reserved for EGL_KHR_debug / Jeff Vigil (Bug 13357)"> >+ <enum value="0x33B0" name="EGL_OBJECT_THREAD_KHR"/> >+ <enum value="0x33B1" name="EGL_OBJECT_DISPLAY_KHR"/> >+ <enum value="0x33B2" name="EGL_OBJECT_CONTEXT_KHR"/> >+ <enum value="0x33B3" name="EGL_OBJECT_SURFACE_KHR"/> >+ <enum value="0x33B4" name="EGL_OBJECT_IMAGE_KHR"/> >+ <enum value="0x33B5" name="EGL_OBJECT_SYNC_KHR"/> >+ <enum value="0x33B6" name="EGL_OBJECT_STREAM_KHR"/> >+ <unused start="0x33B7"/> >+ <enum value="0x33B8" name="EGL_DEBUG_CALLBACK_KHR"/> >+ <enum value="0x33B9" name="EGL_DEBUG_MSG_CRITICAL_KHR"/> >+ <enum value="0x33BA" name="EGL_DEBUG_MSG_ERROR_KHR"/> >+ <enum value="0x33BB" name="EGL_DEBUG_MSG_WARN_KHR"/> >+ <enum value="0x33BC" name="EGL_DEBUG_MSG_INFO_KHR"/> >+ <unused start="0x33BD" end="0x33BF"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x33C0" end="0x33DF" vendor="BCOM" comment="Reserved for Gary Sweet (Bug 12203)"> >+ <unused start="0x33C0" end="0x33DF"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x33E0" end="0x342F" vendor="QCOM" comment="Reserved for Jeff Vigil (Bugs 10663,13364)"> >+ <unused start="0x33E0" end="0x342F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3430" end="0x343F" vendor="ANDROID" comment="Reserved for Pablo Ceballos (Bug 15874)"> >+ <enum value="EGL_CAST(EGLnsecsANDROID,-2)" name="EGL_TIMESTAMP_PENDING_ANDROID"/> >+ <enum value="EGL_CAST(EGLnsecsANDROID,-1)" name="EGL_TIMESTAMP_INVALID_ANDROID"/> >+ <enum value="0x3430" name="EGL_TIMESTAMPS_ANDROID"/> >+ <enum value="0x3431" name="EGL_COMPOSITE_DEADLINE_ANDROID"/> >+ <enum value="0x3432" name="EGL_COMPOSITE_INTERVAL_ANDROID"/> >+ <enum value="0x3433" name="EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID"/> >+ <enum value="0x3434" name="EGL_REQUESTED_PRESENT_TIME_ANDROID"/> >+ <enum value="0x3435" name="EGL_RENDERING_COMPLETE_TIME_ANDROID"/> >+ <enum value="0x3436" name="EGL_COMPOSITION_LATCH_TIME_ANDROID"/> >+ <enum value="0x3437" name="EGL_FIRST_COMPOSITION_START_TIME_ANDROID"/> >+ <enum value="0x3438" name="EGL_LAST_COMPOSITION_START_TIME_ANDROID"/> >+ <enum value="0x3439" name="EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID"/> >+ <enum value="0x343A" name="EGL_DISPLAY_PRESENT_TIME_ANDROID"/> >+ <enum value="0x343B" name="EGL_DEQUEUE_READY_TIME_ANDROID"/> >+ <enum value="0x343C" name="EGL_READS_DONE_TIME_ANDROID"/> >+ <unused start="0x343D" end="0x343F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3440" end="0x344F" vendor="ANDROID" comment="Reserved for Kristian Kristensen (Bug 16033)"> >+ <enum value="0x3440" name="EGL_DMA_BUF_PLANE3_FD_EXT"/> >+ <enum value="0x3441" name="EGL_DMA_BUF_PLANE3_OFFSET_EXT"/> >+ <enum value="0x3442" name="EGL_DMA_BUF_PLANE3_PITCH_EXT"/> >+ <enum value="0x3443" name="EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT"/> >+ <enum value="0x3444" name="EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT"/> >+ <enum value="0x3445" name="EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT"/> >+ <enum value="0x3446" name="EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT"/> >+ <enum value="0x3447" name="EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT"/> >+ <enum value="0x3448" name="EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT"/> >+ <enum value="0x3449" name="EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT"/> >+ <enum value="0x344A" name="EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT"/> >+ <unused start="0x344B" end="0x344F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3450" end="0x345F" vendor="ANGLE" comment="Reserved for Shannon Woods (Bug 16106)"> >+ <unused start="0x3450" end="0x345F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3460" end="0x346F" vendor="COREAVI" comment="Reserved for Daniel Herring (Bug 16162)"> >+ <enum value="0x3460" name="EGL_PRIMARY_COMPOSITOR_CONTEXT_EXT"/> >+ <enum value="0x3461" name="EGL_EXTERNAL_REF_ID_EXT"/> >+ <enum value="0x3462" name="EGL_COMPOSITOR_DROP_NEWEST_FRAME_EXT"/> >+ <enum value="0x3463" name="EGL_COMPOSITOR_KEEP_NEWEST_FRAME_EXT"/> >+ <enum value="0x3464" name="EGL_FRONT_BUFFER_EXT"/> >+ <unused start="0x3465" end="0x346F"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3470" end="0x347F" vendor="EXT" comment="Reserved for Daniel Stone (PR 14)"> >+ <enum value="0x3470" name="EGL_IMPORT_SYNC_TYPE_EXT"/> >+ <enum value="0x3471" name="EGL_IMPORT_IMPLICIT_SYNC_EXT"/> >+ <enum value="0x3472" name="EGL_IMPORT_EXPLICIT_SYNC_EXT"/> >+ </enums> >+ <enums namespace="EGL" start="0x3480" end="0x348F" vendor="ANGLE" comment="Reserved for Courtney Goeltzenleuchter - ANGLE (gitlab EGL bug 7)"> >+ <unused start="0x3480" end="0x348F"/> >+ </enums> >+ >+<!-- Please remember that new enumerant allocations must be obtained by >+ request to the Khronos API registrar (see comments at the top of this >+ file) File requests in the Khronos Bugzilla, EGL project, Registry >+ component. Also note that some EGL enum values are shared with other >+ Khronos APIs, and new ranges should be allocated with such overlaps in >+ mind. --> >+ >+<!-- Reservable for future use. To generate a new range, allocate multiples >+ of 16 starting at the lowest available point in this block. --> >+ <enums namespace="EGL" start="0x3490" end="0x3FFF" vendor="KHR" comment="Reserved for future use"> >+ <unused start="0x3490" end="0x3FFF"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x8F70" end="0x8F7F" vendor="HI" comment="For Mark Callow, Khronos bug 4055. Shared with GL."> >+ <enum value="0x8F70" name="EGL_COLOR_FORMAT_HI"/> >+ <enum value="0x8F71" name="EGL_COLOR_RGB_HI"/> >+ <enum value="0x8F72" name="EGL_COLOR_RGBA_HI"/> >+ <enum value="0x8F73" name="EGL_COLOR_ARGB_HI"/> >+ <enum value="0x8F74" name="EGL_CLIENT_PIXMAP_POINTER_HI"/> >+ </enums> >+ >+ <!-- SECTION: EGL command definitions. --> >+ <commands namespace="EGL"> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglBindAPI</name></proto> >+ <param><ptype>EGLenum</ptype> <name>api</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglBindTexImage</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglChooseConfig</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ <param><ptype>EGLConfig</ptype> *<name>configs</name></param> >+ <param><ptype>EGLint</ptype> <name>config_size</name></param> >+ <param><ptype>EGLint</ptype> *<name>num_config</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglClientSignalSyncEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSync</ptype> <name>sync</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLint</ptype> <name>eglClientWaitSync</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSync</ptype> <name>sync</name></param> >+ <param><ptype>EGLint</ptype> <name>flags</name></param> >+ <param><ptype>EGLTime</ptype> <name>timeout</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLint</ptype> <name>eglClientWaitSyncKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSyncKHR</ptype> <name>sync</name></param> >+ <param><ptype>EGLint</ptype> <name>flags</name></param> >+ <param><ptype>EGLTimeKHR</ptype> <name>timeout</name></param> >+ <alias name="eglClientWaitSync"/> >+ </command> >+ <command> >+ <proto><ptype>EGLint</ptype> <name>eglClientWaitSyncNV</name></proto> >+ <param><ptype>EGLSyncNV</ptype> <name>sync</name></param> >+ <param><ptype>EGLint</ptype> <name>flags</name></param> >+ <param><ptype>EGLTimeNV</ptype> <name>timeout</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglCopyBuffers</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLNativePixmapType</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLContext</ptype> <name>eglCreateContext</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLConfig</ptype> <name>config</name></param> >+ <param><ptype>EGLContext</ptype> <name>share_context</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLImageKHR</ptype> <name>eglCreateDRMImageMESA</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLSyncNV</ptype> <name>eglCreateFenceSyncNV</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLenum</ptype> <name>condition</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLImage</ptype> <name>eglCreateImage</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLContext</ptype> <name>ctx</name></param> >+ <param><ptype>EGLenum</ptype> <name>target</name></param> >+ <param><ptype>EGLClientBuffer</ptype> <name>buffer</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLImageKHR</ptype> <name>eglCreateImageKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLContext</ptype> <name>ctx</name></param> >+ <param><ptype>EGLenum</ptype> <name>target</name></param> >+ <param><ptype>EGLClientBuffer</ptype> <name>buffer</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLClientBuffer</ptype> <name>eglCreateNativeClientBufferANDROID</name></proto> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLSurface</ptype> <name>eglCreatePbufferFromClientBuffer</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLenum</ptype> <name>buftype</name></param> >+ <param><ptype>EGLClientBuffer</ptype> <name>buffer</name></param> >+ <param><ptype>EGLConfig</ptype> <name>config</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLSurface</ptype> <name>eglCreatePbufferSurface</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLConfig</ptype> <name>config</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLSurface</ptype> <name>eglCreatePixmapSurface</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLConfig</ptype> <name>config</name></param> >+ <param><ptype>EGLNativePixmapType</ptype> <name>pixmap</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLSurface</ptype> <name>eglCreatePixmapSurfaceHI</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLConfig</ptype> <name>config</name></param> >+ <param>struct <ptype>EGLClientPixmapHI</ptype> *<name>pixmap</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLSurface</ptype> <name>eglCreatePlatformPixmapSurface</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLConfig</ptype> <name>config</name></param> >+ <param>void *<name>native_pixmap</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLSurface</ptype> <name>eglCreatePlatformPixmapSurfaceEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLConfig</ptype> <name>config</name></param> >+ <param>void *<name>native_pixmap</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLSurface</ptype> <name>eglCreatePlatformWindowSurface</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLConfig</ptype> <name>config</name></param> >+ <param>void *<name>native_window</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLSurface</ptype> <name>eglCreatePlatformWindowSurfaceEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLConfig</ptype> <name>config</name></param> >+ <param>void *<name>native_window</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLStreamKHR</ptype> <name>eglCreateStreamFromFileDescriptorKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLNativeFileDescriptorKHR</ptype> <name>file_descriptor</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLStreamKHR</ptype> <name>eglCreateStreamKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLStreamKHR</ptype> <name>eglCreateStreamAttribKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLSurface</ptype> <name>eglCreateStreamProducerSurfaceKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLConfig</ptype> <name>config</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLSyncKHR</ptype> <name>eglCreateStreamSyncNV</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param><ptype>EGLenum</ptype> <name>type</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLSync</ptype> <name>eglCreateSync</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLenum</ptype> <name>type</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLSyncKHR</ptype> <name>eglCreateSyncKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLenum</ptype> <name>type</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLSyncKHR</ptype> <name>eglCreateSync64KHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLenum</ptype> <name>type</name></param> >+ <param>const <ptype>EGLAttribKHR</ptype> *<name>attrib_list</name></param> >+ <alias name="eglCreateSync"/> >+ </command> >+ <command> >+ <proto><ptype>EGLSurface</ptype> <name>eglCreateWindowSurface</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLConfig</ptype> <name>config</name></param> >+ <param><ptype>EGLNativeWindowType</ptype> <name>win</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLint</ptype> <name>eglDebugMessageControlKHR</name></proto> >+ <param><ptype>EGLDEBUGPROCKHR</ptype> <name>callback</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglDestroyContext</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLContext</ptype> <name>ctx</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglDestroyImage</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLImage</ptype> <name>image</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglDestroyImageKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLImageKHR</ptype> <name>image</name></param> >+ <alias name="eglDestroyImage"/> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglDestroyStreamKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglDestroySurface</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglDestroySync</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSync</ptype> <name>sync</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglDestroySyncKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSyncKHR</ptype> <name>sync</name></param> >+ <alias name="eglDestroySync"/> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglDestroySyncNV</name></proto> >+ <param><ptype>EGLSyncNV</ptype> <name>sync</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLint</ptype> <name>eglDupNativeFenceFDANDROID</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSyncKHR</ptype> <name>sync</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglExportDMABUFImageMESA</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLImageKHR</ptype> <name>image</name></param> >+ <param>int *<name>fds</name></param> >+ <param><ptype>EGLint</ptype> *<name>strides</name></param> >+ <param><ptype>EGLint</ptype> *<name>offsets</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglExportDMABUFImageQueryMESA</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLImageKHR</ptype> <name>image</name></param> >+ <param>int *<name>fourcc</name></param> >+ <param>int *<name>num_planes</name></param> >+ <param><ptype>EGLuint64KHR</ptype> *<name>modifiers</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglExportDRMImageMESA</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLImageKHR</ptype> <name>image</name></param> >+ <param><ptype>EGLint</ptype> *<name>name</name></param> >+ <param><ptype>EGLint</ptype> *<name>handle</name></param> >+ <param><ptype>EGLint</ptype> *<name>stride</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglFenceNV</name></proto> >+ <param><ptype>EGLSyncNV</ptype> <name>sync</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglGetConfigAttrib</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLConfig</ptype> <name>config</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglGetConfigs</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLConfig</ptype> *<name>configs</name></param> >+ <param><ptype>EGLint</ptype> <name>config_size</name></param> >+ <param><ptype>EGLint</ptype> *<name>num_config</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLContext</ptype> <name>eglGetCurrentContext</name></proto> >+ </command> >+ <command> >+ <proto><ptype>EGLDisplay</ptype> <name>eglGetCurrentDisplay</name></proto> >+ </command> >+ <command> >+ <proto><ptype>EGLSurface</ptype> <name>eglGetCurrentSurface</name></proto> >+ <param><ptype>EGLint</ptype> <name>readdraw</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLDisplay</ptype> <name>eglGetDisplay</name></proto> >+ <param><ptype>EGLNativeDisplayType</ptype> <name>display_id</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLint</ptype> <name>eglGetError</name></proto> >+ </command> >+ <command> >+ <proto><ptype>EGLClientBuffer</ptype> <name>eglGetNativeClientBufferANDROID</name></proto> >+ <param>const struct <ptype>AHardwareBuffer</ptype> *<name>buffer</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglGetOutputLayersEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ <param><ptype>EGLOutputLayerEXT</ptype> *<name>layers</name></param> >+ <param><ptype>EGLint</ptype> <name>max_layers</name></param> >+ <param><ptype>EGLint</ptype> *<name>num_layers</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglGetOutputPortsEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ <param><ptype>EGLOutputPortEXT</ptype> *<name>ports</name></param> >+ <param><ptype>EGLint</ptype> <name>max_ports</name></param> >+ <param><ptype>EGLint</ptype> *<name>num_ports</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLDisplay</ptype> <name>eglGetPlatformDisplay</name></proto> >+ <param><ptype>EGLenum</ptype> <name>platform</name></param> >+ <param>void *<name>native_display</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLDisplay</ptype> <name>eglGetPlatformDisplayEXT</name></proto> >+ <param><ptype>EGLenum</ptype> <name>platform</name></param> >+ <param>void *<name>native_display</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>__eglMustCastToProperFunctionPointerType</ptype> <name>eglGetProcAddress</name></proto> >+ <param>const char *<name>procname</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLNativeFileDescriptorKHR</ptype> <name>eglGetStreamFileDescriptorKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglGetSyncAttrib</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSync</ptype> <name>sync</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLAttrib</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglGetSyncAttribKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSyncKHR</ptype> <name>sync</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglGetSyncAttribNV</name></proto> >+ <param><ptype>EGLSyncNV</ptype> <name>sync</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLuint64NV</ptype> <name>eglGetSystemTimeFrequencyNV</name></proto> >+ </command> >+ <command> >+ <proto><ptype>EGLuint64NV</ptype> <name>eglGetSystemTimeNV</name></proto> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglInitialize</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLint</ptype> *<name>major</name></param> >+ <param><ptype>EGLint</ptype> *<name>minor</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLint</ptype> <name>eglLabelObjectKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>display</name></param> >+ <param><ptype>EGLenum</ptype> <name>objectType</name></param> >+ <param><ptype>EGLObjectKHR</ptype> <name>object</name></param> >+ <param><ptype>EGLLabelKHR</ptype> <name>label</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglLockSurfaceKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglMakeCurrent</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>draw</name></param> >+ <param><ptype>EGLSurface</ptype> <name>read</name></param> >+ <param><ptype>EGLContext</ptype> <name>ctx</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglOutputLayerAttribEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLOutputLayerEXT</ptype> <name>layer</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLAttrib</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglOutputPortAttribEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLOutputPortEXT</ptype> <name>port</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLAttrib</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglPostSubBufferNV</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> <name>x</name></param> >+ <param><ptype>EGLint</ptype> <name>y</name></param> >+ <param><ptype>EGLint</ptype> <name>width</name></param> >+ <param><ptype>EGLint</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglPresentationTimeANDROID</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLnsecsANDROID</ptype> <name>time</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglGetCompositorTimingSupportedANDROID</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> <name>name</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglGetCompositorTimingANDROID</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> <name>numTimestamps</name></param> >+ <param> const <ptype>EGLint</ptype> *<name>names</name></param> >+ <param><ptype>EGLnsecsANDROID</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglGetNextFrameIdANDROID</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLuint64KHR</ptype> *<name>frameId</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglGetFrameTimestampSupportedANDROID</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> <name>timestamp</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglGetFrameTimestampsANDROID</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLuint64KHR</ptype> <name>frameId</name></param> >+ <param><ptype>EGLint</ptype> <name>numTimestamps</name></param> >+ <param> const <ptype>EGLint</ptype> *<name>timestamps</name></param> >+ <param><ptype>EGLnsecsANDROID</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLenum</ptype> <name>eglQueryAPI</name></proto> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryContext</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLContext</ptype> <name>ctx</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryDebugKHR</name></proto> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLAttrib</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryDeviceAttribEXT</name></proto> >+ <param><ptype>EGLDeviceEXT</ptype> <name>device</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLAttrib</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>const char *<name>eglQueryDeviceStringEXT</name></proto> >+ <param><ptype>EGLDeviceEXT</ptype> <name>device</name></param> >+ <param><ptype>EGLint</ptype> <name>name</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryDevicesEXT</name></proto> >+ <param><ptype>EGLint</ptype> <name>max_devices</name></param> >+ <param><ptype>EGLDeviceEXT</ptype> *<name>devices</name></param> >+ <param><ptype>EGLint</ptype> *<name>num_devices</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryDisplayAttribEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLAttrib</ptype> *<name>value</name></param> >+ <alias name="eglQueryDisplayAttribKHR"/> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryDisplayAttribKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLint</ptype> <name>name</name></param> >+ <param><ptype>EGLAttrib</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryDisplayAttribNV</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLAttrib</ptype> *<name>value</name></param> >+ <alias name="eglQueryDisplayAttribKHR"/> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryDmaBufFormatsEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLint</ptype> <name>max_formats</name></param> >+ <param><ptype>EGLint</ptype> *<name>formats</name></param> >+ <param><ptype>EGLint</ptype> *<name>num_formats</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryDmaBufModifiersEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLint</ptype> <name>format</name></param> >+ <param><ptype>EGLint</ptype> <name>max_modifiers</name></param> >+ <param><ptype>EGLuint64KHR</ptype> *<name>modifiers</name></param> >+ <param><ptype>EGLBoolean</ptype> *<name>external_only</name></param> >+ <param><ptype>EGLint</ptype> *<name>num_modifiers</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryNativeDisplayNV</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLNativeDisplayType</ptype> *<name>display_id</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryNativePixmapNV</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surf</name></param> >+ <param><ptype>EGLNativePixmapType</ptype> *<name>pixmap</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryNativeWindowNV</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surf</name></param> >+ <param><ptype>EGLNativeWindowType</ptype> *<name>window</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryOutputLayerAttribEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLOutputLayerEXT</ptype> <name>layer</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLAttrib</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>const char *<name>eglQueryOutputLayerStringEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLOutputLayerEXT</ptype> <name>layer</name></param> >+ <param><ptype>EGLint</ptype> <name>name</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryOutputPortAttribEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLOutputPortEXT</ptype> <name>port</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLAttrib</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>const char *<name>eglQueryOutputPortStringEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLOutputPortEXT</ptype> <name>port</name></param> >+ <param><ptype>EGLint</ptype> <name>name</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryStreamKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param><ptype>EGLenum</ptype> <name>attribute</name></param> >+ <param><ptype>EGLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryStreamAttribKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param><ptype>EGLenum</ptype> <name>attribute</name></param> >+ <param><ptype>EGLAttrib</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryStreamMetadataNV</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param><ptype>EGLenum</ptype> <name>name</name></param> >+ <param><ptype>EGLint</ptype> <name>n</name></param> >+ <param><ptype>EGLint</ptype> <name>offset</name></param> >+ <param><ptype>EGLint</ptype> <name>size</name></param> >+ <param>void *<name>data</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryStreamTimeKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param><ptype>EGLenum</ptype> <name>attribute</name></param> >+ <param><ptype>EGLTimeKHR</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQueryStreamu64KHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param><ptype>EGLenum</ptype> <name>attribute</name></param> >+ <param><ptype>EGLuint64KHR</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>const char *<name>eglQueryString</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLint</ptype> <name>name</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQuerySurface</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQuerySurface64KHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLAttribKHR</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglQuerySurfacePointerANGLE</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param>void **<name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglReleaseTexImage</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglReleaseThread</name></proto> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglResetStreamNV</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ </command> >+ <command> >+ <proto>void <name>eglSetBlobCacheFuncsANDROID</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSetBlobFuncANDROID</ptype> <name>set</name></param> >+ <param><ptype>EGLGetBlobFuncANDROID</ptype> <name>get</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglSetDamageRegionKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> *<name>rects</name></param> >+ <param><ptype>EGLint</ptype> <name>n_rects</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglSetStreamAttribKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param><ptype>EGLenum</ptype> <name>attribute</name></param> >+ <param><ptype>EGLAttrib</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglSetStreamMetadataNV</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param><ptype>EGLint</ptype> <name>n</name></param> >+ <param><ptype>EGLint</ptype> <name>offset</name></param> >+ <param><ptype>EGLint</ptype> <name>size</name></param> >+ <param>const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglSignalSyncKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSyncKHR</ptype> <name>sync</name></param> >+ <param><ptype>EGLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglSignalSyncNV</name></proto> >+ <param><ptype>EGLSyncNV</ptype> <name>sync</name></param> >+ <param><ptype>EGLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglStreamAttribKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param><ptype>EGLenum</ptype> <name>attribute</name></param> >+ <param><ptype>EGLint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglStreamConsumerAcquireKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglStreamConsumerAcquireAttribKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglStreamConsumerGLTextureExternalKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglStreamConsumerGLTextureExternalAttribsNV</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglStreamConsumerOutputEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param><ptype>EGLOutputLayerEXT</ptype> <name>layer</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglStreamConsumerReleaseKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglStreamConsumerReleaseAttribKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglStreamFlushNV</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglSurfaceAttrib</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> <name>attribute</name></param> >+ <param><ptype>EGLint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglSwapBuffers</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglSwapBuffersWithDamageEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> *<name>rects</name></param> >+ <param><ptype>EGLint</ptype> <name>n_rects</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglSwapBuffersWithDamageKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> *<name>rects</name></param> >+ <param><ptype>EGLint</ptype> <name>n_rects</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglSwapBuffersRegionNOK</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> <name>numRects</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>rects</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglSwapBuffersRegion2NOK</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLint</ptype> <name>numRects</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>rects</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglSwapInterval</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLint</ptype> <name>interval</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglTerminate</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglUnlockSurfaceKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglUnsignalSyncEXT</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSync</ptype> <name>sync</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglWaitClient</name></proto> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglWaitGL</name></proto> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglWaitNative</name></proto> >+ <param><ptype>EGLint</ptype> <name>engine</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglWaitSync</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSync</ptype> <name>sync</name></param> >+ <param><ptype>EGLint</ptype> <name>flags</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLint</ptype> <name>eglWaitSyncKHR</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSyncKHR</ptype> <name>sync</name></param> >+ <param><ptype>EGLint</ptype> <name>flags</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglCompositorSetContextListEXT</name></proto> >+ <param>const <ptype>EGLint</ptype> *<name>external_ref_ids</name></param> >+ <param><ptype>EGLint</ptype> <name>num_entries</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglCompositorSetContextAttributesEXT</name></proto> >+ <param><ptype>EGLint</ptype> <name>external_ref_id</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>context_attributes</name></param> >+ <param><ptype>EGLint</ptype> <name>num_entries</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglCompositorSetWindowListEXT</name></proto> >+ <param><ptype>EGLint</ptype> <name>external_ref_id</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>external_win_ids</name></param> >+ <param><ptype>EGLint</ptype> <name>num_entries</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglCompositorSetWindowAttributesEXT</name></proto> >+ <param><ptype>EGLint</ptype> <name>external_win_id</name></param> >+ <param>const <ptype>EGLint</ptype> *<name>window_attributes</name></param> >+ <param><ptype>EGLint</ptype> <name>num_entries</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglCompositorBindTexWindowEXT</name></proto> >+ <param><ptype>EGLint</ptype> <name>external_win_id</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglCompositorSetSizeEXT</name></proto> >+ <param><ptype>EGLint</ptype> <name>external_win_id</name></param> >+ <param><ptype>EGLint</ptype> <name>width</name></param> >+ <param><ptype>EGLint</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglCompositorSwapPolicyEXT</name></proto> >+ <param><ptype>EGLint</ptype> <name>external_win_id</name></param> >+ <param><ptype>EGLint</ptype> <name>policy</name></param> >+ </command> >+ </commands> >+ >+ <!-- SECTION: EGL API interface definitions. --> >+ <feature api="egl" name="EGL_VERSION_1_0" number="1.0"> >+ <require> >+ <enum name="EGL_ALPHA_SIZE"/> >+ <enum name="EGL_BAD_ACCESS"/> >+ <enum name="EGL_BAD_ALLOC"/> >+ <enum name="EGL_BAD_ATTRIBUTE"/> >+ <enum name="EGL_BAD_CONFIG"/> >+ <enum name="EGL_BAD_CONTEXT"/> >+ <enum name="EGL_BAD_CURRENT_SURFACE"/> >+ <enum name="EGL_BAD_DISPLAY"/> >+ <enum name="EGL_BAD_MATCH"/> >+ <enum name="EGL_BAD_NATIVE_PIXMAP"/> >+ <enum name="EGL_BAD_NATIVE_WINDOW"/> >+ <enum name="EGL_BAD_PARAMETER"/> >+ <enum name="EGL_BAD_SURFACE"/> >+ <enum name="EGL_BLUE_SIZE"/> >+ <enum name="EGL_BUFFER_SIZE"/> >+ <enum name="EGL_CONFIG_CAVEAT"/> >+ <enum name="EGL_CONFIG_ID"/> >+ <enum name="EGL_CORE_NATIVE_ENGINE"/> >+ <enum name="EGL_DEPTH_SIZE"/> >+ <enum name="EGL_DONT_CARE"/> >+ <enum name="EGL_DRAW"/> >+ <enum name="EGL_EXTENSIONS"/> >+ <enum name="EGL_FALSE"/> >+ <enum name="EGL_GREEN_SIZE"/> >+ <enum name="EGL_HEIGHT"/> >+ <enum name="EGL_LARGEST_PBUFFER"/> >+ <enum name="EGL_LEVEL"/> >+ <enum name="EGL_MAX_PBUFFER_HEIGHT"/> >+ <enum name="EGL_MAX_PBUFFER_PIXELS"/> >+ <enum name="EGL_MAX_PBUFFER_WIDTH"/> >+ <enum name="EGL_NATIVE_RENDERABLE"/> >+ <enum name="EGL_NATIVE_VISUAL_ID"/> >+ <enum name="EGL_NATIVE_VISUAL_TYPE"/> >+ <enum name="EGL_NONE"/> >+ <enum name="EGL_NON_CONFORMANT_CONFIG"/> >+ <enum name="EGL_NOT_INITIALIZED"/> >+ <enum name="EGL_NO_CONTEXT"/> >+ <enum name="EGL_NO_DISPLAY"/> >+ <enum name="EGL_NO_SURFACE"/> >+ <enum name="EGL_PBUFFER_BIT"/> >+ <enum name="EGL_PIXMAP_BIT"/> >+ <enum name="EGL_READ"/> >+ <enum name="EGL_RED_SIZE"/> >+ <enum name="EGL_SAMPLES"/> >+ <enum name="EGL_SAMPLE_BUFFERS"/> >+ <enum name="EGL_SLOW_CONFIG"/> >+ <enum name="EGL_STENCIL_SIZE"/> >+ <enum name="EGL_SUCCESS"/> >+ <enum name="EGL_SURFACE_TYPE"/> >+ <enum name="EGL_TRANSPARENT_BLUE_VALUE"/> >+ <enum name="EGL_TRANSPARENT_GREEN_VALUE"/> >+ <enum name="EGL_TRANSPARENT_RED_VALUE"/> >+ <enum name="EGL_TRANSPARENT_RGB"/> >+ <enum name="EGL_TRANSPARENT_TYPE"/> >+ <enum name="EGL_TRUE"/> >+ <enum name="EGL_VENDOR"/> >+ <enum name="EGL_VERSION"/> >+ <enum name="EGL_WIDTH"/> >+ <enum name="EGL_WINDOW_BIT"/> >+ <command name="eglChooseConfig"/> >+ <command name="eglCopyBuffers"/> >+ <command name="eglCreateContext"/> >+ <command name="eglCreatePbufferSurface"/> >+ <command name="eglCreatePixmapSurface"/> >+ <command name="eglCreateWindowSurface"/> >+ <command name="eglDestroyContext"/> >+ <command name="eglDestroySurface"/> >+ <command name="eglGetConfigAttrib"/> >+ <command name="eglGetConfigs"/> >+ <command name="eglGetCurrentDisplay"/> >+ <command name="eglGetCurrentSurface"/> >+ <command name="eglGetDisplay"/> >+ <command name="eglGetError"/> >+ <command name="eglGetProcAddress"/> >+ <command name="eglInitialize"/> >+ <command name="eglMakeCurrent"/> >+ <command name="eglQueryContext"/> >+ <command name="eglQueryString"/> >+ <command name="eglQuerySurface"/> >+ <command name="eglSwapBuffers"/> >+ <command name="eglTerminate"/> >+ <command name="eglWaitGL"/> >+ <command name="eglWaitNative"/> >+ </require> >+ </feature> >+ <feature api="egl" name="EGL_VERSION_1_1" number="1.1"> >+ <require> >+ <enum name="EGL_BACK_BUFFER"/> >+ <enum name="EGL_BIND_TO_TEXTURE_RGB"/> >+ <enum name="EGL_BIND_TO_TEXTURE_RGBA"/> >+ <enum name="EGL_CONTEXT_LOST"/> >+ <enum name="EGL_MIN_SWAP_INTERVAL"/> >+ <enum name="EGL_MAX_SWAP_INTERVAL"/> >+ <enum name="EGL_MIPMAP_TEXTURE"/> >+ <enum name="EGL_MIPMAP_LEVEL"/> >+ <enum name="EGL_NO_TEXTURE"/> >+ <enum name="EGL_TEXTURE_2D"/> >+ <enum name="EGL_TEXTURE_FORMAT"/> >+ <enum name="EGL_TEXTURE_RGB"/> >+ <enum name="EGL_TEXTURE_RGBA"/> >+ <enum name="EGL_TEXTURE_TARGET"/> >+ <command name="eglBindTexImage"/> >+ <command name="eglReleaseTexImage"/> >+ <command name="eglSurfaceAttrib"/> >+ <command name="eglSwapInterval"/> >+ </require> >+ </feature> >+ <feature api="egl" name="EGL_VERSION_1_2" number="1.2"> >+ <require> >+ <enum name="EGL_ALPHA_FORMAT"/> >+ <enum name="EGL_ALPHA_FORMAT_NONPRE"/> >+ <enum name="EGL_ALPHA_FORMAT_PRE"/> >+ <enum name="EGL_ALPHA_MASK_SIZE"/> >+ <enum name="EGL_BUFFER_PRESERVED"/> >+ <enum name="EGL_BUFFER_DESTROYED"/> >+ <enum name="EGL_CLIENT_APIS"/> >+ <enum name="EGL_COLORSPACE"/> >+ <enum name="EGL_COLORSPACE_sRGB"/> >+ <enum name="EGL_COLORSPACE_LINEAR"/> >+ <enum name="EGL_COLOR_BUFFER_TYPE"/> >+ <enum name="EGL_CONTEXT_CLIENT_TYPE"/> >+ <enum name="EGL_DISPLAY_SCALING"/> >+ <enum name="EGL_HORIZONTAL_RESOLUTION"/> >+ <enum name="EGL_LUMINANCE_BUFFER"/> >+ <enum name="EGL_LUMINANCE_SIZE"/> >+ <enum name="EGL_OPENGL_ES_BIT"/> >+ <enum name="EGL_OPENVG_BIT"/> >+ <enum name="EGL_OPENGL_ES_API"/> >+ <enum name="EGL_OPENVG_API"/> >+ <enum name="EGL_OPENVG_IMAGE"/> >+ <enum name="EGL_PIXEL_ASPECT_RATIO"/> >+ <enum name="EGL_RENDERABLE_TYPE"/> >+ <enum name="EGL_RENDER_BUFFER"/> >+ <enum name="EGL_RGB_BUFFER"/> >+ <enum name="EGL_SINGLE_BUFFER"/> >+ <enum name="EGL_SWAP_BEHAVIOR"/> >+ <enum name="EGL_UNKNOWN"/> >+ <enum name="EGL_VERTICAL_RESOLUTION"/> >+ <command name="eglBindAPI"/> >+ <command name="eglQueryAPI"/> >+ <command name="eglCreatePbufferFromClientBuffer"/> >+ <command name="eglReleaseThread"/> >+ <command name="eglWaitClient"/> >+ </require> >+ </feature> >+ <feature api="egl" name="EGL_VERSION_1_3" number="1.3"> >+ <require> >+ <enum name="EGL_CONFORMANT"/> >+ <enum name="EGL_CONTEXT_CLIENT_VERSION"/> >+ <enum name="EGL_MATCH_NATIVE_PIXMAP"/> >+ <enum name="EGL_OPENGL_ES2_BIT"/> >+ <enum name="EGL_VG_ALPHA_FORMAT"/> >+ <enum name="EGL_VG_ALPHA_FORMAT_NONPRE"/> >+ <enum name="EGL_VG_ALPHA_FORMAT_PRE"/> >+ <enum name="EGL_VG_ALPHA_FORMAT_PRE_BIT"/> >+ <enum name="EGL_VG_COLORSPACE"/> >+ <enum name="EGL_VG_COLORSPACE_sRGB"/> >+ <enum name="EGL_VG_COLORSPACE_LINEAR"/> >+ <enum name="EGL_VG_COLORSPACE_LINEAR_BIT"/> >+ </require> >+ </feature> >+ <feature api="egl" name="EGL_VERSION_1_4" number="1.4"> >+ <require> >+ <enum name="EGL_DEFAULT_DISPLAY"/> >+ <enum name="EGL_MULTISAMPLE_RESOLVE_BOX_BIT"/> >+ <enum name="EGL_MULTISAMPLE_RESOLVE"/> >+ <enum name="EGL_MULTISAMPLE_RESOLVE_DEFAULT"/> >+ <enum name="EGL_MULTISAMPLE_RESOLVE_BOX"/> >+ <enum name="EGL_OPENGL_API"/> >+ <enum name="EGL_OPENGL_BIT"/> >+ <enum name="EGL_SWAP_BEHAVIOR_PRESERVED_BIT"/> >+ <command name="eglGetCurrentContext"/> >+ </require> >+ </feature> >+ <feature api="egl" name="EGL_VERSION_1_5" number="1.5"> >+ <require comment="EGL_KHR_create_context features"> >+ <enum name="EGL_CONTEXT_MAJOR_VERSION"/> >+ <enum name="EGL_CONTEXT_MINOR_VERSION"/> >+ <enum name="EGL_CONTEXT_OPENGL_PROFILE_MASK"/> >+ <enum name="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY"/> >+ <enum name="EGL_NO_RESET_NOTIFICATION"/> >+ <enum name="EGL_LOSE_CONTEXT_ON_RESET"/> >+ <enum name="EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT"/> >+ <enum name="EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT"/> >+ <enum name="EGL_CONTEXT_OPENGL_DEBUG"/> >+ <enum name="EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE"/> >+ <enum name="EGL_CONTEXT_OPENGL_ROBUST_ACCESS"/> >+ <enum name="EGL_OPENGL_ES3_BIT"/> >+ </require> >+ <require comment="EGL_EXT_create_context_robustness"> >+ <enum name="EGL_CONTEXT_OPENGL_ROBUST_ACCESS"/> >+ <enum name="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY"/> >+ </require> >+ <require comment="EGL_EXT_client_extensions"/> >+ <require comment="EGL_KHR_cl_event2"> >+ <enum name="EGL_CL_EVENT_HANDLE"/> >+ <enum name="EGL_SYNC_CL_EVENT"/> >+ <enum name="EGL_SYNC_CL_EVENT_COMPLETE"/> >+ </require> >+ <require comment="EGL_KHR_fence_sync"> >+ <enum name="EGL_SYNC_PRIOR_COMMANDS_COMPLETE"/> >+ <enum name="EGL_SYNC_TYPE"/> >+ <enum name="EGL_SYNC_STATUS"/> >+ <enum name="EGL_SYNC_CONDITION"/> >+ <enum name="EGL_SIGNALED"/> >+ <enum name="EGL_UNSIGNALED"/> >+ <enum name="EGL_SYNC_FLUSH_COMMANDS_BIT"/> >+ <enum name="EGL_FOREVER"/> >+ <enum name="EGL_TIMEOUT_EXPIRED"/> >+ <enum name="EGL_CONDITION_SATISFIED"/> >+ <enum name="EGL_NO_SYNC"/> >+ <enum name="EGL_SYNC_FENCE"/> >+ <command name="eglCreateSync"/> >+ <command name="eglDestroySync"/> >+ <command name="eglClientWaitSync"/> >+ <command name="eglGetSyncAttrib"/> >+ </require> >+ <require comment="EGL_KHR_get_all_proc_addresses"/> >+ <require comment="EGL_KHR_client_get_all_proc_addresses"/> >+ <require comment="EGL_KHR_gl_colorspace"> >+ <enum name="EGL_GL_COLORSPACE"/> >+ <enum name="EGL_GL_COLORSPACE_SRGB"/> >+ <enum name="EGL_GL_COLORSPACE_LINEAR"/> >+ </require> >+ <require comment="EGL_KHR_gl_renderbuffer_image"> >+ <enum name="EGL_GL_RENDERBUFFER"/> >+ </require> >+ <require comment="EGL_KHR_gl_texture_2D_image"> >+ <enum name="EGL_GL_TEXTURE_2D"/> >+ <enum name="EGL_GL_TEXTURE_LEVEL"/> >+ </require> >+ <require comment="EGL_KHR_gl_texture_3D_image"> >+ <enum name="EGL_GL_TEXTURE_3D"/> >+ <enum name="EGL_GL_TEXTURE_ZOFFSET"/> >+ </require> >+ <require comment="EGL_KHR_gl_texture_cubemap_image"> >+ <enum name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X"/> >+ <enum name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X"/> >+ <enum name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y"/> >+ <enum name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y"/> >+ <enum name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z"/> >+ <enum name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z"/> >+ </require> >+ <require comment="EGL_KHR_image_base"> >+ <enum name="EGL_IMAGE_PRESERVED"/> >+ <enum name="EGL_NO_IMAGE"/> >+ <command name="eglCreateImage"/> >+ <command name="eglDestroyImage"/> >+ </require> >+ <require comment="EGL_EXT_platform_base"> >+ <command name="eglGetPlatformDisplay"/> >+ <command name="eglCreatePlatformWindowSurface"/> >+ <command name="eglCreatePlatformPixmapSurface"/> >+ </require> >+ <require comment="EGL_KHR_surfaceless_context - just relaxes an error condition"/> >+ <require comment="EGL_KHR_wait_sync"> >+ <command name="eglWaitSync"/> >+ </require> >+ </feature> >+ >+ <!-- SECTION: EGL extension interface definitions --> >+ <extensions> >+ <extension name="EGL_ANDROID_blob_cache" supported="egl"> >+ <require> >+ <command name="eglSetBlobCacheFuncsANDROID"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANDROID_create_native_client_buffer" supported="egl"> >+ <require> >+ <enum name="EGL_NATIVE_BUFFER_USAGE_ANDROID"/> >+ <enum name="EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID"/> >+ <enum name="EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID"/> >+ <enum name="EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID"/> >+ <command name="eglCreateNativeClientBufferANDROID"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANDROID_framebuffer_target" supported="egl"> >+ <require> >+ <enum name="EGL_FRAMEBUFFER_TARGET_ANDROID"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANDROID_get_native_client_buffer" supported="egl"> >+ <require> >+ <command name="eglGetNativeClientBufferANDROID"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANDROID_front_buffer_auto_refresh" supported="egl"> >+ <require> >+ <enum name="EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANDROID_image_native_buffer" supported="egl"> >+ <require> >+ <enum name="EGL_NATIVE_BUFFER_ANDROID"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANDROID_native_fence_sync" supported="egl"> >+ <require> >+ <enum name="EGL_SYNC_NATIVE_FENCE_ANDROID"/> >+ <enum name="EGL_SYNC_NATIVE_FENCE_FD_ANDROID"/> >+ <enum name="EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID"/> >+ <enum name="EGL_NO_NATIVE_FENCE_FD_ANDROID"/> >+ <command name="eglDupNativeFenceFDANDROID"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANDROID_presentation_time" supported="egl"> >+ <require> >+ <command name="eglPresentationTimeANDROID"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANDROID_get_frame_timestamps" supported="egl"> >+ <require> >+ <enum name="EGL_TIMESTAMP_PENDING_ANDROID"/> >+ <enum name="EGL_TIMESTAMP_INVALID_ANDROID"/> >+ <enum name="EGL_TIMESTAMPS_ANDROID"/> >+ <enum name="EGL_COMPOSITE_DEADLINE_ANDROID"/> >+ <enum name="EGL_COMPOSITE_INTERVAL_ANDROID"/> >+ <enum name="EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID"/> >+ <enum name="EGL_REQUESTED_PRESENT_TIME_ANDROID"/> >+ <enum name="EGL_RENDERING_COMPLETE_TIME_ANDROID"/> >+ <enum name="EGL_COMPOSITION_LATCH_TIME_ANDROID"/> >+ <enum name="EGL_FIRST_COMPOSITION_START_TIME_ANDROID"/> >+ <enum name="EGL_LAST_COMPOSITION_START_TIME_ANDROID"/> >+ <enum name="EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID"/> >+ <enum name="EGL_DISPLAY_PRESENT_TIME_ANDROID"/> >+ <enum name="EGL_DEQUEUE_READY_TIME_ANDROID"/> >+ <enum name="EGL_READS_DONE_TIME_ANDROID"/> >+ <command name="eglGetCompositorTimingSupportedANDROID"/> >+ <command name="eglGetCompositorTimingANDROID"/> >+ <command name="eglGetNextFrameIdANDROID"/> >+ <command name="eglGetFrameTimestampSupportedANDROID"/> >+ <command name="eglGetFrameTimestampsANDROID"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANDROID_recordable" supported="egl"> >+ <require> >+ <enum name="EGL_RECORDABLE_ANDROID"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANGLE_d3d_share_handle_client_buffer" supported="egl"> >+ <require> >+ <enum name="EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANGLE_device_d3d" supported="egl"> >+ <require> >+ <enum name="EGL_D3D9_DEVICE_ANGLE"/> >+ <enum name="EGL_D3D11_DEVICE_ANGLE"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANGLE_query_surface_pointer" supported="egl"> >+ <require> >+ <command name="eglQuerySurfacePointerANGLE"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANGLE_surface_d3d_texture_2d_share_handle" supported="egl"> >+ <require> >+ <enum name="EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANGLE_window_fixed_size" supported="egl"> >+ <require> >+ <enum name="EGL_FIXED_SIZE_ANGLE"/> >+ </require> >+ </extension> >+ <extension name="EGL_ARM_implicit_external_sync" supported="egl"> >+ <require> >+ <enum name="EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM"/> >+ </require> >+ </extension> >+ <extension name="EGL_ARM_pixmap_multisample_discard" supported="egl"> >+ <require> >+ <enum name="EGL_DISCARD_SAMPLES_ARM"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_buffer_age" supported="egl"> >+ <require> >+ <enum name="EGL_BUFFER_AGE_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_client_extensions" supported="egl"/> >+ <extension name="EGL_EXT_client_sync" supported="egl"> >+ <require> >+ <enum name="EGL_SYNC_CLIENT_EXT"/> >+ <enum name="EGL_SYNC_CLIENT_SIGNAL_EXT"/> >+ <command name="eglClientSignalSyncEXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_create_context_robustness" supported="egl"> >+ <require> >+ <enum name="EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT"/> >+ <enum name="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT"/> >+ <enum name="EGL_NO_RESET_NOTIFICATION_EXT"/> >+ <enum name="EGL_LOSE_CONTEXT_ON_RESET_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_device_base" supported="egl"> >+ <require> >+ <enum name="EGL_NO_DEVICE_EXT"/> >+ <enum name="EGL_BAD_DEVICE_EXT"/> >+ <enum name="EGL_DEVICE_EXT"/> >+ <command name="eglQueryDeviceAttribEXT"/> >+ <command name="eglQueryDeviceStringEXT"/> >+ <command name="eglQueryDevicesEXT"/> >+ <command name="eglQueryDisplayAttribEXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_device_drm" supported="egl"> >+ <require> >+ <enum name="EGL_DRM_DEVICE_FILE_EXT"/> >+ <enum name="EGL_DRM_MASTER_FD_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_device_enumeration" supported="egl"> >+ <require> >+ <command name="eglQueryDevicesEXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_device_openwf" supported="egl"> >+ <require> >+ <enum name="EGL_OPENWF_DEVICE_ID_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_device_query" supported="egl"> >+ <require> >+ <enum name="EGL_NO_DEVICE_EXT"/> >+ <enum name="EGL_BAD_DEVICE_EXT"/> >+ <enum name="EGL_DEVICE_EXT"/> >+ <command name="eglQueryDeviceAttribEXT"/> >+ <command name="eglQueryDeviceStringEXT"/> >+ <command name="eglQueryDisplayAttribEXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_gl_colorspace_bt2020_linear" supported="egl"> >+ <require> >+ <enum name="EGL_GL_COLORSPACE_BT2020_LINEAR_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_gl_colorspace_bt2020_pq" supported="egl"> >+ <require> >+ <enum name="EGL_GL_COLORSPACE_BT2020_PQ_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_gl_colorspace_scrgb" supported="egl"> >+ <require> >+ <enum name="EGL_GL_COLORSPACE_SCRGB_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_gl_colorspace_scrgb_linear" supported="egl"> >+ <require> >+ <enum name="EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_gl_colorspace_display_p3_linear" supported="egl"> >+ <require> >+ <enum name="EGL_GL_COLORSPACE_DISPLAY_P3_LINEAR_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_gl_colorspace_display_p3" supported="egl"> >+ <require> >+ <enum name="EGL_GL_COLORSPACE_DISPLAY_P3_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_image_dma_buf_import" supported="egl"> >+ <require> >+ <enum name="EGL_LINUX_DMA_BUF_EXT"/> >+ <enum name="EGL_LINUX_DRM_FOURCC_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE0_FD_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE0_OFFSET_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE0_PITCH_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE1_FD_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE1_OFFSET_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE1_PITCH_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE2_FD_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE2_OFFSET_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE2_PITCH_EXT"/> >+ <enum name="EGL_YUV_COLOR_SPACE_HINT_EXT"/> >+ <enum name="EGL_SAMPLE_RANGE_HINT_EXT"/> >+ <enum name="EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT"/> >+ <enum name="EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT"/> >+ <enum name="EGL_ITU_REC601_EXT"/> >+ <enum name="EGL_ITU_REC709_EXT"/> >+ <enum name="EGL_ITU_REC2020_EXT"/> >+ <enum name="EGL_YUV_FULL_RANGE_EXT"/> >+ <enum name="EGL_YUV_NARROW_RANGE_EXT"/> >+ <enum name="EGL_YUV_CHROMA_SITING_0_EXT"/> >+ <enum name="EGL_YUV_CHROMA_SITING_0_5_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_image_dma_buf_import_modifiers" supported="egl"> >+ <require> >+ <enum name="EGL_DMA_BUF_PLANE3_FD_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE3_OFFSET_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE3_PITCH_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT"/> >+ <enum name="EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT"/> >+ <command name="eglQueryDmaBufFormatsEXT"/> >+ <command name="eglQueryDmaBufModifiersEXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_image_gl_colorspace" supported="egl"> >+ <require> >+ <enum name="EGL_GL_COLORSPACE"/> >+ <enum name="EGL_GL_COLORSPACE_DEFAULT_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_multiview_window" supported="egl"> >+ <require> >+ <enum name="EGL_MULTIVIEW_VIEW_COUNT_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_output_base" supported="egl"> >+ <require> >+ <type name="EGLOutputLayerEXT"/> >+ <type name="EGLOutputPortEXT"/> >+ <enum name="EGL_NO_OUTPUT_LAYER_EXT"/> >+ <enum name="EGL_NO_OUTPUT_PORT_EXT"/> >+ <enum name="EGL_BAD_OUTPUT_LAYER_EXT"/> >+ <enum name="EGL_BAD_OUTPUT_PORT_EXT"/> >+ <enum name="EGL_SWAP_INTERVAL_EXT"/> >+ <command name="eglGetOutputLayersEXT"/> >+ <command name="eglGetOutputPortsEXT"/> >+ <command name="eglOutputLayerAttribEXT"/> >+ <command name="eglQueryOutputLayerAttribEXT"/> >+ <command name="eglQueryOutputLayerStringEXT"/> >+ <command name="eglOutputPortAttribEXT"/> >+ <command name="eglQueryOutputPortAttribEXT"/> >+ <command name="eglQueryOutputPortStringEXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_output_drm" supported="egl"> >+ <require> >+ <enum name="EGL_DRM_CRTC_EXT"/> >+ <enum name="EGL_DRM_PLANE_EXT"/> >+ <enum name="EGL_DRM_CONNECTOR_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_output_openwf" supported="egl"> >+ <require> >+ <enum name="EGL_OPENWF_PIPELINE_ID_EXT"/> >+ <enum name="EGL_OPENWF_PORT_ID_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_pixel_format_float" supported="egl"> >+ <require> >+ <enum name="EGL_COLOR_COMPONENT_TYPE_EXT"/> >+ <enum name="EGL_COLOR_COMPONENT_TYPE_FIXED_EXT"/> >+ <enum name="EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_platform_base" supported="egl"> >+ <require> >+ <command name="eglGetPlatformDisplayEXT"/> >+ <command name="eglCreatePlatformWindowSurfaceEXT"/> >+ <command name="eglCreatePlatformPixmapSurfaceEXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_platform_device" supported="egl"> >+ <require> >+ <enum name="EGL_PLATFORM_DEVICE_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_platform_wayland" supported="egl"> >+ <require> >+ <enum name="EGL_PLATFORM_WAYLAND_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_platform_x11" supported="egl"> >+ <require> >+ <enum name="EGL_PLATFORM_X11_EXT"/> >+ <enum name="EGL_PLATFORM_X11_SCREEN_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_protected_content" supported="egl"> >+ <require> >+ <enum name="EGL_PROTECTED_CONTENT_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_protected_surface" supported="egl"> >+ <require> >+ <enum name="EGL_PROTECTED_CONTENT_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_stream_consumer_egloutput" supported="egl"> >+ <require> >+ <command name="eglStreamConsumerOutputEXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_surface_SMPTE2086_metadata" supported="egl"> >+ <require> >+ <enum name="EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT"/> >+ <enum name="EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT"/> >+ <enum name="EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT"/> >+ <enum name="EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT"/> >+ <enum name="EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT"/> >+ <enum name="EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT"/> >+ <enum name="EGL_SMPTE2086_WHITE_POINT_X_EXT"/> >+ <enum name="EGL_SMPTE2086_WHITE_POINT_Y_EXT"/> >+ <enum name="EGL_SMPTE2086_MAX_LUMINANCE_EXT"/> >+ <enum name="EGL_SMPTE2086_MIN_LUMINANCE_EXT"/> >+ <enum name="EGL_METADATA_SCALING_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_swap_buffers_with_damage" supported="egl"> >+ <require> >+ <command name="eglSwapBuffersWithDamageEXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_sync_reuse" supported="egl"> >+ <require> >+ <command name="eglUnsignalSyncEXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_yuv_surface" supported="egl"> >+ <require> >+ <enum name="EGL_YUV_ORDER_EXT"/> >+ <enum name="EGL_YUV_NUMBER_OF_PLANES_EXT"/> >+ <enum name="EGL_YUV_SUBSAMPLE_EXT"/> >+ <enum name="EGL_YUV_DEPTH_RANGE_EXT"/> >+ <enum name="EGL_YUV_CSC_STANDARD_EXT"/> >+ <enum name="EGL_YUV_PLANE_BPP_EXT"/> >+ <enum name="EGL_YUV_BUFFER_EXT"/> >+ <enum name="EGL_YUV_ORDER_YUV_EXT"/> >+ <enum name="EGL_YUV_ORDER_YVU_EXT"/> >+ <enum name="EGL_YUV_ORDER_YUYV_EXT"/> >+ <enum name="EGL_YUV_ORDER_UYVY_EXT"/> >+ <enum name="EGL_YUV_ORDER_YVYU_EXT"/> >+ <enum name="EGL_YUV_ORDER_VYUY_EXT"/> >+ <enum name="EGL_YUV_ORDER_AYUV_EXT"/> >+ <enum name="EGL_YUV_SUBSAMPLE_4_2_0_EXT"/> >+ <enum name="EGL_YUV_SUBSAMPLE_4_2_2_EXT"/> >+ <enum name="EGL_YUV_SUBSAMPLE_4_4_4_EXT"/> >+ <enum name="EGL_YUV_DEPTH_RANGE_LIMITED_EXT"/> >+ <enum name="EGL_YUV_DEPTH_RANGE_FULL_EXT"/> >+ <enum name="EGL_YUV_CSC_STANDARD_601_EXT"/> >+ <enum name="EGL_YUV_CSC_STANDARD_709_EXT"/> >+ <enum name="EGL_YUV_CSC_STANDARD_2020_EXT"/> >+ <enum name="EGL_YUV_PLANE_BPP_0_EXT"/> >+ <enum name="EGL_YUV_PLANE_BPP_8_EXT"/> >+ <enum name="EGL_YUV_PLANE_BPP_10_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_HI_clientpixmap" supported="egl"> >+ <require> >+ <enum name="EGL_CLIENT_PIXMAP_POINTER_HI"/> >+ <command name="eglCreatePixmapSurfaceHI"/> >+ </require> >+ </extension> >+ <extension name="EGL_HI_colorformats" supported="egl"> >+ <require> >+ <enum name="EGL_COLOR_FORMAT_HI"/> >+ <enum name="EGL_COLOR_RGB_HI"/> >+ <enum name="EGL_COLOR_RGBA_HI"/> >+ <enum name="EGL_COLOR_ARGB_HI"/> >+ </require> >+ </extension> >+ <extension name="EGL_IMG_context_priority" supported="egl"> >+ <require> >+ <enum name="EGL_CONTEXT_PRIORITY_LEVEL_IMG"/> >+ <enum name="EGL_CONTEXT_PRIORITY_HIGH_IMG"/> >+ <enum name="EGL_CONTEXT_PRIORITY_MEDIUM_IMG"/> >+ <enum name="EGL_CONTEXT_PRIORITY_LOW_IMG"/> >+ </require> >+ </extension> >+ <extension name="EGL_IMG_image_plane_attribs" supported="egl"> >+ <require> >+ <enum name="EGL_NATIVE_BUFFER_MULTIPLANE_SEPARATE_IMG"/> >+ <enum name="EGL_NATIVE_BUFFER_PLANE_OFFSET_IMG"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_cl_event" supported="egl"> >+ <require> >+ <enum name="EGL_CL_EVENT_HANDLE_KHR"/> >+ <enum name="EGL_SYNC_CL_EVENT_KHR"/> >+ <enum name="EGL_SYNC_CL_EVENT_COMPLETE_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_cl_event2" supported="egl"> >+ <require> >+ <enum name="EGL_CL_EVENT_HANDLE_KHR"/> >+ <enum name="EGL_SYNC_CL_EVENT_KHR"/> >+ <enum name="EGL_SYNC_CL_EVENT_COMPLETE_KHR"/> >+ <command name="eglCreateSync64KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_config_attribs" supported="egl"> >+ <require> >+ <enum name="EGL_CONFORMANT_KHR"/> >+ <enum name="EGL_VG_COLORSPACE_LINEAR_BIT_KHR"/> >+ <enum name="EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_client_get_all_proc_addresses" supported="egl" comment="Alias of EGL_KHR_get_all_proc_addresses"/> >+ <extension name="EGL_KHR_context_flush_control" supported="egl"> >+ <require> >+ <enum name="EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR"/> >+ <enum name="EGL_CONTEXT_RELEASE_BEHAVIOR_KHR"/> >+ <enum name="EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_create_context" supported="egl"> >+ <require> >+ <enum name="EGL_CONTEXT_MAJOR_VERSION_KHR"/> >+ <enum name="EGL_CONTEXT_MINOR_VERSION_KHR"/> >+ <enum name="EGL_CONTEXT_FLAGS_KHR"/> >+ <enum name="EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR"/> >+ <enum name="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR"/> >+ <enum name="EGL_NO_RESET_NOTIFICATION_KHR"/> >+ <enum name="EGL_LOSE_CONTEXT_ON_RESET_KHR"/> >+ <enum name="EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR"/> >+ <enum name="EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR"/> >+ <enum name="EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR"/> >+ <enum name="EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR"/> >+ <enum name="EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR"/> >+ <enum name="EGL_OPENGL_ES3_BIT"/> >+ <enum name="EGL_OPENGL_ES3_BIT_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_create_context_no_error" supported="egl"> >+ <require> >+ <enum name="EGL_CONTEXT_OPENGL_NO_ERROR_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_debug" supported="egl"> >+ <require> >+ <!-- Explicit dependencies require to get EGLDEBUGPROCKHR dependencies correct --> >+ <type name="EGLLabelKHR"/> >+ <type name="EGLObjectKHR"/> >+ <enum name="EGL_OBJECT_THREAD_KHR"/> >+ <enum name="EGL_OBJECT_DISPLAY_KHR"/> >+ <enum name="EGL_OBJECT_CONTEXT_KHR"/> >+ <enum name="EGL_OBJECT_SURFACE_KHR"/> >+ <enum name="EGL_OBJECT_IMAGE_KHR"/> >+ <enum name="EGL_OBJECT_SYNC_KHR"/> >+ <enum name="EGL_OBJECT_STREAM_KHR"/> >+ <enum name="EGL_DEBUG_MSG_CRITICAL_KHR"/> >+ <enum name="EGL_DEBUG_MSG_ERROR_KHR"/> >+ <enum name="EGL_DEBUG_MSG_WARN_KHR"/> >+ <enum name="EGL_DEBUG_MSG_INFO_KHR"/> >+ <enum name="EGL_DEBUG_CALLBACK_KHR"/> >+ <command name="eglDebugMessageControlKHR"/> >+ <command name="eglQueryDebugKHR"/> >+ <command name="eglLabelObjectKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_display_reference" supported="egl"> >+ <require> >+ <enum name="EGL_TRACK_REFERENCES_KHR"/> >+ <command name="eglQueryDisplayAttribKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_fence_sync" protect="KHRONOS_SUPPORT_INT64" supported="egl"> >+ <require> >+ <!-- Most interfaces also defined by EGL_KHR_reusable sync --> >+ <enum name="EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR"/> >+ <enum name="EGL_SYNC_CONDITION_KHR"/> >+ <enum name="EGL_SYNC_FENCE_KHR"/> >+ <command name="eglCreateSyncKHR"/> >+ <command name="eglDestroySyncKHR"/> >+ <command name="eglClientWaitSyncKHR"/> >+ <command name="eglGetSyncAttribKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_get_all_proc_addresses" supported="egl"/> >+ <extension name="EGL_KHR_gl_colorspace" supported="egl"> >+ <require> >+ <enum name="EGL_GL_COLORSPACE_KHR"/> >+ <enum name="EGL_GL_COLORSPACE_SRGB_KHR"/> >+ <enum name="EGL_GL_COLORSPACE_LINEAR_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_gl_renderbuffer_image" supported="egl"> >+ <require> >+ <enum name="EGL_GL_RENDERBUFFER_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_gl_texture_2D_image" supported="egl"> >+ <require> >+ <enum name="EGL_GL_TEXTURE_2D_KHR"/> >+ <enum name="EGL_GL_TEXTURE_LEVEL_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_gl_texture_3D_image" supported="egl"> >+ <require> >+ <enum name="EGL_GL_TEXTURE_3D_KHR"/> >+ <enum name="EGL_GL_TEXTURE_ZOFFSET_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_gl_texture_cubemap_image" supported="egl"> >+ <require> >+ <enum name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR"/> >+ <enum name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR"/> >+ <enum name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR"/> >+ <enum name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR"/> >+ <enum name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR"/> >+ <enum name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_image" supported="egl"> >+ <require> >+ <enum name="EGL_NATIVE_PIXMAP_KHR"/> >+ <enum name="EGL_NO_IMAGE_KHR"/> >+ <command name="eglCreateImageKHR"/> >+ <command name="eglDestroyImageKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_image_base" supported="egl"> >+ <require> >+ <enum name="EGL_IMAGE_PRESERVED_KHR"/> >+ <enum name="EGL_NO_IMAGE_KHR"/> >+ <command name="eglCreateImageKHR"/> >+ <command name="eglDestroyImageKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_image_pixmap" supported="egl"> >+ <require> >+ <enum name="EGL_NATIVE_PIXMAP_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_lock_surface" supported="egl"> >+ <require> >+ <enum name="EGL_READ_SURFACE_BIT_KHR"/> >+ <enum name="EGL_WRITE_SURFACE_BIT_KHR"/> >+ <enum name="EGL_LOCK_SURFACE_BIT_KHR"/> >+ <enum name="EGL_OPTIMAL_FORMAT_BIT_KHR"/> >+ <enum name="EGL_MATCH_FORMAT_KHR"/> >+ <enum name="EGL_FORMAT_RGB_565_EXACT_KHR"/> >+ <enum name="EGL_FORMAT_RGB_565_KHR"/> >+ <enum name="EGL_FORMAT_RGBA_8888_EXACT_KHR"/> >+ <enum name="EGL_FORMAT_RGBA_8888_KHR"/> >+ <enum name="EGL_MAP_PRESERVE_PIXELS_KHR"/> >+ <enum name="EGL_LOCK_USAGE_HINT_KHR"/> >+ <enum name="EGL_BITMAP_POINTER_KHR"/> >+ <enum name="EGL_BITMAP_PITCH_KHR"/> >+ <enum name="EGL_BITMAP_ORIGIN_KHR"/> >+ <enum name="EGL_BITMAP_PIXEL_RED_OFFSET_KHR"/> >+ <enum name="EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR"/> >+ <enum name="EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR"/> >+ <enum name="EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR"/> >+ <enum name="EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR"/> >+ <enum name="EGL_LOWER_LEFT_KHR"/> >+ <enum name="EGL_UPPER_LEFT_KHR"/> >+ <command name="eglLockSurfaceKHR"/> >+ <command name="eglUnlockSurfaceKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_lock_surface2" supported="egl"> >+ <require> >+ <enum name="EGL_BITMAP_PIXEL_SIZE_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_lock_surface3" supported="egl"> >+ <require> >+ <enum name="EGL_READ_SURFACE_BIT_KHR"/> >+ <enum name="EGL_WRITE_SURFACE_BIT_KHR"/> >+ <enum name="EGL_LOCK_SURFACE_BIT_KHR"/> >+ <enum name="EGL_OPTIMAL_FORMAT_BIT_KHR"/> >+ <enum name="EGL_MATCH_FORMAT_KHR"/> >+ <enum name="EGL_FORMAT_RGB_565_EXACT_KHR"/> >+ <enum name="EGL_FORMAT_RGB_565_KHR"/> >+ <enum name="EGL_FORMAT_RGBA_8888_EXACT_KHR"/> >+ <enum name="EGL_FORMAT_RGBA_8888_KHR"/> >+ <enum name="EGL_MAP_PRESERVE_PIXELS_KHR"/> >+ <enum name="EGL_LOCK_USAGE_HINT_KHR"/> >+ <enum name="EGL_BITMAP_PITCH_KHR"/> >+ <enum name="EGL_BITMAP_ORIGIN_KHR"/> >+ <enum name="EGL_BITMAP_PIXEL_RED_OFFSET_KHR"/> >+ <enum name="EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR"/> >+ <enum name="EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR"/> >+ <enum name="EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR"/> >+ <enum name="EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR"/> >+ <enum name="EGL_BITMAP_PIXEL_SIZE_KHR"/> >+ <enum name="EGL_BITMAP_POINTER_KHR"/> >+ <enum name="EGL_LOWER_LEFT_KHR"/> >+ <enum name="EGL_UPPER_LEFT_KHR"/> >+ <command name="eglLockSurfaceKHR"/> >+ <command name="eglUnlockSurfaceKHR"/> >+ <command name="eglQuerySurface64KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_mutable_render_buffer" supported="egl"> >+ <require> >+ <enum name="EGL_MUTABLE_RENDER_BUFFER_BIT_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_no_config_context" supported="egl"> >+ <require> >+ <enum name="EGL_NO_CONFIG_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_partial_update" supported="egl"> >+ <require> >+ <enum name="EGL_BUFFER_AGE_KHR"/> >+ <command name="eglSetDamageRegionKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_platform_android" supported="egl"> >+ <require> >+ <enum name="EGL_PLATFORM_ANDROID_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_platform_gbm" supported="egl"> >+ <require> >+ <enum name="EGL_PLATFORM_GBM_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_platform_wayland" supported="egl"> >+ <require> >+ <enum name="EGL_PLATFORM_WAYLAND_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_platform_x11" supported="egl"> >+ <require> >+ <enum name="EGL_PLATFORM_X11_KHR"/> >+ <enum name="EGL_PLATFORM_X11_SCREEN_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_reusable_sync" protect="KHRONOS_SUPPORT_INT64" supported="egl"> >+ <require> >+ <enum name="EGL_SYNC_STATUS_KHR"/> >+ <enum name="EGL_SIGNALED_KHR"/> >+ <enum name="EGL_UNSIGNALED_KHR"/> >+ <enum name="EGL_TIMEOUT_EXPIRED_KHR"/> >+ <enum name="EGL_CONDITION_SATISFIED_KHR"/> >+ <enum name="EGL_SYNC_TYPE_KHR"/> >+ <enum name="EGL_SYNC_REUSABLE_KHR"/> >+ <enum name="EGL_SYNC_FLUSH_COMMANDS_BIT_KHR"/> >+ <enum name="EGL_FOREVER_KHR"/> >+ <enum name="EGL_NO_SYNC_KHR"/> >+ <command name="eglCreateSyncKHR"/> >+ <command name="eglDestroySyncKHR"/> >+ <command name="eglClientWaitSyncKHR"/> >+ <command name="eglSignalSyncKHR"/> >+ <command name="eglGetSyncAttribKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_stream" protect="KHRONOS_SUPPORT_INT64" supported="egl"> >+ <require> >+ <enum name="EGL_NO_STREAM_KHR"/> >+ <enum name="EGL_CONSUMER_LATENCY_USEC_KHR"/> >+ <enum name="EGL_PRODUCER_FRAME_KHR"/> >+ <enum name="EGL_CONSUMER_FRAME_KHR"/> >+ <enum name="EGL_STREAM_STATE_KHR"/> >+ <enum name="EGL_STREAM_STATE_CREATED_KHR"/> >+ <enum name="EGL_STREAM_STATE_CONNECTING_KHR"/> >+ <enum name="EGL_STREAM_STATE_EMPTY_KHR"/> >+ <enum name="EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR"/> >+ <enum name="EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR"/> >+ <enum name="EGL_STREAM_STATE_DISCONNECTED_KHR"/> >+ <enum name="EGL_BAD_STREAM_KHR"/> >+ <enum name="EGL_BAD_STATE_KHR"/> >+ <command name="eglCreateStreamKHR"/> >+ <command name="eglDestroyStreamKHR"/> >+ <command name="eglStreamAttribKHR"/> >+ <command name="eglQueryStreamKHR"/> >+ <command name="eglQueryStreamu64KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_stream_attrib" protect="KHRONOS_SUPPORT_INT64" supported="egl"> >+ <require> >+ <enum name="EGL_CONSUMER_LATENCY_USEC_KHR"/> >+ <enum name="EGL_STREAM_STATE_KHR"/> >+ <enum name="EGL_STREAM_STATE_CREATED_KHR"/> >+ <enum name="EGL_STREAM_STATE_CONNECTING_KHR"/> >+ <command name="eglCreateStreamAttribKHR"/> >+ <command name="eglSetStreamAttribKHR"/> >+ <command name="eglQueryStreamAttribKHR"/> >+ <command name="eglStreamConsumerAcquireAttribKHR"/> >+ <command name="eglStreamConsumerReleaseAttribKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_stream_consumer_gltexture" protect="EGL_KHR_stream" supported="egl"> >+ <require> >+ <enum name="EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR"/> >+ <command name="eglStreamConsumerGLTextureExternalKHR"/> >+ <command name="eglStreamConsumerAcquireKHR"/> >+ <command name="eglStreamConsumerReleaseKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_stream_cross_process_fd" protect="EGL_KHR_stream" supported="egl"> >+ <require> >+ <enum name="EGL_NO_FILE_DESCRIPTOR_KHR"/> >+ <command name="eglGetStreamFileDescriptorKHR"/> >+ <command name="eglCreateStreamFromFileDescriptorKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_stream_fifo" protect="EGL_KHR_stream" supported="egl"> >+ <require> >+ <enum name="EGL_STREAM_FIFO_LENGTH_KHR"/> >+ <enum name="EGL_STREAM_TIME_NOW_KHR"/> >+ <enum name="EGL_STREAM_TIME_CONSUMER_KHR"/> >+ <enum name="EGL_STREAM_TIME_PRODUCER_KHR"/> >+ <command name="eglQueryStreamTimeKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_stream_producer_aldatalocator" protect="EGL_KHR_stream" supported="egl"/> >+ <extension name="EGL_KHR_stream_producer_eglsurface" protect="EGL_KHR_stream" supported="egl"> >+ <require> >+ <enum name="EGL_STREAM_BIT_KHR"/> >+ <command name="eglCreateStreamProducerSurfaceKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_surfaceless_context" supported="egl" comment="Just relaxes an error condition"/> >+ <extension name="EGL_KHR_swap_buffers_with_damage" supported="egl"> >+ <require> >+ <command name="eglSwapBuffersWithDamageKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_vg_parent_image" supported="egl"> >+ <require> >+ <enum name="EGL_VG_PARENT_IMAGE_KHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_KHR_wait_sync" supported="egl"> >+ <require> >+ <command name="eglWaitSyncKHR"/> >+ </require> >+ </extension> >+ <extension name="EGL_MESA_drm_image" supported="egl"> >+ <require> >+ <enum name="EGL_DRM_BUFFER_FORMAT_MESA"/> >+ <enum name="EGL_DRM_BUFFER_USE_MESA"/> >+ <enum name="EGL_DRM_BUFFER_FORMAT_ARGB32_MESA"/> >+ <enum name="EGL_DRM_BUFFER_MESA"/> >+ <enum name="EGL_DRM_BUFFER_STRIDE_MESA"/> >+ <enum name="EGL_DRM_BUFFER_USE_SCANOUT_MESA"/> >+ <enum name="EGL_DRM_BUFFER_USE_SHARE_MESA"/> >+ <enum name="EGL_DRM_BUFFER_USE_CURSOR_MESA"/> >+ <command name="eglCreateDRMImageMESA"/> >+ <command name="eglExportDRMImageMESA"/> >+ </require> >+ </extension> >+ <extension name="EGL_MESA_image_dma_buf_export" supported="egl"> >+ <require> >+ <type name="EGLuint64KHR"/> >+ <command name="eglExportDMABUFImageQueryMESA"/> >+ <command name="eglExportDMABUFImageMESA"/> >+ </require> >+ </extension> >+ <extension name="EGL_MESA_platform_gbm" supported="egl"> >+ <require> >+ <enum name="EGL_PLATFORM_GBM_MESA"/> >+ </require> >+ </extension> >+ <extension name="EGL_MESA_platform_surfaceless" supported="egl"> >+ <require> >+ <enum name="EGL_PLATFORM_SURFACELESS_MESA"/> >+ </require> >+ </extension> >+ <extension name="EGL_NOK_swap_region" supported="egl"> >+ <require> >+ <command name="eglSwapBuffersRegionNOK"/> >+ </require> >+ </extension> >+ <extension name="EGL_NOK_swap_region2" supported="egl"> >+ <require> >+ <command name="eglSwapBuffersRegion2NOK"/> >+ </require> >+ </extension> >+ <extension name="EGL_NOK_texture_from_pixmap" supported="egl"> >+ <require> >+ <enum name="EGL_Y_INVERTED_NOK"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_3dvision_surface" supported="egl"> >+ <require> >+ <enum name="EGL_AUTO_STEREO_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_coverage_sample" supported="egl"> >+ <require> >+ <enum name="EGL_COVERAGE_BUFFERS_NV"/> >+ <enum name="EGL_COVERAGE_SAMPLES_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_context_priority_realtime" supported="egl"> >+ <require> >+ <enum name="EGL_CONTEXT_PRIORITY_REALTIME_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_coverage_sample_resolve" supported="egl"> >+ <require> >+ <enum name="EGL_COVERAGE_SAMPLE_RESOLVE_NV"/> >+ <enum name="EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV"/> >+ <enum name="EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_cuda_event" supported="egl"> >+ <require> >+ <enum name="EGL_CUDA_EVENT_HANDLE_NV"/> >+ <enum name="EGL_SYNC_CUDA_EVENT_NV"/> >+ <enum name="EGL_SYNC_CUDA_EVENT_COMPLETE_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_depth_nonlinear" supported="egl"> >+ <require> >+ <enum name="EGL_DEPTH_ENCODING_NV"/> >+ <enum name="EGL_DEPTH_ENCODING_NONE_NV"/> >+ <enum name="EGL_DEPTH_ENCODING_NONLINEAR_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_device_cuda" supported="egl"> >+ <require> >+ <enum name="EGL_CUDA_DEVICE_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_native_query" supported="egl"> >+ <require> >+ <command name="eglQueryNativeDisplayNV"/> >+ <command name="eglQueryNativeWindowNV"/> >+ <command name="eglQueryNativePixmapNV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_post_convert_rounding" supported="egl"> >+ <require> >+ </require> >+ </extension> >+ <extension name="EGL_NV_post_sub_buffer" supported="egl"> >+ <require> >+ <enum name="EGL_POST_SUB_BUFFER_SUPPORTED_NV"/> >+ <command name="eglPostSubBufferNV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_robustness_video_memory_purge" supported="egl"> >+ <require> >+ <enum name="EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_consumer_gltexture_yuv" supported="egl"> >+ <require> >+ <enum name="EGL_YUV_PLANE0_TEXTURE_UNIT_NV"/> >+ <enum name="EGL_YUV_PLANE1_TEXTURE_UNIT_NV"/> >+ <enum name="EGL_YUV_PLANE2_TEXTURE_UNIT_NV"/> >+ <enum name="EGL_YUV_NUMBER_OF_PLANES_EXT"/> >+ <enum name="EGL_YUV_BUFFER_EXT"/> >+ <command name="eglStreamConsumerGLTextureExternalAttribsNV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_cross_object" supported="egl"> >+ <require> >+ <enum name="EGL_STREAM_CROSS_OBJECT_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_cross_display" supported="egl"> >+ <require> >+ <enum name="EGL_STREAM_CROSS_DISPLAY_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_cross_partition" supported="egl"> >+ <require> >+ <enum name="EGL_STREAM_CROSS_PARTITION_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_cross_process" supported="egl"> >+ <require> >+ <enum name="EGL_STREAM_CROSS_PROCESS_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_cross_system" supported="egl"> >+ <require> >+ <enum name="EGL_STREAM_CROSS_SYSTEM_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_fifo_next" supported="egl"> >+ <require> >+ <enum name="EGL_PENDING_FRAME_NV"/> >+ <enum name="EGL_STREAM_TIME_PENDING_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_fifo_synchronous" supported="egl"> >+ <require> >+ <enum name="EGL_STREAM_FIFO_SYNCHRONOUS_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_flush" supported="egl"> >+ <require> >+ <command name="eglStreamFlushNV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_frame_limits" supported="egl"> >+ <require> >+ <enum name="EGL_PRODUCER_MAX_FRAME_HINT_NV"/> >+ <enum name="EGL_CONSUMER_MAX_FRAME_HINT_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_metadata" supported="egl"> >+ <require> >+ <enum name="EGL_MAX_STREAM_METADATA_BLOCKS_NV"/> >+ <enum name="EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV"/> >+ <enum name="EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV"/> >+ <enum name="EGL_PRODUCER_METADATA_NV"/> >+ <enum name="EGL_CONSUMER_METADATA_NV"/> >+ <enum name="EGL_PENDING_METADATA_NV"/> >+ <enum name="EGL_METADATA0_SIZE_NV"/> >+ <enum name="EGL_METADATA1_SIZE_NV"/> >+ <enum name="EGL_METADATA2_SIZE_NV"/> >+ <enum name="EGL_METADATA3_SIZE_NV"/> >+ <enum name="EGL_METADATA0_TYPE_NV"/> >+ <enum name="EGL_METADATA1_TYPE_NV"/> >+ <enum name="EGL_METADATA2_TYPE_NV"/> >+ <enum name="EGL_METADATA3_TYPE_NV"/> >+ <command name="eglQueryDisplayAttribNV"/> >+ <command name="eglSetStreamMetadataNV"/> >+ <command name="eglQueryStreamMetadataNV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_reset" supported="egl"> >+ <require> >+ <enum name="EGL_SUPPORT_RESET_NV"/> >+ <enum name="EGL_SUPPORT_REUSE_NV"/> >+ <command name="eglResetStreamNV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_remote" supported="egl"> >+ <require> >+ <enum name="EGL_STREAM_STATE_INITIALIZING_NV"/> >+ <enum name="EGL_STREAM_TYPE_NV"/> >+ <enum name="EGL_STREAM_PROTOCOL_NV"/> >+ <enum name="EGL_STREAM_ENDPOINT_NV"/> >+ <enum name="EGL_STREAM_LOCAL_NV"/> >+ <enum name="EGL_STREAM_PRODUCER_NV"/> >+ <enum name="EGL_STREAM_CONSUMER_NV"/> >+ </require> >+ <require comment="Supported only if EGL_KHR_stream_cross_process_fd is supported"> >+ <enum name="EGL_STREAM_PROTOCOL_FD_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_socket" supported="egl"> >+ <require> >+ <enum name="EGL_STREAM_PROTOCOL_SOCKET_NV"/> >+ <enum name="EGL_SOCKET_HANDLE_NV"/> >+ <enum name="EGL_SOCKET_TYPE_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_socket_inet" supported="egl"> >+ <require> >+ <enum name="EGL_SOCKET_TYPE_INET_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_socket_unix" supported="egl"> >+ <require> >+ <enum name="EGL_SOCKET_TYPE_UNIX_NV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_stream_sync" supported="egl"> >+ <require> >+ <enum name="EGL_SYNC_TYPE_KHR"/> >+ <enum name="EGL_SYNC_NEW_FRAME_NV"/> >+ <command name="eglCreateStreamSyncNV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_sync" protect="KHRONOS_SUPPORT_INT64" supported="egl"> >+ <require> >+ <enum name="EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV"/> >+ <enum name="EGL_SYNC_STATUS_NV"/> >+ <enum name="EGL_SIGNALED_NV"/> >+ <enum name="EGL_UNSIGNALED_NV"/> >+ <enum name="EGL_SYNC_FLUSH_COMMANDS_BIT_NV"/> >+ <enum name="EGL_FOREVER_NV"/> >+ <enum name="EGL_ALREADY_SIGNALED_NV"/> >+ <enum name="EGL_TIMEOUT_EXPIRED_NV"/> >+ <enum name="EGL_CONDITION_SATISFIED_NV"/> >+ <enum name="EGL_SYNC_TYPE_NV"/> >+ <enum name="EGL_SYNC_CONDITION_NV"/> >+ <enum name="EGL_SYNC_FENCE_NV"/> >+ <enum name="EGL_NO_SYNC_NV"/> >+ <command name="eglCreateFenceSyncNV"/> >+ <command name="eglDestroySyncNV"/> >+ <command name="eglFenceNV"/> >+ <command name="eglClientWaitSyncNV"/> >+ <command name="eglSignalSyncNV"/> >+ <command name="eglGetSyncAttribNV"/> >+ </require> >+ </extension> >+ <extension name="EGL_NV_system_time" protect="KHRONOS_SUPPORT_INT64" supported="egl"> >+ <require> >+ <command name="eglGetSystemTimeFrequencyNV"/> >+ <command name="eglGetSystemTimeNV"/> >+ </require> >+ </extension> >+ <extension name="EGL_TIZEN_image_native_buffer" supported="egl"> >+ <require> >+ <enum name="EGL_NATIVE_BUFFER_TIZEN"/> >+ </require> >+ </extension> >+ <extension name="EGL_TIZEN_image_native_surface" supported="egl"> >+ <require> >+ <enum name="EGL_NATIVE_SURFACE_TIZEN"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_compositor" supported="egl"> >+ <require> >+ <enum name="EGL_PRIMARY_COMPOSITOR_CONTEXT_EXT"/> >+ <enum name="EGL_EXTERNAL_REF_ID_EXT"/> >+ <enum name="EGL_COMPOSITOR_DROP_NEWEST_FRAME_EXT"/> >+ <enum name="EGL_COMPOSITOR_KEEP_NEWEST_FRAME_EXT"/> >+ >+ <command name="eglCompositorSetContextListEXT"/> >+ <command name="eglCompositorSetContextAttributesEXT"/> >+ <command name="eglCompositorSetWindowListEXT"/> >+ <command name="eglCompositorSetWindowAttributesEXT"/> >+ <command name="eglCompositorBindTexWindowEXT"/> >+ <command name="eglCompositorSetSizeEXT"/> >+ <command name="eglCompositorSwapPolicyEXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_surface_CTA861_3_metadata" supported="egl"> >+ <require> >+ <enum name="EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT"/> >+ <enum name="EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_image_implicit_sync_control" supported="egl"> >+ <require> >+ <enum name="EGL_IMPORT_SYNC_TYPE_EXT"/> >+ <enum name="EGL_IMPORT_IMPLICIT_SYNC_EXT"/> >+ <enum name="EGL_IMPORT_EXPLICIT_SYNC_EXT"/> >+ </require> >+ </extension> >+ <extension name="EGL_EXT_bind_to_front" supported="egl"> >+ <require> >+ <enum name="EGL_FRONT_BUFFER_EXT"/> >+ </require> >+ </extension> >+ </extensions> >+</registry> >diff --git a/Source/ThirdParty/ANGLE/scripts/egl_angle_ext.xml b/Source/ThirdParty/ANGLE/scripts/egl_angle_ext.xml >new file mode 100644 >index 00000000000..e1029bd0035 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/egl_angle_ext.xml >@@ -0,0 +1,101 @@ >+<?xml version="1.0" encoding="UTF-8"?> >+<registry> >+ <comment> >+ 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. >+ >+ egl_angle_ext.xml >+ Includes data used to auto-generate ANGLE classes. >+ </comment> >+ <!-- SECTION: EGL command definitions. --> >+ <commands namespace="EGL"> >+ <command> >+ <proto><ptype>EGLDeviceEXT</ptype> <name>eglCreateDeviceANGLE</name></proto> >+ <param><ptype>EGLint</ptype> <name>device_type</name></param> >+ <param>void *<name>native_device</name></param> >+ <param>const <ptype>EGLattrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglReleaseDeviceANGLE</name></proto> >+ <param><ptype>EGLDeviceEXT</ptype> <name>device</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglCreateStreamProducerD3DTextureANGLE</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglStreamPostD3DTextureANGLE</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param> >+ <param>void *<name>texture</name></param> >+ <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLBoolean</ptype> <name>eglGetSyncValuesCHROMIUM</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ <param><ptype>EGLuint64KHR</ptype> *<name>ust</name></param> >+ <param><ptype>EGLuint64KHR</ptype> *<name>msc</name></param> >+ <param><ptype>EGLuint64KHR</ptype> *<name>sbc</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLint</ptype> <name>eglProgramCacheGetAttribANGLE</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLenum</ptype> <name>attrib</name></param> >+ </command> >+ <command> >+ <proto>void <name>eglProgramCacheQueryANGLE</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLint</ptype> <name>index</name></param> >+ <param>void *<name>key</name></param> >+ <param><ptype>EGLint</ptype> *<name>keysize</name></param> >+ <param>void *<name>binary</name></param> >+ <param><ptype>EGLint</ptype> *<name>binarysize</name></param> >+ </command> >+ <command> >+ <proto>void <name>eglProgramCachePopulateANGLE</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param>const void *<name>key</name></param> >+ <param><ptype>EGLint</ptype> <name>keysize</name></param> >+ <param>const void *<name>binary</name></param> >+ <param><ptype>EGLint</ptype> <name>binarysize</name></param> >+ </command> >+ <command> >+ <proto><ptype>EGLint</ptype> <name>eglProgramCacheResizeANGLE</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLint</ptype> <name>limit</name></param> >+ <param><ptype>EGLint</ptype> <name>mode</name></param> >+ </command> >+ </commands> >+ <!-- SECTION: ANGLE extension interface definitions --> >+ <extensions> >+ <extension name="EGL_ANGLE_device_creation" supported="egl"> >+ <require> >+ <command name="eglCreateDeviceANGLE"/> >+ <command name="eglReleaseDeviceANGLE"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANGLE_stream_producer_d3d_texture" supported="egl"> >+ <require> >+ <command name="eglCreateStreamProducerD3DTextureANGLE"/> >+ <command name="eglStreamPostD3DTextureANGLE"/> >+ </require> >+ </extension> >+ <extension name="EGL_CHROMIUM_get_sync_values" supported="egl"> >+ <require> >+ <command name="eglGetSyncValuesCHROMIUM"/> >+ </require> >+ </extension> >+ <extension name="EGL_ANGLE_program_cache_control" supported="egl"> >+ <require> >+ <command name="eglProgramCacheGetAttribANGLE"/> >+ <command name="eglProgramCacheQueryANGLE"/> >+ <command name="eglProgramCachePopulateANGLE"/> >+ <command name="eglProgramCacheResizeANGLE"/> >+ </require> >+ </extension> >+ </extensions> >+</registry> >diff --git a/Source/ThirdParty/ANGLE/scripts/entry_point_packed_gl_enums.json b/Source/ThirdParty/ANGLE/scripts/entry_point_packed_gl_enums.json >new file mode 100644 >index 00000000000..7c5fd6351dd >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/entry_point_packed_gl_enums.json >@@ -0,0 +1,505 @@ >+{ >+ "glAlphaFunc": { >+ "func": "AlphaTestFunc" >+ }, >+ "glAlphaFuncx": { >+ "func": "AlphaTestFunc" >+ }, >+ "glBeginTransformFeedback": { >+ "primitiveMode": "PrimitiveMode" >+ }, >+ "glBeginQuery": { >+ "target": "QueryType" >+ }, >+ "glBeginQueryEXT": { >+ "target": "QueryType" >+ }, >+ "glBindBuffer": { >+ "target": "BufferBinding" >+ }, >+ "glBindBufferBase": { >+ "target": "BufferBinding" >+ }, >+ "glBindBufferRange": { >+ "target": "BufferBinding" >+ }, >+ "glBindTexture": { >+ "target": "TextureType" >+ }, >+ "glBufferData": { >+ "target": "BufferBinding", >+ "usage": "BufferUsage" >+ }, >+ "glBufferSubData": { >+ "target": "BufferBinding" >+ }, >+ "glColorPointer": { >+ "type": "VertexAttribType" >+ }, >+ "glCompressedTexImage2D": { >+ "target": "TextureTarget" >+ }, >+ "glCompressedTexImage2DRobustANGLE": { >+ "target": "TextureTarget" >+ }, >+ "glCompressedTexImage3D": { >+ "target": "TextureTarget" >+ }, >+ "glCompressedTexImage3DRobustANGLE": { >+ "target": "TextureTarget" >+ }, >+ "glCompressedTexSubImage2D": { >+ "target": "TextureTarget" >+ }, >+ "glCompressedTexSubImage2DRobustANGLE": { >+ "target": "TextureTarget" >+ }, >+ "glCompressedTexSubImage3D": { >+ "target": "TextureTarget" >+ }, >+ "glCompressedTexSubImage3DRobustANGLE": { >+ "target": "TextureTarget" >+ }, >+ "glCopyTexImage2D": { >+ "target": "TextureTarget" >+ }, >+ "glCopyTexture3DANGLE": { >+ "destTarget": "TextureTarget" >+ }, >+ "glCopyTextureCHROMIUM": { >+ "destTarget": "TextureTarget" >+ }, >+ "glCopyTexSubImage2D": { >+ "target": "TextureTarget" >+ }, >+ "glCopyTexSubImage3D": { >+ "target": "TextureTarget" >+ }, >+ "glCopySubTexture3DANGLE": { >+ "destTarget": "TextureTarget" >+ }, >+ "glCopySubTextureCHROMIUM": { >+ "destTarget": "TextureTarget" >+ }, >+ "glCopyBufferSubData": { >+ "readTarget": "BufferBinding", >+ "writeTarget": "BufferBinding" >+ }, >+ "glCreateShader": { >+ "type": "ShaderType" >+ }, >+ "glCreateShaderProgramv": { >+ "type": "ShaderType" >+ }, >+ "glCullFace": { >+ "mode": "CullFaceMode" >+ }, >+ "glDisableClientState": { >+ "array": "ClientVertexArrayType" >+ }, >+ "glDrawArrays": { >+ "mode": "PrimitiveMode" >+ }, >+ "glDrawArraysIndirect": { >+ "mode": "PrimitiveMode" >+ }, >+ "glDrawArraysInstanced": { >+ "mode": "PrimitiveMode" >+ }, >+ "glDrawArraysInstancedANGLE": { >+ "mode": "PrimitiveMode" >+ }, >+ "glDrawArraysInstancedEXT": { >+ "mode": "PrimitiveMode" >+ }, >+ "glDrawElements": { >+ "mode": "PrimitiveMode", >+ "type": "DrawElementsType" >+ }, >+ "glDrawElementsIndirect": { >+ "mode": "PrimitiveMode", >+ "type": "DrawElementsType" >+ }, >+ "glDrawElementsInstanced": { >+ "mode": "PrimitiveMode", >+ "type": "DrawElementsType" >+ }, >+ "glDrawElementsInstancedANGLE": { >+ "mode": "PrimitiveMode", >+ "type": "DrawElementsType" >+ }, >+ "glDrawElementsInstancedEXT": { >+ "mode": "PrimitiveMode", >+ "type": "DrawElementsType" >+ }, >+ "glDrawRangeElements": { >+ "mode": "PrimitiveMode", >+ "type": "DrawElementsType" >+ }, >+ "glEGLImageTargetTexture2DOES": { >+ "target": "TextureType" >+ }, >+ "glEnableClientState": { >+ "array": "ClientVertexArrayType" >+ }, >+ "glEndQuery": { >+ "target": "QueryType" >+ }, >+ "glEndQueryEXT": { >+ "target": "QueryType" >+ }, >+ "glFlushMappedBufferRange": { >+ "target": "BufferBinding" >+ }, >+ "glFlushMappedBufferRangeEXT": { >+ "target": "BufferBinding" >+ }, >+ "glFramebufferTexture2D": { >+ "textarget": "TextureTarget" >+ }, >+ "glFramebufferTexture2DOES": { >+ "textarget": "TextureTarget" >+ }, >+ "glGenerateMipmap": { >+ "target": "TextureType" >+ }, >+ "glGenerateMipmapOES": { >+ "target": "TextureType" >+ }, >+ "glGetBufferParameteriv": { >+ "target": "BufferBinding" >+ }, >+ "glGetBufferParameterivRobustANGLE": { >+ "target": "BufferBinding" >+ }, >+ "glGetBufferParameteri64v": { >+ "target": "BufferBinding" >+ }, >+ "glGetBufferParameteri64vRobustANGLE": { >+ "target": "BufferBinding" >+ }, >+ "glGetBufferPointerv": { >+ "target": "BufferBinding" >+ }, >+ "glGetBufferPointervOES": { >+ "target": "BufferBinding" >+ }, >+ "glGetBufferPointervRobustANGLE": { >+ "target": "BufferBinding" >+ }, >+ "glGetLightfv": { >+ "pname" : "LightParameter" >+ }, >+ "glGetLightxv": { >+ "pname" : "LightParameter" >+ }, >+ "glGetMaterialfv": { >+ "pname" : "MaterialParameter" >+ }, >+ "glGetMaterialxv": { >+ "pname" : "MaterialParameter" >+ }, >+ "glGetQueryiv": { >+ "target": "QueryType" >+ }, >+ "glGetQueryivEXT": { >+ "target": "QueryType" >+ }, >+ "glGetQueryivRobustANGLE": { >+ "target": "QueryType" >+ }, >+ "glGetTexEnvfv": { >+ "target": "TextureEnvTarget", >+ "pname": "TextureEnvParameter" >+ }, >+ "glGetTexEnviv": { >+ "target": "TextureEnvTarget", >+ "pname": "TextureEnvParameter" >+ }, >+ "glGetTexEnvxv": { >+ "target": "TextureEnvTarget", >+ "pname": "TextureEnvParameter" >+ }, >+ "glGetTexLevelParameterfv": { >+ "target": "TextureTarget" >+ }, >+ "glGetTexLevelParameterfvRobustANGLE": { >+ "target": "TextureTarget" >+ }, >+ "glGetTexLevelParameterfvANGLE": { >+ "target": "TextureTarget" >+ }, >+ "glGetTexLevelParameteriv": { >+ "target": "TextureTarget" >+ }, >+ "glGetTexLevelParameterivRobustANGLE": { >+ "target": "TextureTarget" >+ }, >+ "glGetTexLevelParameterivANGLE": { >+ "target": "TextureTarget" >+ }, >+ "glGetTexParameterfv": { >+ "target": "TextureType" >+ }, >+ "glGetTexParameterfvRobustANGLE": { >+ "target": "TextureType" >+ }, >+ "glGetTexParameteriv": { >+ "target": "TextureType" >+ }, >+ "glGetTexParameterivRobustANGLE": { >+ "target": "TextureType" >+ }, >+ "glGetTexParameterIivRobustANGLE": { >+ "target": "TextureType" >+ }, >+ "glGetTexParameterIuivRobustANGLE": { >+ "target": "TextureType" >+ }, >+ "glGetTexParameterIivOES": { >+ "target": "TextureType" >+ }, >+ "glGetTexParameterIuivOES": { >+ "target": "TextureType" >+ }, >+ "glGetTexParameterxv": { >+ "target": "TextureType" >+ }, >+ "glImportMemoryFdEXT": { >+ "handleType": "HandleType" >+ }, >+ "glImportSemaphoreFdEXT": { >+ "handleType": "HandleType" >+ }, >+ "glLightf" : { >+ "pname" : "LightParameter" >+ }, >+ "glLightfv" : { >+ "pname" : "LightParameter" >+ }, >+ "glLightx" : { >+ "pname" : "LightParameter" >+ }, >+ "glLightxv" : { >+ "pname" : "LightParameter" >+ }, >+ "glLogicOp" : { >+ "opcode" : "LogicalOperation" >+ }, >+ "glLoseContextCHROMIUM" : { >+ "current" : "GraphicsResetStatus", >+ "other" : "GraphicsResetStatus" >+ }, >+ "glMapBuffer": { >+ "target": "BufferBinding" >+ }, >+ "glMapBufferOES": { >+ "target": "BufferBinding" >+ }, >+ "glMapBufferRange": { >+ "target": "BufferBinding" >+ }, >+ "glMapBufferRangeEXT": { >+ "target": "BufferBinding" >+ }, >+ "glMaterialf": { >+ "pname": "MaterialParameter" >+ }, >+ "glMaterialfv": { >+ "pname": "MaterialParameter" >+ }, >+ "glMaterialx": { >+ "pname": "MaterialParameter" >+ }, >+ "glMaterialxv": { >+ "pname": "MaterialParameter" >+ }, >+ "glMatrixMode": { >+ "mode": "MatrixType" >+ }, >+ "glMultiDrawArraysANGLE": { >+ "mode": "PrimitiveMode" >+ }, >+ "glMultiDrawArraysInstancedANGLE": { >+ "mode": "PrimitiveMode" >+ }, >+ "glMultiDrawElementsANGLE": { >+ "mode": "PrimitiveMode", >+ "type": "DrawElementsType" >+ }, >+ "glMultiDrawElementsInstancedANGLE": { >+ "mode": "PrimitiveMode", >+ "type": "DrawElementsType" >+ }, >+ "glNormalPointer": { >+ "type": "VertexAttribType" >+ }, >+ "glPointParameterf": { >+ "pname" : "PointParameter" >+ }, >+ "glPointParameterfv": { >+ "pname" : "PointParameter" >+ }, >+ "glPointParameterx": { >+ "pname" : "PointParameter" >+ }, >+ "glPointParameterxv": { >+ "pname" : "PointParameter" >+ }, >+ "glPointSizePointerOES": { >+ "type" : "VertexAttribType" >+ }, >+ "glProvokingVertexANGLE": { >+ "mode": "ProvokingVertex" >+ }, >+ "glQueryCounterEXT": { >+ "target": "QueryType" >+ }, >+ "glShadeModel": { >+ "mode": "ShadingModel" >+ }, >+ "glTexCoordPointer": { >+ "type": "VertexAttribType" >+ }, >+ "glTexEnvf": { >+ "target": "TextureEnvTarget", >+ "pname": "TextureEnvParameter" >+ }, >+ "glTexEnvfv": { >+ "target": "TextureEnvTarget", >+ "pname": "TextureEnvParameter" >+ }, >+ "glTexEnvi": { >+ "target": "TextureEnvTarget", >+ "pname": "TextureEnvParameter" >+ }, >+ "glTexEnviv": { >+ "target": "TextureEnvTarget", >+ "pname": "TextureEnvParameter" >+ }, >+ "glTexEnvx": { >+ "target": "TextureEnvTarget", >+ "pname": "TextureEnvParameter" >+ }, >+ "glTexEnvxv": { >+ "target": "TextureEnvTarget", >+ "pname": "TextureEnvParameter" >+ }, >+ "glTexImage2D": { >+ "target": "TextureTarget" >+ }, >+ "glTexImage2DRobustANGLE": { >+ "target": "TextureTarget" >+ }, >+ "glTexImage3D": { >+ "target": "TextureTarget" >+ }, >+ "glTexImage3DRobustANGLE": { >+ "target": "TextureTarget" >+ }, >+ "glTexParameterf": { >+ "target": "TextureType" >+ }, >+ "glTexParameterfv": { >+ "target": "TextureType" >+ }, >+ "glTexParameterfvRobustANGLE": { >+ "target": "TextureType" >+ }, >+ "glTexParameteri": { >+ "target": "TextureType" >+ }, >+ "glTexParameteriv": { >+ "target": "TextureType" >+ }, >+ "glTexParameterivRobustANGLE": { >+ "target": "TextureType" >+ }, >+ "glTexParameterIivRobustANGLE": { >+ "target": "TextureType" >+ }, >+ "glTexParameterIuivRobustANGLE": { >+ "target": "TextureType" >+ }, >+ "glTexParameterIivOES": { >+ "target": "TextureType" >+ }, >+ "glTexParameterIuivOES": { >+ "target": "TextureType" >+ }, >+ "glTexParameterx": { >+ "target": "TextureType" >+ }, >+ "glTexParameterxv": { >+ "target": "TextureType" >+ }, >+ "glTexStorage2D": { >+ "target": "TextureType" >+ }, >+ "glTexStorage2DEXT": { >+ "target": "TextureType" >+ }, >+ "glTexStorage2DMultisample": { >+ "target": "TextureType" >+ }, >+ "glTexStorage2DMultisampleANGLE": { >+ "target": "TextureType" >+ }, >+ "glTexStorage3DMultisampleOES": { >+ "target": "TextureType" >+ }, >+ "glTexStorageMem2DEXT": { >+ "target": "TextureType" >+ }, >+ "glTexStorageMem2DMultisampleEXT": { >+ "target": "TextureType" >+ }, >+ "glTexStorageMem3DEXT": { >+ "target": "TextureType" >+ }, >+ "glTexStorageMem3DMultisampleEXT": { >+ "target": "TextureType" >+ }, >+ "glBufferStorageMemEXT": { >+ "target": "TextureType" >+ }, >+ "glTexStorage3D": { >+ "target": "TextureType" >+ }, >+ "glTexStorage3DEXT": { >+ "target": "TextureType" >+ }, >+ "glTexSubImage2D": { >+ "target": "TextureTarget" >+ }, >+ "glTexSubImage2DRobustANGLE": { >+ "target": "TextureTarget" >+ }, >+ "glTexSubImage3D": { >+ "target": "TextureTarget" >+ }, >+ "glTexSubImage3DRobustANGLE": { >+ "target": "TextureTarget" >+ }, >+ "glUnmapBuffer": { >+ "target": "BufferBinding" >+ }, >+ "glUnmapBufferOES": { >+ "target": "BufferBinding" >+ }, >+ "glVertexAttribFormat": { >+ "type": "VertexAttribType" >+ }, >+ "glVertexAttribIFormat": { >+ "type": "VertexAttribType" >+ }, >+ "glVertexAttribIPointer": { >+ "type": "VertexAttribType" >+ }, >+ "glVertexAttribPointer": { >+ "type": "VertexAttribType" >+ }, >+ "glVertexPointer": { >+ "type": "VertexAttribType" >+ } >+} >diff --git a/Source/ThirdParty/ANGLE/scripts/file_exists.py b/Source/ThirdParty/ANGLE/scripts/file_exists.py >new file mode 100644 >index 00000000000..435cdf89f85 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/file_exists.py >@@ -0,0 +1,24 @@ >+#!/usr/bin/python2 >+# 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. >+# >+# Simple helper for use in 'gn' files to check if a file exists. >+ >+from __future__ import print_function >+ >+import os, shutil, sys >+ >+def main(): >+ if len(sys.argv) != 2: >+ print("Usage: %s <path>" % sys.argv[0]) >+ sys.exit(1) >+ >+ if os.path.exists(sys.argv[1]): >+ print("true") >+ else: >+ print("false") >+ sys.exit(0) >+ >+if __name__ == '__main__': >+ main() >diff --git a/Source/ThirdParty/ANGLE/scripts/gen_angle_gn_info_json.py b/Source/ThirdParty/ANGLE/scripts/gen_angle_gn_info_json.py >new file mode 100644 >index 00000000000..f79b373ca19 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/gen_angle_gn_info_json.py >@@ -0,0 +1,116 @@ >+#!/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. >+ >+# This tool will create a json description of the GN build environment that >+# can then be used by gen_angle_android_bp.py to build an Android.bp file for >+# the Android Soong build system. >+# The input to this tool is a list of GN labels for which to capture the build >+# information in json: >+# >+# Generating angle.json needs to be done from within a Chromium build: >+# cd <chromium>/src >+# gen_angle_gn_info_json.py //third_party/angle:libGLESv2 //third_party/angle:libEGL >+# >+# This will output an angle.json that can be copied to the angle directory >+# within Android. >+# >+# Optional arguments: >+# --gn_out <file> GN output config to use (e.g., out/Default or out/Debug.) >+# --output <file> json file to create, default is angle.json >+# >+ >+import argparse >+import json >+import logging >+import subprocess >+import sys >+ >+ >+def get_json_description(gn_out, target_name): >+ try: >+ text_desc = subprocess.check_output( >+ ['gn', 'desc', '--format=json', gn_out, target_name]) >+ except subprocess.CalledProcessError as e: >+ logging.error("e.retcode = %s" % e.returncode) >+ logging.error("e.cmd = %s" % e.cmd) >+ logging.error("e.output = %s" % e.output) >+ try: >+ json_out = json.loads(text_desc) >+ except ValueError: >+ raise ValueError("Unable to decode JSON\ncmd: %s\noutput:\n%s" % >+ (subprocess.list2cmdline(['gn', 'desc', '--format=json', >+ gn_out, target_name]), text_desc)) >+ >+ return json_out >+ >+def load_json_deps(desc, gn_out, target_name, all_desc, indent=" "): >+ """Extracts dependencies from the given target json description >+ and recursively extracts json descriptions. >+ >+ desc: json description for target_name that includes dependencies >+ gn_out: GN output file with configuration info >+ target_name: name of target in desc to lookup deps >+ all_desc: dependent descriptions added here >+ indent: Print with indent to show recursion depth >+ """ >+ target = desc[target_name] >+ text_descriptions = [] >+ for dep in target.get('deps', []): >+ if dep not in all_desc: >+ logging.debug("dep: %s%s" % (indent,dep)) >+ new_desc = get_json_description(gn_out, dep) >+ all_desc[dep] = new_desc[dep] >+ load_json_deps(new_desc, gn_out, dep, all_desc, indent+" ") >+ else: >+ logging.debug("dup: %s%s" % (indent,dep)) >+ >+def create_build_description(gn_out, targets): >+ """Creates the JSON build description by running GN.""" >+ >+ logging.debug("targets = %s" % targets) >+ json_descriptions = {} >+ for target in targets: >+ logging.debug("target: %s" % (target)) >+ target_desc = get_json_description(gn_out, target) >+ if (target in target_desc and target not in json_descriptions): >+ json_descriptions[target] = target_desc[target] >+ load_json_deps(target_desc, gn_out, target, json_descriptions) >+ else: >+ logging.debug("Invalid target: %s" % target) >+ return json_descriptions >+ >+ >+def main(): >+ logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) >+ parser = argparse.ArgumentParser( >+ description='Generate json build information from a GN description.') >+ parser.add_argument( >+ '--gn_out', >+ help= >+ 'GN output config to use (e.g., out/Default or out/Debug.)', >+ default='out/Default', >+ ) >+ parser.add_argument( >+ '--output', >+ help='json file to create', >+ default='angle.json', >+ ) >+ parser.add_argument( >+ 'targets', >+ nargs=argparse.REMAINDER, >+ help='Targets to include in the json (e.g., "//libEGL")') >+ args = parser.parse_args() >+ >+ desc = create_build_description(args.gn_out, args.targets) >+ fh = open(args.output,"w") >+ fh.write(json.dumps(desc, indent=4, sort_keys=True)) >+ fh.close() >+ >+ print("Output written to: %s" % args.output) >+ >+ >+if __name__ == '__main__': >+ sys.exit(main()) >diff --git a/Source/ThirdParty/ANGLE/scripts/generate_entry_points.py b/Source/ThirdParty/ANGLE/scripts/generate_entry_points.py >new file mode 100644 >index 00000000000..032a8277ab7 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/generate_entry_points.py >@@ -0,0 +1,930 @@ >+#!/usr/bin/python2 >+# >+# 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. >+# >+# generate_entry_points.py: >+# Generates the OpenGL bindings and entry point layers for ANGLE. >+# NOTE: don't run this script directly. Run scripts/run_code_generation.py. >+ >+import sys, os, pprint, json >+from datetime import date >+import registry_xml >+ >+# List of GLES1 extensions for which we don't need to add Context.h decls. >+gles1_no_context_decl_extensions = [ >+ "GL_OES_framebuffer_object", >+] >+ >+# List of GLES1 API calls that have had their semantics changed in later GLES versions, but the >+# name was kept the same >+gles1_overloaded = [ >+ "glGetPointerv", >+] >+ >+# This is a list of exceptions for entry points which don't want to have >+# the EVENT macro. This is required for some debug marker entry points. >+no_event_marker_exceptions_list = sorted([ >+ "glPushGroupMarkerEXT", >+ "glPopGroupMarkerEXT", >+ "glInsertEventMarkerEXT", >+]) >+ >+# Strip these suffixes from Context entry point names. NV is excluded (for now). >+strip_suffixes = ["ANGLE", "EXT", "KHR", "OES", "CHROMIUM", "OVR"] >+ >+template_entry_point_header = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {data_source_name}. >+// >+// 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. >+// >+// entry_points_gles_{annotation_lower}_autogen.h: >+// Defines the GLES {comment} entry points. >+ >+#ifndef LIBGLESV2_ENTRY_POINTS_GLES_{annotation_upper}_AUTOGEN_H_ >+#define LIBGLESV2_ENTRY_POINTS_GLES_{annotation_upper}_AUTOGEN_H_ >+ >+{includes} >+ >+namespace gl >+{{ >+{entry_points} >+}} // namespace gl >+ >+#endif // LIBGLESV2_ENTRY_POINTS_GLES_{annotation_upper}_AUTOGEN_H_ >+""" >+ >+template_entry_point_source = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {data_source_name}. >+// >+// 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. >+// >+// entry_points_gles_{annotation_lower}_autogen.cpp: >+// Defines the GLES {comment} entry points. >+ >+{includes} >+ >+namespace gl >+{{ >+{entry_points}}} // namespace gl >+""" >+ >+template_entry_points_enum_header = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {data_source_name}. >+// >+// 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. >+// >+// entry_points_enum_autogen.h: >+// Defines the GLES entry points enumeration. >+ >+#ifndef LIBGLESV2_ENTRYPOINTSENUM_AUTOGEN_H_ >+#define LIBGLESV2_ENTRYPOINTSENUM_AUTOGEN_H_ >+ >+namespace gl >+{{ >+enum class EntryPoint >+{{ >+{entry_points_list} >+}}; >+}} // namespace gl >+#endif // LIBGLESV2_ENTRY_POINTS_ENUM_AUTOGEN_H_ >+""" >+ >+template_libgles_entry_point_source = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {data_source_name}. >+// >+// 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. >+// >+// libGLESv2.cpp: Implements the exported OpenGL ES functions. >+ >+{includes} >+extern "C" {{ >+{entry_points} >+}} // extern "C" >+""" >+ >+template_entry_point_decl = """ANGLE_EXPORT {return_type}GL_APIENTRY {name}{explicit_context_suffix}({explicit_context_param}{explicit_context_comma}{params});""" >+ >+template_entry_point_def = """{return_type}GL_APIENTRY {name}{explicit_context_suffix}({explicit_context_param}{explicit_context_comma}{params}) >+{{ >+ ANGLE_SCOPED_GLOBAL_LOCK(); >+ {event_comment}EVENT("({format_params})"{comma_if_needed}{pass_params}); >+ >+ Context *context = {context_getter}; >+ if (context) >+ {{{assert_explicit_context}{packed_gl_enum_conversions} >+ if (context->skipValidation() || Validate{name}({validate_params})) >+ {{ >+ {return_if_needed}context->{name_lower_no_suffix}({internal_params}); >+ }} >+ }} >+{default_return_if_needed}}} >+""" >+ >+context_gles_header = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {data_source_name}. >+// >+// 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. >+// >+// Context_gles_{annotation_lower}_autogen.h: Creates a macro for interfaces in Context. >+ >+#ifndef ANGLE_CONTEXT_GLES_{annotation_upper}_AUTOGEN_H_ >+#define ANGLE_CONTEXT_GLES_{annotation_upper}_AUTOGEN_H_ >+ >+#define ANGLE_GLES1_CONTEXT_API \\ >+{interface} >+ >+#endif // ANGLE_CONTEXT_API_{annotation_upper}_AUTOGEN_H_ >+""" >+ >+context_gles_decl = """ {return_type} {name_lower_no_suffix}({internal_params}); \\""" >+ >+libgles_entry_point_def = """{return_type}GL_APIENTRY gl{name}{explicit_context_suffix}({explicit_context_param}{explicit_context_comma}{params}) >+{{ >+ return gl::{name}{explicit_context_suffix}({explicit_context_internal_param}{explicit_context_comma}{internal_params}); >+}} >+""" >+ >+template_glext_explicit_context_inc = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {data_source_name}. >+// >+// 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. >+// >+// gl{version}ext_explicit_context_autogen.inc: >+// Function declarations for the EGL_ANGLE_explicit_context extension >+ >+{function_pointers} >+#ifdef GL_GLEXT_PROTOTYPES >+{function_prototypes} >+#endif >+""" >+ >+template_glext_function_pointer = """typedef {return_type}(GL_APIENTRYP PFN{name_upper}{explicit_context_suffix_upper}PROC)({explicit_context_param}{explicit_context_comma}{params});""" >+template_glext_function_prototype = """{apicall} {return_type}GL_APIENTRY {name}{explicit_context_suffix}({explicit_context_param}{explicit_context_comma}{params});""" >+ >+template_validation_header = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {data_source_name}. >+// >+// 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. >+// >+// validationES{annotation}_autogen.h: >+// Validation functions for the OpenGL ES {comment} entry points. >+ >+#ifndef LIBANGLE_VALIDATION_ES{annotation}_AUTOGEN_H_ >+#define LIBANGLE_VALIDATION_ES{annotation}_AUTOGEN_H_ >+ >+#include "common/PackedEnums.h" >+ >+namespace gl >+{{ >+class Context; >+ >+{prototypes} >+}} // namespace gl >+ >+#endif // LIBANGLE_VALIDATION_ES{annotation}_AUTOGEN_H_ >+""" >+ >+static_cast_to_dict = { >+ "GLintptr": "unsigned long long", >+ "GLsizeiptr": "unsigned long long", >+ "GLuint64": "unsigned long long", >+} >+ >+reinterpret_cast_to_dict = { >+ "GLsync": "uintptr_t", >+ "GLDEBUGPROC": "uintptr_t", >+ "GLDEBUGPROCKHR": "uintptr_t", >+ "GLeglImageOES": "uintptr_t", >+} >+ >+format_dict = { >+ "GLbitfield": "0x%X", >+ "GLboolean": "%u", >+ "GLclampx": "0x%X", >+ "GLenum": "0x%X", >+ "GLfixed": "0x%X", >+ "GLfloat": "%f", >+ "GLint": "%d", >+ "GLintptr": "%llu", >+ "GLshort": "%d", >+ "GLsizei": "%d", >+ "GLsizeiptr": "%llu", >+ "GLsync": "0x%016\" PRIxPTR \"", >+ "GLubyte": "%d", >+ "GLuint": "%u", >+ "GLuint64": "%llu", >+ "GLDEBUGPROC": "0x%016\" PRIxPTR \"", >+ "GLDEBUGPROCKHR": "0x%016\" PRIxPTR \"", >+ "GLeglImageOES": "0x%016\" PRIxPTR \"", >+} >+ >+template_header_includes = """#include <GLES{major}/gl{major}{minor}.h> >+#include <export.h>""" >+ >+template_sources_includes = """#include "libGLESv2/entry_points_gles_{}_autogen.h" >+ >+#include "libANGLE/Context.h" >+#include "libANGLE/Context.inl.h" >+#include "libANGLE/validationES{}{}.h" >+#include "libGLESv2/entry_points_utils.h" >+#include "libGLESv2/global_state.h" >+""" >+ >+template_event_comment = """// Don't run an EVENT() macro on the EXT_debug_marker entry points. >+ // It can interfere with the debug events being set by the caller. >+ // """ >+ >+template_validation_proto = "bool Validate%s(%s);" >+ >+template_windows_def_file = """; GENERATED FILE - DO NOT EDIT. >+; Generated by {script_name} using data from {data_source_name}. >+; >+; 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. >+LIBRARY {lib} >+EXPORTS >+{exports} >+""" >+ >+def script_relative(path): >+ return os.path.join(os.path.dirname(sys.argv[0]), path) >+ >+with open(script_relative('entry_point_packed_gl_enums.json')) as f: >+ cmd_packed_gl_enums = json.loads(f.read()) >+ >+def format_entry_point_decl(cmd_name, proto, params, is_explicit_context): >+ comma_if_needed = ", " if len(params) > 0 else "" >+ return template_entry_point_decl.format( >+ name = cmd_name[2:], >+ return_type = proto[:-len(cmd_name)], >+ params = ", ".join(params), >+ comma_if_needed = comma_if_needed, >+ explicit_context_suffix = "ContextANGLE" if is_explicit_context else "", >+ explicit_context_param = "GLeglContext ctx" if is_explicit_context else "", >+ explicit_context_comma = ", " if is_explicit_context and len(params) > 0 else "") >+ >+def type_name_sep_index(param): >+ space = param.rfind(" ") >+ pointer = param.rfind("*") >+ return max(space, pointer) >+ >+def just_the_type(param): >+ if "*" in param: >+ return param[:type_name_sep_index(param) + 1] >+ return param[:type_name_sep_index(param)] >+ >+def just_the_name(param): >+ return param[type_name_sep_index(param)+1:] >+ >+def make_param(param_type, param_name): >+ return param_type + " " + param_name >+ >+def just_the_type_packed(param, entry): >+ name = just_the_name(param) >+ if entry.has_key(name): >+ return entry[name] >+ else: >+ return just_the_type(param) >+ >+def just_the_name_packed(param, reserved_set): >+ name = just_the_name(param) >+ if name in reserved_set: >+ return name + 'Packed' >+ else: >+ return name >+ >+def param_print_argument(param): >+ name_only = just_the_name(param) >+ type_only = just_the_type(param) >+ >+ if "*" in param: >+ return "(uintptr_t)" + name_only >+ >+ if type_only in reinterpret_cast_to_dict: >+ return "(" + reinterpret_cast_to_dict[type_only] + ")" + name_only >+ >+ if type_only in static_cast_to_dict: >+ return "static_cast<" + static_cast_to_dict[type_only] + ">(" + name_only + ")" >+ >+ return name_only >+ >+def param_format_string(param): >+ if "*" in param: >+ return param + " = 0x%016\" PRIxPTR \"" >+ else: >+ type_only = just_the_type(param) >+ if type_only not in format_dict: >+ raise Exception(type_only + " is not a known type in 'format_dict'") >+ >+ return param + " = " + format_dict[type_only] >+ >+def default_return_value(cmd_name, return_type): >+ if return_type == "void": >+ return "" >+ return "GetDefaultReturnValue<EntryPoint::" + cmd_name[2:] + ", " + return_type + ">()" >+ >+def get_context_getter_function(cmd_name, is_explicit_context): >+ if is_explicit_context: >+ return "static_cast<gl::Context *>(ctx)" >+ >+ lost_context_acceptable_cmds = [ >+ "glGetError", >+ "glGetSync", >+ "glGetQueryObjecti", >+ "glGetProgramiv", >+ "glGetGraphicsResetStatus", >+ "glGetShaderiv", >+ ] >+ for context_lost_entry_pont in lost_context_acceptable_cmds: >+ if cmd_name.startswith(context_lost_entry_pont): >+ return "GetGlobalContext()" >+ return "GetValidGlobalContext()" >+ >+def format_entry_point_def(cmd_name, proto, params, is_explicit_context): >+ packed_gl_enums = cmd_packed_gl_enums.get(cmd_name, {}) >+ internal_params = [just_the_name_packed(param, packed_gl_enums) for param in params] >+ packed_gl_enum_conversions = [] >+ for param in params: >+ name = just_the_name(param) >+ if name in packed_gl_enums: >+ internal_name = name + "Packed" >+ internal_type = packed_gl_enums[name] >+ packed_gl_enum_conversions += ["\n " + internal_type + " " + internal_name +" = FromGLenum<" + >+ internal_type + ">(" + name + ");"] >+ >+ pass_params = [param_print_argument(param) for param in params] >+ format_params = [param_format_string(param) for param in params] >+ return_type = proto[:-len(cmd_name)] >+ default_return = default_return_value(cmd_name, return_type.strip()) >+ event_comment = template_event_comment if cmd_name in no_event_marker_exceptions_list else "" >+ name_lower_no_suffix = cmd_name[2:3].lower() + cmd_name[3:] >+ >+ for suffix in strip_suffixes: >+ if name_lower_no_suffix.endswith(suffix): >+ name_lower_no_suffix = name_lower_no_suffix[0:-len(suffix)] >+ >+ return template_entry_point_def.format( >+ name = cmd_name[2:], >+ name_lower_no_suffix = name_lower_no_suffix, >+ return_type = return_type, >+ params = ", ".join(params), >+ internal_params = ", ".join(internal_params), >+ packed_gl_enum_conversions = "".join(packed_gl_enum_conversions), >+ pass_params = ", ".join(pass_params), >+ comma_if_needed = ", " if len(params) > 0 else "", >+ validate_params = ", ".join(["context"] + internal_params), >+ format_params = ", ".join(format_params), >+ return_if_needed = "" if default_return == "" else "return ", >+ default_return_if_needed = "" if default_return == "" else "\n return " + default_return + ";\n", >+ context_getter = get_context_getter_function(cmd_name, is_explicit_context), >+ event_comment = event_comment, >+ explicit_context_suffix = "ContextANGLE" if is_explicit_context else "", >+ explicit_context_param = "GLeglContext ctx" if is_explicit_context else "", >+ explicit_context_comma = ", " if is_explicit_context and len(params) > 0 else "", >+ assert_explicit_context = "\nASSERT(context == GetValidGlobalContext());" >+ if is_explicit_context else "") >+ >+def get_internal_params(cmd_name, params): >+ packed_gl_enums = cmd_packed_gl_enums.get(cmd_name, {}) >+ return ", ".join([make_param(just_the_type_packed(param, packed_gl_enums), >+ just_the_name_packed(param, packed_gl_enums)) for param in params]) >+ >+def format_context_gles_decl(cmd_name, proto, params): >+ internal_params = get_internal_params(cmd_name, params) >+ >+ return_type = proto[:-len(cmd_name)] >+ name_lower_no_suffix = cmd_name[2:3].lower() + cmd_name[3:] >+ >+ for suffix in strip_suffixes: >+ if name_lower_no_suffix.endswith(suffix): >+ name_lower_no_suffix = name_lower_no_suffix[0:-len(suffix)] >+ >+ return context_gles_decl.format( >+ return_type = return_type, >+ name_lower_no_suffix = name_lower_no_suffix, >+ internal_params = internal_params) >+ >+def format_libgles_entry_point_def(cmd_name, proto, params, is_explicit_context): >+ internal_params = [just_the_name(param) for param in params] >+ return_type = proto[:-len(cmd_name)] >+ >+ return libgles_entry_point_def.format( >+ name = cmd_name[2:], >+ return_type = return_type, >+ params = ", ".join(params), >+ internal_params = ", ".join(internal_params), >+ explicit_context_suffix = "ContextANGLE" if is_explicit_context else "", >+ explicit_context_param = "GLeglContext ctx" if is_explicit_context else "", >+ explicit_context_comma = ", " if is_explicit_context and len(params) > 0 else "", >+ explicit_context_internal_param = "ctx" if is_explicit_context else "") >+ >+def format_validation_proto(cmd_name, params): >+ internal_params = get_internal_params(cmd_name, ["Context *context"] + params) >+ return template_validation_proto % (cmd_name[2:], internal_params) >+ >+def path_to(folder, file): >+ return os.path.join(script_relative(".."), "src", folder, file) >+ >+def get_entry_points(all_commands, gles_commands, is_explicit_context): >+ decls = [] >+ defs = [] >+ export_defs = [] >+ validation_protos = [] >+ >+ for command in all_commands: >+ proto = command.find('proto') >+ cmd_name = proto.find('name').text >+ >+ if cmd_name not in gles_commands: >+ continue >+ >+ param_text = ["".join(param.itertext()) for param in command.findall('param')] >+ proto_text = "".join(proto.itertext()) >+ decls.append(format_entry_point_decl(cmd_name, proto_text, param_text, >+ is_explicit_context)) >+ defs.append(format_entry_point_def(cmd_name, proto_text, param_text, is_explicit_context)) >+ >+ export_defs.append(format_libgles_entry_point_def(cmd_name, proto_text, param_text, >+ is_explicit_context)) >+ >+ validation_protos.append(format_validation_proto(cmd_name, param_text)) >+ >+ return decls, defs, export_defs, validation_protos >+ >+def get_gles1_decls(all_commands, gles_commands): >+ decls = [] >+ for command in all_commands: >+ proto = command.find('proto') >+ cmd_name = proto.find('name').text >+ >+ if cmd_name not in gles_commands: >+ continue >+ >+ if cmd_name in gles1_overloaded: >+ continue >+ >+ param_text = ["".join(param.itertext()) for param in command.findall('param')] >+ proto_text = "".join(proto.itertext()) >+ decls.append(format_context_gles_decl(cmd_name, proto_text, param_text)) >+ >+ return decls >+ >+def get_glext_decls(all_commands, gles_commands, version, is_explicit_context): >+ glext_ptrs = [] >+ glext_protos = [] >+ is_gles1 = False >+ >+ if(version == ""): >+ is_gles1 = True >+ >+ for command in all_commands: >+ proto = command.find('proto') >+ cmd_name = proto.find('name').text >+ >+ if cmd_name not in gles_commands: >+ continue >+ >+ param_text = ["".join(param.itertext()) for param in command.findall('param')] >+ proto_text = "".join(proto.itertext()) >+ >+ return_type = proto_text[:-len(cmd_name)] >+ params = ", ".join(param_text) >+ >+ format_params = { >+ "apicall": "GL_API" if is_gles1 else "GL_APICALL", >+ "name": cmd_name, >+ "name_upper": cmd_name.upper(), >+ "return_type": return_type, >+ "params": params, >+ "explicit_context_comma": ", " if is_explicit_context and len(params) > 0 else "", >+ "explicit_context_suffix": "ContextANGLE" if is_explicit_context else "", >+ "explicit_context_suffix_upper": "CONTEXTANGLE" if is_explicit_context else "", >+ "explicit_context_param": "GLeglContext ctx" if is_explicit_context else ""} >+ >+ glext_ptrs.append(template_glext_function_pointer.format( >+ **format_params)) >+ glext_protos.append(template_glext_function_prototype.format( >+ **format_params)) >+ >+ return glext_ptrs, glext_protos >+ >+def write_file(annotation, comment, template, entry_points, suffix, includes, file): >+ content = template.format( >+ script_name = os.path.basename(sys.argv[0]), >+ data_source_name = file, >+ year = date.today().year, >+ annotation_lower = annotation.lower(), >+ annotation_upper = annotation.upper(), >+ comment = comment, >+ includes = includes, >+ entry_points = entry_points) >+ >+ path = path_to("libGLESv2", "entry_points_gles_{}_autogen.{}".format( >+ annotation.lower(), suffix)) >+ >+ with open(path, "w") as out: >+ out.write(content) >+ out.close() >+ >+def write_export_files(entry_points, includes): >+ content = template_libgles_entry_point_source.format( >+ script_name = os.path.basename(sys.argv[0]), >+ data_source_name = "gl.xml and gl_angle_ext.xml", >+ year = date.today().year, >+ includes = includes, >+ entry_points = entry_points) >+ >+ path = path_to("libGLESv2", "libGLESv2_autogen.cpp") >+ >+ with open(path, "w") as out: >+ out.write(content) >+ out.close() >+ >+def write_context_api_decls(annotation, template, decls): >+ interface_lines = [] >+ >+ for i in decls['core']: >+ interface_lines.append(i) >+ >+ for extname in sorted(decls['exts'].keys()): >+ interface_lines.append(" /* " + extname + " */ \\") >+ interface_lines.extend(decls['exts'][extname]) >+ >+ content = template.format( >+ annotation_lower = annotation.lower(), >+ annotation_upper = annotation.upper(), >+ script_name = os.path.basename(sys.argv[0]), >+ data_source_name = "gl.xml", >+ year = date.today().year, >+ interface = "\n".join(interface_lines)) >+ >+ path = path_to("libANGLE", "Context_gles_%s_autogen.h" % annotation.lower()) >+ >+ with open(path, "w") as out: >+ out.write(content) >+ out.close() >+ >+def write_glext_explicit_context_inc(version, ptrs, protos): >+ folder_version = version if version != "31" else "3" >+ >+ content = template_glext_explicit_context_inc.format( >+ script_name = os.path.basename(sys.argv[0]), >+ data_source_name = "gl.xml and gl_angle_ext.xml", >+ year = date.today().year, >+ version = version, >+ function_pointers = ptrs, >+ function_prototypes = protos) >+ >+ path = os.path.join(script_relative(".."), "include", "GLES{}".format(folder_version), >+ "gl{}ext_explicit_context_autogen.inc".format(version)) >+ >+ with open(path, "w") as out: >+ out.write(content) >+ out.close() >+ >+def write_validation_header(annotation, comment, protos): >+ content = template_validation_header.format( >+ script_name = os.path.basename(sys.argv[0]), >+ data_source_name = "gl.xml and gl_angle_ext.xml", >+ year = date.today().year, >+ annotation = annotation, >+ comment = comment, >+ prototypes = "\n".join(protos)) >+ >+ path = path_to("libANGLE", "validationES%s_autogen.h" % annotation) >+ >+ with open(path, "w") as out: >+ out.write(content) >+ out.close() >+ >+def write_windows_def_file(data_source_name, lib, exports): >+ >+ content = template_windows_def_file.format( >+ script_name = os.path.basename(sys.argv[0]), >+ data_source_name = data_source_name, >+ exports = "\n".join(exports), >+ year = date.today().year, >+ lib = lib) >+ >+ path = path_to(lib, "%s_autogen.def" % lib) >+ >+ with open(path, "w") as out: >+ out.write(content) >+ out.close() >+ >+def get_exports(commands, fmt = None): >+ if fmt: >+ return [" %s" % fmt(cmd) for cmd in sorted(commands)] >+ else: >+ return [" %s" % cmd for cmd in sorted(commands)] >+ >+# Get EGL exports >+def get_egl_exports(): >+ >+ egl = registry_xml.RegistryXML('egl.xml', 'egl_angle_ext.xml') >+ exports = [] >+ >+ capser = lambda fn: "EGL_" + fn[3:] >+ >+ for major, minor in [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5]]: >+ annotation = "{}_{}".format(major, minor) >+ name_prefix = "EGL_VERSION_" >+ >+ feature_name = "{}{}".format(name_prefix, annotation) >+ >+ egl.AddCommands(feature_name, annotation) >+ >+ commands = egl.commands[annotation] >+ >+ if len(commands) == 0: >+ continue >+ >+ exports.append("\n ; EGL %d.%d" % (major, minor)) >+ exports += get_exports(commands, capser) >+ >+ egl.AddExtensionCommands(registry_xml.supported_egl_extensions, ['egl']) >+ >+ for extension_name, ext_cmd_names in sorted(egl.ext_data.iteritems()): >+ >+ if len(ext_cmd_names) == 0: >+ continue >+ >+ exports.append("\n ; %s" % extension_name) >+ exports += get_exports(ext_cmd_names, capser) >+ >+ return exports >+ >+def main(): >+ >+ # auto_script parameters. >+ if len(sys.argv) > 1: >+ inputs = [ >+ 'egl.xml', >+ 'egl_angle_ext.xml', >+ 'entry_point_packed_gl_enums.json', >+ 'gl.xml', >+ 'gl_angle_ext.xml', >+ 'registry_xml.py', >+ ] >+ outputs = [ >+ '../src/libANGLE/Context_gles_1_0_autogen.h', >+ '../src/libANGLE/validationES1_autogen.h', >+ '../src/libANGLE/validationES2_autogen.h', >+ '../src/libANGLE/validationES31_autogen.h', >+ '../src/libANGLE/validationES3_autogen.h', >+ '../src/libANGLE/validationESEXT_autogen.h', >+ '../src/libGLESv2/entry_points_enum_autogen.h', >+ '../src/libGLESv2/entry_points_gles_1_0_autogen.cpp', >+ '../src/libGLESv2/entry_points_gles_1_0_autogen.h', >+ '../src/libGLESv2/entry_points_gles_2_0_autogen.cpp', >+ '../src/libGLESv2/entry_points_gles_2_0_autogen.h', >+ '../src/libGLESv2/entry_points_gles_3_0_autogen.cpp', >+ '../src/libGLESv2/entry_points_gles_3_0_autogen.h', >+ '../src/libGLESv2/entry_points_gles_3_1_autogen.cpp', >+ '../src/libGLESv2/entry_points_gles_3_1_autogen.h', >+ '../src/libGLESv2/entry_points_gles_ext_autogen.cpp', >+ '../src/libGLESv2/entry_points_gles_ext_autogen.h', >+ '../src/libGLESv2/libGLESv2_autogen.cpp', >+ '../src/libGLESv2/libGLESv2_autogen.def', >+ ] >+ >+ if sys.argv[1] == 'inputs': >+ print ','.join(inputs) >+ elif sys.argv[1] == 'outputs': >+ print ','.join(outputs) >+ else: >+ print('Invalid script parameters') >+ return 1 >+ return 0 >+ >+ gles1decls = {} >+ >+ gles1decls['core'] = [] >+ gles1decls['exts'] = {} >+ >+ libgles_ep_defs = [] >+ libgles_ep_exports = [] >+ >+ xml = registry_xml.RegistryXML('gl.xml', 'gl_angle_ext.xml') >+ >+ # First run through the main GLES entry points. Since ES2+ is the primary use >+ # case, we go through those first and then add ES1-only APIs at the end. >+ for major_version, minor_version in [[2, 0], [3, 0], [3, 1], [1, 0]]: >+ annotation = "{}_{}".format(major_version, minor_version) >+ name_prefix = "GL_ES_VERSION_" >+ >+ is_gles1 = major_version == 1 >+ if is_gles1: >+ name_prefix = "GL_VERSION_ES_CM_" >+ >+ comment = annotation.replace("_", ".") >+ feature_name = "{}{}".format(name_prefix, annotation) >+ >+ xml.AddCommands(feature_name, annotation) >+ >+ gles_commands = xml.commands[annotation] >+ all_commands = xml.all_commands >+ >+ decls, defs, libgles_defs, validation_protos = get_entry_points( >+ all_commands, gles_commands, False) >+ >+ # Write the version as a comment before the first EP. >+ libgles_defs.insert(0, "\n// OpenGL ES %s" % comment) >+ libgles_ep_exports.append("\n ; OpenGL ES %s" % comment) >+ >+ libgles_ep_defs += libgles_defs >+ libgles_ep_exports += get_exports(gles_commands) >+ >+ major_if_not_one = major_version if major_version != 1 else "" >+ minor_if_not_zero = minor_version if minor_version != 0 else "" >+ >+ header_includes = template_header_includes.format( >+ major=major_if_not_one, minor=minor_if_not_zero) >+ >+ # We include the platform.h header since it undefines the conflicting MemoryBarrier macro. >+ if major_version == 3 and minor_version == 1: >+ header_includes += "\n#include \"common/platform.h\"\n" >+ >+ source_includes = template_sources_includes.format( >+ annotation.lower(), major_version, minor_if_not_zero) >+ >+ write_file(annotation, comment, template_entry_point_header, >+ "\n".join(decls), "h", header_includes, "gl.xml") >+ write_file(annotation, comment, template_entry_point_source, >+ "\n".join(defs), "cpp", source_includes, "gl.xml") >+ if is_gles1: >+ gles1decls['core'] = get_gles1_decls(all_commands, gles_commands) >+ >+ validation_annotation = "%s%s" % (major_version, minor_if_not_zero) >+ write_validation_header(validation_annotation, comment, validation_protos) >+ >+ >+ # After we finish with the main entry points, we process the extensions. >+ extension_defs = [] >+ extension_decls = [] >+ >+ # Accumulated validation prototypes. >+ ext_validation_protos = [] >+ >+ for gles1ext in registry_xml.gles1_extensions: >+ gles1decls['exts'][gles1ext] = [] >+ >+ xml.AddExtensionCommands(registry_xml.supported_extensions, ['gles2', 'gles1']) >+ >+ for extension_name, ext_cmd_names in sorted(xml.ext_data.iteritems()): >+ >+ # Detect and filter duplicate extensions. >+ decls, defs, libgles_defs, validation_protos = get_entry_points( >+ xml.all_commands, ext_cmd_names, False) >+ >+ # Avoid writing out entry points defined by a prior extension. >+ for dupe in xml.ext_dupes[extension_name]: >+ msg = "// {} is already defined.\n".format(dupe[2:]) >+ defs.append(msg) >+ >+ # Write the extension name as a comment before the first EP. >+ comment = "\n// {}".format(extension_name) >+ defs.insert(0, comment) >+ decls.insert(0, comment) >+ libgles_defs.insert(0, comment) >+ libgles_ep_exports.append("\n ; %s" % extension_name) >+ >+ extension_defs += defs >+ extension_decls += decls >+ >+ ext_validation_protos += [comment] + validation_protos >+ >+ libgles_ep_defs += libgles_defs >+ libgles_ep_exports += get_exports(ext_cmd_names) >+ >+ if extension_name in registry_xml.gles1_extensions: >+ if extension_name not in gles1_no_context_decl_extensions: >+ gles1decls['exts'][extension_name] = get_gles1_decls(all_commands, ext_cmd_names) >+ >+ # Special handling for EGL_ANGLE_explicit_context extension >+ if registry_xml.support_EGL_ANGLE_explicit_context: >+ comment = "\n// EGL_ANGLE_explicit_context" >+ extension_defs.append(comment) >+ extension_decls.append(comment) >+ libgles_ep_defs.append(comment) >+ >+ cmds = xml.all_cmd_names.get_all_commands() >+ >+ # Get the explicit context entry points >+ decls, defs, libgles_defs, validation_protos = get_entry_points( >+ xml.all_commands, cmds, True) >+ >+ # Append the explicit context entry points >+ extension_decls += decls >+ extension_defs += defs >+ libgles_ep_defs += libgles_defs >+ >+ libgles_ep_exports.append("\n ; EGL_ANGLE_explicit_context") >+ libgles_ep_exports += get_exports(cmds, lambda x: "%sContextANGLE" % x) >+ >+ # Generate .inc files for extension function pointers and declarations >+ for major, minor in [[2, 0], [3, 0], [3, 1], [1, 0]]: >+ annotation = "{}_{}".format(major, minor) >+ >+ major_if_not_one = major if major != 1 else "" >+ minor_if_not_zero = minor if minor != 0 else "" >+ version = "{}{}".format(major_if_not_one, minor_if_not_zero) >+ >+ glext_ptrs, glext_protos = get_glext_decls(all_commands, >+ xml.all_cmd_names.get_commands(annotation), version, True) >+ >+ glext_ext_ptrs = [] >+ glext_ext_protos = [] >+ >+ # Append extensions for 1.0 and 2.0 >+ if(annotation == "1_0"): >+ glext_ext_ptrs, glext_ext_protos = get_glext_decls(all_commands, >+ xml.all_cmd_names.get_commands("glext"), version, True) >+ elif(annotation == "2_0"): >+ glext_ext_ptrs, glext_ext_protos = get_glext_decls(all_commands, >+ xml.all_cmd_names.get_commands("gl2ext"), version, True) >+ >+ glext_ptrs += glext_ext_ptrs >+ glext_protos += glext_ext_protos >+ >+ write_glext_explicit_context_inc(version, "\n".join(glext_ptrs), "\n".join(glext_protos)) >+ >+ >+ header_includes = template_header_includes.format( >+ major="", minor="") >+ header_includes += """ >+ #include <GLES/glext.h> >+ #include <GLES2/gl2.h> >+ #include <GLES2/gl2ext.h> >+ """ >+ >+ source_includes = template_sources_includes.format("ext", "EXT", "") >+ source_includes += """ >+ #include "libANGLE/validationES1.h" >+ #include "libANGLE/validationES2.h" >+ #include "libANGLE/validationES3.h" >+ #include "libANGLE/validationES31.h" >+ """ >+ >+ write_file("ext", "extension", template_entry_point_header, >+ "\n".join([item for item in extension_decls]), "h", header_includes, >+ "gl.xml and gl_angle_ext.xml") >+ write_file("ext", "extension", template_entry_point_source, >+ "\n".join([item for item in extension_defs]), "cpp", source_includes, >+ "gl.xml and gl_angle_ext.xml") >+ >+ write_validation_header("EXT", "extension", ext_validation_protos) >+ >+ write_context_api_decls("1_0", context_gles_header, gles1decls) >+ >+ sorted_cmd_names = ["Invalid"] + [cmd[2:] for cmd in sorted(xml.all_cmd_names.get_all_commands())] >+ >+ entry_points_enum = template_entry_points_enum_header.format( >+ script_name = os.path.basename(sys.argv[0]), >+ data_source_name = "gl.xml and gl_angle_ext.xml", >+ year = date.today().year, >+ entry_points_list = ",\n".join([" " + cmd for cmd in sorted_cmd_names])) >+ >+ entry_points_enum_header_path = path_to("libGLESv2", "entry_points_enum_autogen.h") >+ with open(entry_points_enum_header_path, "w") as out: >+ out.write(entry_points_enum) >+ out.close() >+ >+ source_includes = """ >+ #include "angle_gl.h" >+ >+ #include "libGLESv2/entry_points_gles_1_0_autogen.h" >+ #include "libGLESv2/entry_points_gles_2_0_autogen.h" >+ #include "libGLESv2/entry_points_gles_3_0_autogen.h" >+ #include "libGLESv2/entry_points_gles_3_1_autogen.h" >+ #include "libGLESv2/entry_points_gles_ext_autogen.h" >+ >+ #include "common/event_tracer.h" >+ """ >+ >+ write_export_files("\n".join([item for item in libgles_ep_defs]), source_includes) >+ >+ libgles_ep_exports += get_egl_exports() >+ >+ everything = "Khronos and ANGLE XML files" >+ write_windows_def_file(everything, "libGLESv2", libgles_ep_exports) >+ >+if __name__ == '__main__': >+ sys.exit(main()) >diff --git a/Source/ThirdParty/ANGLE/scripts/generate_loader.py b/Source/ThirdParty/ANGLE/scripts/generate_loader.py >new file mode 100644 >index 00000000000..a408dac4e63 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/generate_loader.py >@@ -0,0 +1,279 @@ >+#!/usr/bin/python2 >+# >+# 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_loader.py: >+# Generates dynamic loaders for various binding interfaces. >+# NOTE: don't run this script directly. Run scripts/run_code_generation.py. >+ >+import sys, os, pprint, json >+from datetime import date >+import registry_xml >+ >+def write_header(data_source_name, all_cmds, api, preamble, path, lib, ns = "", prefix = None, export = ""): >+ file_name = "%s_loader_autogen.h" % api >+ header_path = registry_xml.path_to(path, file_name) >+ def pre(cmd): >+ if prefix == None: >+ return cmd >+ return prefix + cmd[len(api):] >+ with open(header_path, "w") as out: >+ var_protos = ["%sextern PFN%sPROC %s%s;" % (export, cmd.upper(), ns, pre(cmd)) for cmd in all_cmds] >+ loader_header = template_loader_h.format( >+ script_name = os.path.basename(sys.argv[0]), >+ data_source_name = data_source_name, >+ year = date.today().year, >+ function_pointers = "\n".join(var_protos), >+ api_upper = api.upper(), >+ api_lower = api, >+ preamble = preamble, >+ export = export, >+ lib = lib.upper()) >+ >+ out.write(loader_header) >+ out.close() >+ >+def write_source(data_source_name, all_cmds, api, path, ns = "", prefix = None, export = ""): >+ file_name = "%s_loader_autogen.cpp" % api >+ source_path = registry_xml.path_to(path, file_name) >+ def pre(cmd): >+ if prefix == None: >+ return cmd >+ return prefix + cmd[len(api):] >+ >+ with open(source_path, "w") as out: >+ var_defs = ["%sPFN%sPROC %s%s;" % (export, cmd.upper(), ns, pre(cmd)) for cmd in all_cmds] >+ >+ setter = " %s%s = reinterpret_cast<PFN%sPROC>(loadProc(\"%s\"));" >+ setters = [setter % (ns, pre(cmd), cmd.upper(), pre(cmd)) for cmd in all_cmds] >+ >+ loader_source = template_loader_cpp.format( >+ script_name = os.path.basename(sys.argv[0]), >+ data_source_name = data_source_name, >+ year = date.today().year, >+ function_pointers = "\n".join(var_defs), >+ set_pointers = "\n".join(setters), >+ api_upper = api.upper(), >+ api_lower = api) >+ >+ out.write(loader_source) >+ out.close() >+ >+def gen_libegl_loader(): >+ >+ data_source_name = "egl.xml and egl_angle_ext.xml" >+ xml = registry_xml.RegistryXML("egl.xml", "egl_angle_ext.xml") >+ >+ for major_version, minor_version in [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5]]: >+ annotation = "{}_{}".format(major_version, minor_version) >+ name_prefix = "EGL_VERSION_" >+ >+ feature_name = "{}{}".format(name_prefix, annotation) >+ >+ xml.AddCommands(feature_name, annotation) >+ >+ xml.AddExtensionCommands(registry_xml.supported_egl_extensions, ['egl']) >+ >+ all_cmds = xml.all_cmd_names.get_all_commands() >+ >+ path = os.path.join("..", "src", "libEGL") >+ write_header(data_source_name, all_cmds, "egl", libegl_preamble, path, "LIBEGL", "", "EGL_") >+ write_source(data_source_name, all_cmds, "egl", path, "", "EGL_") >+ >+def gen_gl_loader(): >+ >+ data_source_name = "gl.xml and gl_angle_ext.xml" >+ xml = registry_xml.RegistryXML("gl.xml", "gl_angle_ext.xml") >+ >+ # First run through the main GLES entry points. Since ES2+ is the primary use >+ # case, we go through those first and then add ES1-only APIs at the end. >+ for major_version, minor_version in [[2, 0], [3, 0], [3, 1], [1, 0]]: >+ annotation = "{}_{}".format(major_version, minor_version) >+ name_prefix = "GL_ES_VERSION_" >+ >+ is_gles1 = major_version == 1 >+ if is_gles1: >+ name_prefix = "GL_VERSION_ES_CM_" >+ >+ feature_name = "{}{}".format(name_prefix, annotation) >+ >+ xml.AddCommands(feature_name, annotation) >+ >+ xml.AddExtensionCommands(registry_xml.supported_extensions, ['gles2', 'gles1']) >+ >+ all_cmds = xml.all_cmd_names.get_all_commands() >+ >+ if registry_xml.support_EGL_ANGLE_explicit_context: >+ all_cmds += [cmd + "ContextANGLE" for cmd in xml.all_cmd_names.get_all_commands()] >+ >+ path = os.path.join("..", "util") >+ ex = "ANGLE_UTIL_EXPORT " >+ write_header(data_source_name, all_cmds, "gles", util_gles_preamble, path, "UTIL", export=ex) >+ write_source(data_source_name, all_cmds, "gles", path, export=ex) >+ >+def gen_egl_loader(): >+ >+ data_source_name = "egl.xml and egl_angle_ext.xml" >+ xml = registry_xml.RegistryXML("egl.xml", "egl_angle_ext.xml") >+ >+ for major_version, minor_version in [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5]]: >+ annotation = "{}_{}".format(major_version, minor_version) >+ name_prefix = "EGL_VERSION_" >+ >+ feature_name = "{}{}".format(name_prefix, annotation) >+ >+ xml.AddCommands(feature_name, annotation) >+ >+ xml.AddExtensionCommands(registry_xml.supported_egl_extensions, ['egl']) >+ >+ all_cmds = xml.all_cmd_names.get_all_commands() >+ >+ path = os.path.join("..", "util") >+ ex = "ANGLE_UTIL_EXPORT " >+ write_header(data_source_name, all_cmds, "egl", util_egl_preamble, path, "UTIL", export=ex) >+ write_source(data_source_name, all_cmds, "egl", path, export=ex) >+ >+def gen_wgl_loader(): >+ >+ supported_wgl_extensions = [ >+ "WGL_ARB_create_context", >+ "WGL_ARB_extensions_string", >+ "WGL_EXT_swap_control", >+ ] >+ >+ source = "wgl.xml" >+ xml = registry_xml.RegistryXML(source) >+ >+ for major_version, minor_version in [[1, 0]]: >+ annotation = "{}_{}".format(major_version, minor_version) >+ name_prefix = "WGL_VERSION_" >+ >+ feature_name = "{}{}".format(name_prefix, annotation) >+ >+ xml.AddCommands(feature_name, annotation) >+ >+ xml.AddExtensionCommands(supported_wgl_extensions, ['wgl']) >+ >+ all_cmds = xml.all_cmd_names.get_all_commands() >+ >+ path = os.path.join("..", "util", "windows") >+ write_header(source, all_cmds, "wgl", util_wgl_preamble, path, "UTIL_WINDOWS", "_") >+ write_source(source, all_cmds, "wgl", path, "_") >+ >+def main(): >+ >+ # Handle inputs/outputs for run_code_generation.py's auto_script >+ if len(sys.argv) > 1: >+ inputs = [ >+ 'egl.xml', >+ 'egl_angle_ext.xml', >+ 'registry_xml.py', >+ 'wgl.xml', >+ ] >+ outputs = [ >+ '../src/libEGL/egl_loader_autogen.cpp', >+ '../src/libEGL/egl_loader_autogen.h', >+ '../util/egl_loader_autogen.cpp', >+ '../util/egl_loader_autogen.h', >+ '../util/gles_loader_autogen.cpp', >+ '../util/gles_loader_autogen.h', >+ '../util/windows/wgl_loader_autogen.cpp', >+ '../util/windows/wgl_loader_autogen.h', >+ ] >+ >+ if sys.argv[1] == 'inputs': >+ print ','.join(inputs) >+ elif sys.argv[1] == 'outputs': >+ print ','.join(outputs) >+ else: >+ print('Invalid script parameters') >+ return 1 >+ return 0 >+ >+ gen_libegl_loader() >+ gen_gl_loader() >+ gen_egl_loader() >+ gen_wgl_loader() >+ return 0 >+ >+ >+libegl_preamble = """#include <EGL/egl.h> >+#include <EGL/eglext.h> >+""" >+ >+util_gles_preamble = """#if defined(GL_GLES_PROTOTYPES) && GL_GLES_PROTOTYPES >+#error "Don't define GL prototypes if you want to use a loader!" >+#endif // defined(GL_GLES_PROTOTYPES) >+ >+#include "angle_gl.h" >+#include "util/util_export.h" >+""" >+ >+util_egl_preamble = """#include "util/util_export.h" >+ >+#include <EGL/egl.h> >+#include <EGL/eglext.h> >+""" >+ >+util_wgl_preamble = """ >+#include <WGL/wgl.h> >+#include <GLES2/gl2.h> >+ >+// We add an underscore before each function name to ensure common names like "ChoosePixelFormat" >+// and "SwapBuffers" don't conflict with our function pointers. We can't use a namespace because >+// some functions conflict with preprocessor definitions. >+""" >+ >+template_loader_h = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {data_source_name}. >+// >+// 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. >+// >+// {api_lower}_loader_autogen.h: >+// Simple {api_upper} function loader. >+ >+#ifndef {lib}_{api_upper}_LOADER_AUTOGEN_H_ >+#define {lib}_{api_upper}_LOADER_AUTOGEN_H_ >+ >+{preamble} >+{function_pointers} >+ >+namespace angle >+{{ >+using GenericProc = void (*)(); >+using LoadProc = GenericProc (KHRONOS_APIENTRY *)(const char *); >+{export}void Load{api_upper}(LoadProc loadProc); >+}} // namespace angle >+ >+#endif // {lib}_{api_upper}_LOADER_AUTOGEN_H_ >+""" >+ >+template_loader_cpp = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {data_source_name}. >+// >+// 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. >+// >+// {api_lower}_loader_autogen.cpp: >+// Simple {api_upper} function loader. >+ >+#include "{api_lower}_loader_autogen.h" >+ >+{function_pointers} >+ >+namespace angle >+{{ >+void Load{api_upper}(LoadProc loadProc) >+{{ >+{set_pointers} >+}} >+}} // namespace angle >+""" >+ >+if __name__ == '__main__': >+ sys.exit(main()) >diff --git a/Source/ThirdParty/ANGLE/scripts/generate_new_renderer.py b/Source/ThirdParty/ANGLE/scripts/generate_new_renderer.py >new file mode 100644 >index 00000000000..73e5671f043 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/generate_new_renderer.py >@@ -0,0 +1,281 @@ >+#!/usr/bin/python2 >+# >+# Copyright (c) 2015 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_new_renderer.py: >+# Utility script to generate stubs for a new Renderer class. >+# Usage: generate_new_renderer.py <renderer name> <renderer suffix> >+# Renderer name is the folder for the renderer subdirectory >+# Renderer suffix is the abbreviation to append after the class names. >+# >+# The script is fairly robust but may not work for all new methods or >+# other unexpected features. It expects that abstract methods are all >+# grouped after the public destructor or after the private >+# DISALLOW_COPY_AND_ASSIGN macro. >+ >+import os, sys, re, string, datetime >+ >+if len(sys.argv) < 3: >+ print('Usage: ' + sys.argv[0] + ' <renderer dir name> <renderer class suffix>') >+ sys.exit(1) >+ >+renderer_name = sys.argv[1] >+renderer_suffix = sys.argv[2] >+ >+# change to the renderer directory >+os.chdir(os.path.join(os.path.dirname(sys.argv[0]), "..", "src", "libANGLE", "renderer")) >+ >+# ensure subdir exists >+if not os.path.isdir(renderer_name): >+ os.mkdir(renderer_name) >+ >+impl_classes = [ >+ 'Buffer', >+ 'Compiler', >+ 'Context', >+ 'Device', >+ 'Display', >+ 'FenceNV', >+ 'FenceSync', >+ 'Framebuffer', >+ 'Image', >+ 'Path', >+ 'Program', >+ 'Query', >+ 'Renderbuffer', >+ 'Sampler', >+ 'Shader', >+ 'Surface', >+ 'Texture', >+ 'TransformFeedback', >+ 'VertexArray', >+] >+ >+h_file_template = """// >+// Copyright 2016 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. >+// >+// $TypedImpl.h: >+// Defines the class interface for $TypedImpl, implementing $BaseImpl. >+// >+ >+#ifndef LIBANGLE_RENDERER_${RendererNameCaps}_${TypedImplCaps}_H_ >+#define LIBANGLE_RENDERER_${RendererNameCaps}_${TypedImplCaps}_H_ >+ >+#include "libANGLE/renderer/$BaseImpl.h" >+ >+namespace rx >+{ >+ >+class $TypedImpl : public $BaseImpl >+{ >+ public: >+ $TypedImpl($ConstructorParams); >+ ~$TypedImpl() override; >+$ImplMethodDeclarations$PrivateImplMethodDeclarations}; >+ >+} // namespace rx >+ >+#endif // LIBANGLE_RENDERER_${RendererNameCaps}_${TypedImplCaps}_H_ >+""" >+ >+cpp_file_template = """// >+// 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. >+// >+// $TypedImpl.cpp: >+// Implements the class methods for $TypedImpl. >+// >+ >+#include "libANGLE/renderer/$RendererName/$TypedImpl.h" >+ >+#include "common/debug.h" >+ >+namespace rx >+{ >+ >+$TypedImpl::$TypedImpl($ConstructorParams) : $BaseImpl($BaseContructorArgs) >+{ >+} >+ >+$TypedImpl::~$TypedImpl() >+{ >+} >+$ImplMethodDefinitions >+} // namespace rx >+""" >+ >+def generate_impl_declaration(impl_stub): >+ # ensure the wrapped lines are aligned vertically >+ temp = re.sub(r'\n ', '\n', impl_stub) >+ return temp + ' override;\n' >+ >+def generate_impl_definition(impl_stub, typed_impl): >+ function_signature = impl_stub.strip() >+ >+ # strip comments >+ function_signature = re.sub(r'\/\/[^\n]*\n', '', function_signature).strip() >+ >+ prog = re.compile(r'^(.+[ \*\&])([^ \(\*\&]+\()') >+ return_value = prog.match(function_signature).group(1) >+ >+ # ensure the wrapped lines are aligned vertically >+ spaces = ' ' * len(typed_impl) >+ function_signature = re.sub(r'\n ', '\n' + spaces, function_signature) >+ >+ # add class scoping >+ function_signature = prog.sub(r'\1' + typed_impl + r'::\2', function_signature) >+ function_signature += '\n' >+ >+ return_statement = '' >+ return_type = return_value.strip() >+ >+ if return_type != 'void': >+ # specialized return values for Errors, pointers, etc >+ if return_type == 'gl::Error': >+ return_statement = ' return gl::InvalidOperation();\n' >+ elif return_type == 'egl::Error': >+ return_statement = ' return egl::EglBadAccess();\n' >+ elif return_type == 'LinkResult': >+ return_statement = ' return gl::InvalidOperation();\n' >+ elif re.search(r'\*$', return_type): >+ return_statement = ' return static_cast<' + return_type + '>(0);\n' >+ elif re.search(r'const ([^ \&]+) \&$', return_type): >+ obj_type = re.search(r'const ([^ \&]+) \&$', return_type).group(1) >+ return_statement = ' static ' + obj_type + ' local;\n' + ' return local;\n' >+ else: >+ return_statement = ' return ' + return_type + '();\n' >+ >+ body = '{\n' + ' UNIMPLEMENTED();\n' + return_statement +'}\n' >+ >+ return '\n' + function_signature + body >+ >+def get_constructor_args(constructor): >+ params = re.search(r'\((.*)\)', constructor).group(1) >+ args = ', '.join(re.findall(r'[^\w]?(\w+)(?:\,|$)', params)) >+ return params, args >+ >+def parse_impl_header(base_impl): >+ impl_h_file_path = base_impl + '.h' >+ impl_h_file = open(impl_h_file_path, 'r') >+ >+ # extract impl stubs >+ copy = False >+ copy_private = False >+ impl_stubs = '' >+ private_impl_stubs = '' >+ constructor = base_impl + '() {}' >+ for line in impl_h_file: >+ clean_line = line.strip() >+ >+ match = re.search(r'^(?:explicit )?(' + base_impl + r'\([^\)]*\))', clean_line); >+ if match: >+ constructor = match.group(1) >+ >+ # begin capture when reading the destructor. >+ # begin capture also in the private scope (a few special cases) >+ # end capture when we reach a non-virtual function, or different scope. >+ if '~' + base_impl in clean_line: >+ copy = True >+ copy_private = False >+ elif 'private:' in clean_line: >+ copy = False >+ copy_private = True >+ elif ';' in clean_line and ' = 0' not in clean_line: >+ copy = False >+ copy_private = False >+ elif '}' in clean_line or 'protected:' in clean_line or 'private:' in clean_line: >+ copy = False >+ copy_private = False >+ elif copy: >+ impl_stubs += line >+ elif copy_private: >+ private_impl_stubs += line >+ >+ impl_h_file.close() >+ >+ return impl_stubs, private_impl_stubs, constructor >+ >+def get_base_class(base_impl): >+ impl_h_file_path = base_impl + '.h' >+ with open(impl_h_file_path, 'r') as impl_h_file: >+ for line in impl_h_file: >+ match = re.search(r'^class ' + base_impl + r' : public (\w+)', line) >+ if match: >+ return match.group(1) >+ return False >+ >+for impl_class in impl_classes: >+ >+ base_impl = impl_class + 'Impl' >+ typed_impl = impl_class + renderer_suffix >+ >+ h_file_path = os.path.join(renderer_name, typed_impl + '.h') >+ cpp_file_path = os.path.join(renderer_name, typed_impl + '.cpp') >+ >+ h_file = open(h_file_path, 'w') >+ cpp_file = open(cpp_file_path, 'w') >+ >+ # extract impl stubs >+ impl_stubs, private_impl_stubs, constructor = parse_impl_header(base_impl) >+ >+ # Handle base classes, skipping angle::NonCopyable. >+ base_class = get_base_class(base_impl) >+ if base_class and base_class != 'angle': >+ base_impl_stubs, base_private_impl_stubs, base_constructor = parse_impl_header(base_class) >+ impl_stubs += base_impl_stubs >+ private_impl_stubs += base_private_impl_stubs >+ >+ impl_method_declarations = '' >+ impl_method_definitions = '' >+ private_impl_method_declarations = '' >+ >+ for impl_stub in impl_stubs.split(' = 0;\n'): >+ # use 'virtual' to identify the strings with functions >+ if 'virtual' in impl_stub: >+ temp = re.sub(r'virtual ', '', impl_stub) >+ impl_method_declarations += generate_impl_declaration(temp) >+ impl_method_definitions += generate_impl_definition(temp, typed_impl) >+ >+ for impl_stub in private_impl_stubs.split(' = 0;\n'): >+ # use 'virtual' to identify the strings with functions >+ if 'virtual' in impl_stub: >+ temp = re.sub(r'virtual ', '', impl_stub) >+ private_impl_method_declarations += generate_impl_declaration(temp) >+ impl_method_definitions += generate_impl_definition(temp, typed_impl) >+ >+ constructor_params, base_constructor_args = get_constructor_args(constructor) >+ >+ if private_impl_method_declarations: >+ private_impl_method_declarations = "\n private:\n" + private_impl_method_declarations >+ >+ substitutions = { >+ 'BaseImpl': base_impl, >+ 'TypedImpl': typed_impl, >+ 'TypedImplCaps': typed_impl.upper(), >+ 'RendererName': renderer_name, >+ 'RendererNameCaps': renderer_name.upper(), >+ 'ImplMethodDeclarations': impl_method_declarations, >+ 'ImplMethodDefinitions': impl_method_definitions, >+ 'ConstructorParams': constructor_params, >+ 'BaseContructorArgs': base_constructor_args, >+ 'PrivateImplMethodDeclarations': private_impl_method_declarations, >+ 'Year': datetime.datetime.now().year, >+ } >+ >+ h_file.write(string.Template(h_file_template).substitute(substitutions)) >+ cpp_file.write(string.Template(cpp_file_template).substitute(substitutions)) >+ >+ h_file.close() >+ cpp_file.close() >+ >+# Print a block of source files to add to the build >+print("Generated files:") >+for impl_class in impl_classes: >+ path = "libANGLE/renderer/" + renderer_name + "/" + impl_class + renderer_suffix >+ print('\'' + path + ".cpp\',") >+ print('\'' + path + ".h\',") >diff --git a/Source/ThirdParty/ANGLE/scripts/generate_stats.py b/Source/ThirdParty/ANGLE/scripts/generate_stats.py >new file mode 100644 >index 00000000000..25dc5629af6 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/generate_stats.py >@@ -0,0 +1,607 @@ >+#!/usr/bin/python >+# >+# 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. >+# >+# generate_deqp_stats.py: >+# Checks output of deqp testers and generates stats using the GDocs API >+# >+# prerequirements: >+# https://devsite.googleplex.com/sheets/api/quickstart/python >+# Follow the quickstart guide. >+# >+# usage: generate_deqp_stats.py [-h] [--auth_path [AUTH_PATH]] [--spreadsheet [SPREADSHEET]] >+# [--verbosity [VERBOSITY]] >+# >+# optional arguments: >+# -h, --help show this help message and exit >+# --auth_path [AUTH_PATH] >+# path to directory containing authorization data (credentials.json and >+# token.pickle). [default=<home>/.auth] >+# --spreadsheet [SPREADSHEET] >+# ID of the spreadsheet to write stats to. [default >+# ='1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw'] >+# --verbosity [VERBOSITY] >+# Verbosity of output. Valid options are [DEBUG, INFO, WARNING, ERROR]. >+# [default=INFO] >+ >+import argparse >+import datetime >+import logging >+import os >+import pickle >+import re >+import subprocess >+import sys >+import urllib >+try: >+ from google.auth.transport.requests import Request >+ from googleapiclient.discovery import build >+ from google_auth_oauthlib.flow import InstalledAppFlow >+except ImportError: >+ print('ERROR: Missing prerequisites. Follow the quickstart guide:\n' >+ 'https://devsite.googleplex.com/sheets/api/quickstart/python') >+ exit(1) >+ >+#################### >+# Global Constants # >+#################### >+ >+HOME_DIR = os.path.expanduser('~') >+SCRIPT_DIR = sys.path[0] >+ROOT_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, '..')) >+ >+LOGGER = logging.getLogger('generate_stats') >+ >+SCOPES = ['https://www.googleapis.com/auth/spreadsheets'] >+ >+BOT_NAMES = [ >+ 'Win10 FYI dEQP Release (NVIDIA)', >+ 'Win10 FYI dEQP Release (Intel HD 630)', >+ 'Win7 FYI dEQP Release (AMD)', >+ 'Win7 FYI x64 dEQP Release (NVIDIA)', >+ 'Mac FYI dEQP Release Intel', >+ 'Mac FYI dEQP Release AMD', >+ 'Linux FYI dEQP Release (Intel HD 630)', >+ 'Linux FYI dEQP Release (NVIDIA)', >+ 'Android FYI dEQP Release (Nexus 5X)', >+ 'Android FYI 32 dEQP Vk Release (Pixel XL)', >+ 'Android FYI 64 dEQP Vk Release (Pixel XL)', >+ 'Android FYI 32 dEQP Vk Release (Pixel 2)', >+ 'Android FYI 64 dEQP Vk Release (Pixel 2)', >+] >+BOT_NAME_PREFIX = 'chromium/ci/' >+BUILD_LINK_PREFIX = 'https://ci.chromium.org/p/chromium/builders/ci/' >+ >+REQUIRED_COLUMNS = ['build_link', 'time', 'date', 'revision', 'angle_revision'] >+ >+INFO_TAG = '*RESULT' >+ >+###################### >+# Build Info Parsing # >+###################### >+ >+ >+# Returns a struct with info about the latest successful build given a bot name. Info contains the >+# build_name, time, date, angle_revision, and chrome revision. >+# Uses: bb ls '<botname>' -n 1 -status success -A >+def get_latest_success_build_info(bot_name): >+ bb = subprocess.Popen(['bb', 'ls', bot_name, '-n', '1', '-status', 'success', '-A'], >+ stdout=subprocess.PIPE, >+ stderr=subprocess.PIPE) >+ LOGGER.debug("Ran [bb ls '" + bot_name + "' -n 1 -status success -A]") >+ out, err = bb.communicate() >+ if err: >+ raise ValueError("Unexpected error from bb ls: '" + err + "'") >+ if not out: >+ raise ValueError("Unexpected empty result from bb ls of bot '" + bot_name + "'") >+ # Example output (line 1): >+ # ci.chromium.org/b/8915280275579996928 SUCCESS 'chromium/ci/Win10 FYI dEQP Release (NVIDIA)/26877' >+ # ... >+ if 'SUCCESS' not in out: >+ raise ValueError("Unexpected result from bb ls: '" + out + "'") >+ info = {} >+ for line in out.splitlines(): >+ # The first line holds the build name >+ if 'build_name' not in info: >+ info['build_name'] = line.strip().split("'")[1] >+ # Remove the bot name and prepend the build link >+ info['build_link'] = BUILD_LINK_PREFIX + urllib.quote( >+ info['build_name'].split(BOT_NAME_PREFIX)[1]) >+ if 'Created' in line: >+ # Example output of line with 'Created': >+ # ... >+ # Created today at 12:26:39, waited 2.056319s, started at 12:26:41, ran for 1h16m48.14963s, ended at 13:43:30 >+ # ... >+ info['time'] = re.findall(r'[0-9]{1,2}:[0-9]{2}:[0-9]{2}', line.split(',', 1)[0])[0] >+ # Format today's date in US format so Sheets can read it properly >+ info['date'] = datetime.datetime.now().strftime('%m/%d/%y') >+ if 'got_angle_revision' in line: >+ # Example output of line with angle revision: >+ # ... >+ # "parent_got_angle_revision": "8cbd321cafa92ffbf0495e6d0aeb9e1a97940fee", >+ # ... >+ info['angle_revision'] = filter(str.isalnum, line.split(':')[1]) >+ if '"revision"' in line: >+ # Example output of line with chromium revision: >+ # ... >+ # "revision": "3b68405a27f1f9590f83ae07757589dba862f141", >+ # ... >+ info['revision'] = filter(str.isalnum, line.split(':')[1]) >+ if 'build_name' not in info: >+ raise ValueError("Could not find build_name from bot '" + bot_name + "'") >+ return info >+ >+ >+# Returns a list of step names that we're interested in given a build name. We are interested in >+# step names starting with 'angle_'. May raise an exception. >+# Uses: bb get '<build_name>' -steps >+def get_step_names(build_name): >+ bb = subprocess.Popen(['bb', 'get', build_name, '-steps'], >+ stdout=subprocess.PIPE, >+ stderr=subprocess.PIPE) >+ LOGGER.debug("Ran [bb get '" + build_name + "' -steps]") >+ out, err = bb.communicate() >+ if err: >+ raise ValueError("Unexpected error from bb get: '" + err + "'") >+ step_names = [] >+ # Example output (relevant lines to a single step): >+ # ... >+ # Step "angle_deqp_egl_vulkan_tests on (nvidia-quadro-p400-win10-stable) GPU on Windows on Windows-10" SUCCESS 4m12s Logs: "stdout", "chromium_swarming.summary", "Merge script log", "Flaky failure: dEQP.EGL/info_version (status CRASH,SUCCESS)", "step_metadata" >+ # Run on OS: 'Windows-10'<br>Max shard duration: 0:04:07.309848 (shard \#1)<br>Min shard duration: 0:02:26.402128 (shard \#0)<br/>flaky failures [ignored]:<br/>dEQP.EGL/info\_version<br/> >+ # * [shard #0 isolated out](https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=9a5999a59d332e55f54f495948d0c9f959e60ed2) >+ # * [shard #0 (128.3 sec)](https://chromium-swarm.appspot.com/user/task/446903ae365b8110) >+ # * [shard #1 isolated out](https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=d71e1bdd91dee61b536b4057a9222e642bd3809f) >+ # * [shard #1 (229.3 sec)](https://chromium-swarm.appspot.com/user/task/446903b7b0d90210) >+ # * [shard #2 isolated out](https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=ac9ba85b1cca77774061b87335c077980e1eef85) >+ # * [shard #2 (144.5 sec)](https://chromium-swarm.appspot.com/user/task/446903c18e15a010) >+ # * [shard #3 isolated out](https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=976d586386864abecf53915fbac3e085f672e30f) >+ # * [shard #3 (138.4 sec)](https://chromium-swarm.appspot.com/user/task/446903cc8da0ad10) >+ # ... >+ for line in out.splitlines(): >+ if 'Step "angle_' not in line: >+ continue >+ step_names.append(line.split('"')[1]) >+ return step_names >+ >+ >+# Performs some heuristic validation of the step_info struct returned from a single step log. >+# Returns True if valid, False if invalid. May write to stderr >+def validate_step_info(step_info, build_name, step_name): >+ print_name = "'" + build_name + "': '" + step_name + "'" >+ if not step_info: >+ LOGGER.warning('Step info empty for ' + print_name + '\n') >+ return False >+ >+ if 'Total' in step_info: >+ partial_sum_keys = ['Passed', 'Failed', 'Skipped', 'Not Supported', 'Exception', 'Crashed'] >+ partial_sum_values = [int(step_info[key]) for key in partial_sum_keys if key in step_info] >+ computed_total = sum(partial_sum_values) >+ if step_info['Total'] != computed_total: >+ LOGGER.warning('Step info does not sum to total for ' + print_name + ' | Total: ' + >+ str(step_info['Total']) + ' - Computed total: ' + str(computed_total) + '\n') >+ return True >+ >+ >+# Returns a struct containing parsed info from a given step log. The info is parsed by looking for >+# lines with the following format in stdout: >+# '[TESTSTATS]: <key>: <value>'' >+# May write to stderr >+# Uses: bb log '<build_name>' '<step_name>' >+def get_step_info(build_name, step_name): >+ bb = subprocess.Popen(['bb', 'log', build_name, step_name], >+ stdout=subprocess.PIPE, >+ stderr=subprocess.PIPE) >+ LOGGER.debug("Ran [bb log '" + build_name + "' '" + step_name + "']") >+ out, err = bb.communicate() >+ if err: >+ LOGGER.warning("Unexpected error from bb log '" + build_name + "' '" + step_name + "': '" + >+ err + "'") >+ return None >+ step_info = {} >+ # Example output (relevant lines of stdout): >+ # ... >+ # *RESULT: Total: 155 >+ # *RESULT: Passed: 11 >+ # *RESULT: Failed: 0 >+ # *RESULT: Skipped: 12 >+ # *RESULT: Not Supported: 132 >+ # *RESULT: Exception: 0 >+ # *RESULT: Crashed: 0 >+ # *RESULT: Unexpected Passed: 12 >+ # ... >+ append_errors = [] >+ for line in out.splitlines(): >+ if INFO_TAG not in line: >+ continue >+ found_stat = True >+ line_columns = line.split(INFO_TAG, 1)[1].split(':') >+ if len(line_columns) is not 3: >+ LOGGER.warning("Line improperly formatted: '" + line + "'\n") >+ continue >+ key = line_columns[1].strip() >+ # If the value is clearly an int, sum it. Otherwise, concatenate it as a string >+ isInt = False >+ intVal = 0 >+ try: >+ intVal = int(line_columns[2]) >+ if intVal is not None: >+ isInt = True >+ except Exception as error: >+ isInt = False >+ >+ if isInt: >+ if key not in step_info: >+ step_info[key] = 0 >+ step_info[key] += intVal >+ else: >+ if key not in step_info: >+ step_info[key] = line_columns[2].strip() >+ else: >+ append_string = '\n' + line_columns[2].strip() >+ # Sheets has a limit of 50000 characters per cell, so make sure to stop appending below >+ # this limit >+ if len(step_info[key]) + len(append_string) < 50000: >+ step_info[key] += append_string >+ else: >+ if key not in append_errors: >+ append_errors.append(key) >+ LOGGER.warning("Too many characters in column '" + key + "'. Output capped.") >+ >+ if validate_step_info(step_info, build_name, step_name): >+ return step_info >+ return None >+ >+ >+# Returns the info for each step run on a given bot_name. >+def get_bot_info(bot_name): >+ info = get_latest_success_build_info(bot_name) >+ info['step_names'] = get_step_names(info['build_name']) >+ for step_name in info['step_names']: >+ LOGGER.info("Parsing step '" + step_name + "'...") >+ info[step_name] = get_step_info(info['build_name'], step_name) >+ return info >+ >+ >+##################### >+# Sheets Formatting # >+##################### >+ >+ >+# Get an individual spreadsheet based on the spreadsheet id. Returns the result of >+# spreadsheets.get(), or throws an exception if the sheet could not open. >+def get_spreadsheet(service, spreadsheet_id): >+ LOGGER.debug("Called [spreadsheets.get(spreadsheetId='" + spreadsheet_id + "')]") >+ request = service.get(spreadsheetId=spreadsheet_id) >+ spreadsheet = request.execute() >+ if not spreadsheet: >+ raise Exception("Did not open spreadsheet '" + spreadsheet_id + "'") >+ return spreadsheet >+ >+ >+# Returns a nicely formatted string based on the bot_name and step_name >+def format_sheet_name(bot_name, step_name): >+ # Some tokens should be ignored for readability in the name >+ unneccesary_tokens = ['FYI', 'Release', 'Vk', 'dEQP', '(', ')'] >+ for token in unneccesary_tokens: >+ bot_name = bot_name.replace(token, '') >+ bot_name = ' '.join(bot_name.strip().split()) # Remove extra spaces >+ step_name = re.findall(r'angle\w*', step_name)[0] # Separate test name >+ # Test names are formatted as 'angle_deqp_<frontend>_<backend>_tests' >+ new_step_name = '' >+ # Put the frontend first >+ if '_egl_' in step_name: >+ new_step_name += ' EGL' >+ if '_gles2_' in step_name: >+ new_step_name += ' GLES 2.0 ' >+ if '_gles3_' in step_name: >+ new_step_name += ' GLES 3.0 ' >+ if '_gles31_' in step_name: >+ new_step_name += ' GLES 3.1 ' >+ # Put the backend second >+ if '_d3d9_' in step_name: >+ new_step_name += ' D3D9 ' >+ if '_d3d11' in step_name: >+ new_step_name += ' D3D11 ' >+ if '_gl_' in step_name: >+ new_step_name += ' Desktop OpenGL ' >+ if '_gles_' in step_name: >+ new_step_name += ' OpenGLES ' >+ if '_vulkan_' in step_name: >+ new_step_name += ' Vulkan ' >+ new_step_name = ' '.join(new_step_name.strip().split()) # Remove extra spaces >+ return new_step_name + ' ' + bot_name >+ >+ >+# Returns the full list of sheet names that should be populated based on the info struct >+def get_sheet_names(info): >+ sheet_names = [] >+ for bot_name in info: >+ for step_name in info[bot_name]['step_names']: >+ sheet_name = format_sheet_name(bot_name, step_name) >+ sheet_names.append(sheet_name) >+ return sheet_names >+ >+ >+# Returns True if the sheet is found in the spreadsheets object >+def sheet_exists(spreadsheet, step_name): >+ for sheet in spreadsheet['sheets']: >+ if sheet['properties']['title'] == step_name: >+ return True >+ return False >+ >+ >+# Validates the spreadsheets object against the list of sheet names which should appear. Returns a >+# list of sheets that need creation. >+def validate_sheets(spreadsheet, sheet_names): >+ create_sheets = [] >+ for sheet_name in sheet_names: >+ if not sheet_exists(spreadsheet, sheet_name): >+ create_sheets.append(sheet_name) >+ return create_sheets >+ >+ >+# Performs a batch update with a given service, spreadsheet id, and list <object(Request)> of >+# updates to do. >+def batch_update(service, spreadsheet_id, updates): >+ batch_update_request_body = { >+ 'requests': updates, >+ } >+ LOGGER.debug("Called [spreadsheets.batchUpdate(spreadsheetId='" + spreadsheet_id + "', body=" + >+ str(batch_update_request_body) + ')]') >+ request = service.batchUpdate(spreadsheetId=spreadsheet_id, body=batch_update_request_body) >+ request.execute() >+ >+ >+# Creates sheets given a service and spreadsheed id based on a list of sheet names input >+def create_sheets(service, spreadsheet_id, sheet_names): >+ updates = [{'addSheet': {'properties': {'title': sheet_name,}}} for sheet_name in sheet_names] >+ batch_update(service, spreadsheet_id, updates) >+ >+ >+# Calls a values().batchGet() on the service to find the list of column names from each sheet in >+# sheet_names. Returns a dictionary with one list per sheet_name. >+def get_headers(service, spreadsheet_id, sheet_names): >+ header_ranges = [sheet_name + '!A1:Z' for sheet_name in sheet_names] >+ LOGGER.debug("Called [spreadsheets.values().batchGet(spreadsheetId='" + spreadsheet_id + >+ ', ranges=' + str(header_ranges) + "')]") >+ request = service.values().batchGet(spreadsheetId=spreadsheet_id, ranges=header_ranges) >+ response = request.execute() >+ headers = {} >+ for k, sheet_name in enumerate(sheet_names): >+ if 'values' in response['valueRanges'][k]: >+ # Headers are in the first row of values >+ headers[sheet_name] = response['valueRanges'][k]['values'][0] >+ else: >+ headers[sheet_name] = [] >+ return headers >+ >+ >+# Calls values().batchUpdate() with supplied list of data <object(ValueRange)> to update on the >+# service. >+def batch_update_values(service, spreadsheet_id, data): >+ batch_update_values_request_body = { >+ 'valueInputOption': 'USER_ENTERED', # Helps with formatting of dates >+ 'data': data, >+ } >+ LOGGER.debug("Called [spreadsheets.values().batchUpdate(spreadsheetId='" + spreadsheet_id + >+ "', body=" + str(batch_update_values_request_body) + ')]') >+ request = service.values().batchUpdate( >+ spreadsheetId=spreadsheet_id, body=batch_update_values_request_body) >+ request.execute() >+ >+ >+# Populates the headers with any missing/desired rows based on the info struct, and calls >+# batch update to update the corresponding sheets if necessary. >+def update_headers(service, spreadsheet_id, headers, info): >+ data = [] >+ sheet_names = [] >+ for bot_name in info: >+ for step_name in info[bot_name]['step_names']: >+ sheet_name = format_sheet_name(bot_name, step_name) >+ headers_stale = False >+ # Headers should always contain the following columns >+ for req in REQUIRED_COLUMNS: >+ if req not in headers[sheet_name]: >+ headers_stale = True >+ headers[sheet_name].append(req) >+ # Headers also must contain all the keys seen in this step >+ for key in info[bot_name][step_name].keys(): >+ if key not in headers[sheet_name]: >+ headers_stale = True >+ headers[sheet_name].append(key) >+ # Update the Gdoc headers if necessary >+ if headers_stale: >+ sheet_names.append(sheet_name) >+ header_range = sheet_name + '!A1:Z' >+ data.append({ >+ 'range': header_range, >+ 'majorDimension': 'ROWS', >+ 'values': [headers[sheet_name]] >+ }) >+ if data: >+ LOGGER.info('Updating sheet headers...') >+ batch_update_values(service, spreadsheet_id, data) >+ >+ >+# Calls values().append() to append a list of values to a given sheet. >+def append_values(service, spreadsheet_id, sheet_name, values): >+ header_range = sheet_name + '!A1:Z' >+ insert_data_option = 'INSERT_ROWS' >+ value_input_option = 'USER_ENTERED' # Helps with formatting of dates >+ append_values_request_body = { >+ 'range': header_range, >+ 'majorDimension': 'ROWS', >+ 'values': [values], >+ } >+ LOGGER.debug("Called [spreadsheets.values().append(spreadsheetId='" + spreadsheet_id + >+ "', body=" + str(append_values_request_body) + ", range='" + header_range + >+ "', insertDataOption='" + insert_data_option + "', valueInputOption='" + >+ value_input_option + "')]") >+ request = service.values().append( >+ spreadsheetId=spreadsheet_id, >+ body=append_values_request_body, >+ range=header_range, >+ insertDataOption=insert_data_option, >+ valueInputOption=value_input_option) >+ request.execute() >+ >+ >+# Uses the list of headers and the info struct to come up with a list of values for each step >+# from the latest builds. >+def update_values(service, spreadsheet_id, headers, info): >+ data = [] >+ for bot_name in info: >+ for step_name in info[bot_name]['step_names']: >+ sheet_name = format_sheet_name(bot_name, step_name) >+ values = [] >+ # For each key in the list of headers, either add the corresponding value or add a blank >+ # value. It's necessary for the values to match the order of the headers >+ for key in headers[sheet_name]: >+ if key in info[bot_name] and key in REQUIRED_COLUMNS: >+ values.append(info[bot_name][key]) >+ elif key in info[bot_name][step_name]: >+ values.append(info[bot_name][step_name][key]) >+ else: >+ values.append('') >+ LOGGER.info("Appending new rows to sheet '" + sheet_name + "'...") >+ try: >+ append_values(service, spreadsheet_id, sheet_name, values) >+ except Exception as error: >+ LOGGER.warning('%s\n' % str(error)) >+ >+ >+# Updates the given spreadsheed_id with the info struct passed in. >+def update_spreadsheet(service, spreadsheet_id, info): >+ LOGGER.info('Opening spreadsheet...') >+ spreadsheet = get_spreadsheet(service, spreadsheet_id) >+ LOGGER.info('Parsing sheet names...') >+ sheet_names = get_sheet_names(info) >+ new_sheets = validate_sheets(spreadsheet, sheet_names) >+ if new_sheets: >+ LOGGER.info('Creating new sheets...') >+ create_sheets(service, spreadsheet_id, new_sheets) >+ LOGGER.info('Parsing sheet headers...') >+ headers = get_headers(service, spreadsheet_id, sheet_names) >+ update_headers(service, spreadsheet_id, headers, info) >+ update_values(service, spreadsheet_id, headers, info) >+ >+ >+##################### >+# Main/helpers # >+##################### >+ >+ >+# Loads or creates credentials and connects to the Sheets API. Returns a Spreadsheets object with >+# an open connection. >+def get_sheets_service(auth_path): >+ credentials_path = auth_path + '/credentials.json' >+ token_path = auth_path + '/token.pickle' >+ creds = None >+ if not os.path.exists(auth_path): >+ LOGGER.info("Creating auth dir '" + auth_path + "'") >+ os.makedirs(auth_path) >+ if not os.path.exists(credentials_path): >+ raise Exception('Missing credentials.json.\n' >+ 'Go to: https://developers.google.com/sheets/api/quickstart/python\n' >+ "Under Step 1, click 'ENABLE THE GOOGLE SHEETS API'\n" >+ "Click 'DOWNLOAD CLIENT CONFIGURATION'\n" >+ 'Save to your auth_path (' + auth_path + ') as credentials.json') >+ if os.path.exists(token_path): >+ with open(token_path, 'rb') as token: >+ creds = pickle.load(token) >+ LOGGER.info('Loaded credentials from ' + token_path) >+ if not creds or not creds.valid: >+ if creds and creds.expired and creds.refresh_token: >+ LOGGER.info('Refreshing credentials...') >+ creds.refresh(Request()) >+ else: >+ LOGGER.info('Could not find credentials. Requesting new credentials.') >+ flow = InstalledAppFlow.from_client_secrets_file(credentials_path, SCOPES) >+ creds = flow.run_local_server() >+ with open(token_path, 'wb') as token: >+ pickle.dump(creds, token) >+ service = build('sheets', 'v4', credentials=creds) >+ sheets = service.spreadsheets() >+ return sheets >+ >+ >+# Parse the input to the script >+def parse_args(): >+ parser = argparse.ArgumentParser(os.path.basename(sys.argv[0])) >+ parser.add_argument( >+ '--auth_path', >+ default=HOME_DIR + '/.auth', >+ nargs='?', >+ help='path to directory containing authorization data ' >+ '(credentials.json and token.pickle). ' >+ '[default=<home>/.auth]') >+ parser.add_argument( >+ '--spreadsheet', >+ default='1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw', >+ nargs='?', >+ help='ID of the spreadsheet to write stats to. ' >+ "[default='1D6Yh7dAPP-aYLbX3HHQD8WubJV9XPuxvkKowmn2qhIw']") >+ parser.add_argument( >+ '--verbosity', >+ default='INFO', >+ nargs='?', >+ help='Verbosity of output. Valid options are ' >+ '[DEBUG, INFO, WARNING, ERROR]. ' >+ '[default=INFO]') >+ return parser.parse_args() >+ >+ >+# Set up the logging with the right verbosity and output. >+def initialize_logging(verbosity): >+ handler = logging.StreamHandler() >+ formatter = logging.Formatter(fmt='%(levelname)s: %(message)s') >+ handler.setFormatter(formatter) >+ LOGGER.addHandler(handler) >+ if 'DEBUG' in verbosity: >+ LOGGER.setLevel(level=logging.DEBUG) >+ elif 'INFO' in verbosity: >+ LOGGER.setLevel(level=logging.INFO) >+ elif 'WARNING' in verbosity: >+ LOGGER.setLevel(level=logging.WARNING) >+ elif 'ERROR' in verbosity: >+ LOGGER.setLevel(level=logging.ERROR) >+ else: >+ LOGGER.setLevel(level=logging.INFO) >+ >+ >+def main(): >+ os.chdir(ROOT_DIR) >+ args = parse_args() >+ verbosity = args.verbosity.strip().upper() >+ initialize_logging(verbosity) >+ auth_path = args.auth_path.replace('\\', '/') >+ try: >+ service = get_sheets_service(auth_path) >+ except Exception as error: >+ LOGGER.error('%s\n' % str(error)) >+ exit(1) >+ >+ info = {} >+ LOGGER.info('Building info struct...') >+ for bot_name in BOT_NAMES: >+ LOGGER.info("Parsing bot '" + bot_name + "'...") >+ try: >+ info[bot_name] = get_bot_info(BOT_NAME_PREFIX + bot_name) >+ except Exception as error: >+ LOGGER.error('%s\n' % str(error)) >+ >+ LOGGER.info('Updating sheets...') >+ try: >+ update_spreadsheet(service, args.spreadsheet, info) >+ except Exception as error: >+ LOGGER.error('%s\n' % str(error)) >+ quit(1) >+ >+ LOGGER.info('Info was successfully parsed to sheet: https://docs.google.com/spreadsheets/d/' + >+ args.spreadsheet) >+ >+ >+if __name__ == '__main__': >+ sys.exit(main()) >diff --git a/Source/ThirdParty/ANGLE/scripts/generate_vulkan_layers_json.py b/Source/ThirdParty/ANGLE/scripts/generate_vulkan_layers_json.py >new file mode 100644 >index 00000000000..daa6d20544a >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/generate_vulkan_layers_json.py >@@ -0,0 +1,116 @@ >+#!/usr/bin/env python >+# >+# Copyright 2016 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 copies of the Vulkan layers JSON files, with no paths, forcing >+Vulkan to use the default search path to look for layers.""" >+ >+from __future__ import print_function >+ >+import argparse >+import glob >+import json >+import os >+import platform >+import sys >+ >+ >+def glob_slash(dirname): >+ """Like regular glob but replaces \ with / in returned paths.""" >+ return [s.replace('\\', '/') for s in glob.glob(dirname)] >+ >+ >+def main(): >+ parser = argparse.ArgumentParser(description=__doc__) >+ parser.add_argument('--icd', action='store_true') >+ parser.add_argument('source_dir') >+ parser.add_argument('target_dir') >+ parser.add_argument('version_header', help='path to vulkan_core.h') >+ parser.add_argument('json_files', nargs='*') >+ args = parser.parse_args() >+ >+ source_dir = args.source_dir >+ target_dir = args.target_dir >+ >+ json_files = [j for j in args.json_files if j.endswith('.json')] >+ json_in_files = [j for j in args.json_files if j.endswith('.json.in')] >+ >+ data_key = 'ICD' if args.icd else 'layer' >+ >+ if not os.path.isdir(source_dir): >+ print(source_dir + ' is not a directory.', file=sys.stderr) >+ return 1 >+ >+ if not os.path.exists(target_dir): >+ os.makedirs(target_dir) >+ >+ # Copy the *.json files from source dir to target dir >+ if (set(glob_slash(os.path.join(source_dir, '*.json'))) != set(json_files)): >+ print(glob.glob(os.path.join(source_dir, '*.json'))) >+ print('.json list in gn file is out-of-date', file=sys.stderr) >+ return 1 >+ >+ for json_fname in json_files: >+ if not json_fname.endswith('.json'): >+ continue >+ with open(json_fname) as infile: >+ data = json.load(infile) >+ >+ # Update the path. >+ if not data_key in data: >+ raise Exception( >+ "Could not find '%s' key in %s" % (data_key, json_fname)) >+ >+ # The standard validation layer has no library path. >+ if 'library_path' in data[data_key]: >+ prev_name = os.path.basename(data[data_key]['library_path']) >+ data[data_key]['library_path'] = prev_name >+ >+ target_fname = os.path.join(target_dir, os.path.basename(json_fname)) >+ with open(target_fname, 'wb') as outfile: >+ json.dump(data, outfile) >+ >+ # Get the Vulkan version from the vulkan_core.h file >+ vk_header_filename = args.version_header >+ vk_version = None >+ with open(vk_header_filename) as vk_header_file: >+ for line in vk_header_file: >+ if line.startswith('#define VK_HEADER_VERSION'): >+ vk_version = line.split()[-1] >+ break >+ if not vk_version: >+ print('failed to extract vk_version', file=sys.stderr) >+ return 1 >+ >+ # Set json file prefix and suffix for generating files, default to Linux. >+ relative_path_prefix = '../lib' >+ file_type_suffix = '.so' >+ if platform.system() == 'Windows': >+ relative_path_prefix = r'..\\' # json-escaped, hence two backslashes. >+ file_type_suffix = '.dll' >+ >+ # For each *.json.in template files in source dir generate actual json file >+ # in target dir >+ if (set(glob_slash(os.path.join(source_dir, '*.json.in'))) != >+ set(json_in_files)): >+ print('.json.in list in gn file is out-of-date', file=sys.stderr) >+ return 1 >+ for json_in_name in json_in_files: >+ if not json_in_name.endswith('.json.in'): >+ continue >+ json_in_fname = os.path.basename(json_in_name) >+ layer_name = json_in_fname[:-len('.json.in')] >+ layer_lib_name = layer_name + file_type_suffix >+ json_out_fname = os.path.join(target_dir, json_in_fname[:-len('.in')]) >+ with open(json_out_fname,'w') as json_out_file, \ >+ open(json_in_name) as infile: >+ for line in infile: >+ line = line.replace('@RELATIVE_LAYER_BINARY@', >+ relative_path_prefix + layer_lib_name) >+ line = line.replace('@VK_VERSION@', '1.1.' + vk_version) >+ json_out_file.write(line) >+ >+if __name__ == '__main__': >+ sys.exit(main()) >diff --git a/Source/ThirdParty/ANGLE/scripts/gl.xml b/Source/ThirdParty/ANGLE/scripts/gl.xml >new file mode 100644 >index 00000000000..3466dd7061b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/gl.xml >@@ -0,0 +1,49607 @@ >+<?xml version="1.0" encoding="UTF-8"?> >+<registry> >+ <comment> >+Copyright (c) 2013-2018 The Khronos Group Inc. >+ >+Licensed under the Apache License, Version 2.0 (the "License"); >+you may not use this file except in compliance with the License. >+You may obtain a copy of the License at >+ >+ http://www.apache.org/licenses/LICENSE-2.0 >+ >+Unless required by applicable law or agreed to in writing, software >+distributed under the License is distributed on an "AS IS" BASIS, >+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. >+See the License for the specific language governing permissions and >+limitations under the License. >+ >+------------------------------------------------------------------------ >+ >+This file, gl.xml, is the OpenGL and OpenGL API Registry. The canonical >+version of the registry, together with documentation, schema, and Python >+generator scripts used to generate C header files for OpenGL and OpenGL ES, >+can always be found in the Khronos Registry at >+ https://github.com/KhronosGroup/OpenGL-Registry >+ </comment> >+ >+ <!-- SECTION: GL type definitions. --> >+ <types> >+ <!-- These are dependencies GL types require to be declared legally --> >+ <type name="stddef">#include <stddef.h></type> >+ <type name="khrplatform">#include <KHR/khrplatform.h></type> >+ <type name="inttypes">#ifndef GLEXT_64_TYPES_DEFINED >+/* This code block is duplicated in glxext.h, so must be protected */ >+#define GLEXT_64_TYPES_DEFINED >+/* Define int32_t, int64_t, and uint64_t types for UST/MSC */ >+/* (as used in the GL_EXT_timer_query extension). */ >+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L >+#include <inttypes.h> >+#elif defined(__sun__) || defined(__digital__) >+#include <inttypes.h> >+#if defined(__STDC__) >+#if defined(__arch64__) || defined(_LP64) >+typedef long int int64_t; >+typedef unsigned long int uint64_t; >+#else >+typedef long long int int64_t; >+typedef unsigned long long int uint64_t; >+#endif /* __arch64__ */ >+#endif /* __STDC__ */ >+#elif defined( __VMS ) || defined(__sgi) >+#include <inttypes.h> >+#elif defined(__SCO__) || defined(__USLC__) >+#include <stdint.h> >+#elif defined(__UNIXOS2__) || defined(__SOL64__) >+typedef long int int32_t; >+typedef long long int int64_t; >+typedef unsigned long long int uint64_t; >+#elif defined(_WIN32) && defined(__GNUC__) >+#include <stdint.h> >+#elif defined(_WIN32) >+typedef __int32 int32_t; >+typedef __int64 int64_t; >+typedef unsigned __int64 uint64_t; >+#else >+/* Fallback if nothing above works */ >+#include <inttypes.h> >+#endif >+#endif</type> >+ <!-- These are actual GL types --> >+ <type>typedef unsigned int <name>GLenum</name>;</type> >+ <type>typedef unsigned char <name>GLboolean</name>;</type> >+ <type>typedef unsigned int <name>GLbitfield</name>;</type> >+ <type comment="Not an actual GL type, though used in headers in the past">typedef void <name>GLvoid</name>;</type> >+ <type>typedef signed char <name>GLbyte</name>;</type> >+ <type>typedef short <name>GLshort</name>;</type> >+ <type>typedef int <name>GLint</name>;</type> >+ <type>typedef int <name>GLclampx</name>;</type> >+ <type>typedef unsigned char <name>GLubyte</name>;</type> >+ <type>typedef unsigned short <name>GLushort</name>;</type> >+ <type>typedef unsigned int <name>GLuint</name>;</type> >+ <type>typedef int <name>GLsizei</name>;</type> >+ <type>typedef float <name>GLfloat</name>;</type> >+ <type>typedef float <name>GLclampf</name>;</type> >+ <type>typedef double <name>GLdouble</name>;</type> >+ <type>typedef double <name>GLclampd</name>;</type> >+ <type>typedef void *<name>GLeglClientBufferEXT</name>;</type> >+ <type>typedef void *<name>GLeglImageOES</name>;</type> >+ <type>typedef char <name>GLchar</name>;</type> >+ <type>typedef char <name>GLcharARB</name>;</type> >+ <type name="GLhandleARB">#ifdef __APPLE__ >+typedef void *GLhandleARB; >+#else >+typedef unsigned int GLhandleARB; >+#endif</type> >+ <type>typedef unsigned short <name>GLhalfARB</name>;</type> >+ <type>typedef unsigned short <name>GLhalf</name>;</type> >+ <type comment="Must be 32 bits">typedef GLint <name>GLfixed</name>;</type> >+ <type requires="khrplatform">typedef khronos_intptr_t <name>GLintptr</name>;</type> >+ <type requires="khrplatform">typedef khronos_ssize_t <name>GLsizeiptr</name>;</type> >+ <type requires="inttypes">typedef int64_t <name>GLint64</name>;</type> >+ <type requires="inttypes">typedef uint64_t <name>GLuint64</name>;</type> >+ <type requires="stddef">typedef ptrdiff_t <name>GLintptrARB</name>;</type> >+ <type requires="stddef">typedef ptrdiff_t <name>GLsizeiptrARB</name>;</type> >+ <type requires="inttypes">typedef int64_t <name>GLint64EXT</name>;</type> >+ <type requires="inttypes">typedef uint64_t <name>GLuint64EXT</name>;</type> >+ <type>typedef struct __GLsync *<name>GLsync</name>;</type> >+ <type comment="compatible with OpenCL cl_context"><name>struct _cl_context</name>;</type> >+ <type comment="compatible with OpenCL cl_event"><name>struct _cl_event</name>;</type> >+ <type>typedef void (<apientry/> *<name>GLDEBUGPROC</name>)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);</type> >+ <type>typedef void (<apientry/> *<name>GLDEBUGPROCARB</name>)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);</type> >+ <type>typedef void (<apientry/> *<name>GLDEBUGPROCKHR</name>)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);</type> >+ <!-- GLES 1 types --> >+ <type api="gles1" requires="khrplatform">typedef khronos_int32_t <name>GLclampx</name>;</type> >+ <!-- GLES 1/2 types (tagged for GLES 1) --> >+ <type api="gles1" requires="khrplatform">typedef khronos_int8_t <name>GLbyte</name>;</type> >+ <type api="gles1" requires="khrplatform">typedef khronos_uint8_t <name>GLubyte</name>;</type> >+ <type api="gles1" requires="khrplatform">typedef khronos_float_t <name>GLfloat</name>;</type> >+ <type api="gles1" requires="khrplatform">typedef khronos_float_t <name>GLclampf</name>;</type> >+ <type api="gles1" requires="khrplatform">typedef khronos_int32_t <name>GLfixed</name>;</type> >+ <type api="gles1" requires="khrplatform">typedef khronos_int64_t <name>GLint64</name>;</type> >+ <type api="gles1" requires="khrplatform">typedef khronos_uint64_t <name>GLuint64</name>;</type> >+ <type api="gles1" requires="khrplatform">typedef khronos_intptr_t <name>GLintptr</name>;</type> >+ <type api="gles1" requires="khrplatform">typedef khronos_ssize_t <name>GLsizeiptr</name>;</type> >+ <!-- GLES 1/2 types (tagged for GLES 2 - attribute syntax is limited) --> >+ <type api="gles2" requires="khrplatform">typedef khronos_int8_t <name>GLbyte</name>;</type> >+ <type api="gles2" requires="khrplatform">typedef khronos_uint8_t <name>GLubyte</name>;</type> >+ <type api="gles2" requires="khrplatform">typedef khronos_float_t <name>GLfloat</name>;</type> >+ <type api="gles2" requires="khrplatform">typedef khronos_float_t <name>GLclampf</name>;</type> >+ <type api="gles2" requires="khrplatform">typedef khronos_int32_t <name>GLfixed</name>;</type> >+ <type api="gles2" requires="khrplatform">typedef khronos_int64_t <name>GLint64</name>;</type> >+ <type api="gles2" requires="khrplatform">typedef khronos_uint64_t <name>GLuint64</name>;</type> >+ <type api="gles2" requires="khrplatform">typedef khronos_int64_t <name>GLint64EXT</name>;</type> >+ <type api="gles2" requires="khrplatform">typedef khronos_uint64_t <name>GLuint64EXT</name>;</type> >+ <type api="gles2" requires="khrplatform">typedef khronos_intptr_t <name>GLintptr</name>;</type> >+ <type api="gles2" requires="khrplatform">typedef khronos_ssize_t <name>GLsizeiptr</name>;</type> >+ <!-- GLES 2 types (none currently) --> >+ <!-- GLSC 2 types --> >+ <type api="glsc2" requires="khrplatform">typedef khronos_uint8_t <name>GLubyte</name>;</type> >+ <type api="glsc2" requires="khrplatform">typedef khronos_float_t <name>GLfloat</name>;</type> >+ <type api="glsc2" requires="khrplatform">typedef khronos_intptr_t <name>GLintptr</name>;</type> >+ <type api="glsc2" requires="khrplatform">typedef khronos_ssize_t <name>GLsizeiptr</name>;</type> >+ <!-- Vendor extension types --> >+ <type>typedef void (<apientry/> *<name>GLDEBUGPROCAMD</name>)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam);</type> >+ <type>typedef unsigned short <name>GLhalfNV</name>;</type> >+ <type requires="GLintptr">typedef GLintptr <name>GLvdpauSurfaceNV</name>;</type> >+ <type>typedef void (<apientry/> *<name>GLVULKANPROCNV</name>)(void);</type> >+ </types> >+ >+ <!-- SECTION: GL parameter class type definitions. --> >+ >+ <groups> >+ <group name="AccumOp"> >+ <enum name="GL_ACCUM"/> >+ <enum name="GL_LOAD"/> >+ <enum name="GL_RETURN"/> >+ <enum name="GL_MULT"/> >+ <enum name="GL_ADD"/> >+ </group> >+ >+ <group name="AttribMask"> >+ <enum name="GL_ACCUM_BUFFER_BIT"/> >+ <enum name="GL_ALL_ATTRIB_BITS"/> >+ <enum name="GL_COLOR_BUFFER_BIT"/> >+ <enum name="GL_CURRENT_BIT"/> >+ <enum name="GL_DEPTH_BUFFER_BIT"/> >+ <enum name="GL_ENABLE_BIT"/> >+ <enum name="GL_EVAL_BIT"/> >+ <enum name="GL_FOG_BIT"/> >+ <enum name="GL_HINT_BIT"/> >+ <enum name="GL_LIGHTING_BIT"/> >+ <enum name="GL_LINE_BIT"/> >+ <enum name="GL_LIST_BIT"/> >+ <enum name="GL_MULTISAMPLE_BIT"/> >+ <enum name="GL_MULTISAMPLE_BIT_3DFX"/> >+ <enum name="GL_MULTISAMPLE_BIT_ARB"/> >+ <enum name="GL_MULTISAMPLE_BIT_EXT"/> >+ <enum name="GL_PIXEL_MODE_BIT"/> >+ <enum name="GL_POINT_BIT"/> >+ <enum name="GL_POLYGON_BIT"/> >+ <enum name="GL_POLYGON_STIPPLE_BIT"/> >+ <enum name="GL_SCISSOR_BIT"/> >+ <enum name="GL_STENCIL_BUFFER_BIT"/> >+ <enum name="GL_TEXTURE_BIT"/> >+ <enum name="GL_TRANSFORM_BIT"/> >+ <enum name="GL_VIEWPORT_BIT"/> >+ </group> >+ >+ <group name="AlphaFunction"> >+ <enum name="GL_ALWAYS"/> >+ <enum name="GL_EQUAL"/> >+ <enum name="GL_GEQUAL"/> >+ <enum name="GL_GREATER"/> >+ <enum name="GL_LEQUAL"/> >+ <enum name="GL_LESS"/> >+ <enum name="GL_NEVER"/> >+ <enum name="GL_NOTEQUAL"/> >+ </group> >+ >+ <group name="BlendEquationModeEXT"> >+ <enum name="GL_ALPHA_MAX_SGIX"/> >+ <enum name="GL_ALPHA_MIN_SGIX"/> >+ <enum name="GL_FUNC_ADD_EXT"/> >+ <enum name="GL_FUNC_REVERSE_SUBTRACT_EXT"/> >+ <enum name="GL_FUNC_SUBTRACT_EXT"/> >+ <enum name="GL_LOGIC_OP"/> >+ <enum name="GL_MAX_EXT"/> >+ <enum name="GL_MIN_EXT"/> >+ <enum name="GL_FUNC_ADD"/> >+ <enum name="GL_FUNC_REVERSE_SUBTRACT"/> >+ <enum name="GL_FUNC_SUBTRACT"/> >+ </group> >+ >+ <group name="Boolean"> >+ <enum name="GL_FALSE"/> >+ <enum name="GL_TRUE"/> >+ </group> >+ >+ <group name="BufferBitQCOM"> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT7_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT6_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT5_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT4_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT3_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT2_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT1_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT0_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT7_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT6_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT5_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT4_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT3_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT2_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT1_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT0_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT7_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT6_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT5_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT4_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT3_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT2_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT1_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT0_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT7_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT6_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT5_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT4_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT3_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT2_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT1_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT0_QCOM"/> >+ </group> >+ >+ <group name="BufferTargetARB"> >+ <enum name="GL_ARRAY_BUFFER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER" /> >+ <enum name="GL_COPY_READ_BUFFER" /> >+ <enum name="GL_COPY_WRITE_BUFFER" /> >+ <enum name="GL_DISPATCH_INDIRECT_BUFFER" /> >+ <enum name="GL_DRAW_INDIRECT_BUFFER" /> >+ <enum name="GL_ELEMENT_ARRAY_BUFFER" /> >+ <enum name="GL_PIXEL_PACK_BUFFER" /> >+ <enum name="GL_PIXEL_UNPACK_BUFFER" /> >+ <enum name="GL_QUERY_BUFFER" /> >+ <enum name="GL_SHADER_STORAGE_BUFFER" /> >+ <enum name="GL_TEXTURE_BUFFER" /> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER" /> >+ <enum name="GL_UNIFORM_BUFFER" /> >+ </group> >+ >+ <group name="BufferUsageARB"> >+ <enum name="GL_STREAM_DRAW"/> >+ <enum name="GL_STREAM_READ"/> >+ <enum name="GL_STREAM_COPY"/> >+ <enum name="GL_STATIC_DRAW"/> >+ <enum name="GL_STATIC_READ"/> >+ <enum name="GL_STATIC_COPY"/> >+ <enum name="GL_DYNAMIC_DRAW"/> >+ <enum name="GL_DYNAMIC_READ"/> >+ <enum name="GL_DYNAMIC_COPY"/> >+ </group> >+ >+ <group name="BufferAccessARB"> >+ <enum name="GL_READ_ONLY"/> >+ <enum name="GL_WRITE_ONLY"/> >+ <enum name="GL_READ_WRITE"/> >+ </group> >+ >+ <group name="BufferAccessMask"> >+ <enum name="GL_MAP_COHERENT_BIT"/> >+ <enum name="GL_MAP_COHERENT_BIT_EXT"/> >+ <enum name="GL_MAP_FLUSH_EXPLICIT_BIT"/> >+ <enum name="GL_MAP_FLUSH_EXPLICIT_BIT_EXT"/> >+ <enum name="GL_MAP_INVALIDATE_BUFFER_BIT"/> >+ <enum name="GL_MAP_INVALIDATE_BUFFER_BIT_EXT"/> >+ <enum name="GL_MAP_INVALIDATE_RANGE_BIT"/> >+ <enum name="GL_MAP_INVALIDATE_RANGE_BIT_EXT"/> >+ <enum name="GL_MAP_PERSISTENT_BIT"/> >+ <enum name="GL_MAP_PERSISTENT_BIT_EXT"/> >+ <enum name="GL_MAP_READ_BIT"/> >+ <enum name="GL_MAP_READ_BIT_EXT"/> >+ <enum name="GL_MAP_UNSYNCHRONIZED_BIT"/> >+ <enum name="GL_MAP_UNSYNCHRONIZED_BIT_EXT"/> >+ <enum name="GL_MAP_WRITE_BIT"/> >+ <enum name="GL_MAP_WRITE_BIT_EXT"/> >+ </group> >+ >+ <group name="ClearBufferMask"> >+ <enum name="GL_ACCUM_BUFFER_BIT"/> >+ <enum name="GL_COLOR_BUFFER_BIT"/> >+ <enum name="GL_COVERAGE_BUFFER_BIT_NV"/> >+ <enum name="GL_DEPTH_BUFFER_BIT"/> >+ <enum name="GL_STENCIL_BUFFER_BIT"/> >+ </group> >+ >+ <group name="ClientAttribMask"> >+ <enum name="GL_CLIENT_ALL_ATTRIB_BITS"/> >+ <enum name="GL_CLIENT_PIXEL_STORE_BIT"/> >+ <enum name="GL_CLIENT_VERTEX_ARRAY_BIT"/> >+ </group> >+ >+ <group name="ClipPlaneName"> >+ <enum name="GL_CLIP_DISTANCE0"/> >+ <enum name="GL_CLIP_DISTANCE1"/> >+ <enum name="GL_CLIP_DISTANCE2"/> >+ <enum name="GL_CLIP_DISTANCE3"/> >+ <enum name="GL_CLIP_DISTANCE4"/> >+ <enum name="GL_CLIP_DISTANCE5"/> >+ <enum name="GL_CLIP_DISTANCE6"/> >+ <enum name="GL_CLIP_DISTANCE7"/> >+ <enum name="GL_CLIP_PLANE0"/> >+ <enum name="GL_CLIP_PLANE1"/> >+ <enum name="GL_CLIP_PLANE2"/> >+ <enum name="GL_CLIP_PLANE3"/> >+ <enum name="GL_CLIP_PLANE4"/> >+ <enum name="GL_CLIP_PLANE5"/> >+ </group> >+ >+ <group name="ColorMaterialFace"> >+ <enum name="GL_BACK"/> >+ <enum name="GL_FRONT"/> >+ <enum name="GL_FRONT_AND_BACK"/> >+ </group> >+ >+ <group name="ColorMaterialParameter"> >+ <enum name="GL_AMBIENT"/> >+ <enum name="GL_AMBIENT_AND_DIFFUSE"/> >+ <enum name="GL_DIFFUSE"/> >+ <enum name="GL_EMISSION"/> >+ <enum name="GL_SPECULAR"/> >+ </group> >+ >+ <group name="ColorPointerType"> >+ <enum name="GL_BYTE"/> >+ <enum name="GL_DOUBLE"/> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_INT"/> >+ <enum name="GL_SHORT"/> >+ <enum name="GL_UNSIGNED_BYTE"/> >+ <enum name="GL_UNSIGNED_INT"/> >+ <enum name="GL_UNSIGNED_SHORT"/> >+ </group> >+ >+ <group name="ColorTableParameterPNameSGI"> >+ <enum name="GL_COLOR_TABLE_BIAS"/> >+ <enum name="GL_COLOR_TABLE_BIAS_SGI"/> >+ <enum name="GL_COLOR_TABLE_SCALE"/> >+ <enum name="GL_COLOR_TABLE_SCALE_SGI"/> >+ </group> >+ >+ <group name="ColorTableTargetSGI"> >+ <enum name="GL_COLOR_TABLE"/> >+ <enum name="GL_COLOR_TABLE_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_COLOR_TABLE"/> >+ <enum name="GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI"/> >+ <enum name="GL_POST_CONVOLUTION_COLOR_TABLE"/> >+ <enum name="GL_POST_CONVOLUTION_COLOR_TABLE_SGI"/> >+ <enum name="GL_PROXY_COLOR_TABLE"/> >+ <enum name="GL_PROXY_COLOR_TABLE_SGI"/> >+ <enum name="GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE"/> >+ <enum name="GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI"/> >+ <enum name="GL_PROXY_POST_CONVOLUTION_COLOR_TABLE"/> >+ <enum name="GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI"/> >+ <enum name="GL_PROXY_TEXTURE_COLOR_TABLE_SGI"/> >+ <enum name="GL_TEXTURE_COLOR_TABLE_SGI"/> >+ </group> >+ >+ <group name="ContextFlagMask"> >+ <enum name="GL_CONTEXT_FLAG_DEBUG_BIT"/> >+ <enum name="GL_CONTEXT_FLAG_DEBUG_BIT_KHR"/> >+ <enum name="GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT"/> >+ <enum name="GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT"/> >+ <enum name="GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB"/> >+ <enum name="GL_CONTEXT_FLAG_PROTECTED_CONTENT_BIT_EXT"/> >+ <enum name="GL_CONTEXT_FLAG_NO_ERROR_BIT"/> >+ <enum name="GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR"/> >+ </group> >+ >+ <group name="ContextProfileMask"> >+ <enum name="GL_CONTEXT_COMPATIBILITY_PROFILE_BIT"/> >+ <enum name="GL_CONTEXT_CORE_PROFILE_BIT"/> >+ </group> >+ >+ <group name="ConvolutionBorderModeEXT"> >+ <enum name="GL_REDUCE"/> >+ <enum name="GL_REDUCE_EXT"/> >+ </group> >+ >+ <group name="ConvolutionParameterEXT"> >+ <enum name="GL_CONVOLUTION_BORDER_MODE"/> >+ <enum name="GL_CONVOLUTION_BORDER_MODE_EXT"/> >+ <enum name="GL_CONVOLUTION_FILTER_BIAS"/> >+ <enum name="GL_CONVOLUTION_FILTER_BIAS_EXT"/> >+ <enum name="GL_CONVOLUTION_FILTER_SCALE"/> >+ <enum name="GL_CONVOLUTION_FILTER_SCALE_EXT"/> >+ </group> >+ >+ <group name="ConvolutionTargetEXT"> >+ <enum name="GL_CONVOLUTION_1D"/> >+ <enum name="GL_CONVOLUTION_1D_EXT"/> >+ <enum name="GL_CONVOLUTION_2D"/> >+ <enum name="GL_CONVOLUTION_2D_EXT"/> >+ </group> >+ >+ <group name="CullFaceMode"> >+ <enum name="GL_BACK"/> >+ <enum name="GL_FRONT"/> >+ <enum name="GL_FRONT_AND_BACK"/> >+ </group> >+ >+ <group name="DataType" comment="See enums block below"/> >+ >+ <group name="DepthFunction"> >+ <enum name="GL_ALWAYS"/> >+ <enum name="GL_EQUAL"/> >+ <enum name="GL_GEQUAL"/> >+ <enum name="GL_GREATER"/> >+ <enum name="GL_LEQUAL"/> >+ <enum name="GL_LESS"/> >+ <enum name="GL_NEVER"/> >+ <enum name="GL_NOTEQUAL"/> >+ </group> >+ >+ <group name="DrawBufferMode"> >+ <enum name="GL_AUX0"/> >+ <enum name="GL_AUX1"/> >+ <enum name="GL_AUX2"/> >+ <enum name="GL_AUX3"/> >+ <enum name="GL_BACK"/> >+ <enum name="GL_BACK_LEFT"/> >+ <enum name="GL_BACK_RIGHT"/> >+ <enum name="GL_FRONT"/> >+ <enum name="GL_FRONT_AND_BACK"/> >+ <enum name="GL_FRONT_LEFT"/> >+ <enum name="GL_FRONT_RIGHT"/> >+ <enum name="GL_LEFT"/> >+ <enum name="GL_NONE"/> >+ <enum name="GL_NONE_OES"/> >+ <enum name="GL_RIGHT"/> >+ </group> >+ >+ <group name="DrawElementsType"> >+ <enum name="GL_UNSIGNED_BYTE"/> >+ <enum name="GL_UNSIGNED_SHORT"/> >+ <enum name="GL_UNSIGNED_INT"/> >+ </group> >+ >+ <group name="EnableCap"> >+ <enum name="GL_ALPHA_TEST"/> >+ <enum name="GL_ASYNC_DRAW_PIXELS_SGIX"/> >+ <enum name="GL_ASYNC_HISTOGRAM_SGIX"/> >+ <enum name="GL_ASYNC_READ_PIXELS_SGIX"/> >+ <enum name="GL_ASYNC_TEX_IMAGE_SGIX"/> >+ <enum name="GL_AUTO_NORMAL"/> >+ <enum name="GL_BLEND"/> >+ <enum name="GL_CALLIGRAPHIC_FRAGMENT_SGIX"/> >+ <enum name="GL_CLIP_PLANE0"/> >+ <enum name="GL_CLIP_PLANE1"/> >+ <enum name="GL_CLIP_PLANE2"/> >+ <enum name="GL_CLIP_PLANE3"/> >+ <enum name="GL_CLIP_PLANE4"/> >+ <enum name="GL_CLIP_PLANE5"/> >+ <enum name="GL_COLOR_ARRAY"/> >+ <enum name="GL_COLOR_LOGIC_OP"/> >+ <enum name="GL_COLOR_MATERIAL"/> >+ <enum name="GL_COLOR_TABLE_SGI"/> >+ <enum name="GL_CONVOLUTION_1D_EXT"/> >+ <enum name="GL_CONVOLUTION_2D_EXT"/> >+ <enum name="GL_CULL_FACE"/> >+ <enum name="GL_DEPTH_TEST"/> >+ <enum name="GL_DITHER"/> >+ <enum name="GL_EDGE_FLAG_ARRAY"/> >+ <enum name="GL_FOG"/> >+ <enum name="GL_FOG_OFFSET_SGIX"/> >+ <enum name="GL_FRAGMENT_COLOR_MATERIAL_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT0_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT1_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT2_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT3_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT4_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT5_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT6_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT7_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHTING_SGIX"/> >+ <enum name="GL_FRAMEZOOM_SGIX"/> >+ <enum name="GL_HISTOGRAM_EXT"/> >+ <enum name="GL_INDEX_ARRAY"/> >+ <enum name="GL_INDEX_LOGIC_OP"/> >+ <enum name="GL_INTERLACE_SGIX"/> >+ <enum name="GL_IR_INSTRUMENT1_SGIX"/> >+ <enum name="GL_LIGHT0"/> >+ <enum name="GL_LIGHT1"/> >+ <enum name="GL_LIGHT2"/> >+ <enum name="GL_LIGHT3"/> >+ <enum name="GL_LIGHT4"/> >+ <enum name="GL_LIGHT5"/> >+ <enum name="GL_LIGHT6"/> >+ <enum name="GL_LIGHT7"/> >+ <enum name="GL_LIGHTING"/> >+ <enum name="GL_LINE_SMOOTH"/> >+ <enum name="GL_LINE_STIPPLE"/> >+ <enum name="GL_MAP1_COLOR_4"/> >+ <enum name="GL_MAP1_INDEX"/> >+ <enum name="GL_MAP1_NORMAL"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_1"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_2"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_3"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_4"/> >+ <enum name="GL_MAP1_VERTEX_3"/> >+ <enum name="GL_MAP1_VERTEX_4"/> >+ <enum name="GL_MAP2_COLOR_4"/> >+ <enum name="GL_MAP2_INDEX"/> >+ <enum name="GL_MAP2_NORMAL"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_1"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_2"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_3"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_4"/> >+ <enum name="GL_MAP2_VERTEX_3"/> >+ <enum name="GL_MAP2_VERTEX_4"/> >+ <enum name="GL_MINMAX_EXT"/> >+ <enum name="GL_MULTISAMPLE_SGIS"/> >+ <enum name="GL_NORMALIZE"/> >+ <enum name="GL_NORMAL_ARRAY"/> >+ <enum name="GL_PIXEL_TEXTURE_SGIS"/> >+ <enum name="GL_PIXEL_TEX_GEN_SGIX"/> >+ <enum name="GL_POINT_SMOOTH"/> >+ <enum name="GL_POLYGON_OFFSET_FILL"/> >+ <enum name="GL_POLYGON_OFFSET_LINE"/> >+ <enum name="GL_POLYGON_OFFSET_POINT"/> >+ <enum name="GL_POLYGON_SMOOTH"/> >+ <enum name="GL_POLYGON_STIPPLE"/> >+ <enum name="GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI"/> >+ <enum name="GL_POST_CONVOLUTION_COLOR_TABLE_SGI"/> >+ <enum name="GL_REFERENCE_PLANE_SGIX"/> >+ <enum name="GL_RESCALE_NORMAL_EXT"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_MASK_SGIS"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_ONE_SGIS"/> >+ <enum name="GL_SAMPLE_MASK_SGIS"/> >+ <enum name="GL_SCISSOR_TEST"/> >+ <enum name="GL_SEPARABLE_2D_EXT"/> >+ <enum name="GL_SHARED_TEXTURE_PALETTE_EXT"/> >+ <enum name="GL_SPRITE_SGIX"/> >+ <enum name="GL_STENCIL_TEST"/> >+ <enum name="GL_TEXTURE_1D"/> >+ <enum name="GL_TEXTURE_2D"/> >+ <enum name="GL_TEXTURE_3D_EXT"/> >+ <enum name="GL_TEXTURE_4D_SGIS"/> >+ <enum name="GL_TEXTURE_COLOR_TABLE_SGI"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY"/> >+ <enum name="GL_TEXTURE_GEN_Q"/> >+ <enum name="GL_TEXTURE_GEN_R"/> >+ <enum name="GL_TEXTURE_GEN_S"/> >+ <enum name="GL_TEXTURE_GEN_T"/> >+ <enum name="GL_VERTEX_ARRAY"/> >+ </group> >+ >+ <group name="ErrorCode"> >+ <enum name="GL_INVALID_ENUM"/> >+ <enum name="GL_INVALID_FRAMEBUFFER_OPERATION"/> >+ <enum name="GL_INVALID_FRAMEBUFFER_OPERATION_EXT"/> >+ <enum name="GL_INVALID_FRAMEBUFFER_OPERATION_OES"/> >+ <enum name="GL_INVALID_OPERATION"/> >+ <enum name="GL_INVALID_VALUE"/> >+ <enum name="GL_NO_ERROR"/> >+ <enum name="GL_OUT_OF_MEMORY"/> >+ <enum name="GL_STACK_OVERFLOW"/> >+ <enum name="GL_STACK_UNDERFLOW"/> >+ <enum name="GL_TABLE_TOO_LARGE"/> >+ <enum name="GL_TABLE_TOO_LARGE_EXT"/> >+ <enum name="GL_TEXTURE_TOO_LARGE_EXT"/> >+ </group> >+ >+ <group name="ExternalHandleType"> >+ <enum name="GL_HANDLE_TYPE_OPAQUE_FD_EXT"/> >+ <enum name="GL_HANDLE_TYPE_OPAQUE_WIN32_EXT"/> >+ <enum name="GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT"/> >+ <enum name="GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT"/> >+ <enum name="GL_HANDLE_TYPE_D3D12_RESOURCE_EXT"/> >+ <enum name="GL_HANDLE_TYPE_D3D11_IMAGE_EXT"/> >+ <enum name="GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT"/> >+ <enum name="GL_HANDLE_TYPE_D3D12_FENCE_EXT"/> >+ </group> >+ >+ <group name="FeedbackType"> >+ <enum name="GL_2D"/> >+ <enum name="GL_3D"/> >+ <enum name="GL_3D_COLOR"/> >+ <enum name="GL_3D_COLOR_TEXTURE"/> >+ <enum name="GL_4D_COLOR_TEXTURE"/> >+ </group> >+ >+ <group name="FeedBackToken"> >+ <enum name="GL_BITMAP_TOKEN"/> >+ <enum name="GL_COPY_PIXEL_TOKEN"/> >+ <enum name="GL_DRAW_PIXEL_TOKEN"/> >+ <enum name="GL_LINE_RESET_TOKEN"/> >+ <enum name="GL_LINE_TOKEN"/> >+ <enum name="GL_PASS_THROUGH_TOKEN"/> >+ <enum name="GL_POINT_TOKEN"/> >+ <enum name="GL_POLYGON_TOKEN"/> >+ </group> >+ >+ <group name="FfdMaskSGIX" comment="See enums section below. Was SGIXFfdMask"/> >+ >+ <group name="FfdTargetSGIX"> >+ <enum name="GL_GEOMETRY_DEFORMATION_SGIX"/> >+ <enum name="GL_TEXTURE_DEFORMATION_SGIX"/> >+ </group> >+ >+ <group name="FogCoordinatePointerType"> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_DOUBLE"/> >+ </group> >+ >+ <group name="FogMode"> >+ <enum name="GL_EXP"/> >+ <enum name="GL_EXP2"/> >+ <enum name="GL_FOG_FUNC_SGIS"/> >+ <enum name="GL_LINEAR"/> >+ </group> >+ >+ <group name="FogParameter"> >+ <enum name="GL_FOG_COLOR"/> >+ <enum name="GL_FOG_DENSITY"/> >+ <enum name="GL_FOG_END"/> >+ <enum name="GL_FOG_INDEX"/> >+ <enum name="GL_FOG_MODE"/> >+ <enum name="GL_FOG_OFFSET_VALUE_SGIX"/> >+ <enum name="GL_FOG_START"/> >+ </group> >+ >+ <group name="FogPointerTypeEXT"> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_DOUBLE"/> >+ </group> >+ >+ <group name="FogPointerTypeIBM"> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_DOUBLE"/> >+ </group> >+ >+ <group name="FragmentLightModelParameterSGIX"> >+ <enum name="GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX"/> >+ </group> >+ >+ <group name="FramebufferFetchNoncoherent"> >+ <enum name="GL_FRAMEBUFFER_FETCH_NONCOHERENT_QCOM"/> >+ </group> >+ >+ <group name="FrontFaceDirection"> >+ <enum name="GL_CCW"/> >+ <enum name="GL_CW"/> >+ </group> >+ >+ <group name="GetColorTableParameterPNameSGI"> >+ <enum name="GL_COLOR_TABLE_ALPHA_SIZE_SGI"/> >+ <enum name="GL_COLOR_TABLE_BIAS_SGI"/> >+ <enum name="GL_COLOR_TABLE_BLUE_SIZE_SGI"/> >+ <enum name="GL_COLOR_TABLE_FORMAT_SGI"/> >+ <enum name="GL_COLOR_TABLE_GREEN_SIZE_SGI"/> >+ <enum name="GL_COLOR_TABLE_INTENSITY_SIZE_SGI"/> >+ <enum name="GL_COLOR_TABLE_LUMINANCE_SIZE_SGI"/> >+ <enum name="GL_COLOR_TABLE_RED_SIZE_SGI"/> >+ <enum name="GL_COLOR_TABLE_SCALE_SGI"/> >+ <enum name="GL_COLOR_TABLE_WIDTH_SGI"/> >+ <enum name="GL_COLOR_TABLE_BIAS"/> >+ <enum name="GL_COLOR_TABLE_SCALE"/> >+ <enum name="GL_COLOR_TABLE_FORMAT"/> >+ <enum name="GL_COLOR_TABLE_WIDTH"/> >+ <enum name="GL_COLOR_TABLE_RED_SIZE"/> >+ <enum name="GL_COLOR_TABLE_GREEN_SIZE"/> >+ <enum name="GL_COLOR_TABLE_BLUE_SIZE"/> >+ <enum name="GL_COLOR_TABLE_ALPHA_SIZE"/> >+ <enum name="GL_COLOR_TABLE_LUMINANCE_SIZE"/> >+ <enum name="GL_COLOR_TABLE_INTENSITY_SIZE"/> >+ </group> >+ >+ <group name="GetConvolutionParameter"> >+ <enum name="GL_CONVOLUTION_BORDER_MODE_EXT"/> >+ <enum name="GL_CONVOLUTION_FILTER_BIAS_EXT"/> >+ <enum name="GL_CONVOLUTION_FILTER_SCALE_EXT"/> >+ <enum name="GL_CONVOLUTION_FORMAT_EXT"/> >+ <enum name="GL_CONVOLUTION_HEIGHT_EXT"/> >+ <enum name="GL_CONVOLUTION_WIDTH_EXT"/> >+ <enum name="GL_MAX_CONVOLUTION_HEIGHT_EXT"/> >+ <enum name="GL_MAX_CONVOLUTION_WIDTH_EXT"/> >+ <enum name="GL_CONVOLUTION_BORDER_MODE"/> >+ <enum name="GL_CONVOLUTION_BORDER_COLOR"/> >+ <enum name="GL_CONVOLUTION_FILTER_SCALE"/> >+ <enum name="GL_CONVOLUTION_FILTER_BIAS"/> >+ <enum name="GL_CONVOLUTION_FORMAT"/> >+ <enum name="GL_CONVOLUTION_WIDTH"/> >+ <enum name="GL_CONVOLUTION_HEIGHT"/> >+ <enum name="GL_MAX_CONVOLUTION_WIDTH"/> >+ <enum name="GL_MAX_CONVOLUTION_HEIGHT"/> >+ </group> >+ >+ <group name="GetHistogramParameterPNameEXT"> >+ <enum name="GL_HISTOGRAM_ALPHA_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_BLUE_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_FORMAT_EXT"/> >+ <enum name="GL_HISTOGRAM_GREEN_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_LUMINANCE_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_RED_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_SINK_EXT"/> >+ <enum name="GL_HISTOGRAM_WIDTH_EXT"/> >+ <enum name="GL_HISTOGRAM_WIDTH"/> >+ <enum name="GL_HISTOGRAM_FORMAT"/> >+ <enum name="GL_HISTOGRAM_RED_SIZE"/> >+ <enum name="GL_HISTOGRAM_GREEN_SIZE"/> >+ <enum name="GL_HISTOGRAM_BLUE_SIZE"/> >+ <enum name="GL_HISTOGRAM_ALPHA_SIZE"/> >+ <enum name="GL_HISTOGRAM_LUMINANCE_SIZE"/> >+ <enum name="GL_HISTOGRAM_SINK"/> >+ <enum name="GL_HISTOGRAM_ALPHA_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_BLUE_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_FORMAT_EXT"/> >+ <enum name="GL_HISTOGRAM_GREEN_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_LUMINANCE_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_RED_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_SINK_EXT"/> >+ <enum name="GL_HISTOGRAM_WIDTH_EXT"/> >+ </group> >+ >+ <group name="GetMapQuery"> >+ <enum name="GL_COEFF"/> >+ <enum name="GL_DOMAIN"/> >+ <enum name="GL_ORDER"/> >+ </group> >+ >+ <group name="GetMinmaxParameterPNameEXT"> >+ <enum name="GL_MINMAX_FORMAT"/> >+ <enum name="GL_MINMAX_FORMAT_EXT"/> >+ <enum name="GL_MINMAX_SINK"/> >+ <enum name="GL_MINMAX_SINK_EXT"/> >+ <enum name="GL_MINMAX_FORMAT"/> >+ <enum name="GL_MINMAX_SINK"/> >+ </group> >+ >+ <group name="GetPixelMap"> >+ <enum name="GL_PIXEL_MAP_A_TO_A"/> >+ <enum name="GL_PIXEL_MAP_B_TO_B"/> >+ <enum name="GL_PIXEL_MAP_G_TO_G"/> >+ <enum name="GL_PIXEL_MAP_I_TO_A"/> >+ <enum name="GL_PIXEL_MAP_I_TO_B"/> >+ <enum name="GL_PIXEL_MAP_I_TO_G"/> >+ <enum name="GL_PIXEL_MAP_I_TO_I"/> >+ <enum name="GL_PIXEL_MAP_I_TO_R"/> >+ <enum name="GL_PIXEL_MAP_R_TO_R"/> >+ <enum name="GL_PIXEL_MAP_S_TO_S"/> >+ </group> >+ >+ <group name="GetPName"> >+ <enum name="GL_ACCUM_ALPHA_BITS"/> >+ <enum name="GL_ACCUM_BLUE_BITS"/> >+ <enum name="GL_ACCUM_CLEAR_VALUE"/> >+ <enum name="GL_ACCUM_GREEN_BITS"/> >+ <enum name="GL_ACCUM_RED_BITS"/> >+ <enum name="GL_ALIASED_LINE_WIDTH_RANGE"/> >+ <enum name="GL_ALIASED_POINT_SIZE_RANGE"/> >+ <enum name="GL_ALPHA_BIAS"/> >+ <enum name="GL_ALPHA_BITS"/> >+ <enum name="GL_ALPHA_SCALE"/> >+ <enum name="GL_ALPHA_TEST"/> >+ <enum name="GL_ALPHA_TEST_FUNC"/> >+ <enum name="GL_ALPHA_TEST_FUNC_QCOM"/> >+ <enum name="GL_ALPHA_TEST_QCOM"/> >+ <enum name="GL_ALPHA_TEST_REF"/> >+ <enum name="GL_ALPHA_TEST_REF_QCOM"/> >+ <enum name="GL_ASYNC_DRAW_PIXELS_SGIX"/> >+ <enum name="GL_ASYNC_HISTOGRAM_SGIX"/> >+ <enum name="GL_ASYNC_MARKER_SGIX"/> >+ <enum name="GL_ASYNC_READ_PIXELS_SGIX"/> >+ <enum name="GL_ASYNC_TEX_IMAGE_SGIX"/> >+ <enum name="GL_ATTRIB_STACK_DEPTH"/> >+ <enum name="GL_AUTO_NORMAL"/> >+ <enum name="GL_AUX_BUFFERS"/> >+ <enum name="GL_BLEND"/> >+ <enum name="GL_BLEND_COLOR_EXT"/> >+ <enum name="GL_BLEND_DST"/> >+ <enum name="GL_BLEND_EQUATION_EXT"/> >+ <enum name="GL_BLEND_SRC"/> >+ <enum name="GL_BLUE_BIAS"/> >+ <enum name="GL_BLUE_BITS"/> >+ <enum name="GL_BLUE_SCALE"/> >+ <enum name="GL_CALLIGRAPHIC_FRAGMENT_SGIX"/> >+ <enum name="GL_CLIENT_ATTRIB_STACK_DEPTH"/> >+ <enum name="GL_CLIP_PLANE0"/> >+ <enum name="GL_CLIP_PLANE1"/> >+ <enum name="GL_CLIP_PLANE2"/> >+ <enum name="GL_CLIP_PLANE3"/> >+ <enum name="GL_CLIP_PLANE4"/> >+ <enum name="GL_CLIP_PLANE5"/> >+ <enum name="GL_COLOR_ARRAY"/> >+ <enum name="GL_COLOR_ARRAY_COUNT_EXT"/> >+ <enum name="GL_COLOR_ARRAY_SIZE"/> >+ <enum name="GL_COLOR_ARRAY_STRIDE"/> >+ <enum name="GL_COLOR_ARRAY_TYPE"/> >+ <enum name="GL_COLOR_CLEAR_VALUE"/> >+ <enum name="GL_COLOR_LOGIC_OP"/> >+ <enum name="GL_COLOR_MATERIAL"/> >+ <enum name="GL_COLOR_MATERIAL_FACE"/> >+ <enum name="GL_COLOR_MATERIAL_PARAMETER"/> >+ <enum name="GL_COLOR_MATRIX_SGI"/> >+ <enum name="GL_COLOR_MATRIX_STACK_DEPTH_SGI"/> >+ <enum name="GL_COLOR_TABLE_SGI"/> >+ <enum name="GL_COLOR_WRITEMASK"/> >+ <enum name="GL_CONVOLUTION_1D_EXT"/> >+ <enum name="GL_CONVOLUTION_2D_EXT"/> >+ <enum name="GL_CONVOLUTION_HINT_SGIX"/> >+ <enum name="GL_CULL_FACE"/> >+ <enum name="GL_CULL_FACE_MODE"/> >+ <enum name="GL_CURRENT_COLOR"/> >+ <enum name="GL_CURRENT_INDEX"/> >+ <enum name="GL_CURRENT_NORMAL"/> >+ <enum name="GL_CURRENT_RASTER_COLOR"/> >+ <enum name="GL_CURRENT_RASTER_DISTANCE"/> >+ <enum name="GL_CURRENT_RASTER_INDEX"/> >+ <enum name="GL_CURRENT_RASTER_POSITION"/> >+ <enum name="GL_CURRENT_RASTER_POSITION_VALID"/> >+ <enum name="GL_CURRENT_RASTER_TEXTURE_COORDS"/> >+ <enum name="GL_CURRENT_TEXTURE_COORDS"/> >+ <enum name="GL_DEFORMATIONS_MASK_SGIX"/> >+ <enum name="GL_DEPTH_BIAS"/> >+ <enum name="GL_DEPTH_BITS"/> >+ <enum name="GL_DEPTH_CLEAR_VALUE"/> >+ <enum name="GL_DEPTH_FUNC"/> >+ <enum name="GL_DEPTH_RANGE"/> >+ <enum name="GL_DEPTH_SCALE"/> >+ <enum name="GL_DEPTH_TEST"/> >+ <enum name="GL_DEPTH_WRITEMASK"/> >+ <enum name="GL_DETAIL_TEXTURE_2D_BINDING_SGIS"/> >+ <enum name="GL_DEVICE_LUID_EXT"/> >+ <enum name="GL_DEVICE_NODE_MASK_EXT"/> >+ <enum name="GL_DEVICE_UUID_EXT"/> >+ <enum name="GL_DISTANCE_ATTENUATION_SGIS"/> >+ <enum name="GL_DITHER"/> >+ <enum name="GL_DOUBLEBUFFER"/> >+ <enum name="GL_DRAW_BUFFER"/> >+ <enum name="GL_DRAW_BUFFER_EXT"/> >+ <enum name="GL_DRIVER_UUID_EXT"/> >+ <enum name="GL_EDGE_FLAG"/> >+ <enum name="GL_EDGE_FLAG_ARRAY"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_COUNT_EXT"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_STRIDE"/> >+ <enum name="GL_FEEDBACK_BUFFER_SIZE"/> >+ <enum name="GL_FEEDBACK_BUFFER_TYPE"/> >+ <enum name="GL_FOG"/> >+ <enum name="GL_FOG_COLOR"/> >+ <enum name="GL_FOG_DENSITY"/> >+ <enum name="GL_FOG_END"/> >+ <enum name="GL_FOG_FUNC_POINTS_SGIS"/> >+ <enum name="GL_FOG_HINT"/> >+ <enum name="GL_FOG_INDEX"/> >+ <enum name="GL_FOG_MODE"/> >+ <enum name="GL_FOG_OFFSET_SGIX"/> >+ <enum name="GL_FOG_OFFSET_VALUE_SGIX"/> >+ <enum name="GL_FOG_START"/> >+ <enum name="GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX"/> >+ <enum name="GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX"/> >+ <enum name="GL_FRAGMENT_COLOR_MATERIAL_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT0_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHTING_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX"/> >+ <enum name="GL_FRAMEZOOM_FACTOR_SGIX"/> >+ <enum name="GL_FRAMEZOOM_SGIX"/> >+ <enum name="GL_FRONT_FACE"/> >+ <enum name="GL_GENERATE_MIPMAP_HINT_SGIS"/> >+ <enum name="GL_GREEN_BIAS"/> >+ <enum name="GL_GREEN_BITS"/> >+ <enum name="GL_GREEN_SCALE"/> >+ <enum name="GL_HISTOGRAM_EXT"/> >+ <enum name="GL_INDEX_ARRAY"/> >+ <enum name="GL_INDEX_ARRAY_COUNT_EXT"/> >+ <enum name="GL_INDEX_ARRAY_STRIDE"/> >+ <enum name="GL_INDEX_ARRAY_TYPE"/> >+ <enum name="GL_INDEX_BITS"/> >+ <enum name="GL_INDEX_CLEAR_VALUE"/> >+ <enum name="GL_INDEX_LOGIC_OP"/> >+ <enum name="GL_INDEX_MODE"/> >+ <enum name="GL_INDEX_OFFSET"/> >+ <enum name="GL_INDEX_SHIFT"/> >+ <enum name="GL_INDEX_WRITEMASK"/> >+ <enum name="GL_INSTRUMENT_MEASUREMENTS_SGIX"/> >+ <enum name="GL_INTERLACE_SGIX"/> >+ <enum name="GL_IR_INSTRUMENT1_SGIX"/> >+ <enum name="GL_LIGHT0"/> >+ <enum name="GL_LIGHT1"/> >+ <enum name="GL_LIGHT2"/> >+ <enum name="GL_LIGHT3"/> >+ <enum name="GL_LIGHT4"/> >+ <enum name="GL_LIGHT5"/> >+ <enum name="GL_LIGHT6"/> >+ <enum name="GL_LIGHT7"/> >+ <enum name="GL_LIGHTING"/> >+ <enum name="GL_LIGHT_ENV_MODE_SGIX"/> >+ <enum name="GL_LIGHT_MODEL_AMBIENT"/> >+ <enum name="GL_LIGHT_MODEL_COLOR_CONTROL"/> >+ <enum name="GL_LIGHT_MODEL_LOCAL_VIEWER"/> >+ <enum name="GL_LIGHT_MODEL_TWO_SIDE"/> >+ <enum name="GL_LINE_SMOOTH"/> >+ <enum name="GL_LINE_SMOOTH_HINT"/> >+ <enum name="GL_LINE_STIPPLE"/> >+ <enum name="GL_LINE_STIPPLE_PATTERN"/> >+ <enum name="GL_LINE_STIPPLE_REPEAT"/> >+ <enum name="GL_LINE_WIDTH"/> >+ <enum name="GL_LINE_WIDTH_GRANULARITY"/> >+ <enum name="GL_LINE_WIDTH_RANGE"/> >+ <enum name="GL_LIST_BASE"/> >+ <enum name="GL_LIST_INDEX"/> >+ <enum name="GL_LIST_MODE"/> >+ <enum name="GL_LOGIC_OP"/> >+ <enum name="GL_LOGIC_OP_MODE"/> >+ <enum name="GL_MAP1_COLOR_4"/> >+ <enum name="GL_MAP1_GRID_DOMAIN"/> >+ <enum name="GL_MAP1_GRID_SEGMENTS"/> >+ <enum name="GL_MAP1_INDEX"/> >+ <enum name="GL_MAP1_NORMAL"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_1"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_2"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_3"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_4"/> >+ <enum name="GL_MAP1_VERTEX_3"/> >+ <enum name="GL_MAP1_VERTEX_4"/> >+ <enum name="GL_MAP2_COLOR_4"/> >+ <enum name="GL_MAP2_GRID_DOMAIN"/> >+ <enum name="GL_MAP2_GRID_SEGMENTS"/> >+ <enum name="GL_MAP2_INDEX"/> >+ <enum name="GL_MAP2_NORMAL"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_1"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_2"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_3"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_4"/> >+ <enum name="GL_MAP2_VERTEX_3"/> >+ <enum name="GL_MAP2_VERTEX_4"/> >+ <enum name="GL_MAP_COLOR"/> >+ <enum name="GL_MAP_STENCIL"/> >+ <enum name="GL_MATRIX_MODE"/> >+ <enum name="GL_MAX_3D_TEXTURE_SIZE_EXT"/> >+ <enum name="GL_MAX_4D_TEXTURE_SIZE_SGIS"/> >+ <enum name="GL_MAX_ACTIVE_LIGHTS_SGIX"/> >+ <enum name="GL_MAX_ASYNC_DRAW_PIXELS_SGIX"/> >+ <enum name="GL_MAX_ASYNC_HISTOGRAM_SGIX"/> >+ <enum name="GL_MAX_ASYNC_READ_PIXELS_SGIX"/> >+ <enum name="GL_MAX_ASYNC_TEX_IMAGE_SGIX"/> >+ <enum name="GL_MAX_ATTRIB_STACK_DEPTH"/> >+ <enum name="GL_MAX_CLIENT_ATTRIB_STACK_DEPTH"/> >+ <enum name="GL_MAX_CLIPMAP_DEPTH_SGIX"/> >+ <enum name="GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX"/> >+ <enum name="GL_MAX_CLIP_DISTANCES"/> >+ <enum name="GL_MAX_CLIP_PLANES"/> >+ <enum name="GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI"/> >+ <enum name="GL_MAX_EVAL_ORDER"/> >+ <enum name="GL_MAX_FOG_FUNC_POINTS_SGIS"/> >+ <enum name="GL_MAX_FRAGMENT_LIGHTS_SGIX"/> >+ <enum name="GL_MAX_FRAMEZOOM_FACTOR_SGIX"/> >+ <enum name="GL_MAX_LIGHTS"/> >+ <enum name="GL_MAX_LIST_NESTING"/> >+ <enum name="GL_MAX_MODELVIEW_STACK_DEPTH"/> >+ <enum name="GL_MAX_NAME_STACK_DEPTH"/> >+ <enum name="GL_MAX_PIXEL_MAP_TABLE"/> >+ <enum name="GL_MAX_PROJECTION_STACK_DEPTH"/> >+ <enum name="GL_MAX_TEXTURE_SIZE"/> >+ <enum name="GL_MAX_TEXTURE_STACK_DEPTH"/> >+ <enum name="GL_MAX_VIEWPORT_DIMS"/> >+ <enum name="GL_MINMAX_EXT"/> >+ <enum name="GL_MODELVIEW0_MATRIX_EXT"/> >+ <enum name="GL_MODELVIEW0_STACK_DEPTH_EXT"/> >+ <enum name="GL_MODELVIEW_MATRIX"/> >+ <enum name="GL_MODELVIEW_STACK_DEPTH"/> >+ <enum name="GL_MULTISAMPLE_SGIS"/> >+ <enum name="GL_NAME_STACK_DEPTH"/> >+ <enum name="GL_NORMALIZE"/> >+ <enum name="GL_NORMAL_ARRAY"/> >+ <enum name="GL_NORMAL_ARRAY_COUNT_EXT"/> >+ <enum name="GL_NORMAL_ARRAY_STRIDE"/> >+ <enum name="GL_NORMAL_ARRAY_TYPE"/> >+ <enum name="GL_NUM_DEVICE_UUIDS_EXT"/> >+ <enum name="GL_PACK_ALIGNMENT"/> >+ <enum name="GL_PACK_CMYK_HINT_EXT"/> >+ <enum name="GL_PACK_IMAGE_DEPTH_SGIS"/> >+ <enum name="GL_PACK_IMAGE_HEIGHT_EXT"/> >+ <enum name="GL_PACK_LSB_FIRST"/> >+ <enum name="GL_PACK_RESAMPLE_SGIX"/> >+ <enum name="GL_PACK_ROW_LENGTH"/> >+ <enum name="GL_PACK_SKIP_IMAGES_EXT"/> >+ <enum name="GL_PACK_SKIP_PIXELS"/> >+ <enum name="GL_PACK_SKIP_ROWS"/> >+ <enum name="GL_PACK_SKIP_VOLUMES_SGIS"/> >+ <enum name="GL_PACK_SUBSAMPLE_RATE_SGIX"/> >+ <enum name="GL_PACK_SWAP_BYTES"/> >+ <enum name="GL_PERSPECTIVE_CORRECTION_HINT"/> >+ <enum name="GL_PIXEL_MAP_A_TO_A_SIZE"/> >+ <enum name="GL_PIXEL_MAP_B_TO_B_SIZE"/> >+ <enum name="GL_PIXEL_MAP_G_TO_G_SIZE"/> >+ <enum name="GL_PIXEL_MAP_I_TO_A_SIZE"/> >+ <enum name="GL_PIXEL_MAP_I_TO_B_SIZE"/> >+ <enum name="GL_PIXEL_MAP_I_TO_G_SIZE"/> >+ <enum name="GL_PIXEL_MAP_I_TO_I_SIZE"/> >+ <enum name="GL_PIXEL_MAP_I_TO_R_SIZE"/> >+ <enum name="GL_PIXEL_MAP_R_TO_R_SIZE"/> >+ <enum name="GL_PIXEL_MAP_S_TO_S_SIZE"/> >+ <enum name="GL_PIXEL_TEXTURE_SGIS"/> >+ <enum name="GL_PIXEL_TEX_GEN_MODE_SGIX"/> >+ <enum name="GL_PIXEL_TEX_GEN_SGIX"/> >+ <enum name="GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX"/> >+ <enum name="GL_PIXEL_TILE_CACHE_INCREMENT_SGIX"/> >+ <enum name="GL_PIXEL_TILE_CACHE_SIZE_SGIX"/> >+ <enum name="GL_PIXEL_TILE_GRID_DEPTH_SGIX"/> >+ <enum name="GL_PIXEL_TILE_GRID_HEIGHT_SGIX"/> >+ <enum name="GL_PIXEL_TILE_GRID_WIDTH_SGIX"/> >+ <enum name="GL_PIXEL_TILE_HEIGHT_SGIX"/> >+ <enum name="GL_PIXEL_TILE_WIDTH_SGIX"/> >+ <enum name="GL_POINT_FADE_THRESHOLD_SIZE_SGIS"/> >+ <enum name="GL_POINT_SIZE"/> >+ <enum name="GL_POINT_SIZE_GRANULARITY"/> >+ <enum name="GL_POINT_SIZE_MAX_SGIS"/> >+ <enum name="GL_POINT_SIZE_MIN_SGIS"/> >+ <enum name="GL_POINT_SIZE_RANGE"/> >+ <enum name="GL_POINT_SMOOTH"/> >+ <enum name="GL_POINT_SMOOTH_HINT"/> >+ <enum name="GL_POLYGON_MODE"/> >+ <enum name="GL_POLYGON_OFFSET_BIAS_EXT"/> >+ <enum name="GL_POLYGON_OFFSET_FACTOR"/> >+ <enum name="GL_POLYGON_OFFSET_FILL"/> >+ <enum name="GL_POLYGON_OFFSET_LINE"/> >+ <enum name="GL_POLYGON_OFFSET_POINT"/> >+ <enum name="GL_POLYGON_OFFSET_UNITS"/> >+ <enum name="GL_POLYGON_SMOOTH"/> >+ <enum name="GL_POLYGON_SMOOTH_HINT"/> >+ <enum name="GL_POLYGON_STIPPLE"/> >+ <enum name="GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_RED_BIAS_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_RED_SCALE_SGI"/> >+ <enum name="GL_POST_CONVOLUTION_ALPHA_BIAS_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_ALPHA_SCALE_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_BLUE_BIAS_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_BLUE_SCALE_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_COLOR_TABLE_SGI"/> >+ <enum name="GL_POST_CONVOLUTION_GREEN_BIAS_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_GREEN_SCALE_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_RED_BIAS_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_RED_SCALE_EXT"/> >+ <enum name="GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX"/> >+ <enum name="GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX"/> >+ <enum name="GL_PROJECTION_MATRIX"/> >+ <enum name="GL_PROJECTION_STACK_DEPTH"/> >+ <enum name="GL_READ_BUFFER"/> >+ <enum name="GL_READ_BUFFER_EXT"/> >+ <enum name="GL_READ_BUFFER_NV"/> >+ <enum name="GL_RED_BIAS"/> >+ <enum name="GL_RED_BITS"/> >+ <enum name="GL_RED_SCALE"/> >+ <enum name="GL_REFERENCE_PLANE_EQUATION_SGIX"/> >+ <enum name="GL_REFERENCE_PLANE_SGIX"/> >+ <enum name="GL_RENDER_MODE"/> >+ <enum name="GL_RESCALE_NORMAL_EXT"/> >+ <enum name="GL_RGBA_MODE"/> >+ <enum name="GL_SAMPLES_SGIS"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_MASK_SGIS"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_ONE_SGIS"/> >+ <enum name="GL_SAMPLE_BUFFERS_SGIS"/> >+ <enum name="GL_SAMPLE_MASK_INVERT_SGIS"/> >+ <enum name="GL_SAMPLE_MASK_SGIS"/> >+ <enum name="GL_SAMPLE_MASK_VALUE_SGIS"/> >+ <enum name="GL_SAMPLE_PATTERN_SGIS"/> >+ <enum name="GL_SCISSOR_BOX"/> >+ <enum name="GL_SCISSOR_TEST"/> >+ <enum name="GL_SELECTION_BUFFER_SIZE"/> >+ <enum name="GL_SEPARABLE_2D_EXT"/> >+ <enum name="GL_SHADE_MODEL"/> >+ <enum name="GL_SHARED_TEXTURE_PALETTE_EXT"/> >+ <enum name="GL_SMOOTH_LINE_WIDTH_GRANULARITY"/> >+ <enum name="GL_SMOOTH_LINE_WIDTH_RANGE"/> >+ <enum name="GL_SMOOTH_POINT_SIZE_GRANULARITY"/> >+ <enum name="GL_SMOOTH_POINT_SIZE_RANGE"/> >+ <enum name="GL_SPRITE_AXIS_SGIX"/> >+ <enum name="GL_SPRITE_MODE_SGIX"/> >+ <enum name="GL_SPRITE_SGIX"/> >+ <enum name="GL_SPRITE_TRANSLATION_SGIX"/> >+ <enum name="GL_STENCIL_BITS"/> >+ <enum name="GL_STENCIL_CLEAR_VALUE"/> >+ <enum name="GL_STENCIL_FAIL"/> >+ <enum name="GL_STENCIL_FUNC"/> >+ <enum name="GL_STENCIL_PASS_DEPTH_FAIL"/> >+ <enum name="GL_STENCIL_PASS_DEPTH_PASS"/> >+ <enum name="GL_STENCIL_REF"/> >+ <enum name="GL_STENCIL_TEST"/> >+ <enum name="GL_STENCIL_VALUE_MASK"/> >+ <enum name="GL_STENCIL_WRITEMASK"/> >+ <enum name="GL_STEREO"/> >+ <enum name="GL_SUBPIXEL_BITS"/> >+ <enum name="GL_TEXTURE_1D"/> >+ <enum name="GL_TEXTURE_2D"/> >+ <enum name="GL_TEXTURE_3D_BINDING_EXT"/> >+ <enum name="GL_TEXTURE_3D_EXT"/> >+ <enum name="GL_TEXTURE_4D_BINDING_SGIS"/> >+ <enum name="GL_TEXTURE_4D_SGIS"/> >+ <enum name="GL_TEXTURE_BINDING_1D"/> >+ <enum name="GL_TEXTURE_BINDING_2D"/> >+ <enum name="GL_TEXTURE_BINDING_3D"/> >+ <enum name="GL_TEXTURE_COLOR_TABLE_SGI"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_COUNT_EXT"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_SIZE"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_STRIDE"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_TYPE"/> >+ <enum name="GL_TEXTURE_GEN_Q"/> >+ <enum name="GL_TEXTURE_GEN_R"/> >+ <enum name="GL_TEXTURE_GEN_S"/> >+ <enum name="GL_TEXTURE_GEN_T"/> >+ <enum name="GL_TEXTURE_MATRIX"/> >+ <enum name="GL_TEXTURE_STACK_DEPTH"/> >+ <enum name="GL_UNPACK_ALIGNMENT"/> >+ <enum name="GL_UNPACK_CMYK_HINT_EXT"/> >+ <enum name="GL_UNPACK_IMAGE_DEPTH_SGIS"/> >+ <enum name="GL_UNPACK_IMAGE_HEIGHT_EXT"/> >+ <enum name="GL_UNPACK_LSB_FIRST"/> >+ <enum name="GL_UNPACK_RESAMPLE_SGIX"/> >+ <enum name="GL_UNPACK_ROW_LENGTH"/> >+ <enum name="GL_UNPACK_SKIP_IMAGES_EXT"/> >+ <enum name="GL_UNPACK_SKIP_PIXELS"/> >+ <enum name="GL_UNPACK_SKIP_ROWS"/> >+ <enum name="GL_UNPACK_SKIP_VOLUMES_SGIS"/> >+ <enum name="GL_UNPACK_SUBSAMPLE_RATE_SGIX"/> >+ <enum name="GL_UNPACK_SWAP_BYTES"/> >+ <enum name="GL_VERTEX_ARRAY"/> >+ <enum name="GL_VERTEX_ARRAY_COUNT_EXT"/> >+ <enum name="GL_VERTEX_ARRAY_SIZE"/> >+ <enum name="GL_VERTEX_ARRAY_STRIDE"/> >+ <enum name="GL_VERTEX_ARRAY_TYPE"/> >+ <enum name="GL_VERTEX_PRECLIP_HINT_SGIX"/> >+ <enum name="GL_VERTEX_PRECLIP_SGIX"/> >+ <enum name="GL_VIEWPORT"/> >+ <enum name="GL_ZOOM_X"/> >+ <enum name="GL_ZOOM_Y"/> >+ </group> >+ >+ <group name="GetPointervPName"> >+ <enum name="GL_COLOR_ARRAY_POINTER"/> >+ <enum name="GL_COLOR_ARRAY_POINTER_EXT"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_POINTER"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_POINTER_EXT"/> >+ <enum name="GL_FEEDBACK_BUFFER_POINTER"/> >+ <enum name="GL_INDEX_ARRAY_POINTER"/> >+ <enum name="GL_INDEX_ARRAY_POINTER_EXT"/> >+ <enum name="GL_INSTRUMENT_BUFFER_POINTER_SGIX"/> >+ <enum name="GL_NORMAL_ARRAY_POINTER"/> >+ <enum name="GL_NORMAL_ARRAY_POINTER_EXT"/> >+ <enum name="GL_SELECTION_BUFFER_POINTER"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_POINTER"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_POINTER_EXT"/> >+ <enum name="GL_VERTEX_ARRAY_POINTER"/> >+ <enum name="GL_VERTEX_ARRAY_POINTER_EXT"/> >+ <enum name="GL_DEBUG_CALLBACK_FUNCTION"/> >+ <enum name="GL_DEBUG_CALLBACK_USER_PARAM"/> >+ </group> >+ >+ <group name="GetTextureParameter"> >+ <enum name="GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS"/> >+ <enum name="GL_DETAIL_TEXTURE_LEVEL_SGIS"/> >+ <enum name="GL_DETAIL_TEXTURE_MODE_SGIS"/> >+ <enum name="GL_DUAL_TEXTURE_SELECT_SGIS"/> >+ <enum name="GL_GENERATE_MIPMAP_SGIS"/> >+ <enum name="GL_POST_TEXTURE_FILTER_BIAS_SGIX"/> >+ <enum name="GL_POST_TEXTURE_FILTER_SCALE_SGIX"/> >+ <enum name="GL_QUAD_TEXTURE_SELECT_SGIS"/> >+ <enum name="GL_SHADOW_AMBIENT_SGIX"/> >+ <enum name="GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS"/> >+ <enum name="GL_TEXTURE_4DSIZE_SGIS"/> >+ <enum name="GL_TEXTURE_ALPHA_SIZE"/> >+ <enum name="GL_TEXTURE_BASE_LEVEL_SGIS"/> >+ <enum name="GL_TEXTURE_BLUE_SIZE"/> >+ <enum name="GL_TEXTURE_BORDER"/> >+ <enum name="GL_TEXTURE_BORDER_COLOR"/> >+ <enum name="GL_TEXTURE_BORDER_COLOR_NV"/> >+ <enum name="GL_TEXTURE_CLIPMAP_CENTER_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_DEPTH_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_FRAME_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_OFFSET_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX"/> >+ <enum name="GL_TEXTURE_COMPARE_OPERATOR_SGIX"/> >+ <enum name="GL_TEXTURE_COMPARE_SGIX"/> >+ <enum name="GL_TEXTURE_COMPONENTS"/> >+ <enum name="GL_TEXTURE_DEPTH_EXT"/> >+ <enum name="GL_TEXTURE_FILTER4_SIZE_SGIS"/> >+ <enum name="GL_TEXTURE_GEQUAL_R_SGIX"/> >+ <enum name="GL_TEXTURE_GREEN_SIZE"/> >+ <enum name="GL_TEXTURE_HEIGHT"/> >+ <enum name="GL_TEXTURE_INTENSITY_SIZE"/> >+ <enum name="GL_TEXTURE_INTERNAL_FORMAT"/> >+ <enum name="GL_TEXTURE_LEQUAL_R_SGIX"/> >+ <enum name="GL_TEXTURE_LOD_BIAS_R_SGIX"/> >+ <enum name="GL_TEXTURE_LOD_BIAS_S_SGIX"/> >+ <enum name="GL_TEXTURE_LOD_BIAS_T_SGIX"/> >+ <enum name="GL_TEXTURE_LUMINANCE_SIZE"/> >+ <enum name="GL_TEXTURE_MAG_FILTER"/> >+ <enum name="GL_TEXTURE_MAX_CLAMP_R_SGIX"/> >+ <enum name="GL_TEXTURE_MAX_CLAMP_S_SGIX"/> >+ <enum name="GL_TEXTURE_MAX_CLAMP_T_SGIX"/> >+ <enum name="GL_TEXTURE_MAX_LEVEL_SGIS"/> >+ <enum name="GL_TEXTURE_MAX_LOD_SGIS"/> >+ <enum name="GL_TEXTURE_MIN_FILTER"/> >+ <enum name="GL_TEXTURE_MIN_LOD_SGIS"/> >+ <enum name="GL_TEXTURE_PRIORITY"/> >+ <enum name="GL_TEXTURE_RED_SIZE"/> >+ <enum name="GL_TEXTURE_RESIDENT"/> >+ <enum name="GL_TEXTURE_WIDTH"/> >+ <enum name="GL_TEXTURE_WRAP_Q_SGIS"/> >+ <enum name="GL_TEXTURE_WRAP_R_EXT"/> >+ <enum name="GL_TEXTURE_WRAP_S"/> >+ <enum name="GL_TEXTURE_WRAP_T"/> >+ </group> >+ >+ <group name="HintMode"> >+ <enum name="GL_DONT_CARE"/> >+ <enum name="GL_FASTEST"/> >+ <enum name="GL_NICEST"/> >+ </group> >+ >+ <group name="HintTarget"> >+ <enum name="GL_ALLOW_DRAW_FRG_HINT_PGI"/> >+ <enum name="GL_ALLOW_DRAW_MEM_HINT_PGI"/> >+ <enum name="GL_ALLOW_DRAW_OBJ_HINT_PGI"/> >+ <enum name="GL_ALLOW_DRAW_WIN_HINT_PGI"/> >+ <enum name="GL_ALWAYS_FAST_HINT_PGI"/> >+ <enum name="GL_ALWAYS_SOFT_HINT_PGI"/> >+ <enum name="GL_BACK_NORMALS_HINT_PGI"/> >+ <enum name="GL_BINNING_CONTROL_HINT_QCOM"/> >+ <enum name="GL_CLIP_FAR_HINT_PGI"/> >+ <enum name="GL_CLIP_NEAR_HINT_PGI"/> >+ <enum name="GL_CLIP_VOLUME_CLIPPING_HINT_EXT"/> >+ <enum name="GL_CONSERVE_MEMORY_HINT_PGI"/> >+ <enum name="GL_CONVOLUTION_HINT_SGIX"/> >+ <enum name="GL_FOG_HINT"/> >+ <enum name="GL_FRAGMENT_SHADER_DERIVATIVE_HINT"/> >+ <enum name="GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB"/> >+ <enum name="GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES"/> >+ <enum name="GL_FULL_STIPPLE_HINT_PGI"/> >+ <enum name="GL_GENERATE_MIPMAP_HINT"/> >+ <enum name="GL_GENERATE_MIPMAP_HINT_SGIS"/> >+ <enum name="GL_LINE_QUALITY_HINT_SGIX"/> >+ <enum name="GL_LINE_SMOOTH_HINT"/> >+ <enum name="GL_MATERIAL_SIDE_HINT_PGI"/> >+ <enum name="GL_MAX_VERTEX_HINT_PGI"/> >+ <enum name="GL_MULTISAMPLE_FILTER_HINT_NV"/> >+ <enum name="GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI"/> >+ <enum name="GL_NATIVE_GRAPHICS_END_HINT_PGI"/> >+ <enum name="GL_PACK_CMYK_HINT_EXT"/> >+ <enum name="GL_PERSPECTIVE_CORRECTION_HINT"/> >+ <enum name="GL_PHONG_HINT_WIN"/> >+ <enum name="GL_POINT_SMOOTH_HINT"/> >+ <enum name="GL_POLYGON_SMOOTH_HINT"/> >+ <enum name="GL_PREFER_DOUBLEBUFFER_HINT_PGI"/> >+ <enum name="GL_PROGRAM_BINARY_RETRIEVABLE_HINT"/> >+ <enum name="GL_RECLAIM_MEMORY_HINT_PGI"/> >+ <enum name="GL_SCALEBIAS_HINT_SGIX"/> >+ <enum name="GL_STRICT_DEPTHFUNC_HINT_PGI"/> >+ <enum name="GL_STRICT_LIGHTING_HINT_PGI"/> >+ <enum name="GL_STRICT_SCISSOR_HINT_PGI"/> >+ <enum name="GL_TEXTURE_COMPRESSION_HINT"/> >+ <enum name="GL_TEXTURE_COMPRESSION_HINT_ARB"/> >+ <enum name="GL_TEXTURE_MULTI_BUFFER_HINT_SGIX"/> >+ <enum name="GL_TEXTURE_STORAGE_HINT_APPLE"/> >+ <enum name="GL_TRANSFORM_HINT_APPLE"/> >+ <enum name="GL_UNPACK_CMYK_HINT_EXT"/> >+ <enum name="GL_VERTEX_ARRAY_STORAGE_HINT_APPLE"/> >+ <enum name="GL_VERTEX_CONSISTENT_HINT_PGI"/> >+ <enum name="GL_VERTEX_DATA_HINT_PGI"/> >+ <enum name="GL_VERTEX_PRECLIP_HINT_SGIX"/> >+ <enum name="GL_VERTEX_PRECLIP_SGIX"/> >+ <enum name="GL_WIDE_LINE_HINT_PGI"/> >+ </group> >+ >+ <group name="HistogramTargetEXT"> >+ <enum name="GL_HISTOGRAM"/> >+ <enum name="GL_HISTOGRAM_EXT"/> >+ <enum name="GL_PROXY_HISTOGRAM"/> >+ <enum name="GL_PROXY_HISTOGRAM_EXT"/> >+ <enum name="GL_HISTOGRAM"/> >+ <enum name="GL_PROXY_HISTOGRAM"/> >+ </group> >+ >+ <group name="IndexPointerType"> >+ <enum name="GL_DOUBLE"/> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_INT"/> >+ <enum name="GL_SHORT"/> >+ </group> >+ >+ <group name="InterleavedArrayFormat"> >+ <enum name="GL_C3F_V3F"/> >+ <enum name="GL_C4F_N3F_V3F"/> >+ <enum name="GL_C4UB_V2F"/> >+ <enum name="GL_C4UB_V3F"/> >+ <enum name="GL_N3F_V3F"/> >+ <enum name="GL_T2F_C3F_V3F"/> >+ <enum name="GL_T2F_C4F_N3F_V3F"/> >+ <enum name="GL_T2F_C4UB_V3F"/> >+ <enum name="GL_T2F_N3F_V3F"/> >+ <enum name="GL_T2F_V3F"/> >+ <enum name="GL_T4F_C4F_N3F_V4F"/> >+ <enum name="GL_T4F_V4F"/> >+ <enum name="GL_V2F"/> >+ <enum name="GL_V3F"/> >+ </group> >+ >+ <group name="LightEnvModeSGIX"> >+ <enum name="GL_ADD"/> >+ <enum name="GL_MODULATE"/> >+ <enum name="GL_REPLACE"/> >+ </group> >+ >+ <group name="LightEnvParameterSGIX"> >+ <enum name="GL_LIGHT_ENV_MODE_SGIX"/> >+ </group> >+ >+ <group name="LightModelColorControl"> >+ <enum name="GL_SEPARATE_SPECULAR_COLOR"/> >+ <enum name="GL_SEPARATE_SPECULAR_COLOR_EXT"/> >+ <enum name="GL_SINGLE_COLOR"/> >+ <enum name="GL_SINGLE_COLOR_EXT"/> >+ </group> >+ >+ <group name="LightModelParameter"> >+ <enum name="GL_LIGHT_MODEL_AMBIENT"/> >+ <enum name="GL_LIGHT_MODEL_COLOR_CONTROL"/> >+ <enum name="GL_LIGHT_MODEL_COLOR_CONTROL_EXT"/> >+ <enum name="GL_LIGHT_MODEL_LOCAL_VIEWER"/> >+ <enum name="GL_LIGHT_MODEL_TWO_SIDE"/> >+ </group> >+ >+ <group name="LightName"> >+ <enum name="GL_FRAGMENT_LIGHT0_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT1_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT2_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT3_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT4_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT5_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT6_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT7_SGIX"/> >+ <enum name="GL_LIGHT0"/> >+ <enum name="GL_LIGHT1"/> >+ <enum name="GL_LIGHT2"/> >+ <enum name="GL_LIGHT3"/> >+ <enum name="GL_LIGHT4"/> >+ <enum name="GL_LIGHT5"/> >+ <enum name="GL_LIGHT6"/> >+ <enum name="GL_LIGHT7"/> >+ </group> >+ >+ <group name="LightParameter"> >+ <enum name="GL_AMBIENT"/> >+ <enum name="GL_CONSTANT_ATTENUATION"/> >+ <enum name="GL_DIFFUSE"/> >+ <enum name="GL_LINEAR_ATTENUATION"/> >+ <enum name="GL_POSITION"/> >+ <enum name="GL_QUADRATIC_ATTENUATION"/> >+ <enum name="GL_SPECULAR"/> >+ <enum name="GL_SPOT_CUTOFF"/> >+ <enum name="GL_SPOT_DIRECTION"/> >+ <enum name="GL_SPOT_EXPONENT"/> >+ </group> >+ >+ <group name="ListMode"> >+ <enum name="GL_COMPILE"/> >+ <enum name="GL_COMPILE_AND_EXECUTE"/> >+ </group> >+ >+ <group name="ListNameType"> >+ <enum name="GL_2_BYTES"/> >+ <enum name="GL_3_BYTES"/> >+ <enum name="GL_4_BYTES"/> >+ <enum name="GL_BYTE"/> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_INT"/> >+ <enum name="GL_SHORT"/> >+ <enum name="GL_UNSIGNED_BYTE"/> >+ <enum name="GL_UNSIGNED_INT"/> >+ <enum name="GL_UNSIGNED_SHORT"/> >+ </group> >+ >+ <group name="ListParameterName"> >+ <enum name="GL_LIST_PRIORITY_SGIX"/> >+ </group> >+ >+ <group name="LogicOp"> >+ <enum name="GL_AND"/> >+ <enum name="GL_AND_INVERTED"/> >+ <enum name="GL_AND_REVERSE"/> >+ <enum name="GL_CLEAR"/> >+ <enum name="GL_COPY"/> >+ <enum name="GL_COPY_INVERTED"/> >+ <enum name="GL_EQUIV"/> >+ <enum name="GL_INVERT"/> >+ <enum name="GL_NAND"/> >+ <enum name="GL_NOOP"/> >+ <enum name="GL_NOR"/> >+ <enum name="GL_OR"/> >+ <enum name="GL_OR_INVERTED"/> >+ <enum name="GL_OR_REVERSE"/> >+ <enum name="GL_SET"/> >+ <enum name="GL_XOR"/> >+ </group> >+ >+ <group name="MapBufferUsageMask"> >+ <enum name="GL_CLIENT_STORAGE_BIT"/> >+ <enum name="GL_CLIENT_STORAGE_BIT_EXT"/> >+ <enum name="GL_DYNAMIC_STORAGE_BIT"/> >+ <enum name="GL_DYNAMIC_STORAGE_BIT_EXT"/> >+ <enum name="GL_MAP_COHERENT_BIT"/> >+ <enum name="GL_MAP_COHERENT_BIT_EXT"/> >+ <enum name="GL_MAP_FLUSH_EXPLICIT_BIT"/> >+ <enum name="GL_MAP_FLUSH_EXPLICIT_BIT_EXT"/> >+ <enum name="GL_MAP_INVALIDATE_BUFFER_BIT"/> >+ <enum name="GL_MAP_INVALIDATE_BUFFER_BIT_EXT"/> >+ <enum name="GL_MAP_INVALIDATE_RANGE_BIT"/> >+ <enum name="GL_MAP_INVALIDATE_RANGE_BIT_EXT"/> >+ <enum name="GL_MAP_PERSISTENT_BIT"/> >+ <enum name="GL_MAP_PERSISTENT_BIT_EXT"/> >+ <enum name="GL_MAP_READ_BIT"/> >+ <enum name="GL_MAP_READ_BIT_EXT"/> >+ <enum name="GL_MAP_UNSYNCHRONIZED_BIT"/> >+ <enum name="GL_MAP_UNSYNCHRONIZED_BIT_EXT"/> >+ <enum name="GL_MAP_WRITE_BIT"/> >+ <enum name="GL_MAP_WRITE_BIT_EXT"/> >+ <enum name="GL_SPARSE_STORAGE_BIT_ARB"/> >+ <enum name="GL_LGPU_SEPARATE_STORAGE_BIT_NVX"/> >+ <enum name="GL_PER_GPU_STORAGE_BIT_NV"/> >+ </group> >+ >+ <group name="MapTarget"> >+ <enum name="GL_GEOMETRY_DEFORMATION_SGIX"/> >+ <enum name="GL_MAP1_COLOR_4"/> >+ <enum name="GL_MAP1_INDEX"/> >+ <enum name="GL_MAP1_NORMAL"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_1"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_2"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_3"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_4"/> >+ <enum name="GL_MAP1_VERTEX_3"/> >+ <enum name="GL_MAP1_VERTEX_4"/> >+ <enum name="GL_MAP2_COLOR_4"/> >+ <enum name="GL_MAP2_INDEX"/> >+ <enum name="GL_MAP2_NORMAL"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_1"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_2"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_3"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_4"/> >+ <enum name="GL_MAP2_VERTEX_3"/> >+ <enum name="GL_MAP2_VERTEX_4"/> >+ <enum name="GL_TEXTURE_DEFORMATION_SGIX"/> >+ </group> >+ >+ <group name="MapTextureFormatINTEL"> >+ <enum name="GL_LAYOUT_DEFAULT_INTEL"/> >+ <enum name="GL_LAYOUT_LINEAR_CPU_CACHED_INTEL"/> >+ <enum name="GL_LAYOUT_LINEAR_INTEL"/> >+ </group> >+ >+ <group name="MaterialFace"> >+ <enum name="GL_BACK"/> >+ <enum name="GL_FRONT"/> >+ <enum name="GL_FRONT_AND_BACK"/> >+ </group> >+ >+ <group name="MaterialParameter"> >+ <enum name="GL_AMBIENT"/> >+ <enum name="GL_AMBIENT_AND_DIFFUSE"/> >+ <enum name="GL_COLOR_INDEXES"/> >+ <enum name="GL_DIFFUSE"/> >+ <enum name="GL_EMISSION"/> >+ <enum name="GL_SHININESS"/> >+ <enum name="GL_SPECULAR"/> >+ </group> >+ >+ <group name="MatrixMode"> >+ <enum name="GL_MODELVIEW"/> >+ <enum name="GL_MODELVIEW0_EXT"/> >+ <enum name="GL_PROJECTION"/> >+ <enum name="GL_TEXTURE"/> >+ </group> >+ >+ <group name="MemoryBarrierMask"> >+ <enum name="GL_ALL_BARRIER_BITS"/> >+ <enum name="GL_ALL_BARRIER_BITS_EXT"/> >+ <enum name="GL_ATOMIC_COUNTER_BARRIER_BIT"/> >+ <enum name="GL_ATOMIC_COUNTER_BARRIER_BIT_EXT"/> >+ <enum name="GL_BUFFER_UPDATE_BARRIER_BIT"/> >+ <enum name="GL_BUFFER_UPDATE_BARRIER_BIT_EXT"/> >+ <enum name="GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT"/> >+ <enum name="GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT"/> >+ <enum name="GL_COMMAND_BARRIER_BIT"/> >+ <enum name="GL_COMMAND_BARRIER_BIT_EXT"/> >+ <enum name="GL_ELEMENT_ARRAY_BARRIER_BIT"/> >+ <enum name="GL_ELEMENT_ARRAY_BARRIER_BIT_EXT"/> >+ <enum name="GL_FRAMEBUFFER_BARRIER_BIT"/> >+ <enum name="GL_FRAMEBUFFER_BARRIER_BIT_EXT"/> >+ <enum name="GL_PIXEL_BUFFER_BARRIER_BIT"/> >+ <enum name="GL_PIXEL_BUFFER_BARRIER_BIT_EXT"/> >+ <enum name="GL_QUERY_BUFFER_BARRIER_BIT"/> >+ <enum name="GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV"/> >+ <enum name="GL_SHADER_IMAGE_ACCESS_BARRIER_BIT"/> >+ <enum name="GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT"/> >+ <enum name="GL_SHADER_STORAGE_BARRIER_BIT"/> >+ <enum name="GL_TEXTURE_FETCH_BARRIER_BIT"/> >+ <enum name="GL_TEXTURE_FETCH_BARRIER_BIT_EXT"/> >+ <enum name="GL_TEXTURE_UPDATE_BARRIER_BIT"/> >+ <enum name="GL_TEXTURE_UPDATE_BARRIER_BIT_EXT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BARRIER_BIT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT"/> >+ <enum name="GL_UNIFORM_BARRIER_BIT"/> >+ <enum name="GL_UNIFORM_BARRIER_BIT_EXT"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT"/> >+ </group> >+ >+ <group name="MemoryObjectParameterName"> >+ <enum name="GL_DEDICATED_MEMORY_OBJECT_EXT"/> >+ <enum name="GL_PROTECTED_MEMORY_OBJECT_EXT"/> >+ </group> >+ >+ <group name="MeshMode1"> >+ <enum name="GL_LINE"/> >+ <enum name="GL_POINT"/> >+ </group> >+ >+ <group name="MeshMode2"> >+ <enum name="GL_FILL"/> >+ <enum name="GL_LINE"/> >+ <enum name="GL_POINT"/> >+ </group> >+ >+ <group name="MinmaxTargetEXT"> >+ <enum name="GL_MINMAX"/> >+ <enum name="GL_MINMAX_EXT"/> >+ </group> >+ >+ <group name="NormalPointerType"> >+ <enum name="GL_BYTE"/> >+ <enum name="GL_DOUBLE"/> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_INT"/> >+ <enum name="GL_SHORT"/> >+ </group> >+ >+ <group name="PixelCopyType"> >+ <enum name="GL_COLOR"/> >+ <enum name="GL_COLOR_EXT"/> >+ <enum name="GL_DEPTH"/> >+ <enum name="GL_DEPTH_EXT"/> >+ <enum name="GL_STENCIL"/> >+ <enum name="GL_STENCIL_EXT"/> >+ </group> >+ >+ <group name="PixelFormat"> >+ <enum name="GL_ABGR_EXT"/> >+ <enum name="GL_ALPHA"/> >+ <enum name="GL_BLUE"/> >+ <enum name="GL_CMYKA_EXT"/> >+ <enum name="GL_CMYK_EXT"/> >+ <enum name="GL_COLOR_INDEX"/> >+ <enum name="GL_DEPTH_COMPONENT"/> >+ <enum name="GL_GREEN"/> >+ <enum name="GL_LUMINANCE"/> >+ <enum name="GL_LUMINANCE_ALPHA"/> >+ <enum name="GL_RED"/> >+ <enum name="GL_RED_EXT"/> >+ <enum name="GL_RGB"/> >+ <enum name="GL_RGBA"/> >+ <enum name="GL_STENCIL_INDEX"/> >+ <enum name="GL_UNSIGNED_INT"/> >+ <enum name="GL_UNSIGNED_SHORT"/> >+ <enum name="GL_YCRCB_422_SGIX"/> >+ <enum name="GL_YCRCB_444_SGIX"/> >+ </group> >+ >+ <group name="InternalFormat" comment="Was PixelInternalFormat"> >+ <!-- Compatibility --> >+ <enum name="GL_ALPHA12"/> >+ <enum name="GL_ALPHA16"/> >+ <!-- <enum name="GL_ALPHA16_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> --> >+ <enum name="GL_ALPHA4"/> >+ <enum name="GL_ALPHA8"/> >+ <!-- <enum name="GL_ALPHA_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> --> >+ <enum name="GL_DUAL_ALPHA12_SGIS"/> >+ <enum name="GL_DUAL_ALPHA16_SGIS"/> >+ <enum name="GL_DUAL_ALPHA4_SGIS"/> >+ <enum name="GL_DUAL_ALPHA8_SGIS"/> >+ <enum name="GL_DUAL_INTENSITY12_SGIS"/> >+ <enum name="GL_DUAL_INTENSITY16_SGIS"/> >+ <enum name="GL_DUAL_INTENSITY4_SGIS"/> >+ <enum name="GL_DUAL_INTENSITY8_SGIS"/> >+ <enum name="GL_DUAL_LUMINANCE12_SGIS"/> >+ <enum name="GL_DUAL_LUMINANCE16_SGIS"/> >+ <enum name="GL_DUAL_LUMINANCE4_SGIS"/> >+ <enum name="GL_DUAL_LUMINANCE8_SGIS"/> >+ <enum name="GL_DUAL_LUMINANCE_ALPHA4_SGIS"/> >+ <enum name="GL_DUAL_LUMINANCE_ALPHA8_SGIS"/> >+ <enum name="GL_INTENSITY"/> >+ <enum name="GL_INTENSITY12"/> >+ <enum name="GL_INTENSITY16"/> >+ <!-- <enum name="GL_INTENSITY16_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> --> >+ <enum name="GL_INTENSITY4"/> >+ <enum name="GL_INTENSITY8"/> >+ <!-- <enum name="GL_INTENSITY_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> --> >+ <enum name="GL_LUMINANCE12"/> >+ <enum name="GL_LUMINANCE12_ALPHA12"/> >+ <enum name="GL_LUMINANCE12_ALPHA4"/> >+ <enum name="GL_LUMINANCE16"/> >+ <enum name="GL_LUMINANCE16_ALPHA16"/> >+ <!-- <enum name="GL_LUMINANCE16_ALPHA8_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> --> >+ <!-- <enum name="GL_LUMINANCE16_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> --> >+ <enum name="GL_LUMINANCE4"/> >+ <enum name="GL_LUMINANCE4_ALPHA4"/> >+ <enum name="GL_LUMINANCE6_ALPHA2"/> >+ <enum name="GL_LUMINANCE8"/> >+ <enum name="GL_LUMINANCE8_ALPHA8"/> >+ <!-- <enum name="GL_LUMINANCE_ALPHA_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> --> >+ <!-- <enum name="GL_LUMINANCE_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> --> >+ <enum name="GL_QUAD_ALPHA4_SGIS"/> >+ <enum name="GL_QUAD_ALPHA8_SGIS"/> >+ <enum name="GL_QUAD_INTENSITY4_SGIS"/> >+ <enum name="GL_QUAD_INTENSITY8_SGIS"/> >+ <enum name="GL_QUAD_LUMINANCE4_SGIS"/> >+ <enum name="GL_QUAD_LUMINANCE8_SGIS"/> >+ <!-- <enum name="GL_R5_G6_B5_A8_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> --> >+ <!-- <enum name="GL_R5_G6_B5_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> --> >+ <!-- <enum name="GL_RGBA_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> --> >+ <!-- <enum name="GL_RGB_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> --> >+ <!-- Base internal format: GL_RED --> >+ <enum name="GL_RED"/> >+ <enum name="GL_RED_EXT"/> >+ <enum name="GL_R8"/> >+ <enum name="GL_R8_EXT"/> >+ <enum name="GL_R8_SNORM"/> >+ <enum name="GL_R16"/> >+ <enum name="GL_R16_EXT"/> >+ <enum name="GL_R16_SNORM"/> >+ <enum name="GL_R16_SNORM_EXT"/> >+ <!-- <enum name="GL_R32" comment="cut & paste error?"/> --> >+ <!-- <enum name="GL_R32_EXT" comment="cut & paste error?"/> --> >+ <enum name="GL_R16F"/> >+ <enum name="GL_R16F_EXT"/> >+ <enum name="GL_R32F"/> >+ <enum name="GL_R32F_EXT"/> >+ <enum name="GL_R8I"/> >+ <enum name="GL_R16I"/> >+ <enum name="GL_R32I"/> >+ <enum name="GL_R8UI"/> >+ <enum name="GL_R16UI"/> >+ <enum name="GL_R32UI"/> >+ <!-- Base internal format: GL_RG --> >+ <enum name="GL_RG"/> >+ <enum name="GL_RG8"/> >+ <enum name="GL_RG8_EXT"/> >+ <enum name="GL_RG8_SNORM"/> >+ <enum name="GL_RG16"/> >+ <enum name="GL_RG16_EXT"/> >+ <enum name="GL_RG16_SNORM"/> >+ <enum name="GL_RG16_SNORM_EXT"/> >+ <enum name="GL_RG16F"/> >+ <enum name="GL_RG16F_EXT"/> >+ <enum name="GL_RG32F"/> >+ <enum name="GL_RG32F_EXT"/> >+ <enum name="GL_RG8I"/> >+ <enum name="GL_RG16I"/> >+ <enum name="GL_RG32I"/> >+ <enum name="GL_RG8UI"/> >+ <enum name="GL_RG16UI"/> >+ <enum name="GL_RG32UI"/> >+ <!-- Base internal format: GL_RGB --> >+ <enum name="GL_RGB"/> >+ <!-- <enum name="GL_RGB2" comment="Never actually added to core"/> --> >+ <enum name="GL_RGB2_EXT"/> >+ <enum name="GL_RGB4"/> >+ <enum name="GL_RGB4_EXT"/> >+ <enum name="GL_RGB5"/> >+ <enum name="GL_RGB5_EXT"/> >+ <enum name="GL_RGB8"/> >+ <enum name="GL_RGB8_EXT"/> >+ <enum name="GL_RGB8_OES"/> >+ <enum name="GL_RGB8_SNORM"/> >+ <enum name="GL_RGB10"/> >+ <enum name="GL_RGB10_EXT"/> >+ <enum name="GL_RGB12"/> >+ <enum name="GL_RGB12_EXT"/> >+ <enum name="GL_RGB16"/> >+ <enum name="GL_RGB16_EXT"/> >+ <enum name="GL_RGB16F"/> >+ <enum name="GL_RGB16F_ARB"/> >+ <enum name="GL_RGB16F_EXT"/> >+ <enum name="GL_RGB16_SNORM"/> >+ <enum name="GL_RGB16_SNORM_EXT"/> >+ <enum name="GL_RGB8I"/> >+ <enum name="GL_RGB16I"/> >+ <enum name="GL_RGB32I"/> >+ <enum name="GL_RGB8UI"/> >+ <enum name="GL_RGB16UI"/> >+ <enum name="GL_RGB32UI"/> >+ <enum name="GL_SRGB"/> >+ <enum name="GL_SRGB_EXT"/> >+ <enum name="GL_SRGB_ALPHA"/> >+ <enum name="GL_SRGB_ALPHA_EXT"/> >+ <enum name="GL_SRGB8"/> >+ <enum name="GL_SRGB8_EXT"/> >+ <enum name="GL_SRGB8_NV"/> >+ <enum name="GL_SRGB8_ALPHA8"/> >+ <enum name="GL_SRGB8_ALPHA8_EXT"/> >+ <enum name="GL_R3_G3_B2"/> >+ <enum name="GL_R11F_G11F_B10F"/> >+ <enum name="GL_R11F_G11F_B10F_APPLE"/> >+ <enum name="GL_R11F_G11F_B10F_EXT"/> >+ <enum name="GL_RGB9_E5"/> >+ <enum name="GL_RGB9_E5_APPLE"/> >+ <enum name="GL_RGB9_E5_EXT"/> >+ <!-- Base internal format: GL_RGBA --> >+ <enum name="GL_RGBA"/> >+ <enum name="GL_RGBA4"/> >+ <enum name="GL_RGBA4_EXT"/> >+ <enum name="GL_RGBA4_OES"/> >+ <enum name="GL_RGB5_A1"/> >+ <enum name="GL_RGB5_A1_EXT"/> >+ <enum name="GL_RGB5_A1_OES"/> >+ <enum name="GL_RGBA8"/> >+ <enum name="GL_RGBA8_EXT"/> >+ <enum name="GL_RGBA8_OES"/> >+ <enum name="GL_RGBA8_SNORM"/> >+ <enum name="GL_RGB10_A2"/> >+ <enum name="GL_RGB10_A2_EXT"/> >+ <enum name="GL_RGBA12"/> >+ <enum name="GL_RGBA12_EXT"/> >+ <enum name="GL_RGBA16"/> >+ <enum name="GL_RGBA16_EXT"/> >+ <enum name="GL_RGBA16F"/> >+ <enum name="GL_RGBA16F_ARB"/> >+ <enum name="GL_RGBA16F_EXT"/> >+ <enum name="GL_RGBA32F"/> >+ <enum name="GL_RGBA32F_ARB"/> >+ <enum name="GL_RGBA32F_EXT"/> >+ <enum name="GL_RGBA8I"/> >+ <enum name="GL_RGBA16I"/> >+ <enum name="GL_RGBA32I"/> >+ <enum name="GL_RGBA8UI"/> >+ <enum name="GL_RGBA16UI"/> >+ <enum name="GL_RGBA32UI"/> >+ <enum name="GL_RGB10_A2UI"/> >+ <!-- Base internal format: GL_DEPTH_COMPONENT --> >+ <enum name="GL_DEPTH_COMPONENT"/> >+ <enum name="GL_DEPTH_COMPONENT16"/> >+ <enum name="GL_DEPTH_COMPONENT16_ARB"/> >+ <enum name="GL_DEPTH_COMPONENT16_OES"/> >+ <enum name="GL_DEPTH_COMPONENT16_SGIX"/> >+ <enum name="GL_DEPTH_COMPONENT24_ARB"/> >+ <enum name="GL_DEPTH_COMPONENT24_OES"/> >+ <enum name="GL_DEPTH_COMPONENT24_SGIX"/> >+ <enum name="GL_DEPTH_COMPONENT32_ARB"/> >+ <enum name="GL_DEPTH_COMPONENT32_OES"/> >+ <enum name="GL_DEPTH_COMPONENT32_SGIX"/> >+ <enum name="GL_DEPTH_COMPONENT32F"/> >+ <enum name="GL_DEPTH_COMPONENT32F_NV"/> >+ <enum name="GL_DEPTH_COMPONENT32F_NV"/> >+ <!-- Base internal format: GL_DEPTH_STENCIL --> >+ <enum name="GL_DEPTH_STENCIL"/> >+ <enum name="GL_DEPTH_STENCIL_EXT"/> >+ <enum name="GL_DEPTH_STENCIL_MESA"/> >+ <enum name="GL_DEPTH_STENCIL_NV"/> >+ <enum name="GL_DEPTH_STENCIL_OES"/> >+ <enum name="GL_DEPTH24_STENCIL8"/> >+ <enum name="GL_DEPTH24_STENCIL8_EXT"/> >+ <enum name="GL_DEPTH24_STENCIL8_OES"/> >+ <enum name="GL_DEPTH32F_STENCIL8"/> >+ <enum name="GL_DEPTH32F_STENCIL8_NV"/> >+ <!-- Compressed base internal formats --> >+ <enum name="GL_COMPRESSED_RED"/> >+ <enum name="GL_COMPRESSED_RG"/> >+ <enum name="GL_COMPRESSED_RGB"/> >+ <enum name="GL_COMPRESSED_RGBA"/> >+ <enum name="GL_COMPRESSED_SRGB"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA"/> >+ <enum name="GL_COMPRESSED_RED_RGTC1"/> >+ <enum name="GL_COMPRESSED_RED_RGTC1_EXT"/> >+ <enum name="GL_COMPRESSED_SIGNED_RED_RGTC1"/> >+ <enum name="GL_COMPRESSED_SIGNED_RED_RGTC1_EXT"/> >+ <enum name="GL_COMPRESSED_R11_EAC"/> >+ <enum name="GL_COMPRESSED_SIGNED_R11_EAC"/> >+ <enum name="GL_COMPRESSED_RG_RGTC2"/> >+ <enum name="GL_COMPRESSED_SIGNED_RG_RGTC2"/> >+ <enum name="GL_COMPRESSED_RGBA_BPTC_UNORM"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM"/> >+ <enum name="GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT"/> >+ <enum name="GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT"/> >+ <enum name="GL_COMPRESSED_RGB8_ETC2"/> >+ <enum name="GL_COMPRESSED_SRGB8_ETC2"/> >+ <enum name="GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"/> >+ <enum name="GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"/> >+ <enum name="GL_COMPRESSED_RGBA8_ETC2_EAC"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"/> >+ <enum name="GL_COMPRESSED_RG11_EAC"/> >+ <enum name="GL_COMPRESSED_SIGNED_RG11_EAC"/> >+ <enum name="GL_COMPRESSED_RGB_S3TC_DXT1_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_S3TC_DXT1_EXT"/> >+ <enum name="GL_COMPRESSED_RGBA_S3TC_DXT1_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT"/> >+ <enum name="GL_COMPRESSED_RGBA_S3TC_DXT3_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT"/> >+ <enum name="GL_COMPRESSED_RGBA_S3TC_DXT5_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT"/> >+ </group> >+ >+ <group name="PixelMap"> >+ <enum name="GL_PIXEL_MAP_A_TO_A"/> >+ <enum name="GL_PIXEL_MAP_B_TO_B"/> >+ <enum name="GL_PIXEL_MAP_G_TO_G"/> >+ <enum name="GL_PIXEL_MAP_I_TO_A"/> >+ <enum name="GL_PIXEL_MAP_I_TO_B"/> >+ <enum name="GL_PIXEL_MAP_I_TO_G"/> >+ <enum name="GL_PIXEL_MAP_I_TO_I"/> >+ <enum name="GL_PIXEL_MAP_I_TO_R"/> >+ <enum name="GL_PIXEL_MAP_R_TO_R"/> >+ <enum name="GL_PIXEL_MAP_S_TO_S"/> >+ </group> >+ >+ <group name="PixelStoreParameter"> >+ <enum name="GL_PACK_ALIGNMENT"/> >+ <enum name="GL_PACK_IMAGE_DEPTH_SGIS"/> >+ <enum name="GL_PACK_IMAGE_HEIGHT"/> >+ <enum name="GL_PACK_IMAGE_HEIGHT_EXT"/> >+ <enum name="GL_PACK_LSB_FIRST"/> >+ <enum name="GL_PACK_RESAMPLE_OML"/> >+ <enum name="GL_PACK_RESAMPLE_SGIX"/> >+ <enum name="GL_PACK_ROW_LENGTH"/> >+ <enum name="GL_PACK_SKIP_IMAGES"/> >+ <enum name="GL_PACK_SKIP_IMAGES_EXT"/> >+ <enum name="GL_PACK_SKIP_PIXELS"/> >+ <enum name="GL_PACK_SKIP_ROWS"/> >+ <enum name="GL_PACK_SKIP_VOLUMES_SGIS"/> >+ <enum name="GL_PACK_SUBSAMPLE_RATE_SGIX"/> >+ <enum name="GL_PACK_SWAP_BYTES"/> >+ <enum name="GL_PIXEL_TILE_CACHE_SIZE_SGIX"/> >+ <enum name="GL_PIXEL_TILE_GRID_DEPTH_SGIX"/> >+ <enum name="GL_PIXEL_TILE_GRID_HEIGHT_SGIX"/> >+ <enum name="GL_PIXEL_TILE_GRID_WIDTH_SGIX"/> >+ <enum name="GL_PIXEL_TILE_HEIGHT_SGIX"/> >+ <enum name="GL_PIXEL_TILE_WIDTH_SGIX"/> >+ <enum name="GL_UNPACK_ALIGNMENT"/> >+ <enum name="GL_UNPACK_IMAGE_DEPTH_SGIS"/> >+ <enum name="GL_UNPACK_IMAGE_HEIGHT"/> >+ <enum name="GL_UNPACK_IMAGE_HEIGHT_EXT"/> >+ <enum name="GL_UNPACK_LSB_FIRST"/> >+ <enum name="GL_UNPACK_RESAMPLE_OML"/> >+ <enum name="GL_UNPACK_RESAMPLE_SGIX"/> >+ <enum name="GL_UNPACK_ROW_LENGTH"/> >+ <enum name="GL_UNPACK_ROW_LENGTH_EXT"/> >+ <enum name="GL_UNPACK_SKIP_IMAGES"/> >+ <enum name="GL_UNPACK_SKIP_IMAGES_EXT"/> >+ <enum name="GL_UNPACK_SKIP_PIXELS"/> >+ <enum name="GL_UNPACK_SKIP_PIXELS_EXT"/> >+ <enum name="GL_UNPACK_SKIP_ROWS"/> >+ <enum name="GL_UNPACK_SKIP_ROWS_EXT"/> >+ <enum name="GL_UNPACK_SKIP_VOLUMES_SGIS"/> >+ <enum name="GL_UNPACK_SUBSAMPLE_RATE_SGIX"/> >+ <enum name="GL_UNPACK_SWAP_BYTES"/> >+ </group> >+ >+ <group name="PixelStoreResampleMode"> >+ <enum name="GL_RESAMPLE_DECIMATE_SGIX"/> >+ <enum name="GL_RESAMPLE_REPLICATE_SGIX"/> >+ <enum name="GL_RESAMPLE_ZERO_FILL_SGIX"/> >+ </group> >+ >+ <group name="PixelStoreSubsampleRate"> >+ <enum name="GL_PIXEL_SUBSAMPLE_2424_SGIX"/> >+ <enum name="GL_PIXEL_SUBSAMPLE_4242_SGIX"/> >+ <enum name="GL_PIXEL_SUBSAMPLE_4444_SGIX"/> >+ </group> >+ >+ <group name="PixelTexGenMode"> >+ <enum name="GL_LUMINANCE"/> >+ <enum name="GL_LUMINANCE_ALPHA"/> >+ <enum name="GL_NONE"/> >+ <enum name="GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX"/> >+ <enum name="GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX"/> >+ <enum name="GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX"/> >+ <enum name="GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX"/> >+ <enum name="GL_RGB"/> >+ <enum name="GL_RGBA"/> >+ </group> >+ >+ <group name="PixelTexGenParameterNameSGIS"> >+ <enum name="GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS"/> >+ <enum name="GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS"/> >+ </group> >+ >+ <group name="PixelTransferParameter"> >+ <enum name="GL_ALPHA_BIAS"/> >+ <enum name="GL_ALPHA_SCALE"/> >+ <enum name="GL_BLUE_BIAS"/> >+ <enum name="GL_BLUE_SCALE"/> >+ <enum name="GL_DEPTH_BIAS"/> >+ <enum name="GL_DEPTH_SCALE"/> >+ <enum name="GL_GREEN_BIAS"/> >+ <enum name="GL_GREEN_SCALE"/> >+ <enum name="GL_INDEX_OFFSET"/> >+ <enum name="GL_INDEX_SHIFT"/> >+ <enum name="GL_MAP_COLOR"/> >+ <enum name="GL_MAP_STENCIL"/> >+ <enum name="GL_POST_COLOR_MATRIX_ALPHA_BIAS"/> >+ <enum name="GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_ALPHA_SCALE"/> >+ <enum name="GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_BLUE_BIAS"/> >+ <enum name="GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_BLUE_SCALE"/> >+ <enum name="GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_GREEN_BIAS"/> >+ <enum name="GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_GREEN_SCALE"/> >+ <enum name="GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_RED_BIAS"/> >+ <enum name="GL_POST_COLOR_MATRIX_RED_BIAS_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_RED_SCALE"/> >+ <enum name="GL_POST_COLOR_MATRIX_RED_SCALE_SGI"/> >+ <enum name="GL_POST_CONVOLUTION_ALPHA_BIAS"/> >+ <enum name="GL_POST_CONVOLUTION_ALPHA_BIAS_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_ALPHA_SCALE"/> >+ <enum name="GL_POST_CONVOLUTION_ALPHA_SCALE_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_BLUE_BIAS"/> >+ <enum name="GL_POST_CONVOLUTION_BLUE_BIAS_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_BLUE_SCALE"/> >+ <enum name="GL_POST_CONVOLUTION_BLUE_SCALE_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_GREEN_BIAS"/> >+ <enum name="GL_POST_CONVOLUTION_GREEN_BIAS_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_GREEN_SCALE"/> >+ <enum name="GL_POST_CONVOLUTION_GREEN_SCALE_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_RED_BIAS"/> >+ <enum name="GL_POST_CONVOLUTION_RED_BIAS_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_RED_SCALE"/> >+ <enum name="GL_POST_CONVOLUTION_RED_SCALE_EXT"/> >+ <enum name="GL_RED_BIAS"/> >+ <enum name="GL_RED_SCALE"/> >+ </group> >+ >+ <group name="PixelType"> >+ <enum name="GL_BITMAP"/> >+ <enum name="GL_BYTE"/> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_INT"/> >+ <enum name="GL_SHORT"/> >+ <enum name="GL_UNSIGNED_BYTE"/> >+ <enum name="GL_UNSIGNED_BYTE_3_3_2"/> >+ <enum name="GL_UNSIGNED_BYTE_3_3_2_EXT"/> >+ <enum name="GL_UNSIGNED_INT"/> >+ <enum name="GL_UNSIGNED_INT_10_10_10_2"/> >+ <enum name="GL_UNSIGNED_INT_10_10_10_2_EXT"/> >+ <enum name="GL_UNSIGNED_INT_8_8_8_8"/> >+ <enum name="GL_UNSIGNED_INT_8_8_8_8_EXT"/> >+ <enum name="GL_UNSIGNED_SHORT"/> >+ <enum name="GL_UNSIGNED_SHORT_4_4_4_4"/> >+ <enum name="GL_UNSIGNED_SHORT_4_4_4_4_EXT"/> >+ <enum name="GL_UNSIGNED_SHORT_5_5_5_1"/> >+ <enum name="GL_UNSIGNED_SHORT_5_5_5_1_EXT"/> >+ </group> >+ >+ <group name="PointParameterNameSGIS"> >+ <enum name="GL_DISTANCE_ATTENUATION_EXT"/> >+ <enum name="GL_DISTANCE_ATTENUATION_SGIS"/> >+ <enum name="GL_POINT_DISTANCE_ATTENUATION"/> >+ <enum name="GL_POINT_DISTANCE_ATTENUATION_ARB"/> >+ <enum name="GL_POINT_FADE_THRESHOLD_SIZE"/> >+ <enum name="GL_POINT_FADE_THRESHOLD_SIZE_ARB"/> >+ <enum name="GL_POINT_FADE_THRESHOLD_SIZE_EXT"/> >+ <enum name="GL_POINT_FADE_THRESHOLD_SIZE_SGIS"/> >+ <enum name="GL_POINT_SIZE_MAX"/> >+ <enum name="GL_POINT_SIZE_MAX_ARB"/> >+ <enum name="GL_POINT_SIZE_MAX_EXT"/> >+ <enum name="GL_POINT_SIZE_MAX_SGIS"/> >+ <enum name="GL_POINT_SIZE_MIN"/> >+ <enum name="GL_POINT_SIZE_MIN_ARB"/> >+ <enum name="GL_POINT_SIZE_MIN_EXT"/> >+ <enum name="GL_POINT_SIZE_MIN_SGIS"/> >+ </group> >+ >+ <group name="PolygonMode"> >+ <enum name="GL_FILL"/> >+ <enum name="GL_LINE"/> >+ <enum name="GL_POINT"/> >+ </group> >+ >+ <group name="PrimitiveType"> >+ <enum name="GL_LINES"/> >+ <enum name="GL_LINES_ADJACENCY"/> >+ <enum name="GL_LINES_ADJACENCY_ARB"/> >+ <enum name="GL_LINES_ADJACENCY_EXT"/> >+ <enum name="GL_LINE_LOOP"/> >+ <enum name="GL_LINE_STRIP"/> >+ <enum name="GL_LINE_STRIP_ADJACENCY"/> >+ <enum name="GL_LINE_STRIP_ADJACENCY_ARB"/> >+ <enum name="GL_LINE_STRIP_ADJACENCY_EXT"/> >+ <enum name="GL_PATCHES"/> >+ <enum name="GL_PATCHES_EXT"/> >+ <enum name="GL_POINTS"/> >+ <enum name="GL_POLYGON"/> >+ <enum name="GL_QUADS"/> >+ <enum name="GL_QUADS_EXT"/> >+ <enum name="GL_QUAD_STRIP"/> >+ <enum name="GL_TRIANGLES"/> >+ <enum name="GL_TRIANGLES_ADJACENCY"/> >+ <enum name="GL_TRIANGLES_ADJACENCY_ARB"/> >+ <enum name="GL_TRIANGLES_ADJACENCY_EXT"/> >+ <enum name="GL_TRIANGLE_FAN"/> >+ <enum name="GL_TRIANGLE_STRIP"/> >+ <enum name="GL_TRIANGLE_STRIP_ADJACENCY"/> >+ <enum name="GL_TRIANGLE_STRIP_ADJACENCY_ARB"/> >+ <enum name="GL_TRIANGLE_STRIP_ADJACENCY_EXT"/> >+ </group> >+ >+ <group name="OcclusionQueryEventMaskAMD"> >+ <enum name="GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD"/> >+ <enum name="GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD"/> >+ <enum name="GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD"/> >+ <enum name="GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD"/> >+ <enum name="GL_QUERY_ALL_EVENT_BITS_AMD"/> >+ </group> >+ >+ <group name="ReadBufferMode"> >+ <enum name="GL_AUX0"/> >+ <enum name="GL_AUX1"/> >+ <enum name="GL_AUX2"/> >+ <enum name="GL_AUX3"/> >+ <enum name="GL_BACK"/> >+ <enum name="GL_BACK_LEFT"/> >+ <enum name="GL_BACK_RIGHT"/> >+ <enum name="GL_FRONT"/> >+ <enum name="GL_FRONT_LEFT"/> >+ <enum name="GL_FRONT_RIGHT"/> >+ <enum name="GL_LEFT"/> >+ <enum name="GL_RIGHT"/> >+ </group> >+ >+ <group name="RenderingMode"> >+ <enum name="GL_FEEDBACK"/> >+ <enum name="GL_RENDER"/> >+ <enum name="GL_SELECT"/> >+ </group> >+ >+ <group name="SamplePatternSGIS"> >+ <enum name="GL_1PASS_EXT"/> >+ <enum name="GL_1PASS_SGIS"/> >+ <enum name="GL_2PASS_0_EXT"/> >+ <enum name="GL_2PASS_0_SGIS"/> >+ <enum name="GL_2PASS_1_EXT"/> >+ <enum name="GL_2PASS_1_SGIS"/> >+ <enum name="GL_4PASS_0_EXT"/> >+ <enum name="GL_4PASS_0_SGIS"/> >+ <enum name="GL_4PASS_1_EXT"/> >+ <enum name="GL_4PASS_1_SGIS"/> >+ <enum name="GL_4PASS_2_EXT"/> >+ <enum name="GL_4PASS_2_SGIS"/> >+ <enum name="GL_4PASS_3_EXT"/> >+ <enum name="GL_4PASS_3_SGIS"/> >+ </group> >+ >+ <group name="SemaphoreParameterName"> >+ <enum name="GL_D3D12_FENCE_VALUE_EXT"/> >+ </group> >+ >+ <group name="SeparableTargetEXT"> >+ <enum name="GL_SEPARABLE_2D"/> >+ <enum name="GL_SEPARABLE_2D_EXT"/> >+ </group> >+ >+ <group name="ShadingModel"> >+ <enum name="GL_FLAT"/> >+ <enum name="GL_SMOOTH"/> >+ </group> >+ >+ <group name="StencilFaceDirection"> >+ <enum name="GL_FRONT"/> >+ <enum name="GL_BACK"/> >+ <enum name="GL_FRONT_AND_BACK"/> >+ </group> >+ >+ <group name="StencilFunction"> >+ <enum name="GL_ALWAYS"/> >+ <enum name="GL_EQUAL"/> >+ <enum name="GL_GEQUAL"/> >+ <enum name="GL_GREATER"/> >+ <enum name="GL_LEQUAL"/> >+ <enum name="GL_LESS"/> >+ <enum name="GL_NEVER"/> >+ <enum name="GL_NOTEQUAL"/> >+ </group> >+ >+ <group name="StencilOp"> >+ <enum name="GL_DECR"/> >+ <enum name="GL_INCR"/> >+ <enum name="GL_INVERT"/> >+ <enum name="GL_KEEP"/> >+ <enum name="GL_REPLACE"/> >+ <enum name="GL_ZERO"/> >+ </group> >+ >+ <group name="StringName"> >+ <enum name="GL_EXTENSIONS"/> >+ <enum name="GL_RENDERER"/> >+ <enum name="GL_VENDOR"/> >+ <enum name="GL_VERSION"/> >+ <enum name="GL_SHADING_LANGUAGE_VERSION"/> >+ </group> >+ >+ <group name="SyncObjectMask"> >+ <enum name="GL_SYNC_FLUSH_COMMANDS_BIT"/> >+ <enum name="GL_SYNC_FLUSH_COMMANDS_BIT_APPLE"/> >+ </group> >+ >+ <group name="TexCoordPointerType"> >+ <enum name="GL_DOUBLE"/> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_INT"/> >+ <enum name="GL_SHORT"/> >+ </group> >+ >+ <group name="TextureCoordName"> >+ <enum name="GL_S"/> >+ <enum name="GL_T"/> >+ <enum name="GL_R"/> >+ <enum name="GL_Q"/> >+ </group> >+ >+ <group name="TextureEnvMode"> >+ <enum name="GL_ADD"/> >+ <enum name="GL_BLEND"/> >+ <enum name="GL_DECAL"/> >+ <enum name="GL_MODULATE"/> >+ <enum name="GL_REPLACE_EXT"/> >+ <enum name="GL_TEXTURE_ENV_BIAS_SGIX"/> >+ </group> >+ >+ <group name="TextureEnvParameter"> >+ <enum name="GL_TEXTURE_ENV_COLOR"/> >+ <enum name="GL_TEXTURE_ENV_MODE"/> >+ </group> >+ >+ <group name="TextureEnvTarget"> >+ <enum name="GL_TEXTURE_ENV"/> >+ </group> >+ >+ <group name="TextureFilterFuncSGIS"> >+ <enum name="GL_FILTER4_SGIS"/> >+ </group> >+ >+ <group name="TextureGenMode"> >+ <enum name="GL_EYE_DISTANCE_TO_LINE_SGIS"/> >+ <enum name="GL_EYE_DISTANCE_TO_POINT_SGIS"/> >+ <enum name="GL_EYE_LINEAR"/> >+ <enum name="GL_OBJECT_DISTANCE_TO_LINE_SGIS"/> >+ <enum name="GL_OBJECT_DISTANCE_TO_POINT_SGIS"/> >+ <enum name="GL_OBJECT_LINEAR"/> >+ <enum name="GL_SPHERE_MAP"/> >+ </group> >+ >+ <group name="TextureGenParameter"> >+ <enum name="GL_EYE_LINE_SGIS"/> >+ <enum name="GL_EYE_PLANE"/> >+ <enum name="GL_EYE_POINT_SGIS"/> >+ <enum name="GL_OBJECT_LINE_SGIS"/> >+ <enum name="GL_OBJECT_PLANE"/> >+ <enum name="GL_OBJECT_POINT_SGIS"/> >+ <enum name="GL_TEXTURE_GEN_MODE"/> >+ </group> >+ >+ <group name="TextureMagFilter"> >+ <enum name="GL_FILTER4_SGIS"/> >+ <enum name="GL_LINEAR"/> >+ <enum name="GL_LINEAR_DETAIL_ALPHA_SGIS"/> >+ <enum name="GL_LINEAR_DETAIL_COLOR_SGIS"/> >+ <enum name="GL_LINEAR_DETAIL_SGIS"/> >+ <enum name="GL_LINEAR_SHARPEN_ALPHA_SGIS"/> >+ <enum name="GL_LINEAR_SHARPEN_COLOR_SGIS"/> >+ <enum name="GL_LINEAR_SHARPEN_SGIS"/> >+ <enum name="GL_NEAREST"/> >+ <enum name="GL_PIXEL_TEX_GEN_Q_CEILING_SGIX"/> >+ <enum name="GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX"/> >+ <enum name="GL_PIXEL_TEX_GEN_Q_ROUND_SGIX"/> >+ </group> >+ >+ <group name="TextureMinFilter"> >+ <enum name="GL_FILTER4_SGIS"/> >+ <enum name="GL_LINEAR"/> >+ <enum name="GL_LINEAR_CLIPMAP_LINEAR_SGIX"/> >+ <enum name="GL_LINEAR_CLIPMAP_NEAREST_SGIX"/> >+ <enum name="GL_LINEAR_MIPMAP_LINEAR"/> >+ <enum name="GL_LINEAR_MIPMAP_NEAREST"/> >+ <enum name="GL_NEAREST"/> >+ <enum name="GL_NEAREST_CLIPMAP_LINEAR_SGIX"/> >+ <enum name="GL_NEAREST_CLIPMAP_NEAREST_SGIX"/> >+ <enum name="GL_NEAREST_MIPMAP_LINEAR"/> >+ <enum name="GL_NEAREST_MIPMAP_NEAREST"/> >+ <enum name="GL_PIXEL_TEX_GEN_Q_CEILING_SGIX"/> >+ <enum name="GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX"/> >+ <enum name="GL_PIXEL_TEX_GEN_Q_ROUND_SGIX"/> >+ </group> >+ >+ <group name="TextureParameterName"> >+ <enum name="GL_DETAIL_TEXTURE_LEVEL_SGIS"/> >+ <enum name="GL_DETAIL_TEXTURE_MODE_SGIS"/> >+ <enum name="GL_DUAL_TEXTURE_SELECT_SGIS"/> >+ <enum name="GL_GENERATE_MIPMAP"/> >+ <enum name="GL_GENERATE_MIPMAP_SGIS"/> >+ <enum name="GL_POST_TEXTURE_FILTER_BIAS_SGIX"/> >+ <enum name="GL_POST_TEXTURE_FILTER_SCALE_SGIX"/> >+ <enum name="GL_QUAD_TEXTURE_SELECT_SGIS"/> >+ <enum name="GL_SHADOW_AMBIENT_SGIX"/> >+ <enum name="GL_TEXTURE_BORDER_COLOR"/> >+ <enum name="GL_TEXTURE_CLIPMAP_CENTER_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_DEPTH_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_FRAME_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_OFFSET_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX"/> >+ <enum name="GL_TEXTURE_COMPARE_SGIX"/> >+ <enum name="GL_TEXTURE_LOD_BIAS_R_SGIX"/> >+ <enum name="GL_TEXTURE_LOD_BIAS_S_SGIX"/> >+ <enum name="GL_TEXTURE_LOD_BIAS_T_SGIX"/> >+ <enum name="GL_TEXTURE_MAG_FILTER"/> >+ <enum name="GL_TEXTURE_MAX_CLAMP_R_SGIX"/> >+ <enum name="GL_TEXTURE_MAX_CLAMP_S_SGIX"/> >+ <enum name="GL_TEXTURE_MAX_CLAMP_T_SGIX"/> >+ <enum name="GL_TEXTURE_MIN_FILTER"/> >+ <enum name="GL_TEXTURE_PRIORITY"/> >+ <enum name="GL_TEXTURE_PRIORITY_EXT"/> >+ <enum name="GL_TEXTURE_WRAP_Q_SGIS"/> >+ <enum name="GL_TEXTURE_WRAP_R"/> >+ <enum name="GL_TEXTURE_WRAP_R_EXT"/> >+ <enum name="GL_TEXTURE_WRAP_R_OES"/> >+ <enum name="GL_TEXTURE_WRAP_S"/> >+ <enum name="GL_TEXTURE_WRAP_T"/> >+ <enum name="GL_TEXTURE_BASE_LEVEL"/> >+ <enum name="GL_TEXTURE_COMPARE_MODE"/> >+ <enum name="GL_TEXTURE_COMPARE_FUNC"/> >+ <enum name="GL_TEXTURE_LOD_BIAS"/> >+ <enum name="GL_TEXTURE_MIN_LOD"/> >+ <enum name="GL_TEXTURE_MAX_LOD"/> >+ <enum name="GL_TEXTURE_MAX_LEVEL"/> >+ <enum name="GL_TEXTURE_SWIZZLE_R"/> >+ <enum name="GL_TEXTURE_SWIZZLE_G"/> >+ <enum name="GL_TEXTURE_SWIZZLE_B"/> >+ <enum name="GL_TEXTURE_SWIZZLE_A"/> >+ <enum name="GL_TEXTURE_SWIZZLE_RGBA"/> >+ <enum name="GL_TEXTURE_TILING_EXT"/> >+ <enum name="GL_DEPTH_STENCIL_TEXTURE_MODE"/> >+ <enum name="GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS"/> >+ <enum name="GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS"/> >+ <enum name="GL_TEXTURE_4DSIZE_SGIS"/> >+ <enum name="GL_TEXTURE_ALPHA_SIZE"/> >+ <enum name="GL_TEXTURE_BASE_LEVEL_SGIS"/> >+ <enum name="GL_TEXTURE_BLUE_SIZE"/> >+ <enum name="GL_TEXTURE_BORDER"/> >+ <enum name="GL_TEXTURE_BORDER_COLOR_NV"/> >+ <enum name="GL_TEXTURE_COMPARE_OPERATOR_SGIX"/> >+ <enum name="GL_TEXTURE_COMPONENTS"/> >+ <enum name="GL_TEXTURE_DEPTH_EXT"/> >+ <enum name="GL_TEXTURE_FILTER4_SIZE_SGIS"/> >+ <enum name="GL_TEXTURE_GEQUAL_R_SGIX"/> >+ <enum name="GL_TEXTURE_GREEN_SIZE"/> >+ <enum name="GL_TEXTURE_HEIGHT"/> >+ <enum name="GL_TEXTURE_INTENSITY_SIZE"/> >+ <enum name="GL_TEXTURE_INTERNAL_FORMAT"/> >+ <enum name="GL_TEXTURE_LEQUAL_R_SGIX"/> >+ <enum name="GL_TEXTURE_LUMINANCE_SIZE"/> >+ <enum name="GL_TEXTURE_MAX_LEVEL_SGIS"/> >+ <enum name="GL_TEXTURE_MAX_LOD_SGIS"/> >+ <enum name="GL_TEXTURE_MIN_LOD_SGIS"/> >+ <enum name="GL_TEXTURE_RED_SIZE"/> >+ <enum name="GL_TEXTURE_RESIDENT"/> >+ <enum name="GL_TEXTURE_WIDTH"/> >+ </group> >+ >+ <group name="TextureStorageMaskAMD"> >+ <enum name="GL_TEXTURE_STORAGE_SPARSE_BIT_AMD"/> >+ </group> >+ >+ <group name="TextureTarget"> >+ <enum name="GL_DETAIL_TEXTURE_2D_SGIS"/> >+ <enum name="GL_PROXY_TEXTURE_1D"/> >+ <enum name="GL_PROXY_TEXTURE_1D_ARRAY"/> >+ <enum name="GL_PROXY_TEXTURE_1D_ARRAY_EXT"/> >+ <enum name="GL_PROXY_TEXTURE_1D_EXT"/> >+ <enum name="GL_PROXY_TEXTURE_2D"/> >+ <enum name="GL_PROXY_TEXTURE_2D_ARRAY"/> >+ <enum name="GL_PROXY_TEXTURE_2D_ARRAY_EXT"/> >+ <enum name="GL_PROXY_TEXTURE_2D_EXT"/> >+ <enum name="GL_PROXY_TEXTURE_2D_MULTISAMPLE"/> >+ <enum name="GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_PROXY_TEXTURE_3D"/> >+ <enum name="GL_PROXY_TEXTURE_3D_EXT"/> >+ <enum name="GL_PROXY_TEXTURE_4D_SGIS"/> >+ <enum name="GL_PROXY_TEXTURE_CUBE_MAP"/> >+ <enum name="GL_PROXY_TEXTURE_CUBE_MAP_ARB"/> >+ <enum name="GL_PROXY_TEXTURE_CUBE_MAP_EXT"/> >+ <enum name="GL_PROXY_TEXTURE_CUBE_MAP_ARRAY"/> >+ <enum name="GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB"/> >+ <enum name="GL_PROXY_TEXTURE_RECTANGLE"/> >+ <enum name="GL_PROXY_TEXTURE_RECTANGLE_ARB"/> >+ <enum name="GL_PROXY_TEXTURE_RECTANGLE_NV"/> >+ <enum name="GL_TEXTURE_1D"/> >+ <enum name="GL_TEXTURE_2D"/> >+ <enum name="GL_TEXTURE_3D"/> >+ <enum name="GL_TEXTURE_3D_EXT"/> >+ <enum name="GL_TEXTURE_3D_OES"/> >+ <enum name="GL_TEXTURE_4D_SGIS"/> >+ <enum name="GL_TEXTURE_RECTANGLE"/> >+ <enum name="GL_TEXTURE_CUBE_MAP"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_X"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_ARRAY"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_ARRAY_ARB"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_ARRAY_EXT"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_ARRAY_OES"/> >+ <enum name="GL_TEXTURE_1D_ARRAY"/> >+ <enum name="GL_TEXTURE_2D_ARRAY"/> >+ <enum name="GL_TEXTURE_2D_MULTISAMPLE"/> >+ <enum name="GL_TEXTURE_2D_MULTISAMPLE_ARRAY"/> >+ </group> >+ >+ <group name="TextureWrapMode"> >+ <enum name="GL_CLAMP"/> >+ <enum name="GL_CLAMP_TO_BORDER"/> >+ <enum name="GL_CLAMP_TO_BORDER_ARB"/> >+ <enum name="GL_CLAMP_TO_BORDER_NV"/> >+ <enum name="GL_CLAMP_TO_BORDER_SGIS"/> >+ <enum name="GL_CLAMP_TO_EDGE"/> >+ <enum name="GL_CLAMP_TO_EDGE_SGIS"/> >+ <enum name="GL_REPEAT"/> >+ </group> >+ >+ <group name="UseProgramStageMask"> >+ <enum name="GL_VERTEX_SHADER_BIT"/> >+ <enum name="GL_VERTEX_SHADER_BIT_EXT"/> >+ <enum name="GL_FRAGMENT_SHADER_BIT"/> >+ <enum name="GL_FRAGMENT_SHADER_BIT_EXT"/> >+ <enum name="GL_GEOMETRY_SHADER_BIT"/> >+ <enum name="GL_GEOMETRY_SHADER_BIT_EXT"/> >+ <enum name="GL_GEOMETRY_SHADER_BIT_OES"/> >+ <enum name="GL_TESS_CONTROL_SHADER_BIT"/> >+ <enum name="GL_TESS_CONTROL_SHADER_BIT_EXT"/> >+ <enum name="GL_TESS_CONTROL_SHADER_BIT_OES"/> >+ <enum name="GL_TESS_EVALUATION_SHADER_BIT"/> >+ <enum name="GL_TESS_EVALUATION_SHADER_BIT_EXT"/> >+ <enum name="GL_TESS_EVALUATION_SHADER_BIT_OES"/> >+ <enum name="GL_COMPUTE_SHADER_BIT"/> >+ <enum name="GL_ALL_SHADER_BITS"/> >+ <enum name="GL_ALL_SHADER_BITS_EXT"/> >+ </group> >+ >+ <group name="VertexPointerType"> >+ <enum name="GL_DOUBLE"/> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_INT"/> >+ <enum name="GL_SHORT"/> >+ </group> >+ >+ <group name="FramebufferAttachment"> >+ <enum name="GL_MAX_COLOR_ATTACHMENTS"/> >+ <enum name="GL_MAX_COLOR_ATTACHMENTS_EXT"/> >+ <enum name="GL_MAX_COLOR_ATTACHMENTS_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT0"/> >+ <enum name="GL_COLOR_ATTACHMENT0_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT0_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT0_OES"/> >+ <enum name="GL_COLOR_ATTACHMENT1"/> >+ <enum name="GL_COLOR_ATTACHMENT1_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT1_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT2"/> >+ <enum name="GL_COLOR_ATTACHMENT2_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT2_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT3"/> >+ <enum name="GL_COLOR_ATTACHMENT3_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT3_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT4"/> >+ <enum name="GL_COLOR_ATTACHMENT4_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT4_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT5"/> >+ <enum name="GL_COLOR_ATTACHMENT5_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT5_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT6"/> >+ <enum name="GL_COLOR_ATTACHMENT6_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT6_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT7"/> >+ <enum name="GL_COLOR_ATTACHMENT7_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT7_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT8"/> >+ <enum name="GL_COLOR_ATTACHMENT8_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT8_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT9"/> >+ <enum name="GL_COLOR_ATTACHMENT9_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT9_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT10"/> >+ <enum name="GL_COLOR_ATTACHMENT10_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT10_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT11"/> >+ <enum name="GL_COLOR_ATTACHMENT11_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT11_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT12"/> >+ <enum name="GL_COLOR_ATTACHMENT12_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT12_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT13"/> >+ <enum name="GL_COLOR_ATTACHMENT13_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT13_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT14"/> >+ <enum name="GL_COLOR_ATTACHMENT14_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT14_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT15"/> >+ <enum name="GL_COLOR_ATTACHMENT15_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT15_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT16"/> >+ <enum name="GL_COLOR_ATTACHMENT17"/> >+ <enum name="GL_COLOR_ATTACHMENT18"/> >+ <enum name="GL_COLOR_ATTACHMENT19"/> >+ <enum name="GL_COLOR_ATTACHMENT20"/> >+ <enum name="GL_COLOR_ATTACHMENT21"/> >+ <enum name="GL_COLOR_ATTACHMENT22"/> >+ <enum name="GL_COLOR_ATTACHMENT23"/> >+ <enum name="GL_COLOR_ATTACHMENT24"/> >+ <enum name="GL_COLOR_ATTACHMENT25"/> >+ <enum name="GL_COLOR_ATTACHMENT26"/> >+ <enum name="GL_COLOR_ATTACHMENT27"/> >+ <enum name="GL_COLOR_ATTACHMENT28"/> >+ <enum name="GL_COLOR_ATTACHMENT29"/> >+ <enum name="GL_COLOR_ATTACHMENT30"/> >+ <enum name="GL_COLOR_ATTACHMENT31"/> >+ <enum name="GL_DEPTH_ATTACHMENT"/> >+ <enum name="GL_DEPTH_ATTACHMENT_EXT"/> >+ <enum name="GL_DEPTH_ATTACHMENT_OES"/> >+ </group> >+ >+ <group name="RenderbufferTarget"> >+ <enum name="GL_RENDERBUFFER" /> >+ </group> >+ >+ <group name="FramebufferTarget"> >+ <enum name="GL_FRAMEBUFFER" /> >+ <enum name="GL_DRAW_FRAMEBUFFER" /> >+ <enum name="GL_READ_FRAMEBUFFER" /> >+ </group> >+ >+ <group name="TextureUnit"> >+ <enum name="GL_TEXTURE0"/> >+ <enum name="GL_TEXTURE1"/> >+ <enum name="GL_TEXTURE2"/> >+ <enum name="GL_TEXTURE3"/> >+ <enum name="GL_TEXTURE4"/> >+ <enum name="GL_TEXTURE5"/> >+ <enum name="GL_TEXTURE6"/> >+ <enum name="GL_TEXTURE7"/> >+ <enum name="GL_TEXTURE8"/> >+ <enum name="GL_TEXTURE9"/> >+ <enum name="GL_TEXTURE10"/> >+ <enum name="GL_TEXTURE11"/> >+ <enum name="GL_TEXTURE12"/> >+ <enum name="GL_TEXTURE13"/> >+ <enum name="GL_TEXTURE14"/> >+ <enum name="GL_TEXTURE15"/> >+ <enum name="GL_TEXTURE16"/> >+ <enum name="GL_TEXTURE17"/> >+ <enum name="GL_TEXTURE18"/> >+ <enum name="GL_TEXTURE19"/> >+ <enum name="GL_TEXTURE20"/> >+ <enum name="GL_TEXTURE21"/> >+ <enum name="GL_TEXTURE22"/> >+ <enum name="GL_TEXTURE23"/> >+ <enum name="GL_TEXTURE24"/> >+ <enum name="GL_TEXTURE25"/> >+ <enum name="GL_TEXTURE26"/> >+ <enum name="GL_TEXTURE27"/> >+ <enum name="GL_TEXTURE28"/> >+ <enum name="GL_TEXTURE29"/> >+ <enum name="GL_TEXTURE30"/> >+ <enum name="GL_TEXTURE31"/> >+ </group> >+ >+ <group name="TypeEnum"> >+ <enum name="GL_QUERY_WAIT"/> >+ <enum name="GL_QUERY_NO_WAIT"/> >+ <enum name="GL_QUERY_BY_REGION_WAIT"/> >+ <enum name="GL_QUERY_BY_REGION_NO_WAIT"/> >+ </group> >+ >+ <group name="FragmentOpATI"> >+ <enum name="GL_MOV_ATI"/> >+ <enum name="GL_ADD_ATI"/> >+ <enum name="GL_MUL_ATI"/> >+ <enum name="GL_SUB_ATI"/> >+ <enum name="GL_DOT3_ATI"/> >+ <enum name="GL_DOT4_ATI"/> >+ <enum name="GL_MAD_ATI"/> >+ <enum name="GL_LERP_ATI"/> >+ <enum name="GL_CND_ATI"/> >+ <enum name="GL_CND0_ATI"/> >+ <enum name="GL_DOT2_ADD_ATI"/> >+ </group> >+ >+ <group name="FramebufferStatus"> >+ <enum name="GL_FRAMEBUFFER_COMPLETE"/> >+ <enum name="GL_FRAMEBUFFER_UNDEFINED"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER"/> >+ <enum name="GL_FRAMEBUFFER_UNSUPPORTED"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS"/> >+ </group> >+ >+ <group name="GraphicsResetStatus"> >+ <enum name="GL_NO_ERROR"/> >+ <enum name="GL_GUILTY_CONTEXT_RESET"/> >+ <enum name="GL_INNOCENT_CONTEXT_RESET"/> >+ <enum name="GL_UNKNOWN_CONTEXT_RESET"/> >+ </group> >+ >+ <group name="SyncStatus"> >+ <enum name="GL_ALREADY_SIGNALED"/> >+ <enum name="GL_TIMEOUT_EXPIRED"/> >+ <enum name="GL_CONDITION_SATISFIED"/> >+ <enum name="GL_WAIT_FAILED"/> >+ </group> >+ >+ <group name="QueryTarget"> >+ <enum name="GL_SAMPLES_PASSED"/> >+ <enum name="GL_ANY_SAMPLES_PASSED"/> >+ <enum name="GL_ANY_SAMPLES_PASSED_CONSERVATIVE"/> >+ <enum name="GL_PRIMITIVES_GENERATED"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN"/> >+ <enum name="GL_TIME_ELAPSED"/> >+ </group> >+ >+ <group name="ConvolutionTarget"> >+ <enum name="GL_CONVOLUTION_1D"/> >+ <enum name="GL_CONVOLUTION_2D"/> >+ </group> >+ >+ <group name="PathFillMode"> >+ <enum name="GL_INVERT"/> >+ <enum name="GL_COUNT_UP_NV"/> >+ <enum name="GL_COUNT_DOWN_NV"/> >+ <enum name="GL_PATH_FILL_MODE_NV"/> >+ </group> >+ >+ <group name="ColorTableTarget"> >+ <enum name="GL_COLOR_TABLE"/> >+ <enum name="GL_POST_CONVOLUTION_COLOR_TABLE"/> >+ <enum name="GL_POST_COLOR_MATRIX_COLOR_TABLE"/> >+ </group> >+ >+ <group name="VertexBufferObjectParameter"> >+ <enum name="GL_BUFFER_ACCESS"/> >+ <enum name="GL_BUFFER_ACCESS_FLAGS"/> >+ <enum name="GL_BUFFER_IMMUTABLE_STORAGE"/> >+ <enum name="GL_BUFFER_MAPPED"/> >+ <enum name="GL_BUFFER_MAP_LENGTH"/> >+ <enum name="GL_BUFFER_MAP_OFFSET"/> >+ <enum name="GL_BUFFER_SIZE"/> >+ <enum name="GL_BUFFER_STORAGE_FLAGS"/> >+ <enum name="GL_BUFFER_USAGE"/> >+ </group> >+ >+ <group name="RenderbufferParameterName"> >+ <enum name="GL_RENDERBUFFER_WIDTH"/> >+ <enum name="GL_RENDERBUFFER_HEIGHT"/> >+ <enum name="GL_RENDERBUFFER_INTERNAL_FORMAT"/> >+ <enum name="GL_RENDERBUFFER_SAMPLES"/> >+ <enum name="GL_RENDERBUFFER_RED_SIZE"/> >+ <enum name="GL_RENDERBUFFER_GREEN_SIZE"/> >+ <enum name="GL_RENDERBUFFER_BLUE_SIZE"/> >+ <enum name="GL_RENDERBUFFER_ALPHA_SIZE"/> >+ <enum name="GL_RENDERBUFFER_DEPTH_SIZE"/> >+ <enum name="GL_RENDERBUFFER_STENCIL_SIZE"/> >+ </group> >+ >+ <group name="VertexBufferObjectUsage"> >+ <enum name="GL_STREAM_DRAW"/> >+ <enum name="GL_STREAM_READ"/> >+ <enum name="GL_STREAM_COPY"/> >+ <enum name="GL_STATIC_DRAW"/> >+ <enum name="GL_STATIC_READ"/> >+ <enum name="GL_STATIC_COPY"/> >+ <enum name="GL_DYNAMIC_DRAW"/> >+ <enum name="GL_DYNAMIC_READ"/> >+ <enum name="GL_DYNAMIC_COPY"/> >+ </group> >+ >+ <group name="FramebufferParameterName"> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_WIDTH"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_HEIGHT"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_LAYERS"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_SAMPLES"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS"/> >+ </group> >+ >+ <group name="ProgramParameterPName"> >+ <enum name="GL_PROGRAM_BINARY_RETRIEVABLE_HINT"/> >+ <enum name="GL_PROGRAM_SEPARABLE"/> >+ </group> >+ >+ <group name="BlendingFactor"> >+ <enum name="GL_ZERO"/> >+ <enum name="GL_ONE"/> >+ <enum name="GL_SRC_COLOR"/> >+ <enum name="GL_ONE_MINUS_SRC_COLOR"/> >+ <enum name="GL_DST_COLOR"/> >+ <enum name="GL_ONE_MINUS_DST_COLOR"/> >+ <enum name="GL_SRC_ALPHA"/> >+ <enum name="GL_ONE_MINUS_SRC_ALPHA"/> >+ <enum name="GL_DST_ALPHA"/> >+ <enum name="GL_ONE_MINUS_DST_ALPHA"/> >+ <enum name="GL_CONSTANT_COLOR"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_COLOR"/> >+ <enum name="GL_CONSTANT_ALPHA"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_ALPHA"/> >+ <enum name="GL_SRC_ALPHA_SATURATE"/> >+ <enum name="GL_SRC1_COLOR"/> >+ <enum name="GL_ONE_MINUS_SRC1_COLOR"/> >+ <enum name="GL_SRC1_ALPHA"/> >+ <enum name="GL_ONE_MINUS_SRC1_ALPHA"/> >+ </group> >+ >+ <group name="BindTransformFeedbackTarget"> >+ <enum name="GL_TRANSFORM_FEEDBACK"/> >+ </group> >+ >+ <group name="BlitFramebufferFilter"> >+ <enum name="GL_NEAREST"/> >+ <enum name="GL_LINEAR"/> >+ </group> >+ >+ <group name="BufferStorageTarget"> >+ <enum name="GL_ARRAY_BUFFER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER"/> >+ <enum name="GL_COPY_READ_BUFFER"/> >+ <enum name="GL_COPY_WRITE_BUFFER"/> >+ <enum name="GL_DISPATCH_INDIRECT_BUFFER"/> >+ <enum name="GL_DRAW_INDIRECT_BUFFER"/> >+ <enum name="GL_ELEMENT_ARRAY_BUFFER"/> >+ <enum name="GL_PIXEL_PACK_BUFFER"/> >+ <enum name="GL_PIXEL_UNPACK_BUFFER"/> >+ <enum name="GL_QUERY_BUFFER"/> >+ <enum name="GL_SHADER_STORAGE_BUFFER"/> >+ <enum name="GL_TEXTURE_BUFFER"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER"/> >+ <enum name="GL_UNIFORM_BUFFER"/> >+ </group> >+ >+ <group name="CheckFramebufferStatusTarget"> >+ <enum name="GL_DRAW_FRAMEBUFFER"/> >+ <enum name="GL_READ_FRAMEBUFFER"/> >+ <enum name="GL_FRAMEBUFFER"/> >+ </group> >+ >+ <group name="Buffer"> >+ <enum name="GL_COLOR"/> >+ <enum name="GL_DEPTH"/> >+ <enum name="GL_STENCIL"/> >+ </group> >+ >+ <group name="ClipControlOrigin"> >+ <enum name="GL_LOWER_LEFT"/> >+ <enum name="GL_UPPER_LEFT"/> >+ </group> >+ >+ <group name="ClipControlDepth"> >+ <enum name="GL_NEGATIVE_ONE_TO_ONE"/> >+ <enum name="GL_ZERO_TO_ONE"/> >+ </group> >+ >+ <group name="CopyBufferSubDataTarget"> >+ <enum name="GL_ARRAY_BUFFER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER"/> >+ <enum name="GL_COPY_READ_BUFFER"/> >+ <enum name="GL_COPY_WRITE_BUFFER"/> >+ <enum name="GL_DISPATCH_INDIRECT_BUFFER"/> >+ <enum name="GL_DRAW_INDIRECT_BUFFER"/> >+ <enum name="GL_ELEMENT_ARRAY_BUFFER"/> >+ <enum name="GL_PIXEL_PACK_BUFFER"/> >+ <enum name="GL_PIXEL_UNPACK_BUFFER"/> >+ <enum name="GL_QUERY_BUFFER"/> >+ <enum name="GL_SHADER_STORAGE_BUFFER"/> >+ <enum name="GL_TEXTURE_BUFFER"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER"/> >+ <enum name="GL_UNIFORM_BUFFER"/> >+ </group> >+ >+ <group name="ShaderType"> >+ <enum name="GL_COMPUTE_SHADER"/> >+ <enum name="GL_VERTEX_SHADER"/> >+ <enum name="GL_TESS_CONTROL_SHADER"/> >+ <enum name="GL_TESS_EVALUATION_SHADER"/> >+ <enum name="GL_GEOMETRY_SHADER"/> >+ <enum name="GL_FRAGMENT_SHADER"/> >+ <enum name="GL_FRAGMENT_SHADER_ARB"/> >+ <enum name="GL_VERTEX_SHADER_ARB"/> >+ </group> >+ >+ <group name="DebugSource"> >+ <enum name="GL_DEBUG_SOURCE_API"/> >+ <enum name="GL_DEBUG_SOURCE_WINDOW_SYSTEM"/> >+ <enum name="GL_DEBUG_SOURCE_SHADER_COMPILER"/> >+ <enum name="GL_DEBUG_SOURCE_THIRD_PARTY"/> >+ <enum name="GL_DEBUG_SOURCE_APPLICATION"/> >+ <enum name="GL_DEBUG_SOURCE_OTHER"/> >+ <enum name="GL_DONT_CARE"/> >+ </group> >+ >+ <group name="DebugType"> >+ <enum name="GL_DEBUG_TYPE_ERROR"/> >+ <enum name="GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR"/> >+ <enum name="GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR"/> >+ <enum name="GL_DEBUG_TYPE_PORTABILITY"/> >+ <enum name="GL_DEBUG_TYPE_PERFORMANCE"/> >+ <enum name="GL_DEBUG_TYPE_MARKER"/> >+ <enum name="GL_DEBUG_TYPE_PUSH_GROUP"/> >+ <enum name="GL_DEBUG_TYPE_POP_GROUP"/> >+ <enum name="GL_DEBUG_TYPE_OTHER"/> >+ <enum name="GL_DONT_CARE"/> >+ </group> >+ >+ <group name="DebugSeverity"> >+ <enum name="GL_DEBUG_SEVERITY_LOW"/> >+ <enum name="GL_DEBUG_SEVERITY_MEDIUM"/> >+ <enum name="GL_DEBUG_SEVERITY_HIGH"/> >+ <enum name="GL_DONT_CARE"/> >+ </group> >+ >+ <group name="SyncCondition"> >+ <enum name="GL_SYNC_GPU_COMMANDS_COMPLETE"/> >+ </group> >+ >+ <group name="FogPName"> >+ <enum name="GL_FOG_MODE"/> >+ <enum name="GL_FOG_DENSITY"/> >+ <enum name="GL_FOG_START"/> >+ <enum name="GL_FOG_END"/> >+ <enum name="GL_FOG_INDEX"/> >+ <enum name="GL_FOG_COORD_SRC"/> >+ </group> >+ >+ <group name="AtomicCounterBufferPName"> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_BINDING"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER"/> >+ </group> >+ >+ <group name="UniformBlockPName"> >+ <enum name="GL_UNIFORM_BLOCK_BINDING"/> >+ <enum name="GL_UNIFORM_BLOCK_DATA_SIZE"/> >+ <enum name="GL_UNIFORM_BLOCK_NAME_LENGTH"/> >+ <enum name="GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS"/> >+ <enum name="GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER"/> >+ </group> >+ >+ <group name="UniformPName"> >+ <enum name="GL_UNIFORM_TYPE"/> >+ <enum name="GL_UNIFORM_SIZE"/> >+ <enum name="GL_UNIFORM_NAME_LENGTH"/> >+ <enum name="GL_UNIFORM_BLOCK_INDEX"/> >+ <enum name="GL_UNIFORM_OFFSET"/> >+ <enum name="GL_UNIFORM_ARRAY_STRIDE"/> >+ <enum name="GL_UNIFORM_MATRIX_STRIDE"/> >+ <enum name="GL_UNIFORM_IS_ROW_MAJOR"/> >+ <enum name="GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX"/> >+ </group> >+ >+ <group name="SamplerParameterName"> >+ <enum name="GL_TEXTURE_WRAP_S"/> >+ <enum name="GL_TEXTURE_WRAP_T"/> >+ <enum name="GL_TEXTURE_WRAP_R"/> >+ <enum name="GL_TEXTURE_MIN_FILTER"/> >+ <enum name="GL_TEXTURE_MAG_FILTER"/> >+ <enum name="GL_TEXTURE_BORDER_COLOR"/> >+ <enum name="GL_TEXTURE_MIN_LOD"/> >+ <enum name="GL_TEXTURE_MAX_LOD"/> >+ <enum name="GL_TEXTURE_COMPARE_MODE"/> >+ <enum name="GL_TEXTURE_COMPARE_FUNC"/> >+ </group> >+ >+ <group name="VertexProvokingMode"> >+ <enum name="GL_FIRST_VERTEX_CONVENTION"/> >+ <enum name="GL_LAST_VERTEX_CONVENTION"/> >+ </group> >+ >+ <group name="PatchParameterName"> >+ <enum name="GL_PATCH_VERTICES"/> >+ <enum name="GL_PATCH_DEFAULT_OUTER_LEVEL"/> >+ <enum name="GL_PATCH_DEFAULT_INNER_LEVEL"/> >+ </group> >+ >+ <group name="ObjectIdentifier"> >+ <enum name="GL_BUFFER"/> >+ <enum name="GL_SHADER"/> >+ <enum name="GL_PROGRAM"/> >+ <enum name="GL_VERTEX_ARRAY"/> >+ <enum name="GL_QUERY"/> >+ <enum name="GL_PROGRAM_PIPELINE"/> >+ <enum name="GL_TRANSFORM_FEEDBACK"/> >+ <enum name="GL_SAMPLER"/> >+ <enum name="GL_TEXTURE"/> >+ <enum name="GL_RENDERBUFFER"/> >+ <enum name="GL_FRAMEBUFFER"/> >+ </group> >+ >+ <group name="ColorBuffer"> >+ <enum name="GL_NONE"/> >+ <enum name="GL_FRONT_LEFT"/> >+ <enum name="GL_FRONT_RIGHT"/> >+ <enum name="GL_BACK_LEFT"/> >+ <enum name="GL_BACK_RIGHT"/> >+ <enum name="GL_FRONT"/> >+ <enum name="GL_BACK"/> >+ <enum name="GL_LEFT"/> >+ <enum name="GL_RIGHT"/> >+ <enum name="GL_FRONT_AND_BACK"/> >+ <enum name="GL_NONE"/> >+ <enum name="GL_COLOR_ATTACHMENT0"/> >+ <enum name="GL_COLOR_ATTACHMENT1"/> >+ <enum name="GL_COLOR_ATTACHMENT2"/> >+ <enum name="GL_COLOR_ATTACHMENT3"/> >+ <enum name="GL_COLOR_ATTACHMENT4"/> >+ <enum name="GL_COLOR_ATTACHMENT5"/> >+ <enum name="GL_COLOR_ATTACHMENT6"/> >+ <enum name="GL_COLOR_ATTACHMENT7"/> >+ <enum name="GL_COLOR_ATTACHMENT8"/> >+ <enum name="GL_COLOR_ATTACHMENT9"/> >+ <enum name="GL_COLOR_ATTACHMENT10"/> >+ <enum name="GL_COLOR_ATTACHMENT11"/> >+ <enum name="GL_COLOR_ATTACHMENT12"/> >+ <enum name="GL_COLOR_ATTACHMENT13"/> >+ <enum name="GL_COLOR_ATTACHMENT14"/> >+ <enum name="GL_COLOR_ATTACHMENT15"/> >+ <enum name="GL_COLOR_ATTACHMENT16"/> >+ <enum name="GL_COLOR_ATTACHMENT17"/> >+ <enum name="GL_COLOR_ATTACHMENT18"/> >+ <enum name="GL_COLOR_ATTACHMENT19"/> >+ <enum name="GL_COLOR_ATTACHMENT20"/> >+ <enum name="GL_COLOR_ATTACHMENT21"/> >+ <enum name="GL_COLOR_ATTACHMENT22"/> >+ <enum name="GL_COLOR_ATTACHMENT23"/> >+ <enum name="GL_COLOR_ATTACHMENT24"/> >+ <enum name="GL_COLOR_ATTACHMENT25"/> >+ <enum name="GL_COLOR_ATTACHMENT26"/> >+ <enum name="GL_COLOR_ATTACHMENT27"/> >+ <enum name="GL_COLOR_ATTACHMENT28"/> >+ <enum name="GL_COLOR_ATTACHMENT29"/> >+ <enum name="GL_COLOR_ATTACHMENT30"/> >+ <enum name="GL_COLOR_ATTACHMENT31"/> >+ </group> >+ >+ <group name="MapQuery"> >+ <enum name="GL_COEFF"/> >+ <enum name="GL_ORDER"/> >+ <enum name="GL_DOMAIN"/> >+ </group> >+ >+ <group name="VertexArrayPName"> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_ENABLED"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_SIZE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_STRIDE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_TYPE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_NORMALIZED"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_INTEGER"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_LONG"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR"/> >+ <enum name="GL_VERTEX_ATTRIB_RELATIVE_OFFSET"/> >+ </group> >+ >+ <group name="TransformFeedbackPName"> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_BINDING"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_START"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_SIZE"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_PAUSED"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_ACTIVE"/> >+ </group> >+ >+ <group name="SyncParameterName"> >+ <enum name="GL_OBJECT_TYPE"/> >+ <enum name="GL_SYNC_STATUS"/> >+ <enum name="GL_SYNC_CONDITION"/> >+ <enum name="GL_SYNC_FLAGS"/> >+ </group> >+ >+ <group name="ShaderParameterName"> >+ <enum name="GL_SHADER_TYPE"/> >+ <enum name="GL_DELETE_STATUS"/> >+ <enum name="GL_COMPILE_STATUS"/> >+ <enum name="GL_INFO_LOG_LENGTH"/> >+ <enum name="GL_SHADER_SOURCE_LENGTH"/> >+ </group> >+ >+ <group name="QueryObjectParameterName"> >+ <enum name="GL_QUERY_RESULT_AVAILABLE"/> >+ <enum name="GL_QUERY_RESULT"/> >+ <enum name="GL_QUERY_RESULT_NO_WAIT"/> >+ <enum name="GL_QUERY_TARGET"/> >+ </group> >+ >+ <group name="QueryParameterName"> >+ <enum name="GL_CURRENT_QUERY"/> >+ <enum name="GL_QUERY_COUNTER_BITS"/> >+ </group> >+ >+ <group name="ProgramStagePName"> >+ <enum name="GL_ACTIVE_SUBROUTINE_UNIFORMS"/> >+ <enum name="GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS"/> >+ <enum name="GL_ACTIVE_SUBROUTINES"/> >+ <enum name="GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH"/> >+ <enum name="GL_ACTIVE_SUBROUTINE_MAX_LENGTH"/> >+ </group> >+ >+ <group name="PipelineParameterName"> >+ <enum name="GL_ACTIVE_PROGRAM"/> >+ <enum name="GL_VERTEX_SHADER"/> >+ <enum name="GL_TESS_CONTROL_SHADER"/> >+ <enum name="GL_TESS_EVALUATION_SHADER"/> >+ <enum name="GL_GEOMETRY_SHADER"/> >+ <enum name="GL_FRAGMENT_SHADER"/> >+ <enum name="GL_INFO_LOG_LENGTH"/> >+ </group> >+ >+ <group name="ProgramInterface"> >+ <enum name="GL_UNIFORM"/> >+ <enum name="GL_UNIFORM_BLOCK"/> >+ <enum name="GL_PROGRAM_INPUT"/> >+ <enum name="GL_PROGRAM_OUTPUT"/> >+ <enum name="GL_VERTEX_SUBROUTINE"/> >+ <enum name="GL_TESS_CONTROL_SUBROUTINE"/> >+ <enum name="GL_TESS_EVALUATION_SUBROUTINE"/> >+ <enum name="GL_GEOMETRY_SUBROUTINE"/> >+ <enum name="GL_FRAGMENT_SUBROUTINE"/> >+ <enum name="GL_COMPUTE_SUBROUTINE"/> >+ <enum name="GL_VERTEX_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_TESS_CONTROL_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_TESS_EVALUATION_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_GEOMETRY_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_FRAGMENT_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_COMPUTE_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_VARYING"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER"/> >+ <enum name="GL_BUFFER_VARIABLE"/> >+ <enum name="GL_SHADER_STORAGE_BLOCK"/> >+ </group> >+ >+ <group name="VertexAttribEnum"> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_ENABLED"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_SIZE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_STRIDE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_TYPE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_NORMALIZED"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_INTEGER"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR"/> >+ <enum name="GL_CURRENT_VERTEX_ATTRIB"/> >+ </group> >+ >+ <group name="VertexAttribType"> >+ <enum name="GL_BYTE"/> >+ <enum name="GL_SHORT"/> >+ <enum name="GL_INT"/> >+ <enum name="GL_FIXED"/> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_HALF_FLOAT"/> >+ <enum name="GL_DOUBLE"/> >+ <enum name="GL_UNSIGNED_BYTE"/> >+ <enum name="GL_UNSIGNED_SHORT"/> >+ <enum name="GL_UNSIGNED_INT"/> >+ <enum name="GL_INT_2_10_10_10_REV"/> >+ <enum name="GL_UNSIGNED_INT_2_10_10_10_REV"/> >+ <enum name="GL_UNSIGNED_INT_10F_11F_11F_REV"/> >+ </group> >+ >+ <group name="AttributeType"> >+ <enum name="GL_FLOAT_VEC2"/> >+ <enum name="GL_FLOAT_VEC2_ARB"/> >+ <enum name="GL_FLOAT_VEC3"/> >+ <enum name="GL_FLOAT_VEC3_ARB"/> >+ <enum name="GL_FLOAT_VEC4"/> >+ <enum name="GL_FLOAT_VEC4_ARB"/> >+ <enum name="GL_INT_VEC2"/> >+ <enum name="GL_INT_VEC2_ARB"/> >+ <enum name="GL_INT_VEC3"/> >+ <enum name="GL_INT_VEC3_ARB"/> >+ <enum name="GL_INT_VEC4"/> >+ <enum name="GL_INT_VEC4_ARB"/> >+ <enum name="GL_BOOL"/> >+ <enum name="GL_BOOL_ARB"/> >+ <enum name="GL_BOOL_VEC2"/> >+ <enum name="GL_BOOL_VEC2_ARB"/> >+ <enum name="GL_BOOL_VEC3"/> >+ <enum name="GL_BOOL_VEC3_ARB"/> >+ <enum name="GL_BOOL_VEC4"/> >+ <enum name="GL_BOOL_VEC4_ARB"/> >+ <enum name="GL_FLOAT_MAT2"/> >+ <enum name="GL_FLOAT_MAT2_ARB"/> >+ <enum name="GL_FLOAT_MAT3"/> >+ <enum name="GL_FLOAT_MAT3_ARB"/> >+ <enum name="GL_FLOAT_MAT4"/> >+ <enum name="GL_FLOAT_MAT4_ARB"/> >+ <enum name="GL_SAMPLER_1D"/> >+ <enum name="GL_SAMPLER_1D_ARB"/> >+ <enum name="GL_SAMPLER_2D"/> >+ <enum name="GL_SAMPLER_2D_ARB"/> >+ <enum name="GL_SAMPLER_3D"/> >+ <enum name="GL_SAMPLER_3D_ARB"/> >+ <enum name="GL_SAMPLER_3D_OES"/> >+ <enum name="GL_SAMPLER_CUBE"/> >+ <enum name="GL_SAMPLER_CUBE_ARB"/> >+ <enum name="GL_SAMPLER_1D_SHADOW"/> >+ <enum name="GL_SAMPLER_1D_SHADOW_ARB"/> >+ <enum name="GL_SAMPLER_2D_SHADOW"/> >+ <enum name="GL_SAMPLER_2D_SHADOW_ARB"/> >+ <enum name="GL_SAMPLER_2D_SHADOW_EXT"/> >+ <enum name="GL_SAMPLER_2D_RECT"/> >+ <enum name="GL_SAMPLER_2D_RECT_ARB"/> >+ <enum name="GL_SAMPLER_2D_RECT_SHADOW"/> >+ <enum name="GL_SAMPLER_2D_RECT_SHADOW_ARB"/> >+ <enum name="GL_FLOAT_MAT2x3"/> >+ <enum name="GL_FLOAT_MAT2x3_NV"/> >+ <enum name="GL_FLOAT_MAT2x4"/> >+ <enum name="GL_FLOAT_MAT2x4_NV"/> >+ <enum name="GL_FLOAT_MAT3x2"/> >+ <enum name="GL_FLOAT_MAT3x2_NV"/> >+ <enum name="GL_FLOAT_MAT3x4"/> >+ <enum name="GL_FLOAT_MAT3x4_NV"/> >+ <enum name="GL_FLOAT_MAT4x2"/> >+ <enum name="GL_FLOAT_MAT4x2_NV"/> >+ <enum name="GL_FLOAT_MAT4x3"/> >+ <enum name="GL_FLOAT_MAT4x3_NV"/> >+ </group> >+ >+ <group name="InternalFormatPName"> >+ <enum name="GL_NUM_SAMPLE_COUNTS"/> >+ <enum name="GL_SAMPLES"/> >+ <enum name="GL_INTERNALFORMAT_SUPPORTED"/> >+ <enum name="GL_INTERNALFORMAT_PREFERRED"/> >+ <enum name="GL_INTERNALFORMAT_RED_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_GREEN_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_BLUE_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_ALPHA_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_DEPTH_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_STENCIL_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_SHARED_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_RED_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_GREEN_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_BLUE_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_ALPHA_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_DEPTH_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_STENCIL_TYPE"/> >+ <enum name="GL_MAX_WIDTH"/> >+ <enum name="GL_MAX_HEIGHT"/> >+ <enum name="GL_MAX_DEPTH"/> >+ <enum name="GL_MAX_LAYERS"/> >+ <enum name="GL_COLOR_COMPONENTS"/> >+ <enum name="GL_COLOR_RENDERABLE"/> >+ <enum name="GL_DEPTH_RENDERABLE"/> >+ <enum name="GL_STENCIL_RENDERABLE"/> >+ <enum name="GL_FRAMEBUFFER_RENDERABLE"/> >+ <enum name="GL_FRAMEBUFFER_RENDERABLE_LAYERED"/> >+ <enum name="GL_FRAMEBUFFER_BLEND"/> >+ <enum name="GL_READ_PIXELS"/> >+ <enum name="GL_READ_PIXELS_FORMAT"/> >+ <enum name="GL_READ_PIXELS_TYPE"/> >+ <enum name="GL_TEXTURE_IMAGE_FORMAT"/> >+ <enum name="GL_TEXTURE_IMAGE_TYPE"/> >+ <enum name="GL_GET_TEXTURE_IMAGE_FORMAT"/> >+ <enum name="GL_GET_TEXTURE_IMAGE_TYPE"/> >+ <enum name="GL_MIPMAP"/> >+ <enum name="GL_GENERATE_MIPMAP"/> >+ <enum name="GL_AUTO_GENERATE_MIPMAP"/> >+ <enum name="GL_COLOR_ENCODING"/> >+ <enum name="GL_SRGB_READ"/> >+ <enum name="GL_SRGB_WRITE"/> >+ <enum name="GL_FILTER"/> >+ <enum name="GL_VERTEX_TEXTURE"/> >+ <enum name="GL_TESS_CONTROL_TEXTURE"/> >+ <enum name="GL_TESS_EVALUATION_TEXTURE"/> >+ <enum name="GL_GEOMETRY_TEXTURE"/> >+ <enum name="GL_FRAGMENT_TEXTURE"/> >+ <enum name="GL_COMPUTE_TEXTURE"/> >+ <enum name="GL_TEXTURE_SHADOW"/> >+ <enum name="GL_TEXTURE_GATHER"/> >+ <enum name="GL_TEXTURE_GATHER_SHADOW"/> >+ <enum name="GL_SHADER_IMAGE_LOAD"/> >+ <enum name="GL_SHADER_IMAGE_STORE"/> >+ <enum name="GL_SHADER_IMAGE_ATOMIC"/> >+ <enum name="GL_IMAGE_TEXEL_SIZE"/> >+ <enum name="GL_IMAGE_COMPATIBILITY_CLASS"/> >+ <enum name="GL_IMAGE_PIXEL_FORMAT"/> >+ <enum name="GL_IMAGE_PIXEL_TYPE"/> >+ <enum name="GL_IMAGE_FORMAT_COMPATIBILITY_TYPE"/> >+ <enum name="GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST"/> >+ <enum name="GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST"/> >+ <enum name="GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE"/> >+ <enum name="GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE"/> >+ <enum name="GL_TEXTURE_COMPRESSED"/> >+ <enum name="GL_TEXTURE_COMPRESSED_BLOCK_WIDTH"/> >+ <enum name="GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT"/> >+ <enum name="GL_TEXTURE_COMPRESSED_BLOCK_SIZE"/> >+ <enum name="GL_CLEAR_BUFFER"/> >+ <enum name="GL_TEXTURE_VIEW"/> >+ <enum name="GL_VIEW_COMPATIBILITY_CLASS"/> >+ <enum name="GL_CLEAR_TEXTURE"/> >+ </group> >+ >+ <group name="FramebufferAttachmentParameterName"> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER"/> >+ </group> >+ >+ <group name="ProgramInterfacePName"> >+ <enum name="GL_ACTIVE_RESOURCES"/> >+ <enum name="GL_MAX_NAME_LENGTH"/> >+ <enum name="GL_MAX_NUM_ACTIVE_VARIABLES"/> >+ <enum name="GL_MAX_NUM_COMPATIBLE_SUBROUTINES"/> >+ </group> >+ >+ <group name="PrecisionType"> >+ <enum name="GL_LOW_FLOAT"/> >+ <enum name="GL_MEDIUM_FLOAT"/> >+ <enum name="GL_HIGH_FLOAT"/> >+ <enum name="GL_LOW_INT"/> >+ <enum name="GL_MEDIUM_INT"/> >+ <enum name="GL_HIGH_INT"/> >+ </group> >+ >+ <group name="VertexAttribPointerType"> >+ <enum name="GL_BYTE"/> >+ <enum name="GL_UNSIGNED_BYTE"/> >+ <enum name="GL_SHORT"/> >+ <enum name="GL_UNSIGNED_SHORT"/> >+ <enum name="GL_INT"/> >+ <enum name="GL_UNSIGNED_INT"/> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_DOUBLE"/> >+ <enum name="GL_HALF_FLOAT"/> >+ <enum name="GL_FIXED"/> >+ <enum name="GL_INT_2_10_10_10_REV"/> >+ <enum name="GL_UNSIGNED_INT_2_10_10_10_REV"/> >+ <enum name="GL_UNSIGNED_INT_10F_11F_11F_REV"/> >+ </group> >+ >+ <group name="SubroutineParameterName"> >+ <enum name="GL_NUM_COMPATIBLE_SUBROUTINES"/> >+ <enum name="GL_COMPATIBLE_SUBROUTINES"/> >+ <enum name="GL_UNIFORM_SIZE"/> >+ <enum name="GL_UNIFORM_NAME_LENGTH"/> >+ </group> >+ >+ <group name="GetFramebufferParameter"> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_WIDTH"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_HEIGHT"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_LAYERS"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_SAMPLES"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS"/> >+ <enum name="GL_DOUBLEBUFFER"/> >+ <enum name="GL_IMPLEMENTATION_COLOR_READ_FORMAT"/> >+ <enum name="GL_IMPLEMENTATION_COLOR_READ_TYPE"/> >+ <enum name="GL_SAMPLES"/> >+ <enum name="GL_SAMPLE_BUFFERS"/> >+ <enum name="GL_STEREO"/> >+ </group> >+ >+ <group name="PathStringFormat"> >+ <enum name="GL_PATH_FORMAT_SVG_NV" /> >+ <enum name="GL_PATH_FORMAT_PS_NV" /> >+ </group> >+ >+ <group name="PathFontTarget"> >+ <enum name="GL_STANDARD_FONT_NAME_NV" /> >+ <enum name="GL_SYSTEM_FONT_NAME_NV" /> >+ <enum name="GL_FILE_NAME_NV" /> >+ </group> >+ >+ <group name="PathHandleMissingGlyphs"> >+ <enum name="GL_SKIP_MISSING_GLYPH_NV" /> >+ <enum name="GL_USE_MISSING_GLYPH_NV" /> >+ </group> >+ >+ <group name="PathParameter"> >+ <enum name="GL_PATH_STROKE_WIDTH_NV" /> >+ <enum name="GL_PATH_INITIAL_END_CAP_NV" /> >+ <enum name="GL_PATH_TERMINAL_END_CAP_NV" /> >+ <enum name="GL_PATH_JOIN_STYLE_NV" /> >+ <enum name="GL_PATH_MITER_LIMIT_NV" /> >+ <enum name="GL_PATH_INITIAL_DASH_CAP_NV" /> >+ <enum name="GL_PATH_TERMINAL_DASH_CAP_NV" /> >+ <enum name="GL_PATH_DASH_OFFSET_NV" /> >+ <enum name="GL_PATH_CLIENT_LENGTH_NV" /> >+ <enum name="GL_PATH_DASH_OFFSET_RESET_NV" /> >+ <enum name="GL_PATH_FILL_MODE_NV" /> >+ <enum name="GL_PATH_FILL_MASK_NV" /> >+ <enum name="GL_PATH_FILL_COVER_MODE_NV" /> >+ <enum name="GL_PATH_STROKE_COVER_MODE_NV" /> >+ <enum name="GL_PATH_STROKE_MASK_NV" /> >+ <!-- <enum name="GL_PATH_STROKE_BOUND_NV" comment="Removed from extension"/> --> >+ <enum name="GL_PATH_END_CAPS_NV" /> >+ <enum name="GL_PATH_DASH_CAPS_NV" /> >+ <enum name="GL_PATH_COMMAND_COUNT_NV" /> >+ <enum name="GL_PATH_COORD_COUNT_NV" /> >+ <enum name="GL_PATH_DASH_ARRAY_COUNT_NV" /> >+ <enum name="GL_PATH_COMPUTED_LENGTH_NV" /> >+ <enum name="GL_PATH_OBJECT_BOUNDING_BOX_NV" /> >+ <enum name="GL_PATH_FILL_BOUNDING_BOX_NV" /> >+ <enum name="GL_PATH_STROKE_BOUNDING_BOX_NV" /> >+ </group> >+ >+ <group name="PathColor"> >+ <enum name="GL_PRIMARY_COLOR" /> >+ <enum name="GL_PRIMARY_COLOR_NV" /> >+ <enum name="GL_SECONDARY_COLOR_NV" /> >+ </group> >+ >+ <group name="PathGenMode"> >+ <enum name="GL_NONE" /> >+ <enum name="GL_EYE_LINEAR" /> >+ <enum name="GL_OBJECT_LINEAR" /> >+ <enum name="GL_PATH_OBJECT_BOUNDING_BOX_NV" /> >+ <enum name="GL_CONSTANT" /> >+ </group> >+ >+ <group name="TextureLayout"> >+ <enum name="GL_LAYOUT_GENERAL_EXT"/> >+ <enum name="GL_LAYOUT_COLOR_ATTACHMENT_EXT"/> >+ <enum name="GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT"/> >+ <enum name="GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT"/> >+ <enum name="GL_LAYOUT_SHADER_READ_ONLY_EXT"/> >+ <enum name="GL_LAYOUT_TRANSFER_SRC_EXT"/> >+ <enum name="GL_LAYOUT_TRANSFER_DST_EXT"/> >+ <enum name="GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT"/> >+ <enum name="GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT"/> >+ </group> >+ >+ <group name="PathTransformType"> >+ <enum name="GL_NONE" /> >+ <enum name="GL_TRANSLATE_X_NV" /> >+ <enum name="GL_TRANSLATE_Y_NV" /> >+ <enum name="GL_TRANSLATE_2D_NV" /> >+ <enum name="GL_TRANSLATE_3D_NV" /> >+ <enum name="GL_AFFINE_2D_NV" /> >+ <enum name="GL_AFFINE_3D_NV" /> >+ <enum name="GL_TRANSPOSE_AFFINE_2D_NV" /> >+ <enum name="GL_TRANSPOSE_AFFINE_3D_NV" /> >+ </group> >+ >+ <group name="PathElementType"> >+ <enum name="GL_UTF8_NV" /> >+ <enum name="GL_UTF16_NV" /> >+ </group> >+ >+ <group name="PathCoverMode"> >+ <enum name="GL_CONVEX_HULL_NV" /> >+ <enum name="GL_BOUNDING_BOX_NV" /> >+ <enum name="GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV" /> >+ <enum name="GL_PATH_FILL_COVER_MODE_NV" /> >+ </group> >+ >+ <group name="PathFontStyle"> >+ <enum name="GL_NONE" /> >+ <enum name="GL_BOLD_BIT_NV" /> >+ <enum name="GL_ITALIC_BIT_NV" /> >+ </group> >+ >+ <group name="PathMetricMask"> >+ <enum name="GL_GLYPH_WIDTH_BIT_NV" /> >+ <enum name="GL_GLYPH_HEIGHT_BIT_NV" /> >+ <enum name="GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV" /> >+ <enum name="GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV" /> >+ <enum name="GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV" /> >+ <enum name="GL_GLYPH_VERTICAL_BEARING_X_BIT_NV" /> >+ <enum name="GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV" /> >+ <enum name="GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV" /> >+ <enum name="GL_GLYPH_HAS_KERNING_BIT_NV" /> >+ <enum name="GL_FONT_X_MIN_BOUNDS_BIT_NV" /> >+ <enum name="GL_FONT_Y_MIN_BOUNDS_BIT_NV" /> >+ <enum name="GL_FONT_X_MAX_BOUNDS_BIT_NV" /> >+ <enum name="GL_FONT_Y_MAX_BOUNDS_BIT_NV" /> >+ <enum name="GL_FONT_UNITS_PER_EM_BIT_NV" /> >+ <enum name="GL_FONT_ASCENDER_BIT_NV" /> >+ <enum name="GL_FONT_DESCENDER_BIT_NV" /> >+ <enum name="GL_FONT_HEIGHT_BIT_NV" /> >+ <enum name="GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV" /> >+ <enum name="GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV" /> >+ <enum name="GL_FONT_UNDERLINE_POSITION_BIT_NV" /> >+ <enum name="GL_FONT_UNDERLINE_THICKNESS_BIT_NV" /> >+ <enum name="GL_FONT_HAS_KERNING_BIT_NV" /> >+ <enum name="GL_FONT_NUM_GLYPH_INDICES_BIT_NV" /> >+ </group> >+ >+ <group name="PathListMode"> >+ <enum name="GL_ACCUM_ADJACENT_PAIRS_NV" /> >+ <enum name="GL_ADJACENT_PAIRS_NV" /> >+ <enum name="GL_FIRST_TO_REST_NV" /> >+ </group> >+ >+ <group name="ProgramPropertyARB"> >+ <enum name="GL_DELETE_STATUS" /> >+ <enum name="GL_LINK_STATUS" /> >+ <enum name="GL_VALIDATE_STATUS" /> >+ <enum name="GL_INFO_LOG_LENGTH" /> >+ <enum name="GL_ATTACHED_SHADERS" /> >+ <enum name="GL_ACTIVE_ATOMIC_COUNTER_BUFFERS" /> >+ <enum name="GL_ACTIVE_ATTRIBUTES" /> >+ <enum name="GL_ACTIVE_ATTRIBUTE_MAX_LENGTH" /> >+ <enum name="GL_ACTIVE_UNIFORMS" /> >+ <enum name="GL_ACTIVE_UNIFORM_BLOCKS" /> >+ <enum name="GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH" /> >+ <enum name="GL_ACTIVE_UNIFORM_MAX_LENGTH" /> >+ <enum name="GL_COMPUTE_WORK_GROUP_SIZE" /> >+ <enum name="GL_PROGRAM_BINARY_LENGTH" /> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_MODE" /> >+ <enum name="GL_TRANSFORM_FEEDBACK_VARYINGS" /> >+ <enum name="GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH" /> >+ <enum name="GL_GEOMETRY_VERTICES_OUT" /> >+ <enum name="GL_GEOMETRY_INPUT_TYPE" /> >+ <enum name="GL_GEOMETRY_OUTPUT_TYPE" /> >+ </group> >+ </groups> >+ >+ <!-- SECTION: GL enumerant (token) definitions. --> >+ >+ <!-- Bitmasks each have their own namespace, although bits are >+ sometimes reused for other purposes --> >+ >+ <enums namespace="GL" group="AttribMask" type="bitmask"> >+ <enum value="0x00000001" name="GL_CURRENT_BIT"/> >+ <enum value="0x00000002" name="GL_POINT_BIT"/> >+ <enum value="0x00000004" name="GL_LINE_BIT"/> >+ <enum value="0x00000008" name="GL_POLYGON_BIT"/> >+ <enum value="0x00000010" name="GL_POLYGON_STIPPLE_BIT"/> >+ <enum value="0x00000020" name="GL_PIXEL_MODE_BIT"/> >+ <enum value="0x00000040" name="GL_LIGHTING_BIT"/> >+ <enum value="0x00000080" name="GL_FOG_BIT"/> >+ <enum value="0x00000100" name="GL_DEPTH_BUFFER_BIT"/> >+ <enum value="0x00000200" name="GL_ACCUM_BUFFER_BIT"/> >+ <enum value="0x00000400" name="GL_STENCIL_BUFFER_BIT"/> >+ <enum value="0x00000800" name="GL_VIEWPORT_BIT"/> >+ <enum value="0x00001000" name="GL_TRANSFORM_BIT"/> >+ <enum value="0x00002000" name="GL_ENABLE_BIT"/> >+ <enum value="0x00004000" name="GL_COLOR_BUFFER_BIT"/> >+ <enum value="0x00008000" name="GL_HINT_BIT"/> >+ <enum value="0x00010000" name="GL_EVAL_BIT"/> >+ <enum value="0x00020000" name="GL_LIST_BIT"/> >+ <enum value="0x00040000" name="GL_TEXTURE_BIT"/> >+ <enum value="0x00080000" name="GL_SCISSOR_BIT"/> >+ <enum value="0x20000000" name="GL_MULTISAMPLE_BIT"/> >+ <enum value="0x20000000" name="GL_MULTISAMPLE_BIT_ARB"/> >+ <enum value="0x20000000" name="GL_MULTISAMPLE_BIT_EXT"/> >+ <enum value="0x20000000" name="GL_MULTISAMPLE_BIT_3DFX"/> >+ <enum value="0xFFFFFFFF" name="GL_ALL_ATTRIB_BITS" comment="Guaranteed to mark all attribute groups at once"/> >+ </enums> >+ >+ <enums namespace="GL" group="BufferAccessMask" type="bitmask" comment="GL_MAP_{COHERENT,FLUSH_EXPLICIT,INVALIDATE_BUFFER,INVALIDATE_RANGE,PERSISTENT,READ,UNSYNCHRONIZED,WRITE}_{BIT,BIT_EXT} also lie in this namespace"> >+ <!-- Also used: 0x000000ff for bits reused from MapBufferUsageMask below --> >+ </enums> >+ >+ <enums namespace="GL" group="ClearBufferMask" type="bitmask" comment="GL_{DEPTH,ACCUM,STENCIL,COLOR}_BUFFER_BIT also lie in this namespace"> >+ <enum value="0x00008000" name="GL_COVERAGE_BUFFER_BIT_NV" comment="Collides with AttribMask bit GL_HINT_BIT. OK since this token is for OpenGL ES 2, which doesn't have attribute groups."/> >+ <!-- Also used: 0x00004700 for bits reused from AttribMask above --> >+ </enums> >+ >+ <enums namespace="GL" group="ClientAttribMask" type="bitmask"> >+ <enum value="0x00000001" name="GL_CLIENT_PIXEL_STORE_BIT"/> >+ <enum value="0x00000002" name="GL_CLIENT_VERTEX_ARRAY_BIT"/> >+ <enum value="0xFFFFFFFF" name="GL_CLIENT_ALL_ATTRIB_BITS"/> >+ </enums> >+ >+ <enums namespace="GL" group="ContextFlagMask" type="bitmask" comment="Should be shared with WGL/GLX, but aren't since the FORWARD_COMPATIBLE and DEBUG values are swapped vs. WGL/GLX."> >+ <enum value="0x00000001" name="GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT"/> >+ <enum value="0x00000002" name="GL_CONTEXT_FLAG_DEBUG_BIT"/> >+ <enum value="0x00000002" name="GL_CONTEXT_FLAG_DEBUG_BIT_KHR"/> >+ <enum value="0x00000004" name="GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT"/> >+ <enum value="0x00000004" name="GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB"/> >+ <enum value="0x00000008" name="GL_CONTEXT_FLAG_NO_ERROR_BIT"/> >+ <enum value="0x00000008" name="GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR" alias="GL_CONTEXT_FLAG_NO_ERROR_BIT"/> >+ <enum value="0x00000010" name="GL_CONTEXT_FLAG_PROTECTED_CONTENT_BIT_EXT"/> >+ </enums> >+ >+ <enums namespace="GL" group="ContextProfileMask" type="bitmask"> >+ <enum value="0x00000001" name="GL_CONTEXT_CORE_PROFILE_BIT"/> >+ <enum value="0x00000002" name="GL_CONTEXT_COMPATIBILITY_PROFILE_BIT"/> >+ </enums> >+ >+ <enums namespace="GL" group="MapBufferUsageMask" type="bitmask"> >+ <enum value="0x0001" name="GL_MAP_READ_BIT"/> >+ <enum value="0x0001" name="GL_MAP_READ_BIT_EXT"/> >+ <enum value="0x0002" name="GL_MAP_WRITE_BIT"/> >+ <enum value="0x0002" name="GL_MAP_WRITE_BIT_EXT"/> >+ <enum value="0x0004" name="GL_MAP_INVALIDATE_RANGE_BIT"/> >+ <enum value="0x0004" name="GL_MAP_INVALIDATE_RANGE_BIT_EXT"/> >+ <enum value="0x0008" name="GL_MAP_INVALIDATE_BUFFER_BIT"/> >+ <enum value="0x0008" name="GL_MAP_INVALIDATE_BUFFER_BIT_EXT"/> >+ <enum value="0x0010" name="GL_MAP_FLUSH_EXPLICIT_BIT"/> >+ <enum value="0x0010" name="GL_MAP_FLUSH_EXPLICIT_BIT_EXT"/> >+ <enum value="0x0020" name="GL_MAP_UNSYNCHRONIZED_BIT"/> >+ <enum value="0x0020" name="GL_MAP_UNSYNCHRONIZED_BIT_EXT"/> >+ <enum value="0x0040" name="GL_MAP_PERSISTENT_BIT"/> >+ <enum value="0x0040" name="GL_MAP_PERSISTENT_BIT_EXT"/> >+ <enum value="0x0080" name="GL_MAP_COHERENT_BIT"/> >+ <enum value="0x0080" name="GL_MAP_COHERENT_BIT_EXT"/> >+ <enum value="0x0100" name="GL_DYNAMIC_STORAGE_BIT"/> >+ <enum value="0x0100" name="GL_DYNAMIC_STORAGE_BIT_EXT"/> >+ <enum value="0x0200" name="GL_CLIENT_STORAGE_BIT"/> >+ <enum value="0x0200" name="GL_CLIENT_STORAGE_BIT_EXT"/> >+ <enum value="0x0400" name="GL_SPARSE_STORAGE_BIT_ARB"/> >+ <enum value="0x0800" name="GL_LGPU_SEPARATE_STORAGE_BIT_NVX"/> >+ <enum value="0x0800" name="GL_PER_GPU_STORAGE_BIT_NV"/> >+ <unused start="0x1000" end="0x1000" comment="Reserved for NVIDIA"/> >+ <enum value="0x2000" name="GL_EXTERNAL_STORAGE_BIT_NVX"/> >+ </enums> >+ >+ <enums namespace="GL" group="MemoryBarrierMask" type="bitmask"> >+ <enum value="0x00000001" name="GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT"/> >+ <enum value="0x00000001" name="GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT"/> >+ <enum value="0x00000002" name="GL_ELEMENT_ARRAY_BARRIER_BIT"/> >+ <enum value="0x00000002" name="GL_ELEMENT_ARRAY_BARRIER_BIT_EXT"/> >+ <enum value="0x00000004" name="GL_UNIFORM_BARRIER_BIT"/> >+ <enum value="0x00000004" name="GL_UNIFORM_BARRIER_BIT_EXT"/> >+ <enum value="0x00000008" name="GL_TEXTURE_FETCH_BARRIER_BIT"/> >+ <enum value="0x00000008" name="GL_TEXTURE_FETCH_BARRIER_BIT_EXT"/> >+ <enum value="0x00000010" name="GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV"/> >+ <enum value="0x00000020" name="GL_SHADER_IMAGE_ACCESS_BARRIER_BIT"/> >+ <enum value="0x00000020" name="GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT"/> >+ <enum value="0x00000040" name="GL_COMMAND_BARRIER_BIT"/> >+ <enum value="0x00000040" name="GL_COMMAND_BARRIER_BIT_EXT"/> >+ <enum value="0x00000080" name="GL_PIXEL_BUFFER_BARRIER_BIT"/> >+ <enum value="0x00000080" name="GL_PIXEL_BUFFER_BARRIER_BIT_EXT"/> >+ <enum value="0x00000100" name="GL_TEXTURE_UPDATE_BARRIER_BIT"/> >+ <enum value="0x00000100" name="GL_TEXTURE_UPDATE_BARRIER_BIT_EXT"/> >+ <enum value="0x00000200" name="GL_BUFFER_UPDATE_BARRIER_BIT"/> >+ <enum value="0x00000200" name="GL_BUFFER_UPDATE_BARRIER_BIT_EXT"/> >+ <enum value="0x00000400" name="GL_FRAMEBUFFER_BARRIER_BIT"/> >+ <enum value="0x00000400" name="GL_FRAMEBUFFER_BARRIER_BIT_EXT"/> >+ <enum value="0x00000800" name="GL_TRANSFORM_FEEDBACK_BARRIER_BIT"/> >+ <enum value="0x00000800" name="GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT"/> >+ <enum value="0x00001000" name="GL_ATOMIC_COUNTER_BARRIER_BIT"/> >+ <enum value="0x00001000" name="GL_ATOMIC_COUNTER_BARRIER_BIT_EXT"/> >+ <enum value="0x00002000" name="GL_SHADER_STORAGE_BARRIER_BIT"/> >+ <enum value="0x00004000" name="GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT"/> >+ <enum value="0x00004000" name="GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT"/> >+ <enum value="0x00008000" name="GL_QUERY_BUFFER_BARRIER_BIT"/> >+ <enum value="0xFFFFFFFF" name="GL_ALL_BARRIER_BITS"/> >+ <enum value="0xFFFFFFFF" name="GL_ALL_BARRIER_BITS_EXT"/> >+ </enums> >+ >+ <enums namespace="GL" group="OcclusionQueryEventMaskAMD" type="bitmask"> >+ <enum value="0x00000001" name="GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD"/> >+ <enum value="0x00000002" name="GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD"/> >+ <enum value="0x00000004" name="GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD"/> >+ <enum value="0x00000008" name="GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD"/> >+ <enum value="0xFFFFFFFF" name="GL_QUERY_ALL_EVENT_BITS_AMD"/> >+ </enums> >+ >+ <enums namespace="GL" group="SyncObjectMask" type="bitmask"> >+ <enum value="0x00000001" name="GL_SYNC_FLUSH_COMMANDS_BIT"/> >+ <enum value="0x00000001" name="GL_SYNC_FLUSH_COMMANDS_BIT_APPLE"/> >+ </enums> >+ >+ <enums namespace="GL" group="UseProgramStageMask" type="bitmask"> >+ <enum value="0x00000001" name="GL_VERTEX_SHADER_BIT"/> >+ <enum value="0x00000001" name="GL_VERTEX_SHADER_BIT_EXT"/> >+ <enum value="0x00000002" name="GL_FRAGMENT_SHADER_BIT"/> >+ <enum value="0x00000002" name="GL_FRAGMENT_SHADER_BIT_EXT"/> >+ <enum value="0x00000004" name="GL_GEOMETRY_SHADER_BIT"/> >+ <enum value="0x00000004" name="GL_GEOMETRY_SHADER_BIT_EXT"/> >+ <enum value="0x00000004" name="GL_GEOMETRY_SHADER_BIT_OES"/> >+ <enum value="0x00000008" name="GL_TESS_CONTROL_SHADER_BIT"/> >+ <enum value="0x00000008" name="GL_TESS_CONTROL_SHADER_BIT_EXT"/> >+ <enum value="0x00000008" name="GL_TESS_CONTROL_SHADER_BIT_OES"/> >+ <enum value="0x00000010" name="GL_TESS_EVALUATION_SHADER_BIT"/> >+ <enum value="0x00000010" name="GL_TESS_EVALUATION_SHADER_BIT_EXT"/> >+ <enum value="0x00000010" name="GL_TESS_EVALUATION_SHADER_BIT_OES"/> >+ <enum value="0x00000020" name="GL_COMPUTE_SHADER_BIT"/> >+ <enum value="0xFFFFFFFF" name="GL_ALL_SHADER_BITS"/> >+ <enum value="0xFFFFFFFF" name="GL_ALL_SHADER_BITS_EXT"/> >+ </enums> >+ >+ <!-- Bitmasks defined by vendor extensions --> >+ >+ <enums namespace="GL" group="TextureStorageMaskAMD" type="bitmask"> >+ <enum value="0x00000001" name="GL_TEXTURE_STORAGE_SPARSE_BIT_AMD"/> >+ </enums> >+ >+ <enums namespace="GL" group="FragmentShaderDestMaskATI" type="bitmask"> >+ <enum value="0x00000001" name="GL_RED_BIT_ATI"/> >+ <enum value="0x00000002" name="GL_GREEN_BIT_ATI"/> >+ <enum value="0x00000004" name="GL_BLUE_BIT_ATI"/> >+ </enums> >+ >+ <enums namespace="GL" group="FragmentShaderDestModMaskATI" type="bitmask"> >+ <enum value="0x00000001" name="GL_2X_BIT_ATI"/> >+ <enum value="0x00000002" name="GL_4X_BIT_ATI"/> >+ <enum value="0x00000004" name="GL_8X_BIT_ATI"/> >+ <enum value="0x00000008" name="GL_HALF_BIT_ATI"/> >+ <enum value="0x00000010" name="GL_QUARTER_BIT_ATI"/> >+ <enum value="0x00000020" name="GL_EIGHTH_BIT_ATI"/> >+ <enum value="0x00000040" name="GL_SATURATE_BIT_ATI"/> >+ </enums> >+ >+ <enums namespace="GL" group="FragmentShaderColorModMaskATI" type="bitmask"> >+ <!-- Also used: 0x00000001 for GL_2X_BIT_ATI reused from FragmentShaderDestModMaskAT above --> >+ <enum value="0x00000002" name="GL_COMP_BIT_ATI"/> >+ <enum value="0x00000004" name="GL_NEGATE_BIT_ATI"/> >+ <enum value="0x00000008" name="GL_BIAS_BIT_ATI"/> >+ </enums> >+ >+ <enums namespace="GL" group="TraceMaskMESA" type="bitmask"> >+ <enum value="0x0001" name="GL_TRACE_OPERATIONS_BIT_MESA"/> >+ <enum value="0x0002" name="GL_TRACE_PRIMITIVES_BIT_MESA"/> >+ <enum value="0x0004" name="GL_TRACE_ARRAYS_BIT_MESA"/> >+ <enum value="0x0008" name="GL_TRACE_TEXTURES_BIT_MESA"/> >+ <enum value="0x0010" name="GL_TRACE_PIXELS_BIT_MESA"/> >+ <enum value="0x0020" name="GL_TRACE_ERRORS_BIT_MESA"/> >+ <enum value="0xFFFF" name="GL_TRACE_ALL_BITS_MESA"/> >+ </enums> >+ >+ <enums namespace="GL" group="PathRenderingMaskNV" type="bitmask"> >+ <enum value="0x01" name="GL_BOLD_BIT_NV"/> >+ <enum value="0x02" name="GL_ITALIC_BIT_NV"/> >+ <enum value="0x01" name="GL_GLYPH_WIDTH_BIT_NV"/> >+ <enum value="0x02" name="GL_GLYPH_HEIGHT_BIT_NV"/> >+ <enum value="0x04" name="GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV"/> >+ <enum value="0x08" name="GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV"/> >+ <enum value="0x10" name="GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV"/> >+ <enum value="0x20" name="GL_GLYPH_VERTICAL_BEARING_X_BIT_NV"/> >+ <enum value="0x40" name="GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV"/> >+ <enum value="0x80" name="GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV"/> >+ <enum value="0x100" name="GL_GLYPH_HAS_KERNING_BIT_NV"/> >+ <enum value="0x00010000" name="GL_FONT_X_MIN_BOUNDS_BIT_NV"/> >+ <enum value="0x00020000" name="GL_FONT_Y_MIN_BOUNDS_BIT_NV"/> >+ <enum value="0x00040000" name="GL_FONT_X_MAX_BOUNDS_BIT_NV"/> >+ <enum value="0x00080000" name="GL_FONT_Y_MAX_BOUNDS_BIT_NV"/> >+ <enum value="0x00100000" name="GL_FONT_UNITS_PER_EM_BIT_NV"/> >+ <enum value="0x00200000" name="GL_FONT_ASCENDER_BIT_NV"/> >+ <enum value="0x00400000" name="GL_FONT_DESCENDER_BIT_NV"/> >+ <enum value="0x00800000" name="GL_FONT_HEIGHT_BIT_NV"/> >+ <enum value="0x01000000" name="GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV"/> >+ <enum value="0x02000000" name="GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV"/> >+ <enum value="0x04000000" name="GL_FONT_UNDERLINE_POSITION_BIT_NV"/> >+ <enum value="0x08000000" name="GL_FONT_UNDERLINE_THICKNESS_BIT_NV"/> >+ <enum value="0x10000000" name="GL_FONT_HAS_KERNING_BIT_NV"/> >+ <enum value="0x20000000" name="GL_FONT_NUM_GLYPH_INDICES_BIT_NV"/> >+ </enums> >+ >+ <enums namespace="GL" group="PerformanceQueryCapsMaskINTEL" type="bitmask"> >+ <enum value="0x00000000" name="GL_PERFQUERY_SINGLE_CONTEXT_INTEL"/> >+ <enum value="0x00000001" name="GL_PERFQUERY_GLOBAL_CONTEXT_INTEL"/> >+ </enums> >+ >+ <enums namespace="GL" group="VertexHintsMaskPGI" type="bitmask"> >+ <enum value="0x00000004" name="GL_VERTEX23_BIT_PGI"/> >+ <enum value="0x00000008" name="GL_VERTEX4_BIT_PGI"/> >+ <enum value="0x00010000" name="GL_COLOR3_BIT_PGI"/> >+ <enum value="0x00020000" name="GL_COLOR4_BIT_PGI"/> >+ <enum value="0x00040000" name="GL_EDGEFLAG_BIT_PGI"/> >+ <enum value="0x00080000" name="GL_INDEX_BIT_PGI"/> >+ <enum value="0x00100000" name="GL_MAT_AMBIENT_BIT_PGI"/> >+ <enum value="0x00200000" name="GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI"/> >+ <enum value="0x00400000" name="GL_MAT_DIFFUSE_BIT_PGI"/> >+ <enum value="0x00800000" name="GL_MAT_EMISSION_BIT_PGI"/> >+ <enum value="0x01000000" name="GL_MAT_COLOR_INDEXES_BIT_PGI"/> >+ <enum value="0x02000000" name="GL_MAT_SHININESS_BIT_PGI"/> >+ <enum value="0x04000000" name="GL_MAT_SPECULAR_BIT_PGI"/> >+ <enum value="0x08000000" name="GL_NORMAL_BIT_PGI"/> >+ <enum value="0x10000000" name="GL_TEXCOORD1_BIT_PGI"/> >+ <enum value="0x20000000" name="GL_TEXCOORD2_BIT_PGI"/> >+ <enum value="0x40000000" name="GL_TEXCOORD3_BIT_PGI"/> >+ <enum value="0x80000000" name="GL_TEXCOORD4_BIT_PGI"/> >+ </enums> >+ >+ <enums namespace="GL" group="BufferBitQCOM" type="bitmask"> >+ <enum value="0x00000001" name="GL_COLOR_BUFFER_BIT0_QCOM"/> >+ <enum value="0x00000002" name="GL_COLOR_BUFFER_BIT1_QCOM"/> >+ <enum value="0x00000004" name="GL_COLOR_BUFFER_BIT2_QCOM"/> >+ <enum value="0x00000008" name="GL_COLOR_BUFFER_BIT3_QCOM"/> >+ <enum value="0x00000010" name="GL_COLOR_BUFFER_BIT4_QCOM"/> >+ <enum value="0x00000020" name="GL_COLOR_BUFFER_BIT5_QCOM"/> >+ <enum value="0x00000040" name="GL_COLOR_BUFFER_BIT6_QCOM"/> >+ <enum value="0x00000080" name="GL_COLOR_BUFFER_BIT7_QCOM"/> >+ <enum value="0x00000100" name="GL_DEPTH_BUFFER_BIT0_QCOM"/> >+ <enum value="0x00000200" name="GL_DEPTH_BUFFER_BIT1_QCOM"/> >+ <enum value="0x00000400" name="GL_DEPTH_BUFFER_BIT2_QCOM"/> >+ <enum value="0x00000800" name="GL_DEPTH_BUFFER_BIT3_QCOM"/> >+ <enum value="0x00001000" name="GL_DEPTH_BUFFER_BIT4_QCOM"/> >+ <enum value="0x00002000" name="GL_DEPTH_BUFFER_BIT5_QCOM"/> >+ <enum value="0x00004000" name="GL_DEPTH_BUFFER_BIT6_QCOM"/> >+ <enum value="0x00008000" name="GL_DEPTH_BUFFER_BIT7_QCOM"/> >+ <enum value="0x00010000" name="GL_STENCIL_BUFFER_BIT0_QCOM"/> >+ <enum value="0x00020000" name="GL_STENCIL_BUFFER_BIT1_QCOM"/> >+ <enum value="0x00040000" name="GL_STENCIL_BUFFER_BIT2_QCOM"/> >+ <enum value="0x00080000" name="GL_STENCIL_BUFFER_BIT3_QCOM"/> >+ <enum value="0x00100000" name="GL_STENCIL_BUFFER_BIT4_QCOM"/> >+ <enum value="0x00200000" name="GL_STENCIL_BUFFER_BIT5_QCOM"/> >+ <enum value="0x00400000" name="GL_STENCIL_BUFFER_BIT6_QCOM"/> >+ <enum value="0x00800000" name="GL_STENCIL_BUFFER_BIT7_QCOM"/> >+ <enum value="0x01000000" name="GL_MULTISAMPLE_BUFFER_BIT0_QCOM"/> >+ <enum value="0x02000000" name="GL_MULTISAMPLE_BUFFER_BIT1_QCOM"/> >+ <enum value="0x04000000" name="GL_MULTISAMPLE_BUFFER_BIT2_QCOM"/> >+ <enum value="0x08000000" name="GL_MULTISAMPLE_BUFFER_BIT3_QCOM"/> >+ <enum value="0x10000000" name="GL_MULTISAMPLE_BUFFER_BIT4_QCOM"/> >+ <enum value="0x20000000" name="GL_MULTISAMPLE_BUFFER_BIT5_QCOM"/> >+ <enum value="0x40000000" name="GL_MULTISAMPLE_BUFFER_BIT6_QCOM"/> >+ <enum value="0x80000000" name="GL_MULTISAMPLE_BUFFER_BIT7_QCOM"/> >+ </enums> >+ >+ <enums namespace="GL" group="FoveationConfigBitQCOM" type="bitmask"> >+ <enum value="0x00000001" name="GL_FOVEATION_ENABLE_BIT_QCOM"/> >+ <enum value="0x00000002" name="GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM"/> >+ </enums> >+ >+ <enums namespace="GL" group="FfdMaskSGIX" type="bitmask"> >+ <enum value="0x00000001" name="GL_TEXTURE_DEFORMATION_BIT_SGIX"/> >+ <enum value="0x00000002" name="GL_GEOMETRY_DEFORMATION_BIT_SGIX"/> >+ </enums> >+ >+ >+ <!-- Non-bitmask enums with their own namespace. Generally small numbers >+ used for indexed access. --> >+ >+ <enums namespace="GL" group="CommandOpcodesNV" vendor="NV" comment="For NV_command_list."> >+ <enum value="0x0000" name="GL_TERMINATE_SEQUENCE_COMMAND_NV"/> >+ <enum value="0x0001" name="GL_NOP_COMMAND_NV"/> >+ <enum value="0x0002" name="GL_DRAW_ELEMENTS_COMMAND_NV"/> >+ <enum value="0x0003" name="GL_DRAW_ARRAYS_COMMAND_NV"/> >+ <enum value="0x0004" name="GL_DRAW_ELEMENTS_STRIP_COMMAND_NV"/> >+ <enum value="0x0005" name="GL_DRAW_ARRAYS_STRIP_COMMAND_NV"/> >+ <enum value="0x0006" name="GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV"/> >+ <enum value="0x0007" name="GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV"/> >+ <enum value="0x0008" name="GL_ELEMENT_ADDRESS_COMMAND_NV"/> >+ <enum value="0x0009" name="GL_ATTRIBUTE_ADDRESS_COMMAND_NV"/> >+ <enum value="0x000A" name="GL_UNIFORM_ADDRESS_COMMAND_NV"/> >+ <enum value="0x000B" name="GL_BLEND_COLOR_COMMAND_NV"/> >+ <enum value="0x000C" name="GL_STENCIL_REF_COMMAND_NV"/> >+ <enum value="0x000D" name="GL_LINE_WIDTH_COMMAND_NV"/> >+ <enum value="0x000E" name="GL_POLYGON_OFFSET_COMMAND_NV"/> >+ <enum value="0x000F" name="GL_ALPHA_REF_COMMAND_NV"/> >+ <enum value="0x0010" name="GL_VIEWPORT_COMMAND_NV"/> >+ <enum value="0x0011" name="GL_SCISSOR_COMMAND_NV"/> >+ <enum value="0x0012" name="GL_FRONT_FACE_COMMAND_NV"/> >+ </enums> >+ >+ <enums namespace="GL" group="MapTextureFormatINTEL" vendor="INTEL" comment="Texture memory layouts for INTEL_map_texture"> >+ <enum value="0" name="GL_LAYOUT_DEFAULT_INTEL"/> >+ <enum value="1" name="GL_LAYOUT_LINEAR_INTEL"/> >+ <enum value="2" name="GL_LAYOUT_LINEAR_CPU_CACHED_INTEL"/> >+ </enums> >+ >+ <enums namespace="GL" group="PathRenderingTokenNV" vendor="NV"> >+ <enum value="0x00" name="GL_CLOSE_PATH_NV"/> >+ <enum value="0x02" name="GL_MOVE_TO_NV"/> >+ <enum value="0x03" name="GL_RELATIVE_MOVE_TO_NV"/> >+ <enum value="0x04" name="GL_LINE_TO_NV"/> >+ <enum value="0x05" name="GL_RELATIVE_LINE_TO_NV"/> >+ <enum value="0x06" name="GL_HORIZONTAL_LINE_TO_NV"/> >+ <enum value="0x07" name="GL_RELATIVE_HORIZONTAL_LINE_TO_NV"/> >+ <enum value="0x08" name="GL_VERTICAL_LINE_TO_NV"/> >+ <enum value="0x09" name="GL_RELATIVE_VERTICAL_LINE_TO_NV"/> >+ <enum value="0x0A" name="GL_QUADRATIC_CURVE_TO_NV"/> >+ <enum value="0x0B" name="GL_RELATIVE_QUADRATIC_CURVE_TO_NV"/> >+ <enum value="0x0C" name="GL_CUBIC_CURVE_TO_NV"/> >+ <enum value="0x0D" name="GL_RELATIVE_CUBIC_CURVE_TO_NV"/> >+ <enum value="0x0E" name="GL_SMOOTH_QUADRATIC_CURVE_TO_NV"/> >+ <enum value="0x0F" name="GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV"/> >+ <enum value="0x10" name="GL_SMOOTH_CUBIC_CURVE_TO_NV"/> >+ <enum value="0x11" name="GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV"/> >+ <enum value="0x12" name="GL_SMALL_CCW_ARC_TO_NV"/> >+ <enum value="0x13" name="GL_RELATIVE_SMALL_CCW_ARC_TO_NV"/> >+ <enum value="0x14" name="GL_SMALL_CW_ARC_TO_NV"/> >+ <enum value="0x15" name="GL_RELATIVE_SMALL_CW_ARC_TO_NV"/> >+ <enum value="0x16" name="GL_LARGE_CCW_ARC_TO_NV"/> >+ <enum value="0x17" name="GL_RELATIVE_LARGE_CCW_ARC_TO_NV"/> >+ <enum value="0x18" name="GL_LARGE_CW_ARC_TO_NV"/> >+ <enum value="0x19" name="GL_RELATIVE_LARGE_CW_ARC_TO_NV"/> >+ <enum value="0x1A" name="GL_CONIC_CURVE_TO_NV"/> >+ <enum value="0x1B" name="GL_RELATIVE_CONIC_CURVE_TO_NV"/> >+ <unused start="0x1C" end="0xBF" comment="Unused for PathRenderingTokenNV"/> >+ <enum value="0xC0" name="GL_SHARED_EDGE_NV"/> >+ <unused start="0xC1" end="0xE7" comment="Unused for PathRenderingTokenNV"/> >+ <enum value="0xE8" name="GL_ROUNDED_RECT_NV"/> >+ <enum value="0xE9" name="GL_RELATIVE_ROUNDED_RECT_NV"/> >+ <enum value="0xEA" name="GL_ROUNDED_RECT2_NV"/> >+ <enum value="0xEB" name="GL_RELATIVE_ROUNDED_RECT2_NV"/> >+ <enum value="0xEC" name="GL_ROUNDED_RECT4_NV"/> >+ <enum value="0xED" name="GL_RELATIVE_ROUNDED_RECT4_NV"/> >+ <enum value="0xEE" name="GL_ROUNDED_RECT8_NV"/> >+ <enum value="0xEF" name="GL_RELATIVE_ROUNDED_RECT8_NV"/> >+ <enum value="0xF0" name="GL_RESTART_PATH_NV"/> >+ <enum value="0xF2" name="GL_DUP_FIRST_CUBIC_CURVE_TO_NV"/> >+ <enum value="0xF4" name="GL_DUP_LAST_CUBIC_CURVE_TO_NV"/> >+ <enum value="0xF6" name="GL_RECT_NV"/> >+ <enum value="0xF7" name="GL_RELATIVE_RECT_NV"/> >+ <enum value="0xF8" name="GL_CIRCULAR_CCW_ARC_TO_NV"/> >+ <enum value="0xFA" name="GL_CIRCULAR_CW_ARC_TO_NV"/> >+ <enum value="0xFC" name="GL_CIRCULAR_TANGENT_ARC_TO_NV"/> >+ <enum value="0xFE" name="GL_ARC_TO_NV"/> >+ <enum value="0xFF" name="GL_RELATIVE_ARC_TO_NV"/> >+ </enums> >+ >+ <enums namespace="GL" group="TransformFeedbackTokenNV" vendor="NV" comment="For NV_transform_feedback. No clue why small negative values are used"> >+ <enum value="-2" name="GL_NEXT_BUFFER_NV"/> >+ <enum value="-3" name="GL_SKIP_COMPONENTS4_NV"/> >+ <enum value="-4" name="GL_SKIP_COMPONENTS3_NV"/> >+ <enum value="-5" name="GL_SKIP_COMPONENTS2_NV"/> >+ <enum value="-6" name="GL_SKIP_COMPONENTS1_NV"/> >+ </enums> >+ >+ <enums namespace="GL" group="TriangleListSUN" vendor="SUN"> >+ <enum value="0x0001" name="GL_RESTART_SUN"/> >+ <enum value="0x0002" name="GL_REPLACE_MIDDLE_SUN"/> >+ <enum value="0x0003" name="GL_REPLACE_OLDEST_SUN"/> >+ </enums> >+ >+ <!-- The default ("API") enum namespace starts here. While some >+ assigned values may overlap, and different parts of the >+ namespace are reserved for different purposes, it is a single >+ namespace. The "class" attribute indicates some of the reserved >+ purposes but is by no means complete (and cannot be, since many >+ tokens are reused for different purposes in different >+ extensions and API versions). --> >+ >+ <enums namespace="GL" group="SpecialNumbers" vendor="ARB" comment="Tokens whose numeric value is intrinsically meaningful"> >+ <enum value="0" name="GL_FALSE"/> >+ <enum value="0" name="GL_NO_ERROR"/> >+ <enum value="0" name="GL_ZERO"/> >+ <enum value="0" name="GL_NONE"/> >+ <enum value="0" name="GL_NONE_OES"/> >+ <enum value="1" name="GL_TRUE"/> >+ <enum value="1" name="GL_ONE"/> >+ <enum value="0xFFFFFFFF" name="GL_INVALID_INDEX" type="u" comment="Tagged as uint"/> >+ <enum value="0xFFFFFFFF" name="GL_ALL_PIXELS_AMD"/> >+ <enum value="0xFFFFFFFFFFFFFFFF" name="GL_TIMEOUT_IGNORED" type="ull" comment="Tagged as uint64"/> >+ <enum value="0xFFFFFFFFFFFFFFFF" name="GL_TIMEOUT_IGNORED_APPLE" type="ull" comment="Tagged as uint64"/> >+ <enum value="1" name="GL_VERSION_ES_CL_1_0" comment="Not an API enum. API definition macro for ES 1.0/1.1 headers"/> >+ <enum value="1" name="GL_VERSION_ES_CM_1_1" comment="Not an API enum. API definition macro for ES 1.0/1.1 headers"/> >+ <enum value="1" name="GL_VERSION_ES_CL_1_1" comment="Not an API enum. API definition macro for ES 1.0/1.1 headers"/> >+ <enum value="16" name="GL_UUID_SIZE_EXT"/> >+ <enum value="8" name="GL_LUID_SIZE_EXT"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x0000" end="0x7FFF" vendor="ARB" comment="Mostly OpenGL 1.0/1.1 enum assignments. Unused ranges should generally remain unused."> >+ <enum value="0x0000" name="GL_POINTS"/> >+ <enum value="0x0001" name="GL_LINES"/> >+ <enum value="0x0002" name="GL_LINE_LOOP"/> >+ <enum value="0x0003" name="GL_LINE_STRIP"/> >+ <enum value="0x0004" name="GL_TRIANGLES"/> >+ <enum value="0x0005" name="GL_TRIANGLE_STRIP"/> >+ <enum value="0x0006" name="GL_TRIANGLE_FAN"/> >+ <enum value="0x0007" name="GL_QUADS"/> >+ <enum value="0x0007" name="GL_QUADS_EXT"/> >+ <enum value="0x0007" name="GL_QUADS_OES"/> >+ <enum value="0x0008" name="GL_QUAD_STRIP"/> >+ <enum value="0x0009" name="GL_POLYGON"/> >+ <enum value="0x000A" name="GL_LINES_ADJACENCY"/> >+ <enum value="0x000A" name="GL_LINES_ADJACENCY_ARB"/> >+ <enum value="0x000A" name="GL_LINES_ADJACENCY_EXT"/> >+ <enum value="0x000A" name="GL_LINES_ADJACENCY_OES"/> >+ <enum value="0x000B" name="GL_LINE_STRIP_ADJACENCY"/> >+ <enum value="0x000B" name="GL_LINE_STRIP_ADJACENCY_ARB"/> >+ <enum value="0x000B" name="GL_LINE_STRIP_ADJACENCY_EXT"/> >+ <enum value="0x000B" name="GL_LINE_STRIP_ADJACENCY_OES"/> >+ <enum value="0x000C" name="GL_TRIANGLES_ADJACENCY"/> >+ <enum value="0x000C" name="GL_TRIANGLES_ADJACENCY_ARB"/> >+ <enum value="0x000C" name="GL_TRIANGLES_ADJACENCY_EXT"/> >+ <enum value="0x000C" name="GL_TRIANGLES_ADJACENCY_OES"/> >+ <enum value="0x000D" name="GL_TRIANGLE_STRIP_ADJACENCY"/> >+ <enum value="0x000D" name="GL_TRIANGLE_STRIP_ADJACENCY_ARB"/> >+ <enum value="0x000D" name="GL_TRIANGLE_STRIP_ADJACENCY_EXT"/> >+ <enum value="0x000D" name="GL_TRIANGLE_STRIP_ADJACENCY_OES"/> >+ <enum value="0x000E" name="GL_PATCHES"/> >+ <enum value="0x000E" name="GL_PATCHES_EXT"/> >+ <enum value="0x000E" name="GL_PATCHES_OES"/> >+ <unused start="0x000F" end="0x00FF" comment="Unused for PrimitiveType"/> >+ <enum value="0x0100" name="GL_ACCUM"/> >+ <enum value="0x0101" name="GL_LOAD"/> >+ <enum value="0x0102" name="GL_RETURN"/> >+ <enum value="0x0103" name="GL_MULT"/> >+ <enum value="0x0104" name="GL_ADD"/> >+ <unused start="0x0105" end="0x01FF" comment="Unused for AccumOp"/> >+ <enum value="0x0200" name="GL_NEVER"/> >+ <enum value="0x0201" name="GL_LESS"/> >+ <enum value="0x0202" name="GL_EQUAL"/> >+ <enum value="0x0203" name="GL_LEQUAL"/> >+ <enum value="0x0204" name="GL_GREATER"/> >+ <enum value="0x0205" name="GL_NOTEQUAL"/> >+ <enum value="0x0206" name="GL_GEQUAL"/> >+ <enum value="0x0207" name="GL_ALWAYS"/> >+ <unused start="0x0208" end="0x02FF" comment="Unused for AlphaFunction"/> >+ <enum value="0x0300" name="GL_SRC_COLOR"/> >+ <enum value="0x0301" name="GL_ONE_MINUS_SRC_COLOR"/> >+ <enum value="0x0302" name="GL_SRC_ALPHA"/> >+ <enum value="0x0303" name="GL_ONE_MINUS_SRC_ALPHA"/> >+ <enum value="0x0304" name="GL_DST_ALPHA"/> >+ <enum value="0x0305" name="GL_ONE_MINUS_DST_ALPHA"/> >+ <enum value="0x0306" name="GL_DST_COLOR"/> >+ <enum value="0x0307" name="GL_ONE_MINUS_DST_COLOR"/> >+ <enum value="0x0308" name="GL_SRC_ALPHA_SATURATE"/> >+ <enum value="0x0308" name="GL_SRC_ALPHA_SATURATE_EXT"/> >+ <unused start="0x0309" end="0x03FF" comment="Unused for BlendingFactor"/> >+ <enum value="0x0400" name="GL_FRONT_LEFT"/> >+ <enum value="0x0401" name="GL_FRONT_RIGHT"/> >+ <enum value="0x0402" name="GL_BACK_LEFT"/> >+ <enum value="0x0403" name="GL_BACK_RIGHT"/> >+ <enum value="0x0404" name="GL_FRONT"/> >+ <enum value="0x0405" name="GL_BACK"/> >+ <enum value="0x0406" name="GL_LEFT"/> >+ <enum value="0x0407" name="GL_RIGHT"/> >+ <enum value="0x0408" name="GL_FRONT_AND_BACK"/> >+ <enum value="0x0409" name="GL_AUX0"/> >+ <enum value="0x040A" name="GL_AUX1"/> >+ <enum value="0x040B" name="GL_AUX2"/> >+ <enum value="0x040C" name="GL_AUX3"/> >+ <unused start="0x040D" end="0x04FF" comment="Unused for DrawBufferMode"/> >+ <enum value="0x0500" name="GL_INVALID_ENUM"/> >+ <enum value="0x0501" name="GL_INVALID_VALUE"/> >+ <enum value="0x0502" name="GL_INVALID_OPERATION"/> >+ <enum value="0x0503" name="GL_STACK_OVERFLOW"/> >+ <enum value="0x0503" name="GL_STACK_OVERFLOW_KHR"/> >+ <enum value="0x0504" name="GL_STACK_UNDERFLOW"/> >+ <enum value="0x0504" name="GL_STACK_UNDERFLOW_KHR"/> >+ <enum value="0x0505" name="GL_OUT_OF_MEMORY"/> >+ <enum value="0x0506" name="GL_INVALID_FRAMEBUFFER_OPERATION"/> >+ <enum value="0x0506" name="GL_INVALID_FRAMEBUFFER_OPERATION_EXT"/> >+ <enum value="0x0506" name="GL_INVALID_FRAMEBUFFER_OPERATION_OES"/> >+ <enum value="0x0507" name="GL_CONTEXT_LOST"/> >+ <enum value="0x0507" name="GL_CONTEXT_LOST_KHR"/> >+ <unused start="0x0508" end="0x05FF" comment="Unused for ErrorCode"/> >+ <enum value="0x0600" name="GL_2D"/> >+ <enum value="0x0601" name="GL_3D"/> >+ <enum value="0x0602" name="GL_3D_COLOR"/> >+ <enum value="0x0603" name="GL_3D_COLOR_TEXTURE"/> >+ <enum value="0x0604" name="GL_4D_COLOR_TEXTURE"/> >+ <unused start="0x0605" end="0x06FF" comment="Unused for FeedbackType"/> >+ <enum value="0x0700" name="GL_PASS_THROUGH_TOKEN"/> >+ <enum value="0x0701" name="GL_POINT_TOKEN"/> >+ <enum value="0x0702" name="GL_LINE_TOKEN"/> >+ <enum value="0x0703" name="GL_POLYGON_TOKEN"/> >+ <enum value="0x0704" name="GL_BITMAP_TOKEN"/> >+ <enum value="0x0705" name="GL_DRAW_PIXEL_TOKEN"/> >+ <enum value="0x0706" name="GL_COPY_PIXEL_TOKEN"/> >+ <enum value="0x0707" name="GL_LINE_RESET_TOKEN"/> >+ <unused start="0x0708" end="0x07FF" comment="Unused for FeedbackToken"/> >+ <enum value="0x0800" name="GL_EXP"/> >+ <enum value="0x0801" name="GL_EXP2"/> >+ <unused start="0x0802" end="0x08FF" comment="Unused for FogMode"/> >+ <enum value="0x0900" name="GL_CW"/> >+ <enum value="0x0901" name="GL_CCW"/> >+ <unused start="0x0902" end="0x09FF" comment="Unused for FrontFaceDirection"/> >+ <enum value="0x0A00" name="GL_COEFF"/> >+ <enum value="0x0A01" name="GL_ORDER"/> >+ <enum value="0x0A02" name="GL_DOMAIN"/> >+ <unused start="0x0A03" end="0x0AFF" comment="Unused for GetMapQuery"/> >+ <enum value="0x0B00" name="GL_CURRENT_COLOR"/> >+ <enum value="0x0B01" name="GL_CURRENT_INDEX"/> >+ <enum value="0x0B02" name="GL_CURRENT_NORMAL"/> >+ <enum value="0x0B03" name="GL_CURRENT_TEXTURE_COORDS"/> >+ <enum value="0x0B04" name="GL_CURRENT_RASTER_COLOR"/> >+ <enum value="0x0B05" name="GL_CURRENT_RASTER_INDEX"/> >+ <enum value="0x0B06" name="GL_CURRENT_RASTER_TEXTURE_COORDS"/> >+ <enum value="0x0B07" name="GL_CURRENT_RASTER_POSITION"/> >+ <enum value="0x0B08" name="GL_CURRENT_RASTER_POSITION_VALID"/> >+ <enum value="0x0B09" name="GL_CURRENT_RASTER_DISTANCE"/> >+ >+ <enum value="0x0B10" name="GL_POINT_SMOOTH"/> >+ <enum value="0x0B11" name="GL_POINT_SIZE"/> >+ <enum value="0x0B12" name="GL_POINT_SIZE_RANGE"/> >+ <enum value="0x0B12" name="GL_SMOOTH_POINT_SIZE_RANGE" alias="GL_POINT_SIZE_RANGE"/> >+ <enum value="0x0B13" name="GL_POINT_SIZE_GRANULARITY"/> >+ <enum value="0x0B13" name="GL_SMOOTH_POINT_SIZE_GRANULARITY" alias="GL_POINT_SIZE_GRANULARITY"/> >+ >+ <enum value="0x0B20" name="GL_LINE_SMOOTH"/> >+ <enum value="0x0B21" name="GL_LINE_WIDTH"/> >+ <enum value="0x0B22" name="GL_LINE_WIDTH_RANGE"/> >+ <enum value="0x0B22" name="GL_SMOOTH_LINE_WIDTH_RANGE" alias="GL_LINE_WIDTH_RANGE"/> >+ <enum value="0x0B23" name="GL_LINE_WIDTH_GRANULARITY"/> >+ <enum value="0x0B23" name="GL_SMOOTH_LINE_WIDTH_GRANULARITY" alias="GL_LINE_WIDTH_GRANULARITY"/> >+ <enum value="0x0B24" name="GL_LINE_STIPPLE"/> >+ <enum value="0x0B25" name="GL_LINE_STIPPLE_PATTERN"/> >+ <enum value="0x0B26" name="GL_LINE_STIPPLE_REPEAT"/> >+ >+ <enum value="0x0B30" name="GL_LIST_MODE"/> >+ <enum value="0x0B31" name="GL_MAX_LIST_NESTING"/> >+ <enum value="0x0B32" name="GL_LIST_BASE"/> >+ <enum value="0x0B33" name="GL_LIST_INDEX"/> >+ >+ <enum value="0x0B40" name="GL_POLYGON_MODE"/> >+ <enum value="0x0B40" name="GL_POLYGON_MODE_NV"/> >+ <enum value="0x0B41" name="GL_POLYGON_SMOOTH"/> >+ <enum value="0x0B42" name="GL_POLYGON_STIPPLE"/> >+ <enum value="0x0B43" name="GL_EDGE_FLAG"/> >+ <enum value="0x0B44" name="GL_CULL_FACE"/> >+ <enum value="0x0B45" name="GL_CULL_FACE_MODE"/> >+ <enum value="0x0B46" name="GL_FRONT_FACE"/> >+ >+ <enum value="0x0B50" name="GL_LIGHTING"/> >+ <enum value="0x0B51" name="GL_LIGHT_MODEL_LOCAL_VIEWER"/> >+ <enum value="0x0B52" name="GL_LIGHT_MODEL_TWO_SIDE"/> >+ <enum value="0x0B53" name="GL_LIGHT_MODEL_AMBIENT"/> >+ <enum value="0x0B54" name="GL_SHADE_MODEL"/> >+ <enum value="0x0B55" name="GL_COLOR_MATERIAL_FACE"/> >+ <enum value="0x0B56" name="GL_COLOR_MATERIAL_PARAMETER"/> >+ <enum value="0x0B57" name="GL_COLOR_MATERIAL"/> >+ >+ <enum value="0x0B60" name="GL_FOG"/> >+ <enum value="0x0B61" name="GL_FOG_INDEX"/> >+ <enum value="0x0B62" name="GL_FOG_DENSITY"/> >+ <enum value="0x0B63" name="GL_FOG_START"/> >+ <enum value="0x0B64" name="GL_FOG_END"/> >+ <enum value="0x0B65" name="GL_FOG_MODE"/> >+ <enum value="0x0B66" name="GL_FOG_COLOR"/> >+ >+ <enum value="0x0B70" name="GL_DEPTH_RANGE"/> >+ <enum value="0x0B71" name="GL_DEPTH_TEST"/> >+ <enum value="0x0B72" name="GL_DEPTH_WRITEMASK"/> >+ <enum value="0x0B73" name="GL_DEPTH_CLEAR_VALUE"/> >+ <enum value="0x0B74" name="GL_DEPTH_FUNC"/> >+ >+ <enum value="0x0B80" name="GL_ACCUM_CLEAR_VALUE"/> >+ >+ <enum value="0x0B90" name="GL_STENCIL_TEST"/> >+ <enum value="0x0B91" name="GL_STENCIL_CLEAR_VALUE"/> >+ <enum value="0x0B92" name="GL_STENCIL_FUNC"/> >+ <enum value="0x0B93" name="GL_STENCIL_VALUE_MASK"/> >+ <enum value="0x0B94" name="GL_STENCIL_FAIL"/> >+ <enum value="0x0B95" name="GL_STENCIL_PASS_DEPTH_FAIL"/> >+ <enum value="0x0B96" name="GL_STENCIL_PASS_DEPTH_PASS"/> >+ <enum value="0x0B97" name="GL_STENCIL_REF"/> >+ <enum value="0x0B98" name="GL_STENCIL_WRITEMASK"/> >+ >+ <enum value="0x0BA0" name="GL_MATRIX_MODE"/> >+ <enum value="0x0BA1" name="GL_NORMALIZE"/> >+ <enum value="0x0BA2" name="GL_VIEWPORT"/> >+ <enum value="0x0BA3" name="GL_MODELVIEW_STACK_DEPTH"/> >+ <enum value="0x0BA3" name="GL_MODELVIEW0_STACK_DEPTH_EXT"/> >+ <enum value="0x0BA3" name="GL_PATH_MODELVIEW_STACK_DEPTH_NV"/> >+ <enum value="0x0BA4" name="GL_PROJECTION_STACK_DEPTH"/> >+ <enum value="0x0BA4" name="GL_PATH_PROJECTION_STACK_DEPTH_NV"/> >+ <enum value="0x0BA5" name="GL_TEXTURE_STACK_DEPTH"/> >+ <enum value="0x0BA6" name="GL_MODELVIEW_MATRIX"/> >+ <enum value="0x0BA6" name="GL_MODELVIEW0_MATRIX_EXT"/> >+ <enum value="0x0BA6" name="GL_PATH_MODELVIEW_MATRIX_NV"/> >+ <enum value="0x0BA7" name="GL_PROJECTION_MATRIX"/> >+ <enum value="0x0BA7" name="GL_PATH_PROJECTION_MATRIX_NV"/> >+ <enum value="0x0BA8" name="GL_TEXTURE_MATRIX"/> >+ >+ <enum value="0x0BB0" name="GL_ATTRIB_STACK_DEPTH"/> >+ <enum value="0x0BB1" name="GL_CLIENT_ATTRIB_STACK_DEPTH"/> >+ >+ <enum value="0x0BC0" name="GL_ALPHA_TEST"/> >+ <enum value="0x0BC0" name="GL_ALPHA_TEST_QCOM"/> >+ <enum value="0x0BC1" name="GL_ALPHA_TEST_FUNC"/> >+ <enum value="0x0BC1" name="GL_ALPHA_TEST_FUNC_QCOM"/> >+ <enum value="0x0BC2" name="GL_ALPHA_TEST_REF"/> >+ <enum value="0x0BC2" name="GL_ALPHA_TEST_REF_QCOM"/> >+ >+ <enum value="0x0BD0" name="GL_DITHER"/> >+ >+ <enum value="0x0BE0" name="GL_BLEND_DST"/> >+ <enum value="0x0BE1" name="GL_BLEND_SRC"/> >+ <enum value="0x0BE2" name="GL_BLEND"/> >+ >+ <enum value="0x0BF0" name="GL_LOGIC_OP_MODE"/> >+ <enum value="0x0BF1" name="GL_INDEX_LOGIC_OP"/> >+ <enum value="0x0BF1" name="GL_LOGIC_OP"/> >+ <enum value="0x0BF2" name="GL_COLOR_LOGIC_OP"/> >+ >+ <enum value="0x0C00" name="GL_AUX_BUFFERS"/> >+ <enum value="0x0C01" name="GL_DRAW_BUFFER"/> >+ <enum value="0x0C01" name="GL_DRAW_BUFFER_EXT"/> >+ <enum value="0x0C02" name="GL_READ_BUFFER"/> >+ <enum value="0x0C02" name="GL_READ_BUFFER_EXT"/> >+ <enum value="0x0C02" name="GL_READ_BUFFER_NV"/> >+ >+ <enum value="0x0C10" name="GL_SCISSOR_BOX"/> >+ <enum value="0x0C11" name="GL_SCISSOR_TEST"/> >+ >+ <enum value="0x0C20" name="GL_INDEX_CLEAR_VALUE"/> >+ <enum value="0x0C21" name="GL_INDEX_WRITEMASK"/> >+ <enum value="0x0C22" name="GL_COLOR_CLEAR_VALUE"/> >+ <enum value="0x0C23" name="GL_COLOR_WRITEMASK"/> >+ >+ <enum value="0x0C30" name="GL_INDEX_MODE"/> >+ <enum value="0x0C31" name="GL_RGBA_MODE"/> >+ <enum value="0x0C32" name="GL_DOUBLEBUFFER"/> >+ <enum value="0x0C33" name="GL_STEREO"/> >+ >+ <enum value="0x0C40" name="GL_RENDER_MODE"/> >+ >+ <enum value="0x0C50" name="GL_PERSPECTIVE_CORRECTION_HINT"/> >+ <enum value="0x0C51" name="GL_POINT_SMOOTH_HINT"/> >+ <enum value="0x0C52" name="GL_LINE_SMOOTH_HINT"/> >+ <enum value="0x0C53" name="GL_POLYGON_SMOOTH_HINT"/> >+ <enum value="0x0C54" name="GL_FOG_HINT"/> >+ >+ <enum value="0x0C60" name="GL_TEXTURE_GEN_S"/> >+ <enum value="0x0C61" name="GL_TEXTURE_GEN_T"/> >+ <enum value="0x0C62" name="GL_TEXTURE_GEN_R"/> >+ <enum value="0x0C63" name="GL_TEXTURE_GEN_Q"/> >+ >+ <enum value="0x0C70" name="GL_PIXEL_MAP_I_TO_I"/> >+ <enum value="0x0C71" name="GL_PIXEL_MAP_S_TO_S"/> >+ <enum value="0x0C72" name="GL_PIXEL_MAP_I_TO_R"/> >+ <enum value="0x0C73" name="GL_PIXEL_MAP_I_TO_G"/> >+ <enum value="0x0C74" name="GL_PIXEL_MAP_I_TO_B"/> >+ <enum value="0x0C75" name="GL_PIXEL_MAP_I_TO_A"/> >+ <enum value="0x0C76" name="GL_PIXEL_MAP_R_TO_R"/> >+ <enum value="0x0C77" name="GL_PIXEL_MAP_G_TO_G"/> >+ <enum value="0x0C78" name="GL_PIXEL_MAP_B_TO_B"/> >+ <enum value="0x0C79" name="GL_PIXEL_MAP_A_TO_A"/> >+ >+ <enum value="0x0CB0" name="GL_PIXEL_MAP_I_TO_I_SIZE"/> >+ <enum value="0x0CB1" name="GL_PIXEL_MAP_S_TO_S_SIZE"/> >+ <enum value="0x0CB2" name="GL_PIXEL_MAP_I_TO_R_SIZE"/> >+ <enum value="0x0CB3" name="GL_PIXEL_MAP_I_TO_G_SIZE"/> >+ <enum value="0x0CB4" name="GL_PIXEL_MAP_I_TO_B_SIZE"/> >+ <enum value="0x0CB5" name="GL_PIXEL_MAP_I_TO_A_SIZE"/> >+ <enum value="0x0CB6" name="GL_PIXEL_MAP_R_TO_R_SIZE"/> >+ <enum value="0x0CB7" name="GL_PIXEL_MAP_G_TO_G_SIZE"/> >+ <enum value="0x0CB8" name="GL_PIXEL_MAP_B_TO_B_SIZE"/> >+ <enum value="0x0CB9" name="GL_PIXEL_MAP_A_TO_A_SIZE"/> >+ >+ <enum value="0x0CF0" name="GL_UNPACK_SWAP_BYTES"/> >+ <enum value="0x0CF1" name="GL_UNPACK_LSB_FIRST"/> >+ <enum value="0x0CF2" name="GL_UNPACK_ROW_LENGTH"/> >+ <enum value="0x0CF2" name="GL_UNPACK_ROW_LENGTH_EXT"/> >+ <enum value="0x0CF3" name="GL_UNPACK_SKIP_ROWS"/> >+ <enum value="0x0CF3" name="GL_UNPACK_SKIP_ROWS_EXT"/> >+ <enum value="0x0CF4" name="GL_UNPACK_SKIP_PIXELS"/> >+ <enum value="0x0CF4" name="GL_UNPACK_SKIP_PIXELS_EXT"/> >+ <enum value="0x0CF5" name="GL_UNPACK_ALIGNMENT"/> >+ >+ <enum value="0x0D00" name="GL_PACK_SWAP_BYTES"/> >+ <enum value="0x0D01" name="GL_PACK_LSB_FIRST"/> >+ <enum value="0x0D02" name="GL_PACK_ROW_LENGTH"/> >+ <enum value="0x0D03" name="GL_PACK_SKIP_ROWS"/> >+ <enum value="0x0D04" name="GL_PACK_SKIP_PIXELS"/> >+ <enum value="0x0D05" name="GL_PACK_ALIGNMENT"/> >+ >+ <enum value="0x0D10" name="GL_MAP_COLOR"/> >+ <enum value="0x0D11" name="GL_MAP_STENCIL"/> >+ <enum value="0x0D12" name="GL_INDEX_SHIFT"/> >+ <enum value="0x0D13" name="GL_INDEX_OFFSET"/> >+ <enum value="0x0D14" name="GL_RED_SCALE"/> >+ <enum value="0x0D15" name="GL_RED_BIAS"/> >+ <enum value="0x0D16" name="GL_ZOOM_X"/> >+ <enum value="0x0D17" name="GL_ZOOM_Y"/> >+ <enum value="0x0D18" name="GL_GREEN_SCALE"/> >+ <enum value="0x0D19" name="GL_GREEN_BIAS"/> >+ <enum value="0x0D1A" name="GL_BLUE_SCALE"/> >+ <enum value="0x0D1B" name="GL_BLUE_BIAS"/> >+ <enum value="0x0D1C" name="GL_ALPHA_SCALE"/> >+ <enum value="0x0D1D" name="GL_ALPHA_BIAS"/> >+ <enum value="0x0D1E" name="GL_DEPTH_SCALE"/> >+ <enum value="0x0D1F" name="GL_DEPTH_BIAS"/> >+ >+ <enum value="0x0D30" name="GL_MAX_EVAL_ORDER"/> >+ <enum value="0x0D31" name="GL_MAX_LIGHTS"/> >+ <enum value="0x0D32" name="GL_MAX_CLIP_PLANES"/> >+ <enum value="0x0D32" name="GL_MAX_CLIP_PLANES_IMG"/> >+ <enum value="0x0D32" name="GL_MAX_CLIP_DISTANCES" alias="GL_MAX_CLIP_PLANES"/> >+ <enum value="0x0D32" name="GL_MAX_CLIP_DISTANCES_EXT" alias="GL_MAX_CLIP_PLANES"/> >+ <enum value="0x0D32" name="GL_MAX_CLIP_DISTANCES_APPLE"/> >+ <enum value="0x0D33" name="GL_MAX_TEXTURE_SIZE"/> >+ <enum value="0x0D34" name="GL_MAX_PIXEL_MAP_TABLE"/> >+ <enum value="0x0D35" name="GL_MAX_ATTRIB_STACK_DEPTH"/> >+ <enum value="0x0D36" name="GL_MAX_MODELVIEW_STACK_DEPTH"/> >+ <enum value="0x0D36" name="GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV"/> >+ <enum value="0x0D37" name="GL_MAX_NAME_STACK_DEPTH"/> >+ <enum value="0x0D38" name="GL_MAX_PROJECTION_STACK_DEPTH"/> >+ <enum value="0x0D38" name="GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV"/> >+ <enum value="0x0D39" name="GL_MAX_TEXTURE_STACK_DEPTH"/> >+ <enum value="0x0D3A" name="GL_MAX_VIEWPORT_DIMS"/> >+ <enum value="0x0D3B" name="GL_MAX_CLIENT_ATTRIB_STACK_DEPTH"/> >+ >+ <enum value="0x0D50" name="GL_SUBPIXEL_BITS"/> >+ <enum value="0x0D51" name="GL_INDEX_BITS"/> >+ <enum value="0x0D52" name="GL_RED_BITS"/> >+ <enum value="0x0D53" name="GL_GREEN_BITS"/> >+ <enum value="0x0D54" name="GL_BLUE_BITS"/> >+ <enum value="0x0D55" name="GL_ALPHA_BITS"/> >+ <enum value="0x0D56" name="GL_DEPTH_BITS"/> >+ <enum value="0x0D57" name="GL_STENCIL_BITS"/> >+ <enum value="0x0D58" name="GL_ACCUM_RED_BITS"/> >+ <enum value="0x0D59" name="GL_ACCUM_GREEN_BITS"/> >+ <enum value="0x0D5A" name="GL_ACCUM_BLUE_BITS"/> >+ <enum value="0x0D5B" name="GL_ACCUM_ALPHA_BITS"/> >+ >+ <enum value="0x0D70" name="GL_NAME_STACK_DEPTH"/> >+ >+ <enum value="0x0D80" name="GL_AUTO_NORMAL"/> >+ >+ <enum value="0x0D90" name="GL_MAP1_COLOR_4"/> >+ <enum value="0x0D91" name="GL_MAP1_INDEX"/> >+ <enum value="0x0D92" name="GL_MAP1_NORMAL"/> >+ <enum value="0x0D93" name="GL_MAP1_TEXTURE_COORD_1"/> >+ <enum value="0x0D94" name="GL_MAP1_TEXTURE_COORD_2"/> >+ <enum value="0x0D95" name="GL_MAP1_TEXTURE_COORD_3"/> >+ <enum value="0x0D96" name="GL_MAP1_TEXTURE_COORD_4"/> >+ <enum value="0x0D97" name="GL_MAP1_VERTEX_3"/> >+ <enum value="0x0D98" name="GL_MAP1_VERTEX_4"/> >+ >+ <enum value="0x0DB0" name="GL_MAP2_COLOR_4"/> >+ <enum value="0x0DB1" name="GL_MAP2_INDEX"/> >+ <enum value="0x0DB2" name="GL_MAP2_NORMAL"/> >+ <enum value="0x0DB3" name="GL_MAP2_TEXTURE_COORD_1"/> >+ <enum value="0x0DB4" name="GL_MAP2_TEXTURE_COORD_2"/> >+ <enum value="0x0DB5" name="GL_MAP2_TEXTURE_COORD_3"/> >+ <enum value="0x0DB6" name="GL_MAP2_TEXTURE_COORD_4"/> >+ <enum value="0x0DB7" name="GL_MAP2_VERTEX_3"/> >+ <enum value="0x0DB8" name="GL_MAP2_VERTEX_4"/> >+ >+ <enum value="0x0DD0" name="GL_MAP1_GRID_DOMAIN"/> >+ <enum value="0x0DD1" name="GL_MAP1_GRID_SEGMENTS"/> >+ <enum value="0x0DD2" name="GL_MAP2_GRID_DOMAIN"/> >+ <enum value="0x0DD3" name="GL_MAP2_GRID_SEGMENTS"/> >+ >+ <enum value="0x0DE0" name="GL_TEXTURE_1D"/> >+ <enum value="0x0DE1" name="GL_TEXTURE_2D"/> >+ >+ <enum value="0x0DF0" name="GL_FEEDBACK_BUFFER_POINTER"/> >+ <enum value="0x0DF1" name="GL_FEEDBACK_BUFFER_SIZE"/> >+ <enum value="0x0DF2" name="GL_FEEDBACK_BUFFER_TYPE"/> >+ <enum value="0x0DF3" name="GL_SELECTION_BUFFER_POINTER"/> >+ <enum value="0x0DF4" name="GL_SELECTION_BUFFER_SIZE"/> >+ <unused start="0x0DF5" end="0xFFFF" comment="Unused for GetPName"/> >+ <enum value="0x1000" name="GL_TEXTURE_WIDTH"/> >+ <enum value="0x1001" name="GL_TEXTURE_HEIGHT"/> >+ <enum value="0x1003" name="GL_TEXTURE_INTERNAL_FORMAT"/> >+ <enum value="0x1003" name="GL_TEXTURE_COMPONENTS"/> >+ <enum value="0x1004" name="GL_TEXTURE_BORDER_COLOR"/> >+ <enum value="0x1004" name="GL_TEXTURE_BORDER_COLOR_EXT"/> >+ <enum value="0x1004" name="GL_TEXTURE_BORDER_COLOR_NV"/> >+ <enum value="0x1004" name="GL_TEXTURE_BORDER_COLOR_OES"/> >+ <enum value="0x1005" name="GL_TEXTURE_BORDER"/> >+ <enum value="0x1006" name="GL_TEXTURE_TARGET"/> >+ <unused start="0x1007" end="0x10FF" comment="Unused for GetTextureParameter"/> >+ <enum value="0x1100" name="GL_DONT_CARE"/> >+ <enum value="0x1101" name="GL_FASTEST"/> >+ <enum value="0x1102" name="GL_NICEST"/> >+ <unused start="0x1103" end="0x11FF" comment="Unused for HintMode"/> >+ <enum value="0x1200" name="GL_AMBIENT"/> >+ <enum value="0x1201" name="GL_DIFFUSE"/> >+ <enum value="0x1202" name="GL_SPECULAR"/> >+ <enum value="0x1203" name="GL_POSITION"/> >+ <enum value="0x1204" name="GL_SPOT_DIRECTION"/> >+ <enum value="0x1205" name="GL_SPOT_EXPONENT"/> >+ <enum value="0x1206" name="GL_SPOT_CUTOFF"/> >+ <enum value="0x1207" name="GL_CONSTANT_ATTENUATION"/> >+ <enum value="0x1208" name="GL_LINEAR_ATTENUATION"/> >+ <enum value="0x1209" name="GL_QUADRATIC_ATTENUATION"/> >+ <unused start="0x1210" end="0x12FF" comment="Unused for LightParameter"/> >+ <enum value="0x1300" name="GL_COMPILE"/> >+ <enum value="0x1301" name="GL_COMPILE_AND_EXECUTE"/> >+ <unused start="0x1302" end="0x13FF" comment="Unused for ListMode"/> >+ <enum value="0x1400" name="GL_BYTE"/> >+ <enum value="0x1401" name="GL_UNSIGNED_BYTE"/> >+ <enum value="0x1402" name="GL_SHORT"/> >+ <enum value="0x1403" name="GL_UNSIGNED_SHORT"/> >+ <enum value="0x1404" name="GL_INT"/> >+ <enum value="0x1405" name="GL_UNSIGNED_INT"/> >+ <enum value="0x1406" name="GL_FLOAT"/> >+ <enum value="0x1407" name="GL_2_BYTES"/> >+ <enum value="0x1407" name="GL_2_BYTES_NV"/> >+ <enum value="0x1408" name="GL_3_BYTES"/> >+ <enum value="0x1408" name="GL_3_BYTES_NV"/> >+ <enum value="0x1409" name="GL_4_BYTES"/> >+ <enum value="0x1409" name="GL_4_BYTES_NV"/> >+ <enum value="0x140A" name="GL_DOUBLE"/> >+ <enum value="0x140A" name="GL_DOUBLE_EXT"/> >+ <enum value="0x140B" name="GL_HALF_FLOAT"/> >+ <enum value="0x140B" name="GL_HALF_FLOAT_ARB"/> >+ <enum value="0x140B" name="GL_HALF_FLOAT_NV"/> >+ <enum value="0x140B" name="GL_HALF_APPLE"/> >+ <enum value="0x140C" name="GL_FIXED"/> >+ <enum value="0x140C" name="GL_FIXED_OES"/> >+ <unused start="0x140D" comment="Leave gap to preserve even/odd int/uint token values"/> >+ <enum value="0x140E" name="GL_INT64_ARB"/> >+ <enum value="0x140E" name="GL_INT64_NV"/> >+ <enum value="0x140F" name="GL_UNSIGNED_INT64_ARB"/> >+ <enum value="0x140F" name="GL_UNSIGNED_INT64_NV"/> >+ <unused start="0x1410" end="0x14FF" comment="Unused for DataType"/> >+ <enum value="0x1500" name="GL_CLEAR"/> >+ <enum value="0x1501" name="GL_AND"/> >+ <enum value="0x1502" name="GL_AND_REVERSE"/> >+ <enum value="0x1503" name="GL_COPY"/> >+ <enum value="0x1504" name="GL_AND_INVERTED"/> >+ <enum value="0x1505" name="GL_NOOP"/> >+ <enum value="0x1506" name="GL_XOR"/> >+ <enum value="0x1506" name="GL_XOR_NV"/> >+ <enum value="0x1507" name="GL_OR"/> >+ <enum value="0x1508" name="GL_NOR"/> >+ <enum value="0x1509" name="GL_EQUIV"/> >+ <enum value="0x150A" name="GL_INVERT"/> >+ <enum value="0x150B" name="GL_OR_REVERSE"/> >+ <enum value="0x150C" name="GL_COPY_INVERTED"/> >+ <enum value="0x150D" name="GL_OR_INVERTED"/> >+ <enum value="0x150E" name="GL_NAND"/> >+ <enum value="0x150F" name="GL_SET"/> >+ <unused start="0x1510" end="0x15FF" comment="Unused for LogicOp"/> >+ <enum value="0x1600" name="GL_EMISSION"/> >+ <enum value="0x1601" name="GL_SHININESS"/> >+ <enum value="0x1602" name="GL_AMBIENT_AND_DIFFUSE"/> >+ <enum value="0x1603" name="GL_COLOR_INDEXES"/> >+ <unused start="0x1604" end="0x16FF" comment="Unused for MaterialParameter"/> >+ <enum value="0x1700" name="GL_MODELVIEW"/> >+ <enum value="0x1700" name="GL_MODELVIEW0_ARB"/> >+ <enum value="0x1700" name="GL_MODELVIEW0_EXT"/> >+ <enum value="0x1700" name="GL_PATH_MODELVIEW_NV"/> >+ <enum value="0x1701" name="GL_PROJECTION"/> >+ <enum value="0x1701" name="GL_PATH_PROJECTION_NV"/> >+ <enum value="0x1702" name="GL_TEXTURE"/> >+ <unused start="0x1703" end="0x17FF" comment="Unused for MatrixMode"/> >+ <enum value="0x1800" name="GL_COLOR"/> >+ <enum value="0x1800" name="GL_COLOR_EXT"/> >+ <enum value="0x1801" name="GL_DEPTH"/> >+ <enum value="0x1801" name="GL_DEPTH_EXT"/> >+ <enum value="0x1802" name="GL_STENCIL"/> >+ <enum value="0x1802" name="GL_STENCIL_EXT"/> >+ <unused start="0x1803" end="0x18FF" comment="Unused for PixelCopyType"/> >+ <enum value="0x1900" name="GL_COLOR_INDEX"/> >+ <enum value="0x1901" name="GL_STENCIL_INDEX"/> >+ <enum value="0x1901" name="GL_STENCIL_INDEX_OES"/> >+ <enum value="0x1902" name="GL_DEPTH_COMPONENT"/> >+ <enum value="0x1903" name="GL_RED"/> >+ <enum value="0x1903" name="GL_RED_EXT"/> >+ <enum value="0x1903" name="GL_RED_NV"/> >+ <enum value="0x1904" name="GL_GREEN"/> >+ <enum value="0x1904" name="GL_GREEN_NV"/> >+ <enum value="0x1905" name="GL_BLUE"/> >+ <enum value="0x1905" name="GL_BLUE_NV"/> >+ <enum value="0x1906" name="GL_ALPHA"/> >+ <enum value="0x1907" name="GL_RGB"/> >+ <enum value="0x1908" name="GL_RGBA"/> >+ <enum value="0x1909" name="GL_LUMINANCE"/> >+ <enum value="0x190A" name="GL_LUMINANCE_ALPHA"/> >+ <unused start="0x1910" end="0x19FF" comment="Unused for PixelFormat"/> >+ <enum value="0x1A00" name="GL_BITMAP"/> >+ <unused start="0x1A01" end="0x1AFF" comment="Unused for PixelType"/> >+ <enum value="0x1B00" name="GL_POINT"/> >+ <enum value="0x1B00" name="GL_POINT_NV"/> >+ <enum value="0x1B01" name="GL_LINE"/> >+ <enum value="0x1B01" name="GL_LINE_NV"/> >+ <enum value="0x1B02" name="GL_FILL"/> >+ <enum value="0x1B02" name="GL_FILL_NV"/> >+ <unused start="0x1B03" end="0x1BFF" comment="Unused for PolygonMode"/> >+ <enum value="0x1C00" name="GL_RENDER"/> >+ <enum value="0x1C01" name="GL_FEEDBACK"/> >+ <enum value="0x1C02" name="GL_SELECT"/> >+ <unused start="0x1C03" end="0x1CFF" comment="Unused for RenderingMode"/> >+ <enum value="0x1D00" name="GL_FLAT"/> >+ <enum value="0x1D01" name="GL_SMOOTH"/> >+ <unused start="0x1D02" end="0x1DFF" comment="Unused for ShadingModel"/> >+ <enum value="0x1E00" name="GL_KEEP"/> >+ <enum value="0x1E01" name="GL_REPLACE"/> >+ <enum value="0x1E02" name="GL_INCR"/> >+ <enum value="0x1E03" name="GL_DECR"/> >+ <unused start="0x1E04" end="0x1EFF" comment="Unused for StencilOp"/> >+ <enum value="0x1F00" name="GL_VENDOR"/> >+ <enum value="0x1F01" name="GL_RENDERER"/> >+ <enum value="0x1F02" name="GL_VERSION"/> >+ <enum value="0x1F03" name="GL_EXTENSIONS"/> >+ <unused start="0x1F04" end="0x1FFF" comment="Unused for StringName"/> >+ <enum value="0x2000" name="GL_S"/> >+ <enum value="0x2001" name="GL_T"/> >+ <enum value="0x2002" name="GL_R"/> >+ <enum value="0x2003" name="GL_Q"/> >+ <unused start="0x2004" end="0x20FF" comment="Unused for TextureCoordName"/> >+ <enum value="0x2100" name="GL_MODULATE"/> >+ <enum value="0x2101" name="GL_DECAL"/> >+ <unused start="0x2102" end="0x21FF" comment="Unused for TextureEnvMode"/> >+ <enum value="0x2200" name="GL_TEXTURE_ENV_MODE"/> >+ <enum value="0x2201" name="GL_TEXTURE_ENV_COLOR"/> >+ <unused start="0x2202" end="0x22FF" comment="Unused for TextureEnvParameter"/> >+ <enum value="0x2300" name="GL_TEXTURE_ENV"/> >+ <unused start="0x2301" end="0x23FF" comment="Unused for TextureEnvTarget"/> >+ <enum value="0x2400" name="GL_EYE_LINEAR"/> >+ <enum value="0x2400" name="GL_EYE_LINEAR_NV"/> >+ <enum value="0x2401" name="GL_OBJECT_LINEAR"/> >+ <enum value="0x2401" name="GL_OBJECT_LINEAR_NV"/> >+ <enum value="0x2402" name="GL_SPHERE_MAP"/> >+ <unused start="0x2403" end="0x24FF" comment="Unused for TextureGenMode"/> >+ <enum value="0x2500" name="GL_TEXTURE_GEN_MODE"/> >+ <enum value="0x2500" name="GL_TEXTURE_GEN_MODE_OES"/> >+ <enum value="0x2501" name="GL_OBJECT_PLANE"/> >+ <enum value="0x2502" name="GL_EYE_PLANE"/> >+ <unused start="0x2503" end="0x25FF" comment="Unused for TextureGenParameter"/> >+ <enum value="0x2600" name="GL_NEAREST"/> >+ <enum value="0x2601" name="GL_LINEAR"/> >+ <unused start="0x2602" end="0x26FF" comment="Unused for TextureMagFilter"/> >+ <enum value="0x2700" name="GL_NEAREST_MIPMAP_NEAREST"/> >+ <enum value="0x2701" name="GL_LINEAR_MIPMAP_NEAREST"/> >+ <enum value="0x2702" name="GL_NEAREST_MIPMAP_LINEAR"/> >+ <enum value="0x2703" name="GL_LINEAR_MIPMAP_LINEAR"/> >+ <unused start="0x2704" end="0x27FF" comment="Unused for TextureMinFilter"/> >+ <enum value="0x2800" name="GL_TEXTURE_MAG_FILTER"/> >+ <enum value="0x2801" name="GL_TEXTURE_MIN_FILTER"/> >+ <enum value="0x2802" name="GL_TEXTURE_WRAP_S"/> >+ <enum value="0x2803" name="GL_TEXTURE_WRAP_T"/> >+ <unused start="0x2804" end="0x28FF" comment="Unused for TextureParameterName"/> >+ <enum value="0x2900" name="GL_CLAMP"/> >+ <enum value="0x2901" name="GL_REPEAT"/> >+ <unused start="0x2902" end="0x29FF" comment="Unused for TextureWrapMode"/> >+ <enum value="0x2A00" name="GL_POLYGON_OFFSET_UNITS"/> >+ <enum value="0x2A01" name="GL_POLYGON_OFFSET_POINT"/> >+ <enum value="0x2A01" name="GL_POLYGON_OFFSET_POINT_NV"/> >+ <enum value="0x2A02" name="GL_POLYGON_OFFSET_LINE"/> >+ <enum value="0x2A02" name="GL_POLYGON_OFFSET_LINE_NV"/> >+ <unused start="0x2A03" end="0x2A09" comment="Unused for PolygonOffset"/> >+ <enum value="0x2A10" name="GL_R3_G3_B2"/> >+ <unused start="0x2A11" end="0x2A1F" comment="Unused for InternalFormat"/> >+ <enum value="0x2A20" name="GL_V2F"/> >+ <enum value="0x2A21" name="GL_V3F"/> >+ <enum value="0x2A22" name="GL_C4UB_V2F"/> >+ <enum value="0x2A23" name="GL_C4UB_V3F"/> >+ <enum value="0x2A24" name="GL_C3F_V3F"/> >+ <enum value="0x2A25" name="GL_N3F_V3F"/> >+ <enum value="0x2A26" name="GL_C4F_N3F_V3F"/> >+ <enum value="0x2A27" name="GL_T2F_V3F"/> >+ <enum value="0x2A28" name="GL_T4F_V4F"/> >+ <enum value="0x2A29" name="GL_T2F_C4UB_V3F"/> >+ <enum value="0x2A2A" name="GL_T2F_C3F_V3F"/> >+ <enum value="0x2A2B" name="GL_T2F_N3F_V3F"/> >+ <enum value="0x2A2C" name="GL_T2F_C4F_N3F_V3F"/> >+ <enum value="0x2A2D" name="GL_T4F_C4F_N3F_V4F"/> >+ <unused start="0x2A2E" end="0x2FFF" comment="Unused for InterleavedArrayFormat"/> >+ <enum value="0x3000" name="GL_CLIP_PLANE0"/> >+ <enum value="0x3000" name="GL_CLIP_PLANE0_IMG"/> >+ <enum value="0x3000" name="GL_CLIP_DISTANCE0" alias="GL_CLIP_PLANE0"/> >+ <enum value="0x3000" name="GL_CLIP_DISTANCE0_EXT" alias="GL_CLIP_PLANE0"/> >+ <enum value="0x3000" name="GL_CLIP_DISTANCE0_APPLE"/> >+ <enum value="0x3001" name="GL_CLIP_PLANE1"/> >+ <enum value="0x3001" name="GL_CLIP_PLANE1_IMG"/> >+ <enum value="0x3001" name="GL_CLIP_DISTANCE1" alias="GL_CLIP_PLANE1"/> >+ <enum value="0x3001" name="GL_CLIP_DISTANCE1_EXT" alias="GL_CLIP_PLANE1"/> >+ <enum value="0x3001" name="GL_CLIP_DISTANCE1_APPLE"/> >+ <enum value="0x3002" name="GL_CLIP_PLANE2"/> >+ <enum value="0x3002" name="GL_CLIP_PLANE2_IMG"/> >+ <enum value="0x3002" name="GL_CLIP_DISTANCE2" alias="GL_CLIP_PLANE2"/> >+ <enum value="0x3002" name="GL_CLIP_DISTANCE2_EXT" alias="GL_CLIP_PLANE2"/> >+ <enum value="0x3002" name="GL_CLIP_DISTANCE2_APPLE"/> >+ <enum value="0x3003" name="GL_CLIP_PLANE3"/> >+ <enum value="0x3003" name="GL_CLIP_PLANE3_IMG"/> >+ <enum value="0x3003" name="GL_CLIP_DISTANCE3" alias="GL_CLIP_PLANE3"/> >+ <enum value="0x3003" name="GL_CLIP_DISTANCE3_EXT" alias="GL_CLIP_PLANE3"/> >+ <enum value="0x3003" name="GL_CLIP_DISTANCE3_APPLE"/> >+ <enum value="0x3004" name="GL_CLIP_PLANE4"/> >+ <enum value="0x3004" name="GL_CLIP_PLANE4_IMG"/> >+ <enum value="0x3004" name="GL_CLIP_DISTANCE4" alias="GL_CLIP_PLANE4"/> >+ <enum value="0x3004" name="GL_CLIP_DISTANCE4_EXT" alias="GL_CLIP_PLANE4"/> >+ <enum value="0x3004" name="GL_CLIP_DISTANCE4_APPLE"/> >+ <enum value="0x3005" name="GL_CLIP_PLANE5"/> >+ <enum value="0x3005" name="GL_CLIP_PLANE5_IMG"/> >+ <enum value="0x3005" name="GL_CLIP_DISTANCE5" alias="GL_CLIP_PLANE5"/> >+ <enum value="0x3005" name="GL_CLIP_DISTANCE5_EXT" alias="GL_CLIP_PLANE5"/> >+ <enum value="0x3005" name="GL_CLIP_DISTANCE5_APPLE"/> >+ <enum value="0x3006" name="GL_CLIP_DISTANCE6"/> >+ <enum value="0x3006" name="GL_CLIP_DISTANCE6_EXT" alias="GL_CLIP_DISTANCE6"/> >+ <enum value="0x3006" name="GL_CLIP_DISTANCE6_APPLE"/> >+ <enum value="0x3007" name="GL_CLIP_DISTANCE7"/> >+ <enum value="0x3007" name="GL_CLIP_DISTANCE7_EXT" alias="GL_CLIP_DISTANCE7"/> >+ <enum value="0x3007" name="GL_CLIP_DISTANCE7_APPLE"/> >+ <unused start="0x3008" end="0x3FFF" comment="Unused for ClipPlaneName"/> >+ <enum value="0x4000" name="GL_LIGHT0"/> >+ <enum value="0x4001" name="GL_LIGHT1"/> >+ <enum value="0x4002" name="GL_LIGHT2"/> >+ <enum value="0x4003" name="GL_LIGHT3"/> >+ <enum value="0x4004" name="GL_LIGHT4"/> >+ <enum value="0x4005" name="GL_LIGHT5"/> >+ <enum value="0x4006" name="GL_LIGHT6"/> >+ <enum value="0x4007" name="GL_LIGHT7"/> >+ <unused start="0x4008" end="0x4FFF" comment="Unused for LightName"/> >+ <unused start="0x5000" end="0x5FFF" comment="Unused. Do not use."/> >+ <unused start="0x6000" end="0x6FFF" comment="Experimental (internal/test only) range. DO NOT SHIP VALUES IN THIS RANGE."/> >+ <unused start="0x7000" end="0x7FFF" comment="Unused. Do not use."/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8000" end="0x80BF" vendor="ARB" comment="The primary GL enumerant space begins here. All modern enum allocations are in this range. These enums are mostly assigned the default class since it's a great deal of not very useful work to be more specific"> >+ <enum value="0x8000" name="GL_ABGR_EXT"/> >+ <enum value="0x8001" name="GL_CONSTANT_COLOR"/> >+ <enum value="0x8001" name="GL_CONSTANT_COLOR_EXT"/> >+ <enum value="0x8002" name="GL_ONE_MINUS_CONSTANT_COLOR"/> >+ <enum value="0x8002" name="GL_ONE_MINUS_CONSTANT_COLOR_EXT"/> >+ <enum value="0x8003" name="GL_CONSTANT_ALPHA"/> >+ <enum value="0x8003" name="GL_CONSTANT_ALPHA_EXT"/> >+ <enum value="0x8004" name="GL_ONE_MINUS_CONSTANT_ALPHA"/> >+ <enum value="0x8004" name="GL_ONE_MINUS_CONSTANT_ALPHA_EXT"/> >+ <enum value="0x8005" name="GL_BLEND_COLOR"/> >+ <enum value="0x8005" name="GL_BLEND_COLOR_EXT"/> >+ <enum value="0x8006" name="GL_FUNC_ADD"/> >+ <enum value="0x8006" name="GL_FUNC_ADD_EXT"/> >+ <enum value="0x8006" name="GL_FUNC_ADD_OES"/> >+ <enum value="0x8007" name="GL_MIN"/> >+ <enum value="0x8007" name="GL_MIN_EXT"/> >+ <enum value="0x8008" name="GL_MAX"/> >+ <enum value="0x8008" name="GL_MAX_EXT"/> >+ <enum value="0x8009" name="GL_BLEND_EQUATION"/> >+ <enum value="0x8009" name="GL_BLEND_EQUATION_EXT"/> >+ <enum value="0x8009" name="GL_BLEND_EQUATION_OES"/> >+ <enum value="0x8009" name="GL_BLEND_EQUATION_RGB"/> >+ <enum value="0x8009" name="GL_BLEND_EQUATION_RGB_EXT"/> >+ <enum value="0x8009" name="GL_BLEND_EQUATION_RGB_OES"/> >+ <enum value="0x800A" name="GL_FUNC_SUBTRACT"/> >+ <enum value="0x800A" name="GL_FUNC_SUBTRACT_EXT"/> >+ <enum value="0x800A" name="GL_FUNC_SUBTRACT_OES"/> >+ <enum value="0x800B" name="GL_FUNC_REVERSE_SUBTRACT"/> >+ <enum value="0x800B" name="GL_FUNC_REVERSE_SUBTRACT_EXT"/> >+ <enum value="0x800B" name="GL_FUNC_REVERSE_SUBTRACT_OES"/> >+ <enum value="0x800C" name="GL_CMYK_EXT"/> >+ <enum value="0x800D" name="GL_CMYKA_EXT"/> >+ <enum value="0x800E" name="GL_PACK_CMYK_HINT_EXT"/> >+ <enum value="0x800F" name="GL_UNPACK_CMYK_HINT_EXT"/> >+ <enum value="0x8010" name="GL_CONVOLUTION_1D"/> >+ <enum value="0x8010" name="GL_CONVOLUTION_1D_EXT"/> >+ <enum value="0x8011" name="GL_CONVOLUTION_2D"/> >+ <enum value="0x8011" name="GL_CONVOLUTION_2D_EXT"/> >+ <enum value="0x8012" name="GL_SEPARABLE_2D"/> >+ <enum value="0x8012" name="GL_SEPARABLE_2D_EXT"/> >+ <enum value="0x8013" name="GL_CONVOLUTION_BORDER_MODE"/> >+ <enum value="0x8013" name="GL_CONVOLUTION_BORDER_MODE_EXT"/> >+ <enum value="0x8014" name="GL_CONVOLUTION_FILTER_SCALE"/> >+ <enum value="0x8014" name="GL_CONVOLUTION_FILTER_SCALE_EXT"/> >+ <enum value="0x8015" name="GL_CONVOLUTION_FILTER_BIAS"/> >+ <enum value="0x8015" name="GL_CONVOLUTION_FILTER_BIAS_EXT"/> >+ <enum value="0x8016" name="GL_REDUCE"/> >+ <enum value="0x8016" name="GL_REDUCE_EXT"/> >+ <enum value="0x8017" name="GL_CONVOLUTION_FORMAT"/> >+ <enum value="0x8017" name="GL_CONVOLUTION_FORMAT_EXT"/> >+ <enum value="0x8018" name="GL_CONVOLUTION_WIDTH"/> >+ <enum value="0x8018" name="GL_CONVOLUTION_WIDTH_EXT"/> >+ <enum value="0x8019" name="GL_CONVOLUTION_HEIGHT"/> >+ <enum value="0x8019" name="GL_CONVOLUTION_HEIGHT_EXT"/> >+ <enum value="0x801A" name="GL_MAX_CONVOLUTION_WIDTH"/> >+ <enum value="0x801A" name="GL_MAX_CONVOLUTION_WIDTH_EXT"/> >+ <enum value="0x801B" name="GL_MAX_CONVOLUTION_HEIGHT"/> >+ <enum value="0x801B" name="GL_MAX_CONVOLUTION_HEIGHT_EXT"/> >+ <enum value="0x801C" name="GL_POST_CONVOLUTION_RED_SCALE"/> >+ <enum value="0x801C" name="GL_POST_CONVOLUTION_RED_SCALE_EXT"/> >+ <enum value="0x801D" name="GL_POST_CONVOLUTION_GREEN_SCALE"/> >+ <enum value="0x801D" name="GL_POST_CONVOLUTION_GREEN_SCALE_EXT"/> >+ <enum value="0x801E" name="GL_POST_CONVOLUTION_BLUE_SCALE"/> >+ <enum value="0x801E" name="GL_POST_CONVOLUTION_BLUE_SCALE_EXT"/> >+ <enum value="0x801F" name="GL_POST_CONVOLUTION_ALPHA_SCALE"/> >+ <enum value="0x801F" name="GL_POST_CONVOLUTION_ALPHA_SCALE_EXT"/> >+ <enum value="0x8020" name="GL_POST_CONVOLUTION_RED_BIAS"/> >+ <enum value="0x8020" name="GL_POST_CONVOLUTION_RED_BIAS_EXT"/> >+ <enum value="0x8021" name="GL_POST_CONVOLUTION_GREEN_BIAS"/> >+ <enum value="0x8021" name="GL_POST_CONVOLUTION_GREEN_BIAS_EXT"/> >+ <enum value="0x8022" name="GL_POST_CONVOLUTION_BLUE_BIAS"/> >+ <enum value="0x8022" name="GL_POST_CONVOLUTION_BLUE_BIAS_EXT"/> >+ <enum value="0x8023" name="GL_POST_CONVOLUTION_ALPHA_BIAS"/> >+ <enum value="0x8023" name="GL_POST_CONVOLUTION_ALPHA_BIAS_EXT"/> >+ <enum value="0x8024" name="GL_HISTOGRAM"/> >+ <enum value="0x8024" name="GL_HISTOGRAM_EXT"/> >+ <enum value="0x8025" name="GL_PROXY_HISTOGRAM"/> >+ <enum value="0x8025" name="GL_PROXY_HISTOGRAM_EXT"/> >+ <enum value="0x8026" name="GL_HISTOGRAM_WIDTH"/> >+ <enum value="0x8026" name="GL_HISTOGRAM_WIDTH_EXT"/> >+ <enum value="0x8027" name="GL_HISTOGRAM_FORMAT"/> >+ <enum value="0x8027" name="GL_HISTOGRAM_FORMAT_EXT"/> >+ <enum value="0x8028" name="GL_HISTOGRAM_RED_SIZE"/> >+ <enum value="0x8028" name="GL_HISTOGRAM_RED_SIZE_EXT"/> >+ <enum value="0x8029" name="GL_HISTOGRAM_GREEN_SIZE"/> >+ <enum value="0x8029" name="GL_HISTOGRAM_GREEN_SIZE_EXT"/> >+ <enum value="0x802A" name="GL_HISTOGRAM_BLUE_SIZE"/> >+ <enum value="0x802A" name="GL_HISTOGRAM_BLUE_SIZE_EXT"/> >+ <enum value="0x802B" name="GL_HISTOGRAM_ALPHA_SIZE"/> >+ <enum value="0x802B" name="GL_HISTOGRAM_ALPHA_SIZE_EXT"/> >+ <enum value="0x802C" name="GL_HISTOGRAM_LUMINANCE_SIZE"/> >+ <enum value="0x802C" name="GL_HISTOGRAM_LUMINANCE_SIZE_EXT"/> >+ <enum value="0x802D" name="GL_HISTOGRAM_SINK"/> >+ <enum value="0x802D" name="GL_HISTOGRAM_SINK_EXT"/> >+ <enum value="0x802E" name="GL_MINMAX"/> >+ <enum value="0x802E" name="GL_MINMAX_EXT"/> >+ <enum value="0x802F" name="GL_MINMAX_FORMAT"/> >+ <enum value="0x802F" name="GL_MINMAX_FORMAT_EXT"/> >+ <enum value="0x8030" name="GL_MINMAX_SINK"/> >+ <enum value="0x8030" name="GL_MINMAX_SINK_EXT"/> >+ <enum value="0x8031" name="GL_TABLE_TOO_LARGE_EXT"/> >+ <enum value="0x8031" name="GL_TABLE_TOO_LARGE"/> >+ <enum value="0x8032" name="GL_UNSIGNED_BYTE_3_3_2"/> >+ <enum value="0x8032" name="GL_UNSIGNED_BYTE_3_3_2_EXT"/> >+ <enum value="0x8033" name="GL_UNSIGNED_SHORT_4_4_4_4"/> >+ <enum value="0x8033" name="GL_UNSIGNED_SHORT_4_4_4_4_EXT"/> >+ <enum value="0x8034" name="GL_UNSIGNED_SHORT_5_5_5_1"/> >+ <enum value="0x8034" name="GL_UNSIGNED_SHORT_5_5_5_1_EXT"/> >+ <enum value="0x8035" name="GL_UNSIGNED_INT_8_8_8_8"/> >+ <enum value="0x8035" name="GL_UNSIGNED_INT_8_8_8_8_EXT"/> >+ <enum value="0x8036" name="GL_UNSIGNED_INT_10_10_10_2"/> >+ <enum value="0x8036" name="GL_UNSIGNED_INT_10_10_10_2_EXT"/> >+ <enum value="0x8037" name="GL_POLYGON_OFFSET_EXT"/> >+ <enum value="0x8037" name="GL_POLYGON_OFFSET_FILL"/> >+ <enum value="0x8038" name="GL_POLYGON_OFFSET_FACTOR"/> >+ <enum value="0x8038" name="GL_POLYGON_OFFSET_FACTOR_EXT"/> >+ <enum value="0x8039" name="GL_POLYGON_OFFSET_BIAS_EXT"/> >+ <enum value="0x803A" name="GL_RESCALE_NORMAL"/> >+ <enum value="0x803A" name="GL_RESCALE_NORMAL_EXT"/> >+ <enum value="0x803B" name="GL_ALPHA4"/> >+ <enum value="0x803B" name="GL_ALPHA4_EXT"/> >+ <enum value="0x803C" name="GL_ALPHA8"/> >+ <enum value="0x803C" name="GL_ALPHA8_EXT"/> >+ <enum value="0x803C" name="GL_ALPHA8_OES"/> >+ <enum value="0x803D" name="GL_ALPHA12"/> >+ <enum value="0x803D" name="GL_ALPHA12_EXT"/> >+ <enum value="0x803E" name="GL_ALPHA16"/> >+ <enum value="0x803E" name="GL_ALPHA16_EXT"/> >+ <enum value="0x803F" name="GL_LUMINANCE4"/> >+ <enum value="0x803F" name="GL_LUMINANCE4_EXT"/> >+ <enum value="0x8040" name="GL_LUMINANCE8"/> >+ <enum value="0x8040" name="GL_LUMINANCE8_EXT"/> >+ <enum value="0x8040" name="GL_LUMINANCE8_OES"/> >+ <enum value="0x8041" name="GL_LUMINANCE12"/> >+ <enum value="0x8041" name="GL_LUMINANCE12_EXT"/> >+ <enum value="0x8042" name="GL_LUMINANCE16"/> >+ <enum value="0x8042" name="GL_LUMINANCE16_EXT"/> >+ <enum value="0x8043" name="GL_LUMINANCE4_ALPHA4"/> >+ <enum value="0x8043" name="GL_LUMINANCE4_ALPHA4_EXT"/> >+ <enum value="0x8043" name="GL_LUMINANCE4_ALPHA4_OES"/> >+ <enum value="0x8044" name="GL_LUMINANCE6_ALPHA2"/> >+ <enum value="0x8044" name="GL_LUMINANCE6_ALPHA2_EXT"/> >+ <enum value="0x8045" name="GL_LUMINANCE8_ALPHA8"/> >+ <enum value="0x8045" name="GL_LUMINANCE8_ALPHA8_EXT"/> >+ <enum value="0x8045" name="GL_LUMINANCE8_ALPHA8_OES"/> >+ <enum value="0x8046" name="GL_LUMINANCE12_ALPHA4"/> >+ <enum value="0x8046" name="GL_LUMINANCE12_ALPHA4_EXT"/> >+ <enum value="0x8047" name="GL_LUMINANCE12_ALPHA12"/> >+ <enum value="0x8047" name="GL_LUMINANCE12_ALPHA12_EXT"/> >+ <enum value="0x8048" name="GL_LUMINANCE16_ALPHA16"/> >+ <enum value="0x8048" name="GL_LUMINANCE16_ALPHA16_EXT"/> >+ <enum value="0x8049" name="GL_INTENSITY"/> >+ <enum value="0x8049" name="GL_INTENSITY_EXT"/> >+ <enum value="0x804A" name="GL_INTENSITY4"/> >+ <enum value="0x804A" name="GL_INTENSITY4_EXT"/> >+ <enum value="0x804B" name="GL_INTENSITY8"/> >+ <enum value="0x804B" name="GL_INTENSITY8_EXT"/> >+ <enum value="0x804C" name="GL_INTENSITY12"/> >+ <enum value="0x804C" name="GL_INTENSITY12_EXT"/> >+ <enum value="0x804D" name="GL_INTENSITY16"/> >+ <enum value="0x804D" name="GL_INTENSITY16_EXT"/> >+ <enum value="0x804E" name="GL_RGB2_EXT"/> >+ <enum value="0x804F" name="GL_RGB4"/> >+ <enum value="0x804F" name="GL_RGB4_EXT"/> >+ <enum value="0x8050" name="GL_RGB5"/> >+ <enum value="0x8050" name="GL_RGB5_EXT"/> >+ <enum value="0x8051" name="GL_RGB8"/> >+ <enum value="0x8051" name="GL_RGB8_EXT"/> >+ <enum value="0x8051" name="GL_RGB8_OES"/> >+ <enum value="0x8052" name="GL_RGB10"/> >+ <enum value="0x8052" name="GL_RGB10_EXT"/> >+ <enum value="0x8053" name="GL_RGB12"/> >+ <enum value="0x8053" name="GL_RGB12_EXT"/> >+ <enum value="0x8054" name="GL_RGB16"/> >+ <enum value="0x8054" name="GL_RGB16_EXT"/> >+ <enum value="0x8055" name="GL_RGBA2"/> >+ <enum value="0x8055" name="GL_RGBA2_EXT"/> >+ <enum value="0x8056" name="GL_RGBA4"/> >+ <enum value="0x8056" name="GL_RGBA4_EXT"/> >+ <enum value="0x8056" name="GL_RGBA4_OES"/> >+ <enum value="0x8057" name="GL_RGB5_A1"/> >+ <enum value="0x8057" name="GL_RGB5_A1_EXT"/> >+ <enum value="0x8057" name="GL_RGB5_A1_OES"/> >+ <enum value="0x8058" name="GL_RGBA8"/> >+ <enum value="0x8058" name="GL_RGBA8_EXT"/> >+ <enum value="0x8058" name="GL_RGBA8_OES"/> >+ <enum value="0x8059" name="GL_RGB10_A2"/> >+ <enum value="0x8059" name="GL_RGB10_A2_EXT"/> >+ <enum value="0x805A" name="GL_RGBA12"/> >+ <enum value="0x805A" name="GL_RGBA12_EXT"/> >+ <enum value="0x805B" name="GL_RGBA16"/> >+ <enum value="0x805B" name="GL_RGBA16_EXT"/> >+ <enum value="0x805C" name="GL_TEXTURE_RED_SIZE"/> >+ <enum value="0x805C" name="GL_TEXTURE_RED_SIZE_EXT"/> >+ <enum value="0x805D" name="GL_TEXTURE_GREEN_SIZE"/> >+ <enum value="0x805D" name="GL_TEXTURE_GREEN_SIZE_EXT"/> >+ <enum value="0x805E" name="GL_TEXTURE_BLUE_SIZE"/> >+ <enum value="0x805E" name="GL_TEXTURE_BLUE_SIZE_EXT"/> >+ <enum value="0x805F" name="GL_TEXTURE_ALPHA_SIZE"/> >+ <enum value="0x805F" name="GL_TEXTURE_ALPHA_SIZE_EXT"/> >+ <enum value="0x8060" name="GL_TEXTURE_LUMINANCE_SIZE"/> >+ <enum value="0x8060" name="GL_TEXTURE_LUMINANCE_SIZE_EXT"/> >+ <enum value="0x8061" name="GL_TEXTURE_INTENSITY_SIZE"/> >+ <enum value="0x8061" name="GL_TEXTURE_INTENSITY_SIZE_EXT"/> >+ <enum value="0x8062" name="GL_REPLACE_EXT"/> >+ <enum value="0x8063" name="GL_PROXY_TEXTURE_1D"/> >+ <enum value="0x8063" name="GL_PROXY_TEXTURE_1D_EXT"/> >+ <enum value="0x8064" name="GL_PROXY_TEXTURE_2D"/> >+ <enum value="0x8064" name="GL_PROXY_TEXTURE_2D_EXT"/> >+ <enum value="0x8065" name="GL_TEXTURE_TOO_LARGE_EXT"/> >+ <enum value="0x8066" name="GL_TEXTURE_PRIORITY"/> >+ <enum value="0x8066" name="GL_TEXTURE_PRIORITY_EXT"/> >+ <enum value="0x8067" name="GL_TEXTURE_RESIDENT"/> >+ <enum value="0x8067" name="GL_TEXTURE_RESIDENT_EXT"/> >+ <enum value="0x8068" name="GL_TEXTURE_1D_BINDING_EXT"/> >+ <enum value="0x8068" name="GL_TEXTURE_BINDING_1D"/> >+ <enum value="0x8069" name="GL_TEXTURE_2D_BINDING_EXT"/> >+ <enum value="0x8069" name="GL_TEXTURE_BINDING_2D"/> >+ <enum value="0x806A" name="GL_TEXTURE_3D_BINDING_EXT"/> >+ <enum value="0x806A" name="GL_TEXTURE_3D_BINDING_OES"/> >+ <enum value="0x806A" name="GL_TEXTURE_BINDING_3D"/> >+ <enum value="0x806A" name="GL_TEXTURE_BINDING_3D_OES"/> >+ <enum value="0x806B" name="GL_PACK_SKIP_IMAGES"/> >+ <enum value="0x806B" name="GL_PACK_SKIP_IMAGES_EXT"/> >+ <enum value="0x806C" name="GL_PACK_IMAGE_HEIGHT"/> >+ <enum value="0x806C" name="GL_PACK_IMAGE_HEIGHT_EXT"/> >+ <enum value="0x806D" name="GL_UNPACK_SKIP_IMAGES"/> >+ <enum value="0x806D" name="GL_UNPACK_SKIP_IMAGES_EXT"/> >+ <enum value="0x806E" name="GL_UNPACK_IMAGE_HEIGHT"/> >+ <enum value="0x806E" name="GL_UNPACK_IMAGE_HEIGHT_EXT"/> >+ <enum value="0x806F" name="GL_TEXTURE_3D"/> >+ <enum value="0x806F" name="GL_TEXTURE_3D_EXT"/> >+ <enum value="0x806F" name="GL_TEXTURE_3D_OES"/> >+ <enum value="0x8070" name="GL_PROXY_TEXTURE_3D"/> >+ <enum value="0x8070" name="GL_PROXY_TEXTURE_3D_EXT"/> >+ <enum value="0x8071" name="GL_TEXTURE_DEPTH"/> >+ <enum value="0x8071" name="GL_TEXTURE_DEPTH_EXT"/> >+ <enum value="0x8072" name="GL_TEXTURE_WRAP_R"/> >+ <enum value="0x8072" name="GL_TEXTURE_WRAP_R_EXT"/> >+ <enum value="0x8072" name="GL_TEXTURE_WRAP_R_OES"/> >+ <enum value="0x8073" name="GL_MAX_3D_TEXTURE_SIZE"/> >+ <enum value="0x8073" name="GL_MAX_3D_TEXTURE_SIZE_EXT"/> >+ <enum value="0x8073" name="GL_MAX_3D_TEXTURE_SIZE_OES"/> >+ <enum value="0x8074" name="GL_VERTEX_ARRAY"/> >+ <enum value="0x8074" name="GL_VERTEX_ARRAY_EXT"/> >+ <enum value="0x8074" name="GL_VERTEX_ARRAY_KHR"/> >+ <enum value="0x8075" name="GL_NORMAL_ARRAY"/> >+ <enum value="0x8075" name="GL_NORMAL_ARRAY_EXT"/> >+ <enum value="0x8076" name="GL_COLOR_ARRAY"/> >+ <enum value="0x8076" name="GL_COLOR_ARRAY_EXT"/> >+ <enum value="0x8077" name="GL_INDEX_ARRAY"/> >+ <enum value="0x8077" name="GL_INDEX_ARRAY_EXT"/> >+ <enum value="0x8078" name="GL_TEXTURE_COORD_ARRAY"/> >+ <enum value="0x8078" name="GL_TEXTURE_COORD_ARRAY_EXT"/> >+ <enum value="0x8079" name="GL_EDGE_FLAG_ARRAY"/> >+ <enum value="0x8079" name="GL_EDGE_FLAG_ARRAY_EXT"/> >+ <enum value="0x807A" name="GL_VERTEX_ARRAY_SIZE"/> >+ <enum value="0x807A" name="GL_VERTEX_ARRAY_SIZE_EXT"/> >+ <enum value="0x807B" name="GL_VERTEX_ARRAY_TYPE"/> >+ <enum value="0x807B" name="GL_VERTEX_ARRAY_TYPE_EXT"/> >+ <enum value="0x807C" name="GL_VERTEX_ARRAY_STRIDE"/> >+ <enum value="0x807C" name="GL_VERTEX_ARRAY_STRIDE_EXT"/> >+ <enum value="0x807D" name="GL_VERTEX_ARRAY_COUNT_EXT"/> >+ <enum value="0x807E" name="GL_NORMAL_ARRAY_TYPE"/> >+ <enum value="0x807E" name="GL_NORMAL_ARRAY_TYPE_EXT"/> >+ <enum value="0x807F" name="GL_NORMAL_ARRAY_STRIDE"/> >+ <enum value="0x807F" name="GL_NORMAL_ARRAY_STRIDE_EXT"/> >+ <enum value="0x8080" name="GL_NORMAL_ARRAY_COUNT_EXT"/> >+ <enum value="0x8081" name="GL_COLOR_ARRAY_SIZE"/> >+ <enum value="0x8081" name="GL_COLOR_ARRAY_SIZE_EXT"/> >+ <enum value="0x8082" name="GL_COLOR_ARRAY_TYPE"/> >+ <enum value="0x8082" name="GL_COLOR_ARRAY_TYPE_EXT"/> >+ <enum value="0x8083" name="GL_COLOR_ARRAY_STRIDE"/> >+ <enum value="0x8083" name="GL_COLOR_ARRAY_STRIDE_EXT"/> >+ <enum value="0x8084" name="GL_COLOR_ARRAY_COUNT_EXT"/> >+ <enum value="0x8085" name="GL_INDEX_ARRAY_TYPE"/> >+ <enum value="0x8085" name="GL_INDEX_ARRAY_TYPE_EXT"/> >+ <enum value="0x8086" name="GL_INDEX_ARRAY_STRIDE"/> >+ <enum value="0x8086" name="GL_INDEX_ARRAY_STRIDE_EXT"/> >+ <enum value="0x8087" name="GL_INDEX_ARRAY_COUNT_EXT"/> >+ <enum value="0x8088" name="GL_TEXTURE_COORD_ARRAY_SIZE"/> >+ <enum value="0x8088" name="GL_TEXTURE_COORD_ARRAY_SIZE_EXT"/> >+ <enum value="0x8089" name="GL_TEXTURE_COORD_ARRAY_TYPE"/> >+ <enum value="0x8089" name="GL_TEXTURE_COORD_ARRAY_TYPE_EXT"/> >+ <enum value="0x808A" name="GL_TEXTURE_COORD_ARRAY_STRIDE"/> >+ <enum value="0x808A" name="GL_TEXTURE_COORD_ARRAY_STRIDE_EXT"/> >+ <enum value="0x808B" name="GL_TEXTURE_COORD_ARRAY_COUNT_EXT"/> >+ <enum value="0x808C" name="GL_EDGE_FLAG_ARRAY_STRIDE"/> >+ <enum value="0x808C" name="GL_EDGE_FLAG_ARRAY_STRIDE_EXT"/> >+ <enum value="0x808D" name="GL_EDGE_FLAG_ARRAY_COUNT_EXT"/> >+ <enum value="0x808E" name="GL_VERTEX_ARRAY_POINTER"/> >+ <enum value="0x808E" name="GL_VERTEX_ARRAY_POINTER_EXT"/> >+ <enum value="0x808F" name="GL_NORMAL_ARRAY_POINTER"/> >+ <enum value="0x808F" name="GL_NORMAL_ARRAY_POINTER_EXT"/> >+ <enum value="0x8090" name="GL_COLOR_ARRAY_POINTER"/> >+ <enum value="0x8090" name="GL_COLOR_ARRAY_POINTER_EXT"/> >+ <enum value="0x8091" name="GL_INDEX_ARRAY_POINTER"/> >+ <enum value="0x8091" name="GL_INDEX_ARRAY_POINTER_EXT"/> >+ <enum value="0x8092" name="GL_TEXTURE_COORD_ARRAY_POINTER"/> >+ <enum value="0x8092" name="GL_TEXTURE_COORD_ARRAY_POINTER_EXT"/> >+ <enum value="0x8093" name="GL_EDGE_FLAG_ARRAY_POINTER"/> >+ <enum value="0x8093" name="GL_EDGE_FLAG_ARRAY_POINTER_EXT"/> >+ <enum value="0x8094" name="GL_INTERLACE_SGIX"/> >+ <enum value="0x8095" name="GL_DETAIL_TEXTURE_2D_SGIS"/> >+ <enum value="0x8096" name="GL_DETAIL_TEXTURE_2D_BINDING_SGIS"/> >+ <enum value="0x8097" name="GL_LINEAR_DETAIL_SGIS"/> >+ <enum value="0x8098" name="GL_LINEAR_DETAIL_ALPHA_SGIS"/> >+ <enum value="0x8099" name="GL_LINEAR_DETAIL_COLOR_SGIS"/> >+ <enum value="0x809A" name="GL_DETAIL_TEXTURE_LEVEL_SGIS"/> >+ <enum value="0x809B" name="GL_DETAIL_TEXTURE_MODE_SGIS"/> >+ <enum value="0x809C" name="GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS"/> >+ <enum value="0x809D" name="GL_MULTISAMPLE"/> >+ <enum value="0x809D" name="GL_MULTISAMPLE_ARB"/> >+ <enum value="0x809D" name="GL_MULTISAMPLE_EXT"/> >+ <enum value="0x809D" name="GL_MULTISAMPLE_SGIS"/> >+ <enum value="0x809E" name="GL_SAMPLE_ALPHA_TO_COVERAGE"/> >+ <enum value="0x809E" name="GL_SAMPLE_ALPHA_TO_COVERAGE_ARB"/> >+ <enum value="0x809E" name="GL_SAMPLE_ALPHA_TO_MASK_EXT"/> >+ <enum value="0x809E" name="GL_SAMPLE_ALPHA_TO_MASK_SGIS"/> >+ <enum value="0x809F" name="GL_SAMPLE_ALPHA_TO_ONE"/> >+ <enum value="0x809F" name="GL_SAMPLE_ALPHA_TO_ONE_ARB"/> >+ <enum value="0x809F" name="GL_SAMPLE_ALPHA_TO_ONE_EXT"/> >+ <enum value="0x809F" name="GL_SAMPLE_ALPHA_TO_ONE_SGIS"/> >+ <enum value="0x80A0" name="GL_SAMPLE_COVERAGE"/> >+ <enum value="0x80A0" name="GL_SAMPLE_COVERAGE_ARB"/> >+ <enum value="0x80A0" name="GL_SAMPLE_MASK_EXT"/> >+ <enum value="0x80A0" name="GL_SAMPLE_MASK_SGIS"/> >+ <enum value="0x80A1" name="GL_1PASS_EXT"/> >+ <enum value="0x80A1" name="GL_1PASS_SGIS"/> >+ <enum value="0x80A2" name="GL_2PASS_0_EXT"/> >+ <enum value="0x80A2" name="GL_2PASS_0_SGIS"/> >+ <enum value="0x80A3" name="GL_2PASS_1_EXT"/> >+ <enum value="0x80A3" name="GL_2PASS_1_SGIS"/> >+ <enum value="0x80A4" name="GL_4PASS_0_EXT"/> >+ <enum value="0x80A4" name="GL_4PASS_0_SGIS"/> >+ <enum value="0x80A5" name="GL_4PASS_1_EXT"/> >+ <enum value="0x80A5" name="GL_4PASS_1_SGIS"/> >+ <enum value="0x80A6" name="GL_4PASS_2_EXT"/> >+ <enum value="0x80A6" name="GL_4PASS_2_SGIS"/> >+ <enum value="0x80A7" name="GL_4PASS_3_EXT"/> >+ <enum value="0x80A7" name="GL_4PASS_3_SGIS"/> >+ <enum value="0x80A8" name="GL_SAMPLE_BUFFERS"/> >+ <enum value="0x80A8" name="GL_SAMPLE_BUFFERS_ARB"/> >+ <enum value="0x80A8" name="GL_SAMPLE_BUFFERS_EXT"/> >+ <enum value="0x80A8" name="GL_SAMPLE_BUFFERS_SGIS"/> >+ <enum value="0x80A9" name="GL_SAMPLES"/> >+ <enum value="0x80A9" name="GL_SAMPLES_ARB"/> >+ <enum value="0x80A9" name="GL_SAMPLES_EXT"/> >+ <enum value="0x80A9" name="GL_SAMPLES_SGIS"/> >+ <enum value="0x80AA" name="GL_SAMPLE_COVERAGE_VALUE"/> >+ <enum value="0x80AA" name="GL_SAMPLE_COVERAGE_VALUE_ARB"/> >+ <enum value="0x80AA" name="GL_SAMPLE_MASK_VALUE_EXT"/> >+ <enum value="0x80AA" name="GL_SAMPLE_MASK_VALUE_SGIS"/> >+ <enum value="0x80AB" name="GL_SAMPLE_COVERAGE_INVERT"/> >+ <enum value="0x80AB" name="GL_SAMPLE_COVERAGE_INVERT_ARB"/> >+ <enum value="0x80AB" name="GL_SAMPLE_MASK_INVERT_EXT"/> >+ <enum value="0x80AB" name="GL_SAMPLE_MASK_INVERT_SGIS"/> >+ <enum value="0x80AC" name="GL_SAMPLE_PATTERN_EXT"/> >+ <enum value="0x80AC" name="GL_SAMPLE_PATTERN_SGIS"/> >+ <enum value="0x80AD" name="GL_LINEAR_SHARPEN_SGIS"/> >+ <enum value="0x80AE" name="GL_LINEAR_SHARPEN_ALPHA_SGIS"/> >+ <enum value="0x80AF" name="GL_LINEAR_SHARPEN_COLOR_SGIS"/> >+ <enum value="0x80B0" name="GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS"/> >+ <enum value="0x80B1" name="GL_COLOR_MATRIX"/> >+ <enum value="0x80B1" name="GL_COLOR_MATRIX_SGI"/> >+ <enum value="0x80B2" name="GL_COLOR_MATRIX_STACK_DEPTH"/> >+ <enum value="0x80B2" name="GL_COLOR_MATRIX_STACK_DEPTH_SGI"/> >+ <enum value="0x80B3" name="GL_MAX_COLOR_MATRIX_STACK_DEPTH"/> >+ <enum value="0x80B3" name="GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI"/> >+ <enum value="0x80B4" name="GL_POST_COLOR_MATRIX_RED_SCALE"/> >+ <enum value="0x80B4" name="GL_POST_COLOR_MATRIX_RED_SCALE_SGI"/> >+ <enum value="0x80B5" name="GL_POST_COLOR_MATRIX_GREEN_SCALE"/> >+ <enum value="0x80B5" name="GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI"/> >+ <enum value="0x80B6" name="GL_POST_COLOR_MATRIX_BLUE_SCALE"/> >+ <enum value="0x80B6" name="GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI"/> >+ <enum value="0x80B7" name="GL_POST_COLOR_MATRIX_ALPHA_SCALE"/> >+ <enum value="0x80B7" name="GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI"/> >+ <enum value="0x80B8" name="GL_POST_COLOR_MATRIX_RED_BIAS"/> >+ <enum value="0x80B8" name="GL_POST_COLOR_MATRIX_RED_BIAS_SGI"/> >+ <enum value="0x80B9" name="GL_POST_COLOR_MATRIX_GREEN_BIAS"/> >+ <enum value="0x80B9" name="GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI"/> >+ <enum value="0x80BA" name="GL_POST_COLOR_MATRIX_BLUE_BIAS"/> >+ <enum value="0x80BA" name="GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI"/> >+ <enum value="0x80BB" name="GL_POST_COLOR_MATRIX_ALPHA_BIAS"/> >+ <enum value="0x80BB" name="GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI"/> >+ <enum value="0x80BC" name="GL_TEXTURE_COLOR_TABLE_SGI"/> >+ <enum value="0x80BD" name="GL_PROXY_TEXTURE_COLOR_TABLE_SGI"/> >+ <enum value="0x80BE" name="GL_TEXTURE_ENV_BIAS_SGIX"/> >+ <enum value="0x80BF" name="GL_SHADOW_AMBIENT_SGIX"/> >+ <enum value="0x80BF" name="GL_TEXTURE_COMPARE_FAIL_VALUE_ARB"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x80C0" end="0x80CF" vendor="ZiiLabs"> >+ <unused start="0x80C0" end="0x80C7" vendor="ZiiLabs"/> >+ <enum value="0x80C8" name="GL_BLEND_DST_RGB"/> >+ <enum value="0x80C8" name="GL_BLEND_DST_RGB_EXT"/> >+ <enum value="0x80C8" name="GL_BLEND_DST_RGB_OES"/> >+ <enum value="0x80C9" name="GL_BLEND_SRC_RGB"/> >+ <enum value="0x80C9" name="GL_BLEND_SRC_RGB_EXT"/> >+ <enum value="0x80C9" name="GL_BLEND_SRC_RGB_OES"/> >+ <enum value="0x80CA" name="GL_BLEND_DST_ALPHA"/> >+ <enum value="0x80CA" name="GL_BLEND_DST_ALPHA_EXT"/> >+ <enum value="0x80CA" name="GL_BLEND_DST_ALPHA_OES"/> >+ <enum value="0x80CB" name="GL_BLEND_SRC_ALPHA"/> >+ <enum value="0x80CB" name="GL_BLEND_SRC_ALPHA_EXT"/> >+ <enum value="0x80CB" name="GL_BLEND_SRC_ALPHA_OES"/> >+ <enum value="0x80CC" name="GL_422_EXT"/> >+ <enum value="0x80CD" name="GL_422_REV_EXT"/> >+ <enum value="0x80CE" name="GL_422_AVERAGE_EXT"/> >+ <enum value="0x80CF" name="GL_422_REV_AVERAGE_EXT"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x80D0" end="0x80DF" vendor="SGI"> >+ <enum value="0x80D0" name="GL_COLOR_TABLE"/> >+ <enum value="0x80D0" name="GL_COLOR_TABLE_SGI"/> >+ <enum value="0x80D1" name="GL_POST_CONVOLUTION_COLOR_TABLE"/> >+ <enum value="0x80D1" name="GL_POST_CONVOLUTION_COLOR_TABLE_SGI"/> >+ <enum value="0x80D2" name="GL_POST_COLOR_MATRIX_COLOR_TABLE"/> >+ <enum value="0x80D2" name="GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI"/> >+ <enum value="0x80D3" name="GL_PROXY_COLOR_TABLE"/> >+ <enum value="0x80D3" name="GL_PROXY_COLOR_TABLE_SGI"/> >+ <enum value="0x80D4" name="GL_PROXY_POST_CONVOLUTION_COLOR_TABLE"/> >+ <enum value="0x80D4" name="GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI"/> >+ <enum value="0x80D5" name="GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE"/> >+ <enum value="0x80D5" name="GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI"/> >+ <enum value="0x80D6" name="GL_COLOR_TABLE_SCALE"/> >+ <enum value="0x80D6" name="GL_COLOR_TABLE_SCALE_SGI"/> >+ <enum value="0x80D7" name="GL_COLOR_TABLE_BIAS"/> >+ <enum value="0x80D7" name="GL_COLOR_TABLE_BIAS_SGI"/> >+ <enum value="0x80D8" name="GL_COLOR_TABLE_FORMAT"/> >+ <enum value="0x80D8" name="GL_COLOR_TABLE_FORMAT_SGI"/> >+ <enum value="0x80D9" name="GL_COLOR_TABLE_WIDTH"/> >+ <enum value="0x80D9" name="GL_COLOR_TABLE_WIDTH_SGI"/> >+ <enum value="0x80DA" name="GL_COLOR_TABLE_RED_SIZE"/> >+ <enum value="0x80DA" name="GL_COLOR_TABLE_RED_SIZE_SGI"/> >+ <enum value="0x80DB" name="GL_COLOR_TABLE_GREEN_SIZE"/> >+ <enum value="0x80DB" name="GL_COLOR_TABLE_GREEN_SIZE_SGI"/> >+ <enum value="0x80DC" name="GL_COLOR_TABLE_BLUE_SIZE"/> >+ <enum value="0x80DC" name="GL_COLOR_TABLE_BLUE_SIZE_SGI"/> >+ <enum value="0x80DD" name="GL_COLOR_TABLE_ALPHA_SIZE"/> >+ <enum value="0x80DD" name="GL_COLOR_TABLE_ALPHA_SIZE_SGI"/> >+ <enum value="0x80DE" name="GL_COLOR_TABLE_LUMINANCE_SIZE"/> >+ <enum value="0x80DE" name="GL_COLOR_TABLE_LUMINANCE_SIZE_SGI"/> >+ <enum value="0x80DF" name="GL_COLOR_TABLE_INTENSITY_SIZE"/> >+ <enum value="0x80DF" name="GL_COLOR_TABLE_INTENSITY_SIZE_SGI"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x80E0" end="0x810F" vendor="MS"> >+ <enum value="0x80E0" name="GL_BGR"/> >+ <enum value="0x80E0" name="GL_BGR_EXT"/> >+ <enum value="0x80E1" name="GL_BGRA"/> >+ <enum value="0x80E1" name="GL_BGRA_EXT"/> >+ <enum value="0x80E1" name="GL_BGRA_IMG"/> >+ <enum value="0x80E2" name="GL_COLOR_INDEX1_EXT"/> >+ <enum value="0x80E3" name="GL_COLOR_INDEX2_EXT"/> >+ <enum value="0x80E4" name="GL_COLOR_INDEX4_EXT"/> >+ <enum value="0x80E5" name="GL_COLOR_INDEX8_EXT"/> >+ <enum value="0x80E6" name="GL_COLOR_INDEX12_EXT"/> >+ <enum value="0x80E7" name="GL_COLOR_INDEX16_EXT"/> >+ <enum value="0x80E8" name="GL_MAX_ELEMENTS_VERTICES"/> >+ <enum value="0x80E8" name="GL_MAX_ELEMENTS_VERTICES_EXT"/> >+ <enum value="0x80E9" name="GL_MAX_ELEMENTS_INDICES"/> >+ <enum value="0x80E9" name="GL_MAX_ELEMENTS_INDICES_EXT"/> >+ <enum value="0x80EA" name="GL_PHONG_WIN"/> >+ <enum value="0x80EB" name="GL_PHONG_HINT_WIN"/> >+ <enum value="0x80EC" name="GL_FOG_SPECULAR_TEXTURE_WIN"/> >+ <enum value="0x80ED" name="GL_TEXTURE_INDEX_SIZE_EXT"/> >+ <enum value="0x80EE" name="GL_PARAMETER_BUFFER"/> >+ <enum value="0x80EE" name="GL_PARAMETER_BUFFER_ARB" alias="GL_PARAMETER_BUFFER"/> >+ <enum value="0x80EF" name="GL_PARAMETER_BUFFER_BINDING"/> >+ <enum value="0x80EF" name="GL_PARAMETER_BUFFER_BINDING_ARB" alias="GL_PARAMETER_BUFFER_BINDING"/> >+ <enum value="0x80F0" name="GL_CLIP_VOLUME_CLIPPING_HINT_EXT"/> >+ <unused start="0x80F1" end="0x810F" vendor="MS"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8110" end="0x814F" vendor="SGI"> >+ <enum value="0x8110" name="GL_DUAL_ALPHA4_SGIS"/> >+ <enum value="0x8111" name="GL_DUAL_ALPHA8_SGIS"/> >+ <enum value="0x8112" name="GL_DUAL_ALPHA12_SGIS"/> >+ <enum value="0x8113" name="GL_DUAL_ALPHA16_SGIS"/> >+ <enum value="0x8114" name="GL_DUAL_LUMINANCE4_SGIS"/> >+ <enum value="0x8115" name="GL_DUAL_LUMINANCE8_SGIS"/> >+ <enum value="0x8116" name="GL_DUAL_LUMINANCE12_SGIS"/> >+ <enum value="0x8117" name="GL_DUAL_LUMINANCE16_SGIS"/> >+ <enum value="0x8118" name="GL_DUAL_INTENSITY4_SGIS"/> >+ <enum value="0x8119" name="GL_DUAL_INTENSITY8_SGIS"/> >+ <enum value="0x811A" name="GL_DUAL_INTENSITY12_SGIS"/> >+ <enum value="0x811B" name="GL_DUAL_INTENSITY16_SGIS"/> >+ <enum value="0x811C" name="GL_DUAL_LUMINANCE_ALPHA4_SGIS"/> >+ <enum value="0x811D" name="GL_DUAL_LUMINANCE_ALPHA8_SGIS"/> >+ <enum value="0x811E" name="GL_QUAD_ALPHA4_SGIS"/> >+ <enum value="0x811F" name="GL_QUAD_ALPHA8_SGIS"/> >+ <enum value="0x8120" name="GL_QUAD_LUMINANCE4_SGIS"/> >+ <enum value="0x8121" name="GL_QUAD_LUMINANCE8_SGIS"/> >+ <enum value="0x8122" name="GL_QUAD_INTENSITY4_SGIS"/> >+ <enum value="0x8123" name="GL_QUAD_INTENSITY8_SGIS"/> >+ <enum value="0x8124" name="GL_DUAL_TEXTURE_SELECT_SGIS"/> >+ <enum value="0x8125" name="GL_QUAD_TEXTURE_SELECT_SGIS"/> >+ <enum value="0x8126" name="GL_POINT_SIZE_MIN"/> >+ <enum value="0x8126" name="GL_POINT_SIZE_MIN_ARB"/> >+ <enum value="0x8126" name="GL_POINT_SIZE_MIN_EXT"/> >+ <enum value="0x8126" name="GL_POINT_SIZE_MIN_SGIS"/> >+ <enum value="0x8127" name="GL_POINT_SIZE_MAX"/> >+ <enum value="0x8127" name="GL_POINT_SIZE_MAX_ARB"/> >+ <enum value="0x8127" name="GL_POINT_SIZE_MAX_EXT"/> >+ <enum value="0x8127" name="GL_POINT_SIZE_MAX_SGIS"/> >+ <enum value="0x8128" name="GL_POINT_FADE_THRESHOLD_SIZE"/> >+ <enum value="0x8128" name="GL_POINT_FADE_THRESHOLD_SIZE_ARB"/> >+ <enum value="0x8128" name="GL_POINT_FADE_THRESHOLD_SIZE_EXT"/> >+ <enum value="0x8128" name="GL_POINT_FADE_THRESHOLD_SIZE_SGIS"/> >+ <enum value="0x8129" name="GL_DISTANCE_ATTENUATION_EXT"/> >+ <enum value="0x8129" name="GL_DISTANCE_ATTENUATION_SGIS"/> >+ <enum value="0x8129" name="GL_POINT_DISTANCE_ATTENUATION"/> >+ <enum value="0x8129" name="GL_POINT_DISTANCE_ATTENUATION_ARB"/> >+ <enum value="0x812A" name="GL_FOG_FUNC_SGIS"/> >+ <enum value="0x812B" name="GL_FOG_FUNC_POINTS_SGIS"/> >+ <enum value="0x812C" name="GL_MAX_FOG_FUNC_POINTS_SGIS"/> >+ <enum value="0x812D" name="GL_CLAMP_TO_BORDER"/> >+ <enum value="0x812D" name="GL_CLAMP_TO_BORDER_ARB"/> >+ <enum value="0x812D" name="GL_CLAMP_TO_BORDER_EXT"/> >+ <enum value="0x812D" name="GL_CLAMP_TO_BORDER_NV"/> >+ <enum value="0x812D" name="GL_CLAMP_TO_BORDER_SGIS"/> >+ <enum value="0x812D" name="GL_CLAMP_TO_BORDER_OES"/> >+ <enum value="0x812E" name="GL_TEXTURE_MULTI_BUFFER_HINT_SGIX"/> >+ <enum value="0x812F" name="GL_CLAMP_TO_EDGE"/> >+ <enum value="0x812F" name="GL_CLAMP_TO_EDGE_SGIS"/> >+ <enum value="0x8130" name="GL_PACK_SKIP_VOLUMES_SGIS"/> >+ <enum value="0x8131" name="GL_PACK_IMAGE_DEPTH_SGIS"/> >+ <enum value="0x8132" name="GL_UNPACK_SKIP_VOLUMES_SGIS"/> >+ <enum value="0x8133" name="GL_UNPACK_IMAGE_DEPTH_SGIS"/> >+ <enum value="0x8134" name="GL_TEXTURE_4D_SGIS"/> >+ <enum value="0x8135" name="GL_PROXY_TEXTURE_4D_SGIS"/> >+ <enum value="0x8136" name="GL_TEXTURE_4DSIZE_SGIS"/> >+ <enum value="0x8137" name="GL_TEXTURE_WRAP_Q_SGIS"/> >+ <enum value="0x8138" name="GL_MAX_4D_TEXTURE_SIZE_SGIS"/> >+ <enum value="0x8139" name="GL_PIXEL_TEX_GEN_SGIX"/> >+ <enum value="0x813A" name="GL_TEXTURE_MIN_LOD"/> >+ <enum value="0x813A" name="GL_TEXTURE_MIN_LOD_SGIS"/> >+ <enum value="0x813B" name="GL_TEXTURE_MAX_LOD"/> >+ <enum value="0x813B" name="GL_TEXTURE_MAX_LOD_SGIS"/> >+ <enum value="0x813C" name="GL_TEXTURE_BASE_LEVEL"/> >+ <enum value="0x813C" name="GL_TEXTURE_BASE_LEVEL_SGIS"/> >+ <enum value="0x813D" name="GL_TEXTURE_MAX_LEVEL"/> >+ <enum value="0x813D" name="GL_TEXTURE_MAX_LEVEL_APPLE"/> >+ <enum value="0x813D" name="GL_TEXTURE_MAX_LEVEL_SGIS"/> >+ <enum value="0x813E" name="GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX"/> >+ <enum value="0x813F" name="GL_PIXEL_TILE_CACHE_INCREMENT_SGIX"/> >+ <enum value="0x8140" name="GL_PIXEL_TILE_WIDTH_SGIX"/> >+ <enum value="0x8141" name="GL_PIXEL_TILE_HEIGHT_SGIX"/> >+ <enum value="0x8142" name="GL_PIXEL_TILE_GRID_WIDTH_SGIX"/> >+ <enum value="0x8143" name="GL_PIXEL_TILE_GRID_HEIGHT_SGIX"/> >+ <enum value="0x8144" name="GL_PIXEL_TILE_GRID_DEPTH_SGIX"/> >+ <enum value="0x8145" name="GL_PIXEL_TILE_CACHE_SIZE_SGIX"/> >+ <enum value="0x8146" name="GL_FILTER4_SGIS"/> >+ <enum value="0x8147" name="GL_TEXTURE_FILTER4_SIZE_SGIS"/> >+ <enum value="0x8148" name="GL_SPRITE_SGIX"/> >+ <enum value="0x8149" name="GL_SPRITE_MODE_SGIX"/> >+ <enum value="0x814A" name="GL_SPRITE_AXIS_SGIX"/> >+ <enum value="0x814B" name="GL_SPRITE_TRANSLATION_SGIX"/> >+ <enum value="0x814C" name="GL_SPRITE_AXIAL_SGIX"/> >+ <enum value="0x814D" name="GL_SPRITE_OBJECT_ALIGNED_SGIX"/> >+ <enum value="0x814E" name="GL_SPRITE_EYE_ALIGNED_SGIX"/> >+ <enum value="0x814F" name="GL_TEXTURE_4D_BINDING_SGIS"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8150" end="0x816F" vendor="HP"> >+ <enum value="0x8150" name="GL_IGNORE_BORDER_HP"/> >+ <enum value="0x8151" name="GL_CONSTANT_BORDER"/> >+ <enum value="0x8151" name="GL_CONSTANT_BORDER_HP"/> >+ <unused start="0x8152" vendor="HP" comment="GL_WRAP_BORDER = 0x8152 was proposed, but not actually promoted to core"/> >+ <enum value="0x8153" name="GL_REPLICATE_BORDER"/> >+ <enum value="0x8153" name="GL_REPLICATE_BORDER_HP"/> >+ <enum value="0x8154" name="GL_CONVOLUTION_BORDER_COLOR"/> >+ <enum value="0x8154" name="GL_CONVOLUTION_BORDER_COLOR_HP"/> >+ <enum value="0x8155" name="GL_IMAGE_SCALE_X_HP"/> >+ <enum value="0x8156" name="GL_IMAGE_SCALE_Y_HP"/> >+ <enum value="0x8157" name="GL_IMAGE_TRANSLATE_X_HP"/> >+ <enum value="0x8158" name="GL_IMAGE_TRANSLATE_Y_HP"/> >+ <enum value="0x8159" name="GL_IMAGE_ROTATE_ANGLE_HP"/> >+ <enum value="0x815A" name="GL_IMAGE_ROTATE_ORIGIN_X_HP"/> >+ <enum value="0x815B" name="GL_IMAGE_ROTATE_ORIGIN_Y_HP"/> >+ <enum value="0x815C" name="GL_IMAGE_MAG_FILTER_HP"/> >+ <enum value="0x815D" name="GL_IMAGE_MIN_FILTER_HP"/> >+ <enum value="0x815E" name="GL_IMAGE_CUBIC_WEIGHT_HP"/> >+ <enum value="0x815F" name="GL_CUBIC_HP"/> >+ <enum value="0x8160" name="GL_AVERAGE_HP"/> >+ <enum value="0x8161" name="GL_IMAGE_TRANSFORM_2D_HP"/> >+ <enum value="0x8162" name="GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP"/> >+ <enum value="0x8163" name="GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP"/> >+ <unused start="0x8164" vendor="HP"/> >+ <enum value="0x8165" name="GL_OCCLUSION_TEST_HP"/> >+ <enum value="0x8166" name="GL_OCCLUSION_TEST_RESULT_HP"/> >+ <enum value="0x8167" name="GL_TEXTURE_LIGHTING_MODE_HP"/> >+ <enum value="0x8168" name="GL_TEXTURE_POST_SPECULAR_HP"/> >+ <enum value="0x8169" name="GL_TEXTURE_PRE_SPECULAR_HP"/> >+ <unused start="0x816A" end="0x816F" vendor="HP"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8170" end="0x81CF" vendor="SGI"> >+ <enum value="0x8170" name="GL_LINEAR_CLIPMAP_LINEAR_SGIX"/> >+ <enum value="0x8171" name="GL_TEXTURE_CLIPMAP_CENTER_SGIX"/> >+ <enum value="0x8172" name="GL_TEXTURE_CLIPMAP_FRAME_SGIX"/> >+ <enum value="0x8173" name="GL_TEXTURE_CLIPMAP_OFFSET_SGIX"/> >+ <enum value="0x8174" name="GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX"/> >+ <enum value="0x8175" name="GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX"/> >+ <enum value="0x8176" name="GL_TEXTURE_CLIPMAP_DEPTH_SGIX"/> >+ <enum value="0x8177" name="GL_MAX_CLIPMAP_DEPTH_SGIX"/> >+ <enum value="0x8178" name="GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX"/> >+ <enum value="0x8179" name="GL_POST_TEXTURE_FILTER_BIAS_SGIX"/> >+ <enum value="0x817A" name="GL_POST_TEXTURE_FILTER_SCALE_SGIX"/> >+ <enum value="0x817B" name="GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX"/> >+ <enum value="0x817C" name="GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX"/> >+ <enum value="0x817D" name="GL_REFERENCE_PLANE_SGIX"/> >+ <enum value="0x817E" name="GL_REFERENCE_PLANE_EQUATION_SGIX"/> >+ <enum value="0x817F" name="GL_IR_INSTRUMENT1_SGIX"/> >+ <enum value="0x8180" name="GL_INSTRUMENT_BUFFER_POINTER_SGIX"/> >+ <enum value="0x8181" name="GL_INSTRUMENT_MEASUREMENTS_SGIX"/> >+ <enum value="0x8182" name="GL_LIST_PRIORITY_SGIX"/> >+ <enum value="0x8183" name="GL_CALLIGRAPHIC_FRAGMENT_SGIX"/> >+ <enum value="0x8184" name="GL_PIXEL_TEX_GEN_Q_CEILING_SGIX"/> >+ <enum value="0x8185" name="GL_PIXEL_TEX_GEN_Q_ROUND_SGIX"/> >+ <enum value="0x8186" name="GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX"/> >+ <enum value="0x8187" name="GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX"/> >+ <enum value="0x8188" name="GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX"/> >+ <enum value="0x8189" name="GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX"/> >+ <enum value="0x818A" name="GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX"/> >+ <enum value="0x818B" name="GL_FRAMEZOOM_SGIX"/> >+ <enum value="0x818C" name="GL_FRAMEZOOM_FACTOR_SGIX"/> >+ <enum value="0x818D" name="GL_MAX_FRAMEZOOM_FACTOR_SGIX"/> >+ <enum value="0x818E" name="GL_TEXTURE_LOD_BIAS_S_SGIX"/> >+ <enum value="0x818F" name="GL_TEXTURE_LOD_BIAS_T_SGIX"/> >+ <enum value="0x8190" name="GL_TEXTURE_LOD_BIAS_R_SGIX"/> >+ <enum value="0x8191" name="GL_GENERATE_MIPMAP"/> >+ <enum value="0x8191" name="GL_GENERATE_MIPMAP_SGIS"/> >+ <enum value="0x8192" name="GL_GENERATE_MIPMAP_HINT"/> >+ <enum value="0x8192" name="GL_GENERATE_MIPMAP_HINT_SGIS"/> >+ <unused start="0x8193" end="0x8193" comment="Incomplete extension SGIX_spotlight_cutoff"/> >+ <!-- <enum value="0x8193" name="GL_SPOT_CUTOFF_DELTA_SGIX"/> --> >+ <enum value="0x8194" name="GL_GEOMETRY_DEFORMATION_SGIX"/> >+ <enum value="0x8195" name="GL_TEXTURE_DEFORMATION_SGIX"/> >+ <enum value="0x8196" name="GL_DEFORMATIONS_MASK_SGIX"/> >+ <enum value="0x8197" name="GL_MAX_DEFORMATION_ORDER_SGIX"/> >+ <enum value="0x8198" name="GL_FOG_OFFSET_SGIX"/> >+ <enum value="0x8199" name="GL_FOG_OFFSET_VALUE_SGIX"/> >+ <enum value="0x819A" name="GL_TEXTURE_COMPARE_SGIX"/> >+ <enum value="0x819B" name="GL_TEXTURE_COMPARE_OPERATOR_SGIX"/> >+ <enum value="0x819C" name="GL_TEXTURE_LEQUAL_R_SGIX"/> >+ <enum value="0x819D" name="GL_TEXTURE_GEQUAL_R_SGIX"/> >+ <unused start="0x819E" end="0x81A4" comment="Private (internal) extension SGIX_igloo_interface"/> >+ <!-- <enum value="0x819E" name="GL_IGLOO_FULLSCREEN_SGIX"/> --> >+ <!-- <enum value="0x819F" name="GL_IGLOO_VIEWPORT_OFFSET_SGIX"/> --> >+ <!-- <enum value="0x81A0" name="GL_IGLOO_SWAPTMESH_SGIX"/> --> >+ <!-- <enum value="0x81A1" name="GL_IGLOO_COLORNORMAL_SGIX"/> --> >+ <!-- <enum value="0x81A2" name="GL_IGLOO_IRISGL_MODE_SGIX"/> --> >+ <!-- <enum value="0x81A3" name="GL_IGLOO_LMC_COLOR_SGIX"/> --> >+ <!-- <enum value="0x81A4" name="GL_IGLOO_TMESHMODE_SGIX"/> --> >+ <enum value="0x81A5" name="GL_DEPTH_COMPONENT16"/> >+ <enum value="0x81A5" name="GL_DEPTH_COMPONENT16_ARB"/> >+ <enum value="0x81A5" name="GL_DEPTH_COMPONENT16_OES"/> >+ <enum value="0x81A5" name="GL_DEPTH_COMPONENT16_SGIX"/> >+ <enum value="0x81A6" name="GL_DEPTH_COMPONENT24"/> >+ <enum value="0x81A6" name="GL_DEPTH_COMPONENT24_ARB"/> >+ <enum value="0x81A6" name="GL_DEPTH_COMPONENT24_OES"/> >+ <enum value="0x81A6" name="GL_DEPTH_COMPONENT24_SGIX"/> >+ <enum value="0x81A7" name="GL_DEPTH_COMPONENT32"/> >+ <enum value="0x81A7" name="GL_DEPTH_COMPONENT32_ARB"/> >+ <enum value="0x81A7" name="GL_DEPTH_COMPONENT32_OES"/> >+ <enum value="0x81A7" name="GL_DEPTH_COMPONENT32_SGIX"/> >+ <enum value="0x81A8" name="GL_ARRAY_ELEMENT_LOCK_FIRST_EXT"/> >+ <enum value="0x81A9" name="GL_ARRAY_ELEMENT_LOCK_COUNT_EXT"/> >+ <enum value="0x81AA" name="GL_CULL_VERTEX_EXT"/> >+ <enum value="0x81AB" name="GL_CULL_VERTEX_EYE_POSITION_EXT"/> >+ <enum value="0x81AC" name="GL_CULL_VERTEX_OBJECT_POSITION_EXT"/> >+ <enum value="0x81AD" name="GL_IUI_V2F_EXT"/> >+ <enum value="0x81AE" name="GL_IUI_V3F_EXT"/> >+ <enum value="0x81AF" name="GL_IUI_N3F_V2F_EXT"/> >+ <enum value="0x81B0" name="GL_IUI_N3F_V3F_EXT"/> >+ <enum value="0x81B1" name="GL_T2F_IUI_V2F_EXT"/> >+ <enum value="0x81B2" name="GL_T2F_IUI_V3F_EXT"/> >+ <enum value="0x81B3" name="GL_T2F_IUI_N3F_V2F_EXT"/> >+ <enum value="0x81B4" name="GL_T2F_IUI_N3F_V3F_EXT"/> >+ <enum value="0x81B5" name="GL_INDEX_TEST_EXT"/> >+ <enum value="0x81B6" name="GL_INDEX_TEST_FUNC_EXT"/> >+ <enum value="0x81B7" name="GL_INDEX_TEST_REF_EXT"/> >+ <enum value="0x81B8" name="GL_INDEX_MATERIAL_EXT"/> >+ <enum value="0x81B9" name="GL_INDEX_MATERIAL_PARAMETER_EXT"/> >+ <enum value="0x81BA" name="GL_INDEX_MATERIAL_FACE_EXT"/> >+ <enum value="0x81BB" name="GL_YCRCB_422_SGIX"/> >+ <enum value="0x81BC" name="GL_YCRCB_444_SGIX"/> >+ <unused start="0x81BD" end="0x81C3" comment="Incomplete extension SGI_complex_type"/> >+ <!-- <enum value="0x81BD" name="GL_COMPLEX_UNSIGNED_BYTE_SGI"/> --> >+ <!-- <enum value="0x81BE" name="GL_COMPLEX_BYTE_SGI"/> --> >+ <!-- <enum value="0x81BF" name="GL_COMPLEX_UNSIGNED_SHORT_SGI"/> --> >+ <!-- <enum value="0x81C0" name="GL_COMPLEX_SHORT_SGI"/> --> >+ <!-- <enum value="0x81C1" name="GL_COMPLEX_UNSIGNED_INT_SGI"/> --> >+ <!-- <enum value="0x81C2" name="GL_COMPLEX_INT_SGI"/> --> >+ <!-- <enum value="0x81C3" name="GL_COMPLEX_FLOAT_SGI"/> --> >+ <unused start="0x81C4" end="0x81CA" comment="Incomplete extension SGI_fft"/> >+ <!-- <enum value="0x81C4" name="GL_PIXEL_TRANSFORM_OPERATOR_SGI"/> --> >+ <!-- <enum value="0x81C5" name="GL_CONVOLUTION_SGI"/> --> >+ <!-- <enum value="0x81C6" name="GL_FFT_1D_SGI"/> --> >+ <!-- <enum value="0x81C7" name="GL_PIXEL_TRANSFORM_SGI"/> --> >+ <!-- <enum value="0x81C8" name="GL_MAX_FFT_WIDTH_SGI"/> --> >+ <!-- <enum value="0x81C9" name="GL_SORT_SGI"/> --> >+ <!-- <enum value="0x81CA" name="GL_TRANSPOSE_SGI"/> --> >+ <unused start="0x81CB" end="0x81CF" comment="Incomplete extension SGIX_nurbs_eval"/> >+ <!-- <enum value="0x81CB" name="GL_MAP1_VERTEX_3_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81CC" name="GL_MAP1_VERTEX_4_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81CD" name="GL_MAP1_INDEX_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81CE" name="GL_MAP1_COLOR_4_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81CF" name="GL_MAP1_NORMAL_NURBS_SGIX"/> --> >+ </enums> >+ >+ <enums namespace="GL" start="0x81D0" end="0x81DF" vendor="SUN"> >+ <unused start="0x81D0" end="0x81D1" vendor="SUN"/> >+ <unused start="0x81D2" end="0x81D3" comment="No extension spec SUNX_surface_hint"/> >+ <!-- <enum value="0x81D2" name="GL_SURFACE_SIZE_HINT_SUNX"/> --> >+ <!-- <enum value="0x81D3" name="GL_LARGE_SUNX"/> --> >+ <enum value="0x81D4" name="GL_WRAP_BORDER_SUN"/> >+ <enum value="0x81D5" name="GL_UNPACK_CONSTANT_DATA_SUNX"/> >+ <enum value="0x81D6" name="GL_TEXTURE_CONSTANT_DATA_SUNX"/> >+ <enum value="0x81D7" name="GL_TRIANGLE_LIST_SUN"/> >+ <enum value="0x81D8" name="GL_REPLACEMENT_CODE_SUN"/> >+ <enum value="0x81D9" name="GL_GLOBAL_ALPHA_SUN"/> >+ <enum value="0x81DA" name="GL_GLOBAL_ALPHA_FACTOR_SUN"/> >+ <unused start="0x81DB" end="0x81DF" vendor="SUN"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x81E0" end="0x81FF" vendor="SGI"> >+ <unused start="0x81E0" end="0x81EE" comment="Incomplete extension SGIX_nurbs_eval"/> >+ <!-- <enum value="0x81E0" name="GL_MAP1_TEXTURE_COORD_1_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81E1" name="GL_MAP1_TEXTURE_COORD_2_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81E2" name="GL_MAP1_TEXTURE_COORD_3_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81E3" name="GL_MAP1_TEXTURE_COORD_4_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81E4" name="GL_MAP2_VERTEX_3_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81E5" name="GL_MAP2_VERTEX_4_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81E6" name="GL_MAP2_INDEX_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81E7" name="GL_MAP2_COLOR_4_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81E8" name="GL_MAP2_NORMAL_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81E9" name="GL_MAP2_TEXTURE_COORD_1_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81EA" name="GL_MAP2_TEXTURE_COORD_2_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81EB" name="GL_MAP2_TEXTURE_COORD_3_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81EC" name="GL_MAP2_TEXTURE_COORD_4_NURBS_SGIX"/> --> >+ <!-- <enum value="0x81ED" name="GL_NURBS_KNOT_COUNT_SGIX"/> --> >+ <!-- <enum value="0x81EE" name="GL_NURBS_KNOT_VECTOR_SGIX"/> --> >+ <enum value="0x81EF" name="GL_TEXTURE_COLOR_WRITEMASK_SGIS"/> >+ <enum value="0x81F0" name="GL_EYE_DISTANCE_TO_POINT_SGIS"/> >+ <enum value="0x81F1" name="GL_OBJECT_DISTANCE_TO_POINT_SGIS"/> >+ <enum value="0x81F2" name="GL_EYE_DISTANCE_TO_LINE_SGIS"/> >+ <enum value="0x81F3" name="GL_OBJECT_DISTANCE_TO_LINE_SGIS"/> >+ <enum value="0x81F4" name="GL_EYE_POINT_SGIS"/> >+ <enum value="0x81F5" name="GL_OBJECT_POINT_SGIS"/> >+ <enum value="0x81F6" name="GL_EYE_LINE_SGIS"/> >+ <enum value="0x81F7" name="GL_OBJECT_LINE_SGIS"/> >+ <enum value="0x81F8" name="GL_LIGHT_MODEL_COLOR_CONTROL"/> >+ <enum value="0x81F8" name="GL_LIGHT_MODEL_COLOR_CONTROL_EXT"/> >+ <enum value="0x81F9" name="GL_SINGLE_COLOR"/> >+ <enum value="0x81F9" name="GL_SINGLE_COLOR_EXT"/> >+ <enum value="0x81FA" name="GL_SEPARATE_SPECULAR_COLOR"/> >+ <enum value="0x81FA" name="GL_SEPARATE_SPECULAR_COLOR_EXT"/> >+ <enum value="0x81FB" name="GL_SHARED_TEXTURE_PALETTE_EXT"/> >+ <unused start="0x81FC" end="0x81FD" comment="Incomplete extension SGIX_fog_scale"/> >+ <!-- <enum value="0x81FC" name="GL_FOG_SCALE_SGIX"/> --> >+ <!-- <enum value="0x81FD" name="GL_FOG_SCALE_VALUE_SGIX"/> --> >+ <unused start="0x81FE" end="0x81FF" comment="Incomplete extension SGIX_fog_blend"/> >+ <!-- <enum value="0x81FE" name="GL_FOG_BLEND_ALPHA_SGIX"/> --> >+ <!-- <enum value="0x81FF" name="GL_FOG_BLEND_COLOR_SGIX"/> --> >+ </enums> >+ >+ <enums namespace="GL" start="0x8200" end="0x820F" vendor="AMD" comment="Range released by MS 2002/9/16"> >+ <enum value="0x8200" name="GL_TEXT_FRAGMENT_SHADER_ATI"/> >+ <unused start="0x8201" end="0x820F" vendor="AMD"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8210" end="0x823F" vendor="ARB"> >+ <enum value="0x8210" name="GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING"/> >+ <enum value="0x8210" name="GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT"/> >+ <enum value="0x8211" name="GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE"/> >+ <enum value="0x8211" name="GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT"/> >+ <enum value="0x8212" name="GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE"/> >+ <enum value="0x8213" name="GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE"/> >+ <enum value="0x8214" name="GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE"/> >+ <enum value="0x8215" name="GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE"/> >+ <enum value="0x8216" name="GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE"/> >+ <enum value="0x8217" name="GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE"/> >+ <enum value="0x8218" name="GL_FRAMEBUFFER_DEFAULT"/> >+ <enum value="0x8219" name="GL_FRAMEBUFFER_UNDEFINED"/> >+ <enum value="0x8219" name="GL_FRAMEBUFFER_UNDEFINED_OES"/> >+ <enum value="0x821A" name="GL_DEPTH_STENCIL_ATTACHMENT"/> >+ <enum value="0x821B" name="GL_MAJOR_VERSION"/> >+ <enum value="0x821C" name="GL_MINOR_VERSION"/> >+ <enum value="0x821D" name="GL_NUM_EXTENSIONS"/> >+ <enum value="0x821E" name="GL_CONTEXT_FLAGS"/> >+ <enum value="0x821F" name="GL_BUFFER_IMMUTABLE_STORAGE"/> >+ <enum value="0x821F" name="GL_BUFFER_IMMUTABLE_STORAGE_EXT"/> >+ <enum value="0x8220" name="GL_BUFFER_STORAGE_FLAGS"/> >+ <enum value="0x8220" name="GL_BUFFER_STORAGE_FLAGS_EXT"/> >+ <enum value="0x8221" name="GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED"/> >+ <enum value="0x8221" name="GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES"/> >+ <enum value="0x8222" name="GL_INDEX"/> >+ <unused start="0x8223" vendor="ARB" comment="GL_DEPTH_BUFFER = 0x8223 not actually used in the API"/> >+ <unused start="0x8224" vendor="ARB" comment="GL_STENCIL_BUFFER = 0x8224 not actually used in the API"/> >+ <enum value="0x8225" name="GL_COMPRESSED_RED"/> >+ <enum value="0x8226" name="GL_COMPRESSED_RG"/> >+ <enum value="0x8227" name="GL_RG"/> >+ <enum value="0x8227" name="GL_RG_EXT"/> >+ <enum value="0x8228" name="GL_RG_INTEGER"/> >+ <enum value="0x8229" name="GL_R8"/> >+ <enum value="0x8229" name="GL_R8_EXT"/> >+ <enum value="0x822A" name="GL_R16"/> >+ <enum value="0x822A" name="GL_R16_EXT"/> >+ <enum value="0x822B" name="GL_RG8"/> >+ <enum value="0x822B" name="GL_RG8_EXT"/> >+ <enum value="0x822C" name="GL_RG16"/> >+ <enum value="0x822C" name="GL_RG16_EXT"/> >+ <enum value="0x822D" name="GL_R16F"/> >+ <enum value="0x822D" name="GL_R16F_EXT"/> >+ <enum value="0x822E" name="GL_R32F"/> >+ <enum value="0x822E" name="GL_R32F_EXT"/> >+ <enum value="0x822F" name="GL_RG16F"/> >+ <enum value="0x822F" name="GL_RG16F_EXT"/> >+ <enum value="0x8230" name="GL_RG32F"/> >+ <enum value="0x8230" name="GL_RG32F_EXT"/> >+ <enum value="0x8231" name="GL_R8I"/> >+ <enum value="0x8232" name="GL_R8UI"/> >+ <enum value="0x8233" name="GL_R16I"/> >+ <enum value="0x8234" name="GL_R16UI"/> >+ <enum value="0x8235" name="GL_R32I"/> >+ <enum value="0x8236" name="GL_R32UI"/> >+ <enum value="0x8237" name="GL_RG8I"/> >+ <enum value="0x8238" name="GL_RG8UI"/> >+ <enum value="0x8239" name="GL_RG16I"/> >+ <enum value="0x823A" name="GL_RG16UI"/> >+ <enum value="0x823B" name="GL_RG32I"/> >+ <enum value="0x823C" name="GL_RG32UI"/> >+ <unused start="0x823D" end="0x823F" vendor="ARB"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8240" end="0x82AF" vendor="ARB" comment="Range released by MS on 2002/9/16"> >+ <enum value="0x8240" name="GL_SYNC_CL_EVENT_ARB"/> >+ <enum value="0x8241" name="GL_SYNC_CL_EVENT_COMPLETE_ARB"/> >+ <enum value="0x8242" name="GL_DEBUG_OUTPUT_SYNCHRONOUS"/> >+ <enum value="0x8242" name="GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB"/> >+ <enum value="0x8242" name="GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR"/> >+ <enum value="0x8243" name="GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH"/> >+ <enum value="0x8243" name="GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB"/> >+ <enum value="0x8243" name="GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR"/> >+ <enum value="0x8244" name="GL_DEBUG_CALLBACK_FUNCTION"/> >+ <enum value="0x8244" name="GL_DEBUG_CALLBACK_FUNCTION_ARB"/> >+ <enum value="0x8244" name="GL_DEBUG_CALLBACK_FUNCTION_KHR"/> >+ <enum value="0x8245" name="GL_DEBUG_CALLBACK_USER_PARAM"/> >+ <enum value="0x8245" name="GL_DEBUG_CALLBACK_USER_PARAM_ARB"/> >+ <enum value="0x8245" name="GL_DEBUG_CALLBACK_USER_PARAM_KHR"/> >+ <enum value="0x8246" name="GL_DEBUG_SOURCE_API"/> >+ <enum value="0x8246" name="GL_DEBUG_SOURCE_API_ARB"/> >+ <enum value="0x8246" name="GL_DEBUG_SOURCE_API_KHR"/> >+ <enum value="0x8247" name="GL_DEBUG_SOURCE_WINDOW_SYSTEM"/> >+ <enum value="0x8247" name="GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB"/> >+ <enum value="0x8247" name="GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR"/> >+ <enum value="0x8248" name="GL_DEBUG_SOURCE_SHADER_COMPILER"/> >+ <enum value="0x8248" name="GL_DEBUG_SOURCE_SHADER_COMPILER_ARB"/> >+ <enum value="0x8248" name="GL_DEBUG_SOURCE_SHADER_COMPILER_KHR"/> >+ <enum value="0x8249" name="GL_DEBUG_SOURCE_THIRD_PARTY"/> >+ <enum value="0x8249" name="GL_DEBUG_SOURCE_THIRD_PARTY_ARB"/> >+ <enum value="0x8249" name="GL_DEBUG_SOURCE_THIRD_PARTY_KHR"/> >+ <enum value="0x824A" name="GL_DEBUG_SOURCE_APPLICATION"/> >+ <enum value="0x824A" name="GL_DEBUG_SOURCE_APPLICATION_ARB"/> >+ <enum value="0x824A" name="GL_DEBUG_SOURCE_APPLICATION_KHR"/> >+ <enum value="0x824B" name="GL_DEBUG_SOURCE_OTHER"/> >+ <enum value="0x824B" name="GL_DEBUG_SOURCE_OTHER_ARB"/> >+ <enum value="0x824B" name="GL_DEBUG_SOURCE_OTHER_KHR"/> >+ <enum value="0x824C" name="GL_DEBUG_TYPE_ERROR"/> >+ <enum value="0x824C" name="GL_DEBUG_TYPE_ERROR_ARB"/> >+ <enum value="0x824C" name="GL_DEBUG_TYPE_ERROR_KHR"/> >+ <enum value="0x824D" name="GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR"/> >+ <enum value="0x824D" name="GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB"/> >+ <enum value="0x824D" name="GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR"/> >+ <enum value="0x824E" name="GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR"/> >+ <enum value="0x824E" name="GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB"/> >+ <enum value="0x824E" name="GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR"/> >+ <enum value="0x824F" name="GL_DEBUG_TYPE_PORTABILITY"/> >+ <enum value="0x824F" name="GL_DEBUG_TYPE_PORTABILITY_ARB"/> >+ <enum value="0x824F" name="GL_DEBUG_TYPE_PORTABILITY_KHR"/> >+ <enum value="0x8250" name="GL_DEBUG_TYPE_PERFORMANCE"/> >+ <enum value="0x8250" name="GL_DEBUG_TYPE_PERFORMANCE_ARB"/> >+ <enum value="0x8250" name="GL_DEBUG_TYPE_PERFORMANCE_KHR"/> >+ <enum value="0x8251" name="GL_DEBUG_TYPE_OTHER"/> >+ <enum value="0x8251" name="GL_DEBUG_TYPE_OTHER_ARB"/> >+ <enum value="0x8251" name="GL_DEBUG_TYPE_OTHER_KHR"/> >+ <enum value="0x8252" name="GL_LOSE_CONTEXT_ON_RESET"/> >+ <enum value="0x8252" name="GL_LOSE_CONTEXT_ON_RESET_ARB"/> >+ <enum value="0x8252" name="GL_LOSE_CONTEXT_ON_RESET_EXT"/> >+ <enum value="0x8252" name="GL_LOSE_CONTEXT_ON_RESET_KHR"/> >+ <enum value="0x8253" name="GL_GUILTY_CONTEXT_RESET"/> >+ <enum value="0x8253" name="GL_GUILTY_CONTEXT_RESET_ARB"/> >+ <enum value="0x8253" name="GL_GUILTY_CONTEXT_RESET_EXT"/> >+ <enum value="0x8253" name="GL_GUILTY_CONTEXT_RESET_KHR"/> >+ <enum value="0x8254" name="GL_INNOCENT_CONTEXT_RESET"/> >+ <enum value="0x8254" name="GL_INNOCENT_CONTEXT_RESET_ARB"/> >+ <enum value="0x8254" name="GL_INNOCENT_CONTEXT_RESET_EXT"/> >+ <enum value="0x8254" name="GL_INNOCENT_CONTEXT_RESET_KHR"/> >+ <enum value="0x8255" name="GL_UNKNOWN_CONTEXT_RESET"/> >+ <enum value="0x8255" name="GL_UNKNOWN_CONTEXT_RESET_ARB"/> >+ <enum value="0x8255" name="GL_UNKNOWN_CONTEXT_RESET_EXT"/> >+ <enum value="0x8255" name="GL_UNKNOWN_CONTEXT_RESET_KHR"/> >+ <enum value="0x8256" name="GL_RESET_NOTIFICATION_STRATEGY"/> >+ <enum value="0x8256" name="GL_RESET_NOTIFICATION_STRATEGY_ARB"/> >+ <enum value="0x8256" name="GL_RESET_NOTIFICATION_STRATEGY_EXT"/> >+ <enum value="0x8256" name="GL_RESET_NOTIFICATION_STRATEGY_KHR"/> >+ <enum value="0x8257" name="GL_PROGRAM_BINARY_RETRIEVABLE_HINT"/> >+ <enum value="0x8258" name="GL_PROGRAM_SEPARABLE"/> >+ <enum value="0x8258" name="GL_PROGRAM_SEPARABLE_EXT"/> >+ <enum value="0x8259" name="GL_ACTIVE_PROGRAM"/> >+ <enum value="0x8259" api="gles2" name="GL_ACTIVE_PROGRAM_EXT" comment="For the OpenGL ES version of EXT_separate_shader_objects"/> >+ <enum value="0x825A" name="GL_PROGRAM_PIPELINE_BINDING"/> >+ <enum value="0x825A" name="GL_PROGRAM_PIPELINE_BINDING_EXT"/> >+ <enum value="0x825B" name="GL_MAX_VIEWPORTS"/> >+ <enum value="0x825B" name="GL_MAX_VIEWPORTS_NV"/> >+ <enum value="0x825B" name="GL_MAX_VIEWPORTS_OES"/> >+ <enum value="0x825C" name="GL_VIEWPORT_SUBPIXEL_BITS"/> >+ <enum value="0x825C" name="GL_VIEWPORT_SUBPIXEL_BITS_EXT"/> >+ <enum value="0x825C" name="GL_VIEWPORT_SUBPIXEL_BITS_NV"/> >+ <enum value="0x825C" name="GL_VIEWPORT_SUBPIXEL_BITS_OES"/> >+ <enum value="0x825D" name="GL_VIEWPORT_BOUNDS_RANGE"/> >+ <enum value="0x825D" name="GL_VIEWPORT_BOUNDS_RANGE_EXT"/> >+ <enum value="0x825D" name="GL_VIEWPORT_BOUNDS_RANGE_NV"/> >+ <enum value="0x825D" name="GL_VIEWPORT_BOUNDS_RANGE_OES"/> >+ <enum value="0x825E" name="GL_LAYER_PROVOKING_VERTEX"/> >+ <enum value="0x825E" name="GL_LAYER_PROVOKING_VERTEX_EXT"/> >+ <enum value="0x825E" name="GL_LAYER_PROVOKING_VERTEX_OES"/> >+ <enum value="0x825F" name="GL_VIEWPORT_INDEX_PROVOKING_VERTEX"/> >+ <enum value="0x825F" name="GL_VIEWPORT_INDEX_PROVOKING_VERTEX_EXT"/> >+ <enum value="0x825F" name="GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV"/> >+ <enum value="0x825F" name="GL_VIEWPORT_INDEX_PROVOKING_VERTEX_OES"/> >+ <enum value="0x8260" name="GL_UNDEFINED_VERTEX"/> >+ <enum value="0x8260" name="GL_UNDEFINED_VERTEX_EXT"/> >+ <enum value="0x8260" name="GL_UNDEFINED_VERTEX_OES"/> >+ <enum value="0x8261" name="GL_NO_RESET_NOTIFICATION"/> >+ <enum value="0x8261" name="GL_NO_RESET_NOTIFICATION_ARB"/> >+ <enum value="0x8261" name="GL_NO_RESET_NOTIFICATION_EXT"/> >+ <enum value="0x8261" name="GL_NO_RESET_NOTIFICATION_KHR"/> >+ <enum value="0x8262" name="GL_MAX_COMPUTE_SHARED_MEMORY_SIZE"/> >+ <enum value="0x8263" name="GL_MAX_COMPUTE_UNIFORM_COMPONENTS"/> >+ <enum value="0x8264" name="GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS"/> >+ <enum value="0x8265" name="GL_MAX_COMPUTE_ATOMIC_COUNTERS"/> >+ <enum value="0x8266" name="GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS"/> >+ <enum value="0x8267" name="GL_COMPUTE_WORK_GROUP_SIZE"/> >+ <enum value="0x8268" name="GL_DEBUG_TYPE_MARKER"/> >+ <enum value="0x8268" name="GL_DEBUG_TYPE_MARKER_KHR"/> >+ <enum value="0x8269" name="GL_DEBUG_TYPE_PUSH_GROUP"/> >+ <enum value="0x8269" name="GL_DEBUG_TYPE_PUSH_GROUP_KHR"/> >+ <enum value="0x826A" name="GL_DEBUG_TYPE_POP_GROUP"/> >+ <enum value="0x826A" name="GL_DEBUG_TYPE_POP_GROUP_KHR"/> >+ <enum value="0x826B" name="GL_DEBUG_SEVERITY_NOTIFICATION"/> >+ <enum value="0x826B" name="GL_DEBUG_SEVERITY_NOTIFICATION_KHR"/> >+ <enum value="0x826C" name="GL_MAX_DEBUG_GROUP_STACK_DEPTH"/> >+ <enum value="0x826C" name="GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR"/> >+ <enum value="0x826D" name="GL_DEBUG_GROUP_STACK_DEPTH"/> >+ <enum value="0x826D" name="GL_DEBUG_GROUP_STACK_DEPTH_KHR"/> >+ <enum value="0x826E" name="GL_MAX_UNIFORM_LOCATIONS"/> >+ <enum value="0x826F" name="GL_INTERNALFORMAT_SUPPORTED"/> >+ <enum value="0x8270" name="GL_INTERNALFORMAT_PREFERRED"/> >+ <enum value="0x8271" name="GL_INTERNALFORMAT_RED_SIZE"/> >+ <enum value="0x8272" name="GL_INTERNALFORMAT_GREEN_SIZE"/> >+ <enum value="0x8273" name="GL_INTERNALFORMAT_BLUE_SIZE"/> >+ <enum value="0x8274" name="GL_INTERNALFORMAT_ALPHA_SIZE"/> >+ <enum value="0x8275" name="GL_INTERNALFORMAT_DEPTH_SIZE"/> >+ <enum value="0x8276" name="GL_INTERNALFORMAT_STENCIL_SIZE"/> >+ <enum value="0x8277" name="GL_INTERNALFORMAT_SHARED_SIZE"/> >+ <enum value="0x8278" name="GL_INTERNALFORMAT_RED_TYPE"/> >+ <enum value="0x8279" name="GL_INTERNALFORMAT_GREEN_TYPE"/> >+ <enum value="0x827A" name="GL_INTERNALFORMAT_BLUE_TYPE"/> >+ <enum value="0x827B" name="GL_INTERNALFORMAT_ALPHA_TYPE"/> >+ <enum value="0x827C" name="GL_INTERNALFORMAT_DEPTH_TYPE"/> >+ <enum value="0x827D" name="GL_INTERNALFORMAT_STENCIL_TYPE"/> >+ <enum value="0x827E" name="GL_MAX_WIDTH"/> >+ <enum value="0x827F" name="GL_MAX_HEIGHT"/> >+ <enum value="0x8280" name="GL_MAX_DEPTH"/> >+ <enum value="0x8281" name="GL_MAX_LAYERS"/> >+ <enum value="0x8282" name="GL_MAX_COMBINED_DIMENSIONS"/> >+ <enum value="0x8283" name="GL_COLOR_COMPONENTS"/> >+ <enum value="0x8284" name="GL_DEPTH_COMPONENTS"/> >+ <enum value="0x8285" name="GL_STENCIL_COMPONENTS"/> >+ <enum value="0x8286" name="GL_COLOR_RENDERABLE"/> >+ <enum value="0x8287" name="GL_DEPTH_RENDERABLE"/> >+ <enum value="0x8288" name="GL_STENCIL_RENDERABLE"/> >+ <enum value="0x8289" name="GL_FRAMEBUFFER_RENDERABLE"/> >+ <enum value="0x828A" name="GL_FRAMEBUFFER_RENDERABLE_LAYERED"/> >+ <enum value="0x828B" name="GL_FRAMEBUFFER_BLEND"/> >+ <enum value="0x828C" name="GL_READ_PIXELS"/> >+ <enum value="0x828D" name="GL_READ_PIXELS_FORMAT"/> >+ <enum value="0x828E" name="GL_READ_PIXELS_TYPE"/> >+ <enum value="0x828F" name="GL_TEXTURE_IMAGE_FORMAT"/> >+ <enum value="0x8290" name="GL_TEXTURE_IMAGE_TYPE"/> >+ <enum value="0x8291" name="GL_GET_TEXTURE_IMAGE_FORMAT"/> >+ <enum value="0x8292" name="GL_GET_TEXTURE_IMAGE_TYPE"/> >+ <enum value="0x8293" name="GL_MIPMAP"/> >+ <enum value="0x8294" name="GL_MANUAL_GENERATE_MIPMAP"/> >+ <enum value="0x8295" name="GL_AUTO_GENERATE_MIPMAP" comment="Should be deprecated"/> >+ <enum value="0x8296" name="GL_COLOR_ENCODING"/> >+ <enum value="0x8297" name="GL_SRGB_READ"/> >+ <enum value="0x8298" name="GL_SRGB_WRITE"/> >+ <enum value="0x8299" name="GL_SRGB_DECODE_ARB"/> >+ <enum value="0x829A" name="GL_FILTER"/> >+ <enum value="0x829B" name="GL_VERTEX_TEXTURE"/> >+ <enum value="0x829C" name="GL_TESS_CONTROL_TEXTURE"/> >+ <enum value="0x829D" name="GL_TESS_EVALUATION_TEXTURE"/> >+ <enum value="0x829E" name="GL_GEOMETRY_TEXTURE"/> >+ <enum value="0x829F" name="GL_FRAGMENT_TEXTURE"/> >+ <enum value="0x82A0" name="GL_COMPUTE_TEXTURE"/> >+ <enum value="0x82A1" name="GL_TEXTURE_SHADOW"/> >+ <enum value="0x82A2" name="GL_TEXTURE_GATHER"/> >+ <enum value="0x82A3" name="GL_TEXTURE_GATHER_SHADOW"/> >+ <enum value="0x82A4" name="GL_SHADER_IMAGE_LOAD"/> >+ <enum value="0x82A5" name="GL_SHADER_IMAGE_STORE"/> >+ <enum value="0x82A6" name="GL_SHADER_IMAGE_ATOMIC"/> >+ <enum value="0x82A7" name="GL_IMAGE_TEXEL_SIZE"/> >+ <enum value="0x82A8" name="GL_IMAGE_COMPATIBILITY_CLASS"/> >+ <enum value="0x82A9" name="GL_IMAGE_PIXEL_FORMAT"/> >+ <enum value="0x82AA" name="GL_IMAGE_PIXEL_TYPE"/> >+ <unused start="0x82AB" vendor="ARB"/> >+ <enum value="0x82AC" name="GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST"/> >+ <enum value="0x82AD" name="GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST"/> >+ <enum value="0x82AE" name="GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE"/> >+ <enum value="0x82AF" name="GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x82B0" end="0x830F" vendor="ARB" comment="Range reclaimed from ADD on 2012/05/10"> >+ <unused start="0x82B0" vendor="ARB"/> >+ <enum value="0x82B1" name="GL_TEXTURE_COMPRESSED_BLOCK_WIDTH"/> >+ <enum value="0x82B2" name="GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT"/> >+ <enum value="0x82B3" name="GL_TEXTURE_COMPRESSED_BLOCK_SIZE"/> >+ <enum value="0x82B4" name="GL_CLEAR_BUFFER"/> >+ <enum value="0x82B5" name="GL_TEXTURE_VIEW"/> >+ <enum value="0x82B6" name="GL_VIEW_COMPATIBILITY_CLASS"/> >+ <enum value="0x82B7" name="GL_FULL_SUPPORT"/> >+ <enum value="0x82B8" name="GL_CAVEAT_SUPPORT"/> >+ <enum value="0x82B9" name="GL_IMAGE_CLASS_4_X_32"/> >+ <enum value="0x82BA" name="GL_IMAGE_CLASS_2_X_32"/> >+ <enum value="0x82BB" name="GL_IMAGE_CLASS_1_X_32"/> >+ <enum value="0x82BC" name="GL_IMAGE_CLASS_4_X_16"/> >+ <enum value="0x82BD" name="GL_IMAGE_CLASS_2_X_16"/> >+ <enum value="0x82BE" name="GL_IMAGE_CLASS_1_X_16"/> >+ <enum value="0x82BF" name="GL_IMAGE_CLASS_4_X_8"/> >+ <enum value="0x82C0" name="GL_IMAGE_CLASS_2_X_8"/> >+ <enum value="0x82C1" name="GL_IMAGE_CLASS_1_X_8"/> >+ <enum value="0x82C2" name="GL_IMAGE_CLASS_11_11_10"/> >+ <enum value="0x82C3" name="GL_IMAGE_CLASS_10_10_10_2"/> >+ <enum value="0x82C4" name="GL_VIEW_CLASS_128_BITS"/> >+ <enum value="0x82C5" name="GL_VIEW_CLASS_96_BITS"/> >+ <enum value="0x82C6" name="GL_VIEW_CLASS_64_BITS"/> >+ <enum value="0x82C7" name="GL_VIEW_CLASS_48_BITS"/> >+ <enum value="0x82C8" name="GL_VIEW_CLASS_32_BITS"/> >+ <enum value="0x82C9" name="GL_VIEW_CLASS_24_BITS"/> >+ <enum value="0x82CA" name="GL_VIEW_CLASS_16_BITS"/> >+ <enum value="0x82CB" name="GL_VIEW_CLASS_8_BITS"/> >+ <enum value="0x82CC" name="GL_VIEW_CLASS_S3TC_DXT1_RGB"/> >+ <enum value="0x82CD" name="GL_VIEW_CLASS_S3TC_DXT1_RGBA"/> >+ <enum value="0x82CE" name="GL_VIEW_CLASS_S3TC_DXT3_RGBA"/> >+ <enum value="0x82CF" name="GL_VIEW_CLASS_S3TC_DXT5_RGBA"/> >+ <enum value="0x82D0" name="GL_VIEW_CLASS_RGTC1_RED"/> >+ <enum value="0x82D1" name="GL_VIEW_CLASS_RGTC2_RG"/> >+ <enum value="0x82D2" name="GL_VIEW_CLASS_BPTC_UNORM"/> >+ <enum value="0x82D3" name="GL_VIEW_CLASS_BPTC_FLOAT"/> >+ <enum value="0x82D4" name="GL_VERTEX_ATTRIB_BINDING"/> >+ <enum value="0x82D5" name="GL_VERTEX_ATTRIB_RELATIVE_OFFSET"/> >+ <enum value="0x82D6" name="GL_VERTEX_BINDING_DIVISOR"/> >+ <enum value="0x82D7" name="GL_VERTEX_BINDING_OFFSET"/> >+ <enum value="0x82D8" name="GL_VERTEX_BINDING_STRIDE"/> >+ <enum value="0x82D9" name="GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET"/> >+ <enum value="0x82DA" name="GL_MAX_VERTEX_ATTRIB_BINDINGS"/> >+ <enum value="0x82DB" name="GL_TEXTURE_VIEW_MIN_LEVEL"/> >+ <enum value="0x82DB" name="GL_TEXTURE_VIEW_MIN_LEVEL_EXT"/> >+ <enum value="0x82DB" name="GL_TEXTURE_VIEW_MIN_LEVEL_OES"/> >+ <enum value="0x82DC" name="GL_TEXTURE_VIEW_NUM_LEVELS"/> >+ <enum value="0x82DC" name="GL_TEXTURE_VIEW_NUM_LEVELS_EXT"/> >+ <enum value="0x82DC" name="GL_TEXTURE_VIEW_NUM_LEVELS_OES"/> >+ <enum value="0x82DD" name="GL_TEXTURE_VIEW_MIN_LAYER"/> >+ <enum value="0x82DD" name="GL_TEXTURE_VIEW_MIN_LAYER_EXT"/> >+ <enum value="0x82DD" name="GL_TEXTURE_VIEW_MIN_LAYER_OES"/> >+ <enum value="0x82DE" name="GL_TEXTURE_VIEW_NUM_LAYERS"/> >+ <enum value="0x82DE" name="GL_TEXTURE_VIEW_NUM_LAYERS_EXT"/> >+ <enum value="0x82DE" name="GL_TEXTURE_VIEW_NUM_LAYERS_OES"/> >+ <enum value="0x82DF" name="GL_TEXTURE_IMMUTABLE_LEVELS"/> >+ <enum value="0x82E0" name="GL_BUFFER"/> >+ <enum value="0x82E0" name="GL_BUFFER_KHR"/> >+ <enum value="0x82E1" name="GL_SHADER"/> >+ <enum value="0x82E1" name="GL_SHADER_KHR"/> >+ <enum value="0x82E2" name="GL_PROGRAM"/> >+ <enum value="0x82E2" name="GL_PROGRAM_KHR"/> >+ <enum value="0x82E3" name="GL_QUERY"/> >+ <enum value="0x82E3" name="GL_QUERY_KHR"/> >+ <enum value="0x82E4" name="GL_PROGRAM_PIPELINE"/> >+ <enum value="0x82E4" name="GL_PROGRAM_PIPELINE_KHR"/> >+ <enum value="0x82E5" name="GL_MAX_VERTEX_ATTRIB_STRIDE"/> >+ <enum value="0x82E6" name="GL_SAMPLER"/> >+ <enum value="0x82E6" name="GL_SAMPLER_KHR"/> >+ <enum value="0x82E7" name="GL_DISPLAY_LIST"/> >+ <enum value="0x82E8" name="GL_MAX_LABEL_LENGTH"/> >+ <enum value="0x82E8" name="GL_MAX_LABEL_LENGTH_KHR"/> >+ <enum value="0x82E9" name="GL_NUM_SHADING_LANGUAGE_VERSIONS"/> >+ <enum value="0x82EA" name="GL_QUERY_TARGET"/> >+ <!-- 0x82EB = GL_TEXTURE_BINDING was removed in GL 4.5 and >+ ARB_direct_state_access in February 2015 after determining it >+ was not well defined or implementable. --> >+ <unused start="0x82EB" vendor="ARB" comment="Reserved. Formerly used for GL_TEXTURE_BINDING."/> >+ <enum value="0x82EC" name="GL_TRANSFORM_FEEDBACK_OVERFLOW"/> >+ <enum value="0x82EC" name="GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB" alias="GL_TRANSFORM_FEEDBACK_OVERFLOW"/> >+ <enum value="0x82ED" name="GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW"/> >+ <enum value="0x82ED" name="GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB" alias="GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW"/> >+ <enum value="0x82EE" name="GL_VERTICES_SUBMITTED"/> >+ <enum value="0x82EE" name="GL_VERTICES_SUBMITTED_ARB" alias="GL_VERTICES_SUBMITTED"/> >+ <enum value="0x82EF" name="GL_PRIMITIVES_SUBMITTED"/> >+ <enum value="0x82EF" name="GL_PRIMITIVES_SUBMITTED_ARB" alias="GL_PRIMITIVES_SUBMITTED"/> >+ <enum value="0x82F0" name="GL_VERTEX_SHADER_INVOCATIONS"/> >+ <enum value="0x82F0" name="GL_VERTEX_SHADER_INVOCATIONS_ARB" alias="GL_VERTEX_SHADER_INVOCATIONS"/> >+ <enum value="0x82F1" name="GL_TESS_CONTROL_SHADER_PATCHES"/> >+ <enum value="0x82F1" name="GL_TESS_CONTROL_SHADER_PATCHES_ARB" alias="GL_TESS_CONTROL_SHADER_PATCHES"/> >+ <enum value="0x82F2" name="GL_TESS_EVALUATION_SHADER_INVOCATIONS"/> >+ <enum value="0x82F2" name="GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB" alias="GL_TESS_EVALUATION_SHADER_INVOCATIONS"/> >+ <enum value="0x82F3" name="GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED"/> >+ <enum value="0x82F3" name="GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB" alias="GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED"/> >+ <enum value="0x82F4" name="GL_FRAGMENT_SHADER_INVOCATIONS"/> >+ <enum value="0x82F4" name="GL_FRAGMENT_SHADER_INVOCATIONS_ARB" alias="GL_FRAGMENT_SHADER_INVOCATIONS"/> >+ <enum value="0x82F5" name="GL_COMPUTE_SHADER_INVOCATIONS"/> >+ <enum value="0x82F5" name="GL_COMPUTE_SHADER_INVOCATIONS_ARB" alias="GL_COMPUTE_SHADER_INVOCATIONS"/> >+ <enum value="0x82F6" name="GL_CLIPPING_INPUT_PRIMITIVES"/> >+ <enum value="0x82F6" name="GL_CLIPPING_INPUT_PRIMITIVES_ARB" alias="GL_CLIPPING_INPUT_PRIMITIVES"/> >+ <enum value="0x82F7" name="GL_CLIPPING_OUTPUT_PRIMITIVES"/> >+ <enum value="0x82F7" name="GL_CLIPPING_OUTPUT_PRIMITIVES_ARB" alias="GL_CLIPPING_OUTPUT_PRIMITIVES"/> >+ <enum value="0x82F8" name="GL_SPARSE_BUFFER_PAGE_SIZE_ARB"/> >+ <enum value="0x82F9" name="GL_MAX_CULL_DISTANCES"/> >+ <enum value="0x82F9" name="GL_MAX_CULL_DISTANCES_EXT" alias="GL_MAX_CULL_DISTANCES"/> >+ <enum value="0x82FA" name="GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES"/> >+ <enum value="0x82FA" name="GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT" alias="GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES"/> >+ <enum value="0x82FB" name="GL_CONTEXT_RELEASE_BEHAVIOR"/> >+ <enum value="0x82FB" name="GL_CONTEXT_RELEASE_BEHAVIOR_KHR"/> >+ <enum value="0x82FC" name="GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH"/> >+ <enum value="0x82FC" name="GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR"/> >+ <enum value="0x82FD" name="GL_ROBUST_GPU_TIMEOUT_MS_KHR" comment="Reserved for future"/> >+ <unused start="0x82FE" end="0x830F" vendor="ARB"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8310" end="0x832F" vendor="SGI"> >+ <enum value="0x8310" name="GL_DEPTH_PASS_INSTRUMENT_SGIX"/> >+ <enum value="0x8311" name="GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX"/> >+ <enum value="0x8312" name="GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX"/> >+ <enum value="0x8313" name="GL_FRAGMENTS_INSTRUMENT_SGIX"/> >+ <enum value="0x8314" name="GL_FRAGMENTS_INSTRUMENT_COUNTERS_SGIX"/> >+ <enum value="0x8315" name="GL_FRAGMENTS_INSTRUMENT_MAX_SGIX"/> >+ <enum value="0x8316" name="GL_CONVOLUTION_HINT_SGIX"/> >+ <unused start="0x8317" comment="Incomplete extension SGIX_color_matrix_accuracy"/> >+ <!-- <enum value="0x8317" name="GL_COLOR_MATRIX_HINT"/> --> >+ <enum value="0x8318" name="GL_YCRCB_SGIX"/> >+ <enum value="0x8319" name="GL_YCRCBA_SGIX"/> >+ <enum value="0x831A" name="GL_UNPACK_COMPRESSED_SIZE_SGIX"/> >+ <enum value="0x831B" name="GL_PACK_MAX_COMPRESSED_SIZE_SGIX"/> >+ <enum value="0x831C" name="GL_PACK_COMPRESSED_SIZE_SGIX"/> >+ <enum value="0x831D" name="GL_SLIM8U_SGIX"/> >+ <enum value="0x831E" name="GL_SLIM10U_SGIX"/> >+ <enum value="0x831F" name="GL_SLIM12S_SGIX"/> >+ <enum value="0x8320" name="GL_ALPHA_MIN_SGIX"/> >+ <enum value="0x8321" name="GL_ALPHA_MAX_SGIX"/> >+ <enum value="0x8322" name="GL_SCALEBIAS_HINT_SGIX"/> >+ <unused start="0x8323" end="0x8328" comment="Incomplete extension SGIX_fog_layers"/> >+ <!-- <enum value="0x8323" name="GL_FOG_TYPE_SGIX"/> --> >+ <!-- <enum value="0x8324" name="GL_UNIFORM_SGIX"/> --> >+ <!-- <enum value="0x8325" name="GL_LAYERED_SGIX"/> --> >+ <!-- <enum value="0x8326" name="GL_FOG_GROUND_PLANE_SGIX"/> --> >+ <!-- <enum value="0x8327" name="GL_FOG_LAYERS_POINTS_SGIX"/> --> >+ <!-- <enum value="0x8328" name="GL_MAX_FOG_LAYERS_POINTS_SGIX"/> --> >+ <enum value="0x8329" name="GL_ASYNC_MARKER_SGIX"/> >+ <unused start="0x832A" comment="Incomplete extension SGIX_texture_phase"/> >+ <!-- <enum value="0x832A" name="GL_PHASE_SGIX"/> --> >+ <enum value="0x832B" name="GL_PIXEL_TEX_GEN_MODE_SGIX"/> >+ <enum value="0x832C" name="GL_ASYNC_HISTOGRAM_SGIX"/> >+ <enum value="0x832D" name="GL_MAX_ASYNC_HISTOGRAM_SGIX"/> >+ <unused start="0x832E" end="0x832F" comment="Incomplete extension SGIX_texture_mipmap_anisotropic"/> >+ <!-- <enum value="0x832E" name="GL_TEXTURE_MIPMAP_ANISOTROPY_SGIX"/> --> >+ <!-- <enum value="0x832F" name="GL_MAX_MIPMAP_ANISOTROPY_SGIX"/> --> >+ </enums> >+ >+ <enums namespace="GL" start="0x8330" end="0x833F" vendor="SUN"> >+ <enum value="0x8330" name="GL_PIXEL_TRANSFORM_2D_EXT"/> >+ <enum value="0x8331" name="GL_PIXEL_MAG_FILTER_EXT"/> >+ <enum value="0x8332" name="GL_PIXEL_MIN_FILTER_EXT"/> >+ <enum value="0x8333" name="GL_PIXEL_CUBIC_WEIGHT_EXT"/> >+ <enum value="0x8334" name="GL_CUBIC_EXT"/> >+ <enum value="0x8335" name="GL_AVERAGE_EXT"/> >+ <enum value="0x8336" name="GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT"/> >+ <enum value="0x8337" name="GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT"/> >+ <enum value="0x8338" name="GL_PIXEL_TRANSFORM_2D_MATRIX_EXT"/> >+ <unused start="0x8339" end="0x833F" vendor="SUN"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8340" end="0x836F" vendor="SGI"> >+ <unused start="0x8340" end="0x8348" comment="Incomplete extension SGIX_cube_map"/> >+ <!-- <enum value="0x8340" name="GL_ENV_MAP_SGIX"/> --> >+ <!-- <enum value="0x8341" name="GL_CUBE_MAP_SGIX"/> --> >+ <!-- <enum value="0x8342" name="GL_CUBE_MAP_ZP_SGIX"/> --> >+ <!-- <enum value="0x8343" name="GL_CUBE_MAP_ZN_SGIX"/> --> >+ <!-- <enum value="0x8344" name="GL_CUBE_MAP_XN_SGIX"/> --> >+ <!-- <enum value="0x8345" name="GL_CUBE_MAP_XP_SGIX"/> --> >+ <!-- <enum value="0x8346" name="GL_CUBE_MAP_YN_SGIX"/> --> >+ <!-- <enum value="0x8347" name="GL_CUBE_MAP_YP_SGIX"/> --> >+ <!-- <enum value="0x8348" name="GL_CUBE_MAP_BINDING_SGIX"/> --> >+ <enum value="0x8349" name="GL_FRAGMENT_MATERIAL_EXT"/> >+ <enum value="0x834A" name="GL_FRAGMENT_NORMAL_EXT"/> >+ <!-- Unfortunately, there was a collision promoting to EXT >+ from SGIX. Use fog_coord's value of 0x8452 instead of >+ the old assigned FRAGMENT_DEPTH_EXT (0x834B). --> >+ <enum value="0x834C" name="GL_FRAGMENT_COLOR_EXT"/> >+ <enum value="0x834D" name="GL_ATTENUATION_EXT"/> >+ <enum value="0x834E" name="GL_SHADOW_ATTENUATION_EXT"/> >+ <enum value="0x834F" name="GL_TEXTURE_APPLICATION_MODE_EXT"/> >+ <enum value="0x8350" name="GL_TEXTURE_LIGHT_EXT"/> >+ <enum value="0x8351" name="GL_TEXTURE_MATERIAL_FACE_EXT"/> >+ <enum value="0x8352" name="GL_TEXTURE_MATERIAL_PARAMETER_EXT"/> >+ <enum value="0x8353" name="GL_PIXEL_TEXTURE_SGIS"/> >+ <enum value="0x8354" name="GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS"/> >+ <enum value="0x8355" name="GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS"/> >+ <enum value="0x8356" name="GL_PIXEL_GROUP_COLOR_SGIS"/> >+ <unused start="0x8357" end="0x8359" comment="Incomplete extension SGIX_pixel_texture_bits"/> >+ <!-- <enum value="0x8357" name="GL_COLOR_TO_TEXTURE_COORD_SGIX"/> --> >+ <!-- <enum value="0x8358" name="GL_COLOR_BIT_PATTERN_SGIX"/> --> >+ <!-- <enum value="0x8359" name="GL_COLOR_VALUE_SGIX"/> --> >+ <unused start="0x835A" comment="Incomplete extension SGIX_pixel_texture_lod"/> >+ <!-- <enum value="0x835A" name="GL_PIXEL_TEX_GEN_LAMBDA_SOURCE_SGIX"/> --> >+ <enum value="0x835B" name="GL_LINE_QUALITY_HINT_SGIX"/> >+ <enum value="0x835C" name="GL_ASYNC_TEX_IMAGE_SGIX"/> >+ <enum value="0x835D" name="GL_ASYNC_DRAW_PIXELS_SGIX"/> >+ <enum value="0x835E" name="GL_ASYNC_READ_PIXELS_SGIX"/> >+ <enum value="0x835F" name="GL_MAX_ASYNC_TEX_IMAGE_SGIX"/> >+ <enum value="0x8360" name="GL_MAX_ASYNC_DRAW_PIXELS_SGIX"/> >+ <enum value="0x8361" name="GL_MAX_ASYNC_READ_PIXELS_SGIX"/> >+ <enum value="0x8362" name="GL_UNSIGNED_BYTE_2_3_3_REV"/> >+ <enum value="0x8362" name="GL_UNSIGNED_BYTE_2_3_3_REV_EXT"/> >+ <enum value="0x8363" name="GL_UNSIGNED_SHORT_5_6_5"/> >+ <enum value="0x8363" name="GL_UNSIGNED_SHORT_5_6_5_EXT"/> >+ <enum value="0x8364" name="GL_UNSIGNED_SHORT_5_6_5_REV"/> >+ <enum value="0x8364" name="GL_UNSIGNED_SHORT_5_6_5_REV_EXT"/> >+ <enum value="0x8365" name="GL_UNSIGNED_SHORT_4_4_4_4_REV"/> >+ <enum value="0x8365" name="GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT"/> >+ <enum value="0x8365" name="GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG"/> >+ <enum value="0x8366" name="GL_UNSIGNED_SHORT_1_5_5_5_REV"/> >+ <enum value="0x8366" name="GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT"/> >+ <enum value="0x8367" name="GL_UNSIGNED_INT_8_8_8_8_REV"/> >+ <enum value="0x8367" name="GL_UNSIGNED_INT_8_8_8_8_REV_EXT"/> >+ <enum value="0x8368" name="GL_UNSIGNED_INT_2_10_10_10_REV"/> >+ <enum value="0x8368" name="GL_UNSIGNED_INT_2_10_10_10_REV_EXT"/> >+ <enum value="0x8369" name="GL_TEXTURE_MAX_CLAMP_S_SGIX"/> >+ <enum value="0x836A" name="GL_TEXTURE_MAX_CLAMP_T_SGIX"/> >+ <enum value="0x836B" name="GL_TEXTURE_MAX_CLAMP_R_SGIX"/> >+ <unused start="0x836C" end="0x836E" comment="Incomplete extension SGIX_fog_texture"/> >+ <!-- <enum value="0x836C" name="GL_FRAGMENT_FOG_SGIX"/> --> >+ <!-- <enum value="0x836D" name="GL_TEXTURE_FOG_SGIX"/> --> >+ <!-- <enum value="0x836E" name="GL_FOG_PATCHY_FACTOR_SGIX"/> --> >+ <unused start="0x836F" comment="Incomplete extension SGIX_fog_factor_to_alpha"/> >+ <!-- <enum value="0x836F" name="GL_FOG_FACTOR_TO_ALPHA_SGIX"/> --> >+ </enums> >+ >+ <enums namespace="GL" start="0x8370" end="0x837F" vendor="HP"> >+ <!-- NOTE: IBM is using values in this range, because of a >+ bobble when an employee left DEC for IBM at the same >+ time as they were assigned the range. their registry >+ became inconsistent. It's unknown whether HP has any >+ conflicts. They have never reported using any values in >+ this range. Lesson: assigned ranges belong to vendors, >+ not engineers! --> >+ <enum value="0x8370" name="GL_MIRRORED_REPEAT"/> >+ <enum value="0x8370" name="GL_MIRRORED_REPEAT_ARB"/> >+ <enum value="0x8370" name="GL_MIRRORED_REPEAT_IBM"/> >+ <enum value="0x8370" name="GL_MIRRORED_REPEAT_OES"/> >+ <unused start="0x8371" end="0x837F" vendor="HP"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8380" end="0x839F" vendor="IBM"> >+ <unused start="0x8380" end="0x839F" vendor="IBM"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x83A0" end="0x83BF" vendor="S3"> >+ <enum value="0x83A0" name="GL_RGB_S3TC"/> >+ <enum value="0x83A1" name="GL_RGB4_S3TC"/> >+ <enum value="0x83A2" name="GL_RGBA_S3TC"/> >+ <enum value="0x83A3" name="GL_RGBA4_S3TC"/> >+ <enum value="0x83A4" name="GL_RGBA_DXT5_S3TC"/> >+ <enum value="0x83A5" name="GL_RGBA4_DXT5_S3TC"/> >+ <unused start="0x83A6" end="0x83BF" vendor="S3"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x83C0" end="0x83EF" vendor="SGI" comment="Most of this could be reclaimed"> >+ <unused start="0x83C0" end="0x83CA" comment="Withdrawn extension SGIS_multitexture"/> >+ <!-- <enum value="0x83C0" name="GL_SELECTED_TEXTURE_SGIS"/> --> >+ <!-- <enum value="0x83C1" name="GL_SELECTED_TEXTURE_COORD_SET_SGIS"/> --> >+ <!-- <enum value="0x83C2" name="GL_SELECTED_TEXTURE_TRANSFORM_SGIS"/> --> >+ <!-- <enum value="0x83C3" name="GL_MAX_TEXTURES_SGIS"/> --> >+ <!-- <enum value="0x83C4" name="GL_MAX_TEXTURE_COORD_SETS_SGIS"/> --> >+ <!-- <enum value="0x83C5" name="GL_TEXTURE_COORD_SET_INTERLEAVE_FACTOR_SGIS"/> --> >+ <!-- <enum value="0x83C6" name="GL_TEXTURE_ENV_COORD_SET_SGIS"/> --> >+ <!-- <enum value="0x83C7" name="GL_TEXTURE0_SGIS"/> --> >+ <!-- <enum value="0x83C8" name="GL_TEXTURE1_SGIS"/> --> >+ <!-- <enum value="0x83C9" name="GL_TEXTURE2_SGIS"/> --> >+ <!-- <enum value="0x83CA" name="GL_TEXTURE3_SGIS"/> --> >+ <unused start="0x83CB" end="0x83E5" vendor="SGI"/> >+ <unused start="0x83E6" end="0x83E9" comment="Incomplete extension SGIX_bali_g_instruments"/> >+ <!-- <enum value="0x83E6" name="GL_BALI_NUM_TRIS_CULLED_INSTRUMENT_SGIX"/> --> >+ <!-- <enum value="0x83E7" name="GL_BALI_NUM_PRIMS_CLIPPED_INSTRUMENT_SGIX"/> --> >+ <!-- <enum value="0x83E8" name="GL_BALI_NUM_PRIMS_REJECT_INSTRUMENT_SGIX"/> --> >+ <!-- <enum value="0x83E9" name="GL_BALI_NUM_PRIMS_CLIP_RESULT_INSTRUMENT_SGIX"/> --> >+ <unused start="0x83EA" end="0x83EC" comment="Incomplete extension SGIX_bali_r_instruments"/> >+ <!-- <enum value="0x83EA" name="GL_BALI_FRAGMENTS_GENERATED_INSTRUMENT_SGIX"/> --> >+ <!-- <enum value="0x83EB" name="GL_BALI_DEPTH_PASS_INSTRUMENT_SGIX"/> --> >+ <!-- <enum value="0x83EC" name="GL_BALI_R_CHIP_COUNT_SGIX"/> --> >+ <unused start="0x83ED" comment="Incomplete extension SGIX_occlusion_instrument"/> >+ <!-- <enum value="0x83ED" name="GL_OCCLUSION_INSTRUMENT_SGIX"/> --> >+ <enum value="0x83EE" name="GL_VERTEX_PRECLIP_SGIX"/> >+ <enum value="0x83EF" name="GL_VERTEX_PRECLIP_HINT_SGIX"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x83F0" end="0x83FF" vendor="INTEL"> >+ <!-- This block was reclaimed from NTP, who never shipped >+ it, and reassigned to Intel. --> >+ <enum value="0x83F0" name="GL_COMPRESSED_RGB_S3TC_DXT1_EXT"/> >+ <enum value="0x83F1" name="GL_COMPRESSED_RGBA_S3TC_DXT1_EXT"/> >+ <enum value="0x83F2" name="GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE"/> >+ <enum value="0x83F2" name="GL_COMPRESSED_RGBA_S3TC_DXT3_EXT"/> >+ <enum value="0x83F3" name="GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE"/> >+ <enum value="0x83F3" name="GL_COMPRESSED_RGBA_S3TC_DXT5_EXT"/> >+ <enum value="0x83F4" name="GL_PARALLEL_ARRAYS_INTEL"/> >+ <enum value="0x83F5" name="GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL"/> >+ <enum value="0x83F6" name="GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL"/> >+ <enum value="0x83F7" name="GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL"/> >+ <enum value="0x83F8" name="GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL"/> >+ <enum value="0x83F9" name="GL_PERFQUERY_DONOT_FLUSH_INTEL"/> >+ <enum value="0x83FA" name="GL_PERFQUERY_FLUSH_INTEL"/> >+ <enum value="0x83FB" name="GL_PERFQUERY_WAIT_INTEL"/> >+ <enum value="0x83FC" name="GL_BLACKHOLE_RENDER_INTEL"/> >+ <unused start="0x83FD" vendor="INTEL"/> >+ <enum value="0x83FE" name="GL_CONSERVATIVE_RASTERIZATION_INTEL"/> >+ <enum value="0x83FF" name="GL_TEXTURE_MEMORY_LAYOUT_INTEL"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8400" end="0x846F" vendor="SGI"> >+ <enum value="0x8400" name="GL_FRAGMENT_LIGHTING_SGIX"/> >+ <enum value="0x8401" name="GL_FRAGMENT_COLOR_MATERIAL_SGIX"/> >+ <enum value="0x8402" name="GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX"/> >+ <enum value="0x8403" name="GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX"/> >+ <enum value="0x8404" name="GL_MAX_FRAGMENT_LIGHTS_SGIX"/> >+ <enum value="0x8405" name="GL_MAX_ACTIVE_LIGHTS_SGIX"/> >+ <enum value="0x8406" name="GL_CURRENT_RASTER_NORMAL_SGIX"/> >+ <enum value="0x8407" name="GL_LIGHT_ENV_MODE_SGIX"/> >+ <enum value="0x8408" name="GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX"/> >+ <enum value="0x8409" name="GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX"/> >+ <enum value="0x840A" name="GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX"/> >+ <enum value="0x840B" name="GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX"/> >+ <enum value="0x840C" name="GL_FRAGMENT_LIGHT0_SGIX"/> >+ <enum value="0x840D" name="GL_FRAGMENT_LIGHT1_SGIX"/> >+ <enum value="0x840E" name="GL_FRAGMENT_LIGHT2_SGIX"/> >+ <enum value="0x840F" name="GL_FRAGMENT_LIGHT3_SGIX"/> >+ <enum value="0x8410" name="GL_FRAGMENT_LIGHT4_SGIX"/> >+ <enum value="0x8411" name="GL_FRAGMENT_LIGHT5_SGIX"/> >+ <enum value="0x8412" name="GL_FRAGMENT_LIGHT6_SGIX"/> >+ <enum value="0x8413" name="GL_FRAGMENT_LIGHT7_SGIX"/> >+ <unused start="0x8414" end="0x842D" vendor="SGI"/> >+ <enum value="0x842E" name="GL_PACK_RESAMPLE_SGIX" comment="Formerly 0x842C in SGI specfile"/> >+ <enum value="0x842F" name="GL_UNPACK_RESAMPLE_SGIX" comment="Formerly 0x842D in SGI specfile"/> >+ <enum value="0x8430" name="GL_RESAMPLE_DECIMATE_SGIX" comment="Formerly 0x8430 in SGI specfile"/> >+ <unused start="0x8431" end="0x8432" vendor="SGI"/> >+ <enum value="0x8433" name="GL_RESAMPLE_REPLICATE_SGIX" comment="Formerly 0x842E in SGI specfile"/> >+ <enum value="0x8434" name="GL_RESAMPLE_ZERO_FILL_SGIX" comment="Formerly 0x842F in SGI specfile"/> >+ <unused start="0x8435" vendor="SGI"/> >+ <!-- Incomplete extension SGIX_fragment_lighting --> >+ <!-- <enum value="0x8436" name="GL_EYE_SPACE_SGIX"/> --> >+ <!-- <enum value="0x8437" name="GL_TANGENT_SPACE_SGIX"/> --> >+ <!-- <enum value="0x8438" name="GL_OBJECT_SPACE_SGIX"/> --> >+ <!-- <enum value="0x8439" name="GL_TANGENT_ARRAY_SGIX"/> --> >+ <!-- <enum value="0x843A" name="GL_BINORMAL_ARRAY_SGIX"/> --> >+ <!-- <enum value="0x843B" name="GL_CURRENT_TANGENT_SGIX"/> --> >+ <!-- <enum value="0x843C" name="GL_CURRENT_BINORMAL_SGIX"/> --> >+ <!-- <enum value="0x843D" name="GL_FRAGMENT_LIGHT_SPACE_SGIX"/> --> >+ <!-- <enum value="0x843E" name="GL_TANGENT_ARRAY_TYPE_SGIX"/> --> >+ <!-- <enum value="0x843F" name="GL_TANGENT_ARRAY_STRIDE_SGIX"/> --> >+ <!-- <enum value="0x8440" name="GL_TANGENT_ARRAY_COUNT_SGIX"/> --> >+ <!-- <enum value="0x8441" name="GL_BINORMAL_ARRAY_TYPE_SGIX"/> --> >+ <!-- <enum value="0x8442" name="GL_BINORMAL_ARRAY_STRIDE_SGIX"/> --> >+ <!-- <enum value="0x8443" name="GL_BINORMAL_ARRAY_COUNT_SGIX"/> --> >+ <!-- <enum value="0x8444" name="GL_TANGENT_ARRAY_POINTER_SGIX"/> --> >+ <!-- <enum value="0x8445" name="GL_BINORMAL_ARRAY_POINTER_SGIX"/> --> >+ <!-- <enum value="0x8446" name="GL_MAP1_TANGENT_SGIX"/> --> >+ <!-- <enum value="0x8447" name="GL_MAP2_TANGENT_SGIX"/> --> >+ <!-- <enum value="0x8448" name="GL_MAP1_BINORMAL_SGIX"/> --> >+ <!-- <enum value="0x8449" name="GL_MAP2_BINORMAL_SGIX"/> --> >+ <enum value="0x8439" name="GL_TANGENT_ARRAY_EXT"/> >+ <enum value="0x843A" name="GL_BINORMAL_ARRAY_EXT"/> >+ <enum value="0x843B" name="GL_CURRENT_TANGENT_EXT"/> >+ <enum value="0x843C" name="GL_CURRENT_BINORMAL_EXT"/> >+ <unused start="0x844D" vendor="SGI"/> >+ <enum value="0x843E" name="GL_TANGENT_ARRAY_TYPE_EXT"/> >+ <enum value="0x843F" name="GL_TANGENT_ARRAY_STRIDE_EXT"/> >+ <enum value="0x8440" name="GL_BINORMAL_ARRAY_TYPE_EXT"/> >+ <enum value="0x8441" name="GL_BINORMAL_ARRAY_STRIDE_EXT"/> >+ <enum value="0x8442" name="GL_TANGENT_ARRAY_POINTER_EXT"/> >+ <enum value="0x8443" name="GL_BINORMAL_ARRAY_POINTER_EXT"/> >+ <enum value="0x8444" name="GL_MAP1_TANGENT_EXT"/> >+ <enum value="0x8445" name="GL_MAP2_TANGENT_EXT"/> >+ <enum value="0x8446" name="GL_MAP1_BINORMAL_EXT"/> >+ <enum value="0x8447" name="GL_MAP2_BINORMAL_EXT"/> >+ <unused start="0x8448" end="0x8449" comment="Incomplete extension SGIX_fragment_lighting"/> >+ <unused start="0x844A" end="0x844C" comment="Incomplete extension SGIX_bali_timer_instruments"/> >+ <!-- <enum value="0x844A" name="GL_BALI_GEOM_TIMER_INSTRUMENT_SGIX"/> --> >+ <!-- <enum value="0x844B" name="GL_BALI_RASTER_TIMER_INSTRUMENT_SGIX"/> --> >+ <!-- <enum value="0x844C" name="GL_BALI_INSTRUMENT_TIME_UNIT_SGIX"/> --> >+ <enum value="0x844D" name="GL_NEAREST_CLIPMAP_NEAREST_SGIX"/> >+ <enum value="0x844E" name="GL_NEAREST_CLIPMAP_LINEAR_SGIX"/> >+ <enum value="0x844F" name="GL_LINEAR_CLIPMAP_NEAREST_SGIX"/> >+ <!-- 0x8450-0x845F range brokered for Id Software --> >+ <enum value="0x8450" name="GL_FOG_COORDINATE_SOURCE"/> >+ <enum value="0x8450" name="GL_FOG_COORDINATE_SOURCE_EXT"/> >+ <enum value="0x8450" name="GL_FOG_COORD_SRC" alias="GL_FOG_COORDINATE_SOURCE"/> >+ <enum value="0x8451" name="GL_FOG_COORDINATE"/> >+ <enum value="0x8451" name="GL_FOG_COORD" alias="GL_FOG_COORDINATE"/> >+ <enum value="0x8451" name="GL_FOG_COORDINATE_EXT"/> >+ <enum value="0x8452" name="GL_FRAGMENT_DEPTH"/> >+ <enum value="0x8452" name="GL_FRAGMENT_DEPTH_EXT"/> >+ <enum value="0x8453" name="GL_CURRENT_FOG_COORDINATE"/> >+ <enum value="0x8453" name="GL_CURRENT_FOG_COORD" alias="GL_CURRENT_FOG_COORDINATE"/> >+ <enum value="0x8453" name="GL_CURRENT_FOG_COORDINATE_EXT"/> >+ <enum value="0x8454" name="GL_FOG_COORDINATE_ARRAY_TYPE"/> >+ <enum value="0x8454" name="GL_FOG_COORDINATE_ARRAY_TYPE_EXT"/> >+ <enum value="0x8454" name="GL_FOG_COORD_ARRAY_TYPE" alias="GL_FOG_COORDINATE_ARRAY_TYPE"/> >+ <enum value="0x8455" name="GL_FOG_COORDINATE_ARRAY_STRIDE"/> >+ <enum value="0x8455" name="GL_FOG_COORDINATE_ARRAY_STRIDE_EXT"/> >+ <enum value="0x8455" name="GL_FOG_COORD_ARRAY_STRIDE" alias="GL_FOG_COORDINATE_ARRAY_STRIDE"/> >+ <enum value="0x8456" name="GL_FOG_COORDINATE_ARRAY_POINTER"/> >+ <enum value="0x8456" name="GL_FOG_COORDINATE_ARRAY_POINTER_EXT"/> >+ <enum value="0x8456" name="GL_FOG_COORD_ARRAY_POINTER" alias="GL_FOG_COORDINATE_ARRAY_POINTER"/> >+ <enum value="0x8457" name="GL_FOG_COORDINATE_ARRAY"/> >+ <enum value="0x8457" name="GL_FOG_COORDINATE_ARRAY_EXT"/> >+ <enum value="0x8457" name="GL_FOG_COORD_ARRAY" alias="GL_FOG_COORDINATE_ARRAY"/> >+ <enum value="0x8458" name="GL_COLOR_SUM"/> >+ <enum value="0x8458" name="GL_COLOR_SUM_ARB"/> >+ <enum value="0x8458" name="GL_COLOR_SUM_EXT"/> >+ <enum value="0x8459" name="GL_CURRENT_SECONDARY_COLOR"/> >+ <enum value="0x8459" name="GL_CURRENT_SECONDARY_COLOR_EXT"/> >+ <enum value="0x845A" name="GL_SECONDARY_COLOR_ARRAY_SIZE"/> >+ <enum value="0x845A" name="GL_SECONDARY_COLOR_ARRAY_SIZE_EXT"/> >+ <enum value="0x845B" name="GL_SECONDARY_COLOR_ARRAY_TYPE"/> >+ <enum value="0x845B" name="GL_SECONDARY_COLOR_ARRAY_TYPE_EXT"/> >+ <enum value="0x845C" name="GL_SECONDARY_COLOR_ARRAY_STRIDE"/> >+ <enum value="0x845C" name="GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT"/> >+ <enum value="0x845D" name="GL_SECONDARY_COLOR_ARRAY_POINTER"/> >+ <enum value="0x845D" name="GL_SECONDARY_COLOR_ARRAY_POINTER_EXT"/> >+ <enum value="0x845E" name="GL_SECONDARY_COLOR_ARRAY"/> >+ <enum value="0x845E" name="GL_SECONDARY_COLOR_ARRAY_EXT"/> >+ <enum value="0x845F" name="GL_CURRENT_RASTER_SECONDARY_COLOR"/> >+ <unused start="0x8460" end="0x846B" comment="Incomplete extension SGIX_icc_texture"/> >+ <!-- <enum value="0x8460" name="GL_RGB_ICC_SGIX"/> --> >+ <!-- <enum value="0x8461" name="GL_RGBA_ICC_SGIX"/> --> >+ <!-- <enum value="0x8462" name="GL_ALPHA_ICC_SGIX"/> --> >+ <!-- <enum value="0x8463" name="GL_LUMINANCE_ICC_SGIX"/> --> >+ <!-- <enum value="0x8464" name="GL_INTENSITY_ICC_SGIX"/> --> >+ <!-- <enum value="0x8465" name="GL_LUMINANCE_ALPHA_ICC_SGIX"/> --> >+ <!-- <enum value="0x8466" name="GL_R5_G6_B5_ICC_SGIX"/> --> >+ <!-- <enum value="0x8467" name="GL_R5_G6_B5_A8_ICC_SGIX"/> --> >+ <!-- <enum value="0x8468" name="GL_ALPHA16_ICC_SGIX"/> --> >+ <!-- <enum value="0x8469" name="GL_LUMINANCE16_ICC_SGIX"/> --> >+ <!-- <enum value="0x846A" name="GL_INTENSITY16_ICC_SGIX"/> --> >+ <!-- <enum value="0x846B" name="GL_LUMINANCE16_ALPHA8_ICC_SGIX"/> --> >+ <unused start="0x846C" vendor="SGI"/> >+ <enum value="0x846D" name="GL_ALIASED_POINT_SIZE_RANGE"/> >+ <enum value="0x846E" name="GL_ALIASED_LINE_WIDTH_RANGE"/> >+ <unused start="0x846F" vendor="SGI"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8470" end="0x848F" vendor="AMD"> >+ <unused start="0x8470" end="0x848F" vendor="AMD"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8490" end="0x849F" vendor="REND"> >+ <enum value="0x8490" name="GL_SCREEN_COORDINATES_REND"/> >+ <enum value="0x8491" name="GL_INVERTED_SCREEN_W_REND"/> >+ <unused start="0x8492" end="0x849F" vendor="REND"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x84A0" end="0x84BF" vendor="AMD"> >+ <unused start="0x84A0" end="0x84BF" vendor="AMD"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x84C0" end="0x84EF" vendor="ARB"> >+ <enum value="0x84C0" name="GL_TEXTURE0"/> >+ <enum value="0x84C0" name="GL_TEXTURE0_ARB"/> >+ <enum value="0x84C1" name="GL_TEXTURE1"/> >+ <enum value="0x84C1" name="GL_TEXTURE1_ARB"/> >+ <enum value="0x84C2" name="GL_TEXTURE2"/> >+ <enum value="0x84C2" name="GL_TEXTURE2_ARB"/> >+ <enum value="0x84C3" name="GL_TEXTURE3"/> >+ <enum value="0x84C3" name="GL_TEXTURE3_ARB"/> >+ <enum value="0x84C4" name="GL_TEXTURE4"/> >+ <enum value="0x84C4" name="GL_TEXTURE4_ARB"/> >+ <enum value="0x84C5" name="GL_TEXTURE5"/> >+ <enum value="0x84C5" name="GL_TEXTURE5_ARB"/> >+ <enum value="0x84C6" name="GL_TEXTURE6"/> >+ <enum value="0x84C6" name="GL_TEXTURE6_ARB"/> >+ <enum value="0x84C7" name="GL_TEXTURE7"/> >+ <enum value="0x84C7" name="GL_TEXTURE7_ARB"/> >+ <enum value="0x84C8" name="GL_TEXTURE8"/> >+ <enum value="0x84C8" name="GL_TEXTURE8_ARB"/> >+ <enum value="0x84C9" name="GL_TEXTURE9"/> >+ <enum value="0x84C9" name="GL_TEXTURE9_ARB"/> >+ <enum value="0x84CA" name="GL_TEXTURE10"/> >+ <enum value="0x84CA" name="GL_TEXTURE10_ARB"/> >+ <enum value="0x84CB" name="GL_TEXTURE11"/> >+ <enum value="0x84CB" name="GL_TEXTURE11_ARB"/> >+ <enum value="0x84CC" name="GL_TEXTURE12"/> >+ <enum value="0x84CC" name="GL_TEXTURE12_ARB"/> >+ <enum value="0x84CD" name="GL_TEXTURE13"/> >+ <enum value="0x84CD" name="GL_TEXTURE13_ARB"/> >+ <enum value="0x84CE" name="GL_TEXTURE14"/> >+ <enum value="0x84CE" name="GL_TEXTURE14_ARB"/> >+ <enum value="0x84CF" name="GL_TEXTURE15"/> >+ <enum value="0x84CF" name="GL_TEXTURE15_ARB"/> >+ <enum value="0x84D0" name="GL_TEXTURE16"/> >+ <enum value="0x84D0" name="GL_TEXTURE16_ARB"/> >+ <enum value="0x84D1" name="GL_TEXTURE17"/> >+ <enum value="0x84D1" name="GL_TEXTURE17_ARB"/> >+ <enum value="0x84D2" name="GL_TEXTURE18"/> >+ <enum value="0x84D2" name="GL_TEXTURE18_ARB"/> >+ <enum value="0x84D3" name="GL_TEXTURE19"/> >+ <enum value="0x84D3" name="GL_TEXTURE19_ARB"/> >+ <enum value="0x84D4" name="GL_TEXTURE20"/> >+ <enum value="0x84D4" name="GL_TEXTURE20_ARB"/> >+ <enum value="0x84D5" name="GL_TEXTURE21"/> >+ <enum value="0x84D5" name="GL_TEXTURE21_ARB"/> >+ <enum value="0x84D6" name="GL_TEXTURE22"/> >+ <enum value="0x84D6" name="GL_TEXTURE22_ARB"/> >+ <enum value="0x84D7" name="GL_TEXTURE23"/> >+ <enum value="0x84D7" name="GL_TEXTURE23_ARB"/> >+ <enum value="0x84D8" name="GL_TEXTURE24"/> >+ <enum value="0x84D8" name="GL_TEXTURE24_ARB"/> >+ <enum value="0x84D9" name="GL_TEXTURE25"/> >+ <enum value="0x84D9" name="GL_TEXTURE25_ARB"/> >+ <enum value="0x84DA" name="GL_TEXTURE26"/> >+ <enum value="0x84DA" name="GL_TEXTURE26_ARB"/> >+ <enum value="0x84DB" name="GL_TEXTURE27"/> >+ <enum value="0x84DB" name="GL_TEXTURE27_ARB"/> >+ <enum value="0x84DC" name="GL_TEXTURE28"/> >+ <enum value="0x84DC" name="GL_TEXTURE28_ARB"/> >+ <enum value="0x84DD" name="GL_TEXTURE29"/> >+ <enum value="0x84DD" name="GL_TEXTURE29_ARB"/> >+ <enum value="0x84DE" name="GL_TEXTURE30"/> >+ <enum value="0x84DE" name="GL_TEXTURE30_ARB"/> >+ <enum value="0x84DF" name="GL_TEXTURE31"/> >+ <enum value="0x84DF" name="GL_TEXTURE31_ARB"/> >+ <enum value="0x84E0" name="GL_ACTIVE_TEXTURE"/> >+ <enum value="0x84E0" name="GL_ACTIVE_TEXTURE_ARB"/> >+ <enum value="0x84E1" name="GL_CLIENT_ACTIVE_TEXTURE"/> >+ <enum value="0x84E1" name="GL_CLIENT_ACTIVE_TEXTURE_ARB"/> >+ <enum value="0x84E2" name="GL_MAX_TEXTURE_UNITS"/> >+ <enum value="0x84E2" name="GL_MAX_TEXTURE_UNITS_ARB"/> >+ <enum value="0x84E3" name="GL_TRANSPOSE_MODELVIEW_MATRIX"/> >+ <enum value="0x84E3" name="GL_TRANSPOSE_MODELVIEW_MATRIX_ARB"/> >+ <enum value="0x84E3" name="GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV"/> >+ <enum value="0x84E4" name="GL_TRANSPOSE_PROJECTION_MATRIX"/> >+ <enum value="0x84E4" name="GL_TRANSPOSE_PROJECTION_MATRIX_ARB"/> >+ <enum value="0x84E4" name="GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV"/> >+ <enum value="0x84E5" name="GL_TRANSPOSE_TEXTURE_MATRIX"/> >+ <enum value="0x84E5" name="GL_TRANSPOSE_TEXTURE_MATRIX_ARB"/> >+ <enum value="0x84E6" name="GL_TRANSPOSE_COLOR_MATRIX"/> >+ <enum value="0x84E6" name="GL_TRANSPOSE_COLOR_MATRIX_ARB"/> >+ <enum value="0x84E7" name="GL_SUBTRACT"/> >+ <enum value="0x84E7" name="GL_SUBTRACT_ARB"/> >+ <enum value="0x84E8" name="GL_MAX_RENDERBUFFER_SIZE"/> >+ <enum value="0x84E8" name="GL_MAX_RENDERBUFFER_SIZE_EXT"/> >+ <enum value="0x84E8" name="GL_MAX_RENDERBUFFER_SIZE_OES"/> >+ <enum value="0x84E9" name="GL_COMPRESSED_ALPHA"/> >+ <enum value="0x84E9" name="GL_COMPRESSED_ALPHA_ARB"/> >+ <enum value="0x84EA" name="GL_COMPRESSED_LUMINANCE"/> >+ <enum value="0x84EA" name="GL_COMPRESSED_LUMINANCE_ARB"/> >+ <enum value="0x84EB" name="GL_COMPRESSED_LUMINANCE_ALPHA"/> >+ <enum value="0x84EB" name="GL_COMPRESSED_LUMINANCE_ALPHA_ARB"/> >+ <enum value="0x84EC" name="GL_COMPRESSED_INTENSITY"/> >+ <enum value="0x84EC" name="GL_COMPRESSED_INTENSITY_ARB"/> >+ <enum value="0x84ED" name="GL_COMPRESSED_RGB"/> >+ <enum value="0x84ED" name="GL_COMPRESSED_RGB_ARB"/> >+ <enum value="0x84EE" name="GL_COMPRESSED_RGBA"/> >+ <enum value="0x84EE" name="GL_COMPRESSED_RGBA_ARB"/> >+ <enum value="0x84EF" name="GL_TEXTURE_COMPRESSION_HINT"/> >+ <enum value="0x84EF" name="GL_TEXTURE_COMPRESSION_HINT_ARB"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x84F0" end="0x855F" vendor="NV"> >+ <enum value="0x84F0" name="GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER"/> >+ <enum value="0x84F1" name="GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER"/> >+ <enum value="0x84F2" name="GL_ALL_COMPLETED_NV"/> >+ <enum value="0x84F3" name="GL_FENCE_STATUS_NV"/> >+ <enum value="0x84F4" name="GL_FENCE_CONDITION_NV"/> >+ <enum value="0x84F5" name="GL_TEXTURE_RECTANGLE"/> >+ <enum value="0x84F5" name="GL_TEXTURE_RECTANGLE_ARB"/> >+ <enum value="0x84F5" name="GL_TEXTURE_RECTANGLE_NV"/> >+ <enum value="0x84F6" name="GL_TEXTURE_BINDING_RECTANGLE"/> >+ <enum value="0x84F6" name="GL_TEXTURE_BINDING_RECTANGLE_ARB"/> >+ <enum value="0x84F6" name="GL_TEXTURE_BINDING_RECTANGLE_NV"/> >+ <enum value="0x84F7" name="GL_PROXY_TEXTURE_RECTANGLE"/> >+ <enum value="0x84F7" name="GL_PROXY_TEXTURE_RECTANGLE_ARB"/> >+ <enum value="0x84F7" name="GL_PROXY_TEXTURE_RECTANGLE_NV"/> >+ <enum value="0x84F8" name="GL_MAX_RECTANGLE_TEXTURE_SIZE"/> >+ <enum value="0x84F8" name="GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB"/> >+ <enum value="0x84F8" name="GL_MAX_RECTANGLE_TEXTURE_SIZE_NV"/> >+ <enum value="0x84F9" name="GL_DEPTH_STENCIL"/> >+ <enum value="0x84F9" name="GL_DEPTH_STENCIL_EXT"/> >+ <enum value="0x84F9" name="GL_DEPTH_STENCIL_NV"/> >+ <enum value="0x84F9" name="GL_DEPTH_STENCIL_OES"/> >+ <enum value="0x84FA" name="GL_UNSIGNED_INT_24_8"/> >+ <enum value="0x84FA" name="GL_UNSIGNED_INT_24_8_EXT"/> >+ <enum value="0x84FA" name="GL_UNSIGNED_INT_24_8_NV"/> >+ <enum value="0x84FA" name="GL_UNSIGNED_INT_24_8_OES"/> >+ <unused start="0x84FB" end="0x84FC" vendor="NV"/> >+ <enum value="0x84FD" name="GL_MAX_TEXTURE_LOD_BIAS"/> >+ <enum value="0x84FD" name="GL_MAX_TEXTURE_LOD_BIAS_EXT"/> >+ <enum value="0x84FE" name="GL_TEXTURE_MAX_ANISOTROPY"/> >+ <enum value="0x84FE" name="GL_TEXTURE_MAX_ANISOTROPY_EXT" alias="GL_TEXTURE_MAX_ANISOTROPY"/> >+ <enum value="0x84FF" name="GL_MAX_TEXTURE_MAX_ANISOTROPY"/> >+ <enum value="0x84FF" name="GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT" alias="GL_MAX_TEXTURE_MAX_ANISOTROPY"/> >+ <enum value="0x8500" name="GL_TEXTURE_FILTER_CONTROL"/> >+ <enum value="0x8500" name="GL_TEXTURE_FILTER_CONTROL_EXT"/> >+ <enum value="0x8501" name="GL_TEXTURE_LOD_BIAS"/> >+ <enum value="0x8501" name="GL_TEXTURE_LOD_BIAS_EXT"/> >+ <enum value="0x8502" name="GL_MODELVIEW1_STACK_DEPTH_EXT"/> >+ <enum value="0x8503" name="GL_COMBINE4_NV"/> >+ <enum value="0x8504" name="GL_MAX_SHININESS_NV"/> >+ <enum value="0x8505" name="GL_MAX_SPOT_EXPONENT_NV"/> >+ <enum value="0x8506" name="GL_MODELVIEW1_MATRIX_EXT"/> >+ <enum value="0x8507" name="GL_INCR_WRAP"/> >+ <enum value="0x8507" name="GL_INCR_WRAP_EXT"/> >+ <enum value="0x8507" name="GL_INCR_WRAP_OES"/> >+ <enum value="0x8508" name="GL_DECR_WRAP"/> >+ <enum value="0x8508" name="GL_DECR_WRAP_EXT"/> >+ <enum value="0x8508" name="GL_DECR_WRAP_OES"/> >+ <enum value="0x8509" name="GL_VERTEX_WEIGHTING_EXT"/> >+ <enum value="0x850A" name="GL_MODELVIEW1_ARB"/> >+ <enum value="0x850A" name="GL_MODELVIEW1_EXT"/> >+ <enum value="0x850B" name="GL_CURRENT_VERTEX_WEIGHT_EXT"/> >+ <enum value="0x850C" name="GL_VERTEX_WEIGHT_ARRAY_EXT"/> >+ <enum value="0x850D" name="GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT"/> >+ <enum value="0x850E" name="GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT"/> >+ <enum value="0x850F" name="GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT"/> >+ <enum value="0x8510" name="GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT"/> >+ <enum value="0x8511" name="GL_NORMAL_MAP"/> >+ <enum value="0x8511" name="GL_NORMAL_MAP_ARB"/> >+ <enum value="0x8511" name="GL_NORMAL_MAP_EXT"/> >+ <enum value="0x8511" name="GL_NORMAL_MAP_NV"/> >+ <enum value="0x8511" name="GL_NORMAL_MAP_OES"/> >+ <enum value="0x8512" name="GL_REFLECTION_MAP"/> >+ <enum value="0x8512" name="GL_REFLECTION_MAP_ARB"/> >+ <enum value="0x8512" name="GL_REFLECTION_MAP_EXT"/> >+ <enum value="0x8512" name="GL_REFLECTION_MAP_NV"/> >+ <enum value="0x8512" name="GL_REFLECTION_MAP_OES"/> >+ <enum value="0x8513" name="GL_TEXTURE_CUBE_MAP"/> >+ <enum value="0x8513" name="GL_TEXTURE_CUBE_MAP_ARB"/> >+ <enum value="0x8513" name="GL_TEXTURE_CUBE_MAP_EXT"/> >+ <enum value="0x8513" name="GL_TEXTURE_CUBE_MAP_OES"/> >+ <enum value="0x8514" name="GL_TEXTURE_BINDING_CUBE_MAP"/> >+ <enum value="0x8514" name="GL_TEXTURE_BINDING_CUBE_MAP_ARB"/> >+ <enum value="0x8514" name="GL_TEXTURE_BINDING_CUBE_MAP_EXT"/> >+ <enum value="0x8514" name="GL_TEXTURE_BINDING_CUBE_MAP_OES"/> >+ <enum value="0x8515" name="GL_TEXTURE_CUBE_MAP_POSITIVE_X"/> >+ <enum value="0x8515" name="GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB"/> >+ <enum value="0x8515" name="GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT"/> >+ <enum value="0x8515" name="GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES"/> >+ <enum value="0x8516" name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X"/> >+ <enum value="0x8516" name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB"/> >+ <enum value="0x8516" name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT"/> >+ <enum value="0x8516" name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES"/> >+ <enum value="0x8517" name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y"/> >+ <enum value="0x8517" name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB"/> >+ <enum value="0x8517" name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT"/> >+ <enum value="0x8517" name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES"/> >+ <enum value="0x8518" name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y"/> >+ <enum value="0x8518" name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB"/> >+ <enum value="0x8518" name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT"/> >+ <enum value="0x8518" name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES"/> >+ <enum value="0x8519" name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z"/> >+ <enum value="0x8519" name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB"/> >+ <enum value="0x8519" name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT"/> >+ <enum value="0x8519" name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES"/> >+ <enum value="0x851A" name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z"/> >+ <enum value="0x851A" name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB"/> >+ <enum value="0x851A" name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT"/> >+ <enum value="0x851A" name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES"/> >+ <enum value="0x851B" name="GL_PROXY_TEXTURE_CUBE_MAP"/> >+ <enum value="0x851B" name="GL_PROXY_TEXTURE_CUBE_MAP_ARB"/> >+ <enum value="0x851B" name="GL_PROXY_TEXTURE_CUBE_MAP_EXT"/> >+ <enum value="0x851C" name="GL_MAX_CUBE_MAP_TEXTURE_SIZE"/> >+ <enum value="0x851C" name="GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB"/> >+ <enum value="0x851C" name="GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT"/> >+ <enum value="0x851C" name="GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES"/> >+ <enum value="0x851D" name="GL_VERTEX_ARRAY_RANGE_APPLE"/> >+ <enum value="0x851D" name="GL_VERTEX_ARRAY_RANGE_NV"/> >+ <enum value="0x851E" name="GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE"/> >+ <enum value="0x851E" name="GL_VERTEX_ARRAY_RANGE_LENGTH_NV"/> >+ <enum value="0x851F" name="GL_VERTEX_ARRAY_RANGE_VALID_NV"/> >+ <enum value="0x851F" name="GL_VERTEX_ARRAY_STORAGE_HINT_APPLE"/> >+ <enum value="0x8520" name="GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV"/> >+ <enum value="0x8521" name="GL_VERTEX_ARRAY_RANGE_POINTER_APPLE"/> >+ <enum value="0x8521" name="GL_VERTEX_ARRAY_RANGE_POINTER_NV"/> >+ <enum value="0x8522" name="GL_REGISTER_COMBINERS_NV"/> >+ <enum value="0x8523" name="GL_VARIABLE_A_NV"/> >+ <enum value="0x8524" name="GL_VARIABLE_B_NV"/> >+ <enum value="0x8525" name="GL_VARIABLE_C_NV"/> >+ <enum value="0x8526" name="GL_VARIABLE_D_NV"/> >+ <enum value="0x8527" name="GL_VARIABLE_E_NV"/> >+ <enum value="0x8528" name="GL_VARIABLE_F_NV"/> >+ <enum value="0x8529" name="GL_VARIABLE_G_NV"/> >+ <enum value="0x852A" name="GL_CONSTANT_COLOR0_NV"/> >+ <enum value="0x852B" name="GL_CONSTANT_COLOR1_NV"/> >+ <enum value="0x852C" name="GL_PRIMARY_COLOR_NV"/> >+ <enum value="0x852D" name="GL_SECONDARY_COLOR_NV"/> >+ <enum value="0x852E" name="GL_SPARE0_NV"/> >+ <enum value="0x852F" name="GL_SPARE1_NV"/> >+ <enum value="0x8530" name="GL_DISCARD_NV"/> >+ <enum value="0x8531" name="GL_E_TIMES_F_NV"/> >+ <enum value="0x8532" name="GL_SPARE0_PLUS_SECONDARY_COLOR_NV"/> >+ <enum value="0x8533" name="GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV"/> >+ <enum value="0x8534" name="GL_MULTISAMPLE_FILTER_HINT_NV"/> >+ <enum value="0x8535" name="GL_PER_STAGE_CONSTANTS_NV"/> >+ <enum value="0x8536" name="GL_UNSIGNED_IDENTITY_NV"/> >+ <enum value="0x8537" name="GL_UNSIGNED_INVERT_NV"/> >+ <enum value="0x8538" name="GL_EXPAND_NORMAL_NV"/> >+ <enum value="0x8539" name="GL_EXPAND_NEGATE_NV"/> >+ <enum value="0x853A" name="GL_HALF_BIAS_NORMAL_NV"/> >+ <enum value="0x853B" name="GL_HALF_BIAS_NEGATE_NV"/> >+ <enum value="0x853C" name="GL_SIGNED_IDENTITY_NV"/> >+ <enum value="0x853D" name="GL_SIGNED_NEGATE_NV"/> >+ <enum value="0x853E" name="GL_SCALE_BY_TWO_NV"/> >+ <enum value="0x853F" name="GL_SCALE_BY_FOUR_NV"/> >+ <enum value="0x8540" name="GL_SCALE_BY_ONE_HALF_NV"/> >+ <enum value="0x8541" name="GL_BIAS_BY_NEGATIVE_ONE_HALF_NV"/> >+ <enum value="0x8542" name="GL_COMBINER_INPUT_NV"/> >+ <enum value="0x8543" name="GL_COMBINER_MAPPING_NV"/> >+ <enum value="0x8544" name="GL_COMBINER_COMPONENT_USAGE_NV"/> >+ <enum value="0x8545" name="GL_COMBINER_AB_DOT_PRODUCT_NV"/> >+ <enum value="0x8546" name="GL_COMBINER_CD_DOT_PRODUCT_NV"/> >+ <enum value="0x8547" name="GL_COMBINER_MUX_SUM_NV"/> >+ <enum value="0x8548" name="GL_COMBINER_SCALE_NV"/> >+ <enum value="0x8549" name="GL_COMBINER_BIAS_NV"/> >+ <enum value="0x854A" name="GL_COMBINER_AB_OUTPUT_NV"/> >+ <enum value="0x854B" name="GL_COMBINER_CD_OUTPUT_NV"/> >+ <enum value="0x854C" name="GL_COMBINER_SUM_OUTPUT_NV"/> >+ <enum value="0x854D" name="GL_MAX_GENERAL_COMBINERS_NV"/> >+ <enum value="0x854E" name="GL_NUM_GENERAL_COMBINERS_NV"/> >+ <enum value="0x854F" name="GL_COLOR_SUM_CLAMP_NV"/> >+ <enum value="0x8550" name="GL_COMBINER0_NV"/> >+ <enum value="0x8551" name="GL_COMBINER1_NV"/> >+ <enum value="0x8552" name="GL_COMBINER2_NV"/> >+ <enum value="0x8553" name="GL_COMBINER3_NV"/> >+ <enum value="0x8554" name="GL_COMBINER4_NV"/> >+ <enum value="0x8555" name="GL_COMBINER5_NV"/> >+ <enum value="0x8556" name="GL_COMBINER6_NV"/> >+ <enum value="0x8557" name="GL_COMBINER7_NV"/> >+ <enum value="0x8558" name="GL_PRIMITIVE_RESTART_NV"/> >+ <enum value="0x8559" name="GL_PRIMITIVE_RESTART_INDEX_NV"/> >+ <enum value="0x855A" name="GL_FOG_DISTANCE_MODE_NV"/> >+ <enum value="0x855B" name="GL_EYE_RADIAL_NV"/> >+ <enum value="0x855C" name="GL_EYE_PLANE_ABSOLUTE_NV"/> >+ <enum value="0x855D" name="GL_EMBOSS_LIGHT_NV"/> >+ <enum value="0x855E" name="GL_EMBOSS_CONSTANT_NV"/> >+ <enum value="0x855F" name="GL_EMBOSS_MAP_NV"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8560" end="0x856F" vendor="ZiiLabs"> >+ <enum value="0x8560" name="GL_RED_MIN_CLAMP_INGR"/> >+ <enum value="0x8561" name="GL_GREEN_MIN_CLAMP_INGR"/> >+ <enum value="0x8562" name="GL_BLUE_MIN_CLAMP_INGR"/> >+ <enum value="0x8563" name="GL_ALPHA_MIN_CLAMP_INGR"/> >+ <enum value="0x8564" name="GL_RED_MAX_CLAMP_INGR"/> >+ <enum value="0x8565" name="GL_GREEN_MAX_CLAMP_INGR"/> >+ <enum value="0x8566" name="GL_BLUE_MAX_CLAMP_INGR"/> >+ <enum value="0x8567" name="GL_ALPHA_MAX_CLAMP_INGR"/> >+ <enum value="0x8568" name="GL_INTERLACE_READ_INGR"/> >+ <unused start="0x8569" end="0x856F" vendor="ZiiLabs"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8570" end="0x859F" group="RegisterCombinerPname" vendor="AMD/NV"> >+ <enum value="0x8570" name="GL_COMBINE"/> >+ <enum value="0x8570" name="GL_COMBINE_ARB"/> >+ <enum value="0x8570" name="GL_COMBINE_EXT"/> >+ <enum value="0x8571" name="GL_COMBINE_RGB"/> >+ <enum value="0x8571" name="GL_COMBINE_RGB_ARB"/> >+ <enum value="0x8571" name="GL_COMBINE_RGB_EXT"/> >+ <enum value="0x8572" name="GL_COMBINE_ALPHA"/> >+ <enum value="0x8572" name="GL_COMBINE_ALPHA_ARB"/> >+ <enum value="0x8572" name="GL_COMBINE_ALPHA_EXT"/> >+ <enum value="0x8573" name="GL_RGB_SCALE"/> >+ <enum value="0x8573" name="GL_RGB_SCALE_ARB"/> >+ <enum value="0x8573" name="GL_RGB_SCALE_EXT"/> >+ <enum value="0x8574" name="GL_ADD_SIGNED"/> >+ <enum value="0x8574" name="GL_ADD_SIGNED_ARB"/> >+ <enum value="0x8574" name="GL_ADD_SIGNED_EXT"/> >+ <enum value="0x8575" name="GL_INTERPOLATE"/> >+ <enum value="0x8575" name="GL_INTERPOLATE_ARB"/> >+ <enum value="0x8575" name="GL_INTERPOLATE_EXT"/> >+ <enum value="0x8576" name="GL_CONSTANT"/> >+ <enum value="0x8576" name="GL_CONSTANT_ARB"/> >+ <enum value="0x8576" name="GL_CONSTANT_EXT"/> >+ <enum value="0x8576" name="GL_CONSTANT_NV"/> >+ <enum value="0x8577" name="GL_PRIMARY_COLOR"/> >+ <enum value="0x8577" name="GL_PRIMARY_COLOR_ARB"/> >+ <enum value="0x8577" name="GL_PRIMARY_COLOR_EXT"/> >+ <enum value="0x8578" name="GL_PREVIOUS"/> >+ <enum value="0x8578" name="GL_PREVIOUS_ARB"/> >+ <enum value="0x8578" name="GL_PREVIOUS_EXT"/> >+ <unused start="0x8579" end="0x857F" comment="Additional combiner enums only"/> >+ <enum value="0x8580" name="GL_SOURCE0_RGB"/> >+ <enum value="0x8580" name="GL_SOURCE0_RGB_ARB"/> >+ <enum value="0x8580" name="GL_SOURCE0_RGB_EXT"/> >+ <enum value="0x8580" name="GL_SRC0_RGB" alias="GL_SOURCE0_RGB"/> >+ <enum value="0x8581" name="GL_SOURCE1_RGB"/> >+ <enum value="0x8581" name="GL_SOURCE1_RGB_ARB"/> >+ <enum value="0x8581" name="GL_SOURCE1_RGB_EXT"/> >+ <enum value="0x8581" name="GL_SRC1_RGB" alias="GL_SOURCE1_RGB"/> >+ <enum value="0x8582" name="GL_SOURCE2_RGB"/> >+ <enum value="0x8582" name="GL_SOURCE2_RGB_ARB"/> >+ <enum value="0x8582" name="GL_SOURCE2_RGB_EXT"/> >+ <enum value="0x8582" name="GL_SRC2_RGB" alias="GL_SOURCE2_RGB"/> >+ <enum value="0x8583" name="GL_SOURCE3_RGB_NV"/> >+ <unused start="0x8584" end="0x8587" comment="Additional combiner enums only"/> >+ <enum value="0x8588" name="GL_SOURCE0_ALPHA"/> >+ <enum value="0x8588" name="GL_SOURCE0_ALPHA_ARB"/> >+ <enum value="0x8588" name="GL_SOURCE0_ALPHA_EXT"/> >+ <enum value="0x8588" name="GL_SRC0_ALPHA" alias="GL_SOURCE0_ALPHA"/> >+ <enum value="0x8589" name="GL_SOURCE1_ALPHA"/> >+ <enum value="0x8589" name="GL_SOURCE1_ALPHA_ARB"/> >+ <enum value="0x8589" name="GL_SOURCE1_ALPHA_EXT"/> >+ <enum value="0x8589" name="GL_SRC1_ALPHA" alias="GL_SOURCE1_ALPHA"/> >+ <enum value="0x8589" name="GL_SRC1_ALPHA_EXT"/> >+ <enum value="0x858A" name="GL_SOURCE2_ALPHA"/> >+ <enum value="0x858A" name="GL_SOURCE2_ALPHA_ARB"/> >+ <enum value="0x858A" name="GL_SOURCE2_ALPHA_EXT"/> >+ <enum value="0x858A" name="GL_SRC2_ALPHA" alias="GL_SOURCE2_ALPHA"/> >+ <enum value="0x858B" name="GL_SOURCE3_ALPHA_NV"/> >+ <unused start="0x858C" end="0x858F" comment="Additional combiner enums only"/> >+ <enum value="0x8590" name="GL_OPERAND0_RGB"/> >+ <enum value="0x8590" name="GL_OPERAND0_RGB_ARB"/> >+ <enum value="0x8590" name="GL_OPERAND0_RGB_EXT"/> >+ <enum value="0x8591" name="GL_OPERAND1_RGB"/> >+ <enum value="0x8591" name="GL_OPERAND1_RGB_ARB"/> >+ <enum value="0x8591" name="GL_OPERAND1_RGB_EXT"/> >+ <enum value="0x8592" name="GL_OPERAND2_RGB"/> >+ <enum value="0x8592" name="GL_OPERAND2_RGB_ARB"/> >+ <enum value="0x8592" name="GL_OPERAND2_RGB_EXT"/> >+ <enum value="0x8593" name="GL_OPERAND3_RGB_NV"/> >+ <unused start="0x8594" end="0x8597" comment="Additional combiner enums only"/> >+ <enum value="0x8598" name="GL_OPERAND0_ALPHA"/> >+ <enum value="0x8598" name="GL_OPERAND0_ALPHA_ARB"/> >+ <enum value="0x8598" name="GL_OPERAND0_ALPHA_EXT"/> >+ <enum value="0x8599" name="GL_OPERAND1_ALPHA"/> >+ <enum value="0x8599" name="GL_OPERAND1_ALPHA_ARB"/> >+ <enum value="0x8599" name="GL_OPERAND1_ALPHA_EXT"/> >+ <enum value="0x859A" name="GL_OPERAND2_ALPHA"/> >+ <enum value="0x859A" name="GL_OPERAND2_ALPHA_ARB"/> >+ <enum value="0x859A" name="GL_OPERAND2_ALPHA_EXT"/> >+ <enum value="0x859B" name="GL_OPERAND3_ALPHA_NV"/> >+ <unused start="0x859C" end="0x859F" comment="Additional combiner enums only"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x85A0" end="0x85AF" vendor="SGI"> >+ <enum value="0x85A0" name="GL_PACK_SUBSAMPLE_RATE_SGIX"/> >+ <enum value="0x85A1" name="GL_UNPACK_SUBSAMPLE_RATE_SGIX"/> >+ <enum value="0x85A2" name="GL_PIXEL_SUBSAMPLE_4444_SGIX"/> >+ <enum value="0x85A3" name="GL_PIXEL_SUBSAMPLE_2424_SGIX"/> >+ <enum value="0x85A4" name="GL_PIXEL_SUBSAMPLE_4242_SGIX"/> >+ <unused start="0x85A5" end="0x85AD" comment="Incomplete extension SGIS_color_range"/> >+ <!-- <enum value="0x85A5" name="GL_EXTENDED_RANGE_SGIS"/> --> >+ <!-- <enum value="0x85A6" name="GL_MIN_RED_SGIS"/> --> >+ <!-- <enum value="0x85A7" name="GL_MAX_RED_SGIS"/> --> >+ <!-- <enum value="0x85A8" name="GL_MIN_GREEN_SGIS"/> --> >+ <!-- <enum value="0x85A9" name="GL_MAX_GREEN_SGIS"/> --> >+ <!-- <enum value="0x85AA" name="GL_MIN_BLUE_SGIS"/> --> >+ <!-- <enum value="0x85AB" name="GL_MAX_BLUE_SGIS"/> --> >+ <!-- <enum value="0x85AC" name="GL_MIN_ALPHA_SGIS"/> --> >+ <!-- <enum value="0x85AD" name="GL_MAX_ALPHA_SGIS"/> --> >+ <enum value="0x85AE" name="GL_PERTURB_EXT"/> >+ <enum value="0x85AF" name="GL_TEXTURE_NORMAL_EXT"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x85B0" end="0x85BF" vendor="APPLE"> >+ <enum value="0x85B0" name="GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE"/> >+ <enum value="0x85B1" name="GL_TRANSFORM_HINT_APPLE"/> >+ <enum value="0x85B2" name="GL_UNPACK_CLIENT_STORAGE_APPLE"/> >+ <enum value="0x85B3" name="GL_BUFFER_OBJECT_APPLE"/> >+ <enum value="0x85B4" name="GL_STORAGE_CLIENT_APPLE"/> >+ <enum value="0x85B5" name="GL_VERTEX_ARRAY_BINDING"/> >+ <enum value="0x85B5" name="GL_VERTEX_ARRAY_BINDING_APPLE"/> >+ <enum value="0x85B5" name="GL_VERTEX_ARRAY_BINDING_OES"/> >+ <unused start="0x85B6" vendor="APPLE" comment="Unknown extension (Khronos bug 632)"/> >+ <!-- <enum value="0x85B6" name="GL_TEXTURE_MINIMIZE_STORAGE_APPLE"/> --> >+ <enum value="0x85B7" name="GL_TEXTURE_RANGE_LENGTH_APPLE"/> >+ <enum value="0x85B8" name="GL_TEXTURE_RANGE_POINTER_APPLE"/> >+ <enum value="0x85B9" name="GL_YCBCR_422_APPLE"/> >+ <enum value="0x85BA" name="GL_UNSIGNED_SHORT_8_8_APPLE"/> >+ <enum value="0x85BA" name="GL_UNSIGNED_SHORT_8_8_MESA"/> >+ <enum value="0x85BB" name="GL_UNSIGNED_SHORT_8_8_REV_APPLE"/> >+ <enum value="0x85BB" name="GL_UNSIGNED_SHORT_8_8_REV_MESA"/> >+ <enum value="0x85BC" name="GL_TEXTURE_STORAGE_HINT_APPLE"/> >+ <enum value="0x85BD" name="GL_STORAGE_PRIVATE_APPLE"/> >+ <enum value="0x85BE" name="GL_STORAGE_CACHED_APPLE"/> >+ <enum value="0x85BF" name="GL_STORAGE_SHARED_APPLE"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x85C0" end="0x85CF" vendor="SUN"> >+ <enum value="0x85C0" name="GL_REPLACEMENT_CODE_ARRAY_SUN"/> >+ <enum value="0x85C1" name="GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN"/> >+ <enum value="0x85C2" name="GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN"/> >+ <enum value="0x85C3" name="GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN"/> >+ <enum value="0x85C4" name="GL_R1UI_V3F_SUN"/> >+ <enum value="0x85C5" name="GL_R1UI_C4UB_V3F_SUN"/> >+ <enum value="0x85C6" name="GL_R1UI_C3F_V3F_SUN"/> >+ <enum value="0x85C7" name="GL_R1UI_N3F_V3F_SUN"/> >+ <enum value="0x85C8" name="GL_R1UI_C4F_N3F_V3F_SUN"/> >+ <enum value="0x85C9" name="GL_R1UI_T2F_V3F_SUN"/> >+ <enum value="0x85CA" name="GL_R1UI_T2F_N3F_V3F_SUN"/> >+ <enum value="0x85CB" name="GL_R1UI_T2F_C4F_N3F_V3F_SUN"/> >+ <enum value="0x85CC" name="GL_SLICE_ACCUM_SUN"/> >+ <unused start="0x85CD" end="0x85CF" vendor="SUN"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x85D0" end="0x85DF" vendor="ZiiLabs" comment="3Dlabs private extension for Autodesk"> >+ <unused start="0x85D0" end="0x85D1" comment="Unknown 3Dlabs private extension for Autodesk (but we know the enum values)"/> >+ <!-- <enum value="0x85D0" name="GL_FACET_NORMAL_AUTODESK"/> --> >+ <!-- <enum value="0x85D1" name="GL_FACET_NORMAL_ARRAY_AUTODESK"/> --> >+ <unused start="0x85D2" end="0x85DF" vendor="ZiiLabs"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x85E0" end="0x85FF" vendor="SGI"> >+ <unused start="0x85E0" end="0x85FB" comment="Incomplete extension SGIX_texture_range"/> >+ <!-- <enum value="0x85E0" name="GL_RGB_SIGNED_SGIX"/> --> >+ <!-- <enum value="0x85E1" name="GL_RGBA_SIGNED_SGIX"/> --> >+ <!-- <enum value="0x85E2" name="GL_ALPHA_SIGNED_SGIX"/> --> >+ <!-- <enum value="0x85E3" name="GL_LUMINANCE_SIGNED_SGIX"/> --> >+ <!-- <enum value="0x85E4" name="GL_INTENSITY_SIGNED_SGIX"/> --> >+ <!-- <enum value="0x85E5" name="GL_LUMINANCE_ALPHA_SIGNED_SGIX"/> --> >+ <!-- <enum value="0x85E6" name="GL_RGB16_SIGNED_SGIX"/> --> >+ <!-- <enum value="0x85E7" name="GL_RGBA16_SIGNED_SGIX"/> --> >+ <!-- <enum value="0x85E8" name="GL_ALPHA16_SIGNED_SGIX"/> --> >+ <!-- <enum value="0x85E9" name="GL_LUMINANCE16_SIGNED_SGIX"/> --> >+ <!-- <enum value="0x85EA" name="GL_INTENSITY16_SIGNED_SGIX"/> --> >+ <!-- <enum value="0x85EB" name="GL_LUMINANCE16_ALPHA16_SIGNED_SGIX"/> --> >+ <!-- <enum value="0x85EC" name="GL_RGB_EXTENDED_RANGE_SGIX"/> --> >+ <!-- <enum value="0x85ED" name="GL_RGBA_EXTENDED_RANGE_SGIX"/> --> >+ <!-- <enum value="0x85EE" name="GL_ALPHA_EXTENDED_RANGE_SGIX"/> --> >+ <!-- <enum value="0x85EF" name="GL_LUMINANCE_EXTENDED_RANGE_SGIX"/> --> >+ <!-- <enum value="0x85F0" name="GL_INTENSITY_EXTENDED_RANGE_SGIX"/> --> >+ <!-- <enum value="0x85F1" name="GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX"/> --> >+ <!-- <enum value="0x85F2" name="GL_RGB16_EXTENDED_RANGE_SGIX"/> --> >+ <!-- <enum value="0x85F3" name="GL_RGBA16_EXTENDED_RANGE_SGIX"/> --> >+ <!-- <enum value="0x85F4" name="GL_ALPHA16_EXTENDED_RANGE_SGIX"/> --> >+ <!-- <enum value="0x85F5" name="GL_LUMINANCE16_EXTENDED_RANGE_SGIX"/> --> >+ <!-- <enum value="0x85F6" name="GL_INTENSITY16_EXTENDED_RANGE_SGIX"/> --> >+ <!-- <enum value="0x85F7" name="GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX"/> --> >+ <!-- <enum value="0x85F8" name="GL_MIN_LUMINANCE_SGIS"/> --> >+ <!-- <enum value="0x85F9" name="GL_MAX_LUMINANCE_SGIS"/> --> >+ <!-- <enum value="0x85FA" name="GL_MIN_INTENSITY_SGIS"/> --> >+ <!-- <enum value="0x85FB" name="GL_MAX_INTENSITY_SGIS"/> --> >+ <unused start="0x85FC" end="0x85FF" vendor="SGI"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8600" end="0x861F" vendor="SUN"> >+ <unused start="0x8600" end="0x8613" vendor="SUN"/> >+ <enum value="0x8614" name="GL_QUAD_MESH_SUN"/> >+ <enum value="0x8615" name="GL_TRIANGLE_MESH_SUN"/> >+ <unused start="0x8614" end="0x861F" vendor="SUN"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8620" end="0x867F" vendor="NV"> >+ <enum value="0x8620" name="GL_VERTEX_PROGRAM_ARB"/> >+ <enum value="0x8620" name="GL_VERTEX_PROGRAM_NV"/> >+ <enum value="0x8621" name="GL_VERTEX_STATE_PROGRAM_NV"/> >+ <enum value="0x8622" name="GL_VERTEX_ATTRIB_ARRAY_ENABLED"/> >+ <enum value="0x8622" name="GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB"/> >+ <enum value="0x8623" name="GL_ATTRIB_ARRAY_SIZE_NV"/> >+ <enum value="0x8623" name="GL_VERTEX_ATTRIB_ARRAY_SIZE"/> >+ <enum value="0x8623" name="GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB"/> >+ <enum value="0x8624" name="GL_ATTRIB_ARRAY_STRIDE_NV"/> >+ <enum value="0x8624" name="GL_VERTEX_ATTRIB_ARRAY_STRIDE"/> >+ <enum value="0x8624" name="GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB"/> >+ <enum value="0x8625" name="GL_ATTRIB_ARRAY_TYPE_NV"/> >+ <enum value="0x8625" name="GL_VERTEX_ATTRIB_ARRAY_TYPE"/> >+ <enum value="0x8625" name="GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB"/> >+ <enum value="0x8626" name="GL_CURRENT_ATTRIB_NV"/> >+ <enum value="0x8626" name="GL_CURRENT_VERTEX_ATTRIB"/> >+ <enum value="0x8626" name="GL_CURRENT_VERTEX_ATTRIB_ARB"/> >+ <enum value="0x8627" name="GL_PROGRAM_LENGTH_ARB"/> >+ <enum value="0x8627" name="GL_PROGRAM_LENGTH_NV"/> >+ <enum value="0x8628" name="GL_PROGRAM_STRING_ARB"/> >+ <enum value="0x8628" name="GL_PROGRAM_STRING_NV"/> >+ <enum value="0x8629" name="GL_MODELVIEW_PROJECTION_NV"/> >+ <enum value="0x862A" name="GL_IDENTITY_NV"/> >+ <enum value="0x862B" name="GL_INVERSE_NV"/> >+ <enum value="0x862C" name="GL_TRANSPOSE_NV"/> >+ <enum value="0x862D" name="GL_INVERSE_TRANSPOSE_NV"/> >+ <enum value="0x862E" name="GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB"/> >+ <enum value="0x862E" name="GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV"/> >+ <enum value="0x862F" name="GL_MAX_PROGRAM_MATRICES_ARB"/> >+ <enum value="0x862F" name="GL_MAX_TRACK_MATRICES_NV"/> >+ <enum value="0x8630" name="GL_MATRIX0_NV"/> >+ <enum value="0x8631" name="GL_MATRIX1_NV"/> >+ <enum value="0x8632" name="GL_MATRIX2_NV"/> >+ <enum value="0x8633" name="GL_MATRIX3_NV"/> >+ <enum value="0x8634" name="GL_MATRIX4_NV"/> >+ <enum value="0x8635" name="GL_MATRIX5_NV"/> >+ <enum value="0x8636" name="GL_MATRIX6_NV"/> >+ <enum value="0x8637" name="GL_MATRIX7_NV"/> >+ <unused start="0x8638" end="0x863F" comment="Reserved for MATRIX{8-15}_NV"/> >+ <!-- <enum value="0x8638" name="GL_MATRIX8_NV"/> --> >+ <!-- <enum value="0x8639" name="GL_MATRIX9_NV"/> --> >+ <!-- <enum value="0x863A" name="GL_MATRIX10_NV"/> --> >+ <!-- <enum value="0x863B" name="GL_MATRIX11_NV"/> --> >+ <!-- <enum value="0x863C" name="GL_MATRIX12_NV"/> --> >+ <!-- <enum value="0x863D" name="GL_MATRIX13_NV"/> --> >+ <!-- <enum value="0x863E" name="GL_MATRIX14_NV"/> --> >+ <!-- <enum value="0x863F" name="GL_MATRIX15_NV"/> --> >+ <enum value="0x8640" name="GL_CURRENT_MATRIX_STACK_DEPTH_ARB"/> >+ <enum value="0x8640" name="GL_CURRENT_MATRIX_STACK_DEPTH_NV"/> >+ <enum value="0x8641" name="GL_CURRENT_MATRIX_ARB"/> >+ <enum value="0x8641" name="GL_CURRENT_MATRIX_NV"/> >+ <enum value="0x8642" name="GL_VERTEX_PROGRAM_POINT_SIZE"/> >+ <enum value="0x8642" name="GL_VERTEX_PROGRAM_POINT_SIZE_ARB"/> >+ <enum value="0x8642" name="GL_VERTEX_PROGRAM_POINT_SIZE_NV"/> >+ <enum value="0x8642" name="GL_PROGRAM_POINT_SIZE" alias="GL_VERTEX_PROGRAM_POINT_SIZE"/> >+ <enum value="0x8642" name="GL_PROGRAM_POINT_SIZE_ARB"/> >+ <enum value="0x8642" name="GL_PROGRAM_POINT_SIZE_EXT"/> >+ <enum value="0x8643" name="GL_VERTEX_PROGRAM_TWO_SIDE"/> >+ <enum value="0x8643" name="GL_VERTEX_PROGRAM_TWO_SIDE_ARB"/> >+ <enum value="0x8643" name="GL_VERTEX_PROGRAM_TWO_SIDE_NV"/> >+ <enum value="0x8644" name="GL_PROGRAM_PARAMETER_NV"/> >+ <enum value="0x8645" name="GL_ATTRIB_ARRAY_POINTER_NV"/> >+ <enum value="0x8645" name="GL_VERTEX_ATTRIB_ARRAY_POINTER"/> >+ <enum value="0x8645" name="GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB"/> >+ <enum value="0x8646" name="GL_PROGRAM_TARGET_NV"/> >+ <enum value="0x8647" name="GL_PROGRAM_RESIDENT_NV"/> >+ <enum value="0x8648" name="GL_TRACK_MATRIX_NV"/> >+ <enum value="0x8649" name="GL_TRACK_MATRIX_TRANSFORM_NV"/> >+ <enum value="0x864A" name="GL_VERTEX_PROGRAM_BINDING_NV"/> >+ <enum value="0x864B" name="GL_PROGRAM_ERROR_POSITION_ARB"/> >+ <enum value="0x864B" name="GL_PROGRAM_ERROR_POSITION_NV"/> >+ <enum value="0x864C" name="GL_OFFSET_TEXTURE_RECTANGLE_NV"/> >+ <enum value="0x864D" name="GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV"/> >+ <enum value="0x864E" name="GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV"/> >+ <enum value="0x864F" name="GL_DEPTH_CLAMP"/> >+ <enum value="0x864F" name="GL_DEPTH_CLAMP_NV"/> >+ <enum value="0x8650" name="GL_VERTEX_ATTRIB_ARRAY0_NV"/> >+ <enum value="0x8651" name="GL_VERTEX_ATTRIB_ARRAY1_NV"/> >+ <enum value="0x8652" name="GL_VERTEX_ATTRIB_ARRAY2_NV"/> >+ <enum value="0x8653" name="GL_VERTEX_ATTRIB_ARRAY3_NV"/> >+ <enum value="0x8654" name="GL_VERTEX_ATTRIB_ARRAY4_NV"/> >+ <enum value="0x8655" name="GL_VERTEX_ATTRIB_ARRAY5_NV"/> >+ <enum value="0x8656" name="GL_VERTEX_ATTRIB_ARRAY6_NV"/> >+ <enum value="0x8657" name="GL_VERTEX_ATTRIB_ARRAY7_NV"/> >+ <enum value="0x8658" name="GL_VERTEX_ATTRIB_ARRAY8_NV"/> >+ <enum value="0x8659" name="GL_VERTEX_ATTRIB_ARRAY9_NV"/> >+ <enum value="0x865A" name="GL_VERTEX_ATTRIB_ARRAY10_NV"/> >+ <enum value="0x865B" name="GL_VERTEX_ATTRIB_ARRAY11_NV"/> >+ <enum value="0x865C" name="GL_VERTEX_ATTRIB_ARRAY12_NV"/> >+ <enum value="0x865D" name="GL_VERTEX_ATTRIB_ARRAY13_NV"/> >+ <enum value="0x865E" name="GL_VERTEX_ATTRIB_ARRAY14_NV"/> >+ <enum value="0x865F" name="GL_VERTEX_ATTRIB_ARRAY15_NV"/> >+ <enum value="0x8660" name="GL_MAP1_VERTEX_ATTRIB0_4_NV"/> >+ <enum value="0x8661" name="GL_MAP1_VERTEX_ATTRIB1_4_NV"/> >+ <enum value="0x8662" name="GL_MAP1_VERTEX_ATTRIB2_4_NV"/> >+ <enum value="0x8663" name="GL_MAP1_VERTEX_ATTRIB3_4_NV"/> >+ <enum value="0x8664" name="GL_MAP1_VERTEX_ATTRIB4_4_NV"/> >+ <enum value="0x8665" name="GL_MAP1_VERTEX_ATTRIB5_4_NV"/> >+ <enum value="0x8666" name="GL_MAP1_VERTEX_ATTRIB6_4_NV"/> >+ <enum value="0x8667" name="GL_MAP1_VERTEX_ATTRIB7_4_NV"/> >+ <enum value="0x8668" name="GL_MAP1_VERTEX_ATTRIB8_4_NV"/> >+ <enum value="0x8669" name="GL_MAP1_VERTEX_ATTRIB9_4_NV"/> >+ <enum value="0x866A" name="GL_MAP1_VERTEX_ATTRIB10_4_NV"/> >+ <enum value="0x866B" name="GL_MAP1_VERTEX_ATTRIB11_4_NV"/> >+ <enum value="0x866C" name="GL_MAP1_VERTEX_ATTRIB12_4_NV"/> >+ <enum value="0x866D" name="GL_MAP1_VERTEX_ATTRIB13_4_NV"/> >+ <enum value="0x866E" name="GL_MAP1_VERTEX_ATTRIB14_4_NV"/> >+ <enum value="0x866F" name="GL_MAP1_VERTEX_ATTRIB15_4_NV"/> >+ <enum value="0x8670" name="GL_MAP2_VERTEX_ATTRIB0_4_NV"/> >+ <enum value="0x8671" name="GL_MAP2_VERTEX_ATTRIB1_4_NV"/> >+ <enum value="0x8672" name="GL_MAP2_VERTEX_ATTRIB2_4_NV"/> >+ <enum value="0x8673" name="GL_MAP2_VERTEX_ATTRIB3_4_NV"/> >+ <enum value="0x8674" name="GL_MAP2_VERTEX_ATTRIB4_4_NV"/> >+ <enum value="0x8675" name="GL_MAP2_VERTEX_ATTRIB5_4_NV"/> >+ <enum value="0x8676" name="GL_MAP2_VERTEX_ATTRIB6_4_NV"/> >+ <enum value="0x8677" name="GL_MAP2_VERTEX_ATTRIB7_4_NV"/> >+ <enum value="0x8677" name="GL_PROGRAM_BINDING_ARB" comment="NOT an alias. Accidental reuse of GL_MAP2_VERTEX_ATTRIB7_4_NV"/> >+ <enum value="0x8678" name="GL_MAP2_VERTEX_ATTRIB8_4_NV"/> >+ <enum value="0x8679" name="GL_MAP2_VERTEX_ATTRIB9_4_NV"/> >+ <enum value="0x867A" name="GL_MAP2_VERTEX_ATTRIB10_4_NV"/> >+ <enum value="0x867B" name="GL_MAP2_VERTEX_ATTRIB11_4_NV"/> >+ <enum value="0x867C" name="GL_MAP2_VERTEX_ATTRIB12_4_NV"/> >+ <enum value="0x867D" name="GL_MAP2_VERTEX_ATTRIB13_4_NV"/> >+ <enum value="0x867E" name="GL_MAP2_VERTEX_ATTRIB14_4_NV"/> >+ <enum value="0x867F" name="GL_MAP2_VERTEX_ATTRIB15_4_NV"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8680" end="0x869F" vendor="Pixelfusion"> >+ <unused start="0x8680" end="0x869F" vendor="Pixelfusion"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x86A0" end="0x86AF" vendor="ARB"> >+ <enum value="0x86A0" name="GL_TEXTURE_COMPRESSED_IMAGE_SIZE"/> >+ <enum value="0x86A0" name="GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB"/> >+ <enum value="0x86A1" name="GL_TEXTURE_COMPRESSED"/> >+ <enum value="0x86A1" name="GL_TEXTURE_COMPRESSED_ARB"/> >+ <enum value="0x86A2" name="GL_NUM_COMPRESSED_TEXTURE_FORMATS"/> >+ <enum value="0x86A2" name="GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB"/> >+ <enum value="0x86A3" name="GL_COMPRESSED_TEXTURE_FORMATS"/> >+ <enum value="0x86A3" name="GL_COMPRESSED_TEXTURE_FORMATS_ARB"/> >+ <enum value="0x86A4" name="GL_MAX_VERTEX_UNITS_ARB"/> >+ <enum value="0x86A4" name="GL_MAX_VERTEX_UNITS_OES"/> >+ <enum value="0x86A5" name="GL_ACTIVE_VERTEX_UNITS_ARB"/> >+ <enum value="0x86A6" name="GL_WEIGHT_SUM_UNITY_ARB"/> >+ <enum value="0x86A7" name="GL_VERTEX_BLEND_ARB"/> >+ <enum value="0x86A8" name="GL_CURRENT_WEIGHT_ARB"/> >+ <enum value="0x86A9" name="GL_WEIGHT_ARRAY_TYPE_ARB"/> >+ <enum value="0x86A9" name="GL_WEIGHT_ARRAY_TYPE_OES"/> >+ <enum value="0x86AA" name="GL_WEIGHT_ARRAY_STRIDE_ARB"/> >+ <enum value="0x86AA" name="GL_WEIGHT_ARRAY_STRIDE_OES"/> >+ <enum value="0x86AB" name="GL_WEIGHT_ARRAY_SIZE_ARB"/> >+ <enum value="0x86AB" name="GL_WEIGHT_ARRAY_SIZE_OES"/> >+ <enum value="0x86AC" name="GL_WEIGHT_ARRAY_POINTER_ARB"/> >+ <enum value="0x86AC" name="GL_WEIGHT_ARRAY_POINTER_OES"/> >+ <enum value="0x86AD" name="GL_WEIGHT_ARRAY_ARB"/> >+ <enum value="0x86AD" name="GL_WEIGHT_ARRAY_OES"/> >+ <enum value="0x86AE" name="GL_DOT3_RGB"/> >+ <enum value="0x86AE" name="GL_DOT3_RGB_ARB"/> >+ <enum value="0x86AF" name="GL_DOT3_RGBA"/> >+ <enum value="0x86AF" name="GL_DOT3_RGBA_ARB"/> >+ <enum value="0x86AF" name="GL_DOT3_RGBA_IMG"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x86B0" end="0x86BF" vendor="3DFX"> >+ <enum value="0x86B0" name="GL_COMPRESSED_RGB_FXT1_3DFX"/> >+ <enum value="0x86B1" name="GL_COMPRESSED_RGBA_FXT1_3DFX"/> >+ <enum value="0x86B2" name="GL_MULTISAMPLE_3DFX"/> >+ <enum value="0x86B3" name="GL_SAMPLE_BUFFERS_3DFX"/> >+ <enum value="0x86B4" name="GL_SAMPLES_3DFX"/> >+ <unused start="0x86B5" end="0x86BF" vendor="3DFX"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x86C0" end="0x871F" vendor="NV"> >+ <enum value="0x86C0" name="GL_EVAL_2D_NV"/> >+ <enum value="0x86C1" name="GL_EVAL_TRIANGULAR_2D_NV"/> >+ <enum value="0x86C2" name="GL_MAP_TESSELLATION_NV"/> >+ <enum value="0x86C3" name="GL_MAP_ATTRIB_U_ORDER_NV"/> >+ <enum value="0x86C4" name="GL_MAP_ATTRIB_V_ORDER_NV"/> >+ <enum value="0x86C5" name="GL_EVAL_FRACTIONAL_TESSELLATION_NV"/> >+ <enum value="0x86C6" name="GL_EVAL_VERTEX_ATTRIB0_NV"/> >+ <enum value="0x86C7" name="GL_EVAL_VERTEX_ATTRIB1_NV"/> >+ <enum value="0x86C8" name="GL_EVAL_VERTEX_ATTRIB2_NV"/> >+ <enum value="0x86C9" name="GL_EVAL_VERTEX_ATTRIB3_NV"/> >+ <enum value="0x86CA" name="GL_EVAL_VERTEX_ATTRIB4_NV"/> >+ <enum value="0x86CB" name="GL_EVAL_VERTEX_ATTRIB5_NV"/> >+ <enum value="0x86CC" name="GL_EVAL_VERTEX_ATTRIB6_NV"/> >+ <enum value="0x86CD" name="GL_EVAL_VERTEX_ATTRIB7_NV"/> >+ <enum value="0x86CE" name="GL_EVAL_VERTEX_ATTRIB8_NV"/> >+ <enum value="0x86CF" name="GL_EVAL_VERTEX_ATTRIB9_NV"/> >+ <enum value="0x86D0" name="GL_EVAL_VERTEX_ATTRIB10_NV"/> >+ <enum value="0x86D1" name="GL_EVAL_VERTEX_ATTRIB11_NV"/> >+ <enum value="0x86D2" name="GL_EVAL_VERTEX_ATTRIB12_NV"/> >+ <enum value="0x86D3" name="GL_EVAL_VERTEX_ATTRIB13_NV"/> >+ <enum value="0x86D4" name="GL_EVAL_VERTEX_ATTRIB14_NV"/> >+ <enum value="0x86D5" name="GL_EVAL_VERTEX_ATTRIB15_NV"/> >+ <enum value="0x86D6" name="GL_MAX_MAP_TESSELLATION_NV"/> >+ <enum value="0x86D7" name="GL_MAX_RATIONAL_EVAL_ORDER_NV"/> >+ <enum value="0x86D8" name="GL_MAX_PROGRAM_PATCH_ATTRIBS_NV"/> >+ <enum value="0x86D9" name="GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV"/> >+ <enum value="0x86DA" name="GL_UNSIGNED_INT_S8_S8_8_8_NV"/> >+ <enum value="0x86DB" name="GL_UNSIGNED_INT_8_8_S8_S8_REV_NV"/> >+ <enum value="0x86DC" name="GL_DSDT_MAG_INTENSITY_NV"/> >+ <enum value="0x86DD" name="GL_SHADER_CONSISTENT_NV"/> >+ <enum value="0x86DE" name="GL_TEXTURE_SHADER_NV"/> >+ <enum value="0x86DF" name="GL_SHADER_OPERATION_NV"/> >+ <enum value="0x86E0" name="GL_CULL_MODES_NV"/> >+ <enum value="0x86E1" name="GL_OFFSET_TEXTURE_MATRIX_NV"/> >+ <enum value="0x86E1" name="GL_OFFSET_TEXTURE_2D_MATRIX_NV" alias="GL_OFFSET_TEXTURE_MATRIX_NV"/> >+ <enum value="0x86E2" name="GL_OFFSET_TEXTURE_SCALE_NV"/> >+ <enum value="0x86E2" name="GL_OFFSET_TEXTURE_2D_SCALE_NV" alias="GL_OFFSET_TEXTURE_SCALE_NV"/> >+ <enum value="0x86E3" name="GL_OFFSET_TEXTURE_BIAS_NV"/> >+ <enum value="0x86E3" name="GL_OFFSET_TEXTURE_2D_BIAS_NV" alias="GL_OFFSET_TEXTURE_BIAS_NV"/> >+ <enum value="0x86E4" name="GL_PREVIOUS_TEXTURE_INPUT_NV"/> >+ <enum value="0x86E5" name="GL_CONST_EYE_NV"/> >+ <enum value="0x86E6" name="GL_PASS_THROUGH_NV"/> >+ <enum value="0x86E7" name="GL_CULL_FRAGMENT_NV"/> >+ <enum value="0x86E8" name="GL_OFFSET_TEXTURE_2D_NV"/> >+ <enum value="0x86E9" name="GL_DEPENDENT_AR_TEXTURE_2D_NV"/> >+ <enum value="0x86EA" name="GL_DEPENDENT_GB_TEXTURE_2D_NV"/> >+ <enum value="0x86EB" name="GL_SURFACE_STATE_NV"/> >+ <enum value="0x86EC" name="GL_DOT_PRODUCT_NV"/> >+ <enum value="0x86ED" name="GL_DOT_PRODUCT_DEPTH_REPLACE_NV"/> >+ <enum value="0x86EE" name="GL_DOT_PRODUCT_TEXTURE_2D_NV"/> >+ <enum value="0x86EF" name="GL_DOT_PRODUCT_TEXTURE_3D_NV"/> >+ <enum value="0x86F0" name="GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV"/> >+ <enum value="0x86F1" name="GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV"/> >+ <enum value="0x86F2" name="GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV"/> >+ <enum value="0x86F3" name="GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV"/> >+ <enum value="0x86F4" name="GL_HILO_NV"/> >+ <enum value="0x86F5" name="GL_DSDT_NV"/> >+ <enum value="0x86F6" name="GL_DSDT_MAG_NV"/> >+ <enum value="0x86F7" name="GL_DSDT_MAG_VIB_NV"/> >+ <enum value="0x86F8" name="GL_HILO16_NV"/> >+ <enum value="0x86F9" name="GL_SIGNED_HILO_NV"/> >+ <enum value="0x86FA" name="GL_SIGNED_HILO16_NV"/> >+ <enum value="0x86FB" name="GL_SIGNED_RGBA_NV"/> >+ <enum value="0x86FC" name="GL_SIGNED_RGBA8_NV"/> >+ <enum value="0x86FD" name="GL_SURFACE_REGISTERED_NV"/> >+ <enum value="0x86FE" name="GL_SIGNED_RGB_NV"/> >+ <enum value="0x86FF" name="GL_SIGNED_RGB8_NV"/> >+ <enum value="0x8700" name="GL_SURFACE_MAPPED_NV"/> >+ <enum value="0x8701" name="GL_SIGNED_LUMINANCE_NV"/> >+ <enum value="0x8702" name="GL_SIGNED_LUMINANCE8_NV"/> >+ <enum value="0x8703" name="GL_SIGNED_LUMINANCE_ALPHA_NV"/> >+ <enum value="0x8704" name="GL_SIGNED_LUMINANCE8_ALPHA8_NV"/> >+ <enum value="0x8705" name="GL_SIGNED_ALPHA_NV"/> >+ <enum value="0x8706" name="GL_SIGNED_ALPHA8_NV"/> >+ <enum value="0x8707" name="GL_SIGNED_INTENSITY_NV"/> >+ <enum value="0x8708" name="GL_SIGNED_INTENSITY8_NV"/> >+ <enum value="0x8709" name="GL_DSDT8_NV"/> >+ <enum value="0x870A" name="GL_DSDT8_MAG8_NV"/> >+ <enum value="0x870B" name="GL_DSDT8_MAG8_INTENSITY8_NV"/> >+ <enum value="0x870C" name="GL_SIGNED_RGB_UNSIGNED_ALPHA_NV"/> >+ <enum value="0x870D" name="GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV"/> >+ <enum value="0x870E" name="GL_HI_SCALE_NV"/> >+ <enum value="0x870F" name="GL_LO_SCALE_NV"/> >+ <enum value="0x8710" name="GL_DS_SCALE_NV"/> >+ <enum value="0x8711" name="GL_DT_SCALE_NV"/> >+ <enum value="0x8712" name="GL_MAGNITUDE_SCALE_NV"/> >+ <enum value="0x8713" name="GL_VIBRANCE_SCALE_NV"/> >+ <enum value="0x8714" name="GL_HI_BIAS_NV"/> >+ <enum value="0x8715" name="GL_LO_BIAS_NV"/> >+ <enum value="0x8716" name="GL_DS_BIAS_NV"/> >+ <enum value="0x8717" name="GL_DT_BIAS_NV"/> >+ <enum value="0x8718" name="GL_MAGNITUDE_BIAS_NV"/> >+ <enum value="0x8719" name="GL_VIBRANCE_BIAS_NV"/> >+ <enum value="0x871A" name="GL_TEXTURE_BORDER_VALUES_NV"/> >+ <enum value="0x871B" name="GL_TEXTURE_HI_SIZE_NV"/> >+ <enum value="0x871C" name="GL_TEXTURE_LO_SIZE_NV"/> >+ <enum value="0x871D" name="GL_TEXTURE_DS_SIZE_NV"/> >+ <enum value="0x871E" name="GL_TEXTURE_DT_SIZE_NV"/> >+ <enum value="0x871F" name="GL_TEXTURE_MAG_SIZE_NV"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8720" end="0x873F" vendor="ARB"> >+ <unused start="0x8720" end="0x8721" comment="MODELVIEW0/1 already exist"/> >+ <enum value="0x8722" name="GL_MODELVIEW2_ARB"/> >+ <enum value="0x8723" name="GL_MODELVIEW3_ARB"/> >+ <enum value="0x8724" name="GL_MODELVIEW4_ARB"/> >+ <enum value="0x8725" name="GL_MODELVIEW5_ARB"/> >+ <enum value="0x8726" name="GL_MODELVIEW6_ARB"/> >+ <enum value="0x8727" name="GL_MODELVIEW7_ARB"/> >+ <enum value="0x8728" name="GL_MODELVIEW8_ARB"/> >+ <enum value="0x8729" name="GL_MODELVIEW9_ARB"/> >+ <enum value="0x872A" name="GL_MODELVIEW10_ARB"/> >+ <enum value="0x872B" name="GL_MODELVIEW11_ARB"/> >+ <enum value="0x872C" name="GL_MODELVIEW12_ARB"/> >+ <enum value="0x872D" name="GL_MODELVIEW13_ARB"/> >+ <enum value="0x872E" name="GL_MODELVIEW14_ARB"/> >+ <enum value="0x872F" name="GL_MODELVIEW15_ARB"/> >+ <enum value="0x8730" name="GL_MODELVIEW16_ARB"/> >+ <enum value="0x8731" name="GL_MODELVIEW17_ARB"/> >+ <enum value="0x8732" name="GL_MODELVIEW18_ARB"/> >+ <enum value="0x8733" name="GL_MODELVIEW19_ARB"/> >+ <enum value="0x8734" name="GL_MODELVIEW20_ARB"/> >+ <enum value="0x8735" name="GL_MODELVIEW21_ARB"/> >+ <enum value="0x8736" name="GL_MODELVIEW22_ARB"/> >+ <enum value="0x8737" name="GL_MODELVIEW23_ARB"/> >+ <enum value="0x8738" name="GL_MODELVIEW24_ARB"/> >+ <enum value="0x8739" name="GL_MODELVIEW25_ARB"/> >+ <enum value="0x873A" name="GL_MODELVIEW26_ARB"/> >+ <enum value="0x873B" name="GL_MODELVIEW27_ARB"/> >+ <enum value="0x873C" name="GL_MODELVIEW28_ARB"/> >+ <enum value="0x873D" name="GL_MODELVIEW29_ARB"/> >+ <enum value="0x873E" name="GL_MODELVIEW30_ARB"/> >+ <enum value="0x873F" name="GL_MODELVIEW31_ARB"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8740" end="0x874F" vendor="AMD"> >+ <enum value="0x8740" name="GL_DOT3_RGB_EXT"/> >+ <enum value="0x8740" name="GL_Z400_BINARY_AMD" comment="NOT an alias. Accidental reuse of GL_DOT3_RGB_EXT"/> >+ <enum value="0x8741" name="GL_DOT3_RGBA_EXT"/> >+ <enum value="0x8741" name="GL_PROGRAM_BINARY_LENGTH_OES" comment="NOT an alias. Accidental reuse of GL_DOT3_RGBA_EXT"/> >+ <enum value="0x8741" name="GL_PROGRAM_BINARY_LENGTH"/> >+ <enum value="0x8742" name="GL_MIRROR_CLAMP_ATI"/> >+ <enum value="0x8742" name="GL_MIRROR_CLAMP_EXT"/> >+ <enum value="0x8743" name="GL_MIRROR_CLAMP_TO_EDGE"/> >+ <enum value="0x8743" name="GL_MIRROR_CLAMP_TO_EDGE_ATI"/> >+ <enum value="0x8743" name="GL_MIRROR_CLAMP_TO_EDGE_EXT"/> >+ <enum value="0x8744" name="GL_MODULATE_ADD_ATI"/> >+ <enum value="0x8745" name="GL_MODULATE_SIGNED_ADD_ATI"/> >+ <enum value="0x8746" name="GL_MODULATE_SUBTRACT_ATI"/> >+ <unused start="0x8747" end="0x8749" vendor="AMD"/> >+ <enum value="0x874A" name="GL_SET_AMD"/> >+ <enum value="0x874B" name="GL_REPLACE_VALUE_AMD"/> >+ <enum value="0x874C" name="GL_STENCIL_OP_VALUE_AMD"/> >+ <enum value="0x874D" name="GL_STENCIL_BACK_OP_VALUE_AMD"/> >+ <enum value="0x874E" name="GL_VERTEX_ATTRIB_ARRAY_LONG"/> >+ <enum value="0x874F" name="GL_OCCLUSION_QUERY_EVENT_MASK_AMD"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8750" end="0x875F" vendor="MESA"> >+ <enum value="0x8750" name="GL_DEPTH_STENCIL_MESA"/> >+ <enum value="0x8751" name="GL_UNSIGNED_INT_24_8_MESA"/> >+ <enum value="0x8752" name="GL_UNSIGNED_INT_8_24_REV_MESA"/> >+ <enum value="0x8753" name="GL_UNSIGNED_SHORT_15_1_MESA"/> >+ <enum value="0x8754" name="GL_UNSIGNED_SHORT_1_15_REV_MESA"/> >+ <enum value="0x8755" name="GL_TRACE_MASK_MESA"/> >+ <enum value="0x8756" name="GL_TRACE_NAME_MESA"/> >+ <enum value="0x8757" name="GL_YCBCR_MESA"/> >+ <enum value="0x8758" name="GL_PACK_INVERT_MESA"/> >+ <enum value="0x8759" name="GL_DEBUG_OBJECT_MESA" comment="NOT an alias. Accidental reuse of GL_TEXTURE_1D_STACK_MESAX"/> >+ <enum value="0x8759" name="GL_TEXTURE_1D_STACK_MESAX"/> >+ <enum value="0x875A" name="GL_DEBUG_PRINT_MESA" comment="NOT an alias. Accidental reuse of GL_TEXTURE_2D_STACK_MESAX"/> >+ <enum value="0x875A" name="GL_TEXTURE_2D_STACK_MESAX"/> >+ <enum value="0x875B" name="GL_DEBUG_ASSERT_MESA" comment="NOT an alias. Accidental reuse of GL_PROXY_TEXTURE_1D_STACK_MESAX"/> >+ <enum value="0x875B" name="GL_PROXY_TEXTURE_1D_STACK_MESAX"/> >+ <enum value="0x875C" name="GL_PROXY_TEXTURE_2D_STACK_MESAX"/> >+ <enum value="0x875D" name="GL_TEXTURE_1D_STACK_BINDING_MESAX"/> >+ <enum value="0x875E" name="GL_TEXTURE_2D_STACK_BINDING_MESAX"/> >+ <enum value="0x875F" name="GL_PROGRAM_BINARY_FORMAT_MESA"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8760" end="0x883F" vendor="AMD"> >+ <enum value="0x8760" name="GL_STATIC_ATI"/> >+ <enum value="0x8761" name="GL_DYNAMIC_ATI"/> >+ <enum value="0x8762" name="GL_PRESERVE_ATI"/> >+ <enum value="0x8763" name="GL_DISCARD_ATI"/> >+ <enum value="0x8764" name="GL_BUFFER_SIZE"/> >+ <enum value="0x8764" name="GL_BUFFER_SIZE_ARB"/> >+ <enum value="0x8764" name="GL_OBJECT_BUFFER_SIZE_ATI"/> >+ <enum value="0x8765" name="GL_BUFFER_USAGE"/> >+ <enum value="0x8765" name="GL_BUFFER_USAGE_ARB"/> >+ <enum value="0x8765" name="GL_OBJECT_BUFFER_USAGE_ATI"/> >+ <enum value="0x8766" name="GL_ARRAY_OBJECT_BUFFER_ATI"/> >+ <enum value="0x8767" name="GL_ARRAY_OBJECT_OFFSET_ATI"/> >+ <enum value="0x8768" name="GL_ELEMENT_ARRAY_ATI"/> >+ <enum value="0x8769" name="GL_ELEMENT_ARRAY_TYPE_ATI"/> >+ <enum value="0x876A" name="GL_ELEMENT_ARRAY_POINTER_ATI"/> >+ <enum value="0x876B" name="GL_MAX_VERTEX_STREAMS_ATI"/> >+ <enum value="0x876C" name="GL_VERTEX_STREAM0_ATI"/> >+ <enum value="0x876D" name="GL_VERTEX_STREAM1_ATI"/> >+ <enum value="0x876E" name="GL_VERTEX_STREAM2_ATI"/> >+ <enum value="0x876F" name="GL_VERTEX_STREAM3_ATI"/> >+ <enum value="0x8770" name="GL_VERTEX_STREAM4_ATI"/> >+ <enum value="0x8771" name="GL_VERTEX_STREAM5_ATI"/> >+ <enum value="0x8772" name="GL_VERTEX_STREAM6_ATI"/> >+ <enum value="0x8773" name="GL_VERTEX_STREAM7_ATI"/> >+ <enum value="0x8774" name="GL_VERTEX_SOURCE_ATI"/> >+ <enum value="0x8775" name="GL_BUMP_ROT_MATRIX_ATI"/> >+ <enum value="0x8776" name="GL_BUMP_ROT_MATRIX_SIZE_ATI"/> >+ <enum value="0x8777" name="GL_BUMP_NUM_TEX_UNITS_ATI"/> >+ <enum value="0x8778" name="GL_BUMP_TEX_UNITS_ATI"/> >+ <enum value="0x8779" name="GL_DUDV_ATI"/> >+ <enum value="0x877A" name="GL_DU8DV8_ATI"/> >+ <enum value="0x877B" name="GL_BUMP_ENVMAP_ATI"/> >+ <enum value="0x877C" name="GL_BUMP_TARGET_ATI"/> >+ <unused start="0x877D" end="0x877F" vendor="AMD"/> >+ <enum value="0x8780" name="GL_VERTEX_SHADER_EXT"/> >+ <enum value="0x8781" name="GL_VERTEX_SHADER_BINDING_EXT"/> >+ <enum value="0x8782" name="GL_OP_INDEX_EXT"/> >+ <enum value="0x8783" name="GL_OP_NEGATE_EXT"/> >+ <enum value="0x8784" name="GL_OP_DOT3_EXT"/> >+ <enum value="0x8785" name="GL_OP_DOT4_EXT"/> >+ <enum value="0x8786" name="GL_OP_MUL_EXT"/> >+ <enum value="0x8787" name="GL_OP_ADD_EXT"/> >+ <enum value="0x8788" name="GL_OP_MADD_EXT"/> >+ <enum value="0x8789" name="GL_OP_FRAC_EXT"/> >+ <enum value="0x878A" name="GL_OP_MAX_EXT"/> >+ <enum value="0x878B" name="GL_OP_MIN_EXT"/> >+ <enum value="0x878C" name="GL_OP_SET_GE_EXT"/> >+ <enum value="0x878D" name="GL_OP_SET_LT_EXT"/> >+ <enum value="0x878E" name="GL_OP_CLAMP_EXT"/> >+ <enum value="0x878F" name="GL_OP_FLOOR_EXT"/> >+ <enum value="0x8790" name="GL_OP_ROUND_EXT"/> >+ <enum value="0x8791" name="GL_OP_EXP_BASE_2_EXT"/> >+ <enum value="0x8792" name="GL_OP_LOG_BASE_2_EXT"/> >+ <enum value="0x8793" name="GL_OP_POWER_EXT"/> >+ <enum value="0x8794" name="GL_OP_RECIP_EXT"/> >+ <enum value="0x8795" name="GL_OP_RECIP_SQRT_EXT"/> >+ <enum value="0x8796" name="GL_OP_SUB_EXT"/> >+ <enum value="0x8797" name="GL_OP_CROSS_PRODUCT_EXT"/> >+ <enum value="0x8798" name="GL_OP_MULTIPLY_MATRIX_EXT"/> >+ <enum value="0x8799" name="GL_OP_MOV_EXT"/> >+ <enum value="0x879A" name="GL_OUTPUT_VERTEX_EXT"/> >+ <enum value="0x879B" name="GL_OUTPUT_COLOR0_EXT"/> >+ <enum value="0x879C" name="GL_OUTPUT_COLOR1_EXT"/> >+ <enum value="0x879D" name="GL_OUTPUT_TEXTURE_COORD0_EXT"/> >+ <enum value="0x879E" name="GL_OUTPUT_TEXTURE_COORD1_EXT"/> >+ <enum value="0x879F" name="GL_OUTPUT_TEXTURE_COORD2_EXT"/> >+ <enum value="0x87A0" name="GL_OUTPUT_TEXTURE_COORD3_EXT"/> >+ <enum value="0x87A1" name="GL_OUTPUT_TEXTURE_COORD4_EXT"/> >+ <enum value="0x87A2" name="GL_OUTPUT_TEXTURE_COORD5_EXT"/> >+ <enum value="0x87A3" name="GL_OUTPUT_TEXTURE_COORD6_EXT"/> >+ <enum value="0x87A4" name="GL_OUTPUT_TEXTURE_COORD7_EXT"/> >+ <enum value="0x87A5" name="GL_OUTPUT_TEXTURE_COORD8_EXT"/> >+ <enum value="0x87A6" name="GL_OUTPUT_TEXTURE_COORD9_EXT"/> >+ <enum value="0x87A7" name="GL_OUTPUT_TEXTURE_COORD10_EXT"/> >+ <enum value="0x87A8" name="GL_OUTPUT_TEXTURE_COORD11_EXT"/> >+ <enum value="0x87A9" name="GL_OUTPUT_TEXTURE_COORD12_EXT"/> >+ <enum value="0x87AA" name="GL_OUTPUT_TEXTURE_COORD13_EXT"/> >+ <enum value="0x87AB" name="GL_OUTPUT_TEXTURE_COORD14_EXT"/> >+ <enum value="0x87AC" name="GL_OUTPUT_TEXTURE_COORD15_EXT"/> >+ <enum value="0x87AD" name="GL_OUTPUT_TEXTURE_COORD16_EXT"/> >+ <enum value="0x87AE" name="GL_OUTPUT_TEXTURE_COORD17_EXT"/> >+ <enum value="0x87AF" name="GL_OUTPUT_TEXTURE_COORD18_EXT"/> >+ <enum value="0x87B0" name="GL_OUTPUT_TEXTURE_COORD19_EXT"/> >+ <enum value="0x87B1" name="GL_OUTPUT_TEXTURE_COORD20_EXT"/> >+ <enum value="0x87B2" name="GL_OUTPUT_TEXTURE_COORD21_EXT"/> >+ <enum value="0x87B3" name="GL_OUTPUT_TEXTURE_COORD22_EXT"/> >+ <enum value="0x87B4" name="GL_OUTPUT_TEXTURE_COORD23_EXT"/> >+ <enum value="0x87B5" name="GL_OUTPUT_TEXTURE_COORD24_EXT"/> >+ <enum value="0x87B6" name="GL_OUTPUT_TEXTURE_COORD25_EXT"/> >+ <enum value="0x87B7" name="GL_OUTPUT_TEXTURE_COORD26_EXT"/> >+ <enum value="0x87B8" name="GL_OUTPUT_TEXTURE_COORD27_EXT"/> >+ <enum value="0x87B9" name="GL_OUTPUT_TEXTURE_COORD28_EXT"/> >+ <enum value="0x87BA" name="GL_OUTPUT_TEXTURE_COORD29_EXT"/> >+ <enum value="0x87BB" name="GL_OUTPUT_TEXTURE_COORD30_EXT"/> >+ <enum value="0x87BC" name="GL_OUTPUT_TEXTURE_COORD31_EXT"/> >+ <enum value="0x87BD" name="GL_OUTPUT_FOG_EXT"/> >+ <enum value="0x87BE" name="GL_SCALAR_EXT"/> >+ <enum value="0x87BF" name="GL_VECTOR_EXT"/> >+ <enum value="0x87C0" name="GL_MATRIX_EXT"/> >+ <enum value="0x87C1" name="GL_VARIANT_EXT"/> >+ <enum value="0x87C2" name="GL_INVARIANT_EXT"/> >+ <enum value="0x87C3" name="GL_LOCAL_CONSTANT_EXT"/> >+ <enum value="0x87C4" name="GL_LOCAL_EXT"/> >+ <enum value="0x87C5" name="GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT"/> >+ <enum value="0x87C6" name="GL_MAX_VERTEX_SHADER_VARIANTS_EXT"/> >+ <enum value="0x87C7" name="GL_MAX_VERTEX_SHADER_INVARIANTS_EXT"/> >+ <enum value="0x87C8" name="GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT"/> >+ <enum value="0x87C9" name="GL_MAX_VERTEX_SHADER_LOCALS_EXT"/> >+ <enum value="0x87CA" name="GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT"/> >+ <enum value="0x87CB" name="GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT"/> >+ <enum value="0x87CC" name="GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT"/> >+ <enum value="0x87CD" name="GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT"/> >+ <enum value="0x87CE" name="GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT"/> >+ <enum value="0x87CF" name="GL_VERTEX_SHADER_INSTRUCTIONS_EXT"/> >+ <enum value="0x87D0" name="GL_VERTEX_SHADER_VARIANTS_EXT"/> >+ <enum value="0x87D1" name="GL_VERTEX_SHADER_INVARIANTS_EXT"/> >+ <enum value="0x87D2" name="GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT"/> >+ <enum value="0x87D3" name="GL_VERTEX_SHADER_LOCALS_EXT"/> >+ <enum value="0x87D4" name="GL_VERTEX_SHADER_OPTIMIZED_EXT"/> >+ <enum value="0x87D5" name="GL_X_EXT"/> >+ <enum value="0x87D6" name="GL_Y_EXT"/> >+ <enum value="0x87D7" name="GL_Z_EXT"/> >+ <enum value="0x87D8" name="GL_W_EXT"/> >+ <enum value="0x87D9" name="GL_NEGATIVE_X_EXT"/> >+ <enum value="0x87DA" name="GL_NEGATIVE_Y_EXT"/> >+ <enum value="0x87DB" name="GL_NEGATIVE_Z_EXT"/> >+ <enum value="0x87DC" name="GL_NEGATIVE_W_EXT"/> >+ <enum value="0x87DD" name="GL_ZERO_EXT"/> >+ <enum value="0x87DE" name="GL_ONE_EXT"/> >+ <enum value="0x87DF" name="GL_NEGATIVE_ONE_EXT"/> >+ <enum value="0x87E0" name="GL_NORMALIZED_RANGE_EXT"/> >+ <enum value="0x87E1" name="GL_FULL_RANGE_EXT"/> >+ <enum value="0x87E2" name="GL_CURRENT_VERTEX_EXT"/> >+ <enum value="0x87E3" name="GL_MVP_MATRIX_EXT"/> >+ <enum value="0x87E4" name="GL_VARIANT_VALUE_EXT"/> >+ <enum value="0x87E5" name="GL_VARIANT_DATATYPE_EXT"/> >+ <enum value="0x87E6" name="GL_VARIANT_ARRAY_STRIDE_EXT"/> >+ <enum value="0x87E7" name="GL_VARIANT_ARRAY_TYPE_EXT"/> >+ <enum value="0x87E8" name="GL_VARIANT_ARRAY_EXT"/> >+ <enum value="0x87E9" name="GL_VARIANT_ARRAY_POINTER_EXT"/> >+ <enum value="0x87EA" name="GL_INVARIANT_VALUE_EXT"/> >+ <enum value="0x87EB" name="GL_INVARIANT_DATATYPE_EXT"/> >+ <enum value="0x87EC" name="GL_LOCAL_CONSTANT_VALUE_EXT"/> >+ <enum value="0x87ED" name="GL_LOCAL_CONSTANT_DATATYPE_EXT"/> >+ <enum value="0x87EE" name="GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD"/> >+ <enum value="0x87F0" name="GL_PN_TRIANGLES_ATI"/> >+ <enum value="0x87F1" name="GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI"/> >+ <enum value="0x87F2" name="GL_PN_TRIANGLES_POINT_MODE_ATI"/> >+ <enum value="0x87F3" name="GL_PN_TRIANGLES_NORMAL_MODE_ATI"/> >+ <enum value="0x87F4" name="GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI"/> >+ <enum value="0x87F5" name="GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI"/> >+ <enum value="0x87F6" name="GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI"/> >+ <enum value="0x87F7" name="GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI"/> >+ <enum value="0x87F8" name="GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI"/> >+ <enum value="0x87F9" name="GL_3DC_X_AMD"/> >+ <enum value="0x87FA" name="GL_3DC_XY_AMD"/> >+ <enum value="0x87FB" name="GL_VBO_FREE_MEMORY_ATI"/> >+ <enum value="0x87FC" name="GL_TEXTURE_FREE_MEMORY_ATI"/> >+ <enum value="0x87FD" name="GL_RENDERBUFFER_FREE_MEMORY_ATI"/> >+ <enum value="0x87FE" name="GL_NUM_PROGRAM_BINARY_FORMATS"/> >+ <enum value="0x87FE" name="GL_NUM_PROGRAM_BINARY_FORMATS_OES"/> >+ <enum value="0x87FF" name="GL_PROGRAM_BINARY_FORMATS"/> >+ <enum value="0x87FF" name="GL_PROGRAM_BINARY_FORMATS_OES"/> >+ <enum value="0x8800" name="GL_STENCIL_BACK_FUNC"/> >+ <enum value="0x8800" name="GL_STENCIL_BACK_FUNC_ATI"/> >+ <enum value="0x8801" name="GL_STENCIL_BACK_FAIL"/> >+ <enum value="0x8801" name="GL_STENCIL_BACK_FAIL_ATI"/> >+ <enum value="0x8802" name="GL_STENCIL_BACK_PASS_DEPTH_FAIL"/> >+ <enum value="0x8802" name="GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI"/> >+ <enum value="0x8803" name="GL_STENCIL_BACK_PASS_DEPTH_PASS"/> >+ <enum value="0x8803" name="GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI"/> >+ <enum value="0x8804" name="GL_FRAGMENT_PROGRAM_ARB"/> >+ <enum value="0x8805" name="GL_PROGRAM_ALU_INSTRUCTIONS_ARB"/> >+ <enum value="0x8806" name="GL_PROGRAM_TEX_INSTRUCTIONS_ARB"/> >+ <enum value="0x8807" name="GL_PROGRAM_TEX_INDIRECTIONS_ARB"/> >+ <enum value="0x8808" name="GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB"/> >+ <enum value="0x8809" name="GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB"/> >+ <enum value="0x880A" name="GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB"/> >+ <enum value="0x880B" name="GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB"/> >+ <enum value="0x880C" name="GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB"/> >+ <enum value="0x880D" name="GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB"/> >+ <enum value="0x880E" name="GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB"/> >+ <enum value="0x880F" name="GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB"/> >+ <enum value="0x8810" name="GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB"/> >+ <unused start="0x8811" end="0x8813" vendor="AMD"/> >+ <enum value="0x8814" name="GL_RGBA32F"/> >+ <enum value="0x8814" name="GL_RGBA32F_ARB"/> >+ <enum value="0x8814" name="GL_RGBA32F_EXT"/> >+ <enum value="0x8814" name="GL_RGBA_FLOAT32_APPLE"/> >+ <enum value="0x8814" name="GL_RGBA_FLOAT32_ATI"/> >+ <enum value="0x8815" name="GL_RGB32F"/> >+ <enum value="0x8815" name="GL_RGB32F_ARB"/> >+ <enum value="0x8815" name="GL_RGB32F_EXT"/> >+ <enum value="0x8815" name="GL_RGB_FLOAT32_APPLE"/> >+ <enum value="0x8815" name="GL_RGB_FLOAT32_ATI"/> >+ <enum value="0x8816" name="GL_ALPHA32F_ARB"/> >+ <enum value="0x8816" name="GL_ALPHA32F_EXT"/> >+ <enum value="0x8816" name="GL_ALPHA_FLOAT32_APPLE"/> >+ <enum value="0x8816" name="GL_ALPHA_FLOAT32_ATI"/> >+ <enum value="0x8817" name="GL_INTENSITY32F_ARB"/> >+ <enum value="0x8817" name="GL_INTENSITY_FLOAT32_APPLE"/> >+ <enum value="0x8817" name="GL_INTENSITY_FLOAT32_ATI"/> >+ <enum value="0x8818" name="GL_LUMINANCE32F_ARB"/> >+ <enum value="0x8818" name="GL_LUMINANCE32F_EXT"/> >+ <enum value="0x8818" name="GL_LUMINANCE_FLOAT32_APPLE"/> >+ <enum value="0x8818" name="GL_LUMINANCE_FLOAT32_ATI"/> >+ <enum value="0x8819" name="GL_LUMINANCE_ALPHA32F_ARB"/> >+ <enum value="0x8819" name="GL_LUMINANCE_ALPHA32F_EXT"/> >+ <enum value="0x8819" name="GL_LUMINANCE_ALPHA_FLOAT32_APPLE"/> >+ <enum value="0x8819" name="GL_LUMINANCE_ALPHA_FLOAT32_ATI"/> >+ <enum value="0x881A" name="GL_RGBA16F"/> >+ <enum value="0x881A" name="GL_RGBA16F_ARB"/> >+ <enum value="0x881A" name="GL_RGBA16F_EXT"/> >+ <enum value="0x881A" name="GL_RGBA_FLOAT16_APPLE"/> >+ <enum value="0x881A" name="GL_RGBA_FLOAT16_ATI"/> >+ <enum value="0x881B" name="GL_RGB16F"/> >+ <enum value="0x881B" name="GL_RGB16F_ARB"/> >+ <enum value="0x881B" name="GL_RGB16F_EXT"/> >+ <enum value="0x881B" name="GL_RGB_FLOAT16_APPLE"/> >+ <enum value="0x881B" name="GL_RGB_FLOAT16_ATI"/> >+ <enum value="0x881C" name="GL_ALPHA16F_ARB"/> >+ <enum value="0x881C" name="GL_ALPHA16F_EXT"/> >+ <enum value="0x881C" name="GL_ALPHA_FLOAT16_APPLE"/> >+ <enum value="0x881C" name="GL_ALPHA_FLOAT16_ATI"/> >+ <enum value="0x881D" name="GL_INTENSITY16F_ARB"/> >+ <enum value="0x881D" name="GL_INTENSITY_FLOAT16_APPLE"/> >+ <enum value="0x881D" name="GL_INTENSITY_FLOAT16_ATI"/> >+ <enum value="0x881E" name="GL_LUMINANCE16F_ARB"/> >+ <enum value="0x881E" name="GL_LUMINANCE16F_EXT"/> >+ <enum value="0x881E" name="GL_LUMINANCE_FLOAT16_APPLE"/> >+ <enum value="0x881E" name="GL_LUMINANCE_FLOAT16_ATI"/> >+ <enum value="0x881F" name="GL_LUMINANCE_ALPHA16F_ARB"/> >+ <enum value="0x881F" name="GL_LUMINANCE_ALPHA16F_EXT"/> >+ <enum value="0x881F" name="GL_LUMINANCE_ALPHA_FLOAT16_APPLE"/> >+ <enum value="0x881F" name="GL_LUMINANCE_ALPHA_FLOAT16_ATI"/> >+ <!-- RGBA_FLOAT_MODE_ARB equivalent to TYPE_RGBA_FLOAT_ATI --> >+ <enum value="0x8820" name="GL_RGBA_FLOAT_MODE_ARB"/> >+ <enum value="0x8820" name="GL_RGBA_FLOAT_MODE_ATI"/> >+ <unused start="0x8821" end="0x8822" vendor="AMD"/> >+ <enum value="0x8823" name="GL_WRITEONLY_RENDERING_QCOM"/> >+ <enum value="0x8824" name="GL_MAX_DRAW_BUFFERS"/> >+ <enum value="0x8824" name="GL_MAX_DRAW_BUFFERS_ARB"/> >+ <enum value="0x8824" name="GL_MAX_DRAW_BUFFERS_ATI"/> >+ <enum value="0x8824" name="GL_MAX_DRAW_BUFFERS_EXT"/> >+ <enum value="0x8824" name="GL_MAX_DRAW_BUFFERS_NV"/> >+ <enum value="0x8825" name="GL_DRAW_BUFFER0"/> >+ <enum value="0x8825" name="GL_DRAW_BUFFER0_ARB"/> >+ <enum value="0x8825" name="GL_DRAW_BUFFER0_ATI"/> >+ <enum value="0x8825" name="GL_DRAW_BUFFER0_EXT"/> >+ <enum value="0x8825" name="GL_DRAW_BUFFER0_NV"/> >+ <enum value="0x8826" name="GL_DRAW_BUFFER1"/> >+ <enum value="0x8826" name="GL_DRAW_BUFFER1_ARB"/> >+ <enum value="0x8826" name="GL_DRAW_BUFFER1_ATI"/> >+ <enum value="0x8826" name="GL_DRAW_BUFFER1_EXT"/> >+ <enum value="0x8826" name="GL_DRAW_BUFFER1_NV"/> >+ <enum value="0x8827" name="GL_DRAW_BUFFER2"/> >+ <enum value="0x8827" name="GL_DRAW_BUFFER2_ARB"/> >+ <enum value="0x8827" name="GL_DRAW_BUFFER2_ATI"/> >+ <enum value="0x8827" name="GL_DRAW_BUFFER2_EXT"/> >+ <enum value="0x8827" name="GL_DRAW_BUFFER2_NV"/> >+ <enum value="0x8828" name="GL_DRAW_BUFFER3"/> >+ <enum value="0x8828" name="GL_DRAW_BUFFER3_ARB"/> >+ <enum value="0x8828" name="GL_DRAW_BUFFER3_ATI"/> >+ <enum value="0x8828" name="GL_DRAW_BUFFER3_EXT"/> >+ <enum value="0x8828" name="GL_DRAW_BUFFER3_NV"/> >+ <enum value="0x8829" name="GL_DRAW_BUFFER4"/> >+ <enum value="0x8829" name="GL_DRAW_BUFFER4_ARB"/> >+ <enum value="0x8829" name="GL_DRAW_BUFFER4_ATI"/> >+ <enum value="0x8829" name="GL_DRAW_BUFFER4_EXT"/> >+ <enum value="0x8829" name="GL_DRAW_BUFFER4_NV"/> >+ <enum value="0x882A" name="GL_DRAW_BUFFER5"/> >+ <enum value="0x882A" name="GL_DRAW_BUFFER5_ARB"/> >+ <enum value="0x882A" name="GL_DRAW_BUFFER5_ATI"/> >+ <enum value="0x882A" name="GL_DRAW_BUFFER5_EXT"/> >+ <enum value="0x882A" name="GL_DRAW_BUFFER5_NV"/> >+ <enum value="0x882B" name="GL_DRAW_BUFFER6"/> >+ <enum value="0x882B" name="GL_DRAW_BUFFER6_ARB"/> >+ <enum value="0x882B" name="GL_DRAW_BUFFER6_ATI"/> >+ <enum value="0x882B" name="GL_DRAW_BUFFER6_EXT"/> >+ <enum value="0x882B" name="GL_DRAW_BUFFER6_NV"/> >+ <enum value="0x882C" name="GL_DRAW_BUFFER7"/> >+ <enum value="0x882C" name="GL_DRAW_BUFFER7_ARB"/> >+ <enum value="0x882C" name="GL_DRAW_BUFFER7_ATI"/> >+ <enum value="0x882C" name="GL_DRAW_BUFFER7_EXT"/> >+ <enum value="0x882C" name="GL_DRAW_BUFFER7_NV"/> >+ <enum value="0x882D" name="GL_DRAW_BUFFER8"/> >+ <enum value="0x882D" name="GL_DRAW_BUFFER8_ARB"/> >+ <enum value="0x882D" name="GL_DRAW_BUFFER8_ATI"/> >+ <enum value="0x882D" name="GL_DRAW_BUFFER8_EXT"/> >+ <enum value="0x882D" name="GL_DRAW_BUFFER8_NV"/> >+ <enum value="0x882E" name="GL_DRAW_BUFFER9"/> >+ <enum value="0x882E" name="GL_DRAW_BUFFER9_ARB"/> >+ <enum value="0x882E" name="GL_DRAW_BUFFER9_ATI"/> >+ <enum value="0x882E" name="GL_DRAW_BUFFER9_EXT"/> >+ <enum value="0x882E" name="GL_DRAW_BUFFER9_NV"/> >+ <enum value="0x882F" name="GL_DRAW_BUFFER10"/> >+ <enum value="0x882F" name="GL_DRAW_BUFFER10_ARB"/> >+ <enum value="0x882F" name="GL_DRAW_BUFFER10_ATI"/> >+ <enum value="0x882F" name="GL_DRAW_BUFFER10_EXT"/> >+ <enum value="0x882F" name="GL_DRAW_BUFFER10_NV"/> >+ <enum value="0x8830" name="GL_DRAW_BUFFER11"/> >+ <enum value="0x8830" name="GL_DRAW_BUFFER11_ARB"/> >+ <enum value="0x8830" name="GL_DRAW_BUFFER11_ATI"/> >+ <enum value="0x8830" name="GL_DRAW_BUFFER11_EXT"/> >+ <enum value="0x8830" name="GL_DRAW_BUFFER11_NV"/> >+ <enum value="0x8831" name="GL_DRAW_BUFFER12"/> >+ <enum value="0x8831" name="GL_DRAW_BUFFER12_ARB"/> >+ <enum value="0x8831" name="GL_DRAW_BUFFER12_ATI"/> >+ <enum value="0x8831" name="GL_DRAW_BUFFER12_EXT"/> >+ <enum value="0x8831" name="GL_DRAW_BUFFER12_NV"/> >+ <enum value="0x8832" name="GL_DRAW_BUFFER13"/> >+ <enum value="0x8832" name="GL_DRAW_BUFFER13_ARB"/> >+ <enum value="0x8832" name="GL_DRAW_BUFFER13_ATI"/> >+ <enum value="0x8832" name="GL_DRAW_BUFFER13_EXT"/> >+ <enum value="0x8832" name="GL_DRAW_BUFFER13_NV"/> >+ <enum value="0x8833" name="GL_DRAW_BUFFER14"/> >+ <enum value="0x8833" name="GL_DRAW_BUFFER14_ARB"/> >+ <enum value="0x8833" name="GL_DRAW_BUFFER14_ATI"/> >+ <enum value="0x8833" name="GL_DRAW_BUFFER14_EXT"/> >+ <enum value="0x8833" name="GL_DRAW_BUFFER14_NV"/> >+ <enum value="0x8834" name="GL_DRAW_BUFFER15"/> >+ <enum value="0x8834" name="GL_DRAW_BUFFER15_ARB"/> >+ <enum value="0x8834" name="GL_DRAW_BUFFER15_ATI"/> >+ <enum value="0x8834" name="GL_DRAW_BUFFER15_EXT"/> >+ <enum value="0x8834" name="GL_DRAW_BUFFER15_NV"/> >+ <enum value="0x8835" name="GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI"/> >+ <unused start="0x8836" vendor="AMD"/> >+ <enum value="0x8837" name="GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI" comment="Defined by Mesa but not ATI"/> >+ <unused start="0x8838" end="0x883C" vendor="AMD"/> >+ <enum value="0x883D" name="GL_BLEND_EQUATION_ALPHA"/> >+ <enum value="0x883D" name="GL_BLEND_EQUATION_ALPHA_EXT"/> >+ <enum value="0x883D" name="GL_BLEND_EQUATION_ALPHA_OES"/> >+ <unused start="0x883E" vendor="AMD"/> >+ <enum value="0x883F" name="GL_SUBSAMPLE_DISTANCE_AMD"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8840" end="0x884F" vendor="ARB"> >+ <enum value="0x8840" name="GL_MATRIX_PALETTE_ARB"/> >+ <enum value="0x8840" name="GL_MATRIX_PALETTE_OES"/> >+ <enum value="0x8841" name="GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB"/> >+ <enum value="0x8842" name="GL_MAX_PALETTE_MATRICES_ARB"/> >+ <enum value="0x8842" name="GL_MAX_PALETTE_MATRICES_OES"/> >+ <enum value="0x8843" name="GL_CURRENT_PALETTE_MATRIX_ARB"/> >+ <enum value="0x8843" name="GL_CURRENT_PALETTE_MATRIX_OES"/> >+ <enum value="0x8844" name="GL_MATRIX_INDEX_ARRAY_ARB"/> >+ <enum value="0x8844" name="GL_MATRIX_INDEX_ARRAY_OES"/> >+ <enum value="0x8845" name="GL_CURRENT_MATRIX_INDEX_ARB"/> >+ <enum value="0x8846" name="GL_MATRIX_INDEX_ARRAY_SIZE_ARB"/> >+ <enum value="0x8846" name="GL_MATRIX_INDEX_ARRAY_SIZE_OES"/> >+ <enum value="0x8847" name="GL_MATRIX_INDEX_ARRAY_TYPE_ARB"/> >+ <enum value="0x8847" name="GL_MATRIX_INDEX_ARRAY_TYPE_OES"/> >+ <enum value="0x8848" name="GL_MATRIX_INDEX_ARRAY_STRIDE_ARB"/> >+ <enum value="0x8848" name="GL_MATRIX_INDEX_ARRAY_STRIDE_OES"/> >+ <enum value="0x8849" name="GL_MATRIX_INDEX_ARRAY_POINTER_ARB"/> >+ <enum value="0x8849" name="GL_MATRIX_INDEX_ARRAY_POINTER_OES"/> >+ <enum value="0x884A" name="GL_TEXTURE_DEPTH_SIZE"/> >+ <enum value="0x884A" name="GL_TEXTURE_DEPTH_SIZE_ARB"/> >+ <enum value="0x884B" name="GL_DEPTH_TEXTURE_MODE"/> >+ <enum value="0x884B" name="GL_DEPTH_TEXTURE_MODE_ARB"/> >+ <enum value="0x884C" name="GL_TEXTURE_COMPARE_MODE"/> >+ <enum value="0x884C" name="GL_TEXTURE_COMPARE_MODE_ARB"/> >+ <enum value="0x884C" name="GL_TEXTURE_COMPARE_MODE_EXT"/> >+ <enum value="0x884D" name="GL_TEXTURE_COMPARE_FUNC"/> >+ <enum value="0x884D" name="GL_TEXTURE_COMPARE_FUNC_ARB"/> >+ <enum value="0x884D" name="GL_TEXTURE_COMPARE_FUNC_EXT"/> >+ <enum value="0x884E" name="GL_COMPARE_R_TO_TEXTURE"/> >+ <enum value="0x884E" name="GL_COMPARE_R_TO_TEXTURE_ARB"/> >+ <enum value="0x884E" name="GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT"/> >+ <enum value="0x884E" name="GL_COMPARE_REF_TO_TEXTURE" alias="GL_COMPARE_R_TO_TEXTURE"/> >+ <enum value="0x884E" name="GL_COMPARE_REF_TO_TEXTURE_EXT"/> >+ <enum value="0x884F" name="GL_TEXTURE_CUBE_MAP_SEAMLESS"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8850" end="0x891F" vendor="NV"> >+ <enum value="0x8850" name="GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV"/> >+ <enum value="0x8851" name="GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV"/> >+ <enum value="0x8852" name="GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV"/> >+ <enum value="0x8853" name="GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV"/> >+ <enum value="0x8854" name="GL_OFFSET_HILO_TEXTURE_2D_NV"/> >+ <enum value="0x8855" name="GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV"/> >+ <enum value="0x8856" name="GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV"/> >+ <enum value="0x8857" name="GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV"/> >+ <enum value="0x8858" name="GL_DEPENDENT_HILO_TEXTURE_2D_NV"/> >+ <enum value="0x8859" name="GL_DEPENDENT_RGB_TEXTURE_3D_NV"/> >+ <enum value="0x885A" name="GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV"/> >+ <enum value="0x885B" name="GL_DOT_PRODUCT_PASS_THROUGH_NV"/> >+ <enum value="0x885C" name="GL_DOT_PRODUCT_TEXTURE_1D_NV"/> >+ <enum value="0x885D" name="GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV"/> >+ <enum value="0x885E" name="GL_HILO8_NV"/> >+ <enum value="0x885F" name="GL_SIGNED_HILO8_NV"/> >+ <enum value="0x8860" name="GL_FORCE_BLUE_TO_ONE_NV"/> >+ <enum value="0x8861" name="GL_POINT_SPRITE"/> >+ <enum value="0x8861" name="GL_POINT_SPRITE_ARB"/> >+ <enum value="0x8861" name="GL_POINT_SPRITE_NV"/> >+ <enum value="0x8861" name="GL_POINT_SPRITE_OES"/> >+ <enum value="0x8862" name="GL_COORD_REPLACE"/> >+ <enum value="0x8862" name="GL_COORD_REPLACE_ARB"/> >+ <enum value="0x8862" name="GL_COORD_REPLACE_NV"/> >+ <enum value="0x8862" name="GL_COORD_REPLACE_OES"/> >+ <enum value="0x8863" name="GL_POINT_SPRITE_R_MODE_NV"/> >+ <enum value="0x8864" name="GL_PIXEL_COUNTER_BITS_NV"/> >+ <enum value="0x8864" name="GL_QUERY_COUNTER_BITS"/> >+ <enum value="0x8864" name="GL_QUERY_COUNTER_BITS_ARB"/> >+ <enum value="0x8864" name="GL_QUERY_COUNTER_BITS_EXT"/> >+ <enum value="0x8865" name="GL_CURRENT_OCCLUSION_QUERY_ID_NV"/> >+ <enum value="0x8865" name="GL_CURRENT_QUERY"/> >+ <enum value="0x8865" name="GL_CURRENT_QUERY_ARB"/> >+ <enum value="0x8865" name="GL_CURRENT_QUERY_EXT"/> >+ <enum value="0x8866" name="GL_PIXEL_COUNT_NV"/> >+ <enum value="0x8866" name="GL_QUERY_RESULT"/> >+ <enum value="0x8866" name="GL_QUERY_RESULT_ARB"/> >+ <enum value="0x8866" name="GL_QUERY_RESULT_EXT"/> >+ <enum value="0x8867" name="GL_PIXEL_COUNT_AVAILABLE_NV"/> >+ <enum value="0x8867" name="GL_QUERY_RESULT_AVAILABLE"/> >+ <enum value="0x8867" name="GL_QUERY_RESULT_AVAILABLE_ARB"/> >+ <enum value="0x8867" name="GL_QUERY_RESULT_AVAILABLE_EXT"/> >+ <enum value="0x8868" name="GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV"/> >+ <enum value="0x8869" name="GL_MAX_VERTEX_ATTRIBS"/> >+ <enum value="0x8869" name="GL_MAX_VERTEX_ATTRIBS_ARB"/> >+ <enum value="0x886A" name="GL_VERTEX_ATTRIB_ARRAY_NORMALIZED"/> >+ <enum value="0x886A" name="GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB"/> >+ <unused start="0x886B" vendor="NV"/> >+ <enum value="0x886C" name="GL_MAX_TESS_CONTROL_INPUT_COMPONENTS"/> >+ <enum value="0x886C" name="GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT"/> >+ <enum value="0x886C" name="GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_OES"/> >+ <enum value="0x886D" name="GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS"/> >+ <enum value="0x886D" name="GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT"/> >+ <enum value="0x886D" name="GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_OES"/> >+ <enum value="0x886E" name="GL_DEPTH_STENCIL_TO_RGBA_NV"/> >+ <enum value="0x886F" name="GL_DEPTH_STENCIL_TO_BGRA_NV"/> >+ <enum value="0x8870" name="GL_FRAGMENT_PROGRAM_NV"/> >+ <enum value="0x8871" name="GL_MAX_TEXTURE_COORDS"/> >+ <enum value="0x8871" name="GL_MAX_TEXTURE_COORDS_ARB"/> >+ <enum value="0x8871" name="GL_MAX_TEXTURE_COORDS_NV"/> >+ <enum value="0x8872" name="GL_MAX_TEXTURE_IMAGE_UNITS"/> >+ <enum value="0x8872" name="GL_MAX_TEXTURE_IMAGE_UNITS_ARB"/> >+ <enum value="0x8872" name="GL_MAX_TEXTURE_IMAGE_UNITS_NV"/> >+ <enum value="0x8873" name="GL_FRAGMENT_PROGRAM_BINDING_NV"/> >+ <enum value="0x8874" name="GL_PROGRAM_ERROR_STRING_ARB"/> >+ <enum value="0x8874" name="GL_PROGRAM_ERROR_STRING_NV"/> >+ <enum value="0x8875" name="GL_PROGRAM_FORMAT_ASCII_ARB"/> >+ <enum value="0x8876" name="GL_PROGRAM_FORMAT_ARB"/> >+ <unused start="0x8877" vendor="NV" comment="Should have been assigned to PROGRAM_BINDING_ARB"/> >+ <enum value="0x8878" name="GL_WRITE_PIXEL_DATA_RANGE_NV"/> >+ <enum value="0x8879" name="GL_READ_PIXEL_DATA_RANGE_NV"/> >+ <enum value="0x887A" name="GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV"/> >+ <enum value="0x887B" name="GL_READ_PIXEL_DATA_RANGE_LENGTH_NV"/> >+ <enum value="0x887C" name="GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV"/> >+ <enum value="0x887D" name="GL_READ_PIXEL_DATA_RANGE_POINTER_NV"/> >+ <unused start="0x887E" vendor="NV"/> >+ <enum value="0x887F" name="GL_GEOMETRY_SHADER_INVOCATIONS"/> >+ <enum value="0x887F" name="GL_GEOMETRY_SHADER_INVOCATIONS_EXT"/> >+ <enum value="0x887F" name="GL_GEOMETRY_SHADER_INVOCATIONS_OES"/> >+ <enum value="0x8880" name="GL_FLOAT_R_NV"/> >+ <enum value="0x8881" name="GL_FLOAT_RG_NV"/> >+ <enum value="0x8882" name="GL_FLOAT_RGB_NV"/> >+ <enum value="0x8883" name="GL_FLOAT_RGBA_NV"/> >+ <enum value="0x8884" name="GL_FLOAT_R16_NV"/> >+ <enum value="0x8885" name="GL_FLOAT_R32_NV"/> >+ <enum value="0x8886" name="GL_FLOAT_RG16_NV"/> >+ <enum value="0x8887" name="GL_FLOAT_RG32_NV"/> >+ <enum value="0x8888" name="GL_FLOAT_RGB16_NV"/> >+ <enum value="0x8889" name="GL_FLOAT_RGB32_NV"/> >+ <enum value="0x888A" name="GL_FLOAT_RGBA16_NV"/> >+ <enum value="0x888B" name="GL_FLOAT_RGBA32_NV"/> >+ <enum value="0x888C" name="GL_TEXTURE_FLOAT_COMPONENTS_NV"/> >+ <enum value="0x888D" name="GL_FLOAT_CLEAR_COLOR_VALUE_NV"/> >+ <enum value="0x888E" name="GL_FLOAT_RGBA_MODE_NV"/> >+ <enum value="0x888F" name="GL_TEXTURE_UNSIGNED_REMAP_MODE_NV"/> >+ <enum value="0x8890" name="GL_DEPTH_BOUNDS_TEST_EXT"/> >+ <enum value="0x8891" name="GL_DEPTH_BOUNDS_EXT"/> >+ <enum value="0x8892" name="GL_ARRAY_BUFFER"/> >+ <enum value="0x8892" name="GL_ARRAY_BUFFER_ARB"/> >+ <enum value="0x8893" name="GL_ELEMENT_ARRAY_BUFFER"/> >+ <enum value="0x8893" name="GL_ELEMENT_ARRAY_BUFFER_ARB"/> >+ <enum value="0x8894" name="GL_ARRAY_BUFFER_BINDING"/> >+ <enum value="0x8894" name="GL_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum value="0x8895" name="GL_ELEMENT_ARRAY_BUFFER_BINDING"/> >+ <enum value="0x8895" name="GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum value="0x8896" name="GL_VERTEX_ARRAY_BUFFER_BINDING"/> >+ <enum value="0x8896" name="GL_VERTEX_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum value="0x8897" name="GL_NORMAL_ARRAY_BUFFER_BINDING"/> >+ <enum value="0x8897" name="GL_NORMAL_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum value="0x8898" name="GL_COLOR_ARRAY_BUFFER_BINDING"/> >+ <enum value="0x8898" name="GL_COLOR_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum value="0x8899" name="GL_INDEX_ARRAY_BUFFER_BINDING"/> >+ <enum value="0x8899" name="GL_INDEX_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum value="0x889A" name="GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING"/> >+ <enum value="0x889A" name="GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum value="0x889B" name="GL_EDGE_FLAG_ARRAY_BUFFER_BINDING"/> >+ <enum value="0x889B" name="GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum value="0x889C" name="GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING"/> >+ <enum value="0x889C" name="GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum value="0x889D" name="GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum value="0x889D" name="GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING"/> >+ <enum value="0x889D" name="GL_FOG_COORD_ARRAY_BUFFER_BINDING" alias="GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING"/> >+ <enum value="0x889E" name="GL_WEIGHT_ARRAY_BUFFER_BINDING"/> >+ <enum value="0x889E" name="GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum value="0x889E" name="GL_WEIGHT_ARRAY_BUFFER_BINDING_OES"/> >+ <enum value="0x889F" name="GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING"/> >+ <enum value="0x889F" name="GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum value="0x88A0" name="GL_PROGRAM_INSTRUCTIONS_ARB"/> >+ <enum value="0x88A1" name="GL_MAX_PROGRAM_INSTRUCTIONS_ARB"/> >+ <enum value="0x88A2" name="GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB"/> >+ <enum value="0x88A3" name="GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB"/> >+ <enum value="0x88A4" name="GL_PROGRAM_TEMPORARIES_ARB"/> >+ <enum value="0x88A5" name="GL_MAX_PROGRAM_TEMPORARIES_ARB"/> >+ <enum value="0x88A6" name="GL_PROGRAM_NATIVE_TEMPORARIES_ARB"/> >+ <enum value="0x88A7" name="GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB"/> >+ <enum value="0x88A8" name="GL_PROGRAM_PARAMETERS_ARB"/> >+ <enum value="0x88A9" name="GL_MAX_PROGRAM_PARAMETERS_ARB"/> >+ <enum value="0x88AA" name="GL_PROGRAM_NATIVE_PARAMETERS_ARB"/> >+ <enum value="0x88AB" name="GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB"/> >+ <enum value="0x88AC" name="GL_PROGRAM_ATTRIBS_ARB"/> >+ <enum value="0x88AD" name="GL_MAX_PROGRAM_ATTRIBS_ARB"/> >+ <enum value="0x88AE" name="GL_PROGRAM_NATIVE_ATTRIBS_ARB"/> >+ <enum value="0x88AF" name="GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB"/> >+ <enum value="0x88B0" name="GL_PROGRAM_ADDRESS_REGISTERS_ARB"/> >+ <enum value="0x88B1" name="GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB"/> >+ <enum value="0x88B2" name="GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB"/> >+ <enum value="0x88B3" name="GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB"/> >+ <enum value="0x88B4" name="GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB"/> >+ <enum value="0x88B5" name="GL_MAX_PROGRAM_ENV_PARAMETERS_ARB"/> >+ <enum value="0x88B6" name="GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB"/> >+ <enum value="0x88B7" name="GL_TRANSPOSE_CURRENT_MATRIX_ARB"/> >+ <enum value="0x88B8" name="GL_READ_ONLY"/> >+ <enum value="0x88B8" name="GL_READ_ONLY_ARB"/> >+ <enum value="0x88B9" name="GL_WRITE_ONLY"/> >+ <enum value="0x88B9" name="GL_WRITE_ONLY_ARB"/> >+ <enum value="0x88B9" name="GL_WRITE_ONLY_OES"/> >+ <enum value="0x88BA" name="GL_READ_WRITE"/> >+ <enum value="0x88BA" name="GL_READ_WRITE_ARB"/> >+ <enum value="0x88BB" name="GL_BUFFER_ACCESS"/> >+ <enum value="0x88BB" name="GL_BUFFER_ACCESS_ARB"/> >+ <enum value="0x88BB" name="GL_BUFFER_ACCESS_OES"/> >+ <enum value="0x88BC" name="GL_BUFFER_MAPPED"/> >+ <enum value="0x88BC" name="GL_BUFFER_MAPPED_ARB"/> >+ <enum value="0x88BC" name="GL_BUFFER_MAPPED_OES"/> >+ <enum value="0x88BD" name="GL_BUFFER_MAP_POINTER"/> >+ <enum value="0x88BD" name="GL_BUFFER_MAP_POINTER_ARB"/> >+ <enum value="0x88BD" name="GL_BUFFER_MAP_POINTER_OES"/> >+ <enum value="0x88BE" name="GL_WRITE_DISCARD_NV"/> >+ <enum value="0x88BF" name="GL_TIME_ELAPSED"/> >+ <enum value="0x88BF" name="GL_TIME_ELAPSED_EXT"/> >+ <enum value="0x88C0" name="GL_MATRIX0_ARB"/> >+ <enum value="0x88C1" name="GL_MATRIX1_ARB"/> >+ <enum value="0x88C2" name="GL_MATRIX2_ARB"/> >+ <enum value="0x88C3" name="GL_MATRIX3_ARB"/> >+ <enum value="0x88C4" name="GL_MATRIX4_ARB"/> >+ <enum value="0x88C5" name="GL_MATRIX5_ARB"/> >+ <enum value="0x88C6" name="GL_MATRIX6_ARB"/> >+ <enum value="0x88C7" name="GL_MATRIX7_ARB"/> >+ <enum value="0x88C8" name="GL_MATRIX8_ARB"/> >+ <enum value="0x88C9" name="GL_MATRIX9_ARB"/> >+ <enum value="0x88CA" name="GL_MATRIX10_ARB"/> >+ <enum value="0x88CB" name="GL_MATRIX11_ARB"/> >+ <enum value="0x88CC" name="GL_MATRIX12_ARB"/> >+ <enum value="0x88CD" name="GL_MATRIX13_ARB"/> >+ <enum value="0x88CE" name="GL_MATRIX14_ARB"/> >+ <enum value="0x88CF" name="GL_MATRIX15_ARB"/> >+ <enum value="0x88D0" name="GL_MATRIX16_ARB"/> >+ <enum value="0x88D1" name="GL_MATRIX17_ARB"/> >+ <enum value="0x88D2" name="GL_MATRIX18_ARB"/> >+ <enum value="0x88D3" name="GL_MATRIX19_ARB"/> >+ <enum value="0x88D4" name="GL_MATRIX20_ARB"/> >+ <enum value="0x88D5" name="GL_MATRIX21_ARB"/> >+ <enum value="0x88D6" name="GL_MATRIX22_ARB"/> >+ <enum value="0x88D7" name="GL_MATRIX23_ARB"/> >+ <enum value="0x88D8" name="GL_MATRIX24_ARB"/> >+ <enum value="0x88D9" name="GL_MATRIX25_ARB"/> >+ <enum value="0x88DA" name="GL_MATRIX26_ARB"/> >+ <enum value="0x88DB" name="GL_MATRIX27_ARB"/> >+ <enum value="0x88DC" name="GL_MATRIX28_ARB"/> >+ <enum value="0x88DD" name="GL_MATRIX29_ARB"/> >+ <enum value="0x88DE" name="GL_MATRIX30_ARB"/> >+ <enum value="0x88DF" name="GL_MATRIX31_ARB"/> >+ <enum value="0x88E0" name="GL_STREAM_DRAW"/> >+ <enum value="0x88E0" name="GL_STREAM_DRAW_ARB"/> >+ <enum value="0x88E1" name="GL_STREAM_READ"/> >+ <enum value="0x88E1" name="GL_STREAM_READ_ARB"/> >+ <enum value="0x88E2" name="GL_STREAM_COPY"/> >+ <enum value="0x88E2" name="GL_STREAM_COPY_ARB"/> >+ <unused start="0x88E3" vendor="NV" comment="To extend ARB_vbo"/> >+ <enum value="0x88E4" name="GL_STATIC_DRAW"/> >+ <enum value="0x88E4" name="GL_STATIC_DRAW_ARB"/> >+ <enum value="0x88E5" name="GL_STATIC_READ"/> >+ <enum value="0x88E5" name="GL_STATIC_READ_ARB"/> >+ <enum value="0x88E6" name="GL_STATIC_COPY"/> >+ <enum value="0x88E6" name="GL_STATIC_COPY_ARB"/> >+ <unused start="0x88E7" vendor="NV" comment="To extend ARB_vbo"/> >+ <enum value="0x88E8" name="GL_DYNAMIC_DRAW"/> >+ <enum value="0x88E8" name="GL_DYNAMIC_DRAW_ARB"/> >+ <enum value="0x88E9" name="GL_DYNAMIC_READ"/> >+ <enum value="0x88E9" name="GL_DYNAMIC_READ_ARB"/> >+ <enum value="0x88EA" name="GL_DYNAMIC_COPY"/> >+ <enum value="0x88EA" name="GL_DYNAMIC_COPY_ARB"/> >+ <enum value="0x88EB" name="GL_PIXEL_PACK_BUFFER"/> >+ <enum value="0x88EB" name="GL_PIXEL_PACK_BUFFER_ARB"/> >+ <enum value="0x88EB" name="GL_PIXEL_PACK_BUFFER_EXT"/> >+ <enum value="0x88EB" name="GL_PIXEL_PACK_BUFFER_NV"/> >+ <enum value="0x88EC" name="GL_PIXEL_UNPACK_BUFFER"/> >+ <enum value="0x88EC" name="GL_PIXEL_UNPACK_BUFFER_ARB"/> >+ <enum value="0x88EC" name="GL_PIXEL_UNPACK_BUFFER_EXT"/> >+ <enum value="0x88EC" name="GL_PIXEL_UNPACK_BUFFER_NV"/> >+ <enum value="0x88ED" name="GL_PIXEL_PACK_BUFFER_BINDING"/> >+ <enum value="0x88ED" name="GL_PIXEL_PACK_BUFFER_BINDING_ARB"/> >+ <enum value="0x88ED" name="GL_PIXEL_PACK_BUFFER_BINDING_EXT"/> >+ <enum value="0x88ED" name="GL_PIXEL_PACK_BUFFER_BINDING_NV"/> >+ <enum value="0x88EE" name="GL_ETC1_SRGB8_NV"/> >+ <enum value="0x88EF" name="GL_PIXEL_UNPACK_BUFFER_BINDING"/> >+ <enum value="0x88EF" name="GL_PIXEL_UNPACK_BUFFER_BINDING_ARB"/> >+ <enum value="0x88EF" name="GL_PIXEL_UNPACK_BUFFER_BINDING_EXT"/> >+ <enum value="0x88EF" name="GL_PIXEL_UNPACK_BUFFER_BINDING_NV"/> >+ <enum value="0x88F0" name="GL_DEPTH24_STENCIL8"/> >+ <enum value="0x88F0" name="GL_DEPTH24_STENCIL8_EXT"/> >+ <enum value="0x88F0" name="GL_DEPTH24_STENCIL8_OES"/> >+ <enum value="0x88F1" name="GL_TEXTURE_STENCIL_SIZE"/> >+ <enum value="0x88F1" name="GL_TEXTURE_STENCIL_SIZE_EXT"/> >+ <enum value="0x88F2" name="GL_STENCIL_TAG_BITS_EXT"/> >+ <enum value="0x88F3" name="GL_STENCIL_CLEAR_TAG_VALUE_EXT"/> >+ <enum value="0x88F4" name="GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV"/> >+ <enum value="0x88F5" name="GL_MAX_PROGRAM_CALL_DEPTH_NV"/> >+ <enum value="0x88F6" name="GL_MAX_PROGRAM_IF_DEPTH_NV"/> >+ <enum value="0x88F7" name="GL_MAX_PROGRAM_LOOP_DEPTH_NV"/> >+ <enum value="0x88F8" name="GL_MAX_PROGRAM_LOOP_COUNT_NV"/> >+ <enum value="0x88F9" name="GL_SRC1_COLOR"/> >+ <enum value="0x88F9" name="GL_SRC1_COLOR_EXT"/> >+ <enum value="0x88FA" name="GL_ONE_MINUS_SRC1_COLOR"/> >+ <enum value="0x88FA" name="GL_ONE_MINUS_SRC1_COLOR_EXT"/> >+ <enum value="0x88FB" name="GL_ONE_MINUS_SRC1_ALPHA"/> >+ <enum value="0x88FB" name="GL_ONE_MINUS_SRC1_ALPHA_EXT"/> >+ <enum value="0x88FC" name="GL_MAX_DUAL_SOURCE_DRAW_BUFFERS"/> >+ <enum value="0x88FC" name="GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT"/> >+ <enum value="0x88FD" name="GL_VERTEX_ATTRIB_ARRAY_INTEGER"/> >+ <enum value="0x88FD" name="GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT"/> >+ <enum value="0x88FD" name="GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV"/> >+ <enum value="0x88FE" name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR"/> >+ <enum value="0x88FE" name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE"/> >+ <enum value="0x88FE" name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB"/> >+ <enum value="0x88FE" name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT"/> >+ <enum value="0x88FE" name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV"/> >+ <enum value="0x88FF" name="GL_MAX_ARRAY_TEXTURE_LAYERS"/> >+ <enum value="0x88FF" name="GL_MAX_ARRAY_TEXTURE_LAYERS_EXT"/> >+ <enum value="0x8904" name="GL_MIN_PROGRAM_TEXEL_OFFSET"/> >+ <enum value="0x8904" name="GL_MIN_PROGRAM_TEXEL_OFFSET_EXT"/> >+ <enum value="0x8904" name="GL_MIN_PROGRAM_TEXEL_OFFSET_NV"/> >+ <enum value="0x8905" name="GL_MAX_PROGRAM_TEXEL_OFFSET"/> >+ <enum value="0x8905" name="GL_MAX_PROGRAM_TEXEL_OFFSET_EXT"/> >+ <enum value="0x8905" name="GL_MAX_PROGRAM_TEXEL_OFFSET_NV"/> >+ <enum value="0x8906" name="GL_PROGRAM_ATTRIB_COMPONENTS_NV"/> >+ <enum value="0x8907" name="GL_PROGRAM_RESULT_COMPONENTS_NV"/> >+ <enum value="0x8908" name="GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV"/> >+ <enum value="0x8909" name="GL_MAX_PROGRAM_RESULT_COMPONENTS_NV"/> >+ <enum value="0x8910" name="GL_STENCIL_TEST_TWO_SIDE_EXT"/> >+ <enum value="0x8911" name="GL_ACTIVE_STENCIL_FACE_EXT"/> >+ <enum value="0x8912" name="GL_MIRROR_CLAMP_TO_BORDER_EXT"/> >+ <unused start="0x8913" vendor="NV"/> >+ <enum value="0x8914" name="GL_SAMPLES_PASSED"/> >+ <enum value="0x8914" name="GL_SAMPLES_PASSED_ARB"/> >+ <unused start="0x8915" vendor="NV"/> >+ <enum value="0x8916" name="GL_GEOMETRY_VERTICES_OUT"/> >+ <enum value="0x8916" name="GL_GEOMETRY_LINKED_VERTICES_OUT_EXT"/> >+ <enum value="0x8916" name="GL_GEOMETRY_LINKED_VERTICES_OUT_OES"/> >+ <enum value="0x8917" name="GL_GEOMETRY_INPUT_TYPE"/> >+ <enum value="0x8917" name="GL_GEOMETRY_LINKED_INPUT_TYPE_EXT"/> >+ <enum value="0x8917" name="GL_GEOMETRY_LINKED_INPUT_TYPE_OES"/> >+ <enum value="0x8918" name="GL_GEOMETRY_OUTPUT_TYPE"/> >+ <enum value="0x8918" name="GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT"/> >+ <enum value="0x8918" name="GL_GEOMETRY_LINKED_OUTPUT_TYPE_OES"/> >+ <enum value="0x8919" name="GL_SAMPLER_BINDING"/> >+ <enum value="0x891A" name="GL_CLAMP_VERTEX_COLOR"/> >+ <enum value="0x891A" name="GL_CLAMP_VERTEX_COLOR_ARB"/> >+ <enum value="0x891B" name="GL_CLAMP_FRAGMENT_COLOR"/> >+ <enum value="0x891B" name="GL_CLAMP_FRAGMENT_COLOR_ARB"/> >+ <enum value="0x891C" name="GL_CLAMP_READ_COLOR"/> >+ <enum value="0x891C" name="GL_CLAMP_READ_COLOR_ARB"/> >+ <enum value="0x891D" name="GL_FIXED_ONLY"/> >+ <enum value="0x891D" name="GL_FIXED_ONLY_ARB"/> >+ <enum value="0x891E" name="GL_TESS_CONTROL_PROGRAM_NV"/> >+ <enum value="0x891F" name="GL_TESS_EVALUATION_PROGRAM_NV"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8920" end="0x897F" vendor="AMD"> >+ <enum value="0x8920" name="GL_FRAGMENT_SHADER_ATI"/> >+ <enum value="0x8921" name="GL_REG_0_ATI"/> >+ <enum value="0x8922" name="GL_REG_1_ATI"/> >+ <enum value="0x8923" name="GL_REG_2_ATI"/> >+ <enum value="0x8924" name="GL_REG_3_ATI"/> >+ <enum value="0x8925" name="GL_REG_4_ATI"/> >+ <enum value="0x8926" name="GL_REG_5_ATI"/> >+ <enum value="0x8927" name="GL_REG_6_ATI"/> >+ <enum value="0x8928" name="GL_REG_7_ATI"/> >+ <enum value="0x8929" name="GL_REG_8_ATI"/> >+ <enum value="0x892A" name="GL_REG_9_ATI"/> >+ <enum value="0x892B" name="GL_REG_10_ATI"/> >+ <enum value="0x892C" name="GL_REG_11_ATI"/> >+ <enum value="0x892D" name="GL_REG_12_ATI"/> >+ <enum value="0x892E" name="GL_REG_13_ATI"/> >+ <enum value="0x892F" name="GL_REG_14_ATI"/> >+ <enum value="0x8930" name="GL_REG_15_ATI"/> >+ <enum value="0x8931" name="GL_REG_16_ATI"/> >+ <enum value="0x8932" name="GL_REG_17_ATI"/> >+ <enum value="0x8933" name="GL_REG_18_ATI"/> >+ <enum value="0x8934" name="GL_REG_19_ATI"/> >+ <enum value="0x8935" name="GL_REG_20_ATI"/> >+ <enum value="0x8936" name="GL_REG_21_ATI"/> >+ <enum value="0x8937" name="GL_REG_22_ATI"/> >+ <enum value="0x8938" name="GL_REG_23_ATI"/> >+ <enum value="0x8939" name="GL_REG_24_ATI"/> >+ <enum value="0x893A" name="GL_REG_25_ATI"/> >+ <enum value="0x893B" name="GL_REG_26_ATI"/> >+ <enum value="0x893C" name="GL_REG_27_ATI"/> >+ <enum value="0x893D" name="GL_REG_28_ATI"/> >+ <enum value="0x893E" name="GL_REG_29_ATI"/> >+ <enum value="0x893F" name="GL_REG_30_ATI"/> >+ <enum value="0x8940" name="GL_REG_31_ATI"/> >+ <enum value="0x8941" name="GL_CON_0_ATI"/> >+ <enum value="0x8942" name="GL_CON_1_ATI"/> >+ <enum value="0x8943" name="GL_CON_2_ATI"/> >+ <enum value="0x8944" name="GL_CON_3_ATI"/> >+ <enum value="0x8945" name="GL_CON_4_ATI"/> >+ <enum value="0x8946" name="GL_CON_5_ATI"/> >+ <enum value="0x8947" name="GL_CON_6_ATI"/> >+ <enum value="0x8948" name="GL_CON_7_ATI"/> >+ <enum value="0x8949" name="GL_CON_8_ATI"/> >+ <enum value="0x894A" name="GL_CON_9_ATI"/> >+ <enum value="0x894B" name="GL_CON_10_ATI"/> >+ <enum value="0x894C" name="GL_CON_11_ATI"/> >+ <enum value="0x894D" name="GL_CON_12_ATI"/> >+ <enum value="0x894E" name="GL_CON_13_ATI"/> >+ <enum value="0x894F" name="GL_CON_14_ATI"/> >+ <enum value="0x8950" name="GL_CON_15_ATI"/> >+ <enum value="0x8951" name="GL_CON_16_ATI"/> >+ <enum value="0x8952" name="GL_CON_17_ATI"/> >+ <enum value="0x8953" name="GL_CON_18_ATI"/> >+ <enum value="0x8954" name="GL_CON_19_ATI"/> >+ <enum value="0x8955" name="GL_CON_20_ATI"/> >+ <enum value="0x8956" name="GL_CON_21_ATI"/> >+ <enum value="0x8957" name="GL_CON_22_ATI"/> >+ <enum value="0x8958" name="GL_CON_23_ATI"/> >+ <enum value="0x8959" name="GL_CON_24_ATI"/> >+ <enum value="0x895A" name="GL_CON_25_ATI"/> >+ <enum value="0x895B" name="GL_CON_26_ATI"/> >+ <enum value="0x895C" name="GL_CON_27_ATI"/> >+ <enum value="0x895D" name="GL_CON_28_ATI"/> >+ <enum value="0x895E" name="GL_CON_29_ATI"/> >+ <enum value="0x895F" name="GL_CON_30_ATI"/> >+ <enum value="0x8960" name="GL_CON_31_ATI"/> >+ <enum value="0x8961" name="GL_MOV_ATI"/> >+ <enum value="0x8963" name="GL_ADD_ATI"/> >+ <enum value="0x8964" name="GL_MUL_ATI"/> >+ <enum value="0x8965" name="GL_SUB_ATI"/> >+ <enum value="0x8966" name="GL_DOT3_ATI"/> >+ <enum value="0x8967" name="GL_DOT4_ATI"/> >+ <enum value="0x8968" name="GL_MAD_ATI"/> >+ <enum value="0x8969" name="GL_LERP_ATI"/> >+ <enum value="0x896A" name="GL_CND_ATI"/> >+ <enum value="0x896B" name="GL_CND0_ATI"/> >+ <enum value="0x896C" name="GL_DOT2_ADD_ATI"/> >+ <enum value="0x896D" name="GL_SECONDARY_INTERPOLATOR_ATI"/> >+ <enum value="0x896E" name="GL_NUM_FRAGMENT_REGISTERS_ATI"/> >+ <enum value="0x896F" name="GL_NUM_FRAGMENT_CONSTANTS_ATI"/> >+ <enum value="0x8970" name="GL_NUM_PASSES_ATI"/> >+ <enum value="0x8971" name="GL_NUM_INSTRUCTIONS_PER_PASS_ATI"/> >+ <enum value="0x8972" name="GL_NUM_INSTRUCTIONS_TOTAL_ATI"/> >+ <enum value="0x8973" name="GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI"/> >+ <enum value="0x8974" name="GL_NUM_LOOPBACK_COMPONENTS_ATI"/> >+ <enum value="0x8975" name="GL_COLOR_ALPHA_PAIRING_ATI"/> >+ <enum value="0x8976" name="GL_SWIZZLE_STR_ATI"/> >+ <enum value="0x8977" name="GL_SWIZZLE_STQ_ATI"/> >+ <enum value="0x8978" name="GL_SWIZZLE_STR_DR_ATI"/> >+ <enum value="0x8979" name="GL_SWIZZLE_STQ_DQ_ATI"/> >+ <enum value="0x897A" name="GL_SWIZZLE_STRQ_ATI"/> >+ <enum value="0x897B" name="GL_SWIZZLE_STRQ_DQ_ATI"/> >+ <unused start="0x897C" end="0x897F" vendor="AMD"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8980" end="0x898F" vendor="OML"> >+ <enum value="0x8980" name="GL_INTERLACE_OML"/> >+ <enum value="0x8981" name="GL_INTERLACE_READ_OML"/> >+ <enum value="0x8982" name="GL_FORMAT_SUBSAMPLE_24_24_OML"/> >+ <enum value="0x8983" name="GL_FORMAT_SUBSAMPLE_244_244_OML"/> >+ <enum value="0x8984" name="GL_PACK_RESAMPLE_OML"/> >+ <enum value="0x8985" name="GL_UNPACK_RESAMPLE_OML"/> >+ <enum value="0x8986" name="GL_RESAMPLE_REPLICATE_OML"/> >+ <enum value="0x8987" name="GL_RESAMPLE_ZERO_FILL_OML"/> >+ <enum value="0x8988" name="GL_RESAMPLE_AVERAGE_OML"/> >+ <enum value="0x8989" name="GL_RESAMPLE_DECIMATE_OML"/> >+ <enum value="0x898A" name="GL_POINT_SIZE_ARRAY_TYPE_OES"/> >+ <enum value="0x898B" name="GL_POINT_SIZE_ARRAY_STRIDE_OES"/> >+ <enum value="0x898C" name="GL_POINT_SIZE_ARRAY_POINTER_OES"/> >+ <enum value="0x898D" name="GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES"/> >+ <enum value="0x898E" name="GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES"/> >+ <enum value="0x898F" name="GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8990" end="0x899F" vendor="ZiiLabs"> >+ <unused start="0x8990" end="0x899F" vendor="ZiiLabs"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x89A0" end="0x89FF" vendor="Matrox"> >+ <unused start="0x89A0" end="0x89FF" vendor="Matrox"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8A00" end="0x8A7F" vendor="APPLE"> >+ <enum value="0x8A00" name="GL_VERTEX_ATTRIB_MAP1_APPLE"/> >+ <enum value="0x8A01" name="GL_VERTEX_ATTRIB_MAP2_APPLE"/> >+ <enum value="0x8A02" name="GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE"/> >+ <enum value="0x8A03" name="GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE"/> >+ <enum value="0x8A04" name="GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE"/> >+ <enum value="0x8A05" name="GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE"/> >+ <enum value="0x8A06" name="GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE"/> >+ <enum value="0x8A07" name="GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE"/> >+ <enum value="0x8A08" name="GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE"/> >+ <enum value="0x8A09" name="GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE"/> >+ <enum value="0x8A0A" name="GL_DRAW_PIXELS_APPLE"/> >+ <enum value="0x8A0B" name="GL_FENCE_APPLE"/> >+ <enum value="0x8A0C" name="GL_ELEMENT_ARRAY_APPLE"/> >+ <enum value="0x8A0D" name="GL_ELEMENT_ARRAY_TYPE_APPLE"/> >+ <enum value="0x8A0E" name="GL_ELEMENT_ARRAY_POINTER_APPLE"/> >+ <enum value="0x8A0F" name="GL_COLOR_FLOAT_APPLE"/> >+ <unused start="0x8A10" vendor="APPLE" comment="Unknown extension (Khronos bug 632)"/> >+ <!-- <enum value="0x8A10" name="GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE"/> --> >+ <enum value="0x8A11" name="GL_UNIFORM_BUFFER"/> >+ <enum value="0x8A12" name="GL_BUFFER_SERIALIZED_MODIFY_APPLE"/> >+ <enum value="0x8A13" name="GL_BUFFER_FLUSHING_UNMAP_APPLE"/> >+ <enum value="0x8A14" name="GL_AUX_DEPTH_STENCIL_APPLE"/> >+ <enum value="0x8A15" name="GL_PACK_ROW_BYTES_APPLE"/> >+ <enum value="0x8A16" name="GL_UNPACK_ROW_BYTES_APPLE"/> >+ <unused start="0x8A17" end="0x8A18" vendor="APPLE"/> >+ <enum value="0x8A19" name="GL_RELEASED_APPLE"/> >+ <enum value="0x8A1A" name="GL_VOLATILE_APPLE"/> >+ <enum value="0x8A1B" name="GL_RETAINED_APPLE"/> >+ <enum value="0x8A1C" name="GL_UNDEFINED_APPLE"/> >+ <enum value="0x8A1D" name="GL_PURGEABLE_APPLE"/> >+ <unused start="0x8A1E" vendor="APPLE"/> >+ <enum value="0x8A1F" name="GL_RGB_422_APPLE"/> >+ <unused start="0x8A20" end="0x8A27" vendor="APPLE"/> >+ <enum value="0x8A28" name="GL_UNIFORM_BUFFER_BINDING"/> >+ <enum value="0x8A29" name="GL_UNIFORM_BUFFER_START"/> >+ <enum value="0x8A2A" name="GL_UNIFORM_BUFFER_SIZE"/> >+ <enum value="0x8A2B" name="GL_MAX_VERTEX_UNIFORM_BLOCKS"/> >+ <enum value="0x8A2C" name="GL_MAX_GEOMETRY_UNIFORM_BLOCKS"/> >+ <enum value="0x8A2C" name="GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT"/> >+ <enum value="0x8A2C" name="GL_MAX_GEOMETRY_UNIFORM_BLOCKS_OES"/> >+ <enum value="0x8A2D" name="GL_MAX_FRAGMENT_UNIFORM_BLOCKS"/> >+ <enum value="0x8A2E" name="GL_MAX_COMBINED_UNIFORM_BLOCKS"/> >+ <enum value="0x8A2F" name="GL_MAX_UNIFORM_BUFFER_BINDINGS"/> >+ <enum value="0x8A30" name="GL_MAX_UNIFORM_BLOCK_SIZE"/> >+ <enum value="0x8A31" name="GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS"/> >+ <enum value="0x8A32" name="GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS"/> >+ <enum value="0x8A32" name="GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT"/> >+ <enum value="0x8A32" name="GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_OES"/> >+ <enum value="0x8A33" name="GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS"/> >+ <enum value="0x8A34" name="GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT"/> >+ <enum value="0x8A35" name="GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH"/> >+ <enum value="0x8A36" name="GL_ACTIVE_UNIFORM_BLOCKS"/> >+ <enum value="0x8A37" name="GL_UNIFORM_TYPE"/> >+ <enum value="0x8A38" name="GL_UNIFORM_SIZE"/> >+ <enum value="0x8A39" name="GL_UNIFORM_NAME_LENGTH"/> >+ <enum value="0x8A3A" name="GL_UNIFORM_BLOCK_INDEX"/> >+ <enum value="0x8A3B" name="GL_UNIFORM_OFFSET"/> >+ <enum value="0x8A3C" name="GL_UNIFORM_ARRAY_STRIDE"/> >+ <enum value="0x8A3D" name="GL_UNIFORM_MATRIX_STRIDE"/> >+ <enum value="0x8A3E" name="GL_UNIFORM_IS_ROW_MAJOR"/> >+ <enum value="0x8A3F" name="GL_UNIFORM_BLOCK_BINDING"/> >+ <enum value="0x8A40" name="GL_UNIFORM_BLOCK_DATA_SIZE"/> >+ <enum value="0x8A41" name="GL_UNIFORM_BLOCK_NAME_LENGTH"/> >+ <enum value="0x8A42" name="GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS"/> >+ <enum value="0x8A43" name="GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES"/> >+ <enum value="0x8A44" name="GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER"/> >+ <enum value="0x8A45" name="GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER"/> >+ <enum value="0x8A46" name="GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER"/> >+ <unused start="0x8A47" vendor="APPLE"/> >+ <enum value="0x8A48" name="GL_TEXTURE_SRGB_DECODE_EXT"/> >+ <enum value="0x8A49" name="GL_DECODE_EXT"/> >+ <enum value="0x8A4A" name="GL_SKIP_DECODE_EXT"/> >+ <unused start="0x8A4B" end="0x8A4E" vendor="APPLE"/> >+ <enum value="0x8A4F" name="GL_PROGRAM_PIPELINE_OBJECT_EXT"/> >+ <unused start="0x8A50" vendor="APPLE"/> >+ <enum value="0x8A51" name="GL_RGB_RAW_422_APPLE"/> >+ <enum value="0x8A52" name="GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT"/> >+ <enum value="0x8A53" name="GL_SYNC_OBJECT_APPLE"/> >+ <enum value="0x8A54" name="GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT"/> >+ <enum value="0x8A55" name="GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT"/> >+ <enum value="0x8A56" name="GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT"/> >+ <enum value="0x8A57" name="GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT"/> >+ <unused start="0x8A58" end="0x8A7F" vendor="APPLE"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8A80" end="0x8AEF" vendor="Matrox"> >+ <unused start="0x8A80" end="0x8AEF" vendor="Matrox"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8AF0" end="0x8B2F" vendor="Chromium" comment="For Brian Paul"> >+ <unused start="0x8AF0" end="0x8B2F" vendor="Chromium"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8B30" end="0x8B3F" group="ShaderType" vendor="ARB"> >+ <enum value="0x8B30" name="GL_FRAGMENT_SHADER"/> >+ <enum value="0x8B30" name="GL_FRAGMENT_SHADER_ARB"/> >+ <enum value="0x8B31" name="GL_VERTEX_SHADER"/> >+ <enum value="0x8B31" name="GL_VERTEX_SHADER_ARB"/> >+ <unused start="0x8B32" end="0x8B3F" comment="For shader types"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8B40" end="0x8B47" group="ContainerType" vendor="ARB"> >+ <enum value="0x8B40" name="GL_PROGRAM_OBJECT_ARB"/> >+ <enum value="0x8B40" name="GL_PROGRAM_OBJECT_EXT"/> >+ <unused start="0x8B41" end="0x8B47" comment="For container types"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8B48" end="0x8B4F" vendor="ARB"> >+ <enum value="0x8B48" name="GL_SHADER_OBJECT_ARB"/> >+ <enum value="0x8B48" name="GL_SHADER_OBJECT_EXT"/> >+ <enum value="0x8B49" name="GL_MAX_FRAGMENT_UNIFORM_COMPONENTS"/> >+ <enum value="0x8B49" name="GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB"/> >+ <enum value="0x8B4A" name="GL_MAX_VERTEX_UNIFORM_COMPONENTS"/> >+ <enum value="0x8B4A" name="GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB"/> >+ <enum value="0x8B4B" name="GL_MAX_VARYING_FLOATS"/> >+ <enum value="0x8B4B" name="GL_MAX_VARYING_COMPONENTS" alias="MAX_VARYING_FLOATS"/> >+ <enum value="0x8B4B" name="GL_MAX_VARYING_COMPONENTS_EXT"/> >+ <enum value="0x8B4B" name="GL_MAX_VARYING_FLOATS_ARB"/> >+ <enum value="0x8B4C" name="GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS"/> >+ <enum value="0x8B4C" name="GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB"/> >+ <enum value="0x8B4D" name="GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS"/> >+ <enum value="0x8B4D" name="GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB"/> >+ <enum value="0x8B4E" name="GL_OBJECT_TYPE_ARB"/> >+ <enum value="0x8B4F" name="GL_SHADER_TYPE"/> >+ <enum value="0x8B4F" name="GL_OBJECT_SUBTYPE_ARB"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8B50" end="0x8B7F" group="AttributeType" vendor="ARB"> >+ <enum value="0x8B50" name="GL_FLOAT_VEC2"/> >+ <enum value="0x8B50" name="GL_FLOAT_VEC2_ARB"/> >+ <enum value="0x8B51" name="GL_FLOAT_VEC3"/> >+ <enum value="0x8B51" name="GL_FLOAT_VEC3_ARB"/> >+ <enum value="0x8B52" name="GL_FLOAT_VEC4"/> >+ <enum value="0x8B52" name="GL_FLOAT_VEC4_ARB"/> >+ <enum value="0x8B53" name="GL_INT_VEC2"/> >+ <enum value="0x8B53" name="GL_INT_VEC2_ARB"/> >+ <enum value="0x8B54" name="GL_INT_VEC3"/> >+ <enum value="0x8B54" name="GL_INT_VEC3_ARB"/> >+ <enum value="0x8B55" name="GL_INT_VEC4"/> >+ <enum value="0x8B55" name="GL_INT_VEC4_ARB"/> >+ <enum value="0x8B56" name="GL_BOOL"/> >+ <enum value="0x8B56" name="GL_BOOL_ARB"/> >+ <enum value="0x8B57" name="GL_BOOL_VEC2"/> >+ <enum value="0x8B57" name="GL_BOOL_VEC2_ARB"/> >+ <enum value="0x8B58" name="GL_BOOL_VEC3"/> >+ <enum value="0x8B58" name="GL_BOOL_VEC3_ARB"/> >+ <enum value="0x8B59" name="GL_BOOL_VEC4"/> >+ <enum value="0x8B59" name="GL_BOOL_VEC4_ARB"/> >+ <enum value="0x8B5A" name="GL_FLOAT_MAT2"/> >+ <enum value="0x8B5A" name="GL_FLOAT_MAT2_ARB"/> >+ <enum value="0x8B5B" name="GL_FLOAT_MAT3"/> >+ <enum value="0x8B5B" name="GL_FLOAT_MAT3_ARB"/> >+ <enum value="0x8B5C" name="GL_FLOAT_MAT4"/> >+ <enum value="0x8B5C" name="GL_FLOAT_MAT4_ARB"/> >+ <enum value="0x8B5D" name="GL_SAMPLER_1D"/> >+ <enum value="0x8B5D" name="GL_SAMPLER_1D_ARB"/> >+ <enum value="0x8B5E" name="GL_SAMPLER_2D"/> >+ <enum value="0x8B5E" name="GL_SAMPLER_2D_ARB"/> >+ <enum value="0x8B5F" name="GL_SAMPLER_3D"/> >+ <enum value="0x8B5F" name="GL_SAMPLER_3D_ARB"/> >+ <enum value="0x8B5F" name="GL_SAMPLER_3D_OES"/> >+ <enum value="0x8B60" name="GL_SAMPLER_CUBE"/> >+ <enum value="0x8B60" name="GL_SAMPLER_CUBE_ARB"/> >+ <enum value="0x8B61" name="GL_SAMPLER_1D_SHADOW"/> >+ <enum value="0x8B61" name="GL_SAMPLER_1D_SHADOW_ARB"/> >+ <enum value="0x8B62" name="GL_SAMPLER_2D_SHADOW"/> >+ <enum value="0x8B62" name="GL_SAMPLER_2D_SHADOW_ARB"/> >+ <enum value="0x8B62" name="GL_SAMPLER_2D_SHADOW_EXT"/> >+ <enum value="0x8B63" name="GL_SAMPLER_2D_RECT"/> >+ <enum value="0x8B63" name="GL_SAMPLER_2D_RECT_ARB"/> >+ <enum value="0x8B64" name="GL_SAMPLER_2D_RECT_SHADOW"/> >+ <enum value="0x8B64" name="GL_SAMPLER_2D_RECT_SHADOW_ARB"/> >+ <enum value="0x8B65" name="GL_FLOAT_MAT2x3"/> >+ <enum value="0x8B65" name="GL_FLOAT_MAT2x3_NV"/> >+ <enum value="0x8B66" name="GL_FLOAT_MAT2x4"/> >+ <enum value="0x8B66" name="GL_FLOAT_MAT2x4_NV"/> >+ <enum value="0x8B67" name="GL_FLOAT_MAT3x2"/> >+ <enum value="0x8B67" name="GL_FLOAT_MAT3x2_NV"/> >+ <enum value="0x8B68" name="GL_FLOAT_MAT3x4"/> >+ <enum value="0x8B68" name="GL_FLOAT_MAT3x4_NV"/> >+ <enum value="0x8B69" name="GL_FLOAT_MAT4x2"/> >+ <enum value="0x8B69" name="GL_FLOAT_MAT4x2_NV"/> >+ <enum value="0x8B6A" name="GL_FLOAT_MAT4x3"/> >+ <enum value="0x8B6A" name="GL_FLOAT_MAT4x3_NV"/> >+ <unused start="0x8B6B" end="0x8B7F" comment="For attribute types"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8B80" end="0x8B8F" vendor="ARB"> >+ <enum value="0x8B80" name="GL_DELETE_STATUS"/> >+ <enum value="0x8B80" name="GL_OBJECT_DELETE_STATUS_ARB"/> >+ <enum value="0x8B81" name="GL_COMPILE_STATUS"/> >+ <enum value="0x8B81" name="GL_OBJECT_COMPILE_STATUS_ARB"/> >+ <enum value="0x8B82" name="GL_LINK_STATUS"/> >+ <enum value="0x8B82" name="GL_OBJECT_LINK_STATUS_ARB"/> >+ <enum value="0x8B83" name="GL_VALIDATE_STATUS"/> >+ <enum value="0x8B83" name="GL_OBJECT_VALIDATE_STATUS_ARB"/> >+ <enum value="0x8B84" name="GL_INFO_LOG_LENGTH"/> >+ <enum value="0x8B84" name="GL_OBJECT_INFO_LOG_LENGTH_ARB"/> >+ <enum value="0x8B85" name="GL_ATTACHED_SHADERS"/> >+ <enum value="0x8B85" name="GL_OBJECT_ATTACHED_OBJECTS_ARB"/> >+ <enum value="0x8B86" name="GL_ACTIVE_UNIFORMS"/> >+ <enum value="0x8B86" name="GL_OBJECT_ACTIVE_UNIFORMS_ARB"/> >+ <enum value="0x8B87" name="GL_ACTIVE_UNIFORM_MAX_LENGTH"/> >+ <enum value="0x8B87" name="GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB"/> >+ <enum value="0x8B88" name="GL_SHADER_SOURCE_LENGTH"/> >+ <enum value="0x8B88" name="GL_OBJECT_SHADER_SOURCE_LENGTH_ARB"/> >+ <enum value="0x8B89" name="GL_ACTIVE_ATTRIBUTES"/> >+ <enum value="0x8B89" name="GL_OBJECT_ACTIVE_ATTRIBUTES_ARB"/> >+ <enum value="0x8B8A" name="GL_ACTIVE_ATTRIBUTE_MAX_LENGTH"/> >+ <enum value="0x8B8A" name="GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB"/> >+ <enum value="0x8B8B" name="GL_FRAGMENT_SHADER_DERIVATIVE_HINT"/> >+ <enum value="0x8B8B" name="GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB"/> >+ <enum value="0x8B8B" name="GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES"/> >+ <enum value="0x8B8C" name="GL_SHADING_LANGUAGE_VERSION"/> >+ <enum value="0x8B8C" name="GL_SHADING_LANGUAGE_VERSION_ARB"/> >+ <enum value="0x8B8D" name="GL_CURRENT_PROGRAM"/> >+ <enum value="0x8B8D" api="gl" name="GL_ACTIVE_PROGRAM_EXT" alias="GL_CURRENT_PROGRAM" comment="For the OpenGL version of EXT_separate_shader_objects"/> >+ <unused start="0x8B8E" end="0x8B8F" vendor="ARB"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8B90" end="0x8B9F" vendor="OES"> >+ <enum value="0x8B90" name="GL_PALETTE4_RGB8_OES"/> >+ <enum value="0x8B91" name="GL_PALETTE4_RGBA8_OES"/> >+ <enum value="0x8B92" name="GL_PALETTE4_R5_G6_B5_OES"/> >+ <enum value="0x8B93" name="GL_PALETTE4_RGBA4_OES"/> >+ <enum value="0x8B94" name="GL_PALETTE4_RGB5_A1_OES"/> >+ <enum value="0x8B95" name="GL_PALETTE8_RGB8_OES"/> >+ <enum value="0x8B96" name="GL_PALETTE8_RGBA8_OES"/> >+ <enum value="0x8B97" name="GL_PALETTE8_R5_G6_B5_OES"/> >+ <enum value="0x8B98" name="GL_PALETTE8_RGBA4_OES"/> >+ <enum value="0x8B99" name="GL_PALETTE8_RGB5_A1_OES"/> >+ <enum value="0x8B9A" name="GL_IMPLEMENTATION_COLOR_READ_TYPE"/> >+ <enum value="0x8B9A" name="GL_IMPLEMENTATION_COLOR_READ_TYPE_OES"/> >+ <enum value="0x8B9B" name="GL_IMPLEMENTATION_COLOR_READ_FORMAT"/> >+ <enum value="0x8B9B" name="GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES"/> >+ <enum value="0x8B9C" name="GL_POINT_SIZE_ARRAY_OES"/> >+ <enum value="0x8B9D" name="GL_TEXTURE_CROP_RECT_OES"/> >+ <enum value="0x8B9E" name="GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES"/> >+ <enum value="0x8B9F" name="GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8BA0" end="0x8BAF" vendor="Seaweed"> >+ <unused start="0x8BA0" end="0x8BAF" vendor="Seaweed"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8BB0" end="0x8BBF" vendor="MESA"> >+ <enum value="0x8BB0" name="GL_FRAGMENT_PROGRAM_POSITION_MESA"/> >+ <enum value="0x8BB1" name="GL_FRAGMENT_PROGRAM_CALLBACK_MESA"/> >+ <enum value="0x8BB2" name="GL_FRAGMENT_PROGRAM_CALLBACK_FUNC_MESA"/> >+ <enum value="0x8BB3" name="GL_FRAGMENT_PROGRAM_CALLBACK_DATA_MESA"/> >+ <enum value="0x8BB4" name="GL_VERTEX_PROGRAM_POSITION_MESA"/> >+ <enum value="0x8BB5" name="GL_VERTEX_PROGRAM_CALLBACK_MESA"/> >+ <enum value="0x8BB6" name="GL_VERTEX_PROGRAM_CALLBACK_FUNC_MESA"/> >+ <enum value="0x8BB7" name="GL_VERTEX_PROGRAM_CALLBACK_DATA_MESA"/> >+ <enum value="0x8BB8" name="GL_TILE_RASTER_ORDER_FIXED_MESA"/> >+ <enum value="0x8BB9" name="GL_TILE_RASTER_ORDER_INCREASING_X_MESA"/> >+ <enum value="0x8BBA" name="GL_TILE_RASTER_ORDER_INCREASING_Y_MESA"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8BC0" end="0x8BFF" vendor="QCOM" comment="Reassigned from AMD to QCOM"> >+ <enum value="0x8BC0" name="GL_COUNTER_TYPE_AMD"/> >+ <enum value="0x8BC1" name="GL_COUNTER_RANGE_AMD"/> >+ <enum value="0x8BC2" name="GL_UNSIGNED_INT64_AMD"/> >+ <enum value="0x8BC3" name="GL_PERCENTAGE_AMD"/> >+ <enum value="0x8BC4" name="GL_PERFMON_RESULT_AVAILABLE_AMD"/> >+ <enum value="0x8BC5" name="GL_PERFMON_RESULT_SIZE_AMD"/> >+ <enum value="0x8BC6" name="GL_PERFMON_RESULT_AMD"/> >+ <unused start="0x8BC7" end="0x8BD1" vendor="QCOM"/> >+ <enum value="0x8BD2" name="GL_TEXTURE_WIDTH_QCOM"/> >+ <enum value="0x8BD3" name="GL_TEXTURE_HEIGHT_QCOM"/> >+ <enum value="0x8BD4" name="GL_TEXTURE_DEPTH_QCOM"/> >+ <enum value="0x8BD5" name="GL_TEXTURE_INTERNAL_FORMAT_QCOM"/> >+ <enum value="0x8BD6" name="GL_TEXTURE_FORMAT_QCOM"/> >+ <enum value="0x8BD7" name="GL_TEXTURE_TYPE_QCOM"/> >+ <enum value="0x8BD8" name="GL_TEXTURE_IMAGE_VALID_QCOM"/> >+ <enum value="0x8BD9" name="GL_TEXTURE_NUM_LEVELS_QCOM"/> >+ <enum value="0x8BDA" name="GL_TEXTURE_TARGET_QCOM"/> >+ <enum value="0x8BDB" name="GL_TEXTURE_OBJECT_VALID_QCOM"/> >+ <enum value="0x8BDC" name="GL_STATE_RESTORE"/> >+ <unused start="0x8BDD" end="0x8BE6" vendor="QCOM"/> >+ <enum value="0x8BE7" name="GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT"/> >+ <unused start="0x8BE8" end="0x8BEF" vendor="QCOM"/> >+ <enum value="0x8BFA" name="GL_TEXTURE_PROTECTED_EXT"/> >+ <enum value="0x8BFB" name="GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM"/> >+ <enum value="0x8BFC" name="GL_TEXTURE_FOVEATED_MIN_PIXEL_DENSITY_QCOM"/> >+ <enum value="0x8BFD" name="GL_TEXTURE_FOVEATED_FEATURE_QUERY_QCOM"/> >+ <enum value="0x8BFE" name="GL_TEXTURE_FOVEATED_NUM_FOCAL_POINTS_QUERY_QCOM"/> >+ <enum value="0x8BFF" name="GL_FRAMEBUFFER_INCOMPLETE_FOVEATION_QCOM"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8C00" end="0x8C0F" vendor="IMG"> >+ <enum value="0x8C00" name="GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG"/> >+ <enum value="0x8C01" name="GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG"/> >+ <enum value="0x8C02" name="GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG"/> >+ <enum value="0x8C03" name="GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG"/> >+ <enum value="0x8C04" name="GL_MODULATE_COLOR_IMG"/> >+ <enum value="0x8C05" name="GL_RECIP_ADD_SIGNED_ALPHA_IMG"/> >+ <enum value="0x8C06" name="GL_TEXTURE_ALPHA_MODULATE_IMG"/> >+ <enum value="0x8C07" name="GL_FACTOR_ALPHA_MODULATE_IMG"/> >+ <enum value="0x8C08" name="GL_FRAGMENT_ALPHA_MODULATE_IMG"/> >+ <enum value="0x8C09" name="GL_ADD_BLEND_IMG"/> >+ <enum value="0x8C0A" name="GL_SGX_BINARY_IMG"/> >+ <unused start="0x8C0B" end="0x8C0F" vendor="IMG"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8C10" end="0x8C8F" vendor="NV" comment="For Pat Brown"> >+ <enum value="0x8C10" name="GL_TEXTURE_RED_TYPE"/> >+ <enum value="0x8C10" name="GL_TEXTURE_RED_TYPE_ARB"/> >+ <enum value="0x8C11" name="GL_TEXTURE_GREEN_TYPE"/> >+ <enum value="0x8C11" name="GL_TEXTURE_GREEN_TYPE_ARB"/> >+ <enum value="0x8C12" name="GL_TEXTURE_BLUE_TYPE"/> >+ <enum value="0x8C12" name="GL_TEXTURE_BLUE_TYPE_ARB"/> >+ <enum value="0x8C13" name="GL_TEXTURE_ALPHA_TYPE"/> >+ <enum value="0x8C13" name="GL_TEXTURE_ALPHA_TYPE_ARB"/> >+ <enum value="0x8C14" name="GL_TEXTURE_LUMINANCE_TYPE"/> >+ <enum value="0x8C14" name="GL_TEXTURE_LUMINANCE_TYPE_ARB"/> >+ <enum value="0x8C15" name="GL_TEXTURE_INTENSITY_TYPE"/> >+ <enum value="0x8C15" name="GL_TEXTURE_INTENSITY_TYPE_ARB"/> >+ <enum value="0x8C16" name="GL_TEXTURE_DEPTH_TYPE"/> >+ <enum value="0x8C16" name="GL_TEXTURE_DEPTH_TYPE_ARB"/> >+ <enum value="0x8C17" name="GL_UNSIGNED_NORMALIZED"/> >+ <enum value="0x8C17" name="GL_UNSIGNED_NORMALIZED_ARB"/> >+ <enum value="0x8C17" name="GL_UNSIGNED_NORMALIZED_EXT"/> >+ <enum value="0x8C18" name="GL_TEXTURE_1D_ARRAY"/> >+ <enum value="0x8C18" name="GL_TEXTURE_1D_ARRAY_EXT"/> >+ <enum value="0x8C19" name="GL_PROXY_TEXTURE_1D_ARRAY"/> >+ <enum value="0x8C19" name="GL_PROXY_TEXTURE_1D_ARRAY_EXT"/> >+ <enum value="0x8C1A" name="GL_TEXTURE_2D_ARRAY"/> >+ <enum value="0x8C1A" name="GL_TEXTURE_2D_ARRAY_EXT"/> >+ <enum value="0x8C1B" name="GL_PROXY_TEXTURE_2D_ARRAY"/> >+ <enum value="0x8C1B" name="GL_PROXY_TEXTURE_2D_ARRAY_EXT"/> >+ <enum value="0x8C1C" name="GL_TEXTURE_BINDING_1D_ARRAY"/> >+ <enum value="0x8C1C" name="GL_TEXTURE_BINDING_1D_ARRAY_EXT"/> >+ <enum value="0x8C1D" name="GL_TEXTURE_BINDING_2D_ARRAY"/> >+ <enum value="0x8C1D" name="GL_TEXTURE_BINDING_2D_ARRAY_EXT"/> >+ <unused start="0x8C1E" end="0x8C25" vendor="NV"/> >+ <enum value="0x8C26" name="GL_GEOMETRY_PROGRAM_NV"/> >+ <enum value="0x8C27" name="GL_MAX_PROGRAM_OUTPUT_VERTICES_NV"/> >+ <enum value="0x8C28" name="GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV"/> >+ <enum value="0x8C29" name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS"/> >+ <enum value="0x8C29" name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB"/> >+ <enum value="0x8C29" name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT"/> >+ <enum value="0x8C29" name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_OES"/> >+ <enum value="0x8C2A" name="GL_TEXTURE_BUFFER"/> >+ <enum value="0x8C2A" name="GL_TEXTURE_BUFFER_ARB"/> >+ <enum value="0x8C2A" name="GL_TEXTURE_BUFFER_EXT"/> >+ <enum value="0x8C2A" name="GL_TEXTURE_BUFFER_OES"/> >+ <enum value="0x8C2A" name="GL_TEXTURE_BUFFER_BINDING" comment="Equivalent to GL_TEXTURE_BUFFER_ARB query, but named more consistently"/> >+ <enum value="0x8C2A" name="GL_TEXTURE_BUFFER_BINDING_EXT"/> >+ <enum value="0x8C2A" name="GL_TEXTURE_BUFFER_BINDING_OES"/> >+ <enum value="0x8C2B" name="GL_MAX_TEXTURE_BUFFER_SIZE"/> >+ <enum value="0x8C2B" name="GL_MAX_TEXTURE_BUFFER_SIZE_ARB"/> >+ <enum value="0x8C2B" name="GL_MAX_TEXTURE_BUFFER_SIZE_EXT"/> >+ <enum value="0x8C2B" name="GL_MAX_TEXTURE_BUFFER_SIZE_OES"/> >+ <enum value="0x8C2C" name="GL_TEXTURE_BINDING_BUFFER"/> >+ <enum value="0x8C2C" name="GL_TEXTURE_BINDING_BUFFER_ARB"/> >+ <enum value="0x8C2C" name="GL_TEXTURE_BINDING_BUFFER_EXT"/> >+ <enum value="0x8C2C" name="GL_TEXTURE_BINDING_BUFFER_OES"/> >+ <enum value="0x8C2D" name="GL_TEXTURE_BUFFER_DATA_STORE_BINDING"/> >+ <enum value="0x8C2D" name="GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB"/> >+ <enum value="0x8C2D" name="GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT"/> >+ <enum value="0x8C2D" name="GL_TEXTURE_BUFFER_DATA_STORE_BINDING_OES"/> >+ <enum value="0x8C2E" name="GL_TEXTURE_BUFFER_FORMAT_ARB"/> >+ <enum value="0x8C2E" name="GL_TEXTURE_BUFFER_FORMAT_EXT"/> >+ <enum value="0x8C2F" name="GL_ANY_SAMPLES_PASSED"/> >+ <enum value="0x8C2F" name="GL_ANY_SAMPLES_PASSED_EXT"/> >+ <unused start="0x8C30" end="0x8C35" vendor="NV"/> >+ <enum value="0x8C36" name="GL_SAMPLE_SHADING"/> >+ <enum value="0x8C36" name="GL_SAMPLE_SHADING_ARB"/> >+ <enum value="0x8C36" name="GL_SAMPLE_SHADING_OES"/> >+ <enum value="0x8C37" name="GL_MIN_SAMPLE_SHADING_VALUE"/> >+ <enum value="0x8C37" name="GL_MIN_SAMPLE_SHADING_VALUE_ARB"/> >+ <enum value="0x8C37" name="GL_MIN_SAMPLE_SHADING_VALUE_OES"/> >+ <unused start="0x8C38" end="0x8C39" vendor="NV"/> >+ <enum value="0x8C3A" name="GL_R11F_G11F_B10F"/> >+ <enum value="0x8C3A" name="GL_R11F_G11F_B10F_APPLE"/> >+ <enum value="0x8C3A" name="GL_R11F_G11F_B10F_EXT"/> >+ <enum value="0x8C3B" name="GL_UNSIGNED_INT_10F_11F_11F_REV"/> >+ <enum value="0x8C3B" name="GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE"/> >+ <enum value="0x8C3B" name="GL_UNSIGNED_INT_10F_11F_11F_REV_EXT"/> >+ <enum value="0x8C3C" name="GL_RGBA_SIGNED_COMPONENTS_EXT"/> >+ <enum value="0x8C3D" name="GL_RGB9_E5"/> >+ <enum value="0x8C3D" name="GL_RGB9_E5_APPLE"/> >+ <enum value="0x8C3D" name="GL_RGB9_E5_EXT"/> >+ <enum value="0x8C3E" name="GL_UNSIGNED_INT_5_9_9_9_REV"/> >+ <enum value="0x8C3E" name="GL_UNSIGNED_INT_5_9_9_9_REV_APPLE"/> >+ <enum value="0x8C3E" name="GL_UNSIGNED_INT_5_9_9_9_REV_EXT"/> >+ <enum value="0x8C3F" name="GL_TEXTURE_SHARED_SIZE"/> >+ <enum value="0x8C3F" name="GL_TEXTURE_SHARED_SIZE_EXT"/> >+ <enum value="0x8C40" name="GL_SRGB"/> >+ <enum value="0x8C40" name="GL_SRGB_EXT"/> >+ <enum value="0x8C41" name="GL_SRGB8"/> >+ <enum value="0x8C41" name="GL_SRGB8_EXT"/> >+ <enum value="0x8C41" name="GL_SRGB8_NV"/> >+ <enum value="0x8C42" name="GL_SRGB_ALPHA"/> >+ <enum value="0x8C42" name="GL_SRGB_ALPHA_EXT"/> >+ <enum value="0x8C43" name="GL_SRGB8_ALPHA8"/> >+ <enum value="0x8C43" name="GL_SRGB8_ALPHA8_EXT"/> >+ <enum value="0x8C44" name="GL_SLUMINANCE_ALPHA"/> >+ <enum value="0x8C44" name="GL_SLUMINANCE_ALPHA_EXT"/> >+ <enum value="0x8C44" name="GL_SLUMINANCE_ALPHA_NV"/> >+ <enum value="0x8C45" name="GL_SLUMINANCE8_ALPHA8"/> >+ <enum value="0x8C45" name="GL_SLUMINANCE8_ALPHA8_EXT"/> >+ <enum value="0x8C45" name="GL_SLUMINANCE8_ALPHA8_NV"/> >+ <enum value="0x8C46" name="GL_SLUMINANCE"/> >+ <enum value="0x8C46" name="GL_SLUMINANCE_EXT"/> >+ <enum value="0x8C46" name="GL_SLUMINANCE_NV"/> >+ <enum value="0x8C47" name="GL_SLUMINANCE8"/> >+ <enum value="0x8C47" name="GL_SLUMINANCE8_EXT"/> >+ <enum value="0x8C47" name="GL_SLUMINANCE8_NV"/> >+ <enum value="0x8C48" name="GL_COMPRESSED_SRGB"/> >+ <enum value="0x8C48" name="GL_COMPRESSED_SRGB_EXT"/> >+ <enum value="0x8C49" name="GL_COMPRESSED_SRGB_ALPHA"/> >+ <enum value="0x8C49" name="GL_COMPRESSED_SRGB_ALPHA_EXT"/> >+ <enum value="0x8C4A" name="GL_COMPRESSED_SLUMINANCE"/> >+ <enum value="0x8C4A" name="GL_COMPRESSED_SLUMINANCE_EXT"/> >+ <enum value="0x8C4B" name="GL_COMPRESSED_SLUMINANCE_ALPHA"/> >+ <enum value="0x8C4B" name="GL_COMPRESSED_SLUMINANCE_ALPHA_EXT"/> >+ <enum value="0x8C4C" name="GL_COMPRESSED_SRGB_S3TC_DXT1_EXT"/> >+ <enum value="0x8C4C" name="GL_COMPRESSED_SRGB_S3TC_DXT1_NV"/> >+ <enum value="0x8C4D" name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT"/> >+ <enum value="0x8C4D" name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV"/> >+ <enum value="0x8C4E" name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT"/> >+ <enum value="0x8C4E" name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV"/> >+ <enum value="0x8C4F" name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT"/> >+ <enum value="0x8C4F" name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV"/> >+ <unused start="0x8C50" end="0x8C6F" vendor="NV"/> >+ <enum value="0x8C70" name="GL_COMPRESSED_LUMINANCE_LATC1_EXT"/> >+ <enum value="0x8C71" name="GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT"/> >+ <enum value="0x8C72" name="GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT"/> >+ <enum value="0x8C73" name="GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT"/> >+ <enum value="0x8C74" name="GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV"/> >+ <enum value="0x8C75" name="GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV"/> >+ <enum value="0x8C76" name="GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH"/> >+ <enum value="0x8C76" name="GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT"/> >+ <enum value="0x8C77" name="GL_BACK_PRIMARY_COLOR_NV"/> >+ <enum value="0x8C78" name="GL_BACK_SECONDARY_COLOR_NV"/> >+ <enum value="0x8C79" name="GL_TEXTURE_COORD_NV"/> >+ <enum value="0x8C7A" name="GL_CLIP_DISTANCE_NV"/> >+ <enum value="0x8C7B" name="GL_VERTEX_ID_NV"/> >+ <enum value="0x8C7C" name="GL_PRIMITIVE_ID_NV"/> >+ <enum value="0x8C7D" name="GL_GENERIC_ATTRIB_NV"/> >+ <enum value="0x8C7E" name="GL_TRANSFORM_FEEDBACK_ATTRIBS_NV"/> >+ <enum value="0x8C7F" name="GL_TRANSFORM_FEEDBACK_BUFFER_MODE"/> >+ <enum value="0x8C7F" name="GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT"/> >+ <enum value="0x8C7F" name="GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV"/> >+ <enum value="0x8C80" name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS"/> >+ <enum value="0x8C80" name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT"/> >+ <enum value="0x8C80" name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV"/> >+ <enum value="0x8C81" name="GL_ACTIVE_VARYINGS_NV"/> >+ <enum value="0x8C82" name="GL_ACTIVE_VARYING_MAX_LENGTH_NV"/> >+ <enum value="0x8C83" name="GL_TRANSFORM_FEEDBACK_VARYINGS"/> >+ <enum value="0x8C83" name="GL_TRANSFORM_FEEDBACK_VARYINGS_EXT"/> >+ <enum value="0x8C83" name="GL_TRANSFORM_FEEDBACK_VARYINGS_NV"/> >+ <enum value="0x8C84" name="GL_TRANSFORM_FEEDBACK_BUFFER_START"/> >+ <enum value="0x8C84" name="GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT"/> >+ <enum value="0x8C84" name="GL_TRANSFORM_FEEDBACK_BUFFER_START_NV"/> >+ <enum value="0x8C85" name="GL_TRANSFORM_FEEDBACK_BUFFER_SIZE"/> >+ <enum value="0x8C85" name="GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT"/> >+ <enum value="0x8C85" name="GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV"/> >+ <enum value="0x8C86" name="GL_TRANSFORM_FEEDBACK_RECORD_NV"/> >+ <enum value="0x8C87" name="GL_PRIMITIVES_GENERATED"/> >+ <enum value="0x8C87" name="GL_PRIMITIVES_GENERATED_EXT"/> >+ <enum value="0x8C87" name="GL_PRIMITIVES_GENERATED_NV"/> >+ <enum value="0x8C87" name="GL_PRIMITIVES_GENERATED_OES"/> >+ <enum value="0x8C88" name="GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN"/> >+ <enum value="0x8C88" name="GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT"/> >+ <enum value="0x8C88" name="GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV"/> >+ <enum value="0x8C89" name="GL_RASTERIZER_DISCARD"/> >+ <enum value="0x8C89" name="GL_RASTERIZER_DISCARD_EXT"/> >+ <enum value="0x8C89" name="GL_RASTERIZER_DISCARD_NV"/> >+ <enum value="0x8C8A" name="GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS"/> >+ <enum value="0x8C8A" name="GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT"/> >+ <enum value="0x8C8A" name="GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV"/> >+ <enum value="0x8C8B" name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS"/> >+ <enum value="0x8C8B" name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT"/> >+ <enum value="0x8C8B" name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV"/> >+ <enum value="0x8C8C" name="GL_INTERLEAVED_ATTRIBS"/> >+ <enum value="0x8C8C" name="GL_INTERLEAVED_ATTRIBS_EXT"/> >+ <enum value="0x8C8C" name="GL_INTERLEAVED_ATTRIBS_NV"/> >+ <enum value="0x8C8D" name="GL_SEPARATE_ATTRIBS"/> >+ <enum value="0x8C8D" name="GL_SEPARATE_ATTRIBS_EXT"/> >+ <enum value="0x8C8D" name="GL_SEPARATE_ATTRIBS_NV"/> >+ <enum value="0x8C8E" name="GL_TRANSFORM_FEEDBACK_BUFFER"/> >+ <enum value="0x8C8E" name="GL_TRANSFORM_FEEDBACK_BUFFER_EXT"/> >+ <enum value="0x8C8E" name="GL_TRANSFORM_FEEDBACK_BUFFER_NV"/> >+ <enum value="0x8C8F" name="GL_TRANSFORM_FEEDBACK_BUFFER_BINDING"/> >+ <enum value="0x8C8F" name="GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT"/> >+ <enum value="0x8C8F" name="GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8C90" end="0x8C9F" vendor="QCOM" comment="For Affie Munshi. Reassigned from AMD to QCOM (bug 5874)"> >+ <unused start="0x8C90" end="0x8C91" vendor="QCOM"/> >+ <enum value="0x8C92" name="GL_ATC_RGB_AMD"/> >+ <enum value="0x8C93" name="GL_ATC_RGBA_EXPLICIT_ALPHA_AMD"/> >+ <unused start="0x8C94" end="0x8C9F" vendor="QCOM"/> >+ </enums> >+ <enums namespace="GL" start="0x8CA0" end="0x8CAF" vendor="ARB"> >+ <enum value="0x8CA0" name="GL_POINT_SPRITE_COORD_ORIGIN"/> >+ <enum value="0x8CA1" name="GL_LOWER_LEFT"/> >+ <enum value="0x8CA1" name="GL_LOWER_LEFT_EXT" alias="GL_LOWER_LEFT"/> >+ <enum value="0x8CA2" name="GL_UPPER_LEFT"/> >+ <enum value="0x8CA2" name="GL_UPPER_LEFT_EXT" alias="GL_UPPER_LEFT"/> >+ <enum value="0x8CA3" name="GL_STENCIL_BACK_REF"/> >+ <enum value="0x8CA4" name="GL_STENCIL_BACK_VALUE_MASK"/> >+ <enum value="0x8CA5" name="GL_STENCIL_BACK_WRITEMASK"/> >+ <enum value="0x8CA6" name="GL_DRAW_FRAMEBUFFER_BINDING"/> >+ <enum value="0x8CA6" name="GL_DRAW_FRAMEBUFFER_BINDING_ANGLE"/> >+ <enum value="0x8CA6" name="GL_DRAW_FRAMEBUFFER_BINDING_APPLE"/> >+ <enum value="0x8CA6" name="GL_DRAW_FRAMEBUFFER_BINDING_EXT"/> >+ <enum value="0x8CA6" name="GL_DRAW_FRAMEBUFFER_BINDING_NV"/> >+ <enum value="0x8CA6" name="GL_FRAMEBUFFER_BINDING"/> >+ <enum value="0x8CA6" name="GL_FRAMEBUFFER_BINDING_ANGLE"/> >+ <enum value="0x8CA6" name="GL_FRAMEBUFFER_BINDING_EXT"/> >+ <enum value="0x8CA6" name="GL_FRAMEBUFFER_BINDING_OES"/> >+ <enum value="0x8CA7" name="GL_RENDERBUFFER_BINDING"/> >+ <enum value="0x8CA7" name="GL_RENDERBUFFER_BINDING_ANGLE"/> >+ <enum value="0x8CA7" name="GL_RENDERBUFFER_BINDING_EXT"/> >+ <enum value="0x8CA7" name="GL_RENDERBUFFER_BINDING_OES"/> >+ <enum value="0x8CA8" name="GL_READ_FRAMEBUFFER"/> >+ <enum value="0x8CA8" name="GL_READ_FRAMEBUFFER_ANGLE"/> >+ <enum value="0x8CA8" name="GL_READ_FRAMEBUFFER_APPLE"/> >+ <enum value="0x8CA8" name="GL_READ_FRAMEBUFFER_EXT"/> >+ <enum value="0x8CA8" name="GL_READ_FRAMEBUFFER_NV"/> >+ <enum value="0x8CA9" name="GL_DRAW_FRAMEBUFFER"/> >+ <enum value="0x8CA9" name="GL_DRAW_FRAMEBUFFER_ANGLE"/> >+ <enum value="0x8CA9" name="GL_DRAW_FRAMEBUFFER_APPLE"/> >+ <enum value="0x8CA9" name="GL_DRAW_FRAMEBUFFER_EXT"/> >+ <enum value="0x8CA9" name="GL_DRAW_FRAMEBUFFER_NV"/> >+ <enum value="0x8CAA" name="GL_READ_FRAMEBUFFER_BINDING"/> >+ <enum value="0x8CAA" name="GL_READ_FRAMEBUFFER_BINDING_ANGLE"/> >+ <enum value="0x8CAA" name="GL_READ_FRAMEBUFFER_BINDING_APPLE"/> >+ <enum value="0x8CAA" name="GL_READ_FRAMEBUFFER_BINDING_EXT"/> >+ <enum value="0x8CAA" name="GL_READ_FRAMEBUFFER_BINDING_NV"/> >+ <enum value="0x8CAB" name="GL_RENDERBUFFER_COVERAGE_SAMPLES_NV"/> >+ <enum value="0x8CAB" name="GL_RENDERBUFFER_SAMPLES"/> >+ <enum value="0x8CAB" name="GL_RENDERBUFFER_SAMPLES_ANGLE"/> >+ <enum value="0x8CAB" name="GL_RENDERBUFFER_SAMPLES_APPLE"/> >+ <enum value="0x8CAB" name="GL_RENDERBUFFER_SAMPLES_EXT"/> >+ <enum value="0x8CAB" name="GL_RENDERBUFFER_SAMPLES_NV"/> >+ <enum value="0x8CAC" name="GL_DEPTH_COMPONENT32F"/> >+ <enum value="0x8CAD" name="GL_DEPTH32F_STENCIL8"/> >+ <unused start="0x8CAE" end="0x8CAF" vendor="ARB"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8CB0" end="0x8CCF" vendor="ZiiLabs" comment="For Barthold Lichtenbelt 2004/12/1"> >+ <unused start="0x8CB0" end="0x8CCF" vendor="ZiiLabs"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8CD0" end="0x8D5F" vendor="ARB" comment="Framebuffer object specification + headroom"> >+ <enum value="0x8CD0" name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE"/> >+ <enum value="0x8CD0" name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT"/> >+ <enum value="0x8CD0" name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES"/> >+ <enum value="0x8CD1" name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME"/> >+ <enum value="0x8CD1" name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT"/> >+ <enum value="0x8CD1" name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES"/> >+ <enum value="0x8CD2" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL"/> >+ <enum value="0x8CD2" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT"/> >+ <enum value="0x8CD2" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES"/> >+ <enum value="0x8CD3" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE"/> >+ <enum value="0x8CD3" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT"/> >+ <enum value="0x8CD3" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES"/> >+ <enum value="0x8CD4" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT"/> >+ <enum value="0x8CD4" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES"/> >+ <enum value="0x8CD4" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER"/> >+ <enum value="0x8CD4" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT"/> >+ <enum value="0x8CD5" name="GL_FRAMEBUFFER_COMPLETE"/> >+ <enum value="0x8CD5" name="GL_FRAMEBUFFER_COMPLETE_EXT"/> >+ <enum value="0x8CD5" name="GL_FRAMEBUFFER_COMPLETE_OES"/> >+ <enum value="0x8CD6" name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"/> >+ <enum value="0x8CD6" name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT"/> >+ <enum value="0x8CD6" name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES"/> >+ <enum value="0x8CD7" name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"/> >+ <enum value="0x8CD7" name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT"/> >+ <enum value="0x8CD7" name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES"/> >+ <unused start="0x8CD8" vendor="ARB" comment="Removed 2005/09/26 in revision #117 of the FBO extension spec"/> >+ <!-- <enum value="0x8CD8" name="GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT"/> --> >+ <enum value="0x8CD9" name="GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS"/> >+ <enum value="0x8CD9" name="GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT"/> >+ <enum value="0x8CD9" name="GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES"/> >+ <enum value="0x8CDA" name="GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT"/> >+ <enum value="0x8CDA" name="GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES"/> >+ <enum value="0x8CDB" name="GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER"/> >+ <enum value="0x8CDB" name="GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT"/> >+ <enum value="0x8CDB" name="GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_OES"/> >+ <enum value="0x8CDC" name="GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER"/> >+ <enum value="0x8CDC" name="GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT"/> >+ <enum value="0x8CDC" name="GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_OES"/> >+ <enum value="0x8CDD" name="GL_FRAMEBUFFER_UNSUPPORTED"/> >+ <enum value="0x8CDD" name="GL_FRAMEBUFFER_UNSUPPORTED_EXT"/> >+ <enum value="0x8CDD" name="GL_FRAMEBUFFER_UNSUPPORTED_OES"/> >+ <unused start="0x8CDE" vendor="ARB" comment="Removed 2005/05/31 in revision #113 of the FBO extension spec"/> >+ <!-- <enum value="0x8CDE" name="GL_FRAMEBUFFER_STATUS_ERROR_EXT"/> --> >+ <enum value="0x8CDF" name="GL_MAX_COLOR_ATTACHMENTS"/> >+ <enum value="0x8CDF" name="GL_MAX_COLOR_ATTACHMENTS_EXT"/> >+ <enum value="0x8CDF" name="GL_MAX_COLOR_ATTACHMENTS_NV"/> >+ <enum value="0x8CE0" name="GL_COLOR_ATTACHMENT0"/> >+ <enum value="0x8CE0" name="GL_COLOR_ATTACHMENT0_EXT"/> >+ <enum value="0x8CE0" name="GL_COLOR_ATTACHMENT0_NV"/> >+ <enum value="0x8CE0" name="GL_COLOR_ATTACHMENT0_OES"/> >+ <enum value="0x8CE1" name="GL_COLOR_ATTACHMENT1"/> >+ <enum value="0x8CE1" name="GL_COLOR_ATTACHMENT1_EXT"/> >+ <enum value="0x8CE1" name="GL_COLOR_ATTACHMENT1_NV"/> >+ <enum value="0x8CE2" name="GL_COLOR_ATTACHMENT2"/> >+ <enum value="0x8CE2" name="GL_COLOR_ATTACHMENT2_EXT"/> >+ <enum value="0x8CE2" name="GL_COLOR_ATTACHMENT2_NV"/> >+ <enum value="0x8CE3" name="GL_COLOR_ATTACHMENT3"/> >+ <enum value="0x8CE3" name="GL_COLOR_ATTACHMENT3_EXT"/> >+ <enum value="0x8CE3" name="GL_COLOR_ATTACHMENT3_NV"/> >+ <enum value="0x8CE4" name="GL_COLOR_ATTACHMENT4"/> >+ <enum value="0x8CE4" name="GL_COLOR_ATTACHMENT4_EXT"/> >+ <enum value="0x8CE4" name="GL_COLOR_ATTACHMENT4_NV"/> >+ <enum value="0x8CE5" name="GL_COLOR_ATTACHMENT5"/> >+ <enum value="0x8CE5" name="GL_COLOR_ATTACHMENT5_EXT"/> >+ <enum value="0x8CE5" name="GL_COLOR_ATTACHMENT5_NV"/> >+ <enum value="0x8CE6" name="GL_COLOR_ATTACHMENT6"/> >+ <enum value="0x8CE6" name="GL_COLOR_ATTACHMENT6_EXT"/> >+ <enum value="0x8CE6" name="GL_COLOR_ATTACHMENT6_NV"/> >+ <enum value="0x8CE7" name="GL_COLOR_ATTACHMENT7"/> >+ <enum value="0x8CE7" name="GL_COLOR_ATTACHMENT7_EXT"/> >+ <enum value="0x8CE7" name="GL_COLOR_ATTACHMENT7_NV"/> >+ <enum value="0x8CE8" name="GL_COLOR_ATTACHMENT8"/> >+ <enum value="0x8CE8" name="GL_COLOR_ATTACHMENT8_EXT"/> >+ <enum value="0x8CE8" name="GL_COLOR_ATTACHMENT8_NV"/> >+ <enum value="0x8CE9" name="GL_COLOR_ATTACHMENT9"/> >+ <enum value="0x8CE9" name="GL_COLOR_ATTACHMENT9_EXT"/> >+ <enum value="0x8CE9" name="GL_COLOR_ATTACHMENT9_NV"/> >+ <enum value="0x8CEA" name="GL_COLOR_ATTACHMENT10"/> >+ <enum value="0x8CEA" name="GL_COLOR_ATTACHMENT10_EXT"/> >+ <enum value="0x8CEA" name="GL_COLOR_ATTACHMENT10_NV"/> >+ <enum value="0x8CEB" name="GL_COLOR_ATTACHMENT11"/> >+ <enum value="0x8CEB" name="GL_COLOR_ATTACHMENT11_EXT"/> >+ <enum value="0x8CEB" name="GL_COLOR_ATTACHMENT11_NV"/> >+ <enum value="0x8CEC" name="GL_COLOR_ATTACHMENT12"/> >+ <enum value="0x8CEC" name="GL_COLOR_ATTACHMENT12_EXT"/> >+ <enum value="0x8CEC" name="GL_COLOR_ATTACHMENT12_NV"/> >+ <enum value="0x8CED" name="GL_COLOR_ATTACHMENT13"/> >+ <enum value="0x8CED" name="GL_COLOR_ATTACHMENT13_EXT"/> >+ <enum value="0x8CED" name="GL_COLOR_ATTACHMENT13_NV"/> >+ <enum value="0x8CEE" name="GL_COLOR_ATTACHMENT14"/> >+ <enum value="0x8CEE" name="GL_COLOR_ATTACHMENT14_EXT"/> >+ <enum value="0x8CEE" name="GL_COLOR_ATTACHMENT14_NV"/> >+ <enum value="0x8CEF" name="GL_COLOR_ATTACHMENT15"/> >+ <enum value="0x8CEF" name="GL_COLOR_ATTACHMENT15_EXT"/> >+ <enum value="0x8CEF" name="GL_COLOR_ATTACHMENT15_NV"/> >+ <enum value="0x8CF0" name="GL_COLOR_ATTACHMENT16"/> >+ <enum value="0x8CF1" name="GL_COLOR_ATTACHMENT17"/> >+ <enum value="0x8CF2" name="GL_COLOR_ATTACHMENT18"/> >+ <enum value="0x8CF3" name="GL_COLOR_ATTACHMENT19"/> >+ <enum value="0x8CF4" name="GL_COLOR_ATTACHMENT20"/> >+ <enum value="0x8CF5" name="GL_COLOR_ATTACHMENT21"/> >+ <enum value="0x8CF6" name="GL_COLOR_ATTACHMENT22"/> >+ <enum value="0x8CF7" name="GL_COLOR_ATTACHMENT23"/> >+ <enum value="0x8CF8" name="GL_COLOR_ATTACHMENT24"/> >+ <enum value="0x8CF9" name="GL_COLOR_ATTACHMENT25"/> >+ <enum value="0x8CFA" name="GL_COLOR_ATTACHMENT26"/> >+ <enum value="0x8CFB" name="GL_COLOR_ATTACHMENT27"/> >+ <enum value="0x8CFC" name="GL_COLOR_ATTACHMENT28"/> >+ <enum value="0x8CFD" name="GL_COLOR_ATTACHMENT29"/> >+ <enum value="0x8CFE" name="GL_COLOR_ATTACHMENT30"/> >+ <enum value="0x8CFF" name="GL_COLOR_ATTACHMENT31"/> >+ <enum value="0x8D00" name="GL_DEPTH_ATTACHMENT"/> >+ <enum value="0x8D00" name="GL_DEPTH_ATTACHMENT_EXT"/> >+ <enum value="0x8D00" name="GL_DEPTH_ATTACHMENT_OES"/> >+ <unused start="0x8D01" end="0x8D1F" vendor="ARB" comment="For depth attachments 16-31"/> >+ <enum value="0x8D20" name="GL_STENCIL_ATTACHMENT"/> >+ <enum value="0x8D20" name="GL_STENCIL_ATTACHMENT_EXT"/> >+ <enum value="0x8D20" name="GL_STENCIL_ATTACHMENT_OES"/> >+ <unused start="0x8D21" end="0x8D3F" vendor="ARB" comment="For stencil attachments 16-31"/> >+ <enum value="0x8D40" name="GL_FRAMEBUFFER"/> >+ <enum value="0x8D40" name="GL_FRAMEBUFFER_EXT"/> >+ <enum value="0x8D40" name="GL_FRAMEBUFFER_OES"/> >+ <enum value="0x8D41" name="GL_RENDERBUFFER"/> >+ <enum value="0x8D41" name="GL_RENDERBUFFER_EXT"/> >+ <enum value="0x8D41" name="GL_RENDERBUFFER_OES"/> >+ <enum value="0x8D42" name="GL_RENDERBUFFER_WIDTH"/> >+ <enum value="0x8D42" name="GL_RENDERBUFFER_WIDTH_EXT"/> >+ <enum value="0x8D42" name="GL_RENDERBUFFER_WIDTH_OES"/> >+ <enum value="0x8D43" name="GL_RENDERBUFFER_HEIGHT"/> >+ <enum value="0x8D43" name="GL_RENDERBUFFER_HEIGHT_EXT"/> >+ <enum value="0x8D43" name="GL_RENDERBUFFER_HEIGHT_OES"/> >+ <enum value="0x8D44" name="GL_RENDERBUFFER_INTERNAL_FORMAT"/> >+ <enum value="0x8D44" name="GL_RENDERBUFFER_INTERNAL_FORMAT_EXT"/> >+ <enum value="0x8D44" name="GL_RENDERBUFFER_INTERNAL_FORMAT_OES"/> >+ <unused start="0x8D45" vendor="ARB" comment="Was for GL_STENCIL_INDEX_EXT, but now use core STENCIL_INDEX instead"/> >+ <enum value="0x8D46" name="GL_STENCIL_INDEX1"/> >+ <enum value="0x8D46" name="GL_STENCIL_INDEX1_EXT"/> >+ <enum value="0x8D46" name="GL_STENCIL_INDEX1_OES"/> >+ <enum value="0x8D47" name="GL_STENCIL_INDEX4"/> >+ <enum value="0x8D47" name="GL_STENCIL_INDEX4_EXT"/> >+ <enum value="0x8D47" name="GL_STENCIL_INDEX4_OES"/> >+ <enum value="0x8D48" name="GL_STENCIL_INDEX8"/> >+ <enum value="0x8D48" name="GL_STENCIL_INDEX8_EXT"/> >+ <enum value="0x8D48" name="GL_STENCIL_INDEX8_OES"/> >+ <enum value="0x8D49" name="GL_STENCIL_INDEX16"/> >+ <enum value="0x8D49" name="GL_STENCIL_INDEX16_EXT"/> >+ <unused start="0x8D4A" end="0x8D4F" vendor="ARB" comment="For additional stencil formats"/> >+ <enum value="0x8D50" name="GL_RENDERBUFFER_RED_SIZE"/> >+ <enum value="0x8D50" name="GL_RENDERBUFFER_RED_SIZE_EXT"/> >+ <enum value="0x8D50" name="GL_RENDERBUFFER_RED_SIZE_OES"/> >+ <enum value="0x8D51" name="GL_RENDERBUFFER_GREEN_SIZE"/> >+ <enum value="0x8D51" name="GL_RENDERBUFFER_GREEN_SIZE_EXT"/> >+ <enum value="0x8D51" name="GL_RENDERBUFFER_GREEN_SIZE_OES"/> >+ <enum value="0x8D52" name="GL_RENDERBUFFER_BLUE_SIZE"/> >+ <enum value="0x8D52" name="GL_RENDERBUFFER_BLUE_SIZE_EXT"/> >+ <enum value="0x8D52" name="GL_RENDERBUFFER_BLUE_SIZE_OES"/> >+ <enum value="0x8D53" name="GL_RENDERBUFFER_ALPHA_SIZE"/> >+ <enum value="0x8D53" name="GL_RENDERBUFFER_ALPHA_SIZE_EXT"/> >+ <enum value="0x8D53" name="GL_RENDERBUFFER_ALPHA_SIZE_OES"/> >+ <enum value="0x8D54" name="GL_RENDERBUFFER_DEPTH_SIZE"/> >+ <enum value="0x8D54" name="GL_RENDERBUFFER_DEPTH_SIZE_EXT"/> >+ <enum value="0x8D54" name="GL_RENDERBUFFER_DEPTH_SIZE_OES"/> >+ <enum value="0x8D55" name="GL_RENDERBUFFER_STENCIL_SIZE"/> >+ <enum value="0x8D55" name="GL_RENDERBUFFER_STENCIL_SIZE_EXT"/> >+ <enum value="0x8D55" name="GL_RENDERBUFFER_STENCIL_SIZE_OES"/> >+ <enum value="0x8D56" name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE"/> >+ <enum value="0x8D56" name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE"/> >+ <enum value="0x8D56" name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE"/> >+ <enum value="0x8D56" name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT"/> >+ <enum value="0x8D56" name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV"/> >+ <enum value="0x8D57" name="GL_MAX_SAMPLES"/> >+ <enum value="0x8D57" name="GL_MAX_SAMPLES_ANGLE"/> >+ <enum value="0x8D57" name="GL_MAX_SAMPLES_APPLE"/> >+ <enum value="0x8D57" name="GL_MAX_SAMPLES_EXT"/> >+ <enum value="0x8D57" name="GL_MAX_SAMPLES_NV"/> >+ <unused start="0x8D58" end="0x8D5F" vendor="ARB"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8D60" end="0x8D6F" vendor="OES"> >+ <enum value="0x8D60" name="GL_TEXTURE_GEN_STR_OES"/> >+ <enum value="0x8D61" name="GL_HALF_FLOAT_OES"/> >+ <enum value="0x8D62" name="GL_RGB565_OES"/> >+ <enum value="0x8D62" name="GL_RGB565"/> >+ <unused start="0x8D63" vendor="OES" comment="Was GL_TEXTURE_IMMUTABLE_LEVELS in draft ES 3.0 spec"/> >+ <enum value="0x8D64" name="GL_ETC1_RGB8_OES"/> >+ <enum value="0x8D65" name="GL_TEXTURE_EXTERNAL_OES"/> >+ <enum value="0x8D66" name="GL_SAMPLER_EXTERNAL_OES"/> >+ <enum value="0x8D67" name="GL_TEXTURE_BINDING_EXTERNAL_OES"/> >+ <enum value="0x8D68" name="GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES"/> >+ <enum value="0x8D69" name="GL_PRIMITIVE_RESTART_FIXED_INDEX"/> >+ <enum value="0x8D6A" name="GL_ANY_SAMPLES_PASSED_CONSERVATIVE"/> >+ <enum value="0x8D6A" name="GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT"/> >+ <enum value="0x8D6B" name="GL_MAX_ELEMENT_INDEX"/> >+ <enum value="0x8D6C" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT"/> >+ <unused start="0x8D6D" end="0x8D6F" vendor="OES"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8D70" end="0x8DEF" vendor="NV" comment="For Pat Brown 2005/10/13"> >+ <enum value="0x8D70" name="GL_RGBA32UI"/> >+ <enum value="0x8D70" name="GL_RGBA32UI_EXT"/> >+ <enum value="0x8D71" name="GL_RGB32UI"/> >+ <enum value="0x8D71" name="GL_RGB32UI_EXT"/> >+ <enum value="0x8D72" name="GL_ALPHA32UI_EXT"/> >+ <enum value="0x8D73" name="GL_INTENSITY32UI_EXT"/> >+ <enum value="0x8D74" name="GL_LUMINANCE32UI_EXT"/> >+ <enum value="0x8D75" name="GL_LUMINANCE_ALPHA32UI_EXT"/> >+ <enum value="0x8D76" name="GL_RGBA16UI"/> >+ <enum value="0x8D76" name="GL_RGBA16UI_EXT"/> >+ <enum value="0x8D77" name="GL_RGB16UI"/> >+ <enum value="0x8D77" name="GL_RGB16UI_EXT"/> >+ <enum value="0x8D78" name="GL_ALPHA16UI_EXT"/> >+ <enum value="0x8D79" name="GL_INTENSITY16UI_EXT"/> >+ <enum value="0x8D7A" name="GL_LUMINANCE16UI_EXT"/> >+ <enum value="0x8D7B" name="GL_LUMINANCE_ALPHA16UI_EXT"/> >+ <enum value="0x8D7C" name="GL_RGBA8UI"/> >+ <enum value="0x8D7C" name="GL_RGBA8UI_EXT"/> >+ <enum value="0x8D7D" name="GL_RGB8UI"/> >+ <enum value="0x8D7D" name="GL_RGB8UI_EXT"/> >+ <enum value="0x8D7E" name="GL_ALPHA8UI_EXT"/> >+ <enum value="0x8D7F" name="GL_INTENSITY8UI_EXT"/> >+ <enum value="0x8D80" name="GL_LUMINANCE8UI_EXT"/> >+ <enum value="0x8D81" name="GL_LUMINANCE_ALPHA8UI_EXT"/> >+ <enum value="0x8D82" name="GL_RGBA32I"/> >+ <enum value="0x8D82" name="GL_RGBA32I_EXT"/> >+ <enum value="0x8D83" name="GL_RGB32I"/> >+ <enum value="0x8D83" name="GL_RGB32I_EXT"/> >+ <enum value="0x8D84" name="GL_ALPHA32I_EXT"/> >+ <enum value="0x8D85" name="GL_INTENSITY32I_EXT"/> >+ <enum value="0x8D86" name="GL_LUMINANCE32I_EXT"/> >+ <enum value="0x8D87" name="GL_LUMINANCE_ALPHA32I_EXT"/> >+ <enum value="0x8D88" name="GL_RGBA16I"/> >+ <enum value="0x8D88" name="GL_RGBA16I_EXT"/> >+ <enum value="0x8D89" name="GL_RGB16I"/> >+ <enum value="0x8D89" name="GL_RGB16I_EXT"/> >+ <enum value="0x8D8A" name="GL_ALPHA16I_EXT"/> >+ <enum value="0x8D8B" name="GL_INTENSITY16I_EXT"/> >+ <enum value="0x8D8C" name="GL_LUMINANCE16I_EXT"/> >+ <enum value="0x8D8D" name="GL_LUMINANCE_ALPHA16I_EXT"/> >+ <enum value="0x8D8E" name="GL_RGBA8I"/> >+ <enum value="0x8D8E" name="GL_RGBA8I_EXT"/> >+ <enum value="0x8D8F" name="GL_RGB8I"/> >+ <enum value="0x8D8F" name="GL_RGB8I_EXT"/> >+ <enum value="0x8D90" name="GL_ALPHA8I_EXT"/> >+ <enum value="0x8D91" name="GL_INTENSITY8I_EXT"/> >+ <enum value="0x8D92" name="GL_LUMINANCE8I_EXT"/> >+ <enum value="0x8D93" name="GL_LUMINANCE_ALPHA8I_EXT"/> >+ <enum value="0x8D94" name="GL_RED_INTEGER"/> >+ <enum value="0x8D94" name="GL_RED_INTEGER_EXT"/> >+ <enum value="0x8D95" name="GL_GREEN_INTEGER"/> >+ <enum value="0x8D95" name="GL_GREEN_INTEGER_EXT"/> >+ <enum value="0x8D96" name="GL_BLUE_INTEGER"/> >+ <enum value="0x8D96" name="GL_BLUE_INTEGER_EXT"/> >+ <enum value="0x8D97" name="GL_ALPHA_INTEGER"/> >+ <enum value="0x8D97" name="GL_ALPHA_INTEGER_EXT"/> >+ <enum value="0x8D98" name="GL_RGB_INTEGER"/> >+ <enum value="0x8D98" name="GL_RGB_INTEGER_EXT"/> >+ <enum value="0x8D99" name="GL_RGBA_INTEGER"/> >+ <enum value="0x8D99" name="GL_RGBA_INTEGER_EXT"/> >+ <enum value="0x8D9A" name="GL_BGR_INTEGER"/> >+ <enum value="0x8D9A" name="GL_BGR_INTEGER_EXT"/> >+ <enum value="0x8D9B" name="GL_BGRA_INTEGER"/> >+ <enum value="0x8D9B" name="GL_BGRA_INTEGER_EXT"/> >+ <enum value="0x8D9C" name="GL_LUMINANCE_INTEGER_EXT"/> >+ <enum value="0x8D9D" name="GL_LUMINANCE_ALPHA_INTEGER_EXT"/> >+ <enum value="0x8D9E" name="GL_RGBA_INTEGER_MODE_EXT"/> >+ <enum value="0x8D9F" name="GL_INT_2_10_10_10_REV"/> >+ <enum value="0x8DA0" name="GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV"/> >+ <enum value="0x8DA1" name="GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV"/> >+ <enum value="0x8DA2" name="GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV"/> >+ <enum value="0x8DA3" name="GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV"/> >+ <enum value="0x8DA4" name="GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV"/> >+ <enum value="0x8DA5" name="GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV"/> >+ <enum value="0x8DA6" name="GL_MAX_PROGRAM_GENERIC_RESULTS_NV"/> >+ <enum value="0x8DA7" name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED"/> >+ <enum value="0x8DA7" name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB"/> >+ <enum value="0x8DA7" name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT"/> >+ <enum value="0x8DA7" name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED_OES"/> >+ <enum value="0x8DA8" name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS"/> >+ <enum value="0x8DA8" name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB"/> >+ <enum value="0x8DA8" name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT"/> >+ <enum value="0x8DA8" name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_OES"/> >+ <enum value="0x8DA9" name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB"/> >+ <enum value="0x8DA9" name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT"/> >+ <!-- Also see the odd namespace "NVTransformFeedbackToken" above --> >+ <enum value="0x8DAA" name="GL_LAYER_NV"/> >+ <enum value="0x8DAB" name="GL_DEPTH_COMPONENT32F_NV"/> >+ <enum value="0x8DAC" name="GL_DEPTH32F_STENCIL8_NV"/> >+ <enum value="0x8DAD" name="GL_FLOAT_32_UNSIGNED_INT_24_8_REV"/> >+ <enum value="0x8DAD" name="GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV"/> >+ <enum value="0x8DAE" name="GL_SHADER_INCLUDE_ARB"/> >+ <enum value="0x8DAF" name="GL_DEPTH_BUFFER_FLOAT_MODE_NV"/> >+ <unused start="0x8DB0" end="0x8DB8" vendor="NV"/> >+ <enum value="0x8DB9" name="GL_FRAMEBUFFER_SRGB"/> >+ <enum value="0x8DB9" name="GL_FRAMEBUFFER_SRGB_EXT"/> >+ <enum value="0x8DBA" name="GL_FRAMEBUFFER_SRGB_CAPABLE_EXT"/> >+ <enum value="0x8DBB" name="GL_COMPRESSED_RED_RGTC1"/> >+ <enum value="0x8DBB" name="GL_COMPRESSED_RED_RGTC1_EXT"/> >+ <enum value="0x8DBC" name="GL_COMPRESSED_SIGNED_RED_RGTC1"/> >+ <enum value="0x8DBC" name="GL_COMPRESSED_SIGNED_RED_RGTC1_EXT"/> >+ <enum value="0x8DBD" name="GL_COMPRESSED_RED_GREEN_RGTC2_EXT"/> >+ <enum value="0x8DBD" name="GL_COMPRESSED_RG_RGTC2"/> >+ <enum value="0x8DBE" name="GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT"/> >+ <enum value="0x8DBE" name="GL_COMPRESSED_SIGNED_RG_RGTC2"/> >+ <enum value="0x8DC0" name="GL_SAMPLER_1D_ARRAY"/> >+ <enum value="0x8DC0" name="GL_SAMPLER_1D_ARRAY_EXT"/> >+ <enum value="0x8DC1" name="GL_SAMPLER_2D_ARRAY"/> >+ <enum value="0x8DC1" name="GL_SAMPLER_2D_ARRAY_EXT"/> >+ <enum value="0x8DC2" name="GL_SAMPLER_BUFFER"/> >+ <enum value="0x8DC2" name="GL_SAMPLER_BUFFER_EXT"/> >+ <enum value="0x8DC2" name="GL_SAMPLER_BUFFER_OES"/> >+ <enum value="0x8DC3" name="GL_SAMPLER_1D_ARRAY_SHADOW"/> >+ <enum value="0x8DC3" name="GL_SAMPLER_1D_ARRAY_SHADOW_EXT"/> >+ <enum value="0x8DC4" name="GL_SAMPLER_2D_ARRAY_SHADOW"/> >+ <enum value="0x8DC4" name="GL_SAMPLER_2D_ARRAY_SHADOW_EXT"/> >+ <enum value="0x8DC4" name="GL_SAMPLER_2D_ARRAY_SHADOW_NV"/> >+ <enum value="0x8DC5" name="GL_SAMPLER_CUBE_SHADOW"/> >+ <enum value="0x8DC5" name="GL_SAMPLER_CUBE_SHADOW_EXT"/> >+ <enum value="0x8DC5" name="GL_SAMPLER_CUBE_SHADOW_NV"/> >+ <enum value="0x8DC6" name="GL_UNSIGNED_INT_VEC2"/> >+ <enum value="0x8DC6" name="GL_UNSIGNED_INT_VEC2_EXT"/> >+ <enum value="0x8DC7" name="GL_UNSIGNED_INT_VEC3"/> >+ <enum value="0x8DC7" name="GL_UNSIGNED_INT_VEC3_EXT"/> >+ <enum value="0x8DC8" name="GL_UNSIGNED_INT_VEC4"/> >+ <enum value="0x8DC8" name="GL_UNSIGNED_INT_VEC4_EXT"/> >+ <enum value="0x8DC9" name="GL_INT_SAMPLER_1D"/> >+ <enum value="0x8DC9" name="GL_INT_SAMPLER_1D_EXT"/> >+ <enum value="0x8DCA" name="GL_INT_SAMPLER_2D"/> >+ <enum value="0x8DCA" name="GL_INT_SAMPLER_2D_EXT"/> >+ <enum value="0x8DCB" name="GL_INT_SAMPLER_3D"/> >+ <enum value="0x8DCB" name="GL_INT_SAMPLER_3D_EXT"/> >+ <enum value="0x8DCC" name="GL_INT_SAMPLER_CUBE"/> >+ <enum value="0x8DCC" name="GL_INT_SAMPLER_CUBE_EXT"/> >+ <enum value="0x8DCD" name="GL_INT_SAMPLER_2D_RECT"/> >+ <enum value="0x8DCD" name="GL_INT_SAMPLER_2D_RECT_EXT"/> >+ <enum value="0x8DCE" name="GL_INT_SAMPLER_1D_ARRAY"/> >+ <enum value="0x8DCE" name="GL_INT_SAMPLER_1D_ARRAY_EXT"/> >+ <enum value="0x8DCF" name="GL_INT_SAMPLER_2D_ARRAY"/> >+ <enum value="0x8DCF" name="GL_INT_SAMPLER_2D_ARRAY_EXT"/> >+ <enum value="0x8DD0" name="GL_INT_SAMPLER_BUFFER"/> >+ <enum value="0x8DD0" name="GL_INT_SAMPLER_BUFFER_EXT"/> >+ <enum value="0x8DD0" name="GL_INT_SAMPLER_BUFFER_OES"/> >+ <enum value="0x8DD1" name="GL_UNSIGNED_INT_SAMPLER_1D"/> >+ <enum value="0x8DD1" name="GL_UNSIGNED_INT_SAMPLER_1D_EXT"/> >+ <enum value="0x8DD2" name="GL_UNSIGNED_INT_SAMPLER_2D"/> >+ <enum value="0x8DD2" name="GL_UNSIGNED_INT_SAMPLER_2D_EXT"/> >+ <enum value="0x8DD3" name="GL_UNSIGNED_INT_SAMPLER_3D"/> >+ <enum value="0x8DD3" name="GL_UNSIGNED_INT_SAMPLER_3D_EXT"/> >+ <enum value="0x8DD4" name="GL_UNSIGNED_INT_SAMPLER_CUBE"/> >+ <enum value="0x8DD4" name="GL_UNSIGNED_INT_SAMPLER_CUBE_EXT"/> >+ <enum value="0x8DD5" name="GL_UNSIGNED_INT_SAMPLER_2D_RECT"/> >+ <enum value="0x8DD5" name="GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT"/> >+ <enum value="0x8DD6" name="GL_UNSIGNED_INT_SAMPLER_1D_ARRAY"/> >+ <enum value="0x8DD6" name="GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT"/> >+ <enum value="0x8DD7" name="GL_UNSIGNED_INT_SAMPLER_2D_ARRAY"/> >+ <enum value="0x8DD7" name="GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT"/> >+ <enum value="0x8DD8" name="GL_UNSIGNED_INT_SAMPLER_BUFFER"/> >+ <enum value="0x8DD8" name="GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT"/> >+ <enum value="0x8DD8" name="GL_UNSIGNED_INT_SAMPLER_BUFFER_OES"/> >+ <enum value="0x8DD9" name="GL_GEOMETRY_SHADER"/> >+ <enum value="0x8DD9" name="GL_GEOMETRY_SHADER_ARB"/> >+ <enum value="0x8DD9" name="GL_GEOMETRY_SHADER_EXT"/> >+ <enum value="0x8DD9" name="GL_GEOMETRY_SHADER_OES"/> >+ <enum value="0x8DDA" name="GL_GEOMETRY_VERTICES_OUT_ARB"/> >+ <enum value="0x8DDA" name="GL_GEOMETRY_VERTICES_OUT_EXT"/> >+ <enum value="0x8DDB" name="GL_GEOMETRY_INPUT_TYPE_ARB"/> >+ <enum value="0x8DDB" name="GL_GEOMETRY_INPUT_TYPE_EXT"/> >+ <enum value="0x8DDC" name="GL_GEOMETRY_OUTPUT_TYPE_ARB"/> >+ <enum value="0x8DDC" name="GL_GEOMETRY_OUTPUT_TYPE_EXT"/> >+ <enum value="0x8DDD" name="GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB"/> >+ <enum value="0x8DDD" name="GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT"/> >+ <enum value="0x8DDE" name="GL_MAX_VERTEX_VARYING_COMPONENTS_ARB"/> >+ <enum value="0x8DDE" name="GL_MAX_VERTEX_VARYING_COMPONENTS_EXT"/> >+ <enum value="0x8DDF" name="GL_MAX_GEOMETRY_UNIFORM_COMPONENTS"/> >+ <enum value="0x8DDF" name="GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB"/> >+ <enum value="0x8DDF" name="GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT"/> >+ <enum value="0x8DDF" name="GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_OES"/> >+ <enum value="0x8DE0" name="GL_MAX_GEOMETRY_OUTPUT_VERTICES"/> >+ <enum value="0x8DE0" name="GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB"/> >+ <enum value="0x8DE0" name="GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT"/> >+ <enum value="0x8DE0" name="GL_MAX_GEOMETRY_OUTPUT_VERTICES_OES"/> >+ <enum value="0x8DE1" name="GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS"/> >+ <enum value="0x8DE1" name="GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB"/> >+ <enum value="0x8DE1" name="GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT"/> >+ <enum value="0x8DE1" name="GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_OES"/> >+ <enum value="0x8DE2" name="GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT"/> >+ <enum value="0x8DE3" name="GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT"/> >+ <enum value="0x8DE4" name="GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT"/> >+ <enum value="0x8DE5" name="GL_ACTIVE_SUBROUTINES"/> >+ <enum value="0x8DE6" name="GL_ACTIVE_SUBROUTINE_UNIFORMS"/> >+ <enum value="0x8DE7" name="GL_MAX_SUBROUTINES"/> >+ <enum value="0x8DE8" name="GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS"/> >+ <enum value="0x8DE9" name="GL_NAMED_STRING_LENGTH_ARB"/> >+ <enum value="0x8DEA" name="GL_NAMED_STRING_TYPE_ARB"/> >+ <unused start="0x8DEB" end="0x8DEC" vendor="NV"/> >+ <enum value="0x8DED" name="GL_MAX_BINDABLE_UNIFORM_SIZE_EXT"/> >+ <enum value="0x8DEE" name="GL_UNIFORM_BUFFER_EXT"/> >+ <enum value="0x8DEF" name="GL_UNIFORM_BUFFER_BINDING_EXT"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8DF0" end="0x8E0F" vendor="OES"> >+ <enum value="0x8DF0" name="GL_LOW_FLOAT"/> >+ <enum value="0x8DF1" name="GL_MEDIUM_FLOAT"/> >+ <enum value="0x8DF2" name="GL_HIGH_FLOAT"/> >+ <enum value="0x8DF3" name="GL_LOW_INT"/> >+ <enum value="0x8DF4" name="GL_MEDIUM_INT"/> >+ <enum value="0x8DF5" name="GL_HIGH_INT"/> >+ <enum value="0x8DF6" name="GL_UNSIGNED_INT_10_10_10_2_OES"/> >+ <enum value="0x8DF7" name="GL_INT_10_10_10_2_OES"/> >+ <enum value="0x8DF8" name="GL_SHADER_BINARY_FORMATS"/> >+ <enum value="0x8DF9" name="GL_NUM_SHADER_BINARY_FORMATS"/> >+ <enum value="0x8DFA" name="GL_SHADER_COMPILER"/> >+ <enum value="0x8DFB" name="GL_MAX_VERTEX_UNIFORM_VECTORS"/> >+ <enum value="0x8DFC" name="GL_MAX_VARYING_VECTORS"/> >+ <enum value="0x8DFD" name="GL_MAX_FRAGMENT_UNIFORM_VECTORS"/> >+ <unused start="0x8DFE" end="0x8E0F" vendor="OES"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8E10" end="0x8E8F" vendor="NV" comment="For Michael Gold 2006/08/07"> >+ <enum value="0x8E10" name="GL_RENDERBUFFER_COLOR_SAMPLES_NV"/> >+ <enum value="0x8E11" name="GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV"/> >+ <enum value="0x8E12" name="GL_MULTISAMPLE_COVERAGE_MODES_NV"/> >+ <enum value="0x8E13" name="GL_QUERY_WAIT"/> >+ <enum value="0x8E13" name="GL_QUERY_WAIT_NV"/> >+ <enum value="0x8E14" name="GL_QUERY_NO_WAIT"/> >+ <enum value="0x8E14" name="GL_QUERY_NO_WAIT_NV"/> >+ <enum value="0x8E15" name="GL_QUERY_BY_REGION_WAIT"/> >+ <enum value="0x8E15" name="GL_QUERY_BY_REGION_WAIT_NV"/> >+ <enum value="0x8E16" name="GL_QUERY_BY_REGION_NO_WAIT"/> >+ <enum value="0x8E16" name="GL_QUERY_BY_REGION_NO_WAIT_NV"/> >+ <enum value="0x8E17" name="GL_QUERY_WAIT_INVERTED"/> >+ <enum value="0x8E18" name="GL_QUERY_NO_WAIT_INVERTED"/> >+ <enum value="0x8E19" name="GL_QUERY_BY_REGION_WAIT_INVERTED"/> >+ <enum value="0x8E1A" name="GL_QUERY_BY_REGION_NO_WAIT_INVERTED"/> >+ <enum value="0x8E1B" name="GL_POLYGON_OFFSET_CLAMP"/> >+ <enum value="0x8E1B" name="GL_POLYGON_OFFSET_CLAMP_EXT" alias="GL_POLYGON_OFFSET_CLAMP"/> >+ <unused start="0x8E1C" end="0x8E1D" vendor="NV"/> >+ <enum value="0x8E1E" name="GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS"/> >+ <enum value="0x8E1E" name="GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT"/> >+ <enum value="0x8E1E" name="GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES"/> >+ <enum value="0x8E1F" name="GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS"/> >+ <enum value="0x8E1F" name="GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT"/> >+ <enum value="0x8E1F" name="GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES"/> >+ <enum value="0x8E20" name="GL_COLOR_SAMPLES_NV"/> >+ <unused start="0x8E21" vendor="NV"/> >+ <enum value="0x8E22" name="GL_TRANSFORM_FEEDBACK"/> >+ <enum value="0x8E22" name="GL_TRANSFORM_FEEDBACK_NV"/> >+ <enum value="0x8E23" name="GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED"/> >+ <enum value="0x8E23" name="GL_TRANSFORM_FEEDBACK_PAUSED" alias="GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED"/> >+ <enum value="0x8E23" name="GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV"/> >+ <enum value="0x8E24" name="GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE"/> >+ <enum value="0x8E24" name="GL_TRANSFORM_FEEDBACK_ACTIVE" alias="GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE"/> >+ <enum value="0x8E24" name="GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV"/> >+ <enum value="0x8E25" name="GL_TRANSFORM_FEEDBACK_BINDING"/> >+ <enum value="0x8E25" name="GL_TRANSFORM_FEEDBACK_BINDING_NV"/> >+ <enum value="0x8E26" name="GL_FRAME_NV"/> >+ <enum value="0x8E27" name="GL_FIELDS_NV"/> >+ <enum value="0x8E28" name="GL_CURRENT_TIME_NV"/> >+ <enum value="0x8E28" name="GL_TIMESTAMP"/> >+ <enum value="0x8E28" name="GL_TIMESTAMP_EXT"/> >+ <enum value="0x8E29" name="GL_NUM_FILL_STREAMS_NV"/> >+ <enum value="0x8E2A" name="GL_PRESENT_TIME_NV"/> >+ <enum value="0x8E2B" name="GL_PRESENT_DURATION_NV"/> >+ <enum value="0x8E2C" name="GL_DEPTH_COMPONENT16_NONLINEAR_NV"/> >+ <enum value="0x8E2D" name="GL_PROGRAM_MATRIX_EXT"/> >+ <enum value="0x8E2E" name="GL_TRANSPOSE_PROGRAM_MATRIX_EXT"/> >+ <enum value="0x8E2F" name="GL_PROGRAM_MATRIX_STACK_DEPTH_EXT"/> >+ <unused start="0x8E30" end="0x8E41" vendor="NV"/> >+ <enum value="0x8E42" name="GL_TEXTURE_SWIZZLE_R"/> >+ <enum value="0x8E42" name="GL_TEXTURE_SWIZZLE_R_EXT"/> >+ <enum value="0x8E43" name="GL_TEXTURE_SWIZZLE_G"/> >+ <enum value="0x8E43" name="GL_TEXTURE_SWIZZLE_G_EXT"/> >+ <enum value="0x8E44" name="GL_TEXTURE_SWIZZLE_B"/> >+ <enum value="0x8E44" name="GL_TEXTURE_SWIZZLE_B_EXT"/> >+ <enum value="0x8E45" name="GL_TEXTURE_SWIZZLE_A"/> >+ <enum value="0x8E45" name="GL_TEXTURE_SWIZZLE_A_EXT"/> >+ <enum value="0x8E46" name="GL_TEXTURE_SWIZZLE_RGBA"/> >+ <enum value="0x8E46" name="GL_TEXTURE_SWIZZLE_RGBA_EXT"/> >+ <enum value="0x8E47" name="GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS"/> >+ <enum value="0x8E48" name="GL_ACTIVE_SUBROUTINE_MAX_LENGTH"/> >+ <enum value="0x8E49" name="GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH"/> >+ <enum value="0x8E4A" name="GL_NUM_COMPATIBLE_SUBROUTINES"/> >+ <enum value="0x8E4B" name="GL_COMPATIBLE_SUBROUTINES"/> >+ <enum value="0x8E4C" name="GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION"/> >+ <enum value="0x8E4C" name="GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT"/> >+ <enum value="0x8E4D" name="GL_FIRST_VERTEX_CONVENTION"/> >+ <enum value="0x8E4D" name="GL_FIRST_VERTEX_CONVENTION_EXT"/> >+ <enum value="0x8E4D" name="GL_FIRST_VERTEX_CONVENTION_OES"/> >+ <enum value="0x8E4E" name="GL_LAST_VERTEX_CONVENTION"/> >+ <enum value="0x8E4E" name="GL_LAST_VERTEX_CONVENTION_EXT"/> >+ <enum value="0x8E4E" name="GL_LAST_VERTEX_CONVENTION_OES"/> >+ <enum value="0x8E4F" name="GL_PROVOKING_VERTEX"/> >+ <enum value="0x8E4F" name="GL_PROVOKING_VERTEX_EXT"/> >+ <enum value="0x8E50" name="GL_SAMPLE_POSITION"/> >+ <enum value="0x8E50" name="GL_SAMPLE_POSITION_NV"/> >+ <enum value="0x8E50" name="GL_SAMPLE_LOCATION_ARB" alias="GL_SAMPLE_POSITION"/> >+ <enum value="0x8E50" name="GL_SAMPLE_LOCATION_NV" alias="GL_SAMPLE_POSITION_NV"/> >+ <enum value="0x8E51" name="GL_SAMPLE_MASK"/> >+ <enum value="0x8E51" name="GL_SAMPLE_MASK_NV"/> >+ <enum value="0x8E52" name="GL_SAMPLE_MASK_VALUE"/> >+ <enum value="0x8E52" name="GL_SAMPLE_MASK_VALUE_NV"/> >+ <enum value="0x8E53" name="GL_TEXTURE_BINDING_RENDERBUFFER_NV"/> >+ <enum value="0x8E54" name="GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV"/> >+ <enum value="0x8E55" name="GL_TEXTURE_RENDERBUFFER_NV"/> >+ <enum value="0x8E56" name="GL_SAMPLER_RENDERBUFFER_NV"/> >+ <enum value="0x8E57" name="GL_INT_SAMPLER_RENDERBUFFER_NV"/> >+ <enum value="0x8E58" name="GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV"/> >+ <enum value="0x8E59" name="GL_MAX_SAMPLE_MASK_WORDS"/> >+ <enum value="0x8E59" name="GL_MAX_SAMPLE_MASK_WORDS_NV"/> >+ <enum value="0x8E5A" name="GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV"/> >+ <enum value="0x8E5A" name="GL_MAX_GEOMETRY_SHADER_INVOCATIONS"/> >+ <enum value="0x8E5A" name="GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT"/> >+ <enum value="0x8E5A" name="GL_MAX_GEOMETRY_SHADER_INVOCATIONS_OES"/> >+ <enum value="0x8E5B" name="GL_MIN_FRAGMENT_INTERPOLATION_OFFSET"/> >+ <enum value="0x8E5B" name="GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES"/> >+ <enum value="0x8E5B" name="GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV"/> >+ <enum value="0x8E5C" name="GL_MAX_FRAGMENT_INTERPOLATION_OFFSET"/> >+ <enum value="0x8E5C" name="GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES"/> >+ <enum value="0x8E5C" name="GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV"/> >+ <enum value="0x8E5D" name="GL_FRAGMENT_INTERPOLATION_OFFSET_BITS"/> >+ <enum value="0x8E5D" name="GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES"/> >+ <enum value="0x8E5D" name="GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV"/> >+ <enum value="0x8E5E" name="GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET"/> >+ <enum value="0x8E5E" name="GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB"/> >+ <enum value="0x8E5E" name="GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV"/> >+ <enum value="0x8E5F" name="GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET"/> >+ <enum value="0x8E5F" name="GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB"/> >+ <enum value="0x8E5F" name="GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV"/> >+ <unused start="0x8E60" end="0x8E6F" vendor="NV"/> >+ <enum value="0x8E70" name="GL_MAX_TRANSFORM_FEEDBACK_BUFFERS"/> >+ <enum value="0x8E71" name="GL_MAX_VERTEX_STREAMS"/> >+ <enum value="0x8E72" name="GL_PATCH_VERTICES"/> >+ <enum value="0x8E72" name="GL_PATCH_VERTICES_EXT"/> >+ <enum value="0x8E72" name="GL_PATCH_VERTICES_OES"/> >+ <enum value="0x8E73" name="GL_PATCH_DEFAULT_INNER_LEVEL"/> >+ <enum value="0x8E73" name="GL_PATCH_DEFAULT_INNER_LEVEL_EXT"/> >+ <enum value="0x8E74" name="GL_PATCH_DEFAULT_OUTER_LEVEL"/> >+ <enum value="0x8E74" name="GL_PATCH_DEFAULT_OUTER_LEVEL_EXT"/> >+ <enum value="0x8E75" name="GL_TESS_CONTROL_OUTPUT_VERTICES"/> >+ <enum value="0x8E75" name="GL_TESS_CONTROL_OUTPUT_VERTICES_EXT"/> >+ <enum value="0x8E75" name="GL_TESS_CONTROL_OUTPUT_VERTICES_OES"/> >+ <enum value="0x8E76" name="GL_TESS_GEN_MODE"/> >+ <enum value="0x8E76" name="GL_TESS_GEN_MODE_EXT"/> >+ <enum value="0x8E76" name="GL_TESS_GEN_MODE_OES"/> >+ <enum value="0x8E77" name="GL_TESS_GEN_SPACING"/> >+ <enum value="0x8E77" name="GL_TESS_GEN_SPACING_EXT"/> >+ <enum value="0x8E77" name="GL_TESS_GEN_SPACING_OES"/> >+ <enum value="0x8E78" name="GL_TESS_GEN_VERTEX_ORDER"/> >+ <enum value="0x8E78" name="GL_TESS_GEN_VERTEX_ORDER_EXT"/> >+ <enum value="0x8E78" name="GL_TESS_GEN_VERTEX_ORDER_OES"/> >+ <enum value="0x8E79" name="GL_TESS_GEN_POINT_MODE"/> >+ <enum value="0x8E79" name="GL_TESS_GEN_POINT_MODE_EXT"/> >+ <enum value="0x8E79" name="GL_TESS_GEN_POINT_MODE_OES"/> >+ <enum value="0x8E7A" name="GL_ISOLINES"/> >+ <enum value="0x8E7A" name="GL_ISOLINES_EXT"/> >+ <enum value="0x8E7A" name="GL_ISOLINES_OES"/> >+ <enum value="0x8E7B" name="GL_FRACTIONAL_ODD"/> >+ <enum value="0x8E7B" name="GL_FRACTIONAL_ODD_EXT"/> >+ <enum value="0x8E7B" name="GL_FRACTIONAL_ODD_OES"/> >+ <enum value="0x8E7C" name="GL_FRACTIONAL_EVEN"/> >+ <enum value="0x8E7C" name="GL_FRACTIONAL_EVEN_EXT"/> >+ <enum value="0x8E7C" name="GL_FRACTIONAL_EVEN_OES"/> >+ <enum value="0x8E7D" name="GL_MAX_PATCH_VERTICES"/> >+ <enum value="0x8E7D" name="GL_MAX_PATCH_VERTICES_EXT"/> >+ <enum value="0x8E7D" name="GL_MAX_PATCH_VERTICES_OES"/> >+ <enum value="0x8E7E" name="GL_MAX_TESS_GEN_LEVEL"/> >+ <enum value="0x8E7E" name="GL_MAX_TESS_GEN_LEVEL_EXT"/> >+ <enum value="0x8E7E" name="GL_MAX_TESS_GEN_LEVEL_OES"/> >+ <enum value="0x8E7F" name="GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS"/> >+ <enum value="0x8E7F" name="GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT"/> >+ <enum value="0x8E7F" name="GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES"/> >+ <enum value="0x8E80" name="GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS"/> >+ <enum value="0x8E80" name="GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT"/> >+ <enum value="0x8E80" name="GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES"/> >+ <enum value="0x8E81" name="GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS"/> >+ <enum value="0x8E81" name="GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT"/> >+ <enum value="0x8E81" name="GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES"/> >+ <enum value="0x8E82" name="GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS"/> >+ <enum value="0x8E82" name="GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT"/> >+ <enum value="0x8E82" name="GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES"/> >+ <enum value="0x8E83" name="GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS"/> >+ <enum value="0x8E83" name="GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT"/> >+ <enum value="0x8E83" name="GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_OES"/> >+ <enum value="0x8E84" name="GL_MAX_TESS_PATCH_COMPONENTS"/> >+ <enum value="0x8E84" name="GL_MAX_TESS_PATCH_COMPONENTS_EXT"/> >+ <enum value="0x8E84" name="GL_MAX_TESS_PATCH_COMPONENTS_OES"/> >+ <enum value="0x8E85" name="GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS"/> >+ <enum value="0x8E85" name="GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT"/> >+ <enum value="0x8E85" name="GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_OES"/> >+ <enum value="0x8E86" name="GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS"/> >+ <enum value="0x8E86" name="GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT"/> >+ <enum value="0x8E86" name="GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_OES"/> >+ <enum value="0x8E87" name="GL_TESS_EVALUATION_SHADER"/> >+ <enum value="0x8E87" name="GL_TESS_EVALUATION_SHADER_EXT"/> >+ <enum value="0x8E87" name="GL_TESS_EVALUATION_SHADER_OES"/> >+ <enum value="0x8E88" name="GL_TESS_CONTROL_SHADER"/> >+ <enum value="0x8E88" name="GL_TESS_CONTROL_SHADER_EXT"/> >+ <enum value="0x8E88" name="GL_TESS_CONTROL_SHADER_OES"/> >+ <enum value="0x8E89" name="GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS"/> >+ <enum value="0x8E89" name="GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT"/> >+ <enum value="0x8E89" name="GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES"/> >+ <enum value="0x8E8A" name="GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS"/> >+ <enum value="0x8E8A" name="GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT"/> >+ <enum value="0x8E8A" name="GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES"/> >+ <unused start="0x8E8B" vendor="NV"/> >+ <enum value="0x8E8C" name="GL_COMPRESSED_RGBA_BPTC_UNORM"/> >+ <enum value="0x8E8C" name="GL_COMPRESSED_RGBA_BPTC_UNORM_ARB"/> >+ <enum value="0x8E8C" name="GL_COMPRESSED_RGBA_BPTC_UNORM_EXT"/> >+ <enum value="0x8E8D" name="GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM"/> >+ <enum value="0x8E8D" name="GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB"/> >+ <enum value="0x8E8D" name="GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT"/> >+ <enum value="0x8E8E" name="GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT"/> >+ <enum value="0x8E8E" name="GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB"/> >+ <enum value="0x8E8E" name="GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT"/> >+ <enum value="0x8E8F" name="GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT"/> >+ <enum value="0x8E8F" name="GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB"/> >+ <enum value="0x8E8F" name="GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8E90" end="0x8E9F" vendor="QNX" comment="For QNX_texture_tiling, QNX_complex_polygon, QNX_stippled_lines (Khronos bug 696)"> >+ <unused start="0x8E90" end="0x8E9F" vendor="QNX"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8EA0" end="0x8EAF" vendor="IMG"> >+ <unused start="0x8EA0" end="0x8EAF" vendor="IMG"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8EB0" end="0x8EBF" vendor="OES" comment="For Affie Munshi 2007/07/20"> >+ <unused start="0x8EB0" end="0x8EBF" vendor="OES"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8EC0" end="0x8ECF" vendor="Vincent"> >+ <unused start="0x8EC0" end="0x8ECF" vendor="Vincent"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8ED0" end="0x8F4F" vendor="NV" comment="For Pat Brown, Khronos bug 3191"> >+ <enum value="0x8ED0" name="GL_COVERAGE_COMPONENT_NV"/> >+ <enum value="0x8ED1" name="GL_COVERAGE_COMPONENT4_NV"/> >+ <enum value="0x8ED2" name="GL_COVERAGE_ATTACHMENT_NV"/> >+ <enum value="0x8ED3" name="GL_COVERAGE_BUFFERS_NV"/> >+ <enum value="0x8ED4" name="GL_COVERAGE_SAMPLES_NV"/> >+ <enum value="0x8ED5" name="GL_COVERAGE_ALL_FRAGMENTS_NV"/> >+ <enum value="0x8ED6" name="GL_COVERAGE_EDGE_FRAGMENTS_NV"/> >+ <enum value="0x8ED7" name="GL_COVERAGE_AUTOMATIC_NV"/> >+ <unused start="0x8ED8" end="0x8F0F" vendor="NV"/> >+ <enum value="0x8F10" name="GL_INCLUSIVE_EXT"/> >+ <enum value="0x8F11" name="GL_EXCLUSIVE_EXT"/> >+ <enum value="0x8F12" name="GL_WINDOW_RECTANGLE_EXT"/> >+ <enum value="0x8F13" name="GL_WINDOW_RECTANGLE_MODE_EXT"/> >+ <enum value="0x8F14" name="GL_MAX_WINDOW_RECTANGLES_EXT"/> >+ <enum value="0x8F15" name="GL_NUM_WINDOW_RECTANGLES_EXT"/> >+ <unused start="0x8F16" end="0x8F1C" vendor="NV"/> >+ <enum value="0x8F1D" name="GL_BUFFER_GPU_ADDRESS_NV"/> >+ <enum value="0x8F1E" name="GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV"/> >+ <enum value="0x8F1F" name="GL_ELEMENT_ARRAY_UNIFIED_NV"/> >+ <enum value="0x8F20" name="GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV"/> >+ <enum value="0x8F21" name="GL_VERTEX_ARRAY_ADDRESS_NV"/> >+ <enum value="0x8F22" name="GL_NORMAL_ARRAY_ADDRESS_NV"/> >+ <enum value="0x8F23" name="GL_COLOR_ARRAY_ADDRESS_NV"/> >+ <enum value="0x8F24" name="GL_INDEX_ARRAY_ADDRESS_NV"/> >+ <enum value="0x8F25" name="GL_TEXTURE_COORD_ARRAY_ADDRESS_NV"/> >+ <enum value="0x8F26" name="GL_EDGE_FLAG_ARRAY_ADDRESS_NV"/> >+ <enum value="0x8F27" name="GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV"/> >+ <enum value="0x8F28" name="GL_FOG_COORD_ARRAY_ADDRESS_NV"/> >+ <enum value="0x8F29" name="GL_ELEMENT_ARRAY_ADDRESS_NV"/> >+ <enum value="0x8F2A" name="GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV"/> >+ <enum value="0x8F2B" name="GL_VERTEX_ARRAY_LENGTH_NV"/> >+ <enum value="0x8F2C" name="GL_NORMAL_ARRAY_LENGTH_NV"/> >+ <enum value="0x8F2D" name="GL_COLOR_ARRAY_LENGTH_NV"/> >+ <enum value="0x8F2E" name="GL_INDEX_ARRAY_LENGTH_NV"/> >+ <enum value="0x8F2F" name="GL_TEXTURE_COORD_ARRAY_LENGTH_NV"/> >+ <enum value="0x8F30" name="GL_EDGE_FLAG_ARRAY_LENGTH_NV"/> >+ <enum value="0x8F31" name="GL_SECONDARY_COLOR_ARRAY_LENGTH_NV"/> >+ <enum value="0x8F32" name="GL_FOG_COORD_ARRAY_LENGTH_NV"/> >+ <enum value="0x8F33" name="GL_ELEMENT_ARRAY_LENGTH_NV"/> >+ <enum value="0x8F34" name="GL_GPU_ADDRESS_NV"/> >+ <enum value="0x8F35" name="GL_MAX_SHADER_BUFFER_ADDRESS_NV"/> >+ <enum value="0x8F36" name="GL_COPY_READ_BUFFER"/> >+ <enum value="0x8F36" name="GL_COPY_READ_BUFFER_NV"/> >+ <enum value="0x8F36" name="GL_COPY_READ_BUFFER_BINDING" alias="GL_COPY_READ_BUFFER"/> >+ <enum value="0x8F37" name="GL_COPY_WRITE_BUFFER"/> >+ <enum value="0x8F37" name="GL_COPY_WRITE_BUFFER_NV"/> >+ <enum value="0x8F37" name="GL_COPY_WRITE_BUFFER_BINDING" alias="GL_COPY_WRITE_BUFFER"/> >+ <enum value="0x8F38" name="GL_MAX_IMAGE_UNITS"/> >+ <enum value="0x8F38" name="GL_MAX_IMAGE_UNITS_EXT"/> >+ <enum value="0x8F39" name="GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS"/> >+ <enum value="0x8F39" name="GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT"/> >+ <enum value="0x8F39" name="GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES" alias="GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS"/> >+ <enum value="0x8F3A" name="GL_IMAGE_BINDING_NAME"/> >+ <enum value="0x8F3A" name="GL_IMAGE_BINDING_NAME_EXT"/> >+ <enum value="0x8F3B" name="GL_IMAGE_BINDING_LEVEL"/> >+ <enum value="0x8F3B" name="GL_IMAGE_BINDING_LEVEL_EXT"/> >+ <enum value="0x8F3C" name="GL_IMAGE_BINDING_LAYERED"/> >+ <enum value="0x8F3C" name="GL_IMAGE_BINDING_LAYERED_EXT"/> >+ <enum value="0x8F3D" name="GL_IMAGE_BINDING_LAYER"/> >+ <enum value="0x8F3D" name="GL_IMAGE_BINDING_LAYER_EXT"/> >+ <enum value="0x8F3E" name="GL_IMAGE_BINDING_ACCESS"/> >+ <enum value="0x8F3E" name="GL_IMAGE_BINDING_ACCESS_EXT"/> >+ <enum value="0x8F3F" name="GL_DRAW_INDIRECT_BUFFER"/> >+ <enum value="0x8F40" name="GL_DRAW_INDIRECT_UNIFIED_NV"/> >+ <enum value="0x8F41" name="GL_DRAW_INDIRECT_ADDRESS_NV"/> >+ <enum value="0x8F42" name="GL_DRAW_INDIRECT_LENGTH_NV"/> >+ <enum value="0x8F43" name="GL_DRAW_INDIRECT_BUFFER_BINDING"/> >+ <enum value="0x8F44" name="GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV"/> >+ <enum value="0x8F45" name="GL_MAX_PROGRAM_SUBROUTINE_NUM_NV"/> >+ <enum value="0x8F46" name="GL_DOUBLE_MAT2"/> >+ <enum value="0x8F46" name="GL_DOUBLE_MAT2_EXT"/> >+ <enum value="0x8F47" name="GL_DOUBLE_MAT3"/> >+ <enum value="0x8F47" name="GL_DOUBLE_MAT3_EXT"/> >+ <enum value="0x8F48" name="GL_DOUBLE_MAT4"/> >+ <enum value="0x8F48" name="GL_DOUBLE_MAT4_EXT"/> >+ <enum value="0x8F49" name="GL_DOUBLE_MAT2x3"/> >+ <enum value="0x8F49" name="GL_DOUBLE_MAT2x3_EXT"/> >+ <enum value="0x8F4A" name="GL_DOUBLE_MAT2x4"/> >+ <enum value="0x8F4A" name="GL_DOUBLE_MAT2x4_EXT"/> >+ <enum value="0x8F4B" name="GL_DOUBLE_MAT3x2"/> >+ <enum value="0x8F4B" name="GL_DOUBLE_MAT3x2_EXT"/> >+ <enum value="0x8F4C" name="GL_DOUBLE_MAT3x4"/> >+ <enum value="0x8F4C" name="GL_DOUBLE_MAT3x4_EXT"/> >+ <enum value="0x8F4D" name="GL_DOUBLE_MAT4x2"/> >+ <enum value="0x8F4D" name="GL_DOUBLE_MAT4x2_EXT"/> >+ <enum value="0x8F4E" name="GL_DOUBLE_MAT4x3"/> >+ <enum value="0x8F4E" name="GL_DOUBLE_MAT4x3_EXT"/> >+ <enum value="0x8F4F" name="GL_VERTEX_BINDING_BUFFER"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8F50" end="0x8F5F" vendor="ZiiLabs" comment="For Jon Kennedy, Khronos public bug 75"> >+ <unused start="0x8F50" end="0x8F5F" vendor="ZiiLabs"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8F60" end="0x8F6F" vendor="ARM" comment="For Remi Pedersen, Khronos bug 3745"> >+ <enum value="0x8F60" name="GL_MALI_SHADER_BINARY_ARM"/> >+ <enum value="0x8F61" name="GL_MALI_PROGRAM_BINARY_ARM"/> >+ <unused start="0x8F62" vendor="ARM"/> >+ <enum value="0x8F63" name="GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT"/> >+ <enum value="0x8F64" name="GL_SHADER_PIXEL_LOCAL_STORAGE_EXT"/> >+ <enum value="0x8F65" name="GL_FETCH_PER_SAMPLE_ARM"/> >+ <enum value="0x8F66" name="GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM"/> >+ <enum value="0x8F67" name="GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT"/> >+ <unused start="0x8F68" vendor="ARM"/> >+ <enum value="0x8F69" name="GL_TEXTURE_ASTC_DECODE_PRECISION_EXT"/> >+ <unused start="0x8F6A" end="0x8F6F" vendor="ARM"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8F70" end="0x8F7F" vendor="HI" comment="For Mark Callow, Khronos bug 4055. Shared with EGL."> >+ <unused start="0x8F70" end="0x8F7F" vendor="HI"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8F80" end="0x8F8F" vendor="Zebra" comment="For Mike Weiblen, public bug 910"> >+ <unused start="0x8F80" end="0x8F8F" vendor="Zebra"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8F90" end="0x8F9F" vendor="ARB"> >+ <enum value="0x8F90" name="GL_RED_SNORM"/> >+ <enum value="0x8F91" name="GL_RG_SNORM"/> >+ <enum value="0x8F92" name="GL_RGB_SNORM"/> >+ <enum value="0x8F93" name="GL_RGBA_SNORM"/> >+ <enum value="0x8F94" name="GL_R8_SNORM"/> >+ <enum value="0x8F95" name="GL_RG8_SNORM"/> >+ <enum value="0x8F96" name="GL_RGB8_SNORM"/> >+ <enum value="0x8F97" name="GL_RGBA8_SNORM"/> >+ <enum value="0x8F98" name="GL_R16_SNORM"/> >+ <enum value="0x8F98" name="GL_R16_SNORM_EXT"/> >+ <enum value="0x8F99" name="GL_RG16_SNORM"/> >+ <enum value="0x8F99" name="GL_RG16_SNORM_EXT"/> >+ <enum value="0x8F9A" name="GL_RGB16_SNORM"/> >+ <enum value="0x8F9A" name="GL_RGB16_SNORM_EXT"/> >+ <enum value="0x8F9B" name="GL_RGBA16_SNORM"/> >+ <enum value="0x8F9B" name="GL_RGBA16_SNORM_EXT"/> >+ <enum value="0x8F9C" name="GL_SIGNED_NORMALIZED"/> >+ <enum value="0x8F9D" name="GL_PRIMITIVE_RESTART"/> >+ <enum value="0x8F9E" name="GL_PRIMITIVE_RESTART_INDEX"/> >+ <enum value="0x8F9F" name="GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8FA0" end="0x8FBF" vendor="QCOM" comment="For Maurice Ribble, bug 4512"> >+ <enum value="0x8FA0" name="GL_PERFMON_GLOBAL_MODE_QCOM"/> >+ <unused start="0x8FA1" end="0x8FAF" vendor="QCOM"/> >+ <enum value="0x8FB0" name="GL_BINNING_CONTROL_HINT_QCOM"/> >+ <enum value="0x8FB1" name="GL_CPU_OPTIMIZED_QCOM"/> >+ <enum value="0x8FB2" name="GL_GPU_OPTIMIZED_QCOM"/> >+ <enum value="0x8FB3" name="GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM"/> >+ <unused start="0x8FB4" end="0x8FBA" vendor="QCOM"/> >+ <enum value="0x8FBB" name="GL_GPU_DISJOINT_EXT"/> >+ <unused start="0x8FBC" vendor="QCOM"/> >+ <enum value="0x8FBD" name="GL_SR8_EXT"/> >+ <enum value="0x8FBE" name="GL_SRG8_EXT"/> >+ <enum value="0x8FBF" name="GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8FC0" end="0x8FDF" vendor="VIV" comment="For Frido Garritsen, bug 4526"> >+ <enum value="0x8FC4" name="GL_SHADER_BINARY_VIV"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8FE0" end="0x8FFF" vendor="NV" comment="For Pat Brown, bug 4935"> >+ <enum value="0x8FE0" name="GL_INT8_NV"/> >+ <enum value="0x8FE1" name="GL_INT8_VEC2_NV"/> >+ <enum value="0x8FE2" name="GL_INT8_VEC3_NV"/> >+ <enum value="0x8FE3" name="GL_INT8_VEC4_NV"/> >+ <enum value="0x8FE4" name="GL_INT16_NV"/> >+ <enum value="0x8FE5" name="GL_INT16_VEC2_NV"/> >+ <enum value="0x8FE6" name="GL_INT16_VEC3_NV"/> >+ <enum value="0x8FE7" name="GL_INT16_VEC4_NV"/> >+ <enum value="0x8FE9" name="GL_INT64_VEC2_ARB"/> >+ <enum value="0x8FE9" name="GL_INT64_VEC2_NV"/> >+ <enum value="0x8FEA" name="GL_INT64_VEC3_ARB"/> >+ <enum value="0x8FEA" name="GL_INT64_VEC3_NV"/> >+ <enum value="0x8FEB" name="GL_INT64_VEC4_ARB"/> >+ <enum value="0x8FEB" name="GL_INT64_VEC4_NV"/> >+ <enum value="0x8FEC" name="GL_UNSIGNED_INT8_NV"/> >+ <enum value="0x8FED" name="GL_UNSIGNED_INT8_VEC2_NV"/> >+ <enum value="0x8FEE" name="GL_UNSIGNED_INT8_VEC3_NV"/> >+ <enum value="0x8FEF" name="GL_UNSIGNED_INT8_VEC4_NV"/> >+ <enum value="0x8FF0" name="GL_UNSIGNED_INT16_NV"/> >+ <enum value="0x8FF1" name="GL_UNSIGNED_INT16_VEC2_NV"/> >+ <enum value="0x8FF2" name="GL_UNSIGNED_INT16_VEC3_NV"/> >+ <enum value="0x8FF3" name="GL_UNSIGNED_INT16_VEC4_NV"/> >+ <enum value="0x8FF5" name="GL_UNSIGNED_INT64_VEC2_ARB"/> >+ <enum value="0x8FF5" name="GL_UNSIGNED_INT64_VEC2_NV"/> >+ <enum value="0x8FF6" name="GL_UNSIGNED_INT64_VEC3_ARB"/> >+ <enum value="0x8FF6" name="GL_UNSIGNED_INT64_VEC3_NV"/> >+ <enum value="0x8FF7" name="GL_UNSIGNED_INT64_VEC4_ARB"/> >+ <enum value="0x8FF7" name="GL_UNSIGNED_INT64_VEC4_NV"/> >+ <enum value="0x8FF8" name="GL_FLOAT16_NV"/> >+ <enum value="0x8FF9" name="GL_FLOAT16_VEC2_NV"/> >+ <enum value="0x8FFA" name="GL_FLOAT16_VEC3_NV"/> >+ <enum value="0x8FFB" name="GL_FLOAT16_VEC4_NV"/> >+ <enum value="0x8FFC" name="GL_DOUBLE_VEC2"/> >+ <enum value="0x8FFC" name="GL_DOUBLE_VEC2_EXT"/> >+ <enum value="0x8FFD" name="GL_DOUBLE_VEC3"/> >+ <enum value="0x8FFD" name="GL_DOUBLE_VEC3_EXT"/> >+ <enum value="0x8FFE" name="GL_DOUBLE_VEC4"/> >+ <enum value="0x8FFE" name="GL_DOUBLE_VEC4_EXT"/> >+ <unused start="0x8FFF" vendor="NV"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9000" end="0x901F" vendor="AMD" comment="For Bill Licea-Kane"> >+ <enum value="0x9001" name="GL_SAMPLER_BUFFER_AMD"/> >+ <enum value="0x9002" name="GL_INT_SAMPLER_BUFFER_AMD"/> >+ <enum value="0x9003" name="GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD"/> >+ <enum value="0x9004" name="GL_TESSELLATION_MODE_AMD"/> >+ <enum value="0x9005" name="GL_TESSELLATION_FACTOR_AMD"/> >+ <enum value="0x9006" name="GL_DISCRETE_AMD"/> >+ <enum value="0x9007" name="GL_CONTINUOUS_AMD"/> >+ <unused start="0x9008" vendor="AMD"/> >+ <enum value="0x9009" name="GL_TEXTURE_CUBE_MAP_ARRAY"/> >+ <enum value="0x9009" name="GL_TEXTURE_CUBE_MAP_ARRAY_ARB"/> >+ <enum value="0x9009" name="GL_TEXTURE_CUBE_MAP_ARRAY_EXT"/> >+ <enum value="0x9009" name="GL_TEXTURE_CUBE_MAP_ARRAY_OES"/> >+ <enum value="0x900A" name="GL_TEXTURE_BINDING_CUBE_MAP_ARRAY"/> >+ <enum value="0x900A" name="GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB"/> >+ <enum value="0x900A" name="GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT"/> >+ <enum value="0x900A" name="GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_OES"/> >+ <enum value="0x900B" name="GL_PROXY_TEXTURE_CUBE_MAP_ARRAY"/> >+ <enum value="0x900B" name="GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB"/> >+ <enum value="0x900C" name="GL_SAMPLER_CUBE_MAP_ARRAY"/> >+ <enum value="0x900C" name="GL_SAMPLER_CUBE_MAP_ARRAY_ARB"/> >+ <enum value="0x900C" name="GL_SAMPLER_CUBE_MAP_ARRAY_EXT"/> >+ <enum value="0x900C" name="GL_SAMPLER_CUBE_MAP_ARRAY_OES"/> >+ <enum value="0x900D" name="GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW"/> >+ <enum value="0x900D" name="GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB"/> >+ <enum value="0x900D" name="GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT"/> >+ <enum value="0x900D" name="GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_OES"/> >+ <enum value="0x900E" name="GL_INT_SAMPLER_CUBE_MAP_ARRAY"/> >+ <enum value="0x900E" name="GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB"/> >+ <enum value="0x900E" name="GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT"/> >+ <enum value="0x900E" name="GL_INT_SAMPLER_CUBE_MAP_ARRAY_OES"/> >+ <enum value="0x900F" name="GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY"/> >+ <enum value="0x900F" name="GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB"/> >+ <enum value="0x900F" name="GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT"/> >+ <enum value="0x900F" name="GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_OES"/> >+ <enum value="0x9010" name="GL_ALPHA_SNORM"/> >+ <enum value="0x9011" name="GL_LUMINANCE_SNORM"/> >+ <enum value="0x9012" name="GL_LUMINANCE_ALPHA_SNORM"/> >+ <enum value="0x9013" name="GL_INTENSITY_SNORM"/> >+ <enum value="0x9014" name="GL_ALPHA8_SNORM"/> >+ <enum value="0x9015" name="GL_LUMINANCE8_SNORM"/> >+ <enum value="0x9016" name="GL_LUMINANCE8_ALPHA8_SNORM"/> >+ <enum value="0x9017" name="GL_INTENSITY8_SNORM"/> >+ <enum value="0x9018" name="GL_ALPHA16_SNORM"/> >+ <enum value="0x9019" name="GL_LUMINANCE16_SNORM"/> >+ <enum value="0x901A" name="GL_LUMINANCE16_ALPHA16_SNORM"/> >+ <enum value="0x901B" name="GL_INTENSITY16_SNORM"/> >+ <enum value="0x901C" name="GL_FACTOR_MIN_AMD"/> >+ <enum value="0x901D" name="GL_FACTOR_MAX_AMD"/> >+ <enum value="0x901E" name="GL_DEPTH_CLAMP_NEAR_AMD"/> >+ <enum value="0x901F" name="GL_DEPTH_CLAMP_FAR_AMD"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9020" end="0x90FF" vendor="NV" comment="For Pat Brown, bug 4935"> >+ <enum value="0x9020" name="GL_VIDEO_BUFFER_NV"/> >+ <enum value="0x9021" name="GL_VIDEO_BUFFER_BINDING_NV"/> >+ <enum value="0x9022" name="GL_FIELD_UPPER_NV"/> >+ <enum value="0x9023" name="GL_FIELD_LOWER_NV"/> >+ <enum value="0x9024" name="GL_NUM_VIDEO_CAPTURE_STREAMS_NV"/> >+ <enum value="0x9025" name="GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV"/> >+ <enum value="0x9026" name="GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV"/> >+ <enum value="0x9027" name="GL_LAST_VIDEO_CAPTURE_STATUS_NV"/> >+ <enum value="0x9028" name="GL_VIDEO_BUFFER_PITCH_NV"/> >+ <enum value="0x9029" name="GL_VIDEO_COLOR_CONVERSION_MATRIX_NV"/> >+ <enum value="0x902A" name="GL_VIDEO_COLOR_CONVERSION_MAX_NV"/> >+ <enum value="0x902B" name="GL_VIDEO_COLOR_CONVERSION_MIN_NV"/> >+ <enum value="0x902C" name="GL_VIDEO_COLOR_CONVERSION_OFFSET_NV"/> >+ <enum value="0x902D" name="GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV"/> >+ <enum value="0x902E" name="GL_PARTIAL_SUCCESS_NV"/> >+ <enum value="0x902F" name="GL_SUCCESS_NV"/> >+ <enum value="0x9030" name="GL_FAILURE_NV"/> >+ <enum value="0x9031" name="GL_YCBYCR8_422_NV"/> >+ <enum value="0x9032" name="GL_YCBAYCR8A_4224_NV"/> >+ <enum value="0x9033" name="GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV"/> >+ <enum value="0x9034" name="GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV"/> >+ <enum value="0x9035" name="GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV"/> >+ <enum value="0x9036" name="GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV"/> >+ <enum value="0x9037" name="GL_Z4Y12Z4CB12Z4CR12_444_NV"/> >+ <enum value="0x9038" name="GL_VIDEO_CAPTURE_FRAME_WIDTH_NV"/> >+ <enum value="0x9039" name="GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV"/> >+ <enum value="0x903A" name="GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV"/> >+ <enum value="0x903B" name="GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV"/> >+ <enum value="0x903C" name="GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV"/> >+ <unused start="0x903D" end="0x9044" vendor="NV"/> >+ <enum value="0x9045" name="GL_TEXTURE_COVERAGE_SAMPLES_NV"/> >+ <enum value="0x9046" name="GL_TEXTURE_COLOR_SAMPLES_NV"/> >+ <enum value="0x9047" name="GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX"/> >+ <enum value="0x9048" name="GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX"/> >+ <enum value="0x9049" name="GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX"/> >+ <enum value="0x904A" name="GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX"/> >+ <enum value="0x904B" name="GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX"/> >+ <enum value="0x904C" name="GL_IMAGE_1D"/> >+ <enum value="0x904C" name="GL_IMAGE_1D_EXT"/> >+ <enum value="0x904D" name="GL_IMAGE_2D"/> >+ <enum value="0x904D" name="GL_IMAGE_2D_EXT"/> >+ <enum value="0x904E" name="GL_IMAGE_3D"/> >+ <enum value="0x904E" name="GL_IMAGE_3D_EXT"/> >+ <enum value="0x904F" name="GL_IMAGE_2D_RECT"/> >+ <enum value="0x904F" name="GL_IMAGE_2D_RECT_EXT"/> >+ <enum value="0x9050" name="GL_IMAGE_CUBE"/> >+ <enum value="0x9050" name="GL_IMAGE_CUBE_EXT"/> >+ <enum value="0x9051" name="GL_IMAGE_BUFFER"/> >+ <enum value="0x9051" name="GL_IMAGE_BUFFER_EXT"/> >+ <enum value="0x9051" name="GL_IMAGE_BUFFER_OES"/> >+ <enum value="0x9052" name="GL_IMAGE_1D_ARRAY"/> >+ <enum value="0x9052" name="GL_IMAGE_1D_ARRAY_EXT"/> >+ <enum value="0x9053" name="GL_IMAGE_2D_ARRAY"/> >+ <enum value="0x9053" name="GL_IMAGE_2D_ARRAY_EXT"/> >+ <enum value="0x9054" name="GL_IMAGE_CUBE_MAP_ARRAY"/> >+ <enum value="0x9054" name="GL_IMAGE_CUBE_MAP_ARRAY_EXT"/> >+ <enum value="0x9054" name="GL_IMAGE_CUBE_MAP_ARRAY_OES"/> >+ <enum value="0x9055" name="GL_IMAGE_2D_MULTISAMPLE"/> >+ <enum value="0x9055" name="GL_IMAGE_2D_MULTISAMPLE_EXT"/> >+ <enum value="0x9056" name="GL_IMAGE_2D_MULTISAMPLE_ARRAY"/> >+ <enum value="0x9056" name="GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT"/> >+ <enum value="0x9057" name="GL_INT_IMAGE_1D"/> >+ <enum value="0x9057" name="GL_INT_IMAGE_1D_EXT"/> >+ <enum value="0x9058" name="GL_INT_IMAGE_2D"/> >+ <enum value="0x9058" name="GL_INT_IMAGE_2D_EXT"/> >+ <enum value="0x9059" name="GL_INT_IMAGE_3D"/> >+ <enum value="0x9059" name="GL_INT_IMAGE_3D_EXT"/> >+ <enum value="0x905A" name="GL_INT_IMAGE_2D_RECT"/> >+ <enum value="0x905A" name="GL_INT_IMAGE_2D_RECT_EXT"/> >+ <enum value="0x905B" name="GL_INT_IMAGE_CUBE"/> >+ <enum value="0x905B" name="GL_INT_IMAGE_CUBE_EXT"/> >+ <enum value="0x905C" name="GL_INT_IMAGE_BUFFER"/> >+ <enum value="0x905C" name="GL_INT_IMAGE_BUFFER_EXT"/> >+ <enum value="0x905C" name="GL_INT_IMAGE_BUFFER_OES"/> >+ <enum value="0x905D" name="GL_INT_IMAGE_1D_ARRAY"/> >+ <enum value="0x905D" name="GL_INT_IMAGE_1D_ARRAY_EXT"/> >+ <enum value="0x905E" name="GL_INT_IMAGE_2D_ARRAY"/> >+ <enum value="0x905E" name="GL_INT_IMAGE_2D_ARRAY_EXT"/> >+ <enum value="0x905F" name="GL_INT_IMAGE_CUBE_MAP_ARRAY"/> >+ <enum value="0x905F" name="GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT"/> >+ <enum value="0x905F" name="GL_INT_IMAGE_CUBE_MAP_ARRAY_OES"/> >+ <enum value="0x9060" name="GL_INT_IMAGE_2D_MULTISAMPLE"/> >+ <enum value="0x9060" name="GL_INT_IMAGE_2D_MULTISAMPLE_EXT"/> >+ <enum value="0x9061" name="GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY"/> >+ <enum value="0x9061" name="GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT"/> >+ <enum value="0x9062" name="GL_UNSIGNED_INT_IMAGE_1D"/> >+ <enum value="0x9062" name="GL_UNSIGNED_INT_IMAGE_1D_EXT"/> >+ <enum value="0x9063" name="GL_UNSIGNED_INT_IMAGE_2D"/> >+ <enum value="0x9063" name="GL_UNSIGNED_INT_IMAGE_2D_EXT"/> >+ <enum value="0x9064" name="GL_UNSIGNED_INT_IMAGE_3D"/> >+ <enum value="0x9064" name="GL_UNSIGNED_INT_IMAGE_3D_EXT"/> >+ <enum value="0x9065" name="GL_UNSIGNED_INT_IMAGE_2D_RECT"/> >+ <enum value="0x9065" name="GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT"/> >+ <enum value="0x9066" name="GL_UNSIGNED_INT_IMAGE_CUBE"/> >+ <enum value="0x9066" name="GL_UNSIGNED_INT_IMAGE_CUBE_EXT"/> >+ <enum value="0x9067" name="GL_UNSIGNED_INT_IMAGE_BUFFER"/> >+ <enum value="0x9067" name="GL_UNSIGNED_INT_IMAGE_BUFFER_EXT"/> >+ <enum value="0x9067" name="GL_UNSIGNED_INT_IMAGE_BUFFER_OES"/> >+ <enum value="0x9068" name="GL_UNSIGNED_INT_IMAGE_1D_ARRAY"/> >+ <enum value="0x9068" name="GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT"/> >+ <enum value="0x9069" name="GL_UNSIGNED_INT_IMAGE_2D_ARRAY"/> >+ <enum value="0x9069" name="GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT"/> >+ <enum value="0x906A" name="GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY"/> >+ <enum value="0x906A" name="GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT"/> >+ <enum value="0x906A" name="GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_OES"/> >+ <enum value="0x906B" name="GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE"/> >+ <enum value="0x906B" name="GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT"/> >+ <enum value="0x906C" name="GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY"/> >+ <enum value="0x906C" name="GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT"/> >+ <enum value="0x906D" name="GL_MAX_IMAGE_SAMPLES"/> >+ <enum value="0x906D" name="GL_MAX_IMAGE_SAMPLES_EXT"/> >+ <enum value="0x906E" name="GL_IMAGE_BINDING_FORMAT"/> >+ <enum value="0x906E" name="GL_IMAGE_BINDING_FORMAT_EXT"/> >+ <enum value="0x906F" name="GL_RGB10_A2UI"/> >+ <enum value="0x9070" name="GL_PATH_FORMAT_SVG_NV"/> >+ <enum value="0x9071" name="GL_PATH_FORMAT_PS_NV"/> >+ <enum value="0x9072" name="GL_STANDARD_FONT_NAME_NV"/> >+ <enum value="0x9073" name="GL_SYSTEM_FONT_NAME_NV"/> >+ <enum value="0x9074" name="GL_FILE_NAME_NV"/> >+ <enum value="0x9075" name="GL_PATH_STROKE_WIDTH_NV"/> >+ <enum value="0x9076" name="GL_PATH_END_CAPS_NV"/> >+ <enum value="0x9077" name="GL_PATH_INITIAL_END_CAP_NV"/> >+ <enum value="0x9078" name="GL_PATH_TERMINAL_END_CAP_NV"/> >+ <enum value="0x9079" name="GL_PATH_JOIN_STYLE_NV"/> >+ <enum value="0x907A" name="GL_PATH_MITER_LIMIT_NV"/> >+ <enum value="0x907B" name="GL_PATH_DASH_CAPS_NV"/> >+ <enum value="0x907C" name="GL_PATH_INITIAL_DASH_CAP_NV"/> >+ <enum value="0x907D" name="GL_PATH_TERMINAL_DASH_CAP_NV"/> >+ <enum value="0x907E" name="GL_PATH_DASH_OFFSET_NV"/> >+ <enum value="0x907F" name="GL_PATH_CLIENT_LENGTH_NV"/> >+ <enum value="0x9080" name="GL_PATH_FILL_MODE_NV"/> >+ <enum value="0x9081" name="GL_PATH_FILL_MASK_NV"/> >+ <enum value="0x9082" name="GL_PATH_FILL_COVER_MODE_NV"/> >+ <enum value="0x9083" name="GL_PATH_STROKE_COVER_MODE_NV"/> >+ <enum value="0x9084" name="GL_PATH_STROKE_MASK_NV"/> >+ <!-- <enum value="0x9085" name="GL_PATH_SAMPLE_QUALITY_NV" comment="Removed from extension"/> --> >+ <!-- <enum value="0x9086" name="GL_PATH_STROKE_BOUND_NV" comment="Removed from extension"/> --> >+ <!-- <enum value="0x9087" name="GL_PATH_STROKE_OVERSAMPLE_COUNT_NV" comment="Removed from extension"/> --> >+ <enum value="0x9088" name="GL_COUNT_UP_NV"/> >+ <enum value="0x9089" name="GL_COUNT_DOWN_NV"/> >+ <enum value="0x908A" name="GL_PATH_OBJECT_BOUNDING_BOX_NV"/> >+ <enum value="0x908B" name="GL_CONVEX_HULL_NV"/> >+ <!-- <enum value="0x908C" name="GL_MULTI_HULLS_NV" comment="Removed from extension"/> --> >+ <enum value="0x908D" name="GL_BOUNDING_BOX_NV"/> >+ <enum value="0x908E" name="GL_TRANSLATE_X_NV"/> >+ <enum value="0x908F" name="GL_TRANSLATE_Y_NV"/> >+ <enum value="0x9090" name="GL_TRANSLATE_2D_NV"/> >+ <enum value="0x9091" name="GL_TRANSLATE_3D_NV"/> >+ <enum value="0x9092" name="GL_AFFINE_2D_NV"/> >+ <!-- <enum value="0x9093" name="GL_PROJECTIVE_2D_NV" comment="Removed from extension"/> --> >+ <enum value="0x9094" name="GL_AFFINE_3D_NV"/> >+ <!-- <enum value="0x9095" name="GL_PROJECTIVE_3D_NV" comment="Removed from extension"/> --> >+ <enum value="0x9096" name="GL_TRANSPOSE_AFFINE_2D_NV"/> >+ <!-- <enum value="0x9097" name="GL_TRANSPOSE_PROJECTIVE_2D_NV" comment="Removed from extension"/> --> >+ <enum value="0x9098" name="GL_TRANSPOSE_AFFINE_3D_NV"/> >+ <!-- <enum value="0x9099" name="GL_TRANSPOSE_PROJECTIVE_3D_NV" comment="Removed from extension"/> --> >+ <enum value="0x909A" name="GL_UTF8_NV"/> >+ <enum value="0x909B" name="GL_UTF16_NV"/> >+ <enum value="0x909C" name="GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV"/> >+ <enum value="0x909D" name="GL_PATH_COMMAND_COUNT_NV"/> >+ <enum value="0x909E" name="GL_PATH_COORD_COUNT_NV"/> >+ <enum value="0x909F" name="GL_PATH_DASH_ARRAY_COUNT_NV"/> >+ <enum value="0x90A0" name="GL_PATH_COMPUTED_LENGTH_NV"/> >+ <enum value="0x90A1" name="GL_PATH_FILL_BOUNDING_BOX_NV"/> >+ <enum value="0x90A2" name="GL_PATH_STROKE_BOUNDING_BOX_NV"/> >+ <enum value="0x90A3" name="GL_SQUARE_NV"/> >+ <enum value="0x90A4" name="GL_ROUND_NV"/> >+ <enum value="0x90A5" name="GL_TRIANGULAR_NV"/> >+ <enum value="0x90A6" name="GL_BEVEL_NV"/> >+ <enum value="0x90A7" name="GL_MITER_REVERT_NV"/> >+ <enum value="0x90A8" name="GL_MITER_TRUNCATE_NV"/> >+ <enum value="0x90A9" name="GL_SKIP_MISSING_GLYPH_NV"/> >+ <enum value="0x90AA" name="GL_USE_MISSING_GLYPH_NV"/> >+ <enum value="0x90AB" name="GL_PATH_ERROR_POSITION_NV"/> >+ <enum value="0x90AC" name="GL_PATH_FOG_GEN_MODE_NV"/> >+ <enum value="0x90AD" name="GL_ACCUM_ADJACENT_PAIRS_NV"/> >+ <enum value="0x90AE" name="GL_ADJACENT_PAIRS_NV"/> >+ <enum value="0x90AF" name="GL_FIRST_TO_REST_NV"/> >+ <enum value="0x90B0" name="GL_PATH_GEN_MODE_NV"/> >+ <enum value="0x90B1" name="GL_PATH_GEN_COEFF_NV"/> >+ <enum value="0x90B2" name="GL_PATH_GEN_COLOR_FORMAT_NV"/> >+ <enum value="0x90B3" name="GL_PATH_GEN_COMPONENTS_NV"/> >+ <enum value="0x90B4" name="GL_PATH_DASH_OFFSET_RESET_NV"/> >+ <enum value="0x90B5" name="GL_MOVE_TO_RESETS_NV"/> >+ <enum value="0x90B6" name="GL_MOVE_TO_CONTINUES_NV"/> >+ <enum value="0x90B7" name="GL_PATH_STENCIL_FUNC_NV"/> >+ <enum value="0x90B8" name="GL_PATH_STENCIL_REF_NV"/> >+ <enum value="0x90B9" name="GL_PATH_STENCIL_VALUE_MASK_NV"/> >+ <enum value="0x90BA" name="GL_SCALED_RESOLVE_FASTEST_EXT"/> >+ <enum value="0x90BB" name="GL_SCALED_RESOLVE_NICEST_EXT"/> >+ <enum value="0x90BC" name="GL_MIN_MAP_BUFFER_ALIGNMENT"/> >+ <enum value="0x90BD" name="GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV"/> >+ <enum value="0x90BE" name="GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV"/> >+ <enum value="0x90BF" name="GL_PATH_COVER_DEPTH_FUNC_NV"/> >+ <unused start="0x90C0" end="0x90C6" vendor="NV"/> >+ <enum value="0x90C7" name="GL_IMAGE_FORMAT_COMPATIBILITY_TYPE"/> >+ <enum value="0x90C8" name="GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE"/> >+ <enum value="0x90C9" name="GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS"/> >+ <enum value="0x90CA" name="GL_MAX_VERTEX_IMAGE_UNIFORMS"/> >+ <enum value="0x90CB" name="GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS"/> >+ <enum value="0x90CB" name="GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT"/> >+ <enum value="0x90CB" name="GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES"/> >+ <enum value="0x90CC" name="GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS"/> >+ <enum value="0x90CC" name="GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT"/> >+ <enum value="0x90CC" name="GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES"/> >+ <enum value="0x90CD" name="GL_MAX_GEOMETRY_IMAGE_UNIFORMS"/> >+ <enum value="0x90CD" name="GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT"/> >+ <enum value="0x90CD" name="GL_MAX_GEOMETRY_IMAGE_UNIFORMS_OES"/> >+ <enum value="0x90CE" name="GL_MAX_FRAGMENT_IMAGE_UNIFORMS"/> >+ <enum value="0x90CF" name="GL_MAX_COMBINED_IMAGE_UNIFORMS"/> >+ <enum value="0x90D0" name="GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV"/> >+ <enum value="0x90D1" name="GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV"/> >+ <enum value="0x90D2" name="GL_SHADER_STORAGE_BUFFER"/> >+ <enum value="0x90D3" name="GL_SHADER_STORAGE_BUFFER_BINDING"/> >+ <enum value="0x90D4" name="GL_SHADER_STORAGE_BUFFER_START"/> >+ <enum value="0x90D5" name="GL_SHADER_STORAGE_BUFFER_SIZE"/> >+ <enum value="0x90D6" name="GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS"/> >+ <enum value="0x90D7" name="GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS"/> >+ <enum value="0x90D7" name="GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT"/> >+ <enum value="0x90D7" name="GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_OES"/> >+ <enum value="0x90D8" name="GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS"/> >+ <enum value="0x90D8" name="GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT"/> >+ <enum value="0x90D8" name="GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES"/> >+ <enum value="0x90D9" name="GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS"/> >+ <enum value="0x90D9" name="GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT"/> >+ <enum value="0x90D9" name="GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES"/> >+ <enum value="0x90DA" name="GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS"/> >+ <enum value="0x90DB" name="GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS"/> >+ <enum value="0x90DC" name="GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS"/> >+ <enum value="0x90DD" name="GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS"/> >+ <enum value="0x90DE" name="GL_MAX_SHADER_STORAGE_BLOCK_SIZE"/> >+ <enum value="0x90DF" name="GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT"/> >+ <unused start="0x90E0" vendor="NV"/> >+ <enum value="0x90E1" name="GL_SYNC_X11_FENCE_EXT"/> >+ <unused start="0x90E2" end="0x90E9" vendor="NV"/> >+ <enum value="0x90EA" name="GL_DEPTH_STENCIL_TEXTURE_MODE"/> >+ <enum value="0x90EB" name="GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS"/> >+ <enum value="0x90EB" name="GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB" alias="GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS"/> >+ <enum value="0x90EC" name="GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER"/> >+ <enum value="0x90ED" name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER"/> >+ <enum value="0x90EE" name="GL_DISPATCH_INDIRECT_BUFFER"/> >+ <enum value="0x90EF" name="GL_DISPATCH_INDIRECT_BUFFER_BINDING"/> >+ <enum value="0x90F0" name="GL_COLOR_ATTACHMENT_EXT"/> >+ <enum value="0x90F1" name="GL_MULTIVIEW_EXT"/> >+ <enum value="0x90F2" name="GL_MAX_MULTIVIEW_BUFFERS_EXT"/> >+ <enum value="0x90F3" name="GL_CONTEXT_ROBUST_ACCESS"/> >+ <enum value="0x90F3" name="GL_CONTEXT_ROBUST_ACCESS_EXT"/> >+ <enum value="0x90F3" name="GL_CONTEXT_ROBUST_ACCESS_KHR"/> >+ <unused start="0x90F4" end="0x90FA" vendor="NV"/> >+ <enum value="0x90FB" name="GL_COMPUTE_PROGRAM_NV"/> >+ <enum value="0x90FC" name="GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV"/> >+ <unused start="0x90FD" end="0x90FF" vendor="NV"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9100" end="0x912F" vendor="ARB"> >+ <enum value="0x9100" name="GL_TEXTURE_2D_MULTISAMPLE"/> >+ <enum value="0x9101" name="GL_PROXY_TEXTURE_2D_MULTISAMPLE"/> >+ <enum value="0x9102" name="GL_TEXTURE_2D_MULTISAMPLE_ARRAY"/> >+ <enum value="0x9102" name="GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES"/> >+ <enum value="0x9103" name="GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY"/> >+ <enum value="0x9104" name="GL_TEXTURE_BINDING_2D_MULTISAMPLE"/> >+ <enum value="0x9105" name="GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY"/> >+ <enum value="0x9105" name="GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES"/> >+ <enum value="0x9106" name="GL_TEXTURE_SAMPLES"/> >+ <enum value="0x9107" name="GL_TEXTURE_FIXED_SAMPLE_LOCATIONS"/> >+ <enum value="0x9108" name="GL_SAMPLER_2D_MULTISAMPLE"/> >+ <enum value="0x9109" name="GL_INT_SAMPLER_2D_MULTISAMPLE"/> >+ <enum value="0x910A" name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE"/> >+ <enum value="0x910B" name="GL_SAMPLER_2D_MULTISAMPLE_ARRAY"/> >+ <enum value="0x910B" name="GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES"/> >+ <enum value="0x910C" name="GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY"/> >+ <enum value="0x910C" name="GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES"/> >+ <enum value="0x910D" name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY"/> >+ <enum value="0x910D" name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES"/> >+ <enum value="0x910E" name="GL_MAX_COLOR_TEXTURE_SAMPLES"/> >+ <enum value="0x910F" name="GL_MAX_DEPTH_TEXTURE_SAMPLES"/> >+ <enum value="0x9110" name="GL_MAX_INTEGER_SAMPLES"/> >+ <enum value="0x9111" name="GL_MAX_SERVER_WAIT_TIMEOUT"/> >+ <enum value="0x9111" name="GL_MAX_SERVER_WAIT_TIMEOUT_APPLE"/> >+ <enum value="0x9112" name="GL_OBJECT_TYPE"/> >+ <enum value="0x9112" name="GL_OBJECT_TYPE_APPLE"/> >+ <enum value="0x9113" name="GL_SYNC_CONDITION"/> >+ <enum value="0x9113" name="GL_SYNC_CONDITION_APPLE"/> >+ <enum value="0x9114" name="GL_SYNC_STATUS"/> >+ <enum value="0x9114" name="GL_SYNC_STATUS_APPLE"/> >+ <enum value="0x9115" name="GL_SYNC_FLAGS"/> >+ <enum value="0x9115" name="GL_SYNC_FLAGS_APPLE"/> >+ <enum value="0x9116" name="GL_SYNC_FENCE"/> >+ <enum value="0x9116" name="GL_SYNC_FENCE_APPLE"/> >+ <enum value="0x9117" name="GL_SYNC_GPU_COMMANDS_COMPLETE"/> >+ <enum value="0x9117" name="GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE"/> >+ <enum value="0x9118" name="GL_UNSIGNALED"/> >+ <enum value="0x9118" name="GL_UNSIGNALED_APPLE"/> >+ <enum value="0x9119" name="GL_SIGNALED"/> >+ <enum value="0x9119" name="GL_SIGNALED_APPLE"/> >+ <enum value="0x911A" name="GL_ALREADY_SIGNALED"/> >+ <enum value="0x911A" name="GL_ALREADY_SIGNALED_APPLE"/> >+ <enum value="0x911B" name="GL_TIMEOUT_EXPIRED"/> >+ <enum value="0x911B" name="GL_TIMEOUT_EXPIRED_APPLE"/> >+ <enum value="0x911C" name="GL_CONDITION_SATISFIED"/> >+ <enum value="0x911C" name="GL_CONDITION_SATISFIED_APPLE"/> >+ <enum value="0x911D" name="GL_WAIT_FAILED"/> >+ <enum value="0x911D" name="GL_WAIT_FAILED_APPLE"/> >+ <enum value="0x911F" name="GL_BUFFER_ACCESS_FLAGS"/> >+ <enum value="0x9120" name="GL_BUFFER_MAP_LENGTH"/> >+ <enum value="0x9121" name="GL_BUFFER_MAP_OFFSET"/> >+ <enum value="0x9122" name="GL_MAX_VERTEX_OUTPUT_COMPONENTS"/> >+ <enum value="0x9123" name="GL_MAX_GEOMETRY_INPUT_COMPONENTS"/> >+ <enum value="0x9123" name="GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT"/> >+ <enum value="0x9123" name="GL_MAX_GEOMETRY_INPUT_COMPONENTS_OES"/> >+ <enum value="0x9124" name="GL_MAX_GEOMETRY_OUTPUT_COMPONENTS"/> >+ <enum value="0x9124" name="GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT"/> >+ <enum value="0x9124" name="GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_OES"/> >+ <enum value="0x9125" name="GL_MAX_FRAGMENT_INPUT_COMPONENTS"/> >+ <enum value="0x9126" name="GL_CONTEXT_PROFILE_MASK"/> >+ <enum value="0x9127" name="GL_UNPACK_COMPRESSED_BLOCK_WIDTH"/> >+ <enum value="0x9128" name="GL_UNPACK_COMPRESSED_BLOCK_HEIGHT"/> >+ <enum value="0x9129" name="GL_UNPACK_COMPRESSED_BLOCK_DEPTH"/> >+ <enum value="0x912A" name="GL_UNPACK_COMPRESSED_BLOCK_SIZE"/> >+ <enum value="0x912B" name="GL_PACK_COMPRESSED_BLOCK_WIDTH"/> >+ <enum value="0x912C" name="GL_PACK_COMPRESSED_BLOCK_HEIGHT"/> >+ <enum value="0x912D" name="GL_PACK_COMPRESSED_BLOCK_DEPTH"/> >+ <enum value="0x912E" name="GL_PACK_COMPRESSED_BLOCK_SIZE"/> >+ <enum value="0x912F" name="GL_TEXTURE_IMMUTABLE_FORMAT"/> >+ <enum value="0x912F" name="GL_TEXTURE_IMMUTABLE_FORMAT_EXT"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9130" end="0x913F" vendor="IMG" comment="Khronos bug 882"> >+ <enum value="0x9130" name="GL_SGX_PROGRAM_BINARY_IMG"/> >+ <unused start="0x9131" end="0x9132" vendor="IMG"/> >+ <enum value="0x9133" name="GL_RENDERBUFFER_SAMPLES_IMG"/> >+ <enum value="0x9134" name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG"/> >+ <enum value="0x9135" name="GL_MAX_SAMPLES_IMG"/> >+ <enum value="0x9136" name="GL_TEXTURE_SAMPLES_IMG"/> >+ <enum value="0x9137" name="GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG"/> >+ <enum value="0x9138" name="GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG"/> >+ <enum value="0x9139" name="GL_CUBIC_IMG"/> >+ <enum value="0x913A" name="GL_CUBIC_MIPMAP_NEAREST_IMG"/> >+ <enum value="0x913B" name="GL_CUBIC_MIPMAP_LINEAR_IMG"/> >+ <enum value="0x913C" name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_AND_DOWNSAMPLE_IMG"/> >+ <enum value="0x913D" name="GL_NUM_DOWNSAMPLE_SCALES_IMG"/> >+ <enum value="0x913E" name="GL_DOWNSAMPLE_SCALES_IMG"/> >+ <enum value="0x913F" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SCALE_IMG"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9140" end="0x923F" vendor="AMD" comment="Khronos bugs 5899, 6004"> >+ <unused start="0x9140" end="0x9142" vendor="AMD"/> >+ <enum value="0x9143" name="GL_MAX_DEBUG_MESSAGE_LENGTH"/> >+ <enum value="0x9143" name="GL_MAX_DEBUG_MESSAGE_LENGTH_AMD"/> >+ <enum value="0x9143" name="GL_MAX_DEBUG_MESSAGE_LENGTH_ARB"/> >+ <enum value="0x9143" name="GL_MAX_DEBUG_MESSAGE_LENGTH_KHR"/> >+ <enum value="0x9144" name="GL_MAX_DEBUG_LOGGED_MESSAGES"/> >+ <enum value="0x9144" name="GL_MAX_DEBUG_LOGGED_MESSAGES_AMD"/> >+ <enum value="0x9144" name="GL_MAX_DEBUG_LOGGED_MESSAGES_ARB"/> >+ <enum value="0x9144" name="GL_MAX_DEBUG_LOGGED_MESSAGES_KHR"/> >+ <enum value="0x9145" name="GL_DEBUG_LOGGED_MESSAGES"/> >+ <enum value="0x9145" name="GL_DEBUG_LOGGED_MESSAGES_AMD"/> >+ <enum value="0x9145" name="GL_DEBUG_LOGGED_MESSAGES_ARB"/> >+ <enum value="0x9145" name="GL_DEBUG_LOGGED_MESSAGES_KHR"/> >+ <enum value="0x9146" name="GL_DEBUG_SEVERITY_HIGH"/> >+ <enum value="0x9146" name="GL_DEBUG_SEVERITY_HIGH_AMD"/> >+ <enum value="0x9146" name="GL_DEBUG_SEVERITY_HIGH_ARB"/> >+ <enum value="0x9146" name="GL_DEBUG_SEVERITY_HIGH_KHR"/> >+ <enum value="0x9147" name="GL_DEBUG_SEVERITY_MEDIUM"/> >+ <enum value="0x9147" name="GL_DEBUG_SEVERITY_MEDIUM_AMD"/> >+ <enum value="0x9147" name="GL_DEBUG_SEVERITY_MEDIUM_ARB"/> >+ <enum value="0x9147" name="GL_DEBUG_SEVERITY_MEDIUM_KHR"/> >+ <enum value="0x9148" name="GL_DEBUG_SEVERITY_LOW"/> >+ <enum value="0x9148" name="GL_DEBUG_SEVERITY_LOW_AMD"/> >+ <enum value="0x9148" name="GL_DEBUG_SEVERITY_LOW_ARB"/> >+ <enum value="0x9148" name="GL_DEBUG_SEVERITY_LOW_KHR"/> >+ <enum value="0x9149" name="GL_DEBUG_CATEGORY_API_ERROR_AMD"/> >+ <enum value="0x914A" name="GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD"/> >+ <enum value="0x914B" name="GL_DEBUG_CATEGORY_DEPRECATION_AMD"/> >+ <enum value="0x914C" name="GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD"/> >+ <enum value="0x914D" name="GL_DEBUG_CATEGORY_PERFORMANCE_AMD"/> >+ <enum value="0x914E" name="GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD"/> >+ <enum value="0x914F" name="GL_DEBUG_CATEGORY_APPLICATION_AMD"/> >+ <enum value="0x9150" name="GL_DEBUG_CATEGORY_OTHER_AMD"/> >+ <enum value="0x9151" name="GL_BUFFER_OBJECT_EXT"/> >+ <enum value="0x9151" name="GL_DATA_BUFFER_AMD"/> >+ <enum value="0x9152" name="GL_PERFORMANCE_MONITOR_AMD"/> >+ <enum value="0x9153" name="GL_QUERY_OBJECT_AMD"/> >+ <enum value="0x9153" name="GL_QUERY_OBJECT_EXT"/> >+ <enum value="0x9154" name="GL_VERTEX_ARRAY_OBJECT_AMD"/> >+ <enum value="0x9154" name="GL_VERTEX_ARRAY_OBJECT_EXT"/> >+ <enum value="0x9155" name="GL_SAMPLER_OBJECT_AMD"/> >+ <unused start="0x9156" end="0x915F" vendor="AMD"/> >+ <enum value="0x9160" name="GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD"/> >+ <unused start="0x9161" vendor="AMD"/> >+ <enum value="0x9192" name="GL_QUERY_BUFFER"/> >+ <enum value="0x9192" name="GL_QUERY_BUFFER_AMD"/> >+ <enum value="0x9193" name="GL_QUERY_BUFFER_BINDING"/> >+ <enum value="0x9193" name="GL_QUERY_BUFFER_BINDING_AMD"/> >+ <enum value="0x9194" name="GL_QUERY_RESULT_NO_WAIT"/> >+ <enum value="0x9194" name="GL_QUERY_RESULT_NO_WAIT_AMD"/> >+ <enum value="0x9195" name="GL_VIRTUAL_PAGE_SIZE_X_ARB"/> >+ <enum value="0x9195" name="GL_VIRTUAL_PAGE_SIZE_X_EXT"/> >+ <enum value="0x9195" name="GL_VIRTUAL_PAGE_SIZE_X_AMD"/> >+ <enum value="0x9196" name="GL_VIRTUAL_PAGE_SIZE_Y_ARB"/> >+ <enum value="0x9196" name="GL_VIRTUAL_PAGE_SIZE_Y_EXT"/> >+ <enum value="0x9196" name="GL_VIRTUAL_PAGE_SIZE_Y_AMD"/> >+ <enum value="0x9197" name="GL_VIRTUAL_PAGE_SIZE_Z_ARB"/> >+ <enum value="0x9197" name="GL_VIRTUAL_PAGE_SIZE_Z_EXT"/> >+ <enum value="0x9197" name="GL_VIRTUAL_PAGE_SIZE_Z_AMD"/> >+ <enum value="0x9198" name="GL_MAX_SPARSE_TEXTURE_SIZE_ARB"/> >+ <enum value="0x9198" name="GL_MAX_SPARSE_TEXTURE_SIZE_EXT"/> >+ <enum value="0x9198" name="GL_MAX_SPARSE_TEXTURE_SIZE_AMD"/> >+ <enum value="0x9199" name="GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB"/> >+ <enum value="0x9199" name="GL_MAX_SPARSE_3D_TEXTURE_SIZE_EXT"/> >+ <enum value="0x9199" name="GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD"/> >+ <enum value="0x919A" name="GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS"/> >+ <enum value="0x919A" name="GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB"/> >+ <enum value="0x919A" name="GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT"/> >+ <enum value="0x919B" name="GL_MIN_SPARSE_LEVEL_AMD"/> >+ <enum value="0x919C" name="GL_MIN_LOD_WARNING_AMD"/> >+ <enum value="0x919D" name="GL_TEXTURE_BUFFER_OFFSET"/> >+ <enum value="0x919D" name="GL_TEXTURE_BUFFER_OFFSET_EXT"/> >+ <enum value="0x919D" name="GL_TEXTURE_BUFFER_OFFSET_OES"/> >+ <enum value="0x919E" name="GL_TEXTURE_BUFFER_SIZE"/> >+ <enum value="0x919E" name="GL_TEXTURE_BUFFER_SIZE_EXT"/> >+ <enum value="0x919E" name="GL_TEXTURE_BUFFER_SIZE_OES"/> >+ <enum value="0x919F" name="GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT"/> >+ <enum value="0x919F" name="GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT"/> >+ <enum value="0x919F" name="GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_OES"/> >+ <enum value="0x91A0" name="GL_STREAM_RASTERIZATION_AMD"/> >+ <unused start="0x91A1" end="0x91A3" vendor="AMD"/> >+ <enum value="0x91A4" name="GL_VERTEX_ELEMENT_SWIZZLE_AMD"/> >+ <enum value="0x91A5" name="GL_VERTEX_ID_SWIZZLE_AMD"/> >+ <enum value="0x91A6" name="GL_TEXTURE_SPARSE_ARB"/> >+ <enum value="0x91A6" name="GL_TEXTURE_SPARSE_EXT"/> >+ <enum value="0x91A7" name="GL_VIRTUAL_PAGE_SIZE_INDEX_ARB"/> >+ <enum value="0x91A7" name="GL_VIRTUAL_PAGE_SIZE_INDEX_EXT"/> >+ <enum value="0x91A8" name="GL_NUM_VIRTUAL_PAGE_SIZES_ARB"/> >+ <enum value="0x91A8" name="GL_NUM_VIRTUAL_PAGE_SIZES_EXT"/> >+ <enum value="0x91A9" name="GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB"/> >+ <enum value="0x91A9" name="GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT"/> >+ <enum value="0x91AA" name="GL_NUM_SPARSE_LEVELS_ARB"/> >+ <enum value="0x91AA" name="GL_NUM_SPARSE_LEVELS_EXT"/> >+ <unused start="0x91AB" end="0x91AD" vendor="AMD"/> >+ <enum value="0x91AE" name="GL_PIXELS_PER_SAMPLE_PATTERN_X_AMD"/> >+ <enum value="0x91AF" name="GL_PIXELS_PER_SAMPLE_PATTERN_Y_AMD"/> >+ <enum value="0x91B0" name="GL_MAX_SHADER_COMPILER_THREADS_KHR"/> >+ <enum value="0x91B0" name="GL_MAX_SHADER_COMPILER_THREADS_ARB" alias="GL_MAX_SHADER_COMPILER_THREADS_KHR"/> >+ <enum value="0x91B1" name="GL_COMPLETION_STATUS_KHR"/> >+ <enum value="0x91B1" name="GL_COMPLETION_STATUS_ARB" alias="GL_COMPLETION_STATUS_KHR"/> >+ <unused start="0x91B2" end="0x91B8" vendor="AMD"/> >+ <enum value="0x91B9" name="GL_COMPUTE_SHADER"/> >+ <unused start="0x91BA" vendor="AMD"/> >+ <enum value="0x91BB" name="GL_MAX_COMPUTE_UNIFORM_BLOCKS"/> >+ <enum value="0x91BC" name="GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS"/> >+ <enum value="0x91BD" name="GL_MAX_COMPUTE_IMAGE_UNIFORMS"/> >+ <enum value="0x91BE" name="GL_MAX_COMPUTE_WORK_GROUP_COUNT"/> >+ <enum value="0x91BF" name="GL_MAX_COMPUTE_WORK_GROUP_SIZE"/> >+ <enum value="0x91BF" name="GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB" alias="GL_MAX_COMPUTE_WORK_GROUP_SIZE"/> >+ <unused start="0x91C0" end="0x91C4" vendor="AMD"/> >+ <enum value="0x91C5" name="GL_FLOAT16_MAT2_AMD"/> >+ <enum value="0x91C6" name="GL_FLOAT16_MAT3_AMD"/> >+ <enum value="0x91C7" name="GL_FLOAT16_MAT4_AMD"/> >+ <enum value="0x91C8" name="GL_FLOAT16_MAT2x3_AMD"/> >+ <enum value="0x91C9" name="GL_FLOAT16_MAT2x4_AMD"/> >+ <enum value="0x91CA" name="GL_FLOAT16_MAT3x2_AMD"/> >+ <enum value="0x91CB" name="GL_FLOAT16_MAT3x4_AMD"/> >+ <enum value="0x91CC" name="GL_FLOAT16_MAT4x2_AMD"/> >+ <enum value="0x91CD" name="GL_FLOAT16_MAT4x3_AMD"/> >+ <unused start="0x91CE" end="0x923F" vendor="AMD"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9240" end="0x924F" vendor="WEBGL" comment="Khronos bug 6473,6884"> >+ <enum value="0x9240" name="GL_UNPACK_FLIP_Y_WEBGL"/> >+ <enum value="0x9241" name="GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL"/> >+ <enum value="0x9242" name="GL_CONTEXT_LOST_WEBGL"/> >+ <enum value="0x9243" name="GL_UNPACK_COLORSPACE_CONVERSION_WEBGL"/> >+ <enum value="0x9244" name="GL_BROWSER_DEFAULT_WEBGL"/> >+ <unused start="0x9245" end="0x924F" vendor="WEBGL"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9250" end="0x925F" vendor="DMP" comment="For Eisaku Ohbuchi via email"> >+ <enum value="0x9250" name="GL_SHADER_BINARY_DMP"/> >+ <enum value="0x9251" name="GL_SMAPHS30_PROGRAM_BINARY_DMP"/> >+ <enum value="0x9252" name="GL_SMAPHS_PROGRAM_BINARY_DMP"/> >+ <enum value="0x9253" name="GL_DMP_PROGRAM_BINARY_DMP"/> >+ <unused start="0x9254" end="0x925F" vendor="DMP"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9260" end="0x926F" vendor="FJ" comment="Khronos bug 7486"> >+ <enum value="0x9260" name="GL_GCCSO_SHADER_BINARY_FJ"/> >+ <unused start="0x9261" end="0x926F" vendor="FJ"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9270" end="0x927F" vendor="OES" comment="Khronos bug 7625"> >+ <enum value="0x9270" name="GL_COMPRESSED_R11_EAC"/> >+ <enum value="0x9270" name="GL_COMPRESSED_R11_EAC_OES"/> >+ <enum value="0x9271" name="GL_COMPRESSED_SIGNED_R11_EAC"/> >+ <enum value="0x9271" name="GL_COMPRESSED_SIGNED_R11_EAC_OES"/> >+ <enum value="0x9272" name="GL_COMPRESSED_RG11_EAC"/> >+ <enum value="0x9272" name="GL_COMPRESSED_RG11_EAC_OES"/> >+ <enum value="0x9273" name="GL_COMPRESSED_SIGNED_RG11_EAC"/> >+ <enum value="0x9273" name="GL_COMPRESSED_SIGNED_RG11_EAC_OES"/> >+ <enum value="0x9274" name="GL_COMPRESSED_RGB8_ETC2"/> >+ <enum value="0x9274" name="GL_COMPRESSED_RGB8_ETC2_OES"/> >+ <enum value="0x9275" name="GL_COMPRESSED_SRGB8_ETC2"/> >+ <enum value="0x9275" name="GL_COMPRESSED_SRGB8_ETC2_OES"/> >+ <enum value="0x9276" name="GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"/> >+ <enum value="0x9276" name="GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2_OES"/> >+ <enum value="0x9277" name="GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"/> >+ <enum value="0x9277" name="GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2_OES"/> >+ <enum value="0x9278" name="GL_COMPRESSED_RGBA8_ETC2_EAC"/> >+ <enum value="0x9278" name="GL_COMPRESSED_RGBA8_ETC2_EAC_OES"/> >+ <enum value="0x9279" name="GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"/> >+ <enum value="0x9279" name="GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC_OES"/> >+ <unused start="0x927A" end="0x927F" vendor="OES"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9280" end="0x937F" vendor="NV" comment="Khronos bug 7658"> >+ <enum value="0x9280" name="GL_BLEND_PREMULTIPLIED_SRC_NV"/> >+ <enum value="0x9281" name="GL_BLEND_OVERLAP_NV"/> >+ <enum value="0x9282" name="GL_UNCORRELATED_NV"/> >+ <enum value="0x9283" name="GL_DISJOINT_NV"/> >+ <enum value="0x9284" name="GL_CONJOINT_NV"/> >+ <enum value="0x9285" name="GL_BLEND_ADVANCED_COHERENT_KHR"/> >+ <enum value="0x9285" name="GL_BLEND_ADVANCED_COHERENT_NV"/> >+ <enum value="0x9286" name="GL_SRC_NV"/> >+ <enum value="0x9287" name="GL_DST_NV"/> >+ <enum value="0x9288" name="GL_SRC_OVER_NV"/> >+ <enum value="0x9289" name="GL_DST_OVER_NV"/> >+ <enum value="0x928A" name="GL_SRC_IN_NV"/> >+ <enum value="0x928B" name="GL_DST_IN_NV"/> >+ <enum value="0x928C" name="GL_SRC_OUT_NV"/> >+ <enum value="0x928D" name="GL_DST_OUT_NV"/> >+ <enum value="0x928E" name="GL_SRC_ATOP_NV"/> >+ <enum value="0x928F" name="GL_DST_ATOP_NV"/> >+ <unused start="0x9290" vendor="NV"/> >+ <enum value="0x9291" name="GL_PLUS_NV"/> >+ <enum value="0x9292" name="GL_PLUS_DARKER_NV"/> >+ <unused start="0x9293" vendor="NV"/> >+ <enum value="0x9294" name="GL_MULTIPLY"/> >+ <enum value="0x9294" name="GL_MULTIPLY_KHR"/> >+ <enum value="0x9294" name="GL_MULTIPLY_NV"/> >+ <enum value="0x9295" name="GL_SCREEN"/> >+ <enum value="0x9295" name="GL_SCREEN_KHR"/> >+ <enum value="0x9295" name="GL_SCREEN_NV"/> >+ <enum value="0x9296" name="GL_OVERLAY"/> >+ <enum value="0x9296" name="GL_OVERLAY_KHR"/> >+ <enum value="0x9296" name="GL_OVERLAY_NV"/> >+ <enum value="0x9297" name="GL_DARKEN"/> >+ <enum value="0x9297" name="GL_DARKEN_KHR"/> >+ <enum value="0x9297" name="GL_DARKEN_NV"/> >+ <enum value="0x9298" name="GL_LIGHTEN"/> >+ <enum value="0x9298" name="GL_LIGHTEN_KHR"/> >+ <enum value="0x9298" name="GL_LIGHTEN_NV"/> >+ <enum value="0x9299" name="GL_COLORDODGE"/> >+ <enum value="0x9299" name="GL_COLORDODGE_KHR"/> >+ <enum value="0x9299" name="GL_COLORDODGE_NV"/> >+ <enum value="0x929A" name="GL_COLORBURN"/> >+ <enum value="0x929A" name="GL_COLORBURN_KHR"/> >+ <enum value="0x929A" name="GL_COLORBURN_NV"/> >+ <enum value="0x929B" name="GL_HARDLIGHT"/> >+ <enum value="0x929B" name="GL_HARDLIGHT_KHR"/> >+ <enum value="0x929B" name="GL_HARDLIGHT_NV"/> >+ <enum value="0x929C" name="GL_SOFTLIGHT"/> >+ <enum value="0x929C" name="GL_SOFTLIGHT_KHR"/> >+ <enum value="0x929C" name="GL_SOFTLIGHT_NV"/> >+ <unused start="0x929D" vendor="NV"/> >+ <enum value="0x929E" name="GL_DIFFERENCE"/> >+ <enum value="0x929E" name="GL_DIFFERENCE_KHR"/> >+ <enum value="0x929E" name="GL_DIFFERENCE_NV"/> >+ <enum value="0x929F" name="GL_MINUS_NV"/> >+ <enum value="0x92A0" name="GL_EXCLUSION"/> >+ <enum value="0x92A0" name="GL_EXCLUSION_KHR"/> >+ <enum value="0x92A0" name="GL_EXCLUSION_NV"/> >+ <enum value="0x92A1" name="GL_CONTRAST_NV"/> >+ <unused start="0x92A2" vendor="NV"/> >+ <enum value="0x92A3" name="GL_INVERT_RGB_NV"/> >+ <enum value="0x92A4" name="GL_LINEARDODGE_NV"/> >+ <enum value="0x92A5" name="GL_LINEARBURN_NV"/> >+ <enum value="0x92A6" name="GL_VIVIDLIGHT_NV"/> >+ <enum value="0x92A7" name="GL_LINEARLIGHT_NV"/> >+ <enum value="0x92A8" name="GL_PINLIGHT_NV"/> >+ <enum value="0x92A9" name="GL_HARDMIX_NV"/> >+ <unused start="0x92AA" end="0x92AC" vendor="NV"/> >+ <enum value="0x92AD" name="GL_HSL_HUE"/> >+ <enum value="0x92AD" name="GL_HSL_HUE_KHR"/> >+ <enum value="0x92AD" name="GL_HSL_HUE_NV"/> >+ <enum value="0x92AE" name="GL_HSL_SATURATION"/> >+ <enum value="0x92AE" name="GL_HSL_SATURATION_KHR"/> >+ <enum value="0x92AE" name="GL_HSL_SATURATION_NV"/> >+ <enum value="0x92AF" name="GL_HSL_COLOR"/> >+ <enum value="0x92AF" name="GL_HSL_COLOR_KHR"/> >+ <enum value="0x92AF" name="GL_HSL_COLOR_NV"/> >+ <enum value="0x92B0" name="GL_HSL_LUMINOSITY"/> >+ <enum value="0x92B0" name="GL_HSL_LUMINOSITY_KHR"/> >+ <enum value="0x92B0" name="GL_HSL_LUMINOSITY_NV"/> >+ <enum value="0x92B1" name="GL_PLUS_CLAMPED_NV"/> >+ <enum value="0x92B2" name="GL_PLUS_CLAMPED_ALPHA_NV"/> >+ <enum value="0x92B3" name="GL_MINUS_CLAMPED_NV"/> >+ <enum value="0x92B4" name="GL_INVERT_OVG_NV"/> >+ <unused start="0x92B5" end="0x92B9" vendor="NV"/> >+ <enum value="0x92BA" name="GL_MAX_LGPU_GPUS_NVX"/> >+ <enum value="0x92BA" name="GL_MULTICAST_GPUS_NV"/> >+ <enum value="0x92BB" name="GL_PURGED_CONTEXT_RESET_NV"/> >+ <unused start="0x92BC" end="0x92BD" vendor="NV"/> >+ <enum value="0x92BE" name="GL_PRIMITIVE_BOUNDING_BOX_ARB"/> >+ <enum value="0x92BE" name="GL_PRIMITIVE_BOUNDING_BOX"/> >+ <enum value="0x92BE" name="GL_PRIMITIVE_BOUNDING_BOX_EXT"/> >+ <enum value="0x92BE" name="GL_PRIMITIVE_BOUNDING_BOX_OES"/> >+ <enum value="0x92BF" name="GL_ALPHA_TO_COVERAGE_DITHER_MODE_NV"/> >+ <enum value="0x92C0" name="GL_ATOMIC_COUNTER_BUFFER"/> >+ <enum value="0x92C1" name="GL_ATOMIC_COUNTER_BUFFER_BINDING"/> >+ <enum value="0x92C2" name="GL_ATOMIC_COUNTER_BUFFER_START"/> >+ <enum value="0x92C3" name="GL_ATOMIC_COUNTER_BUFFER_SIZE"/> >+ <enum value="0x92C4" name="GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE"/> >+ <enum value="0x92C5" name="GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS"/> >+ <enum value="0x92C6" name="GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES"/> >+ <enum value="0x92C7" name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER"/> >+ <enum value="0x92C8" name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER"/> >+ <enum value="0x92C9" name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER"/> >+ <enum value="0x92CA" name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER"/> >+ <enum value="0x92CB" name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER"/> >+ <enum value="0x92CC" name="GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS"/> >+ <enum value="0x92CD" name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS"/> >+ <enum value="0x92CD" name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT"/> >+ <enum value="0x92CD" name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES"/> >+ <enum value="0x92CE" name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS"/> >+ <enum value="0x92CE" name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT"/> >+ <enum value="0x92CE" name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES"/> >+ <enum value="0x92CF" name="GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS"/> >+ <enum value="0x92CF" name="GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT"/> >+ <enum value="0x92CF" name="GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_OES"/> >+ <enum value="0x92D0" name="GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS"/> >+ <enum value="0x92D1" name="GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS"/> >+ <enum value="0x92D2" name="GL_MAX_VERTEX_ATOMIC_COUNTERS"/> >+ <enum value="0x92D3" name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS"/> >+ <enum value="0x92D3" name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT"/> >+ <enum value="0x92D3" name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES"/> >+ <enum value="0x92D4" name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS"/> >+ <enum value="0x92D4" name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT"/> >+ <enum value="0x92D4" name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES"/> >+ <enum value="0x92D5" name="GL_MAX_GEOMETRY_ATOMIC_COUNTERS"/> >+ <enum value="0x92D5" name="GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT"/> >+ <enum value="0x92D5" name="GL_MAX_GEOMETRY_ATOMIC_COUNTERS_OES"/> >+ <enum value="0x92D6" name="GL_MAX_FRAGMENT_ATOMIC_COUNTERS"/> >+ <enum value="0x92D7" name="GL_MAX_COMBINED_ATOMIC_COUNTERS"/> >+ <enum value="0x92D8" name="GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE"/> >+ <enum value="0x92D9" name="GL_ACTIVE_ATOMIC_COUNTER_BUFFERS"/> >+ <enum value="0x92DA" name="GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX"/> >+ <enum value="0x92DB" name="GL_UNSIGNED_INT_ATOMIC_COUNTER"/> >+ <enum value="0x92DC" name="GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS"/> >+ <enum value="0x92DD" name="GL_FRAGMENT_COVERAGE_TO_COLOR_NV"/> >+ <enum value="0x92DE" name="GL_FRAGMENT_COVERAGE_COLOR_NV"/> >+ <unused start="0x92DF" end="0x92DF" vendor="NV"/> >+ <enum value="0x92E0" name="GL_DEBUG_OUTPUT"/> >+ <enum value="0x92E0" name="GL_DEBUG_OUTPUT_KHR"/> >+ <enum value="0x92E1" name="GL_UNIFORM"/> >+ <enum value="0x92E2" name="GL_UNIFORM_BLOCK"/> >+ <enum value="0x92E3" name="GL_PROGRAM_INPUT"/> >+ <enum value="0x92E4" name="GL_PROGRAM_OUTPUT"/> >+ <enum value="0x92E5" name="GL_BUFFER_VARIABLE"/> >+ <enum value="0x92E6" name="GL_SHADER_STORAGE_BLOCK"/> >+ <enum value="0x92E7" name="GL_IS_PER_PATCH"/> >+ <enum value="0x92E7" name="GL_IS_PER_PATCH_EXT"/> >+ <enum value="0x92E7" name="GL_IS_PER_PATCH_OES"/> >+ <enum value="0x92E8" name="GL_VERTEX_SUBROUTINE"/> >+ <enum value="0x92E9" name="GL_TESS_CONTROL_SUBROUTINE"/> >+ <enum value="0x92EA" name="GL_TESS_EVALUATION_SUBROUTINE"/> >+ <enum value="0x92EB" name="GL_GEOMETRY_SUBROUTINE"/> >+ <enum value="0x92EC" name="GL_FRAGMENT_SUBROUTINE"/> >+ <enum value="0x92ED" name="GL_COMPUTE_SUBROUTINE"/> >+ <enum value="0x92EE" name="GL_VERTEX_SUBROUTINE_UNIFORM"/> >+ <enum value="0x92EF" name="GL_TESS_CONTROL_SUBROUTINE_UNIFORM"/> >+ <enum value="0x92F0" name="GL_TESS_EVALUATION_SUBROUTINE_UNIFORM"/> >+ <enum value="0x92F1" name="GL_GEOMETRY_SUBROUTINE_UNIFORM"/> >+ <enum value="0x92F2" name="GL_FRAGMENT_SUBROUTINE_UNIFORM"/> >+ <enum value="0x92F3" name="GL_COMPUTE_SUBROUTINE_UNIFORM"/> >+ <enum value="0x92F4" name="GL_TRANSFORM_FEEDBACK_VARYING"/> >+ <enum value="0x92F5" name="GL_ACTIVE_RESOURCES"/> >+ <enum value="0x92F6" name="GL_MAX_NAME_LENGTH"/> >+ <enum value="0x92F7" name="GL_MAX_NUM_ACTIVE_VARIABLES"/> >+ <enum value="0x92F8" name="GL_MAX_NUM_COMPATIBLE_SUBROUTINES"/> >+ <enum value="0x92F9" name="GL_NAME_LENGTH"/> >+ <enum value="0x92FA" name="GL_TYPE"/> >+ <enum value="0x92FB" name="GL_ARRAY_SIZE"/> >+ <enum value="0x92FC" name="GL_OFFSET"/> >+ <enum value="0x92FD" name="GL_BLOCK_INDEX"/> >+ <enum value="0x92FE" name="GL_ARRAY_STRIDE"/> >+ <enum value="0x92FF" name="GL_MATRIX_STRIDE"/> >+ <enum value="0x9300" name="GL_IS_ROW_MAJOR"/> >+ <enum value="0x9301" name="GL_ATOMIC_COUNTER_BUFFER_INDEX"/> >+ <enum value="0x9302" name="GL_BUFFER_BINDING"/> >+ <enum value="0x9303" name="GL_BUFFER_DATA_SIZE"/> >+ <enum value="0x9304" name="GL_NUM_ACTIVE_VARIABLES"/> >+ <enum value="0x9305" name="GL_ACTIVE_VARIABLES"/> >+ <enum value="0x9306" name="GL_REFERENCED_BY_VERTEX_SHADER"/> >+ <enum value="0x9307" name="GL_REFERENCED_BY_TESS_CONTROL_SHADER"/> >+ <enum value="0x9307" name="GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT"/> >+ <enum value="0x9307" name="GL_REFERENCED_BY_TESS_CONTROL_SHADER_OES"/> >+ <enum value="0x9308" name="GL_REFERENCED_BY_TESS_EVALUATION_SHADER"/> >+ <enum value="0x9308" name="GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT"/> >+ <enum value="0x9308" name="GL_REFERENCED_BY_TESS_EVALUATION_SHADER_OES"/> >+ <enum value="0x9309" name="GL_REFERENCED_BY_GEOMETRY_SHADER"/> >+ <enum value="0x9309" name="GL_REFERENCED_BY_GEOMETRY_SHADER_EXT"/> >+ <enum value="0x9309" name="GL_REFERENCED_BY_GEOMETRY_SHADER_OES"/> >+ <enum value="0x930A" name="GL_REFERENCED_BY_FRAGMENT_SHADER"/> >+ <enum value="0x930B" name="GL_REFERENCED_BY_COMPUTE_SHADER"/> >+ <enum value="0x930C" name="GL_TOP_LEVEL_ARRAY_SIZE"/> >+ <enum value="0x930D" name="GL_TOP_LEVEL_ARRAY_STRIDE"/> >+ <enum value="0x930E" name="GL_LOCATION"/> >+ <enum value="0x930F" name="GL_LOCATION_INDEX"/> >+ <enum value="0x930F" name="GL_LOCATION_INDEX_EXT"/> >+ <enum value="0x9310" name="GL_FRAMEBUFFER_DEFAULT_WIDTH"/> >+ <enum value="0x9311" name="GL_FRAMEBUFFER_DEFAULT_HEIGHT"/> >+ <enum value="0x9312" name="GL_FRAMEBUFFER_DEFAULT_LAYERS"/> >+ <enum value="0x9312" name="GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT"/> >+ <enum value="0x9312" name="GL_FRAMEBUFFER_DEFAULT_LAYERS_OES"/> >+ <enum value="0x9313" name="GL_FRAMEBUFFER_DEFAULT_SAMPLES"/> >+ <enum value="0x9314" name="GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS"/> >+ <enum value="0x9315" name="GL_MAX_FRAMEBUFFER_WIDTH"/> >+ <enum value="0x9316" name="GL_MAX_FRAMEBUFFER_HEIGHT"/> >+ <enum value="0x9317" name="GL_MAX_FRAMEBUFFER_LAYERS"/> >+ <enum value="0x9317" name="GL_MAX_FRAMEBUFFER_LAYERS_EXT"/> >+ <enum value="0x9317" name="GL_MAX_FRAMEBUFFER_LAYERS_OES"/> >+ <enum value="0x9318" name="GL_MAX_FRAMEBUFFER_SAMPLES"/> >+ <unused start="0x9319" end="0x9326" vendor="NV"/> >+ <enum value="0x9327" name="GL_RASTER_MULTISAMPLE_EXT"/> >+ <enum value="0x9328" name="GL_RASTER_SAMPLES_EXT"/> >+ <enum value="0x9329" name="GL_MAX_RASTER_SAMPLES_EXT"/> >+ <enum value="0x932A" name="GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT"/> >+ <enum value="0x932B" name="GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT"/> >+ <enum value="0x932C" name="GL_EFFECTIVE_RASTER_SAMPLES_EXT"/> >+ <enum value="0x932D" name="GL_DEPTH_SAMPLES_NV"/> >+ <enum value="0x932E" name="GL_STENCIL_SAMPLES_NV"/> >+ <enum value="0x932F" name="GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV"/> >+ <enum value="0x9330" name="GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV"/> >+ <enum value="0x9331" name="GL_COVERAGE_MODULATION_TABLE_NV"/> >+ <enum value="0x9332" name="GL_COVERAGE_MODULATION_NV"/> >+ <enum value="0x9333" name="GL_COVERAGE_MODULATION_TABLE_SIZE_NV"/> >+ <unused start="0x9334" end="0x9338" vendor="NV"/> >+ <enum value="0x9339" name="GL_WARP_SIZE_NV"/> >+ <enum value="0x933A" name="GL_WARPS_PER_SM_NV"/> >+ <enum value="0x933B" name="GL_SM_COUNT_NV"/> >+ <enum value="0x933C" name="GL_FILL_RECTANGLE_NV"/> >+ <enum value="0x933D" name="GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB"/> >+ <enum value="0x933D" name="GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV"/> >+ <enum value="0x933E" name="GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB"/> >+ <enum value="0x933E" name="GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV"/> >+ <enum value="0x933F" name="GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB"/> >+ <enum value="0x933F" name="GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV"/> >+ <enum value="0x9340" name="GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB"/> >+ <enum value="0x9340" name="GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV"/> >+ <enum value="0x9341" name="GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB"/> >+ <enum value="0x9341" name="GL_PROGRAMMABLE_SAMPLE_LOCATION_NV"/> >+ <enum value="0x9342" name="GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB"/> >+ <enum value="0x9342" name="GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV"/> >+ <enum value="0x9343" name="GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB"/> >+ <enum value="0x9343" name="GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV"/> >+ <enum value="0x9344" name="GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB"/> >+ <enum value="0x9345" name="GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB"/> >+ <enum value="0x9346" name="GL_CONSERVATIVE_RASTERIZATION_NV"/> >+ <enum value="0x9347" name="GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV"/> >+ <enum value="0x9348" name="GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV"/> >+ <enum value="0x9349" name="GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV"/> >+ <enum value="0x934A" name="GL_LOCATION_COMPONENT"/> >+ <enum value="0x934B" name="GL_TRANSFORM_FEEDBACK_BUFFER_INDEX"/> >+ <enum value="0x934C" name="GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE"/> >+ <enum value="0x934D" name="GL_ALPHA_TO_COVERAGE_DITHER_DEFAULT_NV"/> >+ <enum value="0x934E" name="GL_ALPHA_TO_COVERAGE_DITHER_ENABLE_NV"/> >+ <enum value="0x934F" name="GL_ALPHA_TO_COVERAGE_DITHER_DISABLE_NV"/> >+ <enum value="0x9350" name="GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV"/> >+ <enum value="0x9351" name="GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV"/> >+ <enum value="0x9352" name="GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV"/> >+ <enum value="0x9353" name="GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV"/> >+ <enum value="0x9354" name="GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV"/> >+ <enum value="0x9355" name="GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV"/> >+ <enum value="0x9356" name="GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV"/> >+ <enum value="0x9357" name="GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV"/> >+ <enum value="0x9358" name="GL_VIEWPORT_SWIZZLE_X_NV"/> >+ <enum value="0x9359" name="GL_VIEWPORT_SWIZZLE_Y_NV"/> >+ <enum value="0x935A" name="GL_VIEWPORT_SWIZZLE_Z_NV"/> >+ <enum value="0x935B" name="GL_VIEWPORT_SWIZZLE_W_NV"/> >+ <enum value="0x935C" name="GL_CLIP_ORIGIN"/> >+ <enum value="0x935C" name="GL_CLIP_ORIGIN_EXT" alias="GL_CLIP_ORIGIN"/> >+ <enum value="0x935D" name="GL_CLIP_DEPTH_MODE"/> >+ <enum value="0x935D" name="GL_CLIP_DEPTH_MODE_EXT" alias="GL_CLIP_DEPTH_MODE"/> >+ <enum value="0x935E" name="GL_NEGATIVE_ONE_TO_ONE"/> >+ <enum value="0x935E" name="GL_NEGATIVE_ONE_TO_ONE_EXT" alias="GL_NEGATIVE_ONE_TO_ONE"/> >+ <enum value="0x935F" name="GL_ZERO_TO_ONE"/> >+ <enum value="0x935F" name="GL_ZERO_TO_ONE_EXT" alias="GL_ZERO_TO_ONE"/> >+ <unused start="0x9360" end="0x9364" vendor="NV"/> >+ <enum value="0x9365" name="GL_CLEAR_TEXTURE"/> >+ <enum value="0x9366" name="GL_TEXTURE_REDUCTION_MODE_ARB"/> >+ <enum value="0x9366" name="GL_TEXTURE_REDUCTION_MODE_EXT" alias="GL_TEXTURE_REDUCTION_MODE_ARB"/> >+ <enum value="0x9367" name="GL_WEIGHTED_AVERAGE_ARB"/> >+ <enum value="0x9367" name="GL_WEIGHTED_AVERAGE_EXT" alias="GL_WEIGHTED_AVERAGE_ARB"/> >+ <enum value="0x9368" name="GL_FONT_GLYPHS_AVAILABLE_NV"/> >+ <enum value="0x9369" name="GL_FONT_TARGET_UNAVAILABLE_NV"/> >+ <enum value="0x936A" name="GL_FONT_UNAVAILABLE_NV"/> >+ <enum value="0x936B" name="GL_FONT_UNINTELLIGIBLE_NV"/> >+ <enum value="0x936C" name="GL_STANDARD_FONT_FORMAT_NV"/> >+ <enum value="0x936D" name="GL_FRAGMENT_INPUT_NV"/> >+ <enum value="0x936E" name="GL_UNIFORM_BUFFER_UNIFIED_NV"/> >+ <enum value="0x936F" name="GL_UNIFORM_BUFFER_ADDRESS_NV"/> >+ <enum value="0x9370" name="GL_UNIFORM_BUFFER_LENGTH_NV"/> >+ <enum value="0x9371" name="GL_MULTISAMPLES_NV"/> >+ <enum value="0x9372" name="GL_SUPERSAMPLE_SCALE_X_NV"/> >+ <enum value="0x9373" name="GL_SUPERSAMPLE_SCALE_Y_NV"/> >+ <enum value="0x9374" name="GL_CONFORMANT_NV"/> >+ <unused start="0x9375" end="0x9378" vendor="NV"/> >+ <enum value="0x9379" name="GL_CONSERVATIVE_RASTER_DILATE_NV"/> >+ <enum value="0x937A" name="GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV"/> >+ <enum value="0x937B" name="GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV"/> >+ <enum value="0x937C" name="GL_VIEWPORT_POSITION_W_SCALE_NV"/> >+ <enum value="0x937D" name="GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV"/> >+ <enum value="0x937E" name="GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV"/> >+ <unused start="0x937F" vendor="NV"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9380" end="0x939F" vendor="ARB"> >+ <enum value="0x9380" name="GL_NUM_SAMPLE_COUNTS"/> >+ <enum value="0x9381" name="GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB"/> >+ <enum value="0x9381" name="GL_MULTISAMPLE_LINE_WIDTH_RANGE"/> >+ <enum value="0x9382" name="GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB"/> >+ <enum value="0x9382" name="GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY"/> >+ <unused start="0x9383" end="0x939F" vendor="ARB"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x93A0" end="0x93AF" vendor="ANGLE" comment="Khronos bug 8100"> >+ <enum value="0x93A0" name="GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE"/> >+ <enum value="0x93A1" name="GL_BGRA8_EXT"/> >+ <enum value="0x93A2" name="GL_TEXTURE_USAGE_ANGLE"/> >+ <enum value="0x93A3" name="GL_FRAMEBUFFER_ATTACHMENT_ANGLE"/> >+ <enum value="0x93A4" name="GL_PACK_REVERSE_ROW_ORDER_ANGLE"/> >+ <unused start="0x93A5" vendor="ANGLE"/> >+ <enum value="0x93A6" name="GL_PROGRAM_BINARY_ANGLE"/> >+ <unused start="0x93A7" end="0x93AF" vendor="ANGLE"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x93B0" end="0x93EF" vendor="OES" comment="Khronos bug 8853"> >+ <enum value="0x93B0" name="GL_COMPRESSED_RGBA_ASTC_4x4"/> >+ <enum value="0x93B0" name="GL_COMPRESSED_RGBA_ASTC_4x4_KHR"/> >+ <enum value="0x93B1" name="GL_COMPRESSED_RGBA_ASTC_5x4"/> >+ <enum value="0x93B1" name="GL_COMPRESSED_RGBA_ASTC_5x4_KHR"/> >+ <enum value="0x93B2" name="GL_COMPRESSED_RGBA_ASTC_5x5"/> >+ <enum value="0x93B2" name="GL_COMPRESSED_RGBA_ASTC_5x5_KHR"/> >+ <enum value="0x93B3" name="GL_COMPRESSED_RGBA_ASTC_6x5"/> >+ <enum value="0x93B3" name="GL_COMPRESSED_RGBA_ASTC_6x5_KHR"/> >+ <enum value="0x93B4" name="GL_COMPRESSED_RGBA_ASTC_6x6"/> >+ <enum value="0x93B4" name="GL_COMPRESSED_RGBA_ASTC_6x6_KHR"/> >+ <enum value="0x93B5" name="GL_COMPRESSED_RGBA_ASTC_8x5"/> >+ <enum value="0x93B5" name="GL_COMPRESSED_RGBA_ASTC_8x5_KHR"/> >+ <enum value="0x93B6" name="GL_COMPRESSED_RGBA_ASTC_8x6"/> >+ <enum value="0x93B6" name="GL_COMPRESSED_RGBA_ASTC_8x6_KHR"/> >+ <enum value="0x93B7" name="GL_COMPRESSED_RGBA_ASTC_8x8"/> >+ <enum value="0x93B7" name="GL_COMPRESSED_RGBA_ASTC_8x8_KHR"/> >+ <enum value="0x93B8" name="GL_COMPRESSED_RGBA_ASTC_10x5"/> >+ <enum value="0x93B8" name="GL_COMPRESSED_RGBA_ASTC_10x5_KHR"/> >+ <enum value="0x93B9" name="GL_COMPRESSED_RGBA_ASTC_10x6"/> >+ <enum value="0x93B9" name="GL_COMPRESSED_RGBA_ASTC_10x6_KHR"/> >+ <enum value="0x93BA" name="GL_COMPRESSED_RGBA_ASTC_10x8"/> >+ <enum value="0x93BA" name="GL_COMPRESSED_RGBA_ASTC_10x8_KHR"/> >+ <enum value="0x93BB" name="GL_COMPRESSED_RGBA_ASTC_10x10"/> >+ <enum value="0x93BB" name="GL_COMPRESSED_RGBA_ASTC_10x10_KHR"/> >+ <enum value="0x93BC" name="GL_COMPRESSED_RGBA_ASTC_12x10"/> >+ <enum value="0x93BC" name="GL_COMPRESSED_RGBA_ASTC_12x10_KHR"/> >+ <enum value="0x93BD" name="GL_COMPRESSED_RGBA_ASTC_12x12"/> >+ <enum value="0x93BD" name="GL_COMPRESSED_RGBA_ASTC_12x12_KHR"/> >+ <unused start="0x93BE" end="0x93BF" vendor="OES"/> >+ <enum value="0x93C0" name="GL_COMPRESSED_RGBA_ASTC_3x3x3_OES"/> >+ <enum value="0x93C1" name="GL_COMPRESSED_RGBA_ASTC_4x3x3_OES"/> >+ <enum value="0x93C2" name="GL_COMPRESSED_RGBA_ASTC_4x4x3_OES"/> >+ <enum value="0x93C3" name="GL_COMPRESSED_RGBA_ASTC_4x4x4_OES"/> >+ <enum value="0x93C4" name="GL_COMPRESSED_RGBA_ASTC_5x4x4_OES"/> >+ <enum value="0x93C5" name="GL_COMPRESSED_RGBA_ASTC_5x5x4_OES"/> >+ <enum value="0x93C6" name="GL_COMPRESSED_RGBA_ASTC_5x5x5_OES"/> >+ <enum value="0x93C7" name="GL_COMPRESSED_RGBA_ASTC_6x5x5_OES"/> >+ <enum value="0x93C8" name="GL_COMPRESSED_RGBA_ASTC_6x6x5_OES"/> >+ <enum value="0x93C9" name="GL_COMPRESSED_RGBA_ASTC_6x6x6_OES"/> >+ <unused start="0x93CA" end="0x93CF" vendor="OES"/> >+ <enum value="0x93D0" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4"/> >+ <enum value="0x93D0" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR"/> >+ <enum value="0x93D1" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4"/> >+ <enum value="0x93D1" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR"/> >+ <enum value="0x93D2" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5"/> >+ <enum value="0x93D2" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR"/> >+ <enum value="0x93D3" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5"/> >+ <enum value="0x93D3" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR"/> >+ <enum value="0x93D4" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6"/> >+ <enum value="0x93D4" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR"/> >+ <enum value="0x93D5" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5"/> >+ <enum value="0x93D5" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR"/> >+ <enum value="0x93D6" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6"/> >+ <enum value="0x93D6" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR"/> >+ <enum value="0x93D7" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8"/> >+ <enum value="0x93D7" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR"/> >+ <enum value="0x93D8" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5"/> >+ <enum value="0x93D8" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR"/> >+ <enum value="0x93D9" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6"/> >+ <enum value="0x93D9" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR"/> >+ <enum value="0x93DA" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8"/> >+ <enum value="0x93DA" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR"/> >+ <enum value="0x93DB" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10"/> >+ <enum value="0x93DB" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR"/> >+ <enum value="0x93DC" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10"/> >+ <enum value="0x93DC" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR"/> >+ <enum value="0x93DD" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12"/> >+ <enum value="0x93DD" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR"/> >+ <unused start="0x93DE" end="0x93DF" vendor="OES"/> >+ <enum value="0x93E0" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES"/> >+ <enum value="0x93E1" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES"/> >+ <enum value="0x93E2" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES"/> >+ <enum value="0x93E3" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES"/> >+ <enum value="0x93E4" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES"/> >+ <enum value="0x93E5" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES"/> >+ <enum value="0x93E6" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES"/> >+ <enum value="0x93E7" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES"/> >+ <enum value="0x93E8" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES"/> >+ <enum value="0x93E9" name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES"/> >+ <unused start="0x93EA" end="0x93EF" vendor="OES"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x93F0" end="0x94EF" vendor="APPLE" comment="Khronos bug 10233"> >+ <enum value="0x93F0" name="GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG"/> >+ <enum value="0x93F1" name="GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG"/> >+ <unused start="0x93F2" end="0x94EF" vendor="APPLE"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x94F0" end="0x950F" vendor="INTEL" comment="Khronos bug 11345"> >+ <enum value="0x94F0" name="GL_PERFQUERY_COUNTER_EVENT_INTEL"/> >+ <enum value="0x94F1" name="GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL"/> >+ <enum value="0x94F2" name="GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL"/> >+ <enum value="0x94F3" name="GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL"/> >+ <enum value="0x94F4" name="GL_PERFQUERY_COUNTER_RAW_INTEL"/> >+ <enum value="0x94F5" name="GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL"/> >+ <unused start="0x94F6" end="0x94F7" vendor="INTEL"/> >+ <enum value="0x94F8" name="GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL"/> >+ <enum value="0x94F9" name="GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL"/> >+ <enum value="0x94FA" name="GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL"/> >+ <enum value="0x94FB" name="GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL"/> >+ <enum value="0x94FC" name="GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL"/> >+ <enum value="0x94FD" name="GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL"/> >+ <enum value="0x94FE" name="GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL"/> >+ <enum value="0x94FF" name="GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL"/> >+ <enum value="0x9500" name="GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL"/> >+ <unused start="0x9501" end="0x950F" vendor="INTEL"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9510" end="0x952F" vendor="Broadcom" comment="Khronos bug 12203"> >+ <unused start="0x9510" end="0x952F" vendor="Broadcom"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9530" end="0x962F" vendor="NV" comment="Khronos bug 12977"> >+ <enum value="0x9530" name="GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT"/> >+ <enum value="0x9531" name="GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT"/> >+ <unused start="0x9532" end="0x953F" vendor="NV"/> >+ <enum value="0x9540" name="GL_QUERY_RESOURCE_TYPE_VIDMEM_ALLOC_NV"/> >+ <unused start="0x9541" vendor="NV"/> >+ <enum value="0x9542" name="GL_QUERY_RESOURCE_MEMTYPE_VIDMEM_NV"/> >+ <unused start="0x9543" vendor="NV"/> >+ <enum value="0x9544" name="GL_QUERY_RESOURCE_SYS_RESERVED_NV"/> >+ <enum value="0x9545" name="GL_QUERY_RESOURCE_TEXTURE_NV"/> >+ <enum value="0x9546" name="GL_QUERY_RESOURCE_RENDERBUFFER_NV"/> >+ <enum value="0x9547" name="GL_QUERY_RESOURCE_BUFFEROBJECT_NV"/> >+ <enum value="0x9548" name="GL_PER_GPU_STORAGE_NV"/> >+ <enum value="0x9549" name="GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV"/> >+ <unused start="0x954A" end="0x954C" vendor="NV"/> >+ <enum value="0x954D" name="GL_CONSERVATIVE_RASTER_MODE_NV"/> >+ <enum value="0x954E" name="GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV"/> >+ <enum value="0x954F" name="GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV"/> >+ <enum value="0x9550" name="GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV"/> >+ <enum value="0x9551" name="GL_SHADER_BINARY_FORMAT_SPIR_V"/> >+ <enum value="0x9551" name="GL_SHADER_BINARY_FORMAT_SPIR_V_ARB" alias="GL_SHADER_BINARY_FORMAT_SPIR_V"/> >+ <enum value="0x9552" name="GL_SPIR_V_BINARY"/> >+ <enum value="0x9552" name="GL_SPIR_V_BINARY_ARB" alias="GL_SPIR_V_BINARY"/> >+ <enum value="0x9553" name="GL_SPIR_V_EXTENSIONS"/> >+ <enum value="0x9554" name="GL_NUM_SPIR_V_EXTENSIONS"/> >+ <unused start="0x9555" end="0x9557" vendor="NV"/> >+ <enum value="0x9558" name="GL_RENDER_GPU_MASK_NV"/> >+ <unused start="0x9559" end="0x957F" vendor="NV"/> >+ <enum value="0x9580" name="GL_TEXTURE_TILING_EXT"/> >+ <enum value="0x9581" name="GL_DEDICATED_MEMORY_OBJECT_EXT"/> >+ <enum value="0x9582" name="GL_NUM_TILING_TYPES_EXT"/> >+ <enum value="0x9583" name="GL_TILING_TYPES_EXT"/> >+ <enum value="0x9584" name="GL_OPTIMAL_TILING_EXT"/> >+ <enum value="0x9585" name="GL_LINEAR_TILING_EXT"/> >+ <enum value="0x9586" name="GL_HANDLE_TYPE_OPAQUE_FD_EXT"/> >+ <enum value="0x9587" name="GL_HANDLE_TYPE_OPAQUE_WIN32_EXT"/> >+ <enum value="0x9588" name="GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT"/> >+ <enum value="0x9589" name="GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT"/> >+ <enum value="0x958A" name="GL_HANDLE_TYPE_D3D12_RESOURCE_EXT"/> >+ <enum value="0x958B" name="GL_HANDLE_TYPE_D3D11_IMAGE_EXT"/> >+ <enum value="0x958C" name="GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT"/> >+ <enum value="0x958D" name="GL_LAYOUT_GENERAL_EXT"/> >+ <enum value="0x958E" name="GL_LAYOUT_COLOR_ATTACHMENT_EXT"/> >+ <enum value="0x958F" name="GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT"/> >+ <enum value="0x9590" name="GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT"/> >+ <enum value="0x9591" name="GL_LAYOUT_SHADER_READ_ONLY_EXT"/> >+ <enum value="0x9592" name="GL_LAYOUT_TRANSFER_SRC_EXT"/> >+ <enum value="0x9593" name="GL_LAYOUT_TRANSFER_DST_EXT"/> >+ <enum value="0x9594" name="GL_HANDLE_TYPE_D3D12_FENCE_EXT"/> >+ <enum value="0x9595" name="GL_D3D12_FENCE_VALUE_EXT"/> >+ <enum value="0x9596" name="GL_NUM_DEVICE_UUIDS_EXT"/> >+ <enum value="0x9597" name="GL_DEVICE_UUID_EXT"/> >+ <enum value="0x9598" name="GL_DRIVER_UUID_EXT"/> >+ <enum value="0x9599" name="GL_DEVICE_LUID_EXT"/> >+ <enum value="0x959A" name="GL_DEVICE_NODE_MASK_EXT"/> >+ <enum value="0x959B" name="GL_PROTECTED_MEMORY_OBJECT_EXT"/> >+ <unused start="0x959C" end="0x962F" vendor="NV"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9630" end="0x963F" vendor="Oculus" comment="Email from Cass Everitt"> >+ <enum value="0x9630" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR"/> >+ <enum value="0x9631" name="GL_MAX_VIEWS_OVR"/> >+ <enum value="0x9632" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR"/> >+ <enum value="0x9633" name="GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR"/> >+ <unused start="0x9634" end="0x963F" vendor="Oculus"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9640" end="0x964F" vendor="Mediatek" comment="Khronos bug 14294"> >+ <enum value="0x9640" name="GL_GS_SHADER_BINARY_MTK"/> >+ <enum value="0x9641" name="GL_GS_PROGRAM_BINARY_MTK"/> >+ <unused start="0x9642" end="0x964F" vendor="Mediatek"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9650" end="0x968F" vendor="IMG" comment="Khronos bug 14977"> >+ <enum value="0x9650" name="GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_FAST_SIZE_EXT"/> >+ <enum value="0x9651" name="GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_SIZE_EXT"/> >+ <enum value="0x9652" name="GL_FRAMEBUFFER_INCOMPLETE_INSUFFICIENT_SHADER_COMBINED_LOCAL_STORAGE_EXT"/> >+ <unused start="0x9653" end="0x968F" vendor="IMG"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9690" end="0x969F" vendor="ANGLE" comment="Khronos bug 15423"> >+ <unused start="0x9690" end="0x969F" vendor="ANGLE"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x96A0" end="0x96AF" vendor="Qualcomm" comment="contact Maurice Ribble"> >+ <unused start="0x96A0" end="0x96A1" vendor="Qualcomm"/> >+ <enum value="0x96A2" name="GL_FRAMEBUFFER_FETCH_NONCOHERENT_QCOM"/> >+ <unused start="0x96A3" end="0x96AF" vendor="Qualcomm"/> >+ </enums> >+ >+<!-- Enums reservable for future use. To reserve a new range, allocate one >+ or more multiples of 16 starting at the lowest available point in this >+ block and note it in a new <enums> block immediately above. >+ >+ Please remember that new enumerant allocations must be obtained by >+ request to the Khronos API registrar (see comments at the top of this >+ file) File requests in the Khronos Bugzilla, OpenGL project, Registry >+ component. --> >+ >+ <enums namespace="GL" start="0x96B0" end="99999" vendor="ARB" comment="RESERVED FOR FUTURE ALLOCATIONS BY KHRONOS"> >+ <unused start="0x96B0" end="99999" comment="RESERVED"/> >+ </enums> >+ >+<!-- Historical large block allocations, all unused except (in older days) by IBM --> >+ <enums namespace="GL" start="100000" end="100999" vendor="ARB" comment="GLU enums"/> >+ <enums namespace="GL" start="101000" end="101999" vendor="ARB" comment="Conformance test enums"/> >+ <enums namespace="GL" start="102000" end="102999" vendor="ARB" comment="Unused, unlikely to ever be used"/> >+ >+ <enums namespace="GL" start="103000" end="103999" vendor="IBM" comment="IBM is out of the graphics hardware business. Most of this range will remain unused."> >+ <enum value="0x19262" name="GL_RASTER_POSITION_UNCLIPPED_IBM"/> >+ <enum value="103050" name="GL_CULL_VERTEX_IBM"/> >+ <enum value="103060" name="GL_ALL_STATIC_DATA_IBM"/> >+ <enum value="103061" name="GL_STATIC_VERTEX_ARRAY_IBM"/> >+ <enum value="103070" name="GL_VERTEX_ARRAY_LIST_IBM"/> >+ <enum value="103071" name="GL_NORMAL_ARRAY_LIST_IBM"/> >+ <enum value="103072" name="GL_COLOR_ARRAY_LIST_IBM"/> >+ <enum value="103073" name="GL_INDEX_ARRAY_LIST_IBM"/> >+ <enum value="103074" name="GL_TEXTURE_COORD_ARRAY_LIST_IBM"/> >+ <enum value="103075" name="GL_EDGE_FLAG_ARRAY_LIST_IBM"/> >+ <enum value="103076" name="GL_FOG_COORDINATE_ARRAY_LIST_IBM"/> >+ <enum value="103077" name="GL_SECONDARY_COLOR_ARRAY_LIST_IBM"/> >+ <enum value="103080" name="GL_VERTEX_ARRAY_LIST_STRIDE_IBM"/> >+ <enum value="103081" name="GL_NORMAL_ARRAY_LIST_STRIDE_IBM"/> >+ <enum value="103082" name="GL_COLOR_ARRAY_LIST_STRIDE_IBM"/> >+ <enum value="103083" name="GL_INDEX_ARRAY_LIST_STRIDE_IBM"/> >+ <enum value="103084" name="GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM"/> >+ <enum value="103085" name="GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM"/> >+ <enum value="103086" name="GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM"/> >+ <enum value="103087" name="GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM"/> >+ </enums> >+ >+ <enums namespace="GL" start="104000" end="104999" vendor="NEC" comment="NEC may be out of the graphics hardware business?"/> >+ <enums namespace="GL" start="105000" end="105999" vendor="Compaq" comment="Compaq was acquired by HP"/> >+ <enums namespace="GL" start="106000" end="106999" vendor="KPC" comment="Kubota Pacific is out of business"/> >+ <enums namespace="GL" start="107000" end="107999" vendor="PGI" comment="Portland Graphics was acquired by Template Graphics, which is out of business"> >+ <!-- lots of <unused> areas here which won't be computed yet --> >+ <enum value="0x1A1F8" name="GL_PREFER_DOUBLEBUFFER_HINT_PGI"/> >+ <enum value="0x1A1FD" name="GL_CONSERVE_MEMORY_HINT_PGI"/> >+ <enum value="0x1A1FE" name="GL_RECLAIM_MEMORY_HINT_PGI"/> >+ <enum value="0x1A202" name="GL_NATIVE_GRAPHICS_HANDLE_PGI"/> >+ <enum value="0x1A203" name="GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI"/> >+ <enum value="0x1A204" name="GL_NATIVE_GRAPHICS_END_HINT_PGI"/> >+ <enum value="0x1A20C" name="GL_ALWAYS_FAST_HINT_PGI"/> >+ <enum value="0x1A20D" name="GL_ALWAYS_SOFT_HINT_PGI"/> >+ <enum value="0x1A20E" name="GL_ALLOW_DRAW_OBJ_HINT_PGI"/> >+ <enum value="0x1A20F" name="GL_ALLOW_DRAW_WIN_HINT_PGI"/> >+ <enum value="0x1A210" name="GL_ALLOW_DRAW_FRG_HINT_PGI"/> >+ <enum value="0x1A211" name="GL_ALLOW_DRAW_MEM_HINT_PGI"/> >+ <enum value="0x1A216" name="GL_STRICT_DEPTHFUNC_HINT_PGI"/> >+ <enum value="0x1A217" name="GL_STRICT_LIGHTING_HINT_PGI"/> >+ <enum value="0x1A218" name="GL_STRICT_SCISSOR_HINT_PGI"/> >+ <enum value="0x1A219" name="GL_FULL_STIPPLE_HINT_PGI"/> >+ <enum value="0x1A220" name="GL_CLIP_NEAR_HINT_PGI"/> >+ <enum value="0x1A221" name="GL_CLIP_FAR_HINT_PGI"/> >+ <enum value="0x1A222" name="GL_WIDE_LINE_HINT_PGI"/> >+ <enum value="0x1A223" name="GL_BACK_NORMALS_HINT_PGI"/> >+ <enum value="0x1A22A" name="GL_VERTEX_DATA_HINT_PGI"/> >+ <enum value="0x1A22B" name="GL_VERTEX_CONSISTENT_HINT_PGI"/> >+ <enum value="0x1A22C" name="GL_MATERIAL_SIDE_HINT_PGI"/> >+ <enum value="0x1A22D" name="GL_MAX_VERTEX_HINT_PGI"/> >+ </enums> >+ >+ <enums namespace="GL" start="108000" end="108999" vendor="ES" comment="Evans and Sutherland is out of the graphics hardware business"/> >+ >+ <!-- SECTION: GL command definitions. --> >+ <commands namespace="GL"> >+ <command> >+ <proto>void <name>glAccum</name></proto> >+ <param group="AccumOp"><ptype>GLenum</ptype> <name>op</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>value</name></param> >+ <glx type="render" opcode="137"/> >+ </command> >+ <command> >+ <proto>void <name>glAccumxOES</name></proto> >+ <param><ptype>GLenum</ptype> <name>op</name></param> >+ <param><ptype>GLfixed</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glActiveProgramEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ </command> >+ <command> >+ <proto>void <name>glActiveShaderProgram</name></proto> >+ <param><ptype>GLuint</ptype> <name>pipeline</name></param> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ </command> >+ <command> >+ <proto>void <name>glActiveShaderProgramEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>pipeline</name></param> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ </command> >+ <command> >+ <proto>void <name>glActiveStencilFaceEXT</name></proto> >+ <param group="StencilFaceDirection"><ptype>GLenum</ptype> <name>face</name></param> >+ <glx type="render" opcode="4220"/> >+ </command> >+ <command> >+ <proto>void <name>glActiveTexture</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <glx type="render" opcode="197"/> >+ </command> >+ <command> >+ <proto>void <name>glActiveTextureARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <alias name="glActiveTexture"/> >+ <glx type="render" opcode="197"/> >+ </command> >+ <command> >+ <proto>void <name>glActiveVaryingNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param len="COMPSIZE(name)">const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glAlphaFragmentOp1ATI</name></proto> >+ <param group="FragmentOpATI"><ptype>GLenum</ptype> <name>op</name></param> >+ <param><ptype>GLuint</ptype> <name>dst</name></param> >+ <param><ptype>GLuint</ptype> <name>dstMod</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1Rep</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1Mod</name></param> >+ </command> >+ <command> >+ <proto>void <name>glAlphaFragmentOp2ATI</name></proto> >+ <param group="FragmentOpATI"><ptype>GLenum</ptype> <name>op</name></param> >+ <param><ptype>GLuint</ptype> <name>dst</name></param> >+ <param><ptype>GLuint</ptype> <name>dstMod</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1Rep</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1Mod</name></param> >+ <param><ptype>GLuint</ptype> <name>arg2</name></param> >+ <param><ptype>GLuint</ptype> <name>arg2Rep</name></param> >+ <param><ptype>GLuint</ptype> <name>arg2Mod</name></param> >+ </command> >+ <command> >+ <proto>void <name>glAlphaFragmentOp3ATI</name></proto> >+ <param group="FragmentOpATI"><ptype>GLenum</ptype> <name>op</name></param> >+ <param><ptype>GLuint</ptype> <name>dst</name></param> >+ <param><ptype>GLuint</ptype> <name>dstMod</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1Rep</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1Mod</name></param> >+ <param><ptype>GLuint</ptype> <name>arg2</name></param> >+ <param><ptype>GLuint</ptype> <name>arg2Rep</name></param> >+ <param><ptype>GLuint</ptype> <name>arg2Mod</name></param> >+ <param><ptype>GLuint</ptype> <name>arg3</name></param> >+ <param><ptype>GLuint</ptype> <name>arg3Rep</name></param> >+ <param><ptype>GLuint</ptype> <name>arg3Mod</name></param> >+ </command> >+ <command> >+ <proto>void <name>glAlphaFunc</name></proto> >+ <param group="AlphaFunction"><ptype>GLenum</ptype> <name>func</name></param> >+ <param><ptype>GLfloat</ptype> <name>ref</name></param> >+ <glx type="render" opcode="159"/> >+ </command> >+ <command> >+ <proto>void <name>glAlphaFuncQCOM</name></proto> >+ <param><ptype>GLenum</ptype> <name>func</name></param> >+ <param><ptype>GLclampf</ptype> <name>ref</name></param> >+ </command> >+ <command> >+ <proto>void <name>glAlphaFuncx</name></proto> >+ <param group="AlphaFunction"><ptype>GLenum</ptype> <name>func</name></param> >+ <param><ptype>GLfixed</ptype> <name>ref</name></param> >+ </command> >+ <command> >+ <proto>void <name>glAlphaFuncxOES</name></proto> >+ <param group="AlphaFunction"><ptype>GLenum</ptype> <name>func</name></param> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>ref</name></param> >+ </command> >+ <command> >+ <proto>void <name>glAlphaToCoverageDitherControlNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glApplyFramebufferAttachmentCMAAINTEL</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glApplyTextureEXT</name></proto> >+ <param group="LightTextureModeEXT"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glAcquireKeyedMutexWin32EXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>key</name></param> >+ <param><ptype>GLuint</ptype> <name>timeout</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glAreProgramsResidentNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>programs</name></param> >+ <param group="Boolean" len="n"><ptype>GLboolean</ptype> *<name>residences</name></param> >+ <glx type="vendor" opcode="1293"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glAreTexturesResident</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="Texture" len="n">const <ptype>GLuint</ptype> *<name>textures</name></param> >+ <param group="Boolean" len="n"><ptype>GLboolean</ptype> *<name>residences</name></param> >+ <glx type="single" opcode="143"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glAreTexturesResidentEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="Texture" len="n">const <ptype>GLuint</ptype> *<name>textures</name></param> >+ <param group="Boolean" len="n"><ptype>GLboolean</ptype> *<name>residences</name></param> >+ <glx type="vendor" opcode="11"/> >+ </command> >+ <command> >+ <proto>void <name>glArrayElement</name></proto> >+ <param><ptype>GLint</ptype> <name>i</name></param> >+ </command> >+ <command> >+ <proto>void <name>glArrayElementEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>i</name></param> >+ <alias name="glArrayElement"/> >+ </command> >+ <command> >+ <proto>void <name>glArrayObjectATI</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>array</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="ScalarType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLuint</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glAsyncMarkerSGIX</name></proto> >+ <param><ptype>GLuint</ptype> <name>marker</name></param> >+ </command> >+ <command> >+ <proto>void <name>glAttachObjectARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>containerObj</name></param> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>obj</name></param> >+ <alias name="glAttachShader"/> >+ </command> >+ <command> >+ <proto>void <name>glAttachShader</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>shader</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBegin</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <glx type="render" opcode="4"/> >+ </command> >+ <command> >+ <proto>void <name>glBeginConditionalRender</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBeginConditionalRenderNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>mode</name></param> >+ <alias name="glBeginConditionalRender"/> >+ <glx type="render" opcode="348"/> >+ </command> >+ <command> >+ <proto>void <name>glBeginConditionalRenderNVX</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBeginFragmentShaderATI</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glBeginOcclusionQueryNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBeginPerfMonitorAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>monitor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBeginPerfQueryINTEL</name></proto> >+ <param><ptype>GLuint</ptype> <name>queryHandle</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBeginQuery</name></proto> >+ <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <glx type="render" opcode="231"/> >+ </command> >+ <command> >+ <proto>void <name>glBeginQueryARB</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <alias name="glBeginQuery"/> >+ </command> >+ <command> >+ <proto>void <name>glBeginQueryEXT</name></proto> >+ <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBeginQueryIndexed</name></proto> >+ <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBeginTransformFeedback</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>primitiveMode</name></param> >+ <glx type="render" opcode="357"/> >+ </command> >+ <command> >+ <proto>void <name>glBeginTransformFeedbackEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>primitiveMode</name></param> >+ <alias name="glBeginTransformFeedback"/> >+ </command> >+ <command> >+ <proto>void <name>glBeginTransformFeedbackNV</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>primitiveMode</name></param> >+ <alias name="glBeginTransformFeedback"/> >+ </command> >+ <command> >+ <proto>void <name>glBeginVertexShaderEXT</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glBeginVideoCaptureNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_capture_slot</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindAttribLocation</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindAttribLocationARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>programObj</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param>const <ptype>GLcharARB</ptype> *<name>name</name></param> >+ <alias name="glBindAttribLocation"/> >+ </command> >+ <command> >+ <proto>void <name>glBindBuffer</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindBufferARB</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <alias name="glBindBuffer"/> >+ </command> >+ <command> >+ <proto>void <name>glBindBufferBase</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <glx type="render" opcode="356"/> >+ </command> >+ <command> >+ <proto>void <name>glBindBufferBaseEXT</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <alias name="glBindBufferBase"/> >+ </command> >+ <command> >+ <proto>void <name>glBindBufferBaseNV</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <alias name="glBindBufferBase"/> >+ </command> >+ <command> >+ <proto>void <name>glBindBufferOffsetEXT</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindBufferOffsetNV</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <alias name="glBindBufferOffsetEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glBindBufferRange</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <glx type="render" opcode="355"/> >+ </command> >+ <command> >+ <proto>void <name>glBindBufferRangeEXT</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <alias name="glBindBufferRange"/> >+ </command> >+ <command> >+ <proto>void <name>glBindBufferRangeNV</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <alias name="glBindBufferRange"/> >+ </command> >+ <command> >+ <proto>void <name>glBindBuffersBase</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>buffers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindBuffersRange</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>buffers</name></param> >+ <param len="count">const <ptype>GLintptr</ptype> *<name>offsets</name></param> >+ <param len="count">const <ptype>GLsizeiptr</ptype> *<name>sizes</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindFragDataLocation</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>color</name></param> >+ <param len="COMPSIZE(name)">const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindFragDataLocationEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>color</name></param> >+ <param len="COMPSIZE(name)">const <ptype>GLchar</ptype> *<name>name</name></param> >+ <alias name="glBindFragDataLocation"/> >+ </command> >+ <command> >+ <proto>void <name>glBindFragDataLocationIndexed</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>colorNumber</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindFragDataLocationIndexedEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>colorNumber</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>name</name></param> >+ <alias name="glBindFragDataLocationIndexed"/> >+ </command> >+ <command> >+ <proto>void <name>glBindFragmentShaderATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindFramebuffer</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <glx type="render" opcode="236"/> >+ </command> >+ <command> >+ <proto>void <name>glBindFramebufferEXT</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <glx type="render" opcode="4319"/> >+ </command> >+ <command> >+ <proto>void <name>glBindFramebufferOES</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindImageTexture</name></proto> >+ <param><ptype>GLuint</ptype> <name>unit</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>layered</name></param> >+ <param><ptype>GLint</ptype> <name>layer</name></param> >+ <param group="BufferAccessARB"><ptype>GLenum</ptype> <name>access</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindImageTextureEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>layered</name></param> >+ <param><ptype>GLint</ptype> <name>layer</name></param> >+ <param group="BufferAccessARB"><ptype>GLenum</ptype> <name>access</name></param> >+ <param><ptype>GLint</ptype> <name>format</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindImageTextures</name></proto> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>textures</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glBindLightParameterEXT</name></proto> >+ <param group="LightName"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="LightParameter"><ptype>GLenum</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glBindMaterialParameterEXT</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindMultiTextureEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glBindParameterEXT</name></proto> >+ <param group="VertexShaderParameterEXT"><ptype>GLenum</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindProgramARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <glx type="render" opcode="4180"/> >+ </command> >+ <command> >+ <proto>void <name>glBindProgramNV</name></proto> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <alias name="glBindProgramARB"/> >+ <glx type="render" opcode="4180"/> >+ </command> >+ <command> >+ <proto>void <name>glBindProgramPipeline</name></proto> >+ <param><ptype>GLuint</ptype> <name>pipeline</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindProgramPipelineEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>pipeline</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindRenderbuffer</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ <glx type="render" opcode="235"/> >+ </command> >+ <command> >+ <proto>void <name>glBindRenderbufferEXT</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ <glx type="render" opcode="4316"/> >+ </command> >+ <command> >+ <proto>void <name>glBindRenderbufferOES</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindSampler</name></proto> >+ <param><ptype>GLuint</ptype> <name>unit</name></param> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindSamplers</name></proto> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>samplers</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glBindTexGenParameterEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>unit</name></param> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindTexture</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <glx type="render" opcode="4117"/> >+ </command> >+ <command> >+ <proto>void <name>glBindTextureEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <alias name="glBindTexture"/> >+ <glx type="render" opcode="4117"/> >+ </command> >+ <command> >+ <proto>void <name>glBindTextureUnit</name></proto> >+ <param><ptype>GLuint</ptype> <name>unit</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glBindTextureUnitParameterEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>unit</name></param> >+ <param group="VertexShaderTextureUnitParameter"><ptype>GLenum</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindTextures</name></proto> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>textures</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindTransformFeedback</name></proto> >+ <param group="BindTransformFeedbackTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindTransformFeedbackNV</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindVertexArray</name></proto> >+ <param><ptype>GLuint</ptype> <name>array</name></param> >+ <glx type="render" opcode="350"/> >+ </command> >+ <command> >+ <proto>void <name>glBindVertexArrayAPPLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>array</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindVertexArrayOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>array</name></param> >+ <alias name="glBindVertexArray"/> >+ </command> >+ <command> >+ <proto>void <name>glBindVertexBuffer</name></proto> >+ <param><ptype>GLuint</ptype> <name>bindingindex</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindVertexBuffers</name></proto> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>buffers</name></param> >+ <param len="count">const <ptype>GLintptr</ptype> *<name>offsets</name></param> >+ <param len="count">const <ptype>GLsizei</ptype> *<name>strides</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindVertexShaderEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindVideoCaptureStreamBufferNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_capture_slot</name></param> >+ <param><ptype>GLuint</ptype> <name>stream</name></param> >+ <param><ptype>GLenum</ptype> <name>frame_region</name></param> >+ <param group="BufferOffsetARB"><ptype>GLintptrARB</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindVideoCaptureStreamTextureNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_capture_slot</name></param> >+ <param><ptype>GLuint</ptype> <name>stream</name></param> >+ <param><ptype>GLenum</ptype> <name>frame_region</name></param> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBinormal3bEXT</name></proto> >+ <param><ptype>GLbyte</ptype> <name>bx</name></param> >+ <param><ptype>GLbyte</ptype> <name>by</name></param> >+ <param><ptype>GLbyte</ptype> <name>bz</name></param> >+ <vecequiv name="glBinormal3bvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glBinormal3bvEXT</name></proto> >+ <param len="3">const <ptype>GLbyte</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBinormal3dEXT</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>bx</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>by</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>bz</name></param> >+ <vecequiv name="glBinormal3dvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glBinormal3dvEXT</name></proto> >+ <param group="CoordD" len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBinormal3fEXT</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>bx</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>by</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>bz</name></param> >+ <vecequiv name="glBinormal3fvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glBinormal3fvEXT</name></proto> >+ <param group="CoordF" len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBinormal3iEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>bx</name></param> >+ <param><ptype>GLint</ptype> <name>by</name></param> >+ <param><ptype>GLint</ptype> <name>bz</name></param> >+ <vecequiv name="glBinormal3ivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glBinormal3ivEXT</name></proto> >+ <param len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBinormal3sEXT</name></proto> >+ <param><ptype>GLshort</ptype> <name>bx</name></param> >+ <param><ptype>GLshort</ptype> <name>by</name></param> >+ <param><ptype>GLshort</ptype> <name>bz</name></param> >+ <vecequiv name="glBinormal3svEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glBinormal3svEXT</name></proto> >+ <param len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBinormalPointerEXT</name></proto> >+ <param group="BinormalPointerTypeEXT"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBitmap</name></proto> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>xorig</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>yorig</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>xmove</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>ymove</name></param> >+ <param len="COMPSIZE(width,height)">const <ptype>GLubyte</ptype> *<name>bitmap</name></param> >+ <glx type="render" opcode="5"/> >+ <glx type="render" opcode="311" name="glBitmapPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glBitmapxOES</name></proto> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLfixed</ptype> <name>xorig</name></param> >+ <param><ptype>GLfixed</ptype> <name>yorig</name></param> >+ <param><ptype>GLfixed</ptype> <name>xmove</name></param> >+ <param><ptype>GLfixed</ptype> <name>ymove</name></param> >+ <param len="COMPSIZE(width,height)">const <ptype>GLubyte</ptype> *<name>bitmap</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBlendBarrier</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glBlendBarrierKHR</name></proto> >+ <alias name="glBlendBarrier"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendBarrierNV</name></proto> >+ <alias name="glBlendBarrier"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendColor</name></proto> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>red</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>green</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>blue</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>alpha</name></param> >+ <glx type="render" opcode="4096"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendColorEXT</name></proto> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>red</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>green</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>blue</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>alpha</name></param> >+ <alias name="glBlendColor"/> >+ <glx type="render" opcode="4096"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendColorxOES</name></proto> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>red</name></param> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>green</name></param> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>blue</name></param> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>alpha</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquation</name></proto> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>mode</name></param> >+ <glx type="render" opcode="4097"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationEXT</name></proto> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>mode</name></param> >+ <alias name="glBlendEquation"/> >+ <glx type="render" opcode="4097"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationIndexedAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>mode</name></param> >+ <alias name="glBlendEquationi"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationOES</name></proto> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationSeparate</name></proto> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeRGB</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeAlpha</name></param> >+ <glx type="render" opcode="4228"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationSeparateEXT</name></proto> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeRGB</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeAlpha</name></param> >+ <alias name="glBlendEquationSeparate"/> >+ <glx type="render" opcode="4228"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationSeparateIndexedAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeRGB</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeAlpha</name></param> >+ <alias name="glBlendEquationSeparatei"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationSeparateOES</name></proto> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeRGB</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeAlpha</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationSeparatei</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeRGB</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeAlpha</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationSeparateiARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeRGB</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeAlpha</name></param> >+ <alias name="glBlendEquationSeparatei"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationSeparateiEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeRGB</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeAlpha</name></param> >+ <alias name="glBlendEquationSeparatei"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationSeparateiOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeRGB</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>modeAlpha</name></param> >+ <alias name="glBlendEquationSeparatei"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationi</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationiARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>mode</name></param> >+ <alias name="glBlendEquationi"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationiEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>mode</name></param> >+ <alias name="glBlendEquationi"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendEquationiOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendEquationModeEXT"><ptype>GLenum</ptype> <name>mode</name></param> >+ <alias name="glBlendEquationi"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendFunc</name></proto> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>sfactor</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dfactor</name></param> >+ <glx type="render" opcode="160"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendFuncIndexedAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param><ptype>GLenum</ptype> <name>src</name></param> >+ <param><ptype>GLenum</ptype> <name>dst</name></param> >+ <alias name="glBlendFunci"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendFuncSeparate</name></proto> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>sfactorRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dfactorRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>sfactorAlpha</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dfactorAlpha</name></param> >+ <glx type="render" opcode="4134"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendFuncSeparateEXT</name></proto> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>sfactorRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dfactorRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>sfactorAlpha</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dfactorAlpha</name></param> >+ <alias name="glBlendFuncSeparate"/> >+ <glx type="render" opcode="4134"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendFuncSeparateINGR</name></proto> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>sfactorRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dfactorRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>sfactorAlpha</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dfactorAlpha</name></param> >+ <alias name="glBlendFuncSeparate"/> >+ <glx type="render" opcode="4134"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendFuncSeparateIndexedAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>srcRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dstRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>srcAlpha</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dstAlpha</name></param> >+ <alias name="glBlendFuncSeparatei"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendFuncSeparateOES</name></proto> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>srcRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dstRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>srcAlpha</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dstAlpha</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBlendFuncSeparatei</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>srcRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dstRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>srcAlpha</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dstAlpha</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBlendFuncSeparateiARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>srcRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dstRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>srcAlpha</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dstAlpha</name></param> >+ <alias name="glBlendFuncSeparatei"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendFuncSeparateiEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>srcRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dstRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>srcAlpha</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dstAlpha</name></param> >+ <alias name="glBlendFuncSeparatei"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendFuncSeparateiOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>srcRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dstRGB</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>srcAlpha</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dstAlpha</name></param> >+ <alias name="glBlendFuncSeparatei"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendFunci</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>src</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dst</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBlendFunciARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>src</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dst</name></param> >+ <alias name="glBlendFunci"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendFunciEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>src</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dst</name></param> >+ <alias name="glBlendFunci"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendFunciOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>buf</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>src</name></param> >+ <param group="BlendingFactor"><ptype>GLenum</ptype> <name>dst</name></param> >+ <alias name="glBlendFunci"/> >+ </command> >+ <command> >+ <proto>void <name>glBlendParameteriNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBlitFramebuffer</name></proto> >+ <param><ptype>GLint</ptype> <name>srcX0</name></param> >+ <param><ptype>GLint</ptype> <name>srcY0</name></param> >+ <param><ptype>GLint</ptype> <name>srcX1</name></param> >+ <param><ptype>GLint</ptype> <name>srcY1</name></param> >+ <param><ptype>GLint</ptype> <name>dstX0</name></param> >+ <param><ptype>GLint</ptype> <name>dstY0</name></param> >+ <param><ptype>GLint</ptype> <name>dstX1</name></param> >+ <param><ptype>GLint</ptype> <name>dstY1</name></param> >+ <param group="ClearBufferMask"><ptype>GLbitfield</ptype> <name>mask</name></param> >+ <param group="BlitFramebufferFilter"><ptype>GLenum</ptype> <name>filter</name></param> >+ <glx type="render" opcode="4330"/> >+ </command> >+ <command> >+ <proto>void <name>glBlitFramebufferANGLE</name></proto> >+ <param><ptype>GLint</ptype> <name>srcX0</name></param> >+ <param><ptype>GLint</ptype> <name>srcY0</name></param> >+ <param><ptype>GLint</ptype> <name>srcX1</name></param> >+ <param><ptype>GLint</ptype> <name>srcY1</name></param> >+ <param><ptype>GLint</ptype> <name>dstX0</name></param> >+ <param><ptype>GLint</ptype> <name>dstY0</name></param> >+ <param><ptype>GLint</ptype> <name>dstX1</name></param> >+ <param><ptype>GLint</ptype> <name>dstY1</name></param> >+ <param group="ClearBufferMask"><ptype>GLbitfield</ptype> <name>mask</name></param> >+ <param group="BlitFramebufferFilter"><ptype>GLenum</ptype> <name>filter</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBlitFramebufferEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>srcX0</name></param> >+ <param><ptype>GLint</ptype> <name>srcY0</name></param> >+ <param><ptype>GLint</ptype> <name>srcX1</name></param> >+ <param><ptype>GLint</ptype> <name>srcY1</name></param> >+ <param><ptype>GLint</ptype> <name>dstX0</name></param> >+ <param><ptype>GLint</ptype> <name>dstY0</name></param> >+ <param><ptype>GLint</ptype> <name>dstX1</name></param> >+ <param><ptype>GLint</ptype> <name>dstY1</name></param> >+ <param group="ClearBufferMask"><ptype>GLbitfield</ptype> <name>mask</name></param> >+ <param group="BlitFramebufferFilter"><ptype>GLenum</ptype> <name>filter</name></param> >+ <alias name="glBlitFramebuffer"/> >+ <glx type="render" opcode="4330"/> >+ </command> >+ <command> >+ <proto>void <name>glBlitFramebufferNV</name></proto> >+ <param><ptype>GLint</ptype> <name>srcX0</name></param> >+ <param><ptype>GLint</ptype> <name>srcY0</name></param> >+ <param><ptype>GLint</ptype> <name>srcX1</name></param> >+ <param><ptype>GLint</ptype> <name>srcY1</name></param> >+ <param><ptype>GLint</ptype> <name>dstX0</name></param> >+ <param><ptype>GLint</ptype> <name>dstY0</name></param> >+ <param><ptype>GLint</ptype> <name>dstX1</name></param> >+ <param><ptype>GLint</ptype> <name>dstY1</name></param> >+ <param group="ClearBufferMask"><ptype>GLbitfield</ptype> <name>mask</name></param> >+ <param group="BlitFramebufferFilter"><ptype>GLenum</ptype> <name>filter</name></param> >+ <alias name="glBlitFramebuffer"/> >+ </command> >+ <command> >+ <proto>void <name>glBlitNamedFramebuffer</name></proto> >+ <param><ptype>GLuint</ptype> <name>readFramebuffer</name></param> >+ <param><ptype>GLuint</ptype> <name>drawFramebuffer</name></param> >+ <param><ptype>GLint</ptype> <name>srcX0</name></param> >+ <param><ptype>GLint</ptype> <name>srcY0</name></param> >+ <param><ptype>GLint</ptype> <name>srcX1</name></param> >+ <param><ptype>GLint</ptype> <name>srcY1</name></param> >+ <param><ptype>GLint</ptype> <name>dstX0</name></param> >+ <param><ptype>GLint</ptype> <name>dstY0</name></param> >+ <param><ptype>GLint</ptype> <name>dstX1</name></param> >+ <param><ptype>GLint</ptype> <name>dstY1</name></param> >+ <param group="ClearBufferMask"><ptype>GLbitfield</ptype> <name>mask</name></param> >+ <param group="BlitFramebufferFilter"><ptype>GLenum</ptype> <name>filter</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBufferAddressRangeNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>address</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>length</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBufferData</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param len="size">const void *<name>data</name></param> >+ <param group="BufferUsageARB"><ptype>GLenum</ptype> <name>usage</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBufferDataARB</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferSizeARB"><ptype>GLsizeiptrARB</ptype> <name>size</name></param> >+ <param len="size">const void *<name>data</name></param> >+ <param group="BufferUsageARB"><ptype>GLenum</ptype> <name>usage</name></param> >+ <alias name="glBufferData"/> >+ </command> >+ <command> >+ <proto>void <name>glBufferPageCommitmentARB</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param><ptype>GLboolean</ptype> <name>commit</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBufferParameteriAPPLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBufferStorage</name></proto> >+ <param group="BufferStorageTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param len="size">const void *<name>data</name></param> >+ <param group="MapBufferUsageMask"><ptype>GLbitfield</ptype> <name>flags</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBufferStorageEXT</name></proto> >+ <param group="BufferStorageTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param len="size">const void *<name>data</name></param> >+ <param group="MapBufferUsageMask"><ptype>GLbitfield</ptype> <name>flags</name></param> >+ <alias name="glBufferStorage"/> >+ </command> >+ <command> >+ <proto>void <name>glBufferStorageExternalEXT</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param><ptype>GLeglClientBufferEXT</ptype> <name>clientBuffer</name></param> >+ <param group="MapBufferUsageMask"><ptype>GLbitfield</ptype> <name>flags</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBufferStorageMemEXT</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBufferSubData</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param len="size">const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBufferSubDataARB</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferOffsetARB"><ptype>GLintptrARB</ptype> <name>offset</name></param> >+ <param group="BufferSizeARB"><ptype>GLsizeiptrARB</ptype> <name>size</name></param> >+ <param len="size">const void *<name>data</name></param> >+ <alias name="glBufferSubData"/> >+ </command> >+ <command> >+ <proto>void <name>glCallCommandListNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>list</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCallList</name></proto> >+ <param group="List"><ptype>GLuint</ptype> <name>list</name></param> >+ <glx type="render" opcode="1"/> >+ </command> >+ <command> >+ <proto>void <name>glCallLists</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="ListNameType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(n,type)">const void *<name>lists</name></param> >+ <glx type="render" opcode="2"/> >+ </command> >+ <command> >+ <proto group="FramebufferStatus"><ptype>GLenum</ptype> <name>glCheckFramebufferStatus</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <glx type="vendor" opcode="1427"/> >+ </command> >+ <command> >+ <proto group="FramebufferStatus"><ptype>GLenum</ptype> <name>glCheckFramebufferStatusEXT</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <alias name="glCheckFramebufferStatus"/> >+ <glx type="vendor" opcode="1427"/> >+ </command> >+ <command> >+ <proto group="FramebufferStatus"><ptype>GLenum</ptype> <name>glCheckFramebufferStatusOES</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto group="FramebufferStatus"><ptype>GLenum</ptype> <name>glCheckNamedFramebufferStatus</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto group="FramebufferStatus"><ptype>GLenum</ptype> <name>glCheckNamedFramebufferStatusEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClampColor</name></proto> >+ <param group="ClampColorTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ClampColorModeARB"><ptype>GLenum</ptype> <name>clamp</name></param> >+ <glx type="render" opcode="234"/> >+ </command> >+ <command> >+ <proto>void <name>glClampColorARB</name></proto> >+ <param group="ClampColorTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ClampColorModeARB"><ptype>GLenum</ptype> <name>clamp</name></param> >+ <alias name="glClampColor"/> >+ <glx type="render" opcode="234"/> >+ </command> >+ <command> >+ <proto>void <name>glClear</name></proto> >+ <param group="ClearBufferMask"><ptype>GLbitfield</ptype> <name>mask</name></param> >+ <glx type="render" opcode="127"/> >+ </command> >+ <command> >+ <proto>void <name>glClearAccum</name></proto> >+ <param><ptype>GLfloat</ptype> <name>red</name></param> >+ <param><ptype>GLfloat</ptype> <name>green</name></param> >+ <param><ptype>GLfloat</ptype> <name>blue</name></param> >+ <param><ptype>GLfloat</ptype> <name>alpha</name></param> >+ <glx type="render" opcode="128"/> >+ </command> >+ <command> >+ <proto>void <name>glClearAccumxOES</name></proto> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>red</name></param> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>green</name></param> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>blue</name></param> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>alpha</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearBufferData</name></proto> >+ <param group="BufferStorageTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type)">const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearBufferSubData</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type)">const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearBufferfi</name></proto> >+ <param group="Buffer"><ptype>GLenum</ptype> <name>buffer</name></param> >+ <param group="DrawBufferName"><ptype>GLint</ptype> <name>drawbuffer</name></param> >+ <param><ptype>GLfloat</ptype> <name>depth</name></param> >+ <param><ptype>GLint</ptype> <name>stencil</name></param> >+ <glx type="render" opcode="360"/> >+ </command> >+ <command> >+ <proto>void <name>glClearBufferfv</name></proto> >+ <param group="Buffer"><ptype>GLenum</ptype> <name>buffer</name></param> >+ <param group="DrawBufferName"><ptype>GLint</ptype> <name>drawbuffer</name></param> >+ <param len="COMPSIZE(buffer)">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <glx type="render" opcode="361"/> >+ </command> >+ <command> >+ <proto>void <name>glClearBufferiv</name></proto> >+ <param group="Buffer"><ptype>GLenum</ptype> <name>buffer</name></param> >+ <param group="DrawBufferName"><ptype>GLint</ptype> <name>drawbuffer</name></param> >+ <param len="COMPSIZE(buffer)">const <ptype>GLint</ptype> *<name>value</name></param> >+ <glx type="render" opcode="362"/> >+ </command> >+ <command> >+ <proto>void <name>glClearBufferuiv</name></proto> >+ <param group="Buffer"><ptype>GLenum</ptype> <name>buffer</name></param> >+ <param group="DrawBufferName"><ptype>GLint</ptype> <name>drawbuffer</name></param> >+ <param len="COMPSIZE(buffer)">const <ptype>GLuint</ptype> *<name>value</name></param> >+ <glx type="render" opcode="363"/> >+ </command> >+ <command> >+ <proto>void <name>glClearColor</name></proto> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>red</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>green</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>blue</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>alpha</name></param> >+ <glx type="render" opcode="130"/> >+ </command> >+ <command> >+ <proto>void <name>glClearColorIiEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>red</name></param> >+ <param><ptype>GLint</ptype> <name>green</name></param> >+ <param><ptype>GLint</ptype> <name>blue</name></param> >+ <param><ptype>GLint</ptype> <name>alpha</name></param> >+ <glx type="render" opcode="4292"/> >+ </command> >+ <command> >+ <proto>void <name>glClearColorIuiEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>red</name></param> >+ <param><ptype>GLuint</ptype> <name>green</name></param> >+ <param><ptype>GLuint</ptype> <name>blue</name></param> >+ <param><ptype>GLuint</ptype> <name>alpha</name></param> >+ <glx type="render" opcode="4293"/> >+ </command> >+ <command> >+ <proto>void <name>glClearColorx</name></proto> >+ <param><ptype>GLfixed</ptype> <name>red</name></param> >+ <param><ptype>GLfixed</ptype> <name>green</name></param> >+ <param><ptype>GLfixed</ptype> <name>blue</name></param> >+ <param><ptype>GLfixed</ptype> <name>alpha</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearColorxOES</name></proto> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>red</name></param> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>green</name></param> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>blue</name></param> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>alpha</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearDepth</name></proto> >+ <param><ptype>GLdouble</ptype> <name>depth</name></param> >+ <glx type="render" opcode="132"/> >+ </command> >+ <command> >+ <proto>void <name>glClearDepthdNV</name></proto> >+ <param><ptype>GLdouble</ptype> <name>depth</name></param> >+ <glx type="render" opcode="4284"/> >+ </command> >+ <command> >+ <proto>void <name>glClearDepthf</name></proto> >+ <param><ptype>GLfloat</ptype> <name>d</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearDepthfOES</name></proto> >+ <param group="ClampedFloat32"><ptype>GLclampf</ptype> <name>depth</name></param> >+ <glx type="render" opcode="4308"/> >+ <alias name="glClearDepthf"/> >+ </command> >+ <command> >+ <proto>void <name>glClearDepthx</name></proto> >+ <param><ptype>GLfixed</ptype> <name>depth</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearDepthxOES</name></proto> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>depth</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearIndex</name></proto> >+ <param group="MaskedColorIndexValueF"><ptype>GLfloat</ptype> <name>c</name></param> >+ <glx type="render" opcode="129"/> >+ </command> >+ <command> >+ <proto>void <name>glClearNamedBufferData</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param>const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearNamedBufferDataEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type)">const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearNamedBufferSubData</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param>const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearNamedBufferSubDataEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type)">const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearNamedFramebufferfi</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="Buffer"><ptype>GLenum</ptype> <name>buffer</name></param> >+ <param><ptype>GLint</ptype> <name>drawbuffer</name></param> >+ <param><ptype>GLfloat</ptype> <name>depth</name></param> >+ <param><ptype>GLint</ptype> <name>stencil</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearNamedFramebufferfv</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="Buffer"><ptype>GLenum</ptype> <name>buffer</name></param> >+ <param><ptype>GLint</ptype> <name>drawbuffer</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearNamedFramebufferiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="Buffer"><ptype>GLenum</ptype> <name>buffer</name></param> >+ <param><ptype>GLint</ptype> <name>drawbuffer</name></param> >+ <param>const <ptype>GLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearNamedFramebufferuiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="Buffer"><ptype>GLenum</ptype> <name>buffer</name></param> >+ <param><ptype>GLint</ptype> <name>drawbuffer</name></param> >+ <param>const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearPixelLocalStorageuiEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>offset</name></param> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearStencil</name></proto> >+ <param group="StencilValue"><ptype>GLint</ptype> <name>s</name></param> >+ <glx type="render" opcode="131"/> >+ </command> >+ <command> >+ <proto>void <name>glClearTexImage</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type)">const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearTexImageEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type)">const void *<name>data</name></param> >+ <alias name="glClearTexImage"/> >+ </command> >+ <command> >+ <proto>void <name>glClearTexSubImage</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type)">const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClearTexSubImageEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type)">const void *<name>data</name></param> >+ <alias name="glClearTexSubImage"/> >+ </command> >+ <command> >+ <proto>void <name>glClientActiveTexture</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClientActiveTextureARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <alias name="glClientActiveTexture"/> >+ </command> >+ <command> >+ <proto>void <name>glClientActiveVertexStreamATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClientAttribDefaultEXT</name></proto> >+ <param group="ClientAttribMask"><ptype>GLbitfield</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto group="SyncStatus"><ptype>GLenum</ptype> <name>glClientWaitSync</name></proto> >+ <param group="sync"><ptype>GLsync</ptype> <name>sync</name></param> >+ <param group="SyncObjectMask"><ptype>GLbitfield</ptype> <name>flags</name></param> >+ <param><ptype>GLuint64</ptype> <name>timeout</name></param> >+ </command> >+ <command> >+ <proto group="SyncStatus"><ptype>GLenum</ptype> <name>glClientWaitSyncAPPLE</name></proto> >+ <param><ptype>GLsync</ptype> <name>sync</name></param> >+ <param group="SyncObjectMask"><ptype>GLbitfield</ptype> <name>flags</name></param> >+ <param><ptype>GLuint64</ptype> <name>timeout</name></param> >+ <alias name="glClientWaitSync"/> >+ </command> >+ <command> >+ <proto>void <name>glClipControl</name></proto> >+ <param group="ClipControlOrigin"><ptype>GLenum</ptype> <name>origin</name></param> >+ <param group="ClipControlDepth"><ptype>GLenum</ptype> <name>depth</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClipControlEXT</name></proto> >+ <param><ptype>GLenum</ptype> <name>origin</name></param> >+ <param><ptype>GLenum</ptype> <name>depth</name></param> >+ <alias name="glClipControl"/> >+ </command> >+ <command> >+ <proto>void <name>glClipPlane</name></proto> >+ <param group="ClipPlaneName"><ptype>GLenum</ptype> <name>plane</name></param> >+ <param len="4">const <ptype>GLdouble</ptype> *<name>equation</name></param> >+ <glx type="render" opcode="77"/> >+ </command> >+ <command> >+ <proto>void <name>glClipPlanef</name></proto> >+ <param group="ClipPlaneName"><ptype>GLenum</ptype> <name>p</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>eqn</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClipPlanefIMG</name></proto> >+ <param group="ClipPlaneName"><ptype>GLenum</ptype> <name>p</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>eqn</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClipPlanefOES</name></proto> >+ <param group="ClipPlaneName"><ptype>GLenum</ptype> <name>plane</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>equation</name></param> >+ <glx type="render" opcode="4312"/> >+ </command> >+ <command> >+ <proto>void <name>glClipPlanex</name></proto> >+ <param group="ClipPlaneName"><ptype>GLenum</ptype> <name>plane</name></param> >+ <param len="4">const <ptype>GLfixed</ptype> *<name>equation</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClipPlanexIMG</name></proto> >+ <param group="ClipPlaneName"><ptype>GLenum</ptype> <name>p</name></param> >+ <param len="4">const <ptype>GLfixed</ptype> *<name>eqn</name></param> >+ </command> >+ <command> >+ <proto>void <name>glClipPlanexOES</name></proto> >+ <param group="ClipPlaneName"><ptype>GLenum</ptype> <name>plane</name></param> >+ <param len="4">const <ptype>GLfixed</ptype> *<name>equation</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColor3b</name></proto> >+ <param group="ColorB"><ptype>GLbyte</ptype> <name>red</name></param> >+ <param group="ColorB"><ptype>GLbyte</ptype> <name>green</name></param> >+ <param group="ColorB"><ptype>GLbyte</ptype> <name>blue</name></param> >+ <vecequiv name="glColor3bv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3bv</name></proto> >+ <param group="ColorB" len="3">const <ptype>GLbyte</ptype> *<name>v</name></param> >+ <glx type="render" opcode="6"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3d</name></proto> >+ <param group="ColorD"><ptype>GLdouble</ptype> <name>red</name></param> >+ <param group="ColorD"><ptype>GLdouble</ptype> <name>green</name></param> >+ <param group="ColorD"><ptype>GLdouble</ptype> <name>blue</name></param> >+ <vecequiv name="glColor3dv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3dv</name></proto> >+ <param group="ColorD" len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="7"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3f</name></proto> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>red</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>green</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>blue</name></param> >+ <vecequiv name="glColor3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3fVertex3fSUN</name></proto> >+ <param><ptype>GLfloat</ptype> <name>r</name></param> >+ <param><ptype>GLfloat</ptype> <name>g</name></param> >+ <param><ptype>GLfloat</ptype> <name>b</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColor3fVertex3fvSUN</name></proto> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>c</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColor3fv</name></proto> >+ <param group="ColorF" len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="8"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3hNV</name></proto> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>red</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>green</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>blue</name></param> >+ <vecequiv name="glColor3hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3hvNV</name></proto> >+ <param group="Half16NV" len="3">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4244"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3i</name></proto> >+ <param group="ColorI"><ptype>GLint</ptype> <name>red</name></param> >+ <param group="ColorI"><ptype>GLint</ptype> <name>green</name></param> >+ <param group="ColorI"><ptype>GLint</ptype> <name>blue</name></param> >+ <vecequiv name="glColor3iv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3iv</name></proto> >+ <param group="ColorI" len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="9"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3s</name></proto> >+ <param group="ColorS"><ptype>GLshort</ptype> <name>red</name></param> >+ <param group="ColorS"><ptype>GLshort</ptype> <name>green</name></param> >+ <param group="ColorS"><ptype>GLshort</ptype> <name>blue</name></param> >+ <vecequiv name="glColor3sv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3sv</name></proto> >+ <param group="ColorS" len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="10"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3ub</name></proto> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>red</name></param> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>green</name></param> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>blue</name></param> >+ <vecequiv name="glColor3ubv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3ubv</name></proto> >+ <param group="ColorUB" len="3">const <ptype>GLubyte</ptype> *<name>v</name></param> >+ <glx type="render" opcode="11"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3ui</name></proto> >+ <param group="ColorUI"><ptype>GLuint</ptype> <name>red</name></param> >+ <param group="ColorUI"><ptype>GLuint</ptype> <name>green</name></param> >+ <param group="ColorUI"><ptype>GLuint</ptype> <name>blue</name></param> >+ <vecequiv name="glColor3uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3uiv</name></proto> >+ <param group="ColorUI" len="3">const <ptype>GLuint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="12"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3us</name></proto> >+ <param group="ColorUS"><ptype>GLushort</ptype> <name>red</name></param> >+ <param group="ColorUS"><ptype>GLushort</ptype> <name>green</name></param> >+ <param group="ColorUS"><ptype>GLushort</ptype> <name>blue</name></param> >+ <vecequiv name="glColor3usv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3usv</name></proto> >+ <param group="ColorUS" len="3">const <ptype>GLushort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="13"/> >+ </command> >+ <command> >+ <proto>void <name>glColor3xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>red</name></param> >+ <param><ptype>GLfixed</ptype> <name>green</name></param> >+ <param><ptype>GLfixed</ptype> <name>blue</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColor3xvOES</name></proto> >+ <param len="3">const <ptype>GLfixed</ptype> *<name>components</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColor4b</name></proto> >+ <param group="ColorB"><ptype>GLbyte</ptype> <name>red</name></param> >+ <param group="ColorB"><ptype>GLbyte</ptype> <name>green</name></param> >+ <param group="ColorB"><ptype>GLbyte</ptype> <name>blue</name></param> >+ <param group="ColorB"><ptype>GLbyte</ptype> <name>alpha</name></param> >+ <vecequiv name="glColor4bv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4bv</name></proto> >+ <param group="ColorB" len="4">const <ptype>GLbyte</ptype> *<name>v</name></param> >+ <glx type="render" opcode="14"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4d</name></proto> >+ <param group="ColorD"><ptype>GLdouble</ptype> <name>red</name></param> >+ <param group="ColorD"><ptype>GLdouble</ptype> <name>green</name></param> >+ <param group="ColorD"><ptype>GLdouble</ptype> <name>blue</name></param> >+ <param group="ColorD"><ptype>GLdouble</ptype> <name>alpha</name></param> >+ <vecequiv name="glColor4dv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4dv</name></proto> >+ <param group="ColorD" len="4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="15"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4f</name></proto> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>red</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>green</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>blue</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>alpha</name></param> >+ <vecequiv name="glColor4fv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4fNormal3fVertex3fSUN</name></proto> >+ <param><ptype>GLfloat</ptype> <name>r</name></param> >+ <param><ptype>GLfloat</ptype> <name>g</name></param> >+ <param><ptype>GLfloat</ptype> <name>b</name></param> >+ <param><ptype>GLfloat</ptype> <name>a</name></param> >+ <param><ptype>GLfloat</ptype> <name>nx</name></param> >+ <param><ptype>GLfloat</ptype> <name>ny</name></param> >+ <param><ptype>GLfloat</ptype> <name>nz</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColor4fNormal3fVertex3fvSUN</name></proto> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>c</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>n</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColor4fv</name></proto> >+ <param group="ColorF" len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="16"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4hNV</name></proto> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>red</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>green</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>blue</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>alpha</name></param> >+ <vecequiv name="glColor4hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4hvNV</name></proto> >+ <param group="Half16NV" len="4">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4245"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4i</name></proto> >+ <param group="ColorI"><ptype>GLint</ptype> <name>red</name></param> >+ <param group="ColorI"><ptype>GLint</ptype> <name>green</name></param> >+ <param group="ColorI"><ptype>GLint</ptype> <name>blue</name></param> >+ <param group="ColorI"><ptype>GLint</ptype> <name>alpha</name></param> >+ <vecequiv name="glColor4iv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4iv</name></proto> >+ <param group="ColorI" len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="17"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4s</name></proto> >+ <param group="ColorS"><ptype>GLshort</ptype> <name>red</name></param> >+ <param group="ColorS"><ptype>GLshort</ptype> <name>green</name></param> >+ <param group="ColorS"><ptype>GLshort</ptype> <name>blue</name></param> >+ <param group="ColorS"><ptype>GLshort</ptype> <name>alpha</name></param> >+ <vecequiv name="glColor4sv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4sv</name></proto> >+ <param group="ColorS" len="4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="18"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4ub</name></proto> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>red</name></param> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>green</name></param> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>blue</name></param> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>alpha</name></param> >+ <vecequiv name="glColor4ubv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4ubVertex2fSUN</name></proto> >+ <param><ptype>GLubyte</ptype> <name>r</name></param> >+ <param><ptype>GLubyte</ptype> <name>g</name></param> >+ <param><ptype>GLubyte</ptype> <name>b</name></param> >+ <param><ptype>GLubyte</ptype> <name>a</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColor4ubVertex2fvSUN</name></proto> >+ <param len="4">const <ptype>GLubyte</ptype> *<name>c</name></param> >+ <param len="2">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColor4ubVertex3fSUN</name></proto> >+ <param><ptype>GLubyte</ptype> <name>r</name></param> >+ <param><ptype>GLubyte</ptype> <name>g</name></param> >+ <param><ptype>GLubyte</ptype> <name>b</name></param> >+ <param><ptype>GLubyte</ptype> <name>a</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColor4ubVertex3fvSUN</name></proto> >+ <param len="4">const <ptype>GLubyte</ptype> *<name>c</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColor4ubv</name></proto> >+ <param group="ColorUB" len="4">const <ptype>GLubyte</ptype> *<name>v</name></param> >+ <glx type="render" opcode="19"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4ui</name></proto> >+ <param group="ColorUI"><ptype>GLuint</ptype> <name>red</name></param> >+ <param group="ColorUI"><ptype>GLuint</ptype> <name>green</name></param> >+ <param group="ColorUI"><ptype>GLuint</ptype> <name>blue</name></param> >+ <param group="ColorUI"><ptype>GLuint</ptype> <name>alpha</name></param> >+ <vecequiv name="glColor4uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4uiv</name></proto> >+ <param group="ColorUI" len="4">const <ptype>GLuint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="20"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4us</name></proto> >+ <param group="ColorUS"><ptype>GLushort</ptype> <name>red</name></param> >+ <param group="ColorUS"><ptype>GLushort</ptype> <name>green</name></param> >+ <param group="ColorUS"><ptype>GLushort</ptype> <name>blue</name></param> >+ <param group="ColorUS"><ptype>GLushort</ptype> <name>alpha</name></param> >+ <vecequiv name="glColor4usv"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4usv</name></proto> >+ <param group="ColorUS" len="4">const <ptype>GLushort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="21"/> >+ </command> >+ <command> >+ <proto>void <name>glColor4x</name></proto> >+ <param><ptype>GLfixed</ptype> <name>red</name></param> >+ <param><ptype>GLfixed</ptype> <name>green</name></param> >+ <param><ptype>GLfixed</ptype> <name>blue</name></param> >+ <param><ptype>GLfixed</ptype> <name>alpha</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColor4xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>red</name></param> >+ <param><ptype>GLfixed</ptype> <name>green</name></param> >+ <param><ptype>GLfixed</ptype> <name>blue</name></param> >+ <param><ptype>GLfixed</ptype> <name>alpha</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColor4xvOES</name></proto> >+ <param len="4">const <ptype>GLfixed</ptype> *<name>components</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColorFormatNV</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColorFragmentOp1ATI</name></proto> >+ <param group="FragmentOpATI"><ptype>GLenum</ptype> <name>op</name></param> >+ <param><ptype>GLuint</ptype> <name>dst</name></param> >+ <param><ptype>GLuint</ptype> <name>dstMask</name></param> >+ <param><ptype>GLuint</ptype> <name>dstMod</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1Rep</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1Mod</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColorFragmentOp2ATI</name></proto> >+ <param group="FragmentOpATI"><ptype>GLenum</ptype> <name>op</name></param> >+ <param><ptype>GLuint</ptype> <name>dst</name></param> >+ <param><ptype>GLuint</ptype> <name>dstMask</name></param> >+ <param><ptype>GLuint</ptype> <name>dstMod</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1Rep</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1Mod</name></param> >+ <param><ptype>GLuint</ptype> <name>arg2</name></param> >+ <param><ptype>GLuint</ptype> <name>arg2Rep</name></param> >+ <param><ptype>GLuint</ptype> <name>arg2Mod</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColorFragmentOp3ATI</name></proto> >+ <param group="FragmentOpATI"><ptype>GLenum</ptype> <name>op</name></param> >+ <param><ptype>GLuint</ptype> <name>dst</name></param> >+ <param><ptype>GLuint</ptype> <name>dstMask</name></param> >+ <param><ptype>GLuint</ptype> <name>dstMod</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1Rep</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1Mod</name></param> >+ <param><ptype>GLuint</ptype> <name>arg2</name></param> >+ <param><ptype>GLuint</ptype> <name>arg2Rep</name></param> >+ <param><ptype>GLuint</ptype> <name>arg2Mod</name></param> >+ <param><ptype>GLuint</ptype> <name>arg3</name></param> >+ <param><ptype>GLuint</ptype> <name>arg3Rep</name></param> >+ <param><ptype>GLuint</ptype> <name>arg3Mod</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColorMask</name></proto> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>red</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>green</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>blue</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>alpha</name></param> >+ <glx type="render" opcode="134"/> >+ </command> >+ <command> >+ <proto>void <name>glColorMaskIndexedEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>r</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>g</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>b</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>a</name></param> >+ <alias name="glColorMaski"/> >+ <glx type="render" opcode="352"/> >+ </command> >+ <command> >+ <proto>void <name>glColorMaski</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>r</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>g</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>b</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>a</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColorMaskiEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>r</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>g</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>b</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>a</name></param> >+ <alias name="glColorMaski"/> >+ </command> >+ <command> >+ <proto>void <name>glColorMaskiOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>r</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>g</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>b</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>a</name></param> >+ <alias name="glColorMaski"/> >+ </command> >+ <command> >+ <proto>void <name>glColorMaterial</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="ColorMaterialParameter"><ptype>GLenum</ptype> <name>mode</name></param> >+ <glx type="render" opcode="78"/> >+ </command> >+ <command> >+ <proto>void <name>glColorP3ui</name></proto> >+ <param group="ColorPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>color</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColorP3uiv</name></proto> >+ <param group="ColorPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>color</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColorP4ui</name></proto> >+ <param group="ColorPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>color</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColorP4uiv</name></proto> >+ <param group="ColorPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>color</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColorPointer</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="ColorPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColorPointerEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="ColorPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="COMPSIZE(size,type,stride,count)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColorPointerListIBM</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="ColorPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLint</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void **<name>pointer</name></param> >+ <param><ptype>GLint</ptype> <name>ptrstride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColorPointervINTEL</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="4">const void **<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glColorSubTable</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>start</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,count)">const void *<name>data</name></param> >+ <glx type="render" opcode="195"/> >+ <glx type="render" opcode="312" name="glColorSubTablePBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glColorSubTableEXT</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>start</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,count)">const void *<name>data</name></param> >+ <alias name="glColorSubTable"/> >+ </command> >+ <command> >+ <proto>void <name>glColorTable</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width)">const void *<name>table</name></param> >+ <glx type="render" opcode="2053"/> >+ <glx type="render" opcode="313" name="glColorTablePBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glColorTableEXT</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width)">const void *<name>table</name></param> >+ <alias name="glColorTable"/> >+ </command> >+ <command> >+ <proto>void <name>glColorTableParameterfv</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ColorTableParameterPNameSGI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="2054"/> >+ </command> >+ <command> >+ <proto>void <name>glColorTableParameterfvSGI</name></proto> >+ <param group="ColorTableTargetSGI"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ColorTableParameterPNameSGI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <alias name="glColorTableParameterfv"/> >+ <glx type="render" opcode="2054"/> >+ </command> >+ <command> >+ <proto>void <name>glColorTableParameteriv</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ColorTableParameterPNameSGI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="2055"/> >+ </command> >+ <command> >+ <proto>void <name>glColorTableParameterivSGI</name></proto> >+ <param group="ColorTableTargetSGI"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ColorTableParameterPNameSGI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glColorTableParameteriv"/> >+ <glx type="render" opcode="2055"/> >+ </command> >+ <command> >+ <proto>void <name>glColorTableSGI</name></proto> >+ <param group="ColorTableTargetSGI"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width)">const void *<name>table</name></param> >+ <alias name="glColorTable"/> >+ <glx type="render" opcode="2053"/> >+ </command> >+ <command> >+ <proto>void <name>glCombinerInputNV</name></proto> >+ <param group="CombinerStageNV"><ptype>GLenum</ptype> <name>stage</name></param> >+ <param group="CombinerPortionNV"><ptype>GLenum</ptype> <name>portion</name></param> >+ <param group="CombinerVariableNV"><ptype>GLenum</ptype> <name>variable</name></param> >+ <param group="CombinerRegisterNV"><ptype>GLenum</ptype> <name>input</name></param> >+ <param group="CombinerMappingNV"><ptype>GLenum</ptype> <name>mapping</name></param> >+ <param group="CombinerComponentUsageNV"><ptype>GLenum</ptype> <name>componentUsage</name></param> >+ <glx type="render" opcode="4140"/> >+ </command> >+ <command> >+ <proto>void <name>glCombinerOutputNV</name></proto> >+ <param group="CombinerStageNV"><ptype>GLenum</ptype> <name>stage</name></param> >+ <param group="CombinerPortionNV"><ptype>GLenum</ptype> <name>portion</name></param> >+ <param group="CombinerRegisterNV"><ptype>GLenum</ptype> <name>abOutput</name></param> >+ <param group="CombinerRegisterNV"><ptype>GLenum</ptype> <name>cdOutput</name></param> >+ <param group="CombinerRegisterNV"><ptype>GLenum</ptype> <name>sumOutput</name></param> >+ <param group="CombinerScaleNV"><ptype>GLenum</ptype> <name>scale</name></param> >+ <param group="CombinerBiasNV"><ptype>GLenum</ptype> <name>bias</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>abDotProduct</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>cdDotProduct</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>muxSum</name></param> >+ <glx type="render" opcode="4141"/> >+ </command> >+ <command> >+ <proto>void <name>glCombinerParameterfNV</name></proto> >+ <param group="CombinerParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat</ptype> <name>param</name></param> >+ <glx type="render" opcode="4136"/> >+ </command> >+ <command> >+ <proto>void <name>glCombinerParameterfvNV</name></proto> >+ <param group="CombinerParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="4137"/> >+ </command> >+ <command> >+ <proto>void <name>glCombinerParameteriNV</name></proto> >+ <param group="CombinerParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ <glx type="render" opcode="4138"/> >+ </command> >+ <command> >+ <proto>void <name>glCombinerParameterivNV</name></proto> >+ <param group="CombinerParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="4139"/> >+ </command> >+ <command> >+ <proto>void <name>glCombinerStageParameterfvNV</name></proto> >+ <param group="CombinerStageNV"><ptype>GLenum</ptype> <name>stage</name></param> >+ <param group="CombinerParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCommandListSegmentsNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>list</name></param> >+ <param><ptype>GLuint</ptype> <name>segments</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompileCommandListNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>list</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompileShader</name></proto> >+ <param><ptype>GLuint</ptype> <name>shader</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompileShaderARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>shaderObj</name></param> >+ <alias name="glCompileShader"/> >+ </command> >+ <command> >+ <proto>void <name>glCompileShaderIncludeARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>shader</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLchar</ptype> *const*<name>path</name></param> >+ <param len="count">const <ptype>GLint</ptype> *<name>length</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedMultiTexImage1DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param len="imageSize">const void *<name>bits</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedMultiTexImage2DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param len="imageSize">const void *<name>bits</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedMultiTexImage3DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param len="imageSize">const void *<name>bits</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedMultiTexSubImage1DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param len="imageSize">const void *<name>bits</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedMultiTexSubImage2DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param len="imageSize">const void *<name>bits</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedMultiTexSubImage3DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param len="imageSize">const void *<name>bits</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexImage1D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param group="CompressedTextureARB" len="imageSize">const void *<name>data</name></param> >+ <glx type="render" opcode="214"/> >+ <glx type="render" opcode="314" name="glCompressedTexImage1DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexImage1DARB</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param group="CompressedTextureARB" len="imageSize">const void *<name>data</name></param> >+ <alias name="glCompressedTexImage1D"/> >+ <glx type="render" opcode="214"/> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexImage2D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param group="CompressedTextureARB" len="imageSize">const void *<name>data</name></param> >+ <glx type="render" opcode="215"/> >+ <glx type="render" opcode="315" name="glCompressedTexImage2DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexImage2DARB</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param group="CompressedTextureARB" len="imageSize">const void *<name>data</name></param> >+ <alias name="glCompressedTexImage2D"/> >+ <glx type="render" opcode="215"/> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexImage3D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param group="CompressedTextureARB" len="imageSize">const void *<name>data</name></param> >+ <glx type="render" opcode="216"/> >+ <glx type="render" opcode="316" name="glCompressedTexImage3DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexImage3DARB</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param group="CompressedTextureARB" len="imageSize">const void *<name>data</name></param> >+ <alias name="glCompressedTexImage3D"/> >+ <glx type="render" opcode="216"/> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexImage3DOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param len="imageSize">const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexSubImage1D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param group="CompressedTextureARB" len="imageSize">const void *<name>data</name></param> >+ <glx type="render" opcode="217"/> >+ <glx type="render" opcode="317" name="glCompressedTexSubImage1DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexSubImage1DARB</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param group="CompressedTextureARB" len="imageSize">const void *<name>data</name></param> >+ <alias name="glCompressedTexSubImage1D"/> >+ <glx type="render" opcode="217"/> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexSubImage2D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param group="CompressedTextureARB" len="imageSize">const void *<name>data</name></param> >+ <glx type="render" opcode="218"/> >+ <glx type="render" opcode="318" name="glCompressedTexSubImage2DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexSubImage2DARB</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param group="CompressedTextureARB" len="imageSize">const void *<name>data</name></param> >+ <alias name="glCompressedTexSubImage2D"/> >+ <glx type="render" opcode="218"/> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexSubImage3D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param group="CompressedTextureARB" len="imageSize">const void *<name>data</name></param> >+ <glx type="render" opcode="219"/> >+ <glx type="render" opcode="319" name="glCompressedTexSubImage3DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexSubImage3DARB</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param group="CompressedTextureARB" len="imageSize">const void *<name>data</name></param> >+ <alias name="glCompressedTexSubImage3D"/> >+ <glx type="render" opcode="219"/> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexSubImage3DOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param len="imageSize">const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTextureImage1DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param len="imageSize">const void *<name>bits</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTextureImage2DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param len="imageSize">const void *<name>bits</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTextureImage3DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param len="imageSize">const void *<name>bits</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTextureSubImage1D</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param>const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTextureSubImage1DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param len="imageSize">const void *<name>bits</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTextureSubImage2D</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param>const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTextureSubImage2DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param len="imageSize">const void *<name>bits</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTextureSubImage3D</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param>const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTextureSubImage3DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param len="imageSize">const void *<name>bits</name></param> >+ </command> >+ <command> >+ <proto>void <name>glConservativeRasterParameterfNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glConservativeRasterParameteriNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glConvolutionFilter1D</name></proto> >+ <param group="ConvolutionTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width)">const void *<name>image</name></param> >+ <glx type="render" opcode="4101"/> >+ <glx type="render" opcode="320" name="glConvolutionFilter1DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glConvolutionFilter1DEXT</name></proto> >+ <param group="ConvolutionTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width)">const void *<name>image</name></param> >+ <alias name="glConvolutionFilter1D"/> >+ <glx type="render" opcode="4101"/> >+ </command> >+ <command> >+ <proto>void <name>glConvolutionFilter2D</name></proto> >+ <param group="ConvolutionTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height)">const void *<name>image</name></param> >+ <glx type="render" opcode="4102"/> >+ <glx type="render" opcode="321" name="glConvolutionFilter2DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glConvolutionFilter2DEXT</name></proto> >+ <param group="ConvolutionTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height)">const void *<name>image</name></param> >+ <alias name="glConvolutionFilter2D"/> >+ <glx type="render" opcode="4102"/> >+ </command> >+ <command> >+ <proto>void <name>glConvolutionParameterf</name></proto> >+ <param group="ConvolutionTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ConvolutionParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>params</name></param> >+ <glx type="render" opcode="4103"/> >+ </command> >+ <command> >+ <proto>void <name>glConvolutionParameterfEXT</name></proto> >+ <param group="ConvolutionTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ConvolutionParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>params</name></param> >+ <alias name="glConvolutionParameterf"/> >+ <glx type="render" opcode="4103"/> >+ </command> >+ <command> >+ <proto>void <name>glConvolutionParameterfv</name></proto> >+ <param group="ConvolutionTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ConvolutionParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="4104"/> >+ </command> >+ <command> >+ <proto>void <name>glConvolutionParameterfvEXT</name></proto> >+ <param group="ConvolutionTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ConvolutionParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <alias name="glConvolutionParameterfv"/> >+ <glx type="render" opcode="4104"/> >+ </command> >+ <command> >+ <proto>void <name>glConvolutionParameteri</name></proto> >+ <param group="ConvolutionTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ConvolutionParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>params</name></param> >+ <glx type="render" opcode="4105"/> >+ </command> >+ <command> >+ <proto>void <name>glConvolutionParameteriEXT</name></proto> >+ <param group="ConvolutionTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ConvolutionParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>params</name></param> >+ <alias name="glConvolutionParameteri"/> >+ <glx type="render" opcode="4105"/> >+ </command> >+ <command> >+ <proto>void <name>glConvolutionParameteriv</name></proto> >+ <param group="ConvolutionTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ConvolutionParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="4106"/> >+ </command> >+ <command> >+ <proto>void <name>glConvolutionParameterivEXT</name></proto> >+ <param group="ConvolutionTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ConvolutionParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glConvolutionParameteriv"/> >+ <glx type="render" opcode="4106"/> >+ </command> >+ <command> >+ <proto>void <name>glConvolutionParameterxOES</name></proto> >+ <param group="ConvolutionTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ConvolutionParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glConvolutionParameterxvOES</name></proto> >+ <param group="ConvolutionTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ConvolutionParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyBufferSubData</name></proto> >+ <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>readTarget</name></param> >+ <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>writeTarget</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>readOffset</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>writeOffset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <glx type="single" opcode="221"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyBufferSubDataNV</name></proto> >+ <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>readTarget</name></param> >+ <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>writeTarget</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>readOffset</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>writeOffset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <alias name="glCopyBufferSubData"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyColorSubTable</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>start</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <glx type="render" opcode="196"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyColorSubTableEXT</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>start</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <alias name="glCopyColorSubTable"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyColorTable</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <glx type="render" opcode="2056"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyColorTableSGI</name></proto> >+ <param group="ColorTableTargetSGI"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <alias name="glCopyColorTable"/> >+ <glx type="render" opcode="2056"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyConvolutionFilter1D</name></proto> >+ <param group="ConvolutionTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <glx type="render" opcode="4107"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyConvolutionFilter1DEXT</name></proto> >+ <param group="ConvolutionTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <alias name="glCopyConvolutionFilter1D"/> >+ <glx type="render" opcode="4107"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyConvolutionFilter2D</name></proto> >+ <param group="ConvolutionTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <glx type="render" opcode="4108"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyConvolutionFilter2DEXT</name></proto> >+ <param group="ConvolutionTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <alias name="glCopyConvolutionFilter2D"/> >+ <glx type="render" opcode="4108"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyImageSubData</name></proto> >+ <param><ptype>GLuint</ptype> <name>srcName</name></param> >+ <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>srcTarget</name></param> >+ <param><ptype>GLint</ptype> <name>srcLevel</name></param> >+ <param><ptype>GLint</ptype> <name>srcX</name></param> >+ <param><ptype>GLint</ptype> <name>srcY</name></param> >+ <param><ptype>GLint</ptype> <name>srcZ</name></param> >+ <param><ptype>GLuint</ptype> <name>dstName</name></param> >+ <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>dstTarget</name></param> >+ <param><ptype>GLint</ptype> <name>dstLevel</name></param> >+ <param><ptype>GLint</ptype> <name>dstX</name></param> >+ <param><ptype>GLint</ptype> <name>dstY</name></param> >+ <param><ptype>GLint</ptype> <name>dstZ</name></param> >+ <param><ptype>GLsizei</ptype> <name>srcWidth</name></param> >+ <param><ptype>GLsizei</ptype> <name>srcHeight</name></param> >+ <param><ptype>GLsizei</ptype> <name>srcDepth</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyImageSubDataEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>srcName</name></param> >+ <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>srcTarget</name></param> >+ <param><ptype>GLint</ptype> <name>srcLevel</name></param> >+ <param><ptype>GLint</ptype> <name>srcX</name></param> >+ <param><ptype>GLint</ptype> <name>srcY</name></param> >+ <param><ptype>GLint</ptype> <name>srcZ</name></param> >+ <param><ptype>GLuint</ptype> <name>dstName</name></param> >+ <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>dstTarget</name></param> >+ <param><ptype>GLint</ptype> <name>dstLevel</name></param> >+ <param><ptype>GLint</ptype> <name>dstX</name></param> >+ <param><ptype>GLint</ptype> <name>dstY</name></param> >+ <param><ptype>GLint</ptype> <name>dstZ</name></param> >+ <param><ptype>GLsizei</ptype> <name>srcWidth</name></param> >+ <param><ptype>GLsizei</ptype> <name>srcHeight</name></param> >+ <param><ptype>GLsizei</ptype> <name>srcDepth</name></param> >+ <alias name="glCopyImageSubData"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyImageSubDataNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>srcName</name></param> >+ <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>srcTarget</name></param> >+ <param><ptype>GLint</ptype> <name>srcLevel</name></param> >+ <param><ptype>GLint</ptype> <name>srcX</name></param> >+ <param><ptype>GLint</ptype> <name>srcY</name></param> >+ <param><ptype>GLint</ptype> <name>srcZ</name></param> >+ <param><ptype>GLuint</ptype> <name>dstName</name></param> >+ <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>dstTarget</name></param> >+ <param><ptype>GLint</ptype> <name>dstLevel</name></param> >+ <param><ptype>GLint</ptype> <name>dstX</name></param> >+ <param><ptype>GLint</ptype> <name>dstY</name></param> >+ <param><ptype>GLint</ptype> <name>dstZ</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <glx type="render" opcode="4291"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyImageSubDataOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>srcName</name></param> >+ <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>srcTarget</name></param> >+ <param><ptype>GLint</ptype> <name>srcLevel</name></param> >+ <param><ptype>GLint</ptype> <name>srcX</name></param> >+ <param><ptype>GLint</ptype> <name>srcY</name></param> >+ <param><ptype>GLint</ptype> <name>srcZ</name></param> >+ <param><ptype>GLuint</ptype> <name>dstName</name></param> >+ <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>dstTarget</name></param> >+ <param><ptype>GLint</ptype> <name>dstLevel</name></param> >+ <param><ptype>GLint</ptype> <name>dstX</name></param> >+ <param><ptype>GLint</ptype> <name>dstY</name></param> >+ <param><ptype>GLint</ptype> <name>dstZ</name></param> >+ <param><ptype>GLsizei</ptype> <name>srcWidth</name></param> >+ <param><ptype>GLsizei</ptype> <name>srcHeight</name></param> >+ <param><ptype>GLsizei</ptype> <name>srcDepth</name></param> >+ <alias name="glCopyImageSubData"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyMultiTexImage1DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyMultiTexImage2DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyMultiTexSubImage1DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyMultiTexSubImage2DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyMultiTexSubImage3DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyNamedBufferSubData</name></proto> >+ <param><ptype>GLuint</ptype> <name>readBuffer</name></param> >+ <param><ptype>GLuint</ptype> <name>writeBuffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>readOffset</name></param> >+ <param><ptype>GLintptr</ptype> <name>writeOffset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyPathNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>resultPath</name></param> >+ <param group="Path"><ptype>GLuint</ptype> <name>srcPath</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyPixels</name></proto> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelCopyType"><ptype>GLenum</ptype> <name>type</name></param> >+ <glx type="render" opcode="172"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyTexImage1D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <glx type="render" opcode="4119"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyTexImage1DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <alias name="glCopyTexImage1D"/> >+ <glx type="render" opcode="4119"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyTexImage2D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <glx type="render" opcode="4120"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyTexImage2DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <alias name="glCopyTexImage2D"/> >+ <glx type="render" opcode="4120"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyTexSubImage1D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <glx type="render" opcode="4121"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyTexSubImage1DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <alias name="glCopyTexSubImage1D"/> >+ <glx type="render" opcode="4121"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyTexSubImage2D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <glx type="render" opcode="4122"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyTexSubImage2DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <alias name="glCopyTexSubImage2D"/> >+ <glx type="render" opcode="4122"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyTexSubImage3D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <glx type="render" opcode="4123"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyTexSubImage3DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <alias name="glCopyTexSubImage3D"/> >+ <glx type="render" opcode="4123"/> >+ </command> >+ <command> >+ <proto>void <name>glCopyTexSubImage3DOES</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyTextureImage1DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyTextureImage2DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyTextureLevelsAPPLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>destinationTexture</name></param> >+ <param><ptype>GLuint</ptype> <name>sourceTexture</name></param> >+ <param><ptype>GLint</ptype> <name>sourceBaseLevel</name></param> >+ <param><ptype>GLsizei</ptype> <name>sourceLevelCount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyTextureSubImage1D</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyTextureSubImage1DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyTextureSubImage2D</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyTextureSubImage2DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyTextureSubImage3D</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyTextureSubImage3DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCoverFillPathInstancedNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>numPaths</name></param> >+ <param group="PathElementType"><ptype>GLenum</ptype> <name>pathNameType</name></param> >+ <param group="PathElement" len="COMPSIZE(numPaths,pathNameType,paths)">const void *<name>paths</name></param> >+ <param group="Path"><ptype>GLuint</ptype> <name>pathBase</name></param> >+ <param group="PathCoverMode"><ptype>GLenum</ptype> <name>coverMode</name></param> >+ <param group="PathTransformType"><ptype>GLenum</ptype> <name>transformType</name></param> >+ <param len="COMPSIZE(numPaths,transformType)">const <ptype>GLfloat</ptype> *<name>transformValues</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCoverFillPathNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param group="PathCoverMode"><ptype>GLenum</ptype> <name>coverMode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCoverStrokePathInstancedNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>numPaths</name></param> >+ <param group="PathElementType"><ptype>GLenum</ptype> <name>pathNameType</name></param> >+ <param group="PathElement" len="COMPSIZE(numPaths,pathNameType,paths)">const void *<name>paths</name></param> >+ <param group="Path"><ptype>GLuint</ptype> <name>pathBase</name></param> >+ <param group="PathCoverMode"><ptype>GLenum</ptype> <name>coverMode</name></param> >+ <param group="PathTransformType"><ptype>GLenum</ptype> <name>transformType</name></param> >+ <param len="COMPSIZE(numPaths,transformType)">const <ptype>GLfloat</ptype> *<name>transformValues</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCoverStrokePathNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param group="PathCoverMode"><ptype>GLenum</ptype> <name>coverMode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCoverageMaskNV</name></proto> >+ <param><ptype>GLboolean</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCoverageModulationNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>components</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCoverageModulationTableNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCoverageOperationNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>operation</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCreateBuffers</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>buffers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCreateCommandListsNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>lists</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCreateFramebuffers</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>framebuffers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCreateMemoryObjectsEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param><ptype>GLuint</ptype> *<name>memoryObjects</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCreatePerfQueryINTEL</name></proto> >+ <param><ptype>GLuint</ptype> <name>queryId</name></param> >+ <param><ptype>GLuint</ptype> *<name>queryHandle</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glCreateProgram</name></proto> >+ </command> >+ <command> >+ <proto group="handleARB"><ptype>GLhandleARB</ptype> <name>glCreateProgramObjectARB</name></proto> >+ <alias name="glCreateProgram"/> >+ </command> >+ <command> >+ <proto>void <name>glCreateProgramPipelines</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>pipelines</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCreateQueries</name></proto> >+ <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>ids</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCreateRenderbuffers</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>renderbuffers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCreateSamplers</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>samplers</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glCreateShader</name></proto> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>type</name></param> >+ </command> >+ <command> >+ <proto group="handleARB"><ptype>GLhandleARB</ptype> <name>glCreateShaderObjectARB</name></proto> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>shaderType</name></param> >+ <alias name="glCreateShader"/> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glCreateShaderProgramEXT</name></proto> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>string</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glCreateShaderProgramv</name></proto> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLchar</ptype> *const*<name>strings</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glCreateShaderProgramvEXT</name></proto> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLchar</ptype> **<name>strings</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCreateStatesNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>states</name></param> >+ </command> >+ <command> >+ <proto group="sync"><ptype>GLsync</ptype> <name>glCreateSyncFromCLeventARB</name></proto> >+ <param group="cl_context"><ptype>struct _cl_context</ptype> *<name>context</name></param> >+ <param group="cl_event"><ptype>struct _cl_event</ptype> *<name>event</name></param> >+ <param><ptype>GLbitfield</ptype> <name>flags</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCreateTextures</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>textures</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCreateTransformFeedbacks</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>ids</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCreateVertexArrays</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>arrays</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCullFace</name></proto> >+ <param group="CullFaceMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <glx type="render" opcode="79"/> >+ </command> >+ <command> >+ <proto>void <name>glCullParameterdvEXT</name></proto> >+ <param group="CullParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="4"><ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCullParameterfvEXT</name></proto> >+ <param group="CullParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="4"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCurrentPaletteMatrixARB</name></proto> >+ <param><ptype>GLint</ptype> <name>index</name></param> >+ <glx type="render" opcode="4329"/> >+ </command> >+ <command> >+ <proto>void <name>glCurrentPaletteMatrixOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>matrixpaletteindex</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDebugMessageCallback</name></proto> >+ <param><ptype>GLDEBUGPROC</ptype> <name>callback</name></param> >+ <param>const void *<name>userParam</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDebugMessageCallbackAMD</name></proto> >+ <param><ptype>GLDEBUGPROCAMD</ptype> <name>callback</name></param> >+ <param>void *<name>userParam</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDebugMessageCallbackARB</name></proto> >+ <param><ptype>GLDEBUGPROCARB</ptype> <name>callback</name></param> >+ <param len="COMPSIZE(callback)">const void *<name>userParam</name></param> >+ <alias name="glDebugMessageCallback"/> >+ </command> >+ <command> >+ <proto>void <name>glDebugMessageCallbackKHR</name></proto> >+ <param><ptype>GLDEBUGPROCKHR</ptype> <name>callback</name></param> >+ <param>const void *<name>userParam</name></param> >+ <alias name="glDebugMessageCallback"/> >+ </command> >+ <command> >+ <proto>void <name>glDebugMessageControl</name></proto> >+ <param group="DebugSource"><ptype>GLenum</ptype> <name>source</name></param> >+ <param group="DebugType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="DebugSeverity"><ptype>GLenum</ptype> <name>severity</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>ids</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>enabled</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDebugMessageControlARB</name></proto> >+ <param group="DebugSource"><ptype>GLenum</ptype> <name>source</name></param> >+ <param group="DebugType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="DebugSeverity"><ptype>GLenum</ptype> <name>severity</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>ids</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>enabled</name></param> >+ <alias name="glDebugMessageControl"/> >+ </command> >+ <command> >+ <proto>void <name>glDebugMessageControlKHR</name></proto> >+ <param group="DebugSource"><ptype>GLenum</ptype> <name>source</name></param> >+ <param group="DebugType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="DebugSeverity"><ptype>GLenum</ptype> <name>severity</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param>const <ptype>GLuint</ptype> *<name>ids</name></param> >+ <param><ptype>GLboolean</ptype> <name>enabled</name></param> >+ <alias name="glDebugMessageControl"/> >+ </command> >+ <command> >+ <proto>void <name>glDebugMessageEnableAMD</name></proto> >+ <param><ptype>GLenum</ptype> <name>category</name></param> >+ <param group="DebugSeverity"><ptype>GLenum</ptype> <name>severity</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>ids</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>enabled</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDebugMessageInsert</name></proto> >+ <param group="DebugSource"><ptype>GLenum</ptype> <name>source</name></param> >+ <param group="DebugType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="DebugSeverity"><ptype>GLenum</ptype> <name>severity</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param len="COMPSIZE(buf,length)">const <ptype>GLchar</ptype> *<name>buf</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDebugMessageInsertAMD</name></proto> >+ <param><ptype>GLenum</ptype> <name>category</name></param> >+ <param group="DebugSeverity"><ptype>GLenum</ptype> <name>severity</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param len="length">const <ptype>GLchar</ptype> *<name>buf</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDebugMessageInsertARB</name></proto> >+ <param group="DebugSource"><ptype>GLenum</ptype> <name>source</name></param> >+ <param group="DebugType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="DebugSeverity"><ptype>GLenum</ptype> <name>severity</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param len="length">const <ptype>GLchar</ptype> *<name>buf</name></param> >+ <alias name="glDebugMessageInsert"/> >+ </command> >+ <command> >+ <proto>void <name>glDebugMessageInsertKHR</name></proto> >+ <param group="DebugSource"><ptype>GLenum</ptype> <name>source</name></param> >+ <param group="DebugType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="DebugSeverity"><ptype>GLenum</ptype> <name>severity</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>buf</name></param> >+ <alias name="glDebugMessageInsert"/> >+ </command> >+ <command> >+ <proto>void <name>glDeformSGIX</name></proto> >+ <param group="FfdMaskSGIX"><ptype>GLbitfield</ptype> <name>mask</name></param> >+ <glx type="render" opcode="2075"/> >+ </command> >+ <command> >+ <proto>void <name>glDeformationMap3dSGIX</name></proto> >+ <param group="FfdTargetSGIX"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u1</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u2</name></param> >+ <param><ptype>GLint</ptype> <name>ustride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>uorder</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>v1</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>v2</name></param> >+ <param><ptype>GLint</ptype> <name>vstride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>vorder</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>w1</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>w2</name></param> >+ <param><ptype>GLint</ptype> <name>wstride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>worder</name></param> >+ <param group="CoordD" len="COMPSIZE(target,ustride,uorder,vstride,vorder,wstride,worder)">const <ptype>GLdouble</ptype> *<name>points</name></param> >+ <glx type="render" opcode="2073"/> >+ </command> >+ <command> >+ <proto>void <name>glDeformationMap3fSGIX</name></proto> >+ <param group="FfdTargetSGIX"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u1</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u2</name></param> >+ <param><ptype>GLint</ptype> <name>ustride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>uorder</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>v1</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>v2</name></param> >+ <param><ptype>GLint</ptype> <name>vstride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>vorder</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>w1</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>w2</name></param> >+ <param><ptype>GLint</ptype> <name>wstride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>worder</name></param> >+ <param group="CoordF" len="COMPSIZE(target,ustride,uorder,vstride,vorder,wstride,worder)">const <ptype>GLfloat</ptype> *<name>points</name></param> >+ <glx type="render" opcode="2074"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteAsyncMarkersSGIX</name></proto> >+ <param><ptype>GLuint</ptype> <name>marker</name></param> >+ <param><ptype>GLsizei</ptype> <name>range</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteBuffers</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>buffers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteBuffersARB</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>buffers</name></param> >+ <alias name="glDeleteBuffers"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteCommandListsNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>lists</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteFencesAPPLE</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="FenceNV" len="n">const <ptype>GLuint</ptype> *<name>fences</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteFencesNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="FenceNV" len="n">const <ptype>GLuint</ptype> *<name>fences</name></param> >+ <glx type="vendor" opcode="1276"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteFragmentShaderATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteFramebuffers</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>framebuffers</name></param> >+ <glx type="render" opcode="4320"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteFramebuffersEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>framebuffers</name></param> >+ <alias name="glDeleteFramebuffers"/> >+ <glx type="render" opcode="4320"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteFramebuffersOES</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>framebuffers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteLists</name></proto> >+ <param group="List"><ptype>GLuint</ptype> <name>list</name></param> >+ <param><ptype>GLsizei</ptype> <name>range</name></param> >+ <glx type="single" opcode="103"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteMemoryObjectsEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>memoryObjects</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteNamedStringARB</name></proto> >+ <param><ptype>GLint</ptype> <name>namelen</name></param> >+ <param len="namelen">const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteNamesAMD</name></proto> >+ <param><ptype>GLenum</ptype> <name>identifier</name></param> >+ <param><ptype>GLuint</ptype> <name>num</name></param> >+ <param len="num">const <ptype>GLuint</ptype> *<name>names</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteObjectARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>obj</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteOcclusionQueriesNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>ids</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeletePathsNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLsizei</ptype> <name>range</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeletePerfMonitorsAMD</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>monitors</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeletePerfQueryINTEL</name></proto> >+ <param><ptype>GLuint</ptype> <name>queryHandle</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteProgram</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <glx type="single" opcode="202"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteProgramPipelines</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>pipelines</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteProgramPipelinesEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>pipelines</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteProgramsARB</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>programs</name></param> >+ <glx type="vendor" opcode="1294"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteProgramsNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>programs</name></param> >+ <alias name="glDeleteProgramsARB"/> >+ <glx type="vendor" opcode="1294"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteQueries</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>ids</name></param> >+ <glx type="single" opcode="161"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteQueriesARB</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>ids</name></param> >+ <alias name="glDeleteQueries"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteQueriesEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>ids</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteQueryResourceTagNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLint</ptype> *<name>tagIds</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteRenderbuffers</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>renderbuffers</name></param> >+ <glx type="render" opcode="4317"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteRenderbuffersEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>renderbuffers</name></param> >+ <alias name="glDeleteRenderbuffers"/> >+ <glx type="render" opcode="4317"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteRenderbuffersOES</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>renderbuffers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteSamplers</name></proto> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>samplers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteSemaphoresEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>semaphores</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteShader</name></proto> >+ <param><ptype>GLuint</ptype> <name>shader</name></param> >+ <glx type="single" opcode="195"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteStatesNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>states</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteSync</name></proto> >+ <param group="sync"><ptype>GLsync</ptype> <name>sync</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteSyncAPPLE</name></proto> >+ <param><ptype>GLsync</ptype> <name>sync</name></param> >+ <alias name="glDeleteSync"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteTextures</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="Texture" len="n">const <ptype>GLuint</ptype> *<name>textures</name></param> >+ <glx type="single" opcode="144"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteTexturesEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="Texture" len="n">const <ptype>GLuint</ptype> *<name>textures</name></param> >+ <glx type="vendor" opcode="12"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteTransformFeedbacks</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>ids</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeleteTransformFeedbacksNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>ids</name></param> >+ <alias name="glDeleteTransformFeedbacks"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteVertexArrays</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>arrays</name></param> >+ <glx type="render" opcode="351"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteVertexArraysAPPLE</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>arrays</name></param> >+ <alias name="glDeleteVertexArrays"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteVertexArraysOES</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>arrays</name></param> >+ <alias name="glDeleteVertexArrays"/> >+ </command> >+ <command> >+ <proto>void <name>glDeleteVertexShaderEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDepthBoundsEXT</name></proto> >+ <param group="ClampedFloat64"><ptype>GLclampd</ptype> <name>zmin</name></param> >+ <param group="ClampedFloat64"><ptype>GLclampd</ptype> <name>zmax</name></param> >+ <glx type="render" opcode="4229"/> >+ </command> >+ <command> >+ <proto>void <name>glDepthBoundsdNV</name></proto> >+ <param><ptype>GLdouble</ptype> <name>zmin</name></param> >+ <param><ptype>GLdouble</ptype> <name>zmax</name></param> >+ <glx type="render" opcode="4285"/> >+ </command> >+ <command> >+ <proto>void <name>glDepthFunc</name></proto> >+ <param group="DepthFunction"><ptype>GLenum</ptype> <name>func</name></param> >+ <glx type="render" opcode="164"/> >+ </command> >+ <command> >+ <proto>void <name>glDepthMask</name></proto> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>flag</name></param> >+ <glx type="render" opcode="135"/> >+ </command> >+ <command> >+ <proto>void <name>glDepthRange</name></proto> >+ <param><ptype>GLdouble</ptype> <name>n</name></param> >+ <param><ptype>GLdouble</ptype> <name>f</name></param> >+ <glx type="render" opcode="174"/> >+ </command> >+ <command> >+ <proto>void <name>glDepthRangeArrayfvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDepthRangeArrayfvOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDepthRangeArrayv</name></proto> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="COMPSIZE(count)">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDepthRangeIndexed</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>n</name></param> >+ <param><ptype>GLdouble</ptype> <name>f</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDepthRangeIndexedfNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>n</name></param> >+ <param><ptype>GLfloat</ptype> <name>f</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDepthRangeIndexedfOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>n</name></param> >+ <param><ptype>GLfloat</ptype> <name>f</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDepthRangedNV</name></proto> >+ <param><ptype>GLdouble</ptype> <name>zNear</name></param> >+ <param><ptype>GLdouble</ptype> <name>zFar</name></param> >+ <glx type="render" opcode="4283"/> >+ </command> >+ <command> >+ <proto>void <name>glDepthRangef</name></proto> >+ <param><ptype>GLfloat</ptype> <name>n</name></param> >+ <param><ptype>GLfloat</ptype> <name>f</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDepthRangefOES</name></proto> >+ <param group="ClampedFloat32"><ptype>GLclampf</ptype> <name>n</name></param> >+ <param group="ClampedFloat32"><ptype>GLclampf</ptype> <name>f</name></param> >+ <glx type="render" opcode="4309"/> >+ <alias name="glDepthRangef"/> >+ </command> >+ <command> >+ <proto>void <name>glDepthRangex</name></proto> >+ <param><ptype>GLfixed</ptype> <name>n</name></param> >+ <param><ptype>GLfixed</ptype> <name>f</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDepthRangexOES</name></proto> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>n</name></param> >+ <param group="ClampedFixed"><ptype>GLfixed</ptype> <name>f</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDetachObjectARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>containerObj</name></param> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>attachedObj</name></param> >+ <alias name="glDetachShader"/> >+ </command> >+ <command> >+ <proto>void <name>glDetachShader</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>shader</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDetailTexFuncSGIS</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n*2">const <ptype>GLfloat</ptype> *<name>points</name></param> >+ <glx type="render" opcode="2051"/> >+ </command> >+ <command> >+ <proto>void <name>glDisable</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>cap</name></param> >+ <glx type="render" opcode="138"/> >+ </command> >+ <command> >+ <proto>void <name>glDisableClientState</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>array</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDisableClientStateIndexedEXT</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>array</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDisableClientStateiEXT</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>array</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDisableDriverControlQCOM</name></proto> >+ <param><ptype>GLuint</ptype> <name>driverControl</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDisableIndexedEXT</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <alias name="glDisablei"/> >+ <glx type="render" opcode="354"/> >+ </command> >+ <command> >+ <proto>void <name>glDisableVariantClientStateEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDisableVertexArrayAttrib</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDisableVertexArrayAttribEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDisableVertexArrayEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>array</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDisableVertexAttribAPPLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDisableVertexAttribArray</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDisableVertexAttribArrayARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <alias name="glDisableVertexAttribArray"/> >+ </command> >+ <command> >+ <proto>void <name>glDisablei</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDisableiEXT</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <alias name="glDisablei"/> >+ </command> >+ <command> >+ <proto>void <name>glDisableiNV</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <alias name="glDisablei"/> >+ </command> >+ <command> >+ <proto>void <name>glDisableiOES</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <alias name="glDisablei"/> >+ </command> >+ <command> >+ <proto>void <name>glDiscardFramebufferEXT</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>numAttachments</name></param> >+ <param len="numAttachments">const <ptype>GLenum</ptype> *<name>attachments</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDispatchCompute</name></proto> >+ <param><ptype>GLuint</ptype> <name>num_groups_x</name></param> >+ <param><ptype>GLuint</ptype> <name>num_groups_y</name></param> >+ <param><ptype>GLuint</ptype> <name>num_groups_z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDispatchComputeGroupSizeARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>num_groups_x</name></param> >+ <param><ptype>GLuint</ptype> <name>num_groups_y</name></param> >+ <param><ptype>GLuint</ptype> <name>num_groups_z</name></param> >+ <param><ptype>GLuint</ptype> <name>group_size_x</name></param> >+ <param><ptype>GLuint</ptype> <name>group_size_y</name></param> >+ <param><ptype>GLuint</ptype> <name>group_size_z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDispatchComputeIndirect</name></proto> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>indirect</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawArrays</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <glx type="render" opcode="193"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawArraysEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <alias name="glDrawArrays"/> >+ <glx type="render" opcode="4116"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawArraysIndirect</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param>const void *<name>indirect</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawArraysInstanced</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>instancecount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawArraysInstancedANGLE</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <alias name="glDrawArraysInstanced"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawArraysInstancedARB</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <alias name="glDrawArraysInstanced"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawArraysInstancedBaseInstance</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>instancecount</name></param> >+ <param><ptype>GLuint</ptype> <name>baseinstance</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawArraysInstancedBaseInstanceEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>instancecount</name></param> >+ <param><ptype>GLuint</ptype> <name>baseinstance</name></param> >+ <alias name="glDrawArraysInstancedBaseInstance"/> >+ </command> >+ <command comment="primcount should be renamed to instanceCount for OpenGL ES"> >+ <proto>void <name>glDrawArraysInstancedEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLint</ptype> <name>start</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <alias name="glDrawArraysInstanced"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawArraysInstancedNV</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <alias name="glDrawArraysInstanced"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawBuffer</name></proto> >+ <param group="DrawBufferMode"><ptype>GLenum</ptype> <name>buf</name></param> >+ <glx type="render" opcode="126"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawBuffers</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="DrawBufferModeATI" len="n">const <ptype>GLenum</ptype> *<name>bufs</name></param> >+ <glx type="render" opcode="233"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawBuffersARB</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="DrawBufferModeATI" len="n">const <ptype>GLenum</ptype> *<name>bufs</name></param> >+ <alias name="glDrawBuffers"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawBuffersATI</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="DrawBufferModeATI" len="n">const <ptype>GLenum</ptype> *<name>bufs</name></param> >+ <alias name="glDrawBuffers"/> >+ <glx type="render" opcode="233"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawBuffersEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLenum</ptype> *<name>bufs</name></param> >+ <alias name="glDrawBuffers"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawBuffersIndexedEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLenum</ptype> *<name>location</name></param> >+ <param len="n">const <ptype>GLint</ptype> *<name>indices</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawBuffersNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLenum</ptype> *<name>bufs</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawCommandsAddressNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>primitiveMode</name></param> >+ <param>const <ptype>GLuint64</ptype> *<name>indirects</name></param> >+ <param>const <ptype>GLsizei</ptype> *<name>sizes</name></param> >+ <param><ptype>GLuint</ptype> <name>count</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawCommandsNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>primitiveMode</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param>const <ptype>GLintptr</ptype> *<name>indirects</name></param> >+ <param>const <ptype>GLsizei</ptype> *<name>sizes</name></param> >+ <param><ptype>GLuint</ptype> <name>count</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawCommandsStatesAddressNV</name></proto> >+ <param>const <ptype>GLuint64</ptype> *<name>indirects</name></param> >+ <param>const <ptype>GLsizei</ptype> *<name>sizes</name></param> >+ <param>const <ptype>GLuint</ptype> *<name>states</name></param> >+ <param>const <ptype>GLuint</ptype> *<name>fbos</name></param> >+ <param><ptype>GLuint</ptype> <name>count</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawCommandsStatesNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param>const <ptype>GLintptr</ptype> *<name>indirects</name></param> >+ <param>const <ptype>GLsizei</ptype> *<name>sizes</name></param> >+ <param>const <ptype>GLuint</ptype> *<name>states</name></param> >+ <param>const <ptype>GLuint</ptype> *<name>fbos</name></param> >+ <param><ptype>GLuint</ptype> <name>count</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementArrayAPPLE</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementArrayATI</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawElements</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsBaseVertex</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <param><ptype>GLint</ptype> <name>basevertex</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsBaseVertexEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <param><ptype>GLint</ptype> <name>basevertex</name></param> >+ <alias name="glDrawElementsBaseVertex"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsBaseVertexOES</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <param><ptype>GLint</ptype> <name>basevertex</name></param> >+ <alias name="glDrawElementsBaseVertex"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsIndirect</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param>const void *<name>indirect</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsInstanced</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>instancecount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsInstancedANGLE</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <alias name="glDrawElementsInstanced"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsInstancedARB</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <alias name="glDrawElementsInstanced"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsInstancedBaseInstance</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="count">const void *<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>instancecount</name></param> >+ <param><ptype>GLuint</ptype> <name>baseinstance</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsInstancedBaseInstanceEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="count">const void *<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>instancecount</name></param> >+ <param><ptype>GLuint</ptype> <name>baseinstance</name></param> >+ <alias name="glDrawElementsInstancedBaseInstance"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsInstancedBaseVertex</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>instancecount</name></param> >+ <param><ptype>GLint</ptype> <name>basevertex</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsInstancedBaseVertexBaseInstance</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="count">const void *<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>instancecount</name></param> >+ <param><ptype>GLint</ptype> <name>basevertex</name></param> >+ <param><ptype>GLuint</ptype> <name>baseinstance</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsInstancedBaseVertexBaseInstanceEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="count">const void *<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>instancecount</name></param> >+ <param><ptype>GLint</ptype> <name>basevertex</name></param> >+ <param><ptype>GLuint</ptype> <name>baseinstance</name></param> >+ <alias name="glDrawElementsInstancedBaseVertexBaseInstance"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsInstancedBaseVertexEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>instancecount</name></param> >+ <param><ptype>GLint</ptype> <name>basevertex</name></param> >+ <alias name="glDrawElementsInstancedBaseVertex"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsInstancedBaseVertexOES</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>instancecount</name></param> >+ <param><ptype>GLint</ptype> <name>basevertex</name></param> >+ <alias name="glDrawElementsInstancedBaseVertex"/> >+ </command> >+ <command comment="primcount should be renamed to instanceCount for OpenGL ES"> >+ <proto>void <name>glDrawElementsInstancedEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <alias name="glDrawElementsInstanced"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawElementsInstancedNV</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <alias name="glDrawElementsInstanced"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawMeshArraysSUN</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawPixels</name></proto> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height)">const void *<name>pixels</name></param> >+ <glx type="render" opcode="173"/> >+ <glx type="render" opcode="322" name="glDrawPixelsPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawRangeElementArrayAPPLE</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>start</name></param> >+ <param><ptype>GLuint</ptype> <name>end</name></param> >+ <param><ptype>GLint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawRangeElementArrayATI</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>start</name></param> >+ <param><ptype>GLuint</ptype> <name>end</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawRangeElements</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>start</name></param> >+ <param><ptype>GLuint</ptype> <name>end</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawRangeElementsBaseVertex</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>start</name></param> >+ <param><ptype>GLuint</ptype> <name>end</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <param><ptype>GLint</ptype> <name>basevertex</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawRangeElementsBaseVertexEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>start</name></param> >+ <param><ptype>GLuint</ptype> <name>end</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <param><ptype>GLint</ptype> <name>basevertex</name></param> >+ <alias name="glDrawRangeElementsBaseVertex"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawRangeElementsBaseVertexOES</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>start</name></param> >+ <param><ptype>GLuint</ptype> <name>end</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <param><ptype>GLint</ptype> <name>basevertex</name></param> >+ <alias name="glDrawRangeElementsBaseVertex"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawRangeElementsEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>start</name></param> >+ <param><ptype>GLuint</ptype> <name>end</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(count,type)">const void *<name>indices</name></param> >+ <alias name="glDrawRangeElements"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawTexfOES</name></proto> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <param><ptype>GLfloat</ptype> <name>width</name></param> >+ <param><ptype>GLfloat</ptype> <name>height</name></param> >+ <vecequiv name="glDrawTexfvOES"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawTexfvOES</name></proto> >+ <param len="5">const <ptype>GLfloat</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawTexiOES</name></proto> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLint</ptype> <name>z</name></param> >+ <param><ptype>GLint</ptype> <name>width</name></param> >+ <param><ptype>GLint</ptype> <name>height</name></param> >+ <vecequiv name="glDrawTexivOES"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawTexivOES</name></proto> >+ <param len="5">const <ptype>GLint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawTexsOES</name></proto> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <param><ptype>GLshort</ptype> <name>y</name></param> >+ <param><ptype>GLshort</ptype> <name>z</name></param> >+ <param><ptype>GLshort</ptype> <name>width</name></param> >+ <param><ptype>GLshort</ptype> <name>height</name></param> >+ <vecequiv name="glDrawTexsvOES"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawTexsvOES</name></proto> >+ <param len="5">const <ptype>GLshort</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawTextureNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param><ptype>GLfloat</ptype> <name>x0</name></param> >+ <param><ptype>GLfloat</ptype> <name>y0</name></param> >+ <param><ptype>GLfloat</ptype> <name>x1</name></param> >+ <param><ptype>GLfloat</ptype> <name>y1</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <param><ptype>GLfloat</ptype> <name>s0</name></param> >+ <param><ptype>GLfloat</ptype> <name>t0</name></param> >+ <param><ptype>GLfloat</ptype> <name>s1</name></param> >+ <param><ptype>GLfloat</ptype> <name>t1</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawTexxOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>x</name></param> >+ <param><ptype>GLfixed</ptype> <name>y</name></param> >+ <param><ptype>GLfixed</ptype> <name>z</name></param> >+ <param><ptype>GLfixed</ptype> <name>width</name></param> >+ <param><ptype>GLfixed</ptype> <name>height</name></param> >+ <vecequiv name="glDrawTexxvOES"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawTexxvOES</name></proto> >+ <param len="5">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawTransformFeedback</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawTransformFeedbackEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <alias name="glDrawTransformFeedback"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawTransformFeedbackInstanced</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLsizei</ptype> <name>instancecount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawTransformFeedbackInstancedEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLsizei</ptype> <name>instancecount</name></param> >+ <alias name="glDrawTransformFeedbackInstanced"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawTransformFeedbackNV</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <alias name="glDrawTransformFeedback"/> >+ </command> >+ <command> >+ <proto>void <name>glDrawTransformFeedbackStream</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLuint</ptype> <name>stream</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawTransformFeedbackStreamInstanced</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLuint</ptype> <name>stream</name></param> >+ <param><ptype>GLsizei</ptype> <name>instancecount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEGLImageTargetRenderbufferStorageOES</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLeglImageOES</ptype> <name>image</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEGLImageTargetTexStorageEXT</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLeglImageOES</ptype> <name>image</name></param> >+ <param>const <ptype>GLint</ptype>* <name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEGLImageTargetTexture2DOES</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLeglImageOES</ptype> <name>image</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEGLImageTargetTextureStorageEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLeglImageOES</ptype> <name>image</name></param> >+ <param>const <ptype>GLint</ptype>* <name>attrib_list</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEdgeFlag</name></proto> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>flag</name></param> >+ <vecequiv name="glEdgeFlagv"/> >+ </command> >+ <command> >+ <proto>void <name>glEdgeFlagFormatNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEdgeFlagPointer</name></proto> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEdgeFlagPointerEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean" len="COMPSIZE(stride,count)">const <ptype>GLboolean</ptype> *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEdgeFlagPointerListIBM</name></proto> >+ <param><ptype>GLint</ptype> <name>stride</name></param> >+ <param group="BooleanPointer" len="COMPSIZE(stride)">const <ptype>GLboolean</ptype> **<name>pointer</name></param> >+ <param><ptype>GLint</ptype> <name>ptrstride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEdgeFlagv</name></proto> >+ <param group="Boolean" len="1">const <ptype>GLboolean</ptype> *<name>flag</name></param> >+ <glx type="render" opcode="22"/> >+ </command> >+ <command> >+ <proto>void <name>glElementPointerAPPLE</name></proto> >+ <param group="ElementPointerTypeATI"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(type)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glElementPointerATI</name></proto> >+ <param group="ElementPointerTypeATI"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(type)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEnable</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>cap</name></param> >+ <glx type="render" opcode="139"/> >+ </command> >+ <command> >+ <proto>void <name>glEnableClientState</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>array</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEnableClientStateIndexedEXT</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>array</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEnableClientStateiEXT</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>array</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEnableDriverControlQCOM</name></proto> >+ <param><ptype>GLuint</ptype> <name>driverControl</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEnableIndexedEXT</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <alias name="glEnablei"/> >+ <glx type="render" opcode="353"/> >+ </command> >+ <command> >+ <proto>void <name>glEnableVariantClientStateEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEnableVertexArrayAttrib</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEnableVertexArrayAttribEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEnableVertexArrayEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>array</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEnableVertexAttribAPPLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEnableVertexAttribArray</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEnableVertexAttribArrayARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <alias name="glEnableVertexAttribArray"/> >+ </command> >+ <command> >+ <proto>void <name>glEnablei</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEnableiEXT</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <alias name="glEnablei"/> >+ </command> >+ <command> >+ <proto>void <name>glEnableiNV</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <alias name="glEnablei"/> >+ </command> >+ <command> >+ <proto>void <name>glEnableiOES</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <alias name="glEnablei"/> >+ </command> >+ <command> >+ <proto>void <name>glEnd</name></proto> >+ <glx type="render" opcode="23"/> >+ </command> >+ <command> >+ <proto>void <name>glEndConditionalRender</name></proto> >+ <glx type="render" opcode="349"/> >+ </command> >+ <command> >+ <proto>void <name>glEndConditionalRenderNV</name></proto> >+ <alias name="glEndConditionalRender"/> >+ </command> >+ <command> >+ <proto>void <name>glEndConditionalRenderNVX</name></proto> >+ <alias name="glEndConditionalRender"/> >+ </command> >+ <command> >+ <proto>void <name>glEndFragmentShaderATI</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glEndList</name></proto> >+ <glx type="single" opcode="102"/> >+ </command> >+ <command> >+ <proto>void <name>glEndOcclusionQueryNV</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glEndPerfMonitorAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>monitor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEndPerfQueryINTEL</name></proto> >+ <param><ptype>GLuint</ptype> <name>queryHandle</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEndQuery</name></proto> >+ <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <glx type="render" opcode="232"/> >+ </command> >+ <command> >+ <proto>void <name>glEndQueryARB</name></proto> >+ <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <alias name="glEndQuery"/> >+ </command> >+ <command> >+ <proto>void <name>glEndQueryEXT</name></proto> >+ <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEndQueryIndexed</name></proto> >+ <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEndTilingQCOM</name></proto> >+ <param group="BufferBitQCOM"><ptype>GLbitfield</ptype> <name>preserveMask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEndTransformFeedback</name></proto> >+ <glx type="render" opcode="358"/> >+ </command> >+ <command> >+ <proto>void <name>glEndTransformFeedbackEXT</name></proto> >+ <alias name="glEndTransformFeedback"/> >+ </command> >+ <command> >+ <proto>void <name>glEndTransformFeedbackNV</name></proto> >+ <alias name="glEndTransformFeedback"/> >+ </command> >+ <command> >+ <proto>void <name>glEndVertexShaderEXT</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glEndVideoCaptureNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_capture_slot</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEvalCoord1d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u</name></param> >+ <vecequiv name="glEvalCoord1dv"/> >+ </command> >+ <command> >+ <proto>void <name>glEvalCoord1dv</name></proto> >+ <param group="CoordD" len="1">const <ptype>GLdouble</ptype> *<name>u</name></param> >+ <glx type="render" opcode="151"/> >+ </command> >+ <command> >+ <proto>void <name>glEvalCoord1f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u</name></param> >+ <vecequiv name="glEvalCoord1fv"/> >+ </command> >+ <command> >+ <proto>void <name>glEvalCoord1fv</name></proto> >+ <param group="CoordF" len="1">const <ptype>GLfloat</ptype> *<name>u</name></param> >+ <glx type="render" opcode="152"/> >+ </command> >+ <command> >+ <proto>void <name>glEvalCoord1xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>u</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEvalCoord1xvOES</name></proto> >+ <param len="1">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEvalCoord2d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>v</name></param> >+ <vecequiv name="glEvalCoord2dv"/> >+ </command> >+ <command> >+ <proto>void <name>glEvalCoord2dv</name></proto> >+ <param group="CoordD" len="2">const <ptype>GLdouble</ptype> *<name>u</name></param> >+ <glx type="render" opcode="153"/> >+ </command> >+ <command> >+ <proto>void <name>glEvalCoord2f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>v</name></param> >+ <vecequiv name="glEvalCoord2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glEvalCoord2fv</name></proto> >+ <param group="CoordF" len="2">const <ptype>GLfloat</ptype> *<name>u</name></param> >+ <glx type="render" opcode="154"/> >+ </command> >+ <command> >+ <proto>void <name>glEvalCoord2xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>u</name></param> >+ <param><ptype>GLfixed</ptype> <name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEvalCoord2xvOES</name></proto> >+ <param len="2">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEvalMapsNV</name></proto> >+ <param group="EvalTargetNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="EvalMapsModeNV"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glEvalMesh1</name></proto> >+ <param group="MeshMode1"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>i1</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>i2</name></param> >+ <glx type="render" opcode="155"/> >+ </command> >+ <command> >+ <proto>void <name>glEvalMesh2</name></proto> >+ <param group="MeshMode2"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>i1</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>i2</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>j1</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>j2</name></param> >+ <glx type="render" opcode="157"/> >+ </command> >+ <command> >+ <proto>void <name>glEvalPoint1</name></proto> >+ <param><ptype>GLint</ptype> <name>i</name></param> >+ <glx type="render" opcode="156"/> >+ </command> >+ <command> >+ <proto>void <name>glEvalPoint2</name></proto> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>i</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>j</name></param> >+ <glx type="render" opcode="158"/> >+ </command> >+ <command> >+ <proto>void <name>glEvaluateDepthValuesARB</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glExecuteProgramNV</name></proto> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="4181"/> >+ </command> >+ <command> >+ <proto>void <name>glExtGetBufferPointervQCOM</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param>void **<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glExtGetBuffersQCOM</name></proto> >+ <param len="maxBuffers"><ptype>GLuint</ptype> *<name>buffers</name></param> >+ <param><ptype>GLint</ptype> <name>maxBuffers</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>numBuffers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glExtGetFramebuffersQCOM</name></proto> >+ <param len="maxFramebuffers"><ptype>GLuint</ptype> *<name>framebuffers</name></param> >+ <param><ptype>GLint</ptype> <name>maxFramebuffers</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>numFramebuffers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glExtGetProgramBinarySourceQCOM</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>shadertype</name></param> >+ <param><ptype>GLchar</ptype> *<name>source</name></param> >+ <param><ptype>GLint</ptype> *<name>length</name></param> >+ </command> >+ <command> >+ <proto>void <name>glExtGetProgramsQCOM</name></proto> >+ <param len="maxPrograms"><ptype>GLuint</ptype> *<name>programs</name></param> >+ <param><ptype>GLint</ptype> <name>maxPrograms</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>numPrograms</name></param> >+ </command> >+ <command> >+ <proto>void <name>glExtGetRenderbuffersQCOM</name></proto> >+ <param len="maxRenderbuffers"><ptype>GLuint</ptype> *<name>renderbuffers</name></param> >+ <param><ptype>GLint</ptype> <name>maxRenderbuffers</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>numRenderbuffers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glExtGetShadersQCOM</name></proto> >+ <param len="maxShaders"><ptype>GLuint</ptype> *<name>shaders</name></param> >+ <param><ptype>GLint</ptype> <name>maxShaders</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>numShaders</name></param> >+ </command> >+ <command> >+ <proto>void <name>glExtGetTexLevelParameterivQCOM</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLenum</ptype> <name>face</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glExtGetTexSubImageQCOM</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param>void *<name>texels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glExtGetTexturesQCOM</name></proto> >+ <param><ptype>GLuint</ptype> *<name>textures</name></param> >+ <param><ptype>GLint</ptype> <name>maxTextures</name></param> >+ <param><ptype>GLint</ptype> *<name>numTextures</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glExtIsProgramBinaryQCOM</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ </command> >+ <command> >+ <proto>void <name>glExtTexObjectStateOverrideiQCOM</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glExtractComponentEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>res</name></param> >+ <param><ptype>GLuint</ptype> <name>src</name></param> >+ <param><ptype>GLuint</ptype> <name>num</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFeedbackBuffer</name></proto> >+ <param><ptype>GLsizei</ptype> <name>size</name></param> >+ <param group="FeedbackType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="FeedbackElement" len="size"><ptype>GLfloat</ptype> *<name>buffer</name></param> >+ <glx type="single" opcode="105"/> >+ </command> >+ <command> >+ <proto>void <name>glFeedbackBufferxOES</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="n">const <ptype>GLfixed</ptype> *<name>buffer</name></param> >+ </command> >+ <command> >+ <proto group="sync"><ptype>GLsync</ptype> <name>glFenceSync</name></proto> >+ <param group="SyncCondition"><ptype>GLenum</ptype> <name>condition</name></param> >+ <param><ptype>GLbitfield</ptype> <name>flags</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLsync</ptype> <name>glFenceSyncAPPLE</name></proto> >+ <param group="SyncCondition"><ptype>GLenum</ptype> <name>condition</name></param> >+ <param><ptype>GLbitfield</ptype> <name>flags</name></param> >+ <alias name="glFenceSync"/> >+ </command> >+ <command> >+ <proto>void <name>glFinalCombinerInputNV</name></proto> >+ <param group="CombinerVariableNV"><ptype>GLenum</ptype> <name>variable</name></param> >+ <param group="CombinerRegisterNV"><ptype>GLenum</ptype> <name>input</name></param> >+ <param group="CombinerMappingNV"><ptype>GLenum</ptype> <name>mapping</name></param> >+ <param group="CombinerComponentUsageNV"><ptype>GLenum</ptype> <name>componentUsage</name></param> >+ <glx type="render" opcode="4142"/> >+ </command> >+ <command> >+ <proto>void <name>glFinish</name></proto> >+ <glx type="single" opcode="108"/> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glFinishAsyncSGIX</name></proto> >+ <param len="1"><ptype>GLuint</ptype> *<name>markerp</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFinishFenceAPPLE</name></proto> >+ <param group="FenceNV"><ptype>GLuint</ptype> <name>fence</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFinishFenceNV</name></proto> >+ <param group="FenceNV"><ptype>GLuint</ptype> <name>fence</name></param> >+ <glx type="vendor" opcode="1312"/> >+ </command> >+ <command> >+ <proto>void <name>glFinishObjectAPPLE</name></proto> >+ <param group="ObjectTypeAPPLE"><ptype>GLenum</ptype> <name>object</name></param> >+ <param><ptype>GLint</ptype> <name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFinishTextureSUNX</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glFlush</name></proto> >+ <glx type="single" opcode="142"/> >+ </command> >+ <command> >+ <proto>void <name>glFlushMappedBufferRange</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>length</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFlushMappedBufferRangeAPPLE</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <alias name="glFlushMappedBufferRange"/> >+ </command> >+ <command> >+ <proto>void <name>glFlushMappedBufferRangeEXT</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>length</name></param> >+ <alias name="glFlushMappedBufferRange"/> >+ </command> >+ <command> >+ <proto>void <name>glFlushMappedNamedBufferRange</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>length</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFlushMappedNamedBufferRangeEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>length</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFlushPixelDataRangeNV</name></proto> >+ <param group="PixelDataRangeTargetNV"><ptype>GLenum</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFlushRasterSGIX</name></proto> >+ <glx type="vendor" opcode="4105"/> >+ </command> >+ <command> >+ <proto>void <name>glFlushStaticDataIBM</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFlushVertexArrayRangeAPPLE</name></proto> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param len="length">void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFlushVertexArrayRangeNV</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glFogCoordFormatNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFogCoordPointer</name></proto> >+ <param group="FogPointerTypeEXT"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFogCoordPointerEXT</name></proto> >+ <param group="FogPointerTypeEXT"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(type,stride)">const void *<name>pointer</name></param> >+ <alias name="glFogCoordPointer"/> >+ </command> >+ <command> >+ <proto>void <name>glFogCoordPointerListIBM</name></proto> >+ <param group="FogPointerTypeIBM"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLint</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(type,stride)">const void **<name>pointer</name></param> >+ <param><ptype>GLint</ptype> <name>ptrstride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFogCoordd</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>coord</name></param> >+ <vecequiv name="glFogCoorddv"/> >+ </command> >+ <command> >+ <proto>void <name>glFogCoorddEXT</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>coord</name></param> >+ <alias name="glFogCoordd"/> >+ <vecequiv name="glFogCoorddvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glFogCoorddv</name></proto> >+ <param group="CoordD" len="1">const <ptype>GLdouble</ptype> *<name>coord</name></param> >+ <glx type="render" opcode="4125"/> >+ </command> >+ <command> >+ <proto>void <name>glFogCoorddvEXT</name></proto> >+ <param group="CoordD" len="1">const <ptype>GLdouble</ptype> *<name>coord</name></param> >+ <alias name="glFogCoorddv"/> >+ <glx type="render" opcode="4125"/> >+ </command> >+ <command> >+ <proto>void <name>glFogCoordf</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>coord</name></param> >+ <vecequiv name="glFogCoordfv"/> >+ </command> >+ <command> >+ <proto>void <name>glFogCoordfEXT</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>coord</name></param> >+ <alias name="glFogCoordf"/> >+ <vecequiv name="glFogCoordfvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glFogCoordfv</name></proto> >+ <param group="CoordF" len="1">const <ptype>GLfloat</ptype> *<name>coord</name></param> >+ <glx type="render" opcode="4124"/> >+ </command> >+ <command> >+ <proto>void <name>glFogCoordfvEXT</name></proto> >+ <param group="CoordF" len="1">const <ptype>GLfloat</ptype> *<name>coord</name></param> >+ <alias name="glFogCoordfv"/> >+ <glx type="render" opcode="4124"/> >+ </command> >+ <command> >+ <proto>void <name>glFogCoordhNV</name></proto> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>fog</name></param> >+ <vecequiv name="glFogCoordhvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glFogCoordhvNV</name></proto> >+ <param group="Half16NV" len="1">const <ptype>GLhalfNV</ptype> *<name>fog</name></param> >+ <glx type="render" opcode="4254"/> >+ </command> >+ <command> >+ <proto>void <name>glFogFuncSGIS</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n*2">const <ptype>GLfloat</ptype> *<name>points</name></param> >+ <glx type="render" opcode="2067"/> >+ </command> >+ <command> >+ <proto>void <name>glFogf</name></proto> >+ <param group="FogParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <glx type="render" opcode="80"/> >+ </command> >+ <command> >+ <proto>void <name>glFogfv</name></proto> >+ <param group="FogParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="81"/> >+ </command> >+ <command> >+ <proto>void <name>glFogi</name></proto> >+ <param group="FogParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ <glx type="render" opcode="82"/> >+ </command> >+ <command> >+ <proto>void <name>glFogiv</name></proto> >+ <param group="FogParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="83"/> >+ </command> >+ <command> >+ <proto>void <name>glFogx</name></proto> >+ <param group="FogPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFogxOES</name></proto> >+ <param group="FogPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFogxv</name></proto> >+ <param group="FogPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFogxvOES</name></proto> >+ <param group="FogPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFragmentColorMaterialSGIX</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFragmentCoverageColorNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>color</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFragmentLightModelfSGIX</name></proto> >+ <param group="FragmentLightModelParameterSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFragmentLightModelfvSGIX</name></proto> >+ <param group="FragmentLightModelParameterSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFragmentLightModeliSGIX</name></proto> >+ <param group="FragmentLightModelParameterSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFragmentLightModelivSGIX</name></proto> >+ <param group="FragmentLightModelParameterSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFragmentLightfSGIX</name></proto> >+ <param group="FragmentLightNameSGIX"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="FragmentLightParameterSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFragmentLightfvSGIX</name></proto> >+ <param group="FragmentLightNameSGIX"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="FragmentLightParameterSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFragmentLightiSGIX</name></proto> >+ <param group="FragmentLightNameSGIX"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="FragmentLightParameterSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFragmentLightivSGIX</name></proto> >+ <param group="FragmentLightNameSGIX"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="FragmentLightParameterSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFragmentMaterialfSGIX</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFragmentMaterialfvSGIX</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFragmentMaterialiSGIX</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFragmentMaterialivSGIX</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFrameTerminatorGREMEDY</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glFrameZoomSGIX</name></proto> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>factor</name></param> >+ <glx type="render" opcode="2072"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferDrawBufferEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="DrawBufferMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferDrawBuffersEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="DrawBufferMode" len="n">const <ptype>GLenum</ptype> *<name>bufs</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferFetchBarrierEXT</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferFetchBarrierQCOM</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferFoveationConfigQCOM</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param><ptype>GLuint</ptype> <name>numLayers</name></param> >+ <param><ptype>GLuint</ptype> <name>focalPointsPerLayer</name></param> >+ <param><ptype>GLuint</ptype> <name>requestedFeatures</name></param> >+ <param len="1"><ptype>GLuint</ptype> *<name>providedFeatures</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferFoveationParametersQCOM</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param><ptype>GLuint</ptype> <name>layer</name></param> >+ <param><ptype>GLuint</ptype> <name>focalPoint</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>focalX</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>focalY</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>gainX</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>gainY</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>foveaArea</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferParameteri</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferPixelLocalStorageSizeEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>size</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferReadBufferEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="ReadBufferMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferRenderbuffer</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>renderbuffertarget</name></param> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ <glx type="render" opcode="4324"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferRenderbufferEXT</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>renderbuffertarget</name></param> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ <alias name="glFramebufferRenderbuffer"/> >+ <glx type="render" opcode="4324"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferRenderbufferOES</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>renderbuffertarget</name></param> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferSampleLocationsfvARB</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>start</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferSampleLocationsfvNV</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>start</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferSamplePositionsfvAMD</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>numsamples</name></param> >+ <param><ptype>GLuint</ptype> <name>pixelindex</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTexture</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTexture1D</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>textarget</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <glx type="render" opcode="4321"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTexture1DEXT</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>textarget</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <alias name="glFramebufferTexture1D"/> >+ <glx type="render" opcode="4321"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTexture2D</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>textarget</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <glx type="render" opcode="4322"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTexture2DEXT</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>textarget</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <alias name="glFramebufferTexture2D"/> >+ <glx type="render" opcode="4322"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTexture2DDownsampleIMG</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>textarget</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xscale</name></param> >+ <param><ptype>GLint</ptype> <name>yscale</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTexture2DMultisampleEXT</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>textarget</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTexture2DMultisampleIMG</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>textarget</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTexture2DOES</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>textarget</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTexture3D</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>textarget</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <glx type="render" opcode="4323"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTexture3DEXT</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>textarget</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <alias name="glFramebufferTexture3D"/> >+ <glx type="render" opcode="4323"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTexture3DOES</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>textarget</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTextureARB</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <alias name="glFramebufferTexture"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTextureEXT</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <alias name="glFramebufferTexture"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTextureFaceARB</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>face</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTextureFaceEXT</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>face</name></param> >+ <alias name="glFramebufferTextureFaceARB"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTextureLayer</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>layer</name></param> >+ <glx type="render" opcode="237"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTextureLayerARB</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>layer</name></param> >+ <alias name="glFramebufferTextureLayer"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTextureLayerEXT</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>layer</name></param> >+ <alias name="glFramebufferTextureLayer"/> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTextureLayerDownsampleIMG</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>layer</name></param> >+ <param><ptype>GLint</ptype> <name>xscale</name></param> >+ <param><ptype>GLint</ptype> <name>yscale</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTextureMultisampleMultiviewOVR</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param><ptype>GLint</ptype> <name>baseViewIndex</name></param> >+ <param><ptype>GLsizei</ptype> <name>numViews</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTextureMultiviewOVR</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>baseViewIndex</name></param> >+ <param><ptype>GLsizei</ptype> <name>numViews</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFramebufferTextureOES</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <alias name="glFramebufferTexture"/> >+ </command> >+ <command> >+ <proto>void <name>glFreeObjectBufferATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFrontFace</name></proto> >+ <param group="FrontFaceDirection"><ptype>GLenum</ptype> <name>mode</name></param> >+ <glx type="render" opcode="84"/> >+ </command> >+ <command> >+ <proto>void <name>glFrustum</name></proto> >+ <param><ptype>GLdouble</ptype> <name>left</name></param> >+ <param><ptype>GLdouble</ptype> <name>right</name></param> >+ <param><ptype>GLdouble</ptype> <name>bottom</name></param> >+ <param><ptype>GLdouble</ptype> <name>top</name></param> >+ <param><ptype>GLdouble</ptype> <name>zNear</name></param> >+ <param><ptype>GLdouble</ptype> <name>zFar</name></param> >+ <glx type="render" opcode="175"/> >+ </command> >+ <command> >+ <proto>void <name>glFrustumf</name></proto> >+ <param><ptype>GLfloat</ptype> <name>l</name></param> >+ <param><ptype>GLfloat</ptype> <name>r</name></param> >+ <param><ptype>GLfloat</ptype> <name>b</name></param> >+ <param><ptype>GLfloat</ptype> <name>t</name></param> >+ <param><ptype>GLfloat</ptype> <name>n</name></param> >+ <param><ptype>GLfloat</ptype> <name>f</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFrustumfOES</name></proto> >+ <param><ptype>GLfloat</ptype> <name>l</name></param> >+ <param><ptype>GLfloat</ptype> <name>r</name></param> >+ <param><ptype>GLfloat</ptype> <name>b</name></param> >+ <param><ptype>GLfloat</ptype> <name>t</name></param> >+ <param><ptype>GLfloat</ptype> <name>n</name></param> >+ <param><ptype>GLfloat</ptype> <name>f</name></param> >+ <glx type="render" opcode="4310"/> >+ </command> >+ <command> >+ <proto>void <name>glFrustumx</name></proto> >+ <param><ptype>GLfixed</ptype> <name>l</name></param> >+ <param><ptype>GLfixed</ptype> <name>r</name></param> >+ <param><ptype>GLfixed</ptype> <name>b</name></param> >+ <param><ptype>GLfixed</ptype> <name>t</name></param> >+ <param><ptype>GLfixed</ptype> <name>n</name></param> >+ <param><ptype>GLfixed</ptype> <name>f</name></param> >+ </command> >+ <command> >+ <proto>void <name>glFrustumxOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>l</name></param> >+ <param><ptype>GLfixed</ptype> <name>r</name></param> >+ <param><ptype>GLfixed</ptype> <name>b</name></param> >+ <param><ptype>GLfixed</ptype> <name>t</name></param> >+ <param><ptype>GLfixed</ptype> <name>n</name></param> >+ <param><ptype>GLfixed</ptype> <name>f</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glGenAsyncMarkersSGIX</name></proto> >+ <param><ptype>GLsizei</ptype> <name>range</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenBuffers</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>buffers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenBuffersARB</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>buffers</name></param> >+ <alias name="glGenBuffers"/> >+ </command> >+ <command> >+ <proto>void <name>glGenFencesAPPLE</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="FenceNV" len="n"><ptype>GLuint</ptype> *<name>fences</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenFencesNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="FenceNV" len="n"><ptype>GLuint</ptype> *<name>fences</name></param> >+ <glx type="vendor" opcode="1277"/> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glGenFragmentShadersATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>range</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenFramebuffers</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>framebuffers</name></param> >+ <glx type="vendor" opcode="1426"/> >+ </command> >+ <command> >+ <proto>void <name>glGenFramebuffersEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>framebuffers</name></param> >+ <alias name="glGenFramebuffers"/> >+ <glx type="vendor" opcode="1426"/> >+ </command> >+ <command> >+ <proto>void <name>glGenFramebuffersOES</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>framebuffers</name></param> >+ </command> >+ <command> >+ <proto group="List"><ptype>GLuint</ptype> <name>glGenLists</name></proto> >+ <param><ptype>GLsizei</ptype> <name>range</name></param> >+ <glx type="single" opcode="104"/> >+ </command> >+ <command> >+ <proto>void <name>glGenNamesAMD</name></proto> >+ <param><ptype>GLenum</ptype> <name>identifier</name></param> >+ <param><ptype>GLuint</ptype> <name>num</name></param> >+ <param len="num"><ptype>GLuint</ptype> *<name>names</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenOcclusionQueriesNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>ids</name></param> >+ </command> >+ <command> >+ <proto group="Path"><ptype>GLuint</ptype> <name>glGenPathsNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>range</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenPerfMonitorsAMD</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>monitors</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenProgramPipelines</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>pipelines</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenProgramPipelinesEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>pipelines</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenProgramsARB</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>programs</name></param> >+ <glx type="vendor" opcode="1295"/> >+ </command> >+ <command> >+ <proto>void <name>glGenProgramsNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>programs</name></param> >+ <alias name="glGenProgramsARB"/> >+ <glx type="vendor" opcode="1295"/> >+ </command> >+ <command> >+ <proto>void <name>glGenQueries</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>ids</name></param> >+ <glx type="single" opcode="162"/> >+ </command> >+ <command> >+ <proto>void <name>glGenQueriesARB</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>ids</name></param> >+ <alias name="glGenQueries"/> >+ </command> >+ <command> >+ <proto>void <name>glGenQueriesEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>ids</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenQueryResourceTagNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLint</ptype> *<name>tagIds</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenRenderbuffers</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>renderbuffers</name></param> >+ <glx type="vendor" opcode="1423"/> >+ </command> >+ <command> >+ <proto>void <name>glGenRenderbuffersEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>renderbuffers</name></param> >+ <alias name="glGenRenderbuffers"/> >+ <glx type="vendor" opcode="1423"/> >+ </command> >+ <command> >+ <proto>void <name>glGenRenderbuffersOES</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>renderbuffers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenSamplers</name></proto> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count"><ptype>GLuint</ptype> *<name>samplers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenSemaphoresEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>semaphores</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glGenSymbolsEXT</name></proto> >+ <param group="DataTypeEXT"><ptype>GLenum</ptype> <name>datatype</name></param> >+ <param group="VertexShaderStorageTypeEXT"><ptype>GLenum</ptype> <name>storagetype</name></param> >+ <param group="ParameterRangeEXT"><ptype>GLenum</ptype> <name>range</name></param> >+ <param><ptype>GLuint</ptype> <name>components</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenTextures</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="Texture" len="n"><ptype>GLuint</ptype> *<name>textures</name></param> >+ <glx type="single" opcode="145"/> >+ </command> >+ <command> >+ <proto>void <name>glGenTexturesEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="Texture" len="n"><ptype>GLuint</ptype> *<name>textures</name></param> >+ <glx type="vendor" opcode="13"/> >+ </command> >+ <command> >+ <proto>void <name>glGenTransformFeedbacks</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>ids</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenTransformFeedbacksNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>ids</name></param> >+ <alias name="glGenTransformFeedbacks"/> >+ </command> >+ <command> >+ <proto>void <name>glGenVertexArrays</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>arrays</name></param> >+ <glx type="single" opcode="206"/> >+ </command> >+ <command> >+ <proto>void <name>glGenVertexArraysAPPLE</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>arrays</name></param> >+ <alias name="glGenVertexArrays"/> >+ </command> >+ <command> >+ <proto>void <name>glGenVertexArraysOES</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n"><ptype>GLuint</ptype> *<name>arrays</name></param> >+ <alias name="glGenVertexArrays"/> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glGenVertexShadersEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>range</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenerateMipmap</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <glx type="render" opcode="4325"/> >+ </command> >+ <command> >+ <proto>void <name>glGenerateMipmapEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <alias name="glGenerateMipmap"/> >+ <glx type="render" opcode="4325"/> >+ </command> >+ <command> >+ <proto>void <name>glGenerateMipmapOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenerateMultiTexMipmapEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenerateTextureMipmap</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGenerateTextureMipmapEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetActiveAtomicCounterBufferiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>bufferIndex</name></param> >+ <param group="AtomicCounterBufferPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetActiveAttrib</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>size</name></param> >+ <param group="AttributeType" len="1"><ptype>GLenum</ptype> *<name>type</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetActiveAttribARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>programObj</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>maxLength</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>size</name></param> >+ <param len="1" group="AttributeType"><ptype>GLenum</ptype> *<name>type</name></param> >+ <param len="maxLength"><ptype>GLcharARB</ptype> *<name>name</name></param> >+ <alias name="glGetActiveAttrib"/> >+ </command> >+ <command> >+ <proto>void <name>glGetActiveSubroutineName</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>shadertype</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufsize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufsize"><ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetActiveSubroutineUniformName</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>shadertype</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufsize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufsize"><ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetActiveSubroutineUniformiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>shadertype</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="SubroutineParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetActiveUniform</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>size</name></param> >+ <param len="1" group="AttributeType"><ptype>GLenum</ptype> *<name>type</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetActiveUniformARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>programObj</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>maxLength</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>size</name></param> >+ <param len="1" group="AttributeType"><ptype>GLenum</ptype> *<name>type</name></param> >+ <param len="maxLength"><ptype>GLcharARB</ptype> *<name>name</name></param> >+ <alias name="glGetActiveUniform"/> >+ </command> >+ <command> >+ <proto>void <name>glGetActiveUniformBlockName</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>uniformBlockIndex</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>uniformBlockName</name></param> >+ <glx type="single" opcode="220"/> >+ </command> >+ <command> >+ <proto>void <name>glGetActiveUniformBlockiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>uniformBlockIndex</name></param> >+ <param group="UniformBlockPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(program,uniformBlockIndex,pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="219"/> >+ </command> >+ <command> >+ <proto>void <name>glGetActiveUniformName</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>uniformIndex</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>uniformName</name></param> >+ <glx type="single" opcode="217"/> >+ </command> >+ <command> >+ <proto>void <name>glGetActiveUniformsiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLsizei</ptype> <name>uniformCount</name></param> >+ <param len="uniformCount">const <ptype>GLuint</ptype> *<name>uniformIndices</name></param> >+ <param group="UniformPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(uniformCount,pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="216"/> >+ </command> >+ <command> >+ <proto>void <name>glGetActiveVaryingNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>size</name></param> >+ <param len="1"><ptype>GLenum</ptype> *<name>type</name></param> >+ <param len="COMPSIZE(program,index,bufSize)"><ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetArrayObjectfvATI</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>array</name></param> >+ <param group="ArrayObjectPNameATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetArrayObjectivATI</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>array</name></param> >+ <param group="ArrayObjectPNameATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command comment="Could be an alias of glGetAttachedShaders except that GLhandleARB is different on MacOS X"> >+ <proto>void <name>glGetAttachedObjectsARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>containerObj</name></param> >+ <param><ptype>GLsizei</ptype> <name>maxCount</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>count</name></param> >+ <param group="handleARB" len="maxCount"><ptype>GLhandleARB</ptype> *<name>obj</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetAttachedShaders</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLsizei</ptype> <name>maxCount</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>count</name></param> >+ <param len="maxCount"><ptype>GLuint</ptype> *<name>shaders</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetAttribLocation</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetAttribLocationARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>programObj</name></param> >+ <param>const <ptype>GLcharARB</ptype> *<name>name</name></param> >+ <alias name="glGetAttribLocation"/> >+ </command> >+ <command> >+ <proto>void <name>glGetBooleanIndexedvEXT</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="Boolean" len="COMPSIZE(target)"><ptype>GLboolean</ptype> *<name>data</name></param> >+ <alias name="glGetBooleani_v"/> >+ <glx type="single" opcode="210"/> >+ </command> >+ <command> >+ <proto>void <name>glGetBooleani_v</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="Boolean" len="COMPSIZE(target)"><ptype>GLboolean</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetBooleanv</name></proto> >+ <param group="GetPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="Boolean" len="COMPSIZE(pname)"><ptype>GLboolean</ptype> *<name>data</name></param> >+ <glx type="single" opcode="112"/> >+ </command> >+ <command> >+ <proto>void <name>glGetBufferParameteri64v</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferPNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint64</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetBufferParameteriv</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferPNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetBufferParameterivARB</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferPNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetBufferParameteriv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetBufferParameterui64vNV</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint64EXT</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetBufferPointerv</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferPointerNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1">void **<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetBufferPointervARB</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferPointerNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1">void **<name>params</name></param> >+ <alias name="glGetBufferPointerv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetBufferPointervOES</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferPointerNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param>void **<name>params</name></param> >+ <alias name="glGetBufferPointerv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetBufferSubData</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param len="size">void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetBufferSubDataARB</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferOffsetARB"><ptype>GLintptrARB</ptype> <name>offset</name></param> >+ <param group="BufferSizeARB"><ptype>GLsizeiptrARB</ptype> <name>size</name></param> >+ <param len="size">void *<name>data</name></param> >+ <alias name="glGetBufferSubData"/> >+ </command> >+ <command> >+ <proto>void <name>glGetClipPlane</name></proto> >+ <param group="ClipPlaneName"><ptype>GLenum</ptype> <name>plane</name></param> >+ <param len="4"><ptype>GLdouble</ptype> *<name>equation</name></param> >+ <glx type="single" opcode="113"/> >+ </command> >+ <command> >+ <proto>void <name>glGetClipPlanef</name></proto> >+ <param group="ClipPlaneName"><ptype>GLenum</ptype> <name>plane</name></param> >+ <param len="4"><ptype>GLfloat</ptype> *<name>equation</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetClipPlanefOES</name></proto> >+ <param group="ClipPlaneName"><ptype>GLenum</ptype> <name>plane</name></param> >+ <param len="4"><ptype>GLfloat</ptype> *<name>equation</name></param> >+ <glx type="vendor" opcode="1421"/> >+ </command> >+ <command> >+ <proto>void <name>glGetClipPlanex</name></proto> >+ <param group="ClipPlaneName"><ptype>GLenum</ptype> <name>plane</name></param> >+ <param len="4"><ptype>GLfixed</ptype> *<name>equation</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetClipPlanexOES</name></proto> >+ <param group="ClipPlaneName"><ptype>GLenum</ptype> <name>plane</name></param> >+ <param len="4"><ptype>GLfixed</ptype> *<name>equation</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetColorTable</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>table</name></param> >+ <glx type="single" opcode="147"/> >+ <glx type="render" opcode="334" name="glGetColorTablePBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glGetColorTableEXT</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>data</name></param> >+ <alias name="glGetColorTable"/> >+ </command> >+ <command> >+ <proto>void <name>glGetColorTableParameterfv</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetColorTableParameterPNameSGI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="single" opcode="148"/> >+ </command> >+ <command> >+ <proto>void <name>glGetColorTableParameterfvEXT</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetColorTableParameterPNameSGI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <alias name="glGetColorTableParameterfv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetColorTableParameterfvSGI</name></proto> >+ <param group="ColorTableTargetSGI"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetColorTableParameterPNameSGI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="4099"/> >+ </command> >+ <command> >+ <proto>void <name>glGetColorTableParameteriv</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetColorTableParameterPNameSGI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="149"/> >+ </command> >+ <command> >+ <proto>void <name>glGetColorTableParameterivEXT</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetColorTableParameterPNameSGI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetColorTableParameteriv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetColorTableParameterivSGI</name></proto> >+ <param group="ColorTableTargetSGI"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetColorTableParameterPNameSGI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="4100"/> >+ </command> >+ <command> >+ <proto>void <name>glGetColorTableSGI</name></proto> >+ <param group="ColorTableTargetSGI"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>table</name></param> >+ <glx type="vendor" opcode="4098"/> >+ </command> >+ <command> >+ <proto>void <name>glGetCombinerInputParameterfvNV</name></proto> >+ <param group="CombinerStageNV"><ptype>GLenum</ptype> <name>stage</name></param> >+ <param group="CombinerPortionNV"><ptype>GLenum</ptype> <name>portion</name></param> >+ <param group="CombinerVariableNV"><ptype>GLenum</ptype> <name>variable</name></param> >+ <param group="CombinerParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1270"/> >+ </command> >+ <command> >+ <proto>void <name>glGetCombinerInputParameterivNV</name></proto> >+ <param group="CombinerStageNV"><ptype>GLenum</ptype> <name>stage</name></param> >+ <param group="CombinerPortionNV"><ptype>GLenum</ptype> <name>portion</name></param> >+ <param group="CombinerVariableNV"><ptype>GLenum</ptype> <name>variable</name></param> >+ <param group="CombinerParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1271"/> >+ </command> >+ <command> >+ <proto>void <name>glGetCombinerOutputParameterfvNV</name></proto> >+ <param group="CombinerStageNV"><ptype>GLenum</ptype> <name>stage</name></param> >+ <param group="CombinerPortionNV"><ptype>GLenum</ptype> <name>portion</name></param> >+ <param group="CombinerParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1272"/> >+ </command> >+ <command> >+ <proto>void <name>glGetCombinerOutputParameterivNV</name></proto> >+ <param group="CombinerStageNV"><ptype>GLenum</ptype> <name>stage</name></param> >+ <param group="CombinerPortionNV"><ptype>GLenum</ptype> <name>portion</name></param> >+ <param group="CombinerParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1273"/> >+ </command> >+ <command> >+ <proto>void <name>glGetCombinerStageParameterfvNV</name></proto> >+ <param group="CombinerStageNV"><ptype>GLenum</ptype> <name>stage</name></param> >+ <param group="CombinerParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glGetCommandHeaderNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>tokenID</name></param> >+ <param><ptype>GLuint</ptype> <name>size</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetCompressedMultiTexImageEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>lod</name></param> >+ <param len="COMPSIZE(target,lod)">void *<name>img</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetCompressedTexImage</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CompressedTextureARB" len="COMPSIZE(target,level)">void *<name>img</name></param> >+ <glx type="single" opcode="160"/> >+ <glx type="render" opcode="335" name="glGetCompressedTexImagePBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glGetCompressedTexImageARB</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CompressedTextureARB" len="COMPSIZE(target,level)">void *<name>img</name></param> >+ <alias name="glGetCompressedTexImage"/> >+ <glx type="single" opcode="160"/> >+ </command> >+ <command> >+ <proto>void <name>glGetCompressedTextureImage</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param>void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetCompressedTextureImageEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>lod</name></param> >+ <param len="COMPSIZE(target,lod)">void *<name>img</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetCompressedTextureSubImage</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param>void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetConvolutionFilter</name></proto> >+ <param group="ConvolutionTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>image</name></param> >+ <glx type="single" opcode="150"/> >+ <glx type="render" opcode="336" name="glGetConvolutionFilterPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glGetConvolutionFilterEXT</name></proto> >+ <param group="ConvolutionTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>image</name></param> >+ <glx type="vendor" opcode="1"/> >+ </command> >+ <command> >+ <proto>void <name>glGetConvolutionParameterfv</name></proto> >+ <param group="ConvolutionTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ConvolutionParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="single" opcode="151"/> >+ </command> >+ <command> >+ <proto>void <name>glGetConvolutionParameterfvEXT</name></proto> >+ <param group="ConvolutionTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ConvolutionParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="2"/> >+ </command> >+ <command> >+ <proto>void <name>glGetConvolutionParameteriv</name></proto> >+ <param group="ConvolutionTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ConvolutionParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="152"/> >+ </command> >+ <command> >+ <proto>void <name>glGetConvolutionParameterivEXT</name></proto> >+ <param group="ConvolutionTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ConvolutionParameterEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="3"/> >+ </command> >+ <command> >+ <proto>void <name>glGetConvolutionParameterxvOES</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetCoverageModulationTableNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>bufsize</name></param> >+ <param><ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glGetDebugMessageLog</name></proto> >+ <param><ptype>GLuint</ptype> <name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="count" group="DebugSource"><ptype>GLenum</ptype> *<name>sources</name></param> >+ <param len="count" group="DebugType"><ptype>GLenum</ptype> *<name>types</name></param> >+ <param len="count"><ptype>GLuint</ptype> *<name>ids</name></param> >+ <param len="count" group="DebugSeverity"><ptype>GLenum</ptype> *<name>severities</name></param> >+ <param len="count"><ptype>GLsizei</ptype> *<name>lengths</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>messageLog</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glGetDebugMessageLogAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufsize</name></param> >+ <param len="count"><ptype>GLenum</ptype> *<name>categories</name></param> >+ <param len="count" group="DebugSeverity"><ptype>GLuint</ptype> *<name>severities</name></param> >+ <param len="count"><ptype>GLuint</ptype> *<name>ids</name></param> >+ <param len="count"><ptype>GLsizei</ptype> *<name>lengths</name></param> >+ <param len="bufsize"><ptype>GLchar</ptype> *<name>message</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glGetDebugMessageLogARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="count" group="DebugSource"><ptype>GLenum</ptype> *<name>sources</name></param> >+ <param len="count" group="DebugType"><ptype>GLenum</ptype> *<name>types</name></param> >+ <param len="count"><ptype>GLuint</ptype> *<name>ids</name></param> >+ <param len="count" group="DebugSeverity"><ptype>GLenum</ptype> *<name>severities</name></param> >+ <param len="count"><ptype>GLsizei</ptype> *<name>lengths</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>messageLog</name></param> >+ <alias name="glGetDebugMessageLog"/> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glGetDebugMessageLogKHR</name></proto> >+ <param><ptype>GLuint</ptype> <name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="count" group="DebugSource"><ptype>GLenum</ptype> *<name>sources</name></param> >+ <param len="count" group="DebugType"><ptype>GLenum</ptype> *<name>types</name></param> >+ <param len="count"><ptype>GLuint</ptype> *<name>ids</name></param> >+ <param len="count" group="DebugSeverity"><ptype>GLenum</ptype> *<name>severities</name></param> >+ <param len="count"><ptype>GLsizei</ptype> *<name>lengths</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>messageLog</name></param> >+ <alias name="glGetDebugMessageLog"/> >+ </command> >+ <command> >+ <proto>void <name>glGetDetailTexFuncSGIS</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param len="COMPSIZE(target)"><ptype>GLfloat</ptype> *<name>points</name></param> >+ <glx type="vendor" opcode="4096"/> >+ </command> >+ <command> >+ <proto>void <name>glGetDoubleIndexedvEXT</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(target)"><ptype>GLdouble</ptype> *<name>data</name></param> >+ <alias name="glGetDoublei_v"/> >+ </command> >+ <command> >+ <proto>void <name>glGetDoublei_v</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(target)"><ptype>GLdouble</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetDoublei_vEXT</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLdouble</ptype> *<name>params</name></param> >+ <alias name="glGetDoublei_v"/> >+ </command> >+ <command> >+ <proto>void <name>glGetDoublev</name></proto> >+ <param group="GetPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLdouble</ptype> *<name>data</name></param> >+ <glx type="single" opcode="114"/> >+ </command> >+ <command> >+ <proto>void <name>glGetDriverControlStringQCOM</name></proto> >+ <param><ptype>GLuint</ptype> <name>driverControl</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>driverControlString</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetDriverControlsQCOM</name></proto> >+ <param><ptype>GLint</ptype> *<name>num</name></param> >+ <param><ptype>GLsizei</ptype> <name>size</name></param> >+ <param len="size"><ptype>GLuint</ptype> *<name>driverControls</name></param> >+ </command> >+ <command> >+ <proto group="ErrorCode"><ptype>GLenum</ptype> <name>glGetError</name></proto> >+ <glx type="single" opcode="115"/> >+ </command> >+ <command> >+ <proto>void <name>glGetFenceivNV</name></proto> >+ <param group="FenceNV"><ptype>GLuint</ptype> <name>fence</name></param> >+ <param group="FenceParameterNameNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1280"/> >+ </command> >+ <command> >+ <proto>void <name>glGetFinalCombinerInputParameterfvNV</name></proto> >+ <param group="CombinerVariableNV"><ptype>GLenum</ptype> <name>variable</name></param> >+ <param group="CombinerParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1274"/> >+ </command> >+ <command> >+ <proto>void <name>glGetFinalCombinerInputParameterivNV</name></proto> >+ <param group="CombinerVariableNV"><ptype>GLenum</ptype> <name>variable</name></param> >+ <param group="CombinerParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1275"/> >+ </command> >+ <command> >+ <proto>void <name>glGetFirstPerfQueryIdINTEL</name></proto> >+ <param><ptype>GLuint</ptype> *<name>queryId</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetFixedv</name></proto> >+ <param group="GetPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetFixedvOES</name></proto> >+ <param group="GetPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetFloatIndexedvEXT</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(target)"><ptype>GLfloat</ptype> *<name>data</name></param> >+ <alias name="glGetFloati_v"/> >+ </command> >+ <command> >+ <proto>void <name>glGetFloati_v</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(target)"><ptype>GLfloat</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetFloati_vEXT</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <alias name="glGetFloati_v"/> >+ </command> >+ <command> >+ <proto>void <name>glGetFloati_vNV</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(target)"><ptype>GLfloat</ptype> *<name>data</name></param> >+ <alias name="glGetFloati_v"/> >+ </command> >+ <command> >+ <proto>void <name>glGetFloati_vOES</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(target)"><ptype>GLfloat</ptype> *<name>data</name></param> >+ <alias name="glGetFloati_v"/> >+ </command> >+ <command> >+ <proto>void <name>glGetFloatv</name></proto> >+ <param group="GetPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>data</name></param> >+ <glx type="single" opcode="116"/> >+ </command> >+ <command> >+ <proto>void <name>glGetFogFuncSGIS</name></proto> >+ <param len="COMPSIZE()"><ptype>GLfloat</ptype> *<name>points</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetFragDataIndex</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetFragDataIndexEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>name</name></param> >+ <alias name="glGetFragDataIndex"/> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetFragDataLocation</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param len="COMPSIZE(name)">const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetFragDataLocationEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param len="COMPSIZE(name)">const <ptype>GLchar</ptype> *<name>name</name></param> >+ <alias name="glGetFragDataLocation"/> >+ </command> >+ <command> >+ <proto>void <name>glGetFragmentLightfvSGIX</name></proto> >+ <param group="FragmentLightNameSGIX"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="FragmentLightParameterSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetFragmentLightivSGIX</name></proto> >+ <param group="FragmentLightNameSGIX"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="FragmentLightParameterSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetFragmentMaterialfvSGIX</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetFragmentMaterialivSGIX</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetFramebufferAttachmentParameteriv</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="FramebufferAttachmentParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1428"/> >+ </command> >+ <command> >+ <proto>void <name>glGetFramebufferAttachmentParameterivEXT</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="FramebufferAttachmentParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetFramebufferAttachmentParameteriv"/> >+ <glx type="vendor" opcode="1428"/> >+ </command> >+ <command> >+ <proto>void <name>glGetFramebufferAttachmentParameterivOES</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="FramebufferAttachmentParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetFramebufferParameterfvAMD</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachmentParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> <name>numsamples</name></param> >+ <param><ptype>GLuint</ptype> <name>pixelindex</name></param> >+ <param><ptype>GLsizei</ptype> <name>size</name></param> >+ <param><ptype>GLfloat</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetFramebufferParameteriv</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="FramebufferAttachmentParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetFramebufferParameterivEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="GetFramebufferParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLsizei</ptype> <name>glGetFramebufferPixelLocalStorageSizeEXT</name></proto> >+ <param group="FramebufferTarget"><ptype>GLuint</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto group="GraphicsResetStatus"><ptype>GLenum</ptype> <name>glGetGraphicsResetStatus</name></proto> >+ </command> >+ <command> >+ <proto group="GraphicsResetStatus"><ptype>GLenum</ptype> <name>glGetGraphicsResetStatusARB</name></proto> >+ </command> >+ <command> >+ <proto group="GraphicsResetStatus"><ptype>GLenum</ptype> <name>glGetGraphicsResetStatusEXT</name></proto> >+ </command> >+ <command> >+ <proto group="GraphicsResetStatus"><ptype>GLenum</ptype> <name>glGetGraphicsResetStatusKHR</name></proto> >+ <alias name="glGetGraphicsResetStatus"/> >+ </command> >+ <command> >+ <proto group="handleARB"><ptype>GLhandleARB</ptype> <name>glGetHandleARB</name></proto> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetHistogram</name></proto> >+ <param group="HistogramTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>reset</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>values</name></param> >+ <glx type="single" opcode="154"/> >+ <glx type="render" opcode="337" name="glGetHistogramPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glGetHistogramEXT</name></proto> >+ <param group="HistogramTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>reset</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>values</name></param> >+ <glx type="vendor" opcode="5"/> >+ </command> >+ <command> >+ <proto>void <name>glGetHistogramParameterfv</name></proto> >+ <param group="HistogramTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetHistogramParameterPNameEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="single" opcode="155"/> >+ </command> >+ <command> >+ <proto>void <name>glGetHistogramParameterfvEXT</name></proto> >+ <param group="HistogramTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetHistogramParameterPNameEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="6"/> >+ </command> >+ <command> >+ <proto>void <name>glGetHistogramParameteriv</name></proto> >+ <param group="HistogramTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetHistogramParameterPNameEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="156"/> >+ </command> >+ <command> >+ <proto>void <name>glGetHistogramParameterivEXT</name></proto> >+ <param group="HistogramTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetHistogramParameterPNameEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="7"/> >+ </command> >+ <command> >+ <proto>void <name>glGetHistogramParameterxvOES</name></proto> >+ <param group="HistogramTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetHistogramParameterPNameEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint64</ptype> <name>glGetImageHandleARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLboolean</ptype> <name>layered</name></param> >+ <param><ptype>GLint</ptype> <name>layer</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint64</ptype> <name>glGetImageHandleNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>layered</name></param> >+ <param><ptype>GLint</ptype> <name>layer</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetImageTransformParameterfvHP</name></proto> >+ <param group="ImageTransformTargetHP"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ImageTransformPNameHP"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetImageTransformParameterivHP</name></proto> >+ <param group="ImageTransformTargetHP"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ImageTransformPNameHP"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetInfoLogARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>obj</name></param> >+ <param><ptype>GLsizei</ptype> <name>maxLength</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="maxLength"><ptype>GLcharARB</ptype> *<name>infoLog</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetInstrumentsSGIX</name></proto> >+ <glx type="vendor" opcode="4102"/> >+ </command> >+ <command> >+ <proto>void <name>glGetInteger64i_v</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(target)"><ptype>GLint64</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetInteger64v</name></proto> >+ <param group="GetPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint64</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetInteger64vAPPLE</name></proto> >+ <param group="GetPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint64</ptype> *<name>params</name></param> >+ <alias name="glGetInteger64v"/> >+ </command> >+ <command> >+ <proto>void <name>glGetIntegerIndexedvEXT</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(target)"><ptype>GLint</ptype> *<name>data</name></param> >+ <alias name="glGetIntegeri_v"/> >+ <glx type="single" opcode="211"/> >+ </command> >+ <command> >+ <proto>void <name>glGetIntegeri_v</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(target)"><ptype>GLint</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetIntegeri_vEXT</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetIntegerui64i_vNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>value</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(value)"><ptype>GLuint64EXT</ptype> *<name>result</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetIntegerui64vNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>value</name></param> >+ <param len="COMPSIZE(value)"><ptype>GLuint64EXT</ptype> *<name>result</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetIntegerv</name></proto> >+ <param group="GetPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>data</name></param> >+ <glx type="single" opcode="117"/> >+ </command> >+ <command> >+ <proto>void <name>glGetInternalformatSampleivNV</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormatPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetInternalformati64v</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="InternalFormatPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLint64</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetInternalformativ</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="InternalFormatPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetInvariantBooleanvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="GetVariantValueEXT"><ptype>GLenum</ptype> <name>value</name></param> >+ <param group="Boolean" len="COMPSIZE(id)"><ptype>GLboolean</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetInvariantFloatvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="GetVariantValueEXT"><ptype>GLenum</ptype> <name>value</name></param> >+ <param len="COMPSIZE(id)"><ptype>GLfloat</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetInvariantIntegervEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="GetVariantValueEXT"><ptype>GLenum</ptype> <name>value</name></param> >+ <param len="COMPSIZE(id)"><ptype>GLint</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetLightfv</name></proto> >+ <param group="LightName"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="LightParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="single" opcode="118"/> >+ </command> >+ <command> >+ <proto>void <name>glGetLightiv</name></proto> >+ <param group="LightName"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="LightParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="119"/> >+ </command> >+ <command> >+ <proto>void <name>glGetLightxOES</name></proto> >+ <param group="LightName"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="LightParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetLightxv</name></proto> >+ <param group="LightName"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="LightParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetLightxvOES</name></proto> >+ <param group="LightName"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="LightParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetListParameterfvSGIX</name></proto> >+ <param group="List"><ptype>GLuint</ptype> <name>list</name></param> >+ <param group="ListParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetListParameterivSGIX</name></proto> >+ <param group="List"><ptype>GLuint</ptype> <name>list</name></param> >+ <param group="ListParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetLocalConstantBooleanvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="GetVariantValueEXT"><ptype>GLenum</ptype> <name>value</name></param> >+ <param group="Boolean" len="COMPSIZE(id)"><ptype>GLboolean</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetLocalConstantFloatvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="GetVariantValueEXT"><ptype>GLenum</ptype> <name>value</name></param> >+ <param len="COMPSIZE(id)"><ptype>GLfloat</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetLocalConstantIntegervEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="GetVariantValueEXT"><ptype>GLenum</ptype> <name>value</name></param> >+ <param len="COMPSIZE(id)"><ptype>GLint</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMapAttribParameterfvNV</name></proto> >+ <param group="EvalTargetNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="MapAttribParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMapAttribParameterivNV</name></proto> >+ <param group="EvalTargetNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="MapAttribParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMapControlPointsNV</name></proto> >+ <param group="EvalTargetNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="MapTypeNV"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>ustride</name></param> >+ <param><ptype>GLsizei</ptype> <name>vstride</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>packed</name></param> >+ <param len="COMPSIZE(target)">void *<name>points</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMapParameterfvNV</name></proto> >+ <param group="EvalTargetNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="MapParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(target,pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMapParameterivNV</name></proto> >+ <param group="EvalTargetNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="MapParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(target,pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMapdv</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetMapQuery"><ptype>GLenum</ptype> <name>query</name></param> >+ <param len="COMPSIZE(target,query)"><ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="single" opcode="120"/> >+ </command> >+ <command> >+ <proto>void <name>glGetMapfv</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetMapQuery"><ptype>GLenum</ptype> <name>query</name></param> >+ <param len="COMPSIZE(target,query)"><ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="single" opcode="121"/> >+ </command> >+ <command> >+ <proto>void <name>glGetMapiv</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetMapQuery"><ptype>GLenum</ptype> <name>query</name></param> >+ <param len="COMPSIZE(target,query)"><ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="single" opcode="122"/> >+ </command> >+ <command> >+ <proto>void <name>glGetMapxvOES</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetMapQuery"><ptype>GLenum</ptype> <name>query</name></param> >+ <param len="COMPSIZE(query)"><ptype>GLfixed</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMaterialfv</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="single" opcode="123"/> >+ </command> >+ <command> >+ <proto>void <name>glGetMaterialiv</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="124"/> >+ </command> >+ <command> >+ <proto>void <name>glGetMaterialxOES</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMaterialxv</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMaterialxvOES</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMemoryObjectParameterivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>memoryObject</name></param> >+ <param group="MemoryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMinmax</name></proto> >+ <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>reset</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>values</name></param> >+ <glx type="single" opcode="157"/> >+ <glx type="render" opcode="338" name="glGetMinmaxPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glGetMinmaxEXT</name></proto> >+ <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>reset</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>values</name></param> >+ <glx type="vendor" opcode="8"/> >+ </command> >+ <command> >+ <proto>void <name>glGetMinmaxParameterfv</name></proto> >+ <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetMinmaxParameterPNameEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="single" opcode="158"/> >+ </command> >+ <command> >+ <proto>void <name>glGetMinmaxParameterfvEXT</name></proto> >+ <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetMinmaxParameterPNameEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="9"/> >+ </command> >+ <command> >+ <proto>void <name>glGetMinmaxParameteriv</name></proto> >+ <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetMinmaxParameterPNameEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="159"/> >+ </command> >+ <command> >+ <proto>void <name>glGetMinmaxParameterivEXT</name></proto> >+ <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetMinmaxParameterPNameEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="10"/> >+ </command> >+ <command> >+ <proto>void <name>glGetMultiTexEnvfvEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultiTexEnvivEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultiTexGendvEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultiTexGenfvEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultiTexGenivEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultiTexImageEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,level,format,type)">void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultiTexLevelParameterfvEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultiTexLevelParameterivEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultiTexParameterIivEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultiTexParameterIuivEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultiTexParameterfvEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultiTexParameterivEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultisamplefv</name></proto> >+ <param group="GetMultisamplePNameNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>val</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultisamplefvNV</name></proto> >+ <param group="GetMultisamplePNameNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2"><ptype>GLfloat</ptype> *<name>val</name></param> >+ <alias name="glGetMultisamplefv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedBufferParameteri64v</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="VertexBufferObjectParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint64</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedBufferParameteriv</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="VertexBufferObjectParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedBufferParameterivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="VertexBufferObjectParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedBufferParameterui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="VertexBufferObjectParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint64EXT</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedBufferPointerv</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="VertexBufferObjectParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param>void **<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedBufferPointervEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="VertexBufferObjectParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1">void **<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedBufferSubData</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param>void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedBufferSubDataEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param len="COMPSIZE(size)">void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedFramebufferParameterfvAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> <name>numsamples</name></param> >+ <param><ptype>GLuint</ptype> <name>pixelindex</name></param> >+ <param><ptype>GLsizei</ptype> <name>size</name></param> >+ <param><ptype>GLfloat</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedFramebufferAttachmentParameteriv</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="FramebufferAttachmentParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedFramebufferAttachmentParameterivEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="FramebufferAttachmentParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedFramebufferParameteriv</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="GetFramebufferParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedFramebufferParameterivEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="GetFramebufferParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedProgramLocalParameterIivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedProgramLocalParameterIuivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4"><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedProgramLocalParameterdvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4"><ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedProgramLocalParameterfvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedProgramStringEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ProgramStringProperty"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(program,pname)">void *<name>string</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedProgramivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ProgramPropertyARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedRenderbufferParameteriv</name></proto> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ <param group="RenderbufferParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedRenderbufferParameterivEXT</name></proto> >+ <param group="Renderbuffer"><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ <param group="RenderbufferParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedStringARB</name></proto> >+ <param><ptype>GLint</ptype> <name>namelen</name></param> >+ <param len="namelen">const <ptype>GLchar</ptype> *<name>name</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>stringlen</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>string</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNamedStringivARB</name></proto> >+ <param><ptype>GLint</ptype> <name>namelen</name></param> >+ <param len="namelen">const <ptype>GLchar</ptype> *<name>name</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetNextPerfQueryIdINTEL</name></proto> >+ <param><ptype>GLuint</ptype> <name>queryId</name></param> >+ <param><ptype>GLuint</ptype> *<name>nextQueryId</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetObjectBufferfvATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="ArrayObjectPNameATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetObjectBufferivATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="ArrayObjectPNameATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetObjectLabel</name></proto> >+ <param><ptype>GLenum</ptype> <name>identifier</name></param> >+ <param><ptype>GLuint</ptype> <name>name</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>label</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetObjectLabelEXT</name></proto> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>object</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>label</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetObjectLabelKHR</name></proto> >+ <param><ptype>GLenum</ptype> <name>identifier</name></param> >+ <param><ptype>GLuint</ptype> <name>name</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>label</name></param> >+ <alias name="glGetObjectLabel"/> >+ </command> >+ <command> >+ <proto>void <name>glGetObjectParameterfvARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>obj</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetObjectParameterivAPPLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>objectType</name></param> >+ <param><ptype>GLuint</ptype> <name>name</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetObjectParameterivARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>obj</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetObjectPtrLabel</name></proto> >+ <param>const void *<name>ptr</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>label</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetObjectPtrLabelKHR</name></proto> >+ <param>const void *<name>ptr</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>label</name></param> >+ <alias name="glGetObjectPtrLabel"/> >+ </command> >+ <command> >+ <proto>void <name>glGetOcclusionQueryivNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="OcclusionQueryParameterNameNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetOcclusionQueryuivNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="OcclusionQueryParameterNameNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPathColorGenfvNV</name></proto> >+ <param group="PathColor"><ptype>GLenum</ptype> <name>color</name></param> >+ <param group="PathGenMode"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPathColorGenivNV</name></proto> >+ <param group="PathColor"><ptype>GLenum</ptype> <name>color</name></param> >+ <param group="PathGenMode"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPathCommandsNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param group="PathCommand" len="COMPSIZE(path)"><ptype>GLubyte</ptype> *<name>commands</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPathCoordsNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param len="COMPSIZE(path)"><ptype>GLfloat</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPathDashArrayNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param len="COMPSIZE(path)"><ptype>GLfloat</ptype> *<name>dashArray</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLfloat</ptype> <name>glGetPathLengthNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLsizei</ptype> <name>startSegment</name></param> >+ <param><ptype>GLsizei</ptype> <name>numSegments</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPathMetricRangeNV</name></proto> >+ <param group="PathMetricMask"><ptype>GLbitfield</ptype> <name>metricQueryMask</name></param> >+ <param group="Path"><ptype>GLuint</ptype> <name>firstPathName</name></param> >+ <param><ptype>GLsizei</ptype> <name>numPaths</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(metricQueryMask,numPaths,stride)"><ptype>GLfloat</ptype> *<name>metrics</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPathMetricsNV</name></proto> >+ <param group="PathMetricMask"><ptype>GLbitfield</ptype> <name>metricQueryMask</name></param> >+ <param><ptype>GLsizei</ptype> <name>numPaths</name></param> >+ <param group="PathElementType"><ptype>GLenum</ptype> <name>pathNameType</name></param> >+ <param group="PathElement" len="COMPSIZE(numPaths,pathNameType,paths)">const void *<name>paths</name></param> >+ <param group="Path"><ptype>GLuint</ptype> <name>pathBase</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(metricQueryMask,numPaths,stride)"><ptype>GLfloat</ptype> *<name>metrics</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPathParameterfvNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param group="PathParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="4"><ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPathParameterivNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param group="PathParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="4"><ptype>GLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPathSpacingNV</name></proto> >+ <param group="PathListMode"><ptype>GLenum</ptype> <name>pathListMode</name></param> >+ <param><ptype>GLsizei</ptype> <name>numPaths</name></param> >+ <param group="PathElementType"><ptype>GLenum</ptype> <name>pathNameType</name></param> >+ <param group="PathElement" len="COMPSIZE(numPaths,pathNameType,paths)">const void *<name>paths</name></param> >+ <param group="Path"><ptype>GLuint</ptype> <name>pathBase</name></param> >+ <param><ptype>GLfloat</ptype> <name>advanceScale</name></param> >+ <param><ptype>GLfloat</ptype> <name>kerningScale</name></param> >+ <param group="PathTransformType"><ptype>GLenum</ptype> <name>transformType</name></param> >+ <param len="COMPSIZE(pathListMode,numPaths)"><ptype>GLfloat</ptype> *<name>returnedSpacing</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPathTexGenfvNV</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texCoordSet</name></param> >+ <param group="PathGenMode"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPathTexGenivNV</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texCoordSet</name></param> >+ <param group="PathGenMode"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPerfCounterInfoINTEL</name></proto> >+ <param><ptype>GLuint</ptype> <name>queryId</name></param> >+ <param><ptype>GLuint</ptype> <name>counterId</name></param> >+ <param><ptype>GLuint</ptype> <name>counterNameLength</name></param> >+ <param><ptype>GLchar</ptype> *<name>counterName</name></param> >+ <param><ptype>GLuint</ptype> <name>counterDescLength</name></param> >+ <param><ptype>GLchar</ptype> *<name>counterDesc</name></param> >+ <param><ptype>GLuint</ptype> *<name>counterOffset</name></param> >+ <param><ptype>GLuint</ptype> *<name>counterDataSize</name></param> >+ <param><ptype>GLuint</ptype> *<name>counterTypeEnum</name></param> >+ <param><ptype>GLuint</ptype> *<name>counterDataTypeEnum</name></param> >+ <param><ptype>GLuint64</ptype> *<name>rawCounterMaxValue</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPerfMonitorCounterDataAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>monitor</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>dataSize</name></param> >+ <param len="dataSize"><ptype>GLuint</ptype> *<name>data</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>bytesWritten</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPerfMonitorCounterInfoAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>group</name></param> >+ <param><ptype>GLuint</ptype> <name>counter</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPerfMonitorCounterStringAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>group</name></param> >+ <param><ptype>GLuint</ptype> <name>counter</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>counterString</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPerfMonitorCountersAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>group</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>numCounters</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>maxActiveCounters</name></param> >+ <param><ptype>GLsizei</ptype> <name>counterSize</name></param> >+ <param len="counterSize"><ptype>GLuint</ptype> *<name>counters</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPerfMonitorGroupStringAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>group</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>groupString</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPerfMonitorGroupsAMD</name></proto> >+ <param len="1"><ptype>GLint</ptype> *<name>numGroups</name></param> >+ <param><ptype>GLsizei</ptype> <name>groupsSize</name></param> >+ <param len="groupsSize"><ptype>GLuint</ptype> *<name>groups</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPerfQueryDataINTEL</name></proto> >+ <param><ptype>GLuint</ptype> <name>queryHandle</name></param> >+ <param><ptype>GLuint</ptype> <name>flags</name></param> >+ <param><ptype>GLsizei</ptype> <name>dataSize</name></param> >+ <param>void *<name>data</name></param> >+ <param><ptype>GLuint</ptype> *<name>bytesWritten</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPerfQueryIdByNameINTEL</name></proto> >+ <param><ptype>GLchar</ptype> *<name>queryName</name></param> >+ <param><ptype>GLuint</ptype> *<name>queryId</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPerfQueryInfoINTEL</name></proto> >+ <param><ptype>GLuint</ptype> <name>queryId</name></param> >+ <param><ptype>GLuint</ptype> <name>queryNameLength</name></param> >+ <param><ptype>GLchar</ptype> *<name>queryName</name></param> >+ <param><ptype>GLuint</ptype> *<name>dataSize</name></param> >+ <param><ptype>GLuint</ptype> *<name>noCounters</name></param> >+ <param><ptype>GLuint</ptype> *<name>noInstances</name></param> >+ <param><ptype>GLuint</ptype> *<name>capsMask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPixelMapfv</name></proto> >+ <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param> >+ <param len="COMPSIZE(map)"><ptype>GLfloat</ptype> *<name>values</name></param> >+ <glx type="single" opcode="125"/> >+ <glx type="render" opcode="339" name="glGetPixelMapfvPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glGetPixelMapuiv</name></proto> >+ <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param> >+ <param len="COMPSIZE(map)"><ptype>GLuint</ptype> *<name>values</name></param> >+ <glx type="single" opcode="126"/> >+ <glx type="render" opcode="340" name="glGetPixelMapuivPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glGetPixelMapusv</name></proto> >+ <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param> >+ <param len="COMPSIZE(map)"><ptype>GLushort</ptype> *<name>values</name></param> >+ <glx type="single" opcode="127"/> >+ <glx type="render" opcode="341" name="glGetPixelMapusvPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glGetPixelMapxv</name></proto> >+ <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param len="size"><ptype>GLfixed</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPixelTexGenParameterfvSGIS</name></proto> >+ <param group="PixelTexGenParameterNameSGIS"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPixelTexGenParameterivSGIS</name></proto> >+ <param group="PixelTexGenParameterNameSGIS"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPixelTransformParameterfvEXT</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="2051"/> >+ </command> >+ <command> >+ <proto>void <name>glGetPixelTransformParameterivEXT</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="2052"/> >+ </command> >+ <command> >+ <proto>void <name>glGetPointerIndexedvEXT</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">void **<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPointeri_vEXT</name></proto> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">void **<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPointerv</name></proto> >+ <param group="GetPointervPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1">void **<name>params</name></param> >+ <glx type="single" opcode="208"/> >+ </command> >+ <command> >+ <proto>void <name>glGetPointervEXT</name></proto> >+ <param group="GetPointervPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1">void **<name>params</name></param> >+ <alias name="glGetPointerv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetPointervKHR</name></proto> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param>void **<name>params</name></param> >+ <alias name="glGetPointerv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetPolygonStipple</name></proto> >+ <param len="COMPSIZE()"><ptype>GLubyte</ptype> *<name>mask</name></param> >+ <glx type="single" opcode="128"/> >+ <glx type="render" opcode="342" name="glGetPolygonStipplePBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramBinary</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="1"><ptype>GLenum</ptype> *<name>binaryFormat</name></param> >+ <param len="bufSize">void *<name>binary</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramBinaryOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="1"><ptype>GLenum</ptype> *<name>binaryFormat</name></param> >+ <param len="bufSize">void *<name>binary</name></param> >+ <alias name="glGetProgramBinary"/> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramEnvParameterIivNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramEnvParameterIuivNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4"><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramEnvParameterdvARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4"><ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramEnvParameterfvARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramInfoLog</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>infoLog</name></param> >+ <glx type="single" opcode="201"/> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramInterfaceiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramInterface"><ptype>GLenum</ptype> <name>programInterface</name></param> >+ <param group="ProgramInterfacePName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramLocalParameterIivNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramLocalParameterIuivNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4"><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramLocalParameterdvARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4"><ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramLocalParameterfvARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramNamedParameterdvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLsizei</ptype> <name>len</name></param> >+ <param len="1">const <ptype>GLubyte</ptype> *<name>name</name></param> >+ <param len="4"><ptype>GLdouble</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1311"/> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramNamedParameterfvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLsizei</ptype> <name>len</name></param> >+ <param len="1">const <ptype>GLubyte</ptype> *<name>name</name></param> >+ <param len="4"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1310"/> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramParameterdvNV</name></proto> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="4"><ptype>GLdouble</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1297"/> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramParameterfvNV</name></proto> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="4"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1296"/> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramPipelineInfoLog</name></proto> >+ <param><ptype>GLuint</ptype> <name>pipeline</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>infoLog</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramPipelineInfoLogEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>pipeline</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>infoLog</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramPipelineiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>pipeline</name></param> >+ <param group="PipelineParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramPipelineivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>pipeline</name></param> >+ <param group="PipelineParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glGetProgramResourceIndex</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramInterface"><ptype>GLenum</ptype> <name>programInterface</name></param> >+ <param len="COMPSIZE(name)">const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetProgramResourceLocation</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramInterface"><ptype>GLenum</ptype> <name>programInterface</name></param> >+ <param len="COMPSIZE(name)">const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetProgramResourceLocationIndex</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramInterface"><ptype>GLenum</ptype> <name>programInterface</name></param> >+ <param len="COMPSIZE(name)">const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetProgramResourceLocationIndexEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramInterface"><ptype>GLenum</ptype> <name>programInterface</name></param> >+ <param len="COMPSIZE(name)">const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramResourceName</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramInterface"><ptype>GLenum</ptype> <name>programInterface</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramResourcefvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramInterface"><ptype>GLenum</ptype> <name>programInterface</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>propCount</name></param> >+ <param>const <ptype>GLenum</ptype> *<name>props</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramResourceiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramInterface"><ptype>GLenum</ptype> <name>programInterface</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>propCount</name></param> >+ <param len="propCount">const <ptype>GLenum</ptype> *<name>props</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramStageiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>shadertype</name></param> >+ <param group="ProgramStagePName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramStringARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ProgramStringPropertyARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(target,pname)">void *<name>string</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramStringNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="ProgramCharacterNV" len="COMPSIZE(id,pname)"><ptype>GLubyte</ptype> *<name>program</name></param> >+ <glx type="vendor" opcode="1299"/> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramSubroutineParameteruivNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(target)"><ptype>GLuint</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramPropertyARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="199"/> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramivARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ProgramPropertyARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramivNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="4"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1298"/> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryBufferObjecti64v</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryBufferObjectiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryBufferObjectui64v</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryBufferObjectuiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryIndexediv</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="QueryParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryObjecti64v</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint64</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryObjecti64vEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint64</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1328"/> >+ <alias name="glGetQueryObjecti64v"/> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryObjectiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="165"/> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryObjectivARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetQueryObjectiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryObjectivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetQueryObjectiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryObjectui64v</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint64</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryObjectui64vEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint64</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1329"/> >+ <alias name="glGetQueryObjectui64v"/> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryObjectuiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="166"/> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryObjectuivARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param> >+ <alias name="glGetQueryObjectuiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryObjectuivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryiv</name></proto> >+ <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="QueryParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="164"/> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryivARB</name></proto> >+ <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="QueryParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetQueryiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryivEXT</name></proto> >+ <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="QueryParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetRenderbufferParameteriv</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="RenderbufferParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1424"/> >+ </command> >+ <command> >+ <proto>void <name>glGetRenderbufferParameterivEXT</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="RenderbufferParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetRenderbufferParameteriv"/> >+ <glx type="vendor" opcode="1424"/> >+ </command> >+ <command> >+ <proto>void <name>glGetRenderbufferParameterivOES</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="RenderbufferParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetSamplerParameterIiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetSamplerParameterIivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetSamplerParameterIiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetSamplerParameterIivOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetSamplerParameterIiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetSamplerParameterIuiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetSamplerParameterIuivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param> >+ <alias name="glGetSamplerParameterIuiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetSamplerParameterIuivOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param> >+ <alias name="glGetSamplerParameterIuiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetSamplerParameterfv</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetSamplerParameteriv</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetSemaphoreParameterui64vEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>semaphore</name></param> >+ <param group="SemaphoreParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint64</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetSeparableFilter</name></proto> >+ <param group="SeparableTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>row</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>column</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>span</name></param> >+ <glx type="single" opcode="153"/> >+ <glx type="render" opcode="343" name="glGetSeparableFilterPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glGetSeparableFilterEXT</name></proto> >+ <param group="SeparableTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>row</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>column</name></param> >+ <param len="COMPSIZE(target,format,type)">void *<name>span</name></param> >+ <glx type="vendor" opcode="4"/> >+ </command> >+ <command> >+ <proto>void <name>glGetShaderInfoLog</name></proto> >+ <param><ptype>GLuint</ptype> <name>shader</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>infoLog</name></param> >+ <glx type="single" opcode="200"/> >+ </command> >+ <command> >+ <proto>void <name>glGetShaderPrecisionFormat</name></proto> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>shadertype</name></param> >+ <param group="PrecisionType"><ptype>GLenum</ptype> <name>precisiontype</name></param> >+ <param len="2"><ptype>GLint</ptype> *<name>range</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>precision</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetShaderSource</name></proto> >+ <param><ptype>GLuint</ptype> <name>shader</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>source</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetShaderSourceARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>obj</name></param> >+ <param><ptype>GLsizei</ptype> <name>maxLength</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="maxLength"><ptype>GLcharARB</ptype> *<name>source</name></param> >+ <alias name="glGetShaderSource"/> >+ </command> >+ <command> >+ <proto>void <name>glGetShaderiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>shader</name></param> >+ <param group="ShaderParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="198"/> >+ </command> >+ <command> >+ <proto>void <name>glGetSharpenTexFuncSGIS</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param len="COMPSIZE(target)"><ptype>GLfloat</ptype> *<name>points</name></param> >+ <glx type="vendor" opcode="4097"/> >+ </command> >+ <command> >+ <proto><ptype>GLushort</ptype> <name>glGetStageIndexNV</name></proto> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>shadertype</name></param> >+ </command> >+ <command> >+ <proto group="String">const <ptype>GLubyte</ptype> *<name>glGetString</name></proto> >+ <param group="StringName"><ptype>GLenum</ptype> <name>name</name></param> >+ <glx type="single" opcode="129"/> >+ </command> >+ <command> >+ <proto group="String">const <ptype>GLubyte</ptype> *<name>glGetStringi</name></proto> >+ <param group="StringName"><ptype>GLenum</ptype> <name>name</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <glx type="single" opcode="214"/> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glGetSubroutineIndex</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>shadertype</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetSubroutineUniformLocation</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>shadertype</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetSynciv</name></proto> >+ <param group="sync"><ptype>GLsync</ptype> <name>sync</name></param> >+ <param group="SyncParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLint</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetSyncivAPPLE</name></proto> >+ <param><ptype>GLsync</ptype> <name>sync</name></param> >+ <param group="SyncParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLint</ptype> *<name>values</name></param> >+ <alias name="glGetSynciv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexBumpParameterfvATI</name></proto> >+ <param group="GetTexBumpParameterATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexBumpParameterivATI</name></proto> >+ <param group="GetTexBumpParameterATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexEnvfv</name></proto> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="single" opcode="130"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexEnviv</name></proto> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="131"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexEnvxv</name></proto> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexEnvxvOES</name></proto> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexFilterFuncSGIS</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureFilterSGIS"><ptype>GLenum</ptype> <name>filter</name></param> >+ <param len="COMPSIZE(target,filter)"><ptype>GLfloat</ptype> *<name>weights</name></param> >+ <glx type="vendor" opcode="4101"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexGendv</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLdouble</ptype> *<name>params</name></param> >+ <glx type="single" opcode="132"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexGenfv</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="single" opcode="133"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexGenfvOES</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexGeniv</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="134"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexGenivOES</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexGenxvOES</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexImage</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,level,format,type)">void *<name>pixels</name></param> >+ <glx type="single" opcode="135"/> >+ <glx type="render" opcode="344" name="glGetTexImagePBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexLevelParameterfv</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="single" opcode="138"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexLevelParameteriv</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="139"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexLevelParameterxvOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameterIiv</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="203"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameterIivEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetTexParameterIiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameterIivOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetTexParameterIiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameterIuiv</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="204"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameterIuivEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param> >+ <alias name="glGetTexParameterIuiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameterIuivOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param> >+ <alias name="glGetTexParameterIuiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameterPointervAPPLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1">void **<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameterfv</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="single" opcode="136"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameteriv</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="single" opcode="137"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameterxv</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameterxvOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint64</ptype> <name>glGetTextureHandleARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint64</ptype> <name>glGetTextureHandleIMG</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <alias name="glGetTextureHandleARB"/> >+ </command> >+ <command> >+ <proto><ptype>GLuint64</ptype> <name>glGetTextureHandleNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureImage</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param>void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureImageEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,level,format,type)">void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureLevelParameterfv</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureLevelParameterfvEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureLevelParameteriv</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureLevelParameterivEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureParameterIiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureParameterIivEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureParameterIuiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureParameterIuivEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureParameterfv</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureParameterfvEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureParameteriv</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureParameterivEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint64</ptype> <name>glGetTextureSamplerHandleARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint64</ptype> <name>glGetTextureSamplerHandleIMG</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <alias name="glGetTextureSamplerHandleARB"/> >+ </command> >+ <command> >+ <proto><ptype>GLuint64</ptype> <name>glGetTextureSamplerHandleNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTextureSubImage</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param>void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTrackMatrixivNV</name></proto> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>address</name></param> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1300"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTransformFeedbackVarying</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>size</name></param> >+ <param len="1"><ptype>GLenum</ptype> *<name>type</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>name</name></param> >+ <glx type="single" opcode="213"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTransformFeedbackVaryingEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>size</name></param> >+ <param len="1"><ptype>GLenum</ptype> *<name>type</name></param> >+ <param len="bufSize"><ptype>GLchar</ptype> *<name>name</name></param> >+ <alias name="glGetTransformFeedbackVarying"/> >+ </command> >+ <command> >+ <proto>void <name>glGetTransformFeedbackVaryingNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>location</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTransformFeedbacki64_v</name></proto> >+ <param><ptype>GLuint</ptype> <name>xfb</name></param> >+ <param group="TransformFeedbackPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint64</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTransformFeedbacki_v</name></proto> >+ <param><ptype>GLuint</ptype> <name>xfb</name></param> >+ <param group="TransformFeedbackPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTransformFeedbackiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>xfb</name></param> >+ <param group="TransformFeedbackPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTranslatedShaderSourceANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>shader</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufsize</name></param> >+ <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param><ptype>GLchar</ptype> *<name>source</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glGetUniformBlockIndex</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param len="COMPSIZE()">const <ptype>GLchar</ptype> *<name>uniformBlockName</name></param> >+ <glx type="single" opcode="218"/> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetUniformBufferSizeEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformIndices</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLsizei</ptype> <name>uniformCount</name></param> >+ <param len="COMPSIZE(uniformCount)">const <ptype>GLchar</ptype> *const*<name>uniformNames</name></param> >+ <param len="COMPSIZE(uniformCount)"><ptype>GLuint</ptype> *<name>uniformIndices</name></param> >+ <glx type="single" opcode="215"/> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetUniformLocation</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetUniformLocationARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>programObj</name></param> >+ <param>const <ptype>GLcharARB</ptype> *<name>name</name></param> >+ <alias name="glGetUniformLocation"/> >+ </command> >+ <command> >+ <proto group="BufferOffset"><ptype>GLintptr</ptype> <name>glGetUniformOffsetEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformSubroutineuiv</name></proto> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>shadertype</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param len="1"><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformdv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param len="COMPSIZE(program,location)"><ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformfv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param len="COMPSIZE(program,location)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformfvARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>programObj</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param len="COMPSIZE(programObj,location)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <alias name="glGetUniformfv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformi64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param len="COMPSIZE(program,location)"><ptype>GLint64</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformi64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param len="COMPSIZE(program,location)"><ptype>GLint64EXT</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param len="COMPSIZE(program,location)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformivARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>programObj</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param len="COMPSIZE(programObj,location)"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetUniformiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformui64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param len="COMPSIZE(program,location)"><ptype>GLuint64</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param len="COMPSIZE(program,location)"><ptype>GLuint64EXT</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformuiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param len="COMPSIZE(program,location)"><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformuivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param len="COMPSIZE(program,location)"><ptype>GLuint</ptype> *<name>params</name></param> >+ <alias name="glGetUniformuiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetUnsignedBytevEXT</name></proto> >+ <param group="GetPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLubyte</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUnsignedBytei_vEXT</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="COMPSIZE(target)"><ptype>GLubyte</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVariantArrayObjectfvATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="ArrayObjectPNameATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVariantArrayObjectivATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="ArrayObjectPNameATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVariantBooleanvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="GetVariantValueEXT"><ptype>GLenum</ptype> <name>value</name></param> >+ <param group="Boolean" len="COMPSIZE(id)"><ptype>GLboolean</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVariantFloatvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="GetVariantValueEXT"><ptype>GLenum</ptype> <name>value</name></param> >+ <param len="COMPSIZE(id)"><ptype>GLfloat</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVariantIntegervEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="GetVariantValueEXT"><ptype>GLenum</ptype> <name>value</name></param> >+ <param len="COMPSIZE(id)"><ptype>GLint</ptype> *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVariantPointervEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="GetVariantValueEXT"><ptype>GLenum</ptype> <name>value</name></param> >+ <param len="COMPSIZE(id)">void **<name>data</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glGetVaryingLocationNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param len="COMPSIZE(name)">const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexArrayIndexed64iv</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexArrayPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint64</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexArrayIndexediv</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexArrayPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexArrayIntegeri_vEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexArrayPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexArrayIntegervEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param group="VertexArrayPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexArrayPointeri_vEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexArrayPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param>void **<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexArrayPointervEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param group="VertexArrayPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1">void **<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexArrayiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param group="VertexArrayPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribArrayObjectfvATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="ArrayObjectPNameATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribArrayObjectivATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="ArrayObjectPNameATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribIiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnum"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribIivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnum"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetVertexAttribIiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribIuiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnum"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribIuivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnum"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLuint</ptype> *<name>params</name></param> >+ <alias name="glGetVertexAttribIuiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribLdv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnum"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribLdvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnum"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLdouble</ptype> *<name>params</name></param> >+ <alias name="glGetVertexAttribLdv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribLi64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnum"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint64EXT</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribLui64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnum"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint64EXT</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribLui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnum"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint64EXT</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribPointerv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPointerPropertyARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1">void **<name>pointer</name></param> >+ <glx type="single" opcode="209"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribPointervARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPointerPropertyARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1">void **<name>pointer</name></param> >+ <alias name="glGetVertexAttribPointerv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribPointervNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1">void **<name>pointer</name></param> >+ <alias name="glGetVertexAttribPointerv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribdv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPropertyARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="4"><ptype>GLdouble</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1301"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribdvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPropertyARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="4"><ptype>GLdouble</ptype> *<name>params</name></param> >+ <alias name="glGetVertexAttribdv"/> >+ <glx type="vendor" opcode="1301"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribdvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLdouble</ptype> *<name>params</name></param> >+ <alias name="glGetVertexAttribdv"/> >+ <glx type="vendor" opcode="1301"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribfv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPropertyARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="4"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1302"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribfvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPropertyARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="4"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <alias name="glGetVertexAttribfv"/> >+ <glx type="vendor" opcode="1302"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribfvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <alias name="glGetVertexAttribfv"/> >+ <glx type="vendor" opcode="1302"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPropertyARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="4"><ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="vendor" opcode="1303"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribivARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPropertyARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="4"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetVertexAttribiv"/> >+ <glx type="vendor" opcode="1303"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribivNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetVertexAttribiv"/> >+ <glx type="vendor" opcode="1303"/> >+ </command> >+ <command> >+ <proto>void <name>glGetVideoCaptureStreamdvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_capture_slot</name></param> >+ <param><ptype>GLuint</ptype> <name>stream</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVideoCaptureStreamfvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_capture_slot</name></param> >+ <param><ptype>GLuint</ptype> <name>stream</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVideoCaptureStreamivNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_capture_slot</name></param> >+ <param><ptype>GLuint</ptype> <name>stream</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVideoCaptureivNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_capture_slot</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVideoi64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_slot</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint64EXT</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVideoivNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_slot</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVideoui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_slot</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint64EXT</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVideouivNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_slot</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnColorTable</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param>void *<name>table</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnColorTableARB</name></proto> >+ <param group="ColorTableTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize">void *<name>table</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnCompressedTexImage</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>lod</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param>void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnCompressedTexImageARB</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>lod</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize">void *<name>img</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnConvolutionFilter</name></proto> >+ <param group="ConvolutionTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param>void *<name>image</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnConvolutionFilterARB</name></proto> >+ <param group="ConvolutionTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize">void *<name>image</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnHistogram</name></proto> >+ <param group="HistogramTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLboolean</ptype> <name>reset</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param>void *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnHistogramARB</name></proto> >+ <param group="HistogramTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>reset</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize">void *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnMapdv</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="MapQuery"><ptype>GLenum</ptype> <name>query</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLdouble</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnMapdvARB</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="MapQuery"><ptype>GLenum</ptype> <name>query</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLdouble</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnMapfv</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="MapQuery"><ptype>GLenum</ptype> <name>query</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnMapfvARB</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="MapQuery"><ptype>GLenum</ptype> <name>query</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnMapiv</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="MapQuery"><ptype>GLenum</ptype> <name>query</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnMapivARB</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="MapQuery"><ptype>GLenum</ptype> <name>query</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnMinmax</name></proto> >+ <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLboolean</ptype> <name>reset</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param>void *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnMinmaxARB</name></proto> >+ <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>reset</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize">void *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnPixelMapfv</name></proto> >+ <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLfloat</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnPixelMapfvARB</name></proto> >+ <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLfloat</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnPixelMapuiv</name></proto> >+ <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLuint</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnPixelMapuivARB</name></proto> >+ <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLuint</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnPixelMapusv</name></proto> >+ <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLushort</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnPixelMapusvARB</name></proto> >+ <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLushort</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnPolygonStipple</name></proto> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLubyte</ptype> *<name>pattern</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnPolygonStippleARB</name></proto> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLubyte</ptype> *<name>pattern</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnSeparableFilter</name></proto> >+ <param group="SeparableTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>rowBufSize</name></param> >+ <param>void *<name>row</name></param> >+ <param><ptype>GLsizei</ptype> <name>columnBufSize</name></param> >+ <param>void *<name>column</name></param> >+ <param>void *<name>span</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnSeparableFilterARB</name></proto> >+ <param group="SeparableTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>rowBufSize</name></param> >+ <param len="rowBufSize">void *<name>row</name></param> >+ <param><ptype>GLsizei</ptype> <name>columnBufSize</name></param> >+ <param len="columnBufSize">void *<name>column</name></param> >+ <param len="0">void *<name>span</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnTexImage</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize">void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnTexImageARB</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize">void *<name>img</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformdv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformdvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformfv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformfvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformfvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <alias name="glGetnUniformfv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformfvKHR</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLfloat</ptype> *<name>params</name></param> >+ <alias name="glGetnUniformfv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformi64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLint64</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformivARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetnUniformiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformivKHR</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glGetnUniformiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformui64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLuint64</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformuiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformuivARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformuivKHR</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize"><ptype>GLuint</ptype> *<name>params</name></param> >+ <alias name="glGetnUniformuiv"/> >+ </command> >+ <command> >+ <proto>void <name>glGlobalAlphaFactorbSUN</name></proto> >+ <param><ptype>GLbyte</ptype> <name>factor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGlobalAlphaFactordSUN</name></proto> >+ <param><ptype>GLdouble</ptype> <name>factor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGlobalAlphaFactorfSUN</name></proto> >+ <param><ptype>GLfloat</ptype> <name>factor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGlobalAlphaFactoriSUN</name></proto> >+ <param><ptype>GLint</ptype> <name>factor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGlobalAlphaFactorsSUN</name></proto> >+ <param><ptype>GLshort</ptype> <name>factor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGlobalAlphaFactorubSUN</name></proto> >+ <param><ptype>GLubyte</ptype> <name>factor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGlobalAlphaFactoruiSUN</name></proto> >+ <param><ptype>GLuint</ptype> <name>factor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGlobalAlphaFactorusSUN</name></proto> >+ <param><ptype>GLushort</ptype> <name>factor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glHint</name></proto> >+ <param group="HintTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="HintMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <glx type="render" opcode="85"/> >+ </command> >+ <command> >+ <proto>void <name>glHintPGI</name></proto> >+ <param group="HintTargetPGI"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glHistogram</name></proto> >+ <param group="HistogramTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>sink</name></param> >+ <glx type="render" opcode="4110"/> >+ </command> >+ <command> >+ <proto>void <name>glHistogramEXT</name></proto> >+ <param group="HistogramTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>sink</name></param> >+ <alias name="glHistogram"/> >+ <glx type="render" opcode="4110"/> >+ </command> >+ <command> >+ <proto>void <name>glIglooInterfaceSGIX</name></proto> >+ <param group="IglooFunctionSelectSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="IglooParameterSGIX" len="COMPSIZE(pname)">const void *<name>params</name></param> >+ <glx type="render" opcode="200"/> >+ </command> >+ <command> >+ <proto>void <name>glImageTransformParameterfHP</name></proto> >+ <param group="ImageTransformTargetHP"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ImageTransformPNameHP"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glImageTransformParameterfvHP</name></proto> >+ <param group="ImageTransformTargetHP"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ImageTransformPNameHP"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glImageTransformParameteriHP</name></proto> >+ <param group="ImageTransformTargetHP"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ImageTransformPNameHP"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glImageTransformParameterivHP</name></proto> >+ <param group="ImageTransformTargetHP"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ImageTransformPNameHP"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glImportMemoryFdEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>size</name></param> >+ <param group="ExternalHandleType"><ptype>GLenum</ptype> <name>handleType</name></param> >+ <param><ptype>GLint</ptype> <name>fd</name></param> >+ </command> >+ <command> >+ <proto>void <name>glImportMemoryWin32HandleEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>size</name></param> >+ <param group="ExternalHandleType"><ptype>GLenum</ptype> <name>handleType</name></param> >+ <param>void *<name>handle</name></param> >+ </command> >+ <command> >+ <proto>void <name>glImportMemoryWin32NameEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>size</name></param> >+ <param group="ExternalHandleType"><ptype>GLenum</ptype> <name>handleType</name></param> >+ <param>const void *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glImportSemaphoreFdEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>semaphore</name></param> >+ <param group="ExternalHandleType"><ptype>GLenum</ptype> <name>handleType</name></param> >+ <param><ptype>GLint</ptype> <name>fd</name></param> >+ </command> >+ <command> >+ <proto>void <name>glImportSemaphoreWin32HandleEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>semaphore</name></param> >+ <param group="ExternalHandleType"><ptype>GLenum</ptype> <name>handleType</name></param> >+ <param>void *<name>handle</name></param> >+ </command> >+ <command> >+ <proto>void <name>glImportSemaphoreWin32NameEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>semaphore</name></param> >+ <param group="ExternalHandleType"><ptype>GLenum</ptype> <name>handleType</name></param> >+ <param>const void *<name>name</name></param> >+ </command> >+ <command> >+ <proto group="sync"><ptype>GLsync</ptype> <name>glImportSyncEXT</name></proto> >+ <param><ptype>GLenum</ptype> <name>external_sync_type</name></param> >+ <param><ptype>GLintptr</ptype> <name>external_sync</name></param> >+ <param><ptype>GLbitfield</ptype> <name>flags</name></param> >+ </command> >+ <command> >+ <proto>void <name>glIndexFormatNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glIndexFuncEXT</name></proto> >+ <param group="IndexFunctionEXT"><ptype>GLenum</ptype> <name>func</name></param> >+ <param group="ClampedFloat32"><ptype>GLclampf</ptype> <name>ref</name></param> >+ </command> >+ <command> >+ <proto>void <name>glIndexMask</name></proto> >+ <param group="MaskedColorIndexValueI"><ptype>GLuint</ptype> <name>mask</name></param> >+ <glx type="render" opcode="136"/> >+ </command> >+ <command> >+ <proto>void <name>glIndexMaterialEXT</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="IndexMaterialParameterEXT"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glIndexPointer</name></proto> >+ <param group="IndexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glIndexPointerEXT</name></proto> >+ <param group="IndexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="COMPSIZE(type,stride,count)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glIndexPointerListIBM</name></proto> >+ <param group="IndexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLint</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(type,stride)">const void **<name>pointer</name></param> >+ <param><ptype>GLint</ptype> <name>ptrstride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glIndexd</name></proto> >+ <param group="ColorIndexValueD"><ptype>GLdouble</ptype> <name>c</name></param> >+ <vecequiv name="glIndexdv"/> >+ </command> >+ <command> >+ <proto>void <name>glIndexdv</name></proto> >+ <param group="ColorIndexValueD" len="1">const <ptype>GLdouble</ptype> *<name>c</name></param> >+ <glx type="render" opcode="24"/> >+ </command> >+ <command> >+ <proto>void <name>glIndexf</name></proto> >+ <param group="ColorIndexValueF"><ptype>GLfloat</ptype> <name>c</name></param> >+ <vecequiv name="glIndexfv"/> >+ </command> >+ <command> >+ <proto>void <name>glIndexfv</name></proto> >+ <param group="ColorIndexValueF" len="1">const <ptype>GLfloat</ptype> *<name>c</name></param> >+ <glx type="render" opcode="25"/> >+ </command> >+ <command> >+ <proto>void <name>glIndexi</name></proto> >+ <param group="ColorIndexValueI"><ptype>GLint</ptype> <name>c</name></param> >+ <vecequiv name="glIndexiv"/> >+ </command> >+ <command> >+ <proto>void <name>glIndexiv</name></proto> >+ <param group="ColorIndexValueI" len="1">const <ptype>GLint</ptype> *<name>c</name></param> >+ <glx type="render" opcode="26"/> >+ </command> >+ <command> >+ <proto>void <name>glIndexs</name></proto> >+ <param group="ColorIndexValueS"><ptype>GLshort</ptype> <name>c</name></param> >+ <vecequiv name="glIndexsv"/> >+ </command> >+ <command> >+ <proto>void <name>glIndexsv</name></proto> >+ <param group="ColorIndexValueS" len="1">const <ptype>GLshort</ptype> *<name>c</name></param> >+ <glx type="render" opcode="27"/> >+ </command> >+ <command> >+ <proto>void <name>glIndexub</name></proto> >+ <param group="ColorIndexValueUB"><ptype>GLubyte</ptype> <name>c</name></param> >+ <vecequiv name="glIndexubv"/> >+ </command> >+ <command> >+ <proto>void <name>glIndexubv</name></proto> >+ <param group="ColorIndexValueUB" len="1">const <ptype>GLubyte</ptype> *<name>c</name></param> >+ <glx type="render" opcode="194"/> >+ </command> >+ <command> >+ <proto>void <name>glIndexxOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>component</name></param> >+ </command> >+ <command> >+ <proto>void <name>glIndexxvOES</name></proto> >+ <param len="1">const <ptype>GLfixed</ptype> *<name>component</name></param> >+ </command> >+ <command> >+ <proto>void <name>glInitNames</name></proto> >+ <glx type="render" opcode="121"/> >+ </command> >+ <command> >+ <proto>void <name>glInsertComponentEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>res</name></param> >+ <param><ptype>GLuint</ptype> <name>src</name></param> >+ <param><ptype>GLuint</ptype> <name>num</name></param> >+ </command> >+ <command> >+ <proto>void <name>glInsertEventMarkerEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>marker</name></param> >+ </command> >+ <command> >+ <proto>void <name>glInstrumentsBufferSGIX</name></proto> >+ <param><ptype>GLsizei</ptype> <name>size</name></param> >+ <param len="size"><ptype>GLint</ptype> *<name>buffer</name></param> >+ <glx type="vendor" opcode="4103"/> >+ </command> >+ <command> >+ <proto>void <name>glInterleavedArrays</name></proto> >+ <param group="InterleavedArrayFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(format,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glInterpolatePathsNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>resultPath</name></param> >+ <param group="Path"><ptype>GLuint</ptype> <name>pathA</name></param> >+ <param group="Path"><ptype>GLuint</ptype> <name>pathB</name></param> >+ <param><ptype>GLfloat</ptype> <name>weight</name></param> >+ </command> >+ <command> >+ <proto>void <name>glInvalidateBufferData</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glInvalidateBufferSubData</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>length</name></param> >+ </command> >+ <command> >+ <proto>void <name>glInvalidateFramebuffer</name></proto> >+ <param group="FramebufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>numAttachments</name></param> >+ <param len="numAttachments">const <ptype>GLenum</ptype> *<name>attachments</name></param> >+ </command> >+ <command> >+ <proto>void <name>glInvalidateNamedFramebufferData</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param><ptype>GLsizei</ptype> <name>numAttachments</name></param> >+ <param group="FramebufferAttachment">const <ptype>GLenum</ptype> *<name>attachments</name></param> >+ </command> >+ <command> >+ <proto>void <name>glInvalidateNamedFramebufferSubData</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param><ptype>GLsizei</ptype> <name>numAttachments</name></param> >+ <param group="FramebufferAttachment">const <ptype>GLenum</ptype> *<name>attachments</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glInvalidateSubFramebuffer</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>numAttachments</name></param> >+ <param len="numAttachments" group="FramebufferAttachment">const <ptype>GLenum</ptype> *<name>attachments</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glInvalidateTexImage</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ </command> >+ <command> >+ <proto>void <name>glInvalidateTexSubImage</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsAsyncMarkerSGIX</name></proto> >+ <param><ptype>GLuint</ptype> <name>marker</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsBuffer</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsBufferARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <alias name="glIsBuffer"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsBufferResidentNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glIsCommandListNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>list</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsEnabled</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>cap</name></param> >+ <glx type="single" opcode="140"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsEnabledIndexedEXT</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <alias name="glIsEnabledi"/> >+ <glx type="single" opcode="212"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsEnabledi</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsEnablediEXT</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <alias name="glIsEnabledi"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsEnablediNV</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <alias name="glIsEnabledi"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsEnablediOES</name></proto> >+ <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <alias name="glIsEnabledi"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsFenceAPPLE</name></proto> >+ <param group="FenceNV"><ptype>GLuint</ptype> <name>fence</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsFenceNV</name></proto> >+ <param group="FenceNV"><ptype>GLuint</ptype> <name>fence</name></param> >+ <glx type="vendor" opcode="1278"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsFramebuffer</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <glx type="vendor" opcode="1425"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsFramebufferEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <alias name="glIsFramebuffer"/> >+ <glx type="vendor" opcode="1425"/> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glIsFramebufferOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glIsImageHandleResidentARB</name></proto> >+ <param><ptype>GLuint64</ptype> <name>handle</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsImageHandleResidentNV</name></proto> >+ <param><ptype>GLuint64</ptype> <name>handle</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsList</name></proto> >+ <param group="List"><ptype>GLuint</ptype> <name>list</name></param> >+ <glx type="single" opcode="141"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsMemoryObjectEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>memoryObject</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsNameAMD</name></proto> >+ <param><ptype>GLenum</ptype> <name>identifier</name></param> >+ <param><ptype>GLuint</ptype> <name>name</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsNamedBufferResidentNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsNamedStringARB</name></proto> >+ <param><ptype>GLint</ptype> <name>namelen</name></param> >+ <param len="namelen">const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsObjectBufferATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsOcclusionQueryNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsPathNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsPointInFillPathNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param group="MaskedStencilValue"><ptype>GLuint</ptype> <name>mask</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsPointInStrokePathNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsProgram</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <glx type="single" opcode="197"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsProgramARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <glx type="vendor" opcode="1304"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsProgramNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <alias name="glIsProgramARB"/> >+ <glx type="vendor" opcode="1304"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsProgramPipeline</name></proto> >+ <param><ptype>GLuint</ptype> <name>pipeline</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glIsProgramPipelineEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>pipeline</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsQuery</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <glx type="single" opcode="163"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsQueryARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <alias name="glIsQuery"/> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glIsQueryEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsRenderbuffer</name></proto> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ <glx type="vendor" opcode="1422"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsRenderbufferEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ <alias name="glIsRenderbuffer"/> >+ <glx type="vendor" opcode="1422"/> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glIsRenderbufferOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsSemaphoreEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>semaphore</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsSampler</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsShader</name></proto> >+ <param><ptype>GLuint</ptype> <name>shader</name></param> >+ <glx type="single" opcode="196"/> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glIsStateNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>state</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsSync</name></proto> >+ <param group="sync"><ptype>GLsync</ptype> <name>sync</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glIsSyncAPPLE</name></proto> >+ <param><ptype>GLsync</ptype> <name>sync</name></param> >+ <alias name="glIsSync"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsTexture</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <glx type="single" opcode="146"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsTextureEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <glx type="vendor" opcode="14"/> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glIsTextureHandleResidentARB</name></proto> >+ <param><ptype>GLuint64</ptype> <name>handle</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsTextureHandleResidentNV</name></proto> >+ <param><ptype>GLuint64</ptype> <name>handle</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsTransformFeedback</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsTransformFeedbackNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <alias name="glIsTransformFeedback"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsVariantEnabledEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="VariantCapEXT"><ptype>GLenum</ptype> <name>cap</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsVertexArray</name></proto> >+ <param><ptype>GLuint</ptype> <name>array</name></param> >+ <glx type="single" opcode="207"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsVertexArrayAPPLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>array</name></param> >+ <alias name="glIsVertexArray"/> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glIsVertexArrayOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>array</name></param> >+ <alias name="glIsVertexArray"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsVertexAttribEnabledAPPLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLGPUCopyImageSubDataNVX</name></proto> >+ <param><ptype>GLuint</ptype> <name>sourceGpu</name></param> >+ <param><ptype>GLbitfield</ptype> <name>destinationGpuMask</name></param> >+ <param><ptype>GLuint</ptype> <name>srcName</name></param> >+ <param><ptype>GLenum</ptype> <name>srcTarget</name></param> >+ <param><ptype>GLint</ptype> <name>srcLevel</name></param> >+ <param><ptype>GLint</ptype> <name>srcX</name></param> >+ <param><ptype>GLint</ptype> <name>srxY</name></param> >+ <param><ptype>GLint</ptype> <name>srcZ</name></param> >+ <param><ptype>GLuint</ptype> <name>dstName</name></param> >+ <param><ptype>GLenum</ptype> <name>dstTarget</name></param> >+ <param><ptype>GLint</ptype> <name>dstLevel</name></param> >+ <param><ptype>GLint</ptype> <name>dstX</name></param> >+ <param><ptype>GLint</ptype> <name>dstY</name></param> >+ <param><ptype>GLint</ptype> <name>dstZ</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLGPUInterlockNVX</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glLGPUNamedBufferSubDataNVX</name></proto> >+ <param><ptype>GLbitfield</ptype> <name>gpuMask</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param>const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLabelObjectEXT</name></proto> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>object</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>label</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLightEnviSGIX</name></proto> >+ <param group="LightEnvParameterSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLightModelf</name></proto> >+ <param group="LightModelParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat</ptype> <name>param</name></param> >+ <glx type="render" opcode="90"/> >+ </command> >+ <command> >+ <proto>void <name>glLightModelfv</name></proto> >+ <param group="LightModelParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="91"/> >+ </command> >+ <command> >+ <proto>void <name>glLightModeli</name></proto> >+ <param group="LightModelParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ <glx type="render" opcode="92"/> >+ </command> >+ <command> >+ <proto>void <name>glLightModeliv</name></proto> >+ <param group="LightModelParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="93"/> >+ </command> >+ <command> >+ <proto>void <name>glLightModelx</name></proto> >+ <param group="LightModelParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLightModelxOES</name></proto> >+ <param group="LightModelParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLightModelxv</name></proto> >+ <param group="LightModelParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLightModelxvOES</name></proto> >+ <param group="LightModelParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLightf</name></proto> >+ <param group="LightName"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="LightParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <glx type="render" opcode="86"/> >+ </command> >+ <command> >+ <proto>void <name>glLightfv</name></proto> >+ <param group="LightName"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="LightParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="87"/> >+ </command> >+ <command> >+ <proto>void <name>glLighti</name></proto> >+ <param group="LightName"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="LightParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ <glx type="render" opcode="88"/> >+ </command> >+ <command> >+ <proto>void <name>glLightiv</name></proto> >+ <param group="LightName"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="LightParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="89"/> >+ </command> >+ <command> >+ <proto>void <name>glLightx</name></proto> >+ <param group="LightName"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="LightParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLightxOES</name></proto> >+ <param group="LightName"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="LightParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLightxv</name></proto> >+ <param group="LightName"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="LightParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLightxvOES</name></proto> >+ <param group="LightName"><ptype>GLenum</ptype> <name>light</name></param> >+ <param group="LightParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLineStipple</name></proto> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>factor</name></param> >+ <param group="LineStipple"><ptype>GLushort</ptype> <name>pattern</name></param> >+ <glx type="render" opcode="94"/> >+ </command> >+ <command> >+ <proto>void <name>glLineWidth</name></proto> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>width</name></param> >+ <glx type="render" opcode="95"/> >+ </command> >+ <command> >+ <proto>void <name>glLineWidthx</name></proto> >+ <param><ptype>GLfixed</ptype> <name>width</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLineWidthxOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>width</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLinkProgram</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLinkProgramARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>programObj</name></param> >+ <alias name="glLinkProgram"/> >+ </command> >+ <command> >+ <proto>void <name>glListBase</name></proto> >+ <param group="List"><ptype>GLuint</ptype> <name>base</name></param> >+ <glx type="render" opcode="3"/> >+ </command> >+ <command> >+ <proto>void <name>glListDrawCommandsStatesClientNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>list</name></param> >+ <param><ptype>GLuint</ptype> <name>segment</name></param> >+ <param>const void **<name>indirects</name></param> >+ <param>const <ptype>GLsizei</ptype> *<name>sizes</name></param> >+ <param>const <ptype>GLuint</ptype> *<name>states</name></param> >+ <param>const <ptype>GLuint</ptype> *<name>fbos</name></param> >+ <param><ptype>GLuint</ptype> <name>count</name></param> >+ </command> >+ <command> >+ <proto>void <name>glListParameterfSGIX</name></proto> >+ <param group="List"><ptype>GLuint</ptype> <name>list</name></param> >+ <param group="ListParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <glx type="render" opcode="2078"/> >+ </command> >+ <command> >+ <proto>void <name>glListParameterfvSGIX</name></proto> >+ <param group="List"><ptype>GLuint</ptype> <name>list</name></param> >+ <param group="ListParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="2079"/> >+ </command> >+ <command> >+ <proto>void <name>glListParameteriSGIX</name></proto> >+ <param group="List"><ptype>GLuint</ptype> <name>list</name></param> >+ <param group="ListParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ <glx type="render" opcode="2080"/> >+ </command> >+ <command> >+ <proto>void <name>glListParameterivSGIX</name></proto> >+ <param group="List"><ptype>GLuint</ptype> <name>list</name></param> >+ <param group="ListParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="2081"/> >+ </command> >+ <command> >+ <proto>void <name>glLoadIdentity</name></proto> >+ <glx type="render" opcode="176"/> >+ </command> >+ <command> >+ <proto>void <name>glLoadIdentityDeformationMapSGIX</name></proto> >+ <param group="FfdMaskSGIX"><ptype>GLbitfield</ptype> <name>mask</name></param> >+ <glx type="render" opcode="2076"/> >+ </command> >+ <command> >+ <proto>void <name>glLoadMatrixd</name></proto> >+ <param len="16">const <ptype>GLdouble</ptype> *<name>m</name></param> >+ <glx type="render" opcode="178"/> >+ </command> >+ <command> >+ <proto>void <name>glLoadMatrixf</name></proto> >+ <param len="16">const <ptype>GLfloat</ptype> *<name>m</name></param> >+ <glx type="render" opcode="177"/> >+ </command> >+ <command> >+ <proto>void <name>glLoadMatrixx</name></proto> >+ <param len="16">const <ptype>GLfixed</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLoadMatrixxOES</name></proto> >+ <param len="16">const <ptype>GLfixed</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLoadName</name></proto> >+ <param group="SelectName"><ptype>GLuint</ptype> <name>name</name></param> >+ <glx type="render" opcode="122"/> >+ </command> >+ <command> >+ <proto>void <name>glLoadPaletteFromModelViewMatrixOES</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glLoadProgramNV</name></proto> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLsizei</ptype> <name>len</name></param> >+ <param len="len">const <ptype>GLubyte</ptype> *<name>program</name></param> >+ <glx type="render" opcode="4183"/> >+ </command> >+ <command> >+ <proto>void <name>glLoadTransposeMatrixd</name></proto> >+ <param len="16">const <ptype>GLdouble</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLoadTransposeMatrixdARB</name></proto> >+ <param len="16">const <ptype>GLdouble</ptype> *<name>m</name></param> >+ <alias name="glLoadTransposeMatrixd"/> >+ </command> >+ <command> >+ <proto>void <name>glLoadTransposeMatrixf</name></proto> >+ <param len="16">const <ptype>GLfloat</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLoadTransposeMatrixfARB</name></proto> >+ <param len="16">const <ptype>GLfloat</ptype> *<name>m</name></param> >+ <alias name="glLoadTransposeMatrixf"/> >+ </command> >+ <command> >+ <proto>void <name>glLoadTransposeMatrixxOES</name></proto> >+ <param len="16">const <ptype>GLfixed</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLockArraysEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLogicOp</name></proto> >+ <param group="LogicOp"><ptype>GLenum</ptype> <name>opcode</name></param> >+ <glx type="render" opcode="161"/> >+ </command> >+ <command> >+ <proto>void <name>glMakeBufferNonResidentNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMakeBufferResidentNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>access</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMakeImageHandleNonResidentARB</name></proto> >+ <param><ptype>GLuint64</ptype> <name>handle</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMakeImageHandleNonResidentNV</name></proto> >+ <param><ptype>GLuint64</ptype> <name>handle</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMakeImageHandleResidentARB</name></proto> >+ <param><ptype>GLuint64</ptype> <name>handle</name></param> >+ <param><ptype>GLenum</ptype> <name>access</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMakeImageHandleResidentNV</name></proto> >+ <param><ptype>GLuint64</ptype> <name>handle</name></param> >+ <param><ptype>GLenum</ptype> <name>access</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMakeNamedBufferNonResidentNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMakeNamedBufferResidentNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLenum</ptype> <name>access</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMakeTextureHandleNonResidentARB</name></proto> >+ <param><ptype>GLuint64</ptype> <name>handle</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMakeTextureHandleNonResidentNV</name></proto> >+ <param><ptype>GLuint64</ptype> <name>handle</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMakeTextureHandleResidentARB</name></proto> >+ <param><ptype>GLuint64</ptype> <name>handle</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMakeTextureHandleResidentNV</name></proto> >+ <param><ptype>GLuint64</ptype> <name>handle</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMap1d</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u1</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u2</name></param> >+ <param><ptype>GLint</ptype> <name>stride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>order</name></param> >+ <param group="CoordD" len="COMPSIZE(target,stride,order)">const <ptype>GLdouble</ptype> *<name>points</name></param> >+ <glx type="render" opcode="143"/> >+ </command> >+ <command> >+ <proto>void <name>glMap1f</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u1</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u2</name></param> >+ <param><ptype>GLint</ptype> <name>stride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>order</name></param> >+ <param group="CoordF" len="COMPSIZE(target,stride,order)">const <ptype>GLfloat</ptype> *<name>points</name></param> >+ <glx type="render" opcode="144"/> >+ </command> >+ <command> >+ <proto>void <name>glMap1xOES</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLfixed</ptype> <name>u1</name></param> >+ <param><ptype>GLfixed</ptype> <name>u2</name></param> >+ <param><ptype>GLint</ptype> <name>stride</name></param> >+ <param><ptype>GLint</ptype> <name>order</name></param> >+ <param><ptype>GLfixed</ptype> <name>points</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMap2d</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u1</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u2</name></param> >+ <param><ptype>GLint</ptype> <name>ustride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>uorder</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>v1</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>v2</name></param> >+ <param><ptype>GLint</ptype> <name>vstride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>vorder</name></param> >+ <param group="CoordD" len="COMPSIZE(target,ustride,uorder,vstride,vorder)">const <ptype>GLdouble</ptype> *<name>points</name></param> >+ <glx type="render" opcode="145"/> >+ </command> >+ <command> >+ <proto>void <name>glMap2f</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u1</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u2</name></param> >+ <param><ptype>GLint</ptype> <name>ustride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>uorder</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>v1</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>v2</name></param> >+ <param><ptype>GLint</ptype> <name>vstride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>vorder</name></param> >+ <param group="CoordF" len="COMPSIZE(target,ustride,uorder,vstride,vorder)">const <ptype>GLfloat</ptype> *<name>points</name></param> >+ <glx type="render" opcode="146"/> >+ </command> >+ <command> >+ <proto>void <name>glMap2xOES</name></proto> >+ <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLfixed</ptype> <name>u1</name></param> >+ <param><ptype>GLfixed</ptype> <name>u2</name></param> >+ <param><ptype>GLint</ptype> <name>ustride</name></param> >+ <param><ptype>GLint</ptype> <name>uorder</name></param> >+ <param><ptype>GLfixed</ptype> <name>v1</name></param> >+ <param><ptype>GLfixed</ptype> <name>v2</name></param> >+ <param><ptype>GLint</ptype> <name>vstride</name></param> >+ <param><ptype>GLint</ptype> <name>vorder</name></param> >+ <param><ptype>GLfixed</ptype> <name>points</name></param> >+ </command> >+ <command> >+ <proto>void *<name>glMapBuffer</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferAccessARB"><ptype>GLenum</ptype> <name>access</name></param> >+ </command> >+ <command> >+ <proto>void *<name>glMapBufferARB</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferAccessARB"><ptype>GLenum</ptype> <name>access</name></param> >+ <alias name="glMapBuffer"/> >+ </command> >+ <command> >+ <proto>void *<name>glMapBufferOES</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferAccessARB"><ptype>GLenum</ptype> <name>access</name></param> >+ <alias name="glMapBuffer"/> >+ </command> >+ <command> >+ <proto>void *<name>glMapBufferRange</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>length</name></param> >+ <param group="BufferAccessMask"><ptype>GLbitfield</ptype> <name>access</name></param> >+ <glx type="single" opcode="205"/> >+ </command> >+ <command> >+ <proto>void *<name>glMapBufferRangeEXT</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>length</name></param> >+ <param group="BufferAccessMask"><ptype>GLbitfield</ptype> <name>access</name></param> >+ <alias name="glMapBufferRange"/> >+ </command> >+ <command> >+ <proto>void <name>glMapControlPointsNV</name></proto> >+ <param group="EvalTargetNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="MapTypeNV"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>ustride</name></param> >+ <param><ptype>GLsizei</ptype> <name>vstride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>uorder</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>vorder</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>packed</name></param> >+ <param len="COMPSIZE(target,uorder,vorder)">const void *<name>points</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMapGrid1d</name></proto> >+ <param><ptype>GLint</ptype> <name>un</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u1</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u2</name></param> >+ <glx type="render" opcode="147"/> >+ </command> >+ <command> >+ <proto>void <name>glMapGrid1f</name></proto> >+ <param><ptype>GLint</ptype> <name>un</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u1</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u2</name></param> >+ <glx type="render" opcode="148"/> >+ </command> >+ <command> >+ <proto>void <name>glMapGrid1xOES</name></proto> >+ <param><ptype>GLint</ptype> <name>n</name></param> >+ <param><ptype>GLfixed</ptype> <name>u1</name></param> >+ <param><ptype>GLfixed</ptype> <name>u2</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMapGrid2d</name></proto> >+ <param><ptype>GLint</ptype> <name>un</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u1</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u2</name></param> >+ <param><ptype>GLint</ptype> <name>vn</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>v1</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>v2</name></param> >+ <glx type="render" opcode="149"/> >+ </command> >+ <command> >+ <proto>void <name>glMapGrid2f</name></proto> >+ <param><ptype>GLint</ptype> <name>un</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u1</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u2</name></param> >+ <param><ptype>GLint</ptype> <name>vn</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>v1</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>v2</name></param> >+ <glx type="render" opcode="150"/> >+ </command> >+ <command> >+ <proto>void <name>glMapGrid2xOES</name></proto> >+ <param><ptype>GLint</ptype> <name>n</name></param> >+ <param><ptype>GLfixed</ptype> <name>u1</name></param> >+ <param><ptype>GLfixed</ptype> <name>u2</name></param> >+ <param><ptype>GLfixed</ptype> <name>v1</name></param> >+ <param><ptype>GLfixed</ptype> <name>v2</name></param> >+ </command> >+ <command> >+ <proto>void *<name>glMapNamedBuffer</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferAccessARB"><ptype>GLenum</ptype> <name>access</name></param> >+ </command> >+ <command> >+ <proto>void *<name>glMapNamedBufferEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferAccessARB"><ptype>GLenum</ptype> <name>access</name></param> >+ </command> >+ <command> >+ <proto>void *<name>glMapNamedBufferRange</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>length</name></param> >+ <param group="BufferAccessMask"><ptype>GLbitfield</ptype> <name>access</name></param> >+ </command> >+ <command> >+ <proto>void *<name>glMapNamedBufferRangeEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>length</name></param> >+ <param group="BufferAccessMask"><ptype>GLbitfield</ptype> <name>access</name></param> >+ </command> >+ <command> >+ <proto>void *<name>glMapObjectBufferATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMapParameterfvNV</name></proto> >+ <param group="EvalTargetNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="MapParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(target,pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMapParameterivNV</name></proto> >+ <param group="EvalTargetNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="MapParameterNV"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(target,pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void *<name>glMapTexture2DINTEL</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLbitfield</ptype> <name>access</name></param> >+ <param len="1"><ptype>GLint</ptype> *<name>stride</name></param> >+ <param len="1"><ptype>GLenum</ptype> *<name>layout</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMapVertexAttrib1dAPPLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>size</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u1</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u2</name></param> >+ <param><ptype>GLint</ptype> <name>stride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>order</name></param> >+ <param group="CoordD" len="COMPSIZE(size,stride,order)">const <ptype>GLdouble</ptype> *<name>points</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMapVertexAttrib1fAPPLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>size</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u1</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u2</name></param> >+ <param><ptype>GLint</ptype> <name>stride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>order</name></param> >+ <param group="CoordF" len="COMPSIZE(size,stride,order)">const <ptype>GLfloat</ptype> *<name>points</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMapVertexAttrib2dAPPLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>size</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u1</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>u2</name></param> >+ <param><ptype>GLint</ptype> <name>ustride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>uorder</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>v1</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>v2</name></param> >+ <param><ptype>GLint</ptype> <name>vstride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>vorder</name></param> >+ <param group="CoordD" len="COMPSIZE(size,ustride,uorder,vstride,vorder)">const <ptype>GLdouble</ptype> *<name>points</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMapVertexAttrib2fAPPLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>size</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u1</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>u2</name></param> >+ <param><ptype>GLint</ptype> <name>ustride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>uorder</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>v1</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>v2</name></param> >+ <param><ptype>GLint</ptype> <name>vstride</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>vorder</name></param> >+ <param group="CoordF" len="COMPSIZE(size,ustride,uorder,vstride,vorder)">const <ptype>GLfloat</ptype> *<name>points</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMaterialf</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <glx type="render" opcode="96"/> >+ </command> >+ <command> >+ <proto>void <name>glMaterialfv</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="97"/> >+ </command> >+ <command> >+ <proto>void <name>glMateriali</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ <glx type="render" opcode="98"/> >+ </command> >+ <command> >+ <proto>void <name>glMaterialiv</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="99"/> >+ </command> >+ <command> >+ <proto>void <name>glMaterialx</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMaterialxOES</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMaterialxv</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMaterialxvOES</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixFrustumEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLdouble</ptype> <name>left</name></param> >+ <param><ptype>GLdouble</ptype> <name>right</name></param> >+ <param><ptype>GLdouble</ptype> <name>bottom</name></param> >+ <param><ptype>GLdouble</ptype> <name>top</name></param> >+ <param><ptype>GLdouble</ptype> <name>zNear</name></param> >+ <param><ptype>GLdouble</ptype> <name>zFar</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixIndexPointerARB</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="MatrixIndexPointerTypeARB"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixIndexPointerOES</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="MatrixIndexPointerTypeARB"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixIndexubvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param len="size">const <ptype>GLubyte</ptype> *<name>indices</name></param> >+ <glx type="render" opcode="4326"/> >+ </command> >+ <command> >+ <proto>void <name>glMatrixIndexuivARB</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param len="size">const <ptype>GLuint</ptype> *<name>indices</name></param> >+ <glx type="render" opcode="4328"/> >+ </command> >+ <command> >+ <proto>void <name>glMatrixIndexusvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param len="size">const <ptype>GLushort</ptype> *<name>indices</name></param> >+ <glx type="render" opcode="4327"/> >+ </command> >+ <command> >+ <proto>void <name>glMatrixLoad3x2fNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>matrixMode</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixLoad3x3fNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>matrixMode</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixLoadIdentityEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixLoadTranspose3x3fNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>matrixMode</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixLoadTransposedEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="16">const <ptype>GLdouble</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixLoadTransposefEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="16">const <ptype>GLfloat</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixLoaddEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="16">const <ptype>GLdouble</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixLoadfEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="16">const <ptype>GLfloat</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixMode</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <glx type="render" opcode="179"/> >+ </command> >+ <command> >+ <proto>void <name>glMatrixMult3x2fNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>matrixMode</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixMult3x3fNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>matrixMode</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixMultTranspose3x3fNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>matrixMode</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixMultTransposedEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="16">const <ptype>GLdouble</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixMultTransposefEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="16">const <ptype>GLfloat</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixMultdEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="16">const <ptype>GLdouble</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixMultfEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="16">const <ptype>GLfloat</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixOrthoEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLdouble</ptype> <name>left</name></param> >+ <param><ptype>GLdouble</ptype> <name>right</name></param> >+ <param><ptype>GLdouble</ptype> <name>bottom</name></param> >+ <param><ptype>GLdouble</ptype> <name>top</name></param> >+ <param><ptype>GLdouble</ptype> <name>zNear</name></param> >+ <param><ptype>GLdouble</ptype> <name>zFar</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixPopEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixPushEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixRotatedEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLdouble</ptype> <name>angle</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixRotatefEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLfloat</ptype> <name>angle</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixScaledEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixScalefEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixTranslatedEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixTranslatefEXT</name></proto> >+ <param group="MatrixMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMaxShaderCompilerThreadsKHR</name></proto> >+ <param><ptype>GLuint</ptype> <name>count</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMaxShaderCompilerThreadsARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>count</name></param> >+ <alias name="glMaxShaderCompilerThreadsKHR"/> >+ </command> >+ <command> >+ <proto>void <name>glMemoryBarrier</name></proto> >+ <param group="MemoryBarrierMask"><ptype>GLbitfield</ptype> <name>barriers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMemoryBarrierByRegion</name></proto> >+ <param group="MemoryBarrierMask"><ptype>GLbitfield</ptype> <name>barriers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMemoryBarrierEXT</name></proto> >+ <param group="MemoryBarrierMask"><ptype>GLbitfield</ptype> <name>barriers</name></param> >+ <alias name="glMemoryBarrier"/> >+ </command> >+ <command> >+ <proto>void <name>glMemoryObjectParameterivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>memoryObject</name></param> >+ <param group="MemoryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param>const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMinSampleShading</name></proto> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMinSampleShadingARB</name></proto> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>value</name></param> >+ <alias name="glMinSampleShading"/> >+ </command> >+ <command> >+ <proto>void <name>glMinSampleShadingOES</name></proto> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>value</name></param> >+ <alias name="glMinSampleShading"/> >+ </command> >+ <command> >+ <proto>void <name>glMinmax</name></proto> >+ <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>sink</name></param> >+ <glx type="render" opcode="4111"/> >+ </command> >+ <command> >+ <proto>void <name>glMinmaxEXT</name></proto> >+ <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>sink</name></param> >+ <alias name="glMinmax"/> >+ <glx type="render" opcode="4111"/> >+ </command> >+ <command> >+ <proto>void <name>glMultMatrixd</name></proto> >+ <param len="16">const <ptype>GLdouble</ptype> *<name>m</name></param> >+ <glx type="render" opcode="181"/> >+ </command> >+ <command> >+ <proto>void <name>glMultMatrixf</name></proto> >+ <param len="16">const <ptype>GLfloat</ptype> *<name>m</name></param> >+ <glx type="render" opcode="180"/> >+ </command> >+ <command> >+ <proto>void <name>glMultMatrixx</name></proto> >+ <param len="16">const <ptype>GLfixed</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultMatrixxOES</name></proto> >+ <param len="16">const <ptype>GLfixed</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultTransposeMatrixd</name></proto> >+ <param len="16">const <ptype>GLdouble</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultTransposeMatrixdARB</name></proto> >+ <param len="16">const <ptype>GLdouble</ptype> *<name>m</name></param> >+ <alias name="glMultTransposeMatrixd"/> >+ </command> >+ <command> >+ <proto>void <name>glMultTransposeMatrixf</name></proto> >+ <param len="16">const <ptype>GLfloat</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultTransposeMatrixfARB</name></proto> >+ <param len="16">const <ptype>GLfloat</ptype> *<name>m</name></param> >+ <alias name="glMultTransposeMatrixf"/> >+ </command> >+ <command> >+ <proto>void <name>glMultTransposeMatrixxOES</name></proto> >+ <param len="16">const <ptype>GLfixed</ptype> *<name>m</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawArrays</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="COMPSIZE(count)">const <ptype>GLint</ptype> *<name>first</name></param> >+ <param len="COMPSIZE(drawcount)">const <ptype>GLsizei</ptype> *<name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawcount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawArraysEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLint</ptype> *<name>first</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLsizei</ptype> *<name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <alias name="glMultiDrawArrays"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawArraysIndirect</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="COMPSIZE(drawcount,stride)">const void *<name>indirect</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawcount</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawArraysIndirectAMD</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param>const void *<name>indirect</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <alias name="glMultiDrawArraysIndirect"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawArraysIndirectBindlessCountNV</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param>const void *<name>indirect</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawCount</name></param> >+ <param><ptype>GLsizei</ptype> <name>maxDrawCount</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLint</ptype> <name>vertexBufferCount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawArraysIndirectBindlessNV</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param>const void *<name>indirect</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawCount</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLint</ptype> <name>vertexBufferCount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawArraysIndirectCount</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param>const void *<name>indirect</name></param> >+ <param><ptype>GLintptr</ptype> <name>drawcount</name></param> >+ <param><ptype>GLsizei</ptype> <name>maxdrawcount</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawArraysIndirectCountARB</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param>const void *<name>indirect</name></param> >+ <param><ptype>GLintptr</ptype> <name>drawcount</name></param> >+ <param><ptype>GLsizei</ptype> <name>maxdrawcount</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <alias name="glMultiDrawArraysIndirectCount"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawArraysIndirectEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="COMPSIZE(drawcount,stride)">const void *<name>indirect</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawcount</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <alias name="glMultiDrawArraysIndirect"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawElementArrayAPPLE</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="primcount">const <ptype>GLint</ptype> *<name>first</name></param> >+ <param len="primcount">const <ptype>GLsizei</ptype> *<name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawElements</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="COMPSIZE(drawcount)">const <ptype>GLsizei</ptype> *<name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(drawcount)">const void *const*<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawcount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawElementsBaseVertex</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="COMPSIZE(drawcount)">const <ptype>GLsizei</ptype> *<name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(drawcount)">const void *const*<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawcount</name></param> >+ <param len="COMPSIZE(drawcount)">const <ptype>GLint</ptype> *<name>basevertex</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawElementsBaseVertexEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="COMPSIZE(drawcount)">const <ptype>GLsizei</ptype> *<name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(drawcount)">const void *const*<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <param len="COMPSIZE(drawcount)">const <ptype>GLint</ptype> *<name>basevertex</name></param> >+ <alias name="glMultiDrawElementsBaseVertex"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawElementsEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLsizei</ptype> *<name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(primcount)">const void *const*<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <alias name="glMultiDrawElements"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawElementsIndirect</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(drawcount,stride)">const void *<name>indirect</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawcount</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawElementsIndirectAMD</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param>const void *<name>indirect</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <alias name="glMultiDrawElementsIndirect"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawElementsIndirectBindlessCountNV</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param>const void *<name>indirect</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawCount</name></param> >+ <param><ptype>GLsizei</ptype> <name>maxDrawCount</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLint</ptype> <name>vertexBufferCount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawElementsIndirectBindlessNV</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param>const void *<name>indirect</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawCount</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLint</ptype> <name>vertexBufferCount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawElementsIndirectCount</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param>const void *<name>indirect</name></param> >+ <param><ptype>GLintptr</ptype> <name>drawcount</name></param> >+ <param><ptype>GLsizei</ptype> <name>maxdrawcount</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawElementsIndirectCountARB</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param>const void *<name>indirect</name></param> >+ <param><ptype>GLintptr</ptype> <name>drawcount</name></param> >+ <param><ptype>GLsizei</ptype> <name>maxdrawcount</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <alias name="glMultiDrawElementsIndirectCount"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawElementsIndirectEXT</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(drawcount,stride)">const void *<name>indirect</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawcount</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <alias name="glMultiDrawElementsIndirect"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawRangeElementArrayAPPLE</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLuint</ptype> <name>start</name></param> >+ <param><ptype>GLuint</ptype> <name>end</name></param> >+ <param len="primcount">const <ptype>GLint</ptype> *<name>first</name></param> >+ <param len="primcount">const <ptype>GLsizei</ptype> *<name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiModeDrawArraysIBM</name></proto> >+ <param group="PrimitiveType" len="COMPSIZE(primcount)">const <ptype>GLenum</ptype> *<name>mode</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLint</ptype> *<name>first</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLsizei</ptype> *<name>count</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <param><ptype>GLint</ptype> <name>modestride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiModeDrawElementsIBM</name></proto> >+ <param group="PrimitiveType" len="COMPSIZE(primcount)">const <ptype>GLenum</ptype> *<name>mode</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLsizei</ptype> *<name>count</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(primcount)">const void *const*<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>primcount</name></param> >+ <param><ptype>GLint</ptype> <name>modestride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexBufferEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TypeEnum"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1bOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param><ptype>GLbyte</ptype> <name>s</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1bvOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param len="1">const <ptype>GLbyte</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1d</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>s</name></param> >+ <vecequiv name="glMultiTexCoord1dv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1dARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>s</name></param> >+ <vecequiv name="glMultiTexCoord1dv"/> >+ <alias name="glMultiTexCoord1d"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1dv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD" len="1">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="198"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1dvARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD" len="1">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord1dv"/> >+ <glx type="render" opcode="198"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1f</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>s</name></param> >+ <vecequiv name="glMultiTexCoord1fv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1fARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>s</name></param> >+ <vecequiv name="glMultiTexCoord1fv"/> >+ <alias name="glMultiTexCoord1f"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1fv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF" len="1">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="199"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1fvARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF" len="1">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord1fv"/> >+ <glx type="render" opcode="199"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1hNV</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>s</name></param> >+ <vecequiv name="glMultiTexCoord1hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1hvNV</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Half16NV" len="1">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4250"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1i</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>s</name></param> >+ <vecequiv name="glMultiTexCoord1iv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1iARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>s</name></param> >+ <vecequiv name="glMultiTexCoord1iv"/> >+ <alias name="glMultiTexCoord1i"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1iv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI" len="1">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="200"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1ivARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI" len="1">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord1iv"/> >+ <glx type="render" opcode="200"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1s</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>s</name></param> >+ <vecequiv name="glMultiTexCoord1sv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1sARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>s</name></param> >+ <vecequiv name="glMultiTexCoord1sv"/> >+ <alias name="glMultiTexCoord1s"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1sv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS" len="1">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="201"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1svARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS" len="1">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord1sv"/> >+ <glx type="render" opcode="201"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1xOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param><ptype>GLfixed</ptype> <name>s</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord1xvOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param len="1">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2bOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param><ptype>GLbyte</ptype> <name>s</name></param> >+ <param><ptype>GLbyte</ptype> <name>t</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2bvOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param len="2">const <ptype>GLbyte</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2d</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>s</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>t</name></param> >+ <vecequiv name="glMultiTexCoord2dv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2dARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>s</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>t</name></param> >+ <vecequiv name="glMultiTexCoord2dv"/> >+ <alias name="glMultiTexCoord2d"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2dv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD" len="2">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="202"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2dvARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD" len="2">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord2dv"/> >+ <glx type="render" opcode="202"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2f</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>s</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>t</name></param> >+ <vecequiv name="glMultiTexCoord2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2fARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>s</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>t</name></param> >+ <vecequiv name="glMultiTexCoord2fv"/> >+ <alias name="glMultiTexCoord2f"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2fv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF" len="2">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="203"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2fvARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF" len="2">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord2fv"/> >+ <glx type="render" opcode="203"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2hNV</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>s</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>t</name></param> >+ <vecequiv name="glMultiTexCoord2hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2hvNV</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Half16NV" len="2">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4251"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2i</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>s</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>t</name></param> >+ <vecequiv name="glMultiTexCoord2iv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2iARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>s</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>t</name></param> >+ <vecequiv name="glMultiTexCoord2iv"/> >+ <alias name="glMultiTexCoord2i"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2iv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI" len="2">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="204"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2ivARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI" len="2">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord2iv"/> >+ <glx type="render" opcode="204"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2s</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>s</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>t</name></param> >+ <vecequiv name="glMultiTexCoord2sv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2sARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>s</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>t</name></param> >+ <vecequiv name="glMultiTexCoord2sv"/> >+ <alias name="glMultiTexCoord2s"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2sv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS" len="2">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="205"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2svARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS" len="2">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord2sv"/> >+ <glx type="render" opcode="205"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2xOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param><ptype>GLfixed</ptype> <name>s</name></param> >+ <param><ptype>GLfixed</ptype> <name>t</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord2xvOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param len="2">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3bOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param><ptype>GLbyte</ptype> <name>s</name></param> >+ <param><ptype>GLbyte</ptype> <name>t</name></param> >+ <param><ptype>GLbyte</ptype> <name>r</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3bvOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param len="3">const <ptype>GLbyte</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3d</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>s</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>t</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>r</name></param> >+ <vecequiv name="glMultiTexCoord3dv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3dARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>s</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>t</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>r</name></param> >+ <vecequiv name="glMultiTexCoord3dv"/> >+ <alias name="glMultiTexCoord3d"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3dv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD" len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="206"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3dvARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD" len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord3dv"/> >+ <glx type="render" opcode="206"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3f</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>s</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>t</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>r</name></param> >+ <vecequiv name="glMultiTexCoord3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3fARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>s</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>t</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>r</name></param> >+ <vecequiv name="glMultiTexCoord3fv"/> >+ <alias name="glMultiTexCoord3f"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3fv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF" len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="207"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3fvARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF" len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord3fv"/> >+ <glx type="render" opcode="207"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3hNV</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>s</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>t</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>r</name></param> >+ <vecequiv name="glMultiTexCoord3hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3hvNV</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Half16NV" len="3">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4252"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3i</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>s</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>t</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>r</name></param> >+ <vecequiv name="glMultiTexCoord3iv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3iARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>s</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>t</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>r</name></param> >+ <vecequiv name="glMultiTexCoord3iv"/> >+ <alias name="glMultiTexCoord3i"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3iv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI" len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="208"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3ivARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI" len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord3iv"/> >+ <glx type="render" opcode="208"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3s</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>s</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>t</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>r</name></param> >+ <vecequiv name="glMultiTexCoord3sv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3sARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>s</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>t</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>r</name></param> >+ <vecequiv name="glMultiTexCoord3sv"/> >+ <alias name="glMultiTexCoord3s"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3sv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS" len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="209"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3svARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS" len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord3sv"/> >+ <glx type="render" opcode="209"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3xOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param><ptype>GLfixed</ptype> <name>s</name></param> >+ <param><ptype>GLfixed</ptype> <name>t</name></param> >+ <param><ptype>GLfixed</ptype> <name>r</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord3xvOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param len="3">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4bOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param><ptype>GLbyte</ptype> <name>s</name></param> >+ <param><ptype>GLbyte</ptype> <name>t</name></param> >+ <param><ptype>GLbyte</ptype> <name>r</name></param> >+ <param><ptype>GLbyte</ptype> <name>q</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4bvOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param len="4">const <ptype>GLbyte</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4d</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>s</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>t</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>r</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>q</name></param> >+ <vecequiv name="glMultiTexCoord4dv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4dARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>s</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>t</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>r</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>q</name></param> >+ <vecequiv name="glMultiTexCoord4dv"/> >+ <alias name="glMultiTexCoord4d"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4dv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD" len="4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="210"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4dvARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordD" len="4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord4dv"/> >+ <glx type="render" opcode="210"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4f</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>s</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>t</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>r</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>q</name></param> >+ <vecequiv name="glMultiTexCoord4fv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4fARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>s</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>t</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>r</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>q</name></param> >+ <vecequiv name="glMultiTexCoord4fv"/> >+ <alias name="glMultiTexCoord4f"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4fv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF" len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="211"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4fvARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordF" len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord4fv"/> >+ <glx type="render" opcode="211"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4hNV</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>s</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>t</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>r</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>q</name></param> >+ <vecequiv name="glMultiTexCoord4hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4hvNV</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="Half16NV" len="4">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4253"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4i</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>s</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>t</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>r</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>q</name></param> >+ <vecequiv name="glMultiTexCoord4iv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4iARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>s</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>t</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>r</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>q</name></param> >+ <vecequiv name="glMultiTexCoord4iv"/> >+ <alias name="glMultiTexCoord4i"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4iv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI" len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="212"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4ivARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordI" len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord4iv"/> >+ <glx type="render" opcode="212"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4s</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>s</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>t</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>r</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>q</name></param> >+ <vecequiv name="glMultiTexCoord4sv"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4sARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>s</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>t</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>r</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>q</name></param> >+ <vecequiv name="glMultiTexCoord4sv"/> >+ <alias name="glMultiTexCoord4s"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4sv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS" len="4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="213"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4svARB</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CoordS" len="4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glMultiTexCoord4sv"/> >+ <glx type="render" opcode="213"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4x</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param><ptype>GLfixed</ptype> <name>s</name></param> >+ <param><ptype>GLfixed</ptype> <name>t</name></param> >+ <param><ptype>GLfixed</ptype> <name>r</name></param> >+ <param><ptype>GLfixed</ptype> <name>q</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4xOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param><ptype>GLfixed</ptype> <name>s</name></param> >+ <param><ptype>GLfixed</ptype> <name>t</name></param> >+ <param><ptype>GLfixed</ptype> <name>r</name></param> >+ <param><ptype>GLfixed</ptype> <name>q</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoord4xvOES</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param len="4">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoordP1ui</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoordP1uiv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoordP2ui</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoordP2uiv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoordP3ui</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoordP3uiv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoordP4ui</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoordP4uiv</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texture</name></param> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexCoordPointerEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexEnvfEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <vecequiv name="glMultiTexEnvfvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexEnvfvEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexEnviEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ <vecequiv name="glMultiTexEnvivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexEnvivEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexGendEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLdouble</ptype> <name>param</name></param> >+ <vecequiv name="glMultiTexGendvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexGendvEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexGenfEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <vecequiv name="glMultiTexGenfvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexGenfvEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexGeniEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ <vecequiv name="glMultiTexGenivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexGenivEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexImage1DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLint</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width)">const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexImage2DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLint</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height)">const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexImage3DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLint</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height,depth)">const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexParameterIivEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexParameterIuivEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexParameterfEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <vecequiv name="glMultiTexParameterfvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexParameterfvEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexParameteriEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ <vecequiv name="glMultiTexParameterivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexParameterivEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexRenderbufferEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexSubImage1DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width)">const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexSubImage2DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height)">const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiTexSubImage3DEXT</name></proto> >+ <param group="TextureUnit"><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height,depth)">const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMulticastBarrierNV</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glMulticastBlitFramebufferNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>srcGpu</name></param> >+ <param><ptype>GLuint</ptype> <name>dstGpu</name></param> >+ <param><ptype>GLint</ptype> <name>srcX0</name></param> >+ <param><ptype>GLint</ptype> <name>srcY0</name></param> >+ <param><ptype>GLint</ptype> <name>srcX1</name></param> >+ <param><ptype>GLint</ptype> <name>srcY1</name></param> >+ <param><ptype>GLint</ptype> <name>dstX0</name></param> >+ <param><ptype>GLint</ptype> <name>dstY0</name></param> >+ <param><ptype>GLint</ptype> <name>dstX1</name></param> >+ <param><ptype>GLint</ptype> <name>dstY1</name></param> >+ <param group="ClearBufferMask"><ptype>GLbitfield</ptype> <name>mask</name></param> >+ <param><ptype>GLenum</ptype> <name>filter</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMulticastBufferSubDataNV</name></proto> >+ <param><ptype>GLbitfield</ptype> <name>gpuMask</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param>const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMulticastCopyBufferSubDataNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>readGpu</name></param> >+ <param><ptype>GLbitfield</ptype> <name>writeGpuMask</name></param> >+ <param><ptype>GLuint</ptype> <name>readBuffer</name></param> >+ <param><ptype>GLuint</ptype> <name>writeBuffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>readOffset</name></param> >+ <param><ptype>GLintptr</ptype> <name>writeOffset</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMulticastCopyImageSubDataNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>srcGpu</name></param> >+ <param><ptype>GLbitfield</ptype> <name>dstGpuMask</name></param> >+ <param><ptype>GLuint</ptype> <name>srcName</name></param> >+ <param><ptype>GLenum</ptype> <name>srcTarget</name></param> >+ <param><ptype>GLint</ptype> <name>srcLevel</name></param> >+ <param><ptype>GLint</ptype> <name>srcX</name></param> >+ <param><ptype>GLint</ptype> <name>srcY</name></param> >+ <param><ptype>GLint</ptype> <name>srcZ</name></param> >+ <param><ptype>GLuint</ptype> <name>dstName</name></param> >+ <param><ptype>GLenum</ptype> <name>dstTarget</name></param> >+ <param><ptype>GLint</ptype> <name>dstLevel</name></param> >+ <param><ptype>GLint</ptype> <name>dstX</name></param> >+ <param><ptype>GLint</ptype> <name>dstY</name></param> >+ <param><ptype>GLint</ptype> <name>dstZ</name></param> >+ <param><ptype>GLsizei</ptype> <name>srcWidth</name></param> >+ <param><ptype>GLsizei</ptype> <name>srcHeight</name></param> >+ <param><ptype>GLsizei</ptype> <name>srcDepth</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMulticastFramebufferSampleLocationsfvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>gpu</name></param> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param><ptype>GLuint</ptype> <name>start</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMulticastGetQueryObjecti64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>gpu</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint64</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMulticastGetQueryObjectivNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>gpu</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMulticastGetQueryObjectui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>gpu</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint64</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMulticastGetQueryObjectuivNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>gpu</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMulticastWaitSyncNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>signalGpu</name></param> >+ <param><ptype>GLbitfield</ptype> <name>waitGpuMask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedBufferData</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param>const void *<name>data</name></param> >+ <param group="VertexBufferObjectUsage"><ptype>GLenum</ptype> <name>usage</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedBufferDataEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param len="COMPSIZE(size)">const void *<name>data</name></param> >+ <param group="VertexBufferObjectUsage"><ptype>GLenum</ptype> <name>usage</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedBufferPageCommitmentARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param><ptype>GLboolean</ptype> <name>commit</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedBufferPageCommitmentEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param><ptype>GLboolean</ptype> <name>commit</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedBufferStorage</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param len="size">const void *<name>data</name></param> >+ <param group="MapBufferUsageMask"><ptype>GLbitfield</ptype> <name>flags</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedBufferStorageExternalEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param><ptype>GLeglClientBufferEXT</ptype> <name>clientBuffer</name></param> >+ <param group="MapBufferUsageMask"><ptype>GLbitfield</ptype> <name>flags</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedBufferStorageEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param len="size">const void *<name>data</name></param> >+ <param group="MapBufferUsageMask"><ptype>GLbitfield</ptype> <name>flags</name></param> >+ <alias name="glNamedBufferStorage"/> >+ </command> >+ <command> >+ <proto>void <name>glNamedBufferStorageMemEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedBufferSubData</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param len="COMPSIZE(size)">const void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedBufferSubDataEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <param len="COMPSIZE(size)">const void *<name>data</name></param> >+ <alias name="glNamedBufferSubData"/> >+ </command> >+ <command> >+ <proto>void <name>glNamedCopyBufferSubDataEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>readBuffer</name></param> >+ <param><ptype>GLuint</ptype> <name>writeBuffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>readOffset</name></param> >+ <param><ptype>GLintptr</ptype> <name>writeOffset</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferDrawBuffer</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="ColorBuffer"><ptype>GLenum</ptype> <name>buf</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferDrawBuffers</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="ColorBuffer">const <ptype>GLenum</ptype> *<name>bufs</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferParameteri</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferParameteriEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferReadBuffer</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="ColorBuffer"><ptype>GLenum</ptype> <name>src</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferRenderbuffer</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>renderbuffertarget</name></param> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferRenderbufferEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>renderbuffertarget</name></param> >+ <param group="Renderbuffer"><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferSampleLocationsfvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param><ptype>GLuint</ptype> <name>start</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferSampleLocationsfvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param><ptype>GLuint</ptype> <name>start</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferTexture</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferSamplePositionsfvAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param><ptype>GLuint</ptype> <name>numsamples</name></param> >+ <param><ptype>GLuint</ptype> <name>pixelindex</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferTexture1DEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>textarget</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferTexture2DEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>textarget</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferTexture3DEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>textarget</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>zoffset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferTextureEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferTextureFaceEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>face</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferTextureLayer</name></proto> >+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>layer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedFramebufferTextureLayerEXT</name></proto> >+ <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param> >+ <param group="FramebufferAttachment"><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>layer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedProgramLocalParameter4dEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <param><ptype>GLdouble</ptype> <name>w</name></param> >+ <vecequiv name="glNamedProgramLocalParameter4dvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glNamedProgramLocalParameter4dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedProgramLocalParameter4fEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <param><ptype>GLfloat</ptype> <name>w</name></param> >+ <vecequiv name="glNamedProgramLocalParameter4fvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glNamedProgramLocalParameter4fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedProgramLocalParameterI4iEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLint</ptype> <name>z</name></param> >+ <param><ptype>GLint</ptype> <name>w</name></param> >+ <vecequiv name="glNamedProgramLocalParameterI4ivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glNamedProgramLocalParameterI4ivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedProgramLocalParameterI4uiEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>x</name></param> >+ <param><ptype>GLuint</ptype> <name>y</name></param> >+ <param><ptype>GLuint</ptype> <name>z</name></param> >+ <param><ptype>GLuint</ptype> <name>w</name></param> >+ <vecequiv name="glNamedProgramLocalParameterI4uivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glNamedProgramLocalParameterI4uivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedProgramLocalParameters4fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedProgramLocalParametersI4ivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedProgramLocalParametersI4uivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedProgramStringEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ProgramFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>len</name></param> >+ <param len="len">const void *<name>string</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedRenderbufferStorage</name></proto> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedRenderbufferStorageEXT</name></proto> >+ <param group="Renderbuffer"><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedRenderbufferStorageMultisample</name></proto> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedRenderbufferStorageMultisampleCoverageEXT</name></proto> >+ <param group="Renderbuffer"><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ <param><ptype>GLsizei</ptype> <name>coverageSamples</name></param> >+ <param><ptype>GLsizei</ptype> <name>colorSamples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedRenderbufferStorageMultisampleEXT</name></proto> >+ <param group="Renderbuffer"><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNamedStringARB</name></proto> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLint</ptype> <name>namelen</name></param> >+ <param len="namelen">const <ptype>GLchar</ptype> *<name>name</name></param> >+ <param><ptype>GLint</ptype> <name>stringlen</name></param> >+ <param len="stringlen">const <ptype>GLchar</ptype> *<name>string</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNewList</name></proto> >+ <param group="List"><ptype>GLuint</ptype> <name>list</name></param> >+ <param group="ListMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <glx type="single" opcode="101"/> >+ </command> >+ <command> >+ <proto><ptype>GLuint</ptype> <name>glNewObjectBufferATI</name></proto> >+ <param><ptype>GLsizei</ptype> <name>size</name></param> >+ <param len="size">const void *<name>pointer</name></param> >+ <param group="ArrayObjectUsageATI"><ptype>GLenum</ptype> <name>usage</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormal3b</name></proto> >+ <param><ptype>GLbyte</ptype> <name>nx</name></param> >+ <param><ptype>GLbyte</ptype> <name>ny</name></param> >+ <param><ptype>GLbyte</ptype> <name>nz</name></param> >+ <vecequiv name="glNormal3bv"/> >+ </command> >+ <command> >+ <proto>void <name>glNormal3bv</name></proto> >+ <param len="3">const <ptype>GLbyte</ptype> *<name>v</name></param> >+ <glx type="render" opcode="28"/> >+ </command> >+ <command> >+ <proto>void <name>glNormal3d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>nx</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>ny</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>nz</name></param> >+ <vecequiv name="glNormal3dv"/> >+ </command> >+ <command> >+ <proto>void <name>glNormal3dv</name></proto> >+ <param group="CoordD" len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="29"/> >+ </command> >+ <command> >+ <proto>void <name>glNormal3f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>nx</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>ny</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>nz</name></param> >+ <vecequiv name="glNormal3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glNormal3fVertex3fSUN</name></proto> >+ <param><ptype>GLfloat</ptype> <name>nx</name></param> >+ <param><ptype>GLfloat</ptype> <name>ny</name></param> >+ <param><ptype>GLfloat</ptype> <name>nz</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormal3fVertex3fvSUN</name></proto> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>n</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormal3fv</name></proto> >+ <param group="CoordF" len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="30"/> >+ </command> >+ <command> >+ <proto>void <name>glNormal3hNV</name></proto> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>nx</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>ny</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>nz</name></param> >+ <vecequiv name="glNormal3hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glNormal3hvNV</name></proto> >+ <param group="Half16NV" len="3">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4243"/> >+ </command> >+ <command> >+ <proto>void <name>glNormal3i</name></proto> >+ <param><ptype>GLint</ptype> <name>nx</name></param> >+ <param><ptype>GLint</ptype> <name>ny</name></param> >+ <param><ptype>GLint</ptype> <name>nz</name></param> >+ <vecequiv name="glNormal3iv"/> >+ </command> >+ <command> >+ <proto>void <name>glNormal3iv</name></proto> >+ <param len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="31"/> >+ </command> >+ <command> >+ <proto>void <name>glNormal3s</name></proto> >+ <param><ptype>GLshort</ptype> <name>nx</name></param> >+ <param><ptype>GLshort</ptype> <name>ny</name></param> >+ <param><ptype>GLshort</ptype> <name>nz</name></param> >+ <vecequiv name="glNormal3sv"/> >+ </command> >+ <command> >+ <proto>void <name>glNormal3sv</name></proto> >+ <param len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="32"/> >+ </command> >+ <command> >+ <proto>void <name>glNormal3x</name></proto> >+ <param><ptype>GLfixed</ptype> <name>nx</name></param> >+ <param><ptype>GLfixed</ptype> <name>ny</name></param> >+ <param><ptype>GLfixed</ptype> <name>nz</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormal3xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>nx</name></param> >+ <param><ptype>GLfixed</ptype> <name>ny</name></param> >+ <param><ptype>GLfixed</ptype> <name>nz</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormal3xvOES</name></proto> >+ <param len="3">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalFormatNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalP3ui</name></proto> >+ <param group="NormalPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalP3uiv</name></proto> >+ <param group="NormalPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalPointer</name></proto> >+ <param group="NormalPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalPointerEXT</name></proto> >+ <param group="NormalPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="COMPSIZE(type,stride,count)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalPointerListIBM</name></proto> >+ <param group="NormalPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLint</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(type,stride)">const void **<name>pointer</name></param> >+ <param><ptype>GLint</ptype> <name>ptrstride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalPointervINTEL</name></proto> >+ <param group="NormalPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="4">const void **<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalStream3bATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLbyte</ptype> <name>nx</name></param> >+ <param><ptype>GLbyte</ptype> <name>ny</name></param> >+ <param><ptype>GLbyte</ptype> <name>nz</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalStream3bvATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="3">const <ptype>GLbyte</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalStream3dATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLdouble</ptype> <name>nx</name></param> >+ <param><ptype>GLdouble</ptype> <name>ny</name></param> >+ <param><ptype>GLdouble</ptype> <name>nz</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalStream3dvATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="3">const <ptype>GLdouble</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalStream3fATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLfloat</ptype> <name>nx</name></param> >+ <param><ptype>GLfloat</ptype> <name>ny</name></param> >+ <param><ptype>GLfloat</ptype> <name>nz</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalStream3fvATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalStream3iATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLint</ptype> <name>nx</name></param> >+ <param><ptype>GLint</ptype> <name>ny</name></param> >+ <param><ptype>GLint</ptype> <name>nz</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalStream3ivATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="3">const <ptype>GLint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalStream3sATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLshort</ptype> <name>nx</name></param> >+ <param><ptype>GLshort</ptype> <name>ny</name></param> >+ <param><ptype>GLshort</ptype> <name>nz</name></param> >+ </command> >+ <command> >+ <proto>void <name>glNormalStream3svATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="3">const <ptype>GLshort</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glObjectLabel</name></proto> >+ <param group="ObjectIdentifier"><ptype>GLenum</ptype> <name>identifier</name></param> >+ <param><ptype>GLuint</ptype> <name>name</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param len="COMPSIZE(label,length)">const <ptype>GLchar</ptype> *<name>label</name></param> >+ </command> >+ <command> >+ <proto>void <name>glObjectLabelKHR</name></proto> >+ <param group="ObjectIdentifier"><ptype>GLenum</ptype> <name>identifier</name></param> >+ <param><ptype>GLuint</ptype> <name>name</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>label</name></param> >+ <alias name="glObjectLabel"/> >+ </command> >+ <command> >+ <proto>void <name>glObjectPtrLabel</name></proto> >+ <param>const void *<name>ptr</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param len="COMPSIZE(label,length)">const <ptype>GLchar</ptype> *<name>label</name></param> >+ </command> >+ <command> >+ <proto>void <name>glObjectPtrLabelKHR</name></proto> >+ <param>const void *<name>ptr</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>label</name></param> >+ <alias name="glObjectPtrLabel"/> >+ </command> >+ <command> >+ <proto><ptype>GLenum</ptype> <name>glObjectPurgeableAPPLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>objectType</name></param> >+ <param><ptype>GLuint</ptype> <name>name</name></param> >+ <param><ptype>GLenum</ptype> <name>option</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLenum</ptype> <name>glObjectUnpurgeableAPPLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>objectType</name></param> >+ <param><ptype>GLuint</ptype> <name>name</name></param> >+ <param><ptype>GLenum</ptype> <name>option</name></param> >+ </command> >+ <command> >+ <proto>void <name>glOrtho</name></proto> >+ <param><ptype>GLdouble</ptype> <name>left</name></param> >+ <param><ptype>GLdouble</ptype> <name>right</name></param> >+ <param><ptype>GLdouble</ptype> <name>bottom</name></param> >+ <param><ptype>GLdouble</ptype> <name>top</name></param> >+ <param><ptype>GLdouble</ptype> <name>zNear</name></param> >+ <param><ptype>GLdouble</ptype> <name>zFar</name></param> >+ <glx type="render" opcode="182"/> >+ </command> >+ <command> >+ <proto>void <name>glOrthof</name></proto> >+ <param><ptype>GLfloat</ptype> <name>l</name></param> >+ <param><ptype>GLfloat</ptype> <name>r</name></param> >+ <param><ptype>GLfloat</ptype> <name>b</name></param> >+ <param><ptype>GLfloat</ptype> <name>t</name></param> >+ <param><ptype>GLfloat</ptype> <name>n</name></param> >+ <param><ptype>GLfloat</ptype> <name>f</name></param> >+ </command> >+ <command> >+ <proto>void <name>glOrthofOES</name></proto> >+ <param><ptype>GLfloat</ptype> <name>l</name></param> >+ <param><ptype>GLfloat</ptype> <name>r</name></param> >+ <param><ptype>GLfloat</ptype> <name>b</name></param> >+ <param><ptype>GLfloat</ptype> <name>t</name></param> >+ <param><ptype>GLfloat</ptype> <name>n</name></param> >+ <param><ptype>GLfloat</ptype> <name>f</name></param> >+ <glx type="render" opcode="4311"/> >+ </command> >+ <command> >+ <proto>void <name>glOrthox</name></proto> >+ <param><ptype>GLfixed</ptype> <name>l</name></param> >+ <param><ptype>GLfixed</ptype> <name>r</name></param> >+ <param><ptype>GLfixed</ptype> <name>b</name></param> >+ <param><ptype>GLfixed</ptype> <name>t</name></param> >+ <param><ptype>GLfixed</ptype> <name>n</name></param> >+ <param><ptype>GLfixed</ptype> <name>f</name></param> >+ </command> >+ <command> >+ <proto>void <name>glOrthoxOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>l</name></param> >+ <param><ptype>GLfixed</ptype> <name>r</name></param> >+ <param><ptype>GLfixed</ptype> <name>b</name></param> >+ <param><ptype>GLfixed</ptype> <name>t</name></param> >+ <param><ptype>GLfixed</ptype> <name>n</name></param> >+ <param><ptype>GLfixed</ptype> <name>f</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPNTrianglesfATI</name></proto> >+ <param group="PNTrianglesPNameATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPNTrianglesiATI</name></proto> >+ <param group="PNTrianglesPNameATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPassTexCoordATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>dst</name></param> >+ <param><ptype>GLuint</ptype> <name>coord</name></param> >+ <param group="SwizzleOpATI"><ptype>GLenum</ptype> <name>swizzle</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPassThrough</name></proto> >+ <param group="FeedbackElement"><ptype>GLfloat</ptype> <name>token</name></param> >+ <glx type="render" opcode="123"/> >+ </command> >+ <command> >+ <proto>void <name>glPassThroughxOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>token</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPatchParameterfv</name></proto> >+ <param group="PatchParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPatchParameteri</name></proto> >+ <param group="PatchParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPatchParameteriEXT</name></proto> >+ <param group="PatchParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>value</name></param> >+ <alias name="glPatchParameteri"/> >+ </command> >+ <command> >+ <proto>void <name>glPatchParameteriOES</name></proto> >+ <param group="PatchParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>value</name></param> >+ <alias name="glPatchParameteri"/> >+ </command> >+ <command> >+ <proto>void <name>glPathColorGenNV</name></proto> >+ <param group="PathColor"><ptype>GLenum</ptype> <name>color</name></param> >+ <param group="PathGenMode"><ptype>GLenum</ptype> <name>genMode</name></param> >+ <param group="PathColorFormat"><ptype>GLenum</ptype> <name>colorFormat</name></param> >+ <param len="COMPSIZE(genMode,colorFormat)">const <ptype>GLfloat</ptype> *<name>coeffs</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathCommandsNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLsizei</ptype> <name>numCommands</name></param> >+ <param group="PathCommand" len="numCommands">const <ptype>GLubyte</ptype> *<name>commands</name></param> >+ <param><ptype>GLsizei</ptype> <name>numCoords</name></param> >+ <param group="PathCoordType"><ptype>GLenum</ptype> <name>coordType</name></param> >+ <param len="COMPSIZE(numCoords,coordType)">const void *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathCoordsNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLsizei</ptype> <name>numCoords</name></param> >+ <param group="PathCoordType"><ptype>GLenum</ptype> <name>coordType</name></param> >+ <param len="COMPSIZE(numCoords,coordType)">const void *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathCoverDepthFuncNV</name></proto> >+ <param group="DepthFunction"><ptype>GLenum</ptype> <name>func</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathDashArrayNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLsizei</ptype> <name>dashCount</name></param> >+ <param len="dashCount">const <ptype>GLfloat</ptype> *<name>dashArray</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathFogGenNV</name></proto> >+ <param group="PathGenMode"><ptype>GLenum</ptype> <name>genMode</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLenum</ptype> <name>glPathGlyphIndexArrayNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>firstPathName</name></param> >+ <param><ptype>GLenum</ptype> <name>fontTarget</name></param> >+ <param>const void *<name>fontName</name></param> >+ <param group="PathFontStyle"><ptype>GLbitfield</ptype> <name>fontStyle</name></param> >+ <param><ptype>GLuint</ptype> <name>firstGlyphIndex</name></param> >+ <param><ptype>GLsizei</ptype> <name>numGlyphs</name></param> >+ <param><ptype>GLuint</ptype> <name>pathParameterTemplate</name></param> >+ <param><ptype>GLfloat</ptype> <name>emScale</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLenum</ptype> <name>glPathGlyphIndexRangeNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>fontTarget</name></param> >+ <param>const void *<name>fontName</name></param> >+ <param group="PathFontStyle"><ptype>GLbitfield</ptype> <name>fontStyle</name></param> >+ <param><ptype>GLuint</ptype> <name>pathParameterTemplate</name></param> >+ <param><ptype>GLfloat</ptype> <name>emScale</name></param> >+ <param><ptype>GLuint</ptype> <name>baseAndCount</name>[2]</param> >+ </command> >+ <command> >+ <proto>void <name>glPathGlyphRangeNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>firstPathName</name></param> >+ <param group="PathFontTarget"><ptype>GLenum</ptype> <name>fontTarget</name></param> >+ <param len="COMPSIZE(fontTarget,fontName)">const void *<name>fontName</name></param> >+ <param group="PathFontStyle"><ptype>GLbitfield</ptype> <name>fontStyle</name></param> >+ <param><ptype>GLuint</ptype> <name>firstGlyph</name></param> >+ <param><ptype>GLsizei</ptype> <name>numGlyphs</name></param> >+ <param group="PathHandleMissingGlyphs"><ptype>GLenum</ptype> <name>handleMissingGlyphs</name></param> >+ <param group="Path"><ptype>GLuint</ptype> <name>pathParameterTemplate</name></param> >+ <param><ptype>GLfloat</ptype> <name>emScale</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathGlyphsNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>firstPathName</name></param> >+ <param group="PathFontTarget"><ptype>GLenum</ptype> <name>fontTarget</name></param> >+ <param len="COMPSIZE(fontTarget,fontName)">const void *<name>fontName</name></param> >+ <param group="PathFontStyle"><ptype>GLbitfield</ptype> <name>fontStyle</name></param> >+ <param><ptype>GLsizei</ptype> <name>numGlyphs</name></param> >+ <param group="PathElementType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(numGlyphs,type,charcodes)">const void *<name>charcodes</name></param> >+ <param group="PathHandleMissingGlyphs"><ptype>GLenum</ptype> <name>handleMissingGlyphs</name></param> >+ <param group="Path"><ptype>GLuint</ptype> <name>pathParameterTemplate</name></param> >+ <param><ptype>GLfloat</ptype> <name>emScale</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLenum</ptype> <name>glPathMemoryGlyphIndexArrayNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>firstPathName</name></param> >+ <param><ptype>GLenum</ptype> <name>fontTarget</name></param> >+ <param><ptype>GLsizeiptr</ptype> <name>fontSize</name></param> >+ <param>const void *<name>fontData</name></param> >+ <param><ptype>GLsizei</ptype> <name>faceIndex</name></param> >+ <param><ptype>GLuint</ptype> <name>firstGlyphIndex</name></param> >+ <param><ptype>GLsizei</ptype> <name>numGlyphs</name></param> >+ <param><ptype>GLuint</ptype> <name>pathParameterTemplate</name></param> >+ <param><ptype>GLfloat</ptype> <name>emScale</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathParameterfNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param group="PathParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathParameterfvNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param group="PathParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathParameteriNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param group="PathParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathParameterivNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param group="PathParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathStencilDepthOffsetNV</name></proto> >+ <param><ptype>GLfloat</ptype> <name>factor</name></param> >+ <param><ptype>GLfloat</ptype> <name>units</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathStencilFuncNV</name></proto> >+ <param group="StencilFunction"><ptype>GLenum</ptype> <name>func</name></param> >+ <param group="ClampedStencilValue"><ptype>GLint</ptype> <name>ref</name></param> >+ <param group="MaskedStencilValue"><ptype>GLuint</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathStringNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param group="PathStringFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param len="length">const void *<name>pathString</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathSubCommandsNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLsizei</ptype> <name>commandStart</name></param> >+ <param><ptype>GLsizei</ptype> <name>commandsToDelete</name></param> >+ <param><ptype>GLsizei</ptype> <name>numCommands</name></param> >+ <param group="PathCommand" len="numCommands">const <ptype>GLubyte</ptype> *<name>commands</name></param> >+ <param><ptype>GLsizei</ptype> <name>numCoords</name></param> >+ <param group="PathCoordType"><ptype>GLenum</ptype> <name>coordType</name></param> >+ <param len="COMPSIZE(numCoords,coordType)">const void *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathSubCoordsNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLsizei</ptype> <name>coordStart</name></param> >+ <param><ptype>GLsizei</ptype> <name>numCoords</name></param> >+ <param group="PathCoordType"><ptype>GLenum</ptype> <name>coordType</name></param> >+ <param len="COMPSIZE(numCoords,coordType)">const void *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathTexGenNV</name></proto> >+ <param group="PathColor"><ptype>GLenum</ptype> <name>texCoordSet</name></param> >+ <param group="PathGenMode"><ptype>GLenum</ptype> <name>genMode</name></param> >+ <param><ptype>GLint</ptype> <name>components</name></param> >+ <param len="COMPSIZE(genMode,components)">const <ptype>GLfloat</ptype> *<name>coeffs</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPauseTransformFeedback</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glPauseTransformFeedbackNV</name></proto> >+ <alias name="glPauseTransformFeedback"/> >+ </command> >+ <command> >+ <proto>void <name>glPixelDataRangeNV</name></proto> >+ <param group="PixelDataRangeTargetNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param len="length">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPixelMapfv</name></proto> >+ <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param> >+ <param group="CheckedInt32"><ptype>GLsizei</ptype> <name>mapsize</name></param> >+ <param len="mapsize">const <ptype>GLfloat</ptype> *<name>values</name></param> >+ <glx type="render" opcode="168"/> >+ <glx type="render" opcode="323" name="glPixelMapfvPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glPixelMapuiv</name></proto> >+ <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param> >+ <param group="CheckedInt32"><ptype>GLsizei</ptype> <name>mapsize</name></param> >+ <param len="mapsize">const <ptype>GLuint</ptype> *<name>values</name></param> >+ <glx type="render" opcode="169"/> >+ <glx type="render" opcode="324" name="glPixelMapuivPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glPixelMapusv</name></proto> >+ <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param> >+ <param group="CheckedInt32"><ptype>GLsizei</ptype> <name>mapsize</name></param> >+ <param len="mapsize">const <ptype>GLushort</ptype> *<name>values</name></param> >+ <glx type="render" opcode="170"/> >+ <glx type="render" opcode="325" name="glPixelMapusvPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glPixelMapx</name></proto> >+ <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param len="size">const <ptype>GLfixed</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPixelStoref</name></proto> >+ <param group="PixelStoreParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <glx type="single" opcode="109"/> >+ </command> >+ <command> >+ <proto>void <name>glPixelStorei</name></proto> >+ <param group="PixelStoreParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ <glx type="single" opcode="110"/> >+ </command> >+ <command> >+ <proto>void <name>glPixelStorex</name></proto> >+ <param group="PixelStoreParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPixelTexGenParameterfSGIS</name></proto> >+ <param group="PixelTexGenParameterNameSGIS"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPixelTexGenParameterfvSGIS</name></proto> >+ <param group="PixelTexGenParameterNameSGIS"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPixelTexGenParameteriSGIS</name></proto> >+ <param group="PixelTexGenParameterNameSGIS"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPixelTexGenParameterivSGIS</name></proto> >+ <param group="PixelTexGenParameterNameSGIS"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPixelTexGenSGIX</name></proto> >+ <param group="PixelTexGenModeSGIX"><ptype>GLenum</ptype> <name>mode</name></param> >+ <glx type="render" opcode="2059"/> >+ </command> >+ <command> >+ <proto>void <name>glPixelTransferf</name></proto> >+ <param group="PixelTransferParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <glx type="render" opcode="166"/> >+ </command> >+ <command> >+ <proto>void <name>glPixelTransferi</name></proto> >+ <param group="PixelTransferParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ <glx type="render" opcode="167"/> >+ </command> >+ <command> >+ <proto>void <name>glPixelTransferxOES</name></proto> >+ <param group="PixelTransferParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPixelTransformParameterfEXT</name></proto> >+ <param group="PixelTransformTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelTransformPNameEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat</ptype> <name>param</name></param> >+ <glx type="render" opcode="16385"/> >+ </command> >+ <command> >+ <proto>void <name>glPixelTransformParameterfvEXT</name></proto> >+ <param group="PixelTransformTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelTransformPNameEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPixelTransformParameteriEXT</name></proto> >+ <param group="PixelTransformTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelTransformPNameEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ <glx type="render" opcode="16386"/> >+ </command> >+ <command> >+ <proto>void <name>glPixelTransformParameterivEXT</name></proto> >+ <param group="PixelTransformTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="PixelTransformPNameEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="1">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPixelZoom</name></proto> >+ <param><ptype>GLfloat</ptype> <name>xfactor</name></param> >+ <param><ptype>GLfloat</ptype> <name>yfactor</name></param> >+ <glx type="render" opcode="165"/> >+ </command> >+ <command> >+ <proto>void <name>glPixelZoomxOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>xfactor</name></param> >+ <param><ptype>GLfixed</ptype> <name>yfactor</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glPointAlongPathNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLsizei</ptype> <name>startSegment</name></param> >+ <param><ptype>GLsizei</ptype> <name>numSegments</name></param> >+ <param><ptype>GLfloat</ptype> <name>distance</name></param> >+ <param len="1"><ptype>GLfloat</ptype> *<name>x</name></param> >+ <param len="1"><ptype>GLfloat</ptype> *<name>y</name></param> >+ <param len="1"><ptype>GLfloat</ptype> *<name>tangentX</name></param> >+ <param len="1"><ptype>GLfloat</ptype> *<name>tangentY</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPointParameterf</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <glx type="render" opcode="2065"/> >+ </command> >+ <command> >+ <proto>void <name>glPointParameterfARB</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <alias name="glPointParameterf"/> >+ <glx type="render" opcode="2065"/> >+ </command> >+ <command> >+ <proto>void <name>glPointParameterfEXT</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <alias name="glPointParameterf"/> >+ </command> >+ <command> >+ <proto>void <name>glPointParameterfSGIS</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <alias name="glPointParameterf"/> >+ </command> >+ <command> >+ <proto>void <name>glPointParameterfv</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="2066"/> >+ </command> >+ <command> >+ <proto>void <name>glPointParameterfvARB</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <alias name="glPointParameterfv"/> >+ <glx type="render" opcode="2066"/> >+ </command> >+ <command> >+ <proto>void <name>glPointParameterfvEXT</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <alias name="glPointParameterfv"/> >+ </command> >+ <command> >+ <proto>void <name>glPointParameterfvSGIS</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <alias name="glPointParameterfv"/> >+ </command> >+ <command> >+ <proto>void <name>glPointParameteri</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ <glx type="render" opcode="4221"/> >+ </command> >+ <command> >+ <proto>void <name>glPointParameteriNV</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ <alias name="glPointParameteri"/> >+ <glx type="render" opcode="4221"/> >+ </command> >+ <command> >+ <proto>void <name>glPointParameteriv</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="4222"/> >+ </command> >+ <command> >+ <proto>void <name>glPointParameterivNV</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glPointParameteriv"/> >+ <glx type="render" opcode="4222"/> >+ </command> >+ <command> >+ <proto>void <name>glPointParameterx</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPointParameterxOES</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPointParameterxv</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPointParameterxvOES</name></proto> >+ <param group="PointParameterNameARB"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPointSize</name></proto> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>size</name></param> >+ <glx type="render" opcode="100"/> >+ </command> >+ <command> >+ <proto>void <name>glPointSizePointerOES</name></proto> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPointSizex</name></proto> >+ <param><ptype>GLfixed</ptype> <name>size</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPointSizexOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>size</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glPollAsyncSGIX</name></proto> >+ <param len="1"><ptype>GLuint</ptype> *<name>markerp</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glPollInstrumentsSGIX</name></proto> >+ <param len="1"><ptype>GLint</ptype> *<name>marker_p</name></param> >+ <glx type="vendor" opcode="4104"/> >+ </command> >+ <command> >+ <proto>void <name>glPolygonMode</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="PolygonMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <glx type="render" opcode="101"/> >+ </command> >+ <command> >+ <proto>void <name>glPolygonModeNV</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="PolygonMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <alias name="glPolygonMode"/> >+ </command> >+ <command> >+ <proto>void <name>glPolygonOffset</name></proto> >+ <param><ptype>GLfloat</ptype> <name>factor</name></param> >+ <param><ptype>GLfloat</ptype> <name>units</name></param> >+ <glx type="render" opcode="192"/> >+ </command> >+ <command> >+ <proto>void <name>glPolygonOffsetClamp</name></proto> >+ <param><ptype>GLfloat</ptype> <name>factor</name></param> >+ <param><ptype>GLfloat</ptype> <name>units</name></param> >+ <param><ptype>GLfloat</ptype> <name>clamp</name></param> >+ <glx type="render" opcode="4225"/> >+ </command> >+ <command> >+ <proto>void <name>glPolygonOffsetClampEXT</name></proto> >+ <param><ptype>GLfloat</ptype> <name>factor</name></param> >+ <param><ptype>GLfloat</ptype> <name>units</name></param> >+ <param><ptype>GLfloat</ptype> <name>clamp</name></param> >+ <alias name="glPolygonOffsetClamp"/> >+ </command> >+ <command> >+ <proto>void <name>glPolygonOffsetEXT</name></proto> >+ <param><ptype>GLfloat</ptype> <name>factor</name></param> >+ <param><ptype>GLfloat</ptype> <name>bias</name></param> >+ <glx type="render" opcode="4098"/> >+ </command> >+ <command> >+ <proto>void <name>glPolygonOffsetx</name></proto> >+ <param><ptype>GLfixed</ptype> <name>factor</name></param> >+ <param><ptype>GLfixed</ptype> <name>units</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPolygonOffsetxOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>factor</name></param> >+ <param><ptype>GLfixed</ptype> <name>units</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPolygonStipple</name></proto> >+ <param len="COMPSIZE()">const <ptype>GLubyte</ptype> *<name>mask</name></param> >+ <glx type="render" opcode="102"/> >+ <glx type="render" opcode="326" name="glPolygonStipplePBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glPopAttrib</name></proto> >+ <glx type="render" opcode="141"/> >+ </command> >+ <command> >+ <proto>void <name>glPopClientAttrib</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glPopDebugGroup</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glPopDebugGroupKHR</name></proto> >+ <alias name="glPopDebugGroup"/> >+ </command> >+ <command> >+ <proto>void <name>glPopGroupMarkerEXT</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glPopMatrix</name></proto> >+ <glx type="render" opcode="183"/> >+ </command> >+ <command> >+ <proto>void <name>glPopName</name></proto> >+ <glx type="render" opcode="124"/> >+ </command> >+ <command> >+ <proto>void <name>glPresentFrameDualFillNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_slot</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>minPresentTime</name></param> >+ <param><ptype>GLuint</ptype> <name>beginPresentTimeId</name></param> >+ <param><ptype>GLuint</ptype> <name>presentDurationId</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLenum</ptype> <name>target0</name></param> >+ <param><ptype>GLuint</ptype> <name>fill0</name></param> >+ <param><ptype>GLenum</ptype> <name>target1</name></param> >+ <param><ptype>GLuint</ptype> <name>fill1</name></param> >+ <param><ptype>GLenum</ptype> <name>target2</name></param> >+ <param><ptype>GLuint</ptype> <name>fill2</name></param> >+ <param><ptype>GLenum</ptype> <name>target3</name></param> >+ <param><ptype>GLuint</ptype> <name>fill3</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPresentFrameKeyedNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_slot</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>minPresentTime</name></param> >+ <param><ptype>GLuint</ptype> <name>beginPresentTimeId</name></param> >+ <param><ptype>GLuint</ptype> <name>presentDurationId</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLenum</ptype> <name>target0</name></param> >+ <param><ptype>GLuint</ptype> <name>fill0</name></param> >+ <param><ptype>GLuint</ptype> <name>key0</name></param> >+ <param><ptype>GLenum</ptype> <name>target1</name></param> >+ <param><ptype>GLuint</ptype> <name>fill1</name></param> >+ <param><ptype>GLuint</ptype> <name>key1</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPrimitiveBoundingBox</name></proto> >+ <param><ptype>GLfloat</ptype> <name>minX</name></param> >+ <param><ptype>GLfloat</ptype> <name>minY</name></param> >+ <param><ptype>GLfloat</ptype> <name>minZ</name></param> >+ <param><ptype>GLfloat</ptype> <name>minW</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxX</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxY</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxZ</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxW</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPrimitiveBoundingBoxARB</name></proto> >+ <param><ptype>GLfloat</ptype> <name>minX</name></param> >+ <param><ptype>GLfloat</ptype> <name>minY</name></param> >+ <param><ptype>GLfloat</ptype> <name>minZ</name></param> >+ <param><ptype>GLfloat</ptype> <name>minW</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxX</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxY</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxZ</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxW</name></param> >+ <alias name="glPrimitiveBoundingBox"/> >+ </command> >+ <command> >+ <proto>void <name>glPrimitiveBoundingBoxEXT</name></proto> >+ <param><ptype>GLfloat</ptype> <name>minX</name></param> >+ <param><ptype>GLfloat</ptype> <name>minY</name></param> >+ <param><ptype>GLfloat</ptype> <name>minZ</name></param> >+ <param><ptype>GLfloat</ptype> <name>minW</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxX</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxY</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxZ</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxW</name></param> >+ <alias name="glPrimitiveBoundingBox"/> >+ </command> >+ <command> >+ <proto>void <name>glPrimitiveBoundingBoxOES</name></proto> >+ <param><ptype>GLfloat</ptype> <name>minX</name></param> >+ <param><ptype>GLfloat</ptype> <name>minY</name></param> >+ <param><ptype>GLfloat</ptype> <name>minZ</name></param> >+ <param><ptype>GLfloat</ptype> <name>minW</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxX</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxY</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxZ</name></param> >+ <param><ptype>GLfloat</ptype> <name>maxW</name></param> >+ <alias name="glPrimitiveBoundingBox"/> >+ </command> >+ <command> >+ <proto>void <name>glPrimitiveRestartIndex</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPrimitiveRestartIndexNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <glx type="render" opcode="365"/> >+ </command> >+ <command> >+ <proto>void <name>glPrimitiveRestartNV</name></proto> >+ <glx type="render" opcode="364"/> >+ </command> >+ <command> >+ <proto>void <name>glPrioritizeTextures</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="Texture" len="n">const <ptype>GLuint</ptype> *<name>textures</name></param> >+ <param len="n">const <ptype>GLfloat</ptype> *<name>priorities</name></param> >+ <glx type="render" opcode="4118"/> >+ </command> >+ <command> >+ <proto>void <name>glPrioritizeTexturesEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="Texture" len="n">const <ptype>GLuint</ptype> *<name>textures</name></param> >+ <param group="ClampedFloat32" len="n">const <ptype>GLclampf</ptype> *<name>priorities</name></param> >+ <alias name="glPrioritizeTextures"/> >+ <glx type="render" opcode="4118"/> >+ </command> >+ <command> >+ <proto>void <name>glPrioritizeTexturesxOES</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>textures</name></param> >+ <param group="ClampedFixed" len="n">const <ptype>GLfixed</ptype> *<name>priorities</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramBinary</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLenum</ptype> <name>binaryFormat</name></param> >+ <param len="length">const void *<name>binary</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramBinaryOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLenum</ptype> <name>binaryFormat</name></param> >+ <param len="length">const void *<name>binary</name></param> >+ <param><ptype>GLint</ptype> <name>length</name></param> >+ <alias name="glProgramBinary"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramBufferParametersIivNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>bindingIndex</name></param> >+ <param><ptype>GLuint</ptype> <name>wordIndex</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramBufferParametersIuivNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>bindingIndex</name></param> >+ <param><ptype>GLuint</ptype> <name>wordIndex</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramBufferParametersfvNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>bindingIndex</name></param> >+ <param><ptype>GLuint</ptype> <name>wordIndex</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramEnvParameter4dARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <param><ptype>GLdouble</ptype> <name>w</name></param> >+ <vecequiv name="glProgramEnvParameter4dvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramEnvParameter4dvARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramEnvParameter4fARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <param><ptype>GLfloat</ptype> <name>w</name></param> >+ <vecequiv name="glProgramEnvParameter4fvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramEnvParameter4fvARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramEnvParameterI4iNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLint</ptype> <name>z</name></param> >+ <param><ptype>GLint</ptype> <name>w</name></param> >+ <vecequiv name="glProgramEnvParameterI4ivNV"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramEnvParameterI4ivNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramEnvParameterI4uiNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>x</name></param> >+ <param><ptype>GLuint</ptype> <name>y</name></param> >+ <param><ptype>GLuint</ptype> <name>z</name></param> >+ <param><ptype>GLuint</ptype> <name>w</name></param> >+ <vecequiv name="glProgramEnvParameterI4uivNV"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramEnvParameterI4uivNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramEnvParameters4fvEXT</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="4281"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramEnvParametersI4ivNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramEnvParametersI4uivNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramLocalParameter4dARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <param><ptype>GLdouble</ptype> <name>w</name></param> >+ <vecequiv name="glProgramLocalParameter4dvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramLocalParameter4dvARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramLocalParameter4fARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <param><ptype>GLfloat</ptype> <name>w</name></param> >+ <vecequiv name="glProgramLocalParameter4fvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramLocalParameter4fvARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramLocalParameterI4iNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLint</ptype> <name>z</name></param> >+ <param><ptype>GLint</ptype> <name>w</name></param> >+ <vecequiv name="glProgramLocalParameterI4ivNV"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramLocalParameterI4ivNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramLocalParameterI4uiNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>x</name></param> >+ <param><ptype>GLuint</ptype> <name>y</name></param> >+ <param><ptype>GLuint</ptype> <name>z</name></param> >+ <param><ptype>GLuint</ptype> <name>w</name></param> >+ <vecequiv name="glProgramLocalParameterI4uivNV"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramLocalParameterI4uivNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramLocalParameters4fvEXT</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="4282"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramLocalParametersI4ivNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramLocalParametersI4uivNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramNamedParameter4dNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLsizei</ptype> <name>len</name></param> >+ <param len="1">const <ptype>GLubyte</ptype> *<name>name</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <param><ptype>GLdouble</ptype> <name>w</name></param> >+ <vecequiv name="glProgramNamedParameter4dvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramNamedParameter4dvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLsizei</ptype> <name>len</name></param> >+ <param len="1">const <ptype>GLubyte</ptype> *<name>name</name></param> >+ <param len="4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4219"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramNamedParameter4fNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLsizei</ptype> <name>len</name></param> >+ <param len="1">const <ptype>GLubyte</ptype> *<name>name</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <param><ptype>GLfloat</ptype> <name>w</name></param> >+ <vecequiv name="glProgramNamedParameter4fvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramNamedParameter4fvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLsizei</ptype> <name>len</name></param> >+ <param len="1">const <ptype>GLubyte</ptype> *<name>name</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4218"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramParameter4dNV</name></proto> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <param><ptype>GLdouble</ptype> <name>w</name></param> >+ <vecequiv name="glProgramParameter4dvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramParameter4dvNV</name></proto> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4185"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramParameter4fNV</name></proto> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <param><ptype>GLfloat</ptype> <name>w</name></param> >+ <vecequiv name="glProgramParameter4fvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramParameter4fvNV</name></proto> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4184"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramParameteri</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramParameterPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramParameteriARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramParameterPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>value</name></param> >+ <alias name="glProgramParameteri"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramParameteriEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param group="ProgramParameterPName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>value</name></param> >+ <alias name="glProgramParameteri"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramParameters4dvNV</name></proto> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4187"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramParameters4fvNV</name></proto> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4186"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramPathFragmentInputGenNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLenum</ptype> <name>genMode</name></param> >+ <param><ptype>GLint</ptype> <name>components</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>coeffs</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramStringARB</name></proto> >+ <param group="ProgramTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="ProgramFormatARB"><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>len</name></param> >+ <param len="len">const void *<name>string</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramSubroutineParametersuivNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1d</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLdouble</ptype> <name>v0</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1dEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1f</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1fEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ <alias name="glProgramUniform1f"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glProgramUniform1fv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1i</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1i64ARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1i64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1i64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1i64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1iEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ <alias name="glProgramUniform1i"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1iv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1ivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLint</ptype> *<name>value</name></param> >+ <alias name="glProgramUniform1iv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1ui</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1ui64ARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1ui64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1ui64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1ui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1uiEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ <alias name="glProgramUniform1ui"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1uiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform1uivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>value</name></param> >+ <alias name="glProgramUniform1uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2d</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLdouble</ptype> <name>v0</name></param> >+ <param><ptype>GLdouble</ptype> <name>v1</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2dEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2f</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ <param><ptype>GLfloat</ptype> <name>v1</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2fEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ <param><ptype>GLfloat</ptype> <name>v1</name></param> >+ <alias name="glProgramUniform2f"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glProgramUniform2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2i</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ <param><ptype>GLint</ptype> <name>v1</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2i64ARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64</ptype> <name>x</name></param> >+ <param><ptype>GLint64</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2i64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2i64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2i64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2iEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ <param><ptype>GLint</ptype> <name>v1</name></param> >+ <alias name="glProgramUniform2i"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2iv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2ivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLint</ptype> *<name>value</name></param> >+ <alias name="glProgramUniform2iv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2ui</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ <param><ptype>GLuint</ptype> <name>v1</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2ui64ARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64</ptype> <name>x</name></param> >+ <param><ptype>GLuint64</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2ui64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2ui64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLuint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2ui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLuint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2uiEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ <param><ptype>GLuint</ptype> <name>v1</name></param> >+ <alias name="glProgramUniform2ui"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2uiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform2uivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLuint</ptype> *<name>value</name></param> >+ <alias name="glProgramUniform2uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3d</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLdouble</ptype> <name>v0</name></param> >+ <param><ptype>GLdouble</ptype> <name>v1</name></param> >+ <param><ptype>GLdouble</ptype> <name>v2</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3dEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3f</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ <param><ptype>GLfloat</ptype> <name>v1</name></param> >+ <param><ptype>GLfloat</ptype> <name>v2</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3fEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ <param><ptype>GLfloat</ptype> <name>v1</name></param> >+ <param><ptype>GLfloat</ptype> <name>v2</name></param> >+ <alias name="glProgramUniform3f"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glProgramUniform3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3i</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ <param><ptype>GLint</ptype> <name>v1</name></param> >+ <param><ptype>GLint</ptype> <name>v2</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3i64ARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64</ptype> <name>x</name></param> >+ <param><ptype>GLint64</ptype> <name>y</name></param> >+ <param><ptype>GLint64</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3i64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>y</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3i64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3i64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3iEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ <param><ptype>GLint</ptype> <name>v1</name></param> >+ <param><ptype>GLint</ptype> <name>v2</name></param> >+ <alias name="glProgramUniform3i"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3iv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3ivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLint</ptype> *<name>value</name></param> >+ <alias name="glProgramUniform3iv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3ui</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ <param><ptype>GLuint</ptype> <name>v1</name></param> >+ <param><ptype>GLuint</ptype> <name>v2</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3ui64ARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64</ptype> <name>x</name></param> >+ <param><ptype>GLuint64</ptype> <name>y</name></param> >+ <param><ptype>GLuint64</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3ui64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>y</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3ui64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLuint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3ui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLuint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3uiEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ <param><ptype>GLuint</ptype> <name>v1</name></param> >+ <param><ptype>GLuint</ptype> <name>v2</name></param> >+ <alias name="glProgramUniform3ui"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3uiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform3uivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLuint</ptype> *<name>value</name></param> >+ <alias name="glProgramUniform3uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4d</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLdouble</ptype> <name>v0</name></param> >+ <param><ptype>GLdouble</ptype> <name>v1</name></param> >+ <param><ptype>GLdouble</ptype> <name>v2</name></param> >+ <param><ptype>GLdouble</ptype> <name>v3</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4dEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <param><ptype>GLdouble</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4f</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ <param><ptype>GLfloat</ptype> <name>v1</name></param> >+ <param><ptype>GLfloat</ptype> <name>v2</name></param> >+ <param><ptype>GLfloat</ptype> <name>v3</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4fEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ <param><ptype>GLfloat</ptype> <name>v1</name></param> >+ <param><ptype>GLfloat</ptype> <name>v2</name></param> >+ <param><ptype>GLfloat</ptype> <name>v3</name></param> >+ <alias name="glProgramUniform4f"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glProgramUniform4fv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4i</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ <param><ptype>GLint</ptype> <name>v1</name></param> >+ <param><ptype>GLint</ptype> <name>v2</name></param> >+ <param><ptype>GLint</ptype> <name>v3</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4i64ARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64</ptype> <name>x</name></param> >+ <param><ptype>GLint64</ptype> <name>y</name></param> >+ <param><ptype>GLint64</ptype> <name>z</name></param> >+ <param><ptype>GLint64</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4i64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>y</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>z</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4i64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4i64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4iEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ <param><ptype>GLint</ptype> <name>v1</name></param> >+ <param><ptype>GLint</ptype> <name>v2</name></param> >+ <param><ptype>GLint</ptype> <name>v3</name></param> >+ <alias name="glProgramUniform4i"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4iv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4ivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLint</ptype> *<name>value</name></param> >+ <alias name="glProgramUniform4iv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4ui</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ <param><ptype>GLuint</ptype> <name>v1</name></param> >+ <param><ptype>GLuint</ptype> <name>v2</name></param> >+ <param><ptype>GLuint</ptype> <name>v3</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4ui64ARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64</ptype> <name>x</name></param> >+ <param><ptype>GLuint64</ptype> <name>y</name></param> >+ <param><ptype>GLuint64</ptype> <name>z</name></param> >+ <param><ptype>GLuint64</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4ui64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>y</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>z</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4ui64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLuint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4ui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLuint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4uiEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ <param><ptype>GLuint</ptype> <name>v1</name></param> >+ <param><ptype>GLuint</ptype> <name>v2</name></param> >+ <param><ptype>GLuint</ptype> <name>v3</name></param> >+ <alias name="glProgramUniform4ui"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4uiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniform4uivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLuint</ptype> *<name>value</name></param> >+ <alias name="glProgramUniform4uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformHandleui64ARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformHandleui64IMG</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64</ptype> <name>value</name></param> >+ <alias name="glProgramUniformHandleui64ARB"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformHandleui64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformHandleui64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint64</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformHandleui64vIMG</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint64</ptype> *<name>values</name></param> >+ <alias name="glProgramUniformHandleui64vARB"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformHandleui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint64</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix2dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*4">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix2dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*4">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix2fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*4">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix2fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*4">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glProgramUniformMatrix2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix2x3dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*6">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix2x3dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*6">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix2x3fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*6">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix2x3fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*6">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glProgramUniformMatrix2x3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix2x4dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*8">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix2x4dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*8">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix2x4fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*8">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix2x4fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*8">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glProgramUniformMatrix2x4fv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix3dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*9">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix3dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*9">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix3fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*9">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix3fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*9">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glProgramUniformMatrix3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix3x2dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*6">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix3x2dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*6">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix3x2fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*6">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix3x2fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*6">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glProgramUniformMatrix3x2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix3x4dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*12">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix3x4dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*12">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix3x4fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*12">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix3x4fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*12">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glProgramUniformMatrix3x4fv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix4dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*16">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix4dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*16">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix4fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*16">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix4fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*16">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glProgramUniformMatrix4fv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix4x2dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*8">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix4x2dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*8">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix4x2fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*8">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix4x2fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*8">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glProgramUniformMatrix4x2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix4x3dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*12">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix4x3dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*12">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix4x3fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*12">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformMatrix4x3fvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*12">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glProgramUniformMatrix4x3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformui64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramUniformui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramVertexLimitNV</name></proto> >+ <param group="ProgramTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>limit</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProvokingVertex</name></proto> >+ <param group="VertexProvokingMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProvokingVertexEXT</name></proto> >+ <param group="VertexProvokingMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <alias name="glProvokingVertex"/> >+ </command> >+ <command> >+ <proto>void <name>glPushAttrib</name></proto> >+ <param group="AttribMask"><ptype>GLbitfield</ptype> <name>mask</name></param> >+ <glx type="render" opcode="142"/> >+ </command> >+ <command> >+ <proto>void <name>glPushClientAttrib</name></proto> >+ <param group="ClientAttribMask"><ptype>GLbitfield</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPushClientAttribDefaultEXT</name></proto> >+ <param group="ClientAttribMask"><ptype>GLbitfield</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPushDebugGroup</name></proto> >+ <param group="DebugSource"><ptype>GLenum</ptype> <name>source</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param len="COMPSIZE(message,length)">const <ptype>GLchar</ptype> *<name>message</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPushDebugGroupKHR</name></proto> >+ <param group="DebugSource"><ptype>GLenum</ptype> <name>source</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>message</name></param> >+ <alias name="glPushDebugGroup"/> >+ </command> >+ <command> >+ <proto>void <name>glPushGroupMarkerEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>marker</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPushMatrix</name></proto> >+ <glx type="render" opcode="184"/> >+ </command> >+ <command> >+ <proto>void <name>glPushName</name></proto> >+ <param group="SelectName"><ptype>GLuint</ptype> <name>name</name></param> >+ <glx type="render" opcode="125"/> >+ </command> >+ <command> >+ <proto>void <name>glQueryCounter</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto>void <name>glQueryCounterEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <alias name="glQueryCounter"/> >+ </command> >+ <command> >+ <proto><ptype>GLbitfield</ptype> <name>glQueryMatrixxOES</name></proto> >+ <param len="16"><ptype>GLfixed</ptype> *<name>mantissa</name></param> >+ <param len="16"><ptype>GLint</ptype> *<name>exponent</name></param> >+ </command> >+ <command> >+ <proto>void <name>glQueryObjectParameteruiAMD</name></proto> >+ <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="OcclusionQueryEventMaskAMD"><ptype>GLuint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glQueryResourceNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>queryType</name></param> >+ <param><ptype>GLint</ptype> <name>tagId</name></param> >+ <param><ptype>GLuint</ptype> <name>bufSize</name></param> >+ <param><ptype>GLint</ptype> *<name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glQueryResourceTagNV</name></proto> >+ <param><ptype>GLint</ptype> <name>tagId</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>tagString</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos2d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y</name></param> >+ <vecequiv name="glRasterPos2dv"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos2dv</name></proto> >+ <param group="CoordD" len="2">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="33"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos2f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y</name></param> >+ <vecequiv name="glRasterPos2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos2fv</name></proto> >+ <param group="CoordF" len="2">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="34"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos2i</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y</name></param> >+ <vecequiv name="glRasterPos2iv"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos2iv</name></proto> >+ <param group="CoordI" len="2">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="35"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos2s</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y</name></param> >+ <vecequiv name="glRasterPos2sv"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos2sv</name></proto> >+ <param group="CoordS" len="2">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="36"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos2xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>x</name></param> >+ <param><ptype>GLfixed</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos2xvOES</name></proto> >+ <param len="2">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos3d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>z</name></param> >+ <vecequiv name="glRasterPos3dv"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos3dv</name></proto> >+ <param group="CoordD" len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="37"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos3f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>z</name></param> >+ <vecequiv name="glRasterPos3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos3fv</name></proto> >+ <param group="CoordF" len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="38"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos3i</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>z</name></param> >+ <vecequiv name="glRasterPos3iv"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos3iv</name></proto> >+ <param group="CoordI" len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="39"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos3s</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>z</name></param> >+ <vecequiv name="glRasterPos3sv"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos3sv</name></proto> >+ <param group="CoordS" len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="40"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos3xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>x</name></param> >+ <param><ptype>GLfixed</ptype> <name>y</name></param> >+ <param><ptype>GLfixed</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos3xvOES</name></proto> >+ <param len="3">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos4d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>z</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>w</name></param> >+ <vecequiv name="glRasterPos4dv"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos4dv</name></proto> >+ <param group="CoordD" len="4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="41"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos4f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>z</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>w</name></param> >+ <vecequiv name="glRasterPos4fv"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos4fv</name></proto> >+ <param group="CoordF" len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="42"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos4i</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>z</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>w</name></param> >+ <vecequiv name="glRasterPos4iv"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos4iv</name></proto> >+ <param group="CoordI" len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="43"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos4s</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>z</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>w</name></param> >+ <vecequiv name="glRasterPos4sv"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos4sv</name></proto> >+ <param group="CoordS" len="4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="44"/> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos4xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>x</name></param> >+ <param><ptype>GLfixed</ptype> <name>y</name></param> >+ <param><ptype>GLfixed</ptype> <name>z</name></param> >+ <param><ptype>GLfixed</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRasterPos4xvOES</name></proto> >+ <param len="4">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRasterSamplesEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>samples</name></param> >+ <param><ptype>GLboolean</ptype> <name>fixedsamplelocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReadBuffer</name></proto> >+ <param group="ReadBufferMode"><ptype>GLenum</ptype> <name>src</name></param> >+ <glx type="render" opcode="171"/> >+ </command> >+ <command> >+ <proto>void <name>glReadBufferIndexedEXT</name></proto> >+ <param group="ReadBufferMode"><ptype>GLenum</ptype> <name>src</name></param> >+ <param><ptype>GLint</ptype> <name>index</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReadBufferNV</name></proto> >+ <param><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReadInstrumentsSGIX</name></proto> >+ <param><ptype>GLint</ptype> <name>marker</name></param> >+ <glx type="render" opcode="2077"/> >+ </command> >+ <command> >+ <proto>void <name>glReadPixels</name></proto> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height)">void *<name>pixels</name></param> >+ <glx type="single" opcode="111"/> >+ <glx type="render" opcode="345" name="glReadPixelsPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glReadnPixels</name></proto> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize">void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReadnPixelsARB</name></proto> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize">void *<name>data</name></param> >+ <alias name="glReadnPixels"/> >+ </command> >+ <command> >+ <proto>void <name>glReadnPixelsEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize">void *<name>data</name></param> >+ <alias name="glReadnPixels"/> >+ </command> >+ <command> >+ <proto>void <name>glReadnPixelsKHR</name></proto> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param len="bufSize">void *<name>data</name></param> >+ <alias name="glReadnPixels"/> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glReleaseKeyedMutexWin32EXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>key</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRectd</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x1</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y1</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x2</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y2</name></param> >+ <vecequiv name="glRectdv"/> >+ </command> >+ <command> >+ <proto>void <name>glRectdv</name></proto> >+ <param group="CoordD" len="2">const <ptype>GLdouble</ptype> *<name>v1</name></param> >+ <param group="CoordD" len="2">const <ptype>GLdouble</ptype> *<name>v2</name></param> >+ <glx type="render" opcode="45"/> >+ </command> >+ <command> >+ <proto>void <name>glRectf</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x1</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y1</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x2</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y2</name></param> >+ <vecequiv name="glRectfv"/> >+ </command> >+ <command> >+ <proto>void <name>glRectfv</name></proto> >+ <param group="CoordF" len="2">const <ptype>GLfloat</ptype> *<name>v1</name></param> >+ <param group="CoordF" len="2">const <ptype>GLfloat</ptype> *<name>v2</name></param> >+ <glx type="render" opcode="46"/> >+ </command> >+ <command> >+ <proto>void <name>glRecti</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x1</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y1</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x2</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y2</name></param> >+ <vecequiv name="glRectiv"/> >+ </command> >+ <command> >+ <proto>void <name>glRectiv</name></proto> >+ <param group="CoordI" len="2">const <ptype>GLint</ptype> *<name>v1</name></param> >+ <param group="CoordI" len="2">const <ptype>GLint</ptype> *<name>v2</name></param> >+ <glx type="render" opcode="47"/> >+ </command> >+ <command> >+ <proto>void <name>glRects</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x1</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y1</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x2</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y2</name></param> >+ <vecequiv name="glRectsv"/> >+ </command> >+ <command> >+ <proto>void <name>glRectsv</name></proto> >+ <param group="CoordS" len="2">const <ptype>GLshort</ptype> *<name>v1</name></param> >+ <param group="CoordS" len="2">const <ptype>GLshort</ptype> *<name>v2</name></param> >+ <glx type="render" opcode="48"/> >+ </command> >+ <command> >+ <proto>void <name>glRectxOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>x1</name></param> >+ <param><ptype>GLfixed</ptype> <name>y1</name></param> >+ <param><ptype>GLfixed</ptype> <name>x2</name></param> >+ <param><ptype>GLfixed</ptype> <name>y2</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRectxvOES</name></proto> >+ <param len="2">const <ptype>GLfixed</ptype> *<name>v1</name></param> >+ <param len="2">const <ptype>GLfixed</ptype> *<name>v2</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReferencePlaneSGIX</name></proto> >+ <param len="4">const <ptype>GLdouble</ptype> *<name>equation</name></param> >+ <glx type="render" opcode="2071"/> >+ </command> >+ <command> >+ <proto>void <name>glReleaseShaderCompiler</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glRenderGpuMaskNV</name></proto> >+ <param><ptype>GLbitfield</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLint</ptype> <name>glRenderMode</name></proto> >+ <param group="RenderingMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ <glx type="single" opcode="107"/> >+ </command> >+ <command> >+ <proto>void <name>glRenderbufferStorage</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <glx type="render" opcode="4318"/> >+ </command> >+ <command> >+ <proto>void <name>glRenderbufferStorageEXT</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <alias name="glRenderbufferStorage"/> >+ <glx type="render" opcode="4318"/> >+ </command> >+ <command> >+ <proto>void <name>glRenderbufferStorageMultisample</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <glx type="render" opcode="4331"/> >+ </command> >+ <command> >+ <proto>void <name>glRenderbufferStorageMultisampleANGLE</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRenderbufferStorageMultisampleAPPLE</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRenderbufferStorageMultisampleCoverageNV</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>coverageSamples</name></param> >+ <param><ptype>GLsizei</ptype> <name>colorSamples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRenderbufferStorageMultisampleEXT</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <alias name="glRenderbufferStorageMultisample"/> >+ <glx type="render" opcode="4331"/> >+ </command> >+ <command> >+ <proto>void <name>glRenderbufferStorageMultisampleIMG</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRenderbufferStorageMultisampleNV</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <alias name="glRenderbufferStorageMultisample"/> >+ </command> >+ <command> >+ <proto>void <name>glRenderbufferStorageOES</name></proto> >+ <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodePointerSUN</name></proto> >+ <param group="ReplacementCodeTypeSUN"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(type,stride)">const void **<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeubSUN</name></proto> >+ <param><ptype>GLubyte</ptype> <name>code</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeubvSUN</name></proto> >+ <param len="COMPSIZE()">const <ptype>GLubyte</ptype> *<name>code</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiColor3fVertex3fSUN</name></proto> >+ <param group="ReplacementCodeSUN"><ptype>GLuint</ptype> <name>rc</name></param> >+ <param><ptype>GLfloat</ptype> <name>r</name></param> >+ <param><ptype>GLfloat</ptype> <name>g</name></param> >+ <param><ptype>GLfloat</ptype> <name>b</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiColor3fVertex3fvSUN</name></proto> >+ <param group="ReplacementCodeSUN" len="1">const <ptype>GLuint</ptype> *<name>rc</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>c</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiColor4fNormal3fVertex3fSUN</name></proto> >+ <param group="ReplacementCodeSUN"><ptype>GLuint</ptype> <name>rc</name></param> >+ <param><ptype>GLfloat</ptype> <name>r</name></param> >+ <param><ptype>GLfloat</ptype> <name>g</name></param> >+ <param><ptype>GLfloat</ptype> <name>b</name></param> >+ <param><ptype>GLfloat</ptype> <name>a</name></param> >+ <param><ptype>GLfloat</ptype> <name>nx</name></param> >+ <param><ptype>GLfloat</ptype> <name>ny</name></param> >+ <param><ptype>GLfloat</ptype> <name>nz</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiColor4fNormal3fVertex3fvSUN</name></proto> >+ <param group="ReplacementCodeSUN" len="1">const <ptype>GLuint</ptype> *<name>rc</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>c</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>n</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiColor4ubVertex3fSUN</name></proto> >+ <param group="ReplacementCodeSUN"><ptype>GLuint</ptype> <name>rc</name></param> >+ <param><ptype>GLubyte</ptype> <name>r</name></param> >+ <param><ptype>GLubyte</ptype> <name>g</name></param> >+ <param><ptype>GLubyte</ptype> <name>b</name></param> >+ <param><ptype>GLubyte</ptype> <name>a</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiColor4ubVertex3fvSUN</name></proto> >+ <param group="ReplacementCodeSUN" len="1">const <ptype>GLuint</ptype> *<name>rc</name></param> >+ <param len="4">const <ptype>GLubyte</ptype> *<name>c</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiNormal3fVertex3fSUN</name></proto> >+ <param group="ReplacementCodeSUN"><ptype>GLuint</ptype> <name>rc</name></param> >+ <param><ptype>GLfloat</ptype> <name>nx</name></param> >+ <param><ptype>GLfloat</ptype> <name>ny</name></param> >+ <param><ptype>GLfloat</ptype> <name>nz</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiNormal3fVertex3fvSUN</name></proto> >+ <param group="ReplacementCodeSUN" len="1">const <ptype>GLuint</ptype> *<name>rc</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>n</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiSUN</name></proto> >+ <param><ptype>GLuint</ptype> <name>code</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN</name></proto> >+ <param group="ReplacementCodeSUN"><ptype>GLuint</ptype> <name>rc</name></param> >+ <param><ptype>GLfloat</ptype> <name>s</name></param> >+ <param><ptype>GLfloat</ptype> <name>t</name></param> >+ <param><ptype>GLfloat</ptype> <name>r</name></param> >+ <param><ptype>GLfloat</ptype> <name>g</name></param> >+ <param><ptype>GLfloat</ptype> <name>b</name></param> >+ <param><ptype>GLfloat</ptype> <name>a</name></param> >+ <param><ptype>GLfloat</ptype> <name>nx</name></param> >+ <param><ptype>GLfloat</ptype> <name>ny</name></param> >+ <param><ptype>GLfloat</ptype> <name>nz</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN</name></proto> >+ <param group="ReplacementCodeSUN" len="1">const <ptype>GLuint</ptype> *<name>rc</name></param> >+ <param len="2">const <ptype>GLfloat</ptype> *<name>tc</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>c</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>n</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN</name></proto> >+ <param group="ReplacementCodeSUN"><ptype>GLuint</ptype> <name>rc</name></param> >+ <param><ptype>GLfloat</ptype> <name>s</name></param> >+ <param><ptype>GLfloat</ptype> <name>t</name></param> >+ <param><ptype>GLfloat</ptype> <name>nx</name></param> >+ <param><ptype>GLfloat</ptype> <name>ny</name></param> >+ <param><ptype>GLfloat</ptype> <name>nz</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN</name></proto> >+ <param group="ReplacementCodeSUN" len="1">const <ptype>GLuint</ptype> *<name>rc</name></param> >+ <param len="2">const <ptype>GLfloat</ptype> *<name>tc</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>n</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiTexCoord2fVertex3fSUN</name></proto> >+ <param group="ReplacementCodeSUN"><ptype>GLuint</ptype> <name>rc</name></param> >+ <param><ptype>GLfloat</ptype> <name>s</name></param> >+ <param><ptype>GLfloat</ptype> <name>t</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiTexCoord2fVertex3fvSUN</name></proto> >+ <param group="ReplacementCodeSUN" len="1">const <ptype>GLuint</ptype> *<name>rc</name></param> >+ <param len="2">const <ptype>GLfloat</ptype> *<name>tc</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiVertex3fSUN</name></proto> >+ <param group="ReplacementCodeSUN"><ptype>GLuint</ptype> <name>rc</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuiVertex3fvSUN</name></proto> >+ <param group="ReplacementCodeSUN" len="1">const <ptype>GLuint</ptype> *<name>rc</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeuivSUN</name></proto> >+ <param len="COMPSIZE()">const <ptype>GLuint</ptype> *<name>code</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeusSUN</name></proto> >+ <param><ptype>GLushort</ptype> <name>code</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReplacementCodeusvSUN</name></proto> >+ <param len="COMPSIZE()">const <ptype>GLushort</ptype> *<name>code</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRequestResidentProgramsNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLuint</ptype> *<name>programs</name></param> >+ <glx type="render" opcode="4182"/> >+ </command> >+ <command> >+ <proto>void <name>glResetHistogram</name></proto> >+ <param group="HistogramTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <glx type="render" opcode="4112"/> >+ </command> >+ <command> >+ <proto>void <name>glResetHistogramEXT</name></proto> >+ <param group="HistogramTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <alias name="glResetHistogram"/> >+ <glx type="render" opcode="4112"/> >+ </command> >+ <command> >+ <proto>void <name>glResetMinmax</name></proto> >+ <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <glx type="render" opcode="4113"/> >+ </command> >+ <command> >+ <proto>void <name>glResetMinmaxEXT</name></proto> >+ <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <alias name="glResetMinmax"/> >+ <glx type="render" opcode="4113"/> >+ </command> >+ <command> >+ <proto>void <name>glResizeBuffersMESA</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glResolveDepthValuesNV</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glResolveMultisampleFramebufferAPPLE</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glResumeTransformFeedback</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glResumeTransformFeedbackNV</name></proto> >+ <alias name="glResumeTransformFeedback"/> >+ </command> >+ <command> >+ <proto>void <name>glRotated</name></proto> >+ <param><ptype>GLdouble</ptype> <name>angle</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <glx type="render" opcode="185"/> >+ </command> >+ <command> >+ <proto>void <name>glRotatef</name></proto> >+ <param><ptype>GLfloat</ptype> <name>angle</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <glx type="render" opcode="186"/> >+ </command> >+ <command> >+ <proto>void <name>glRotatex</name></proto> >+ <param><ptype>GLfixed</ptype> <name>angle</name></param> >+ <param><ptype>GLfixed</ptype> <name>x</name></param> >+ <param><ptype>GLfixed</ptype> <name>y</name></param> >+ <param><ptype>GLfixed</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRotatexOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>angle</name></param> >+ <param><ptype>GLfixed</ptype> <name>x</name></param> >+ <param><ptype>GLfixed</ptype> <name>y</name></param> >+ <param><ptype>GLfixed</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSampleCoverage</name></proto> >+ <param><ptype>GLfloat</ptype> <name>value</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>invert</name></param> >+ <glx type="render" opcode="229"/> >+ </command> >+ <command> >+ <proto>void <name>glSampleCoverageARB</name></proto> >+ <param><ptype>GLfloat</ptype> <name>value</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>invert</name></param> >+ <alias name="glSampleCoverage"/> >+ </command> >+ <command> >+ <proto>void <name>glSampleCoveragex</name></proto> >+ <param><ptype>GLclampx</ptype> <name>value</name></param> >+ <param><ptype>GLboolean</ptype> <name>invert</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSampleCoveragexOES</name></proto> >+ <param><ptype>GLclampx</ptype> <name>value</name></param> >+ <param><ptype>GLboolean</ptype> <name>invert</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSampleMapATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>dst</name></param> >+ <param><ptype>GLuint</ptype> <name>interp</name></param> >+ <param group="SwizzleOpATI"><ptype>GLenum</ptype> <name>swizzle</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSampleMaskEXT</name></proto> >+ <param group="ClampedFloat32"><ptype>GLclampf</ptype> <name>value</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>invert</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSampleMaskIndexedNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="SampleMaskNV"><ptype>GLbitfield</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSampleMaskSGIS</name></proto> >+ <param group="ClampedFloat32"><ptype>GLclampf</ptype> <name>value</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>invert</name></param> >+ <alias name="glSampleMaskEXT"/> >+ <glx type="render" opcode="2048"/> >+ </command> >+ <command> >+ <proto>void <name>glSampleMaski</name></proto> >+ <param><ptype>GLuint</ptype> <name>maskNumber</name></param> >+ <param><ptype>GLbitfield</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSamplePatternEXT</name></proto> >+ <param group="SamplePatternEXT"><ptype>GLenum</ptype> <name>pattern</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSamplePatternSGIS</name></proto> >+ <param group="SamplePatternSGIS"><ptype>GLenum</ptype> <name>pattern</name></param> >+ <alias name="glSamplePatternEXT"/> >+ <glx type="render" opcode="2049"/> >+ </command> >+ <command> >+ <proto>void <name>glSamplerParameterIiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSamplerParameterIivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>param</name></param> >+ <alias name="glSamplerParameterIiv"/> >+ </command> >+ <command> >+ <proto>void <name>glSamplerParameterIivOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>param</name></param> >+ <alias name="glSamplerParameterIiv"/> >+ </command> >+ <command> >+ <proto>void <name>glSamplerParameterIuiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLuint</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSamplerParameterIuivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLuint</ptype> *<name>param</name></param> >+ <alias name="glSamplerParameterIuiv"/> >+ </command> >+ <command> >+ <proto>void <name>glSamplerParameterIuivOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLuint</ptype> *<name>param</name></param> >+ <alias name="glSamplerParameterIuiv"/> >+ </command> >+ <command> >+ <proto>void <name>glSamplerParameterf</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSamplerParameterfv</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSamplerParameteri</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSamplerParameteriv</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param group="SamplerParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glScaled</name></proto> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <glx type="render" opcode="187"/> >+ </command> >+ <command> >+ <proto>void <name>glScalef</name></proto> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <glx type="render" opcode="188"/> >+ </command> >+ <command> >+ <proto>void <name>glScalex</name></proto> >+ <param><ptype>GLfixed</ptype> <name>x</name></param> >+ <param><ptype>GLfixed</ptype> <name>y</name></param> >+ <param><ptype>GLfixed</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glScalexOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>x</name></param> >+ <param><ptype>GLfixed</ptype> <name>y</name></param> >+ <param><ptype>GLfixed</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glScissor</name></proto> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <glx type="render" opcode="103"/> >+ </command> >+ <command> >+ <proto>void <name>glScissorArrayv</name></proto> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="COMPSIZE(count)">const <ptype>GLint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glScissorArrayvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="COMPSIZE(count)">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glScissorArrayv"/> >+ </command> >+ <command> >+ <proto>void <name>glScissorArrayvOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="COMPSIZE(count)">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glScissorArrayv"/> >+ </command> >+ <command> >+ <proto>void <name>glScissorIndexed</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>left</name></param> >+ <param><ptype>GLint</ptype> <name>bottom</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glScissorIndexedNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>left</name></param> >+ <param><ptype>GLint</ptype> <name>bottom</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <alias name="glScissorIndexed"/> >+ </command> >+ <command> >+ <proto>void <name>glScissorIndexedOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>left</name></param> >+ <param><ptype>GLint</ptype> <name>bottom</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <alias name="glScissorIndexed"/> >+ </command> >+ <command> >+ <proto>void <name>glScissorIndexedv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glScissorIndexedvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glScissorIndexedv"/> >+ </command> >+ <command> >+ <proto>void <name>glScissorIndexedvOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glScissorIndexedv"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3b</name></proto> >+ <param group="ColorB"><ptype>GLbyte</ptype> <name>red</name></param> >+ <param group="ColorB"><ptype>GLbyte</ptype> <name>green</name></param> >+ <param group="ColorB"><ptype>GLbyte</ptype> <name>blue</name></param> >+ <vecequiv name="glSecondaryColor3bv"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3bEXT</name></proto> >+ <param group="ColorB"><ptype>GLbyte</ptype> <name>red</name></param> >+ <param group="ColorB"><ptype>GLbyte</ptype> <name>green</name></param> >+ <param group="ColorB"><ptype>GLbyte</ptype> <name>blue</name></param> >+ <alias name="glSecondaryColor3b"/> >+ <vecequiv name="glSecondaryColor3bvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3bv</name></proto> >+ <param group="ColorB" len="3">const <ptype>GLbyte</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4126"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3bvEXT</name></proto> >+ <param group="ColorB" len="3">const <ptype>GLbyte</ptype> *<name>v</name></param> >+ <alias name="glSecondaryColor3bv"/> >+ <glx type="render" opcode="4126"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3d</name></proto> >+ <param group="ColorD"><ptype>GLdouble</ptype> <name>red</name></param> >+ <param group="ColorD"><ptype>GLdouble</ptype> <name>green</name></param> >+ <param group="ColorD"><ptype>GLdouble</ptype> <name>blue</name></param> >+ <vecequiv name="glSecondaryColor3dv"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3dEXT</name></proto> >+ <param group="ColorD"><ptype>GLdouble</ptype> <name>red</name></param> >+ <param group="ColorD"><ptype>GLdouble</ptype> <name>green</name></param> >+ <param group="ColorD"><ptype>GLdouble</ptype> <name>blue</name></param> >+ <alias name="glSecondaryColor3d"/> >+ <vecequiv name="glSecondaryColor3dvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3dv</name></proto> >+ <param group="ColorD" len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4130"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3dvEXT</name></proto> >+ <param group="ColorD" len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glSecondaryColor3dv"/> >+ <glx type="render" opcode="4130"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3f</name></proto> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>red</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>green</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>blue</name></param> >+ <vecequiv name="glSecondaryColor3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3fEXT</name></proto> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>red</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>green</name></param> >+ <param group="ColorF"><ptype>GLfloat</ptype> <name>blue</name></param> >+ <alias name="glSecondaryColor3f"/> >+ <vecequiv name="glSecondaryColor3fvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3fv</name></proto> >+ <param group="ColorF" len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4129"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3fvEXT</name></proto> >+ <param group="ColorF" len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glSecondaryColor3fv"/> >+ <glx type="render" opcode="4129"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3hNV</name></proto> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>red</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>green</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>blue</name></param> >+ <vecequiv name="glSecondaryColor3hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3hvNV</name></proto> >+ <param group="Half16NV" len="3">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4255"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3i</name></proto> >+ <param group="ColorI"><ptype>GLint</ptype> <name>red</name></param> >+ <param group="ColorI"><ptype>GLint</ptype> <name>green</name></param> >+ <param group="ColorI"><ptype>GLint</ptype> <name>blue</name></param> >+ <vecequiv name="glSecondaryColor3iv"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3iEXT</name></proto> >+ <param group="ColorI"><ptype>GLint</ptype> <name>red</name></param> >+ <param group="ColorI"><ptype>GLint</ptype> <name>green</name></param> >+ <param group="ColorI"><ptype>GLint</ptype> <name>blue</name></param> >+ <alias name="glSecondaryColor3i"/> >+ <vecequiv name="glSecondaryColor3ivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3iv</name></proto> >+ <param group="ColorI" len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4128"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3ivEXT</name></proto> >+ <param group="ColorI" len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glSecondaryColor3iv"/> >+ <glx type="render" opcode="4128"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3s</name></proto> >+ <param group="ColorS"><ptype>GLshort</ptype> <name>red</name></param> >+ <param group="ColorS"><ptype>GLshort</ptype> <name>green</name></param> >+ <param group="ColorS"><ptype>GLshort</ptype> <name>blue</name></param> >+ <vecequiv name="glSecondaryColor3sv"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3sEXT</name></proto> >+ <param group="ColorS"><ptype>GLshort</ptype> <name>red</name></param> >+ <param group="ColorS"><ptype>GLshort</ptype> <name>green</name></param> >+ <param group="ColorS"><ptype>GLshort</ptype> <name>blue</name></param> >+ <alias name="glSecondaryColor3s"/> >+ <vecequiv name="glSecondaryColor3svEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3sv</name></proto> >+ <param group="ColorS" len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4127"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3svEXT</name></proto> >+ <param group="ColorS" len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glSecondaryColor3sv"/> >+ <glx type="render" opcode="4127"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3ub</name></proto> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>red</name></param> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>green</name></param> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>blue</name></param> >+ <vecequiv name="glSecondaryColor3ubv"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3ubEXT</name></proto> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>red</name></param> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>green</name></param> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>blue</name></param> >+ <alias name="glSecondaryColor3ub"/> >+ <vecequiv name="glSecondaryColor3ubvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3ubv</name></proto> >+ <param group="ColorUB" len="3">const <ptype>GLubyte</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4131"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3ubvEXT</name></proto> >+ <param group="ColorUB" len="3">const <ptype>GLubyte</ptype> *<name>v</name></param> >+ <alias name="glSecondaryColor3ubv"/> >+ <glx type="render" opcode="4131"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3ui</name></proto> >+ <param group="ColorUI"><ptype>GLuint</ptype> <name>red</name></param> >+ <param group="ColorUI"><ptype>GLuint</ptype> <name>green</name></param> >+ <param group="ColorUI"><ptype>GLuint</ptype> <name>blue</name></param> >+ <vecequiv name="glSecondaryColor3uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3uiEXT</name></proto> >+ <param group="ColorUI"><ptype>GLuint</ptype> <name>red</name></param> >+ <param group="ColorUI"><ptype>GLuint</ptype> <name>green</name></param> >+ <param group="ColorUI"><ptype>GLuint</ptype> <name>blue</name></param> >+ <alias name="glSecondaryColor3ui"/> >+ <vecequiv name="glSecondaryColor3uivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3uiv</name></proto> >+ <param group="ColorUI" len="3">const <ptype>GLuint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4133"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3uivEXT</name></proto> >+ <param group="ColorUI" len="3">const <ptype>GLuint</ptype> *<name>v</name></param> >+ <alias name="glSecondaryColor3uiv"/> >+ <glx type="render" opcode="4133"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3us</name></proto> >+ <param group="ColorUS"><ptype>GLushort</ptype> <name>red</name></param> >+ <param group="ColorUS"><ptype>GLushort</ptype> <name>green</name></param> >+ <param group="ColorUS"><ptype>GLushort</ptype> <name>blue</name></param> >+ <vecequiv name="glSecondaryColor3usv"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3usEXT</name></proto> >+ <param group="ColorUS"><ptype>GLushort</ptype> <name>red</name></param> >+ <param group="ColorUS"><ptype>GLushort</ptype> <name>green</name></param> >+ <param group="ColorUS"><ptype>GLushort</ptype> <name>blue</name></param> >+ <alias name="glSecondaryColor3us"/> >+ <vecequiv name="glSecondaryColor3usvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3usv</name></proto> >+ <param group="ColorUS" len="3">const <ptype>GLushort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4132"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColor3usvEXT</name></proto> >+ <param group="ColorUS" len="3">const <ptype>GLushort</ptype> *<name>v</name></param> >+ <alias name="glSecondaryColor3usv"/> >+ <glx type="render" opcode="4132"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColorFormatNV</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="ColorPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColorP3ui</name></proto> >+ <param group="ColorPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>color</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColorP3uiv</name></proto> >+ <param group="ColorPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>color</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColorPointer</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="ColorPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColorPointerEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="ColorPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void *<name>pointer</name></param> >+ <alias name="glSecondaryColorPointer"/> >+ </command> >+ <command> >+ <proto>void <name>glSecondaryColorPointerListIBM</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="SecondaryColorPointerTypeIBM"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLint</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void **<name>pointer</name></param> >+ <param><ptype>GLint</ptype> <name>ptrstride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSelectBuffer</name></proto> >+ <param><ptype>GLsizei</ptype> <name>size</name></param> >+ <param group="SelectName" len="size"><ptype>GLuint</ptype> *<name>buffer</name></param> >+ <glx type="single" opcode="106"/> >+ </command> >+ <command> >+ <proto>void <name>glSelectPerfMonitorCountersAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>monitor</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>enable</name></param> >+ <param><ptype>GLuint</ptype> <name>group</name></param> >+ <param><ptype>GLint</ptype> <name>numCounters</name></param> >+ <param len="numCounters"><ptype>GLuint</ptype> *<name>counterList</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSemaphoreParameterui64vEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>semaphore</name></param> >+ <param group="SemaphoreParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param>const <ptype>GLuint64</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSeparableFilter2D</name></proto> >+ <param group="SeparableTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,format,type,width)">const void *<name>row</name></param> >+ <param len="COMPSIZE(target,format,type,height)">const void *<name>column</name></param> >+ <glx type="render" opcode="4109"/> >+ <glx type="render" opcode="327" name="glSeparableFilter2DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glSeparableFilter2DEXT</name></proto> >+ <param group="SeparableTargetEXT"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(target,format,type,width)">const void *<name>row</name></param> >+ <param len="COMPSIZE(target,format,type,height)">const void *<name>column</name></param> >+ <alias name="glSeparableFilter2D"/> >+ <glx type="render" opcode="4109"/> >+ </command> >+ <command> >+ <proto>void <name>glSetFenceAPPLE</name></proto> >+ <param group="FenceNV"><ptype>GLuint</ptype> <name>fence</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSetFenceNV</name></proto> >+ <param group="FenceNV"><ptype>GLuint</ptype> <name>fence</name></param> >+ <param group="FenceConditionNV"><ptype>GLenum</ptype> <name>condition</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSetFragmentShaderConstantATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>dst</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSetInvariantEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="ScalarType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(id,type)">const void *<name>addr</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSetLocalConstantEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="ScalarType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(id,type)">const void *<name>addr</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSetMultisamplefvAMD</name></proto> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLfloat</ptype> *<name>val</name></param> >+ </command> >+ <command> >+ <proto>void <name>glShadeModel</name></proto> >+ <param group="ShadingModel"><ptype>GLenum</ptype> <name>mode</name></param> >+ <glx type="render" opcode="104"/> >+ </command> >+ <command> >+ <proto>void <name>glShaderBinary</name></proto> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>shaders</name></param> >+ <param><ptype>GLenum</ptype> <name>binaryformat</name></param> >+ <param len="length">const void *<name>binary</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ </command> >+ <command> >+ <proto>void <name>glShaderOp1EXT</name></proto> >+ <param group="VertexShaderOpEXT"><ptype>GLenum</ptype> <name>op</name></param> >+ <param><ptype>GLuint</ptype> <name>res</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1</name></param> >+ </command> >+ <command> >+ <proto>void <name>glShaderOp2EXT</name></proto> >+ <param group="VertexShaderOpEXT"><ptype>GLenum</ptype> <name>op</name></param> >+ <param><ptype>GLuint</ptype> <name>res</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1</name></param> >+ <param><ptype>GLuint</ptype> <name>arg2</name></param> >+ </command> >+ <command> >+ <proto>void <name>glShaderOp3EXT</name></proto> >+ <param group="VertexShaderOpEXT"><ptype>GLenum</ptype> <name>op</name></param> >+ <param><ptype>GLuint</ptype> <name>res</name></param> >+ <param><ptype>GLuint</ptype> <name>arg1</name></param> >+ <param><ptype>GLuint</ptype> <name>arg2</name></param> >+ <param><ptype>GLuint</ptype> <name>arg3</name></param> >+ </command> >+ <command> >+ <proto>void <name>glShaderSource</name></proto> >+ <param><ptype>GLuint</ptype> <name>shader</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLchar</ptype> *const*<name>string</name></param> >+ <param len="count">const <ptype>GLint</ptype> *<name>length</name></param> >+ </command> >+ <command> >+ <proto>void <name>glShaderSourceARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>shaderObj</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLcharARB</ptype> **<name>string</name></param> >+ <param len="count">const <ptype>GLint</ptype> *<name>length</name></param> >+ <alias name="glShaderSource"/> >+ </command> >+ <command> >+ <proto>void <name>glShaderStorageBlockBinding</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>storageBlockIndex</name></param> >+ <param><ptype>GLuint</ptype> <name>storageBlockBinding</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSharpenTexFuncSGIS</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n*2">const <ptype>GLfloat</ptype> *<name>points</name></param> >+ <glx type="render" opcode="2052"/> >+ </command> >+ <command> >+ <proto>void <name>glSignalSemaphoreEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>semaphore</name></param> >+ <param><ptype>GLuint</ptype> <name>numBufferBarriers</name></param> >+ <param len="COMPSIZE(numBufferBarriers)">const <ptype>GLuint</ptype> *<name>buffers</name></param> >+ <param><ptype>GLuint</ptype> <name>numTextureBarriers</name></param> >+ <param len="COMPSIZE(numTextureBarriers)">const <ptype>GLuint</ptype> *<name>textures</name></param> >+ <param group="TextureLayout" len="COMPSIZE(numTextureBarriers)">const <ptype>GLenum</ptype> *<name>dstLayouts</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSpecializeShader</name></proto> >+ <param><ptype>GLuint</ptype> <name>shader</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>pEntryPoint</name></param> >+ <param><ptype>GLuint</ptype> <name>numSpecializationConstants</name></param> >+ <param>const <ptype>GLuint</ptype> *<name>pConstantIndex</name></param> >+ <param>const <ptype>GLuint</ptype> *<name>pConstantValue</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSpecializeShaderARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>shader</name></param> >+ <param>const <ptype>GLchar</ptype> *<name>pEntryPoint</name></param> >+ <param><ptype>GLuint</ptype> <name>numSpecializationConstants</name></param> >+ <param>const <ptype>GLuint</ptype> *<name>pConstantIndex</name></param> >+ <param>const <ptype>GLuint</ptype> *<name>pConstantValue</name></param> >+ <alias name="glSpecializeShader"/> >+ </command> >+ <command> >+ <proto>void <name>glSpriteParameterfSGIX</name></proto> >+ <param group="SpriteParameterNameSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <glx type="render" opcode="2060"/> >+ </command> >+ <command> >+ <proto>void <name>glSpriteParameterfvSGIX</name></proto> >+ <param group="SpriteParameterNameSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="2061"/> >+ </command> >+ <command> >+ <proto>void <name>glSpriteParameteriSGIX</name></proto> >+ <param group="SpriteParameterNameSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ <glx type="render" opcode="2062"/> >+ </command> >+ <command> >+ <proto>void <name>glSpriteParameterivSGIX</name></proto> >+ <param group="SpriteParameterNameSGIX"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="2063"/> >+ </command> >+ <command> >+ <proto>void <name>glStartInstrumentsSGIX</name></proto> >+ <glx type="render" opcode="2069"/> >+ </command> >+ <command> >+ <proto>void <name>glStartTilingQCOM</name></proto> >+ <param><ptype>GLuint</ptype> <name>x</name></param> >+ <param><ptype>GLuint</ptype> <name>y</name></param> >+ <param><ptype>GLuint</ptype> <name>width</name></param> >+ <param><ptype>GLuint</ptype> <name>height</name></param> >+ <param group="BufferBitQCOM"><ptype>GLbitfield</ptype> <name>preserveMask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStateCaptureNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>state</name></param> >+ <param><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilClearTagEXT</name></proto> >+ <param><ptype>GLsizei</ptype> <name>stencilTagBits</name></param> >+ <param><ptype>GLuint</ptype> <name>stencilClearTag</name></param> >+ <glx type="render" opcode="4223"/> >+ </command> >+ <command> >+ <proto>void <name>glStencilFillPathInstancedNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>numPaths</name></param> >+ <param group="PathElementType"><ptype>GLenum</ptype> <name>pathNameType</name></param> >+ <param group="PathElement" len="COMPSIZE(numPaths,pathNameType,paths)">const void *<name>paths</name></param> >+ <param group="Path"><ptype>GLuint</ptype> <name>pathBase</name></param> >+ <param group="PathFillMode"><ptype>GLenum</ptype> <name>fillMode</name></param> >+ <param group="MaskedStencilValue"><ptype>GLuint</ptype> <name>mask</name></param> >+ <param group="PathTransformType"><ptype>GLenum</ptype> <name>transformType</name></param> >+ <param len="COMPSIZE(numPaths,transformType)">const <ptype>GLfloat</ptype> *<name>transformValues</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilFillPathNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param group="PathFillMode"><ptype>GLenum</ptype> <name>fillMode</name></param> >+ <param group="MaskedStencilValue"><ptype>GLuint</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilFunc</name></proto> >+ <param group="StencilFunction"><ptype>GLenum</ptype> <name>func</name></param> >+ <param group="StencilValue"><ptype>GLint</ptype> <name>ref</name></param> >+ <param group="MaskedStencilValue"><ptype>GLuint</ptype> <name>mask</name></param> >+ <glx type="render" opcode="162"/> >+ </command> >+ <command> >+ <proto>void <name>glStencilFuncSeparate</name></proto> >+ <param group="StencilFaceDirection"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="StencilFunction"><ptype>GLenum</ptype> <name>func</name></param> >+ <param group="StencilValue"><ptype>GLint</ptype> <name>ref</name></param> >+ <param group="MaskedStencilValue"><ptype>GLuint</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilFuncSeparateATI</name></proto> >+ <param group="StencilFunction"><ptype>GLenum</ptype> <name>frontfunc</name></param> >+ <param group="StencilFunction"><ptype>GLenum</ptype> <name>backfunc</name></param> >+ <param group="ClampedStencilValue"><ptype>GLint</ptype> <name>ref</name></param> >+ <param group="MaskedStencilValue"><ptype>GLuint</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilMask</name></proto> >+ <param group="MaskedStencilValue"><ptype>GLuint</ptype> <name>mask</name></param> >+ <glx type="render" opcode="133"/> >+ </command> >+ <command> >+ <proto>void <name>glStencilMaskSeparate</name></proto> >+ <param group="StencilFaceDirection"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaskedStencilValue"><ptype>GLuint</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilOp</name></proto> >+ <param group="StencilOp"><ptype>GLenum</ptype> <name>fail</name></param> >+ <param group="StencilOp"><ptype>GLenum</ptype> <name>zfail</name></param> >+ <param group="StencilOp"><ptype>GLenum</ptype> <name>zpass</name></param> >+ <glx type="render" opcode="163"/> >+ </command> >+ <command> >+ <proto>void <name>glStencilOpSeparate</name></proto> >+ <param group="StencilFaceDirection"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="StencilOp"><ptype>GLenum</ptype> <name>sfail</name></param> >+ <param group="StencilOp"><ptype>GLenum</ptype> <name>dpfail</name></param> >+ <param group="StencilOp"><ptype>GLenum</ptype> <name>dppass</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilOpSeparateATI</name></proto> >+ <param group="StencilFaceDirection"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="StencilOp"><ptype>GLenum</ptype> <name>sfail</name></param> >+ <param group="StencilOp"><ptype>GLenum</ptype> <name>dpfail</name></param> >+ <param group="StencilOp"><ptype>GLenum</ptype> <name>dppass</name></param> >+ <alias name="glStencilOpSeparate"/> >+ </command> >+ <command> >+ <proto>void <name>glStencilOpValueAMD</name></proto> >+ <param group="StencilFaceDirection"><ptype>GLenum</ptype> <name>face</name></param> >+ <param><ptype>GLuint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilStrokePathInstancedNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>numPaths</name></param> >+ <param group="PathElementType"><ptype>GLenum</ptype> <name>pathNameType</name></param> >+ <param group="PathElement" len="COMPSIZE(numPaths,pathNameType,paths)">const void *<name>paths</name></param> >+ <param group="Path"><ptype>GLuint</ptype> <name>pathBase</name></param> >+ <param group="StencilValue"><ptype>GLint</ptype> <name>reference</name></param> >+ <param group="MaskedStencilValue"><ptype>GLuint</ptype> <name>mask</name></param> >+ <param group="PathTransformType"><ptype>GLenum</ptype> <name>transformType</name></param> >+ <param len="COMPSIZE(numPaths,transformType)">const <ptype>GLfloat</ptype> *<name>transformValues</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilStrokePathNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>path</name></param> >+ <param group="StencilValue"><ptype>GLint</ptype> <name>reference</name></param> >+ <param group="MaskedStencilValue"><ptype>GLuint</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilThenCoverFillPathInstancedNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>numPaths</name></param> >+ <param><ptype>GLenum</ptype> <name>pathNameType</name></param> >+ <param>const void *<name>paths</name></param> >+ <param><ptype>GLuint</ptype> <name>pathBase</name></param> >+ <param><ptype>GLenum</ptype> <name>fillMode</name></param> >+ <param><ptype>GLuint</ptype> <name>mask</name></param> >+ <param><ptype>GLenum</ptype> <name>coverMode</name></param> >+ <param><ptype>GLenum</ptype> <name>transformType</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>transformValues</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilThenCoverFillPathNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLenum</ptype> <name>fillMode</name></param> >+ <param><ptype>GLuint</ptype> <name>mask</name></param> >+ <param><ptype>GLenum</ptype> <name>coverMode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilThenCoverStrokePathInstancedNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>numPaths</name></param> >+ <param><ptype>GLenum</ptype> <name>pathNameType</name></param> >+ <param>const void *<name>paths</name></param> >+ <param><ptype>GLuint</ptype> <name>pathBase</name></param> >+ <param><ptype>GLint</ptype> <name>reference</name></param> >+ <param><ptype>GLuint</ptype> <name>mask</name></param> >+ <param><ptype>GLenum</ptype> <name>coverMode</name></param> >+ <param><ptype>GLenum</ptype> <name>transformType</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>transformValues</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilThenCoverStrokePathNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLint</ptype> <name>reference</name></param> >+ <param><ptype>GLuint</ptype> <name>mask</name></param> >+ <param><ptype>GLenum</ptype> <name>coverMode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStopInstrumentsSGIX</name></proto> >+ <param><ptype>GLint</ptype> <name>marker</name></param> >+ <glx type="render" opcode="2070"/> >+ </command> >+ <command> >+ <proto>void <name>glStringMarkerGREMEDY</name></proto> >+ <param><ptype>GLsizei</ptype> <name>len</name></param> >+ <param len="len">const void *<name>string</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSubpixelPrecisionBiasNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>xbits</name></param> >+ <param><ptype>GLuint</ptype> <name>ybits</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSwizzleEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>res</name></param> >+ <param><ptype>GLuint</ptype> <name>in</name></param> >+ <param group="VertexShaderCoordOutEXT"><ptype>GLenum</ptype> <name>outX</name></param> >+ <param group="VertexShaderCoordOutEXT"><ptype>GLenum</ptype> <name>outY</name></param> >+ <param group="VertexShaderCoordOutEXT"><ptype>GLenum</ptype> <name>outZ</name></param> >+ <param group="VertexShaderCoordOutEXT"><ptype>GLenum</ptype> <name>outW</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSyncTextureINTEL</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTagSampleBufferSGIX</name></proto> >+ <glx type="render" opcode="2050"/> >+ </command> >+ <command> >+ <proto>void <name>glTangent3bEXT</name></proto> >+ <param><ptype>GLbyte</ptype> <name>tx</name></param> >+ <param><ptype>GLbyte</ptype> <name>ty</name></param> >+ <param><ptype>GLbyte</ptype> <name>tz</name></param> >+ <vecequiv name="glTangent3bvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glTangent3bvEXT</name></proto> >+ <param len="3">const <ptype>GLbyte</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTangent3dEXT</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>tx</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>ty</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>tz</name></param> >+ <vecequiv name="glTangent3dvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glTangent3dvEXT</name></proto> >+ <param group="CoordD" len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTangent3fEXT</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>tx</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>ty</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>tz</name></param> >+ <vecequiv name="glTangent3fvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glTangent3fvEXT</name></proto> >+ <param group="CoordF" len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTangent3iEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>tx</name></param> >+ <param><ptype>GLint</ptype> <name>ty</name></param> >+ <param><ptype>GLint</ptype> <name>tz</name></param> >+ <vecequiv name="glTangent3ivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glTangent3ivEXT</name></proto> >+ <param len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTangent3sEXT</name></proto> >+ <param><ptype>GLshort</ptype> <name>tx</name></param> >+ <param><ptype>GLshort</ptype> <name>ty</name></param> >+ <param><ptype>GLshort</ptype> <name>tz</name></param> >+ <vecequiv name="glTangent3svEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glTangent3svEXT</name></proto> >+ <param len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTangentPointerEXT</name></proto> >+ <param group="TangentPointerTypeEXT"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTbufferMask3DFX</name></proto> >+ <param><ptype>GLuint</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTessellationFactorAMD</name></proto> >+ <param><ptype>GLfloat</ptype> <name>factor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTessellationModeAMD</name></proto> >+ <param><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glTestFenceAPPLE</name></proto> >+ <param group="FenceNV"><ptype>GLuint</ptype> <name>fence</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glTestFenceNV</name></proto> >+ <param group="FenceNV"><ptype>GLuint</ptype> <name>fence</name></param> >+ <glx type="vendor" opcode="1279"/> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glTestObjectAPPLE</name></proto> >+ <param group="ObjectTypeAPPLE"><ptype>GLenum</ptype> <name>object</name></param> >+ <param><ptype>GLuint</ptype> <name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexBuffer</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexBufferARB</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <alias name="glTexBuffer"/> >+ <glx type="render" opcode="367"/> >+ </command> >+ <command> >+ <proto>void <name>glTexBufferEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <alias name="glTexBuffer"/> >+ </command> >+ <command> >+ <proto>void <name>glTexBufferOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <alias name="glTexBuffer"/> >+ </command> >+ <command> >+ <proto>void <name>glTexBufferRange</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexBufferRangeEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <alias name="glTexBufferRange"/> >+ </command> >+ <command> >+ <proto>void <name>glTexBufferRangeOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ <alias name="glTexBufferRange"/> >+ </command> >+ <command> >+ <proto>void <name>glTexBumpParameterfvATI</name></proto> >+ <param group="TexBumpParameterATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexBumpParameterivATI</name></proto> >+ <param group="TexBumpParameterATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord1bOES</name></proto> >+ <param><ptype>GLbyte</ptype> <name>s</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord1bvOES</name></proto> >+ <param len="1">const <ptype>GLbyte</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord1d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>s</name></param> >+ <vecequiv name="glTexCoord1dv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord1dv</name></proto> >+ <param group="CoordD" len="1">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="49"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord1f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>s</name></param> >+ <vecequiv name="glTexCoord1fv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord1fv</name></proto> >+ <param group="CoordF" len="1">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="50"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord1hNV</name></proto> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>s</name></param> >+ <vecequiv name="glTexCoord1hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord1hvNV</name></proto> >+ <param group="Half16NV" len="1">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4246"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord1i</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>s</name></param> >+ <vecequiv name="glTexCoord1iv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord1iv</name></proto> >+ <param group="CoordI" len="1">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="51"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord1s</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>s</name></param> >+ <vecequiv name="glTexCoord1sv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord1sv</name></proto> >+ <param group="CoordS" len="1">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="52"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord1xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>s</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord1xvOES</name></proto> >+ <param len="1">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2bOES</name></proto> >+ <param><ptype>GLbyte</ptype> <name>s</name></param> >+ <param><ptype>GLbyte</ptype> <name>t</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2bvOES</name></proto> >+ <param len="2">const <ptype>GLbyte</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>s</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>t</name></param> >+ <vecequiv name="glTexCoord2dv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2dv</name></proto> >+ <param group="CoordD" len="2">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="53"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>s</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>t</name></param> >+ <vecequiv name="glTexCoord2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2fColor3fVertex3fSUN</name></proto> >+ <param><ptype>GLfloat</ptype> <name>s</name></param> >+ <param><ptype>GLfloat</ptype> <name>t</name></param> >+ <param><ptype>GLfloat</ptype> <name>r</name></param> >+ <param><ptype>GLfloat</ptype> <name>g</name></param> >+ <param><ptype>GLfloat</ptype> <name>b</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2fColor3fVertex3fvSUN</name></proto> >+ <param len="2">const <ptype>GLfloat</ptype> *<name>tc</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>c</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2fColor4fNormal3fVertex3fSUN</name></proto> >+ <param><ptype>GLfloat</ptype> <name>s</name></param> >+ <param><ptype>GLfloat</ptype> <name>t</name></param> >+ <param><ptype>GLfloat</ptype> <name>r</name></param> >+ <param><ptype>GLfloat</ptype> <name>g</name></param> >+ <param><ptype>GLfloat</ptype> <name>b</name></param> >+ <param><ptype>GLfloat</ptype> <name>a</name></param> >+ <param><ptype>GLfloat</ptype> <name>nx</name></param> >+ <param><ptype>GLfloat</ptype> <name>ny</name></param> >+ <param><ptype>GLfloat</ptype> <name>nz</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2fColor4fNormal3fVertex3fvSUN</name></proto> >+ <param len="2">const <ptype>GLfloat</ptype> *<name>tc</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>c</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>n</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2fColor4ubVertex3fSUN</name></proto> >+ <param><ptype>GLfloat</ptype> <name>s</name></param> >+ <param><ptype>GLfloat</ptype> <name>t</name></param> >+ <param><ptype>GLubyte</ptype> <name>r</name></param> >+ <param><ptype>GLubyte</ptype> <name>g</name></param> >+ <param><ptype>GLubyte</ptype> <name>b</name></param> >+ <param><ptype>GLubyte</ptype> <name>a</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2fColor4ubVertex3fvSUN</name></proto> >+ <param len="2">const <ptype>GLfloat</ptype> *<name>tc</name></param> >+ <param len="4">const <ptype>GLubyte</ptype> *<name>c</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2fNormal3fVertex3fSUN</name></proto> >+ <param><ptype>GLfloat</ptype> <name>s</name></param> >+ <param><ptype>GLfloat</ptype> <name>t</name></param> >+ <param><ptype>GLfloat</ptype> <name>nx</name></param> >+ <param><ptype>GLfloat</ptype> <name>ny</name></param> >+ <param><ptype>GLfloat</ptype> <name>nz</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2fNormal3fVertex3fvSUN</name></proto> >+ <param len="2">const <ptype>GLfloat</ptype> *<name>tc</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>n</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2fVertex3fSUN</name></proto> >+ <param><ptype>GLfloat</ptype> <name>s</name></param> >+ <param><ptype>GLfloat</ptype> <name>t</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2fVertex3fvSUN</name></proto> >+ <param len="2">const <ptype>GLfloat</ptype> *<name>tc</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2fv</name></proto> >+ <param group="CoordF" len="2">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="54"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2hNV</name></proto> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>s</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>t</name></param> >+ <vecequiv name="glTexCoord2hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2hvNV</name></proto> >+ <param group="Half16NV" len="2">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4247"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2i</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>s</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>t</name></param> >+ <vecequiv name="glTexCoord2iv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2iv</name></proto> >+ <param group="CoordI" len="2">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="55"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2s</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>s</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>t</name></param> >+ <vecequiv name="glTexCoord2sv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2sv</name></proto> >+ <param group="CoordS" len="2">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="56"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>s</name></param> >+ <param><ptype>GLfixed</ptype> <name>t</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord2xvOES</name></proto> >+ <param len="2">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord3bOES</name></proto> >+ <param><ptype>GLbyte</ptype> <name>s</name></param> >+ <param><ptype>GLbyte</ptype> <name>t</name></param> >+ <param><ptype>GLbyte</ptype> <name>r</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord3bvOES</name></proto> >+ <param len="3">const <ptype>GLbyte</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord3d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>s</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>t</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>r</name></param> >+ <vecequiv name="glTexCoord3dv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord3dv</name></proto> >+ <param group="CoordD" len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="57"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord3f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>s</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>t</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>r</name></param> >+ <vecequiv name="glTexCoord3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord3fv</name></proto> >+ <param group="CoordF" len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="58"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord3hNV</name></proto> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>s</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>t</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>r</name></param> >+ <vecequiv name="glTexCoord3hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord3hvNV</name></proto> >+ <param group="Half16NV" len="3">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4248"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord3i</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>s</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>t</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>r</name></param> >+ <vecequiv name="glTexCoord3iv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord3iv</name></proto> >+ <param group="CoordI" len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="59"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord3s</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>s</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>t</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>r</name></param> >+ <vecequiv name="glTexCoord3sv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord3sv</name></proto> >+ <param group="CoordS" len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="60"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord3xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>s</name></param> >+ <param><ptype>GLfixed</ptype> <name>t</name></param> >+ <param><ptype>GLfixed</ptype> <name>r</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord3xvOES</name></proto> >+ <param len="3">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4bOES</name></proto> >+ <param><ptype>GLbyte</ptype> <name>s</name></param> >+ <param><ptype>GLbyte</ptype> <name>t</name></param> >+ <param><ptype>GLbyte</ptype> <name>r</name></param> >+ <param><ptype>GLbyte</ptype> <name>q</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4bvOES</name></proto> >+ <param len="4">const <ptype>GLbyte</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>s</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>t</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>r</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>q</name></param> >+ <vecequiv name="glTexCoord4dv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4dv</name></proto> >+ <param group="CoordD" len="4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="61"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>s</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>t</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>r</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>q</name></param> >+ <vecequiv name="glTexCoord4fv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4fColor4fNormal3fVertex4fSUN</name></proto> >+ <param><ptype>GLfloat</ptype> <name>s</name></param> >+ <param><ptype>GLfloat</ptype> <name>t</name></param> >+ <param><ptype>GLfloat</ptype> <name>p</name></param> >+ <param><ptype>GLfloat</ptype> <name>q</name></param> >+ <param><ptype>GLfloat</ptype> <name>r</name></param> >+ <param><ptype>GLfloat</ptype> <name>g</name></param> >+ <param><ptype>GLfloat</ptype> <name>b</name></param> >+ <param><ptype>GLfloat</ptype> <name>a</name></param> >+ <param><ptype>GLfloat</ptype> <name>nx</name></param> >+ <param><ptype>GLfloat</ptype> <name>ny</name></param> >+ <param><ptype>GLfloat</ptype> <name>nz</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <param><ptype>GLfloat</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4fColor4fNormal3fVertex4fvSUN</name></proto> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>tc</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>c</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>n</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4fVertex4fSUN</name></proto> >+ <param><ptype>GLfloat</ptype> <name>s</name></param> >+ <param><ptype>GLfloat</ptype> <name>t</name></param> >+ <param><ptype>GLfloat</ptype> <name>p</name></param> >+ <param><ptype>GLfloat</ptype> <name>q</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <param><ptype>GLfloat</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4fVertex4fvSUN</name></proto> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>tc</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4fv</name></proto> >+ <param group="CoordF" len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="62"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4hNV</name></proto> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>s</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>t</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>r</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>q</name></param> >+ <vecequiv name="glTexCoord4hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4hvNV</name></proto> >+ <param group="Half16NV" len="4">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4249"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4i</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>s</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>t</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>r</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>q</name></param> >+ <vecequiv name="glTexCoord4iv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4iv</name></proto> >+ <param group="CoordI" len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="63"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4s</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>s</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>t</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>r</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>q</name></param> >+ <vecequiv name="glTexCoord4sv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4sv</name></proto> >+ <param group="CoordS" len="4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="64"/> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>s</name></param> >+ <param><ptype>GLfixed</ptype> <name>t</name></param> >+ <param><ptype>GLfixed</ptype> <name>r</name></param> >+ <param><ptype>GLfixed</ptype> <name>q</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoord4xvOES</name></proto> >+ <param len="4">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoordFormatNV</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoordP1ui</name></proto> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoordP1uiv</name></proto> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoordP2ui</name></proto> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoordP2uiv</name></proto> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoordP3ui</name></proto> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoordP3uiv</name></proto> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoordP4ui</name></proto> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoordP4uiv</name></proto> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoordPointer</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoordPointerEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="COMPSIZE(size,type,stride,count)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoordPointerListIBM</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLint</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void **<name>pointer</name></param> >+ <param><ptype>GLint</ptype> <name>ptrstride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexCoordPointervINTEL</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="4">const void **<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexEnvf</name></proto> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <glx type="render" opcode="111"/> >+ </command> >+ <command> >+ <proto>void <name>glTexEnvfv</name></proto> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="112"/> >+ </command> >+ <command> >+ <proto>void <name>glTexEnvi</name></proto> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ <glx type="render" opcode="113"/> >+ </command> >+ <command> >+ <proto>void <name>glTexEnviv</name></proto> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="114"/> >+ </command> >+ <command> >+ <proto>void <name>glTexEnvx</name></proto> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexEnvxOES</name></proto> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexEnvxv</name></proto> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexEnvxvOES</name></proto> >+ <param group="TextureEnvTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureEnvParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexFilterFuncSGIS</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureFilterSGIS"><ptype>GLenum</ptype> <name>filter</name></param> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param len="n">const <ptype>GLfloat</ptype> *<name>weights</name></param> >+ <glx type="render" opcode="2064"/> >+ </command> >+ <command> >+ <proto>void <name>glTexGend</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLdouble</ptype> <name>param</name></param> >+ <glx type="render" opcode="115"/> >+ </command> >+ <command> >+ <proto>void <name>glTexGendv</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLdouble</ptype> *<name>params</name></param> >+ <glx type="render" opcode="116"/> >+ </command> >+ <command> >+ <proto>void <name>glTexGenf</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <glx type="render" opcode="117"/> >+ </command> >+ <command> >+ <proto>void <name>glTexGenfOES</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexGenfv</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="118"/> >+ </command> >+ <command> >+ <proto>void <name>glTexGenfvOES</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexGeni</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ <glx type="render" opcode="119"/> >+ </command> >+ <command> >+ <proto>void <name>glTexGeniOES</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexGeniv</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="120"/> >+ </command> >+ <command> >+ <proto>void <name>glTexGenivOES</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexGenxOES</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexGenxvOES</name></proto> >+ <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param> >+ <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexImage1D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLint</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width)">const void *<name>pixels</name></param> >+ <glx type="render" opcode="109"/> >+ <glx type="render" opcode="328" name="glTexImage1DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glTexImage2D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLint</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height)">const void *<name>pixels</name></param> >+ <glx type="render" opcode="110"/> >+ <glx type="render" opcode="329" name="glTexImage2DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glTexImage2DMultisample</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>fixedsamplelocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexImage2DMultisampleCoverageNV</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>coverageSamples</name></param> >+ <param><ptype>GLsizei</ptype> <name>colorSamples</name></param> >+ <param><ptype>GLint</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>fixedSampleLocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexImage3D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLint</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height,depth)">const void *<name>pixels</name></param> >+ <glx type="render" opcode="4114"/> >+ <glx type="render" opcode="330" name="glTexImage3DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glTexImage3DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height,depth)">const void *<name>pixels</name></param> >+ <alias name="glTexImage3D"/> >+ <glx type="render" opcode="4114"/> >+ </command> >+ <command> >+ <proto>void <name>glTexImage3DMultisample</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>fixedsamplelocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexImage3DMultisampleCoverageNV</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>coverageSamples</name></param> >+ <param><ptype>GLsizei</ptype> <name>colorSamples</name></param> >+ <param><ptype>GLint</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>fixedSampleLocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexImage3DOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLint</ptype> <name>border</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height,depth)">const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexImage4DSGIS</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLsizei</ptype> <name>size4d</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height,depth,size4d)">const void *<name>pixels</name></param> >+ <glx type="render" opcode="2057"/> >+ </command> >+ <command> >+ <proto>void <name>glTexPageCommitmentARB</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLboolean</ptype> <name>commit</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexPageCommitmentEXT</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLboolean</ptype> <name>commit</name></param> >+ <alias name="glTexPageCommitmentARB"/> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterIiv</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="346"/> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterIivEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glTexParameterIiv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterIivOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <alias name="glTexParameterIiv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterIuiv</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLuint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="347"/> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterIuivEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLuint</ptype> *<name>params</name></param> >+ <alias name="glTexParameterIuiv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterIuivOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLuint</ptype> *<name>params</name></param> >+ <alias name="glTexParameterIuiv"/> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterf</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <glx type="render" opcode="105"/> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterfv</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ <glx type="render" opcode="106"/> >+ </command> >+ <command> >+ <proto>void <name>glTexParameteri</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ <glx type="render" opcode="107"/> >+ </command> >+ <command> >+ <proto>void <name>glTexParameteriv</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ <glx type="render" opcode="108"/> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterx</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterxOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfixed</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterxv</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterxvOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="GetTextureParameter"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfixed</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexRenderbufferNV</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexStorage1D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexStorage1DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <alias name="glTexStorage1D"/> >+ </command> >+ <command> >+ <proto>void <name>glTexStorage2D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexStorage2DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <alias name="glTexStorage2D"/> >+ </command> >+ <command> >+ <proto>void <name>glTexStorage2DMultisample</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>fixedsamplelocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexStorage3D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexStorage3DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <alias name="glTexStorage3D"/> >+ </command> >+ <command> >+ <proto>void <name>glTexStorage3DMultisample</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>fixedsamplelocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexStorage3DMultisampleOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>fixedsamplelocations</name></param> >+ <alias name="glTexStorage3DMultisample"/> >+ </command> >+ <command> >+ <proto>void <name>glTexStorageMem1DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param><ptype>GLenum</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexStorageMem2DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param><ptype>GLenum</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexStorageMem2DMultisampleEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param><ptype>GLenum</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLboolean</ptype> <name>fixedSampleLocations</name></param> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexStorageMem3DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param><ptype>GLenum</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexStorageMem3DMultisampleEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param><ptype>GLenum</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLboolean</ptype> <name>fixedSampleLocations</name></param> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexStorageSparseAMD</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLsizei</ptype> <name>layers</name></param> >+ <param group="TextureStorageMaskAMD"><ptype>GLbitfield</ptype> <name>flags</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexSubImage1D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width)">const void *<name>pixels</name></param> >+ <glx type="render" opcode="4099"/> >+ <glx type="render" opcode="331" name="glTexSubImage1DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glTexSubImage1DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width)">const void *<name>pixels</name></param> >+ <alias name="glTexSubImage1D"/> >+ <glx type="render" opcode="4099"/> >+ </command> >+ <command> >+ <proto>void <name>glTexSubImage2D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height)">const void *<name>pixels</name></param> >+ <glx type="render" opcode="4100"/> >+ <glx type="render" opcode="332" name="glTexSubImage2DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glTexSubImage2DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height)">const void *<name>pixels</name></param> >+ <alias name="glTexSubImage2D"/> >+ <glx type="render" opcode="4100"/> >+ </command> >+ <command> >+ <proto>void <name>glTexSubImage3D</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height,depth)">const void *<name>pixels</name></param> >+ <glx type="render" opcode="4115"/> >+ <glx type="render" opcode="333" name="glTexSubImage3DPBO" comment="PBO protocol"/> >+ </command> >+ <command> >+ <proto>void <name>glTexSubImage3DEXT</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height,depth)">const void *<name>pixels</name></param> >+ <alias name="glTexSubImage3D"/> >+ <glx type="render" opcode="4115"/> >+ </command> >+ <command> >+ <proto>void <name>glTexSubImage3DOES</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height,depth)">const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexSubImage4DSGIS</name></proto> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>woffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLsizei</ptype> <name>size4d</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height,depth,size4d)">const void *<name>pixels</name></param> >+ <glx type="render" opcode="2058"/> >+ </command> >+ <command> >+ <proto>void <name>glTextureBarrier</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glTextureBarrierNV</name></proto> >+ <glx type="render" opcode="4348"/> >+ </command> >+ <command> >+ <proto>void <name>glTextureBuffer</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureBufferEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureBufferRange</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureBufferRangeEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureColorMaskSGIS</name></proto> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>red</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>green</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>blue</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>alpha</name></param> >+ <glx type="render" opcode="2082"/> >+ </command> >+ <command> >+ <proto>void <name>glTextureFoveationParametersQCOM</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLuint</ptype> <name>layer</name></param> >+ <param><ptype>GLuint</ptype> <name>focalPoint</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>focalX</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>focalY</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>gainX</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>gainY</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>foveaArea</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureImage1DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLint</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width)">const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureImage2DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLint</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height)">const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureImage2DMultisampleCoverageNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>coverageSamples</name></param> >+ <param><ptype>GLsizei</ptype> <name>colorSamples</name></param> >+ <param><ptype>GLint</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>fixedSampleLocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureImage2DMultisampleNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param><ptype>GLint</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>fixedSampleLocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureImage3DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="InternalFormat"><ptype>GLint</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height,depth)">const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureImage3DMultisampleCoverageNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>coverageSamples</name></param> >+ <param><ptype>GLsizei</ptype> <name>colorSamples</name></param> >+ <param><ptype>GLint</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>fixedSampleLocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureImage3DMultisampleNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param><ptype>GLint</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>fixedSampleLocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureLightEXT</name></proto> >+ <param group="LightTexturePNameEXT"><ptype>GLenum</ptype> <name>pname</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureMaterialEXT</name></proto> >+ <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param> >+ <param group="MaterialParameter"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureNormalEXT</name></proto> >+ <param group="TextureNormalModeEXT"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexturePageCommitmentEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLboolean</ptype> <name>commit</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureParameterIiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param>const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureParameterIivEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureParameterIuiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param>const <ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureParameterIuivEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLuint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureParameterf</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureParameterfEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>param</name></param> >+ <vecequiv name="glTextureParameterfvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glTextureParameterfv</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param>const <ptype>GLfloat</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureParameterfvEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedFloat32" len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureParameteri</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureParameteriEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>param</name></param> >+ <vecequiv name="glTextureParameterivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glTextureParameteriv</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param>const <ptype>GLint</ptype> *<name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureParameterivEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="TextureParameterName"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param group="CheckedInt32" len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureRangeAPPLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param len="length">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureRenderbufferEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>renderbuffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorage1D</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorage1DEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorage2D</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorage2DEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorage2DMultisample</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLboolean</ptype> <name>fixedsamplelocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorage2DMultisampleEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>fixedsamplelocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorage3D</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorage3DEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorage3DMultisample</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLboolean</ptype> <name>fixedsamplelocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorage3DMultisampleEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>fixedsamplelocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorageMem1DEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param><ptype>GLenum</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorageMem2DEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param><ptype>GLenum</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorageMem2DMultisampleEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param><ptype>GLenum</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLboolean</ptype> <name>fixedSampleLocations</name></param> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorageMem3DEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLsizei</ptype> <name>levels</name></param> >+ <param><ptype>GLenum</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorageMem3DMultisampleEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param><ptype>GLenum</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLboolean</ptype> <name>fixedSampleLocations</name></param> >+ <param><ptype>GLuint</ptype> <name>memory</name></param> >+ <param><ptype>GLuint64</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureStorageSparseAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLsizei</ptype> <name>layers</name></param> >+ <param group="TextureStorageMaskAMD"><ptype>GLbitfield</ptype> <name>flags</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureSubImage1D</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param>const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureSubImage1DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width)">const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureSubImage2D</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param>const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureSubImage2DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height)">const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureSubImage3D</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param>const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureSubImage3DEXT</name></proto> >+ <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param group="CheckedInt32"><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param> >+ <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(format,type,width,height,depth)">const void *<name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureView</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>origtexture</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>minlevel</name></param> >+ <param><ptype>GLuint</ptype> <name>numlevels</name></param> >+ <param><ptype>GLuint</ptype> <name>minlayer</name></param> >+ <param><ptype>GLuint</ptype> <name>numlayers</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTextureViewEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>origtexture</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>minlevel</name></param> >+ <param><ptype>GLuint</ptype> <name>numlevels</name></param> >+ <param><ptype>GLuint</ptype> <name>minlayer</name></param> >+ <param><ptype>GLuint</ptype> <name>numlayers</name></param> >+ <alias name="glTextureView"/> >+ </command> >+ <command> >+ <proto>void <name>glTextureViewOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>origtexture</name></param> >+ <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLuint</ptype> <name>minlevel</name></param> >+ <param><ptype>GLuint</ptype> <name>numlevels</name></param> >+ <param><ptype>GLuint</ptype> <name>minlayer</name></param> >+ <param><ptype>GLuint</ptype> <name>numlayers</name></param> >+ <alias name="glTextureView"/> >+ </command> >+ <command> >+ <proto>void <name>glTrackMatrixNV</name></proto> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>address</name></param> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>matrix</name></param> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>transform</name></param> >+ <glx type="render" opcode="4188"/> >+ </command> >+ <command> >+ <proto>void <name>glTransformFeedbackAttribsNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="COMPSIZE(count)">const <ptype>GLint</ptype> *<name>attribs</name></param> >+ <param><ptype>GLenum</ptype> <name>bufferMode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTransformFeedbackBufferBase</name></proto> >+ <param><ptype>GLuint</ptype> <name>xfb</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTransformFeedbackBufferRange</name></proto> >+ <param><ptype>GLuint</ptype> <name>xfb</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTransformFeedbackStreamAttribsNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLint</ptype> *<name>attribs</name></param> >+ <param><ptype>GLsizei</ptype> <name>nbuffers</name></param> >+ <param len="nbuffers">const <ptype>GLint</ptype> *<name>bufstreams</name></param> >+ <param><ptype>GLenum</ptype> <name>bufferMode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTransformFeedbackVaryings</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLchar</ptype> *const*<name>varyings</name></param> >+ <param><ptype>GLenum</ptype> <name>bufferMode</name></param> >+ <glx type="render" opcode="359"/> >+ </command> >+ <command> >+ <proto>void <name>glTransformFeedbackVaryingsEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLchar</ptype> *const*<name>varyings</name></param> >+ <param><ptype>GLenum</ptype> <name>bufferMode</name></param> >+ <alias name="glTransformFeedbackVaryings"/> >+ </command> >+ <command> >+ <proto>void <name>glTransformFeedbackVaryingsNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLint</ptype> *<name>locations</name></param> >+ <param><ptype>GLenum</ptype> <name>bufferMode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTransformPathNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>resultPath</name></param> >+ <param group="Path"><ptype>GLuint</ptype> <name>srcPath</name></param> >+ <param group="PathTransformType"><ptype>GLenum</ptype> <name>transformType</name></param> >+ <param len="COMPSIZE(transformType)">const <ptype>GLfloat</ptype> *<name>transformValues</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTranslated</name></proto> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <glx type="render" opcode="189"/> >+ </command> >+ <command> >+ <proto>void <name>glTranslatef</name></proto> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <glx type="render" opcode="190"/> >+ </command> >+ <command> >+ <proto>void <name>glTranslatex</name></proto> >+ <param><ptype>GLfixed</ptype> <name>x</name></param> >+ <param><ptype>GLfixed</ptype> <name>y</name></param> >+ <param><ptype>GLfixed</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTranslatexOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>x</name></param> >+ <param><ptype>GLfixed</ptype> <name>y</name></param> >+ <param><ptype>GLfixed</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1d</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1dv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*1">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1f</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1fARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ <alias name="glUniform1f"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform1fv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*1">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1fvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*1">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glUniform1fv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform1i</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1i64ARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1i64NV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1i64vARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*1">const <ptype>GLint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1i64vNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*1">const <ptype>GLint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1iARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ <alias name="glUniform1i"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform1iv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*1">const <ptype>GLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1ivARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*1">const <ptype>GLint</ptype> *<name>value</name></param> >+ <alias name="glUniform1iv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform1ui</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1ui64ARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1ui64NV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1ui64vARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*1">const <ptype>GLuint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1ui64vNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*1">const <ptype>GLuint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1uiEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ <alias name="glUniform1ui"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform1uiv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*1">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform1uivEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*1">const <ptype>GLuint</ptype> *<name>value</name></param> >+ <alias name="glUniform1uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform2d</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2dv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2f</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ <param><ptype>GLfloat</ptype> <name>v1</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2fARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ <param><ptype>GLfloat</ptype> <name>v1</name></param> >+ <alias name="glUniform2f"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform2fv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2fvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glUniform2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform2i</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ <param><ptype>GLint</ptype> <name>v1</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2i64ARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64</ptype> <name>x</name></param> >+ <param><ptype>GLint64</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2i64NV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2i64vARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2i64vNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2iARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ <param><ptype>GLint</ptype> <name>v1</name></param> >+ <alias name="glUniform2i"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform2iv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2ivARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLint</ptype> *<name>value</name></param> >+ <alias name="glUniform2iv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform2ui</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ <param><ptype>GLuint</ptype> <name>v1</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2ui64ARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64</ptype> <name>x</name></param> >+ <param><ptype>GLuint64</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2ui64NV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2ui64vARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLuint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2ui64vNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLuint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2uiEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ <param><ptype>GLuint</ptype> <name>v1</name></param> >+ <alias name="glUniform2ui"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform2uiv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform2uivEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLuint</ptype> *<name>value</name></param> >+ <alias name="glUniform2uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform3d</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3dv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3f</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ <param><ptype>GLfloat</ptype> <name>v1</name></param> >+ <param><ptype>GLfloat</ptype> <name>v2</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3fARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ <param><ptype>GLfloat</ptype> <name>v1</name></param> >+ <param><ptype>GLfloat</ptype> <name>v2</name></param> >+ <alias name="glUniform3f"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform3fv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3fvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glUniform3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform3i</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ <param><ptype>GLint</ptype> <name>v1</name></param> >+ <param><ptype>GLint</ptype> <name>v2</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3i64ARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64</ptype> <name>x</name></param> >+ <param><ptype>GLint64</ptype> <name>y</name></param> >+ <param><ptype>GLint64</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3i64NV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>y</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3i64vARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3i64vNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3iARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ <param><ptype>GLint</ptype> <name>v1</name></param> >+ <param><ptype>GLint</ptype> <name>v2</name></param> >+ <alias name="glUniform3i"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform3iv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3ivARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLint</ptype> *<name>value</name></param> >+ <alias name="glUniform3iv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform3ui</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ <param><ptype>GLuint</ptype> <name>v1</name></param> >+ <param><ptype>GLuint</ptype> <name>v2</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3ui64ARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64</ptype> <name>x</name></param> >+ <param><ptype>GLuint64</ptype> <name>y</name></param> >+ <param><ptype>GLuint64</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3ui64NV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>y</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3ui64vARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLuint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3ui64vNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLuint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3uiEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ <param><ptype>GLuint</ptype> <name>v1</name></param> >+ <param><ptype>GLuint</ptype> <name>v2</name></param> >+ <alias name="glUniform3ui"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform3uiv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform3uivEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLuint</ptype> *<name>value</name></param> >+ <alias name="glUniform3uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform4d</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <param><ptype>GLdouble</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4dv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4f</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ <param><ptype>GLfloat</ptype> <name>v1</name></param> >+ <param><ptype>GLfloat</ptype> <name>v2</name></param> >+ <param><ptype>GLfloat</ptype> <name>v3</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4fARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLfloat</ptype> <name>v0</name></param> >+ <param><ptype>GLfloat</ptype> <name>v1</name></param> >+ <param><ptype>GLfloat</ptype> <name>v2</name></param> >+ <param><ptype>GLfloat</ptype> <name>v3</name></param> >+ <alias name="glUniform4f"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform4fv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4fvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glUniform4fv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform4i</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ <param><ptype>GLint</ptype> <name>v1</name></param> >+ <param><ptype>GLint</ptype> <name>v2</name></param> >+ <param><ptype>GLint</ptype> <name>v3</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4i64ARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64</ptype> <name>x</name></param> >+ <param><ptype>GLint64</ptype> <name>y</name></param> >+ <param><ptype>GLint64</ptype> <name>z</name></param> >+ <param><ptype>GLint64</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4i64NV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>y</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>z</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4i64vARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4i64vNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4iARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLint</ptype> <name>v0</name></param> >+ <param><ptype>GLint</ptype> <name>v1</name></param> >+ <param><ptype>GLint</ptype> <name>v2</name></param> >+ <param><ptype>GLint</ptype> <name>v3</name></param> >+ <alias name="glUniform4i"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform4iv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4ivARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLint</ptype> *<name>value</name></param> >+ <alias name="glUniform4iv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform4ui</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ <param><ptype>GLuint</ptype> <name>v1</name></param> >+ <param><ptype>GLuint</ptype> <name>v2</name></param> >+ <param><ptype>GLuint</ptype> <name>v3</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4ui64ARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64</ptype> <name>x</name></param> >+ <param><ptype>GLuint64</ptype> <name>y</name></param> >+ <param><ptype>GLuint64</ptype> <name>z</name></param> >+ <param><ptype>GLuint64</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4ui64NV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>y</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>z</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4ui64vARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLuint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4ui64vNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLuint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4uiEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>v0</name></param> >+ <param><ptype>GLuint</ptype> <name>v1</name></param> >+ <param><ptype>GLuint</ptype> <name>v2</name></param> >+ <param><ptype>GLuint</ptype> <name>v3</name></param> >+ <alias name="glUniform4ui"/> >+ </command> >+ <command> >+ <proto>void <name>glUniform4uiv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniform4uivEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLuint</ptype> *<name>value</name></param> >+ <alias name="glUniform4uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformBlockBinding</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>uniformBlockIndex</name></param> >+ <param><ptype>GLuint</ptype> <name>uniformBlockBinding</name></param> >+ <glx type="render" opcode="366"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformBufferEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformHandleui64ARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformHandleui64IMG</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64</ptype> <name>value</name></param> >+ <alias name="glUniformHandleui64ARB"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformHandleui64NV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformHandleui64vARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformHandleui64vIMG</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint64</ptype> *<name>value</name></param> >+ <alias name="glUniformHandleui64vARB"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformHandleui64vNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint64</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix2dv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*4">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix2fv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*4">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix2fvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*4">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glUniformMatrix2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix2x3dv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*6">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix2x3fv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*6">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <glx type="render" opcode="305"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix2x3fvNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*6">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glUniformMatrix2x3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix2x4dv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*8">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix2x4fv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*8">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <glx type="render" opcode="307"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix2x4fvNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*8">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glUniformMatrix2x4fv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix3dv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*9">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix3fv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*9">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix3fvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*9">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glUniformMatrix3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix3x2dv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*6">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix3x2fv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*6">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <glx type="render" opcode="306"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix3x2fvNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*6">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glUniformMatrix3x2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix3x4dv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*12">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix3x4fv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*12">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <glx type="render" opcode="309"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix3x4fvNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*12">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glUniformMatrix3x4fv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix4dv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*16">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix4fv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*16">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix4fvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*16">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glUniformMatrix4fv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix4x2dv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*8">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix4x2fv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*8">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <glx type="render" opcode="308"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix4x2fvNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*8">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glUniformMatrix4x2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix4x3dv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*12">const <ptype>GLdouble</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix4x3fv</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*12">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <glx type="render" opcode="310"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformMatrix4x3fvNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>transpose</name></param> >+ <param len="count*12">const <ptype>GLfloat</ptype> *<name>value</name></param> >+ <alias name="glUniformMatrix4x3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glUniformSubroutinesuiv</name></proto> >+ <param group="ShaderType"><ptype>GLenum</ptype> <name>shadertype</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLuint</ptype> *<name>indices</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformui64NV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUniformui64vNV</name></proto> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*1">const <ptype>GLuint64EXT</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUnlockArraysEXT</name></proto> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glUnmapBuffer</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glUnmapBufferARB</name></proto> >+ <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param> >+ <alias name="glUnmapBuffer"/> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glUnmapBufferOES</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <alias name="glUnmapBuffer"/> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glUnmapNamedBuffer</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto group="Boolean"><ptype>GLboolean</ptype> <name>glUnmapNamedBufferEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUnmapObjectBufferATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUnmapTexture2DINTEL</name></proto> >+ <param><ptype>GLuint</ptype> <name>texture</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUpdateObjectBufferATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLuint</ptype> <name>offset</name></param> >+ <param><ptype>GLsizei</ptype> <name>size</name></param> >+ <param len="size">const void *<name>pointer</name></param> >+ <param group="PreserveModeATI"><ptype>GLenum</ptype> <name>preserve</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUseProgram</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUseProgramObjectARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>programObj</name></param> >+ <alias name="glUseProgram"/> >+ </command> >+ <command> >+ <proto>void <name>glUseProgramStages</name></proto> >+ <param><ptype>GLuint</ptype> <name>pipeline</name></param> >+ <param group="UseProgramStageMask"><ptype>GLbitfield</ptype> <name>stages</name></param> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUseProgramStagesEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>pipeline</name></param> >+ <param group="UseProgramStageMask"><ptype>GLbitfield</ptype> <name>stages</name></param> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ </command> >+ <command> >+ <proto>void <name>glUseShaderProgramEXT</name></proto> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVDPAUFiniNV</name></proto> >+ </command> >+ <command> >+ <proto>void <name>glVDPAUGetSurfaceivNV</name></proto> >+ <param group="vdpauSurfaceNV"><ptype>GLvdpauSurfaceNV</ptype> <name>surface</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei</ptype> *<name>length</name></param> >+ <param len="bufSize"><ptype>GLint</ptype> *<name>values</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVDPAUInitNV</name></proto> >+ <param>const void *<name>vdpDevice</name></param> >+ <param>const void *<name>getProcAddress</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>glVDPAUIsSurfaceNV</name></proto> >+ <param group="vdpauSurfaceNV"><ptype>GLvdpauSurfaceNV</ptype> <name>surface</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVDPAUMapSurfacesNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>numSurfaces</name></param> >+ <param group="vdpauSurfaceNV" len="numSurfaces">const <ptype>GLvdpauSurfaceNV</ptype> *<name>surfaces</name></param> >+ </command> >+ <command> >+ <proto group="vdpauSurfaceNV"><ptype>GLvdpauSurfaceNV</ptype> <name>glVDPAURegisterOutputSurfaceNV</name></proto> >+ <param>const void *<name>vdpSurface</name></param> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>numTextureNames</name></param> >+ <param len="numTextureNames">const <ptype>GLuint</ptype> *<name>textureNames</name></param> >+ </command> >+ <command> >+ <proto group="vdpauSurfaceNV"><ptype>GLvdpauSurfaceNV</ptype> <name>glVDPAURegisterVideoSurfaceNV</name></proto> >+ <param>const void *<name>vdpSurface</name></param> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>numTextureNames</name></param> >+ <param len="numTextureNames">const <ptype>GLuint</ptype> *<name>textureNames</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVDPAUSurfaceAccessNV</name></proto> >+ <param group="vdpauSurfaceNV"><ptype>GLvdpauSurfaceNV</ptype> <name>surface</name></param> >+ <param><ptype>GLenum</ptype> <name>access</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVDPAUUnmapSurfacesNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>numSurface</name></param> >+ <param group="vdpauSurfaceNV" len="numSurface">const <ptype>GLvdpauSurfaceNV</ptype> *<name>surfaces</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVDPAUUnregisterSurfaceNV</name></proto> >+ <param group="vdpauSurfaceNV"><ptype>GLvdpauSurfaceNV</ptype> <name>surface</name></param> >+ </command> >+ <command> >+ <proto>void <name>glValidateProgram</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ </command> >+ <command> >+ <proto>void <name>glValidateProgramARB</name></proto> >+ <param group="handleARB"><ptype>GLhandleARB</ptype> <name>programObj</name></param> >+ <alias name="glValidateProgram"/> >+ </command> >+ <command> >+ <proto>void <name>glValidateProgramPipeline</name></proto> >+ <param><ptype>GLuint</ptype> <name>pipeline</name></param> >+ </command> >+ <command> >+ <proto>void <name>glValidateProgramPipelineEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>pipeline</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVariantArrayObjectATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="ScalarType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLuint</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVariantPointerEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param group="ScalarType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(id,type,stride)">const void *<name>addr</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVariantbvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param len="COMPSIZE(id)">const <ptype>GLbyte</ptype> *<name>addr</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVariantdvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param len="COMPSIZE(id)">const <ptype>GLdouble</ptype> *<name>addr</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVariantfvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param len="COMPSIZE(id)">const <ptype>GLfloat</ptype> *<name>addr</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVariantivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param len="COMPSIZE(id)">const <ptype>GLint</ptype> *<name>addr</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVariantsvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param len="COMPSIZE(id)">const <ptype>GLshort</ptype> *<name>addr</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVariantubvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param len="COMPSIZE(id)">const <ptype>GLubyte</ptype> *<name>addr</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVariantuivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param len="COMPSIZE(id)">const <ptype>GLuint</ptype> *<name>addr</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVariantusvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param len="COMPSIZE(id)">const <ptype>GLushort</ptype> *<name>addr</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertex2bOES</name></proto> >+ <param><ptype>GLbyte</ptype> <name>x</name></param> >+ <param><ptype>GLbyte</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertex2bvOES</name></proto> >+ <param len="2">const <ptype>GLbyte</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertex2d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y</name></param> >+ <vecequiv name="glVertex2dv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex2dv</name></proto> >+ <param group="CoordD" len="2">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="65"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex2f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y</name></param> >+ <vecequiv name="glVertex2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex2fv</name></proto> >+ <param group="CoordF" len="2">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="66"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex2hNV</name></proto> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>x</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>y</name></param> >+ <vecequiv name="glVertex2hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex2hvNV</name></proto> >+ <param group="Half16NV" len="2">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4240"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex2i</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y</name></param> >+ <vecequiv name="glVertex2iv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex2iv</name></proto> >+ <param group="CoordI" len="2">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="67"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex2s</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y</name></param> >+ <vecequiv name="glVertex2sv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex2sv</name></proto> >+ <param group="CoordS" len="2">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="68"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex2xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertex2xvOES</name></proto> >+ <param len="2">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertex3bOES</name></proto> >+ <param><ptype>GLbyte</ptype> <name>x</name></param> >+ <param><ptype>GLbyte</ptype> <name>y</name></param> >+ <param><ptype>GLbyte</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertex3bvOES</name></proto> >+ <param len="3">const <ptype>GLbyte</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertex3d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>z</name></param> >+ <vecequiv name="glVertex3dv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex3dv</name></proto> >+ <param group="CoordD" len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="69"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex3f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>z</name></param> >+ <vecequiv name="glVertex3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex3fv</name></proto> >+ <param group="CoordF" len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="70"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex3hNV</name></proto> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>x</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>y</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>z</name></param> >+ <vecequiv name="glVertex3hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex3hvNV</name></proto> >+ <param group="Half16NV" len="3">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4241"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex3i</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>z</name></param> >+ <vecequiv name="glVertex3iv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex3iv</name></proto> >+ <param group="CoordI" len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="71"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex3s</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>z</name></param> >+ <vecequiv name="glVertex3sv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex3sv</name></proto> >+ <param group="CoordS" len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="72"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex3xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>x</name></param> >+ <param><ptype>GLfixed</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertex3xvOES</name></proto> >+ <param len="3">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertex4bOES</name></proto> >+ <param><ptype>GLbyte</ptype> <name>x</name></param> >+ <param><ptype>GLbyte</ptype> <name>y</name></param> >+ <param><ptype>GLbyte</ptype> <name>z</name></param> >+ <param><ptype>GLbyte</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertex4bvOES</name></proto> >+ <param len="4">const <ptype>GLbyte</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertex4d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>z</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>w</name></param> >+ <vecequiv name="glVertex4dv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex4dv</name></proto> >+ <param group="CoordD" len="4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="73"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex4f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>z</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>w</name></param> >+ <vecequiv name="glVertex4fv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex4fv</name></proto> >+ <param group="CoordF" len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="74"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex4hNV</name></proto> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>x</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>y</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>z</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>w</name></param> >+ <vecequiv name="glVertex4hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex4hvNV</name></proto> >+ <param group="Half16NV" len="4">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4242"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex4i</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>z</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>w</name></param> >+ <vecequiv name="glVertex4iv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex4iv</name></proto> >+ <param group="CoordI" len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="75"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex4s</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>z</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>w</name></param> >+ <vecequiv name="glVertex4sv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex4sv</name></proto> >+ <param group="CoordS" len="4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="76"/> >+ </command> >+ <command> >+ <proto>void <name>glVertex4xOES</name></proto> >+ <param><ptype>GLfixed</ptype> <name>x</name></param> >+ <param><ptype>GLfixed</ptype> <name>y</name></param> >+ <param><ptype>GLfixed</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertex4xvOES</name></proto> >+ <param len="4">const <ptype>GLfixed</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayAttribBinding</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>attribindex</name></param> >+ <param><ptype>GLuint</ptype> <name>bindingindex</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayAttribFormat</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>attribindex</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexAttribType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param><ptype>GLuint</ptype> <name>relativeoffset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayAttribIFormat</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>attribindex</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexAttribType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>relativeoffset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayAttribLFormat</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>attribindex</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexAttribType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>relativeoffset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayBindVertexBufferEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>bindingindex</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayBindingDivisor</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>bindingindex</name></param> >+ <param><ptype>GLuint</ptype> <name>divisor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayColorOffsetEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="ColorPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayEdgeFlagOffsetEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayElementBuffer</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayFogCoordOffsetEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="FogCoordinatePointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayIndexOffsetEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="IndexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayMultiTexCoordOffsetEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLenum</ptype> <name>texunit</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayNormalOffsetEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param group="NormalPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayParameteriAPPLE</name></proto> >+ <param group="VertexArrayPNameAPPLE"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayRangeAPPLE</name></proto> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param len="length">void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayRangeNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>length</name></param> >+ <param len="COMPSIZE(length)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArraySecondaryColorOffsetEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="ColorPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayTexCoordOffsetEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="TexCoordPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayVertexAttribBindingEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>attribindex</name></param> >+ <param><ptype>GLuint</ptype> <name>bindingindex</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayVertexAttribDivisorEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>divisor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayVertexAttribFormatEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>attribindex</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param><ptype>GLuint</ptype> <name>relativeoffset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayVertexAttribIFormatEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>attribindex</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>relativeoffset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayVertexAttribIOffsetEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexAttribEnum"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayVertexAttribLFormatEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>attribindex</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>relativeoffset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayVertexAttribLOffsetEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayVertexAttribOffsetEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayVertexBindingDivisorEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>bindingindex</name></param> >+ <param><ptype>GLuint</ptype> <name>divisor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayVertexBuffer</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>bindingindex</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayVertexBuffers</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param>const <ptype>GLuint</ptype> *<name>buffers</name></param> >+ <param>const <ptype>GLintptr</ptype> *<name>offsets</name></param> >+ <param>const <ptype>GLsizei</ptype> *<name>strides</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexArrayVertexOffsetEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>vaobj</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLintptr</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1d</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <vecequiv name="glVertexAttrib1dv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1dARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <alias name="glVertexAttrib1d"/> >+ <vecequiv name="glVertexAttrib1dvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1dNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <alias name="glVertexAttrib1d"/> >+ <vecequiv name="glVertexAttrib1dvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4197"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1dvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib1dv"/> >+ <glx type="render" opcode="4197"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1dvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib1dv"/> >+ <glx type="render" opcode="4197"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1f</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <vecequiv name="glVertexAttrib1fv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1fARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <alias name="glVertexAttrib1f"/> >+ <vecequiv name="glVertexAttrib1fvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1fNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <alias name="glVertexAttrib1f"/> >+ <vecequiv name="glVertexAttrib1fvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4193"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1fvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib1fv"/> >+ <glx type="render" opcode="4193"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1fvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib1fv"/> >+ <glx type="render" opcode="4193"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1hNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>x</name></param> >+ <vecequiv name="glVertexAttrib1hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1hvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="Half16NV" len="1">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4257"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1s</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <vecequiv name="glVertexAttrib1sv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1sARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <alias name="glVertexAttrib1s"/> >+ <vecequiv name="glVertexAttrib1svARB"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1sNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <alias name="glVertexAttrib1s"/> >+ <vecequiv name="glVertexAttrib1svNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1sv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4189"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1svARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib1sv"/> >+ <glx type="render" opcode="4189"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib1svNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib1sv"/> >+ <glx type="render" opcode="4189"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2d</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <vecequiv name="glVertexAttrib2dv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2dARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <alias name="glVertexAttrib2d"/> >+ <vecequiv name="glVertexAttrib2dvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2dNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <alias name="glVertexAttrib2d"/> >+ <vecequiv name="glVertexAttrib2dvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4198"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2dvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib2dv"/> >+ <glx type="render" opcode="4198"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2dvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib2dv"/> >+ <glx type="render" opcode="4198"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2f</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <vecequiv name="glVertexAttrib2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2fARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <alias name="glVertexAttrib2f"/> >+ <vecequiv name="glVertexAttrib2fvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2fNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <alias name="glVertexAttrib2f"/> >+ <vecequiv name="glVertexAttrib2fvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4194"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2fvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib2fv"/> >+ <glx type="render" opcode="4194"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2fvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib2fv"/> >+ <glx type="render" opcode="4194"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2hNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>x</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>y</name></param> >+ <vecequiv name="glVertexAttrib2hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2hvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="Half16NV" len="2">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4258"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2s</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <param><ptype>GLshort</ptype> <name>y</name></param> >+ <vecequiv name="glVertexAttrib2sv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2sARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <param><ptype>GLshort</ptype> <name>y</name></param> >+ <alias name="glVertexAttrib2s"/> >+ <vecequiv name="glVertexAttrib2svARB"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2sNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <param><ptype>GLshort</ptype> <name>y</name></param> >+ <alias name="glVertexAttrib2s"/> >+ <vecequiv name="glVertexAttrib2svNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2sv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4190"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2svARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib2sv"/> >+ <glx type="render" opcode="4190"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib2svNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib2sv"/> >+ <glx type="render" opcode="4190"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3d</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <vecequiv name="glVertexAttrib3dv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3dARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <alias name="glVertexAttrib3d"/> >+ <vecequiv name="glVertexAttrib3dvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3dNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <alias name="glVertexAttrib3d"/> >+ <vecequiv name="glVertexAttrib3dvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4199"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3dvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib3dv"/> >+ <glx type="render" opcode="4199"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3dvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib3dv"/> >+ <glx type="render" opcode="4199"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3f</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <vecequiv name="glVertexAttrib3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3fARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <alias name="glVertexAttrib3f"/> >+ <vecequiv name="glVertexAttrib3fvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3fNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <alias name="glVertexAttrib3f"/> >+ <vecequiv name="glVertexAttrib3fvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4195"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3fvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib3fv"/> >+ <glx type="render" opcode="4195"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3fvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib3fv"/> >+ <glx type="render" opcode="4195"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3hNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>x</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>y</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>z</name></param> >+ <vecequiv name="glVertexAttrib3hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3hvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="Half16NV" len="3">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4259"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3s</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <param><ptype>GLshort</ptype> <name>y</name></param> >+ <param><ptype>GLshort</ptype> <name>z</name></param> >+ <vecequiv name="glVertexAttrib3sv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3sARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <param><ptype>GLshort</ptype> <name>y</name></param> >+ <param><ptype>GLshort</ptype> <name>z</name></param> >+ <alias name="glVertexAttrib3s"/> >+ <vecequiv name="glVertexAttrib3svARB"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3sNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <param><ptype>GLshort</ptype> <name>y</name></param> >+ <param><ptype>GLshort</ptype> <name>z</name></param> >+ <alias name="glVertexAttrib3s"/> >+ <vecequiv name="glVertexAttrib3svNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3sv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4191"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3svARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib3sv"/> >+ <glx type="render" opcode="4191"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib3svNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib3sv"/> >+ <glx type="render" opcode="4191"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4Nbv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLbyte</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4NbvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLbyte</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4Nbv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4Niv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4NivARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4Niv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4Nsv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4NsvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4Nsv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4Nub</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLubyte</ptype> <name>x</name></param> >+ <param><ptype>GLubyte</ptype> <name>y</name></param> >+ <param><ptype>GLubyte</ptype> <name>z</name></param> >+ <param><ptype>GLubyte</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4NubARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLubyte</ptype> <name>x</name></param> >+ <param><ptype>GLubyte</ptype> <name>y</name></param> >+ <param><ptype>GLubyte</ptype> <name>z</name></param> >+ <param><ptype>GLubyte</ptype> <name>w</name></param> >+ <alias name="glVertexAttrib4Nub"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4Nubv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLubyte</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4201"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4NubvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLubyte</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4Nubv"/> >+ <glx type="render" opcode="4201"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4Nuiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLuint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4NuivARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLuint</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4Nuiv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4Nusv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLushort</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4NusvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLushort</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4Nusv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4bv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLbyte</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4bvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLbyte</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4bv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4d</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <param><ptype>GLdouble</ptype> <name>w</name></param> >+ <vecequiv name="glVertexAttrib4dv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4dARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <param><ptype>GLdouble</ptype> <name>w</name></param> >+ <alias name="glVertexAttrib4d"/> >+ <vecequiv name="glVertexAttrib4dvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4dNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <param><ptype>GLdouble</ptype> <name>w</name></param> >+ <alias name="glVertexAttrib4d"/> >+ <vecequiv name="glVertexAttrib4dvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4200"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4dvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4dv"/> >+ <glx type="render" opcode="4200"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4dvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4dv"/> >+ <glx type="render" opcode="4200"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4f</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <param><ptype>GLfloat</ptype> <name>w</name></param> >+ <vecequiv name="glVertexAttrib4fv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4fARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <param><ptype>GLfloat</ptype> <name>w</name></param> >+ <alias name="glVertexAttrib4f"/> >+ <vecequiv name="glVertexAttrib4fvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4fNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <param><ptype>GLfloat</ptype> <name>w</name></param> >+ <alias name="glVertexAttrib4f"/> >+ <vecequiv name="glVertexAttrib4fvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4fv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4196"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4fvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4fv"/> >+ <glx type="render" opcode="4196"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4fvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4fv"/> >+ <glx type="render" opcode="4196"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4hNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>x</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>y</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>z</name></param> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>w</name></param> >+ <vecequiv name="glVertexAttrib4hvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4hvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="Half16NV" len="4">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4260"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4iv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4ivARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4iv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4s</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <param><ptype>GLshort</ptype> <name>y</name></param> >+ <param><ptype>GLshort</ptype> <name>z</name></param> >+ <param><ptype>GLshort</ptype> <name>w</name></param> >+ <vecequiv name="glVertexAttrib4sv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4sARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <param><ptype>GLshort</ptype> <name>y</name></param> >+ <param><ptype>GLshort</ptype> <name>z</name></param> >+ <param><ptype>GLshort</ptype> <name>w</name></param> >+ <alias name="glVertexAttrib4s"/> >+ <vecequiv name="glVertexAttrib4svARB"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4sNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <param><ptype>GLshort</ptype> <name>y</name></param> >+ <param><ptype>GLshort</ptype> <name>z</name></param> >+ <param><ptype>GLshort</ptype> <name>w</name></param> >+ <alias name="glVertexAttrib4s"/> >+ <vecequiv name="glVertexAttrib4svNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4sv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4192"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4svARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4sv"/> >+ <glx type="render" opcode="4192"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4svNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4sv"/> >+ <glx type="render" opcode="4192"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4ubNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>x</name></param> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>y</name></param> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>z</name></param> >+ <param group="ColorUB"><ptype>GLubyte</ptype> <name>w</name></param> >+ <alias name="glVertexAttrib4Nub"/> >+ <vecequiv name="glVertexAttrib4ubvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4ubv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLubyte</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4ubvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLubyte</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4ubv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4ubvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="ColorUB" len="4">const <ptype>GLubyte</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4Nubv"/> >+ <glx type="render" opcode="4201"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4uiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLuint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4uivARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLuint</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4usv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLushort</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttrib4usvARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLushort</ptype> *<name>v</name></param> >+ <alias name="glVertexAttrib4usv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribArrayObjectATI</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLuint</ptype> <name>buffer</name></param> >+ <param><ptype>GLuint</ptype> <name>offset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribBinding</name></proto> >+ <param><ptype>GLuint</ptype> <name>attribindex</name></param> >+ <param><ptype>GLuint</ptype> <name>bindingindex</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribDivisor</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>divisor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribDivisorANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>divisor</name></param> >+ <alias name="glVertexAttribDivisor"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribDivisorARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>divisor</name></param> >+ <alias name="glVertexAttribDivisor"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribDivisorEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>divisor</name></param> >+ <alias name="glVertexAttribDivisor"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribDivisorNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>divisor</name></param> >+ <alias name="glVertexAttribDivisor"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribFormat</name></proto> >+ <param><ptype>GLuint</ptype> <name>attribindex</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param><ptype>GLuint</ptype> <name>relativeoffset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribFormatNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI1i</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <vecequiv name="glVertexAttribI1iv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI1iEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <alias name="glVertexAttribI1i"/> >+ <vecequiv name="glVertexAttribI1ivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI1iv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI1ivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribI1iv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI1ui</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>x</name></param> >+ <vecequiv name="glVertexAttribI1uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI1uiEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>x</name></param> >+ <alias name="glVertexAttribI1ui"/> >+ <vecequiv name="glVertexAttribI1uivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI1uiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI1uivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribI1uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI2i</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <vecequiv name="glVertexAttribI2iv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI2iEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <alias name="glVertexAttribI2i"/> >+ <vecequiv name="glVertexAttribI2ivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI2iv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI2ivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribI2iv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI2ui</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>x</name></param> >+ <param><ptype>GLuint</ptype> <name>y</name></param> >+ <vecequiv name="glVertexAttribI2uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI2uiEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>x</name></param> >+ <param><ptype>GLuint</ptype> <name>y</name></param> >+ <alias name="glVertexAttribI2ui"/> >+ <vecequiv name="glVertexAttribI2uivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI2uiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLuint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI2uivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLuint</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribI2uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI3i</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLint</ptype> <name>z</name></param> >+ <vecequiv name="glVertexAttribI3iv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI3iEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLint</ptype> <name>z</name></param> >+ <alias name="glVertexAttribI3i"/> >+ <vecequiv name="glVertexAttribI3ivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI3iv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI3ivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribI3iv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI3ui</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>x</name></param> >+ <param><ptype>GLuint</ptype> <name>y</name></param> >+ <param><ptype>GLuint</ptype> <name>z</name></param> >+ <vecequiv name="glVertexAttribI3uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI3uiEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>x</name></param> >+ <param><ptype>GLuint</ptype> <name>y</name></param> >+ <param><ptype>GLuint</ptype> <name>z</name></param> >+ <alias name="glVertexAttribI3ui"/> >+ <vecequiv name="glVertexAttribI3uivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI3uiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLuint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI3uivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLuint</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribI3uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4bv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLbyte</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4bvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLbyte</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribI4bv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4i</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLint</ptype> <name>z</name></param> >+ <param><ptype>GLint</ptype> <name>w</name></param> >+ <vecequiv name="glVertexAttribI4iv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4iEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLint</ptype> <name>z</name></param> >+ <param><ptype>GLint</ptype> <name>w</name></param> >+ <alias name="glVertexAttribI4i"/> >+ <vecequiv name="glVertexAttribI4ivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4iv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4ivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribI4iv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4sv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4svEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribI4sv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4ubv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLubyte</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4ubvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLubyte</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribI4ubv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4ui</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>x</name></param> >+ <param><ptype>GLuint</ptype> <name>y</name></param> >+ <param><ptype>GLuint</ptype> <name>z</name></param> >+ <param><ptype>GLuint</ptype> <name>w</name></param> >+ <vecequiv name="glVertexAttribI4uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4uiEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint</ptype> <name>x</name></param> >+ <param><ptype>GLuint</ptype> <name>y</name></param> >+ <param><ptype>GLuint</ptype> <name>z</name></param> >+ <param><ptype>GLuint</ptype> <name>w</name></param> >+ <alias name="glVertexAttribI4ui"/> >+ <vecequiv name="glVertexAttribI4uivEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4uiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLuint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4uivEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLuint</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribI4uiv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4usv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLushort</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribI4usvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLushort</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribI4usv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribIFormat</name></proto> >+ <param><ptype>GLuint</ptype> <name>attribindex</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>relativeoffset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribIFormatNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribIPointer</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribIPointerEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void *<name>pointer</name></param> >+ <alias name="glVertexAttribIPointer"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL1d</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL1dEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <alias name="glVertexAttribL1d"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL1dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL1dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribL1dv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL1i64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL1i64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLint64EXT</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL1ui64ARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL1ui64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL1ui64vARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param>const <ptype>GLuint64EXT</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL1ui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="1">const <ptype>GLuint64EXT</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL2d</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL2dEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <alias name="glVertexAttribL2d"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL2dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL2dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribL2dv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL2i64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL2i64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLint64EXT</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL2ui64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL2ui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="2">const <ptype>GLuint64EXT</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL3d</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL3dEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <alias name="glVertexAttribL3d"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL3dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL3dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribL3dv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL3i64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>y</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL3i64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLint64EXT</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL3ui64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>y</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL3ui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="3">const <ptype>GLuint64EXT</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL4d</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <param><ptype>GLdouble</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL4dEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <param><ptype>GLdouble</ptype> <name>w</name></param> >+ <alias name="glVertexAttribL4d"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL4dv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL4dvEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glVertexAttribL4dv"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL4i64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>y</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>z</name></param> >+ <param><ptype>GLint64EXT</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL4i64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLint64EXT</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL4ui64NV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>x</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>y</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>z</name></param> >+ <param><ptype>GLuint64EXT</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribL4ui64vNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLuint64EXT</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribLFormat</name></proto> >+ <param><ptype>GLuint</ptype> <name>attribindex</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexAttribType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>relativeoffset</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribLFormatNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexAttribType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribLPointer</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="size">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribLPointerEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="size">const void *<name>pointer</name></param> >+ <alias name="glVertexAttribLPointer"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribP1ui</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param><ptype>GLuint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribP1uiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribP2ui</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param><ptype>GLuint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribP2uiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribP3ui</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param><ptype>GLuint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribP3uiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribP4ui</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param><ptype>GLuint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribP4uiv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribParameteriAMD</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribPointer</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribPointerARB</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexAttribPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param group="Boolean"><ptype>GLboolean</ptype> <name>normalized</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void *<name>pointer</name></param> >+ <alias name="glVertexAttribPointer"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribPointerNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLint</ptype> <name>fsize</name></param> >+ <param group="VertexAttribEnumNV"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(fsize,type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs1dvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4210"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs1fvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4206"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs1hvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="Half16NV" len="n">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4261"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs1svNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4202"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs2dvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4211"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs2fvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4207"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs2hvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="Half16NV" len="n">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4262"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs2svNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*2">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4203"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs3dvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4212"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs3fvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4208"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs3hvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="Half16NV" len="n">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4263"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs3svNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4204"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs4dvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4213"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs4fvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4209"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs4hvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>n</name></param> >+ <param group="Half16NV" len="n">const <ptype>GLhalfNV</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4264"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs4svNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="count*4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4205"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexAttribs4ubvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param group="ColorUB" len="count*4">const <ptype>GLubyte</ptype> *<name>v</name></param> >+ <glx type="render" opcode="4214"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexBindingDivisor</name></proto> >+ <param><ptype>GLuint</ptype> <name>bindingindex</name></param> >+ <param><ptype>GLuint</ptype> <name>divisor</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexBlendARB</name></proto> >+ <param><ptype>GLint</ptype> <name>count</name></param> >+ <glx type="render" opcode="226"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexBlendEnvfATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexBlendEnviATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexFormatNV</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexP2ui</name></proto> >+ <param group="VertexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexP2uiv</name></proto> >+ <param group="VertexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexP3ui</name></proto> >+ <param group="VertexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexP3uiv</name></proto> >+ <param group="VertexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexP4ui</name></proto> >+ <param group="VertexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLuint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexP4uiv</name></proto> >+ <param group="VertexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="1">const <ptype>GLuint</ptype> *<name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexPointer</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexPointerEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="COMPSIZE(size,type,stride,count)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexPointerListIBM</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLint</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(size,type,stride)">const void **<name>pointer</name></param> >+ <param><ptype>GLint</ptype> <name>ptrstride</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexPointervINTEL</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexPointerType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="4">const void **<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream1dATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream1dvATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="1">const <ptype>GLdouble</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream1fATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream1fvATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="1">const <ptype>GLfloat</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream1iATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream1ivATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="1">const <ptype>GLint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream1sATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream1svATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="1">const <ptype>GLshort</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream2dATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream2dvATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="2">const <ptype>GLdouble</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream2fATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream2fvATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="2">const <ptype>GLfloat</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream2iATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream2ivATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="2">const <ptype>GLint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream2sATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <param><ptype>GLshort</ptype> <name>y</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream2svATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="2">const <ptype>GLshort</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream3dATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream3dvATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="3">const <ptype>GLdouble</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream3fATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream3fvATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="3">const <ptype>GLfloat</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream3iATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLint</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream3ivATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="3">const <ptype>GLint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream3sATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <param><ptype>GLshort</ptype> <name>y</name></param> >+ <param><ptype>GLshort</ptype> <name>z</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream3svATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="3">const <ptype>GLshort</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream4dATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLdouble</ptype> <name>x</name></param> >+ <param><ptype>GLdouble</ptype> <name>y</name></param> >+ <param><ptype>GLdouble</ptype> <name>z</name></param> >+ <param><ptype>GLdouble</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream4dvATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="4">const <ptype>GLdouble</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream4fATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <param><ptype>GLfloat</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream4fvATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream4iATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLint</ptype> <name>z</name></param> >+ <param><ptype>GLint</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream4ivATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="4">const <ptype>GLint</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream4sATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param><ptype>GLshort</ptype> <name>x</name></param> >+ <param><ptype>GLshort</ptype> <name>y</name></param> >+ <param><ptype>GLshort</ptype> <name>z</name></param> >+ <param><ptype>GLshort</ptype> <name>w</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexStream4svATI</name></proto> >+ <param group="VertexStreamATI"><ptype>GLenum</ptype> <name>stream</name></param> >+ <param len="4">const <ptype>GLshort</ptype> *<name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexWeightPointerEXT</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="VertexWeightPointerTypeEXT"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVertexWeightfEXT</name></proto> >+ <param><ptype>GLfloat</ptype> <name>weight</name></param> >+ <vecequiv name="glVertexWeightfvEXT"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexWeightfvEXT</name></proto> >+ <param len="1">const <ptype>GLfloat</ptype> *<name>weight</name></param> >+ <glx type="render" opcode="4135"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexWeighthNV</name></proto> >+ <param group="Half16NV"><ptype>GLhalfNV</ptype> <name>weight</name></param> >+ <vecequiv name="glVertexWeighthvNV"/> >+ </command> >+ <command> >+ <proto>void <name>glVertexWeighthvNV</name></proto> >+ <param group="Half16NV" len="1">const <ptype>GLhalfNV</ptype> *<name>weight</name></param> >+ <glx type="render" opcode="4256"/> >+ </command> >+ <command> >+ <proto><ptype>GLenum</ptype> <name>glVideoCaptureNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_capture_slot</name></param> >+ <param><ptype>GLuint</ptype> *<name>sequence_num</name></param> >+ <param><ptype>GLuint64EXT</ptype> *<name>capture_time</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVideoCaptureStreamParameterdvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_capture_slot</name></param> >+ <param><ptype>GLuint</ptype> <name>stream</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLdouble</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVideoCaptureStreamParameterfvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_capture_slot</name></param> >+ <param><ptype>GLuint</ptype> <name>stream</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLfloat</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glVideoCaptureStreamParameterivNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>video_capture_slot</name></param> >+ <param><ptype>GLuint</ptype> <name>stream</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param len="COMPSIZE(pname)">const <ptype>GLint</ptype> *<name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glViewport</name></proto> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <glx type="render" opcode="191"/> >+ </command> >+ <command> >+ <proto>void <name>glViewportArrayv</name></proto> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="COMPSIZE(count)">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glViewportArrayvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="COMPSIZE(count)">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glViewportArrayv"/> >+ </command> >+ <command> >+ <proto>void <name>glViewportArrayvOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="COMPSIZE(count)">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glViewportArrayv"/> >+ </command> >+ <command> >+ <proto>void <name>glViewportIndexedf</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>w</name></param> >+ <param><ptype>GLfloat</ptype> <name>h</name></param> >+ </command> >+ <command> >+ <proto>void <name>glViewportIndexedfOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>w</name></param> >+ <param><ptype>GLfloat</ptype> <name>h</name></param> >+ <alias name="glViewportIndexedf"/> >+ </command> >+ <command> >+ <proto>void <name>glViewportIndexedfNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>x</name></param> >+ <param><ptype>GLfloat</ptype> <name>y</name></param> >+ <param><ptype>GLfloat</ptype> <name>w</name></param> >+ <param><ptype>GLfloat</ptype> <name>h</name></param> >+ <alias name="glViewportIndexedf"/> >+ </command> >+ <command> >+ <proto>void <name>glViewportIndexedfv</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glViewportIndexedfvOES</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glViewportIndexedfv"/> >+ </command> >+ <command> >+ <proto>void <name>glViewportIndexedfvNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glViewportIndexedfv"/> >+ </command> >+ <command> >+ <proto>void <name>glViewportPositionWScaleNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat</ptype> <name>xcoeff</name></param> >+ <param><ptype>GLfloat</ptype> <name>ycoeff</name></param> >+ </command> >+ <command> >+ <proto>void <name>glViewportSwizzleNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLenum</ptype> <name>swizzlex</name></param> >+ <param><ptype>GLenum</ptype> <name>swizzley</name></param> >+ <param><ptype>GLenum</ptype> <name>swizzlez</name></param> >+ <param><ptype>GLenum</ptype> <name>swizzlew</name></param> >+ </command> >+ <command> >+ <proto>void <name>glWaitSemaphoreEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>semaphore</name></param> >+ <param><ptype>GLuint</ptype> <name>numBufferBarriers</name></param> >+ <param len="COMPSIZE(numBufferBarriers)">const <ptype>GLuint</ptype> *<name>buffers</name></param> >+ <param><ptype>GLuint</ptype> <name>numTextureBarriers</name></param> >+ <param len="COMPSIZE(numTextureBarriers)">const <ptype>GLuint</ptype> *<name>textures</name></param> >+ <param group="TextureLayout" len="COMPSIZE(numTextureBarriers)">const <ptype>GLenum</ptype> *<name>srcLayouts</name></param> >+ </command> >+ <command> >+ <proto>void <name>glWaitSync</name></proto> >+ <param group="sync"><ptype>GLsync</ptype> <name>sync</name></param> >+ <param><ptype>GLbitfield</ptype> <name>flags</name></param> >+ <param><ptype>GLuint64</ptype> <name>timeout</name></param> >+ </command> >+ <command> >+ <proto>void <name>glWaitSyncAPPLE</name></proto> >+ <param><ptype>GLsync</ptype> <name>sync</name></param> >+ <param><ptype>GLbitfield</ptype> <name>flags</name></param> >+ <param><ptype>GLuint64</ptype> <name>timeout</name></param> >+ <alias name="glWaitSync"/> >+ </command> >+ <command> >+ <proto>void <name>glWeightPathsNV</name></proto> >+ <param group="Path"><ptype>GLuint</ptype> <name>resultPath</name></param> >+ <param><ptype>GLsizei</ptype> <name>numPaths</name></param> >+ <param group="Path" len="numPaths">const <ptype>GLuint</ptype> *<name>paths</name></param> >+ <param len="numPaths">const <ptype>GLfloat</ptype> *<name>weights</name></param> >+ </command> >+ <command> >+ <proto>void <name>glWeightPointerARB</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param group="WeightPointerTypeARB"><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glWeightPointerOES</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>stride</name></param> >+ <param len="COMPSIZE(type,stride)">const void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glWeightbvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param len="size">const <ptype>GLbyte</ptype> *<name>weights</name></param> >+ <glx type="render" opcode="220"/> >+ </command> >+ <command> >+ <proto>void <name>glWeightdvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param len="size">const <ptype>GLdouble</ptype> *<name>weights</name></param> >+ <glx type="render" opcode="228"/> >+ </command> >+ <command> >+ <proto>void <name>glWeightfvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param len="size">const <ptype>GLfloat</ptype> *<name>weights</name></param> >+ <glx type="render" opcode="227"/> >+ </command> >+ <command> >+ <proto>void <name>glWeightivARB</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param len="size">const <ptype>GLint</ptype> *<name>weights</name></param> >+ <glx type="render" opcode="224"/> >+ </command> >+ <command> >+ <proto>void <name>glWeightsvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param len="size">const <ptype>GLshort</ptype> *<name>weights</name></param> >+ <glx type="render" opcode="222"/> >+ </command> >+ <command> >+ <proto>void <name>glWeightubvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param len="size">const <ptype>GLubyte</ptype> *<name>weights</name></param> >+ <glx type="render" opcode="221"/> >+ </command> >+ <command> >+ <proto>void <name>glWeightuivARB</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param len="size">const <ptype>GLuint</ptype> *<name>weights</name></param> >+ <glx type="render" opcode="225"/> >+ </command> >+ <command> >+ <proto>void <name>glWeightusvARB</name></proto> >+ <param><ptype>GLint</ptype> <name>size</name></param> >+ <param len="size">const <ptype>GLushort</ptype> *<name>weights</name></param> >+ <glx type="render" opcode="223"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y</name></param> >+ <vecequiv name="glWindowPos2dv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2dARB</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y</name></param> >+ <alias name="glWindowPos2d"/> >+ <vecequiv name="glWindowPos2dvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2dMESA</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y</name></param> >+ <alias name="glWindowPos2d"/> >+ <vecequiv name="glWindowPos2dvMESA"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2dv</name></proto> >+ <param group="CoordD" len="2">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2dvARB</name></proto> >+ <param group="CoordD" len="2">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glWindowPos2dv"/> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2dvMESA</name></proto> >+ <param group="CoordD" len="2">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glWindowPos2dv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y</name></param> >+ <vecequiv name="glWindowPos2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2fARB</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y</name></param> >+ <alias name="glWindowPos2f"/> >+ <vecequiv name="glWindowPos2fvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2fMESA</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y</name></param> >+ <alias name="glWindowPos2f"/> >+ <vecequiv name="glWindowPos2fvMESA"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2fv</name></proto> >+ <param group="CoordF" len="2">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2fvARB</name></proto> >+ <param group="CoordF" len="2">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glWindowPos2fv"/> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2fvMESA</name></proto> >+ <param group="CoordF" len="2">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glWindowPos2fv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2i</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y</name></param> >+ <vecequiv name="glWindowPos2iv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2iARB</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y</name></param> >+ <alias name="glWindowPos2i"/> >+ <vecequiv name="glWindowPos2ivARB"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2iMESA</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y</name></param> >+ <alias name="glWindowPos2i"/> >+ <vecequiv name="glWindowPos2ivMESA"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2iv</name></proto> >+ <param group="CoordI" len="2">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2ivARB</name></proto> >+ <param group="CoordI" len="2">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glWindowPos2iv"/> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2ivMESA</name></proto> >+ <param group="CoordI" len="2">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glWindowPos2iv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2s</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y</name></param> >+ <vecequiv name="glWindowPos2sv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2sARB</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y</name></param> >+ <alias name="glWindowPos2s"/> >+ <vecequiv name="glWindowPos2svARB"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2sMESA</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y</name></param> >+ <alias name="glWindowPos2s"/> >+ <vecequiv name="glWindowPos2svMESA"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2sv</name></proto> >+ <param group="CoordS" len="2">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2svARB</name></proto> >+ <param group="CoordS" len="2">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glWindowPos2sv"/> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos2svMESA</name></proto> >+ <param group="CoordS" len="2">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glWindowPos2sv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3d</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>z</name></param> >+ <vecequiv name="glWindowPos3dv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3dARB</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>z</name></param> >+ <alias name="glWindowPos3d"/> >+ <vecequiv name="glWindowPos3dvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3dMESA</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>z</name></param> >+ <alias name="glWindowPos3d"/> >+ <vecequiv name="glWindowPos3dvMESA"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3dv</name></proto> >+ <param group="CoordD" len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3dvARB</name></proto> >+ <param group="CoordD" len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glWindowPos3dv"/> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3dvMESA</name></proto> >+ <param group="CoordD" len="3">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ <alias name="glWindowPos3dv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3f</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>z</name></param> >+ <vecequiv name="glWindowPos3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3fARB</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>z</name></param> >+ <alias name="glWindowPos3f"/> >+ <vecequiv name="glWindowPos3fvARB"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3fMESA</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>z</name></param> >+ <alias name="glWindowPos3f"/> >+ <vecequiv name="glWindowPos3fvMESA"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3fv</name></proto> >+ <param group="CoordF" len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3fvARB</name></proto> >+ <param group="CoordF" len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glWindowPos3fv"/> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3fvMESA</name></proto> >+ <param group="CoordF" len="3">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ <alias name="glWindowPos3fv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3i</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>z</name></param> >+ <vecequiv name="glWindowPos3iv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3iARB</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>z</name></param> >+ <alias name="glWindowPos3i"/> >+ <vecequiv name="glWindowPos3ivARB"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3iMESA</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>z</name></param> >+ <alias name="glWindowPos3i"/> >+ <vecequiv name="glWindowPos3ivMESA"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3iv</name></proto> >+ <param group="CoordI" len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3ivARB</name></proto> >+ <param group="CoordI" len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glWindowPos3iv"/> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3ivMESA</name></proto> >+ <param group="CoordI" len="3">const <ptype>GLint</ptype> *<name>v</name></param> >+ <alias name="glWindowPos3iv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3s</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>z</name></param> >+ <vecequiv name="glWindowPos3sv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3sARB</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>z</name></param> >+ <alias name="glWindowPos3s"/> >+ <vecequiv name="glWindowPos3svARB"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3sMESA</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>z</name></param> >+ <alias name="glWindowPos3s"/> >+ <vecequiv name="glWindowPos3svMESA"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3sv</name></proto> >+ <param group="CoordS" len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3svARB</name></proto> >+ <param group="CoordS" len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glWindowPos3sv"/> >+ <glx type="render" opcode="230"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos3svMESA</name></proto> >+ <param group="CoordS" len="3">const <ptype>GLshort</ptype> *<name>v</name></param> >+ <alias name="glWindowPos3sv"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos4dMESA</name></proto> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>x</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>y</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>z</name></param> >+ <param group="CoordD"><ptype>GLdouble</ptype> <name>w</name></param> >+ <vecequiv name="glWindowPos4dvMESA"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos4dvMESA</name></proto> >+ <param group="CoordD" len="4">const <ptype>GLdouble</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos4fMESA</name></proto> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>x</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>y</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>z</name></param> >+ <param group="CoordF"><ptype>GLfloat</ptype> <name>w</name></param> >+ <vecequiv name="glWindowPos4fvMESA"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos4fvMESA</name></proto> >+ <param group="CoordF" len="4">const <ptype>GLfloat</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos4iMESA</name></proto> >+ <param group="CoordI"><ptype>GLint</ptype> <name>x</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>y</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>z</name></param> >+ <param group="CoordI"><ptype>GLint</ptype> <name>w</name></param> >+ <vecequiv name="glWindowPos4ivMESA"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos4ivMESA</name></proto> >+ <param group="CoordI" len="4">const <ptype>GLint</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos4sMESA</name></proto> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>x</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>y</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>z</name></param> >+ <param group="CoordS"><ptype>GLshort</ptype> <name>w</name></param> >+ <vecequiv name="glWindowPos4svMESA"/> >+ </command> >+ <command> >+ <proto>void <name>glWindowPos4svMESA</name></proto> >+ <param group="CoordS" len="4">const <ptype>GLshort</ptype> *<name>v</name></param> >+ </command> >+ <command> >+ <proto>void <name>glWindowRectanglesEXT</name></proto> >+ <param><ptype>GLenum</ptype> <name>mode</name></param> >+ <param><ptype>GLsizei</ptype> <name>count</name></param> >+ <param len="COMPSIZE(count)">const <ptype>GLint</ptype> *<name>box</name></param> >+ </command> >+ <command> >+ <proto>void <name>glWriteMaskEXT</name></proto> >+ <param><ptype>GLuint</ptype> <name>res</name></param> >+ <param><ptype>GLuint</ptype> <name>in</name></param> >+ <param group="VertexShaderWriteMaskEXT"><ptype>GLenum</ptype> <name>outX</name></param> >+ <param group="VertexShaderWriteMaskEXT"><ptype>GLenum</ptype> <name>outY</name></param> >+ <param group="VertexShaderWriteMaskEXT"><ptype>GLenum</ptype> <name>outZ</name></param> >+ <param group="VertexShaderWriteMaskEXT"><ptype>GLenum</ptype> <name>outW</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDrawVkImageNV</name></proto> >+ <param><ptype>GLuint64</ptype> <name>vkImage</name></param> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param><ptype>GLfloat</ptype> <name>x0</name></param> >+ <param><ptype>GLfloat</ptype> <name>y0</name></param> >+ <param><ptype>GLfloat</ptype> <name>x1</name></param> >+ <param><ptype>GLfloat</ptype> <name>y1</name></param> >+ <param><ptype>GLfloat</ptype> <name>z</name></param> >+ <param><ptype>GLfloat</ptype> <name>s0</name></param> >+ <param><ptype>GLfloat</ptype> <name>t0</name></param> >+ <param><ptype>GLfloat</ptype> <name>s1</name></param> >+ <param><ptype>GLfloat</ptype> <name>t1</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLVULKANPROCNV</ptype> <name>glGetVkProcAddrNV</name></proto> >+ <param len="COMPSIZE(name)">const <ptype>GLchar</ptype> *<name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glWaitVkSemaphoreNV</name></proto> >+ <param><ptype>GLuint64</ptype> <name>vkSemaphore</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSignalVkSemaphoreNV</name></proto> >+ <param><ptype>GLuint64</ptype> <name>vkSemaphore</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSignalVkFenceNV</name></proto> >+ <param><ptype>GLuint64</ptype> <name>vkFence</name></param> >+ </command> >+ >+ </commands> >+ >+ <!-- SECTION: GL API interface definitions. --> >+ <feature api="gl" name="GL_VERSION_1_0" number="1.0"> >+ <require> >+ <type name="GLvoid" comment="No longer used in headers"/> >+ <enum name="GL_DEPTH_BUFFER_BIT"/> >+ <enum name="GL_STENCIL_BUFFER_BIT"/> >+ <enum name="GL_COLOR_BUFFER_BIT"/> >+ <enum name="GL_FALSE"/> >+ <enum name="GL_TRUE"/> >+ <enum name="GL_POINTS"/> >+ <enum name="GL_LINES"/> >+ <enum name="GL_LINE_LOOP"/> >+ <enum name="GL_LINE_STRIP"/> >+ <enum name="GL_TRIANGLES"/> >+ <enum name="GL_TRIANGLE_STRIP"/> >+ <enum name="GL_TRIANGLE_FAN"/> >+ <enum name="GL_QUADS"/> >+ <enum name="GL_NEVER"/> >+ <enum name="GL_LESS"/> >+ <enum name="GL_EQUAL"/> >+ <enum name="GL_LEQUAL"/> >+ <enum name="GL_GREATER"/> >+ <enum name="GL_NOTEQUAL"/> >+ <enum name="GL_GEQUAL"/> >+ <enum name="GL_ALWAYS"/> >+ <enum name="GL_ZERO"/> >+ <enum name="GL_ONE"/> >+ <enum name="GL_SRC_COLOR"/> >+ <enum name="GL_ONE_MINUS_SRC_COLOR"/> >+ <enum name="GL_SRC_ALPHA"/> >+ <enum name="GL_ONE_MINUS_SRC_ALPHA"/> >+ <enum name="GL_DST_ALPHA"/> >+ <enum name="GL_ONE_MINUS_DST_ALPHA"/> >+ <enum name="GL_DST_COLOR"/> >+ <enum name="GL_ONE_MINUS_DST_COLOR"/> >+ <enum name="GL_SRC_ALPHA_SATURATE"/> >+ <enum name="GL_NONE"/> >+ <enum name="GL_FRONT_LEFT"/> >+ <enum name="GL_FRONT_RIGHT"/> >+ <enum name="GL_BACK_LEFT"/> >+ <enum name="GL_BACK_RIGHT"/> >+ <enum name="GL_FRONT"/> >+ <enum name="GL_BACK"/> >+ <enum name="GL_LEFT"/> >+ <enum name="GL_RIGHT"/> >+ <enum name="GL_FRONT_AND_BACK"/> >+ <enum name="GL_NO_ERROR"/> >+ <enum name="GL_INVALID_ENUM"/> >+ <enum name="GL_INVALID_VALUE"/> >+ <enum name="GL_INVALID_OPERATION"/> >+ <enum name="GL_OUT_OF_MEMORY"/> >+ <enum name="GL_CW"/> >+ <enum name="GL_CCW"/> >+ <enum name="GL_POINT_SIZE"/> >+ <enum name="GL_POINT_SIZE_RANGE"/> >+ <enum name="GL_POINT_SIZE_GRANULARITY"/> >+ <enum name="GL_LINE_SMOOTH"/> >+ <enum name="GL_LINE_WIDTH"/> >+ <enum name="GL_LINE_WIDTH_RANGE"/> >+ <enum name="GL_LINE_WIDTH_GRANULARITY"/> >+ <enum name="GL_POLYGON_MODE"/> >+ <enum name="GL_POLYGON_SMOOTH"/> >+ <enum name="GL_CULL_FACE"/> >+ <enum name="GL_CULL_FACE_MODE"/> >+ <enum name="GL_FRONT_FACE"/> >+ <enum name="GL_DEPTH_RANGE"/> >+ <enum name="GL_DEPTH_TEST"/> >+ <enum name="GL_DEPTH_WRITEMASK"/> >+ <enum name="GL_DEPTH_CLEAR_VALUE"/> >+ <enum name="GL_DEPTH_FUNC"/> >+ <enum name="GL_STENCIL_TEST"/> >+ <enum name="GL_STENCIL_CLEAR_VALUE"/> >+ <enum name="GL_STENCIL_FUNC"/> >+ <enum name="GL_STENCIL_VALUE_MASK"/> >+ <enum name="GL_STENCIL_FAIL"/> >+ <enum name="GL_STENCIL_PASS_DEPTH_FAIL"/> >+ <enum name="GL_STENCIL_PASS_DEPTH_PASS"/> >+ <enum name="GL_STENCIL_REF"/> >+ <enum name="GL_STENCIL_WRITEMASK"/> >+ <enum name="GL_VIEWPORT"/> >+ <enum name="GL_DITHER"/> >+ <enum name="GL_BLEND_DST"/> >+ <enum name="GL_BLEND_SRC"/> >+ <enum name="GL_BLEND"/> >+ <enum name="GL_LOGIC_OP_MODE"/> >+ <enum name="GL_DRAW_BUFFER"/> >+ <enum name="GL_READ_BUFFER"/> >+ <enum name="GL_SCISSOR_BOX"/> >+ <enum name="GL_SCISSOR_TEST"/> >+ <enum name="GL_COLOR_CLEAR_VALUE"/> >+ <enum name="GL_COLOR_WRITEMASK"/> >+ <enum name="GL_DOUBLEBUFFER"/> >+ <enum name="GL_STEREO"/> >+ <enum name="GL_LINE_SMOOTH_HINT"/> >+ <enum name="GL_POLYGON_SMOOTH_HINT"/> >+ <enum name="GL_UNPACK_SWAP_BYTES"/> >+ <enum name="GL_UNPACK_LSB_FIRST"/> >+ <enum name="GL_UNPACK_ROW_LENGTH"/> >+ <enum name="GL_UNPACK_SKIP_ROWS"/> >+ <enum name="GL_UNPACK_SKIP_PIXELS"/> >+ <enum name="GL_UNPACK_ALIGNMENT"/> >+ <enum name="GL_PACK_SWAP_BYTES"/> >+ <enum name="GL_PACK_LSB_FIRST"/> >+ <enum name="GL_PACK_ROW_LENGTH"/> >+ <enum name="GL_PACK_SKIP_ROWS"/> >+ <enum name="GL_PACK_SKIP_PIXELS"/> >+ <enum name="GL_PACK_ALIGNMENT"/> >+ <enum name="GL_MAX_TEXTURE_SIZE"/> >+ <enum name="GL_MAX_VIEWPORT_DIMS"/> >+ <enum name="GL_SUBPIXEL_BITS"/> >+ <enum name="GL_TEXTURE_1D"/> >+ <enum name="GL_TEXTURE_2D"/> >+ <enum name="GL_TEXTURE_WIDTH"/> >+ <enum name="GL_TEXTURE_HEIGHT"/> >+ <enum name="GL_TEXTURE_BORDER_COLOR"/> >+ <enum name="GL_DONT_CARE"/> >+ <enum name="GL_FASTEST"/> >+ <enum name="GL_NICEST"/> >+ <enum name="GL_BYTE"/> >+ <enum name="GL_UNSIGNED_BYTE"/> >+ <enum name="GL_SHORT"/> >+ <enum name="GL_UNSIGNED_SHORT"/> >+ <enum name="GL_INT"/> >+ <enum name="GL_UNSIGNED_INT"/> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_STACK_OVERFLOW"/> >+ <enum name="GL_STACK_UNDERFLOW"/> >+ <enum name="GL_CLEAR"/> >+ <enum name="GL_AND"/> >+ <enum name="GL_AND_REVERSE"/> >+ <enum name="GL_COPY"/> >+ <enum name="GL_AND_INVERTED"/> >+ <enum name="GL_NOOP"/> >+ <enum name="GL_XOR"/> >+ <enum name="GL_OR"/> >+ <enum name="GL_NOR"/> >+ <enum name="GL_EQUIV"/> >+ <enum name="GL_INVERT"/> >+ <enum name="GL_OR_REVERSE"/> >+ <enum name="GL_COPY_INVERTED"/> >+ <enum name="GL_OR_INVERTED"/> >+ <enum name="GL_NAND"/> >+ <enum name="GL_SET"/> >+ <enum name="GL_TEXTURE"/> >+ <enum name="GL_COLOR"/> >+ <enum name="GL_DEPTH"/> >+ <enum name="GL_STENCIL"/> >+ <enum name="GL_STENCIL_INDEX"/> >+ <enum name="GL_DEPTH_COMPONENT"/> >+ <enum name="GL_RED"/> >+ <enum name="GL_GREEN"/> >+ <enum name="GL_BLUE"/> >+ <enum name="GL_ALPHA"/> >+ <enum name="GL_RGB"/> >+ <enum name="GL_RGBA"/> >+ <enum name="GL_POINT"/> >+ <enum name="GL_LINE"/> >+ <enum name="GL_FILL"/> >+ <enum name="GL_KEEP"/> >+ <enum name="GL_REPLACE"/> >+ <enum name="GL_INCR"/> >+ <enum name="GL_DECR"/> >+ <enum name="GL_VENDOR"/> >+ <enum name="GL_RENDERER"/> >+ <enum name="GL_VERSION"/> >+ <enum name="GL_EXTENSIONS"/> >+ <enum name="GL_NEAREST"/> >+ <enum name="GL_LINEAR"/> >+ <enum name="GL_NEAREST_MIPMAP_NEAREST"/> >+ <enum name="GL_LINEAR_MIPMAP_NEAREST"/> >+ <enum name="GL_NEAREST_MIPMAP_LINEAR"/> >+ <enum name="GL_LINEAR_MIPMAP_LINEAR"/> >+ <enum name="GL_TEXTURE_MAG_FILTER"/> >+ <enum name="GL_TEXTURE_MIN_FILTER"/> >+ <enum name="GL_TEXTURE_WRAP_S"/> >+ <enum name="GL_TEXTURE_WRAP_T"/> >+ <enum name="GL_REPEAT"/> >+ <enum name="GL_CURRENT_BIT"/> >+ <enum name="GL_POINT_BIT"/> >+ <enum name="GL_LINE_BIT"/> >+ <enum name="GL_POLYGON_BIT"/> >+ <enum name="GL_POLYGON_STIPPLE_BIT"/> >+ <enum name="GL_PIXEL_MODE_BIT"/> >+ <enum name="GL_LIGHTING_BIT"/> >+ <enum name="GL_FOG_BIT"/> >+ <enum name="GL_ACCUM_BUFFER_BIT"/> >+ <enum name="GL_VIEWPORT_BIT"/> >+ <enum name="GL_TRANSFORM_BIT"/> >+ <enum name="GL_ENABLE_BIT"/> >+ <enum name="GL_HINT_BIT"/> >+ <enum name="GL_EVAL_BIT"/> >+ <enum name="GL_LIST_BIT"/> >+ <enum name="GL_TEXTURE_BIT"/> >+ <enum name="GL_SCISSOR_BIT"/> >+ <enum name="GL_ALL_ATTRIB_BITS"/> >+ <enum name="GL_QUAD_STRIP"/> >+ <enum name="GL_POLYGON"/> >+ <enum name="GL_ACCUM"/> >+ <enum name="GL_LOAD"/> >+ <enum name="GL_RETURN"/> >+ <enum name="GL_MULT"/> >+ <enum name="GL_ADD"/> >+ <enum name="GL_AUX0"/> >+ <enum name="GL_AUX1"/> >+ <enum name="GL_AUX2"/> >+ <enum name="GL_AUX3"/> >+ <enum name="GL_2D"/> >+ <enum name="GL_3D"/> >+ <enum name="GL_3D_COLOR"/> >+ <enum name="GL_3D_COLOR_TEXTURE"/> >+ <enum name="GL_4D_COLOR_TEXTURE"/> >+ <enum name="GL_PASS_THROUGH_TOKEN"/> >+ <enum name="GL_POINT_TOKEN"/> >+ <enum name="GL_LINE_TOKEN"/> >+ <enum name="GL_POLYGON_TOKEN"/> >+ <enum name="GL_BITMAP_TOKEN"/> >+ <enum name="GL_DRAW_PIXEL_TOKEN"/> >+ <enum name="GL_COPY_PIXEL_TOKEN"/> >+ <enum name="GL_LINE_RESET_TOKEN"/> >+ <enum name="GL_EXP"/> >+ <enum name="GL_EXP2"/> >+ <enum name="GL_COEFF"/> >+ <enum name="GL_ORDER"/> >+ <enum name="GL_DOMAIN"/> >+ <enum name="GL_PIXEL_MAP_I_TO_I"/> >+ <enum name="GL_PIXEL_MAP_S_TO_S"/> >+ <enum name="GL_PIXEL_MAP_I_TO_R"/> >+ <enum name="GL_PIXEL_MAP_I_TO_G"/> >+ <enum name="GL_PIXEL_MAP_I_TO_B"/> >+ <enum name="GL_PIXEL_MAP_I_TO_A"/> >+ <enum name="GL_PIXEL_MAP_R_TO_R"/> >+ <enum name="GL_PIXEL_MAP_G_TO_G"/> >+ <enum name="GL_PIXEL_MAP_B_TO_B"/> >+ <enum name="GL_PIXEL_MAP_A_TO_A"/> >+ <enum name="GL_CURRENT_COLOR"/> >+ <enum name="GL_CURRENT_INDEX"/> >+ <enum name="GL_CURRENT_NORMAL"/> >+ <enum name="GL_CURRENT_TEXTURE_COORDS"/> >+ <enum name="GL_CURRENT_RASTER_COLOR"/> >+ <enum name="GL_CURRENT_RASTER_INDEX"/> >+ <enum name="GL_CURRENT_RASTER_TEXTURE_COORDS"/> >+ <enum name="GL_CURRENT_RASTER_POSITION"/> >+ <enum name="GL_CURRENT_RASTER_POSITION_VALID"/> >+ <enum name="GL_CURRENT_RASTER_DISTANCE"/> >+ <enum name="GL_POINT_SMOOTH"/> >+ <enum name="GL_LINE_STIPPLE"/> >+ <enum name="GL_LINE_STIPPLE_PATTERN"/> >+ <enum name="GL_LINE_STIPPLE_REPEAT"/> >+ <enum name="GL_LIST_MODE"/> >+ <enum name="GL_MAX_LIST_NESTING"/> >+ <enum name="GL_LIST_BASE"/> >+ <enum name="GL_LIST_INDEX"/> >+ <enum name="GL_POLYGON_STIPPLE"/> >+ <enum name="GL_EDGE_FLAG"/> >+ <enum name="GL_LIGHTING"/> >+ <enum name="GL_LIGHT_MODEL_LOCAL_VIEWER"/> >+ <enum name="GL_LIGHT_MODEL_TWO_SIDE"/> >+ <enum name="GL_LIGHT_MODEL_AMBIENT"/> >+ <enum name="GL_SHADE_MODEL"/> >+ <enum name="GL_COLOR_MATERIAL_FACE"/> >+ <enum name="GL_COLOR_MATERIAL_PARAMETER"/> >+ <enum name="GL_COLOR_MATERIAL"/> >+ <enum name="GL_FOG"/> >+ <enum name="GL_FOG_INDEX"/> >+ <enum name="GL_FOG_DENSITY"/> >+ <enum name="GL_FOG_START"/> >+ <enum name="GL_FOG_END"/> >+ <enum name="GL_FOG_MODE"/> >+ <enum name="GL_FOG_COLOR"/> >+ <enum name="GL_ACCUM_CLEAR_VALUE"/> >+ <enum name="GL_MATRIX_MODE"/> >+ <enum name="GL_NORMALIZE"/> >+ <enum name="GL_MODELVIEW_STACK_DEPTH"/> >+ <enum name="GL_PROJECTION_STACK_DEPTH"/> >+ <enum name="GL_TEXTURE_STACK_DEPTH"/> >+ <enum name="GL_MODELVIEW_MATRIX"/> >+ <enum name="GL_PROJECTION_MATRIX"/> >+ <enum name="GL_TEXTURE_MATRIX"/> >+ <enum name="GL_ATTRIB_STACK_DEPTH"/> >+ <enum name="GL_ALPHA_TEST"/> >+ <enum name="GL_ALPHA_TEST_FUNC"/> >+ <enum name="GL_ALPHA_TEST_REF"/> >+ <enum name="GL_LOGIC_OP"/> >+ <enum name="GL_AUX_BUFFERS"/> >+ <enum name="GL_INDEX_CLEAR_VALUE"/> >+ <enum name="GL_INDEX_WRITEMASK"/> >+ <enum name="GL_INDEX_MODE"/> >+ <enum name="GL_RGBA_MODE"/> >+ <enum name="GL_RENDER_MODE"/> >+ <enum name="GL_PERSPECTIVE_CORRECTION_HINT"/> >+ <enum name="GL_POINT_SMOOTH_HINT"/> >+ <enum name="GL_FOG_HINT"/> >+ <enum name="GL_TEXTURE_GEN_S"/> >+ <enum name="GL_TEXTURE_GEN_T"/> >+ <enum name="GL_TEXTURE_GEN_R"/> >+ <enum name="GL_TEXTURE_GEN_Q"/> >+ <enum name="GL_PIXEL_MAP_I_TO_I_SIZE"/> >+ <enum name="GL_PIXEL_MAP_S_TO_S_SIZE"/> >+ <enum name="GL_PIXEL_MAP_I_TO_R_SIZE"/> >+ <enum name="GL_PIXEL_MAP_I_TO_G_SIZE"/> >+ <enum name="GL_PIXEL_MAP_I_TO_B_SIZE"/> >+ <enum name="GL_PIXEL_MAP_I_TO_A_SIZE"/> >+ <enum name="GL_PIXEL_MAP_R_TO_R_SIZE"/> >+ <enum name="GL_PIXEL_MAP_G_TO_G_SIZE"/> >+ <enum name="GL_PIXEL_MAP_B_TO_B_SIZE"/> >+ <enum name="GL_PIXEL_MAP_A_TO_A_SIZE"/> >+ <enum name="GL_MAP_COLOR"/> >+ <enum name="GL_MAP_STENCIL"/> >+ <enum name="GL_INDEX_SHIFT"/> >+ <enum name="GL_INDEX_OFFSET"/> >+ <enum name="GL_RED_SCALE"/> >+ <enum name="GL_RED_BIAS"/> >+ <enum name="GL_ZOOM_X"/> >+ <enum name="GL_ZOOM_Y"/> >+ <enum name="GL_GREEN_SCALE"/> >+ <enum name="GL_GREEN_BIAS"/> >+ <enum name="GL_BLUE_SCALE"/> >+ <enum name="GL_BLUE_BIAS"/> >+ <enum name="GL_ALPHA_SCALE"/> >+ <enum name="GL_ALPHA_BIAS"/> >+ <enum name="GL_DEPTH_SCALE"/> >+ <enum name="GL_DEPTH_BIAS"/> >+ <enum name="GL_MAX_EVAL_ORDER"/> >+ <enum name="GL_MAX_LIGHTS"/> >+ <enum name="GL_MAX_CLIP_PLANES"/> >+ <enum name="GL_MAX_PIXEL_MAP_TABLE"/> >+ <enum name="GL_MAX_ATTRIB_STACK_DEPTH"/> >+ <enum name="GL_MAX_MODELVIEW_STACK_DEPTH"/> >+ <enum name="GL_MAX_NAME_STACK_DEPTH"/> >+ <enum name="GL_MAX_PROJECTION_STACK_DEPTH"/> >+ <enum name="GL_MAX_TEXTURE_STACK_DEPTH"/> >+ <enum name="GL_INDEX_BITS"/> >+ <enum name="GL_RED_BITS"/> >+ <enum name="GL_GREEN_BITS"/> >+ <enum name="GL_BLUE_BITS"/> >+ <enum name="GL_ALPHA_BITS"/> >+ <enum name="GL_DEPTH_BITS"/> >+ <enum name="GL_STENCIL_BITS"/> >+ <enum name="GL_ACCUM_RED_BITS"/> >+ <enum name="GL_ACCUM_GREEN_BITS"/> >+ <enum name="GL_ACCUM_BLUE_BITS"/> >+ <enum name="GL_ACCUM_ALPHA_BITS"/> >+ <enum name="GL_NAME_STACK_DEPTH"/> >+ <enum name="GL_AUTO_NORMAL"/> >+ <enum name="GL_MAP1_COLOR_4"/> >+ <enum name="GL_MAP1_INDEX"/> >+ <enum name="GL_MAP1_NORMAL"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_1"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_2"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_3"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_4"/> >+ <enum name="GL_MAP1_VERTEX_3"/> >+ <enum name="GL_MAP1_VERTEX_4"/> >+ <enum name="GL_MAP2_COLOR_4"/> >+ <enum name="GL_MAP2_INDEX"/> >+ <enum name="GL_MAP2_NORMAL"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_1"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_2"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_3"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_4"/> >+ <enum name="GL_MAP2_VERTEX_3"/> >+ <enum name="GL_MAP2_VERTEX_4"/> >+ <enum name="GL_MAP1_GRID_DOMAIN"/> >+ <enum name="GL_MAP1_GRID_SEGMENTS"/> >+ <enum name="GL_MAP2_GRID_DOMAIN"/> >+ <enum name="GL_MAP2_GRID_SEGMENTS"/> >+ <enum name="GL_TEXTURE_COMPONENTS"/> >+ <enum name="GL_TEXTURE_BORDER"/> >+ <enum name="GL_AMBIENT"/> >+ <enum name="GL_DIFFUSE"/> >+ <enum name="GL_SPECULAR"/> >+ <enum name="GL_POSITION"/> >+ <enum name="GL_SPOT_DIRECTION"/> >+ <enum name="GL_SPOT_EXPONENT"/> >+ <enum name="GL_SPOT_CUTOFF"/> >+ <enum name="GL_CONSTANT_ATTENUATION"/> >+ <enum name="GL_LINEAR_ATTENUATION"/> >+ <enum name="GL_QUADRATIC_ATTENUATION"/> >+ <enum name="GL_COMPILE"/> >+ <enum name="GL_COMPILE_AND_EXECUTE"/> >+ <enum name="GL_2_BYTES"/> >+ <enum name="GL_3_BYTES"/> >+ <enum name="GL_4_BYTES"/> >+ <enum name="GL_EMISSION"/> >+ <enum name="GL_SHININESS"/> >+ <enum name="GL_AMBIENT_AND_DIFFUSE"/> >+ <enum name="GL_COLOR_INDEXES"/> >+ <enum name="GL_MODELVIEW"/> >+ <enum name="GL_PROJECTION"/> >+ <enum name="GL_COLOR_INDEX"/> >+ <enum name="GL_LUMINANCE"/> >+ <enum name="GL_LUMINANCE_ALPHA"/> >+ <enum name="GL_BITMAP"/> >+ <enum name="GL_RENDER"/> >+ <enum name="GL_FEEDBACK"/> >+ <enum name="GL_SELECT"/> >+ <enum name="GL_FLAT"/> >+ <enum name="GL_SMOOTH"/> >+ <enum name="GL_S"/> >+ <enum name="GL_T"/> >+ <enum name="GL_R"/> >+ <enum name="GL_Q"/> >+ <enum name="GL_MODULATE"/> >+ <enum name="GL_DECAL"/> >+ <enum name="GL_TEXTURE_ENV_MODE"/> >+ <enum name="GL_TEXTURE_ENV_COLOR"/> >+ <enum name="GL_TEXTURE_ENV"/> >+ <enum name="GL_EYE_LINEAR"/> >+ <enum name="GL_OBJECT_LINEAR"/> >+ <enum name="GL_SPHERE_MAP"/> >+ <enum name="GL_TEXTURE_GEN_MODE"/> >+ <enum name="GL_OBJECT_PLANE"/> >+ <enum name="GL_EYE_PLANE"/> >+ <enum name="GL_CLAMP"/> >+ <enum name="GL_CLIP_PLANE0"/> >+ <enum name="GL_CLIP_PLANE1"/> >+ <enum name="GL_CLIP_PLANE2"/> >+ <enum name="GL_CLIP_PLANE3"/> >+ <enum name="GL_CLIP_PLANE4"/> >+ <enum name="GL_CLIP_PLANE5"/> >+ <enum name="GL_LIGHT0"/> >+ <enum name="GL_LIGHT1"/> >+ <enum name="GL_LIGHT2"/> >+ <enum name="GL_LIGHT3"/> >+ <enum name="GL_LIGHT4"/> >+ <enum name="GL_LIGHT5"/> >+ <enum name="GL_LIGHT6"/> >+ <enum name="GL_LIGHT7"/> >+ <command name="glCullFace"/> >+ <command name="glFrontFace"/> >+ <command name="glHint"/> >+ <command name="glLineWidth"/> >+ <command name="glPointSize"/> >+ <command name="glPolygonMode"/> >+ <command name="glScissor"/> >+ <command name="glTexParameterf"/> >+ <command name="glTexParameterfv"/> >+ <command name="glTexParameteri"/> >+ <command name="glTexParameteriv"/> >+ <command name="glTexImage1D"/> >+ <command name="glTexImage2D"/> >+ <command name="glDrawBuffer"/> >+ <command name="glClear"/> >+ <command name="glClearColor"/> >+ <command name="glClearStencil"/> >+ <command name="glClearDepth"/> >+ <command name="glStencilMask"/> >+ <command name="glColorMask"/> >+ <command name="glDepthMask"/> >+ <command name="glDisable"/> >+ <command name="glEnable"/> >+ <command name="glFinish"/> >+ <command name="glFlush"/> >+ <command name="glBlendFunc"/> >+ <command name="glLogicOp"/> >+ <command name="glStencilFunc"/> >+ <command name="glStencilOp"/> >+ <command name="glDepthFunc"/> >+ <command name="glPixelStoref"/> >+ <command name="glPixelStorei"/> >+ <command name="glReadBuffer"/> >+ <command name="glReadPixels"/> >+ <command name="glGetBooleanv"/> >+ <command name="glGetDoublev"/> >+ <command name="glGetError"/> >+ <command name="glGetFloatv"/> >+ <command name="glGetIntegerv"/> >+ <command name="glGetString"/> >+ <command name="glGetTexImage"/> >+ <command name="glGetTexParameterfv"/> >+ <command name="glGetTexParameteriv"/> >+ <command name="glGetTexLevelParameterfv"/> >+ <command name="glGetTexLevelParameteriv"/> >+ <command name="glIsEnabled"/> >+ <command name="glDepthRange"/> >+ <command name="glViewport"/> >+ <command name="glNewList"/> >+ <command name="glEndList"/> >+ <command name="glCallList"/> >+ <command name="glCallLists"/> >+ <command name="glDeleteLists"/> >+ <command name="glGenLists"/> >+ <command name="glListBase"/> >+ <command name="glBegin"/> >+ <command name="glBitmap"/> >+ <command name="glColor3b"/> >+ <command name="glColor3bv"/> >+ <command name="glColor3d"/> >+ <command name="glColor3dv"/> >+ <command name="glColor3f"/> >+ <command name="glColor3fv"/> >+ <command name="glColor3i"/> >+ <command name="glColor3iv"/> >+ <command name="glColor3s"/> >+ <command name="glColor3sv"/> >+ <command name="glColor3ub"/> >+ <command name="glColor3ubv"/> >+ <command name="glColor3ui"/> >+ <command name="glColor3uiv"/> >+ <command name="glColor3us"/> >+ <command name="glColor3usv"/> >+ <command name="glColor4b"/> >+ <command name="glColor4bv"/> >+ <command name="glColor4d"/> >+ <command name="glColor4dv"/> >+ <command name="glColor4f"/> >+ <command name="glColor4fv"/> >+ <command name="glColor4i"/> >+ <command name="glColor4iv"/> >+ <command name="glColor4s"/> >+ <command name="glColor4sv"/> >+ <command name="glColor4ub"/> >+ <command name="glColor4ubv"/> >+ <command name="glColor4ui"/> >+ <command name="glColor4uiv"/> >+ <command name="glColor4us"/> >+ <command name="glColor4usv"/> >+ <command name="glEdgeFlag"/> >+ <command name="glEdgeFlagv"/> >+ <command name="glEnd"/> >+ <command name="glIndexd"/> >+ <command name="glIndexdv"/> >+ <command name="glIndexf"/> >+ <command name="glIndexfv"/> >+ <command name="glIndexi"/> >+ <command name="glIndexiv"/> >+ <command name="glIndexs"/> >+ <command name="glIndexsv"/> >+ <command name="glNormal3b"/> >+ <command name="glNormal3bv"/> >+ <command name="glNormal3d"/> >+ <command name="glNormal3dv"/> >+ <command name="glNormal3f"/> >+ <command name="glNormal3fv"/> >+ <command name="glNormal3i"/> >+ <command name="glNormal3iv"/> >+ <command name="glNormal3s"/> >+ <command name="glNormal3sv"/> >+ <command name="glRasterPos2d"/> >+ <command name="glRasterPos2dv"/> >+ <command name="glRasterPos2f"/> >+ <command name="glRasterPos2fv"/> >+ <command name="glRasterPos2i"/> >+ <command name="glRasterPos2iv"/> >+ <command name="glRasterPos2s"/> >+ <command name="glRasterPos2sv"/> >+ <command name="glRasterPos3d"/> >+ <command name="glRasterPos3dv"/> >+ <command name="glRasterPos3f"/> >+ <command name="glRasterPos3fv"/> >+ <command name="glRasterPos3i"/> >+ <command name="glRasterPos3iv"/> >+ <command name="glRasterPos3s"/> >+ <command name="glRasterPos3sv"/> >+ <command name="glRasterPos4d"/> >+ <command name="glRasterPos4dv"/> >+ <command name="glRasterPos4f"/> >+ <command name="glRasterPos4fv"/> >+ <command name="glRasterPos4i"/> >+ <command name="glRasterPos4iv"/> >+ <command name="glRasterPos4s"/> >+ <command name="glRasterPos4sv"/> >+ <command name="glRectd"/> >+ <command name="glRectdv"/> >+ <command name="glRectf"/> >+ <command name="glRectfv"/> >+ <command name="glRecti"/> >+ <command name="glRectiv"/> >+ <command name="glRects"/> >+ <command name="glRectsv"/> >+ <command name="glTexCoord1d"/> >+ <command name="glTexCoord1dv"/> >+ <command name="glTexCoord1f"/> >+ <command name="glTexCoord1fv"/> >+ <command name="glTexCoord1i"/> >+ <command name="glTexCoord1iv"/> >+ <command name="glTexCoord1s"/> >+ <command name="glTexCoord1sv"/> >+ <command name="glTexCoord2d"/> >+ <command name="glTexCoord2dv"/> >+ <command name="glTexCoord2f"/> >+ <command name="glTexCoord2fv"/> >+ <command name="glTexCoord2i"/> >+ <command name="glTexCoord2iv"/> >+ <command name="glTexCoord2s"/> >+ <command name="glTexCoord2sv"/> >+ <command name="glTexCoord3d"/> >+ <command name="glTexCoord3dv"/> >+ <command name="glTexCoord3f"/> >+ <command name="glTexCoord3fv"/> >+ <command name="glTexCoord3i"/> >+ <command name="glTexCoord3iv"/> >+ <command name="glTexCoord3s"/> >+ <command name="glTexCoord3sv"/> >+ <command name="glTexCoord4d"/> >+ <command name="glTexCoord4dv"/> >+ <command name="glTexCoord4f"/> >+ <command name="glTexCoord4fv"/> >+ <command name="glTexCoord4i"/> >+ <command name="glTexCoord4iv"/> >+ <command name="glTexCoord4s"/> >+ <command name="glTexCoord4sv"/> >+ <command name="glVertex2d"/> >+ <command name="glVertex2dv"/> >+ <command name="glVertex2f"/> >+ <command name="glVertex2fv"/> >+ <command name="glVertex2i"/> >+ <command name="glVertex2iv"/> >+ <command name="glVertex2s"/> >+ <command name="glVertex2sv"/> >+ <command name="glVertex3d"/> >+ <command name="glVertex3dv"/> >+ <command name="glVertex3f"/> >+ <command name="glVertex3fv"/> >+ <command name="glVertex3i"/> >+ <command name="glVertex3iv"/> >+ <command name="glVertex3s"/> >+ <command name="glVertex3sv"/> >+ <command name="glVertex4d"/> >+ <command name="glVertex4dv"/> >+ <command name="glVertex4f"/> >+ <command name="glVertex4fv"/> >+ <command name="glVertex4i"/> >+ <command name="glVertex4iv"/> >+ <command name="glVertex4s"/> >+ <command name="glVertex4sv"/> >+ <command name="glClipPlane"/> >+ <command name="glColorMaterial"/> >+ <command name="glFogf"/> >+ <command name="glFogfv"/> >+ <command name="glFogi"/> >+ <command name="glFogiv"/> >+ <command name="glLightf"/> >+ <command name="glLightfv"/> >+ <command name="glLighti"/> >+ <command name="glLightiv"/> >+ <command name="glLightModelf"/> >+ <command name="glLightModelfv"/> >+ <command name="glLightModeli"/> >+ <command name="glLightModeliv"/> >+ <command name="glLineStipple"/> >+ <command name="glMaterialf"/> >+ <command name="glMaterialfv"/> >+ <command name="glMateriali"/> >+ <command name="glMaterialiv"/> >+ <command name="glPolygonStipple"/> >+ <command name="glShadeModel"/> >+ <command name="glTexEnvf"/> >+ <command name="glTexEnvfv"/> >+ <command name="glTexEnvi"/> >+ <command name="glTexEnviv"/> >+ <command name="glTexGend"/> >+ <command name="glTexGendv"/> >+ <command name="glTexGenf"/> >+ <command name="glTexGenfv"/> >+ <command name="glTexGeni"/> >+ <command name="glTexGeniv"/> >+ <command name="glFeedbackBuffer"/> >+ <command name="glSelectBuffer"/> >+ <command name="glRenderMode"/> >+ <command name="glInitNames"/> >+ <command name="glLoadName"/> >+ <command name="glPassThrough"/> >+ <command name="glPopName"/> >+ <command name="glPushName"/> >+ <command name="glClearAccum"/> >+ <command name="glClearIndex"/> >+ <command name="glIndexMask"/> >+ <command name="glAccum"/> >+ <command name="glPopAttrib"/> >+ <command name="glPushAttrib"/> >+ <command name="glMap1d"/> >+ <command name="glMap1f"/> >+ <command name="glMap2d"/> >+ <command name="glMap2f"/> >+ <command name="glMapGrid1d"/> >+ <command name="glMapGrid1f"/> >+ <command name="glMapGrid2d"/> >+ <command name="glMapGrid2f"/> >+ <command name="glEvalCoord1d"/> >+ <command name="glEvalCoord1dv"/> >+ <command name="glEvalCoord1f"/> >+ <command name="glEvalCoord1fv"/> >+ <command name="glEvalCoord2d"/> >+ <command name="glEvalCoord2dv"/> >+ <command name="glEvalCoord2f"/> >+ <command name="glEvalCoord2fv"/> >+ <command name="glEvalMesh1"/> >+ <command name="glEvalPoint1"/> >+ <command name="glEvalMesh2"/> >+ <command name="glEvalPoint2"/> >+ <command name="glAlphaFunc"/> >+ <command name="glPixelZoom"/> >+ <command name="glPixelTransferf"/> >+ <command name="glPixelTransferi"/> >+ <command name="glPixelMapfv"/> >+ <command name="glPixelMapuiv"/> >+ <command name="glPixelMapusv"/> >+ <command name="glCopyPixels"/> >+ <command name="glDrawPixels"/> >+ <command name="glGetClipPlane"/> >+ <command name="glGetLightfv"/> >+ <command name="glGetLightiv"/> >+ <command name="glGetMapdv"/> >+ <command name="glGetMapfv"/> >+ <command name="glGetMapiv"/> >+ <command name="glGetMaterialfv"/> >+ <command name="glGetMaterialiv"/> >+ <command name="glGetPixelMapfv"/> >+ <command name="glGetPixelMapuiv"/> >+ <command name="glGetPixelMapusv"/> >+ <command name="glGetPolygonStipple"/> >+ <command name="glGetTexEnvfv"/> >+ <command name="glGetTexEnviv"/> >+ <command name="glGetTexGendv"/> >+ <command name="glGetTexGenfv"/> >+ <command name="glGetTexGeniv"/> >+ <command name="glIsList"/> >+ <command name="glFrustum"/> >+ <command name="glLoadIdentity"/> >+ <command name="glLoadMatrixf"/> >+ <command name="glLoadMatrixd"/> >+ <command name="glMatrixMode"/> >+ <command name="glMultMatrixf"/> >+ <command name="glMultMatrixd"/> >+ <command name="glOrtho"/> >+ <command name="glPopMatrix"/> >+ <command name="glPushMatrix"/> >+ <command name="glRotated"/> >+ <command name="glRotatef"/> >+ <command name="glScaled"/> >+ <command name="glScalef"/> >+ <command name="glTranslated"/> >+ <command name="glTranslatef"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_1_1" number="1.1"> >+ <require> >+ <type name="GLclampf" comment="No longer used in GL 1.1, but still defined in Mesa gl.h"/> >+ <type name="GLclampd" comment="No longer used in GL 1.1, but still defined in Mesa gl.h"/> >+ <enum name="GL_COLOR_LOGIC_OP"/> >+ <enum name="GL_POLYGON_OFFSET_UNITS"/> >+ <enum name="GL_POLYGON_OFFSET_POINT"/> >+ <enum name="GL_POLYGON_OFFSET_LINE"/> >+ <enum name="GL_POLYGON_OFFSET_FILL"/> >+ <enum name="GL_POLYGON_OFFSET_FACTOR"/> >+ <enum name="GL_TEXTURE_BINDING_1D"/> >+ <enum name="GL_TEXTURE_BINDING_2D"/> >+ <enum name="GL_TEXTURE_INTERNAL_FORMAT"/> >+ <enum name="GL_TEXTURE_RED_SIZE"/> >+ <enum name="GL_TEXTURE_GREEN_SIZE"/> >+ <enum name="GL_TEXTURE_BLUE_SIZE"/> >+ <enum name="GL_TEXTURE_ALPHA_SIZE"/> >+ <enum name="GL_DOUBLE"/> >+ <enum name="GL_PROXY_TEXTURE_1D"/> >+ <enum name="GL_PROXY_TEXTURE_2D"/> >+ <enum name="GL_R3_G3_B2"/> >+ <enum name="GL_RGB4"/> >+ <enum name="GL_RGB5"/> >+ <enum name="GL_RGB8"/> >+ <enum name="GL_RGB10"/> >+ <enum name="GL_RGB12"/> >+ <enum name="GL_RGB16"/> >+ <enum name="GL_RGBA2"/> >+ <enum name="GL_RGBA4"/> >+ <enum name="GL_RGB5_A1"/> >+ <enum name="GL_RGBA8"/> >+ <enum name="GL_RGB10_A2"/> >+ <enum name="GL_RGBA12"/> >+ <enum name="GL_RGBA16"/> >+ <enum name="GL_CLIENT_PIXEL_STORE_BIT"/> >+ <enum name="GL_CLIENT_VERTEX_ARRAY_BIT"/> >+ <enum name="GL_CLIENT_ALL_ATTRIB_BITS"/> >+ <enum name="GL_VERTEX_ARRAY_POINTER"/> >+ <enum name="GL_NORMAL_ARRAY_POINTER"/> >+ <enum name="GL_COLOR_ARRAY_POINTER"/> >+ <enum name="GL_INDEX_ARRAY_POINTER"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_POINTER"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_POINTER"/> >+ <enum name="GL_FEEDBACK_BUFFER_POINTER"/> >+ <enum name="GL_SELECTION_BUFFER_POINTER"/> >+ <enum name="GL_CLIENT_ATTRIB_STACK_DEPTH"/> >+ <enum name="GL_INDEX_LOGIC_OP"/> >+ <enum name="GL_MAX_CLIENT_ATTRIB_STACK_DEPTH"/> >+ <enum name="GL_FEEDBACK_BUFFER_SIZE"/> >+ <enum name="GL_FEEDBACK_BUFFER_TYPE"/> >+ <enum name="GL_SELECTION_BUFFER_SIZE"/> >+ <enum name="GL_VERTEX_ARRAY"/> >+ <enum name="GL_NORMAL_ARRAY"/> >+ <enum name="GL_COLOR_ARRAY"/> >+ <enum name="GL_INDEX_ARRAY"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY"/> >+ <enum name="GL_EDGE_FLAG_ARRAY"/> >+ <enum name="GL_VERTEX_ARRAY_SIZE"/> >+ <enum name="GL_VERTEX_ARRAY_TYPE"/> >+ <enum name="GL_VERTEX_ARRAY_STRIDE"/> >+ <enum name="GL_NORMAL_ARRAY_TYPE"/> >+ <enum name="GL_NORMAL_ARRAY_STRIDE"/> >+ <enum name="GL_COLOR_ARRAY_SIZE"/> >+ <enum name="GL_COLOR_ARRAY_TYPE"/> >+ <enum name="GL_COLOR_ARRAY_STRIDE"/> >+ <enum name="GL_INDEX_ARRAY_TYPE"/> >+ <enum name="GL_INDEX_ARRAY_STRIDE"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_SIZE"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_TYPE"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_STRIDE"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_STRIDE"/> >+ <enum name="GL_TEXTURE_LUMINANCE_SIZE"/> >+ <enum name="GL_TEXTURE_INTENSITY_SIZE"/> >+ <enum name="GL_TEXTURE_PRIORITY"/> >+ <enum name="GL_TEXTURE_RESIDENT"/> >+ <enum name="GL_ALPHA4"/> >+ <enum name="GL_ALPHA8"/> >+ <enum name="GL_ALPHA12"/> >+ <enum name="GL_ALPHA16"/> >+ <enum name="GL_LUMINANCE4"/> >+ <enum name="GL_LUMINANCE8"/> >+ <enum name="GL_LUMINANCE12"/> >+ <enum name="GL_LUMINANCE16"/> >+ <enum name="GL_LUMINANCE4_ALPHA4"/> >+ <enum name="GL_LUMINANCE6_ALPHA2"/> >+ <enum name="GL_LUMINANCE8_ALPHA8"/> >+ <enum name="GL_LUMINANCE12_ALPHA4"/> >+ <enum name="GL_LUMINANCE12_ALPHA12"/> >+ <enum name="GL_LUMINANCE16_ALPHA16"/> >+ <enum name="GL_INTENSITY"/> >+ <enum name="GL_INTENSITY4"/> >+ <enum name="GL_INTENSITY8"/> >+ <enum name="GL_INTENSITY12"/> >+ <enum name="GL_INTENSITY16"/> >+ <enum name="GL_V2F"/> >+ <enum name="GL_V3F"/> >+ <enum name="GL_C4UB_V2F"/> >+ <enum name="GL_C4UB_V3F"/> >+ <enum name="GL_C3F_V3F"/> >+ <enum name="GL_N3F_V3F"/> >+ <enum name="GL_C4F_N3F_V3F"/> >+ <enum name="GL_T2F_V3F"/> >+ <enum name="GL_T4F_V4F"/> >+ <enum name="GL_T2F_C4UB_V3F"/> >+ <enum name="GL_T2F_C3F_V3F"/> >+ <enum name="GL_T2F_N3F_V3F"/> >+ <enum name="GL_T2F_C4F_N3F_V3F"/> >+ <enum name="GL_T4F_C4F_N3F_V4F"/> >+ <command name="glDrawArrays"/> >+ <command name="glDrawElements"/> >+ <command name="glGetPointerv"/> >+ <command name="glPolygonOffset"/> >+ <command name="glCopyTexImage1D"/> >+ <command name="glCopyTexImage2D"/> >+ <command name="glCopyTexSubImage1D"/> >+ <command name="glCopyTexSubImage2D"/> >+ <command name="glTexSubImage1D"/> >+ <command name="glTexSubImage2D"/> >+ <command name="glBindTexture"/> >+ <command name="glDeleteTextures"/> >+ <command name="glGenTextures"/> >+ <command name="glIsTexture"/> >+ <command name="glArrayElement"/> >+ <command name="glColorPointer"/> >+ <command name="glDisableClientState"/> >+ <command name="glEdgeFlagPointer"/> >+ <command name="glEnableClientState"/> >+ <command name="glIndexPointer"/> >+ <command name="glInterleavedArrays"/> >+ <command name="glNormalPointer"/> >+ <command name="glTexCoordPointer"/> >+ <command name="glVertexPointer"/> >+ <command name="glAreTexturesResident"/> >+ <command name="glPrioritizeTextures"/> >+ <command name="glIndexub"/> >+ <command name="glIndexubv"/> >+ <command name="glPopClientAttrib"/> >+ <command name="glPushClientAttrib"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_1_2" number="1.2"> >+ <require> >+ <enum name="GL_UNSIGNED_BYTE_3_3_2"/> >+ <enum name="GL_UNSIGNED_SHORT_4_4_4_4"/> >+ <enum name="GL_UNSIGNED_SHORT_5_5_5_1"/> >+ <enum name="GL_UNSIGNED_INT_8_8_8_8"/> >+ <enum name="GL_UNSIGNED_INT_10_10_10_2"/> >+ <enum name="GL_TEXTURE_BINDING_3D"/> >+ <enum name="GL_PACK_SKIP_IMAGES"/> >+ <enum name="GL_PACK_IMAGE_HEIGHT"/> >+ <enum name="GL_UNPACK_SKIP_IMAGES"/> >+ <enum name="GL_UNPACK_IMAGE_HEIGHT"/> >+ <enum name="GL_TEXTURE_3D"/> >+ <enum name="GL_PROXY_TEXTURE_3D"/> >+ <enum name="GL_TEXTURE_DEPTH"/> >+ <enum name="GL_TEXTURE_WRAP_R"/> >+ <enum name="GL_MAX_3D_TEXTURE_SIZE"/> >+ <enum name="GL_UNSIGNED_BYTE_2_3_3_REV"/> >+ <enum name="GL_UNSIGNED_SHORT_5_6_5"/> >+ <enum name="GL_UNSIGNED_SHORT_5_6_5_REV"/> >+ <enum name="GL_UNSIGNED_SHORT_4_4_4_4_REV"/> >+ <enum name="GL_UNSIGNED_SHORT_1_5_5_5_REV"/> >+ <enum name="GL_UNSIGNED_INT_8_8_8_8_REV"/> >+ <enum name="GL_UNSIGNED_INT_2_10_10_10_REV"/> >+ <enum name="GL_BGR"/> >+ <enum name="GL_BGRA"/> >+ <enum name="GL_MAX_ELEMENTS_VERTICES"/> >+ <enum name="GL_MAX_ELEMENTS_INDICES"/> >+ <enum name="GL_CLAMP_TO_EDGE"/> >+ <enum name="GL_TEXTURE_MIN_LOD"/> >+ <enum name="GL_TEXTURE_MAX_LOD"/> >+ <enum name="GL_TEXTURE_BASE_LEVEL"/> >+ <enum name="GL_TEXTURE_MAX_LEVEL"/> >+ <enum name="GL_SMOOTH_POINT_SIZE_RANGE"/> >+ <enum name="GL_SMOOTH_POINT_SIZE_GRANULARITY"/> >+ <enum name="GL_SMOOTH_LINE_WIDTH_RANGE"/> >+ <enum name="GL_SMOOTH_LINE_WIDTH_GRANULARITY"/> >+ <enum name="GL_ALIASED_LINE_WIDTH_RANGE"/> >+ <enum name="GL_RESCALE_NORMAL"/> >+ <enum name="GL_LIGHT_MODEL_COLOR_CONTROL"/> >+ <enum name="GL_SINGLE_COLOR"/> >+ <enum name="GL_SEPARATE_SPECULAR_COLOR"/> >+ <enum name="GL_ALIASED_POINT_SIZE_RANGE"/> >+ <command name="glDrawRangeElements"/> >+ <command name="glTexImage3D"/> >+ <command name="glTexSubImage3D"/> >+ <command name="glCopyTexSubImage3D"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_1_3" number="1.3"> >+ <require> >+ <enum name="GL_TEXTURE0"/> >+ <enum name="GL_TEXTURE1"/> >+ <enum name="GL_TEXTURE2"/> >+ <enum name="GL_TEXTURE3"/> >+ <enum name="GL_TEXTURE4"/> >+ <enum name="GL_TEXTURE5"/> >+ <enum name="GL_TEXTURE6"/> >+ <enum name="GL_TEXTURE7"/> >+ <enum name="GL_TEXTURE8"/> >+ <enum name="GL_TEXTURE9"/> >+ <enum name="GL_TEXTURE10"/> >+ <enum name="GL_TEXTURE11"/> >+ <enum name="GL_TEXTURE12"/> >+ <enum name="GL_TEXTURE13"/> >+ <enum name="GL_TEXTURE14"/> >+ <enum name="GL_TEXTURE15"/> >+ <enum name="GL_TEXTURE16"/> >+ <enum name="GL_TEXTURE17"/> >+ <enum name="GL_TEXTURE18"/> >+ <enum name="GL_TEXTURE19"/> >+ <enum name="GL_TEXTURE20"/> >+ <enum name="GL_TEXTURE21"/> >+ <enum name="GL_TEXTURE22"/> >+ <enum name="GL_TEXTURE23"/> >+ <enum name="GL_TEXTURE24"/> >+ <enum name="GL_TEXTURE25"/> >+ <enum name="GL_TEXTURE26"/> >+ <enum name="GL_TEXTURE27"/> >+ <enum name="GL_TEXTURE28"/> >+ <enum name="GL_TEXTURE29"/> >+ <enum name="GL_TEXTURE30"/> >+ <enum name="GL_TEXTURE31"/> >+ <enum name="GL_ACTIVE_TEXTURE"/> >+ <enum name="GL_MULTISAMPLE"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_COVERAGE"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_ONE"/> >+ <enum name="GL_SAMPLE_COVERAGE"/> >+ <enum name="GL_SAMPLE_BUFFERS"/> >+ <enum name="GL_SAMPLES"/> >+ <enum name="GL_SAMPLE_COVERAGE_VALUE"/> >+ <enum name="GL_SAMPLE_COVERAGE_INVERT"/> >+ <enum name="GL_TEXTURE_CUBE_MAP"/> >+ <enum name="GL_TEXTURE_BINDING_CUBE_MAP"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_X"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z"/> >+ <enum name="GL_PROXY_TEXTURE_CUBE_MAP"/> >+ <enum name="GL_MAX_CUBE_MAP_TEXTURE_SIZE"/> >+ <enum name="GL_COMPRESSED_RGB"/> >+ <enum name="GL_COMPRESSED_RGBA"/> >+ <enum name="GL_TEXTURE_COMPRESSION_HINT"/> >+ <enum name="GL_TEXTURE_COMPRESSED_IMAGE_SIZE"/> >+ <enum name="GL_TEXTURE_COMPRESSED"/> >+ <enum name="GL_NUM_COMPRESSED_TEXTURE_FORMATS"/> >+ <enum name="GL_COMPRESSED_TEXTURE_FORMATS"/> >+ <enum name="GL_CLAMP_TO_BORDER"/> >+ <enum name="GL_CLIENT_ACTIVE_TEXTURE"/> >+ <enum name="GL_MAX_TEXTURE_UNITS"/> >+ <enum name="GL_TRANSPOSE_MODELVIEW_MATRIX"/> >+ <enum name="GL_TRANSPOSE_PROJECTION_MATRIX"/> >+ <enum name="GL_TRANSPOSE_TEXTURE_MATRIX"/> >+ <enum name="GL_TRANSPOSE_COLOR_MATRIX"/> >+ <enum name="GL_MULTISAMPLE_BIT"/> >+ <enum name="GL_NORMAL_MAP"/> >+ <enum name="GL_REFLECTION_MAP"/> >+ <enum name="GL_COMPRESSED_ALPHA"/> >+ <enum name="GL_COMPRESSED_LUMINANCE"/> >+ <enum name="GL_COMPRESSED_LUMINANCE_ALPHA"/> >+ <enum name="GL_COMPRESSED_INTENSITY"/> >+ <enum name="GL_COMBINE"/> >+ <enum name="GL_COMBINE_RGB"/> >+ <enum name="GL_COMBINE_ALPHA"/> >+ <enum name="GL_SOURCE0_RGB"/> >+ <enum name="GL_SOURCE1_RGB"/> >+ <enum name="GL_SOURCE2_RGB"/> >+ <enum name="GL_SOURCE0_ALPHA"/> >+ <enum name="GL_SOURCE1_ALPHA"/> >+ <enum name="GL_SOURCE2_ALPHA"/> >+ <enum name="GL_OPERAND0_RGB"/> >+ <enum name="GL_OPERAND1_RGB"/> >+ <enum name="GL_OPERAND2_RGB"/> >+ <enum name="GL_OPERAND0_ALPHA"/> >+ <enum name="GL_OPERAND1_ALPHA"/> >+ <enum name="GL_OPERAND2_ALPHA"/> >+ <enum name="GL_RGB_SCALE"/> >+ <enum name="GL_ADD_SIGNED"/> >+ <enum name="GL_INTERPOLATE"/> >+ <enum name="GL_SUBTRACT"/> >+ <enum name="GL_CONSTANT"/> >+ <enum name="GL_PRIMARY_COLOR"/> >+ <enum name="GL_PREVIOUS"/> >+ <enum name="GL_DOT3_RGB"/> >+ <enum name="GL_DOT3_RGBA"/> >+ <command name="glActiveTexture"/> >+ <command name="glSampleCoverage"/> >+ <command name="glCompressedTexImage3D"/> >+ <command name="glCompressedTexImage2D"/> >+ <command name="glCompressedTexImage1D"/> >+ <command name="glCompressedTexSubImage3D"/> >+ <command name="glCompressedTexSubImage2D"/> >+ <command name="glCompressedTexSubImage1D"/> >+ <command name="glGetCompressedTexImage"/> >+ <command name="glClientActiveTexture"/> >+ <command name="glMultiTexCoord1d"/> >+ <command name="glMultiTexCoord1dv"/> >+ <command name="glMultiTexCoord1f"/> >+ <command name="glMultiTexCoord1fv"/> >+ <command name="glMultiTexCoord1i"/> >+ <command name="glMultiTexCoord1iv"/> >+ <command name="glMultiTexCoord1s"/> >+ <command name="glMultiTexCoord1sv"/> >+ <command name="glMultiTexCoord2d"/> >+ <command name="glMultiTexCoord2dv"/> >+ <command name="glMultiTexCoord2f"/> >+ <command name="glMultiTexCoord2fv"/> >+ <command name="glMultiTexCoord2i"/> >+ <command name="glMultiTexCoord2iv"/> >+ <command name="glMultiTexCoord2s"/> >+ <command name="glMultiTexCoord2sv"/> >+ <command name="glMultiTexCoord3d"/> >+ <command name="glMultiTexCoord3dv"/> >+ <command name="glMultiTexCoord3f"/> >+ <command name="glMultiTexCoord3fv"/> >+ <command name="glMultiTexCoord3i"/> >+ <command name="glMultiTexCoord3iv"/> >+ <command name="glMultiTexCoord3s"/> >+ <command name="glMultiTexCoord3sv"/> >+ <command name="glMultiTexCoord4d"/> >+ <command name="glMultiTexCoord4dv"/> >+ <command name="glMultiTexCoord4f"/> >+ <command name="glMultiTexCoord4fv"/> >+ <command name="glMultiTexCoord4i"/> >+ <command name="glMultiTexCoord4iv"/> >+ <command name="glMultiTexCoord4s"/> >+ <command name="glMultiTexCoord4sv"/> >+ <command name="glLoadTransposeMatrixf"/> >+ <command name="glLoadTransposeMatrixd"/> >+ <command name="glMultTransposeMatrixf"/> >+ <command name="glMultTransposeMatrixd"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_1_4" number="1.4"> >+ <require> >+ <enum name="GL_BLEND_DST_RGB"/> >+ <enum name="GL_BLEND_SRC_RGB"/> >+ <enum name="GL_BLEND_DST_ALPHA"/> >+ <enum name="GL_BLEND_SRC_ALPHA"/> >+ <enum name="GL_POINT_FADE_THRESHOLD_SIZE"/> >+ <enum name="GL_DEPTH_COMPONENT16"/> >+ <enum name="GL_DEPTH_COMPONENT24"/> >+ <enum name="GL_DEPTH_COMPONENT32"/> >+ <enum name="GL_MIRRORED_REPEAT"/> >+ <enum name="GL_MAX_TEXTURE_LOD_BIAS"/> >+ <enum name="GL_TEXTURE_LOD_BIAS"/> >+ <enum name="GL_INCR_WRAP"/> >+ <enum name="GL_DECR_WRAP"/> >+ <enum name="GL_TEXTURE_DEPTH_SIZE"/> >+ <enum name="GL_TEXTURE_COMPARE_MODE"/> >+ <enum name="GL_TEXTURE_COMPARE_FUNC"/> >+ <enum name="GL_POINT_SIZE_MIN"/> >+ <enum name="GL_POINT_SIZE_MAX"/> >+ <enum name="GL_POINT_DISTANCE_ATTENUATION"/> >+ <enum name="GL_GENERATE_MIPMAP"/> >+ <enum name="GL_GENERATE_MIPMAP_HINT"/> >+ <enum name="GL_FOG_COORDINATE_SOURCE"/> >+ <enum name="GL_FOG_COORDINATE"/> >+ <enum name="GL_FRAGMENT_DEPTH"/> >+ <enum name="GL_CURRENT_FOG_COORDINATE"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_TYPE"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_STRIDE"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_POINTER"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY"/> >+ <enum name="GL_COLOR_SUM"/> >+ <enum name="GL_CURRENT_SECONDARY_COLOR"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_SIZE"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_TYPE"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_STRIDE"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_POINTER"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY"/> >+ <enum name="GL_TEXTURE_FILTER_CONTROL"/> >+ <enum name="GL_DEPTH_TEXTURE_MODE"/> >+ <enum name="GL_COMPARE_R_TO_TEXTURE"/> >+ <command name="glBlendFuncSeparate"/> >+ <command name="glMultiDrawArrays"/> >+ <command name="glMultiDrawElements"/> >+ <command name="glPointParameterf"/> >+ <command name="glPointParameterfv"/> >+ <command name="glPointParameteri"/> >+ <command name="glPointParameteriv"/> >+ <command name="glFogCoordf"/> >+ <command name="glFogCoordfv"/> >+ <command name="glFogCoordd"/> >+ <command name="glFogCoorddv"/> >+ <command name="glFogCoordPointer"/> >+ <command name="glSecondaryColor3b"/> >+ <command name="glSecondaryColor3bv"/> >+ <command name="glSecondaryColor3d"/> >+ <command name="glSecondaryColor3dv"/> >+ <command name="glSecondaryColor3f"/> >+ <command name="glSecondaryColor3fv"/> >+ <command name="glSecondaryColor3i"/> >+ <command name="glSecondaryColor3iv"/> >+ <command name="glSecondaryColor3s"/> >+ <command name="glSecondaryColor3sv"/> >+ <command name="glSecondaryColor3ub"/> >+ <command name="glSecondaryColor3ubv"/> >+ <command name="glSecondaryColor3ui"/> >+ <command name="glSecondaryColor3uiv"/> >+ <command name="glSecondaryColor3us"/> >+ <command name="glSecondaryColor3usv"/> >+ <command name="glSecondaryColorPointer"/> >+ <command name="glWindowPos2d"/> >+ <command name="glWindowPos2dv"/> >+ <command name="glWindowPos2f"/> >+ <command name="glWindowPos2fv"/> >+ <command name="glWindowPos2i"/> >+ <command name="glWindowPos2iv"/> >+ <command name="glWindowPos2s"/> >+ <command name="glWindowPos2sv"/> >+ <command name="glWindowPos3d"/> >+ <command name="glWindowPos3dv"/> >+ <command name="glWindowPos3f"/> >+ <command name="glWindowPos3fv"/> >+ <command name="glWindowPos3i"/> >+ <command name="glWindowPos3iv"/> >+ <command name="glWindowPos3s"/> >+ <command name="glWindowPos3sv"/> >+ </require> >+ <require comment="Promoted from ARB_imaging subset to core"> >+ <enum name="GL_BLEND_COLOR"/> >+ <enum name="GL_BLEND_EQUATION"/> >+ <enum name="GL_CONSTANT_COLOR"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_COLOR"/> >+ <enum name="GL_CONSTANT_ALPHA"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_ALPHA"/> >+ <enum name="GL_FUNC_ADD"/> >+ <enum name="GL_FUNC_REVERSE_SUBTRACT"/> >+ <enum name="GL_FUNC_SUBTRACT"/> >+ <enum name="GL_MIN"/> >+ <enum name="GL_MAX"/> >+ <command name="glBlendColor"/> >+ <command name="glBlendEquation"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_1_5" number="1.5"> >+ <require> >+ <enum name="GL_BUFFER_SIZE"/> >+ <enum name="GL_BUFFER_USAGE"/> >+ <enum name="GL_QUERY_COUNTER_BITS"/> >+ <enum name="GL_CURRENT_QUERY"/> >+ <enum name="GL_QUERY_RESULT"/> >+ <enum name="GL_QUERY_RESULT_AVAILABLE"/> >+ <enum name="GL_ARRAY_BUFFER"/> >+ <enum name="GL_ELEMENT_ARRAY_BUFFER"/> >+ <enum name="GL_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_ELEMENT_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_READ_ONLY"/> >+ <enum name="GL_WRITE_ONLY"/> >+ <enum name="GL_READ_WRITE"/> >+ <enum name="GL_BUFFER_ACCESS"/> >+ <enum name="GL_BUFFER_MAPPED"/> >+ <enum name="GL_BUFFER_MAP_POINTER"/> >+ <enum name="GL_STREAM_DRAW"/> >+ <enum name="GL_STREAM_READ"/> >+ <enum name="GL_STREAM_COPY"/> >+ <enum name="GL_STATIC_DRAW"/> >+ <enum name="GL_STATIC_READ"/> >+ <enum name="GL_STATIC_COPY"/> >+ <enum name="GL_DYNAMIC_DRAW"/> >+ <enum name="GL_DYNAMIC_READ"/> >+ <enum name="GL_DYNAMIC_COPY"/> >+ <enum name="GL_SAMPLES_PASSED"/> >+ <enum name="GL_SRC1_ALPHA"/> >+ <enum name="GL_VERTEX_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_NORMAL_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_COLOR_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_INDEX_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_WEIGHT_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_FOG_COORD_SRC"/> >+ <enum name="GL_FOG_COORD"/> >+ <enum name="GL_CURRENT_FOG_COORD"/> >+ <enum name="GL_FOG_COORD_ARRAY_TYPE"/> >+ <enum name="GL_FOG_COORD_ARRAY_STRIDE"/> >+ <enum name="GL_FOG_COORD_ARRAY_POINTER"/> >+ <enum name="GL_FOG_COORD_ARRAY"/> >+ <enum name="GL_FOG_COORD_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_SRC0_RGB"/> >+ <enum name="GL_SRC1_RGB"/> >+ <enum name="GL_SRC2_RGB"/> >+ <enum name="GL_SRC0_ALPHA"/> >+ <enum name="GL_SRC2_ALPHA"/> >+ <command name="glGenQueries"/> >+ <command name="glDeleteQueries"/> >+ <command name="glIsQuery"/> >+ <command name="glBeginQuery"/> >+ <command name="glEndQuery"/> >+ <command name="glGetQueryiv"/> >+ <command name="glGetQueryObjectiv"/> >+ <command name="glGetQueryObjectuiv"/> >+ <command name="glBindBuffer"/> >+ <command name="glDeleteBuffers"/> >+ <command name="glGenBuffers"/> >+ <command name="glIsBuffer"/> >+ <command name="glBufferData"/> >+ <command name="glBufferSubData"/> >+ <command name="glGetBufferSubData"/> >+ <command name="glMapBuffer"/> >+ <command name="glUnmapBuffer"/> >+ <command name="glGetBufferParameteriv"/> >+ <command name="glGetBufferPointerv"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_2_0" number="2.0"> >+ <require> >+ <enum name="GL_BLEND_EQUATION_RGB"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_ENABLED"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_SIZE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_STRIDE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_TYPE"/> >+ <enum name="GL_CURRENT_VERTEX_ATTRIB"/> >+ <enum name="GL_VERTEX_PROGRAM_POINT_SIZE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_POINTER"/> >+ <enum name="GL_STENCIL_BACK_FUNC"/> >+ <enum name="GL_STENCIL_BACK_FAIL"/> >+ <enum name="GL_STENCIL_BACK_PASS_DEPTH_FAIL"/> >+ <enum name="GL_STENCIL_BACK_PASS_DEPTH_PASS"/> >+ <enum name="GL_MAX_DRAW_BUFFERS"/> >+ <enum name="GL_DRAW_BUFFER0"/> >+ <enum name="GL_DRAW_BUFFER1"/> >+ <enum name="GL_DRAW_BUFFER2"/> >+ <enum name="GL_DRAW_BUFFER3"/> >+ <enum name="GL_DRAW_BUFFER4"/> >+ <enum name="GL_DRAW_BUFFER5"/> >+ <enum name="GL_DRAW_BUFFER6"/> >+ <enum name="GL_DRAW_BUFFER7"/> >+ <enum name="GL_DRAW_BUFFER8"/> >+ <enum name="GL_DRAW_BUFFER9"/> >+ <enum name="GL_DRAW_BUFFER10"/> >+ <enum name="GL_DRAW_BUFFER11"/> >+ <enum name="GL_DRAW_BUFFER12"/> >+ <enum name="GL_DRAW_BUFFER13"/> >+ <enum name="GL_DRAW_BUFFER14"/> >+ <enum name="GL_DRAW_BUFFER15"/> >+ <enum name="GL_BLEND_EQUATION_ALPHA"/> >+ <enum name="GL_MAX_VERTEX_ATTRIBS"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_NORMALIZED"/> >+ <enum name="GL_MAX_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_FRAGMENT_SHADER"/> >+ <enum name="GL_VERTEX_SHADER"/> >+ <enum name="GL_MAX_FRAGMENT_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_VERTEX_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_VARYING_FLOATS"/> >+ <enum name="GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_SHADER_TYPE"/> >+ <enum name="GL_FLOAT_VEC2"/> >+ <enum name="GL_FLOAT_VEC3"/> >+ <enum name="GL_FLOAT_VEC4"/> >+ <enum name="GL_INT_VEC2"/> >+ <enum name="GL_INT_VEC3"/> >+ <enum name="GL_INT_VEC4"/> >+ <enum name="GL_BOOL"/> >+ <enum name="GL_BOOL_VEC2"/> >+ <enum name="GL_BOOL_VEC3"/> >+ <enum name="GL_BOOL_VEC4"/> >+ <enum name="GL_FLOAT_MAT2"/> >+ <enum name="GL_FLOAT_MAT3"/> >+ <enum name="GL_FLOAT_MAT4"/> >+ <enum name="GL_SAMPLER_1D"/> >+ <enum name="GL_SAMPLER_2D"/> >+ <enum name="GL_SAMPLER_3D"/> >+ <enum name="GL_SAMPLER_CUBE"/> >+ <enum name="GL_SAMPLER_1D_SHADOW"/> >+ <enum name="GL_SAMPLER_2D_SHADOW"/> >+ <enum name="GL_DELETE_STATUS"/> >+ <enum name="GL_COMPILE_STATUS"/> >+ <enum name="GL_LINK_STATUS"/> >+ <enum name="GL_VALIDATE_STATUS"/> >+ <enum name="GL_INFO_LOG_LENGTH"/> >+ <enum name="GL_ATTACHED_SHADERS"/> >+ <enum name="GL_ACTIVE_UNIFORMS"/> >+ <enum name="GL_ACTIVE_UNIFORM_MAX_LENGTH"/> >+ <enum name="GL_SHADER_SOURCE_LENGTH"/> >+ <enum name="GL_ACTIVE_ATTRIBUTES"/> >+ <enum name="GL_ACTIVE_ATTRIBUTE_MAX_LENGTH"/> >+ <enum name="GL_FRAGMENT_SHADER_DERIVATIVE_HINT"/> >+ <enum name="GL_SHADING_LANGUAGE_VERSION"/> >+ <enum name="GL_CURRENT_PROGRAM"/> >+ <enum name="GL_POINT_SPRITE_COORD_ORIGIN"/> >+ <enum name="GL_LOWER_LEFT"/> >+ <enum name="GL_UPPER_LEFT"/> >+ <enum name="GL_STENCIL_BACK_REF"/> >+ <enum name="GL_STENCIL_BACK_VALUE_MASK"/> >+ <enum name="GL_STENCIL_BACK_WRITEMASK"/> >+ <enum name="GL_VERTEX_PROGRAM_TWO_SIDE"/> >+ <enum name="GL_POINT_SPRITE"/> >+ <enum name="GL_COORD_REPLACE"/> >+ <enum name="GL_MAX_TEXTURE_COORDS"/> >+ <command name="glBlendEquationSeparate"/> >+ <command name="glDrawBuffers"/> >+ <command name="glStencilOpSeparate"/> >+ <command name="glStencilFuncSeparate"/> >+ <command name="glStencilMaskSeparate"/> >+ <command name="glAttachShader"/> >+ <command name="glBindAttribLocation"/> >+ <command name="glCompileShader"/> >+ <command name="glCreateProgram"/> >+ <command name="glCreateShader"/> >+ <command name="glDeleteProgram"/> >+ <command name="glDeleteShader"/> >+ <command name="glDetachShader"/> >+ <command name="glDisableVertexAttribArray"/> >+ <command name="glEnableVertexAttribArray"/> >+ <command name="glGetActiveAttrib"/> >+ <command name="glGetActiveUniform"/> >+ <command name="glGetAttachedShaders"/> >+ <command name="glGetAttribLocation"/> >+ <command name="glGetProgramiv"/> >+ <command name="glGetProgramInfoLog"/> >+ <command name="glGetShaderiv"/> >+ <command name="glGetShaderInfoLog"/> >+ <command name="glGetShaderSource"/> >+ <command name="glGetUniformLocation"/> >+ <command name="glGetUniformfv"/> >+ <command name="glGetUniformiv"/> >+ <command name="glGetVertexAttribdv"/> >+ <command name="glGetVertexAttribfv"/> >+ <command name="glGetVertexAttribiv"/> >+ <command name="glGetVertexAttribPointerv"/> >+ <command name="glIsProgram"/> >+ <command name="glIsShader"/> >+ <command name="glLinkProgram"/> >+ <command name="glShaderSource"/> >+ <command name="glUseProgram"/> >+ <command name="glUniform1f"/> >+ <command name="glUniform2f"/> >+ <command name="glUniform3f"/> >+ <command name="glUniform4f"/> >+ <command name="glUniform1i"/> >+ <command name="glUniform2i"/> >+ <command name="glUniform3i"/> >+ <command name="glUniform4i"/> >+ <command name="glUniform1fv"/> >+ <command name="glUniform2fv"/> >+ <command name="glUniform3fv"/> >+ <command name="glUniform4fv"/> >+ <command name="glUniform1iv"/> >+ <command name="glUniform2iv"/> >+ <command name="glUniform3iv"/> >+ <command name="glUniform4iv"/> >+ <command name="glUniformMatrix2fv"/> >+ <command name="glUniformMatrix3fv"/> >+ <command name="glUniformMatrix4fv"/> >+ <command name="glValidateProgram"/> >+ <command name="glVertexAttrib1d"/> >+ <command name="glVertexAttrib1dv"/> >+ <command name="glVertexAttrib1f"/> >+ <command name="glVertexAttrib1fv"/> >+ <command name="glVertexAttrib1s"/> >+ <command name="glVertexAttrib1sv"/> >+ <command name="glVertexAttrib2d"/> >+ <command name="glVertexAttrib2dv"/> >+ <command name="glVertexAttrib2f"/> >+ <command name="glVertexAttrib2fv"/> >+ <command name="glVertexAttrib2s"/> >+ <command name="glVertexAttrib2sv"/> >+ <command name="glVertexAttrib3d"/> >+ <command name="glVertexAttrib3dv"/> >+ <command name="glVertexAttrib3f"/> >+ <command name="glVertexAttrib3fv"/> >+ <command name="glVertexAttrib3s"/> >+ <command name="glVertexAttrib3sv"/> >+ <command name="glVertexAttrib4Nbv"/> >+ <command name="glVertexAttrib4Niv"/> >+ <command name="glVertexAttrib4Nsv"/> >+ <command name="glVertexAttrib4Nub"/> >+ <command name="glVertexAttrib4Nubv"/> >+ <command name="glVertexAttrib4Nuiv"/> >+ <command name="glVertexAttrib4Nusv"/> >+ <command name="glVertexAttrib4bv"/> >+ <command name="glVertexAttrib4d"/> >+ <command name="glVertexAttrib4dv"/> >+ <command name="glVertexAttrib4f"/> >+ <command name="glVertexAttrib4fv"/> >+ <command name="glVertexAttrib4iv"/> >+ <command name="glVertexAttrib4s"/> >+ <command name="glVertexAttrib4sv"/> >+ <command name="glVertexAttrib4ubv"/> >+ <command name="glVertexAttrib4uiv"/> >+ <command name="glVertexAttrib4usv"/> >+ <command name="glVertexAttribPointer"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_2_1" number="2.1"> >+ <require> >+ <enum name="GL_PIXEL_PACK_BUFFER"/> >+ <enum name="GL_PIXEL_UNPACK_BUFFER"/> >+ <enum name="GL_PIXEL_PACK_BUFFER_BINDING"/> >+ <enum name="GL_PIXEL_UNPACK_BUFFER_BINDING"/> >+ <enum name="GL_FLOAT_MAT2x3"/> >+ <enum name="GL_FLOAT_MAT2x4"/> >+ <enum name="GL_FLOAT_MAT3x2"/> >+ <enum name="GL_FLOAT_MAT3x4"/> >+ <enum name="GL_FLOAT_MAT4x2"/> >+ <enum name="GL_FLOAT_MAT4x3"/> >+ <enum name="GL_SRGB"/> >+ <enum name="GL_SRGB8"/> >+ <enum name="GL_SRGB_ALPHA"/> >+ <enum name="GL_SRGB8_ALPHA8"/> >+ <enum name="GL_COMPRESSED_SRGB"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA"/> >+ <enum name="GL_CURRENT_RASTER_SECONDARY_COLOR"/> >+ <enum name="GL_SLUMINANCE_ALPHA"/> >+ <enum name="GL_SLUMINANCE8_ALPHA8"/> >+ <enum name="GL_SLUMINANCE"/> >+ <enum name="GL_SLUMINANCE8"/> >+ <enum name="GL_COMPRESSED_SLUMINANCE"/> >+ <enum name="GL_COMPRESSED_SLUMINANCE_ALPHA"/> >+ <command name="glUniformMatrix2x3fv"/> >+ <command name="glUniformMatrix3x2fv"/> >+ <command name="glUniformMatrix2x4fv"/> >+ <command name="glUniformMatrix4x2fv"/> >+ <command name="glUniformMatrix3x4fv"/> >+ <command name="glUniformMatrix4x3fv"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_3_0" number="3.0"> >+ <require> >+ <enum name="GL_COMPARE_REF_TO_TEXTURE"/> >+ <enum name="GL_CLIP_DISTANCE0"/> >+ <enum name="GL_CLIP_DISTANCE1"/> >+ <enum name="GL_CLIP_DISTANCE2"/> >+ <enum name="GL_CLIP_DISTANCE3"/> >+ <enum name="GL_CLIP_DISTANCE4"/> >+ <enum name="GL_CLIP_DISTANCE5"/> >+ <enum name="GL_CLIP_DISTANCE6"/> >+ <enum name="GL_CLIP_DISTANCE7"/> >+ <enum name="GL_MAX_CLIP_DISTANCES"/> >+ <enum name="GL_MAJOR_VERSION"/> >+ <enum name="GL_MINOR_VERSION"/> >+ <enum name="GL_NUM_EXTENSIONS"/> >+ <enum name="GL_CONTEXT_FLAGS"/> >+ <enum name="GL_COMPRESSED_RED"/> >+ <enum name="GL_COMPRESSED_RG"/> >+ <enum name="GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT"/> >+ <enum name="GL_RGBA32F"/> >+ <enum name="GL_RGB32F"/> >+ <enum name="GL_RGBA16F"/> >+ <enum name="GL_RGB16F"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_INTEGER"/> >+ <enum name="GL_MAX_ARRAY_TEXTURE_LAYERS"/> >+ <enum name="GL_MIN_PROGRAM_TEXEL_OFFSET"/> >+ <enum name="GL_MAX_PROGRAM_TEXEL_OFFSET"/> >+ <enum name="GL_CLAMP_READ_COLOR"/> >+ <enum name="GL_FIXED_ONLY"/> >+ <enum name="GL_MAX_VARYING_COMPONENTS"/> >+ <enum name="GL_TEXTURE_1D_ARRAY"/> >+ <enum name="GL_PROXY_TEXTURE_1D_ARRAY"/> >+ <enum name="GL_TEXTURE_2D_ARRAY"/> >+ <enum name="GL_PROXY_TEXTURE_2D_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_1D_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_2D_ARRAY"/> >+ <enum name="GL_R11F_G11F_B10F"/> >+ <enum name="GL_UNSIGNED_INT_10F_11F_11F_REV"/> >+ <enum name="GL_RGB9_E5"/> >+ <enum name="GL_UNSIGNED_INT_5_9_9_9_REV"/> >+ <enum name="GL_TEXTURE_SHARED_SIZE"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_MODE"/> >+ <enum name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_VARYINGS"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_START"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_SIZE"/> >+ <enum name="GL_PRIMITIVES_GENERATED"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN"/> >+ <enum name="GL_RASTERIZER_DISCARD"/> >+ <enum name="GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS"/> >+ <enum name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS"/> >+ <enum name="GL_INTERLEAVED_ATTRIBS"/> >+ <enum name="GL_SEPARATE_ATTRIBS"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_BINDING"/> >+ <enum name="GL_RGBA32UI"/> >+ <enum name="GL_RGB32UI"/> >+ <enum name="GL_RGBA16UI"/> >+ <enum name="GL_RGB16UI"/> >+ <enum name="GL_RGBA8UI"/> >+ <enum name="GL_RGB8UI"/> >+ <enum name="GL_RGBA32I"/> >+ <enum name="GL_RGB32I"/> >+ <enum name="GL_RGBA16I"/> >+ <enum name="GL_RGB16I"/> >+ <enum name="GL_RGBA8I"/> >+ <enum name="GL_RGB8I"/> >+ <enum name="GL_RED_INTEGER"/> >+ <enum name="GL_GREEN_INTEGER"/> >+ <enum name="GL_BLUE_INTEGER"/> >+ <enum name="GL_RGB_INTEGER"/> >+ <enum name="GL_RGBA_INTEGER"/> >+ <enum name="GL_BGR_INTEGER"/> >+ <enum name="GL_BGRA_INTEGER"/> >+ <enum name="GL_SAMPLER_1D_ARRAY"/> >+ <enum name="GL_SAMPLER_2D_ARRAY"/> >+ <enum name="GL_SAMPLER_1D_ARRAY_SHADOW"/> >+ <enum name="GL_SAMPLER_2D_ARRAY_SHADOW"/> >+ <enum name="GL_SAMPLER_CUBE_SHADOW"/> >+ <enum name="GL_UNSIGNED_INT_VEC2"/> >+ <enum name="GL_UNSIGNED_INT_VEC3"/> >+ <enum name="GL_UNSIGNED_INT_VEC4"/> >+ <enum name="GL_INT_SAMPLER_1D"/> >+ <enum name="GL_INT_SAMPLER_2D"/> >+ <enum name="GL_INT_SAMPLER_3D"/> >+ <enum name="GL_INT_SAMPLER_CUBE"/> >+ <enum name="GL_INT_SAMPLER_1D_ARRAY"/> >+ <enum name="GL_INT_SAMPLER_2D_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_1D"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_3D"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_CUBE"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_1D_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D_ARRAY"/> >+ <enum name="GL_QUERY_WAIT"/> >+ <enum name="GL_QUERY_NO_WAIT"/> >+ <enum name="GL_QUERY_BY_REGION_WAIT"/> >+ <enum name="GL_QUERY_BY_REGION_NO_WAIT"/> >+ <enum name="GL_BUFFER_ACCESS_FLAGS"/> >+ <enum name="GL_BUFFER_MAP_LENGTH"/> >+ <enum name="GL_BUFFER_MAP_OFFSET"/> >+ <command name="glColorMaski"/> >+ <command name="glGetBooleani_v"/> >+ <command name="glGetIntegeri_v"/> >+ <command name="glEnablei"/> >+ <command name="glDisablei"/> >+ <command name="glIsEnabledi"/> >+ <command name="glBeginTransformFeedback"/> >+ <command name="glEndTransformFeedback"/> >+ <command name="glBindBufferRange"/> >+ <command name="glBindBufferBase"/> >+ <command name="glTransformFeedbackVaryings"/> >+ <command name="glGetTransformFeedbackVarying"/> >+ <command name="glClampColor"/> >+ <command name="glBeginConditionalRender"/> >+ <command name="glEndConditionalRender"/> >+ <command name="glVertexAttribIPointer"/> >+ <command name="glGetVertexAttribIiv"/> >+ <command name="glGetVertexAttribIuiv"/> >+ <command name="glVertexAttribI1i"/> >+ <command name="glVertexAttribI2i"/> >+ <command name="glVertexAttribI3i"/> >+ <command name="glVertexAttribI4i"/> >+ <command name="glVertexAttribI1ui"/> >+ <command name="glVertexAttribI2ui"/> >+ <command name="glVertexAttribI3ui"/> >+ <command name="glVertexAttribI4ui"/> >+ <command name="glVertexAttribI1iv"/> >+ <command name="glVertexAttribI2iv"/> >+ <command name="glVertexAttribI3iv"/> >+ <command name="glVertexAttribI4iv"/> >+ <command name="glVertexAttribI1uiv"/> >+ <command name="glVertexAttribI2uiv"/> >+ <command name="glVertexAttribI3uiv"/> >+ <command name="glVertexAttribI4uiv"/> >+ <command name="glVertexAttribI4bv"/> >+ <command name="glVertexAttribI4sv"/> >+ <command name="glVertexAttribI4ubv"/> >+ <command name="glVertexAttribI4usv"/> >+ <command name="glGetUniformuiv"/> >+ <command name="glBindFragDataLocation"/> >+ <command name="glGetFragDataLocation"/> >+ <command name="glUniform1ui"/> >+ <command name="glUniform2ui"/> >+ <command name="glUniform3ui"/> >+ <command name="glUniform4ui"/> >+ <command name="glUniform1uiv"/> >+ <command name="glUniform2uiv"/> >+ <command name="glUniform3uiv"/> >+ <command name="glUniform4uiv"/> >+ <command name="glTexParameterIiv"/> >+ <command name="glTexParameterIuiv"/> >+ <command name="glGetTexParameterIiv"/> >+ <command name="glGetTexParameterIuiv"/> >+ <command name="glClearBufferiv"/> >+ <command name="glClearBufferuiv"/> >+ <command name="glClearBufferfv"/> >+ <command name="glClearBufferfi"/> >+ <command name="glGetStringi"/> >+ </require> >+ <require comment="Reuse ARB_depth_buffer_float"> >+ <enum name="GL_DEPTH_COMPONENT32F"/> >+ <enum name="GL_DEPTH32F_STENCIL8"/> >+ <enum name="GL_FLOAT_32_UNSIGNED_INT_24_8_REV"/> >+ </require> >+ <require comment="Reuse ARB_framebuffer_object"> >+ <enum name="GL_INVALID_FRAMEBUFFER_OPERATION"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT"/> >+ <enum name="GL_FRAMEBUFFER_UNDEFINED"/> >+ <enum name="GL_DEPTH_STENCIL_ATTACHMENT"/> >+ <enum name="GL_MAX_RENDERBUFFER_SIZE"/> >+ <enum name="GL_DEPTH_STENCIL"/> >+ <enum name="GL_UNSIGNED_INT_24_8"/> >+ <enum name="GL_DEPTH24_STENCIL8"/> >+ <enum name="GL_TEXTURE_STENCIL_SIZE"/> >+ <enum name="GL_TEXTURE_RED_TYPE"/> >+ <enum name="GL_TEXTURE_GREEN_TYPE"/> >+ <enum name="GL_TEXTURE_BLUE_TYPE"/> >+ <enum name="GL_TEXTURE_ALPHA_TYPE"/> >+ <enum name="GL_TEXTURE_DEPTH_TYPE"/> >+ <enum name="GL_UNSIGNED_NORMALIZED"/> >+ <enum name="GL_FRAMEBUFFER_BINDING"/> >+ <enum name="GL_DRAW_FRAMEBUFFER_BINDING"/> >+ <enum name="GL_RENDERBUFFER_BINDING"/> >+ <enum name="GL_READ_FRAMEBUFFER"/> >+ <enum name="GL_DRAW_FRAMEBUFFER"/> >+ <enum name="GL_READ_FRAMEBUFFER_BINDING"/> >+ <enum name="GL_RENDERBUFFER_SAMPLES"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER"/> >+ <enum name="GL_FRAMEBUFFER_COMPLETE"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER"/> >+ <enum name="GL_FRAMEBUFFER_UNSUPPORTED"/> >+ <enum name="GL_MAX_COLOR_ATTACHMENTS"/> >+ <enum name="GL_COLOR_ATTACHMENT0"/> >+ <enum name="GL_COLOR_ATTACHMENT1"/> >+ <enum name="GL_COLOR_ATTACHMENT2"/> >+ <enum name="GL_COLOR_ATTACHMENT3"/> >+ <enum name="GL_COLOR_ATTACHMENT4"/> >+ <enum name="GL_COLOR_ATTACHMENT5"/> >+ <enum name="GL_COLOR_ATTACHMENT6"/> >+ <enum name="GL_COLOR_ATTACHMENT7"/> >+ <enum name="GL_COLOR_ATTACHMENT8"/> >+ <enum name="GL_COLOR_ATTACHMENT9"/> >+ <enum name="GL_COLOR_ATTACHMENT10"/> >+ <enum name="GL_COLOR_ATTACHMENT11"/> >+ <enum name="GL_COLOR_ATTACHMENT12"/> >+ <enum name="GL_COLOR_ATTACHMENT13"/> >+ <enum name="GL_COLOR_ATTACHMENT14"/> >+ <enum name="GL_COLOR_ATTACHMENT15"/> >+ <enum name="GL_COLOR_ATTACHMENT16"/> >+ <enum name="GL_COLOR_ATTACHMENT17"/> >+ <enum name="GL_COLOR_ATTACHMENT18"/> >+ <enum name="GL_COLOR_ATTACHMENT19"/> >+ <enum name="GL_COLOR_ATTACHMENT20"/> >+ <enum name="GL_COLOR_ATTACHMENT21"/> >+ <enum name="GL_COLOR_ATTACHMENT22"/> >+ <enum name="GL_COLOR_ATTACHMENT23"/> >+ <enum name="GL_COLOR_ATTACHMENT24"/> >+ <enum name="GL_COLOR_ATTACHMENT25"/> >+ <enum name="GL_COLOR_ATTACHMENT26"/> >+ <enum name="GL_COLOR_ATTACHMENT27"/> >+ <enum name="GL_COLOR_ATTACHMENT28"/> >+ <enum name="GL_COLOR_ATTACHMENT29"/> >+ <enum name="GL_COLOR_ATTACHMENT30"/> >+ <enum name="GL_COLOR_ATTACHMENT31"/> >+ <enum name="GL_DEPTH_ATTACHMENT"/> >+ <enum name="GL_STENCIL_ATTACHMENT"/> >+ <enum name="GL_FRAMEBUFFER"/> >+ <enum name="GL_RENDERBUFFER"/> >+ <enum name="GL_RENDERBUFFER_WIDTH"/> >+ <enum name="GL_RENDERBUFFER_HEIGHT"/> >+ <enum name="GL_RENDERBUFFER_INTERNAL_FORMAT"/> >+ <enum name="GL_STENCIL_INDEX1"/> >+ <enum name="GL_STENCIL_INDEX4"/> >+ <enum name="GL_STENCIL_INDEX8"/> >+ <enum name="GL_STENCIL_INDEX16"/> >+ <enum name="GL_RENDERBUFFER_RED_SIZE"/> >+ <enum name="GL_RENDERBUFFER_GREEN_SIZE"/> >+ <enum name="GL_RENDERBUFFER_BLUE_SIZE"/> >+ <enum name="GL_RENDERBUFFER_ALPHA_SIZE"/> >+ <enum name="GL_RENDERBUFFER_DEPTH_SIZE"/> >+ <enum name="GL_RENDERBUFFER_STENCIL_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE"/> >+ <enum name="GL_MAX_SAMPLES"/> >+ <command name="glIsRenderbuffer"/> >+ <command name="glBindRenderbuffer"/> >+ <command name="glDeleteRenderbuffers"/> >+ <command name="glGenRenderbuffers"/> >+ <command name="glRenderbufferStorage"/> >+ <command name="glGetRenderbufferParameteriv"/> >+ <command name="glIsFramebuffer"/> >+ <command name="glBindFramebuffer"/> >+ <command name="glDeleteFramebuffers"/> >+ <command name="glGenFramebuffers"/> >+ <command name="glCheckFramebufferStatus"/> >+ <command name="glFramebufferTexture1D"/> >+ <command name="glFramebufferTexture2D"/> >+ <command name="glFramebufferTexture3D"/> >+ <command name="glFramebufferRenderbuffer"/> >+ <command name="glGetFramebufferAttachmentParameteriv"/> >+ <command name="glGenerateMipmap"/> >+ <command name="glBlitFramebuffer"/> >+ <command name="glRenderbufferStorageMultisample"/> >+ <command name="glFramebufferTextureLayer"/> >+ </require> >+ <require profile="compatibility" comment="Reuse ARB_framebuffer_object compatibility profile"> >+ <enum name="GL_INDEX"/> >+ <enum name="GL_TEXTURE_LUMINANCE_TYPE"/> >+ <enum name="GL_TEXTURE_INTENSITY_TYPE"/> >+ </require> >+ <require comment="Reuse ARB_framebuffer_sRGB"> >+ <enum name="GL_FRAMEBUFFER_SRGB"/> >+ </require> >+ <require comment="Reuse ARB_half_float_vertex"> >+ <type name="GLhalf"/> >+ <enum name="GL_HALF_FLOAT"/> >+ </require> >+ <require comment="Reuse ARB_map_buffer_range"> >+ <enum name="GL_MAP_READ_BIT"/> >+ <enum name="GL_MAP_WRITE_BIT"/> >+ <enum name="GL_MAP_INVALIDATE_RANGE_BIT"/> >+ <enum name="GL_MAP_INVALIDATE_BUFFER_BIT"/> >+ <enum name="GL_MAP_FLUSH_EXPLICIT_BIT"/> >+ <enum name="GL_MAP_UNSYNCHRONIZED_BIT"/> >+ <command name="glMapBufferRange"/> >+ <command name="glFlushMappedBufferRange"/> >+ </require> >+ <require comment="Reuse ARB_texture_compression_rgtc"> >+ <enum name="GL_COMPRESSED_RED_RGTC1"/> >+ <enum name="GL_COMPRESSED_SIGNED_RED_RGTC1"/> >+ <enum name="GL_COMPRESSED_RG_RGTC2"/> >+ <enum name="GL_COMPRESSED_SIGNED_RG_RGTC2"/> >+ </require> >+ <require comment="Reuse ARB_texture_rg"> >+ <enum name="GL_RG"/> >+ <enum name="GL_RG_INTEGER"/> >+ <enum name="GL_R8"/> >+ <enum name="GL_R16"/> >+ <enum name="GL_RG8"/> >+ <enum name="GL_RG16"/> >+ <enum name="GL_R16F"/> >+ <enum name="GL_R32F"/> >+ <enum name="GL_RG16F"/> >+ <enum name="GL_RG32F"/> >+ <enum name="GL_R8I"/> >+ <enum name="GL_R8UI"/> >+ <enum name="GL_R16I"/> >+ <enum name="GL_R16UI"/> >+ <enum name="GL_R32I"/> >+ <enum name="GL_R32UI"/> >+ <enum name="GL_RG8I"/> >+ <enum name="GL_RG8UI"/> >+ <enum name="GL_RG16I"/> >+ <enum name="GL_RG16UI"/> >+ <enum name="GL_RG32I"/> >+ <enum name="GL_RG32UI"/> >+ </require> >+ <require comment="Reuse ARB_vertex_array_object"> >+ <enum name="GL_VERTEX_ARRAY_BINDING"/> >+ <enum name="GL_CLAMP_VERTEX_COLOR"/> >+ <enum name="GL_CLAMP_FRAGMENT_COLOR"/> >+ <enum name="GL_ALPHA_INTEGER"/> >+ <command name="glBindVertexArray"/> >+ <command name="glDeleteVertexArrays"/> >+ <command name="glGenVertexArrays"/> >+ <command name="glIsVertexArray"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_3_1" number="3.1"> >+ <require> >+ <enum name="GL_SAMPLER_2D_RECT"/> >+ <enum name="GL_SAMPLER_2D_RECT_SHADOW"/> >+ <enum name="GL_SAMPLER_BUFFER"/> >+ <enum name="GL_INT_SAMPLER_2D_RECT"/> >+ <enum name="GL_INT_SAMPLER_BUFFER"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D_RECT"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_BUFFER"/> >+ <enum name="GL_TEXTURE_BUFFER"/> >+ <enum name="GL_MAX_TEXTURE_BUFFER_SIZE"/> >+ <enum name="GL_TEXTURE_BINDING_BUFFER"/> >+ <enum name="GL_TEXTURE_BUFFER_DATA_STORE_BINDING"/> >+ <enum name="GL_TEXTURE_RECTANGLE"/> >+ <enum name="GL_TEXTURE_BINDING_RECTANGLE"/> >+ <enum name="GL_PROXY_TEXTURE_RECTANGLE"/> >+ <enum name="GL_MAX_RECTANGLE_TEXTURE_SIZE"/> >+ <enum name="GL_R8_SNORM"/> >+ <enum name="GL_RG8_SNORM"/> >+ <enum name="GL_RGB8_SNORM"/> >+ <enum name="GL_RGBA8_SNORM"/> >+ <enum name="GL_R16_SNORM"/> >+ <enum name="GL_RG16_SNORM"/> >+ <enum name="GL_RGB16_SNORM"/> >+ <enum name="GL_RGBA16_SNORM"/> >+ <enum name="GL_SIGNED_NORMALIZED"/> >+ <enum name="GL_PRIMITIVE_RESTART"/> >+ <enum name="GL_PRIMITIVE_RESTART_INDEX"/> >+ <command name="glDrawArraysInstanced"/> >+ <command name="glDrawElementsInstanced"/> >+ <command name="glTexBuffer"/> >+ <command name="glPrimitiveRestartIndex"/> >+ </require> >+ <require comment="Reuse ARB_copy_buffer"> >+ <enum name="GL_COPY_READ_BUFFER"/> >+ <enum name="GL_COPY_WRITE_BUFFER"/> >+ <command name="glCopyBufferSubData"/> >+ </require> >+ <require comment="Reuse ARB_uniform_buffer_object"> >+ <enum name="GL_UNIFORM_BUFFER"/> >+ <enum name="GL_UNIFORM_BUFFER_BINDING"/> >+ <enum name="GL_UNIFORM_BUFFER_START"/> >+ <enum name="GL_UNIFORM_BUFFER_SIZE"/> >+ <enum name="GL_MAX_VERTEX_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_GEOMETRY_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_FRAGMENT_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_COMBINED_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_UNIFORM_BUFFER_BINDINGS"/> >+ <enum name="GL_MAX_UNIFORM_BLOCK_SIZE"/> >+ <enum name="GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS"/> >+ <enum name="GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT"/> >+ <enum name="GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH"/> >+ <enum name="GL_ACTIVE_UNIFORM_BLOCKS"/> >+ <enum name="GL_UNIFORM_TYPE"/> >+ <enum name="GL_UNIFORM_SIZE"/> >+ <enum name="GL_UNIFORM_NAME_LENGTH"/> >+ <enum name="GL_UNIFORM_BLOCK_INDEX"/> >+ <enum name="GL_UNIFORM_OFFSET"/> >+ <enum name="GL_UNIFORM_ARRAY_STRIDE"/> >+ <enum name="GL_UNIFORM_MATRIX_STRIDE"/> >+ <enum name="GL_UNIFORM_IS_ROW_MAJOR"/> >+ <enum name="GL_UNIFORM_BLOCK_BINDING"/> >+ <enum name="GL_UNIFORM_BLOCK_DATA_SIZE"/> >+ <enum name="GL_UNIFORM_BLOCK_NAME_LENGTH"/> >+ <enum name="GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS"/> >+ <enum name="GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER"/> >+ <enum name="GL_INVALID_INDEX"/> >+ <command name="glGetUniformIndices"/> >+ <command name="glGetActiveUniformsiv"/> >+ <command name="glGetActiveUniformName"/> >+ <command name="glGetUniformBlockIndex"/> >+ <command name="glGetActiveUniformBlockiv"/> >+ <command name="glGetActiveUniformBlockName"/> >+ <command name="glUniformBlockBinding"/> >+ <command name="glBindBufferRange"/> >+ <command name="glBindBufferBase"/> >+ <command name="glGetIntegeri_v"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_3_2" number="3.2"> >+ <require> >+ <enum name="GL_CONTEXT_CORE_PROFILE_BIT"/> >+ <enum name="GL_CONTEXT_COMPATIBILITY_PROFILE_BIT"/> >+ <enum name="GL_LINES_ADJACENCY"/> >+ <enum name="GL_LINE_STRIP_ADJACENCY"/> >+ <enum name="GL_TRIANGLES_ADJACENCY"/> >+ <enum name="GL_TRIANGLE_STRIP_ADJACENCY"/> >+ <enum name="GL_PROGRAM_POINT_SIZE"/> >+ <enum name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS"/> >+ <enum name="GL_GEOMETRY_SHADER"/> >+ <enum name="GL_GEOMETRY_VERTICES_OUT"/> >+ <enum name="GL_GEOMETRY_INPUT_TYPE"/> >+ <enum name="GL_GEOMETRY_OUTPUT_TYPE"/> >+ <enum name="GL_MAX_GEOMETRY_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_GEOMETRY_OUTPUT_VERTICES"/> >+ <enum name="GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_VERTEX_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_GEOMETRY_INPUT_COMPONENTS"/> >+ <enum name="GL_MAX_GEOMETRY_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_FRAGMENT_INPUT_COMPONENTS"/> >+ <enum name="GL_CONTEXT_PROFILE_MASK"/> >+ </require> >+ <require comment="Reuse ARB_depth_clamp"> >+ <enum name="GL_DEPTH_CLAMP"/> >+ </require> >+ <require comment="Reuse ARB_draw_elements_base_vertex"> >+ <command name="glDrawElementsBaseVertex"/> >+ <command name="glDrawRangeElementsBaseVertex"/> >+ <command name="glDrawElementsInstancedBaseVertex"/> >+ <command name="glMultiDrawElementsBaseVertex"/> >+ </require> >+ <require comment="Reuse ARB_fragment_coord_conventions (none)"> >+ </require> >+ <require comment="Reuse ARB_provoking_vertex"> >+ <enum name="GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION"/> >+ <enum name="GL_FIRST_VERTEX_CONVENTION"/> >+ <enum name="GL_LAST_VERTEX_CONVENTION"/> >+ <enum name="GL_PROVOKING_VERTEX"/> >+ <command name="glProvokingVertex"/> >+ </require> >+ <require comment="Reuse ARB_seamless_cube_map"> >+ <enum name="GL_TEXTURE_CUBE_MAP_SEAMLESS"/> >+ </require> >+ <require comment="Reuse ARB_sync"> >+ <enum name="GL_MAX_SERVER_WAIT_TIMEOUT"/> >+ <enum name="GL_OBJECT_TYPE"/> >+ <enum name="GL_SYNC_CONDITION"/> >+ <enum name="GL_SYNC_STATUS"/> >+ <enum name="GL_SYNC_FLAGS"/> >+ <enum name="GL_SYNC_FENCE"/> >+ <enum name="GL_SYNC_GPU_COMMANDS_COMPLETE"/> >+ <enum name="GL_UNSIGNALED"/> >+ <enum name="GL_SIGNALED"/> >+ <enum name="GL_ALREADY_SIGNALED"/> >+ <enum name="GL_TIMEOUT_EXPIRED"/> >+ <enum name="GL_CONDITION_SATISFIED"/> >+ <enum name="GL_WAIT_FAILED"/> >+ <enum name="GL_TIMEOUT_IGNORED"/> >+ <enum name="GL_SYNC_FLUSH_COMMANDS_BIT"/> >+ <command name="glFenceSync"/> >+ <command name="glIsSync"/> >+ <command name="glDeleteSync"/> >+ <command name="glClientWaitSync"/> >+ <command name="glWaitSync"/> >+ <command name="glGetInteger64v"/> >+ <command name="glGetSynciv"/> >+ </require> >+ <require comment="Reuse ARB_texture_multisample"> >+ <enum name="GL_SAMPLE_POSITION"/> >+ <enum name="GL_SAMPLE_MASK"/> >+ <enum name="GL_SAMPLE_MASK_VALUE"/> >+ <enum name="GL_MAX_SAMPLE_MASK_WORDS"/> >+ <enum name="GL_TEXTURE_2D_MULTISAMPLE"/> >+ <enum name="GL_PROXY_TEXTURE_2D_MULTISAMPLE"/> >+ <enum name="GL_TEXTURE_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_2D_MULTISAMPLE"/> >+ <enum name="GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_TEXTURE_SAMPLES"/> >+ <enum name="GL_TEXTURE_FIXED_SAMPLE_LOCATIONS"/> >+ <enum name="GL_SAMPLER_2D_MULTISAMPLE"/> >+ <enum name="GL_INT_SAMPLER_2D_MULTISAMPLE"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE"/> >+ <enum name="GL_SAMPLER_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_MAX_COLOR_TEXTURE_SAMPLES"/> >+ <enum name="GL_MAX_DEPTH_TEXTURE_SAMPLES"/> >+ <enum name="GL_MAX_INTEGER_SAMPLES"/> >+ <!-- /* Don't need to reuse tokens from ARB_vertex_array_bgra since they're already in 1.2 core */ --> >+ <command name="glGetInteger64i_v"/> >+ <command name="glGetBufferParameteri64v"/> >+ <command name="glFramebufferTexture"/> >+ <command name="glTexImage2DMultisample"/> >+ <command name="glTexImage3DMultisample"/> >+ <command name="glGetMultisamplefv"/> >+ <command name="glSampleMaski"/> >+ </require> >+ <!-- OpenGL 3.2 is where core and compatibility profiles were first >+ introduced, so many, many things were removed from the core >+ profile in this version. A few were reintroduced later (e.g. >+ GetPointerv / STACK_{UNDER,OVER}FLOW by OpenGL 4.3 for debug >+ functionality). --> >+ <remove profile="core" comment="Compatibility-only GL 1.0 features removed from GL 3.2"> >+ <command name="glNewList"/> >+ <command name="glEndList"/> >+ <command name="glCallList"/> >+ <command name="glCallLists"/> >+ <command name="glDeleteLists"/> >+ <command name="glGenLists"/> >+ <command name="glListBase"/> >+ <command name="glBegin"/> >+ <command name="glBitmap"/> >+ <command name="glColor3b"/> >+ <command name="glColor3bv"/> >+ <command name="glColor3d"/> >+ <command name="glColor3dv"/> >+ <command name="glColor3f"/> >+ <command name="glColor3fv"/> >+ <command name="glColor3i"/> >+ <command name="glColor3iv"/> >+ <command name="glColor3s"/> >+ <command name="glColor3sv"/> >+ <command name="glColor3ub"/> >+ <command name="glColor3ubv"/> >+ <command name="glColor3ui"/> >+ <command name="glColor3uiv"/> >+ <command name="glColor3us"/> >+ <command name="glColor3usv"/> >+ <command name="glColor4b"/> >+ <command name="glColor4bv"/> >+ <command name="glColor4d"/> >+ <command name="glColor4dv"/> >+ <command name="glColor4f"/> >+ <command name="glColor4fv"/> >+ <command name="glColor4i"/> >+ <command name="glColor4iv"/> >+ <command name="glColor4s"/> >+ <command name="glColor4sv"/> >+ <command name="glColor4ub"/> >+ <command name="glColor4ubv"/> >+ <command name="glColor4ui"/> >+ <command name="glColor4uiv"/> >+ <command name="glColor4us"/> >+ <command name="glColor4usv"/> >+ <command name="glEdgeFlag"/> >+ <command name="glEdgeFlagv"/> >+ <command name="glEnd"/> >+ <command name="glIndexd"/> >+ <command name="glIndexdv"/> >+ <command name="glIndexf"/> >+ <command name="glIndexfv"/> >+ <command name="glIndexi"/> >+ <command name="glIndexiv"/> >+ <command name="glIndexs"/> >+ <command name="glIndexsv"/> >+ <command name="glNormal3b"/> >+ <command name="glNormal3bv"/> >+ <command name="glNormal3d"/> >+ <command name="glNormal3dv"/> >+ <command name="glNormal3f"/> >+ <command name="glNormal3fv"/> >+ <command name="glNormal3i"/> >+ <command name="glNormal3iv"/> >+ <command name="glNormal3s"/> >+ <command name="glNormal3sv"/> >+ <command name="glRasterPos2d"/> >+ <command name="glRasterPos2dv"/> >+ <command name="glRasterPos2f"/> >+ <command name="glRasterPos2fv"/> >+ <command name="glRasterPos2i"/> >+ <command name="glRasterPos2iv"/> >+ <command name="glRasterPos2s"/> >+ <command name="glRasterPos2sv"/> >+ <command name="glRasterPos3d"/> >+ <command name="glRasterPos3dv"/> >+ <command name="glRasterPos3f"/> >+ <command name="glRasterPos3fv"/> >+ <command name="glRasterPos3i"/> >+ <command name="glRasterPos3iv"/> >+ <command name="glRasterPos3s"/> >+ <command name="glRasterPos3sv"/> >+ <command name="glRasterPos4d"/> >+ <command name="glRasterPos4dv"/> >+ <command name="glRasterPos4f"/> >+ <command name="glRasterPos4fv"/> >+ <command name="glRasterPos4i"/> >+ <command name="glRasterPos4iv"/> >+ <command name="glRasterPos4s"/> >+ <command name="glRasterPos4sv"/> >+ <command name="glRectd"/> >+ <command name="glRectdv"/> >+ <command name="glRectf"/> >+ <command name="glRectfv"/> >+ <command name="glRecti"/> >+ <command name="glRectiv"/> >+ <command name="glRects"/> >+ <command name="glRectsv"/> >+ <command name="glTexCoord1d"/> >+ <command name="glTexCoord1dv"/> >+ <command name="glTexCoord1f"/> >+ <command name="glTexCoord1fv"/> >+ <command name="glTexCoord1i"/> >+ <command name="glTexCoord1iv"/> >+ <command name="glTexCoord1s"/> >+ <command name="glTexCoord1sv"/> >+ <command name="glTexCoord2d"/> >+ <command name="glTexCoord2dv"/> >+ <command name="glTexCoord2f"/> >+ <command name="glTexCoord2fv"/> >+ <command name="glTexCoord2i"/> >+ <command name="glTexCoord2iv"/> >+ <command name="glTexCoord2s"/> >+ <command name="glTexCoord2sv"/> >+ <command name="glTexCoord3d"/> >+ <command name="glTexCoord3dv"/> >+ <command name="glTexCoord3f"/> >+ <command name="glTexCoord3fv"/> >+ <command name="glTexCoord3i"/> >+ <command name="glTexCoord3iv"/> >+ <command name="glTexCoord3s"/> >+ <command name="glTexCoord3sv"/> >+ <command name="glTexCoord4d"/> >+ <command name="glTexCoord4dv"/> >+ <command name="glTexCoord4f"/> >+ <command name="glTexCoord4fv"/> >+ <command name="glTexCoord4i"/> >+ <command name="glTexCoord4iv"/> >+ <command name="glTexCoord4s"/> >+ <command name="glTexCoord4sv"/> >+ <command name="glVertex2d"/> >+ <command name="glVertex2dv"/> >+ <command name="glVertex2f"/> >+ <command name="glVertex2fv"/> >+ <command name="glVertex2i"/> >+ <command name="glVertex2iv"/> >+ <command name="glVertex2s"/> >+ <command name="glVertex2sv"/> >+ <command name="glVertex3d"/> >+ <command name="glVertex3dv"/> >+ <command name="glVertex3f"/> >+ <command name="glVertex3fv"/> >+ <command name="glVertex3i"/> >+ <command name="glVertex3iv"/> >+ <command name="glVertex3s"/> >+ <command name="glVertex3sv"/> >+ <command name="glVertex4d"/> >+ <command name="glVertex4dv"/> >+ <command name="glVertex4f"/> >+ <command name="glVertex4fv"/> >+ <command name="glVertex4i"/> >+ <command name="glVertex4iv"/> >+ <command name="glVertex4s"/> >+ <command name="glVertex4sv"/> >+ <command name="glClipPlane"/> >+ <command name="glColorMaterial"/> >+ <command name="glFogf"/> >+ <command name="glFogfv"/> >+ <command name="glFogi"/> >+ <command name="glFogiv"/> >+ <command name="glLightf"/> >+ <command name="glLightfv"/> >+ <command name="glLighti"/> >+ <command name="glLightiv"/> >+ <command name="glLightModelf"/> >+ <command name="glLightModelfv"/> >+ <command name="glLightModeli"/> >+ <command name="glLightModeliv"/> >+ <command name="glLineStipple"/> >+ <command name="glMaterialf"/> >+ <command name="glMaterialfv"/> >+ <command name="glMateriali"/> >+ <command name="glMaterialiv"/> >+ <command name="glPolygonStipple"/> >+ <command name="glShadeModel"/> >+ <command name="glTexEnvf"/> >+ <command name="glTexEnvfv"/> >+ <command name="glTexEnvi"/> >+ <command name="glTexEnviv"/> >+ <command name="glTexGend"/> >+ <command name="glTexGendv"/> >+ <command name="glTexGenf"/> >+ <command name="glTexGenfv"/> >+ <command name="glTexGeni"/> >+ <command name="glTexGeniv"/> >+ <command name="glFeedbackBuffer"/> >+ <command name="glSelectBuffer"/> >+ <command name="glRenderMode"/> >+ <command name="glInitNames"/> >+ <command name="glLoadName"/> >+ <command name="glPassThrough"/> >+ <command name="glPopName"/> >+ <command name="glPushName"/> >+ <command name="glClearAccum"/> >+ <command name="glClearIndex"/> >+ <command name="glIndexMask"/> >+ <command name="glAccum"/> >+ <command name="glPopAttrib"/> >+ <command name="glPushAttrib"/> >+ <command name="glMap1d"/> >+ <command name="glMap1f"/> >+ <command name="glMap2d"/> >+ <command name="glMap2f"/> >+ <command name="glMapGrid1d"/> >+ <command name="glMapGrid1f"/> >+ <command name="glMapGrid2d"/> >+ <command name="glMapGrid2f"/> >+ <command name="glEvalCoord1d"/> >+ <command name="glEvalCoord1dv"/> >+ <command name="glEvalCoord1f"/> >+ <command name="glEvalCoord1fv"/> >+ <command name="glEvalCoord2d"/> >+ <command name="glEvalCoord2dv"/> >+ <command name="glEvalCoord2f"/> >+ <command name="glEvalCoord2fv"/> >+ <command name="glEvalMesh1"/> >+ <command name="glEvalPoint1"/> >+ <command name="glEvalMesh2"/> >+ <command name="glEvalPoint2"/> >+ <command name="glAlphaFunc"/> >+ <command name="glPixelZoom"/> >+ <command name="glPixelTransferf"/> >+ <command name="glPixelTransferi"/> >+ <command name="glPixelMapfv"/> >+ <command name="glPixelMapuiv"/> >+ <command name="glPixelMapusv"/> >+ <command name="glCopyPixels"/> >+ <command name="glDrawPixels"/> >+ <command name="glGetClipPlane"/> >+ <command name="glGetLightfv"/> >+ <command name="glGetLightiv"/> >+ <command name="glGetMapdv"/> >+ <command name="glGetMapfv"/> >+ <command name="glGetMapiv"/> >+ <command name="glGetMaterialfv"/> >+ <command name="glGetMaterialiv"/> >+ <command name="glGetPixelMapfv"/> >+ <command name="glGetPixelMapuiv"/> >+ <command name="glGetPixelMapusv"/> >+ <command name="glGetPolygonStipple"/> >+ <command name="glGetTexEnvfv"/> >+ <command name="glGetTexEnviv"/> >+ <command name="glGetTexGendv"/> >+ <command name="glGetTexGenfv"/> >+ <command name="glGetTexGeniv"/> >+ <command name="glIsList"/> >+ <command name="glFrustum"/> >+ <command name="glLoadIdentity"/> >+ <command name="glLoadMatrixf"/> >+ <command name="glLoadMatrixd"/> >+ <command name="glMatrixMode"/> >+ <command name="glMultMatrixf"/> >+ <command name="glMultMatrixd"/> >+ <command name="glOrtho"/> >+ <command name="glPopMatrix"/> >+ <command name="glPushMatrix"/> >+ <command name="glRotated"/> >+ <command name="glRotatef"/> >+ <command name="glScaled"/> >+ <command name="glScalef"/> >+ <command name="glTranslated"/> >+ <command name="glTranslatef"/> >+ </remove> >+ <remove profile="core" comment="Compatibility-only GL 1.1 features removed from GL 3.2"> >+ <enum name="GL_CURRENT_BIT"/> >+ <enum name="GL_POINT_BIT"/> >+ <enum name="GL_LINE_BIT"/> >+ <enum name="GL_POLYGON_BIT"/> >+ <enum name="GL_POLYGON_STIPPLE_BIT"/> >+ <enum name="GL_PIXEL_MODE_BIT"/> >+ <enum name="GL_LIGHTING_BIT"/> >+ <enum name="GL_FOG_BIT"/> >+ <enum name="GL_ACCUM_BUFFER_BIT"/> >+ <enum name="GL_VIEWPORT_BIT"/> >+ <enum name="GL_TRANSFORM_BIT"/> >+ <enum name="GL_ENABLE_BIT"/> >+ <enum name="GL_HINT_BIT"/> >+ <enum name="GL_EVAL_BIT"/> >+ <enum name="GL_LIST_BIT"/> >+ <enum name="GL_TEXTURE_BIT"/> >+ <enum name="GL_SCISSOR_BIT"/> >+ <enum name="GL_ALL_ATTRIB_BITS"/> >+ <enum name="GL_CLIENT_PIXEL_STORE_BIT"/> >+ <enum name="GL_CLIENT_VERTEX_ARRAY_BIT"/> >+ <enum name="GL_CLIENT_ALL_ATTRIB_BITS"/> >+ <enum name="GL_QUAD_STRIP"/> >+ <enum name="GL_QUADS"/> >+ <enum name="GL_POLYGON"/> >+ <enum name="GL_ACCUM"/> >+ <enum name="GL_LOAD"/> >+ <enum name="GL_RETURN"/> >+ <enum name="GL_MULT"/> >+ <enum name="GL_ADD"/> >+ <enum name="GL_STACK_OVERFLOW"/> >+ <enum name="GL_STACK_UNDERFLOW"/> >+ <enum name="GL_AUX0"/> >+ <enum name="GL_AUX1"/> >+ <enum name="GL_AUX2"/> >+ <enum name="GL_AUX3"/> >+ <enum name="GL_2D"/> >+ <enum name="GL_3D"/> >+ <enum name="GL_3D_COLOR"/> >+ <enum name="GL_3D_COLOR_TEXTURE"/> >+ <enum name="GL_4D_COLOR_TEXTURE"/> >+ <enum name="GL_PASS_THROUGH_TOKEN"/> >+ <enum name="GL_POINT_TOKEN"/> >+ <enum name="GL_LINE_TOKEN"/> >+ <enum name="GL_POLYGON_TOKEN"/> >+ <enum name="GL_BITMAP_TOKEN"/> >+ <enum name="GL_DRAW_PIXEL_TOKEN"/> >+ <enum name="GL_COPY_PIXEL_TOKEN"/> >+ <enum name="GL_LINE_RESET_TOKEN"/> >+ <enum name="GL_EXP"/> >+ <enum name="GL_EXP2"/> >+ <enum name="GL_COEFF"/> >+ <enum name="GL_ORDER"/> >+ <enum name="GL_DOMAIN"/> >+ <enum name="GL_PIXEL_MAP_I_TO_I"/> >+ <enum name="GL_PIXEL_MAP_S_TO_S"/> >+ <enum name="GL_PIXEL_MAP_I_TO_R"/> >+ <enum name="GL_PIXEL_MAP_I_TO_G"/> >+ <enum name="GL_PIXEL_MAP_I_TO_B"/> >+ <enum name="GL_PIXEL_MAP_I_TO_A"/> >+ <enum name="GL_PIXEL_MAP_R_TO_R"/> >+ <enum name="GL_PIXEL_MAP_G_TO_G"/> >+ <enum name="GL_PIXEL_MAP_B_TO_B"/> >+ <enum name="GL_PIXEL_MAP_A_TO_A"/> >+ <enum name="GL_VERTEX_ARRAY_POINTER"/> >+ <enum name="GL_NORMAL_ARRAY_POINTER"/> >+ <enum name="GL_COLOR_ARRAY_POINTER"/> >+ <enum name="GL_INDEX_ARRAY_POINTER"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_POINTER"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_POINTER"/> >+ <enum name="GL_FEEDBACK_BUFFER_POINTER"/> >+ <enum name="GL_SELECTION_BUFFER_POINTER"/> >+ <enum name="GL_CURRENT_COLOR"/> >+ <enum name="GL_CURRENT_INDEX"/> >+ <enum name="GL_CURRENT_NORMAL"/> >+ <enum name="GL_CURRENT_TEXTURE_COORDS"/> >+ <enum name="GL_CURRENT_RASTER_COLOR"/> >+ <enum name="GL_CURRENT_RASTER_INDEX"/> >+ <enum name="GL_CURRENT_RASTER_TEXTURE_COORDS"/> >+ <enum name="GL_CURRENT_RASTER_POSITION"/> >+ <enum name="GL_CURRENT_RASTER_POSITION_VALID"/> >+ <enum name="GL_CURRENT_RASTER_DISTANCE"/> >+ <enum name="GL_POINT_SMOOTH"/> >+ <enum name="GL_LINE_STIPPLE"/> >+ <enum name="GL_LINE_STIPPLE_PATTERN"/> >+ <enum name="GL_LINE_STIPPLE_REPEAT"/> >+ <enum name="GL_LIST_MODE"/> >+ <enum name="GL_MAX_LIST_NESTING"/> >+ <enum name="GL_LIST_BASE"/> >+ <enum name="GL_LIST_INDEX"/> >+ <enum name="GL_POLYGON_STIPPLE"/> >+ <enum name="GL_EDGE_FLAG"/> >+ <enum name="GL_LIGHTING"/> >+ <enum name="GL_LIGHT_MODEL_LOCAL_VIEWER"/> >+ <enum name="GL_LIGHT_MODEL_TWO_SIDE"/> >+ <enum name="GL_LIGHT_MODEL_AMBIENT"/> >+ <enum name="GL_SHADE_MODEL"/> >+ <enum name="GL_COLOR_MATERIAL_FACE"/> >+ <enum name="GL_COLOR_MATERIAL_PARAMETER"/> >+ <enum name="GL_COLOR_MATERIAL"/> >+ <enum name="GL_FOG"/> >+ <enum name="GL_FOG_INDEX"/> >+ <enum name="GL_FOG_DENSITY"/> >+ <enum name="GL_FOG_START"/> >+ <enum name="GL_FOG_END"/> >+ <enum name="GL_FOG_MODE"/> >+ <enum name="GL_FOG_COLOR"/> >+ <enum name="GL_ACCUM_CLEAR_VALUE"/> >+ <enum name="GL_MATRIX_MODE"/> >+ <enum name="GL_NORMALIZE"/> >+ <enum name="GL_MODELVIEW_STACK_DEPTH"/> >+ <enum name="GL_PROJECTION_STACK_DEPTH"/> >+ <enum name="GL_TEXTURE_STACK_DEPTH"/> >+ <enum name="GL_MODELVIEW_MATRIX"/> >+ <enum name="GL_PROJECTION_MATRIX"/> >+ <enum name="GL_TEXTURE_MATRIX"/> >+ <enum name="GL_ATTRIB_STACK_DEPTH"/> >+ <enum name="GL_CLIENT_ATTRIB_STACK_DEPTH"/> >+ <enum name="GL_ALPHA_TEST"/> >+ <enum name="GL_ALPHA_TEST_FUNC"/> >+ <enum name="GL_ALPHA_TEST_REF"/> >+ <enum name="GL_INDEX_LOGIC_OP"/> >+ <enum name="GL_LOGIC_OP"/> >+ <enum name="GL_AUX_BUFFERS"/> >+ <enum name="GL_INDEX_CLEAR_VALUE"/> >+ <enum name="GL_INDEX_WRITEMASK"/> >+ <enum name="GL_INDEX_MODE"/> >+ <enum name="GL_RGBA_MODE"/> >+ <enum name="GL_RENDER_MODE"/> >+ <enum name="GL_PERSPECTIVE_CORRECTION_HINT"/> >+ <enum name="GL_POINT_SMOOTH_HINT"/> >+ <enum name="GL_FOG_HINT"/> >+ <enum name="GL_TEXTURE_GEN_S"/> >+ <enum name="GL_TEXTURE_GEN_T"/> >+ <enum name="GL_TEXTURE_GEN_R"/> >+ <enum name="GL_TEXTURE_GEN_Q"/> >+ <enum name="GL_PIXEL_MAP_I_TO_I_SIZE"/> >+ <enum name="GL_PIXEL_MAP_S_TO_S_SIZE"/> >+ <enum name="GL_PIXEL_MAP_I_TO_R_SIZE"/> >+ <enum name="GL_PIXEL_MAP_I_TO_G_SIZE"/> >+ <enum name="GL_PIXEL_MAP_I_TO_B_SIZE"/> >+ <enum name="GL_PIXEL_MAP_I_TO_A_SIZE"/> >+ <enum name="GL_PIXEL_MAP_R_TO_R_SIZE"/> >+ <enum name="GL_PIXEL_MAP_G_TO_G_SIZE"/> >+ <enum name="GL_PIXEL_MAP_B_TO_B_SIZE"/> >+ <enum name="GL_PIXEL_MAP_A_TO_A_SIZE"/> >+ <enum name="GL_MAP_COLOR"/> >+ <enum name="GL_MAP_STENCIL"/> >+ <enum name="GL_INDEX_SHIFT"/> >+ <enum name="GL_INDEX_OFFSET"/> >+ <enum name="GL_RED_SCALE"/> >+ <enum name="GL_RED_BIAS"/> >+ <enum name="GL_ZOOM_X"/> >+ <enum name="GL_ZOOM_Y"/> >+ <enum name="GL_GREEN_SCALE"/> >+ <enum name="GL_GREEN_BIAS"/> >+ <enum name="GL_BLUE_SCALE"/> >+ <enum name="GL_BLUE_BIAS"/> >+ <enum name="GL_ALPHA_SCALE"/> >+ <enum name="GL_ALPHA_BIAS"/> >+ <enum name="GL_DEPTH_SCALE"/> >+ <enum name="GL_DEPTH_BIAS"/> >+ <enum name="GL_MAX_EVAL_ORDER"/> >+ <enum name="GL_MAX_LIGHTS"/> >+ <enum name="GL_MAX_CLIP_PLANES"/> >+ <enum name="GL_MAX_PIXEL_MAP_TABLE"/> >+ <enum name="GL_MAX_ATTRIB_STACK_DEPTH"/> >+ <enum name="GL_MAX_MODELVIEW_STACK_DEPTH"/> >+ <enum name="GL_MAX_NAME_STACK_DEPTH"/> >+ <enum name="GL_MAX_PROJECTION_STACK_DEPTH"/> >+ <enum name="GL_MAX_TEXTURE_STACK_DEPTH"/> >+ <enum name="GL_MAX_CLIENT_ATTRIB_STACK_DEPTH"/> >+ <enum name="GL_INDEX_BITS"/> >+ <enum name="GL_RED_BITS"/> >+ <enum name="GL_GREEN_BITS"/> >+ <enum name="GL_BLUE_BITS"/> >+ <enum name="GL_ALPHA_BITS"/> >+ <enum name="GL_DEPTH_BITS"/> >+ <enum name="GL_STENCIL_BITS"/> >+ <enum name="GL_ACCUM_RED_BITS"/> >+ <enum name="GL_ACCUM_GREEN_BITS"/> >+ <enum name="GL_ACCUM_BLUE_BITS"/> >+ <enum name="GL_ACCUM_ALPHA_BITS"/> >+ <enum name="GL_NAME_STACK_DEPTH"/> >+ <enum name="GL_AUTO_NORMAL"/> >+ <enum name="GL_MAP1_COLOR_4"/> >+ <enum name="GL_MAP1_INDEX"/> >+ <enum name="GL_MAP1_NORMAL"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_1"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_2"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_3"/> >+ <enum name="GL_MAP1_TEXTURE_COORD_4"/> >+ <enum name="GL_MAP1_VERTEX_3"/> >+ <enum name="GL_MAP1_VERTEX_4"/> >+ <enum name="GL_MAP2_COLOR_4"/> >+ <enum name="GL_MAP2_INDEX"/> >+ <enum name="GL_MAP2_NORMAL"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_1"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_2"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_3"/> >+ <enum name="GL_MAP2_TEXTURE_COORD_4"/> >+ <enum name="GL_MAP2_VERTEX_3"/> >+ <enum name="GL_MAP2_VERTEX_4"/> >+ <enum name="GL_MAP1_GRID_DOMAIN"/> >+ <enum name="GL_MAP1_GRID_SEGMENTS"/> >+ <enum name="GL_MAP2_GRID_DOMAIN"/> >+ <enum name="GL_MAP2_GRID_SEGMENTS"/> >+ <enum name="GL_FEEDBACK_BUFFER_SIZE"/> >+ <enum name="GL_FEEDBACK_BUFFER_TYPE"/> >+ <enum name="GL_SELECTION_BUFFER_SIZE"/> >+ <enum name="GL_VERTEX_ARRAY"/> >+ <enum name="GL_NORMAL_ARRAY"/> >+ <enum name="GL_COLOR_ARRAY"/> >+ <enum name="GL_INDEX_ARRAY"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY"/> >+ <enum name="GL_EDGE_FLAG_ARRAY"/> >+ <enum name="GL_VERTEX_ARRAY_SIZE"/> >+ <enum name="GL_VERTEX_ARRAY_TYPE"/> >+ <enum name="GL_VERTEX_ARRAY_STRIDE"/> >+ <enum name="GL_NORMAL_ARRAY_TYPE"/> >+ <enum name="GL_NORMAL_ARRAY_STRIDE"/> >+ <enum name="GL_COLOR_ARRAY_SIZE"/> >+ <enum name="GL_COLOR_ARRAY_TYPE"/> >+ <enum name="GL_COLOR_ARRAY_STRIDE"/> >+ <enum name="GL_INDEX_ARRAY_TYPE"/> >+ <enum name="GL_INDEX_ARRAY_STRIDE"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_SIZE"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_TYPE"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_STRIDE"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_STRIDE"/> >+ <enum name="GL_TEXTURE_COMPONENTS"/> >+ <enum name="GL_TEXTURE_BORDER"/> >+ <enum name="GL_TEXTURE_LUMINANCE_SIZE"/> >+ <enum name="GL_TEXTURE_INTENSITY_SIZE"/> >+ <enum name="GL_TEXTURE_PRIORITY"/> >+ <enum name="GL_TEXTURE_RESIDENT"/> >+ <enum name="GL_AMBIENT"/> >+ <enum name="GL_DIFFUSE"/> >+ <enum name="GL_SPECULAR"/> >+ <enum name="GL_POSITION"/> >+ <enum name="GL_SPOT_DIRECTION"/> >+ <enum name="GL_SPOT_EXPONENT"/> >+ <enum name="GL_SPOT_CUTOFF"/> >+ <enum name="GL_CONSTANT_ATTENUATION"/> >+ <enum name="GL_LINEAR_ATTENUATION"/> >+ <enum name="GL_QUADRATIC_ATTENUATION"/> >+ <enum name="GL_COMPILE"/> >+ <enum name="GL_COMPILE_AND_EXECUTE"/> >+ <enum name="GL_2_BYTES"/> >+ <enum name="GL_3_BYTES"/> >+ <enum name="GL_4_BYTES"/> >+ <enum name="GL_EMISSION"/> >+ <enum name="GL_SHININESS"/> >+ <enum name="GL_AMBIENT_AND_DIFFUSE"/> >+ <enum name="GL_COLOR_INDEXES"/> >+ <enum name="GL_MODELVIEW"/> >+ <enum name="GL_PROJECTION"/> >+ <enum name="GL_COLOR_INDEX"/> >+ <enum name="GL_LUMINANCE"/> >+ <enum name="GL_LUMINANCE_ALPHA"/> >+ <enum name="GL_BITMAP"/> >+ <enum name="GL_RENDER"/> >+ <enum name="GL_FEEDBACK"/> >+ <enum name="GL_SELECT"/> >+ <enum name="GL_FLAT"/> >+ <enum name="GL_SMOOTH"/> >+ <enum name="GL_S"/> >+ <enum name="GL_T"/> >+ <enum name="GL_R"/> >+ <enum name="GL_Q"/> >+ <enum name="GL_MODULATE"/> >+ <enum name="GL_DECAL"/> >+ <enum name="GL_TEXTURE_ENV_MODE"/> >+ <enum name="GL_TEXTURE_ENV_COLOR"/> >+ <enum name="GL_TEXTURE_ENV"/> >+ <enum name="GL_EYE_LINEAR"/> >+ <enum name="GL_OBJECT_LINEAR"/> >+ <enum name="GL_SPHERE_MAP"/> >+ <enum name="GL_TEXTURE_GEN_MODE"/> >+ <enum name="GL_OBJECT_PLANE"/> >+ <enum name="GL_EYE_PLANE"/> >+ <enum name="GL_CLAMP"/> >+ <enum name="GL_ALPHA4"/> >+ <enum name="GL_ALPHA8"/> >+ <enum name="GL_ALPHA12"/> >+ <enum name="GL_ALPHA16"/> >+ <enum name="GL_LUMINANCE4"/> >+ <enum name="GL_LUMINANCE8"/> >+ <enum name="GL_LUMINANCE12"/> >+ <enum name="GL_LUMINANCE16"/> >+ <enum name="GL_LUMINANCE4_ALPHA4"/> >+ <enum name="GL_LUMINANCE6_ALPHA2"/> >+ <enum name="GL_LUMINANCE8_ALPHA8"/> >+ <enum name="GL_LUMINANCE12_ALPHA4"/> >+ <enum name="GL_LUMINANCE12_ALPHA12"/> >+ <enum name="GL_LUMINANCE16_ALPHA16"/> >+ <enum name="GL_INTENSITY"/> >+ <enum name="GL_INTENSITY4"/> >+ <enum name="GL_INTENSITY8"/> >+ <enum name="GL_INTENSITY12"/> >+ <enum name="GL_INTENSITY16"/> >+ <enum name="GL_V2F"/> >+ <enum name="GL_V3F"/> >+ <enum name="GL_C4UB_V2F"/> >+ <enum name="GL_C4UB_V3F"/> >+ <enum name="GL_C3F_V3F"/> >+ <enum name="GL_N3F_V3F"/> >+ <enum name="GL_C4F_N3F_V3F"/> >+ <enum name="GL_T2F_V3F"/> >+ <enum name="GL_T4F_V4F"/> >+ <enum name="GL_T2F_C4UB_V3F"/> >+ <enum name="GL_T2F_C3F_V3F"/> >+ <enum name="GL_T2F_N3F_V3F"/> >+ <enum name="GL_T2F_C4F_N3F_V3F"/> >+ <enum name="GL_T4F_C4F_N3F_V4F"/> >+ <enum name="GL_CLIP_PLANE0"/> >+ <enum name="GL_CLIP_PLANE1"/> >+ <enum name="GL_CLIP_PLANE2"/> >+ <enum name="GL_CLIP_PLANE3"/> >+ <enum name="GL_CLIP_PLANE4"/> >+ <enum name="GL_CLIP_PLANE5"/> >+ <enum name="GL_LIGHT0"/> >+ <enum name="GL_LIGHT1"/> >+ <enum name="GL_LIGHT2"/> >+ <enum name="GL_LIGHT3"/> >+ <enum name="GL_LIGHT4"/> >+ <enum name="GL_LIGHT5"/> >+ <enum name="GL_LIGHT6"/> >+ <enum name="GL_LIGHT7"/> >+ <command name="glArrayElement"/> >+ <command name="glColorPointer"/> >+ <command name="glDisableClientState"/> >+ <command name="glEdgeFlagPointer"/> >+ <command name="glEnableClientState"/> >+ <command name="glIndexPointer"/> >+ <command name="glGetPointerv"/> >+ <command name="glInterleavedArrays"/> >+ <command name="glNormalPointer"/> >+ <command name="glTexCoordPointer"/> >+ <command name="glVertexPointer"/> >+ <command name="glAreTexturesResident"/> >+ <command name="glPrioritizeTextures"/> >+ <command name="glIndexub"/> >+ <command name="glIndexubv"/> >+ <command name="glPopClientAttrib"/> >+ <command name="glPushClientAttrib"/> >+ </remove> >+ <remove profile="core" comment="Compatibility-only GL 1.2 features removed from GL 3.2"> >+ <enum name="GL_RESCALE_NORMAL"/> >+ <enum name="GL_LIGHT_MODEL_COLOR_CONTROL"/> >+ <enum name="GL_SINGLE_COLOR"/> >+ <enum name="GL_SEPARATE_SPECULAR_COLOR"/> >+ <enum name="GL_ALIASED_POINT_SIZE_RANGE"/> >+ </remove> >+ <remove profile="core" comment="Compatibility-only GL 1.3 features removed from GL 3.2"> >+ <enum name="GL_CLIENT_ACTIVE_TEXTURE"/> >+ <enum name="GL_MAX_TEXTURE_UNITS"/> >+ <enum name="GL_TRANSPOSE_MODELVIEW_MATRIX"/> >+ <enum name="GL_TRANSPOSE_PROJECTION_MATRIX"/> >+ <enum name="GL_TRANSPOSE_TEXTURE_MATRIX"/> >+ <enum name="GL_TRANSPOSE_COLOR_MATRIX"/> >+ <enum name="GL_MULTISAMPLE_BIT"/> >+ <enum name="GL_NORMAL_MAP"/> >+ <enum name="GL_REFLECTION_MAP"/> >+ <enum name="GL_COMPRESSED_ALPHA"/> >+ <enum name="GL_COMPRESSED_LUMINANCE"/> >+ <enum name="GL_COMPRESSED_LUMINANCE_ALPHA"/> >+ <enum name="GL_COMPRESSED_INTENSITY"/> >+ <enum name="GL_COMBINE"/> >+ <enum name="GL_COMBINE_RGB"/> >+ <enum name="GL_COMBINE_ALPHA"/> >+ <enum name="GL_SOURCE0_RGB"/> >+ <enum name="GL_SOURCE1_RGB"/> >+ <enum name="GL_SOURCE2_RGB"/> >+ <enum name="GL_SOURCE0_ALPHA"/> >+ <enum name="GL_SOURCE1_ALPHA"/> >+ <enum name="GL_SOURCE2_ALPHA"/> >+ <enum name="GL_OPERAND0_RGB"/> >+ <enum name="GL_OPERAND1_RGB"/> >+ <enum name="GL_OPERAND2_RGB"/> >+ <enum name="GL_OPERAND0_ALPHA"/> >+ <enum name="GL_OPERAND1_ALPHA"/> >+ <enum name="GL_OPERAND2_ALPHA"/> >+ <enum name="GL_RGB_SCALE"/> >+ <enum name="GL_ADD_SIGNED"/> >+ <enum name="GL_INTERPOLATE"/> >+ <enum name="GL_SUBTRACT"/> >+ <enum name="GL_CONSTANT"/> >+ <enum name="GL_PRIMARY_COLOR"/> >+ <enum name="GL_PREVIOUS"/> >+ <enum name="GL_DOT3_RGB"/> >+ <enum name="GL_DOT3_RGBA"/> >+ <command name="glClientActiveTexture"/> >+ <command name="glMultiTexCoord1d"/> >+ <command name="glMultiTexCoord1dv"/> >+ <command name="glMultiTexCoord1f"/> >+ <command name="glMultiTexCoord1fv"/> >+ <command name="glMultiTexCoord1i"/> >+ <command name="glMultiTexCoord1iv"/> >+ <command name="glMultiTexCoord1s"/> >+ <command name="glMultiTexCoord1sv"/> >+ <command name="glMultiTexCoord2d"/> >+ <command name="glMultiTexCoord2dv"/> >+ <command name="glMultiTexCoord2f"/> >+ <command name="glMultiTexCoord2fv"/> >+ <command name="glMultiTexCoord2i"/> >+ <command name="glMultiTexCoord2iv"/> >+ <command name="glMultiTexCoord2s"/> >+ <command name="glMultiTexCoord2sv"/> >+ <command name="glMultiTexCoord3d"/> >+ <command name="glMultiTexCoord3dv"/> >+ <command name="glMultiTexCoord3f"/> >+ <command name="glMultiTexCoord3fv"/> >+ <command name="glMultiTexCoord3i"/> >+ <command name="glMultiTexCoord3iv"/> >+ <command name="glMultiTexCoord3s"/> >+ <command name="glMultiTexCoord3sv"/> >+ <command name="glMultiTexCoord4d"/> >+ <command name="glMultiTexCoord4dv"/> >+ <command name="glMultiTexCoord4f"/> >+ <command name="glMultiTexCoord4fv"/> >+ <command name="glMultiTexCoord4i"/> >+ <command name="glMultiTexCoord4iv"/> >+ <command name="glMultiTexCoord4s"/> >+ <command name="glMultiTexCoord4sv"/> >+ <command name="glLoadTransposeMatrixf"/> >+ <command name="glLoadTransposeMatrixd"/> >+ <command name="glMultTransposeMatrixf"/> >+ <command name="glMultTransposeMatrixd"/> >+ </remove> >+ <remove profile="core" comment="Compatibility-only GL 1.4 features removed from GL 3.2"> >+ <enum name="GL_POINT_SIZE_MIN"/> >+ <enum name="GL_POINT_SIZE_MAX"/> >+ <enum name="GL_POINT_DISTANCE_ATTENUATION"/> >+ <enum name="GL_GENERATE_MIPMAP"/> >+ <enum name="GL_GENERATE_MIPMAP_HINT"/> >+ <enum name="GL_FOG_COORDINATE_SOURCE"/> >+ <enum name="GL_FOG_COORDINATE"/> >+ <enum name="GL_FRAGMENT_DEPTH"/> >+ <enum name="GL_CURRENT_FOG_COORDINATE"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_TYPE"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_STRIDE"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_POINTER"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY"/> >+ <enum name="GL_COLOR_SUM"/> >+ <enum name="GL_CURRENT_SECONDARY_COLOR"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_SIZE"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_TYPE"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_STRIDE"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_POINTER"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY"/> >+ <enum name="GL_TEXTURE_FILTER_CONTROL"/> >+ <enum name="GL_DEPTH_TEXTURE_MODE"/> >+ <enum name="GL_COMPARE_R_TO_TEXTURE"/> >+ <command name="glFogCoordf"/> >+ <command name="glFogCoordfv"/> >+ <command name="glFogCoordd"/> >+ <command name="glFogCoorddv"/> >+ <command name="glFogCoordPointer"/> >+ <command name="glSecondaryColor3b"/> >+ <command name="glSecondaryColor3bv"/> >+ <command name="glSecondaryColor3d"/> >+ <command name="glSecondaryColor3dv"/> >+ <command name="glSecondaryColor3f"/> >+ <command name="glSecondaryColor3fv"/> >+ <command name="glSecondaryColor3i"/> >+ <command name="glSecondaryColor3iv"/> >+ <command name="glSecondaryColor3s"/> >+ <command name="glSecondaryColor3sv"/> >+ <command name="glSecondaryColor3ub"/> >+ <command name="glSecondaryColor3ubv"/> >+ <command name="glSecondaryColor3ui"/> >+ <command name="glSecondaryColor3uiv"/> >+ <command name="glSecondaryColor3us"/> >+ <command name="glSecondaryColor3usv"/> >+ <command name="glSecondaryColorPointer"/> >+ <command name="glWindowPos2d"/> >+ <command name="glWindowPos2dv"/> >+ <command name="glWindowPos2f"/> >+ <command name="glWindowPos2fv"/> >+ <command name="glWindowPos2i"/> >+ <command name="glWindowPos2iv"/> >+ <command name="glWindowPos2s"/> >+ <command name="glWindowPos2sv"/> >+ <command name="glWindowPos3d"/> >+ <command name="glWindowPos3dv"/> >+ <command name="glWindowPos3f"/> >+ <command name="glWindowPos3fv"/> >+ <command name="glWindowPos3i"/> >+ <command name="glWindowPos3iv"/> >+ <command name="glWindowPos3s"/> >+ <command name="glWindowPos3sv"/> >+ </remove> >+ <remove profile="core" comment="Compatibility-only GL 1.5 features removed from GL 3.2"> >+ <enum name="GL_VERTEX_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_NORMAL_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_COLOR_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_INDEX_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_WEIGHT_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_FOG_COORD_SRC"/> >+ <enum name="GL_FOG_COORD"/> >+ <enum name="GL_CURRENT_FOG_COORD"/> >+ <enum name="GL_FOG_COORD_ARRAY_TYPE"/> >+ <enum name="GL_FOG_COORD_ARRAY_STRIDE"/> >+ <enum name="GL_FOG_COORD_ARRAY_POINTER"/> >+ <enum name="GL_FOG_COORD_ARRAY"/> >+ <enum name="GL_FOG_COORD_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_SRC0_RGB"/> >+ <enum name="GL_SRC1_RGB"/> >+ <enum name="GL_SRC2_RGB"/> >+ <enum name="GL_SRC0_ALPHA"/> >+ <enum name="GL_SRC2_ALPHA"/> >+ </remove> >+ <remove profile="core" comment="Compatibility-only GL 2.0 features removed from GL 3.2"> >+ <enum name="GL_VERTEX_PROGRAM_TWO_SIDE"/> >+ <enum name="GL_POINT_SPRITE"/> >+ <enum name="GL_COORD_REPLACE"/> >+ <enum name="GL_MAX_TEXTURE_COORDS"/> >+ </remove> >+ <remove profile="core" comment="Compatibility-only GL 2.1 features removed from GL 3.2"> >+ <enum name="GL_CURRENT_RASTER_SECONDARY_COLOR"/> >+ <enum name="GL_SLUMINANCE_ALPHA"/> >+ <enum name="GL_SLUMINANCE8_ALPHA8"/> >+ <enum name="GL_SLUMINANCE"/> >+ <enum name="GL_SLUMINANCE8"/> >+ <enum name="GL_COMPRESSED_SLUMINANCE"/> >+ <enum name="GL_COMPRESSED_SLUMINANCE_ALPHA"/> >+ </remove> >+ <remove profile="core" comment="Compatibility-only GL 3.0 features removed from GL 3.2"> >+ <enum name="GL_CLAMP_VERTEX_COLOR"/> >+ <enum name="GL_CLAMP_FRAGMENT_COLOR"/> >+ <enum name="GL_ALPHA_INTEGER"/> >+ <enum name="GL_TEXTURE_LUMINANCE_TYPE"/> >+ <enum name="GL_TEXTURE_INTENSITY_TYPE"/> >+ </remove> >+ <!-- Deprecated (not removed) in OpenGL 3.2 core; >+ deprecate tag not defined/supported yet >+ <deprecate profile="core"> >+ <enum name="GL_MAX_VARYING_FLOATS"/> >+ <enum name="GL_MAX_VARYING_COMPONENTS"/> >+ </deprecate> >+ --> >+ </feature> >+ <feature api="gl" name="GL_VERSION_3_3" number="3.3"> >+ <require> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR"/> >+ </require> >+ <require comment="Reuse ARB_blend_func_extended"> >+ <enum name="GL_SRC1_COLOR"/> >+ <enum name="GL_ONE_MINUS_SRC1_COLOR"/> >+ <enum name="GL_ONE_MINUS_SRC1_ALPHA"/> >+ <enum name="GL_MAX_DUAL_SOURCE_DRAW_BUFFERS"/> >+ <command name="glBindFragDataLocationIndexed"/> >+ <command name="glGetFragDataIndex"/> >+ </require> >+ <require comment="Reuse ARB_explicit_attrib_location (none)"> >+ </require> >+ <require comment="Reuse ARB_occlusion_query2"> >+ <enum name="GL_ANY_SAMPLES_PASSED"/> >+ </require> >+ <require comment="Reuse ARB_sampler_objects"> >+ <enum name="GL_SAMPLER_BINDING"/> >+ <command name="glGenSamplers"/> >+ <command name="glDeleteSamplers"/> >+ <command name="glIsSampler"/> >+ <command name="glBindSampler"/> >+ <command name="glSamplerParameteri"/> >+ <command name="glSamplerParameteriv"/> >+ <command name="glSamplerParameterf"/> >+ <command name="glSamplerParameterfv"/> >+ <command name="glSamplerParameterIiv"/> >+ <command name="glSamplerParameterIuiv"/> >+ <command name="glGetSamplerParameteriv"/> >+ <command name="glGetSamplerParameterIiv"/> >+ <command name="glGetSamplerParameterfv"/> >+ <command name="glGetSamplerParameterIuiv"/> >+ </require> >+ <require comment="Reuse ARB_shader_bit_encoding (none)"> >+ </require> >+ <require comment="Reuse ARB_texture_rgb10_a2ui"> >+ <enum name="GL_RGB10_A2UI"/> >+ </require> >+ <require comment="Reuse ARB_texture_swizzle"> >+ <enum name="GL_TEXTURE_SWIZZLE_R"/> >+ <enum name="GL_TEXTURE_SWIZZLE_G"/> >+ <enum name="GL_TEXTURE_SWIZZLE_B"/> >+ <enum name="GL_TEXTURE_SWIZZLE_A"/> >+ <enum name="GL_TEXTURE_SWIZZLE_RGBA"/> >+ </require> >+ <require comment="Reuse ARB_timer_query"> >+ <enum name="GL_TIME_ELAPSED"/> >+ <enum name="GL_TIMESTAMP"/> >+ <command name="glQueryCounter"/> >+ <command name="glGetQueryObjecti64v"/> >+ <command name="glGetQueryObjectui64v"/> >+ </require> >+ <require comment="Reuse ARB_vertex_type_2_10_10_10_rev"> >+ <enum name="GL_INT_2_10_10_10_REV"/> >+ <command name="glVertexAttribDivisor"/> >+ <command name="glVertexAttribP1ui"/> >+ <command name="glVertexAttribP1uiv"/> >+ <command name="glVertexAttribP2ui"/> >+ <command name="glVertexAttribP2uiv"/> >+ <command name="glVertexAttribP3ui"/> >+ <command name="glVertexAttribP3uiv"/> >+ <command name="glVertexAttribP4ui"/> >+ <command name="glVertexAttribP4uiv"/> >+ </require> >+ <require profile="compatibility" comment="Reuse ARB_vertex_type_2_10_10_10_rev compatibility profile"> >+ <command name="glVertexP2ui"/> >+ <command name="glVertexP2uiv"/> >+ <command name="glVertexP3ui"/> >+ <command name="glVertexP3uiv"/> >+ <command name="glVertexP4ui"/> >+ <command name="glVertexP4uiv"/> >+ <command name="glTexCoordP1ui"/> >+ <command name="glTexCoordP1uiv"/> >+ <command name="glTexCoordP2ui"/> >+ <command name="glTexCoordP2uiv"/> >+ <command name="glTexCoordP3ui"/> >+ <command name="glTexCoordP3uiv"/> >+ <command name="glTexCoordP4ui"/> >+ <command name="glTexCoordP4uiv"/> >+ <command name="glMultiTexCoordP1ui"/> >+ <command name="glMultiTexCoordP1uiv"/> >+ <command name="glMultiTexCoordP2ui"/> >+ <command name="glMultiTexCoordP2uiv"/> >+ <command name="glMultiTexCoordP3ui"/> >+ <command name="glMultiTexCoordP3uiv"/> >+ <command name="glMultiTexCoordP4ui"/> >+ <command name="glMultiTexCoordP4uiv"/> >+ <command name="glNormalP3ui"/> >+ <command name="glNormalP3uiv"/> >+ <command name="glColorP3ui"/> >+ <command name="glColorP3uiv"/> >+ <command name="glColorP4ui"/> >+ <command name="glColorP4uiv"/> >+ <command name="glSecondaryColorP3ui"/> >+ <command name="glSecondaryColorP3uiv"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_4_0" number="4.0"> >+ <require> >+ <enum name="GL_SAMPLE_SHADING"/> >+ <enum name="GL_MIN_SAMPLE_SHADING_VALUE"/> >+ <enum name="GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET"/> >+ <enum name="GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_CUBE_MAP_ARRAY"/> >+ <enum name="GL_PROXY_TEXTURE_CUBE_MAP_ARRAY"/> >+ <enum name="GL_SAMPLER_CUBE_MAP_ARRAY"/> >+ <enum name="GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW"/> >+ <enum name="GL_INT_SAMPLER_CUBE_MAP_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY"/> >+ <command name="glMinSampleShading"/> >+ <command name="glBlendEquationi"/> >+ <command name="glBlendEquationSeparatei"/> >+ <command name="glBlendFunci"/> >+ <command name="glBlendFuncSeparatei"/> >+ </require> >+ <require comment="Reuse ARB_draw_buffers_blend (none)"> >+ </require> >+ <require comment="Reuse ARB_draw_indirect"> >+ <enum name="GL_DRAW_INDIRECT_BUFFER"/> >+ <enum name="GL_DRAW_INDIRECT_BUFFER_BINDING"/> >+ <command name="glDrawArraysIndirect"/> >+ <command name="glDrawElementsIndirect"/> >+ </require> >+ <require comment="Reuse ARB_gpu_shader5"> >+ <enum name="GL_GEOMETRY_SHADER_INVOCATIONS"/> >+ <enum name="GL_MAX_GEOMETRY_SHADER_INVOCATIONS"/> >+ <enum name="GL_MIN_FRAGMENT_INTERPOLATION_OFFSET"/> >+ <enum name="GL_MAX_FRAGMENT_INTERPOLATION_OFFSET"/> >+ <enum name="GL_FRAGMENT_INTERPOLATION_OFFSET_BITS"/> >+ <enum name="GL_MAX_VERTEX_STREAMS"/> >+ </require> >+ <require comment="Reuse ARB_gpu_shader_fp64"> >+ <enum name="GL_DOUBLE_VEC2"/> >+ <enum name="GL_DOUBLE_VEC3"/> >+ <enum name="GL_DOUBLE_VEC4"/> >+ <enum name="GL_DOUBLE_MAT2"/> >+ <enum name="GL_DOUBLE_MAT3"/> >+ <enum name="GL_DOUBLE_MAT4"/> >+ <enum name="GL_DOUBLE_MAT2x3"/> >+ <enum name="GL_DOUBLE_MAT2x4"/> >+ <enum name="GL_DOUBLE_MAT3x2"/> >+ <enum name="GL_DOUBLE_MAT3x4"/> >+ <enum name="GL_DOUBLE_MAT4x2"/> >+ <enum name="GL_DOUBLE_MAT4x3"/> >+ <command name="glUniform1d"/> >+ <command name="glUniform2d"/> >+ <command name="glUniform3d"/> >+ <command name="glUniform4d"/> >+ <command name="glUniform1dv"/> >+ <command name="glUniform2dv"/> >+ <command name="glUniform3dv"/> >+ <command name="glUniform4dv"/> >+ <command name="glUniformMatrix2dv"/> >+ <command name="glUniformMatrix3dv"/> >+ <command name="glUniformMatrix4dv"/> >+ <command name="glUniformMatrix2x3dv"/> >+ <command name="glUniformMatrix2x4dv"/> >+ <command name="glUniformMatrix3x2dv"/> >+ <command name="glUniformMatrix3x4dv"/> >+ <command name="glUniformMatrix4x2dv"/> >+ <command name="glUniformMatrix4x3dv"/> >+ <command name="glGetUniformdv"/> >+ </require> >+ <require comment="Reuse ARB_shader_subroutine"> >+ <enum name="GL_ACTIVE_SUBROUTINES"/> >+ <enum name="GL_ACTIVE_SUBROUTINE_UNIFORMS"/> >+ <enum name="GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS"/> >+ <enum name="GL_ACTIVE_SUBROUTINE_MAX_LENGTH"/> >+ <enum name="GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH"/> >+ <enum name="GL_MAX_SUBROUTINES"/> >+ <enum name="GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS"/> >+ <enum name="GL_NUM_COMPATIBLE_SUBROUTINES"/> >+ <enum name="GL_COMPATIBLE_SUBROUTINES"/> >+ <command name="glGetSubroutineUniformLocation"/> >+ <command name="glGetSubroutineIndex"/> >+ <command name="glGetActiveSubroutineUniformiv"/> >+ <command name="glGetActiveSubroutineUniformName"/> >+ <command name="glGetActiveSubroutineName"/> >+ <command name="glUniformSubroutinesuiv"/> >+ <command name="glGetUniformSubroutineuiv"/> >+ <command name="glGetProgramStageiv"/> >+ </require> >+ <require comment="Reuse ARB_tessellation_shader"> >+ <enum name="GL_PATCHES"/> >+ <enum name="GL_PATCH_VERTICES"/> >+ <enum name="GL_PATCH_DEFAULT_INNER_LEVEL"/> >+ <enum name="GL_PATCH_DEFAULT_OUTER_LEVEL"/> >+ <enum name="GL_TESS_CONTROL_OUTPUT_VERTICES"/> >+ <enum name="GL_TESS_GEN_MODE"/> >+ <enum name="GL_TESS_GEN_SPACING"/> >+ <enum name="GL_TESS_GEN_VERTEX_ORDER"/> >+ <enum name="GL_TESS_GEN_POINT_MODE"/> >+ <enum name="GL_ISOLINES"/> >+ <enum name="GL_QUADS"/> >+ <enum name="GL_FRACTIONAL_ODD"/> >+ <enum name="GL_FRACTIONAL_EVEN"/> >+ <enum name="GL_MAX_PATCH_VERTICES"/> >+ <enum name="GL_MAX_TESS_GEN_LEVEL"/> >+ <enum name="GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_PATCH_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_TESS_CONTROL_INPUT_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS"/> >+ <enum name="GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER"/> >+ <enum name="GL_TESS_EVALUATION_SHADER"/> >+ <enum name="GL_TESS_CONTROL_SHADER"/> >+ <command name="glPatchParameteri"/> >+ <command name="glPatchParameterfv"/> >+ </require> >+ <require comment="Reuse ARB_texture_buffer_object_rgb32 (none)"> >+ </require> >+ <require comment="Reuse ARB_texture_cube_map_array (none)"> >+ </require> >+ <require comment="Reuse ARB_texture_gather (none)"> >+ </require> >+ <require comment="Reuse ARB_texture_query_lod (none)"> >+ </require> >+ <require comment="Reuse ARB_transform_feedback2"> >+ <enum name="GL_TRANSFORM_FEEDBACK"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BINDING"/> >+ <command name="glBindTransformFeedback"/> >+ <command name="glDeleteTransformFeedbacks"/> >+ <command name="glGenTransformFeedbacks"/> >+ <command name="glIsTransformFeedback"/> >+ <command name="glPauseTransformFeedback"/> >+ <command name="glResumeTransformFeedback"/> >+ <command name="glDrawTransformFeedback"/> >+ </require> >+ <require comment="Reuse ARB_transform_feedback3"> >+ <enum name="GL_MAX_TRANSFORM_FEEDBACK_BUFFERS"/> >+ <enum name="GL_MAX_VERTEX_STREAMS"/> >+ <command name="glDrawTransformFeedbackStream"/> >+ <command name="glBeginQueryIndexed"/> >+ <command name="glEndQueryIndexed"/> >+ <command name="glGetQueryIndexediv"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_4_1" number="4.1"> >+ <require comment="Reuse tokens from ARB_ES2_compatibility"> >+ <enum name="GL_FIXED"/> >+ <enum name="GL_IMPLEMENTATION_COLOR_READ_TYPE"/> >+ <enum name="GL_IMPLEMENTATION_COLOR_READ_FORMAT"/> >+ <enum name="GL_LOW_FLOAT"/> >+ <enum name="GL_MEDIUM_FLOAT"/> >+ <enum name="GL_HIGH_FLOAT"/> >+ <enum name="GL_LOW_INT"/> >+ <enum name="GL_MEDIUM_INT"/> >+ <enum name="GL_HIGH_INT"/> >+ <enum name="GL_SHADER_COMPILER"/> >+ <enum name="GL_SHADER_BINARY_FORMATS"/> >+ <enum name="GL_NUM_SHADER_BINARY_FORMATS"/> >+ <enum name="GL_MAX_VERTEX_UNIFORM_VECTORS"/> >+ <enum name="GL_MAX_VARYING_VECTORS"/> >+ <enum name="GL_MAX_FRAGMENT_UNIFORM_VECTORS"/> >+ <enum name="GL_RGB565"/> >+ </require> >+ <require comment="Reuse tokens from ARB_get_program_binary"> >+ <enum name="GL_PROGRAM_BINARY_RETRIEVABLE_HINT"/> >+ <enum name="GL_PROGRAM_BINARY_LENGTH"/> >+ <enum name="GL_NUM_PROGRAM_BINARY_FORMATS"/> >+ <enum name="GL_PROGRAM_BINARY_FORMATS"/> >+ </require> >+ <require comment="Reuse tokens from ARB_separate_shader_objects"> >+ <enum name="GL_VERTEX_SHADER_BIT"/> >+ <enum name="GL_FRAGMENT_SHADER_BIT"/> >+ <enum name="GL_GEOMETRY_SHADER_BIT"/> >+ <enum name="GL_TESS_CONTROL_SHADER_BIT"/> >+ <enum name="GL_TESS_EVALUATION_SHADER_BIT"/> >+ <enum name="GL_ALL_SHADER_BITS"/> >+ <enum name="GL_PROGRAM_SEPARABLE"/> >+ <enum name="GL_ACTIVE_PROGRAM"/> >+ <enum name="GL_PROGRAM_PIPELINE_BINDING"/> >+ </require> >+ <require comment="Reuse tokens from ARB_shader_precision (none)"> >+ </require> >+ <require comment="Reuse tokens from ARB_vertex_attrib_64bit - all are in GL 3.0 and 4.0 already"> >+ </require> >+ <require comment="Reuse tokens from ARB_viewport_array - some are in GL 1.1 and ARB_provoking_vertex already"> >+ <enum name="GL_MAX_VIEWPORTS"/> >+ <enum name="GL_VIEWPORT_SUBPIXEL_BITS"/> >+ <enum name="GL_VIEWPORT_BOUNDS_RANGE"/> >+ <enum name="GL_LAYER_PROVOKING_VERTEX"/> >+ <enum name="GL_VIEWPORT_INDEX_PROVOKING_VERTEX"/> >+ <enum name="GL_UNDEFINED_VERTEX"/> >+ </require> >+ <require comment="Reuse commands from ARB_ES2_compatibility"> >+ <command name="glReleaseShaderCompiler"/> >+ <command name="glShaderBinary"/> >+ <command name="glGetShaderPrecisionFormat"/> >+ <command name="glDepthRangef"/> >+ <command name="glClearDepthf"/> >+ </require> >+ <require comment="Reuse commands from ARB_get_program_binary"> >+ <command name="glGetProgramBinary"/> >+ <command name="glProgramBinary"/> >+ <command name="glProgramParameteri"/> >+ </require> >+ <require comment="Reuse commands from ARB_separate_shader_objects"> >+ <command name="glUseProgramStages"/> >+ <command name="glActiveShaderProgram"/> >+ <command name="glCreateShaderProgramv"/> >+ <command name="glBindProgramPipeline"/> >+ <command name="glDeleteProgramPipelines"/> >+ <command name="glGenProgramPipelines"/> >+ <command name="glIsProgramPipeline"/> >+ <command name="glGetProgramPipelineiv"/> >+ <command name="glProgramParameteri"/> >+ <command name="glProgramUniform1i"/> >+ <command name="glProgramUniform1iv"/> >+ <command name="glProgramUniform1f"/> >+ <command name="glProgramUniform1fv"/> >+ <command name="glProgramUniform1d"/> >+ <command name="glProgramUniform1dv"/> >+ <command name="glProgramUniform1ui"/> >+ <command name="glProgramUniform1uiv"/> >+ <command name="glProgramUniform2i"/> >+ <command name="glProgramUniform2iv"/> >+ <command name="glProgramUniform2f"/> >+ <command name="glProgramUniform2fv"/> >+ <command name="glProgramUniform2d"/> >+ <command name="glProgramUniform2dv"/> >+ <command name="glProgramUniform2ui"/> >+ <command name="glProgramUniform2uiv"/> >+ <command name="glProgramUniform3i"/> >+ <command name="glProgramUniform3iv"/> >+ <command name="glProgramUniform3f"/> >+ <command name="glProgramUniform3fv"/> >+ <command name="glProgramUniform3d"/> >+ <command name="glProgramUniform3dv"/> >+ <command name="glProgramUniform3ui"/> >+ <command name="glProgramUniform3uiv"/> >+ <command name="glProgramUniform4i"/> >+ <command name="glProgramUniform4iv"/> >+ <command name="glProgramUniform4f"/> >+ <command name="glProgramUniform4fv"/> >+ <command name="glProgramUniform4d"/> >+ <command name="glProgramUniform4dv"/> >+ <command name="glProgramUniform4ui"/> >+ <command name="glProgramUniform4uiv"/> >+ <command name="glProgramUniformMatrix2fv"/> >+ <command name="glProgramUniformMatrix3fv"/> >+ <command name="glProgramUniformMatrix4fv"/> >+ <command name="glProgramUniformMatrix2dv"/> >+ <command name="glProgramUniformMatrix3dv"/> >+ <command name="glProgramUniformMatrix4dv"/> >+ <command name="glProgramUniformMatrix2x3fv"/> >+ <command name="glProgramUniformMatrix3x2fv"/> >+ <command name="glProgramUniformMatrix2x4fv"/> >+ <command name="glProgramUniformMatrix4x2fv"/> >+ <command name="glProgramUniformMatrix3x4fv"/> >+ <command name="glProgramUniformMatrix4x3fv"/> >+ <command name="glProgramUniformMatrix2x3dv"/> >+ <command name="glProgramUniformMatrix3x2dv"/> >+ <command name="glProgramUniformMatrix2x4dv"/> >+ <command name="glProgramUniformMatrix4x2dv"/> >+ <command name="glProgramUniformMatrix3x4dv"/> >+ <command name="glProgramUniformMatrix4x3dv"/> >+ <command name="glValidateProgramPipeline"/> >+ <command name="glGetProgramPipelineInfoLog"/> >+ </require> >+ <require comment="Reuse commands from ARB_shader_precision (none)"> >+ </require> >+ <require comment="Reuse commands from ARB_vertex_attrib_64bit"> >+ <command name="glVertexAttribL1d"/> >+ <command name="glVertexAttribL2d"/> >+ <command name="glVertexAttribL3d"/> >+ <command name="glVertexAttribL4d"/> >+ <command name="glVertexAttribL1dv"/> >+ <command name="glVertexAttribL2dv"/> >+ <command name="glVertexAttribL3dv"/> >+ <command name="glVertexAttribL4dv"/> >+ <command name="glVertexAttribLPointer"/> >+ <command name="glGetVertexAttribLdv"/> >+ </require> >+ <require comment="Reuse commands from ARB_viewport_array"> >+ <command name="glViewportArrayv"/> >+ <command name="glViewportIndexedf"/> >+ <command name="glViewportIndexedfv"/> >+ <command name="glScissorArrayv"/> >+ <command name="glScissorIndexed"/> >+ <command name="glScissorIndexedv"/> >+ <command name="glDepthRangeArrayv"/> >+ <command name="glDepthRangeIndexed"/> >+ <command name="glGetFloati_v"/> >+ <command name="glGetDoublei_v"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_4_2" number="4.2"> >+ <require comment="New aliases for old tokens"> >+ <enum name="GL_COPY_READ_BUFFER_BINDING"/> >+ <enum name="GL_COPY_WRITE_BUFFER_BINDING"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_ACTIVE"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_PAUSED"/> >+ </require> >+ <require comment="Reuse tokens from ARB_base_instance (none)"> >+ </require> >+ <require comment="Reuse tokens from ARB_shading_language_420pack (none)"> >+ </require> >+ <require comment="Reuse tokens from ARB_transform_feedback_instanced (none)"> >+ </require> >+ <require comment="Reuse tokens from ARB_compressed_texture_pixel_storage"> >+ <enum name="GL_UNPACK_COMPRESSED_BLOCK_WIDTH"/> >+ <enum name="GL_UNPACK_COMPRESSED_BLOCK_HEIGHT"/> >+ <enum name="GL_UNPACK_COMPRESSED_BLOCK_DEPTH"/> >+ <enum name="GL_UNPACK_COMPRESSED_BLOCK_SIZE"/> >+ <enum name="GL_PACK_COMPRESSED_BLOCK_WIDTH"/> >+ <enum name="GL_PACK_COMPRESSED_BLOCK_HEIGHT"/> >+ <enum name="GL_PACK_COMPRESSED_BLOCK_DEPTH"/> >+ <enum name="GL_PACK_COMPRESSED_BLOCK_SIZE"/> >+ </require> >+ <require comment="Reuse tokens from ARB_conservative_depth (none)"> >+ </require> >+ <require comment="Reuse tokens from ARB_internalformat_query"> >+ <enum name="GL_NUM_SAMPLE_COUNTS"/> >+ </require> >+ <require comment="Reuse tokens from ARB_map_buffer_alignment"> >+ <enum name="GL_MIN_MAP_BUFFER_ALIGNMENT"/> >+ </require> >+ <require comment="Reuse tokens from ARB_shader_atomic_counters"> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_BINDING"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_START"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_SIZE"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER"/> >+ <enum name="GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_VERTEX_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_GEOMETRY_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_FRAGMENT_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_COMBINED_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE"/> >+ <enum name="GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS"/> >+ <enum name="GL_ACTIVE_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX"/> >+ <enum name="GL_UNSIGNED_INT_ATOMIC_COUNTER"/> >+ </require> >+ <require comment="Reuse tokens from ARB_shader_image_load_store"> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT"/> >+ <enum name="GL_ELEMENT_ARRAY_BARRIER_BIT"/> >+ <enum name="GL_UNIFORM_BARRIER_BIT"/> >+ <enum name="GL_TEXTURE_FETCH_BARRIER_BIT"/> >+ <enum name="GL_SHADER_IMAGE_ACCESS_BARRIER_BIT"/> >+ <enum name="GL_COMMAND_BARRIER_BIT"/> >+ <enum name="GL_PIXEL_BUFFER_BARRIER_BIT"/> >+ <enum name="GL_TEXTURE_UPDATE_BARRIER_BIT"/> >+ <enum name="GL_BUFFER_UPDATE_BARRIER_BIT"/> >+ <enum name="GL_FRAMEBUFFER_BARRIER_BIT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BARRIER_BIT"/> >+ <enum name="GL_ATOMIC_COUNTER_BARRIER_BIT"/> >+ <enum name="GL_ALL_BARRIER_BITS"/> >+ <enum name="GL_MAX_IMAGE_UNITS"/> >+ <enum name="GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS"/> >+ <enum name="GL_IMAGE_BINDING_NAME"/> >+ <enum name="GL_IMAGE_BINDING_LEVEL"/> >+ <enum name="GL_IMAGE_BINDING_LAYERED"/> >+ <enum name="GL_IMAGE_BINDING_LAYER"/> >+ <enum name="GL_IMAGE_BINDING_ACCESS"/> >+ <enum name="GL_IMAGE_1D"/> >+ <enum name="GL_IMAGE_2D"/> >+ <enum name="GL_IMAGE_3D"/> >+ <enum name="GL_IMAGE_2D_RECT"/> >+ <enum name="GL_IMAGE_CUBE"/> >+ <enum name="GL_IMAGE_BUFFER"/> >+ <enum name="GL_IMAGE_1D_ARRAY"/> >+ <enum name="GL_IMAGE_2D_ARRAY"/> >+ <enum name="GL_IMAGE_CUBE_MAP_ARRAY"/> >+ <enum name="GL_IMAGE_2D_MULTISAMPLE"/> >+ <enum name="GL_IMAGE_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_INT_IMAGE_1D"/> >+ <enum name="GL_INT_IMAGE_2D"/> >+ <enum name="GL_INT_IMAGE_3D"/> >+ <enum name="GL_INT_IMAGE_2D_RECT"/> >+ <enum name="GL_INT_IMAGE_CUBE"/> >+ <enum name="GL_INT_IMAGE_BUFFER"/> >+ <enum name="GL_INT_IMAGE_1D_ARRAY"/> >+ <enum name="GL_INT_IMAGE_2D_ARRAY"/> >+ <enum name="GL_INT_IMAGE_CUBE_MAP_ARRAY"/> >+ <enum name="GL_INT_IMAGE_2D_MULTISAMPLE"/> >+ <enum name="GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_1D"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_3D"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D_RECT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_CUBE"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_BUFFER"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_1D_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_MAX_IMAGE_SAMPLES"/> >+ <enum name="GL_IMAGE_BINDING_FORMAT"/> >+ <enum name="GL_IMAGE_FORMAT_COMPATIBILITY_TYPE"/> >+ <enum name="GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE"/> >+ <enum name="GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS"/> >+ <enum name="GL_MAX_VERTEX_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_GEOMETRY_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_FRAGMENT_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_COMBINED_IMAGE_UNIFORMS"/> >+ </require> >+ <require comment="Reuse tokens from ARB_shading_language_packing (none)"> >+ </require> >+ <require comment="Reuse tokens from ARB_texture_compression_bptc"> >+ <enum name="GL_COMPRESSED_RGBA_BPTC_UNORM"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM"/> >+ <enum name="GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT"/> >+ <enum name="GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT"/> >+ </require> >+ <require comment="Reuse tokens from ARB_texture_storage"> >+ <enum name="GL_TEXTURE_IMMUTABLE_FORMAT"/> >+ </require> >+ <require comment="Reuse commands from ARB_base_instance"> >+ <command name="glDrawArraysInstancedBaseInstance"/> >+ <command name="glDrawElementsInstancedBaseInstance"/> >+ <command name="glDrawElementsInstancedBaseVertexBaseInstance"/> >+ </require> >+ <require comment="Reuse commands from ARB_compressed_texture_pixel_storage (none)"> >+ </require> >+ <require comment="Reuse commands from ARB_conservative_depth (none)"> >+ </require> >+ <require comment="Reuse commands from ARB_internalformat_query"> >+ <command name="glGetInternalformativ"/> >+ </require> >+ <require comment="Reuse commands from ARB_map_buffer_alignment (none)"> >+ </require> >+ <require comment="Reuse commands from ARB_shader_atomic_counters"> >+ <command name="glGetActiveAtomicCounterBufferiv"/> >+ </require> >+ <require comment="Reuse commands from ARB_shader_image_load_store"> >+ <command name="glBindImageTexture"/> >+ <command name="glMemoryBarrier"/> >+ </require> >+ <require comment="Reuse commands from ARB_shading_language_420pack (none)"> >+ </require> >+ <require comment="Reuse commands from ARB_shading_language_packing (none)"> >+ </require> >+ <require comment="Reuse commands from ARB_texture_storage"> >+ <command name="glTexStorage1D"/> >+ <command name="glTexStorage2D"/> >+ <command name="glTexStorage3D"/> >+ </require> >+ <require comment="Reuse commands from ARB_transform_feedback_instanced"> >+ <command name="glDrawTransformFeedbackInstanced"/> >+ <command name="glDrawTransformFeedbackStreamInstanced"/> >+ </require> >+ <!-- Deprecated in OpenGL 4.2 core; >+ deprecate tag not defined/supported yet >+ <deprecate profile="core"> >+ <enum name="GL_NUM_COMPRESSED_TEXTURE_FORMATS"/> >+ <enum name="GL_COMPRESSED_TEXTURE_FORMATS"/> >+ </deprecate> >+ --> >+ </feature> >+ <feature api="gl" name="GL_VERSION_4_3" number="4.3"> >+ <require> >+ <enum name="GL_NUM_SHADING_LANGUAGE_VERSIONS"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_LONG"/> >+ </require> >+ <require comment="Reuse tokens from ARB_arrays_of_arrays (none, GLSL only)"> >+ </require> >+ <require comment="Reuse tokens from ARB_fragment_layer_viewport (none, GLSL only)"> >+ </require> >+ <require comment="Reuse tokens from ARB_shader_image_size (none, GLSL only)"> >+ </require> >+ <require comment="Reuse tokens from ARB_ES3_compatibility"> >+ <enum name="GL_COMPRESSED_RGB8_ETC2"/> >+ <enum name="GL_COMPRESSED_SRGB8_ETC2"/> >+ <enum name="GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"/> >+ <enum name="GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"/> >+ <enum name="GL_COMPRESSED_RGBA8_ETC2_EAC"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"/> >+ <enum name="GL_COMPRESSED_R11_EAC"/> >+ <enum name="GL_COMPRESSED_SIGNED_R11_EAC"/> >+ <enum name="GL_COMPRESSED_RG11_EAC"/> >+ <enum name="GL_COMPRESSED_SIGNED_RG11_EAC"/> >+ <enum name="GL_PRIMITIVE_RESTART_FIXED_INDEX"/> >+ <enum name="GL_ANY_SAMPLES_PASSED_CONSERVATIVE"/> >+ <enum name="GL_MAX_ELEMENT_INDEX"/> >+ </require> >+ <require comment="Reuse tokens from ARB_clear_buffer_object (none)"> >+ </require> >+ <require comment="Reuse tokens from ARB_compute_shader"> >+ <enum name="GL_COMPUTE_SHADER"/> >+ <enum name="GL_MAX_COMPUTE_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_COMPUTE_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_COMPUTE_SHARED_MEMORY_SIZE"/> >+ <enum name="GL_MAX_COMPUTE_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_COMPUTE_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS"/> >+ <enum name="GL_MAX_COMPUTE_WORK_GROUP_COUNT"/> >+ <enum name="GL_MAX_COMPUTE_WORK_GROUP_SIZE"/> >+ <enum name="GL_COMPUTE_WORK_GROUP_SIZE"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER"/> >+ <enum name="GL_DISPATCH_INDIRECT_BUFFER"/> >+ <enum name="GL_DISPATCH_INDIRECT_BUFFER_BINDING"/> >+ <enum name="GL_COMPUTE_SHADER_BIT"/> >+ </require> >+ <require comment="Reuse tokens from ARB_copy_image (none)"> >+ </require> >+ <require comment="Reuse tokens from KHR_debug"> >+ <enum name="GL_DEBUG_OUTPUT_SYNCHRONOUS"/> >+ <enum name="GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH"/> >+ <enum name="GL_DEBUG_CALLBACK_FUNCTION"/> >+ <enum name="GL_DEBUG_CALLBACK_USER_PARAM"/> >+ <enum name="GL_DEBUG_SOURCE_API"/> >+ <enum name="GL_DEBUG_SOURCE_WINDOW_SYSTEM"/> >+ <enum name="GL_DEBUG_SOURCE_SHADER_COMPILER"/> >+ <enum name="GL_DEBUG_SOURCE_THIRD_PARTY"/> >+ <enum name="GL_DEBUG_SOURCE_APPLICATION"/> >+ <enum name="GL_DEBUG_SOURCE_OTHER"/> >+ <enum name="GL_DEBUG_TYPE_ERROR"/> >+ <enum name="GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR"/> >+ <enum name="GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR"/> >+ <enum name="GL_DEBUG_TYPE_PORTABILITY"/> >+ <enum name="GL_DEBUG_TYPE_PERFORMANCE"/> >+ <enum name="GL_DEBUG_TYPE_OTHER"/> >+ <enum name="GL_MAX_DEBUG_MESSAGE_LENGTH"/> >+ <enum name="GL_MAX_DEBUG_LOGGED_MESSAGES"/> >+ <enum name="GL_DEBUG_LOGGED_MESSAGES"/> >+ <enum name="GL_DEBUG_SEVERITY_HIGH"/> >+ <enum name="GL_DEBUG_SEVERITY_MEDIUM"/> >+ <enum name="GL_DEBUG_SEVERITY_LOW"/> >+ <enum name="GL_DEBUG_TYPE_MARKER"/> >+ <enum name="GL_DEBUG_TYPE_PUSH_GROUP"/> >+ <enum name="GL_DEBUG_TYPE_POP_GROUP"/> >+ <enum name="GL_DEBUG_SEVERITY_NOTIFICATION"/> >+ <enum name="GL_MAX_DEBUG_GROUP_STACK_DEPTH"/> >+ <enum name="GL_DEBUG_GROUP_STACK_DEPTH"/> >+ <enum name="GL_BUFFER"/> >+ <enum name="GL_SHADER"/> >+ <enum name="GL_PROGRAM"/> >+ <enum name="GL_VERTEX_ARRAY"/> >+ <enum name="GL_QUERY"/> >+ <enum name="GL_PROGRAM_PIPELINE"/> >+ <enum name="GL_SAMPLER"/> >+ <enum name="GL_MAX_LABEL_LENGTH"/> >+ <enum name="GL_DEBUG_OUTPUT"/> >+ <enum name="GL_CONTEXT_FLAG_DEBUG_BIT"/> >+ </require> >+ <require comment="Reuse tokens from ARB_explicit_uniform_location"> >+ <enum name="GL_MAX_UNIFORM_LOCATIONS"/> >+ </require> >+ <require comment="Reuse tokens from ARB_framebuffer_no_attachments"> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_WIDTH"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_HEIGHT"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_LAYERS"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_SAMPLES"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS"/> >+ <enum name="GL_MAX_FRAMEBUFFER_WIDTH"/> >+ <enum name="GL_MAX_FRAMEBUFFER_HEIGHT"/> >+ <enum name="GL_MAX_FRAMEBUFFER_LAYERS"/> >+ <enum name="GL_MAX_FRAMEBUFFER_SAMPLES"/> >+ </require> >+ <require comment="Reuse tokens from ARB_internalformat_query2"> >+ <enum name="GL_INTERNALFORMAT_SUPPORTED"/> >+ <enum name="GL_INTERNALFORMAT_PREFERRED"/> >+ <enum name="GL_INTERNALFORMAT_RED_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_GREEN_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_BLUE_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_ALPHA_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_DEPTH_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_STENCIL_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_SHARED_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_RED_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_GREEN_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_BLUE_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_ALPHA_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_DEPTH_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_STENCIL_TYPE"/> >+ <enum name="GL_MAX_WIDTH"/> >+ <enum name="GL_MAX_HEIGHT"/> >+ <enum name="GL_MAX_DEPTH"/> >+ <enum name="GL_MAX_LAYERS"/> >+ <enum name="GL_MAX_COMBINED_DIMENSIONS"/> >+ <enum name="GL_COLOR_COMPONENTS"/> >+ <enum name="GL_DEPTH_COMPONENTS"/> >+ <enum name="GL_STENCIL_COMPONENTS"/> >+ <enum name="GL_COLOR_RENDERABLE"/> >+ <enum name="GL_DEPTH_RENDERABLE"/> >+ <enum name="GL_STENCIL_RENDERABLE"/> >+ <enum name="GL_FRAMEBUFFER_RENDERABLE"/> >+ <enum name="GL_FRAMEBUFFER_RENDERABLE_LAYERED"/> >+ <enum name="GL_FRAMEBUFFER_BLEND"/> >+ <enum name="GL_READ_PIXELS"/> >+ <enum name="GL_READ_PIXELS_FORMAT"/> >+ <enum name="GL_READ_PIXELS_TYPE"/> >+ <enum name="GL_TEXTURE_IMAGE_FORMAT"/> >+ <enum name="GL_TEXTURE_IMAGE_TYPE"/> >+ <enum name="GL_GET_TEXTURE_IMAGE_FORMAT"/> >+ <enum name="GL_GET_TEXTURE_IMAGE_TYPE"/> >+ <enum name="GL_MIPMAP"/> >+ <enum name="GL_MANUAL_GENERATE_MIPMAP"/> >+ <enum name="GL_AUTO_GENERATE_MIPMAP"/> >+ <enum name="GL_COLOR_ENCODING"/> >+ <enum name="GL_SRGB_READ"/> >+ <enum name="GL_SRGB_WRITE"/> >+ <enum name="GL_FILTER"/> >+ <enum name="GL_VERTEX_TEXTURE"/> >+ <enum name="GL_TESS_CONTROL_TEXTURE"/> >+ <enum name="GL_TESS_EVALUATION_TEXTURE"/> >+ <enum name="GL_GEOMETRY_TEXTURE"/> >+ <enum name="GL_FRAGMENT_TEXTURE"/> >+ <enum name="GL_COMPUTE_TEXTURE"/> >+ <enum name="GL_TEXTURE_SHADOW"/> >+ <enum name="GL_TEXTURE_GATHER"/> >+ <enum name="GL_TEXTURE_GATHER_SHADOW"/> >+ <enum name="GL_SHADER_IMAGE_LOAD"/> >+ <enum name="GL_SHADER_IMAGE_STORE"/> >+ <enum name="GL_SHADER_IMAGE_ATOMIC"/> >+ <enum name="GL_IMAGE_TEXEL_SIZE"/> >+ <enum name="GL_IMAGE_COMPATIBILITY_CLASS"/> >+ <enum name="GL_IMAGE_PIXEL_FORMAT"/> >+ <enum name="GL_IMAGE_PIXEL_TYPE"/> >+ <enum name="GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST"/> >+ <enum name="GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST"/> >+ <enum name="GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE"/> >+ <enum name="GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE"/> >+ <enum name="GL_TEXTURE_COMPRESSED_BLOCK_WIDTH"/> >+ <enum name="GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT"/> >+ <enum name="GL_TEXTURE_COMPRESSED_BLOCK_SIZE"/> >+ <enum name="GL_CLEAR_BUFFER"/> >+ <enum name="GL_TEXTURE_VIEW"/> >+ <enum name="GL_VIEW_COMPATIBILITY_CLASS"/> >+ <enum name="GL_FULL_SUPPORT"/> >+ <enum name="GL_CAVEAT_SUPPORT"/> >+ <enum name="GL_IMAGE_CLASS_4_X_32"/> >+ <enum name="GL_IMAGE_CLASS_2_X_32"/> >+ <enum name="GL_IMAGE_CLASS_1_X_32"/> >+ <enum name="GL_IMAGE_CLASS_4_X_16"/> >+ <enum name="GL_IMAGE_CLASS_2_X_16"/> >+ <enum name="GL_IMAGE_CLASS_1_X_16"/> >+ <enum name="GL_IMAGE_CLASS_4_X_8"/> >+ <enum name="GL_IMAGE_CLASS_2_X_8"/> >+ <enum name="GL_IMAGE_CLASS_1_X_8"/> >+ <enum name="GL_IMAGE_CLASS_11_11_10"/> >+ <enum name="GL_IMAGE_CLASS_10_10_10_2"/> >+ <enum name="GL_VIEW_CLASS_128_BITS"/> >+ <enum name="GL_VIEW_CLASS_96_BITS"/> >+ <enum name="GL_VIEW_CLASS_64_BITS"/> >+ <enum name="GL_VIEW_CLASS_48_BITS"/> >+ <enum name="GL_VIEW_CLASS_32_BITS"/> >+ <enum name="GL_VIEW_CLASS_24_BITS"/> >+ <enum name="GL_VIEW_CLASS_16_BITS"/> >+ <enum name="GL_VIEW_CLASS_8_BITS"/> >+ <enum name="GL_VIEW_CLASS_S3TC_DXT1_RGB"/> >+ <enum name="GL_VIEW_CLASS_S3TC_DXT1_RGBA"/> >+ <enum name="GL_VIEW_CLASS_S3TC_DXT3_RGBA"/> >+ <enum name="GL_VIEW_CLASS_S3TC_DXT5_RGBA"/> >+ <enum name="GL_VIEW_CLASS_RGTC1_RED"/> >+ <enum name="GL_VIEW_CLASS_RGTC2_RG"/> >+ <enum name="GL_VIEW_CLASS_BPTC_UNORM"/> >+ <enum name="GL_VIEW_CLASS_BPTC_FLOAT"/> >+ </require> >+ <require comment="Reuse tokens from ARB_invalidate_subdata (none)"> >+ </require> >+ <require comment="Reuse tokens from ARB_multi_draw_indirect (none)"> >+ </require> >+ <require comment="Reuse tokens from ARB_program_interface_query"> >+ <enum name="GL_UNIFORM"/> >+ <enum name="GL_UNIFORM_BLOCK"/> >+ <enum name="GL_PROGRAM_INPUT"/> >+ <enum name="GL_PROGRAM_OUTPUT"/> >+ <enum name="GL_BUFFER_VARIABLE"/> >+ <enum name="GL_SHADER_STORAGE_BLOCK"/> >+ <enum name="GL_VERTEX_SUBROUTINE"/> >+ <enum name="GL_TESS_CONTROL_SUBROUTINE"/> >+ <enum name="GL_TESS_EVALUATION_SUBROUTINE"/> >+ <enum name="GL_GEOMETRY_SUBROUTINE"/> >+ <enum name="GL_FRAGMENT_SUBROUTINE"/> >+ <enum name="GL_COMPUTE_SUBROUTINE"/> >+ <enum name="GL_VERTEX_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_TESS_CONTROL_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_TESS_EVALUATION_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_GEOMETRY_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_FRAGMENT_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_COMPUTE_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_VARYING"/> >+ <enum name="GL_ACTIVE_RESOURCES"/> >+ <enum name="GL_MAX_NAME_LENGTH"/> >+ <enum name="GL_MAX_NUM_ACTIVE_VARIABLES"/> >+ <enum name="GL_MAX_NUM_COMPATIBLE_SUBROUTINES"/> >+ <enum name="GL_NAME_LENGTH"/> >+ <enum name="GL_TYPE"/> >+ <enum name="GL_ARRAY_SIZE"/> >+ <enum name="GL_OFFSET"/> >+ <enum name="GL_BLOCK_INDEX"/> >+ <enum name="GL_ARRAY_STRIDE"/> >+ <enum name="GL_MATRIX_STRIDE"/> >+ <enum name="GL_IS_ROW_MAJOR"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_INDEX"/> >+ <enum name="GL_BUFFER_BINDING"/> >+ <enum name="GL_BUFFER_DATA_SIZE"/> >+ <enum name="GL_NUM_ACTIVE_VARIABLES"/> >+ <enum name="GL_ACTIVE_VARIABLES"/> >+ <enum name="GL_REFERENCED_BY_VERTEX_SHADER"/> >+ <enum name="GL_REFERENCED_BY_TESS_CONTROL_SHADER"/> >+ <enum name="GL_REFERENCED_BY_TESS_EVALUATION_SHADER"/> >+ <enum name="GL_REFERENCED_BY_GEOMETRY_SHADER"/> >+ <enum name="GL_REFERENCED_BY_FRAGMENT_SHADER"/> >+ <enum name="GL_REFERENCED_BY_COMPUTE_SHADER"/> >+ <enum name="GL_TOP_LEVEL_ARRAY_SIZE"/> >+ <enum name="GL_TOP_LEVEL_ARRAY_STRIDE"/> >+ <enum name="GL_LOCATION"/> >+ <enum name="GL_LOCATION_INDEX"/> >+ <enum name="GL_IS_PER_PATCH"/> >+ </require> >+ <require comment="Reuse tokens from ARB_robust_buffer_access_behavior (none)"> >+ </require> >+ <require comment="Reuse tokens from ARB_shader_storage_buffer_object"> >+ <enum name="GL_SHADER_STORAGE_BUFFER"/> >+ <enum name="GL_SHADER_STORAGE_BUFFER_BINDING"/> >+ <enum name="GL_SHADER_STORAGE_BUFFER_START"/> >+ <enum name="GL_SHADER_STORAGE_BUFFER_SIZE"/> >+ <enum name="GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS"/> >+ <enum name="GL_MAX_SHADER_STORAGE_BLOCK_SIZE"/> >+ <enum name="GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT"/> >+ <enum name="GL_SHADER_STORAGE_BARRIER_BIT"/> >+ <enum name="GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES"/> >+ </require> >+ <require comment="Reuse tokens from ARB_stencil_texturing"> >+ <enum name="GL_DEPTH_STENCIL_TEXTURE_MODE"/> >+ </require> >+ <require comment="Reuse tokens from ARB_texture_buffer_range"> >+ <enum name="GL_TEXTURE_BUFFER_OFFSET"/> >+ <enum name="GL_TEXTURE_BUFFER_SIZE"/> >+ <enum name="GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT"/> >+ </require> >+ <require comment="Reuse tokens from ARB_texture_query_levels (none)"> >+ </require> >+ <require comment="Reuse tokens from ARB_texture_storage_multisample (none)"> >+ </require> >+ <require comment="Reuse tokens from ARB_texture_view"> >+ <enum name="GL_TEXTURE_VIEW_MIN_LEVEL"/> >+ <enum name="GL_TEXTURE_VIEW_NUM_LEVELS"/> >+ <enum name="GL_TEXTURE_VIEW_MIN_LAYER"/> >+ <enum name="GL_TEXTURE_VIEW_NUM_LAYERS"/> >+ <enum name="GL_TEXTURE_IMMUTABLE_LEVELS"/> >+ </require> >+ <require comment="Reuse tokens from ARB_vertex_attrib_binding"> >+ <enum name="GL_VERTEX_ATTRIB_BINDING"/> >+ <enum name="GL_VERTEX_ATTRIB_RELATIVE_OFFSET"/> >+ <enum name="GL_VERTEX_BINDING_DIVISOR"/> >+ <enum name="GL_VERTEX_BINDING_OFFSET"/> >+ <enum name="GL_VERTEX_BINDING_STRIDE"/> >+ <enum name="GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET"/> >+ <enum name="GL_MAX_VERTEX_ATTRIB_BINDINGS"/> >+ <enum name="GL_VERTEX_BINDING_BUFFER" comment="Added in 2013/10/22 update to the spec"/> >+ </require> >+ <require comment="Reuse commands from ARB_arrays_of_arrays (none, GLSL only)"> >+ </require> >+ <require comment="Reuse commands from ARB_clear_buffer_object"> >+ <command name="glClearBufferData"/> >+ <command name="glClearBufferSubData"/> >+ </require> >+ <require comment="Reuse commands from ARB_compute_shader"> >+ <command name="glDispatchCompute"/> >+ <command name="glDispatchComputeIndirect"/> >+ </require> >+ <require comment="Reuse commands from ARB_copy_image"> >+ <command name="glCopyImageSubData"/> >+ </require> >+ <require comment="Reuse commands from ARB_ES3_compatibility (none)"> >+ </require> >+ <require comment="Reuse commands from ARB_explicit_uniform_location (none)"> >+ </require> >+ <require comment="Reuse commands from ARB_fragment_layer_viewport (none, GLSL only)"> >+ </require> >+ <require comment="Reuse commands from ARB_framebuffer_no_attachments"> >+ <command name="glFramebufferParameteri"/> >+ <command name="glGetFramebufferParameteriv"/> >+ </require> >+ <require comment="Reuse commands from ARB_internalformat_query2"> >+ <command name="glGetInternalformati64v"/> >+ </require> >+ <require comment="Reuse commands from ARB_invalidate_subdata"> >+ <command name="glInvalidateTexSubImage"/> >+ <command name="glInvalidateTexImage"/> >+ <command name="glInvalidateBufferSubData"/> >+ <command name="glInvalidateBufferData"/> >+ <command name="glInvalidateFramebuffer"/> >+ <command name="glInvalidateSubFramebuffer"/> >+ </require> >+ <require comment="Reuse commands from ARB_multi_draw_indirect"> >+ <command name="glMultiDrawArraysIndirect"/> >+ <command name="glMultiDrawElementsIndirect"/> >+ </require> >+ <require comment="Reuse commands from ARB_program_interface_query"> >+ <command name="glGetProgramInterfaceiv"/> >+ <command name="glGetProgramResourceIndex"/> >+ <command name="glGetProgramResourceName"/> >+ <command name="glGetProgramResourceiv"/> >+ <command name="glGetProgramResourceLocation"/> >+ <command name="glGetProgramResourceLocationIndex"/> >+ </require> >+ <require comment="Reuse commands from ARB_robust_buffer_access_behavior (none)"> >+ </require> >+ <require comment="Reuse commands from ARB_shader_image_size (none, GLSL only)"> >+ </require> >+ <require comment="Reuse commands from ARB_shader_storage_buffer_object"> >+ <command name="glShaderStorageBlockBinding"/> >+ </require> >+ <require comment="Reuse commands from ARB_stencil_texturing (none)"> >+ </require> >+ <require comment="Reuse commands from ARB_texture_buffer_range"> >+ <command name="glTexBufferRange"/> >+ </require> >+ <require comment="Reuse commands from ARB_texture_query_levels (none)"> >+ </require> >+ <require comment="Reuse commands from ARB_texture_storage_multisample"> >+ <command name="glTexStorage2DMultisample"/> >+ <command name="glTexStorage3DMultisample"/> >+ </require> >+ <require comment="Reuse commands from ARB_texture_view"> >+ <command name="glTextureView"/> >+ </require> >+ <require comment="Reuse commands from ARB_vertex_attrib_binding"> >+ <command name="glBindVertexBuffer"/> >+ <command name="glVertexAttribFormat"/> >+ <command name="glVertexAttribIFormat"/> >+ <command name="glVertexAttribLFormat"/> >+ <command name="glVertexAttribBinding"/> >+ <command name="glVertexBindingDivisor"/> >+ </require> >+ <require comment="Reuse commands from KHR_debug (includes ARB_debug_output commands promoted to KHR without suffixes)"> >+ <command name="glDebugMessageControl"/> >+ <command name="glDebugMessageInsert"/> >+ <command name="glDebugMessageCallback"/> >+ <command name="glGetDebugMessageLog"/> >+ <command name="glPushDebugGroup"/> >+ <command name="glPopDebugGroup"/> >+ <command name="glObjectLabel"/> >+ <command name="glGetObjectLabel"/> >+ <command name="glObjectPtrLabel"/> >+ <command name="glGetObjectPtrLabel"/> >+ <command name="glGetPointerv"/> >+ </require> >+ <require profile="compatibility" comment="KHR_debug functionality not supported in core profile"> >+ <enum name="GL_DISPLAY_LIST"/> >+ </require> >+ <require profile="core" comment="Restore functionality removed in GL 3.2 core to GL 4.3. Needed for debug interface."> >+ <enum name="GL_STACK_UNDERFLOW"/> >+ <enum name="GL_STACK_OVERFLOW"/> >+ </require> >+ <!-- Deprecated in OpenGL 4.3 core; >+ deprecate tag not defined/supported yet >+ <deprecate profile="core"> >+ <enum name="GL_UNPACK_LSB_FIRST"/> >+ <enum name="GL_PACK_LSB_FIRST"/> >+ </deprecate> >+ --> >+ </feature> >+ <feature api="gl" name="GL_VERSION_4_4" number="4.4"> >+ <require> >+ <enum name="GL_MAX_VERTEX_ATTRIB_STRIDE"/> >+ <enum name="GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED"/> >+ <enum name="GL_TEXTURE_BUFFER_BINDING"/> >+ </require> >+ <require comment="Reuse GL_ARB_buffer_storage"> >+ <enum name="GL_MAP_READ_BIT"/> >+ <enum name="GL_MAP_WRITE_BIT"/> >+ <enum name="GL_MAP_PERSISTENT_BIT"/> >+ <enum name="GL_MAP_COHERENT_BIT"/> >+ <enum name="GL_DYNAMIC_STORAGE_BIT"/> >+ <enum name="GL_CLIENT_STORAGE_BIT"/> >+ <enum name="GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT"/> >+ <enum name="GL_BUFFER_IMMUTABLE_STORAGE"/> >+ <enum name="GL_BUFFER_STORAGE_FLAGS"/> >+ <command name="glBufferStorage"/> >+ </require> >+ <require comment="Reuse GL_ARB_clear_texture"> >+ <enum name="GL_CLEAR_TEXTURE"/> >+ <command name="glClearTexImage"/> >+ <command name="glClearTexSubImage"/> >+ </require> >+ <require comment="Reuse GL_ARB_enhanced_layouts"> >+ <enum name="GL_LOCATION_COMPONENT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_INDEX"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE"/> >+ </require> >+ <require comment="Reuse GL_ARB_multi_bind (none)"> >+ <command name="glBindBuffersBase"/> >+ <command name="glBindBuffersRange"/> >+ <command name="glBindTextures"/> >+ <command name="glBindSamplers"/> >+ <command name="glBindImageTextures"/> >+ <command name="glBindVertexBuffers"/> >+ </require> >+ <require comment="Reuse GL_ARB_query_buffer_object"> >+ <enum name="GL_QUERY_BUFFER"/> >+ <enum name="GL_QUERY_BUFFER_BARRIER_BIT"/> >+ <enum name="GL_QUERY_BUFFER_BINDING"/> >+ <enum name="GL_QUERY_RESULT_NO_WAIT"/> >+ </require> >+ <require comment="Reuse GL_ARB_texture_mirror_clamp_to_edge"> >+ <enum name="GL_MIRROR_CLAMP_TO_EDGE"/> >+ </require> >+ <require comment="Reuse GL_ARB_texture_stencil8"> >+ <enum name="GL_STENCIL_INDEX"/> >+ <enum name="GL_STENCIL_INDEX8"/> >+ </require> >+ <require comment="Reuse GL_ARB_vertex_type_10f_11f_11f_rev"> >+ <enum name="GL_UNSIGNED_INT_10F_11F_11F_REV"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_4_5" number="4.5"> >+ <require comment="Added robustness functionality"> >+ <enum name="GL_CONTEXT_LOST"/> >+ </require> >+ <require comment="Reuse GL_ARB_clip_control"> >+ <command name="glClipControl"/> >+ <enum name="GL_LOWER_LEFT"/> >+ <enum name="GL_UPPER_LEFT"/> >+ <enum name="GL_NEGATIVE_ONE_TO_ONE"/> >+ <enum name="GL_ZERO_TO_ONE"/> >+ <enum name="GL_CLIP_ORIGIN"/> >+ <enum name="GL_CLIP_DEPTH_MODE"/> >+ </require> >+ <require comment="Reuse GL_ARB_conditional_render_inverted"> >+ <enum name="GL_QUERY_WAIT_INVERTED"/> >+ <enum name="GL_QUERY_NO_WAIT_INVERTED"/> >+ <enum name="GL_QUERY_BY_REGION_WAIT_INVERTED"/> >+ <enum name="GL_QUERY_BY_REGION_NO_WAIT_INVERTED"/> >+ </require> >+ <require comment="Reuse GL_ARB_cull_distance"> >+ <enum name="GL_MAX_CULL_DISTANCES"/> >+ <enum name="GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES"/> >+ </require> >+ <require comment="Reuse GL_ARB_direct_state_access"> >+ <enum name="GL_TEXTURE_TARGET"/> >+ <enum name="GL_QUERY_TARGET"/> >+ <enum name="GL_TEXTURE_BINDING_1D"/> >+ <enum name="GL_TEXTURE_BINDING_1D_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_2D"/> >+ <enum name="GL_TEXTURE_BINDING_2D_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_2D_MULTISAMPLE"/> >+ <enum name="GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_3D"/> >+ <enum name="GL_TEXTURE_BINDING_BUFFER"/> >+ <enum name="GL_TEXTURE_BINDING_CUBE_MAP"/> >+ <enum name="GL_TEXTURE_BINDING_CUBE_MAP_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_RECTANGLE"/> >+ <command name="glCreateTransformFeedbacks"/> >+ <command name="glTransformFeedbackBufferBase"/> >+ <command name="glTransformFeedbackBufferRange"/> >+ <command name="glGetTransformFeedbackiv"/> >+ <command name="glGetTransformFeedbacki_v"/> >+ <command name="glGetTransformFeedbacki64_v"/> >+ <command name="glCreateBuffers"/> >+ <command name="glNamedBufferStorage"/> >+ <command name="glNamedBufferData"/> >+ <command name="glNamedBufferSubData"/> >+ <command name="glCopyNamedBufferSubData"/> >+ <command name="glClearNamedBufferData"/> >+ <command name="glClearNamedBufferSubData"/> >+ <command name="glMapNamedBuffer"/> >+ <command name="glMapNamedBufferRange"/> >+ <command name="glUnmapNamedBuffer"/> >+ <command name="glFlushMappedNamedBufferRange"/> >+ <command name="glGetNamedBufferParameteriv"/> >+ <command name="glGetNamedBufferParameteri64v"/> >+ <command name="glGetNamedBufferPointerv"/> >+ <command name="glGetNamedBufferSubData"/> >+ <command name="glCreateFramebuffers"/> >+ <command name="glNamedFramebufferRenderbuffer"/> >+ <command name="glNamedFramebufferParameteri"/> >+ <command name="glNamedFramebufferTexture"/> >+ <command name="glNamedFramebufferTextureLayer"/> >+ <command name="glNamedFramebufferDrawBuffer"/> >+ <command name="glNamedFramebufferDrawBuffers"/> >+ <command name="glNamedFramebufferReadBuffer"/> >+ <command name="glInvalidateNamedFramebufferData"/> >+ <command name="glInvalidateNamedFramebufferSubData"/> >+ <command name="glClearNamedFramebufferiv"/> >+ <command name="glClearNamedFramebufferuiv"/> >+ <command name="glClearNamedFramebufferfv"/> >+ <command name="glClearNamedFramebufferfi"/> >+ <command name="glBlitNamedFramebuffer"/> >+ <command name="glCheckNamedFramebufferStatus"/> >+ <command name="glGetNamedFramebufferParameteriv"/> >+ <command name="glGetNamedFramebufferAttachmentParameteriv"/> >+ <command name="glCreateRenderbuffers"/> >+ <command name="glNamedRenderbufferStorage"/> >+ <command name="glNamedRenderbufferStorageMultisample"/> >+ <command name="glGetNamedRenderbufferParameteriv"/> >+ <command name="glCreateTextures"/> >+ <command name="glTextureBuffer"/> >+ <command name="glTextureBufferRange"/> >+ <command name="glTextureStorage1D"/> >+ <command name="glTextureStorage2D"/> >+ <command name="glTextureStorage3D"/> >+ <command name="glTextureStorage2DMultisample"/> >+ <command name="glTextureStorage3DMultisample"/> >+ <command name="glTextureSubImage1D"/> >+ <command name="glTextureSubImage2D"/> >+ <command name="glTextureSubImage3D"/> >+ <command name="glCompressedTextureSubImage1D"/> >+ <command name="glCompressedTextureSubImage2D"/> >+ <command name="glCompressedTextureSubImage3D"/> >+ <command name="glCopyTextureSubImage1D"/> >+ <command name="glCopyTextureSubImage2D"/> >+ <command name="glCopyTextureSubImage3D"/> >+ <command name="glTextureParameterf"/> >+ <command name="glTextureParameterfv"/> >+ <command name="glTextureParameteri"/> >+ <command name="glTextureParameterIiv"/> >+ <command name="glTextureParameterIuiv"/> >+ <command name="glTextureParameteriv"/> >+ <command name="glGenerateTextureMipmap"/> >+ <command name="glBindTextureUnit"/> >+ <command name="glGetTextureImage"/> >+ <command name="glGetCompressedTextureImage"/> >+ <command name="glGetTextureLevelParameterfv"/> >+ <command name="glGetTextureLevelParameteriv"/> >+ <command name="glGetTextureParameterfv"/> >+ <command name="glGetTextureParameterIiv"/> >+ <command name="glGetTextureParameterIuiv"/> >+ <command name="glGetTextureParameteriv"/> >+ <command name="glCreateVertexArrays"/> >+ <command name="glDisableVertexArrayAttrib"/> >+ <command name="glEnableVertexArrayAttrib"/> >+ <command name="glVertexArrayElementBuffer"/> >+ <command name="glVertexArrayVertexBuffer"/> >+ <command name="glVertexArrayVertexBuffers"/> >+ <command name="glVertexArrayAttribBinding"/> >+ <command name="glVertexArrayAttribFormat"/> >+ <command name="glVertexArrayAttribIFormat"/> >+ <command name="glVertexArrayAttribLFormat"/> >+ <command name="glVertexArrayBindingDivisor"/> >+ <command name="glGetVertexArrayiv"/> >+ <command name="glGetVertexArrayIndexediv"/> >+ <command name="glGetVertexArrayIndexed64iv"/> >+ <command name="glCreateSamplers"/> >+ <command name="glCreateProgramPipelines"/> >+ <command name="glCreateQueries"/> >+ <command name="glGetQueryBufferObjecti64v"/> >+ <command name="glGetQueryBufferObjectiv"/> >+ <command name="glGetQueryBufferObjectui64v"/> >+ <command name="glGetQueryBufferObjectuiv"/> >+ </require> >+ <require comment="Reuse GL_ARB_ES3_1_compatibility"> >+ <enum name="GL_BACK"/> >+ <command name="glMemoryBarrierByRegion"/> >+ </require> >+ <require comment="Reuse GL_ARB_get_texture_sub_image"> >+ <command name="glGetTextureSubImage"/> >+ <command name="glGetCompressedTextureSubImage"/> >+ </require> >+ <require comment="Reuse GL_ARB_robustness"> >+ <enum name="GL_NO_ERROR"/> >+ <enum name="GL_GUILTY_CONTEXT_RESET"/> >+ <enum name="GL_INNOCENT_CONTEXT_RESET"/> >+ <enum name="GL_UNKNOWN_CONTEXT_RESET"/> >+ <enum name="GL_RESET_NOTIFICATION_STRATEGY"/> >+ <enum name="GL_LOSE_CONTEXT_ON_RESET"/> >+ <enum name="GL_NO_RESET_NOTIFICATION"/> >+ <enum name="GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT"/> >+ <enum name="GL_CONTEXT_LOST"/> >+ <command name="glGetGraphicsResetStatus"/> >+ <command name="glGetnCompressedTexImage"/> >+ <command name="glGetnTexImage"/> >+ <command name="glGetnUniformdv"/> >+ <command name="glGetnUniformfv"/> >+ <command name="glGetnUniformiv"/> >+ <command name="glGetnUniformuiv"/> >+ <command name="glReadnPixels"/> >+ </require> >+ <require profile="compatibility" comment="Reuse GL_ARB_robustness"> >+ <command name="glGetnMapdv"/> >+ <command name="glGetnMapfv"/> >+ <command name="glGetnMapiv"/> >+ <command name="glGetnPixelMapfv"/> >+ <command name="glGetnPixelMapuiv"/> >+ <command name="glGetnPixelMapusv"/> >+ <command name="glGetnPolygonStipple"/> >+ <command name="glGetnColorTable"/> >+ <command name="glGetnConvolutionFilter"/> >+ <command name="glGetnSeparableFilter"/> >+ <command name="glGetnHistogram"/> >+ <command name="glGetnMinmax"/> >+ </require> >+ <require comment="Reuse GL_ARB_texture_barrier"> >+ <command name="glTextureBarrier"/> >+ </require> >+ <require comment="Reuse GL_KHR_context_flush_control"> >+ <enum name="GL_CONTEXT_RELEASE_BEHAVIOR"/> >+ <enum name="GL_NONE"/> >+ <enum name="GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH"/> >+ </require> >+ </feature> >+ <feature api="gl" name="GL_VERSION_4_6" number="4.6"> >+ <require comment="Reuse GL_KHR_context_flush_control"> >+ <enum name="GL_CONTEXT_RELEASE_BEHAVIOR"/> >+ <enum name="GL_NONE"/> >+ <enum name="GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH"/> >+ </require> >+ <require comment="Reuse GL_ARB_gl_spirv"> >+ <enum name="GL_SHADER_BINARY_FORMAT_SPIR_V"/> >+ <enum name="GL_SPIR_V_BINARY"/> >+ <command name="glSpecializeShader"/> >+ </require> >+ <require comment="Reuse GL_ARB_indirect_parameters"> >+ <enum name="GL_PARAMETER_BUFFER"/> >+ <enum name="GL_PARAMETER_BUFFER_BINDING"/> >+ <command name="glMultiDrawArraysIndirectCount"/> >+ <command name="glMultiDrawElementsIndirectCount"/> >+ </require> >+ <require comment="Reuse GL_KHR_no_error"> >+ <enum name="GL_CONTEXT_FLAG_NO_ERROR_BIT"/> >+ </require> >+ <require comment="Reuse GL_ARB_pipeline_statistics_query"> >+ <enum name="GL_VERTICES_SUBMITTED"/> >+ <enum name="GL_PRIMITIVES_SUBMITTED"/> >+ <enum name="GL_VERTEX_SHADER_INVOCATIONS"/> >+ <enum name="GL_TESS_CONTROL_SHADER_PATCHES"/> >+ <enum name="GL_TESS_EVALUATION_SHADER_INVOCATIONS"/> >+ <enum name="GL_GEOMETRY_SHADER_INVOCATIONS"/> >+ <enum name="GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED"/> >+ <enum name="GL_FRAGMENT_SHADER_INVOCATIONS"/> >+ <enum name="GL_COMPUTE_SHADER_INVOCATIONS"/> >+ <enum name="GL_CLIPPING_INPUT_PRIMITIVES"/> >+ <enum name="GL_CLIPPING_OUTPUT_PRIMITIVES"/> >+ </require> >+ <require comment="Reuse GL_ARB_polygon_offset_clamp"> >+ <enum name="GL_POLYGON_OFFSET_CLAMP"/> >+ <command name="glPolygonOffsetClamp"/> >+ </require> >+ <require comment="Reuse GL_ARB_shader_atomic_counter_ops (none)"/> >+ <require comment="Reuse GL_ARB_shader_draw_parameters (none)"/> >+ <require comment="Reuse GL_ARB_shader_group_vote (none)"/> >+ <require comment="Reuse GL_ARB_spirv_extensions"> >+ <enum name="GL_SPIR_V_EXTENSIONS"/> >+ <enum name="GL_NUM_SPIR_V_EXTENSIONS"/> >+ </require> >+ <require comment="Reuse GL_ARB_texture_filter_anisotropic"> >+ <enum name="GL_TEXTURE_MAX_ANISOTROPY"/> >+ <enum name="GL_MAX_TEXTURE_MAX_ANISOTROPY"/> >+ </require> >+ <require comment="Reuse GL_ARB_transform_feedback_overflow_query"> >+ <enum name="GL_TRANSFORM_FEEDBACK_OVERFLOW"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW"/> >+ </require> >+ </feature> >+ >+ >+ <!-- SECTION: OpenGL ES 1.0/1.1 API interface definitions. --> >+ <feature api="gles1" name="GL_VERSION_ES_CM_1_0" number="1.0"> >+ <require comment="Not used by the API, for compatibility with old gl.h"> >+ <type name="GLbyte"/> >+ <type name="GLclampf"/> >+ <type name="GLshort"/> >+ <type name="GLushort"/> >+ </require> >+ <require> >+ <!-- Additional API definition macros - ES 1.0/1.1, common/common-lite all in one header --> >+ <enum name="GL_VERSION_ES_CL_1_0"/> >+ <enum name="GL_VERSION_ES_CM_1_1"/> >+ <enum name="GL_VERSION_ES_CL_1_1"/> >+ <type name="GLvoid" comment="No longer used in headers"/> >+ <enum name="GL_DEPTH_BUFFER_BIT"/> >+ <enum name="GL_STENCIL_BUFFER_BIT"/> >+ <enum name="GL_COLOR_BUFFER_BIT"/> >+ <enum name="GL_FALSE"/> >+ <enum name="GL_TRUE"/> >+ <enum name="GL_POINTS"/> >+ <enum name="GL_LINES"/> >+ <enum name="GL_LINE_LOOP"/> >+ <enum name="GL_LINE_STRIP"/> >+ <enum name="GL_TRIANGLES"/> >+ <enum name="GL_TRIANGLE_STRIP"/> >+ <enum name="GL_TRIANGLE_FAN"/> >+ <enum name="GL_NEVER"/> >+ <enum name="GL_LESS"/> >+ <enum name="GL_EQUAL"/> >+ <enum name="GL_LEQUAL"/> >+ <enum name="GL_GREATER"/> >+ <enum name="GL_NOTEQUAL"/> >+ <enum name="GL_GEQUAL"/> >+ <enum name="GL_ALWAYS"/> >+ <enum name="GL_ZERO"/> >+ <enum name="GL_ONE"/> >+ <enum name="GL_SRC_COLOR"/> >+ <enum name="GL_ONE_MINUS_SRC_COLOR"/> >+ <enum name="GL_SRC_ALPHA"/> >+ <enum name="GL_ONE_MINUS_SRC_ALPHA"/> >+ <enum name="GL_DST_ALPHA"/> >+ <enum name="GL_ONE_MINUS_DST_ALPHA"/> >+ <enum name="GL_DST_COLOR"/> >+ <enum name="GL_ONE_MINUS_DST_COLOR"/> >+ <enum name="GL_SRC_ALPHA_SATURATE"/> >+ <enum name="GL_CLIP_PLANE0"/> >+ <enum name="GL_CLIP_PLANE1"/> >+ <enum name="GL_CLIP_PLANE2"/> >+ <enum name="GL_CLIP_PLANE3"/> >+ <enum name="GL_CLIP_PLANE4"/> >+ <enum name="GL_CLIP_PLANE5"/> >+ <enum name="GL_FRONT"/> >+ <enum name="GL_BACK"/> >+ <enum name="GL_FRONT_AND_BACK"/> >+ <enum name="GL_FOG"/> >+ <enum name="GL_LIGHTING"/> >+ <enum name="GL_TEXTURE_2D"/> >+ <enum name="GL_CULL_FACE"/> >+ <enum name="GL_ALPHA_TEST"/> >+ <enum name="GL_BLEND"/> >+ <enum name="GL_COLOR_LOGIC_OP"/> >+ <enum name="GL_DITHER"/> >+ <enum name="GL_STENCIL_TEST"/> >+ <enum name="GL_DEPTH_TEST"/> >+ <enum name="GL_POINT_SMOOTH"/> >+ <enum name="GL_LINE_SMOOTH"/> >+ <enum name="GL_SCISSOR_TEST"/> >+ <enum name="GL_COLOR_MATERIAL"/> >+ <enum name="GL_NORMALIZE"/> >+ <enum name="GL_RESCALE_NORMAL"/> >+ <enum name="GL_VERTEX_ARRAY"/> >+ <enum name="GL_NORMAL_ARRAY"/> >+ <enum name="GL_COLOR_ARRAY"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY"/> >+ <enum name="GL_MULTISAMPLE"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_COVERAGE"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_ONE"/> >+ <enum name="GL_SAMPLE_COVERAGE"/> >+ <enum name="GL_NO_ERROR"/> >+ <enum name="GL_INVALID_ENUM"/> >+ <enum name="GL_INVALID_VALUE"/> >+ <enum name="GL_INVALID_OPERATION"/> >+ <enum name="GL_STACK_OVERFLOW"/> >+ <enum name="GL_STACK_UNDERFLOW"/> >+ <enum name="GL_OUT_OF_MEMORY"/> >+ <enum name="GL_EXP"/> >+ <enum name="GL_EXP2"/> >+ <enum name="GL_FOG_DENSITY"/> >+ <enum name="GL_FOG_START"/> >+ <enum name="GL_FOG_END"/> >+ <enum name="GL_FOG_MODE"/> >+ <enum name="GL_FOG_COLOR"/> >+ <enum name="GL_CW"/> >+ <enum name="GL_CCW"/> >+ <enum name="GL_CURRENT_COLOR"/> >+ <enum name="GL_CURRENT_NORMAL"/> >+ <enum name="GL_CURRENT_TEXTURE_COORDS"/> >+ <enum name="GL_POINT_SIZE"/> >+ <enum name="GL_POINT_SIZE_MIN"/> >+ <enum name="GL_POINT_SIZE_MAX"/> >+ <enum name="GL_POINT_FADE_THRESHOLD_SIZE"/> >+ <enum name="GL_POINT_DISTANCE_ATTENUATION"/> >+ <enum name="GL_SMOOTH_POINT_SIZE_RANGE"/> >+ <enum name="GL_LINE_WIDTH"/> >+ <enum name="GL_SMOOTH_LINE_WIDTH_RANGE"/> >+ <enum name="GL_ALIASED_POINT_SIZE_RANGE"/> >+ <enum name="GL_ALIASED_LINE_WIDTH_RANGE"/> >+ <enum name="GL_CULL_FACE_MODE"/> >+ <enum name="GL_FRONT_FACE"/> >+ <enum name="GL_SHADE_MODEL"/> >+ <enum name="GL_DEPTH_RANGE"/> >+ <enum name="GL_DEPTH_WRITEMASK"/> >+ <enum name="GL_DEPTH_CLEAR_VALUE"/> >+ <enum name="GL_DEPTH_FUNC"/> >+ <enum name="GL_STENCIL_CLEAR_VALUE"/> >+ <enum name="GL_STENCIL_FUNC"/> >+ <enum name="GL_STENCIL_VALUE_MASK"/> >+ <enum name="GL_STENCIL_FAIL"/> >+ <enum name="GL_STENCIL_PASS_DEPTH_FAIL"/> >+ <enum name="GL_STENCIL_PASS_DEPTH_PASS"/> >+ <enum name="GL_STENCIL_REF"/> >+ <enum name="GL_STENCIL_WRITEMASK"/> >+ <enum name="GL_MATRIX_MODE"/> >+ <enum name="GL_VIEWPORT"/> >+ <enum name="GL_MODELVIEW_STACK_DEPTH"/> >+ <enum name="GL_PROJECTION_STACK_DEPTH"/> >+ <enum name="GL_TEXTURE_STACK_DEPTH"/> >+ <enum name="GL_MODELVIEW_MATRIX"/> >+ <enum name="GL_PROJECTION_MATRIX"/> >+ <enum name="GL_TEXTURE_MATRIX"/> >+ <enum name="GL_ALPHA_TEST_FUNC"/> >+ <enum name="GL_ALPHA_TEST_REF"/> >+ <enum name="GL_BLEND_DST"/> >+ <enum name="GL_BLEND_SRC"/> >+ <enum name="GL_LOGIC_OP_MODE"/> >+ <enum name="GL_SCISSOR_BOX"/> >+ <enum name="GL_COLOR_CLEAR_VALUE"/> >+ <enum name="GL_COLOR_WRITEMASK"/> >+ <enum name="GL_MAX_LIGHTS"/> >+ <enum name="GL_MAX_CLIP_PLANES"/> >+ <enum name="GL_MAX_TEXTURE_SIZE"/> >+ <enum name="GL_MAX_MODELVIEW_STACK_DEPTH"/> >+ <enum name="GL_MAX_PROJECTION_STACK_DEPTH"/> >+ <enum name="GL_MAX_TEXTURE_STACK_DEPTH"/> >+ <enum name="GL_MAX_VIEWPORT_DIMS"/> >+ <enum name="GL_MAX_TEXTURE_UNITS"/> >+ <enum name="GL_SUBPIXEL_BITS"/> >+ <enum name="GL_RED_BITS"/> >+ <enum name="GL_GREEN_BITS"/> >+ <enum name="GL_BLUE_BITS"/> >+ <enum name="GL_ALPHA_BITS"/> >+ <enum name="GL_DEPTH_BITS"/> >+ <enum name="GL_STENCIL_BITS"/> >+ <enum name="GL_POLYGON_OFFSET_UNITS"/> >+ <enum name="GL_POLYGON_OFFSET_FILL"/> >+ <enum name="GL_POLYGON_OFFSET_FACTOR"/> >+ <enum name="GL_TEXTURE_BINDING_2D"/> >+ <enum name="GL_VERTEX_ARRAY_SIZE"/> >+ <enum name="GL_VERTEX_ARRAY_TYPE"/> >+ <enum name="GL_VERTEX_ARRAY_STRIDE"/> >+ <enum name="GL_NORMAL_ARRAY_TYPE"/> >+ <enum name="GL_NORMAL_ARRAY_STRIDE"/> >+ <enum name="GL_COLOR_ARRAY_SIZE"/> >+ <enum name="GL_COLOR_ARRAY_TYPE"/> >+ <enum name="GL_COLOR_ARRAY_STRIDE"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_SIZE"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_TYPE"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_STRIDE"/> >+ <enum name="GL_VERTEX_ARRAY_POINTER"/> >+ <enum name="GL_NORMAL_ARRAY_POINTER"/> >+ <enum name="GL_COLOR_ARRAY_POINTER"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_POINTER"/> >+ <enum name="GL_SAMPLE_BUFFERS"/> >+ <enum name="GL_SAMPLES"/> >+ <enum name="GL_SAMPLE_COVERAGE_VALUE"/> >+ <enum name="GL_SAMPLE_COVERAGE_INVERT"/> >+ <enum name="GL_NUM_COMPRESSED_TEXTURE_FORMATS"/> >+ <enum name="GL_COMPRESSED_TEXTURE_FORMATS"/> >+ <enum name="GL_DONT_CARE"/> >+ <enum name="GL_FASTEST"/> >+ <enum name="GL_NICEST"/> >+ <enum name="GL_PERSPECTIVE_CORRECTION_HINT"/> >+ <enum name="GL_POINT_SMOOTH_HINT"/> >+ <enum name="GL_LINE_SMOOTH_HINT"/> >+ <enum name="GL_FOG_HINT"/> >+ <enum name="GL_GENERATE_MIPMAP_HINT"/> >+ <enum name="GL_LIGHT_MODEL_AMBIENT"/> >+ <enum name="GL_LIGHT_MODEL_TWO_SIDE"/> >+ <enum name="GL_AMBIENT"/> >+ <enum name="GL_DIFFUSE"/> >+ <enum name="GL_SPECULAR"/> >+ <enum name="GL_POSITION"/> >+ <enum name="GL_SPOT_DIRECTION"/> >+ <enum name="GL_SPOT_EXPONENT"/> >+ <enum name="GL_SPOT_CUTOFF"/> >+ <enum name="GL_CONSTANT_ATTENUATION"/> >+ <enum name="GL_LINEAR_ATTENUATION"/> >+ <enum name="GL_QUADRATIC_ATTENUATION"/> >+ <enum name="GL_BYTE"/> >+ <enum name="GL_UNSIGNED_BYTE"/> >+ <enum name="GL_SHORT"/> >+ <enum name="GL_UNSIGNED_SHORT"/> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_FIXED"/> >+ <enum name="GL_CLEAR"/> >+ <enum name="GL_AND"/> >+ <enum name="GL_AND_REVERSE"/> >+ <enum name="GL_COPY"/> >+ <enum name="GL_AND_INVERTED"/> >+ <enum name="GL_NOOP"/> >+ <enum name="GL_XOR"/> >+ <enum name="GL_OR"/> >+ <enum name="GL_NOR"/> >+ <enum name="GL_EQUIV"/> >+ <enum name="GL_INVERT"/> >+ <enum name="GL_OR_REVERSE"/> >+ <enum name="GL_COPY_INVERTED"/> >+ <enum name="GL_OR_INVERTED"/> >+ <enum name="GL_NAND"/> >+ <enum name="GL_SET"/> >+ <enum name="GL_EMISSION"/> >+ <enum name="GL_SHININESS"/> >+ <enum name="GL_AMBIENT_AND_DIFFUSE"/> >+ <enum name="GL_MODELVIEW"/> >+ <enum name="GL_PROJECTION"/> >+ <enum name="GL_TEXTURE"/> >+ <enum name="GL_ALPHA"/> >+ <enum name="GL_RGB"/> >+ <enum name="GL_RGBA"/> >+ <enum name="GL_LUMINANCE"/> >+ <enum name="GL_LUMINANCE_ALPHA"/> >+ <enum name="GL_UNPACK_ALIGNMENT"/> >+ <enum name="GL_PACK_ALIGNMENT"/> >+ <enum name="GL_UNSIGNED_SHORT_4_4_4_4"/> >+ <enum name="GL_UNSIGNED_SHORT_5_5_5_1"/> >+ <enum name="GL_UNSIGNED_SHORT_5_6_5"/> >+ <enum name="GL_FLAT"/> >+ <enum name="GL_SMOOTH"/> >+ <enum name="GL_KEEP"/> >+ <enum name="GL_REPLACE"/> >+ <enum name="GL_INCR"/> >+ <enum name="GL_DECR"/> >+ <enum name="GL_VENDOR"/> >+ <enum name="GL_RENDERER"/> >+ <enum name="GL_VERSION"/> >+ <enum name="GL_EXTENSIONS"/> >+ <enum name="GL_MODULATE"/> >+ <enum name="GL_DECAL"/> >+ <enum name="GL_ADD"/> >+ <enum name="GL_TEXTURE_ENV_MODE"/> >+ <enum name="GL_TEXTURE_ENV_COLOR"/> >+ <enum name="GL_TEXTURE_ENV"/> >+ <enum name="GL_NEAREST"/> >+ <enum name="GL_LINEAR"/> >+ <enum name="GL_NEAREST_MIPMAP_NEAREST"/> >+ <enum name="GL_LINEAR_MIPMAP_NEAREST"/> >+ <enum name="GL_NEAREST_MIPMAP_LINEAR"/> >+ <enum name="GL_LINEAR_MIPMAP_LINEAR"/> >+ <enum name="GL_TEXTURE_MAG_FILTER"/> >+ <enum name="GL_TEXTURE_MIN_FILTER"/> >+ <enum name="GL_TEXTURE_WRAP_S"/> >+ <enum name="GL_TEXTURE_WRAP_T"/> >+ <enum name="GL_GENERATE_MIPMAP"/> >+ <enum name="GL_TEXTURE0"/> >+ <enum name="GL_TEXTURE1"/> >+ <enum name="GL_TEXTURE2"/> >+ <enum name="GL_TEXTURE3"/> >+ <enum name="GL_TEXTURE4"/> >+ <enum name="GL_TEXTURE5"/> >+ <enum name="GL_TEXTURE6"/> >+ <enum name="GL_TEXTURE7"/> >+ <enum name="GL_TEXTURE8"/> >+ <enum name="GL_TEXTURE9"/> >+ <enum name="GL_TEXTURE10"/> >+ <enum name="GL_TEXTURE11"/> >+ <enum name="GL_TEXTURE12"/> >+ <enum name="GL_TEXTURE13"/> >+ <enum name="GL_TEXTURE14"/> >+ <enum name="GL_TEXTURE15"/> >+ <enum name="GL_TEXTURE16"/> >+ <enum name="GL_TEXTURE17"/> >+ <enum name="GL_TEXTURE18"/> >+ <enum name="GL_TEXTURE19"/> >+ <enum name="GL_TEXTURE20"/> >+ <enum name="GL_TEXTURE21"/> >+ <enum name="GL_TEXTURE22"/> >+ <enum name="GL_TEXTURE23"/> >+ <enum name="GL_TEXTURE24"/> >+ <enum name="GL_TEXTURE25"/> >+ <enum name="GL_TEXTURE26"/> >+ <enum name="GL_TEXTURE27"/> >+ <enum name="GL_TEXTURE28"/> >+ <enum name="GL_TEXTURE29"/> >+ <enum name="GL_TEXTURE30"/> >+ <enum name="GL_TEXTURE31"/> >+ <enum name="GL_ACTIVE_TEXTURE"/> >+ <enum name="GL_CLIENT_ACTIVE_TEXTURE"/> >+ <enum name="GL_REPEAT"/> >+ <enum name="GL_CLAMP_TO_EDGE"/> >+ <enum name="GL_LIGHT0"/> >+ <enum name="GL_LIGHT1"/> >+ <enum name="GL_LIGHT2"/> >+ <enum name="GL_LIGHT3"/> >+ <enum name="GL_LIGHT4"/> >+ <enum name="GL_LIGHT5"/> >+ <enum name="GL_LIGHT6"/> >+ <enum name="GL_LIGHT7"/> >+ <enum name="GL_ARRAY_BUFFER"/> >+ <enum name="GL_ELEMENT_ARRAY_BUFFER"/> >+ <enum name="GL_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_ELEMENT_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_VERTEX_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_NORMAL_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_COLOR_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_STATIC_DRAW"/> >+ <enum name="GL_DYNAMIC_DRAW"/> >+ <enum name="GL_BUFFER_SIZE"/> >+ <enum name="GL_BUFFER_USAGE"/> >+ <enum name="GL_SUBTRACT"/> >+ <enum name="GL_COMBINE"/> >+ <enum name="GL_COMBINE_RGB"/> >+ <enum name="GL_COMBINE_ALPHA"/> >+ <enum name="GL_RGB_SCALE"/> >+ <enum name="GL_ADD_SIGNED"/> >+ <enum name="GL_INTERPOLATE"/> >+ <enum name="GL_CONSTANT"/> >+ <enum name="GL_PRIMARY_COLOR"/> >+ <enum name="GL_PREVIOUS"/> >+ <enum name="GL_OPERAND0_RGB"/> >+ <enum name="GL_OPERAND1_RGB"/> >+ <enum name="GL_OPERAND2_RGB"/> >+ <enum name="GL_OPERAND0_ALPHA"/> >+ <enum name="GL_OPERAND1_ALPHA"/> >+ <enum name="GL_OPERAND2_ALPHA"/> >+ <enum name="GL_ALPHA_SCALE"/> >+ <enum name="GL_SRC0_RGB"/> >+ <enum name="GL_SRC1_RGB"/> >+ <enum name="GL_SRC2_RGB"/> >+ <enum name="GL_SRC0_ALPHA"/> >+ <enum name="GL_SRC1_ALPHA"/> >+ <enum name="GL_SRC2_ALPHA"/> >+ <enum name="GL_DOT3_RGB"/> >+ <enum name="GL_DOT3_RGBA"/> >+ </require> >+ <require profile="common"> >+ <command name="glAlphaFunc"/> >+ <command name="glClearColor"/> >+ <command name="glClearDepthf"/> >+ <command name="glClipPlanef"/> >+ <command name="glColor4f"/> >+ <command name="glDepthRangef"/> >+ <command name="glFogf"/> >+ <command name="glFogfv"/> >+ <command name="glFrustumf"/> >+ <command name="glGetClipPlanef"/> >+ <command name="glGetFloatv"/> >+ <command name="glGetLightfv"/> >+ <command name="glGetMaterialfv"/> >+ <command name="glGetTexEnvfv"/> >+ <command name="glGetTexParameterfv"/> >+ <command name="glLightModelf"/> >+ <command name="glLightModelfv"/> >+ <command name="glLightf"/> >+ <command name="glLightfv"/> >+ <command name="glLineWidth"/> >+ <command name="glLoadMatrixf"/> >+ <command name="glMaterialf"/> >+ <command name="glMaterialfv"/> >+ <command name="glMultMatrixf"/> >+ <command name="glMultiTexCoord4f"/> >+ <command name="glNormal3f"/> >+ <command name="glOrthof"/> >+ <command name="glPointParameterf"/> >+ <command name="glPointParameterfv"/> >+ <command name="glPointSize"/> >+ <command name="glPolygonOffset"/> >+ <command name="glRotatef"/> >+ <command name="glScalef"/> >+ <command name="glTexEnvf"/> >+ <command name="glTexEnvfv"/> >+ <command name="glTexParameterf"/> >+ <command name="glTexParameterfv"/> >+ <command name="glTranslatef"/> >+ </require> >+ <require> >+ <command name="glActiveTexture"/> >+ <command name="glAlphaFuncx"/> >+ <command name="glBindBuffer"/> >+ <command name="glBindTexture"/> >+ <command name="glBlendFunc"/> >+ <command name="glBufferData"/> >+ <command name="glBufferSubData"/> >+ <command name="glClear"/> >+ <command name="glClearColorx"/> >+ <command name="glClearDepthx"/> >+ <command name="glClearStencil"/> >+ <command name="glClientActiveTexture"/> >+ <command name="glClipPlanex"/> >+ <command name="glColor4ub"/> >+ <command name="glColor4x"/> >+ <command name="glColorMask"/> >+ <command name="glColorPointer"/> >+ <command name="glCompressedTexImage2D"/> >+ <command name="glCompressedTexSubImage2D"/> >+ <command name="glCopyTexImage2D"/> >+ <command name="glCopyTexSubImage2D"/> >+ <command name="glCullFace"/> >+ <command name="glDeleteBuffers"/> >+ <command name="glDeleteTextures"/> >+ <command name="glDepthFunc"/> >+ <command name="glDepthMask"/> >+ <command name="glDepthRangex"/> >+ <command name="glDisable"/> >+ <command name="glDisableClientState"/> >+ <command name="glDrawArrays"/> >+ <command name="glDrawElements"/> >+ <command name="glEnable"/> >+ <command name="glEnableClientState"/> >+ <command name="glFinish"/> >+ <command name="glFlush"/> >+ <command name="glFogx"/> >+ <command name="glFogxv"/> >+ <command name="glFrontFace"/> >+ <command name="glFrustumx"/> >+ <command name="glGetBooleanv"/> >+ <command name="glGetBufferParameteriv"/> >+ <command name="glGetClipPlanex"/> >+ <command name="glGenBuffers"/> >+ <command name="glGenTextures"/> >+ <command name="glGetError"/> >+ <command name="glGetFixedv"/> >+ <command name="glGetIntegerv"/> >+ <command name="glGetLightxv"/> >+ <command name="glGetMaterialxv"/> >+ <command name="glGetPointerv"/> >+ <command name="glGetString"/> >+ <command name="glGetTexEnviv"/> >+ <command name="glGetTexEnvxv"/> >+ <command name="glGetTexParameteriv"/> >+ <command name="glGetTexParameterxv"/> >+ <command name="glHint"/> >+ <command name="glIsBuffer"/> >+ <command name="glIsEnabled"/> >+ <command name="glIsTexture"/> >+ <command name="glLightModelx"/> >+ <command name="glLightModelxv"/> >+ <command name="glLightx"/> >+ <command name="glLightxv"/> >+ <command name="glLineWidthx"/> >+ <command name="glLoadIdentity"/> >+ <command name="glLoadMatrixx"/> >+ <command name="glLogicOp"/> >+ <command name="glMaterialx"/> >+ <command name="glMaterialxv"/> >+ <command name="glMatrixMode"/> >+ <command name="glMultMatrixx"/> >+ <command name="glMultiTexCoord4x"/> >+ <command name="glNormal3x"/> >+ <command name="glNormalPointer"/> >+ <command name="glOrthox"/> >+ <command name="glPixelStorei"/> >+ <command name="glPointParameterx"/> >+ <command name="glPointParameterxv"/> >+ <command name="glPointSizex"/> >+ <command name="glPolygonOffsetx"/> >+ <command name="glPopMatrix"/> >+ <command name="glPushMatrix"/> >+ <command name="glReadPixels"/> >+ <command name="glRotatex"/> >+ <command name="glSampleCoverage"/> >+ <command name="glSampleCoveragex"/> >+ <command name="glScalex"/> >+ <command name="glScissor"/> >+ <command name="glShadeModel"/> >+ <command name="glStencilFunc"/> >+ <command name="glStencilMask"/> >+ <command name="glStencilOp"/> >+ <command name="glTexCoordPointer"/> >+ <command name="glTexEnvi"/> >+ <command name="glTexEnvx"/> >+ <command name="glTexEnviv"/> >+ <command name="glTexEnvxv"/> >+ <command name="glTexImage2D"/> >+ <command name="glTexParameteri"/> >+ <command name="glTexParameterx"/> >+ <command name="glTexParameteriv"/> >+ <command name="glTexParameterxv"/> >+ <command name="glTexSubImage2D"/> >+ <command name="glTranslatex"/> >+ <command name="glVertexPointer"/> >+ <command name="glViewport"/> >+ </require> >+ </feature> >+ <feature api="gles2" name="GL_ES_VERSION_2_0" number="2.0"> >+ <require comment="Not used by the API, for compatibility with old gl2.h"> >+ <type name="GLbyte"/> >+ <type name="GLclampf"/> >+ <type name="GLfixed"/> >+ <type name="GLshort"/> >+ <type name="GLushort"/> >+ <type name="GLvoid" comment="No longer used in headers"/> >+ </require> >+ <require comment="Not used by the API; put here so this type doesn't need to be declared in gl2ext.h"> >+ <type name="GLsync"/> >+ <type name="GLint64"/> >+ <type name="GLuint64"/> >+ </require> >+ <require> >+ <enum name="GL_DEPTH_BUFFER_BIT"/> >+ <enum name="GL_STENCIL_BUFFER_BIT"/> >+ <enum name="GL_COLOR_BUFFER_BIT"/> >+ <enum name="GL_FALSE"/> >+ <enum name="GL_TRUE"/> >+ <enum name="GL_POINTS"/> >+ <enum name="GL_LINES"/> >+ <enum name="GL_LINE_LOOP"/> >+ <enum name="GL_LINE_STRIP"/> >+ <enum name="GL_TRIANGLES"/> >+ <enum name="GL_TRIANGLE_STRIP"/> >+ <enum name="GL_TRIANGLE_FAN"/> >+ <enum name="GL_ZERO"/> >+ <enum name="GL_ONE"/> >+ <enum name="GL_SRC_COLOR"/> >+ <enum name="GL_ONE_MINUS_SRC_COLOR"/> >+ <enum name="GL_SRC_ALPHA"/> >+ <enum name="GL_ONE_MINUS_SRC_ALPHA"/> >+ <enum name="GL_DST_ALPHA"/> >+ <enum name="GL_ONE_MINUS_DST_ALPHA"/> >+ <enum name="GL_DST_COLOR"/> >+ <enum name="GL_ONE_MINUS_DST_COLOR"/> >+ <enum name="GL_SRC_ALPHA_SATURATE"/> >+ <enum name="GL_FUNC_ADD"/> >+ <enum name="GL_BLEND_EQUATION"/> >+ <enum name="GL_BLEND_EQUATION_RGB"/> >+ <enum name="GL_BLEND_EQUATION_ALPHA"/> >+ <enum name="GL_FUNC_SUBTRACT"/> >+ <enum name="GL_FUNC_REVERSE_SUBTRACT"/> >+ <enum name="GL_BLEND_DST_RGB"/> >+ <enum name="GL_BLEND_SRC_RGB"/> >+ <enum name="GL_BLEND_DST_ALPHA"/> >+ <enum name="GL_BLEND_SRC_ALPHA"/> >+ <enum name="GL_CONSTANT_COLOR"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_COLOR"/> >+ <enum name="GL_CONSTANT_ALPHA"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_ALPHA"/> >+ <enum name="GL_BLEND_COLOR"/> >+ <enum name="GL_ARRAY_BUFFER"/> >+ <enum name="GL_ELEMENT_ARRAY_BUFFER"/> >+ <enum name="GL_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_ELEMENT_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_STREAM_DRAW"/> >+ <enum name="GL_STATIC_DRAW"/> >+ <enum name="GL_DYNAMIC_DRAW"/> >+ <enum name="GL_BUFFER_SIZE"/> >+ <enum name="GL_BUFFER_USAGE"/> >+ <enum name="GL_CURRENT_VERTEX_ATTRIB"/> >+ <enum name="GL_FRONT"/> >+ <enum name="GL_BACK"/> >+ <enum name="GL_FRONT_AND_BACK"/> >+ <enum name="GL_TEXTURE_2D"/> >+ <enum name="GL_CULL_FACE"/> >+ <enum name="GL_BLEND"/> >+ <enum name="GL_DITHER"/> >+ <enum name="GL_STENCIL_TEST"/> >+ <enum name="GL_DEPTH_TEST"/> >+ <enum name="GL_SCISSOR_TEST"/> >+ <enum name="GL_POLYGON_OFFSET_FILL"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_COVERAGE"/> >+ <enum name="GL_SAMPLE_COVERAGE"/> >+ <enum name="GL_NO_ERROR"/> >+ <enum name="GL_INVALID_ENUM"/> >+ <enum name="GL_INVALID_VALUE"/> >+ <enum name="GL_INVALID_OPERATION"/> >+ <enum name="GL_OUT_OF_MEMORY"/> >+ <enum name="GL_CW"/> >+ <enum name="GL_CCW"/> >+ <enum name="GL_LINE_WIDTH"/> >+ <enum name="GL_ALIASED_POINT_SIZE_RANGE"/> >+ <enum name="GL_ALIASED_LINE_WIDTH_RANGE"/> >+ <enum name="GL_CULL_FACE_MODE"/> >+ <enum name="GL_FRONT_FACE"/> >+ <enum name="GL_DEPTH_RANGE"/> >+ <enum name="GL_DEPTH_WRITEMASK"/> >+ <enum name="GL_DEPTH_CLEAR_VALUE"/> >+ <enum name="GL_DEPTH_FUNC"/> >+ <enum name="GL_STENCIL_CLEAR_VALUE"/> >+ <enum name="GL_STENCIL_FUNC"/> >+ <enum name="GL_STENCIL_FAIL"/> >+ <enum name="GL_STENCIL_PASS_DEPTH_FAIL"/> >+ <enum name="GL_STENCIL_PASS_DEPTH_PASS"/> >+ <enum name="GL_STENCIL_REF"/> >+ <enum name="GL_STENCIL_VALUE_MASK"/> >+ <enum name="GL_STENCIL_WRITEMASK"/> >+ <enum name="GL_STENCIL_BACK_FUNC"/> >+ <enum name="GL_STENCIL_BACK_FAIL"/> >+ <enum name="GL_STENCIL_BACK_PASS_DEPTH_FAIL"/> >+ <enum name="GL_STENCIL_BACK_PASS_DEPTH_PASS"/> >+ <enum name="GL_STENCIL_BACK_REF"/> >+ <enum name="GL_STENCIL_BACK_VALUE_MASK"/> >+ <enum name="GL_STENCIL_BACK_WRITEMASK"/> >+ <enum name="GL_VIEWPORT"/> >+ <enum name="GL_SCISSOR_BOX"/> >+ <enum name="GL_COLOR_CLEAR_VALUE"/> >+ <enum name="GL_COLOR_WRITEMASK"/> >+ <enum name="GL_UNPACK_ALIGNMENT"/> >+ <enum name="GL_PACK_ALIGNMENT"/> >+ <enum name="GL_MAX_TEXTURE_SIZE"/> >+ <enum name="GL_MAX_VIEWPORT_DIMS"/> >+ <enum name="GL_SUBPIXEL_BITS"/> >+ <enum name="GL_RED_BITS"/> >+ <enum name="GL_GREEN_BITS"/> >+ <enum name="GL_BLUE_BITS"/> >+ <enum name="GL_ALPHA_BITS"/> >+ <enum name="GL_DEPTH_BITS"/> >+ <enum name="GL_STENCIL_BITS"/> >+ <enum name="GL_POLYGON_OFFSET_UNITS"/> >+ <enum name="GL_POLYGON_OFFSET_FACTOR"/> >+ <enum name="GL_TEXTURE_BINDING_2D"/> >+ <enum name="GL_SAMPLE_BUFFERS"/> >+ <enum name="GL_SAMPLES"/> >+ <enum name="GL_SAMPLE_COVERAGE_VALUE"/> >+ <enum name="GL_SAMPLE_COVERAGE_INVERT"/> >+ <enum name="GL_NUM_COMPRESSED_TEXTURE_FORMATS"/> >+ <enum name="GL_COMPRESSED_TEXTURE_FORMATS"/> >+ <enum name="GL_DONT_CARE"/> >+ <enum name="GL_FASTEST"/> >+ <enum name="GL_NICEST"/> >+ <enum name="GL_GENERATE_MIPMAP_HINT"/> >+ <enum name="GL_BYTE"/> >+ <enum name="GL_UNSIGNED_BYTE"/> >+ <enum name="GL_SHORT"/> >+ <enum name="GL_UNSIGNED_SHORT"/> >+ <enum name="GL_INT"/> >+ <enum name="GL_UNSIGNED_INT"/> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_FIXED"/> >+ <enum name="GL_DEPTH_COMPONENT"/> >+ <enum name="GL_ALPHA"/> >+ <enum name="GL_RGB"/> >+ <enum name="GL_RGBA"/> >+ <enum name="GL_LUMINANCE"/> >+ <enum name="GL_LUMINANCE_ALPHA"/> >+ <enum name="GL_UNSIGNED_SHORT_4_4_4_4"/> >+ <enum name="GL_UNSIGNED_SHORT_5_5_5_1"/> >+ <enum name="GL_UNSIGNED_SHORT_5_6_5"/> >+ <enum name="GL_FRAGMENT_SHADER"/> >+ <enum name="GL_VERTEX_SHADER"/> >+ <enum name="GL_MAX_VERTEX_ATTRIBS"/> >+ <enum name="GL_MAX_VERTEX_UNIFORM_VECTORS"/> >+ <enum name="GL_MAX_VARYING_VECTORS"/> >+ <enum name="GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_FRAGMENT_UNIFORM_VECTORS"/> >+ <enum name="GL_SHADER_TYPE"/> >+ <enum name="GL_DELETE_STATUS"/> >+ <enum name="GL_LINK_STATUS"/> >+ <enum name="GL_VALIDATE_STATUS"/> >+ <enum name="GL_ATTACHED_SHADERS"/> >+ <enum name="GL_ACTIVE_UNIFORMS"/> >+ <enum name="GL_ACTIVE_UNIFORM_MAX_LENGTH"/> >+ <enum name="GL_ACTIVE_ATTRIBUTES"/> >+ <enum name="GL_ACTIVE_ATTRIBUTE_MAX_LENGTH"/> >+ <enum name="GL_SHADING_LANGUAGE_VERSION"/> >+ <enum name="GL_CURRENT_PROGRAM"/> >+ <enum name="GL_NEVER"/> >+ <enum name="GL_LESS"/> >+ <enum name="GL_EQUAL"/> >+ <enum name="GL_LEQUAL"/> >+ <enum name="GL_GREATER"/> >+ <enum name="GL_NOTEQUAL"/> >+ <enum name="GL_GEQUAL"/> >+ <enum name="GL_ALWAYS"/> >+ <enum name="GL_KEEP"/> >+ <enum name="GL_REPLACE"/> >+ <enum name="GL_INCR"/> >+ <enum name="GL_DECR"/> >+ <enum name="GL_INVERT"/> >+ <enum name="GL_INCR_WRAP"/> >+ <enum name="GL_DECR_WRAP"/> >+ <enum name="GL_VENDOR"/> >+ <enum name="GL_RENDERER"/> >+ <enum name="GL_VERSION"/> >+ <enum name="GL_EXTENSIONS"/> >+ <enum name="GL_NEAREST"/> >+ <enum name="GL_LINEAR"/> >+ <enum name="GL_NEAREST_MIPMAP_NEAREST"/> >+ <enum name="GL_LINEAR_MIPMAP_NEAREST"/> >+ <enum name="GL_NEAREST_MIPMAP_LINEAR"/> >+ <enum name="GL_LINEAR_MIPMAP_LINEAR"/> >+ <enum name="GL_TEXTURE_MAG_FILTER"/> >+ <enum name="GL_TEXTURE_MIN_FILTER"/> >+ <enum name="GL_TEXTURE_WRAP_S"/> >+ <enum name="GL_TEXTURE_WRAP_T"/> >+ <enum name="GL_TEXTURE"/> >+ <enum name="GL_TEXTURE_CUBE_MAP"/> >+ <enum name="GL_TEXTURE_BINDING_CUBE_MAP"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_X"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z"/> >+ <enum name="GL_MAX_CUBE_MAP_TEXTURE_SIZE"/> >+ <enum name="GL_TEXTURE0"/> >+ <enum name="GL_TEXTURE1"/> >+ <enum name="GL_TEXTURE2"/> >+ <enum name="GL_TEXTURE3"/> >+ <enum name="GL_TEXTURE4"/> >+ <enum name="GL_TEXTURE5"/> >+ <enum name="GL_TEXTURE6"/> >+ <enum name="GL_TEXTURE7"/> >+ <enum name="GL_TEXTURE8"/> >+ <enum name="GL_TEXTURE9"/> >+ <enum name="GL_TEXTURE10"/> >+ <enum name="GL_TEXTURE11"/> >+ <enum name="GL_TEXTURE12"/> >+ <enum name="GL_TEXTURE13"/> >+ <enum name="GL_TEXTURE14"/> >+ <enum name="GL_TEXTURE15"/> >+ <enum name="GL_TEXTURE16"/> >+ <enum name="GL_TEXTURE17"/> >+ <enum name="GL_TEXTURE18"/> >+ <enum name="GL_TEXTURE19"/> >+ <enum name="GL_TEXTURE20"/> >+ <enum name="GL_TEXTURE21"/> >+ <enum name="GL_TEXTURE22"/> >+ <enum name="GL_TEXTURE23"/> >+ <enum name="GL_TEXTURE24"/> >+ <enum name="GL_TEXTURE25"/> >+ <enum name="GL_TEXTURE26"/> >+ <enum name="GL_TEXTURE27"/> >+ <enum name="GL_TEXTURE28"/> >+ <enum name="GL_TEXTURE29"/> >+ <enum name="GL_TEXTURE30"/> >+ <enum name="GL_TEXTURE31"/> >+ <enum name="GL_ACTIVE_TEXTURE"/> >+ <enum name="GL_REPEAT"/> >+ <enum name="GL_CLAMP_TO_EDGE"/> >+ <enum name="GL_MIRRORED_REPEAT"/> >+ <enum name="GL_FLOAT_VEC2"/> >+ <enum name="GL_FLOAT_VEC3"/> >+ <enum name="GL_FLOAT_VEC4"/> >+ <enum name="GL_INT_VEC2"/> >+ <enum name="GL_INT_VEC3"/> >+ <enum name="GL_INT_VEC4"/> >+ <enum name="GL_BOOL"/> >+ <enum name="GL_BOOL_VEC2"/> >+ <enum name="GL_BOOL_VEC3"/> >+ <enum name="GL_BOOL_VEC4"/> >+ <enum name="GL_FLOAT_MAT2"/> >+ <enum name="GL_FLOAT_MAT3"/> >+ <enum name="GL_FLOAT_MAT4"/> >+ <enum name="GL_SAMPLER_2D"/> >+ <enum name="GL_SAMPLER_CUBE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_ENABLED"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_SIZE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_STRIDE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_TYPE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_NORMALIZED"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_POINTER"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_IMPLEMENTATION_COLOR_READ_TYPE"/> >+ <enum name="GL_IMPLEMENTATION_COLOR_READ_FORMAT"/> >+ <enum name="GL_COMPILE_STATUS"/> >+ <enum name="GL_INFO_LOG_LENGTH"/> >+ <enum name="GL_SHADER_SOURCE_LENGTH"/> >+ <enum name="GL_SHADER_COMPILER"/> >+ <enum name="GL_SHADER_BINARY_FORMATS"/> >+ <enum name="GL_NUM_SHADER_BINARY_FORMATS"/> >+ <enum name="GL_LOW_FLOAT"/> >+ <enum name="GL_MEDIUM_FLOAT"/> >+ <enum name="GL_HIGH_FLOAT"/> >+ <enum name="GL_LOW_INT"/> >+ <enum name="GL_MEDIUM_INT"/> >+ <enum name="GL_HIGH_INT"/> >+ <enum name="GL_FRAMEBUFFER"/> >+ <enum name="GL_RENDERBUFFER"/> >+ <enum name="GL_RGBA4"/> >+ <enum name="GL_RGB5_A1"/> >+ <enum name="GL_RGB565"/> >+ <enum name="GL_DEPTH_COMPONENT16"/> >+ <enum name="GL_STENCIL_INDEX8"/> >+ <enum name="GL_RENDERBUFFER_WIDTH"/> >+ <enum name="GL_RENDERBUFFER_HEIGHT"/> >+ <enum name="GL_RENDERBUFFER_INTERNAL_FORMAT"/> >+ <enum name="GL_RENDERBUFFER_RED_SIZE"/> >+ <enum name="GL_RENDERBUFFER_GREEN_SIZE"/> >+ <enum name="GL_RENDERBUFFER_BLUE_SIZE"/> >+ <enum name="GL_RENDERBUFFER_ALPHA_SIZE"/> >+ <enum name="GL_RENDERBUFFER_DEPTH_SIZE"/> >+ <enum name="GL_RENDERBUFFER_STENCIL_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE"/> >+ <enum name="GL_COLOR_ATTACHMENT0"/> >+ <enum name="GL_DEPTH_ATTACHMENT"/> >+ <enum name="GL_STENCIL_ATTACHMENT"/> >+ <enum name="GL_NONE"/> >+ <enum name="GL_FRAMEBUFFER_COMPLETE"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS"/> >+ <enum name="GL_FRAMEBUFFER_UNSUPPORTED"/> >+ <enum name="GL_FRAMEBUFFER_BINDING"/> >+ <enum name="GL_RENDERBUFFER_BINDING"/> >+ <enum name="GL_MAX_RENDERBUFFER_SIZE"/> >+ <enum name="GL_INVALID_FRAMEBUFFER_OPERATION"/> >+ <command name="glActiveTexture"/> >+ <command name="glAttachShader"/> >+ <command name="glBindAttribLocation"/> >+ <command name="glBindBuffer"/> >+ <command name="glBindFramebuffer"/> >+ <command name="glBindRenderbuffer"/> >+ <command name="glBindTexture"/> >+ <command name="glBlendColor"/> >+ <command name="glBlendEquation"/> >+ <command name="glBlendEquationSeparate"/> >+ <command name="glBlendFunc"/> >+ <command name="glBlendFuncSeparate"/> >+ <command name="glBufferData"/> >+ <command name="glBufferSubData"/> >+ <command name="glCheckFramebufferStatus"/> >+ <command name="glClear"/> >+ <command name="glClearColor"/> >+ <command name="glClearDepthf"/> >+ <command name="glClearStencil"/> >+ <command name="glColorMask"/> >+ <command name="glCompileShader"/> >+ <command name="glCompressedTexImage2D"/> >+ <command name="glCompressedTexSubImage2D"/> >+ <command name="glCopyTexImage2D"/> >+ <command name="glCopyTexSubImage2D"/> >+ <command name="glCreateProgram"/> >+ <command name="glCreateShader"/> >+ <command name="glCullFace"/> >+ <command name="glDeleteBuffers"/> >+ <command name="glDeleteFramebuffers"/> >+ <command name="glDeleteProgram"/> >+ <command name="glDeleteRenderbuffers"/> >+ <command name="glDeleteShader"/> >+ <command name="glDeleteTextures"/> >+ <command name="glDepthFunc"/> >+ <command name="glDepthMask"/> >+ <command name="glDepthRangef"/> >+ <command name="glDetachShader"/> >+ <command name="glDisable"/> >+ <command name="glDisableVertexAttribArray"/> >+ <command name="glDrawArrays"/> >+ <command name="glDrawElements"/> >+ <command name="glEnable"/> >+ <command name="glEnableVertexAttribArray"/> >+ <command name="glFinish"/> >+ <command name="glFlush"/> >+ <command name="glFramebufferRenderbuffer"/> >+ <command name="glFramebufferTexture2D"/> >+ <command name="glFrontFace"/> >+ <command name="glGenBuffers"/> >+ <command name="glGenerateMipmap"/> >+ <command name="glGenFramebuffers"/> >+ <command name="glGenRenderbuffers"/> >+ <command name="glGenTextures"/> >+ <command name="glGetActiveAttrib"/> >+ <command name="glGetActiveUniform"/> >+ <command name="glGetAttachedShaders"/> >+ <command name="glGetAttribLocation"/> >+ <command name="glGetBooleanv"/> >+ <command name="glGetBufferParameteriv"/> >+ <command name="glGetError"/> >+ <command name="glGetFloatv"/> >+ <command name="glGetFramebufferAttachmentParameteriv"/> >+ <command name="glGetIntegerv"/> >+ <command name="glGetProgramiv"/> >+ <command name="glGetProgramInfoLog"/> >+ <command name="glGetRenderbufferParameteriv"/> >+ <command name="glGetShaderiv"/> >+ <command name="glGetShaderInfoLog"/> >+ <command name="glGetShaderPrecisionFormat"/> >+ <command name="glGetShaderSource"/> >+ <command name="glGetString"/> >+ <command name="glGetTexParameterfv"/> >+ <command name="glGetTexParameteriv"/> >+ <command name="glGetUniformfv"/> >+ <command name="glGetUniformiv"/> >+ <command name="glGetUniformLocation"/> >+ <command name="glGetVertexAttribfv"/> >+ <command name="glGetVertexAttribiv"/> >+ <command name="glGetVertexAttribPointerv"/> >+ <command name="glHint"/> >+ <command name="glIsBuffer"/> >+ <command name="glIsEnabled"/> >+ <command name="glIsFramebuffer"/> >+ <command name="glIsProgram"/> >+ <command name="glIsRenderbuffer"/> >+ <command name="glIsShader"/> >+ <command name="glIsTexture"/> >+ <command name="glLineWidth"/> >+ <command name="glLinkProgram"/> >+ <command name="glPixelStorei"/> >+ <command name="glPolygonOffset"/> >+ <command name="glReadPixels"/> >+ <command name="glReleaseShaderCompiler"/> >+ <command name="glRenderbufferStorage"/> >+ <command name="glSampleCoverage"/> >+ <command name="glScissor"/> >+ <command name="glShaderBinary"/> >+ <command name="glShaderSource"/> >+ <command name="glStencilFunc"/> >+ <command name="glStencilFuncSeparate"/> >+ <command name="glStencilMask"/> >+ <command name="glStencilMaskSeparate"/> >+ <command name="glStencilOp"/> >+ <command name="glStencilOpSeparate"/> >+ <command name="glTexImage2D"/> >+ <command name="glTexParameterf"/> >+ <command name="glTexParameterfv"/> >+ <command name="glTexParameteri"/> >+ <command name="glTexParameteriv"/> >+ <command name="glTexSubImage2D"/> >+ <command name="glUniform1f"/> >+ <command name="glUniform1fv"/> >+ <command name="glUniform1i"/> >+ <command name="glUniform1iv"/> >+ <command name="glUniform2f"/> >+ <command name="glUniform2fv"/> >+ <command name="glUniform2i"/> >+ <command name="glUniform2iv"/> >+ <command name="glUniform3f"/> >+ <command name="glUniform3fv"/> >+ <command name="glUniform3i"/> >+ <command name="glUniform3iv"/> >+ <command name="glUniform4f"/> >+ <command name="glUniform4fv"/> >+ <command name="glUniform4i"/> >+ <command name="glUniform4iv"/> >+ <command name="glUniformMatrix2fv"/> >+ <command name="glUniformMatrix3fv"/> >+ <command name="glUniformMatrix4fv"/> >+ <command name="glUseProgram"/> >+ <command name="glValidateProgram"/> >+ <command name="glVertexAttrib1f"/> >+ <command name="glVertexAttrib1fv"/> >+ <command name="glVertexAttrib2f"/> >+ <command name="glVertexAttrib2fv"/> >+ <command name="glVertexAttrib3f"/> >+ <command name="glVertexAttrib3fv"/> >+ <command name="glVertexAttrib4f"/> >+ <command name="glVertexAttrib4fv"/> >+ <command name="glVertexAttribPointer"/> >+ <command name="glViewport"/> >+ </require> >+ </feature> >+ <feature api="gles2" name="GL_ES_VERSION_3_0" number="3.0"> >+ <require comment="Not used by the API, for compatibility with old gl2.h"> >+ <type name="GLhalf"/> >+ </require> >+ <require> >+ <enum name="GL_READ_BUFFER"/> >+ <enum name="GL_UNPACK_ROW_LENGTH"/> >+ <enum name="GL_UNPACK_SKIP_ROWS"/> >+ <enum name="GL_UNPACK_SKIP_PIXELS"/> >+ <enum name="GL_PACK_ROW_LENGTH"/> >+ <enum name="GL_PACK_SKIP_ROWS"/> >+ <enum name="GL_PACK_SKIP_PIXELS"/> >+ <enum name="GL_COLOR"/> >+ <enum name="GL_DEPTH"/> >+ <enum name="GL_STENCIL"/> >+ <enum name="GL_RED"/> >+ <enum name="GL_RGB8"/> >+ <enum name="GL_RGBA8"/> >+ <enum name="GL_RGB10_A2"/> >+ <enum name="GL_TEXTURE_BINDING_3D"/> >+ <enum name="GL_UNPACK_SKIP_IMAGES"/> >+ <enum name="GL_UNPACK_IMAGE_HEIGHT"/> >+ <enum name="GL_TEXTURE_3D"/> >+ <enum name="GL_TEXTURE_WRAP_R"/> >+ <enum name="GL_MAX_3D_TEXTURE_SIZE"/> >+ <enum name="GL_UNSIGNED_INT_2_10_10_10_REV"/> >+ <enum name="GL_MAX_ELEMENTS_VERTICES"/> >+ <enum name="GL_MAX_ELEMENTS_INDICES"/> >+ <enum name="GL_TEXTURE_MIN_LOD"/> >+ <enum name="GL_TEXTURE_MAX_LOD"/> >+ <enum name="GL_TEXTURE_BASE_LEVEL"/> >+ <enum name="GL_TEXTURE_MAX_LEVEL"/> >+ <enum name="GL_MIN"/> >+ <enum name="GL_MAX"/> >+ <enum name="GL_DEPTH_COMPONENT24"/> >+ <enum name="GL_MAX_TEXTURE_LOD_BIAS"/> >+ <enum name="GL_TEXTURE_COMPARE_MODE"/> >+ <enum name="GL_TEXTURE_COMPARE_FUNC"/> >+ <enum name="GL_CURRENT_QUERY"/> >+ <enum name="GL_QUERY_RESULT"/> >+ <enum name="GL_QUERY_RESULT_AVAILABLE"/> >+ <enum name="GL_BUFFER_MAPPED"/> >+ <enum name="GL_BUFFER_MAP_POINTER"/> >+ <enum name="GL_STREAM_READ"/> >+ <enum name="GL_STREAM_COPY"/> >+ <enum name="GL_STATIC_READ"/> >+ <enum name="GL_STATIC_COPY"/> >+ <enum name="GL_DYNAMIC_READ"/> >+ <enum name="GL_DYNAMIC_COPY"/> >+ <enum name="GL_MAX_DRAW_BUFFERS"/> >+ <enum name="GL_DRAW_BUFFER0"/> >+ <enum name="GL_DRAW_BUFFER1"/> >+ <enum name="GL_DRAW_BUFFER2"/> >+ <enum name="GL_DRAW_BUFFER3"/> >+ <enum name="GL_DRAW_BUFFER4"/> >+ <enum name="GL_DRAW_BUFFER5"/> >+ <enum name="GL_DRAW_BUFFER6"/> >+ <enum name="GL_DRAW_BUFFER7"/> >+ <enum name="GL_DRAW_BUFFER8"/> >+ <enum name="GL_DRAW_BUFFER9"/> >+ <enum name="GL_DRAW_BUFFER10"/> >+ <enum name="GL_DRAW_BUFFER11"/> >+ <enum name="GL_DRAW_BUFFER12"/> >+ <enum name="GL_DRAW_BUFFER13"/> >+ <enum name="GL_DRAW_BUFFER14"/> >+ <enum name="GL_DRAW_BUFFER15"/> >+ <enum name="GL_MAX_FRAGMENT_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_VERTEX_UNIFORM_COMPONENTS"/> >+ <enum name="GL_SAMPLER_3D"/> >+ <enum name="GL_SAMPLER_2D_SHADOW"/> >+ <enum name="GL_FRAGMENT_SHADER_DERIVATIVE_HINT"/> >+ <enum name="GL_PIXEL_PACK_BUFFER"/> >+ <enum name="GL_PIXEL_UNPACK_BUFFER"/> >+ <enum name="GL_PIXEL_PACK_BUFFER_BINDING"/> >+ <enum name="GL_PIXEL_UNPACK_BUFFER_BINDING"/> >+ <enum name="GL_FLOAT_MAT2x3"/> >+ <enum name="GL_FLOAT_MAT2x4"/> >+ <enum name="GL_FLOAT_MAT3x2"/> >+ <enum name="GL_FLOAT_MAT3x4"/> >+ <enum name="GL_FLOAT_MAT4x2"/> >+ <enum name="GL_FLOAT_MAT4x3"/> >+ <enum name="GL_SRGB"/> >+ <enum name="GL_SRGB8"/> >+ <enum name="GL_SRGB8_ALPHA8"/> >+ <enum name="GL_COMPARE_REF_TO_TEXTURE"/> >+ <enum name="GL_MAJOR_VERSION"/> >+ <enum name="GL_MINOR_VERSION"/> >+ <enum name="GL_NUM_EXTENSIONS"/> >+ <enum name="GL_RGBA32F"/> >+ <enum name="GL_RGB32F"/> >+ <enum name="GL_RGBA16F"/> >+ <enum name="GL_RGB16F"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_INTEGER"/> >+ <enum name="GL_MAX_ARRAY_TEXTURE_LAYERS"/> >+ <enum name="GL_MIN_PROGRAM_TEXEL_OFFSET"/> >+ <enum name="GL_MAX_PROGRAM_TEXEL_OFFSET"/> >+ <enum name="GL_MAX_VARYING_COMPONENTS"/> >+ <enum name="GL_TEXTURE_2D_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_2D_ARRAY"/> >+ <enum name="GL_R11F_G11F_B10F"/> >+ <enum name="GL_UNSIGNED_INT_10F_11F_11F_REV"/> >+ <enum name="GL_RGB9_E5"/> >+ <enum name="GL_UNSIGNED_INT_5_9_9_9_REV"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_MODE"/> >+ <enum name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_VARYINGS"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_START"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_SIZE"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN"/> >+ <enum name="GL_RASTERIZER_DISCARD"/> >+ <enum name="GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS"/> >+ <enum name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS"/> >+ <enum name="GL_INTERLEAVED_ATTRIBS"/> >+ <enum name="GL_SEPARATE_ATTRIBS"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_BINDING"/> >+ <enum name="GL_RGBA32UI"/> >+ <enum name="GL_RGB32UI"/> >+ <enum name="GL_RGBA16UI"/> >+ <enum name="GL_RGB16UI"/> >+ <enum name="GL_RGBA8UI"/> >+ <enum name="GL_RGB8UI"/> >+ <enum name="GL_RGBA32I"/> >+ <enum name="GL_RGB32I"/> >+ <enum name="GL_RGBA16I"/> >+ <enum name="GL_RGB16I"/> >+ <enum name="GL_RGBA8I"/> >+ <enum name="GL_RGB8I"/> >+ <enum name="GL_RED_INTEGER"/> >+ <enum name="GL_RGB_INTEGER"/> >+ <enum name="GL_RGBA_INTEGER"/> >+ <enum name="GL_SAMPLER_2D_ARRAY"/> >+ <enum name="GL_SAMPLER_2D_ARRAY_SHADOW"/> >+ <enum name="GL_SAMPLER_CUBE_SHADOW"/> >+ <enum name="GL_UNSIGNED_INT_VEC2"/> >+ <enum name="GL_UNSIGNED_INT_VEC3"/> >+ <enum name="GL_UNSIGNED_INT_VEC4"/> >+ <enum name="GL_INT_SAMPLER_2D"/> >+ <enum name="GL_INT_SAMPLER_3D"/> >+ <enum name="GL_INT_SAMPLER_CUBE"/> >+ <enum name="GL_INT_SAMPLER_2D_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_3D"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_CUBE"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D_ARRAY"/> >+ <enum name="GL_BUFFER_ACCESS_FLAGS"/> >+ <enum name="GL_BUFFER_MAP_LENGTH"/> >+ <enum name="GL_BUFFER_MAP_OFFSET"/> >+ <enum name="GL_DEPTH_COMPONENT32F"/> >+ <enum name="GL_DEPTH32F_STENCIL8"/> >+ <enum name="GL_FLOAT_32_UNSIGNED_INT_24_8_REV"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT"/> >+ <enum name="GL_FRAMEBUFFER_UNDEFINED"/> >+ <enum name="GL_DEPTH_STENCIL_ATTACHMENT"/> >+ <enum name="GL_DEPTH_STENCIL"/> >+ <enum name="GL_UNSIGNED_INT_24_8"/> >+ <enum name="GL_DEPTH24_STENCIL8"/> >+ <enum name="GL_UNSIGNED_NORMALIZED"/> >+ <enum name="GL_DRAW_FRAMEBUFFER_BINDING"/> >+ <enum name="GL_READ_FRAMEBUFFER"/> >+ <enum name="GL_DRAW_FRAMEBUFFER"/> >+ <enum name="GL_READ_FRAMEBUFFER_BINDING"/> >+ <enum name="GL_RENDERBUFFER_SAMPLES"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER"/> >+ <enum name="GL_MAX_COLOR_ATTACHMENTS"/> >+ <enum name="GL_COLOR_ATTACHMENT1"/> >+ <enum name="GL_COLOR_ATTACHMENT2"/> >+ <enum name="GL_COLOR_ATTACHMENT3"/> >+ <enum name="GL_COLOR_ATTACHMENT4"/> >+ <enum name="GL_COLOR_ATTACHMENT5"/> >+ <enum name="GL_COLOR_ATTACHMENT6"/> >+ <enum name="GL_COLOR_ATTACHMENT7"/> >+ <enum name="GL_COLOR_ATTACHMENT8"/> >+ <enum name="GL_COLOR_ATTACHMENT9"/> >+ <enum name="GL_COLOR_ATTACHMENT10"/> >+ <enum name="GL_COLOR_ATTACHMENT11"/> >+ <enum name="GL_COLOR_ATTACHMENT12"/> >+ <enum name="GL_COLOR_ATTACHMENT13"/> >+ <enum name="GL_COLOR_ATTACHMENT14"/> >+ <enum name="GL_COLOR_ATTACHMENT15"/> >+ <enum name="GL_COLOR_ATTACHMENT16"/> >+ <enum name="GL_COLOR_ATTACHMENT17"/> >+ <enum name="GL_COLOR_ATTACHMENT18"/> >+ <enum name="GL_COLOR_ATTACHMENT19"/> >+ <enum name="GL_COLOR_ATTACHMENT20"/> >+ <enum name="GL_COLOR_ATTACHMENT21"/> >+ <enum name="GL_COLOR_ATTACHMENT22"/> >+ <enum name="GL_COLOR_ATTACHMENT23"/> >+ <enum name="GL_COLOR_ATTACHMENT24"/> >+ <enum name="GL_COLOR_ATTACHMENT25"/> >+ <enum name="GL_COLOR_ATTACHMENT26"/> >+ <enum name="GL_COLOR_ATTACHMENT27"/> >+ <enum name="GL_COLOR_ATTACHMENT28"/> >+ <enum name="GL_COLOR_ATTACHMENT29"/> >+ <enum name="GL_COLOR_ATTACHMENT30"/> >+ <enum name="GL_COLOR_ATTACHMENT31"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE"/> >+ <enum name="GL_MAX_SAMPLES"/> >+ <enum name="GL_HALF_FLOAT"/> >+ <enum name="GL_MAP_READ_BIT"/> >+ <enum name="GL_MAP_WRITE_BIT"/> >+ <enum name="GL_MAP_INVALIDATE_RANGE_BIT"/> >+ <enum name="GL_MAP_INVALIDATE_BUFFER_BIT"/> >+ <enum name="GL_MAP_FLUSH_EXPLICIT_BIT"/> >+ <enum name="GL_MAP_UNSYNCHRONIZED_BIT"/> >+ <enum name="GL_RG"/> >+ <enum name="GL_RG_INTEGER"/> >+ <enum name="GL_R8"/> >+ <enum name="GL_RG8"/> >+ <enum name="GL_R16F"/> >+ <enum name="GL_R32F"/> >+ <enum name="GL_RG16F"/> >+ <enum name="GL_RG32F"/> >+ <enum name="GL_R8I"/> >+ <enum name="GL_R8UI"/> >+ <enum name="GL_R16I"/> >+ <enum name="GL_R16UI"/> >+ <enum name="GL_R32I"/> >+ <enum name="GL_R32UI"/> >+ <enum name="GL_RG8I"/> >+ <enum name="GL_RG8UI"/> >+ <enum name="GL_RG16I"/> >+ <enum name="GL_RG16UI"/> >+ <enum name="GL_RG32I"/> >+ <enum name="GL_RG32UI"/> >+ <enum name="GL_VERTEX_ARRAY_BINDING"/> >+ <enum name="GL_R8_SNORM"/> >+ <enum name="GL_RG8_SNORM"/> >+ <enum name="GL_RGB8_SNORM"/> >+ <enum name="GL_RGBA8_SNORM"/> >+ <enum name="GL_SIGNED_NORMALIZED"/> >+ <enum name="GL_PRIMITIVE_RESTART_FIXED_INDEX"/> >+ <enum name="GL_COPY_READ_BUFFER"/> >+ <enum name="GL_COPY_WRITE_BUFFER"/> >+ <enum name="GL_COPY_READ_BUFFER_BINDING"/> >+ <enum name="GL_COPY_WRITE_BUFFER_BINDING"/> >+ <enum name="GL_UNIFORM_BUFFER"/> >+ <enum name="GL_UNIFORM_BUFFER_BINDING"/> >+ <enum name="GL_UNIFORM_BUFFER_START"/> >+ <enum name="GL_UNIFORM_BUFFER_SIZE"/> >+ <enum name="GL_MAX_VERTEX_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_FRAGMENT_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_COMBINED_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_UNIFORM_BUFFER_BINDINGS"/> >+ <enum name="GL_MAX_UNIFORM_BLOCK_SIZE"/> >+ <enum name="GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS"/> >+ <enum name="GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT"/> >+ <enum name="GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH"/> >+ <enum name="GL_ACTIVE_UNIFORM_BLOCKS"/> >+ <enum name="GL_UNIFORM_TYPE"/> >+ <enum name="GL_UNIFORM_SIZE"/> >+ <enum name="GL_UNIFORM_NAME_LENGTH"/> >+ <enum name="GL_UNIFORM_BLOCK_INDEX"/> >+ <enum name="GL_UNIFORM_OFFSET"/> >+ <enum name="GL_UNIFORM_ARRAY_STRIDE"/> >+ <enum name="GL_UNIFORM_MATRIX_STRIDE"/> >+ <enum name="GL_UNIFORM_IS_ROW_MAJOR"/> >+ <enum name="GL_UNIFORM_BLOCK_BINDING"/> >+ <enum name="GL_UNIFORM_BLOCK_DATA_SIZE"/> >+ <enum name="GL_UNIFORM_BLOCK_NAME_LENGTH"/> >+ <enum name="GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS"/> >+ <enum name="GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER"/> >+ <enum name="GL_INVALID_INDEX"/> >+ <enum name="GL_MAX_VERTEX_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_FRAGMENT_INPUT_COMPONENTS"/> >+ <enum name="GL_MAX_SERVER_WAIT_TIMEOUT"/> >+ <enum name="GL_OBJECT_TYPE"/> >+ <enum name="GL_SYNC_CONDITION"/> >+ <enum name="GL_SYNC_STATUS"/> >+ <enum name="GL_SYNC_FLAGS"/> >+ <enum name="GL_SYNC_FENCE"/> >+ <enum name="GL_SYNC_GPU_COMMANDS_COMPLETE"/> >+ <enum name="GL_UNSIGNALED"/> >+ <enum name="GL_SIGNALED"/> >+ <enum name="GL_ALREADY_SIGNALED"/> >+ <enum name="GL_TIMEOUT_EXPIRED"/> >+ <enum name="GL_CONDITION_SATISFIED"/> >+ <enum name="GL_WAIT_FAILED"/> >+ <enum name="GL_SYNC_FLUSH_COMMANDS_BIT"/> >+ <enum name="GL_TIMEOUT_IGNORED"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR"/> >+ <enum name="GL_ANY_SAMPLES_PASSED"/> >+ <enum name="GL_ANY_SAMPLES_PASSED_CONSERVATIVE"/> >+ <enum name="GL_SAMPLER_BINDING"/> >+ <enum name="GL_RGB10_A2UI"/> >+ <enum name="GL_TEXTURE_SWIZZLE_R"/> >+ <enum name="GL_TEXTURE_SWIZZLE_G"/> >+ <enum name="GL_TEXTURE_SWIZZLE_B"/> >+ <enum name="GL_TEXTURE_SWIZZLE_A"/> >+ <enum name="GL_GREEN"/> >+ <enum name="GL_BLUE"/> >+ <enum name="GL_INT_2_10_10_10_REV"/> >+ <enum name="GL_TRANSFORM_FEEDBACK"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_PAUSED"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_ACTIVE"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BINDING"/> >+ <enum name="GL_PROGRAM_BINARY_RETRIEVABLE_HINT"/> >+ <enum name="GL_PROGRAM_BINARY_LENGTH"/> >+ <enum name="GL_NUM_PROGRAM_BINARY_FORMATS"/> >+ <enum name="GL_PROGRAM_BINARY_FORMATS"/> >+ <enum name="GL_COMPRESSED_R11_EAC"/> >+ <enum name="GL_COMPRESSED_SIGNED_R11_EAC"/> >+ <enum name="GL_COMPRESSED_RG11_EAC"/> >+ <enum name="GL_COMPRESSED_SIGNED_RG11_EAC"/> >+ <enum name="GL_COMPRESSED_RGB8_ETC2"/> >+ <enum name="GL_COMPRESSED_SRGB8_ETC2"/> >+ <enum name="GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"/> >+ <enum name="GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"/> >+ <enum name="GL_COMPRESSED_RGBA8_ETC2_EAC"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"/> >+ <enum name="GL_TEXTURE_IMMUTABLE_FORMAT"/> >+ <enum name="GL_MAX_ELEMENT_INDEX"/> >+ <enum name="GL_NUM_SAMPLE_COUNTS"/> >+ <enum name="GL_TEXTURE_IMMUTABLE_LEVELS"/> >+ <command name="glReadBuffer"/> >+ <command name="glDrawRangeElements"/> >+ <command name="glTexImage3D"/> >+ <command name="glTexSubImage3D"/> >+ <command name="glCopyTexSubImage3D"/> >+ <command name="glCompressedTexImage3D"/> >+ <command name="glCompressedTexSubImage3D"/> >+ <command name="glGenQueries"/> >+ <command name="glDeleteQueries"/> >+ <command name="glIsQuery"/> >+ <command name="glBeginQuery"/> >+ <command name="glEndQuery"/> >+ <command name="glGetQueryiv"/> >+ <command name="glGetQueryObjectuiv"/> >+ <command name="glUnmapBuffer"/> >+ <command name="glGetBufferPointerv"/> >+ <command name="glDrawBuffers"/> >+ <command name="glUniformMatrix2x3fv"/> >+ <command name="glUniformMatrix3x2fv"/> >+ <command name="glUniformMatrix2x4fv"/> >+ <command name="glUniformMatrix4x2fv"/> >+ <command name="glUniformMatrix3x4fv"/> >+ <command name="glUniformMatrix4x3fv"/> >+ <command name="glBlitFramebuffer"/> >+ <command name="glRenderbufferStorageMultisample"/> >+ <command name="glFramebufferTextureLayer"/> >+ <command name="glMapBufferRange"/> >+ <command name="glFlushMappedBufferRange"/> >+ <command name="glBindVertexArray"/> >+ <command name="glDeleteVertexArrays"/> >+ <command name="glGenVertexArrays"/> >+ <command name="glIsVertexArray"/> >+ <command name="glGetIntegeri_v"/> >+ <command name="glBeginTransformFeedback"/> >+ <command name="glEndTransformFeedback"/> >+ <command name="glBindBufferRange"/> >+ <command name="glBindBufferBase"/> >+ <command name="glTransformFeedbackVaryings"/> >+ <command name="glGetTransformFeedbackVarying"/> >+ <command name="glVertexAttribIPointer"/> >+ <command name="glGetVertexAttribIiv"/> >+ <command name="glGetVertexAttribIuiv"/> >+ <command name="glVertexAttribI4i"/> >+ <command name="glVertexAttribI4ui"/> >+ <command name="glVertexAttribI4iv"/> >+ <command name="glVertexAttribI4uiv"/> >+ <command name="glGetUniformuiv"/> >+ <command name="glGetFragDataLocation"/> >+ <command name="glUniform1ui"/> >+ <command name="glUniform2ui"/> >+ <command name="glUniform3ui"/> >+ <command name="glUniform4ui"/> >+ <command name="glUniform1uiv"/> >+ <command name="glUniform2uiv"/> >+ <command name="glUniform3uiv"/> >+ <command name="glUniform4uiv"/> >+ <command name="glClearBufferiv"/> >+ <command name="glClearBufferuiv"/> >+ <command name="glClearBufferfv"/> >+ <command name="glClearBufferfi"/> >+ <command name="glGetStringi"/> >+ <command name="glCopyBufferSubData"/> >+ <command name="glGetUniformIndices"/> >+ <command name="glGetActiveUniformsiv"/> >+ <command name="glGetUniformBlockIndex"/> >+ <command name="glGetActiveUniformBlockiv"/> >+ <command name="glGetActiveUniformBlockName"/> >+ <command name="glUniformBlockBinding"/> >+ <command name="glDrawArraysInstanced"/> >+ <command name="glDrawElementsInstanced"/> >+ <command name="glFenceSync"/> >+ <command name="glIsSync"/> >+ <command name="glDeleteSync"/> >+ <command name="glClientWaitSync"/> >+ <command name="glWaitSync"/> >+ <command name="glGetInteger64v"/> >+ <command name="glGetSynciv"/> >+ <command name="glGetInteger64i_v"/> >+ <command name="glGetBufferParameteri64v"/> >+ <command name="glGenSamplers"/> >+ <command name="glDeleteSamplers"/> >+ <command name="glIsSampler"/> >+ <command name="glBindSampler"/> >+ <command name="glSamplerParameteri"/> >+ <command name="glSamplerParameteriv"/> >+ <command name="glSamplerParameterf"/> >+ <command name="glSamplerParameterfv"/> >+ <command name="glGetSamplerParameteriv"/> >+ <command name="glGetSamplerParameterfv"/> >+ <command name="glVertexAttribDivisor"/> >+ <command name="glBindTransformFeedback"/> >+ <command name="glDeleteTransformFeedbacks"/> >+ <command name="glGenTransformFeedbacks"/> >+ <command name="glIsTransformFeedback"/> >+ <command name="glPauseTransformFeedback"/> >+ <command name="glResumeTransformFeedback"/> >+ <command name="glGetProgramBinary"/> >+ <command name="glProgramBinary"/> >+ <command name="glProgramParameteri"/> >+ <command name="glInvalidateFramebuffer"/> >+ <command name="glInvalidateSubFramebuffer"/> >+ <command name="glTexStorage2D"/> >+ <command name="glTexStorage3D"/> >+ <command name="glGetInternalformativ"/> >+ </require> >+ </feature> >+ <feature api="gles2" name="GL_ES_VERSION_3_1" number="3.1"> >+ <!-- arrays_of_arrays features --> >+ <require/> >+ <!-- compute_shader features --> >+ <require> >+ <command name="glDispatchCompute"/> >+ <command name="glDispatchComputeIndirect"/> >+ <enum name="GL_COMPUTE_SHADER"/> >+ <enum name="GL_MAX_COMPUTE_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_COMPUTE_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_COMPUTE_SHARED_MEMORY_SIZE"/> >+ <enum name="GL_MAX_COMPUTE_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_COMPUTE_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS"/> >+ <enum name="GL_MAX_COMPUTE_WORK_GROUP_COUNT"/> >+ <enum name="GL_MAX_COMPUTE_WORK_GROUP_SIZE"/> >+ <enum name="GL_COMPUTE_WORK_GROUP_SIZE"/> >+ <enum name="GL_DISPATCH_INDIRECT_BUFFER"/> >+ <enum name="GL_DISPATCH_INDIRECT_BUFFER_BINDING"/> >+ <enum name="GL_COMPUTE_SHADER_BIT"/> >+ </require> >+ <!-- draw_indirect features --> >+ <require> >+ <command name="glDrawArraysIndirect"/> >+ <command name="glDrawElementsIndirect"/> >+ <enum name="GL_DRAW_INDIRECT_BUFFER"/> >+ <enum name="GL_DRAW_INDIRECT_BUFFER_BINDING"/> >+ </require> >+ <!-- explicit_uniform_location features --> >+ <require> >+ <enum name="GL_MAX_UNIFORM_LOCATIONS"/> >+ </require> >+ <!-- framebuffer_no_attachments features --> >+ <require> >+ <command name="glFramebufferParameteri"/> >+ <command name="glGetFramebufferParameteriv"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_WIDTH"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_HEIGHT"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_SAMPLES"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS"/> >+ <enum name="GL_MAX_FRAMEBUFFER_WIDTH"/> >+ <enum name="GL_MAX_FRAMEBUFFER_HEIGHT"/> >+ <enum name="GL_MAX_FRAMEBUFFER_SAMPLES"/> >+ </require> >+ <!-- program_interface_query features --> >+ <require> >+ <command name="glGetProgramInterfaceiv"/> >+ <command name="glGetProgramResourceIndex"/> >+ <command name="glGetProgramResourceName"/> >+ <command name="glGetProgramResourceiv"/> >+ <command name="glGetProgramResourceLocation"/> >+ <enum name="GL_UNIFORM"/> >+ <enum name="GL_UNIFORM_BLOCK"/> >+ <enum name="GL_PROGRAM_INPUT"/> >+ <enum name="GL_PROGRAM_OUTPUT"/> >+ <enum name="GL_BUFFER_VARIABLE"/> >+ <enum name="GL_SHADER_STORAGE_BLOCK"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_VARYING"/> >+ <enum name="GL_ACTIVE_RESOURCES"/> >+ <enum name="GL_MAX_NAME_LENGTH"/> >+ <enum name="GL_MAX_NUM_ACTIVE_VARIABLES"/> >+ <enum name="GL_NAME_LENGTH"/> >+ <enum name="GL_TYPE"/> >+ <enum name="GL_ARRAY_SIZE"/> >+ <enum name="GL_OFFSET"/> >+ <enum name="GL_BLOCK_INDEX"/> >+ <enum name="GL_ARRAY_STRIDE"/> >+ <enum name="GL_MATRIX_STRIDE"/> >+ <enum name="GL_IS_ROW_MAJOR"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_INDEX"/> >+ <enum name="GL_BUFFER_BINDING"/> >+ <enum name="GL_BUFFER_DATA_SIZE"/> >+ <enum name="GL_NUM_ACTIVE_VARIABLES"/> >+ <enum name="GL_ACTIVE_VARIABLES"/> >+ <enum name="GL_REFERENCED_BY_VERTEX_SHADER"/> >+ <enum name="GL_REFERENCED_BY_FRAGMENT_SHADER"/> >+ <enum name="GL_REFERENCED_BY_COMPUTE_SHADER"/> >+ <enum name="GL_TOP_LEVEL_ARRAY_SIZE"/> >+ <enum name="GL_TOP_LEVEL_ARRAY_STRIDE"/> >+ <enum name="GL_LOCATION"/> >+ </require> >+ <!-- separate_shader_objects features --> >+ <require> >+ <command name="glUseProgramStages"/> >+ <command name="glActiveShaderProgram"/> >+ <command name="glCreateShaderProgramv"/> >+ <command name="glBindProgramPipeline"/> >+ <command name="glDeleteProgramPipelines"/> >+ <command name="glGenProgramPipelines"/> >+ <command name="glIsProgramPipeline"/> >+ <command name="glGetProgramPipelineiv"/> >+ <command name="glProgramUniform1i"/> >+ <command name="glProgramUniform2i"/> >+ <command name="glProgramUniform3i"/> >+ <command name="glProgramUniform4i"/> >+ <command name="glProgramUniform1ui"/> >+ <command name="glProgramUniform2ui"/> >+ <command name="glProgramUniform3ui"/> >+ <command name="glProgramUniform4ui"/> >+ <command name="glProgramUniform1f"/> >+ <command name="glProgramUniform2f"/> >+ <command name="glProgramUniform3f"/> >+ <command name="glProgramUniform4f"/> >+ <command name="glProgramUniform1iv"/> >+ <command name="glProgramUniform2iv"/> >+ <command name="glProgramUniform3iv"/> >+ <command name="glProgramUniform4iv"/> >+ <command name="glProgramUniform1uiv"/> >+ <command name="glProgramUniform2uiv"/> >+ <command name="glProgramUniform3uiv"/> >+ <command name="glProgramUniform4uiv"/> >+ <command name="glProgramUniform1fv"/> >+ <command name="glProgramUniform2fv"/> >+ <command name="glProgramUniform3fv"/> >+ <command name="glProgramUniform4fv"/> >+ <command name="glProgramUniformMatrix2fv"/> >+ <command name="glProgramUniformMatrix3fv"/> >+ <command name="glProgramUniformMatrix4fv"/> >+ <command name="glProgramUniformMatrix2x3fv"/> >+ <command name="glProgramUniformMatrix3x2fv"/> >+ <command name="glProgramUniformMatrix2x4fv"/> >+ <command name="glProgramUniformMatrix4x2fv"/> >+ <command name="glProgramUniformMatrix3x4fv"/> >+ <command name="glProgramUniformMatrix4x3fv"/> >+ <command name="glValidateProgramPipeline"/> >+ <command name="glGetProgramPipelineInfoLog"/> >+ <enum name="GL_VERTEX_SHADER_BIT"/> >+ <enum name="GL_FRAGMENT_SHADER_BIT"/> >+ <enum name="GL_ALL_SHADER_BITS"/> >+ <enum name="GL_PROGRAM_SEPARABLE"/> >+ <enum name="GL_ACTIVE_PROGRAM"/> >+ <enum name="GL_PROGRAM_PIPELINE_BINDING"/> >+ </require> >+ <!-- shader_atomic_counters features --> >+ <require> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_BINDING"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_START"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_SIZE"/> >+ <enum name="GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_VERTEX_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_FRAGMENT_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_COMPUTE_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_COMBINED_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE"/> >+ <enum name="GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS"/> >+ <enum name="GL_ACTIVE_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_UNSIGNED_INT_ATOMIC_COUNTER"/> >+ </require> >+ <!-- shader_bitfield_operations features --> >+ <require/> >+ <!-- shader_image_load_store features --> >+ <require> >+ <command name="glBindImageTexture"/> >+ <command name="glGetBooleani_v"/> >+ <command name="glMemoryBarrier"/> >+ <command name="glMemoryBarrierByRegion"/> >+ <enum name="GL_MAX_IMAGE_UNITS"/> >+ <enum name="GL_MAX_VERTEX_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_FRAGMENT_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_COMPUTE_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_COMBINED_IMAGE_UNIFORMS"/> >+ <enum name="GL_IMAGE_BINDING_NAME"/> >+ <enum name="GL_IMAGE_BINDING_LEVEL"/> >+ <enum name="GL_IMAGE_BINDING_LAYERED"/> >+ <enum name="GL_IMAGE_BINDING_LAYER"/> >+ <enum name="GL_IMAGE_BINDING_ACCESS"/> >+ <enum name="GL_IMAGE_BINDING_FORMAT"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT"/> >+ <enum name="GL_ELEMENT_ARRAY_BARRIER_BIT"/> >+ <enum name="GL_UNIFORM_BARRIER_BIT"/> >+ <enum name="GL_TEXTURE_FETCH_BARRIER_BIT"/> >+ <enum name="GL_SHADER_IMAGE_ACCESS_BARRIER_BIT"/> >+ <enum name="GL_COMMAND_BARRIER_BIT"/> >+ <enum name="GL_PIXEL_BUFFER_BARRIER_BIT"/> >+ <enum name="GL_TEXTURE_UPDATE_BARRIER_BIT"/> >+ <enum name="GL_BUFFER_UPDATE_BARRIER_BIT"/> >+ <enum name="GL_FRAMEBUFFER_BARRIER_BIT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BARRIER_BIT"/> >+ <enum name="GL_ATOMIC_COUNTER_BARRIER_BIT"/> >+ <enum name="GL_ALL_BARRIER_BITS"/> >+ <enum name="GL_IMAGE_2D"/> >+ <enum name="GL_IMAGE_3D"/> >+ <enum name="GL_IMAGE_CUBE"/> >+ <enum name="GL_IMAGE_2D_ARRAY"/> >+ <enum name="GL_INT_IMAGE_2D"/> >+ <enum name="GL_INT_IMAGE_3D"/> >+ <enum name="GL_INT_IMAGE_CUBE"/> >+ <enum name="GL_INT_IMAGE_2D_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_3D"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_CUBE"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D_ARRAY"/> >+ <enum name="GL_IMAGE_FORMAT_COMPATIBILITY_TYPE"/> >+ <enum name="GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE"/> >+ <enum name="GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS"/> >+ <enum name="GL_READ_ONLY"/> >+ <enum name="GL_WRITE_ONLY"/> >+ <enum name="GL_READ_WRITE"/> >+ </require> >+ <!-- shader_layout_binding features --> >+ <require/> >+ <!-- shader_storage_buffer_object features --> >+ <require> >+ <enum name="GL_SHADER_STORAGE_BUFFER"/> >+ <enum name="GL_SHADER_STORAGE_BUFFER_BINDING"/> >+ <enum name="GL_SHADER_STORAGE_BUFFER_START"/> >+ <enum name="GL_SHADER_STORAGE_BUFFER_SIZE"/> >+ <enum name="GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS"/> >+ <enum name="GL_MAX_SHADER_STORAGE_BLOCK_SIZE"/> >+ <enum name="GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT"/> >+ <enum name="GL_SHADER_STORAGE_BARRIER_BIT"/> >+ <enum name="GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES"/> >+ </require> >+ <!-- stencil_texturing features --> >+ <require> >+ <enum name="GL_DEPTH_STENCIL_TEXTURE_MODE"/> >+ <enum name="GL_STENCIL_INDEX"/> >+ </require> >+ <!-- texture_gather features --> >+ <require> >+ <enum name="GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET"/> >+ <enum name="GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET"/> >+ </require> >+ <!-- texture_storage_multisample features --> >+ <require> >+ <command name="glTexStorage2DMultisample"/> >+ <command name="glGetMultisamplefv"/> >+ <command name="glSampleMaski"/> >+ <command name="glGetTexLevelParameteriv"/> >+ <command name="glGetTexLevelParameterfv"/> >+ <enum name="GL_SAMPLE_POSITION"/> >+ <enum name="GL_SAMPLE_MASK"/> >+ <enum name="GL_SAMPLE_MASK_VALUE"/> >+ <enum name="GL_TEXTURE_2D_MULTISAMPLE"/> >+ <enum name="GL_MAX_SAMPLE_MASK_WORDS"/> >+ <enum name="GL_MAX_COLOR_TEXTURE_SAMPLES"/> >+ <enum name="GL_MAX_DEPTH_TEXTURE_SAMPLES"/> >+ <enum name="GL_MAX_INTEGER_SAMPLES"/> >+ <enum name="GL_TEXTURE_BINDING_2D_MULTISAMPLE"/> >+ <enum name="GL_TEXTURE_SAMPLES"/> >+ <enum name="GL_TEXTURE_FIXED_SAMPLE_LOCATIONS"/> >+ <enum name="GL_TEXTURE_WIDTH"/> >+ <enum name="GL_TEXTURE_HEIGHT"/> >+ <enum name="GL_TEXTURE_DEPTH"/> >+ <enum name="GL_TEXTURE_INTERNAL_FORMAT"/> >+ <enum name="GL_TEXTURE_RED_SIZE"/> >+ <enum name="GL_TEXTURE_GREEN_SIZE"/> >+ <enum name="GL_TEXTURE_BLUE_SIZE"/> >+ <enum name="GL_TEXTURE_ALPHA_SIZE"/> >+ <enum name="GL_TEXTURE_DEPTH_SIZE"/> >+ <enum name="GL_TEXTURE_STENCIL_SIZE"/> >+ <enum name="GL_TEXTURE_SHARED_SIZE"/> >+ <enum name="GL_TEXTURE_RED_TYPE"/> >+ <enum name="GL_TEXTURE_GREEN_TYPE"/> >+ <enum name="GL_TEXTURE_BLUE_TYPE"/> >+ <enum name="GL_TEXTURE_ALPHA_TYPE"/> >+ <enum name="GL_TEXTURE_DEPTH_TYPE"/> >+ <enum name="GL_TEXTURE_COMPRESSED"/> >+ <enum name="GL_SAMPLER_2D_MULTISAMPLE"/> >+ <enum name="GL_INT_SAMPLER_2D_MULTISAMPLE"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE"/> >+ </require> >+ <!-- vertex_attrib_binding features --> >+ <require> >+ <command name="glBindVertexBuffer"/> >+ <command name="glVertexAttribFormat"/> >+ <command name="glVertexAttribIFormat"/> >+ <command name="glVertexAttribBinding"/> >+ <command name="glVertexBindingDivisor"/> >+ <enum name="GL_VERTEX_ATTRIB_BINDING"/> >+ <enum name="GL_VERTEX_ATTRIB_RELATIVE_OFFSET"/> >+ <enum name="GL_VERTEX_BINDING_DIVISOR"/> >+ <enum name="GL_VERTEX_BINDING_OFFSET"/> >+ <enum name="GL_VERTEX_BINDING_STRIDE"/> >+ <enum name="GL_VERTEX_BINDING_BUFFER"/> >+ <enum name="GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET"/> >+ <enum name="GL_MAX_VERTEX_ATTRIB_BINDINGS"/> >+ <enum name="GL_MAX_VERTEX_ATTRIB_STRIDE"/> >+ </require> >+ </feature> >+ <feature api="gles2" name="GL_ES_VERSION_3_2" number="3.2"> >+ <!-- 3.2-specific point features --> >+ <require> >+ <enum name="GL_MULTISAMPLE_LINE_WIDTH_RANGE"/> >+ <enum name="GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY"/> >+ </require> >+ <!-- Android extension pack features --> >+ <require/> >+ <!-- blend_equation_advanced features --> >+ <require> >+ <enum name="GL_MULTIPLY"/> >+ <enum name="GL_SCREEN"/> >+ <enum name="GL_OVERLAY"/> >+ <enum name="GL_DARKEN"/> >+ <enum name="GL_LIGHTEN"/> >+ <enum name="GL_COLORDODGE"/> >+ <enum name="GL_COLORBURN"/> >+ <enum name="GL_HARDLIGHT"/> >+ <enum name="GL_SOFTLIGHT"/> >+ <enum name="GL_DIFFERENCE"/> >+ <enum name="GL_EXCLUSION"/> >+ <enum name="GL_HSL_HUE"/> >+ <enum name="GL_HSL_SATURATION"/> >+ <enum name="GL_HSL_COLOR"/> >+ <enum name="GL_HSL_LUMINOSITY"/> >+ <command name="glBlendBarrier"/> >+ </require> >+ <!-- color_buffer_float features --> >+ <require/> >+ <!-- copy_image features --> >+ <require> >+ <command name="glCopyImageSubData"/> >+ </require> >+ <!-- debug features --> >+ <require> >+ <enum name="GL_DEBUG_OUTPUT_SYNCHRONOUS"/> >+ <enum name="GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH"/> >+ <enum name="GL_DEBUG_CALLBACK_FUNCTION"/> >+ <enum name="GL_DEBUG_CALLBACK_USER_PARAM"/> >+ <enum name="GL_DEBUG_SOURCE_API"/> >+ <enum name="GL_DEBUG_SOURCE_WINDOW_SYSTEM"/> >+ <enum name="GL_DEBUG_SOURCE_SHADER_COMPILER"/> >+ <enum name="GL_DEBUG_SOURCE_THIRD_PARTY"/> >+ <enum name="GL_DEBUG_SOURCE_APPLICATION"/> >+ <enum name="GL_DEBUG_SOURCE_OTHER"/> >+ <enum name="GL_DEBUG_TYPE_ERROR"/> >+ <enum name="GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR"/> >+ <enum name="GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR"/> >+ <enum name="GL_DEBUG_TYPE_PORTABILITY"/> >+ <enum name="GL_DEBUG_TYPE_PERFORMANCE"/> >+ <enum name="GL_DEBUG_TYPE_OTHER"/> >+ <enum name="GL_DEBUG_TYPE_MARKER"/> >+ <enum name="GL_DEBUG_TYPE_PUSH_GROUP"/> >+ <enum name="GL_DEBUG_TYPE_POP_GROUP"/> >+ <enum name="GL_DEBUG_SEVERITY_NOTIFICATION"/> >+ <enum name="GL_MAX_DEBUG_GROUP_STACK_DEPTH"/> >+ <enum name="GL_DEBUG_GROUP_STACK_DEPTH"/> >+ <enum name="GL_BUFFER"/> >+ <enum name="GL_SHADER"/> >+ <enum name="GL_PROGRAM"/> >+ <enum name="GL_VERTEX_ARRAY"/> >+ <enum name="GL_QUERY"/> >+ <enum name="GL_PROGRAM_PIPELINE"/> >+ <enum name="GL_SAMPLER"/> >+ <enum name="GL_MAX_LABEL_LENGTH"/> >+ <enum name="GL_MAX_DEBUG_MESSAGE_LENGTH"/> >+ <enum name="GL_MAX_DEBUG_LOGGED_MESSAGES"/> >+ <enum name="GL_DEBUG_LOGGED_MESSAGES"/> >+ <enum name="GL_DEBUG_SEVERITY_HIGH"/> >+ <enum name="GL_DEBUG_SEVERITY_MEDIUM"/> >+ <enum name="GL_DEBUG_SEVERITY_LOW"/> >+ <enum name="GL_DEBUG_OUTPUT"/> >+ <enum name="GL_CONTEXT_FLAG_DEBUG_BIT"/> >+ <enum name="GL_STACK_OVERFLOW"/> >+ <enum name="GL_STACK_UNDERFLOW"/> >+ <command name="glDebugMessageControl"/> >+ <command name="glDebugMessageInsert"/> >+ <command name="glDebugMessageCallback"/> >+ <command name="glGetDebugMessageLog"/> >+ <command name="glPushDebugGroup"/> >+ <command name="glPopDebugGroup"/> >+ <command name="glObjectLabel"/> >+ <command name="glGetObjectLabel"/> >+ <command name="glObjectPtrLabel"/> >+ <command name="glGetObjectPtrLabel"/> >+ <command name="glGetPointerv"/> >+ </require> >+ <!-- draw_buffers_indexed features --> >+ <require> >+ <!-- All tokens are already part of ES 3.0 --> >+ <command name="glEnablei"/> >+ <command name="glDisablei"/> >+ <command name="glBlendEquationi"/> >+ <command name="glBlendEquationSeparatei"/> >+ <command name="glBlendFunci"/> >+ <command name="glBlendFuncSeparatei"/> >+ <command name="glColorMaski"/> >+ <command name="glIsEnabledi"/> >+ </require> >+ <!-- draw_elements_base_vertex features --> >+ <require> >+ <command name="glDrawElementsBaseVertex"/> >+ <command name="glDrawRangeElementsBaseVertex"/> >+ <command name="glDrawElementsInstancedBaseVertex"/> >+ </require> >+ <!-- geometry_shader features --> >+ <require> >+ <enum name="GL_GEOMETRY_SHADER"/> >+ <enum name="GL_GEOMETRY_SHADER_BIT"/> >+ <enum name="GL_GEOMETRY_VERTICES_OUT"/> >+ <enum name="GL_GEOMETRY_INPUT_TYPE"/> >+ <enum name="GL_GEOMETRY_OUTPUT_TYPE"/> >+ <enum name="GL_GEOMETRY_SHADER_INVOCATIONS"/> >+ <enum name="GL_LAYER_PROVOKING_VERTEX"/> >+ <enum name="GL_LINES_ADJACENCY"/> >+ <enum name="GL_LINE_STRIP_ADJACENCY"/> >+ <enum name="GL_TRIANGLES_ADJACENCY"/> >+ <enum name="GL_TRIANGLE_STRIP_ADJACENCY"/> >+ <enum name="GL_MAX_GEOMETRY_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_GEOMETRY_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_GEOMETRY_INPUT_COMPONENTS"/> >+ <enum name="GL_MAX_GEOMETRY_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_GEOMETRY_OUTPUT_VERTICES"/> >+ <enum name="GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_GEOMETRY_SHADER_INVOCATIONS"/> >+ <enum name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_GEOMETRY_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_GEOMETRY_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_FIRST_VERTEX_CONVENTION"/> >+ <enum name="GL_LAST_VERTEX_CONVENTION"/> >+ <enum name="GL_UNDEFINED_VERTEX"/> >+ <enum name="GL_PRIMITIVES_GENERATED"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_LAYERS"/> >+ <enum name="GL_MAX_FRAMEBUFFER_LAYERS"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED"/> >+ <enum name="GL_REFERENCED_BY_GEOMETRY_SHADER"/> >+ <command name="glFramebufferTexture"/> >+ </require> >+ <!-- gpu_shader5 features --> >+ <require/> >+ <!-- primitive_bounding_box features --> >+ <require> >+ <enum name="GL_PRIMITIVE_BOUNDING_BOX"/> >+ <command name="glPrimitiveBoundingBox"/> >+ </require> >+ <!-- robustness features --> >+ <require> >+ <enum name="GL_NO_ERROR"/> >+ <enum name="GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT"/> >+ <enum name="GL_CONTEXT_FLAGS"/> >+ <enum name="GL_LOSE_CONTEXT_ON_RESET"/> >+ <enum name="GL_GUILTY_CONTEXT_RESET"/> >+ <enum name="GL_INNOCENT_CONTEXT_RESET"/> >+ <enum name="GL_UNKNOWN_CONTEXT_RESET"/> >+ <enum name="GL_RESET_NOTIFICATION_STRATEGY"/> >+ <enum name="GL_NO_RESET_NOTIFICATION"/> >+ <enum name="GL_CONTEXT_LOST"/> >+ <command name="glGetGraphicsResetStatus"/> >+ <command name="glReadnPixels"/> >+ <command name="glGetnUniformfv"/> >+ <command name="glGetnUniformiv"/> >+ <command name="glGetnUniformuiv"/> >+ </require> >+ <!-- sample_shading features --> >+ <require> >+ <command name="glMinSampleShading"/> >+ <enum name="GL_SAMPLE_SHADING"/> >+ <enum name="GL_MIN_SAMPLE_SHADING_VALUE"/> >+ </require> >+ <!-- sample_variables features --> >+ <require/> >+ <!-- shader_image_atomic features --> >+ <require/> >+ <!-- shader_io_blocks features --> >+ <require/> >+ <!-- shader_multisample_interpolation features --> >+ <require> >+ <enum name="GL_MIN_FRAGMENT_INTERPOLATION_OFFSET"/> >+ <enum name="GL_MAX_FRAGMENT_INTERPOLATION_OFFSET"/> >+ <enum name="GL_FRAGMENT_INTERPOLATION_OFFSET_BITS"/> >+ </require> >+ <!-- tessellation_shader features --> >+ <require> >+ <enum name="GL_PATCHES"/> >+ <enum name="GL_PATCH_VERTICES"/> >+ <enum name="GL_TESS_CONTROL_OUTPUT_VERTICES"/> >+ <enum name="GL_TESS_GEN_MODE"/> >+ <enum name="GL_TESS_GEN_SPACING"/> >+ <enum name="GL_TESS_GEN_VERTEX_ORDER"/> >+ <enum name="GL_TESS_GEN_POINT_MODE"/> >+ <enum name="GL_TRIANGLES"/> >+ <enum name="GL_ISOLINES"/> >+ <enum name="GL_QUADS"/> >+ <enum name="GL_EQUAL"/> >+ <enum name="GL_FRACTIONAL_ODD"/> >+ <enum name="GL_FRACTIONAL_EVEN"/> >+ <enum name="GL_CCW"/> >+ <enum name="GL_CW"/> >+ <enum name="GL_MAX_PATCH_VERTICES"/> >+ <enum name="GL_MAX_TESS_GEN_LEVEL"/> >+ <enum name="GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_PATCH_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_TESS_CONTROL_INPUT_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS"/> >+ <enum name="GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED"/> >+ <enum name="GL_IS_PER_PATCH"/> >+ <enum name="GL_REFERENCED_BY_TESS_CONTROL_SHADER"/> >+ <enum name="GL_REFERENCED_BY_TESS_EVALUATION_SHADER"/> >+ <enum name="GL_TESS_CONTROL_SHADER"/> >+ <enum name="GL_TESS_EVALUATION_SHADER"/> >+ <enum name="GL_TESS_CONTROL_SHADER_BIT"/> >+ <enum name="GL_TESS_EVALUATION_SHADER_BIT"/> >+ <command name="glPatchParameteri"/> >+ </require> >+ <!-- texture_border_clamp features --> >+ <require> >+ <enum name="GL_TEXTURE_BORDER_COLOR"/> >+ <enum name="GL_CLAMP_TO_BORDER"/> >+ <command name="glTexParameterIiv"/> >+ <command name="glTexParameterIuiv"/> >+ <command name="glGetTexParameterIiv"/> >+ <command name="glGetTexParameterIuiv"/> >+ <command name="glSamplerParameterIiv"/> >+ <command name="glSamplerParameterIuiv"/> >+ <command name="glGetSamplerParameterIiv"/> >+ <command name="glGetSamplerParameterIuiv"/> >+ </require> >+ <!-- texture_buffer features --> >+ <require> >+ <enum name="GL_TEXTURE_BUFFER"/> >+ <enum name="GL_TEXTURE_BUFFER_BINDING"/> >+ <enum name="GL_MAX_TEXTURE_BUFFER_SIZE"/> >+ <enum name="GL_TEXTURE_BINDING_BUFFER"/> >+ <enum name="GL_TEXTURE_BUFFER_DATA_STORE_BINDING"/> >+ <enum name="GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT"/> >+ <enum name="GL_SAMPLER_BUFFER"/> >+ <enum name="GL_INT_SAMPLER_BUFFER"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_BUFFER"/> >+ <enum name="GL_IMAGE_BUFFER"/> >+ <enum name="GL_INT_IMAGE_BUFFER"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_BUFFER"/> >+ <enum name="GL_TEXTURE_BUFFER_OFFSET"/> >+ <enum name="GL_TEXTURE_BUFFER_SIZE"/> >+ <command name="glTexBuffer"/> >+ <command name="glTexBufferRange"/> >+ </require> >+ <!-- texture_compression_astc_ldr features --> >+ <require> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_4x4"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_5x4"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_5x5"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_6x5"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_6x6"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_8x5"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_8x6"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_8x8"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x5"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x6"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x8"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x10"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_12x10"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_12x12"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12"/> >+ </require> >+ <!-- texture_cube_map_array features --> >+ <require> >+ <enum name="GL_TEXTURE_CUBE_MAP_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_CUBE_MAP_ARRAY"/> >+ <enum name="GL_SAMPLER_CUBE_MAP_ARRAY"/> >+ <enum name="GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW"/> >+ <enum name="GL_INT_SAMPLER_CUBE_MAP_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY"/> >+ <enum name="GL_IMAGE_CUBE_MAP_ARRAY"/> >+ <enum name="GL_INT_IMAGE_CUBE_MAP_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY"/> >+ </require> >+ <!-- texture_stencil8 features --> >+ <require> >+ <enum name="GL_STENCIL_INDEX"/> >+ <enum name="GL_STENCIL_INDEX8"/> >+ </require> >+ <!-- texture_storage_multisample_2d_array features --> >+ <require> >+ <enum name="GL_TEXTURE_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_SAMPLER_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY"/> >+ <command name="glTexStorage3DMultisample"/> >+ </require> >+ </feature> >+ <feature api="glsc2" name="GL_SC_VERSION_2_0" number="2.0"> >+ <require comment="Not used by the API, but could be used by applications"> >+ <type name="GLbyte" comment="Used to define GL_BYTE data"/> >+ <type name="GLshort" comment="Used to define GL_SHORT data"/> >+ <type name="GLushort" comment="Used to define GL_UNSIGNED_SHORT data"/> >+ </require> >+ <require> >+ <enum name="GL_DEPTH_BUFFER_BIT"/> >+ <enum name="GL_STENCIL_BUFFER_BIT"/> >+ <enum name="GL_COLOR_BUFFER_BIT"/> >+ <enum name="GL_FALSE"/> >+ <enum name="GL_TRUE"/> >+ <enum name="GL_POINTS"/> >+ <enum name="GL_LINES"/> >+ <enum name="GL_LINE_LOOP"/> >+ <enum name="GL_LINE_STRIP"/> >+ <enum name="GL_TRIANGLES"/> >+ <enum name="GL_TRIANGLE_STRIP"/> >+ <enum name="GL_TRIANGLE_FAN"/> >+ <enum name="GL_ZERO"/> >+ <enum name="GL_ONE"/> >+ <enum name="GL_SRC_COLOR"/> >+ <enum name="GL_ONE_MINUS_SRC_COLOR"/> >+ <enum name="GL_SRC_ALPHA"/> >+ <enum name="GL_ONE_MINUS_SRC_ALPHA"/> >+ <enum name="GL_DST_ALPHA"/> >+ <enum name="GL_ONE_MINUS_DST_ALPHA"/> >+ <enum name="GL_DST_COLOR"/> >+ <enum name="GL_ONE_MINUS_DST_COLOR"/> >+ <enum name="GL_SRC_ALPHA_SATURATE"/> >+ <enum name="GL_FUNC_ADD"/> >+ <enum name="GL_BLEND_EQUATION"/> >+ <enum name="GL_BLEND_EQUATION_RGB"/> >+ <enum name="GL_BLEND_EQUATION_ALPHA"/> >+ <enum name="GL_FUNC_SUBTRACT"/> >+ <enum name="GL_FUNC_REVERSE_SUBTRACT"/> >+ <enum name="GL_BLEND_DST_RGB"/> >+ <enum name="GL_BLEND_SRC_RGB"/> >+ <enum name="GL_BLEND_DST_ALPHA"/> >+ <enum name="GL_BLEND_SRC_ALPHA"/> >+ <enum name="GL_CONSTANT_COLOR"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_COLOR"/> >+ <enum name="GL_CONSTANT_ALPHA"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_ALPHA"/> >+ <enum name="GL_BLEND_COLOR"/> >+ <enum name="GL_ARRAY_BUFFER"/> >+ <enum name="GL_ELEMENT_ARRAY_BUFFER"/> >+ <enum name="GL_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_ELEMENT_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_STREAM_DRAW"/> >+ <enum name="GL_STATIC_DRAW"/> >+ <enum name="GL_DYNAMIC_DRAW"/> >+ <enum name="GL_BUFFER_SIZE"/> >+ <enum name="GL_BUFFER_USAGE"/> >+ <enum name="GL_CURRENT_VERTEX_ATTRIB"/> >+ <enum name="GL_FRONT"/> >+ <enum name="GL_BACK"/> >+ <enum name="GL_FRONT_AND_BACK"/> >+ <enum name="GL_TEXTURE_2D"/> >+ <enum name="GL_CULL_FACE"/> >+ <enum name="GL_BLEND"/> >+ <enum name="GL_DITHER"/> >+ <enum name="GL_STENCIL_TEST"/> >+ <enum name="GL_DEPTH_TEST"/> >+ <enum name="GL_SCISSOR_TEST"/> >+ <enum name="GL_POLYGON_OFFSET_FILL"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_COVERAGE"/> >+ <enum name="GL_SAMPLE_COVERAGE"/> >+ <enum name="GL_NO_ERROR"/> >+ <enum name="GL_INVALID_ENUM"/> >+ <enum name="GL_INVALID_VALUE"/> >+ <enum name="GL_INVALID_OPERATION"/> >+ <enum name="GL_OUT_OF_MEMORY"/> >+ <enum name="GL_INVALID_FRAMEBUFFER_OPERATION"/> >+ <enum name="GL_CONTEXT_LOST"/> >+ <enum name="GL_CW"/> >+ <enum name="GL_CCW"/> >+ <enum name="GL_LINE_WIDTH"/> >+ <enum name="GL_ALIASED_POINT_SIZE_RANGE"/> >+ <enum name="GL_ALIASED_LINE_WIDTH_RANGE"/> >+ <enum name="GL_CULL_FACE_MODE"/> >+ <enum name="GL_FRONT_FACE"/> >+ <enum name="GL_DEPTH_RANGE"/> >+ <enum name="GL_DEPTH_WRITEMASK"/> >+ <enum name="GL_DEPTH_CLEAR_VALUE"/> >+ <enum name="GL_DEPTH_FUNC"/> >+ <enum name="GL_STENCIL_CLEAR_VALUE"/> >+ <enum name="GL_STENCIL_FUNC"/> >+ <enum name="GL_STENCIL_FAIL"/> >+ <enum name="GL_STENCIL_PASS_DEPTH_FAIL"/> >+ <enum name="GL_STENCIL_PASS_DEPTH_PASS"/> >+ <enum name="GL_STENCIL_REF"/> >+ <enum name="GL_STENCIL_VALUE_MASK"/> >+ <enum name="GL_STENCIL_WRITEMASK"/> >+ <enum name="GL_STENCIL_BACK_FUNC"/> >+ <enum name="GL_STENCIL_BACK_FAIL"/> >+ <enum name="GL_STENCIL_BACK_PASS_DEPTH_FAIL"/> >+ <enum name="GL_STENCIL_BACK_PASS_DEPTH_PASS"/> >+ <enum name="GL_STENCIL_BACK_REF"/> >+ <enum name="GL_STENCIL_BACK_VALUE_MASK"/> >+ <enum name="GL_STENCIL_BACK_WRITEMASK"/> >+ <enum name="GL_VIEWPORT"/> >+ <enum name="GL_SCISSOR_BOX"/> >+ <enum name="GL_COLOR_CLEAR_VALUE"/> >+ <enum name="GL_COLOR_WRITEMASK"/> >+ <enum name="GL_UNPACK_ALIGNMENT"/> >+ <enum name="GL_PACK_ALIGNMENT"/> >+ <enum name="GL_MAX_TEXTURE_SIZE"/> >+ <enum name="GL_MAX_VIEWPORT_DIMS"/> >+ <enum name="GL_SUBPIXEL_BITS"/> >+ <enum name="GL_RED_BITS"/> >+ <enum name="GL_GREEN_BITS"/> >+ <enum name="GL_BLUE_BITS"/> >+ <enum name="GL_ALPHA_BITS"/> >+ <enum name="GL_DEPTH_BITS"/> >+ <enum name="GL_STENCIL_BITS"/> >+ <enum name="GL_POLYGON_OFFSET_UNITS"/> >+ <enum name="GL_POLYGON_OFFSET_FACTOR"/> >+ <enum name="GL_TEXTURE_BINDING_2D"/> >+ <enum name="GL_SAMPLE_BUFFERS"/> >+ <enum name="GL_SAMPLES"/> >+ <enum name="GL_SAMPLE_COVERAGE_VALUE"/> >+ <enum name="GL_SAMPLE_COVERAGE_INVERT"/> >+ <enum name="GL_NUM_COMPRESSED_TEXTURE_FORMATS"/> >+ <enum name="GL_COMPRESSED_TEXTURE_FORMATS"/> >+ <enum name="GL_DONT_CARE"/> >+ <enum name="GL_FASTEST"/> >+ <enum name="GL_NICEST"/> >+ <enum name="GL_GENERATE_MIPMAP_HINT"/> >+ <enum name="GL_BYTE"/> >+ <enum name="GL_UNSIGNED_BYTE"/> >+ <enum name="GL_SHORT"/> >+ <enum name="GL_UNSIGNED_SHORT"/> >+ <enum name="GL_INT"/> >+ <enum name="GL_UNSIGNED_INT"/> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_RED"/> >+ <enum name="GL_RG"/> >+ <enum name="GL_RGB"/> >+ <enum name="GL_RGBA"/> >+ <enum name="GL_UNSIGNED_SHORT_4_4_4_4"/> >+ <enum name="GL_UNSIGNED_SHORT_5_5_5_1"/> >+ <enum name="GL_UNSIGNED_SHORT_5_6_5"/> >+ <enum name="GL_MAX_VERTEX_ATTRIBS"/> >+ <enum name="GL_MAX_VERTEX_UNIFORM_VECTORS"/> >+ <enum name="GL_MAX_VARYING_VECTORS"/> >+ <enum name="GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_FRAGMENT_UNIFORM_VECTORS"/> >+ <enum name="GL_LINK_STATUS"/> >+ <enum name="GL_SHADING_LANGUAGE_VERSION"/> >+ <enum name="GL_CURRENT_PROGRAM"/> >+ <enum name="GL_NEVER"/> >+ <enum name="GL_LESS"/> >+ <enum name="GL_EQUAL"/> >+ <enum name="GL_LEQUAL"/> >+ <enum name="GL_GREATER"/> >+ <enum name="GL_NOTEQUAL"/> >+ <enum name="GL_GEQUAL"/> >+ <enum name="GL_ALWAYS"/> >+ <enum name="GL_KEEP"/> >+ <enum name="GL_REPLACE"/> >+ <enum name="GL_INCR"/> >+ <enum name="GL_DECR"/> >+ <enum name="GL_INVERT"/> >+ <enum name="GL_INCR_WRAP"/> >+ <enum name="GL_DECR_WRAP"/> >+ <enum name="GL_VENDOR"/> >+ <enum name="GL_RENDERER"/> >+ <enum name="GL_VERSION"/> >+ <enum name="GL_EXTENSIONS"/> >+ <enum name="GL_NEAREST"/> >+ <enum name="GL_LINEAR"/> >+ <enum name="GL_NEAREST_MIPMAP_NEAREST"/> >+ <enum name="GL_LINEAR_MIPMAP_NEAREST"/> >+ <enum name="GL_NEAREST_MIPMAP_LINEAR"/> >+ <enum name="GL_LINEAR_MIPMAP_LINEAR"/> >+ <enum name="GL_TEXTURE_MAG_FILTER"/> >+ <enum name="GL_TEXTURE_MIN_FILTER"/> >+ <enum name="GL_TEXTURE_WRAP_S"/> >+ <enum name="GL_TEXTURE_WRAP_T"/> >+ <enum name="GL_TEXTURE_IMMUTABLE_FORMAT"/> >+ <enum name="GL_TEXTURE"/> >+ <enum name="GL_TEXTURE0"/> >+ <enum name="GL_TEXTURE1"/> >+ <enum name="GL_TEXTURE2"/> >+ <enum name="GL_TEXTURE3"/> >+ <enum name="GL_TEXTURE4"/> >+ <enum name="GL_TEXTURE5"/> >+ <enum name="GL_TEXTURE6"/> >+ <enum name="GL_TEXTURE7"/> >+ <enum name="GL_TEXTURE8"/> >+ <enum name="GL_TEXTURE9"/> >+ <enum name="GL_TEXTURE10"/> >+ <enum name="GL_TEXTURE11"/> >+ <enum name="GL_TEXTURE12"/> >+ <enum name="GL_TEXTURE13"/> >+ <enum name="GL_TEXTURE14"/> >+ <enum name="GL_TEXTURE15"/> >+ <enum name="GL_TEXTURE16"/> >+ <enum name="GL_TEXTURE17"/> >+ <enum name="GL_TEXTURE18"/> >+ <enum name="GL_TEXTURE19"/> >+ <enum name="GL_TEXTURE20"/> >+ <enum name="GL_TEXTURE21"/> >+ <enum name="GL_TEXTURE22"/> >+ <enum name="GL_TEXTURE23"/> >+ <enum name="GL_TEXTURE24"/> >+ <enum name="GL_TEXTURE25"/> >+ <enum name="GL_TEXTURE26"/> >+ <enum name="GL_TEXTURE27"/> >+ <enum name="GL_TEXTURE28"/> >+ <enum name="GL_TEXTURE29"/> >+ <enum name="GL_TEXTURE30"/> >+ <enum name="GL_TEXTURE31"/> >+ <enum name="GL_ACTIVE_TEXTURE"/> >+ <enum name="GL_REPEAT"/> >+ <enum name="GL_CLAMP_TO_EDGE"/> >+ <enum name="GL_MIRRORED_REPEAT"/> >+ <enum name="GL_SAMPLER_2D"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_ENABLED"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_SIZE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_STRIDE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_TYPE"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_NORMALIZED"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_POINTER"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING"/> >+ <enum name="GL_IMPLEMENTATION_COLOR_READ_TYPE"/> >+ <enum name="GL_IMPLEMENTATION_COLOR_READ_FORMAT"/> >+ <enum name="GL_NUM_PROGRAM_BINARY_FORMATS"/> >+ <enum name="GL_PROGRAM_BINARY_FORMATS"/> >+ <enum name="GL_LOW_FLOAT"/> >+ <enum name="GL_MEDIUM_FLOAT"/> >+ <enum name="GL_HIGH_FLOAT"/> >+ <enum name="GL_LOW_INT"/> >+ <enum name="GL_MEDIUM_INT"/> >+ <enum name="GL_HIGH_INT"/> >+ <enum name="GL_FRAMEBUFFER"/> >+ <enum name="GL_RENDERBUFFER"/> >+ <enum name="GL_R8"/> >+ <enum name="GL_RG8"/> >+ <enum name="GL_RGB8"/> >+ <enum name="GL_RGBA8"/> >+ <enum name="GL_RGBA4"/> >+ <enum name="GL_RGB5_A1"/> >+ <enum name="GL_RGB565"/> >+ <enum name="GL_DEPTH_COMPONENT16"/> >+ <enum name="GL_STENCIL_INDEX8"/> >+ <enum name="GL_RENDERBUFFER_WIDTH"/> >+ <enum name="GL_RENDERBUFFER_HEIGHT"/> >+ <enum name="GL_RENDERBUFFER_INTERNAL_FORMAT"/> >+ <enum name="GL_RENDERBUFFER_RED_SIZE"/> >+ <enum name="GL_RENDERBUFFER_GREEN_SIZE"/> >+ <enum name="GL_RENDERBUFFER_BLUE_SIZE"/> >+ <enum name="GL_RENDERBUFFER_ALPHA_SIZE"/> >+ <enum name="GL_RENDERBUFFER_DEPTH_SIZE"/> >+ <enum name="GL_RENDERBUFFER_STENCIL_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL"/> >+ <enum name="GL_COLOR_ATTACHMENT0"/> >+ <enum name="GL_DEPTH_ATTACHMENT"/> >+ <enum name="GL_STENCIL_ATTACHMENT"/> >+ <enum name="GL_NONE"/> >+ <enum name="GL_FRAMEBUFFER_COMPLETE"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS"/> >+ <enum name="GL_FRAMEBUFFER_UNSUPPORTED"/> >+ <enum name="GL_FRAMEBUFFER_UNDEFINED"/> >+ <enum name="GL_FRAMEBUFFER_BINDING"/> >+ <enum name="GL_RENDERBUFFER_BINDING"/> >+ <enum name="GL_MAX_RENDERBUFFER_SIZE"/> >+ <enum name="GL_NO_ERROR"/> >+ <enum name="GL_GUILTY_CONTEXT_RESET"/> >+ <enum name="GL_INNOCENT_CONTEXT_RESET"/> >+ <enum name="GL_UNKNOWN_CONTEXT_RESET"/> >+ <enum name="GL_CONTEXT_ROBUST_ACCESS"/> >+ <enum name="GL_RESET_NOTIFICATION_STRATEGY"/> >+ <enum name="GL_LOSE_CONTEXT_ON_RESET"/> >+ <command name="glActiveTexture"/> >+ <command name="glBindBuffer"/> >+ <command name="glBindFramebuffer"/> >+ <command name="glBindRenderbuffer"/> >+ <command name="glBindTexture"/> >+ <command name="glBlendColor"/> >+ <command name="glBlendEquation"/> >+ <command name="glBlendEquationSeparate"/> >+ <command name="glBlendFunc"/> >+ <command name="glBlendFuncSeparate"/> >+ <command name="glBufferData"/> >+ <command name="glBufferSubData"/> >+ <command name="glCheckFramebufferStatus"/> >+ <command name="glClear"/> >+ <command name="glClearColor"/> >+ <command name="glClearDepthf"/> >+ <command name="glClearStencil"/> >+ <command name="glColorMask"/> >+ <command name="glCompressedTexSubImage2D"/> >+ <command name="glCreateProgram"/> >+ <command name="glCullFace"/> >+ <command name="glDepthFunc"/> >+ <command name="glDepthMask"/> >+ <command name="glDepthRangef"/> >+ <command name="glDisable"/> >+ <command name="glDisableVertexAttribArray"/> >+ <command name="glDrawArrays"/> >+ <command name="glDrawRangeElements"/> >+ <command name="glEnable"/> >+ <command name="glEnableVertexAttribArray"/> >+ <command name="glFinish"/> >+ <command name="glFlush"/> >+ <command name="glFramebufferRenderbuffer"/> >+ <command name="glFramebufferTexture2D"/> >+ <command name="glFrontFace"/> >+ <command name="glGenBuffers"/> >+ <command name="glGenerateMipmap"/> >+ <command name="glGenFramebuffers"/> >+ <command name="glGenRenderbuffers"/> >+ <command name="glGenTextures"/> >+ <command name="glGetAttribLocation"/> >+ <command name="glGetBooleanv"/> >+ <command name="glGetBufferParameteriv"/> >+ <command name="glGetError"/> >+ <command name="glGetFloatv"/> >+ <command name="glGetFramebufferAttachmentParameteriv"/> >+ <command name="glGetGraphicsResetStatus"/> >+ <command name="glGetIntegerv"/> >+ <command name="glGetProgramiv"/> >+ <command name="glGetRenderbufferParameteriv"/> >+ <command name="glGetString"/> >+ <command name="glGetTexParameterfv"/> >+ <command name="glGetTexParameteriv"/> >+ <command name="glGetnUniformfv"/> >+ <command name="glGetnUniformiv"/> >+ <command name="glGetUniformLocation"/> >+ <command name="glGetVertexAttribfv"/> >+ <command name="glGetVertexAttribiv"/> >+ <command name="glGetVertexAttribPointerv"/> >+ <command name="glHint"/> >+ <command name="glIsEnabled"/> >+ <command name="glLineWidth"/> >+ <command name="glPixelStorei"/> >+ <command name="glPolygonOffset"/> >+ <command name="glProgramBinary"/> >+ <command name="glReadnPixels"/> >+ <command name="glRenderbufferStorage"/> >+ <command name="glSampleCoverage"/> >+ <command name="glScissor"/> >+ <command name="glStencilFunc"/> >+ <command name="glStencilFuncSeparate"/> >+ <command name="glStencilMask"/> >+ <command name="glStencilMaskSeparate"/> >+ <command name="glStencilOp"/> >+ <command name="glStencilOpSeparate"/> >+ <command name="glTexStorage2D"/> >+ <command name="glTexParameterf"/> >+ <command name="glTexParameterfv"/> >+ <command name="glTexParameteri"/> >+ <command name="glTexParameteriv"/> >+ <command name="glTexSubImage2D"/> >+ <command name="glUniform1f"/> >+ <command name="glUniform1fv"/> >+ <command name="glUniform1i"/> >+ <command name="glUniform1iv"/> >+ <command name="glUniform2f"/> >+ <command name="glUniform2fv"/> >+ <command name="glUniform2i"/> >+ <command name="glUniform2iv"/> >+ <command name="glUniform3f"/> >+ <command name="glUniform3fv"/> >+ <command name="glUniform3i"/> >+ <command name="glUniform3iv"/> >+ <command name="glUniform4f"/> >+ <command name="glUniform4fv"/> >+ <command name="glUniform4i"/> >+ <command name="glUniform4iv"/> >+ <command name="glUniformMatrix2fv"/> >+ <command name="glUniformMatrix3fv"/> >+ <command name="glUniformMatrix4fv"/> >+ <command name="glUseProgram"/> >+ <command name="glVertexAttrib1f"/> >+ <command name="glVertexAttrib1fv"/> >+ <command name="glVertexAttrib2f"/> >+ <command name="glVertexAttrib2fv"/> >+ <command name="glVertexAttrib3f"/> >+ <command name="glVertexAttrib3fv"/> >+ <command name="glVertexAttrib4f"/> >+ <command name="glVertexAttrib4fv"/> >+ <command name="glVertexAttribPointer"/> >+ <command name="glViewport"/> >+ </require> >+ </feature> >+ >+ <!-- SECTION: OpenGL / OpenGL ES extension interface definitions --> >+ <extensions> >+ <extension name="GL_3DFX_multisample" supported="gl"> >+ <require> >+ <enum name="GL_MULTISAMPLE_3DFX"/> >+ <enum name="GL_SAMPLE_BUFFERS_3DFX"/> >+ <enum name="GL_SAMPLES_3DFX"/> >+ <enum name="GL_MULTISAMPLE_BIT_3DFX"/> >+ </require> >+ </extension> >+ <extension name="GL_3DFX_tbuffer" supported="gl"> >+ <require> >+ <command name="glTbufferMask3DFX"/> >+ </require> >+ </extension> >+ <extension name="GL_3DFX_texture_compression_FXT1" supported="gl"> >+ <require> >+ <enum name="GL_COMPRESSED_RGB_FXT1_3DFX"/> >+ <enum name="GL_COMPRESSED_RGBA_FXT1_3DFX"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_blend_minmax_factor" supported="gl"> >+ <require> >+ <enum name="GL_FACTOR_MIN_AMD"/> >+ <enum name="GL_FACTOR_MAX_AMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_compressed_3DC_texture" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_3DC_X_AMD"/> >+ <enum name="GL_3DC_XY_AMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_compressed_ATC_texture" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_ATC_RGB_AMD"/> >+ <enum name="GL_ATC_RGBA_EXPLICIT_ALPHA_AMD"/> >+ <enum name="GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_conservative_depth" supported="gl"/> >+ <extension name="GL_AMD_debug_output" supported="gl"> >+ <require> >+ <enum name="GL_MAX_DEBUG_MESSAGE_LENGTH_AMD"/> >+ <enum name="GL_MAX_DEBUG_LOGGED_MESSAGES_AMD"/> >+ <enum name="GL_DEBUG_LOGGED_MESSAGES_AMD"/> >+ <enum name="GL_DEBUG_SEVERITY_HIGH_AMD"/> >+ <enum name="GL_DEBUG_SEVERITY_MEDIUM_AMD"/> >+ <enum name="GL_DEBUG_SEVERITY_LOW_AMD"/> >+ <enum name="GL_DEBUG_CATEGORY_API_ERROR_AMD"/> >+ <enum name="GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD"/> >+ <enum name="GL_DEBUG_CATEGORY_DEPRECATION_AMD"/> >+ <enum name="GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD"/> >+ <enum name="GL_DEBUG_CATEGORY_PERFORMANCE_AMD"/> >+ <enum name="GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD"/> >+ <enum name="GL_DEBUG_CATEGORY_APPLICATION_AMD"/> >+ <enum name="GL_DEBUG_CATEGORY_OTHER_AMD"/> >+ <command name="glDebugMessageEnableAMD"/> >+ <command name="glDebugMessageInsertAMD"/> >+ <command name="glDebugMessageCallbackAMD"/> >+ <command name="glGetDebugMessageLogAMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_depth_clamp_separate" supported="gl"> >+ <require> >+ <enum name="GL_DEPTH_CLAMP_NEAR_AMD"/> >+ <enum name="GL_DEPTH_CLAMP_FAR_AMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_draw_buffers_blend" supported="gl"> >+ <require> >+ <command name="glBlendFuncIndexedAMD"/> >+ <command name="glBlendFuncSeparateIndexedAMD"/> >+ <command name="glBlendEquationIndexedAMD"/> >+ <command name="glBlendEquationSeparateIndexedAMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_framebuffer_sample_positions" supported="gl"> >+ <require> >+ <enum name="GL_SUBSAMPLE_DISTANCE_AMD"/> >+ <enum name="GL_PIXELS_PER_SAMPLE_PATTERN_X_AMD"/> >+ <enum name="GL_PIXELS_PER_SAMPLE_PATTERN_Y_AMD"/> >+ <enum name="GL_ALL_PIXELS_AMD"/> >+ <command name="glFramebufferSamplePositionsfvAMD"/> >+ <command name="glNamedFramebufferSamplePositionsfvAMD"/> >+ <command name="glGetFramebufferParameterfvAMD"/> >+ <command name="glGetNamedFramebufferParameterfvAMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_gcn_shader" supported="gl"/> >+ <extension name="GL_AMD_gpu_shader_half_float" supported="gl"> >+ <require> >+ <enum name="GL_FLOAT16_NV"/> >+ <enum name="GL_FLOAT16_VEC2_NV"/> >+ <enum name="GL_FLOAT16_VEC3_NV"/> >+ <enum name="GL_FLOAT16_VEC4_NV"/> >+ <enum name="GL_FLOAT16_MAT2_AMD"/> >+ <enum name="GL_FLOAT16_MAT3_AMD"/> >+ <enum name="GL_FLOAT16_MAT4_AMD"/> >+ <enum name="GL_FLOAT16_MAT2x3_AMD"/> >+ <enum name="GL_FLOAT16_MAT2x4_AMD"/> >+ <enum name="GL_FLOAT16_MAT3x2_AMD"/> >+ <enum name="GL_FLOAT16_MAT3x4_AMD"/> >+ <enum name="GL_FLOAT16_MAT4x2_AMD"/> >+ <enum name="GL_FLOAT16_MAT4x3_AMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_gpu_shader_int16" supported="gl"/> >+ <extension name="GL_AMD_gpu_shader_int64" supported="gl"> >+ <require> >+ <enum name="GL_INT64_NV"/> >+ <enum name="GL_UNSIGNED_INT64_NV"/> >+ <enum name="GL_INT8_NV"/> >+ <enum name="GL_INT8_VEC2_NV"/> >+ <enum name="GL_INT8_VEC3_NV"/> >+ <enum name="GL_INT8_VEC4_NV"/> >+ <enum name="GL_INT16_NV"/> >+ <enum name="GL_INT16_VEC2_NV"/> >+ <enum name="GL_INT16_VEC3_NV"/> >+ <enum name="GL_INT16_VEC4_NV"/> >+ <enum name="GL_INT64_VEC2_NV"/> >+ <enum name="GL_INT64_VEC3_NV"/> >+ <enum name="GL_INT64_VEC4_NV"/> >+ <enum name="GL_UNSIGNED_INT8_NV"/> >+ <enum name="GL_UNSIGNED_INT8_VEC2_NV"/> >+ <enum name="GL_UNSIGNED_INT8_VEC3_NV"/> >+ <enum name="GL_UNSIGNED_INT8_VEC4_NV"/> >+ <enum name="GL_UNSIGNED_INT16_NV"/> >+ <enum name="GL_UNSIGNED_INT16_VEC2_NV"/> >+ <enum name="GL_UNSIGNED_INT16_VEC3_NV"/> >+ <enum name="GL_UNSIGNED_INT16_VEC4_NV"/> >+ <enum name="GL_UNSIGNED_INT64_VEC2_NV"/> >+ <enum name="GL_UNSIGNED_INT64_VEC3_NV"/> >+ <enum name="GL_UNSIGNED_INT64_VEC4_NV"/> >+ <enum name="GL_FLOAT16_NV"/> >+ <enum name="GL_FLOAT16_VEC2_NV"/> >+ <enum name="GL_FLOAT16_VEC3_NV"/> >+ <enum name="GL_FLOAT16_VEC4_NV"/> >+ <command name="glUniform1i64NV"/> >+ <command name="glUniform2i64NV"/> >+ <command name="glUniform3i64NV"/> >+ <command name="glUniform4i64NV"/> >+ <command name="glUniform1i64vNV"/> >+ <command name="glUniform2i64vNV"/> >+ <command name="glUniform3i64vNV"/> >+ <command name="glUniform4i64vNV"/> >+ <command name="glUniform1ui64NV"/> >+ <command name="glUniform2ui64NV"/> >+ <command name="glUniform3ui64NV"/> >+ <command name="glUniform4ui64NV"/> >+ <command name="glUniform1ui64vNV"/> >+ <command name="glUniform2ui64vNV"/> >+ <command name="glUniform3ui64vNV"/> >+ <command name="glUniform4ui64vNV"/> >+ <command name="glGetUniformi64vNV"/> >+ <command name="glGetUniformui64vNV"/> >+ </require> >+ <require comment="Supported only if GL_EXT_direct_state_access is supported"> >+ <command name="glProgramUniform1i64NV"/> >+ <command name="glProgramUniform2i64NV"/> >+ <command name="glProgramUniform3i64NV"/> >+ <command name="glProgramUniform4i64NV"/> >+ <command name="glProgramUniform1i64vNV"/> >+ <command name="glProgramUniform2i64vNV"/> >+ <command name="glProgramUniform3i64vNV"/> >+ <command name="glProgramUniform4i64vNV"/> >+ <command name="glProgramUniform1ui64NV"/> >+ <command name="glProgramUniform2ui64NV"/> >+ <command name="glProgramUniform3ui64NV"/> >+ <command name="glProgramUniform4ui64NV"/> >+ <command name="glProgramUniform1ui64vNV"/> >+ <command name="glProgramUniform2ui64vNV"/> >+ <command name="glProgramUniform3ui64vNV"/> >+ <command name="glProgramUniform4ui64vNV"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_interleaved_elements" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_ELEMENT_SWIZZLE_AMD"/> >+ <enum name="GL_VERTEX_ID_SWIZZLE_AMD"/> >+ <enum name="GL_RED"/> >+ <enum name="GL_GREEN"/> >+ <enum name="GL_BLUE"/> >+ <enum name="GL_ALPHA"/> >+ <enum name="GL_RG8UI"/> >+ <enum name="GL_RG16UI"/> >+ <enum name="GL_RGBA8UI"/> >+ <command name="glVertexAttribParameteriAMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_multi_draw_indirect" supported="gl"> >+ <require> >+ <command name="glMultiDrawArraysIndirectAMD"/> >+ <command name="glMultiDrawElementsIndirectAMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_name_gen_delete" supported="gl"> >+ <require> >+ <enum name="GL_DATA_BUFFER_AMD"/> >+ <enum name="GL_PERFORMANCE_MONITOR_AMD"/> >+ <enum name="GL_QUERY_OBJECT_AMD"/> >+ <enum name="GL_VERTEX_ARRAY_OBJECT_AMD"/> >+ <enum name="GL_SAMPLER_OBJECT_AMD"/> >+ <command name="glGenNamesAMD"/> >+ <command name="glDeleteNamesAMD"/> >+ <command name="glIsNameAMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_occlusion_query_event" supported="gl"> >+ <require> >+ <enum name="GL_OCCLUSION_QUERY_EVENT_MASK_AMD"/> >+ <enum name="GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD"/> >+ <enum name="GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD"/> >+ <enum name="GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD"/> >+ <enum name="GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD"/> >+ <enum name="GL_QUERY_ALL_EVENT_BITS_AMD"/> >+ <command name="glQueryObjectParameteruiAMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_performance_monitor" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_COUNTER_TYPE_AMD"/> >+ <enum name="GL_COUNTER_RANGE_AMD"/> >+ <enum name="GL_UNSIGNED_INT64_AMD"/> >+ <enum name="GL_PERCENTAGE_AMD"/> >+ <enum name="GL_PERFMON_RESULT_AVAILABLE_AMD"/> >+ <enum name="GL_PERFMON_RESULT_SIZE_AMD"/> >+ <enum name="GL_PERFMON_RESULT_AMD"/> >+ <command name="glGetPerfMonitorGroupsAMD"/> >+ <command name="glGetPerfMonitorCountersAMD"/> >+ <command name="glGetPerfMonitorGroupStringAMD"/> >+ <command name="glGetPerfMonitorCounterStringAMD"/> >+ <command name="glGetPerfMonitorCounterInfoAMD"/> >+ <command name="glGenPerfMonitorsAMD"/> >+ <command name="glDeletePerfMonitorsAMD"/> >+ <command name="glSelectPerfMonitorCountersAMD"/> >+ <command name="glBeginPerfMonitorAMD"/> >+ <command name="glEndPerfMonitorAMD"/> >+ <command name="glGetPerfMonitorCounterDataAMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_pinned_memory" supported="gl"> >+ <require> >+ <enum name="GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_program_binary_Z400" supported="gles2"> >+ <require> >+ <enum name="GL_Z400_BINARY_AMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_query_buffer_object" supported="gl"> >+ <require> >+ <enum name="GL_QUERY_BUFFER_AMD"/> >+ <enum name="GL_QUERY_BUFFER_BINDING_AMD"/> >+ <enum name="GL_QUERY_RESULT_NO_WAIT_AMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_sample_positions" supported="gl"> >+ <require> >+ <enum name="GL_SUBSAMPLE_DISTANCE_AMD"/> >+ <command name="glSetMultisamplefvAMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_seamless_cubemap_per_texture" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_CUBE_MAP_SEAMLESS"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_shader_atomic_counter_ops" supported="gl"/> >+ <extension name="GL_AMD_shader_ballot" supported="gl"/> >+ <extension name="GL_AMD_shader_gpu_shader_half_float_fetch" supported="gl"/> >+ <extension name="GL_AMD_shader_image_load_store_lod" supported="gl"/> >+ <extension name="GL_AMD_shader_stencil_export" supported="gl"/> >+ <extension name="GL_AMD_shader_trinary_minmax" supported="gl"/> >+ <extension name="GL_AMD_shader_explicit_vertex_parameter" supported="gl"/> >+ <extension name="GL_AMD_sparse_texture" supported="gl"> >+ <require> >+ <enum name="GL_VIRTUAL_PAGE_SIZE_X_AMD"/> >+ <enum name="GL_VIRTUAL_PAGE_SIZE_Y_AMD"/> >+ <enum name="GL_VIRTUAL_PAGE_SIZE_Z_AMD"/> >+ <enum name="GL_MAX_SPARSE_TEXTURE_SIZE_AMD"/> >+ <enum name="GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD"/> >+ <enum name="GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS" comment="Should have an AMD suffix, but probably too late now"/> >+ <enum name="GL_MIN_SPARSE_LEVEL_AMD"/> >+ <enum name="GL_MIN_LOD_WARNING_AMD"/> >+ <enum name="GL_TEXTURE_STORAGE_SPARSE_BIT_AMD"/> >+ <command name="glTexStorageSparseAMD"/> >+ <command name="glTextureStorageSparseAMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_stencil_operation_extended" supported="gl"> >+ <require> >+ <enum name="GL_SET_AMD"/> >+ <enum name="GL_REPLACE_VALUE_AMD"/> >+ <enum name="GL_STENCIL_OP_VALUE_AMD"/> >+ <enum name="GL_STENCIL_BACK_OP_VALUE_AMD"/> >+ <command name="glStencilOpValueAMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_texture_gather_bias_lod" supported="gl"/> >+ <extension name="GL_AMD_texture_texture4" supported="gl"/> >+ <extension name="GL_AMD_transform_feedback3_lines_triangles" supported="gl"/> >+ <extension name="GL_AMD_transform_feedback4" supported="gl"> >+ <require> >+ <enum name="GL_STREAM_RASTERIZATION_AMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_vertex_shader_layer" supported="gl"/> >+ <extension name="GL_AMD_vertex_shader_tessellator" supported="gl"> >+ <require> >+ <enum name="GL_SAMPLER_BUFFER_AMD"/> >+ <enum name="GL_INT_SAMPLER_BUFFER_AMD"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD"/> >+ <enum name="GL_TESSELLATION_MODE_AMD"/> >+ <enum name="GL_TESSELLATION_FACTOR_AMD"/> >+ <enum name="GL_DISCRETE_AMD"/> >+ <enum name="GL_CONTINUOUS_AMD"/> >+ <command name="glTessellationFactorAMD"/> >+ <command name="glTessellationModeAMD"/> >+ </require> >+ </extension> >+ <extension name="GL_AMD_vertex_shader_viewport_index" supported="gl"/> >+ <extension name="GL_ANDROID_extension_pack_es31a" supported="gles2"> >+ <require comment="This is an alias for the following extensions. At present gl.xml doesn't actually replicate all their interfaces here."> >+ <!-- >+ KHR_debug >+ KHR_texture_compression_astc_ldr >+ KHR_blend_equation_advanced >+ OES_sample_shading >+ OES_sample_variables >+ OES_shader_image_atomic >+ OES_shader_multisample_interpolation >+ OES_texture_stencil8 >+ OES_texture_storage_multisample_2d_array >+ EXT_copy_image >+ EXT_draw_buffers_indexed >+ EXT_geometry_shader >+ EXT_gpu_shader5 >+ EXT_primitive_bounding_box >+ EXT_shader_io_blocks >+ EXT_tessellation_shader >+ EXT_texture_border_clamp >+ EXT_texture_buffer >+ EXT_texture_cube_map_array >+ EXT_texture_srgb_decode >+ --> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_depth_texture" supported="gles2"> >+ <require> >+ <enum name="GL_DEPTH_COMPONENT"/> >+ <enum name="GL_DEPTH_STENCIL_OES"/> >+ <enum name="GL_UNSIGNED_SHORT"/> >+ <enum name="GL_UNSIGNED_INT"/> >+ <enum name="GL_UNSIGNED_INT_24_8_OES"/> >+ <enum name="GL_DEPTH_COMPONENT16"/> >+ <enum name="GL_DEPTH_COMPONENT32_OES"/> >+ <enum name="GL_DEPTH24_STENCIL8_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_framebuffer_blit" supported="gles2"> >+ <require> >+ <enum name="GL_READ_FRAMEBUFFER_ANGLE"/> >+ <enum name="GL_DRAW_FRAMEBUFFER_ANGLE"/> >+ <enum name="GL_DRAW_FRAMEBUFFER_BINDING_ANGLE"/> >+ <enum name="GL_READ_FRAMEBUFFER_BINDING_ANGLE"/> >+ <command name="glBlitFramebufferANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_framebuffer_multisample" supported="gles2"> >+ <require> >+ <enum name="GL_RENDERBUFFER_SAMPLES_ANGLE"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE"/> >+ <enum name="GL_MAX_SAMPLES_ANGLE"/> >+ <command name="glRenderbufferStorageMultisampleANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_instanced_arrays" supported="gles2"> >+ <require> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE"/> >+ <command name="glDrawArraysInstancedANGLE"/> >+ <command name="glDrawElementsInstancedANGLE"/> >+ <command name="glVertexAttribDivisorANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_pack_reverse_row_order" supported="gles2"> >+ <require> >+ <enum name="GL_PACK_REVERSE_ROW_ORDER_ANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_program_binary" supported="gles2"> >+ <require> >+ <enum name="GL_PROGRAM_BINARY_ANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_texture_compression_dxt3" supported="gles2"> >+ <require> >+ <enum name="GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_texture_compression_dxt5" supported="gles2"> >+ <require> >+ <enum name="GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_texture_usage" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_USAGE_ANGLE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_ANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_translated_shader_source" supported="gles2"> >+ <require> >+ <enum name="GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE"/> >+ <command name="glGetTranslatedShaderSourceANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_aux_depth_stencil" supported="gl"> >+ <require> >+ <enum name="GL_AUX_DEPTH_STENCIL_APPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_client_storage" supported="gl"> >+ <require> >+ <enum name="GL_UNPACK_CLIENT_STORAGE_APPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_clip_distance" supported="gles2"> >+ <require> >+ <enum name="GL_MAX_CLIP_DISTANCES_APPLE"/> >+ <enum name="GL_CLIP_DISTANCE0_APPLE"/> >+ <enum name="GL_CLIP_DISTANCE1_APPLE"/> >+ <enum name="GL_CLIP_DISTANCE2_APPLE"/> >+ <enum name="GL_CLIP_DISTANCE3_APPLE"/> >+ <enum name="GL_CLIP_DISTANCE4_APPLE"/> >+ <enum name="GL_CLIP_DISTANCE5_APPLE"/> >+ <enum name="GL_CLIP_DISTANCE6_APPLE"/> >+ <enum name="GL_CLIP_DISTANCE7_APPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_color_buffer_packed_float" supported="gles2"/> >+ <extension name="GL_APPLE_copy_texture_levels" supported="gles1|gles2"> >+ <require> >+ <command name="glCopyTextureLevelsAPPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_element_array" supported="gl"> >+ <require> >+ <enum name="GL_ELEMENT_ARRAY_APPLE"/> >+ <enum name="GL_ELEMENT_ARRAY_TYPE_APPLE"/> >+ <enum name="GL_ELEMENT_ARRAY_POINTER_APPLE"/> >+ <command name="glElementPointerAPPLE"/> >+ <command name="glDrawElementArrayAPPLE"/> >+ <command name="glDrawRangeElementArrayAPPLE"/> >+ <command name="glMultiDrawElementArrayAPPLE"/> >+ <command name="glMultiDrawRangeElementArrayAPPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_fence" supported="gl"> >+ <require> >+ <enum name="GL_DRAW_PIXELS_APPLE"/> >+ <enum name="GL_FENCE_APPLE"/> >+ <command name="glGenFencesAPPLE"/> >+ <command name="glDeleteFencesAPPLE"/> >+ <command name="glSetFenceAPPLE"/> >+ <command name="glIsFenceAPPLE"/> >+ <command name="glTestFenceAPPLE"/> >+ <command name="glFinishFenceAPPLE"/> >+ <command name="glTestObjectAPPLE"/> >+ <command name="glFinishObjectAPPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_float_pixels" supported="gl"> >+ <require> >+ <enum name="GL_HALF_APPLE"/> >+ <enum name="GL_RGBA_FLOAT32_APPLE"/> >+ <enum name="GL_RGB_FLOAT32_APPLE"/> >+ <enum name="GL_ALPHA_FLOAT32_APPLE"/> >+ <enum name="GL_INTENSITY_FLOAT32_APPLE"/> >+ <enum name="GL_LUMINANCE_FLOAT32_APPLE"/> >+ <enum name="GL_LUMINANCE_ALPHA_FLOAT32_APPLE"/> >+ <enum name="GL_RGBA_FLOAT16_APPLE"/> >+ <enum name="GL_RGB_FLOAT16_APPLE"/> >+ <enum name="GL_ALPHA_FLOAT16_APPLE"/> >+ <enum name="GL_INTENSITY_FLOAT16_APPLE"/> >+ <enum name="GL_LUMINANCE_FLOAT16_APPLE"/> >+ <enum name="GL_LUMINANCE_ALPHA_FLOAT16_APPLE"/> >+ <enum name="GL_COLOR_FLOAT_APPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_flush_buffer_range" supported="gl"> >+ <require> >+ <enum name="GL_BUFFER_SERIALIZED_MODIFY_APPLE"/> >+ <enum name="GL_BUFFER_FLUSHING_UNMAP_APPLE"/> >+ <command name="glBufferParameteriAPPLE"/> >+ <command name="glFlushMappedBufferRangeAPPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_framebuffer_multisample" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_RENDERBUFFER_SAMPLES_APPLE"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE"/> >+ <enum name="GL_MAX_SAMPLES_APPLE"/> >+ <enum name="GL_READ_FRAMEBUFFER_APPLE"/> >+ <enum name="GL_DRAW_FRAMEBUFFER_APPLE"/> >+ <enum name="GL_DRAW_FRAMEBUFFER_BINDING_APPLE"/> >+ <enum name="GL_READ_FRAMEBUFFER_BINDING_APPLE"/> >+ <command name="glRenderbufferStorageMultisampleAPPLE"/> >+ <command name="glResolveMultisampleFramebufferAPPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_object_purgeable" supported="gl"> >+ <require> >+ <enum name="GL_BUFFER_OBJECT_APPLE"/> >+ <enum name="GL_RELEASED_APPLE"/> >+ <enum name="GL_VOLATILE_APPLE"/> >+ <enum name="GL_RETAINED_APPLE"/> >+ <enum name="GL_UNDEFINED_APPLE"/> >+ <enum name="GL_PURGEABLE_APPLE"/> >+ <command name="glObjectPurgeableAPPLE"/> >+ <command name="glObjectUnpurgeableAPPLE"/> >+ <command name="glGetObjectParameterivAPPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_rgb_422" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_RGB_422_APPLE"/> >+ <enum name="GL_UNSIGNED_SHORT_8_8_APPLE"/> >+ <enum name="GL_UNSIGNED_SHORT_8_8_REV_APPLE"/> >+ </require> >+ <require comment="Depends on TexStorage* (EXT_texture_storage / ES 3.0 / GL 4.4 / etc.)"> >+ <enum name="GL_RGB_RAW_422_APPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_row_bytes" supported="gl"> >+ <require> >+ <enum name="GL_PACK_ROW_BYTES_APPLE"/> >+ <enum name="GL_UNPACK_ROW_BYTES_APPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_specular_vector" supported="gl"> >+ <require> >+ <enum name="GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_sync" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_SYNC_OBJECT_APPLE"/> >+ <enum name="GL_MAX_SERVER_WAIT_TIMEOUT_APPLE"/> >+ <enum name="GL_OBJECT_TYPE_APPLE"/> >+ <enum name="GL_SYNC_CONDITION_APPLE"/> >+ <enum name="GL_SYNC_STATUS_APPLE"/> >+ <enum name="GL_SYNC_FLAGS_APPLE"/> >+ <enum name="GL_SYNC_FENCE_APPLE"/> >+ <enum name="GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE"/> >+ <enum name="GL_UNSIGNALED_APPLE"/> >+ <enum name="GL_SIGNALED_APPLE"/> >+ <enum name="GL_ALREADY_SIGNALED_APPLE"/> >+ <enum name="GL_TIMEOUT_EXPIRED_APPLE"/> >+ <enum name="GL_CONDITION_SATISFIED_APPLE"/> >+ <enum name="GL_WAIT_FAILED_APPLE"/> >+ <enum name="GL_SYNC_FLUSH_COMMANDS_BIT_APPLE"/> >+ <enum name="GL_TIMEOUT_IGNORED_APPLE"/> >+ <command name="glFenceSyncAPPLE"/> >+ <command name="glIsSyncAPPLE"/> >+ <command name="glDeleteSyncAPPLE"/> >+ <command name="glClientWaitSyncAPPLE"/> >+ <command name="glWaitSyncAPPLE"/> >+ <command name="glGetInteger64vAPPLE"/> >+ <command name="glGetSyncivAPPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_texture_2D_limited_npot" supported="gles1"/> >+ <extension name="GL_APPLE_texture_format_BGRA8888" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_BGRA_EXT"/> >+ </require> >+ <require comment="Depends on TexStorage* (EXT_texture_storage / ES 3.0 / GL 4.4 / etc.)"> >+ <enum name="GL_BGRA8_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_texture_max_level" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_TEXTURE_MAX_LEVEL_APPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_texture_packed_float" supported="gles2"> >+ <require> >+ <enum name="GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE"/> >+ <enum name="GL_UNSIGNED_INT_5_9_9_9_REV_APPLE"/> >+ <enum name="GL_R11F_G11F_B10F_APPLE"/> >+ <enum name="GL_RGB9_E5_APPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_texture_range" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_RANGE_LENGTH_APPLE"/> >+ <enum name="GL_TEXTURE_RANGE_POINTER_APPLE"/> >+ <enum name="GL_TEXTURE_STORAGE_HINT_APPLE"/> >+ <enum name="GL_STORAGE_PRIVATE_APPLE"/> >+ <enum name="GL_STORAGE_CACHED_APPLE"/> >+ <enum name="GL_STORAGE_SHARED_APPLE"/> >+ <command name="glTextureRangeAPPLE"/> >+ <command name="glGetTexParameterPointervAPPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_transform_hint" supported="gl"> >+ <require> >+ <enum name="GL_TRANSFORM_HINT_APPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_vertex_array_object" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_ARRAY_BINDING_APPLE"/> >+ <command name="glBindVertexArrayAPPLE"/> >+ <command name="glDeleteVertexArraysAPPLE"/> >+ <command name="glGenVertexArraysAPPLE"/> >+ <command name="glIsVertexArrayAPPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_vertex_array_range" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_ARRAY_RANGE_APPLE"/> >+ <enum name="GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE"/> >+ <enum name="GL_VERTEX_ARRAY_STORAGE_HINT_APPLE"/> >+ <enum name="GL_VERTEX_ARRAY_RANGE_POINTER_APPLE"/> >+ <enum name="GL_STORAGE_CLIENT_APPLE"/> >+ <enum name="GL_STORAGE_CACHED_APPLE"/> >+ <enum name="GL_STORAGE_SHARED_APPLE"/> >+ <command name="glVertexArrayRangeAPPLE"/> >+ <command name="glFlushVertexArrayRangeAPPLE"/> >+ <command name="glVertexArrayParameteriAPPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_vertex_program_evaluators" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_ATTRIB_MAP1_APPLE"/> >+ <enum name="GL_VERTEX_ATTRIB_MAP2_APPLE"/> >+ <enum name="GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE"/> >+ <enum name="GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE"/> >+ <enum name="GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE"/> >+ <enum name="GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE"/> >+ <enum name="GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE"/> >+ <enum name="GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE"/> >+ <enum name="GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE"/> >+ <enum name="GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE"/> >+ <command name="glEnableVertexAttribAPPLE"/> >+ <command name="glDisableVertexAttribAPPLE"/> >+ <command name="glIsVertexAttribEnabledAPPLE"/> >+ <command name="glMapVertexAttrib1dAPPLE"/> >+ <command name="glMapVertexAttrib1fAPPLE"/> >+ <command name="glMapVertexAttrib2dAPPLE"/> >+ <command name="glMapVertexAttrib2fAPPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_APPLE_ycbcr_422" supported="gl"> >+ <require> >+ <enum name="GL_YCBCR_422_APPLE"/> >+ <enum name="GL_UNSIGNED_SHORT_8_8_APPLE"/> >+ <enum name="GL_UNSIGNED_SHORT_8_8_REV_APPLE"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_ES2_compatibility" supported="gl|glcore"> >+ <require> >+ <enum name="GL_FIXED"/> >+ <enum name="GL_IMPLEMENTATION_COLOR_READ_TYPE"/> >+ <enum name="GL_IMPLEMENTATION_COLOR_READ_FORMAT"/> >+ <enum name="GL_LOW_FLOAT"/> >+ <enum name="GL_MEDIUM_FLOAT"/> >+ <enum name="GL_HIGH_FLOAT"/> >+ <enum name="GL_LOW_INT"/> >+ <enum name="GL_MEDIUM_INT"/> >+ <enum name="GL_HIGH_INT"/> >+ <enum name="GL_SHADER_COMPILER"/> >+ <enum name="GL_SHADER_BINARY_FORMATS"/> >+ <enum name="GL_NUM_SHADER_BINARY_FORMATS"/> >+ <enum name="GL_MAX_VERTEX_UNIFORM_VECTORS"/> >+ <enum name="GL_MAX_VARYING_VECTORS"/> >+ <enum name="GL_MAX_FRAGMENT_UNIFORM_VECTORS"/> >+ <enum name="GL_RGB565"/> >+ <command name="glReleaseShaderCompiler"/> >+ <command name="glShaderBinary"/> >+ <command name="glGetShaderPrecisionFormat"/> >+ <command name="glDepthRangef"/> >+ <command name="glClearDepthf"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_ES3_1_compatibility" supported="gl|glcore"> >+ <require> >+ <enum name="GL_BACK"/> >+ <command name="glMemoryBarrierByRegion"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_ES3_2_compatibility" supported="gl|glcore"> >+ <require> >+ <enum name="GL_PRIMITIVE_BOUNDING_BOX_ARB"/> >+ <enum name="GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB"/> >+ <enum name="GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB"/> >+ <command name="glPrimitiveBoundingBoxARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_ES3_compatibility" supported="gl|glcore"> >+ <require> >+ <enum name="GL_COMPRESSED_RGB8_ETC2"/> >+ <enum name="GL_COMPRESSED_SRGB8_ETC2"/> >+ <enum name="GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"/> >+ <enum name="GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"/> >+ <enum name="GL_COMPRESSED_RGBA8_ETC2_EAC"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"/> >+ <enum name="GL_COMPRESSED_R11_EAC"/> >+ <enum name="GL_COMPRESSED_SIGNED_R11_EAC"/> >+ <enum name="GL_COMPRESSED_RG11_EAC"/> >+ <enum name="GL_COMPRESSED_SIGNED_RG11_EAC"/> >+ <enum name="GL_PRIMITIVE_RESTART_FIXED_INDEX"/> >+ <enum name="GL_ANY_SAMPLES_PASSED_CONSERVATIVE"/> >+ <enum name="GL_MAX_ELEMENT_INDEX"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_arrays_of_arrays" supported="gl|glcore"/> >+ <extension name="GL_ARB_base_instance" supported="gl|glcore"> >+ <require> >+ <command name="glDrawArraysInstancedBaseInstance"/> >+ <command name="glDrawElementsInstancedBaseInstance"/> >+ <command name="glDrawElementsInstancedBaseVertexBaseInstance"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_bindless_texture" supported="gl|glcore"> >+ <require> >+ <enum name="GL_UNSIGNED_INT64_ARB"/> >+ <command name="glGetTextureHandleARB"/> >+ <command name="glGetTextureSamplerHandleARB"/> >+ <command name="glMakeTextureHandleResidentARB"/> >+ <command name="glMakeTextureHandleNonResidentARB"/> >+ <command name="glGetImageHandleARB"/> >+ <command name="glMakeImageHandleResidentARB"/> >+ <command name="glMakeImageHandleNonResidentARB"/> >+ <command name="glUniformHandleui64ARB"/> >+ <command name="glUniformHandleui64vARB"/> >+ <command name="glProgramUniformHandleui64ARB"/> >+ <command name="glProgramUniformHandleui64vARB"/> >+ <command name="glIsTextureHandleResidentARB"/> >+ <command name="glIsImageHandleResidentARB"/> >+ <command name="glVertexAttribL1ui64ARB"/> >+ <command name="glVertexAttribL1ui64vARB"/> >+ <command name="glGetVertexAttribLui64vARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_blend_func_extended" supported="gl|glcore"> >+ <require> >+ <enum name="GL_SRC1_COLOR"/> >+ <enum name="GL_SRC1_ALPHA"/> >+ <enum name="GL_ONE_MINUS_SRC1_COLOR"/> >+ <enum name="GL_ONE_MINUS_SRC1_ALPHA"/> >+ <enum name="GL_MAX_DUAL_SOURCE_DRAW_BUFFERS"/> >+ <command name="glBindFragDataLocationIndexed"/> >+ <command name="glGetFragDataIndex"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_buffer_storage" supported="gl|glcore"> >+ <require> >+ <enum name="GL_MAP_READ_BIT"/> >+ <enum name="GL_MAP_WRITE_BIT"/> >+ <enum name="GL_MAP_PERSISTENT_BIT"/> >+ <enum name="GL_MAP_COHERENT_BIT"/> >+ <enum name="GL_DYNAMIC_STORAGE_BIT"/> >+ <enum name="GL_CLIENT_STORAGE_BIT"/> >+ <enum name="GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT"/> >+ <enum name="GL_BUFFER_IMMUTABLE_STORAGE"/> >+ <enum name="GL_BUFFER_STORAGE_FLAGS"/> >+ <command name="glBufferStorage"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_cl_event" supported="gl|glcore"> >+ <require> >+ <enum name="GL_SYNC_CL_EVENT_ARB"/> >+ <enum name="GL_SYNC_CL_EVENT_COMPLETE_ARB"/> >+ <command name="glCreateSyncFromCLeventARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_clear_buffer_object" supported="gl|glcore"> >+ <require> >+ <command name="glClearBufferData"/> >+ <command name="glClearBufferSubData"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_clear_texture" supported="gl|glcore"> >+ <require> >+ <enum name="GL_CLEAR_TEXTURE"/> >+ <command name="glClearTexImage"/> >+ <command name="glClearTexSubImage"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_clip_control" supported="gl|glcore"> >+ <require> >+ <command name="glClipControl"/> >+ <enum name="GL_LOWER_LEFT"/> >+ <enum name="GL_UPPER_LEFT"/> >+ <enum name="GL_NEGATIVE_ONE_TO_ONE"/> >+ <enum name="GL_ZERO_TO_ONE"/> >+ <enum name="GL_CLIP_ORIGIN"/> >+ <enum name="GL_CLIP_DEPTH_MODE"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_color_buffer_float" supported="gl"> >+ <require> >+ <enum name="GL_RGBA_FLOAT_MODE_ARB"/> >+ <enum name="GL_CLAMP_VERTEX_COLOR_ARB"/> >+ <enum name="GL_CLAMP_FRAGMENT_COLOR_ARB"/> >+ <enum name="GL_CLAMP_READ_COLOR_ARB"/> >+ <enum name="GL_FIXED_ONLY_ARB"/> >+ <command name="glClampColorARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_compatibility" supported="gl"> >+ <require comment="Defines features from OpenGL 3.0 that were removed in OpenGL 3.1 - not enumerated here yet"> >+ </require> >+ </extension> >+ <extension name="GL_ARB_compressed_texture_pixel_storage" supported="gl|glcore"> >+ <require> >+ <enum name="GL_UNPACK_COMPRESSED_BLOCK_WIDTH"/> >+ <enum name="GL_UNPACK_COMPRESSED_BLOCK_HEIGHT"/> >+ <enum name="GL_UNPACK_COMPRESSED_BLOCK_DEPTH"/> >+ <enum name="GL_UNPACK_COMPRESSED_BLOCK_SIZE"/> >+ <enum name="GL_PACK_COMPRESSED_BLOCK_WIDTH"/> >+ <enum name="GL_PACK_COMPRESSED_BLOCK_HEIGHT"/> >+ <enum name="GL_PACK_COMPRESSED_BLOCK_DEPTH"/> >+ <enum name="GL_PACK_COMPRESSED_BLOCK_SIZE"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_compute_shader" supported="gl|glcore"> >+ <require> >+ <enum name="GL_COMPUTE_SHADER"/> >+ <enum name="GL_MAX_COMPUTE_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_COMPUTE_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_COMPUTE_SHARED_MEMORY_SIZE"/> >+ <enum name="GL_MAX_COMPUTE_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_COMPUTE_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS"/> >+ <enum name="GL_MAX_COMPUTE_WORK_GROUP_COUNT"/> >+ <enum name="GL_MAX_COMPUTE_WORK_GROUP_SIZE"/> >+ <enum name="GL_COMPUTE_WORK_GROUP_SIZE"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER"/> >+ <enum name="GL_DISPATCH_INDIRECT_BUFFER"/> >+ <enum name="GL_DISPATCH_INDIRECT_BUFFER_BINDING"/> >+ <enum name="GL_COMPUTE_SHADER_BIT"/> >+ <command name="glDispatchCompute"/> >+ <command name="glDispatchComputeIndirect"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_compute_variable_group_size" supported="gl|glcore"> >+ <require> >+ <enum name="GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB"/> >+ <enum name="GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB"/> >+ <enum name="GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB"/> >+ <enum name="GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB"/> >+ <command name="glDispatchComputeGroupSizeARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_conditional_render_inverted" supported="gl|glcore"> >+ <require> >+ <enum name="GL_QUERY_WAIT_INVERTED"/> >+ <enum name="GL_QUERY_NO_WAIT_INVERTED"/> >+ <enum name="GL_QUERY_BY_REGION_WAIT_INVERTED"/> >+ <enum name="GL_QUERY_BY_REGION_NO_WAIT_INVERTED"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_conservative_depth" supported="gl|glcore"/> >+ <extension name="GL_ARB_copy_buffer" supported="gl|glcore"> >+ <require> >+ <enum name="GL_COPY_READ_BUFFER"/> >+ <enum name="GL_COPY_WRITE_BUFFER"/> >+ <command name="glCopyBufferSubData"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_copy_image" supported="gl|glcore"> >+ <require> >+ <command name="glCopyImageSubData"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_cull_distance" supported="gl|glcore"> >+ <require> >+ <enum name="GL_MAX_CULL_DISTANCES"/> >+ <enum name="GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_debug_output" supported="gl|glcore"> >+ <require> >+ <enum name="GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB"/> >+ <enum name="GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB"/> >+ <enum name="GL_DEBUG_CALLBACK_FUNCTION_ARB"/> >+ <enum name="GL_DEBUG_CALLBACK_USER_PARAM_ARB"/> >+ <enum name="GL_DEBUG_SOURCE_API_ARB"/> >+ <enum name="GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB"/> >+ <enum name="GL_DEBUG_SOURCE_SHADER_COMPILER_ARB"/> >+ <enum name="GL_DEBUG_SOURCE_THIRD_PARTY_ARB"/> >+ <enum name="GL_DEBUG_SOURCE_APPLICATION_ARB"/> >+ <enum name="GL_DEBUG_SOURCE_OTHER_ARB"/> >+ <enum name="GL_DEBUG_TYPE_ERROR_ARB"/> >+ <enum name="GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB"/> >+ <enum name="GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB"/> >+ <enum name="GL_DEBUG_TYPE_PORTABILITY_ARB"/> >+ <enum name="GL_DEBUG_TYPE_PERFORMANCE_ARB"/> >+ <enum name="GL_DEBUG_TYPE_OTHER_ARB"/> >+ <enum name="GL_MAX_DEBUG_MESSAGE_LENGTH_ARB"/> >+ <enum name="GL_MAX_DEBUG_LOGGED_MESSAGES_ARB"/> >+ <enum name="GL_DEBUG_LOGGED_MESSAGES_ARB"/> >+ <enum name="GL_DEBUG_SEVERITY_HIGH_ARB"/> >+ <enum name="GL_DEBUG_SEVERITY_MEDIUM_ARB"/> >+ <enum name="GL_DEBUG_SEVERITY_LOW_ARB"/> >+ <command name="glDebugMessageControlARB"/> >+ <command name="glDebugMessageInsertARB"/> >+ <command name="glDebugMessageCallbackARB"/> >+ <command name="glGetDebugMessageLogARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_depth_buffer_float" supported="gl|glcore"> >+ <require> >+ <enum name="GL_DEPTH_COMPONENT32F"/> >+ <enum name="GL_DEPTH32F_STENCIL8"/> >+ <enum name="GL_FLOAT_32_UNSIGNED_INT_24_8_REV"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_depth_clamp" supported="gl|glcore"> >+ <require> >+ <enum name="GL_DEPTH_CLAMP"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_depth_texture" supported="gl"> >+ <require> >+ <enum name="GL_DEPTH_COMPONENT16_ARB"/> >+ <enum name="GL_DEPTH_COMPONENT24_ARB"/> >+ <enum name="GL_DEPTH_COMPONENT32_ARB"/> >+ <enum name="GL_TEXTURE_DEPTH_SIZE_ARB"/> >+ <enum name="GL_DEPTH_TEXTURE_MODE_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_derivative_control" supported="gl|glcore"/> >+ <extension name="GL_ARB_direct_state_access" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TEXTURE_TARGET"/> >+ <enum name="GL_QUERY_TARGET"/> >+ <enum name="GL_TEXTURE_BINDING_1D"/> >+ <enum name="GL_TEXTURE_BINDING_1D_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_2D"/> >+ <enum name="GL_TEXTURE_BINDING_2D_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_2D_MULTISAMPLE"/> >+ <enum name="GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_3D"/> >+ <enum name="GL_TEXTURE_BINDING_BUFFER"/> >+ <enum name="GL_TEXTURE_BINDING_CUBE_MAP"/> >+ <enum name="GL_TEXTURE_BINDING_CUBE_MAP_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_RECTANGLE"/> >+ </require> >+ <require comment="Transform Feedback object functions"> >+ <command name="glCreateTransformFeedbacks"/> >+ <command name="glTransformFeedbackBufferBase"/> >+ <command name="glTransformFeedbackBufferRange"/> >+ <command name="glGetTransformFeedbackiv"/> >+ <command name="glGetTransformFeedbacki_v"/> >+ <command name="glGetTransformFeedbacki64_v"/> >+ </require> >+ <require comment="Buffer object functions"> >+ <command name="glCreateBuffers"/> >+ <command name="glNamedBufferStorage"/> >+ <command name="glNamedBufferData"/> >+ <command name="glNamedBufferSubData"/> >+ <command name="glCopyNamedBufferSubData"/> >+ <command name="glClearNamedBufferData"/> >+ <command name="glClearNamedBufferSubData"/> >+ <command name="glMapNamedBuffer"/> >+ <command name="glMapNamedBufferRange"/> >+ <command name="glUnmapNamedBuffer"/> >+ <command name="glFlushMappedNamedBufferRange"/> >+ <command name="glGetNamedBufferParameteriv"/> >+ <command name="glGetNamedBufferParameteri64v"/> >+ <command name="glGetNamedBufferPointerv"/> >+ <command name="glGetNamedBufferSubData"/> >+ </require> >+ <require comment="Framebuffer object functions"> >+ <command name="glCreateFramebuffers"/> >+ <command name="glNamedFramebufferRenderbuffer"/> >+ <command name="glNamedFramebufferParameteri"/> >+ <command name="glNamedFramebufferTexture"/> >+ <command name="glNamedFramebufferTextureLayer"/> >+ <command name="glNamedFramebufferDrawBuffer"/> >+ <command name="glNamedFramebufferDrawBuffers"/> >+ <command name="glNamedFramebufferReadBuffer"/> >+ <command name="glInvalidateNamedFramebufferData"/> >+ <command name="glInvalidateNamedFramebufferSubData"/> >+ <command name="glClearNamedFramebufferiv"/> >+ <command name="glClearNamedFramebufferuiv"/> >+ <command name="glClearNamedFramebufferfv"/> >+ <command name="glClearNamedFramebufferfi"/> >+ <command name="glBlitNamedFramebuffer"/> >+ <command name="glCheckNamedFramebufferStatus"/> >+ <command name="glGetNamedFramebufferParameteriv"/> >+ <command name="glGetNamedFramebufferAttachmentParameteriv"/> >+ </require> >+ <require comment="Renderbuffer object functions"> >+ <command name="glCreateRenderbuffers"/> >+ <command name="glNamedRenderbufferStorage"/> >+ <command name="glNamedRenderbufferStorageMultisample"/> >+ <command name="glGetNamedRenderbufferParameteriv"/> >+ </require> >+ <require comment="Texture object functions"> >+ <command name="glCreateTextures"/> >+ <command name="glTextureBuffer"/> >+ <command name="glTextureBufferRange"/> >+ <command name="glTextureStorage1D"/> >+ <command name="glTextureStorage2D"/> >+ <command name="glTextureStorage3D"/> >+ <command name="glTextureStorage2DMultisample"/> >+ <command name="glTextureStorage3DMultisample"/> >+ <command name="glTextureSubImage1D"/> >+ <command name="glTextureSubImage2D"/> >+ <command name="glTextureSubImage3D"/> >+ <command name="glCompressedTextureSubImage1D"/> >+ <command name="glCompressedTextureSubImage2D"/> >+ <command name="glCompressedTextureSubImage3D"/> >+ <command name="glCopyTextureSubImage1D"/> >+ <command name="glCopyTextureSubImage2D"/> >+ <command name="glCopyTextureSubImage3D"/> >+ <command name="glTextureParameterf"/> >+ <command name="glTextureParameterfv"/> >+ <command name="glTextureParameteri"/> >+ <command name="glTextureParameterIiv"/> >+ <command name="glTextureParameterIuiv"/> >+ <command name="glTextureParameteriv"/> >+ <command name="glGenerateTextureMipmap"/> >+ <command name="glBindTextureUnit"/> >+ <command name="glGetTextureImage"/> >+ <command name="glGetCompressedTextureImage"/> >+ <command name="glGetTextureLevelParameterfv"/> >+ <command name="glGetTextureLevelParameteriv"/> >+ <command name="glGetTextureParameterfv"/> >+ <command name="glGetTextureParameterIiv"/> >+ <command name="glGetTextureParameterIuiv"/> >+ <command name="glGetTextureParameteriv"/> >+ </require> >+ <require comment="Vertex Array object functions"> >+ <command name="glCreateVertexArrays"/> >+ <command name="glDisableVertexArrayAttrib"/> >+ <command name="glEnableVertexArrayAttrib"/> >+ <command name="glVertexArrayElementBuffer"/> >+ <command name="glVertexArrayVertexBuffer"/> >+ <command name="glVertexArrayVertexBuffers"/> >+ <command name="glVertexArrayAttribBinding"/> >+ <command name="glVertexArrayAttribFormat"/> >+ <command name="glVertexArrayAttribIFormat"/> >+ <command name="glVertexArrayAttribLFormat"/> >+ <command name="glVertexArrayBindingDivisor"/> >+ <command name="glGetVertexArrayiv"/> >+ <command name="glGetVertexArrayIndexediv"/> >+ <command name="glGetVertexArrayIndexed64iv"/> >+ </require> >+ <require comment="Sampler object functions"> >+ <command name="glCreateSamplers"/> >+ </require> >+ <require comment="Program Pipeline object functions"> >+ <command name="glCreateProgramPipelines"/> >+ </require> >+ <require comment="Query object functions"> >+ <command name="glCreateQueries"/> >+ <command name="glGetQueryBufferObjecti64v"/> >+ <command name="glGetQueryBufferObjectiv"/> >+ <command name="glGetQueryBufferObjectui64v"/> >+ <command name="glGetQueryBufferObjectuiv"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_draw_buffers" supported="gl"> >+ <require> >+ <enum name="GL_MAX_DRAW_BUFFERS_ARB"/> >+ <enum name="GL_DRAW_BUFFER0_ARB"/> >+ <enum name="GL_DRAW_BUFFER1_ARB"/> >+ <enum name="GL_DRAW_BUFFER2_ARB"/> >+ <enum name="GL_DRAW_BUFFER3_ARB"/> >+ <enum name="GL_DRAW_BUFFER4_ARB"/> >+ <enum name="GL_DRAW_BUFFER5_ARB"/> >+ <enum name="GL_DRAW_BUFFER6_ARB"/> >+ <enum name="GL_DRAW_BUFFER7_ARB"/> >+ <enum name="GL_DRAW_BUFFER8_ARB"/> >+ <enum name="GL_DRAW_BUFFER9_ARB"/> >+ <enum name="GL_DRAW_BUFFER10_ARB"/> >+ <enum name="GL_DRAW_BUFFER11_ARB"/> >+ <enum name="GL_DRAW_BUFFER12_ARB"/> >+ <enum name="GL_DRAW_BUFFER13_ARB"/> >+ <enum name="GL_DRAW_BUFFER14_ARB"/> >+ <enum name="GL_DRAW_BUFFER15_ARB"/> >+ <command name="glDrawBuffersARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_draw_buffers_blend" supported="gl|glcore"> >+ <require> >+ <command name="glBlendEquationiARB"/> >+ <command name="glBlendEquationSeparateiARB"/> >+ <command name="glBlendFunciARB"/> >+ <command name="glBlendFuncSeparateiARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_draw_elements_base_vertex" supported="gl|glcore"> >+ <require> >+ <command name="glDrawElementsBaseVertex"/> >+ <command name="glDrawRangeElementsBaseVertex"/> >+ <command name="glDrawElementsInstancedBaseVertex"/> >+ <command name="glMultiDrawElementsBaseVertex"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_draw_indirect" supported="gl|glcore"> >+ <require> >+ <enum name="GL_DRAW_INDIRECT_BUFFER"/> >+ <enum name="GL_DRAW_INDIRECT_BUFFER_BINDING"/> >+ <command name="glDrawArraysIndirect"/> >+ <command name="glDrawElementsIndirect"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_draw_instanced" supported="gl|glcore"> >+ <require> >+ <command name="glDrawArraysInstancedARB"/> >+ <command name="glDrawElementsInstancedARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_enhanced_layouts" supported="gl|glcore"> >+ <require> >+ <enum name="GL_LOCATION_COMPONENT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_INDEX"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_explicit_attrib_location" supported="gl|glcore"/> >+ <extension name="GL_ARB_explicit_uniform_location" supported="gl|glcore"> >+ <require> >+ <enum name="GL_MAX_UNIFORM_LOCATIONS"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_fragment_coord_conventions" supported="gl|glcore"/> >+ <extension name="GL_ARB_fragment_layer_viewport" supported="gl|glcore"/> >+ <extension name="GL_ARB_fragment_program" supported="gl"> >+ <require> >+ <enum name="GL_FRAGMENT_PROGRAM_ARB"/> >+ <enum name="GL_PROGRAM_FORMAT_ASCII_ARB"/> >+ <enum name="GL_PROGRAM_LENGTH_ARB"/> >+ <enum name="GL_PROGRAM_FORMAT_ARB"/> >+ <enum name="GL_PROGRAM_BINDING_ARB"/> >+ <enum name="GL_PROGRAM_INSTRUCTIONS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_INSTRUCTIONS_ARB"/> >+ <enum name="GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB"/> >+ <enum name="GL_PROGRAM_TEMPORARIES_ARB"/> >+ <enum name="GL_MAX_PROGRAM_TEMPORARIES_ARB"/> >+ <enum name="GL_PROGRAM_NATIVE_TEMPORARIES_ARB"/> >+ <enum name="GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB"/> >+ <enum name="GL_PROGRAM_PARAMETERS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_PARAMETERS_ARB"/> >+ <enum name="GL_PROGRAM_NATIVE_PARAMETERS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB"/> >+ <enum name="GL_PROGRAM_ATTRIBS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_ATTRIBS_ARB"/> >+ <enum name="GL_PROGRAM_NATIVE_ATTRIBS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_ENV_PARAMETERS_ARB"/> >+ <enum name="GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB"/> >+ <enum name="GL_PROGRAM_ALU_INSTRUCTIONS_ARB"/> >+ <enum name="GL_PROGRAM_TEX_INSTRUCTIONS_ARB"/> >+ <enum name="GL_PROGRAM_TEX_INDIRECTIONS_ARB"/> >+ <enum name="GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB"/> >+ <enum name="GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB"/> >+ <enum name="GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB"/> >+ <enum name="GL_PROGRAM_STRING_ARB"/> >+ <enum name="GL_PROGRAM_ERROR_POSITION_ARB"/> >+ <enum name="GL_CURRENT_MATRIX_ARB"/> >+ <enum name="GL_TRANSPOSE_CURRENT_MATRIX_ARB"/> >+ <enum name="GL_CURRENT_MATRIX_STACK_DEPTH_ARB"/> >+ <enum name="GL_MAX_PROGRAM_MATRICES_ARB"/> >+ <enum name="GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB"/> >+ <enum name="GL_MAX_TEXTURE_COORDS_ARB"/> >+ <enum name="GL_MAX_TEXTURE_IMAGE_UNITS_ARB"/> >+ <enum name="GL_PROGRAM_ERROR_STRING_ARB"/> >+ <enum name="GL_MATRIX0_ARB"/> >+ <enum name="GL_MATRIX1_ARB"/> >+ <enum name="GL_MATRIX2_ARB"/> >+ <enum name="GL_MATRIX3_ARB"/> >+ <enum name="GL_MATRIX4_ARB"/> >+ <enum name="GL_MATRIX5_ARB"/> >+ <enum name="GL_MATRIX6_ARB"/> >+ <enum name="GL_MATRIX7_ARB"/> >+ <enum name="GL_MATRIX8_ARB"/> >+ <enum name="GL_MATRIX9_ARB"/> >+ <enum name="GL_MATRIX10_ARB"/> >+ <enum name="GL_MATRIX11_ARB"/> >+ <enum name="GL_MATRIX12_ARB"/> >+ <enum name="GL_MATRIX13_ARB"/> >+ <enum name="GL_MATRIX14_ARB"/> >+ <enum name="GL_MATRIX15_ARB"/> >+ <enum name="GL_MATRIX16_ARB"/> >+ <enum name="GL_MATRIX17_ARB"/> >+ <enum name="GL_MATRIX18_ARB"/> >+ <enum name="GL_MATRIX19_ARB"/> >+ <enum name="GL_MATRIX20_ARB"/> >+ <enum name="GL_MATRIX21_ARB"/> >+ <enum name="GL_MATRIX22_ARB"/> >+ <enum name="GL_MATRIX23_ARB"/> >+ <enum name="GL_MATRIX24_ARB"/> >+ <enum name="GL_MATRIX25_ARB"/> >+ <enum name="GL_MATRIX26_ARB"/> >+ <enum name="GL_MATRIX27_ARB"/> >+ <enum name="GL_MATRIX28_ARB"/> >+ <enum name="GL_MATRIX29_ARB"/> >+ <enum name="GL_MATRIX30_ARB"/> >+ <enum name="GL_MATRIX31_ARB"/> >+ </require> >+ <require comment="Shared with ARB_vertex_program"> >+ <command name="glProgramStringARB"/> >+ <command name="glBindProgramARB"/> >+ <command name="glDeleteProgramsARB"/> >+ <command name="glGenProgramsARB"/> >+ <command name="glProgramEnvParameter4dARB"/> >+ <command name="glProgramEnvParameter4dvARB"/> >+ <command name="glProgramEnvParameter4fARB"/> >+ <command name="glProgramEnvParameter4fvARB"/> >+ <command name="glProgramLocalParameter4dARB"/> >+ <command name="glProgramLocalParameter4dvARB"/> >+ <command name="glProgramLocalParameter4fARB"/> >+ <command name="glProgramLocalParameter4fvARB"/> >+ <command name="glGetProgramEnvParameterdvARB"/> >+ <command name="glGetProgramEnvParameterfvARB"/> >+ <command name="glGetProgramLocalParameterdvARB"/> >+ <command name="glGetProgramLocalParameterfvARB"/> >+ <command name="glGetProgramivARB"/> >+ <command name="glGetProgramStringARB"/> >+ <command name="glIsProgramARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_fragment_program_shadow" supported="gl"/> >+ <extension name="GL_ARB_fragment_shader" supported="gl"> >+ <require> >+ <enum name="GL_FRAGMENT_SHADER_ARB"/> >+ <enum name="GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB"/> >+ <enum name="GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_fragment_shader_interlock" supported="gl|glcore"/> >+ <extension name="GL_ARB_framebuffer_no_attachments" supported="gl|glcore"> >+ <require> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_WIDTH"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_HEIGHT"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_LAYERS"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_SAMPLES"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS"/> >+ <enum name="GL_MAX_FRAMEBUFFER_WIDTH"/> >+ <enum name="GL_MAX_FRAMEBUFFER_HEIGHT"/> >+ <enum name="GL_MAX_FRAMEBUFFER_LAYERS"/> >+ <enum name="GL_MAX_FRAMEBUFFER_SAMPLES"/> >+ <command name="glFramebufferParameteri"/> >+ <command name="glGetFramebufferParameteriv"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_framebuffer_object" supported="gl|glcore"> >+ <require> >+ <enum name="GL_INVALID_FRAMEBUFFER_OPERATION"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT"/> >+ <enum name="GL_FRAMEBUFFER_UNDEFINED"/> >+ <enum name="GL_DEPTH_STENCIL_ATTACHMENT"/> >+ <enum name="GL_MAX_RENDERBUFFER_SIZE"/> >+ <enum name="GL_DEPTH_STENCIL"/> >+ <enum name="GL_UNSIGNED_INT_24_8"/> >+ <enum name="GL_DEPTH24_STENCIL8"/> >+ <enum name="GL_TEXTURE_STENCIL_SIZE"/> >+ <enum name="GL_UNSIGNED_NORMALIZED"/> >+ <enum name="GL_FRAMEBUFFER_BINDING"/> >+ <enum name="GL_DRAW_FRAMEBUFFER_BINDING"/> >+ <enum name="GL_RENDERBUFFER_BINDING"/> >+ <enum name="GL_READ_FRAMEBUFFER"/> >+ <enum name="GL_DRAW_FRAMEBUFFER"/> >+ <enum name="GL_READ_FRAMEBUFFER_BINDING"/> >+ <enum name="GL_RENDERBUFFER_SAMPLES"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER"/> >+ <enum name="GL_FRAMEBUFFER_COMPLETE"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER"/> >+ <enum name="GL_FRAMEBUFFER_UNSUPPORTED"/> >+ <enum name="GL_MAX_COLOR_ATTACHMENTS"/> >+ <enum name="GL_COLOR_ATTACHMENT0"/> >+ <enum name="GL_COLOR_ATTACHMENT1"/> >+ <enum name="GL_COLOR_ATTACHMENT2"/> >+ <enum name="GL_COLOR_ATTACHMENT3"/> >+ <enum name="GL_COLOR_ATTACHMENT4"/> >+ <enum name="GL_COLOR_ATTACHMENT5"/> >+ <enum name="GL_COLOR_ATTACHMENT6"/> >+ <enum name="GL_COLOR_ATTACHMENT7"/> >+ <enum name="GL_COLOR_ATTACHMENT8"/> >+ <enum name="GL_COLOR_ATTACHMENT9"/> >+ <enum name="GL_COLOR_ATTACHMENT10"/> >+ <enum name="GL_COLOR_ATTACHMENT11"/> >+ <enum name="GL_COLOR_ATTACHMENT12"/> >+ <enum name="GL_COLOR_ATTACHMENT13"/> >+ <enum name="GL_COLOR_ATTACHMENT14"/> >+ <enum name="GL_COLOR_ATTACHMENT15"/> >+ <enum name="GL_DEPTH_ATTACHMENT"/> >+ <enum name="GL_STENCIL_ATTACHMENT"/> >+ <enum name="GL_FRAMEBUFFER"/> >+ <enum name="GL_RENDERBUFFER"/> >+ <enum name="GL_RENDERBUFFER_WIDTH"/> >+ <enum name="GL_RENDERBUFFER_HEIGHT"/> >+ <enum name="GL_RENDERBUFFER_INTERNAL_FORMAT"/> >+ <enum name="GL_STENCIL_INDEX1"/> >+ <enum name="GL_STENCIL_INDEX4"/> >+ <enum name="GL_STENCIL_INDEX8"/> >+ <enum name="GL_STENCIL_INDEX16"/> >+ <enum name="GL_RENDERBUFFER_RED_SIZE"/> >+ <enum name="GL_RENDERBUFFER_GREEN_SIZE"/> >+ <enum name="GL_RENDERBUFFER_BLUE_SIZE"/> >+ <enum name="GL_RENDERBUFFER_ALPHA_SIZE"/> >+ <enum name="GL_RENDERBUFFER_DEPTH_SIZE"/> >+ <enum name="GL_RENDERBUFFER_STENCIL_SIZE"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE"/> >+ <enum name="GL_MAX_SAMPLES"/> >+ <command name="glIsRenderbuffer"/> >+ <command name="glBindRenderbuffer"/> >+ <command name="glDeleteRenderbuffers"/> >+ <command name="glGenRenderbuffers"/> >+ <command name="glRenderbufferStorage"/> >+ <command name="glGetRenderbufferParameteriv"/> >+ <command name="glIsFramebuffer"/> >+ <command name="glBindFramebuffer"/> >+ <command name="glDeleteFramebuffers"/> >+ <command name="glGenFramebuffers"/> >+ <command name="glCheckFramebufferStatus"/> >+ <command name="glFramebufferTexture1D"/> >+ <command name="glFramebufferTexture2D"/> >+ <command name="glFramebufferTexture3D"/> >+ <command name="glFramebufferRenderbuffer"/> >+ <command name="glGetFramebufferAttachmentParameteriv"/> >+ <command name="glGenerateMipmap"/> >+ <command name="glBlitFramebuffer"/> >+ <command name="glRenderbufferStorageMultisample"/> >+ <command name="glFramebufferTextureLayer"/> >+ </require> >+ <require api="gl" profile="compatibility"> >+ <enum name="GL_INDEX"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_framebuffer_sRGB" supported="gl|glcore"> >+ <require> >+ <enum name="GL_FRAMEBUFFER_SRGB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_geometry_shader4" supported="gl|glcore"> >+ <require> >+ <enum name="GL_LINES_ADJACENCY_ARB"/> >+ <enum name="GL_LINE_STRIP_ADJACENCY_ARB"/> >+ <enum name="GL_TRIANGLES_ADJACENCY_ARB"/> >+ <enum name="GL_TRIANGLE_STRIP_ADJACENCY_ARB"/> >+ <enum name="GL_PROGRAM_POINT_SIZE_ARB"/> >+ <enum name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB"/> >+ <enum name="GL_GEOMETRY_SHADER_ARB"/> >+ <enum name="GL_GEOMETRY_VERTICES_OUT_ARB"/> >+ <enum name="GL_GEOMETRY_INPUT_TYPE_ARB"/> >+ <enum name="GL_GEOMETRY_OUTPUT_TYPE_ARB"/> >+ <enum name="GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB"/> >+ <enum name="GL_MAX_VERTEX_VARYING_COMPONENTS_ARB"/> >+ <enum name="GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB"/> >+ <enum name="GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB"/> >+ <enum name="GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB"/> >+ <enum name="GL_MAX_VARYING_COMPONENTS"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER"/> >+ <command name="glProgramParameteriARB"/> >+ <command name="glFramebufferTextureARB"/> >+ <command name="glFramebufferTextureLayerARB"/> >+ <command name="glFramebufferTextureFaceARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_get_program_binary" supported="gl|glcore"> >+ <require> >+ <enum name="GL_PROGRAM_BINARY_RETRIEVABLE_HINT"/> >+ <enum name="GL_PROGRAM_BINARY_LENGTH"/> >+ <enum name="GL_NUM_PROGRAM_BINARY_FORMATS"/> >+ <enum name="GL_PROGRAM_BINARY_FORMATS"/> >+ <command name="glGetProgramBinary"/> >+ <command name="glProgramBinary"/> >+ <command name="glProgramParameteri"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_get_texture_sub_image" supported="gl|glcore"> >+ <require> >+ <command name="glGetTextureSubImage"/> >+ <command name="glGetCompressedTextureSubImage"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_gl_spirv" supported="gl|glcore"> >+ <require> >+ <enum name="GL_SHADER_BINARY_FORMAT_SPIR_V_ARB"/> >+ <enum name="GL_SPIR_V_BINARY_ARB"/> >+ <command name="glSpecializeShaderARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_gpu_shader5" supported="gl|glcore"> >+ <require> >+ <enum name="GL_GEOMETRY_SHADER_INVOCATIONS"/> >+ <enum name="GL_MAX_GEOMETRY_SHADER_INVOCATIONS"/> >+ <enum name="GL_MIN_FRAGMENT_INTERPOLATION_OFFSET"/> >+ <enum name="GL_MAX_FRAGMENT_INTERPOLATION_OFFSET"/> >+ <enum name="GL_FRAGMENT_INTERPOLATION_OFFSET_BITS"/> >+ <enum name="GL_MAX_VERTEX_STREAMS"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_gpu_shader_fp64" supported="gl|glcore"> >+ <require> >+ <enum name="GL_DOUBLE"/> >+ <enum name="GL_DOUBLE_VEC2"/> >+ <enum name="GL_DOUBLE_VEC3"/> >+ <enum name="GL_DOUBLE_VEC4"/> >+ <enum name="GL_DOUBLE_MAT2"/> >+ <enum name="GL_DOUBLE_MAT3"/> >+ <enum name="GL_DOUBLE_MAT4"/> >+ <enum name="GL_DOUBLE_MAT2x3"/> >+ <enum name="GL_DOUBLE_MAT2x4"/> >+ <enum name="GL_DOUBLE_MAT3x2"/> >+ <enum name="GL_DOUBLE_MAT3x4"/> >+ <enum name="GL_DOUBLE_MAT4x2"/> >+ <enum name="GL_DOUBLE_MAT4x3"/> >+ <command name="glUniform1d"/> >+ <command name="glUniform2d"/> >+ <command name="glUniform3d"/> >+ <command name="glUniform4d"/> >+ <command name="glUniform1dv"/> >+ <command name="glUniform2dv"/> >+ <command name="glUniform3dv"/> >+ <command name="glUniform4dv"/> >+ <command name="glUniformMatrix2dv"/> >+ <command name="glUniformMatrix3dv"/> >+ <command name="glUniformMatrix4dv"/> >+ <command name="glUniformMatrix2x3dv"/> >+ <command name="glUniformMatrix2x4dv"/> >+ <command name="glUniformMatrix3x2dv"/> >+ <command name="glUniformMatrix3x4dv"/> >+ <command name="glUniformMatrix4x2dv"/> >+ <command name="glUniformMatrix4x3dv"/> >+ <command name="glGetUniformdv"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_gpu_shader_int64" supported="gl|glcore"> >+ <require> >+ <enum name="GL_INT64_ARB"/> >+ <enum name="GL_UNSIGNED_INT64_ARB"/> >+ <enum name="GL_INT64_VEC2_ARB"/> >+ <enum name="GL_INT64_VEC3_ARB"/> >+ <enum name="GL_INT64_VEC4_ARB"/> >+ <enum name="GL_UNSIGNED_INT64_VEC2_ARB"/> >+ <enum name="GL_UNSIGNED_INT64_VEC3_ARB"/> >+ <enum name="GL_UNSIGNED_INT64_VEC4_ARB"/> >+ <command name="glUniform1i64ARB"/> >+ <command name="glUniform2i64ARB"/> >+ <command name="glUniform3i64ARB"/> >+ <command name="glUniform4i64ARB"/> >+ <command name="glUniform1i64vARB"/> >+ <command name="glUniform2i64vARB"/> >+ <command name="glUniform3i64vARB"/> >+ <command name="glUniform4i64vARB"/> >+ <command name="glUniform1ui64ARB"/> >+ <command name="glUniform2ui64ARB"/> >+ <command name="glUniform3ui64ARB"/> >+ <command name="glUniform4ui64ARB"/> >+ <command name="glUniform1ui64vARB"/> >+ <command name="glUniform2ui64vARB"/> >+ <command name="glUniform3ui64vARB"/> >+ <command name="glUniform4ui64vARB"/> >+ <command name="glGetUniformi64vARB"/> >+ <command name="glGetUniformui64vARB"/> >+ <command name="glGetnUniformi64vARB"/> >+ <command name="glGetnUniformui64vARB"/> >+ <command name="glProgramUniform1i64ARB"/> >+ <command name="glProgramUniform2i64ARB"/> >+ <command name="glProgramUniform3i64ARB"/> >+ <command name="glProgramUniform4i64ARB"/> >+ <command name="glProgramUniform1i64vARB"/> >+ <command name="glProgramUniform2i64vARB"/> >+ <command name="glProgramUniform3i64vARB"/> >+ <command name="glProgramUniform4i64vARB"/> >+ <command name="glProgramUniform1ui64ARB"/> >+ <command name="glProgramUniform2ui64ARB"/> >+ <command name="glProgramUniform3ui64ARB"/> >+ <command name="glProgramUniform4ui64ARB"/> >+ <command name="glProgramUniform1ui64vARB"/> >+ <command name="glProgramUniform2ui64vARB"/> >+ <command name="glProgramUniform3ui64vARB"/> >+ <command name="glProgramUniform4ui64vARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_half_float_pixel" supported="gl"> >+ <require> >+ <type name="GLhalfARB"/> >+ <enum name="GL_HALF_FLOAT_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_half_float_vertex" supported="gl|glcore"> >+ <require> >+ <type name="GLhalf"/> >+ <enum name="GL_HALF_FLOAT"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_imaging" supported="gl|glcore" comment="Now treating ARB_imaging as an extension, not a GL API version"> >+ <require> >+ <enum name="GL_BLEND_COLOR"/> >+ <enum name="GL_BLEND_EQUATION"/> >+ <enum name="GL_CONSTANT_COLOR"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_COLOR"/> >+ <enum name="GL_CONSTANT_ALPHA"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_ALPHA"/> >+ <enum name="GL_FUNC_ADD"/> >+ <enum name="GL_FUNC_REVERSE_SUBTRACT"/> >+ <enum name="GL_FUNC_SUBTRACT"/> >+ <enum name="GL_MIN"/> >+ <enum name="GL_MAX"/> >+ <command name="glBlendColor"/> >+ <command name="glBlendEquation"/> >+ </require> >+ <require api="gl" profile="compatibility"> >+ <enum name="GL_CONVOLUTION_1D"/> >+ <enum name="GL_CONVOLUTION_2D"/> >+ <enum name="GL_SEPARABLE_2D"/> >+ <enum name="GL_CONVOLUTION_BORDER_MODE"/> >+ <enum name="GL_CONVOLUTION_FILTER_SCALE"/> >+ <enum name="GL_CONVOLUTION_FILTER_BIAS"/> >+ <enum name="GL_REDUCE"/> >+ <enum name="GL_CONVOLUTION_FORMAT"/> >+ <enum name="GL_CONVOLUTION_WIDTH"/> >+ <enum name="GL_CONVOLUTION_HEIGHT"/> >+ <enum name="GL_MAX_CONVOLUTION_WIDTH"/> >+ <enum name="GL_MAX_CONVOLUTION_HEIGHT"/> >+ <enum name="GL_POST_CONVOLUTION_RED_SCALE"/> >+ <enum name="GL_POST_CONVOLUTION_GREEN_SCALE"/> >+ <enum name="GL_POST_CONVOLUTION_BLUE_SCALE"/> >+ <enum name="GL_POST_CONVOLUTION_ALPHA_SCALE"/> >+ <enum name="GL_POST_CONVOLUTION_RED_BIAS"/> >+ <enum name="GL_POST_CONVOLUTION_GREEN_BIAS"/> >+ <enum name="GL_POST_CONVOLUTION_BLUE_BIAS"/> >+ <enum name="GL_POST_CONVOLUTION_ALPHA_BIAS"/> >+ <enum name="GL_HISTOGRAM"/> >+ <enum name="GL_PROXY_HISTOGRAM"/> >+ <enum name="GL_HISTOGRAM_WIDTH"/> >+ <enum name="GL_HISTOGRAM_FORMAT"/> >+ <enum name="GL_HISTOGRAM_RED_SIZE"/> >+ <enum name="GL_HISTOGRAM_GREEN_SIZE"/> >+ <enum name="GL_HISTOGRAM_BLUE_SIZE"/> >+ <enum name="GL_HISTOGRAM_ALPHA_SIZE"/> >+ <enum name="GL_HISTOGRAM_LUMINANCE_SIZE"/> >+ <enum name="GL_HISTOGRAM_SINK"/> >+ <enum name="GL_MINMAX"/> >+ <enum name="GL_MINMAX_FORMAT"/> >+ <enum name="GL_MINMAX_SINK"/> >+ <enum name="GL_TABLE_TOO_LARGE"/> >+ <enum name="GL_COLOR_MATRIX"/> >+ <enum name="GL_COLOR_MATRIX_STACK_DEPTH"/> >+ <enum name="GL_MAX_COLOR_MATRIX_STACK_DEPTH"/> >+ <enum name="GL_POST_COLOR_MATRIX_RED_SCALE"/> >+ <enum name="GL_POST_COLOR_MATRIX_GREEN_SCALE"/> >+ <enum name="GL_POST_COLOR_MATRIX_BLUE_SCALE"/> >+ <enum name="GL_POST_COLOR_MATRIX_ALPHA_SCALE"/> >+ <enum name="GL_POST_COLOR_MATRIX_RED_BIAS"/> >+ <enum name="GL_POST_COLOR_MATRIX_GREEN_BIAS"/> >+ <enum name="GL_POST_COLOR_MATRIX_BLUE_BIAS"/> >+ <enum name="GL_POST_COLOR_MATRIX_ALPHA_BIAS"/> >+ <enum name="GL_COLOR_TABLE"/> >+ <enum name="GL_POST_CONVOLUTION_COLOR_TABLE"/> >+ <enum name="GL_POST_COLOR_MATRIX_COLOR_TABLE"/> >+ <enum name="GL_PROXY_COLOR_TABLE"/> >+ <enum name="GL_PROXY_POST_CONVOLUTION_COLOR_TABLE"/> >+ <enum name="GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE"/> >+ <enum name="GL_COLOR_TABLE_SCALE"/> >+ <enum name="GL_COLOR_TABLE_BIAS"/> >+ <enum name="GL_COLOR_TABLE_FORMAT"/> >+ <enum name="GL_COLOR_TABLE_WIDTH"/> >+ <enum name="GL_COLOR_TABLE_RED_SIZE"/> >+ <enum name="GL_COLOR_TABLE_GREEN_SIZE"/> >+ <enum name="GL_COLOR_TABLE_BLUE_SIZE"/> >+ <enum name="GL_COLOR_TABLE_ALPHA_SIZE"/> >+ <enum name="GL_COLOR_TABLE_LUMINANCE_SIZE"/> >+ <enum name="GL_COLOR_TABLE_INTENSITY_SIZE"/> >+ <enum name="GL_CONSTANT_BORDER"/> >+ <enum name="GL_REPLICATE_BORDER"/> >+ <enum name="GL_CONVOLUTION_BORDER_COLOR"/> >+ <command name="glColorTable"/> >+ <command name="glColorTableParameterfv"/> >+ <command name="glColorTableParameteriv"/> >+ <command name="glCopyColorTable"/> >+ <command name="glGetColorTable"/> >+ <command name="glGetColorTableParameterfv"/> >+ <command name="glGetColorTableParameteriv"/> >+ <command name="glColorSubTable"/> >+ <command name="glCopyColorSubTable"/> >+ <command name="glConvolutionFilter1D"/> >+ <command name="glConvolutionFilter2D"/> >+ <command name="glConvolutionParameterf"/> >+ <command name="glConvolutionParameterfv"/> >+ <command name="glConvolutionParameteri"/> >+ <command name="glConvolutionParameteriv"/> >+ <command name="glCopyConvolutionFilter1D"/> >+ <command name="glCopyConvolutionFilter2D"/> >+ <command name="glGetConvolutionFilter"/> >+ <command name="glGetConvolutionParameterfv"/> >+ <command name="glGetConvolutionParameteriv"/> >+ <command name="glGetSeparableFilter"/> >+ <command name="glSeparableFilter2D"/> >+ <command name="glGetHistogram"/> >+ <command name="glGetHistogramParameterfv"/> >+ <command name="glGetHistogramParameteriv"/> >+ <command name="glGetMinmax"/> >+ <command name="glGetMinmaxParameterfv"/> >+ <command name="glGetMinmaxParameteriv"/> >+ <command name="glHistogram"/> >+ <command name="glMinmax"/> >+ <command name="glResetHistogram"/> >+ <command name="glResetMinmax"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_indirect_parameters" supported="gl|glcore"> >+ <require> >+ <enum name="GL_PARAMETER_BUFFER_ARB"/> >+ <enum name="GL_PARAMETER_BUFFER_BINDING_ARB"/> >+ <command name="glMultiDrawArraysIndirectCountARB"/> >+ <command name="glMultiDrawElementsIndirectCountARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_instanced_arrays" supported="gl|glcore"> >+ <require> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB"/> >+ <command name="glVertexAttribDivisorARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_internalformat_query" supported="gl|glcore"> >+ <require> >+ <enum name="GL_NUM_SAMPLE_COUNTS"/> >+ <command name="glGetInternalformativ"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_internalformat_query2" supported="gl|glcore"> >+ <require> >+ <enum name="GL_IMAGE_FORMAT_COMPATIBILITY_TYPE"/> >+ <enum name="GL_NUM_SAMPLE_COUNTS"/> >+ <enum name="GL_RENDERBUFFER"/> >+ <enum name="GL_SAMPLES"/> >+ <enum name="GL_TEXTURE_1D"/> >+ <enum name="GL_TEXTURE_1D_ARRAY"/> >+ <enum name="GL_TEXTURE_2D"/> >+ <enum name="GL_TEXTURE_2D_ARRAY"/> >+ <enum name="GL_TEXTURE_3D"/> >+ <enum name="GL_TEXTURE_CUBE_MAP"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_ARRAY"/> >+ <enum name="GL_TEXTURE_RECTANGLE"/> >+ <enum name="GL_TEXTURE_BUFFER"/> >+ <enum name="GL_TEXTURE_2D_MULTISAMPLE"/> >+ <enum name="GL_TEXTURE_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_TEXTURE_COMPRESSED"/> >+ <enum name="GL_INTERNALFORMAT_SUPPORTED"/> >+ <enum name="GL_INTERNALFORMAT_PREFERRED"/> >+ <enum name="GL_INTERNALFORMAT_RED_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_GREEN_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_BLUE_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_ALPHA_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_DEPTH_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_STENCIL_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_SHARED_SIZE"/> >+ <enum name="GL_INTERNALFORMAT_RED_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_GREEN_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_BLUE_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_ALPHA_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_DEPTH_TYPE"/> >+ <enum name="GL_INTERNALFORMAT_STENCIL_TYPE"/> >+ <enum name="GL_MAX_WIDTH"/> >+ <enum name="GL_MAX_HEIGHT"/> >+ <enum name="GL_MAX_DEPTH"/> >+ <enum name="GL_MAX_LAYERS"/> >+ <enum name="GL_MAX_COMBINED_DIMENSIONS"/> >+ <enum name="GL_COLOR_COMPONENTS"/> >+ <enum name="GL_DEPTH_COMPONENTS"/> >+ <enum name="GL_STENCIL_COMPONENTS"/> >+ <enum name="GL_COLOR_RENDERABLE"/> >+ <enum name="GL_DEPTH_RENDERABLE"/> >+ <enum name="GL_STENCIL_RENDERABLE"/> >+ <enum name="GL_FRAMEBUFFER_RENDERABLE"/> >+ <enum name="GL_FRAMEBUFFER_RENDERABLE_LAYERED"/> >+ <enum name="GL_FRAMEBUFFER_BLEND"/> >+ <enum name="GL_READ_PIXELS"/> >+ <enum name="GL_READ_PIXELS_FORMAT"/> >+ <enum name="GL_READ_PIXELS_TYPE"/> >+ <enum name="GL_TEXTURE_IMAGE_FORMAT"/> >+ <enum name="GL_TEXTURE_IMAGE_TYPE"/> >+ <enum name="GL_GET_TEXTURE_IMAGE_FORMAT"/> >+ <enum name="GL_GET_TEXTURE_IMAGE_TYPE"/> >+ <enum name="GL_MIPMAP"/> >+ <enum name="GL_MANUAL_GENERATE_MIPMAP"/> >+ <enum name="GL_AUTO_GENERATE_MIPMAP"/> >+ <enum name="GL_COLOR_ENCODING"/> >+ <enum name="GL_SRGB_READ"/> >+ <enum name="GL_SRGB_WRITE"/> >+ <enum name="GL_SRGB_DECODE_ARB"/> >+ <enum name="GL_FILTER"/> >+ <enum name="GL_VERTEX_TEXTURE"/> >+ <enum name="GL_TESS_CONTROL_TEXTURE"/> >+ <enum name="GL_TESS_EVALUATION_TEXTURE"/> >+ <enum name="GL_GEOMETRY_TEXTURE"/> >+ <enum name="GL_FRAGMENT_TEXTURE"/> >+ <enum name="GL_COMPUTE_TEXTURE"/> >+ <enum name="GL_TEXTURE_SHADOW"/> >+ <enum name="GL_TEXTURE_GATHER"/> >+ <enum name="GL_TEXTURE_GATHER_SHADOW"/> >+ <enum name="GL_SHADER_IMAGE_LOAD"/> >+ <enum name="GL_SHADER_IMAGE_STORE"/> >+ <enum name="GL_SHADER_IMAGE_ATOMIC"/> >+ <enum name="GL_IMAGE_TEXEL_SIZE"/> >+ <enum name="GL_IMAGE_COMPATIBILITY_CLASS"/> >+ <enum name="GL_IMAGE_PIXEL_FORMAT"/> >+ <enum name="GL_IMAGE_PIXEL_TYPE"/> >+ <enum name="GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST"/> >+ <enum name="GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST"/> >+ <enum name="GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE"/> >+ <enum name="GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE"/> >+ <enum name="GL_TEXTURE_COMPRESSED_BLOCK_WIDTH"/> >+ <enum name="GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT"/> >+ <enum name="GL_TEXTURE_COMPRESSED_BLOCK_SIZE"/> >+ <enum name="GL_CLEAR_BUFFER"/> >+ <enum name="GL_TEXTURE_VIEW"/> >+ <enum name="GL_VIEW_COMPATIBILITY_CLASS"/> >+ <enum name="GL_FULL_SUPPORT"/> >+ <enum name="GL_CAVEAT_SUPPORT"/> >+ <enum name="GL_IMAGE_CLASS_4_X_32"/> >+ <enum name="GL_IMAGE_CLASS_2_X_32"/> >+ <enum name="GL_IMAGE_CLASS_1_X_32"/> >+ <enum name="GL_IMAGE_CLASS_4_X_16"/> >+ <enum name="GL_IMAGE_CLASS_2_X_16"/> >+ <enum name="GL_IMAGE_CLASS_1_X_16"/> >+ <enum name="GL_IMAGE_CLASS_4_X_8"/> >+ <enum name="GL_IMAGE_CLASS_2_X_8"/> >+ <enum name="GL_IMAGE_CLASS_1_X_8"/> >+ <enum name="GL_IMAGE_CLASS_11_11_10"/> >+ <enum name="GL_IMAGE_CLASS_10_10_10_2"/> >+ <enum name="GL_VIEW_CLASS_128_BITS"/> >+ <enum name="GL_VIEW_CLASS_96_BITS"/> >+ <enum name="GL_VIEW_CLASS_64_BITS"/> >+ <enum name="GL_VIEW_CLASS_48_BITS"/> >+ <enum name="GL_VIEW_CLASS_32_BITS"/> >+ <enum name="GL_VIEW_CLASS_24_BITS"/> >+ <enum name="GL_VIEW_CLASS_16_BITS"/> >+ <enum name="GL_VIEW_CLASS_8_BITS"/> >+ <enum name="GL_VIEW_CLASS_S3TC_DXT1_RGB"/> >+ <enum name="GL_VIEW_CLASS_S3TC_DXT1_RGBA"/> >+ <enum name="GL_VIEW_CLASS_S3TC_DXT3_RGBA"/> >+ <enum name="GL_VIEW_CLASS_S3TC_DXT5_RGBA"/> >+ <enum name="GL_VIEW_CLASS_RGTC1_RED"/> >+ <enum name="GL_VIEW_CLASS_RGTC2_RG"/> >+ <enum name="GL_VIEW_CLASS_BPTC_UNORM"/> >+ <enum name="GL_VIEW_CLASS_BPTC_FLOAT"/> >+ <command name="glGetInternalformati64v"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_invalidate_subdata" supported="gl|glcore"> >+ <require> >+ <command name="glInvalidateTexSubImage"/> >+ <command name="glInvalidateTexImage"/> >+ <command name="glInvalidateBufferSubData"/> >+ <command name="glInvalidateBufferData"/> >+ <command name="glInvalidateFramebuffer"/> >+ <command name="glInvalidateSubFramebuffer"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_map_buffer_alignment" supported="gl|glcore"> >+ <require> >+ <enum name="GL_MIN_MAP_BUFFER_ALIGNMENT"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_map_buffer_range" supported="gl|glcore"> >+ <require> >+ <enum name="GL_MAP_READ_BIT"/> >+ <enum name="GL_MAP_WRITE_BIT"/> >+ <enum name="GL_MAP_INVALIDATE_RANGE_BIT"/> >+ <enum name="GL_MAP_INVALIDATE_BUFFER_BIT"/> >+ <enum name="GL_MAP_FLUSH_EXPLICIT_BIT"/> >+ <enum name="GL_MAP_UNSYNCHRONIZED_BIT"/> >+ <command name="glMapBufferRange"/> >+ <command name="glFlushMappedBufferRange"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_matrix_palette" supported="gl"> >+ <require> >+ <enum name="GL_MATRIX_PALETTE_ARB"/> >+ <enum name="GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB"/> >+ <enum name="GL_MAX_PALETTE_MATRICES_ARB"/> >+ <enum name="GL_CURRENT_PALETTE_MATRIX_ARB"/> >+ <enum name="GL_MATRIX_INDEX_ARRAY_ARB"/> >+ <enum name="GL_CURRENT_MATRIX_INDEX_ARB"/> >+ <enum name="GL_MATRIX_INDEX_ARRAY_SIZE_ARB"/> >+ <enum name="GL_MATRIX_INDEX_ARRAY_TYPE_ARB"/> >+ <enum name="GL_MATRIX_INDEX_ARRAY_STRIDE_ARB"/> >+ <enum name="GL_MATRIX_INDEX_ARRAY_POINTER_ARB"/> >+ <command name="glCurrentPaletteMatrixARB"/> >+ <command name="glMatrixIndexubvARB"/> >+ <command name="glMatrixIndexusvARB"/> >+ <command name="glMatrixIndexuivARB"/> >+ <command name="glMatrixIndexPointerARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_multi_bind" supported="gl|glcore"> >+ <require> >+ <command name="glBindBuffersBase"/> >+ <command name="glBindBuffersRange"/> >+ <command name="glBindTextures"/> >+ <command name="glBindSamplers"/> >+ <command name="glBindImageTextures"/> >+ <command name="glBindVertexBuffers"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_multi_draw_indirect" supported="gl|glcore"> >+ <require> >+ <command name="glMultiDrawArraysIndirect"/> >+ <command name="glMultiDrawElementsIndirect"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_multisample" supported="gl"> >+ <require> >+ <enum name="GL_MULTISAMPLE_ARB"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_COVERAGE_ARB"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_ONE_ARB"/> >+ <enum name="GL_SAMPLE_COVERAGE_ARB"/> >+ <enum name="GL_SAMPLE_BUFFERS_ARB"/> >+ <enum name="GL_SAMPLES_ARB"/> >+ <enum name="GL_SAMPLE_COVERAGE_VALUE_ARB"/> >+ <enum name="GL_SAMPLE_COVERAGE_INVERT_ARB"/> >+ <enum name="GL_MULTISAMPLE_BIT_ARB"/> >+ <command name="glSampleCoverageARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_multitexture" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE0_ARB"/> >+ <enum name="GL_TEXTURE1_ARB"/> >+ <enum name="GL_TEXTURE2_ARB"/> >+ <enum name="GL_TEXTURE3_ARB"/> >+ <enum name="GL_TEXTURE4_ARB"/> >+ <enum name="GL_TEXTURE5_ARB"/> >+ <enum name="GL_TEXTURE6_ARB"/> >+ <enum name="GL_TEXTURE7_ARB"/> >+ <enum name="GL_TEXTURE8_ARB"/> >+ <enum name="GL_TEXTURE9_ARB"/> >+ <enum name="GL_TEXTURE10_ARB"/> >+ <enum name="GL_TEXTURE11_ARB"/> >+ <enum name="GL_TEXTURE12_ARB"/> >+ <enum name="GL_TEXTURE13_ARB"/> >+ <enum name="GL_TEXTURE14_ARB"/> >+ <enum name="GL_TEXTURE15_ARB"/> >+ <enum name="GL_TEXTURE16_ARB"/> >+ <enum name="GL_TEXTURE17_ARB"/> >+ <enum name="GL_TEXTURE18_ARB"/> >+ <enum name="GL_TEXTURE19_ARB"/> >+ <enum name="GL_TEXTURE20_ARB"/> >+ <enum name="GL_TEXTURE21_ARB"/> >+ <enum name="GL_TEXTURE22_ARB"/> >+ <enum name="GL_TEXTURE23_ARB"/> >+ <enum name="GL_TEXTURE24_ARB"/> >+ <enum name="GL_TEXTURE25_ARB"/> >+ <enum name="GL_TEXTURE26_ARB"/> >+ <enum name="GL_TEXTURE27_ARB"/> >+ <enum name="GL_TEXTURE28_ARB"/> >+ <enum name="GL_TEXTURE29_ARB"/> >+ <enum name="GL_TEXTURE30_ARB"/> >+ <enum name="GL_TEXTURE31_ARB"/> >+ <enum name="GL_ACTIVE_TEXTURE_ARB"/> >+ <enum name="GL_CLIENT_ACTIVE_TEXTURE_ARB"/> >+ <enum name="GL_MAX_TEXTURE_UNITS_ARB"/> >+ <command name="glActiveTextureARB"/> >+ <command name="glClientActiveTextureARB"/> >+ <command name="glMultiTexCoord1dARB"/> >+ <command name="glMultiTexCoord1dvARB"/> >+ <command name="glMultiTexCoord1fARB"/> >+ <command name="glMultiTexCoord1fvARB"/> >+ <command name="glMultiTexCoord1iARB"/> >+ <command name="glMultiTexCoord1ivARB"/> >+ <command name="glMultiTexCoord1sARB"/> >+ <command name="glMultiTexCoord1svARB"/> >+ <command name="glMultiTexCoord2dARB"/> >+ <command name="glMultiTexCoord2dvARB"/> >+ <command name="glMultiTexCoord2fARB"/> >+ <command name="glMultiTexCoord2fvARB"/> >+ <command name="glMultiTexCoord2iARB"/> >+ <command name="glMultiTexCoord2ivARB"/> >+ <command name="glMultiTexCoord2sARB"/> >+ <command name="glMultiTexCoord2svARB"/> >+ <command name="glMultiTexCoord3dARB"/> >+ <command name="glMultiTexCoord3dvARB"/> >+ <command name="glMultiTexCoord3fARB"/> >+ <command name="glMultiTexCoord3fvARB"/> >+ <command name="glMultiTexCoord3iARB"/> >+ <command name="glMultiTexCoord3ivARB"/> >+ <command name="glMultiTexCoord3sARB"/> >+ <command name="glMultiTexCoord3svARB"/> >+ <command name="glMultiTexCoord4dARB"/> >+ <command name="glMultiTexCoord4dvARB"/> >+ <command name="glMultiTexCoord4fARB"/> >+ <command name="glMultiTexCoord4fvARB"/> >+ <command name="glMultiTexCoord4iARB"/> >+ <command name="glMultiTexCoord4ivARB"/> >+ <command name="glMultiTexCoord4sARB"/> >+ <command name="glMultiTexCoord4svARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_occlusion_query" supported="gl"> >+ <require> >+ <enum name="GL_QUERY_COUNTER_BITS_ARB"/> >+ <enum name="GL_CURRENT_QUERY_ARB"/> >+ <enum name="GL_QUERY_RESULT_ARB"/> >+ <enum name="GL_QUERY_RESULT_AVAILABLE_ARB"/> >+ <enum name="GL_SAMPLES_PASSED_ARB"/> >+ <command name="glGenQueriesARB"/> >+ <command name="glDeleteQueriesARB"/> >+ <command name="glIsQueryARB"/> >+ <command name="glBeginQueryARB"/> >+ <command name="glEndQueryARB"/> >+ <command name="glGetQueryivARB"/> >+ <command name="glGetQueryObjectivARB"/> >+ <command name="glGetQueryObjectuivARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_occlusion_query2" supported="gl|glcore"> >+ <require> >+ <enum name="GL_ANY_SAMPLES_PASSED"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_parallel_shader_compile" supported="gl|glcore"> >+ <require> >+ <enum name="GL_MAX_SHADER_COMPILER_THREADS_ARB"/> >+ <enum name="GL_COMPLETION_STATUS_ARB"/> >+ <command name="glMaxShaderCompilerThreadsARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_pipeline_statistics_query" supported="gl|glcore"> >+ <require> >+ <enum name="GL_VERTICES_SUBMITTED_ARB"/> >+ <enum name="GL_PRIMITIVES_SUBMITTED_ARB"/> >+ <enum name="GL_VERTEX_SHADER_INVOCATIONS_ARB"/> >+ <enum name="GL_TESS_CONTROL_SHADER_PATCHES_ARB"/> >+ <enum name="GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB"/> >+ <enum name="GL_GEOMETRY_SHADER_INVOCATIONS"/> >+ <enum name="GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB"/> >+ <enum name="GL_FRAGMENT_SHADER_INVOCATIONS_ARB"/> >+ <enum name="GL_COMPUTE_SHADER_INVOCATIONS_ARB"/> >+ <enum name="GL_CLIPPING_INPUT_PRIMITIVES_ARB"/> >+ <enum name="GL_CLIPPING_OUTPUT_PRIMITIVES_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_pixel_buffer_object" supported="gl|glcore"> >+ <require> >+ <enum name="GL_PIXEL_PACK_BUFFER_ARB"/> >+ <enum name="GL_PIXEL_UNPACK_BUFFER_ARB"/> >+ <enum name="GL_PIXEL_PACK_BUFFER_BINDING_ARB"/> >+ <enum name="GL_PIXEL_UNPACK_BUFFER_BINDING_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_point_parameters" supported="gl"> >+ <require> >+ <enum name="GL_POINT_SIZE_MIN_ARB"/> >+ <enum name="GL_POINT_SIZE_MAX_ARB"/> >+ <enum name="GL_POINT_FADE_THRESHOLD_SIZE_ARB"/> >+ <enum name="GL_POINT_DISTANCE_ATTENUATION_ARB"/> >+ <command name="glPointParameterfARB"/> >+ <command name="glPointParameterfvARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_point_sprite" supported="gl"> >+ <require> >+ <enum name="GL_POINT_SPRITE_ARB"/> >+ <enum name="GL_COORD_REPLACE_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_polygon_offset_clamp" supported="gl|glcore"> >+ <require> >+ <enum name="GL_POLYGON_OFFSET_CLAMP"/> >+ <command name="glPolygonOffsetClamp"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_post_depth_coverage" supported="gl|glcore"/> >+ <extension name="GL_ARB_program_interface_query" supported="gl|glcore"> >+ <require> >+ <enum name="GL_UNIFORM"/> >+ <enum name="GL_UNIFORM_BLOCK"/> >+ <enum name="GL_PROGRAM_INPUT"/> >+ <enum name="GL_PROGRAM_OUTPUT"/> >+ <enum name="GL_BUFFER_VARIABLE"/> >+ <enum name="GL_SHADER_STORAGE_BLOCK"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER"/> >+ <enum name="GL_VERTEX_SUBROUTINE"/> >+ <enum name="GL_TESS_CONTROL_SUBROUTINE"/> >+ <enum name="GL_TESS_EVALUATION_SUBROUTINE"/> >+ <enum name="GL_GEOMETRY_SUBROUTINE"/> >+ <enum name="GL_FRAGMENT_SUBROUTINE"/> >+ <enum name="GL_COMPUTE_SUBROUTINE"/> >+ <enum name="GL_VERTEX_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_TESS_CONTROL_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_TESS_EVALUATION_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_GEOMETRY_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_FRAGMENT_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_COMPUTE_SUBROUTINE_UNIFORM"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_VARYING"/> >+ <enum name="GL_ACTIVE_RESOURCES"/> >+ <enum name="GL_MAX_NAME_LENGTH"/> >+ <enum name="GL_MAX_NUM_ACTIVE_VARIABLES"/> >+ <enum name="GL_MAX_NUM_COMPATIBLE_SUBROUTINES"/> >+ <enum name="GL_NAME_LENGTH"/> >+ <enum name="GL_TYPE"/> >+ <enum name="GL_ARRAY_SIZE"/> >+ <enum name="GL_OFFSET"/> >+ <enum name="GL_BLOCK_INDEX"/> >+ <enum name="GL_ARRAY_STRIDE"/> >+ <enum name="GL_MATRIX_STRIDE"/> >+ <enum name="GL_IS_ROW_MAJOR"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_INDEX"/> >+ <enum name="GL_BUFFER_BINDING"/> >+ <enum name="GL_BUFFER_DATA_SIZE"/> >+ <enum name="GL_NUM_ACTIVE_VARIABLES"/> >+ <enum name="GL_ACTIVE_VARIABLES"/> >+ <enum name="GL_REFERENCED_BY_VERTEX_SHADER"/> >+ <enum name="GL_REFERENCED_BY_TESS_CONTROL_SHADER"/> >+ <enum name="GL_REFERENCED_BY_TESS_EVALUATION_SHADER"/> >+ <enum name="GL_REFERENCED_BY_GEOMETRY_SHADER"/> >+ <enum name="GL_REFERENCED_BY_FRAGMENT_SHADER"/> >+ <enum name="GL_REFERENCED_BY_COMPUTE_SHADER"/> >+ <enum name="GL_TOP_LEVEL_ARRAY_SIZE"/> >+ <enum name="GL_TOP_LEVEL_ARRAY_STRIDE"/> >+ <enum name="GL_LOCATION"/> >+ <enum name="GL_LOCATION_INDEX"/> >+ <enum name="GL_IS_PER_PATCH"/> >+ <enum name="GL_NUM_COMPATIBLE_SUBROUTINES"/> >+ <enum name="GL_COMPATIBLE_SUBROUTINES"/> >+ <command name="glGetProgramInterfaceiv"/> >+ <command name="glGetProgramResourceIndex"/> >+ <command name="glGetProgramResourceName"/> >+ <command name="glGetProgramResourceiv"/> >+ <command name="glGetProgramResourceLocation"/> >+ <command name="glGetProgramResourceLocationIndex"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_provoking_vertex" supported="gl|glcore"> >+ <require> >+ <enum name="GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION"/> >+ <enum name="GL_FIRST_VERTEX_CONVENTION"/> >+ <enum name="GL_LAST_VERTEX_CONVENTION"/> >+ <enum name="GL_PROVOKING_VERTEX"/> >+ <command name="glProvokingVertex"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_query_buffer_object" supported="gl|glcore"> >+ <require> >+ <enum name="GL_QUERY_BUFFER"/> >+ <enum name="GL_QUERY_BUFFER_BARRIER_BIT"/> >+ <enum name="GL_QUERY_BUFFER_BINDING"/> >+ <enum name="GL_QUERY_RESULT_NO_WAIT"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_robust_buffer_access_behavior" supported="gl|glcore"/> >+ <extension name="GL_ARB_robustness" supported="gl|glcore"> >+ <require> >+ <enum name="GL_NO_ERROR"/> >+ <enum name="GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB"/> >+ <enum name="GL_LOSE_CONTEXT_ON_RESET_ARB"/> >+ <enum name="GL_GUILTY_CONTEXT_RESET_ARB"/> >+ <enum name="GL_INNOCENT_CONTEXT_RESET_ARB"/> >+ <enum name="GL_UNKNOWN_CONTEXT_RESET_ARB"/> >+ <enum name="GL_RESET_NOTIFICATION_STRATEGY_ARB"/> >+ <enum name="GL_NO_RESET_NOTIFICATION_ARB"/> >+ <command name="glGetGraphicsResetStatusARB"/> >+ <command name="glGetnTexImageARB"/> >+ <command name="glReadnPixelsARB"/> >+ <command name="glGetnCompressedTexImageARB"/> >+ <command name="glGetnUniformfvARB"/> >+ <command name="glGetnUniformivARB"/> >+ <command name="glGetnUniformuivARB"/> >+ <command name="glGetnUniformdvARB"/> >+ </require> >+ <require api="gl" profile="compatibility"> >+ <command name="glGetnMapdvARB"/> >+ <command name="glGetnMapfvARB"/> >+ <command name="glGetnMapivARB"/> >+ <command name="glGetnPixelMapfvARB"/> >+ <command name="glGetnPixelMapuivARB"/> >+ <command name="glGetnPixelMapusvARB"/> >+ <command name="glGetnPolygonStippleARB"/> >+ <command name="glGetnColorTableARB"/> >+ <command name="glGetnConvolutionFilterARB"/> >+ <command name="glGetnSeparableFilterARB"/> >+ <command name="glGetnHistogramARB"/> >+ <command name="glGetnMinmaxARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_robustness_isolation" supported="gl|glcore"/> >+ <extension name="GL_ARB_sample_locations" supported="gl|glcore"> >+ <require> >+ <enum name="GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB"/> >+ <enum name="GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB"/> >+ <enum name="GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB"/> >+ <enum name="GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB"/> >+ <enum name="GL_SAMPLE_LOCATION_ARB"/> >+ <enum name="GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB"/> >+ <enum name="GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB"/> >+ <enum name="GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB"/> >+ <command name="glFramebufferSampleLocationsfvARB"/> >+ <command name="glNamedFramebufferSampleLocationsfvARB"/> >+ <command name="glEvaluateDepthValuesARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_sample_shading" supported="gl|glcore"> >+ <require> >+ <enum name="GL_SAMPLE_SHADING_ARB"/> >+ <enum name="GL_MIN_SAMPLE_SHADING_VALUE_ARB"/> >+ <command name="glMinSampleShadingARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_sampler_objects" supported="gl|glcore"> >+ <require> >+ <enum name="GL_SAMPLER_BINDING"/> >+ <command name="glGenSamplers"/> >+ <command name="glDeleteSamplers"/> >+ <command name="glIsSampler"/> >+ <command name="glBindSampler"/> >+ <command name="glSamplerParameteri"/> >+ <command name="glSamplerParameteriv"/> >+ <command name="glSamplerParameterf"/> >+ <command name="glSamplerParameterfv"/> >+ <command name="glSamplerParameterIiv"/> >+ <command name="glSamplerParameterIuiv"/> >+ <command name="glGetSamplerParameteriv"/> >+ <command name="glGetSamplerParameterIiv"/> >+ <command name="glGetSamplerParameterfv"/> >+ <command name="glGetSamplerParameterIuiv"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_seamless_cube_map" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TEXTURE_CUBE_MAP_SEAMLESS"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_seamless_cubemap_per_texture" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TEXTURE_CUBE_MAP_SEAMLESS"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_separate_shader_objects" supported="gl|glcore"> >+ <require> >+ <enum name="GL_VERTEX_SHADER_BIT"/> >+ <enum name="GL_FRAGMENT_SHADER_BIT"/> >+ <enum name="GL_GEOMETRY_SHADER_BIT"/> >+ <enum name="GL_TESS_CONTROL_SHADER_BIT"/> >+ <enum name="GL_TESS_EVALUATION_SHADER_BIT"/> >+ <enum name="GL_ALL_SHADER_BITS"/> >+ <enum name="GL_PROGRAM_SEPARABLE"/> >+ <enum name="GL_ACTIVE_PROGRAM"/> >+ <enum name="GL_PROGRAM_PIPELINE_BINDING"/> >+ <command name="glUseProgramStages"/> >+ <command name="glActiveShaderProgram"/> >+ <command name="glCreateShaderProgramv"/> >+ <command name="glBindProgramPipeline"/> >+ <command name="glDeleteProgramPipelines"/> >+ <command name="glGenProgramPipelines"/> >+ <command name="glIsProgramPipeline"/> >+ <command name="glGetProgramPipelineiv"/> >+ <command name="glProgramParameteri"/> >+ <command name="glProgramUniform1i"/> >+ <command name="glProgramUniform1iv"/> >+ <command name="glProgramUniform1f"/> >+ <command name="glProgramUniform1fv"/> >+ <command name="glProgramUniform1d"/> >+ <command name="glProgramUniform1dv"/> >+ <command name="glProgramUniform1ui"/> >+ <command name="glProgramUniform1uiv"/> >+ <command name="glProgramUniform2i"/> >+ <command name="glProgramUniform2iv"/> >+ <command name="glProgramUniform2f"/> >+ <command name="glProgramUniform2fv"/> >+ <command name="glProgramUniform2d"/> >+ <command name="glProgramUniform2dv"/> >+ <command name="glProgramUniform2ui"/> >+ <command name="glProgramUniform2uiv"/> >+ <command name="glProgramUniform3i"/> >+ <command name="glProgramUniform3iv"/> >+ <command name="glProgramUniform3f"/> >+ <command name="glProgramUniform3fv"/> >+ <command name="glProgramUniform3d"/> >+ <command name="glProgramUniform3dv"/> >+ <command name="glProgramUniform3ui"/> >+ <command name="glProgramUniform3uiv"/> >+ <command name="glProgramUniform4i"/> >+ <command name="glProgramUniform4iv"/> >+ <command name="glProgramUniform4f"/> >+ <command name="glProgramUniform4fv"/> >+ <command name="glProgramUniform4d"/> >+ <command name="glProgramUniform4dv"/> >+ <command name="glProgramUniform4ui"/> >+ <command name="glProgramUniform4uiv"/> >+ <command name="glProgramUniformMatrix2fv"/> >+ <command name="glProgramUniformMatrix3fv"/> >+ <command name="glProgramUniformMatrix4fv"/> >+ <command name="glProgramUniformMatrix2dv"/> >+ <command name="glProgramUniformMatrix3dv"/> >+ <command name="glProgramUniformMatrix4dv"/> >+ <command name="glProgramUniformMatrix2x3fv"/> >+ <command name="glProgramUniformMatrix3x2fv"/> >+ <command name="glProgramUniformMatrix2x4fv"/> >+ <command name="glProgramUniformMatrix4x2fv"/> >+ <command name="glProgramUniformMatrix3x4fv"/> >+ <command name="glProgramUniformMatrix4x3fv"/> >+ <command name="glProgramUniformMatrix2x3dv"/> >+ <command name="glProgramUniformMatrix3x2dv"/> >+ <command name="glProgramUniformMatrix2x4dv"/> >+ <command name="glProgramUniformMatrix4x2dv"/> >+ <command name="glProgramUniformMatrix3x4dv"/> >+ <command name="glProgramUniformMatrix4x3dv"/> >+ <command name="glValidateProgramPipeline"/> >+ <command name="glGetProgramPipelineInfoLog"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_shader_atomic_counter_ops" supported="gl|glcore"/> >+ <extension name="GL_ARB_shader_atomic_counters" supported="gl|glcore"> >+ <require> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_BINDING"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_START"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_SIZE"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER"/> >+ <enum name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER"/> >+ <enum name="GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_MAX_VERTEX_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_GEOMETRY_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_FRAGMENT_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_COMBINED_ATOMIC_COUNTERS"/> >+ <enum name="GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE"/> >+ <enum name="GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS"/> >+ <enum name="GL_ACTIVE_ATOMIC_COUNTER_BUFFERS"/> >+ <enum name="GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX"/> >+ <enum name="GL_UNSIGNED_INT_ATOMIC_COUNTER"/> >+ <command name="glGetActiveAtomicCounterBufferiv"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_shader_ballot" supported="gl|glcore"/> >+ <extension name="GL_ARB_shader_bit_encoding" supported="gl|glcore"/> >+ <extension name="GL_ARB_shader_clock" supported="gl|glcore"/> >+ <extension name="GL_ARB_shader_draw_parameters" supported="gl|glcore"/> >+ <extension name="GL_ARB_shader_group_vote" supported="gl|glcore"/> >+ <extension name="GL_ARB_shader_image_load_store" supported="gl|glcore"> >+ <require> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT"/> >+ <enum name="GL_ELEMENT_ARRAY_BARRIER_BIT"/> >+ <enum name="GL_UNIFORM_BARRIER_BIT"/> >+ <enum name="GL_TEXTURE_FETCH_BARRIER_BIT"/> >+ <enum name="GL_SHADER_IMAGE_ACCESS_BARRIER_BIT"/> >+ <enum name="GL_COMMAND_BARRIER_BIT"/> >+ <enum name="GL_PIXEL_BUFFER_BARRIER_BIT"/> >+ <enum name="GL_TEXTURE_UPDATE_BARRIER_BIT"/> >+ <enum name="GL_BUFFER_UPDATE_BARRIER_BIT"/> >+ <enum name="GL_FRAMEBUFFER_BARRIER_BIT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BARRIER_BIT"/> >+ <enum name="GL_ATOMIC_COUNTER_BARRIER_BIT"/> >+ <enum name="GL_ALL_BARRIER_BITS"/> >+ <enum name="GL_MAX_IMAGE_UNITS"/> >+ <enum name="GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS"/> >+ <enum name="GL_IMAGE_BINDING_NAME"/> >+ <enum name="GL_IMAGE_BINDING_LEVEL"/> >+ <enum name="GL_IMAGE_BINDING_LAYERED"/> >+ <enum name="GL_IMAGE_BINDING_LAYER"/> >+ <enum name="GL_IMAGE_BINDING_ACCESS"/> >+ <enum name="GL_IMAGE_1D"/> >+ <enum name="GL_IMAGE_2D"/> >+ <enum name="GL_IMAGE_3D"/> >+ <enum name="GL_IMAGE_2D_RECT"/> >+ <enum name="GL_IMAGE_CUBE"/> >+ <enum name="GL_IMAGE_BUFFER"/> >+ <enum name="GL_IMAGE_1D_ARRAY"/> >+ <enum name="GL_IMAGE_2D_ARRAY"/> >+ <enum name="GL_IMAGE_CUBE_MAP_ARRAY"/> >+ <enum name="GL_IMAGE_2D_MULTISAMPLE"/> >+ <enum name="GL_IMAGE_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_INT_IMAGE_1D"/> >+ <enum name="GL_INT_IMAGE_2D"/> >+ <enum name="GL_INT_IMAGE_3D"/> >+ <enum name="GL_INT_IMAGE_2D_RECT"/> >+ <enum name="GL_INT_IMAGE_CUBE"/> >+ <enum name="GL_INT_IMAGE_BUFFER"/> >+ <enum name="GL_INT_IMAGE_1D_ARRAY"/> >+ <enum name="GL_INT_IMAGE_2D_ARRAY"/> >+ <enum name="GL_INT_IMAGE_CUBE_MAP_ARRAY"/> >+ <enum name="GL_INT_IMAGE_2D_MULTISAMPLE"/> >+ <enum name="GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_1D"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_3D"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D_RECT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_CUBE"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_BUFFER"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_1D_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_MAX_IMAGE_SAMPLES"/> >+ <enum name="GL_IMAGE_BINDING_FORMAT"/> >+ <enum name="GL_IMAGE_FORMAT_COMPATIBILITY_TYPE"/> >+ <enum name="GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE"/> >+ <enum name="GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS"/> >+ <enum name="GL_MAX_VERTEX_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_GEOMETRY_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_FRAGMENT_IMAGE_UNIFORMS"/> >+ <enum name="GL_MAX_COMBINED_IMAGE_UNIFORMS"/> >+ <command name="glBindImageTexture"/> >+ <command name="glMemoryBarrier"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_shader_image_size" supported="gl|glcore"/> >+ <extension name="GL_ARB_shader_objects" supported="gl"> >+ <require> >+ <enum name="GL_PROGRAM_OBJECT_ARB"/> >+ <enum name="GL_SHADER_OBJECT_ARB"/> >+ <enum name="GL_OBJECT_TYPE_ARB"/> >+ <enum name="GL_OBJECT_SUBTYPE_ARB"/> >+ <enum name="GL_FLOAT_VEC2_ARB"/> >+ <enum name="GL_FLOAT_VEC3_ARB"/> >+ <enum name="GL_FLOAT_VEC4_ARB"/> >+ <enum name="GL_INT_VEC2_ARB"/> >+ <enum name="GL_INT_VEC3_ARB"/> >+ <enum name="GL_INT_VEC4_ARB"/> >+ <enum name="GL_BOOL_ARB"/> >+ <enum name="GL_BOOL_VEC2_ARB"/> >+ <enum name="GL_BOOL_VEC3_ARB"/> >+ <enum name="GL_BOOL_VEC4_ARB"/> >+ <enum name="GL_FLOAT_MAT2_ARB"/> >+ <enum name="GL_FLOAT_MAT3_ARB"/> >+ <enum name="GL_FLOAT_MAT4_ARB"/> >+ <enum name="GL_SAMPLER_1D_ARB"/> >+ <enum name="GL_SAMPLER_2D_ARB"/> >+ <enum name="GL_SAMPLER_3D_ARB"/> >+ <enum name="GL_SAMPLER_CUBE_ARB"/> >+ <enum name="GL_SAMPLER_1D_SHADOW_ARB"/> >+ <enum name="GL_SAMPLER_2D_SHADOW_ARB"/> >+ <enum name="GL_SAMPLER_2D_RECT_ARB"/> >+ <enum name="GL_SAMPLER_2D_RECT_SHADOW_ARB"/> >+ <enum name="GL_OBJECT_DELETE_STATUS_ARB"/> >+ <enum name="GL_OBJECT_COMPILE_STATUS_ARB"/> >+ <enum name="GL_OBJECT_LINK_STATUS_ARB"/> >+ <enum name="GL_OBJECT_VALIDATE_STATUS_ARB"/> >+ <enum name="GL_OBJECT_INFO_LOG_LENGTH_ARB"/> >+ <enum name="GL_OBJECT_ATTACHED_OBJECTS_ARB"/> >+ <enum name="GL_OBJECT_ACTIVE_UNIFORMS_ARB"/> >+ <enum name="GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB"/> >+ <enum name="GL_OBJECT_SHADER_SOURCE_LENGTH_ARB"/> >+ <command name="glDeleteObjectARB"/> >+ <command name="glGetHandleARB"/> >+ <command name="glDetachObjectARB"/> >+ <command name="glCreateShaderObjectARB"/> >+ <command name="glShaderSourceARB"/> >+ <command name="glCompileShaderARB"/> >+ <command name="glCreateProgramObjectARB"/> >+ <command name="glAttachObjectARB"/> >+ <command name="glLinkProgramARB"/> >+ <command name="glUseProgramObjectARB"/> >+ <command name="glValidateProgramARB"/> >+ <command name="glUniform1fARB"/> >+ <command name="glUniform2fARB"/> >+ <command name="glUniform3fARB"/> >+ <command name="glUniform4fARB"/> >+ <command name="glUniform1iARB"/> >+ <command name="glUniform2iARB"/> >+ <command name="glUniform3iARB"/> >+ <command name="glUniform4iARB"/> >+ <command name="glUniform1fvARB"/> >+ <command name="glUniform2fvARB"/> >+ <command name="glUniform3fvARB"/> >+ <command name="glUniform4fvARB"/> >+ <command name="glUniform1ivARB"/> >+ <command name="glUniform2ivARB"/> >+ <command name="glUniform3ivARB"/> >+ <command name="glUniform4ivARB"/> >+ <command name="glUniformMatrix2fvARB"/> >+ <command name="glUniformMatrix3fvARB"/> >+ <command name="glUniformMatrix4fvARB"/> >+ <command name="glGetObjectParameterfvARB"/> >+ <command name="glGetObjectParameterivARB"/> >+ <command name="glGetInfoLogARB"/> >+ <command name="glGetAttachedObjectsARB"/> >+ <command name="glGetUniformLocationARB"/> >+ <command name="glGetActiveUniformARB"/> >+ <command name="glGetUniformfvARB"/> >+ <command name="glGetUniformivARB"/> >+ <command name="glGetShaderSourceARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_shader_precision" supported="gl|glcore"/> >+ <extension name="GL_ARB_shader_stencil_export" supported="gl|glcore"/> >+ <extension name="GL_ARB_shader_storage_buffer_object" supported="gl|glcore"> >+ <require> >+ <enum name="GL_SHADER_STORAGE_BUFFER"/> >+ <enum name="GL_SHADER_STORAGE_BUFFER_BINDING"/> >+ <enum name="GL_SHADER_STORAGE_BUFFER_START"/> >+ <enum name="GL_SHADER_STORAGE_BUFFER_SIZE"/> >+ <enum name="GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS"/> >+ <enum name="GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS"/> >+ <enum name="GL_MAX_SHADER_STORAGE_BLOCK_SIZE"/> >+ <enum name="GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT"/> >+ <enum name="GL_SHADER_STORAGE_BARRIER_BIT"/> >+ <enum name="GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES"/> >+ <enum name="GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS"/> >+ <command name="glShaderStorageBlockBinding"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_shader_subroutine" supported="gl|glcore"> >+ <require> >+ <enum name="GL_ACTIVE_SUBROUTINES"/> >+ <enum name="GL_ACTIVE_SUBROUTINE_UNIFORMS"/> >+ <enum name="GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS"/> >+ <enum name="GL_ACTIVE_SUBROUTINE_MAX_LENGTH"/> >+ <enum name="GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH"/> >+ <enum name="GL_MAX_SUBROUTINES"/> >+ <enum name="GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS"/> >+ <enum name="GL_NUM_COMPATIBLE_SUBROUTINES"/> >+ <enum name="GL_COMPATIBLE_SUBROUTINES"/> >+ <enum name="GL_UNIFORM_SIZE"/> >+ <enum name="GL_UNIFORM_NAME_LENGTH"/> >+ <command name="glGetSubroutineUniformLocation"/> >+ <command name="glGetSubroutineIndex"/> >+ <command name="glGetActiveSubroutineUniformiv"/> >+ <command name="glGetActiveSubroutineUniformName"/> >+ <command name="glGetActiveSubroutineName"/> >+ <command name="glUniformSubroutinesuiv"/> >+ <command name="glGetUniformSubroutineuiv"/> >+ <command name="glGetProgramStageiv"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_shader_texture_image_samples" supported="gl|glcore"/> >+ <extension name="GL_ARB_shader_texture_lod" supported="gl"/> >+ <extension name="GL_ARB_shader_viewport_layer_array" supported="gl|glcore"/> >+ <extension name="GL_ARB_shading_language_100" supported="gl"> >+ <require> >+ <enum name="GL_SHADING_LANGUAGE_VERSION_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_shading_language_420pack" supported="gl|glcore"/> >+ <extension name="GL_ARB_shading_language_include" supported="gl|glcore"> >+ <require> >+ <enum name="GL_SHADER_INCLUDE_ARB"/> >+ <enum name="GL_NAMED_STRING_LENGTH_ARB"/> >+ <enum name="GL_NAMED_STRING_TYPE_ARB"/> >+ <command name="glNamedStringARB"/> >+ <command name="glDeleteNamedStringARB"/> >+ <command name="glCompileShaderIncludeARB"/> >+ <command name="glIsNamedStringARB"/> >+ <command name="glGetNamedStringARB"/> >+ <command name="glGetNamedStringivARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_shading_language_packing" supported="gl|glcore"/> >+ <extension name="GL_ARB_shadow" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_COMPARE_MODE_ARB"/> >+ <enum name="GL_TEXTURE_COMPARE_FUNC_ARB"/> >+ <enum name="GL_COMPARE_R_TO_TEXTURE_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_shadow_ambient" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_COMPARE_FAIL_VALUE_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_sparse_buffer" supported="gl|glcore"> >+ <require> >+ <enum name="GL_SPARSE_STORAGE_BIT_ARB"/> >+ <enum name="GL_SPARSE_BUFFER_PAGE_SIZE_ARB"/> >+ <command name="glBufferPageCommitmentARB"/> >+ </require> >+ <require comment="Supported only if GL_EXT_direct_state_access is supported"> >+ <command name="glNamedBufferPageCommitmentEXT"/> >+ </require> >+ <require comment="Supported only if GL_ARb_direct_state_access or GL 4.5 is supported"> >+ <command name="glNamedBufferPageCommitmentARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_sparse_texture" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TEXTURE_SPARSE_ARB"/> >+ <enum name="GL_VIRTUAL_PAGE_SIZE_INDEX_ARB"/> >+ <enum name="GL_NUM_SPARSE_LEVELS_ARB"/> >+ <enum name="GL_NUM_VIRTUAL_PAGE_SIZES_ARB"/> >+ <enum name="GL_VIRTUAL_PAGE_SIZE_X_ARB"/> >+ <enum name="GL_VIRTUAL_PAGE_SIZE_Y_ARB"/> >+ <enum name="GL_VIRTUAL_PAGE_SIZE_Z_ARB"/> >+ <enum name="GL_MAX_SPARSE_TEXTURE_SIZE_ARB"/> >+ <enum name="GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB"/> >+ <enum name="GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB"/> >+ <enum name="GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB"/> >+ <command name="glTexPageCommitmentARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_sparse_texture2" supported="gl|glcore"/> >+ <extension name="GL_ARB_sparse_texture_clamp" supported="gl|glcore"/> >+ <extension name="GL_ARB_spirv_extensions" supported="gl|glcore"> >+ <require> >+ <enum name="GL_SPIR_V_EXTENSIONS"/> >+ <enum name="GL_NUM_SPIR_V_EXTENSIONS"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_stencil_texturing" supported="gl|glcore"> >+ <require> >+ <enum name="GL_DEPTH_STENCIL_TEXTURE_MODE"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_sync" supported="gl|glcore"> >+ <require> >+ <enum name="GL_MAX_SERVER_WAIT_TIMEOUT"/> >+ <enum name="GL_OBJECT_TYPE"/> >+ <enum name="GL_SYNC_CONDITION"/> >+ <enum name="GL_SYNC_STATUS"/> >+ <enum name="GL_SYNC_FLAGS"/> >+ <enum name="GL_SYNC_FENCE"/> >+ <enum name="GL_SYNC_GPU_COMMANDS_COMPLETE"/> >+ <enum name="GL_UNSIGNALED"/> >+ <enum name="GL_SIGNALED"/> >+ <enum name="GL_ALREADY_SIGNALED"/> >+ <enum name="GL_TIMEOUT_EXPIRED"/> >+ <enum name="GL_CONDITION_SATISFIED"/> >+ <enum name="GL_WAIT_FAILED"/> >+ <enum name="GL_SYNC_FLUSH_COMMANDS_BIT"/> >+ <enum name="GL_TIMEOUT_IGNORED"/> >+ <command name="glFenceSync"/> >+ <command name="glIsSync"/> >+ <command name="glDeleteSync"/> >+ <command name="glClientWaitSync"/> >+ <command name="glWaitSync"/> >+ <command name="glGetInteger64v"/> >+ <command name="glGetSynciv"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_tessellation_shader" supported="gl|glcore"> >+ <require> >+ <enum name="GL_PATCHES"/> >+ <enum name="GL_PATCH_VERTICES"/> >+ <enum name="GL_PATCH_DEFAULT_INNER_LEVEL"/> >+ <enum name="GL_PATCH_DEFAULT_OUTER_LEVEL"/> >+ <enum name="GL_TESS_CONTROL_OUTPUT_VERTICES"/> >+ <enum name="GL_TESS_GEN_MODE"/> >+ <enum name="GL_TESS_GEN_SPACING"/> >+ <enum name="GL_TESS_GEN_VERTEX_ORDER"/> >+ <enum name="GL_TESS_GEN_POINT_MODE"/> >+ <enum name="GL_TRIANGLES"/> >+ <enum name="GL_ISOLINES"/> >+ <enum name="GL_QUADS"/> >+ <enum name="GL_EQUAL"/> >+ <enum name="GL_FRACTIONAL_ODD"/> >+ <enum name="GL_FRACTIONAL_EVEN"/> >+ <enum name="GL_CCW"/> >+ <enum name="GL_CW"/> >+ <enum name="GL_MAX_PATCH_VERTICES"/> >+ <enum name="GL_MAX_TESS_GEN_LEVEL"/> >+ <enum name="GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS"/> >+ <enum name="GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_PATCH_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_TESS_CONTROL_INPUT_COMPONENTS"/> >+ <enum name="GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS"/> >+ <enum name="GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER"/> >+ <enum name="GL_TESS_EVALUATION_SHADER"/> >+ <enum name="GL_TESS_CONTROL_SHADER"/> >+ <command name="glPatchParameteri"/> >+ <command name="glPatchParameterfv"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_barrier" supported="gl|glcore"> >+ <require> >+ <command name="glTextureBarrier"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_border_clamp" supported="gl|glcore"> >+ <require> >+ <enum name="GL_CLAMP_TO_BORDER_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_buffer_object" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TEXTURE_BUFFER_ARB"/> >+ <enum name="GL_MAX_TEXTURE_BUFFER_SIZE_ARB"/> >+ <enum name="GL_TEXTURE_BINDING_BUFFER_ARB"/> >+ <enum name="GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB"/> >+ <enum name="GL_TEXTURE_BUFFER_FORMAT_ARB"/> >+ <command name="glTexBufferARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_buffer_object_rgb32" supported="gl|glcore"> >+ <require> >+ <enum name="GL_RGB32F"/> >+ <enum name="GL_RGB32UI"/> >+ <enum name="GL_RGB32I"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_buffer_range" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TEXTURE_BUFFER_OFFSET"/> >+ <enum name="GL_TEXTURE_BUFFER_SIZE"/> >+ <enum name="GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT"/> >+ <command name="glTexBufferRange"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_compression" supported="gl"> >+ <require> >+ <enum name="GL_COMPRESSED_ALPHA_ARB"/> >+ <enum name="GL_COMPRESSED_LUMINANCE_ARB"/> >+ <enum name="GL_COMPRESSED_LUMINANCE_ALPHA_ARB"/> >+ <enum name="GL_COMPRESSED_INTENSITY_ARB"/> >+ <enum name="GL_COMPRESSED_RGB_ARB"/> >+ <enum name="GL_COMPRESSED_RGBA_ARB"/> >+ <enum name="GL_TEXTURE_COMPRESSION_HINT_ARB"/> >+ <enum name="GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB"/> >+ <enum name="GL_TEXTURE_COMPRESSED_ARB"/> >+ <enum name="GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB"/> >+ <enum name="GL_COMPRESSED_TEXTURE_FORMATS_ARB"/> >+ <command name="glCompressedTexImage3DARB"/> >+ <command name="glCompressedTexImage2DARB"/> >+ <command name="glCompressedTexImage1DARB"/> >+ <command name="glCompressedTexSubImage3DARB"/> >+ <command name="glCompressedTexSubImage2DARB"/> >+ <command name="glCompressedTexSubImage1DARB"/> >+ <command name="glGetCompressedTexImageARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_compression_bptc" supported="gl|glcore"> >+ <require> >+ <enum name="GL_COMPRESSED_RGBA_BPTC_UNORM_ARB"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB"/> >+ <enum name="GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB"/> >+ <enum name="GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_compression_rgtc" supported="gl|glcore"> >+ <require> >+ <enum name="GL_COMPRESSED_RED_RGTC1"/> >+ <enum name="GL_COMPRESSED_SIGNED_RED_RGTC1"/> >+ <enum name="GL_COMPRESSED_RG_RGTC2"/> >+ <enum name="GL_COMPRESSED_SIGNED_RG_RGTC2"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_cube_map" supported="gl"> >+ <require> >+ <enum name="GL_NORMAL_MAP_ARB"/> >+ <enum name="GL_REFLECTION_MAP_ARB"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_ARB"/> >+ <enum name="GL_TEXTURE_BINDING_CUBE_MAP_ARB"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB"/> >+ <enum name="GL_PROXY_TEXTURE_CUBE_MAP_ARB"/> >+ <enum name="GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_cube_map_array" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TEXTURE_CUBE_MAP_ARRAY_ARB"/> >+ <enum name="GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB"/> >+ <enum name="GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB"/> >+ <enum name="GL_SAMPLER_CUBE_MAP_ARRAY_ARB"/> >+ <enum name="GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB"/> >+ <enum name="GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_env_add" supported="gl"/> >+ <extension name="GL_ARB_texture_env_combine" supported="gl"> >+ <require> >+ <enum name="GL_COMBINE_ARB"/> >+ <enum name="GL_COMBINE_RGB_ARB"/> >+ <enum name="GL_COMBINE_ALPHA_ARB"/> >+ <enum name="GL_SOURCE0_RGB_ARB"/> >+ <enum name="GL_SOURCE1_RGB_ARB"/> >+ <enum name="GL_SOURCE2_RGB_ARB"/> >+ <enum name="GL_SOURCE0_ALPHA_ARB"/> >+ <enum name="GL_SOURCE1_ALPHA_ARB"/> >+ <enum name="GL_SOURCE2_ALPHA_ARB"/> >+ <enum name="GL_OPERAND0_RGB_ARB"/> >+ <enum name="GL_OPERAND1_RGB_ARB"/> >+ <enum name="GL_OPERAND2_RGB_ARB"/> >+ <enum name="GL_OPERAND0_ALPHA_ARB"/> >+ <enum name="GL_OPERAND1_ALPHA_ARB"/> >+ <enum name="GL_OPERAND2_ALPHA_ARB"/> >+ <enum name="GL_RGB_SCALE_ARB"/> >+ <enum name="GL_ADD_SIGNED_ARB"/> >+ <enum name="GL_INTERPOLATE_ARB"/> >+ <enum name="GL_SUBTRACT_ARB"/> >+ <enum name="GL_CONSTANT_ARB"/> >+ <enum name="GL_PRIMARY_COLOR_ARB"/> >+ <enum name="GL_PREVIOUS_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_env_crossbar" supported="gl"/> >+ <extension name="GL_ARB_texture_env_dot3" supported="gl"> >+ <require> >+ <enum name="GL_DOT3_RGB_ARB"/> >+ <enum name="GL_DOT3_RGBA_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_filter_anisotropic" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TEXTURE_MAX_ANISOTROPY"/> >+ <enum name="GL_MAX_TEXTURE_MAX_ANISOTROPY"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_filter_minmax" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TEXTURE_REDUCTION_MODE_ARB"/> >+ <enum name="GL_WEIGHTED_AVERAGE_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_float" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_RED_TYPE_ARB"/> >+ <enum name="GL_TEXTURE_GREEN_TYPE_ARB"/> >+ <enum name="GL_TEXTURE_BLUE_TYPE_ARB"/> >+ <enum name="GL_TEXTURE_ALPHA_TYPE_ARB"/> >+ <enum name="GL_TEXTURE_LUMINANCE_TYPE_ARB"/> >+ <enum name="GL_TEXTURE_INTENSITY_TYPE_ARB"/> >+ <enum name="GL_TEXTURE_DEPTH_TYPE_ARB"/> >+ <enum name="GL_UNSIGNED_NORMALIZED_ARB"/> >+ <enum name="GL_RGBA32F_ARB"/> >+ <enum name="GL_RGB32F_ARB"/> >+ <enum name="GL_ALPHA32F_ARB"/> >+ <enum name="GL_INTENSITY32F_ARB"/> >+ <enum name="GL_LUMINANCE32F_ARB"/> >+ <enum name="GL_LUMINANCE_ALPHA32F_ARB"/> >+ <enum name="GL_RGBA16F_ARB"/> >+ <enum name="GL_RGB16F_ARB"/> >+ <enum name="GL_ALPHA16F_ARB"/> >+ <enum name="GL_INTENSITY16F_ARB"/> >+ <enum name="GL_LUMINANCE16F_ARB"/> >+ <enum name="GL_LUMINANCE_ALPHA16F_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_gather" supported="gl|glcore"> >+ <require> >+ <enum name="GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB"/> >+ <enum name="GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB"/> >+ <enum name="GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_mirror_clamp_to_edge" supported="gl|glcore"> >+ <require> >+ <enum name="GL_MIRROR_CLAMP_TO_EDGE"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_mirrored_repeat" supported="gl|glcore"> >+ <require> >+ <enum name="GL_MIRRORED_REPEAT_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_multisample" supported="gl|glcore"> >+ <require> >+ <enum name="GL_SAMPLE_POSITION"/> >+ <enum name="GL_SAMPLE_MASK"/> >+ <enum name="GL_SAMPLE_MASK_VALUE"/> >+ <enum name="GL_MAX_SAMPLE_MASK_WORDS"/> >+ <enum name="GL_TEXTURE_2D_MULTISAMPLE"/> >+ <enum name="GL_PROXY_TEXTURE_2D_MULTISAMPLE"/> >+ <enum name="GL_TEXTURE_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_TEXTURE_BINDING_2D_MULTISAMPLE"/> >+ <enum name="GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_TEXTURE_SAMPLES"/> >+ <enum name="GL_TEXTURE_FIXED_SAMPLE_LOCATIONS"/> >+ <enum name="GL_SAMPLER_2D_MULTISAMPLE"/> >+ <enum name="GL_INT_SAMPLER_2D_MULTISAMPLE"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE"/> >+ <enum name="GL_SAMPLER_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_MAX_COLOR_TEXTURE_SAMPLES"/> >+ <enum name="GL_MAX_DEPTH_TEXTURE_SAMPLES"/> >+ <enum name="GL_MAX_INTEGER_SAMPLES"/> >+ <command name="glTexImage2DMultisample"/> >+ <command name="glTexImage3DMultisample"/> >+ <command name="glGetMultisamplefv"/> >+ <command name="glSampleMaski"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_non_power_of_two" supported="gl|glcore"/> >+ <extension name="GL_ARB_texture_query_levels" supported="gl|glcore"/> >+ <extension name="GL_ARB_texture_query_lod" supported="gl|glcore"/> >+ <extension name="GL_ARB_texture_rectangle" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_RECTANGLE_ARB"/> >+ <enum name="GL_TEXTURE_BINDING_RECTANGLE_ARB"/> >+ <enum name="GL_PROXY_TEXTURE_RECTANGLE_ARB"/> >+ <enum name="GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_rg" supported="gl|glcore"> >+ <require> >+ <enum name="GL_RG"/> >+ <enum name="GL_RG_INTEGER"/> >+ <enum name="GL_R8"/> >+ <enum name="GL_R16"/> >+ <enum name="GL_RG8"/> >+ <enum name="GL_RG16"/> >+ <enum name="GL_R16F"/> >+ <enum name="GL_R32F"/> >+ <enum name="GL_RG16F"/> >+ <enum name="GL_RG32F"/> >+ <enum name="GL_R8I"/> >+ <enum name="GL_R8UI"/> >+ <enum name="GL_R16I"/> >+ <enum name="GL_R16UI"/> >+ <enum name="GL_R32I"/> >+ <enum name="GL_R32UI"/> >+ <enum name="GL_RG8I"/> >+ <enum name="GL_RG8UI"/> >+ <enum name="GL_RG16I"/> >+ <enum name="GL_RG16UI"/> >+ <enum name="GL_RG32I"/> >+ <enum name="GL_RG32UI"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_rgb10_a2ui" supported="gl|glcore"> >+ <require> >+ <enum name="GL_RGB10_A2UI"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_stencil8" supported="gl|glcore"> >+ <require> >+ <enum name="GL_STENCIL_INDEX"/> >+ <enum name="GL_STENCIL_INDEX8"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_storage" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TEXTURE_IMMUTABLE_FORMAT"/> >+ <command name="glTexStorage1D"/> >+ <command name="glTexStorage2D"/> >+ <command name="glTexStorage3D"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_storage_multisample" supported="gl|glcore"> >+ <require> >+ <command name="glTexStorage2DMultisample"/> >+ <command name="glTexStorage3DMultisample"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_swizzle" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TEXTURE_SWIZZLE_R"/> >+ <enum name="GL_TEXTURE_SWIZZLE_G"/> >+ <enum name="GL_TEXTURE_SWIZZLE_B"/> >+ <enum name="GL_TEXTURE_SWIZZLE_A"/> >+ <enum name="GL_TEXTURE_SWIZZLE_RGBA"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_texture_view" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TEXTURE_VIEW_MIN_LEVEL"/> >+ <enum name="GL_TEXTURE_VIEW_NUM_LEVELS"/> >+ <enum name="GL_TEXTURE_VIEW_MIN_LAYER"/> >+ <enum name="GL_TEXTURE_VIEW_NUM_LAYERS"/> >+ <enum name="GL_TEXTURE_IMMUTABLE_LEVELS"/> >+ <command name="glTextureView"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_timer_query" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TIME_ELAPSED"/> >+ <enum name="GL_TIMESTAMP"/> >+ <command name="glQueryCounter"/> >+ <command name="glGetQueryObjecti64v"/> >+ <command name="glGetQueryObjectui64v"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_transform_feedback2" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TRANSFORM_FEEDBACK"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BINDING"/> >+ <command name="glBindTransformFeedback"/> >+ <command name="glDeleteTransformFeedbacks"/> >+ <command name="glGenTransformFeedbacks"/> >+ <command name="glIsTransformFeedback"/> >+ <command name="glPauseTransformFeedback"/> >+ <command name="glResumeTransformFeedback"/> >+ <command name="glDrawTransformFeedback"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_transform_feedback3" supported="gl|glcore"> >+ <require> >+ <enum name="GL_MAX_TRANSFORM_FEEDBACK_BUFFERS"/> >+ <enum name="GL_MAX_VERTEX_STREAMS"/> >+ <command name="glDrawTransformFeedbackStream"/> >+ <command name="glBeginQueryIndexed"/> >+ <command name="glEndQueryIndexed"/> >+ <command name="glGetQueryIndexediv"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_transform_feedback_instanced" supported="gl|glcore"> >+ <require> >+ <command name="glDrawTransformFeedbackInstanced"/> >+ <command name="glDrawTransformFeedbackStreamInstanced"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_transform_feedback_overflow_query" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_transpose_matrix" supported="gl"> >+ <require> >+ <enum name="GL_TRANSPOSE_MODELVIEW_MATRIX_ARB"/> >+ <enum name="GL_TRANSPOSE_PROJECTION_MATRIX_ARB"/> >+ <enum name="GL_TRANSPOSE_TEXTURE_MATRIX_ARB"/> >+ <enum name="GL_TRANSPOSE_COLOR_MATRIX_ARB"/> >+ <command name="glLoadTransposeMatrixfARB"/> >+ <command name="glLoadTransposeMatrixdARB"/> >+ <command name="glMultTransposeMatrixfARB"/> >+ <command name="glMultTransposeMatrixdARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_uniform_buffer_object" supported="gl|glcore"> >+ <require> >+ <enum name="GL_UNIFORM_BUFFER"/> >+ <enum name="GL_UNIFORM_BUFFER_BINDING"/> >+ <enum name="GL_UNIFORM_BUFFER_START"/> >+ <enum name="GL_UNIFORM_BUFFER_SIZE"/> >+ <enum name="GL_MAX_VERTEX_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_GEOMETRY_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_FRAGMENT_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_COMBINED_UNIFORM_BLOCKS"/> >+ <enum name="GL_MAX_UNIFORM_BUFFER_BINDINGS"/> >+ <enum name="GL_MAX_UNIFORM_BLOCK_SIZE"/> >+ <enum name="GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS"/> >+ <enum name="GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS"/> >+ <enum name="GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT"/> >+ <enum name="GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH"/> >+ <enum name="GL_ACTIVE_UNIFORM_BLOCKS"/> >+ <enum name="GL_UNIFORM_TYPE"/> >+ <enum name="GL_UNIFORM_SIZE"/> >+ <enum name="GL_UNIFORM_NAME_LENGTH"/> >+ <enum name="GL_UNIFORM_BLOCK_INDEX"/> >+ <enum name="GL_UNIFORM_OFFSET"/> >+ <enum name="GL_UNIFORM_ARRAY_STRIDE"/> >+ <enum name="GL_UNIFORM_MATRIX_STRIDE"/> >+ <enum name="GL_UNIFORM_IS_ROW_MAJOR"/> >+ <enum name="GL_UNIFORM_BLOCK_BINDING"/> >+ <enum name="GL_UNIFORM_BLOCK_DATA_SIZE"/> >+ <enum name="GL_UNIFORM_BLOCK_NAME_LENGTH"/> >+ <enum name="GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS"/> >+ <enum name="GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER"/> >+ <enum name="GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER"/> >+ <enum name="GL_INVALID_INDEX"/> >+ <command name="glGetUniformIndices"/> >+ <command name="glGetActiveUniformsiv"/> >+ <command name="glGetActiveUniformName"/> >+ <command name="glGetUniformBlockIndex"/> >+ <command name="glGetActiveUniformBlockiv"/> >+ <command name="glGetActiveUniformBlockName"/> >+ <command name="glUniformBlockBinding"/> >+ <command name="glBindBufferRange"/> >+ <command name="glBindBufferBase"/> >+ <command name="glGetIntegeri_v"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_vertex_array_bgra" supported="gl|glcore"> >+ <require> >+ <enum name="GL_BGRA"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_vertex_array_object" supported="gl|glcore"> >+ <require> >+ <enum name="GL_VERTEX_ARRAY_BINDING"/> >+ <command name="glBindVertexArray"/> >+ <command name="glDeleteVertexArrays"/> >+ <command name="glGenVertexArrays"/> >+ <command name="glIsVertexArray"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_vertex_attrib_64bit" supported="gl|glcore"> >+ <require> >+ <enum name="GL_RGB32I"/> >+ <enum name="GL_DOUBLE_VEC2"/> >+ <enum name="GL_DOUBLE_VEC3"/> >+ <enum name="GL_DOUBLE_VEC4"/> >+ <enum name="GL_DOUBLE_MAT2"/> >+ <enum name="GL_DOUBLE_MAT3"/> >+ <enum name="GL_DOUBLE_MAT4"/> >+ <enum name="GL_DOUBLE_MAT2x3"/> >+ <enum name="GL_DOUBLE_MAT2x4"/> >+ <enum name="GL_DOUBLE_MAT3x2"/> >+ <enum name="GL_DOUBLE_MAT3x4"/> >+ <enum name="GL_DOUBLE_MAT4x2"/> >+ <enum name="GL_DOUBLE_MAT4x3"/> >+ <command name="glVertexAttribL1d"/> >+ <command name="glVertexAttribL2d"/> >+ <command name="glVertexAttribL3d"/> >+ <command name="glVertexAttribL4d"/> >+ <command name="glVertexAttribL1dv"/> >+ <command name="glVertexAttribL2dv"/> >+ <command name="glVertexAttribL3dv"/> >+ <command name="glVertexAttribL4dv"/> >+ <command name="glVertexAttribLPointer"/> >+ <command name="glGetVertexAttribLdv"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_vertex_attrib_binding" supported="gl|glcore"> >+ <require> >+ <enum name="GL_VERTEX_ATTRIB_BINDING"/> >+ <enum name="GL_VERTEX_ATTRIB_RELATIVE_OFFSET"/> >+ <enum name="GL_VERTEX_BINDING_DIVISOR"/> >+ <enum name="GL_VERTEX_BINDING_OFFSET"/> >+ <enum name="GL_VERTEX_BINDING_STRIDE"/> >+ <enum name="GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET"/> >+ <enum name="GL_MAX_VERTEX_ATTRIB_BINDINGS"/> >+ <command name="glBindVertexBuffer"/> >+ <command name="glVertexAttribFormat"/> >+ <command name="glVertexAttribIFormat"/> >+ <command name="glVertexAttribLFormat"/> >+ <command name="glVertexAttribBinding"/> >+ <command name="glVertexBindingDivisor"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_vertex_blend" supported="gl"> >+ <require> >+ <enum name="GL_MAX_VERTEX_UNITS_ARB"/> >+ <enum name="GL_ACTIVE_VERTEX_UNITS_ARB"/> >+ <enum name="GL_WEIGHT_SUM_UNITY_ARB"/> >+ <enum name="GL_VERTEX_BLEND_ARB"/> >+ <enum name="GL_CURRENT_WEIGHT_ARB"/> >+ <enum name="GL_WEIGHT_ARRAY_TYPE_ARB"/> >+ <enum name="GL_WEIGHT_ARRAY_STRIDE_ARB"/> >+ <enum name="GL_WEIGHT_ARRAY_SIZE_ARB"/> >+ <enum name="GL_WEIGHT_ARRAY_POINTER_ARB"/> >+ <enum name="GL_WEIGHT_ARRAY_ARB"/> >+ <enum name="GL_MODELVIEW0_ARB"/> >+ <enum name="GL_MODELVIEW1_ARB"/> >+ <enum name="GL_MODELVIEW2_ARB"/> >+ <enum name="GL_MODELVIEW3_ARB"/> >+ <enum name="GL_MODELVIEW4_ARB"/> >+ <enum name="GL_MODELVIEW5_ARB"/> >+ <enum name="GL_MODELVIEW6_ARB"/> >+ <enum name="GL_MODELVIEW7_ARB"/> >+ <enum name="GL_MODELVIEW8_ARB"/> >+ <enum name="GL_MODELVIEW9_ARB"/> >+ <enum name="GL_MODELVIEW10_ARB"/> >+ <enum name="GL_MODELVIEW11_ARB"/> >+ <enum name="GL_MODELVIEW12_ARB"/> >+ <enum name="GL_MODELVIEW13_ARB"/> >+ <enum name="GL_MODELVIEW14_ARB"/> >+ <enum name="GL_MODELVIEW15_ARB"/> >+ <enum name="GL_MODELVIEW16_ARB"/> >+ <enum name="GL_MODELVIEW17_ARB"/> >+ <enum name="GL_MODELVIEW18_ARB"/> >+ <enum name="GL_MODELVIEW19_ARB"/> >+ <enum name="GL_MODELVIEW20_ARB"/> >+ <enum name="GL_MODELVIEW21_ARB"/> >+ <enum name="GL_MODELVIEW22_ARB"/> >+ <enum name="GL_MODELVIEW23_ARB"/> >+ <enum name="GL_MODELVIEW24_ARB"/> >+ <enum name="GL_MODELVIEW25_ARB"/> >+ <enum name="GL_MODELVIEW26_ARB"/> >+ <enum name="GL_MODELVIEW27_ARB"/> >+ <enum name="GL_MODELVIEW28_ARB"/> >+ <enum name="GL_MODELVIEW29_ARB"/> >+ <enum name="GL_MODELVIEW30_ARB"/> >+ <enum name="GL_MODELVIEW31_ARB"/> >+ <command name="glWeightbvARB"/> >+ <command name="glWeightsvARB"/> >+ <command name="glWeightivARB"/> >+ <command name="glWeightfvARB"/> >+ <command name="glWeightdvARB"/> >+ <command name="glWeightubvARB"/> >+ <command name="glWeightusvARB"/> >+ <command name="glWeightuivARB"/> >+ <command name="glWeightPointerARB"/> >+ <command name="glVertexBlendARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_vertex_buffer_object" supported="gl"> >+ <require> >+ <enum name="GL_BUFFER_SIZE_ARB"/> >+ <enum name="GL_BUFFER_USAGE_ARB"/> >+ <enum name="GL_ARRAY_BUFFER_ARB"/> >+ <enum name="GL_ELEMENT_ARRAY_BUFFER_ARB"/> >+ <enum name="GL_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum name="GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum name="GL_VERTEX_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum name="GL_NORMAL_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum name="GL_COLOR_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum name="GL_INDEX_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum name="GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB"/> >+ <enum name="GL_READ_ONLY_ARB"/> >+ <enum name="GL_WRITE_ONLY_ARB"/> >+ <enum name="GL_READ_WRITE_ARB"/> >+ <enum name="GL_BUFFER_ACCESS_ARB"/> >+ <enum name="GL_BUFFER_MAPPED_ARB"/> >+ <enum name="GL_BUFFER_MAP_POINTER_ARB"/> >+ <enum name="GL_STREAM_DRAW_ARB"/> >+ <enum name="GL_STREAM_READ_ARB"/> >+ <enum name="GL_STREAM_COPY_ARB"/> >+ <enum name="GL_STATIC_DRAW_ARB"/> >+ <enum name="GL_STATIC_READ_ARB"/> >+ <enum name="GL_STATIC_COPY_ARB"/> >+ <enum name="GL_DYNAMIC_DRAW_ARB"/> >+ <enum name="GL_DYNAMIC_READ_ARB"/> >+ <enum name="GL_DYNAMIC_COPY_ARB"/> >+ <command name="glBindBufferARB"/> >+ <command name="glDeleteBuffersARB"/> >+ <command name="glGenBuffersARB"/> >+ <command name="glIsBufferARB"/> >+ <command name="glBufferDataARB"/> >+ <command name="glBufferSubDataARB"/> >+ <command name="glGetBufferSubDataARB"/> >+ <command name="glMapBufferARB"/> >+ <command name="glUnmapBufferARB"/> >+ <command name="glGetBufferParameterivARB"/> >+ <command name="glGetBufferPointervARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_vertex_program" supported="gl"> >+ <require> >+ <enum name="GL_COLOR_SUM_ARB"/> >+ <enum name="GL_VERTEX_PROGRAM_ARB"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB"/> >+ <enum name="GL_CURRENT_VERTEX_ATTRIB_ARB"/> >+ <enum name="GL_PROGRAM_LENGTH_ARB"/> >+ <enum name="GL_PROGRAM_STRING_ARB"/> >+ <enum name="GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB"/> >+ <enum name="GL_MAX_PROGRAM_MATRICES_ARB"/> >+ <enum name="GL_CURRENT_MATRIX_STACK_DEPTH_ARB"/> >+ <enum name="GL_CURRENT_MATRIX_ARB"/> >+ <enum name="GL_VERTEX_PROGRAM_POINT_SIZE_ARB"/> >+ <enum name="GL_VERTEX_PROGRAM_TWO_SIDE_ARB"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB"/> >+ <enum name="GL_PROGRAM_ERROR_POSITION_ARB"/> >+ <enum name="GL_PROGRAM_BINDING_ARB"/> >+ <enum name="GL_MAX_VERTEX_ATTRIBS_ARB"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB"/> >+ <enum name="GL_PROGRAM_ERROR_STRING_ARB"/> >+ <enum name="GL_PROGRAM_FORMAT_ASCII_ARB"/> >+ <enum name="GL_PROGRAM_FORMAT_ARB"/> >+ <enum name="GL_PROGRAM_INSTRUCTIONS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_INSTRUCTIONS_ARB"/> >+ <enum name="GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB"/> >+ <enum name="GL_PROGRAM_TEMPORARIES_ARB"/> >+ <enum name="GL_MAX_PROGRAM_TEMPORARIES_ARB"/> >+ <enum name="GL_PROGRAM_NATIVE_TEMPORARIES_ARB"/> >+ <enum name="GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB"/> >+ <enum name="GL_PROGRAM_PARAMETERS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_PARAMETERS_ARB"/> >+ <enum name="GL_PROGRAM_NATIVE_PARAMETERS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB"/> >+ <enum name="GL_PROGRAM_ATTRIBS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_ATTRIBS_ARB"/> >+ <enum name="GL_PROGRAM_NATIVE_ATTRIBS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB"/> >+ <enum name="GL_PROGRAM_ADDRESS_REGISTERS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB"/> >+ <enum name="GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB"/> >+ <enum name="GL_MAX_PROGRAM_ENV_PARAMETERS_ARB"/> >+ <enum name="GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB"/> >+ <enum name="GL_TRANSPOSE_CURRENT_MATRIX_ARB"/> >+ <enum name="GL_MATRIX0_ARB"/> >+ <enum name="GL_MATRIX1_ARB"/> >+ <enum name="GL_MATRIX2_ARB"/> >+ <enum name="GL_MATRIX3_ARB"/> >+ <enum name="GL_MATRIX4_ARB"/> >+ <enum name="GL_MATRIX5_ARB"/> >+ <enum name="GL_MATRIX6_ARB"/> >+ <enum name="GL_MATRIX7_ARB"/> >+ <enum name="GL_MATRIX8_ARB"/> >+ <enum name="GL_MATRIX9_ARB"/> >+ <enum name="GL_MATRIX10_ARB"/> >+ <enum name="GL_MATRIX11_ARB"/> >+ <enum name="GL_MATRIX12_ARB"/> >+ <enum name="GL_MATRIX13_ARB"/> >+ <enum name="GL_MATRIX14_ARB"/> >+ <enum name="GL_MATRIX15_ARB"/> >+ <enum name="GL_MATRIX16_ARB"/> >+ <enum name="GL_MATRIX17_ARB"/> >+ <enum name="GL_MATRIX18_ARB"/> >+ <enum name="GL_MATRIX19_ARB"/> >+ <enum name="GL_MATRIX20_ARB"/> >+ <enum name="GL_MATRIX21_ARB"/> >+ <enum name="GL_MATRIX22_ARB"/> >+ <enum name="GL_MATRIX23_ARB"/> >+ <enum name="GL_MATRIX24_ARB"/> >+ <enum name="GL_MATRIX25_ARB"/> >+ <enum name="GL_MATRIX26_ARB"/> >+ <enum name="GL_MATRIX27_ARB"/> >+ <enum name="GL_MATRIX28_ARB"/> >+ <enum name="GL_MATRIX29_ARB"/> >+ <enum name="GL_MATRIX30_ARB"/> >+ <enum name="GL_MATRIX31_ARB"/> >+ <command name="glVertexAttrib1dARB"/> >+ <command name="glVertexAttrib1dvARB"/> >+ <command name="glVertexAttrib1fARB"/> >+ <command name="glVertexAttrib1fvARB"/> >+ <command name="glVertexAttrib1sARB"/> >+ <command name="glVertexAttrib1svARB"/> >+ <command name="glVertexAttrib2dARB"/> >+ <command name="glVertexAttrib2dvARB"/> >+ <command name="glVertexAttrib2fARB"/> >+ <command name="glVertexAttrib2fvARB"/> >+ <command name="glVertexAttrib2sARB"/> >+ <command name="glVertexAttrib2svARB"/> >+ <command name="glVertexAttrib3dARB"/> >+ <command name="glVertexAttrib3dvARB"/> >+ <command name="glVertexAttrib3fARB"/> >+ <command name="glVertexAttrib3fvARB"/> >+ <command name="glVertexAttrib3sARB"/> >+ <command name="glVertexAttrib3svARB"/> >+ <command name="glVertexAttrib4NbvARB"/> >+ <command name="glVertexAttrib4NivARB"/> >+ <command name="glVertexAttrib4NsvARB"/> >+ <command name="glVertexAttrib4NubARB"/> >+ <command name="glVertexAttrib4NubvARB"/> >+ <command name="glVertexAttrib4NuivARB"/> >+ <command name="glVertexAttrib4NusvARB"/> >+ <command name="glVertexAttrib4bvARB"/> >+ <command name="glVertexAttrib4dARB"/> >+ <command name="glVertexAttrib4dvARB"/> >+ <command name="glVertexAttrib4fARB"/> >+ <command name="glVertexAttrib4fvARB"/> >+ <command name="glVertexAttrib4ivARB"/> >+ <command name="glVertexAttrib4sARB"/> >+ <command name="glVertexAttrib4svARB"/> >+ <command name="glVertexAttrib4ubvARB"/> >+ <command name="glVertexAttrib4uivARB"/> >+ <command name="glVertexAttrib4usvARB"/> >+ <command name="glVertexAttribPointerARB"/> >+ <command name="glEnableVertexAttribArrayARB"/> >+ <command name="glDisableVertexAttribArrayARB"/> >+ <command name="glProgramStringARB"/> >+ <command name="glBindProgramARB"/> >+ <command name="glDeleteProgramsARB"/> >+ <command name="glGenProgramsARB"/> >+ <command name="glProgramEnvParameter4dARB"/> >+ <command name="glProgramEnvParameter4dvARB"/> >+ <command name="glProgramEnvParameter4fARB"/> >+ <command name="glProgramEnvParameter4fvARB"/> >+ <command name="glProgramLocalParameter4dARB"/> >+ <command name="glProgramLocalParameter4dvARB"/> >+ <command name="glProgramLocalParameter4fARB"/> >+ <command name="glProgramLocalParameter4fvARB"/> >+ <command name="glGetProgramEnvParameterdvARB"/> >+ <command name="glGetProgramEnvParameterfvARB"/> >+ <command name="glGetProgramLocalParameterdvARB"/> >+ <command name="glGetProgramLocalParameterfvARB"/> >+ <command name="glGetProgramivARB"/> >+ <command name="glGetProgramStringARB"/> >+ <command name="glGetVertexAttribdvARB"/> >+ <command name="glGetVertexAttribfvARB"/> >+ <command name="glGetVertexAttribivARB"/> >+ <command name="glGetVertexAttribPointervARB"/> >+ <command name="glIsProgramARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_vertex_shader" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_SHADER_ARB"/> >+ <enum name="GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB"/> >+ <enum name="GL_MAX_VARYING_FLOATS_ARB"/> >+ <enum name="GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB"/> >+ <enum name="GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB"/> >+ <enum name="GL_OBJECT_ACTIVE_ATTRIBUTES_ARB"/> >+ <enum name="GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB"/> >+ <enum name="GL_MAX_VERTEX_ATTRIBS_ARB"/> >+ <enum name="GL_MAX_TEXTURE_IMAGE_UNITS_ARB"/> >+ <enum name="GL_MAX_TEXTURE_COORDS_ARB"/> >+ <enum name="GL_VERTEX_PROGRAM_POINT_SIZE_ARB"/> >+ <enum name="GL_VERTEX_PROGRAM_TWO_SIDE_ARB"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB"/> >+ <enum name="GL_CURRENT_VERTEX_ATTRIB_ARB"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB"/> >+ <enum name="GL_FLOAT"/> >+ <enum name="GL_FLOAT_VEC2_ARB"/> >+ <enum name="GL_FLOAT_VEC3_ARB"/> >+ <enum name="GL_FLOAT_VEC4_ARB"/> >+ <enum name="GL_FLOAT_MAT2_ARB"/> >+ <enum name="GL_FLOAT_MAT3_ARB"/> >+ <enum name="GL_FLOAT_MAT4_ARB"/> >+ <command name="glVertexAttrib1fARB"/> >+ <command name="glVertexAttrib1sARB"/> >+ <command name="glVertexAttrib1dARB"/> >+ <command name="glVertexAttrib2fARB"/> >+ <command name="glVertexAttrib2sARB"/> >+ <command name="glVertexAttrib2dARB"/> >+ <command name="glVertexAttrib3fARB"/> >+ <command name="glVertexAttrib3sARB"/> >+ <command name="glVertexAttrib3dARB"/> >+ <command name="glVertexAttrib4fARB"/> >+ <command name="glVertexAttrib4sARB"/> >+ <command name="glVertexAttrib4dARB"/> >+ <command name="glVertexAttrib4NubARB"/> >+ <command name="glVertexAttrib1fvARB"/> >+ <command name="glVertexAttrib1svARB"/> >+ <command name="glVertexAttrib1dvARB"/> >+ <command name="glVertexAttrib2fvARB"/> >+ <command name="glVertexAttrib2svARB"/> >+ <command name="glVertexAttrib2dvARB"/> >+ <command name="glVertexAttrib3fvARB"/> >+ <command name="glVertexAttrib3svARB"/> >+ <command name="glVertexAttrib3dvARB"/> >+ <command name="glVertexAttrib4fvARB"/> >+ <command name="glVertexAttrib4svARB"/> >+ <command name="glVertexAttrib4dvARB"/> >+ <command name="glVertexAttrib4ivARB"/> >+ <command name="glVertexAttrib4bvARB"/> >+ <command name="glVertexAttrib4ubvARB"/> >+ <command name="glVertexAttrib4usvARB"/> >+ <command name="glVertexAttrib4uivARB"/> >+ <command name="glVertexAttrib4NbvARB"/> >+ <command name="glVertexAttrib4NsvARB"/> >+ <command name="glVertexAttrib4NivARB"/> >+ <command name="glVertexAttrib4NubvARB"/> >+ <command name="glVertexAttrib4NusvARB"/> >+ <command name="glVertexAttrib4NuivARB"/> >+ <command name="glVertexAttribPointerARB"/> >+ <command name="glEnableVertexAttribArrayARB"/> >+ <command name="glDisableVertexAttribArrayARB"/> >+ <command name="glBindAttribLocationARB"/> >+ <command name="glGetActiveAttribARB"/> >+ <command name="glGetAttribLocationARB"/> >+ <command name="glGetVertexAttribdvARB"/> >+ <command name="glGetVertexAttribfvARB"/> >+ <command name="glGetVertexAttribivARB"/> >+ <command name="glGetVertexAttribPointervARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_vertex_type_10f_11f_11f_rev" supported="gl|glcore"> >+ <require> >+ <enum name="GL_UNSIGNED_INT_10F_11F_11F_REV"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_vertex_type_2_10_10_10_rev" supported="gl|glcore"> >+ <require> >+ <enum name="GL_UNSIGNED_INT_2_10_10_10_REV"/> >+ <enum name="GL_INT_2_10_10_10_REV"/> >+ <command name="glVertexAttribP1ui"/> >+ <command name="glVertexAttribP1uiv"/> >+ <command name="glVertexAttribP2ui"/> >+ <command name="glVertexAttribP2uiv"/> >+ <command name="glVertexAttribP3ui"/> >+ <command name="glVertexAttribP3uiv"/> >+ <command name="glVertexAttribP4ui"/> >+ <command name="glVertexAttribP4uiv"/> >+ </require> >+ <require api="gl" profile="compatibility"> >+ <command name="glVertexP2ui"/> >+ <command name="glVertexP2uiv"/> >+ <command name="glVertexP3ui"/> >+ <command name="glVertexP3uiv"/> >+ <command name="glVertexP4ui"/> >+ <command name="glVertexP4uiv"/> >+ <command name="glTexCoordP1ui"/> >+ <command name="glTexCoordP1uiv"/> >+ <command name="glTexCoordP2ui"/> >+ <command name="glTexCoordP2uiv"/> >+ <command name="glTexCoordP3ui"/> >+ <command name="glTexCoordP3uiv"/> >+ <command name="glTexCoordP4ui"/> >+ <command name="glTexCoordP4uiv"/> >+ <command name="glMultiTexCoordP1ui"/> >+ <command name="glMultiTexCoordP1uiv"/> >+ <command name="glMultiTexCoordP2ui"/> >+ <command name="glMultiTexCoordP2uiv"/> >+ <command name="glMultiTexCoordP3ui"/> >+ <command name="glMultiTexCoordP3uiv"/> >+ <command name="glMultiTexCoordP4ui"/> >+ <command name="glMultiTexCoordP4uiv"/> >+ <command name="glNormalP3ui"/> >+ <command name="glNormalP3uiv"/> >+ <command name="glColorP3ui"/> >+ <command name="glColorP3uiv"/> >+ <command name="glColorP4ui"/> >+ <command name="glColorP4uiv"/> >+ <command name="glSecondaryColorP3ui"/> >+ <command name="glSecondaryColorP3uiv"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_viewport_array" supported="gl|glcore"> >+ <require> >+ <enum name="GL_SCISSOR_BOX"/> >+ <enum name="GL_VIEWPORT"/> >+ <enum name="GL_DEPTH_RANGE"/> >+ <enum name="GL_SCISSOR_TEST"/> >+ <enum name="GL_MAX_VIEWPORTS"/> >+ <enum name="GL_VIEWPORT_SUBPIXEL_BITS"/> >+ <enum name="GL_VIEWPORT_BOUNDS_RANGE"/> >+ <enum name="GL_LAYER_PROVOKING_VERTEX"/> >+ <enum name="GL_VIEWPORT_INDEX_PROVOKING_VERTEX"/> >+ <enum name="GL_UNDEFINED_VERTEX"/> >+ <enum name="GL_FIRST_VERTEX_CONVENTION"/> >+ <enum name="GL_LAST_VERTEX_CONVENTION"/> >+ <enum name="GL_PROVOKING_VERTEX"/> >+ <command name="glViewportArrayv"/> >+ <command name="glViewportIndexedf"/> >+ <command name="glViewportIndexedfv"/> >+ <command name="glScissorArrayv"/> >+ <command name="glScissorIndexed"/> >+ <command name="glScissorIndexedv"/> >+ <command name="glDepthRangeArrayv"/> >+ <command name="glDepthRangeIndexed"/> >+ <command name="glGetFloati_v"/> >+ <command name="glGetDoublei_v"/> >+ </require> >+ </extension> >+ <extension name="GL_ARB_window_pos" supported="gl"> >+ <require> >+ <command name="glWindowPos2dARB"/> >+ <command name="glWindowPos2dvARB"/> >+ <command name="glWindowPos2fARB"/> >+ <command name="glWindowPos2fvARB"/> >+ <command name="glWindowPos2iARB"/> >+ <command name="glWindowPos2ivARB"/> >+ <command name="glWindowPos2sARB"/> >+ <command name="glWindowPos2svARB"/> >+ <command name="glWindowPos3dARB"/> >+ <command name="glWindowPos3dvARB"/> >+ <command name="glWindowPos3fARB"/> >+ <command name="glWindowPos3fvARB"/> >+ <command name="glWindowPos3iARB"/> >+ <command name="glWindowPos3ivARB"/> >+ <command name="glWindowPos3sARB"/> >+ <command name="glWindowPos3svARB"/> >+ </require> >+ </extension> >+ <extension name="GL_ARM_mali_program_binary" supported="gles2"> >+ <require> >+ <enum name="GL_MALI_PROGRAM_BINARY_ARM"/> >+ </require> >+ </extension> >+ <extension name="GL_ARM_mali_shader_binary" supported="gles2"> >+ <require> >+ <enum name="GL_MALI_SHADER_BINARY_ARM"/> >+ </require> >+ </extension> >+ <extension name="GL_ARM_rgba8" supported="gles1|gles2"/> >+ <extension name="GL_ARM_shader_framebuffer_fetch" supported="gles2"> >+ <require> >+ <enum name="GL_FETCH_PER_SAMPLE_ARM"/> >+ <enum name="GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM"/> >+ </require> >+ </extension> >+ <extension name="GL_ARM_shader_framebuffer_fetch_depth_stencil" supported="gles2"/> >+ <extension name="GL_ATI_draw_buffers" supported="gl"> >+ <require> >+ <enum name="GL_MAX_DRAW_BUFFERS_ATI"/> >+ <enum name="GL_DRAW_BUFFER0_ATI"/> >+ <enum name="GL_DRAW_BUFFER1_ATI"/> >+ <enum name="GL_DRAW_BUFFER2_ATI"/> >+ <enum name="GL_DRAW_BUFFER3_ATI"/> >+ <enum name="GL_DRAW_BUFFER4_ATI"/> >+ <enum name="GL_DRAW_BUFFER5_ATI"/> >+ <enum name="GL_DRAW_BUFFER6_ATI"/> >+ <enum name="GL_DRAW_BUFFER7_ATI"/> >+ <enum name="GL_DRAW_BUFFER8_ATI"/> >+ <enum name="GL_DRAW_BUFFER9_ATI"/> >+ <enum name="GL_DRAW_BUFFER10_ATI"/> >+ <enum name="GL_DRAW_BUFFER11_ATI"/> >+ <enum name="GL_DRAW_BUFFER12_ATI"/> >+ <enum name="GL_DRAW_BUFFER13_ATI"/> >+ <enum name="GL_DRAW_BUFFER14_ATI"/> >+ <enum name="GL_DRAW_BUFFER15_ATI"/> >+ <command name="glDrawBuffersATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_element_array" supported="gl"> >+ <require> >+ <enum name="GL_ELEMENT_ARRAY_ATI"/> >+ <enum name="GL_ELEMENT_ARRAY_TYPE_ATI"/> >+ <enum name="GL_ELEMENT_ARRAY_POINTER_ATI"/> >+ <command name="glElementPointerATI"/> >+ <command name="glDrawElementArrayATI"/> >+ <command name="glDrawRangeElementArrayATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_envmap_bumpmap" supported="gl"> >+ <require> >+ <enum name="GL_BUMP_ROT_MATRIX_ATI"/> >+ <enum name="GL_BUMP_ROT_MATRIX_SIZE_ATI"/> >+ <enum name="GL_BUMP_NUM_TEX_UNITS_ATI"/> >+ <enum name="GL_BUMP_TEX_UNITS_ATI"/> >+ <enum name="GL_DUDV_ATI"/> >+ <enum name="GL_DU8DV8_ATI"/> >+ <enum name="GL_BUMP_ENVMAP_ATI"/> >+ <enum name="GL_BUMP_TARGET_ATI"/> >+ <command name="glTexBumpParameterivATI"/> >+ <command name="glTexBumpParameterfvATI"/> >+ <command name="glGetTexBumpParameterivATI"/> >+ <command name="glGetTexBumpParameterfvATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_fragment_shader" supported="gl"> >+ <require> >+ <enum name="GL_FRAGMENT_SHADER_ATI"/> >+ <enum name="GL_REG_0_ATI"/> >+ <enum name="GL_REG_1_ATI"/> >+ <enum name="GL_REG_2_ATI"/> >+ <enum name="GL_REG_3_ATI"/> >+ <enum name="GL_REG_4_ATI"/> >+ <enum name="GL_REG_5_ATI"/> >+ <enum name="GL_REG_6_ATI"/> >+ <enum name="GL_REG_7_ATI"/> >+ <enum name="GL_REG_8_ATI"/> >+ <enum name="GL_REG_9_ATI"/> >+ <enum name="GL_REG_10_ATI"/> >+ <enum name="GL_REG_11_ATI"/> >+ <enum name="GL_REG_12_ATI"/> >+ <enum name="GL_REG_13_ATI"/> >+ <enum name="GL_REG_14_ATI"/> >+ <enum name="GL_REG_15_ATI"/> >+ <enum name="GL_REG_16_ATI"/> >+ <enum name="GL_REG_17_ATI"/> >+ <enum name="GL_REG_18_ATI"/> >+ <enum name="GL_REG_19_ATI"/> >+ <enum name="GL_REG_20_ATI"/> >+ <enum name="GL_REG_21_ATI"/> >+ <enum name="GL_REG_22_ATI"/> >+ <enum name="GL_REG_23_ATI"/> >+ <enum name="GL_REG_24_ATI"/> >+ <enum name="GL_REG_25_ATI"/> >+ <enum name="GL_REG_26_ATI"/> >+ <enum name="GL_REG_27_ATI"/> >+ <enum name="GL_REG_28_ATI"/> >+ <enum name="GL_REG_29_ATI"/> >+ <enum name="GL_REG_30_ATI"/> >+ <enum name="GL_REG_31_ATI"/> >+ <enum name="GL_CON_0_ATI"/> >+ <enum name="GL_CON_1_ATI"/> >+ <enum name="GL_CON_2_ATI"/> >+ <enum name="GL_CON_3_ATI"/> >+ <enum name="GL_CON_4_ATI"/> >+ <enum name="GL_CON_5_ATI"/> >+ <enum name="GL_CON_6_ATI"/> >+ <enum name="GL_CON_7_ATI"/> >+ <enum name="GL_CON_8_ATI"/> >+ <enum name="GL_CON_9_ATI"/> >+ <enum name="GL_CON_10_ATI"/> >+ <enum name="GL_CON_11_ATI"/> >+ <enum name="GL_CON_12_ATI"/> >+ <enum name="GL_CON_13_ATI"/> >+ <enum name="GL_CON_14_ATI"/> >+ <enum name="GL_CON_15_ATI"/> >+ <enum name="GL_CON_16_ATI"/> >+ <enum name="GL_CON_17_ATI"/> >+ <enum name="GL_CON_18_ATI"/> >+ <enum name="GL_CON_19_ATI"/> >+ <enum name="GL_CON_20_ATI"/> >+ <enum name="GL_CON_21_ATI"/> >+ <enum name="GL_CON_22_ATI"/> >+ <enum name="GL_CON_23_ATI"/> >+ <enum name="GL_CON_24_ATI"/> >+ <enum name="GL_CON_25_ATI"/> >+ <enum name="GL_CON_26_ATI"/> >+ <enum name="GL_CON_27_ATI"/> >+ <enum name="GL_CON_28_ATI"/> >+ <enum name="GL_CON_29_ATI"/> >+ <enum name="GL_CON_30_ATI"/> >+ <enum name="GL_CON_31_ATI"/> >+ <enum name="GL_MOV_ATI"/> >+ <enum name="GL_ADD_ATI"/> >+ <enum name="GL_MUL_ATI"/> >+ <enum name="GL_SUB_ATI"/> >+ <enum name="GL_DOT3_ATI"/> >+ <enum name="GL_DOT4_ATI"/> >+ <enum name="GL_MAD_ATI"/> >+ <enum name="GL_LERP_ATI"/> >+ <enum name="GL_CND_ATI"/> >+ <enum name="GL_CND0_ATI"/> >+ <enum name="GL_DOT2_ADD_ATI"/> >+ <enum name="GL_SECONDARY_INTERPOLATOR_ATI"/> >+ <enum name="GL_NUM_FRAGMENT_REGISTERS_ATI"/> >+ <enum name="GL_NUM_FRAGMENT_CONSTANTS_ATI"/> >+ <enum name="GL_NUM_PASSES_ATI"/> >+ <enum name="GL_NUM_INSTRUCTIONS_PER_PASS_ATI"/> >+ <enum name="GL_NUM_INSTRUCTIONS_TOTAL_ATI"/> >+ <enum name="GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI"/> >+ <enum name="GL_NUM_LOOPBACK_COMPONENTS_ATI"/> >+ <enum name="GL_COLOR_ALPHA_PAIRING_ATI"/> >+ <enum name="GL_SWIZZLE_STR_ATI"/> >+ <enum name="GL_SWIZZLE_STQ_ATI"/> >+ <enum name="GL_SWIZZLE_STR_DR_ATI"/> >+ <enum name="GL_SWIZZLE_STQ_DQ_ATI"/> >+ <enum name="GL_SWIZZLE_STRQ_ATI"/> >+ <enum name="GL_SWIZZLE_STRQ_DQ_ATI"/> >+ <enum name="GL_RED_BIT_ATI"/> >+ <enum name="GL_GREEN_BIT_ATI"/> >+ <enum name="GL_BLUE_BIT_ATI"/> >+ <enum name="GL_2X_BIT_ATI"/> >+ <enum name="GL_4X_BIT_ATI"/> >+ <enum name="GL_8X_BIT_ATI"/> >+ <enum name="GL_HALF_BIT_ATI"/> >+ <enum name="GL_QUARTER_BIT_ATI"/> >+ <enum name="GL_EIGHTH_BIT_ATI"/> >+ <enum name="GL_SATURATE_BIT_ATI"/> >+ <enum name="GL_COMP_BIT_ATI"/> >+ <enum name="GL_NEGATE_BIT_ATI"/> >+ <enum name="GL_BIAS_BIT_ATI"/> >+ <command name="glGenFragmentShadersATI"/> >+ <command name="glBindFragmentShaderATI"/> >+ <command name="glDeleteFragmentShaderATI"/> >+ <command name="glBeginFragmentShaderATI"/> >+ <command name="glEndFragmentShaderATI"/> >+ <command name="glPassTexCoordATI"/> >+ <command name="glSampleMapATI"/> >+ <command name="glColorFragmentOp1ATI"/> >+ <command name="glColorFragmentOp2ATI"/> >+ <command name="glColorFragmentOp3ATI"/> >+ <command name="glAlphaFragmentOp1ATI"/> >+ <command name="glAlphaFragmentOp2ATI"/> >+ <command name="glAlphaFragmentOp3ATI"/> >+ <command name="glSetFragmentShaderConstantATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_map_object_buffer" supported="gl"> >+ <require> >+ <command name="glMapObjectBufferATI"/> >+ <command name="glUnmapObjectBufferATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_meminfo" supported="gl"> >+ <require> >+ <enum name="GL_VBO_FREE_MEMORY_ATI"/> >+ <enum name="GL_TEXTURE_FREE_MEMORY_ATI"/> >+ <enum name="GL_RENDERBUFFER_FREE_MEMORY_ATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_pixel_format_float" supported="gl" comment="WGL extension defining some associated GL enums. ATI does not export this extension."> >+ <require> >+ <enum name="GL_RGBA_FLOAT_MODE_ATI"/> >+ <enum name="GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_pn_triangles" supported="gl"> >+ <require> >+ <enum name="GL_PN_TRIANGLES_ATI"/> >+ <enum name="GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI"/> >+ <enum name="GL_PN_TRIANGLES_POINT_MODE_ATI"/> >+ <enum name="GL_PN_TRIANGLES_NORMAL_MODE_ATI"/> >+ <enum name="GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI"/> >+ <enum name="GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI"/> >+ <enum name="GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI"/> >+ <enum name="GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI"/> >+ <enum name="GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI"/> >+ <command name="glPNTrianglesiATI"/> >+ <command name="glPNTrianglesfATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_separate_stencil" supported="gl"> >+ <require> >+ <enum name="GL_STENCIL_BACK_FUNC_ATI"/> >+ <enum name="GL_STENCIL_BACK_FAIL_ATI"/> >+ <enum name="GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI"/> >+ <enum name="GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI"/> >+ <command name="glStencilOpSeparateATI"/> >+ <command name="glStencilFuncSeparateATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_text_fragment_shader" supported="gl"> >+ <require> >+ <enum name="GL_TEXT_FRAGMENT_SHADER_ATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_texture_env_combine3" supported="gl"> >+ <require> >+ <enum name="GL_MODULATE_ADD_ATI"/> >+ <enum name="GL_MODULATE_SIGNED_ADD_ATI"/> >+ <enum name="GL_MODULATE_SUBTRACT_ATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_texture_float" supported="gl"> >+ <require> >+ <enum name="GL_RGBA_FLOAT32_ATI"/> >+ <enum name="GL_RGB_FLOAT32_ATI"/> >+ <enum name="GL_ALPHA_FLOAT32_ATI"/> >+ <enum name="GL_INTENSITY_FLOAT32_ATI"/> >+ <enum name="GL_LUMINANCE_FLOAT32_ATI"/> >+ <enum name="GL_LUMINANCE_ALPHA_FLOAT32_ATI"/> >+ <enum name="GL_RGBA_FLOAT16_ATI"/> >+ <enum name="GL_RGB_FLOAT16_ATI"/> >+ <enum name="GL_ALPHA_FLOAT16_ATI"/> >+ <enum name="GL_INTENSITY_FLOAT16_ATI"/> >+ <enum name="GL_LUMINANCE_FLOAT16_ATI"/> >+ <enum name="GL_LUMINANCE_ALPHA_FLOAT16_ATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_texture_mirror_once" supported="gl"> >+ <require> >+ <enum name="GL_MIRROR_CLAMP_ATI"/> >+ <enum name="GL_MIRROR_CLAMP_TO_EDGE_ATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_vertex_array_object" supported="gl"> >+ <require> >+ <enum name="GL_STATIC_ATI"/> >+ <enum name="GL_DYNAMIC_ATI"/> >+ <enum name="GL_PRESERVE_ATI"/> >+ <enum name="GL_DISCARD_ATI"/> >+ <enum name="GL_OBJECT_BUFFER_SIZE_ATI"/> >+ <enum name="GL_OBJECT_BUFFER_USAGE_ATI"/> >+ <enum name="GL_ARRAY_OBJECT_BUFFER_ATI"/> >+ <enum name="GL_ARRAY_OBJECT_OFFSET_ATI"/> >+ <command name="glNewObjectBufferATI"/> >+ <command name="glIsObjectBufferATI"/> >+ <command name="glUpdateObjectBufferATI"/> >+ <command name="glGetObjectBufferfvATI"/> >+ <command name="glGetObjectBufferivATI"/> >+ <command name="glFreeObjectBufferATI"/> >+ <command name="glArrayObjectATI"/> >+ <command name="glGetArrayObjectfvATI"/> >+ <command name="glGetArrayObjectivATI"/> >+ <command name="glVariantArrayObjectATI"/> >+ <command name="glGetVariantArrayObjectfvATI"/> >+ <command name="glGetVariantArrayObjectivATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_vertex_attrib_array_object" supported="gl"> >+ <require> >+ <command name="glVertexAttribArrayObjectATI"/> >+ <command name="glGetVertexAttribArrayObjectfvATI"/> >+ <command name="glGetVertexAttribArrayObjectivATI"/> >+ </require> >+ </extension> >+ <extension name="GL_ATI_vertex_streams" supported="gl"> >+ <require> >+ <enum name="GL_MAX_VERTEX_STREAMS_ATI"/> >+ <enum name="GL_VERTEX_STREAM0_ATI"/> >+ <enum name="GL_VERTEX_STREAM1_ATI"/> >+ <enum name="GL_VERTEX_STREAM2_ATI"/> >+ <enum name="GL_VERTEX_STREAM3_ATI"/> >+ <enum name="GL_VERTEX_STREAM4_ATI"/> >+ <enum name="GL_VERTEX_STREAM5_ATI"/> >+ <enum name="GL_VERTEX_STREAM6_ATI"/> >+ <enum name="GL_VERTEX_STREAM7_ATI"/> >+ <enum name="GL_VERTEX_SOURCE_ATI"/> >+ <command name="glVertexStream1sATI"/> >+ <command name="glVertexStream1svATI"/> >+ <command name="glVertexStream1iATI"/> >+ <command name="glVertexStream1ivATI"/> >+ <command name="glVertexStream1fATI"/> >+ <command name="glVertexStream1fvATI"/> >+ <command name="glVertexStream1dATI"/> >+ <command name="glVertexStream1dvATI"/> >+ <command name="glVertexStream2sATI"/> >+ <command name="glVertexStream2svATI"/> >+ <command name="glVertexStream2iATI"/> >+ <command name="glVertexStream2ivATI"/> >+ <command name="glVertexStream2fATI"/> >+ <command name="glVertexStream2fvATI"/> >+ <command name="glVertexStream2dATI"/> >+ <command name="glVertexStream2dvATI"/> >+ <command name="glVertexStream3sATI"/> >+ <command name="glVertexStream3svATI"/> >+ <command name="glVertexStream3iATI"/> >+ <command name="glVertexStream3ivATI"/> >+ <command name="glVertexStream3fATI"/> >+ <command name="glVertexStream3fvATI"/> >+ <command name="glVertexStream3dATI"/> >+ <command name="glVertexStream3dvATI"/> >+ <command name="glVertexStream4sATI"/> >+ <command name="glVertexStream4svATI"/> >+ <command name="glVertexStream4iATI"/> >+ <command name="glVertexStream4ivATI"/> >+ <command name="glVertexStream4fATI"/> >+ <command name="glVertexStream4fvATI"/> >+ <command name="glVertexStream4dATI"/> >+ <command name="glVertexStream4dvATI"/> >+ <command name="glNormalStream3bATI"/> >+ <command name="glNormalStream3bvATI"/> >+ <command name="glNormalStream3sATI"/> >+ <command name="glNormalStream3svATI"/> >+ <command name="glNormalStream3iATI"/> >+ <command name="glNormalStream3ivATI"/> >+ <command name="glNormalStream3fATI"/> >+ <command name="glNormalStream3fvATI"/> >+ <command name="glNormalStream3dATI"/> >+ <command name="glNormalStream3dvATI"/> >+ <command name="glClientActiveVertexStreamATI"/> >+ <command name="glVertexBlendEnviATI"/> >+ <command name="glVertexBlendEnvfATI"/> >+ </require> >+ </extension> >+ <extension name="GL_DMP_program_binary" supported="gles2"> >+ <require> >+ <enum name="GL_SMAPHS30_PROGRAM_BINARY_DMP"/> >+ <enum name="GL_SMAPHS_PROGRAM_BINARY_DMP"/> >+ <enum name="GL_DMP_PROGRAM_BINARY_DMP"/> >+ </require> >+ </extension> >+ <extension name="GL_DMP_shader_binary" supported="gles2"> >+ <require> >+ <enum name="GL_SHADER_BINARY_DMP"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_422_pixels" supported="gl"> >+ <require> >+ <enum name="GL_422_EXT"/> >+ <enum name="GL_422_REV_EXT"/> >+ <enum name="GL_422_AVERAGE_EXT"/> >+ <enum name="GL_422_REV_AVERAGE_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_EGL_image_array" supported="gles2"> >+ </extension> >+ <extension name="GL_EXT_EGL_image_storage" supported="gl|glcore|gles2"> >+ <require> >+ <type name="GLeglImageOES"/> >+ <command name="glEGLImageTargetTexStorageEXT"/> >+ </require> >+ <require comment="Supported only if GL_EXT_direct_state_access, ARB_direct_state_access, or OpenGL 4.5 are supported"> >+ <command name="glEGLImageTargetTextureStorageEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_YUV_target" supported="gles2"> >+ <require> >+ <enum name="GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT"/> >+ <enum name="GL_TEXTURE_EXTERNAL_OES"/> >+ <enum name="GL_TEXTURE_BINDING_EXTERNAL_OES"/> >+ <enum name="GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_abgr" supported="gl"> >+ <require> >+ <enum name="GL_ABGR_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_base_instance" supported="gles2"> >+ <require> >+ <command name="glDrawArraysInstancedBaseInstanceEXT"/> >+ <command name="glDrawElementsInstancedBaseInstanceEXT"/> >+ <command name="glDrawElementsInstancedBaseVertexBaseInstanceEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_bgra" supported="gl"> >+ <require> >+ <enum name="GL_BGR_EXT"/> >+ <enum name="GL_BGRA_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_bindable_uniform" supported="gl"> >+ <require> >+ <enum name="GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT"/> >+ <enum name="GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT"/> >+ <enum name="GL_MAX_BINDABLE_UNIFORM_SIZE_EXT"/> >+ <enum name="GL_UNIFORM_BUFFER_EXT"/> >+ <enum name="GL_UNIFORM_BUFFER_BINDING_EXT"/> >+ <command name="glUniformBufferEXT"/> >+ <command name="glGetUniformBufferSizeEXT"/> >+ <command name="glGetUniformOffsetEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_blend_color" supported="gl"> >+ <require> >+ <enum name="GL_CONSTANT_COLOR_EXT"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_COLOR_EXT"/> >+ <enum name="GL_CONSTANT_ALPHA_EXT"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_ALPHA_EXT"/> >+ <enum name="GL_BLEND_COLOR_EXT"/> >+ <command name="glBlendColorEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_blend_equation_separate" supported="gl"> >+ <require> >+ <enum name="GL_BLEND_EQUATION_RGB_EXT"/> >+ <enum name="GL_BLEND_EQUATION_ALPHA_EXT"/> >+ <command name="glBlendEquationSeparateEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_blend_func_extended" supported="gles2"> >+ <require> >+ <enum name="GL_SRC1_COLOR_EXT"/> >+ <enum name="GL_SRC1_ALPHA_EXT"/> >+ <enum name="GL_ONE_MINUS_SRC1_COLOR_EXT"/> >+ <enum name="GL_ONE_MINUS_SRC1_ALPHA_EXT"/> >+ <enum name="GL_SRC_ALPHA_SATURATE_EXT"/> >+ <enum name="GL_LOCATION_INDEX_EXT"/> >+ <enum name="GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT"/> >+ <command name="glBindFragDataLocationIndexedEXT"/> >+ <command name="glBindFragDataLocationEXT"/> >+ <command name="glGetProgramResourceLocationIndexEXT"/> >+ <command name="glGetFragDataIndexEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_blend_func_separate" supported="gl"> >+ <require> >+ <enum name="GL_BLEND_DST_RGB_EXT"/> >+ <enum name="GL_BLEND_SRC_RGB_EXT"/> >+ <enum name="GL_BLEND_DST_ALPHA_EXT"/> >+ <enum name="GL_BLEND_SRC_ALPHA_EXT"/> >+ <command name="glBlendFuncSeparateEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_blend_logic_op" supported="gl"/> >+ <extension name="GL_EXT_blend_minmax" supported="gl|gles1|gles2"> >+ <require> >+ <enum name="GL_MIN_EXT"/> >+ <enum name="GL_MAX_EXT"/> >+ </require> >+ <require api="gl"> >+ <enum name="GL_FUNC_ADD_EXT"/> >+ <enum name="GL_BLEND_EQUATION_EXT"/> >+ <command name="glBlendEquationEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_blend_subtract" supported="gl"> >+ <require> >+ <enum name="GL_FUNC_SUBTRACT_EXT"/> >+ <enum name="GL_FUNC_REVERSE_SUBTRACT_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_buffer_storage" supported="gles2"> >+ <require> >+ <enum name="GL_MAP_READ_BIT"/> >+ <enum name="GL_MAP_WRITE_BIT"/> >+ <enum name="GL_MAP_PERSISTENT_BIT_EXT"/> >+ <enum name="GL_MAP_COHERENT_BIT_EXT"/> >+ <enum name="GL_DYNAMIC_STORAGE_BIT_EXT"/> >+ <enum name="GL_CLIENT_STORAGE_BIT_EXT"/> >+ <enum name="GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT"/> >+ <enum name="GL_BUFFER_IMMUTABLE_STORAGE_EXT"/> >+ <enum name="GL_BUFFER_STORAGE_FLAGS_EXT"/> >+ <command name="glBufferStorageEXT"/> >+ <!-- <command name="glNamedBufferStorageEXT"/> --> >+ </require> >+ </extension> >+ <extension name="GL_EXT_clear_texture" supported="gles2"> >+ <require> >+ <command name="glClearTexImageEXT"/> >+ <command name="glClearTexSubImageEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_clip_control" supported="gles2"> >+ <require comment="Port of GL_ARB_clip_control"> >+ <command name="glClipControlEXT"/> >+ <enum name="GL_LOWER_LEFT_EXT"/> >+ <enum name="GL_UPPER_LEFT_EXT"/> >+ <enum name="GL_NEGATIVE_ONE_TO_ONE_EXT"/> >+ <enum name="GL_ZERO_TO_ONE_EXT"/> >+ <enum name="GL_CLIP_ORIGIN_EXT"/> >+ <enum name="GL_CLIP_DEPTH_MODE_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_clip_cull_distance" supported="gles2"> >+ <require> >+ <enum name="GL_MAX_CLIP_DISTANCES_EXT"/> >+ <enum name="GL_MAX_CULL_DISTANCES_EXT"/> >+ <enum name="GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT"/> >+ <enum name="GL_CLIP_DISTANCE0_EXT"/> >+ <enum name="GL_CLIP_DISTANCE1_EXT"/> >+ <enum name="GL_CLIP_DISTANCE2_EXT"/> >+ <enum name="GL_CLIP_DISTANCE3_EXT"/> >+ <enum name="GL_CLIP_DISTANCE4_EXT"/> >+ <enum name="GL_CLIP_DISTANCE5_EXT"/> >+ <enum name="GL_CLIP_DISTANCE6_EXT"/> >+ <enum name="GL_CLIP_DISTANCE7_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_clip_volume_hint" supported="gl"> >+ <require> >+ <enum name="GL_CLIP_VOLUME_CLIPPING_HINT_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_cmyka" supported="gl"> >+ <require> >+ <enum name="GL_CMYK_EXT"/> >+ <enum name="GL_CMYKA_EXT"/> >+ <enum name="GL_PACK_CMYK_HINT_EXT"/> >+ <enum name="GL_UNPACK_CMYK_HINT_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_color_buffer_float" supported="gles2"/> >+ <extension name="GL_EXT_color_buffer_half_float" supported="gles2"> >+ <require> >+ <enum name="GL_RGBA16F_EXT"/> >+ <enum name="GL_RGB16F_EXT"/> >+ <enum name="GL_RG16F_EXT"/> >+ <enum name="GL_R16F_EXT"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT"/> >+ <enum name="GL_UNSIGNED_NORMALIZED_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_color_subtable" supported="gl"> >+ <require> >+ <command name="glColorSubTableEXT"/> >+ <command name="glCopyColorSubTableEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_compiled_vertex_array" supported="gl"> >+ <require> >+ <enum name="GL_ARRAY_ELEMENT_LOCK_FIRST_EXT"/> >+ <enum name="GL_ARRAY_ELEMENT_LOCK_COUNT_EXT"/> >+ <command name="glLockArraysEXT"/> >+ <command name="glUnlockArraysEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_conservative_depth" supported="gles2"/> >+ <extension name="GL_EXT_convolution" supported="gl"> >+ <require> >+ <enum name="GL_CONVOLUTION_1D_EXT"/> >+ <enum name="GL_CONVOLUTION_2D_EXT"/> >+ <enum name="GL_SEPARABLE_2D_EXT"/> >+ <enum name="GL_CONVOLUTION_BORDER_MODE_EXT"/> >+ <enum name="GL_CONVOLUTION_FILTER_SCALE_EXT"/> >+ <enum name="GL_CONVOLUTION_FILTER_BIAS_EXT"/> >+ <enum name="GL_REDUCE_EXT"/> >+ <enum name="GL_CONVOLUTION_FORMAT_EXT"/> >+ <enum name="GL_CONVOLUTION_WIDTH_EXT"/> >+ <enum name="GL_CONVOLUTION_HEIGHT_EXT"/> >+ <enum name="GL_MAX_CONVOLUTION_WIDTH_EXT"/> >+ <enum name="GL_MAX_CONVOLUTION_HEIGHT_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_RED_SCALE_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_GREEN_SCALE_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_BLUE_SCALE_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_ALPHA_SCALE_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_RED_BIAS_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_GREEN_BIAS_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_BLUE_BIAS_EXT"/> >+ <enum name="GL_POST_CONVOLUTION_ALPHA_BIAS_EXT"/> >+ <command name="glConvolutionFilter1DEXT"/> >+ <command name="glConvolutionFilter2DEXT"/> >+ <command name="glConvolutionParameterfEXT"/> >+ <command name="glConvolutionParameterfvEXT"/> >+ <command name="glConvolutionParameteriEXT"/> >+ <command name="glConvolutionParameterivEXT"/> >+ <command name="glCopyConvolutionFilter1DEXT"/> >+ <command name="glCopyConvolutionFilter2DEXT"/> >+ <command name="glGetConvolutionFilterEXT"/> >+ <command name="glGetConvolutionParameterfvEXT"/> >+ <command name="glGetConvolutionParameterivEXT"/> >+ <command name="glGetSeparableFilterEXT"/> >+ <command name="glSeparableFilter2DEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_coordinate_frame" supported="gl"> >+ <require> >+ <enum name="GL_TANGENT_ARRAY_EXT"/> >+ <enum name="GL_BINORMAL_ARRAY_EXT"/> >+ <enum name="GL_CURRENT_TANGENT_EXT"/> >+ <enum name="GL_CURRENT_BINORMAL_EXT"/> >+ <enum name="GL_TANGENT_ARRAY_TYPE_EXT"/> >+ <enum name="GL_TANGENT_ARRAY_STRIDE_EXT"/> >+ <enum name="GL_BINORMAL_ARRAY_TYPE_EXT"/> >+ <enum name="GL_BINORMAL_ARRAY_STRIDE_EXT"/> >+ <enum name="GL_TANGENT_ARRAY_POINTER_EXT"/> >+ <enum name="GL_BINORMAL_ARRAY_POINTER_EXT"/> >+ <enum name="GL_MAP1_TANGENT_EXT"/> >+ <enum name="GL_MAP2_TANGENT_EXT"/> >+ <enum name="GL_MAP1_BINORMAL_EXT"/> >+ <enum name="GL_MAP2_BINORMAL_EXT"/> >+ <command name="glTangent3bEXT"/> >+ <command name="glTangent3bvEXT"/> >+ <command name="glTangent3dEXT"/> >+ <command name="glTangent3dvEXT"/> >+ <command name="glTangent3fEXT"/> >+ <command name="glTangent3fvEXT"/> >+ <command name="glTangent3iEXT"/> >+ <command name="glTangent3ivEXT"/> >+ <command name="glTangent3sEXT"/> >+ <command name="glTangent3svEXT"/> >+ <command name="glBinormal3bEXT"/> >+ <command name="glBinormal3bvEXT"/> >+ <command name="glBinormal3dEXT"/> >+ <command name="glBinormal3dvEXT"/> >+ <command name="glBinormal3fEXT"/> >+ <command name="glBinormal3fvEXT"/> >+ <command name="glBinormal3iEXT"/> >+ <command name="glBinormal3ivEXT"/> >+ <command name="glBinormal3sEXT"/> >+ <command name="glBinormal3svEXT"/> >+ <command name="glTangentPointerEXT"/> >+ <command name="glBinormalPointerEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_copy_image" supported="gles2"> >+ <require> >+ <command name="glCopyImageSubDataEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_copy_texture" supported="gl"> >+ <require> >+ <command name="glCopyTexImage1DEXT"/> >+ <command name="glCopyTexImage2DEXT"/> >+ <command name="glCopyTexSubImage1DEXT"/> >+ <command name="glCopyTexSubImage2DEXT"/> >+ <command name="glCopyTexSubImage3DEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_cull_vertex" supported="gl"> >+ <require> >+ <enum name="GL_CULL_VERTEX_EXT"/> >+ <enum name="GL_CULL_VERTEX_EYE_POSITION_EXT"/> >+ <enum name="GL_CULL_VERTEX_OBJECT_POSITION_EXT"/> >+ <command name="glCullParameterdvEXT"/> >+ <command name="glCullParameterfvEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_debug_label" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_PROGRAM_PIPELINE_OBJECT_EXT"/> >+ <enum name="GL_PROGRAM_OBJECT_EXT"/> >+ <enum name="GL_SHADER_OBJECT_EXT"/> >+ <enum name="GL_BUFFER_OBJECT_EXT"/> >+ <enum name="GL_QUERY_OBJECT_EXT"/> >+ <enum name="GL_VERTEX_ARRAY_OBJECT_EXT"/> >+ <command name="glLabelObjectEXT"/> >+ <command name="glGetObjectLabelEXT"/> >+ </require> >+ <require comment="Depends on OpenGL ES 3.0"> >+ <enum name="GL_SAMPLER"/> >+ <enum name="GL_TRANSFORM_FEEDBACK"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_debug_marker" supported="gl|glcore|gles1|gles2"> >+ <require> >+ <command name="glInsertEventMarkerEXT"/> >+ <command name="glPushGroupMarkerEXT"/> >+ <command name="glPopGroupMarkerEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_depth_bounds_test" supported="gl"> >+ <require> >+ <enum name="GL_DEPTH_BOUNDS_TEST_EXT"/> >+ <enum name="GL_DEPTH_BOUNDS_EXT"/> >+ <command name="glDepthBoundsEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_direct_state_access" supported="gl|glcore" comment="DSA extension doesn't identify which interfaces are core profile and keeps getting expanded. This is in sync with revision 34, 2010/09/07"> >+ <require> >+ <enum name="GL_PROGRAM_MATRIX_EXT"/> >+ <enum name="GL_TRANSPOSE_PROGRAM_MATRIX_EXT"/> >+ <enum name="GL_PROGRAM_MATRIX_STACK_DEPTH_EXT"/> >+ </require> >+ <require comment="OpenGL 1.0: New matrix commands"> >+ <command name="glMatrixLoadfEXT"/> >+ <command name="glMatrixLoaddEXT"/> >+ <command name="glMatrixMultfEXT"/> >+ <command name="glMatrixMultdEXT"/> >+ <command name="glMatrixLoadIdentityEXT"/> >+ <command name="glMatrixRotatefEXT"/> >+ <command name="glMatrixRotatedEXT"/> >+ <command name="glMatrixScalefEXT"/> >+ <command name="glMatrixScaledEXT"/> >+ <command name="glMatrixTranslatefEXT"/> >+ <command name="glMatrixTranslatedEXT"/> >+ <command name="glMatrixFrustumEXT"/> >+ <command name="glMatrixOrthoEXT"/> >+ <command name="glMatrixPopEXT"/> >+ <command name="glMatrixPushEXT"/> >+ </require> >+ <require comment="OpenGL 1.1: New client commands"> >+ <command name="glClientAttribDefaultEXT"/> >+ <command name="glPushClientAttribDefaultEXT"/> >+ </require> >+ <require comment="OpenGL 1.1: New texture object commands"> >+ <command name="glTextureParameterfEXT"/> >+ <command name="glTextureParameterfvEXT"/> >+ <command name="glTextureParameteriEXT"/> >+ <command name="glTextureParameterivEXT"/> >+ <command name="glTextureImage1DEXT"/> >+ <command name="glTextureImage2DEXT"/> >+ <command name="glTextureSubImage1DEXT"/> >+ <command name="glTextureSubImage2DEXT"/> >+ <command name="glCopyTextureImage1DEXT"/> >+ <command name="glCopyTextureImage2DEXT"/> >+ <command name="glCopyTextureSubImage1DEXT"/> >+ <command name="glCopyTextureSubImage2DEXT"/> >+ <command name="glGetTextureImageEXT"/> >+ <command name="glGetTextureParameterfvEXT"/> >+ <command name="glGetTextureParameterivEXT"/> >+ <command name="glGetTextureLevelParameterfvEXT"/> >+ <command name="glGetTextureLevelParameterivEXT"/> >+ </require> >+ <require comment="OpenGL 1.2: New 3D texture object commands"> >+ <command name="glTextureImage3DEXT"/> >+ <command name="glTextureSubImage3DEXT"/> >+ <command name="glCopyTextureSubImage3DEXT"/> >+ </require> >+ <require comment="OpenGL 1.2.1: New multitexture commands"> >+ <command name="glBindMultiTextureEXT"/> >+ <command name="glMultiTexCoordPointerEXT"/> >+ <command name="glMultiTexEnvfEXT"/> >+ <command name="glMultiTexEnvfvEXT"/> >+ <command name="glMultiTexEnviEXT"/> >+ <command name="glMultiTexEnvivEXT"/> >+ <command name="glMultiTexGendEXT"/> >+ <command name="glMultiTexGendvEXT"/> >+ <command name="glMultiTexGenfEXT"/> >+ <command name="glMultiTexGenfvEXT"/> >+ <command name="glMultiTexGeniEXT"/> >+ <command name="glMultiTexGenivEXT"/> >+ <command name="glGetMultiTexEnvfvEXT"/> >+ <command name="glGetMultiTexEnvivEXT"/> >+ <command name="glGetMultiTexGendvEXT"/> >+ <command name="glGetMultiTexGenfvEXT"/> >+ <command name="glGetMultiTexGenivEXT"/> >+ <command name="glMultiTexParameteriEXT"/> >+ <command name="glMultiTexParameterivEXT"/> >+ <command name="glMultiTexParameterfEXT"/> >+ <command name="glMultiTexParameterfvEXT"/> >+ <command name="glMultiTexImage1DEXT"/> >+ <command name="glMultiTexImage2DEXT"/> >+ <command name="glMultiTexSubImage1DEXT"/> >+ <command name="glMultiTexSubImage2DEXT"/> >+ <command name="glCopyMultiTexImage1DEXT"/> >+ <command name="glCopyMultiTexImage2DEXT"/> >+ <command name="glCopyMultiTexSubImage1DEXT"/> >+ <command name="glCopyMultiTexSubImage2DEXT"/> >+ <command name="glGetMultiTexImageEXT"/> >+ <command name="glGetMultiTexParameterfvEXT"/> >+ <command name="glGetMultiTexParameterivEXT"/> >+ <command name="glGetMultiTexLevelParameterfvEXT"/> >+ <command name="glGetMultiTexLevelParameterivEXT"/> >+ <command name="glMultiTexImage3DEXT"/> >+ <command name="glMultiTexSubImage3DEXT"/> >+ <command name="glCopyMultiTexSubImage3DEXT"/> >+ </require> >+ <require comment="OpenGL 1.2.1: New indexed texture commands"> >+ <command name="glEnableClientStateIndexedEXT"/> >+ <command name="glDisableClientStateIndexedEXT"/> >+ </require> >+ <require comment="OpenGL 1.2.1: New indexed generic queries"> >+ <command name="glGetFloatIndexedvEXT"/> >+ <command name="glGetDoubleIndexedvEXT"/> >+ <command name="glGetPointerIndexedvEXT"/> >+ </require> >+ <require comment="OpenGL 1.2.1: Extend EXT_draw_buffers2 commands"> >+ <command name="glEnableIndexedEXT"/> >+ <command name="glDisableIndexedEXT"/> >+ <command name="glIsEnabledIndexedEXT"/> >+ <command name="glGetIntegerIndexedvEXT"/> >+ <command name="glGetBooleanIndexedvEXT"/> >+ </require> >+ <require comment="OpenGL 1.3: New compressed texture object commands"> >+ <command name="glCompressedTextureImage3DEXT"/> >+ <command name="glCompressedTextureImage2DEXT"/> >+ <command name="glCompressedTextureImage1DEXT"/> >+ <command name="glCompressedTextureSubImage3DEXT"/> >+ <command name="glCompressedTextureSubImage2DEXT"/> >+ <command name="glCompressedTextureSubImage1DEXT"/> >+ <command name="glGetCompressedTextureImageEXT"/> >+ </require> >+ <require comment="OpenGL 1.3: New multitexture compressed texture commands"> >+ <command name="glCompressedMultiTexImage3DEXT"/> >+ <command name="glCompressedMultiTexImage2DEXT"/> >+ <command name="glCompressedMultiTexImage1DEXT"/> >+ <command name="glCompressedMultiTexSubImage3DEXT"/> >+ <command name="glCompressedMultiTexSubImage2DEXT"/> >+ <command name="glCompressedMultiTexSubImage1DEXT"/> >+ <command name="glGetCompressedMultiTexImageEXT"/> >+ </require> >+ <require comment="OpenGL 1.3: New transpose matrix commands"> >+ <command name="glMatrixLoadTransposefEXT"/> >+ <command name="glMatrixLoadTransposedEXT"/> >+ <command name="glMatrixMultTransposefEXT"/> >+ <command name="glMatrixMultTransposedEXT"/> >+ </require> >+ <require comment="OpenGL 1.5: New buffer commands"> >+ <command name="glNamedBufferDataEXT"/> >+ <command name="glNamedBufferSubDataEXT"/> >+ <command name="glMapNamedBufferEXT"/> >+ <command name="glUnmapNamedBufferEXT"/> >+ <command name="glGetNamedBufferParameterivEXT"/> >+ <command name="glGetNamedBufferPointervEXT"/> >+ <command name="glGetNamedBufferSubDataEXT"/> >+ </require> >+ <require comment="OpenGL 2.0: New uniform commands"> >+ <command name="glProgramUniform1fEXT"/> >+ <command name="glProgramUniform2fEXT"/> >+ <command name="glProgramUniform3fEXT"/> >+ <command name="glProgramUniform4fEXT"/> >+ <command name="glProgramUniform1iEXT"/> >+ <command name="glProgramUniform2iEXT"/> >+ <command name="glProgramUniform3iEXT"/> >+ <command name="glProgramUniform4iEXT"/> >+ <command name="glProgramUniform1fvEXT"/> >+ <command name="glProgramUniform2fvEXT"/> >+ <command name="glProgramUniform3fvEXT"/> >+ <command name="glProgramUniform4fvEXT"/> >+ <command name="glProgramUniform1ivEXT"/> >+ <command name="glProgramUniform2ivEXT"/> >+ <command name="glProgramUniform3ivEXT"/> >+ <command name="glProgramUniform4ivEXT"/> >+ <command name="glProgramUniformMatrix2fvEXT"/> >+ <command name="glProgramUniformMatrix3fvEXT"/> >+ <command name="glProgramUniformMatrix4fvEXT"/> >+ </require> >+ <require comment="OpenGL 2.1: New uniform matrix commands"> >+ <command name="glProgramUniformMatrix2x3fvEXT"/> >+ <command name="glProgramUniformMatrix3x2fvEXT"/> >+ <command name="glProgramUniformMatrix2x4fvEXT"/> >+ <command name="glProgramUniformMatrix4x2fvEXT"/> >+ <command name="glProgramUniformMatrix3x4fvEXT"/> >+ <command name="glProgramUniformMatrix4x3fvEXT"/> >+ </require> >+ <require comment="Extend EXT_texture_buffer_object commands"> >+ <command name="glTextureBufferEXT"/> >+ <command name="glMultiTexBufferEXT"/> >+ </require> >+ <require comment="Extend EXT_texture_integer commands"> >+ <command name="glTextureParameterIivEXT"/> >+ <command name="glTextureParameterIuivEXT"/> >+ <command name="glGetTextureParameterIivEXT"/> >+ <command name="glGetTextureParameterIuivEXT"/> >+ <command name="glMultiTexParameterIivEXT"/> >+ <command name="glMultiTexParameterIuivEXT"/> >+ <command name="glGetMultiTexParameterIivEXT"/> >+ <command name="glGetMultiTexParameterIuivEXT"/> >+ </require> >+ <require comment="Extend EXT_gpu_shader4 commands"> >+ <command name="glProgramUniform1uiEXT"/> >+ <command name="glProgramUniform2uiEXT"/> >+ <command name="glProgramUniform3uiEXT"/> >+ <command name="glProgramUniform4uiEXT"/> >+ <command name="glProgramUniform1uivEXT"/> >+ <command name="glProgramUniform2uivEXT"/> >+ <command name="glProgramUniform3uivEXT"/> >+ <command name="glProgramUniform4uivEXT"/> >+ </require> >+ <require comment="Extend EXT_gpu_program_parameters commands"> >+ <command name="glNamedProgramLocalParameters4fvEXT"/> >+ </require> >+ <require comment="Extend NV_gpu_program4 commands"> >+ <command name="glNamedProgramLocalParameterI4iEXT"/> >+ <command name="glNamedProgramLocalParameterI4ivEXT"/> >+ <command name="glNamedProgramLocalParametersI4ivEXT"/> >+ <command name="glNamedProgramLocalParameterI4uiEXT"/> >+ <command name="glNamedProgramLocalParameterI4uivEXT"/> >+ <command name="glNamedProgramLocalParametersI4uivEXT"/> >+ <command name="glGetNamedProgramLocalParameterIivEXT"/> >+ <command name="glGetNamedProgramLocalParameterIuivEXT"/> >+ </require> >+ <require comment="OpenGL 3.0: New indexed texture commands"> >+ <command name="glEnableClientStateiEXT"/> >+ <command name="glDisableClientStateiEXT"/> >+ </require> >+ <require comment="OpenGL 3.0: New indexed generic queries"> >+ <command name="glGetFloati_vEXT"/> >+ <command name="glGetDoublei_vEXT"/> >+ <command name="glGetPointeri_vEXT"/> >+ </require> >+ <require comment="Extend GL_ARB_vertex_program commands"> >+ <command name="glNamedProgramStringEXT"/> >+ <command name="glNamedProgramLocalParameter4dEXT"/> >+ <command name="glNamedProgramLocalParameter4dvEXT"/> >+ <command name="glNamedProgramLocalParameter4fEXT"/> >+ <command name="glNamedProgramLocalParameter4fvEXT"/> >+ <command name="glGetNamedProgramLocalParameterdvEXT"/> >+ <command name="glGetNamedProgramLocalParameterfvEXT"/> >+ <command name="glGetNamedProgramivEXT"/> >+ <command name="glGetNamedProgramStringEXT"/> >+ </require> >+ <require comment="OpenGL 3.0: New renderbuffer commands"> >+ <command name="glNamedRenderbufferStorageEXT"/> >+ <command name="glGetNamedRenderbufferParameterivEXT"/> >+ <command name="glNamedRenderbufferStorageMultisampleEXT"/> >+ </require> >+ <require comment="Extend NV_framebuffer_multisample_coverage"> >+ <command name="glNamedRenderbufferStorageMultisampleCoverageEXT"/> >+ </require> >+ <require comment="OpenGL 3.0: New framebuffer commands"> >+ <command name="glCheckNamedFramebufferStatusEXT"/> >+ <command name="glNamedFramebufferTexture1DEXT"/> >+ <command name="glNamedFramebufferTexture2DEXT"/> >+ <command name="glNamedFramebufferTexture3DEXT"/> >+ <command name="glNamedFramebufferRenderbufferEXT"/> >+ <command name="glGetNamedFramebufferAttachmentParameterivEXT"/> >+ </require> >+ <require comment="OpenGL 3.0: New texture commands"> >+ <command name="glGenerateTextureMipmapEXT"/> >+ <command name="glGenerateMultiTexMipmapEXT"/> >+ </require> >+ <require comment="OpenGL 3.0: New framebuffer commands"> >+ <command name="glFramebufferDrawBufferEXT"/> >+ <command name="glFramebufferDrawBuffersEXT"/> >+ <command name="glFramebufferReadBufferEXT"/> >+ <command name="glGetFramebufferParameterivEXT"/> >+ </require> >+ <require comment="OpenGL 3.0: New buffer data copy command"> >+ <command name="glNamedCopyBufferSubDataEXT"/> >+ </require> >+ <require comment="Extend EXT_geometry_shader4 or NV_gpu_program4"> >+ <command name="glNamedFramebufferTextureEXT"/> >+ <command name="glNamedFramebufferTextureLayerEXT"/> >+ <command name="glNamedFramebufferTextureFaceEXT"/> >+ </require> >+ <require comment="Extend NV_explicit_multisample"> >+ <command name="glTextureRenderbufferEXT"/> >+ <command name="glMultiTexRenderbufferEXT"/> >+ </require> >+ <require comment="OpenGL 3.0: New vertex array specification commands for VAO"> >+ <command name="glVertexArrayVertexOffsetEXT"/> >+ <command name="glVertexArrayColorOffsetEXT"/> >+ <command name="glVertexArrayEdgeFlagOffsetEXT"/> >+ <command name="glVertexArrayIndexOffsetEXT"/> >+ <command name="glVertexArrayNormalOffsetEXT"/> >+ <command name="glVertexArrayTexCoordOffsetEXT"/> >+ <command name="glVertexArrayMultiTexCoordOffsetEXT"/> >+ <command name="glVertexArrayFogCoordOffsetEXT"/> >+ <command name="glVertexArraySecondaryColorOffsetEXT"/> >+ <command name="glVertexArrayVertexAttribOffsetEXT"/> >+ <command name="glVertexArrayVertexAttribIOffsetEXT"/> >+ </require> >+ <require comment="OpenGL 3.0: New vertex array enable commands for VAO"> >+ <command name="glEnableVertexArrayEXT"/> >+ <command name="glDisableVertexArrayEXT"/> >+ </require> >+ <require comment="OpenGL 3.0: New vertex attrib array enable commands for VAO"> >+ <command name="glEnableVertexArrayAttribEXT"/> >+ <command name="glDisableVertexArrayAttribEXT"/> >+ </require> >+ <require comment="OpenGL 3.0: New queries for VAO"> >+ <command name="glGetVertexArrayIntegervEXT"/> >+ <command name="glGetVertexArrayPointervEXT"/> >+ <command name="glGetVertexArrayIntegeri_vEXT"/> >+ <command name="glGetVertexArrayPointeri_vEXT"/> >+ </require> >+ <require comment="OpenGL 3.0: New buffer commands"> >+ <command name="glMapNamedBufferRangeEXT"/> >+ <command name="glFlushMappedNamedBufferRangeEXT"/> >+ </require> >+ <require comment="Extended by GL_ARB_buffer_storage"> >+ <command name="glNamedBufferStorageEXT"/> >+ </require> >+ <require comment="Extended by GL_ARB_clear_buffer_object"> >+ <command name="glClearNamedBufferDataEXT"/> >+ <command name="glClearNamedBufferSubDataEXT"/> >+ </require> >+ <require comment="Extended by GL_ARB_framebuffer_no_attachments"> >+ <command name="glNamedFramebufferParameteriEXT"/> >+ <command name="glGetNamedFramebufferParameterivEXT"/> >+ </require> >+ <require comment="Extended by GL_ARB_gpu_shader_fp64"> >+ <command name="glProgramUniform1dEXT"/> >+ <command name="glProgramUniform2dEXT"/> >+ <command name="glProgramUniform3dEXT"/> >+ <command name="glProgramUniform4dEXT"/> >+ <command name="glProgramUniform1dvEXT"/> >+ <command name="glProgramUniform2dvEXT"/> >+ <command name="glProgramUniform3dvEXT"/> >+ <command name="glProgramUniform4dvEXT"/> >+ <command name="glProgramUniformMatrix2dvEXT"/> >+ <command name="glProgramUniformMatrix3dvEXT"/> >+ <command name="glProgramUniformMatrix4dvEXT"/> >+ <command name="glProgramUniformMatrix2x3dvEXT"/> >+ <command name="glProgramUniformMatrix2x4dvEXT"/> >+ <command name="glProgramUniformMatrix3x2dvEXT"/> >+ <command name="glProgramUniformMatrix3x4dvEXT"/> >+ <command name="glProgramUniformMatrix4x2dvEXT"/> >+ <command name="glProgramUniformMatrix4x3dvEXT"/> >+ </require> >+ <require comment="Extended by GL_ARB_texture_buffer_range"> >+ <command name="glTextureBufferRangeEXT"/> >+ </require> >+ <require comment="Extended by GL_ARB_texture_storage"> >+ <command name="glTextureStorage1DEXT"/> >+ <command name="glTextureStorage2DEXT"/> >+ <command name="glTextureStorage3DEXT"/> >+ </require> >+ <require comment="Extended by GL_ARB_texture_storage_multisample"> >+ <command name="glTextureStorage2DMultisampleEXT"/> >+ <command name="glTextureStorage3DMultisampleEXT"/> >+ </require> >+ <require comment="Extended by GL_ARB_vertex_attrib_binding"> >+ <command name="glVertexArrayBindVertexBufferEXT"/> >+ <command name="glVertexArrayVertexAttribFormatEXT"/> >+ <command name="glVertexArrayVertexAttribIFormatEXT"/> >+ <command name="glVertexArrayVertexAttribLFormatEXT"/> >+ <command name="glVertexArrayVertexAttribBindingEXT"/> >+ <command name="glVertexArrayVertexBindingDivisorEXT"/> >+ </require> >+ <require comment="Extended by GL_EXT_vertex_attrib_64bit"> >+ <command name="glVertexArrayVertexAttribLOffsetEXT"/> >+ </require> >+ <require comment="Extended by GL_ARB_sparse_texture"> >+ <command name="glTexturePageCommitmentEXT"/> >+ </require> >+ <require comment="Extended by GL_ARB_instanced_arrays"> >+ <command name="glVertexArrayVertexAttribDivisorEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_discard_framebuffer" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_COLOR_EXT"/> >+ <enum name="GL_DEPTH_EXT"/> >+ <enum name="GL_STENCIL_EXT"/> >+ <command name="glDiscardFramebufferEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_disjoint_timer_query" supported="gles2"> >+ <require> >+ <enum name="GL_QUERY_COUNTER_BITS_EXT"/> >+ <enum name="GL_CURRENT_QUERY_EXT"/> >+ <enum name="GL_QUERY_RESULT_EXT"/> >+ <enum name="GL_QUERY_RESULT_AVAILABLE_EXT"/> >+ <enum name="GL_TIME_ELAPSED_EXT"/> >+ <enum name="GL_TIMESTAMP_EXT"/> >+ <enum name="GL_GPU_DISJOINT_EXT"/> >+ <command name="glGenQueriesEXT"/> >+ <command name="glDeleteQueriesEXT"/> >+ <command name="glIsQueryEXT"/> >+ <command name="glBeginQueryEXT"/> >+ <command name="glEndQueryEXT"/> >+ <command name="glQueryCounterEXT"/> >+ <command name="glGetQueryivEXT"/> >+ <command name="glGetQueryObjectivEXT"/> >+ <command name="glGetQueryObjectuivEXT"/> >+ <command name="glGetQueryObjecti64vEXT"/> >+ <command name="glGetQueryObjectui64vEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_draw_buffers" supported="gles2"> >+ <require> >+ <enum name="GL_MAX_COLOR_ATTACHMENTS_EXT"/> >+ <enum name="GL_MAX_DRAW_BUFFERS_EXT"/> >+ <enum name="GL_DRAW_BUFFER0_EXT"/> >+ <enum name="GL_DRAW_BUFFER1_EXT"/> >+ <enum name="GL_DRAW_BUFFER2_EXT"/> >+ <enum name="GL_DRAW_BUFFER3_EXT"/> >+ <enum name="GL_DRAW_BUFFER4_EXT"/> >+ <enum name="GL_DRAW_BUFFER5_EXT"/> >+ <enum name="GL_DRAW_BUFFER6_EXT"/> >+ <enum name="GL_DRAW_BUFFER7_EXT"/> >+ <enum name="GL_DRAW_BUFFER8_EXT"/> >+ <enum name="GL_DRAW_BUFFER9_EXT"/> >+ <enum name="GL_DRAW_BUFFER10_EXT"/> >+ <enum name="GL_DRAW_BUFFER11_EXT"/> >+ <enum name="GL_DRAW_BUFFER12_EXT"/> >+ <enum name="GL_DRAW_BUFFER13_EXT"/> >+ <enum name="GL_DRAW_BUFFER14_EXT"/> >+ <enum name="GL_DRAW_BUFFER15_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT0_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT1_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT2_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT3_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT4_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT5_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT6_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT7_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT8_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT9_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT10_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT11_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT12_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT13_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT14_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT15_EXT"/> >+ <command name="glDrawBuffersEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_draw_buffers2" supported="gl"> >+ <require> >+ <command name="glColorMaskIndexedEXT"/> >+ <command name="glGetBooleanIndexedvEXT"/> >+ <command name="glGetIntegerIndexedvEXT"/> >+ <command name="glEnableIndexedEXT"/> >+ <command name="glDisableIndexedEXT"/> >+ <command name="glIsEnabledIndexedEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_draw_buffers_indexed" supported="gles2"> >+ <require> >+ <enum name="GL_BLEND_EQUATION_RGB"/> >+ <enum name="GL_BLEND_EQUATION_ALPHA"/> >+ <enum name="GL_BLEND_SRC_RGB"/> >+ <enum name="GL_BLEND_SRC_ALPHA"/> >+ <enum name="GL_BLEND_DST_RGB"/> >+ <enum name="GL_BLEND_DST_ALPHA"/> >+ <enum name="GL_COLOR_WRITEMASK"/> >+ <enum name="GL_BLEND"/> >+ <enum name="GL_FUNC_ADD"/> >+ <enum name="GL_FUNC_SUBTRACT"/> >+ <enum name="GL_FUNC_REVERSE_SUBTRACT"/> >+ <enum name="GL_MIN"/> >+ <enum name="GL_MAX"/> >+ <enum name="GL_ZERO"/> >+ <enum name="GL_ONE"/> >+ <enum name="GL_SRC_COLOR"/> >+ <enum name="GL_ONE_MINUS_SRC_COLOR"/> >+ <enum name="GL_DST_COLOR"/> >+ <enum name="GL_ONE_MINUS_DST_COLOR"/> >+ <enum name="GL_SRC_ALPHA"/> >+ <enum name="GL_ONE_MINUS_SRC_ALPHA"/> >+ <enum name="GL_DST_ALPHA"/> >+ <enum name="GL_ONE_MINUS_DST_ALPHA"/> >+ <enum name="GL_CONSTANT_COLOR"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_COLOR"/> >+ <enum name="GL_CONSTANT_ALPHA"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_ALPHA"/> >+ <enum name="GL_SRC_ALPHA_SATURATE"/> >+ <command name="glEnableiEXT"/> >+ <command name="glDisableiEXT"/> >+ <command name="glBlendEquationiEXT"/> >+ <command name="glBlendEquationSeparateiEXT"/> >+ <command name="glBlendFunciEXT"/> >+ <command name="glBlendFuncSeparateiEXT"/> >+ <command name="glColorMaskiEXT"/> >+ <command name="glIsEnablediEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_draw_elements_base_vertex" supported="gles2"> >+ <require> >+ <command name="glDrawElementsBaseVertexEXT"/> >+ <command name="glDrawRangeElementsBaseVertexEXT" comment="Supported only if OpenGL ES 3.0 is supported"/> >+ <command name="glDrawElementsInstancedBaseVertexEXT" comment="Supported only if OpenGL ES 3.0 is supported"/> >+ <command name="glMultiDrawElementsBaseVertexEXT" comment="Supported only if GL_EXT_multi_draw_arrays is supported"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_draw_instanced" supported="gl|glcore|gles2"> >+ <require> >+ <command name="glDrawArraysInstancedEXT"/> >+ <command name="glDrawElementsInstancedEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_draw_range_elements" supported="gl"> >+ <require> >+ <enum name="GL_MAX_ELEMENTS_VERTICES_EXT"/> >+ <enum name="GL_MAX_ELEMENTS_INDICES_EXT"/> >+ <command name="glDrawRangeElementsEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_draw_transform_feedback" supported="gles2"> >+ <require> >+ <command name="glDrawTransformFeedbackEXT"/> >+ <command name="glDrawTransformFeedbackInstancedEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_external_buffer" supported="gl|gles2"> >+ <require> >+ <command name="glBufferStorageExternalEXT"/> >+ <command name="glNamedBufferStorageExternalEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_float_blend" supported="gles2"/> >+ <extension name="GL_EXT_fog_coord" supported="gl"> >+ <require> >+ <enum name="GL_FOG_COORDINATE_SOURCE_EXT"/> >+ <enum name="GL_FOG_COORDINATE_EXT"/> >+ <enum name="GL_FRAGMENT_DEPTH_EXT"/> >+ <enum name="GL_CURRENT_FOG_COORDINATE_EXT"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_TYPE_EXT"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_STRIDE_EXT"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_POINTER_EXT"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_EXT"/> >+ <command name="glFogCoordfEXT"/> >+ <command name="glFogCoordfvEXT"/> >+ <command name="glFogCoorddEXT"/> >+ <command name="glFogCoorddvEXT"/> >+ <command name="glFogCoordPointerEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_framebuffer_blit" supported="gl"> >+ <require> >+ <enum name="GL_READ_FRAMEBUFFER_EXT"/> >+ <enum name="GL_DRAW_FRAMEBUFFER_EXT"/> >+ <enum name="GL_DRAW_FRAMEBUFFER_BINDING_EXT"/> >+ <enum name="GL_READ_FRAMEBUFFER_BINDING_EXT"/> >+ <command name="glBlitFramebufferEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_framebuffer_multisample" supported="gl"> >+ <require> >+ <enum name="GL_RENDERBUFFER_SAMPLES_EXT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT"/> >+ <enum name="GL_MAX_SAMPLES_EXT"/> >+ <command name="glRenderbufferStorageMultisampleEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_framebuffer_multisample_blit_scaled" supported="gl"> >+ <require> >+ <enum name="GL_SCALED_RESOLVE_FASTEST_EXT"/> >+ <enum name="GL_SCALED_RESOLVE_NICEST_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_framebuffer_object" supported="gl"> >+ <require> >+ <enum name="GL_INVALID_FRAMEBUFFER_OPERATION_EXT"/> >+ <enum name="GL_MAX_RENDERBUFFER_SIZE_EXT"/> >+ <enum name="GL_FRAMEBUFFER_BINDING_EXT"/> >+ <enum name="GL_RENDERBUFFER_BINDING_EXT"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT"/> >+ <enum name="GL_FRAMEBUFFER_COMPLETE_EXT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT"/> >+ <enum name="GL_FRAMEBUFFER_UNSUPPORTED_EXT"/> >+ <enum name="GL_MAX_COLOR_ATTACHMENTS_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT0_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT1_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT2_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT3_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT4_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT5_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT6_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT7_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT8_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT9_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT10_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT11_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT12_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT13_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT14_EXT"/> >+ <enum name="GL_COLOR_ATTACHMENT15_EXT"/> >+ <enum name="GL_DEPTH_ATTACHMENT_EXT"/> >+ <enum name="GL_STENCIL_ATTACHMENT_EXT"/> >+ <enum name="GL_FRAMEBUFFER_EXT"/> >+ <enum name="GL_RENDERBUFFER_EXT"/> >+ <enum name="GL_RENDERBUFFER_WIDTH_EXT"/> >+ <enum name="GL_RENDERBUFFER_HEIGHT_EXT"/> >+ <enum name="GL_RENDERBUFFER_INTERNAL_FORMAT_EXT"/> >+ <enum name="GL_STENCIL_INDEX1_EXT"/> >+ <enum name="GL_STENCIL_INDEX4_EXT"/> >+ <enum name="GL_STENCIL_INDEX8_EXT"/> >+ <enum name="GL_STENCIL_INDEX16_EXT"/> >+ <enum name="GL_RENDERBUFFER_RED_SIZE_EXT"/> >+ <enum name="GL_RENDERBUFFER_GREEN_SIZE_EXT"/> >+ <enum name="GL_RENDERBUFFER_BLUE_SIZE_EXT"/> >+ <enum name="GL_RENDERBUFFER_ALPHA_SIZE_EXT"/> >+ <enum name="GL_RENDERBUFFER_DEPTH_SIZE_EXT"/> >+ <enum name="GL_RENDERBUFFER_STENCIL_SIZE_EXT"/> >+ <command name="glIsRenderbufferEXT"/> >+ <command name="glBindRenderbufferEXT"/> >+ <command name="glDeleteRenderbuffersEXT"/> >+ <command name="glGenRenderbuffersEXT"/> >+ <command name="glRenderbufferStorageEXT"/> >+ <command name="glGetRenderbufferParameterivEXT"/> >+ <command name="glIsFramebufferEXT"/> >+ <command name="glBindFramebufferEXT"/> >+ <command name="glDeleteFramebuffersEXT"/> >+ <command name="glGenFramebuffersEXT"/> >+ <command name="glCheckFramebufferStatusEXT"/> >+ <command name="glFramebufferTexture1DEXT"/> >+ <command name="glFramebufferTexture2DEXT"/> >+ <command name="glFramebufferTexture3DEXT"/> >+ <command name="glFramebufferRenderbufferEXT"/> >+ <command name="glGetFramebufferAttachmentParameterivEXT"/> >+ <command name="glGenerateMipmapEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_framebuffer_sRGB" supported="gl"> >+ <require> >+ <enum name="GL_FRAMEBUFFER_SRGB_EXT"/> >+ <enum name="GL_FRAMEBUFFER_SRGB_CAPABLE_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_geometry_point_size" supported="gles2"/> >+ <extension name="GL_EXT_geometry_shader" supported="gles2"> >+ <require> >+ <enum name="GL_GEOMETRY_SHADER_EXT"/> >+ <enum name="GL_GEOMETRY_SHADER_BIT_EXT"/> >+ <enum name="GL_GEOMETRY_LINKED_VERTICES_OUT_EXT"/> >+ <enum name="GL_GEOMETRY_LINKED_INPUT_TYPE_EXT"/> >+ <enum name="GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT"/> >+ <enum name="GL_GEOMETRY_SHADER_INVOCATIONS_EXT"/> >+ <enum name="GL_LAYER_PROVOKING_VERTEX_EXT"/> >+ <enum name="GL_LINES_ADJACENCY_EXT"/> >+ <enum name="GL_LINE_STRIP_ADJACENCY_EXT"/> >+ <enum name="GL_TRIANGLES_ADJACENCY_EXT"/> >+ <enum name="GL_TRIANGLE_STRIP_ADJACENCY_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT"/> >+ <enum name="GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT"/> >+ <enum name="GL_FIRST_VERTEX_CONVENTION_EXT"/> >+ <enum name="GL_LAST_VERTEX_CONVENTION_EXT"/> >+ <enum name="GL_UNDEFINED_VERTEX_EXT"/> >+ <enum name="GL_PRIMITIVES_GENERATED_EXT"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT"/> >+ <enum name="GL_MAX_FRAMEBUFFER_LAYERS_EXT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT"/> >+ <enum name="GL_REFERENCED_BY_GEOMETRY_SHADER_EXT"/> >+ <command name="glFramebufferTextureEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_geometry_shader4" supported="gl"> >+ <require> >+ <enum name="GL_GEOMETRY_SHADER_EXT"/> >+ <enum name="GL_GEOMETRY_VERTICES_OUT_EXT"/> >+ <enum name="GL_GEOMETRY_INPUT_TYPE_EXT"/> >+ <enum name="GL_GEOMETRY_OUTPUT_TYPE_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_VERTEX_VARYING_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_VARYING_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT"/> >+ <enum name="GL_LINES_ADJACENCY_EXT"/> >+ <enum name="GL_LINE_STRIP_ADJACENCY_EXT"/> >+ <enum name="GL_TRIANGLES_ADJACENCY_EXT"/> >+ <enum name="GL_TRIANGLE_STRIP_ADJACENCY_EXT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT"/> >+ <enum name="GL_PROGRAM_POINT_SIZE_EXT"/> >+ <command name="glProgramParameteriEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_gpu_program_parameters" supported="gl"> >+ <require> >+ <command name="glProgramEnvParameters4fvEXT"/> >+ <command name="glProgramLocalParameters4fvEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_gpu_shader4" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT"/> >+ <enum name="GL_SAMPLER_1D_ARRAY_EXT"/> >+ <enum name="GL_SAMPLER_2D_ARRAY_EXT"/> >+ <enum name="GL_SAMPLER_BUFFER_EXT"/> >+ <enum name="GL_SAMPLER_1D_ARRAY_SHADOW_EXT"/> >+ <enum name="GL_SAMPLER_2D_ARRAY_SHADOW_EXT"/> >+ <enum name="GL_SAMPLER_CUBE_SHADOW_EXT"/> >+ <enum name="GL_UNSIGNED_INT_VEC2_EXT"/> >+ <enum name="GL_UNSIGNED_INT_VEC3_EXT"/> >+ <enum name="GL_UNSIGNED_INT_VEC4_EXT"/> >+ <enum name="GL_INT_SAMPLER_1D_EXT"/> >+ <enum name="GL_INT_SAMPLER_2D_EXT"/> >+ <enum name="GL_INT_SAMPLER_3D_EXT"/> >+ <enum name="GL_INT_SAMPLER_CUBE_EXT"/> >+ <enum name="GL_INT_SAMPLER_2D_RECT_EXT"/> >+ <enum name="GL_INT_SAMPLER_1D_ARRAY_EXT"/> >+ <enum name="GL_INT_SAMPLER_2D_ARRAY_EXT"/> >+ <enum name="GL_INT_SAMPLER_BUFFER_EXT"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_1D_EXT"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D_EXT"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_3D_EXT"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_CUBE_EXT"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT"/> >+ <enum name="GL_MIN_PROGRAM_TEXEL_OFFSET_EXT"/> >+ <enum name="GL_MAX_PROGRAM_TEXEL_OFFSET_EXT"/> >+ <command name="glGetUniformuivEXT"/> >+ <command name="glBindFragDataLocationEXT"/> >+ <command name="glGetFragDataLocationEXT"/> >+ <command name="glUniform1uiEXT"/> >+ <command name="glUniform2uiEXT"/> >+ <command name="glUniform3uiEXT"/> >+ <command name="glUniform4uiEXT"/> >+ <command name="glUniform1uivEXT"/> >+ <command name="glUniform2uivEXT"/> >+ <command name="glUniform3uivEXT"/> >+ <command name="glUniform4uivEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_gpu_shader5" supported="gles2"/> >+ <extension name="GL_EXT_histogram" supported="gl"> >+ <require> >+ <enum name="GL_HISTOGRAM_EXT"/> >+ <enum name="GL_PROXY_HISTOGRAM_EXT"/> >+ <enum name="GL_HISTOGRAM_WIDTH_EXT"/> >+ <enum name="GL_HISTOGRAM_FORMAT_EXT"/> >+ <enum name="GL_HISTOGRAM_RED_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_GREEN_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_BLUE_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_ALPHA_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_LUMINANCE_SIZE_EXT"/> >+ <enum name="GL_HISTOGRAM_SINK_EXT"/> >+ <enum name="GL_MINMAX_EXT"/> >+ <enum name="GL_MINMAX_FORMAT_EXT"/> >+ <enum name="GL_MINMAX_SINK_EXT"/> >+ <enum name="GL_TABLE_TOO_LARGE_EXT"/> >+ <command name="glGetHistogramEXT"/> >+ <command name="glGetHistogramParameterfvEXT"/> >+ <command name="glGetHistogramParameterivEXT"/> >+ <command name="glGetMinmaxEXT"/> >+ <command name="glGetMinmaxParameterfvEXT"/> >+ <command name="glGetMinmaxParameterivEXT"/> >+ <command name="glHistogramEXT"/> >+ <command name="glMinmaxEXT"/> >+ <command name="glResetHistogramEXT"/> >+ <command name="glResetMinmaxEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_index_array_formats" supported="gl"> >+ <require> >+ <enum name="GL_IUI_V2F_EXT"/> >+ <enum name="GL_IUI_V3F_EXT"/> >+ <enum name="GL_IUI_N3F_V2F_EXT"/> >+ <enum name="GL_IUI_N3F_V3F_EXT"/> >+ <enum name="GL_T2F_IUI_V2F_EXT"/> >+ <enum name="GL_T2F_IUI_V3F_EXT"/> >+ <enum name="GL_T2F_IUI_N3F_V2F_EXT"/> >+ <enum name="GL_T2F_IUI_N3F_V3F_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_index_func" supported="gl"> >+ <require> >+ <enum name="GL_INDEX_TEST_EXT"/> >+ <enum name="GL_INDEX_TEST_FUNC_EXT"/> >+ <enum name="GL_INDEX_TEST_REF_EXT"/> >+ <command name="glIndexFuncEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_index_material" supported="gl"> >+ <require> >+ <enum name="GL_INDEX_MATERIAL_EXT"/> >+ <enum name="GL_INDEX_MATERIAL_PARAMETER_EXT"/> >+ <enum name="GL_INDEX_MATERIAL_FACE_EXT"/> >+ <command name="glIndexMaterialEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_index_texture" supported="gl"/> >+ <extension name="GL_EXT_instanced_arrays" supported="gles2"> >+ <require> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT"/> >+ <command name="glDrawArraysInstancedEXT"/> >+ <command name="glDrawElementsInstancedEXT"/> >+ <command name="glVertexAttribDivisorEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_light_texture" supported="gl"> >+ <require> >+ <enum name="GL_FRAGMENT_MATERIAL_EXT"/> >+ <enum name="GL_FRAGMENT_NORMAL_EXT"/> >+ <enum name="GL_FRAGMENT_COLOR_EXT"/> >+ <enum name="GL_ATTENUATION_EXT"/> >+ <enum name="GL_SHADOW_ATTENUATION_EXT"/> >+ <enum name="GL_TEXTURE_APPLICATION_MODE_EXT"/> >+ <enum name="GL_TEXTURE_LIGHT_EXT"/> >+ <enum name="GL_TEXTURE_MATERIAL_FACE_EXT"/> >+ <enum name="GL_TEXTURE_MATERIAL_PARAMETER_EXT"/> >+ <enum name="GL_FRAGMENT_DEPTH_EXT"/> >+ <command name="glApplyTextureEXT"/> >+ <command name="glTextureLightEXT"/> >+ <command name="glTextureMaterialEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_map_buffer_range" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_MAP_READ_BIT_EXT"/> >+ <enum name="GL_MAP_WRITE_BIT_EXT"/> >+ <enum name="GL_MAP_INVALIDATE_RANGE_BIT_EXT"/> >+ <enum name="GL_MAP_INVALIDATE_BUFFER_BIT_EXT"/> >+ <enum name="GL_MAP_FLUSH_EXPLICIT_BIT_EXT"/> >+ <enum name="GL_MAP_UNSYNCHRONIZED_BIT_EXT"/> >+ <command name="glMapBufferRangeEXT"/> >+ <command name="glFlushMappedBufferRangeEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_memory_object" supported="gl|gles2"> >+ <require> >+ <enum name="GL_TEXTURE_TILING_EXT"/> >+ <enum name="GL_DEDICATED_MEMORY_OBJECT_EXT"/> >+ <enum name="GL_PROTECTED_MEMORY_OBJECT_EXT"/> >+ <enum name="GL_NUM_TILING_TYPES_EXT"/> >+ <enum name="GL_TILING_TYPES_EXT"/> >+ <enum name="GL_OPTIMAL_TILING_EXT"/> >+ <enum name="GL_LINEAR_TILING_EXT"/> >+ <enum name="GL_NUM_DEVICE_UUIDS_EXT"/> >+ <enum name="GL_DEVICE_UUID_EXT"/> >+ <enum name="GL_DRIVER_UUID_EXT"/> >+ <enum name="GL_UUID_SIZE_EXT"/> >+ <command name="glGetUnsignedBytevEXT"/> >+ <command name="glGetUnsignedBytei_vEXT"/> >+ <command name="glDeleteMemoryObjectsEXT"/> >+ <command name="glIsMemoryObjectEXT"/> >+ <command name="glCreateMemoryObjectsEXT"/> >+ <command name="glMemoryObjectParameterivEXT"/> >+ <command name="glGetMemoryObjectParameterivEXT"/> >+ <command name="glTexStorageMem2DEXT"/> >+ <command name="glTexStorageMem2DMultisampleEXT"/> >+ <command name="glTexStorageMem3DEXT"/> >+ <command name="glTexStorageMem3DMultisampleEXT"/> >+ <command name="glBufferStorageMemEXT"/> >+ </require> >+ <require comment="Supported only if GL_EXT_direct_state_access is supported"> >+ <command name="glTextureStorageMem2DEXT"/> >+ <command name="glTextureStorageMem2DMultisampleEXT"/> >+ <command name="glTextureStorageMem3DEXT"/> >+ <command name="glTextureStorageMem3DMultisampleEXT"/> >+ <command name="glNamedBufferStorageMemEXT"/> >+ </require> >+ <require api="gl"> >+ <command name="glTexStorageMem1DEXT"/> >+ </require> >+ <require api="gl" comment="Supported only if GL_EXT_direct_state_access is supported"> >+ <command name="glTextureStorageMem1DEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_memory_object_fd" supported="gl|gles2"> >+ <require> >+ <enum name="GL_HANDLE_TYPE_OPAQUE_FD_EXT"/> >+ <command name="glImportMemoryFdEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_memory_object_win32" supported="gl|gles2"> >+ <require> >+ <enum name="GL_HANDLE_TYPE_OPAQUE_WIN32_EXT"/> >+ <enum name="GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT"/> >+ <enum name="GL_DEVICE_LUID_EXT"/> >+ <enum name="GL_DEVICE_NODE_MASK_EXT"/> >+ <enum name="GL_LUID_SIZE_EXT"/> >+ <enum name="GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT"/> >+ <enum name="GL_HANDLE_TYPE_D3D12_RESOURCE_EXT"/> >+ <enum name="GL_HANDLE_TYPE_D3D11_IMAGE_EXT"/> >+ <enum name="GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT"/> >+ <command name="glImportMemoryWin32HandleEXT"/> >+ <command name="glImportMemoryWin32NameEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_misc_attribute" supported="gl"/> >+ <extension name="GL_EXT_multi_draw_arrays" supported="gl|gles1|gles2"> >+ <require> >+ <command name="glMultiDrawArraysEXT"/> >+ <command name="glMultiDrawElementsEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_multi_draw_indirect" supported="gles2"> >+ <require> >+ <command name="glMultiDrawArraysIndirectEXT"/> >+ <command name="glMultiDrawElementsIndirectEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_multisample" supported="gl"> >+ <require> >+ <enum name="GL_MULTISAMPLE_EXT"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_MASK_EXT"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_ONE_EXT"/> >+ <enum name="GL_SAMPLE_MASK_EXT"/> >+ <enum name="GL_1PASS_EXT"/> >+ <enum name="GL_2PASS_0_EXT"/> >+ <enum name="GL_2PASS_1_EXT"/> >+ <enum name="GL_4PASS_0_EXT"/> >+ <enum name="GL_4PASS_1_EXT"/> >+ <enum name="GL_4PASS_2_EXT"/> >+ <enum name="GL_4PASS_3_EXT"/> >+ <enum name="GL_SAMPLE_BUFFERS_EXT"/> >+ <enum name="GL_SAMPLES_EXT"/> >+ <enum name="GL_SAMPLE_MASK_VALUE_EXT"/> >+ <enum name="GL_SAMPLE_MASK_INVERT_EXT"/> >+ <enum name="GL_SAMPLE_PATTERN_EXT"/> >+ <enum name="GL_MULTISAMPLE_BIT_EXT"/> >+ <command name="glSampleMaskEXT"/> >+ <command name="glSamplePatternEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_multisampled_compatibility" supported="gles2"> >+ <require> >+ <enum name="GL_MULTISAMPLE_EXT"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_ONE_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_multisampled_render_to_texture" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT"/> >+ <enum name="GL_RENDERBUFFER_SAMPLES_EXT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT"/> >+ <enum name="GL_MAX_SAMPLES_EXT"/> >+ <command name="glRenderbufferStorageMultisampleEXT"/> >+ <command name="glFramebufferTexture2DMultisampleEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_multiview_draw_buffers" supported="gles2"> >+ <require> >+ <enum name="GL_COLOR_ATTACHMENT_EXT"/> >+ <enum name="GL_MULTIVIEW_EXT"/> >+ <enum name="GL_DRAW_BUFFER_EXT"/> >+ <enum name="GL_READ_BUFFER_EXT"/> >+ <enum name="GL_MAX_MULTIVIEW_BUFFERS_EXT"/> >+ <command name="glReadBufferIndexedEXT"/> >+ <command name="glDrawBuffersIndexedEXT"/> >+ <command name="glGetIntegeri_vEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_occlusion_query_boolean" supported="gles2"> >+ <require> >+ <enum name="GL_ANY_SAMPLES_PASSED_EXT"/> >+ <enum name="GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT"/> >+ <enum name="GL_CURRENT_QUERY_EXT"/> >+ <enum name="GL_QUERY_RESULT_EXT"/> >+ <enum name="GL_QUERY_RESULT_AVAILABLE_EXT"/> >+ <command name="glGenQueriesEXT"/> >+ <command name="glDeleteQueriesEXT"/> >+ <command name="glIsQueryEXT"/> >+ <command name="glBeginQueryEXT"/> >+ <command name="glEndQueryEXT"/> >+ <command name="glGetQueryivEXT"/> >+ <command name="glGetQueryObjectuivEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_packed_depth_stencil" supported="gl"> >+ <require> >+ <enum name="GL_DEPTH_STENCIL_EXT"/> >+ <enum name="GL_UNSIGNED_INT_24_8_EXT"/> >+ <enum name="GL_DEPTH24_STENCIL8_EXT"/> >+ <enum name="GL_TEXTURE_STENCIL_SIZE_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_packed_float" supported="gl"> >+ <require> >+ <enum name="GL_R11F_G11F_B10F_EXT"/> >+ <enum name="GL_UNSIGNED_INT_10F_11F_11F_REV_EXT"/> >+ <enum name="GL_RGBA_SIGNED_COMPONENTS_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_packed_pixels" supported="gl"> >+ <require> >+ <enum name="GL_UNSIGNED_BYTE_3_3_2_EXT"/> >+ <enum name="GL_UNSIGNED_SHORT_4_4_4_4_EXT"/> >+ <enum name="GL_UNSIGNED_SHORT_5_5_5_1_EXT"/> >+ <enum name="GL_UNSIGNED_INT_8_8_8_8_EXT"/> >+ <enum name="GL_UNSIGNED_INT_10_10_10_2_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_paletted_texture" supported="gl"> >+ <require> >+ <enum name="GL_COLOR_INDEX1_EXT"/> >+ <enum name="GL_COLOR_INDEX2_EXT"/> >+ <enum name="GL_COLOR_INDEX4_EXT"/> >+ <enum name="GL_COLOR_INDEX8_EXT"/> >+ <enum name="GL_COLOR_INDEX12_EXT"/> >+ <enum name="GL_COLOR_INDEX16_EXT"/> >+ <enum name="GL_TEXTURE_INDEX_SIZE_EXT"/> >+ <command name="glColorTableEXT"/> >+ <command name="glGetColorTableEXT"/> >+ <command name="glGetColorTableParameterivEXT"/> >+ <command name="glGetColorTableParameterfvEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_pixel_buffer_object" supported="gl"> >+ <require> >+ <enum name="GL_PIXEL_PACK_BUFFER_EXT"/> >+ <enum name="GL_PIXEL_UNPACK_BUFFER_EXT"/> >+ <enum name="GL_PIXEL_PACK_BUFFER_BINDING_EXT"/> >+ <enum name="GL_PIXEL_UNPACK_BUFFER_BINDING_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_pixel_transform" supported="gl"> >+ <require> >+ <enum name="GL_PIXEL_TRANSFORM_2D_EXT"/> >+ <enum name="GL_PIXEL_MAG_FILTER_EXT"/> >+ <enum name="GL_PIXEL_MIN_FILTER_EXT"/> >+ <enum name="GL_PIXEL_CUBIC_WEIGHT_EXT"/> >+ <enum name="GL_CUBIC_EXT"/> >+ <enum name="GL_AVERAGE_EXT"/> >+ <enum name="GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT"/> >+ <enum name="GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT"/> >+ <enum name="GL_PIXEL_TRANSFORM_2D_MATRIX_EXT"/> >+ <command name="glPixelTransformParameteriEXT"/> >+ <command name="glPixelTransformParameterfEXT"/> >+ <command name="glPixelTransformParameterivEXT"/> >+ <command name="glPixelTransformParameterfvEXT"/> >+ <command name="glGetPixelTransformParameterivEXT"/> >+ <command name="glGetPixelTransformParameterfvEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_pixel_transform_color_table" supported="gl"/> >+ <extension name="GL_EXT_point_parameters" supported="gl"> >+ <require> >+ <enum name="GL_POINT_SIZE_MIN_EXT"/> >+ <enum name="GL_POINT_SIZE_MAX_EXT"/> >+ <enum name="GL_POINT_FADE_THRESHOLD_SIZE_EXT"/> >+ <enum name="GL_DISTANCE_ATTENUATION_EXT"/> >+ <command name="glPointParameterfEXT"/> >+ <command name="glPointParameterfvEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_polygon_offset" supported="gl"> >+ <require> >+ <enum name="GL_POLYGON_OFFSET_EXT"/> >+ <enum name="GL_POLYGON_OFFSET_FACTOR_EXT"/> >+ <enum name="GL_POLYGON_OFFSET_BIAS_EXT"/> >+ <command name="glPolygonOffsetEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_polygon_offset_clamp" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_POLYGON_OFFSET_CLAMP_EXT"/> >+ <command name="glPolygonOffsetClampEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_post_depth_coverage" supported="gl|glcore|gles2"/> >+ <extension name="GL_EXT_primitive_bounding_box" supported="gles2"> >+ <require> >+ <enum name="GL_PRIMITIVE_BOUNDING_BOX_EXT"/> >+ <command name="glPrimitiveBoundingBoxEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_protected_textures" supported="gles2"> >+ <require> >+ <enum name="GL_CONTEXT_FLAG_PROTECTED_CONTENT_BIT_EXT"/> >+ <enum name="GL_TEXTURE_PROTECTED_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_provoking_vertex" supported="gl"> >+ <require> >+ <enum name="GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT"/> >+ <enum name="GL_FIRST_VERTEX_CONVENTION_EXT"/> >+ <enum name="GL_LAST_VERTEX_CONVENTION_EXT"/> >+ <enum name="GL_PROVOKING_VERTEX_EXT"/> >+ <command name="glProvokingVertexEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_pvrtc_sRGB" supported="gles2"> >+ <require> >+ <enum name="GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_raster_multisample" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_RASTER_MULTISAMPLE_EXT"/> >+ <enum name="GL_RASTER_SAMPLES_EXT"/> >+ <enum name="GL_MAX_RASTER_SAMPLES_EXT"/> >+ <enum name="GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT"/> >+ <enum name="GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT"/> >+ <enum name="GL_EFFECTIVE_RASTER_SAMPLES_EXT"/> >+ <command name="glRasterSamplesEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_read_format_bgra" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_BGRA_EXT"/> >+ <enum name="GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT"/> >+ <enum name="GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_render_snorm" supported="gles2"> >+ <require> >+ <enum name="GL_BYTE"/> >+ <enum name="GL_SHORT"/> >+ <enum name="GL_R8_SNORM"/> >+ <enum name="GL_RG8_SNORM"/> >+ <enum name="GL_RGBA8_SNORM"/> >+ <enum name="GL_R16_SNORM_EXT"/> >+ <enum name="GL_RG16_SNORM_EXT"/> >+ <enum name="GL_RGBA16_SNORM_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_rescale_normal" supported="gl"> >+ <require> >+ <enum name="GL_RESCALE_NORMAL_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_robustness" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_NO_ERROR"/> >+ <enum name="GL_GUILTY_CONTEXT_RESET_EXT"/> >+ <enum name="GL_INNOCENT_CONTEXT_RESET_EXT"/> >+ <enum name="GL_UNKNOWN_CONTEXT_RESET_EXT"/> >+ <enum name="GL_CONTEXT_ROBUST_ACCESS_EXT"/> >+ <enum name="GL_RESET_NOTIFICATION_STRATEGY_EXT"/> >+ <enum name="GL_LOSE_CONTEXT_ON_RESET_EXT"/> >+ <enum name="GL_NO_RESET_NOTIFICATION_EXT"/> >+ <command name="glGetGraphicsResetStatusEXT"/> >+ <command name="glReadnPixelsEXT"/> >+ <command name="glGetnUniformfvEXT"/> >+ <command name="glGetnUniformivEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_semaphore" supported="gl|gles2"> >+ <require> >+ <enum name="GL_NUM_DEVICE_UUIDS_EXT"/> >+ <enum name="GL_DEVICE_UUID_EXT"/> >+ <enum name="GL_DRIVER_UUID_EXT"/> >+ <enum name="GL_UUID_SIZE_EXT"/> >+ <enum name="GL_LAYOUT_GENERAL_EXT"/> >+ <enum name="GL_LAYOUT_COLOR_ATTACHMENT_EXT"/> >+ <enum name="GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT"/> >+ <enum name="GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT"/> >+ <enum name="GL_LAYOUT_SHADER_READ_ONLY_EXT"/> >+ <enum name="GL_LAYOUT_TRANSFER_SRC_EXT"/> >+ <enum name="GL_LAYOUT_TRANSFER_DST_EXT"/> >+ <enum name="GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT"/> >+ <enum name="GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT"/> >+ <command name="glGetUnsignedBytevEXT"/> >+ <command name="glGetUnsignedBytei_vEXT"/> >+ <command name="glGenSemaphoresEXT"/> >+ <command name="glDeleteSemaphoresEXT"/> >+ <command name="glIsSemaphoreEXT"/> >+ <command name="glSemaphoreParameterui64vEXT"/> >+ <command name="glGetSemaphoreParameterui64vEXT"/> >+ <command name="glWaitSemaphoreEXT"/> >+ <command name="glSignalSemaphoreEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_semaphore_fd" supported="gl|gles2"> >+ <require> >+ <enum name="GL_HANDLE_TYPE_OPAQUE_FD_EXT"/> >+ <command name="glImportSemaphoreFdEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_semaphore_win32" supported="gl|gles2"> >+ <require> >+ <enum name="GL_HANDLE_TYPE_OPAQUE_WIN32_EXT"/> >+ <enum name="GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT"/> >+ <enum name="GL_DEVICE_LUID_EXT"/> >+ <enum name="GL_DEVICE_NODE_MASK_EXT"/> >+ <enum name="GL_LUID_SIZE_EXT"/> >+ <enum name="GL_HANDLE_TYPE_D3D12_FENCE_EXT"/> >+ <enum name="GL_D3D12_FENCE_VALUE_EXT"/> >+ <command name="glImportSemaphoreWin32HandleEXT"/> >+ <command name="glImportSemaphoreWin32NameEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_sRGB" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_SRGB_EXT"/> >+ <enum name="GL_SRGB_ALPHA_EXT"/> >+ <enum name="GL_SRGB8_ALPHA8_EXT"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_sRGB_write_control" supported="gles2"> >+ <require> >+ <enum name="GL_FRAMEBUFFER_SRGB_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_secondary_color" supported="gl"> >+ <require> >+ <enum name="GL_COLOR_SUM_EXT"/> >+ <enum name="GL_CURRENT_SECONDARY_COLOR_EXT"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_SIZE_EXT"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_TYPE_EXT"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_POINTER_EXT"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_EXT"/> >+ <command name="glSecondaryColor3bEXT"/> >+ <command name="glSecondaryColor3bvEXT"/> >+ <command name="glSecondaryColor3dEXT"/> >+ <command name="glSecondaryColor3dvEXT"/> >+ <command name="glSecondaryColor3fEXT"/> >+ <command name="glSecondaryColor3fvEXT"/> >+ <command name="glSecondaryColor3iEXT"/> >+ <command name="glSecondaryColor3ivEXT"/> >+ <command name="glSecondaryColor3sEXT"/> >+ <command name="glSecondaryColor3svEXT"/> >+ <command name="glSecondaryColor3ubEXT"/> >+ <command name="glSecondaryColor3ubvEXT"/> >+ <command name="glSecondaryColor3uiEXT"/> >+ <command name="glSecondaryColor3uivEXT"/> >+ <command name="glSecondaryColor3usEXT"/> >+ <command name="glSecondaryColor3usvEXT"/> >+ <command name="glSecondaryColorPointerEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_separate_shader_objects" supported="gl|glcore|gles2"> >+ <require api="gl" comment="The OpenGL version of this extension is completely unrelated to the OpenGL ES version"> >+ <enum name="GL_ACTIVE_PROGRAM_EXT"/> >+ <command name="glUseShaderProgramEXT"/> >+ <command name="glActiveProgramEXT"/> >+ <command name="glCreateShaderProgramEXT"/> >+ </require> >+ <require api="gles2" comment="The OpenGL ES version of this extension is completely unrelated to the OpenGL version"> >+ <enum name="GL_VERTEX_SHADER_BIT_EXT"/> >+ <enum name="GL_FRAGMENT_SHADER_BIT_EXT"/> >+ <enum name="GL_ALL_SHADER_BITS_EXT"/> >+ <enum name="GL_PROGRAM_SEPARABLE_EXT"/> >+ <enum name="GL_ACTIVE_PROGRAM_EXT"/> >+ <enum name="GL_PROGRAM_PIPELINE_BINDING_EXT"/> >+ <command name="glActiveShaderProgramEXT"/> >+ <command name="glBindProgramPipelineEXT"/> >+ <command name="glCreateShaderProgramvEXT"/> >+ <command name="glDeleteProgramPipelinesEXT"/> >+ <command name="glGenProgramPipelinesEXT"/> >+ <command name="glGetProgramPipelineInfoLogEXT"/> >+ <command name="glGetProgramPipelineivEXT"/> >+ <command name="glIsProgramPipelineEXT"/> >+ <command name="glProgramParameteriEXT"/> >+ <command name="glProgramUniform1fEXT"/> >+ <command name="glProgramUniform1fvEXT"/> >+ <command name="glProgramUniform1iEXT"/> >+ <command name="glProgramUniform1ivEXT"/> >+ <command name="glProgramUniform2fEXT"/> >+ <command name="glProgramUniform2fvEXT"/> >+ <command name="glProgramUniform2iEXT"/> >+ <command name="glProgramUniform2ivEXT"/> >+ <command name="glProgramUniform3fEXT"/> >+ <command name="glProgramUniform3fvEXT"/> >+ <command name="glProgramUniform3iEXT"/> >+ <command name="glProgramUniform3ivEXT"/> >+ <command name="glProgramUniform4fEXT"/> >+ <command name="glProgramUniform4fvEXT"/> >+ <command name="glProgramUniform4iEXT"/> >+ <command name="glProgramUniform4ivEXT"/> >+ <command name="glProgramUniformMatrix2fvEXT"/> >+ <command name="glProgramUniformMatrix3fvEXT"/> >+ <command name="glProgramUniformMatrix4fvEXT"/> >+ <command name="glUseProgramStagesEXT"/> >+ <command name="glValidateProgramPipelineEXT"/> >+ </require> >+ <require api="gles2" comment="Depends on OpenGL ES 3.0 or GL_NV_non_square_matrices"> >+ <command name="glProgramUniform1uiEXT"/> >+ <command name="glProgramUniform2uiEXT"/> >+ <command name="glProgramUniform3uiEXT"/> >+ <command name="glProgramUniform4uiEXT"/> >+ <command name="glProgramUniform1uivEXT"/> >+ <command name="glProgramUniform2uivEXT"/> >+ <command name="glProgramUniform3uivEXT"/> >+ <command name="glProgramUniform4uivEXT"/> >+ <command name="glProgramUniformMatrix4fvEXT"/> >+ <command name="glProgramUniformMatrix2x3fvEXT"/> >+ <command name="glProgramUniformMatrix3x2fvEXT"/> >+ <command name="glProgramUniformMatrix2x4fvEXT"/> >+ <command name="glProgramUniformMatrix4x2fvEXT"/> >+ <command name="glProgramUniformMatrix3x4fvEXT"/> >+ <command name="glProgramUniformMatrix4x3fvEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_separate_specular_color" supported="gl"> >+ <require> >+ <enum name="GL_LIGHT_MODEL_COLOR_CONTROL_EXT"/> >+ <enum name="GL_SINGLE_COLOR_EXT"/> >+ <enum name="GL_SEPARATE_SPECULAR_COLOR_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_shader_framebuffer_fetch" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_shader_framebuffer_fetch_non_coherent" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT"/> >+ <command name="glFramebufferFetchBarrierEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_shader_group_vote" supported="gles2"/> >+ <extension name="GL_EXT_shader_image_load_formatted" supported="gl"/> >+ <extension name="GL_EXT_shader_image_load_store" supported="gl"> >+ <require> >+ <enum name="GL_MAX_IMAGE_UNITS_EXT"/> >+ <enum name="GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT"/> >+ <enum name="GL_IMAGE_BINDING_NAME_EXT"/> >+ <enum name="GL_IMAGE_BINDING_LEVEL_EXT"/> >+ <enum name="GL_IMAGE_BINDING_LAYERED_EXT"/> >+ <enum name="GL_IMAGE_BINDING_LAYER_EXT"/> >+ <enum name="GL_IMAGE_BINDING_ACCESS_EXT"/> >+ <enum name="GL_IMAGE_1D_EXT"/> >+ <enum name="GL_IMAGE_2D_EXT"/> >+ <enum name="GL_IMAGE_3D_EXT"/> >+ <enum name="GL_IMAGE_2D_RECT_EXT"/> >+ <enum name="GL_IMAGE_CUBE_EXT"/> >+ <enum name="GL_IMAGE_BUFFER_EXT"/> >+ <enum name="GL_IMAGE_1D_ARRAY_EXT"/> >+ <enum name="GL_IMAGE_2D_ARRAY_EXT"/> >+ <enum name="GL_IMAGE_CUBE_MAP_ARRAY_EXT"/> >+ <enum name="GL_IMAGE_2D_MULTISAMPLE_EXT"/> >+ <enum name="GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT"/> >+ <enum name="GL_INT_IMAGE_1D_EXT"/> >+ <enum name="GL_INT_IMAGE_2D_EXT"/> >+ <enum name="GL_INT_IMAGE_3D_EXT"/> >+ <enum name="GL_INT_IMAGE_2D_RECT_EXT"/> >+ <enum name="GL_INT_IMAGE_CUBE_EXT"/> >+ <enum name="GL_INT_IMAGE_BUFFER_EXT"/> >+ <enum name="GL_INT_IMAGE_1D_ARRAY_EXT"/> >+ <enum name="GL_INT_IMAGE_2D_ARRAY_EXT"/> >+ <enum name="GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT"/> >+ <enum name="GL_INT_IMAGE_2D_MULTISAMPLE_EXT"/> >+ <enum name="GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_1D_EXT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D_EXT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_3D_EXT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_CUBE_EXT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_BUFFER_EXT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT"/> >+ <enum name="GL_MAX_IMAGE_SAMPLES_EXT"/> >+ <enum name="GL_IMAGE_BINDING_FORMAT_EXT"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT"/> >+ <enum name="GL_ELEMENT_ARRAY_BARRIER_BIT_EXT"/> >+ <enum name="GL_UNIFORM_BARRIER_BIT_EXT"/> >+ <enum name="GL_TEXTURE_FETCH_BARRIER_BIT_EXT"/> >+ <enum name="GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT"/> >+ <enum name="GL_COMMAND_BARRIER_BIT_EXT"/> >+ <enum name="GL_PIXEL_BUFFER_BARRIER_BIT_EXT"/> >+ <enum name="GL_TEXTURE_UPDATE_BARRIER_BIT_EXT"/> >+ <enum name="GL_BUFFER_UPDATE_BARRIER_BIT_EXT"/> >+ <enum name="GL_FRAMEBUFFER_BARRIER_BIT_EXT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT"/> >+ <enum name="GL_ATOMIC_COUNTER_BARRIER_BIT_EXT"/> >+ <enum name="GL_ALL_BARRIER_BITS_EXT"/> >+ <command name="glBindImageTextureEXT"/> >+ <command name="glMemoryBarrierEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_shader_implicit_conversions" supported="gles2"/> >+ <extension name="GL_EXT_shader_integer_mix" supported="gl|glcore|gles2"/> >+ <extension name="GL_EXT_shader_io_blocks" supported="gles2"/> >+ <extension name="GL_EXT_shader_non_constant_global_initializers" supported="gles2"/> >+ <extension name="GL_EXT_shader_pixel_local_storage" supported="gles2"> >+ <require> >+ <enum name="GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT"/> >+ <enum name="GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT"/> >+ <enum name="GL_SHADER_PIXEL_LOCAL_STORAGE_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_shader_pixel_local_storage2" supported="gles2"> >+ <require> >+ <enum name="GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_FAST_SIZE_EXT"/> >+ <enum name="GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_SIZE_EXT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_INSUFFICIENT_SHADER_COMBINED_LOCAL_STORAGE_EXT"/> >+ <command name="glFramebufferPixelLocalStorageSizeEXT"/> >+ <command name="glGetFramebufferPixelLocalStorageSizeEXT"/> >+ <command name="glClearPixelLocalStorageuiEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_shader_texture_lod" supported="gles2"/> >+ <extension name="GL_EXT_shadow_funcs" supported="gl"/> >+ <extension name="GL_EXT_shadow_samplers" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_COMPARE_MODE_EXT"/> >+ <enum name="GL_TEXTURE_COMPARE_FUNC_EXT"/> >+ <enum name="GL_COMPARE_REF_TO_TEXTURE_EXT"/> >+ <enum name="GL_SAMPLER_2D_SHADOW_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_shared_texture_palette" supported="gl"> >+ <require> >+ <enum name="GL_SHARED_TEXTURE_PALETTE_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_sparse_texture" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_SPARSE_EXT"/> >+ <enum name="GL_VIRTUAL_PAGE_SIZE_INDEX_EXT"/> >+ <enum name="GL_NUM_SPARSE_LEVELS_EXT"/> >+ <enum name="GL_NUM_VIRTUAL_PAGE_SIZES_EXT"/> >+ <enum name="GL_VIRTUAL_PAGE_SIZE_X_EXT"/> >+ <enum name="GL_VIRTUAL_PAGE_SIZE_Y_EXT"/> >+ <enum name="GL_VIRTUAL_PAGE_SIZE_Z_EXT"/> >+ <enum name="GL_TEXTURE_2D"/> >+ <enum name="GL_TEXTURE_2D_ARRAY"/> >+ <enum name="GL_TEXTURE_CUBE_MAP"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_ARRAY_OES"/> >+ <enum name="GL_TEXTURE_3D"/> >+ <enum name="GL_MAX_SPARSE_TEXTURE_SIZE_EXT"/> >+ <enum name="GL_MAX_SPARSE_3D_TEXTURE_SIZE_EXT"/> >+ <enum name="GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT"/> >+ <enum name="GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT"/> >+ <command name="glTexPageCommitmentEXT"/> >+ <!-- <command name="glTexturePageCommitmentEXT"/> --> >+ </require> >+ </extension> >+ <extension name="GL_EXT_sparse_texture2" supported="gl|gles2"/> >+ <extension name="GL_EXT_stencil_clear_tag" supported="gl"> >+ <require> >+ <enum name="GL_STENCIL_TAG_BITS_EXT"/> >+ <enum name="GL_STENCIL_CLEAR_TAG_VALUE_EXT"/> >+ <command name="glStencilClearTagEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_stencil_two_side" supported="gl"> >+ <require> >+ <enum name="GL_STENCIL_TEST_TWO_SIDE_EXT"/> >+ <enum name="GL_ACTIVE_STENCIL_FACE_EXT"/> >+ <command name="glActiveStencilFaceEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_stencil_wrap" supported="gl"> >+ <require> >+ <enum name="GL_INCR_WRAP_EXT"/> >+ <enum name="GL_DECR_WRAP_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_subtexture" supported="gl"> >+ <require> >+ <command name="glTexSubImage1DEXT"/> >+ <command name="glTexSubImage2DEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_tessellation_point_size" supported="gles2"/> >+ <extension name="GL_EXT_tessellation_shader" supported="gles2"> >+ <require> >+ <enum name="GL_PATCHES_EXT"/> >+ <enum name="GL_PATCH_VERTICES_EXT"/> >+ <enum name="GL_TESS_CONTROL_OUTPUT_VERTICES_EXT"/> >+ <enum name="GL_TESS_GEN_MODE_EXT"/> >+ <enum name="GL_TESS_GEN_SPACING_EXT"/> >+ <enum name="GL_TESS_GEN_VERTEX_ORDER_EXT"/> >+ <enum name="GL_TESS_GEN_POINT_MODE_EXT"/> >+ <enum name="GL_TRIANGLES"/> >+ <enum name="GL_ISOLINES_EXT"/> >+ <enum name="GL_QUADS_EXT"/> >+ <enum name="GL_EQUAL"/> >+ <enum name="GL_FRACTIONAL_ODD_EXT"/> >+ <enum name="GL_FRACTIONAL_EVEN_EXT"/> >+ <enum name="GL_CCW"/> >+ <enum name="GL_CW"/> >+ <enum name="GL_MAX_PATCH_VERTICES_EXT"/> >+ <enum name="GL_MAX_TESS_GEN_LEVEL_EXT"/> >+ <enum name="GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT"/> >+ <enum name="GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT"/> >+ <enum name="GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_TESS_PATCH_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT"/> >+ <enum name="GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT"/> >+ <enum name="GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT"/> >+ <enum name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT"/> >+ <enum name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT"/> >+ <enum name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT"/> >+ <enum name="GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT"/> >+ <enum name="GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT"/> >+ <enum name="GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT"/> >+ <enum name="GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT"/> >+ <enum name="GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED"/> >+ <enum name="GL_IS_PER_PATCH_EXT"/> >+ <enum name="GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT"/> >+ <enum name="GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT"/> >+ <enum name="GL_TESS_CONTROL_SHADER_EXT"/> >+ <enum name="GL_TESS_EVALUATION_SHADER_EXT"/> >+ <enum name="GL_TESS_CONTROL_SHADER_BIT_EXT"/> >+ <enum name="GL_TESS_EVALUATION_SHADER_BIT_EXT"/> >+ <command name="glPatchParameteriEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture" supported="gl"> >+ <require> >+ <enum name="GL_ALPHA4_EXT"/> >+ <enum name="GL_ALPHA8_EXT"/> >+ <enum name="GL_ALPHA12_EXT"/> >+ <enum name="GL_ALPHA16_EXT"/> >+ <enum name="GL_LUMINANCE4_EXT"/> >+ <enum name="GL_LUMINANCE8_EXT"/> >+ <enum name="GL_LUMINANCE12_EXT"/> >+ <enum name="GL_LUMINANCE16_EXT"/> >+ <enum name="GL_LUMINANCE4_ALPHA4_EXT"/> >+ <enum name="GL_LUMINANCE6_ALPHA2_EXT"/> >+ <enum name="GL_LUMINANCE8_ALPHA8_EXT"/> >+ <enum name="GL_LUMINANCE12_ALPHA4_EXT"/> >+ <enum name="GL_LUMINANCE12_ALPHA12_EXT"/> >+ <enum name="GL_LUMINANCE16_ALPHA16_EXT"/> >+ <enum name="GL_INTENSITY_EXT"/> >+ <enum name="GL_INTENSITY4_EXT"/> >+ <enum name="GL_INTENSITY8_EXT"/> >+ <enum name="GL_INTENSITY12_EXT"/> >+ <enum name="GL_INTENSITY16_EXT"/> >+ <enum name="GL_RGB2_EXT"/> >+ <enum name="GL_RGB4_EXT"/> >+ <enum name="GL_RGB5_EXT"/> >+ <enum name="GL_RGB8_EXT"/> >+ <enum name="GL_RGB10_EXT"/> >+ <enum name="GL_RGB12_EXT"/> >+ <enum name="GL_RGB16_EXT"/> >+ <enum name="GL_RGBA2_EXT"/> >+ <enum name="GL_RGBA4_EXT"/> >+ <enum name="GL_RGB5_A1_EXT"/> >+ <enum name="GL_RGBA8_EXT"/> >+ <enum name="GL_RGB10_A2_EXT"/> >+ <enum name="GL_RGBA12_EXT"/> >+ <enum name="GL_RGBA16_EXT"/> >+ <enum name="GL_TEXTURE_RED_SIZE_EXT"/> >+ <enum name="GL_TEXTURE_GREEN_SIZE_EXT"/> >+ <enum name="GL_TEXTURE_BLUE_SIZE_EXT"/> >+ <enum name="GL_TEXTURE_ALPHA_SIZE_EXT"/> >+ <enum name="GL_TEXTURE_LUMINANCE_SIZE_EXT"/> >+ <enum name="GL_TEXTURE_INTENSITY_SIZE_EXT"/> >+ <enum name="GL_REPLACE_EXT"/> >+ <enum name="GL_PROXY_TEXTURE_1D_EXT"/> >+ <enum name="GL_PROXY_TEXTURE_2D_EXT"/> >+ <enum name="GL_TEXTURE_TOO_LARGE_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture3D" supported="gl"> >+ <require> >+ <enum name="GL_PACK_SKIP_IMAGES_EXT"/> >+ <enum name="GL_PACK_IMAGE_HEIGHT_EXT"/> >+ <enum name="GL_UNPACK_SKIP_IMAGES_EXT"/> >+ <enum name="GL_UNPACK_IMAGE_HEIGHT_EXT"/> >+ <enum name="GL_TEXTURE_3D_EXT"/> >+ <enum name="GL_PROXY_TEXTURE_3D_EXT"/> >+ <enum name="GL_TEXTURE_DEPTH_EXT"/> >+ <enum name="GL_TEXTURE_WRAP_R_EXT"/> >+ <enum name="GL_MAX_3D_TEXTURE_SIZE_EXT"/> >+ <command name="glTexImage3DEXT"/> >+ <command name="glTexSubImage3DEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_array" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_1D_ARRAY_EXT"/> >+ <enum name="GL_PROXY_TEXTURE_1D_ARRAY_EXT"/> >+ <enum name="GL_TEXTURE_2D_ARRAY_EXT"/> >+ <enum name="GL_PROXY_TEXTURE_2D_ARRAY_EXT"/> >+ <enum name="GL_TEXTURE_BINDING_1D_ARRAY_EXT"/> >+ <enum name="GL_TEXTURE_BINDING_2D_ARRAY_EXT"/> >+ <enum name="GL_MAX_ARRAY_TEXTURE_LAYERS_EXT"/> >+ <enum name="GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT"/> >+ <command name="glFramebufferTextureLayerEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_border_clamp" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_BORDER_COLOR_EXT"/> >+ <enum name="GL_CLAMP_TO_BORDER_EXT"/> >+ <command name="glTexParameterIivEXT"/> >+ <command name="glTexParameterIuivEXT"/> >+ <command name="glGetTexParameterIivEXT"/> >+ <command name="glGetTexParameterIuivEXT"/> >+ <command name="glSamplerParameterIivEXT"/> >+ <command name="glSamplerParameterIuivEXT"/> >+ <command name="glGetSamplerParameterIivEXT"/> >+ <command name="glGetSamplerParameterIuivEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_buffer" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_BUFFER_EXT"/> >+ <enum name="GL_TEXTURE_BUFFER_BINDING_EXT"/> >+ <enum name="GL_MAX_TEXTURE_BUFFER_SIZE_EXT"/> >+ <enum name="GL_TEXTURE_BINDING_BUFFER_EXT"/> >+ <enum name="GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT"/> >+ <enum name="GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT"/> >+ <enum name="GL_SAMPLER_BUFFER_EXT"/> >+ <enum name="GL_INT_SAMPLER_BUFFER_EXT"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT"/> >+ <enum name="GL_IMAGE_BUFFER_EXT"/> >+ <enum name="GL_INT_IMAGE_BUFFER_EXT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_BUFFER_EXT"/> >+ <enum name="GL_TEXTURE_BUFFER_OFFSET_EXT"/> >+ <enum name="GL_TEXTURE_BUFFER_SIZE_EXT"/> >+ <command name="glTexBufferEXT"/> >+ <command name="glTexBufferRangeEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_buffer_object" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_BUFFER_EXT"/> >+ <enum name="GL_MAX_TEXTURE_BUFFER_SIZE_EXT"/> >+ <enum name="GL_TEXTURE_BINDING_BUFFER_EXT"/> >+ <enum name="GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT"/> >+ <enum name="GL_TEXTURE_BUFFER_FORMAT_EXT"/> >+ <command name="glTexBufferEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_compression_astc_decode_mode" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_ASTC_DECODE_PRECISION_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_compression_bptc" supported="gles2"> >+ <require> >+ <enum name="GL_COMPRESSED_RGBA_BPTC_UNORM_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT"/> >+ <enum name="GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT"/> >+ <enum name="GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_compression_dxt1" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_COMPRESSED_RGB_S3TC_DXT1_EXT"/> >+ <enum name="GL_COMPRESSED_RGBA_S3TC_DXT1_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_compression_latc" supported="gl"> >+ <require> >+ <enum name="GL_COMPRESSED_LUMINANCE_LATC1_EXT"/> >+ <enum name="GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT"/> >+ <enum name="GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT"/> >+ <enum name="GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_compression_rgtc" supported="gl|gles2"> >+ <require> >+ <enum name="GL_COMPRESSED_RED_RGTC1_EXT"/> >+ <enum name="GL_COMPRESSED_SIGNED_RED_RGTC1_EXT"/> >+ <enum name="GL_COMPRESSED_RED_GREEN_RGTC2_EXT"/> >+ <enum name="GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_compression_s3tc" supported="gl|glcore|gles2|glsc2"> >+ <require> >+ <enum name="GL_COMPRESSED_RGB_S3TC_DXT1_EXT"/> >+ <enum name="GL_COMPRESSED_RGBA_S3TC_DXT1_EXT"/> >+ <enum name="GL_COMPRESSED_RGBA_S3TC_DXT3_EXT"/> >+ <enum name="GL_COMPRESSED_RGBA_S3TC_DXT5_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_compression_s3tc_srgb" supported="gles2"> >+ <require> >+ <enum name="GL_COMPRESSED_SRGB_S3TC_DXT1_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_cube_map" supported="gl" comment="Replaced by ARB_texture_cube_map, but was apparently shipped anyway?"> >+ <require> >+ <enum name="GL_NORMAL_MAP_EXT"/> >+ <enum name="GL_REFLECTION_MAP_EXT"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_EXT"/> >+ <enum name="GL_TEXTURE_BINDING_CUBE_MAP_EXT"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT"/> >+ <enum name="GL_PROXY_TEXTURE_CUBE_MAP_EXT"/> >+ <enum name="GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_cube_map_array" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_CUBE_MAP_ARRAY_EXT"/> >+ <enum name="GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT"/> >+ <enum name="GL_SAMPLER_CUBE_MAP_ARRAY_EXT"/> >+ <enum name="GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT"/> >+ <enum name="GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT"/> >+ <enum name="GL_IMAGE_CUBE_MAP_ARRAY_EXT"/> >+ <enum name="GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_env_add" supported="gl"/> >+ <extension name="GL_EXT_texture_env_combine" supported="gl"> >+ <require> >+ <enum name="GL_COMBINE_EXT"/> >+ <enum name="GL_COMBINE_RGB_EXT"/> >+ <enum name="GL_COMBINE_ALPHA_EXT"/> >+ <enum name="GL_RGB_SCALE_EXT"/> >+ <enum name="GL_ADD_SIGNED_EXT"/> >+ <enum name="GL_INTERPOLATE_EXT"/> >+ <enum name="GL_CONSTANT_EXT"/> >+ <enum name="GL_PRIMARY_COLOR_EXT"/> >+ <enum name="GL_PREVIOUS_EXT"/> >+ <enum name="GL_SOURCE0_RGB_EXT"/> >+ <enum name="GL_SOURCE1_RGB_EXT"/> >+ <enum name="GL_SOURCE2_RGB_EXT"/> >+ <enum name="GL_SOURCE0_ALPHA_EXT"/> >+ <enum name="GL_SOURCE1_ALPHA_EXT"/> >+ <enum name="GL_SOURCE2_ALPHA_EXT"/> >+ <enum name="GL_OPERAND0_RGB_EXT"/> >+ <enum name="GL_OPERAND1_RGB_EXT"/> >+ <enum name="GL_OPERAND2_RGB_EXT"/> >+ <enum name="GL_OPERAND0_ALPHA_EXT"/> >+ <enum name="GL_OPERAND1_ALPHA_EXT"/> >+ <enum name="GL_OPERAND2_ALPHA_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_env_dot3" supported="gl"> >+ <require> >+ <enum name="GL_DOT3_RGB_EXT"/> >+ <enum name="GL_DOT3_RGBA_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_filter_anisotropic" supported="gl|gles1|gles2"> >+ <require> >+ <enum name="GL_TEXTURE_MAX_ANISOTROPY_EXT"/> >+ <enum name="GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_filter_minmax" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_TEXTURE_REDUCTION_MODE_EXT"/> >+ <enum name="GL_WEIGHTED_AVERAGE_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_format_BGRA8888" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_BGRA_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_format_sRGB_override" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_integer" supported="gl"> >+ <require> >+ <enum name="GL_RGBA32UI_EXT"/> >+ <enum name="GL_RGB32UI_EXT"/> >+ <enum name="GL_ALPHA32UI_EXT"/> >+ <enum name="GL_INTENSITY32UI_EXT"/> >+ <enum name="GL_LUMINANCE32UI_EXT"/> >+ <enum name="GL_LUMINANCE_ALPHA32UI_EXT"/> >+ <enum name="GL_RGBA16UI_EXT"/> >+ <enum name="GL_RGB16UI_EXT"/> >+ <enum name="GL_ALPHA16UI_EXT"/> >+ <enum name="GL_INTENSITY16UI_EXT"/> >+ <enum name="GL_LUMINANCE16UI_EXT"/> >+ <enum name="GL_LUMINANCE_ALPHA16UI_EXT"/> >+ <enum name="GL_RGBA8UI_EXT"/> >+ <enum name="GL_RGB8UI_EXT"/> >+ <enum name="GL_ALPHA8UI_EXT"/> >+ <enum name="GL_INTENSITY8UI_EXT"/> >+ <enum name="GL_LUMINANCE8UI_EXT"/> >+ <enum name="GL_LUMINANCE_ALPHA8UI_EXT"/> >+ <enum name="GL_RGBA32I_EXT"/> >+ <enum name="GL_RGB32I_EXT"/> >+ <enum name="GL_ALPHA32I_EXT"/> >+ <enum name="GL_INTENSITY32I_EXT"/> >+ <enum name="GL_LUMINANCE32I_EXT"/> >+ <enum name="GL_LUMINANCE_ALPHA32I_EXT"/> >+ <enum name="GL_RGBA16I_EXT"/> >+ <enum name="GL_RGB16I_EXT"/> >+ <enum name="GL_ALPHA16I_EXT"/> >+ <enum name="GL_INTENSITY16I_EXT"/> >+ <enum name="GL_LUMINANCE16I_EXT"/> >+ <enum name="GL_LUMINANCE_ALPHA16I_EXT"/> >+ <enum name="GL_RGBA8I_EXT"/> >+ <enum name="GL_RGB8I_EXT"/> >+ <enum name="GL_ALPHA8I_EXT"/> >+ <enum name="GL_INTENSITY8I_EXT"/> >+ <enum name="GL_LUMINANCE8I_EXT"/> >+ <enum name="GL_LUMINANCE_ALPHA8I_EXT"/> >+ <enum name="GL_RED_INTEGER_EXT"/> >+ <enum name="GL_GREEN_INTEGER_EXT"/> >+ <enum name="GL_BLUE_INTEGER_EXT"/> >+ <enum name="GL_ALPHA_INTEGER_EXT"/> >+ <enum name="GL_RGB_INTEGER_EXT"/> >+ <enum name="GL_RGBA_INTEGER_EXT"/> >+ <enum name="GL_BGR_INTEGER_EXT"/> >+ <enum name="GL_BGRA_INTEGER_EXT"/> >+ <enum name="GL_LUMINANCE_INTEGER_EXT"/> >+ <enum name="GL_LUMINANCE_ALPHA_INTEGER_EXT"/> >+ <enum name="GL_RGBA_INTEGER_MODE_EXT"/> >+ <command name="glTexParameterIivEXT"/> >+ <command name="glTexParameterIuivEXT"/> >+ <command name="glGetTexParameterIivEXT"/> >+ <command name="glGetTexParameterIuivEXT"/> >+ <command name="glClearColorIiEXT"/> >+ <command name="glClearColorIuiEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_lod_bias" supported="gl|gles1"> >+ <require> >+ <enum name="GL_MAX_TEXTURE_LOD_BIAS_EXT"/> >+ <enum name="GL_TEXTURE_FILTER_CONTROL_EXT"/> >+ <enum name="GL_TEXTURE_LOD_BIAS_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_mirror_clamp" supported="gl"> >+ <require> >+ <enum name="GL_MIRROR_CLAMP_EXT"/> >+ <enum name="GL_MIRROR_CLAMP_TO_EDGE_EXT"/> >+ <enum name="GL_MIRROR_CLAMP_TO_BORDER_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_mirror_clamp_to_edge" supported="gles2"> >+ <require> >+ <enum name="GL_MIRROR_CLAMP_TO_EDGE_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_norm16" supported="gles2"> >+ <require> >+ <enum name="GL_R16_EXT"/> >+ <enum name="GL_RG16_EXT"/> >+ <enum name="GL_RGBA16_EXT"/> >+ <enum name="GL_RGB16_EXT"/> >+ <enum name="GL_R16_SNORM_EXT"/> >+ <enum name="GL_RG16_SNORM_EXT"/> >+ <enum name="GL_RGB16_SNORM_EXT"/> >+ <enum name="GL_RGBA16_SNORM_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_object" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_PRIORITY_EXT"/> >+ <enum name="GL_TEXTURE_RESIDENT_EXT"/> >+ <enum name="GL_TEXTURE_1D_BINDING_EXT"/> >+ <enum name="GL_TEXTURE_2D_BINDING_EXT"/> >+ <enum name="GL_TEXTURE_3D_BINDING_EXT"/> >+ <command name="glAreTexturesResidentEXT"/> >+ <command name="glBindTextureEXT"/> >+ <command name="glDeleteTexturesEXT"/> >+ <command name="glGenTexturesEXT"/> >+ <command name="glIsTextureEXT"/> >+ <command name="glPrioritizeTexturesEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_perturb_normal" supported="gl"> >+ <require> >+ <enum name="GL_PERTURB_EXT"/> >+ <enum name="GL_TEXTURE_NORMAL_EXT"/> >+ <command name="glTextureNormalEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_rg" supported="gles2"> >+ <require> >+ <enum name="GL_RED_EXT"/> >+ <enum name="GL_RG_EXT"/> >+ <enum name="GL_R8_EXT"/> >+ <enum name="GL_RG8_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_sRGB" supported="gl"> >+ <require> >+ <enum name="GL_SRGB_EXT"/> >+ <enum name="GL_SRGB8_EXT"/> >+ <enum name="GL_SRGB_ALPHA_EXT"/> >+ <enum name="GL_SRGB8_ALPHA8_EXT"/> >+ <enum name="GL_SLUMINANCE_ALPHA_EXT"/> >+ <enum name="GL_SLUMINANCE8_ALPHA8_EXT"/> >+ <enum name="GL_SLUMINANCE_EXT"/> >+ <enum name="GL_SLUMINANCE8_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_EXT"/> >+ <enum name="GL_COMPRESSED_SLUMINANCE_EXT"/> >+ <enum name="GL_COMPRESSED_SLUMINANCE_ALPHA_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_S3TC_DXT1_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_sRGB_R8" supported="gles2"> >+ <require> >+ <enum name="GL_SR8_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_sRGB_RG8" supported="gles2"> >+ <require> >+ <enum name="GL_SRG8_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_sRGB_decode" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_TEXTURE_SRGB_DECODE_EXT"/> >+ <enum name="GL_DECODE_EXT"/> >+ <enum name="GL_SKIP_DECODE_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_shared_exponent" supported="gl"> >+ <require> >+ <enum name="GL_RGB9_E5_EXT"/> >+ <enum name="GL_UNSIGNED_INT_5_9_9_9_REV_EXT"/> >+ <enum name="GL_TEXTURE_SHARED_SIZE_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_snorm" supported="gl"> >+ <require> >+ <enum name="GL_ALPHA_SNORM"/> >+ <enum name="GL_LUMINANCE_SNORM"/> >+ <enum name="GL_LUMINANCE_ALPHA_SNORM"/> >+ <enum name="GL_INTENSITY_SNORM"/> >+ <enum name="GL_ALPHA8_SNORM"/> >+ <enum name="GL_LUMINANCE8_SNORM"/> >+ <enum name="GL_LUMINANCE8_ALPHA8_SNORM"/> >+ <enum name="GL_INTENSITY8_SNORM"/> >+ <enum name="GL_ALPHA16_SNORM"/> >+ <enum name="GL_LUMINANCE16_SNORM"/> >+ <enum name="GL_LUMINANCE16_ALPHA16_SNORM"/> >+ <enum name="GL_INTENSITY16_SNORM"/> >+ <enum name="GL_RED_SNORM"/> >+ <enum name="GL_RG_SNORM"/> >+ <enum name="GL_RGB_SNORM"/> >+ <enum name="GL_RGBA_SNORM"/> >+ <enum name="GL_R8_SNORM"/> >+ <enum name="GL_RG8_SNORM"/> >+ <enum name="GL_RGB8_SNORM"/> >+ <enum name="GL_RGBA8_SNORM"/> >+ <enum name="GL_R16_SNORM"/> >+ <enum name="GL_RG16_SNORM"/> >+ <enum name="GL_RGB16_SNORM"/> >+ <enum name="GL_RGBA16_SNORM"/> >+ <enum name="GL_SIGNED_NORMALIZED"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_storage" supported="gles1|gles2"> >+ <require comment="Not clear all of these enums should be here for OpenGL ES. Many are only defined if other extensions also requiring them are supported"> >+ <enum name="GL_TEXTURE_IMMUTABLE_FORMAT_EXT"/> >+ <enum name="GL_ALPHA8_EXT"/> >+ <enum name="GL_LUMINANCE8_EXT"/> >+ <enum name="GL_LUMINANCE8_ALPHA8_EXT"/> >+ <enum name="GL_RGBA32F_EXT"/> >+ <enum name="GL_RGB32F_EXT"/> >+ <enum name="GL_ALPHA32F_EXT"/> >+ <enum name="GL_LUMINANCE32F_EXT"/> >+ <enum name="GL_LUMINANCE_ALPHA32F_EXT"/> >+ <enum name="GL_RGBA16F_EXT"/> >+ <enum name="GL_RGB16F_EXT"/> >+ <enum name="GL_ALPHA16F_EXT"/> >+ <enum name="GL_LUMINANCE16F_EXT"/> >+ <enum name="GL_LUMINANCE_ALPHA16F_EXT"/> >+ <enum name="GL_RGB10_A2_EXT"/> >+ <enum name="GL_RGB10_EXT"/> >+ <enum name="GL_BGRA8_EXT"/> >+ <enum name="GL_R8_EXT"/> >+ <enum name="GL_RG8_EXT"/> >+ <enum name="GL_R32F_EXT"/> >+ <enum name="GL_RG32F_EXT"/> >+ <enum name="GL_R16F_EXT"/> >+ <enum name="GL_RG16F_EXT"/> >+ <command name="glTexStorage1DEXT"/> >+ <command name="glTexStorage2DEXT"/> >+ <command name="glTexStorage3DEXT"/> >+ </require> >+ <require comment="Supported only if GL_EXT_direct_state_access is supported"> >+ <command name="glTextureStorage1DEXT"/> >+ <command name="glTextureStorage2DEXT"/> >+ <command name="glTextureStorage3DEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_swizzle" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_SWIZZLE_R_EXT"/> >+ <enum name="GL_TEXTURE_SWIZZLE_G_EXT"/> >+ <enum name="GL_TEXTURE_SWIZZLE_B_EXT"/> >+ <enum name="GL_TEXTURE_SWIZZLE_A_EXT"/> >+ <enum name="GL_TEXTURE_SWIZZLE_RGBA_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_type_2_10_10_10_REV" supported="gles2"> >+ <require> >+ <enum name="GL_UNSIGNED_INT_2_10_10_10_REV_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_texture_view" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_VIEW_MIN_LEVEL_EXT"/> >+ <enum name="GL_TEXTURE_VIEW_NUM_LEVELS_EXT"/> >+ <enum name="GL_TEXTURE_VIEW_MIN_LAYER_EXT"/> >+ <enum name="GL_TEXTURE_VIEW_NUM_LAYERS_EXT"/> >+ <enum name="GL_TEXTURE_IMMUTABLE_LEVELS"/> >+ <command name="glTextureViewEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_timer_query" supported="gl"> >+ <require> >+ <enum name="GL_TIME_ELAPSED_EXT"/> >+ <command name="glGetQueryObjecti64vEXT"/> >+ <command name="glGetQueryObjectui64vEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_transform_feedback" supported="gl"> >+ <require> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_EXT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT"/> >+ <enum name="GL_INTERLEAVED_ATTRIBS_EXT"/> >+ <enum name="GL_SEPARATE_ATTRIBS_EXT"/> >+ <enum name="GL_PRIMITIVES_GENERATED_EXT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT"/> >+ <enum name="GL_RASTERIZER_DISCARD_EXT"/> >+ <enum name="GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT"/> >+ <enum name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT"/> >+ <enum name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_VARYINGS_EXT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT"/> >+ <command name="glBeginTransformFeedbackEXT"/> >+ <command name="glEndTransformFeedbackEXT"/> >+ <command name="glBindBufferRangeEXT"/> >+ <command name="glBindBufferOffsetEXT"/> >+ <command name="glBindBufferBaseEXT"/> >+ <command name="glTransformFeedbackVaryingsEXT"/> >+ <command name="glGetTransformFeedbackVaryingEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_unpack_subimage" supported="gles2"> >+ <require> >+ <enum name="GL_UNPACK_ROW_LENGTH_EXT"/> >+ <enum name="GL_UNPACK_SKIP_ROWS_EXT"/> >+ <enum name="GL_UNPACK_SKIP_PIXELS_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_vertex_array" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_ARRAY_EXT"/> >+ <enum name="GL_NORMAL_ARRAY_EXT"/> >+ <enum name="GL_COLOR_ARRAY_EXT"/> >+ <enum name="GL_INDEX_ARRAY_EXT"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_EXT"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_EXT"/> >+ <enum name="GL_VERTEX_ARRAY_SIZE_EXT"/> >+ <enum name="GL_VERTEX_ARRAY_TYPE_EXT"/> >+ <enum name="GL_VERTEX_ARRAY_STRIDE_EXT"/> >+ <enum name="GL_VERTEX_ARRAY_COUNT_EXT"/> >+ <enum name="GL_NORMAL_ARRAY_TYPE_EXT"/> >+ <enum name="GL_NORMAL_ARRAY_STRIDE_EXT"/> >+ <enum name="GL_NORMAL_ARRAY_COUNT_EXT"/> >+ <enum name="GL_COLOR_ARRAY_SIZE_EXT"/> >+ <enum name="GL_COLOR_ARRAY_TYPE_EXT"/> >+ <enum name="GL_COLOR_ARRAY_STRIDE_EXT"/> >+ <enum name="GL_COLOR_ARRAY_COUNT_EXT"/> >+ <enum name="GL_INDEX_ARRAY_TYPE_EXT"/> >+ <enum name="GL_INDEX_ARRAY_STRIDE_EXT"/> >+ <enum name="GL_INDEX_ARRAY_COUNT_EXT"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_SIZE_EXT"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_TYPE_EXT"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_STRIDE_EXT"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_COUNT_EXT"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_STRIDE_EXT"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_COUNT_EXT"/> >+ <enum name="GL_VERTEX_ARRAY_POINTER_EXT"/> >+ <enum name="GL_NORMAL_ARRAY_POINTER_EXT"/> >+ <enum name="GL_COLOR_ARRAY_POINTER_EXT"/> >+ <enum name="GL_INDEX_ARRAY_POINTER_EXT"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_POINTER_EXT"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_POINTER_EXT"/> >+ <command name="glArrayElementEXT"/> >+ <command name="glColorPointerEXT"/> >+ <command name="glDrawArraysEXT"/> >+ <command name="glEdgeFlagPointerEXT"/> >+ <command name="glGetPointervEXT"/> >+ <command name="glIndexPointerEXT"/> >+ <command name="glNormalPointerEXT"/> >+ <command name="glTexCoordPointerEXT"/> >+ <command name="glVertexPointerEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_vertex_array_bgra" supported="gl"> >+ <require> >+ <enum name="GL_BGRA"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_vertex_attrib_64bit" supported="gl"> >+ <require> >+ <enum name="GL_DOUBLE"/> >+ <enum name="GL_DOUBLE_VEC2_EXT"/> >+ <enum name="GL_DOUBLE_VEC3_EXT"/> >+ <enum name="GL_DOUBLE_VEC4_EXT"/> >+ <enum name="GL_DOUBLE_MAT2_EXT"/> >+ <enum name="GL_DOUBLE_MAT3_EXT"/> >+ <enum name="GL_DOUBLE_MAT4_EXT"/> >+ <enum name="GL_DOUBLE_MAT2x3_EXT"/> >+ <enum name="GL_DOUBLE_MAT2x4_EXT"/> >+ <enum name="GL_DOUBLE_MAT3x2_EXT"/> >+ <enum name="GL_DOUBLE_MAT3x4_EXT"/> >+ <enum name="GL_DOUBLE_MAT4x2_EXT"/> >+ <enum name="GL_DOUBLE_MAT4x3_EXT"/> >+ <command name="glVertexAttribL1dEXT"/> >+ <command name="glVertexAttribL2dEXT"/> >+ <command name="glVertexAttribL3dEXT"/> >+ <command name="glVertexAttribL4dEXT"/> >+ <command name="glVertexAttribL1dvEXT"/> >+ <command name="glVertexAttribL2dvEXT"/> >+ <command name="glVertexAttribL3dvEXT"/> >+ <command name="glVertexAttribL4dvEXT"/> >+ <command name="glVertexAttribLPointerEXT"/> >+ <command name="glGetVertexAttribLdvEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_vertex_shader" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_SHADER_EXT"/> >+ <enum name="GL_VERTEX_SHADER_BINDING_EXT"/> >+ <enum name="GL_OP_INDEX_EXT"/> >+ <enum name="GL_OP_NEGATE_EXT"/> >+ <enum name="GL_OP_DOT3_EXT"/> >+ <enum name="GL_OP_DOT4_EXT"/> >+ <enum name="GL_OP_MUL_EXT"/> >+ <enum name="GL_OP_ADD_EXT"/> >+ <enum name="GL_OP_MADD_EXT"/> >+ <enum name="GL_OP_FRAC_EXT"/> >+ <enum name="GL_OP_MAX_EXT"/> >+ <enum name="GL_OP_MIN_EXT"/> >+ <enum name="GL_OP_SET_GE_EXT"/> >+ <enum name="GL_OP_SET_LT_EXT"/> >+ <enum name="GL_OP_CLAMP_EXT"/> >+ <enum name="GL_OP_FLOOR_EXT"/> >+ <enum name="GL_OP_ROUND_EXT"/> >+ <enum name="GL_OP_EXP_BASE_2_EXT"/> >+ <enum name="GL_OP_LOG_BASE_2_EXT"/> >+ <enum name="GL_OP_POWER_EXT"/> >+ <enum name="GL_OP_RECIP_EXT"/> >+ <enum name="GL_OP_RECIP_SQRT_EXT"/> >+ <enum name="GL_OP_SUB_EXT"/> >+ <enum name="GL_OP_CROSS_PRODUCT_EXT"/> >+ <enum name="GL_OP_MULTIPLY_MATRIX_EXT"/> >+ <enum name="GL_OP_MOV_EXT"/> >+ <enum name="GL_OUTPUT_VERTEX_EXT"/> >+ <enum name="GL_OUTPUT_COLOR0_EXT"/> >+ <enum name="GL_OUTPUT_COLOR1_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD0_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD1_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD2_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD3_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD4_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD5_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD6_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD7_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD8_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD9_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD10_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD11_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD12_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD13_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD14_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD15_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD16_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD17_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD18_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD19_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD20_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD21_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD22_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD23_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD24_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD25_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD26_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD27_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD28_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD29_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD30_EXT"/> >+ <enum name="GL_OUTPUT_TEXTURE_COORD31_EXT"/> >+ <enum name="GL_OUTPUT_FOG_EXT"/> >+ <enum name="GL_SCALAR_EXT"/> >+ <enum name="GL_VECTOR_EXT"/> >+ <enum name="GL_MATRIX_EXT"/> >+ <enum name="GL_VARIANT_EXT"/> >+ <enum name="GL_INVARIANT_EXT"/> >+ <enum name="GL_LOCAL_CONSTANT_EXT"/> >+ <enum name="GL_LOCAL_EXT"/> >+ <enum name="GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT"/> >+ <enum name="GL_MAX_VERTEX_SHADER_VARIANTS_EXT"/> >+ <enum name="GL_MAX_VERTEX_SHADER_INVARIANTS_EXT"/> >+ <enum name="GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT"/> >+ <enum name="GL_MAX_VERTEX_SHADER_LOCALS_EXT"/> >+ <enum name="GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT"/> >+ <enum name="GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT"/> >+ <enum name="GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT"/> >+ <enum name="GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT"/> >+ <enum name="GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT"/> >+ <enum name="GL_VERTEX_SHADER_INSTRUCTIONS_EXT"/> >+ <enum name="GL_VERTEX_SHADER_VARIANTS_EXT"/> >+ <enum name="GL_VERTEX_SHADER_INVARIANTS_EXT"/> >+ <enum name="GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT"/> >+ <enum name="GL_VERTEX_SHADER_LOCALS_EXT"/> >+ <enum name="GL_VERTEX_SHADER_OPTIMIZED_EXT"/> >+ <enum name="GL_X_EXT"/> >+ <enum name="GL_Y_EXT"/> >+ <enum name="GL_Z_EXT"/> >+ <enum name="GL_W_EXT"/> >+ <enum name="GL_NEGATIVE_X_EXT"/> >+ <enum name="GL_NEGATIVE_Y_EXT"/> >+ <enum name="GL_NEGATIVE_Z_EXT"/> >+ <enum name="GL_NEGATIVE_W_EXT"/> >+ <enum name="GL_ZERO_EXT"/> >+ <enum name="GL_ONE_EXT"/> >+ <enum name="GL_NEGATIVE_ONE_EXT"/> >+ <enum name="GL_NORMALIZED_RANGE_EXT"/> >+ <enum name="GL_FULL_RANGE_EXT"/> >+ <enum name="GL_CURRENT_VERTEX_EXT"/> >+ <enum name="GL_MVP_MATRIX_EXT"/> >+ <enum name="GL_VARIANT_VALUE_EXT"/> >+ <enum name="GL_VARIANT_DATATYPE_EXT"/> >+ <enum name="GL_VARIANT_ARRAY_STRIDE_EXT"/> >+ <enum name="GL_VARIANT_ARRAY_TYPE_EXT"/> >+ <enum name="GL_VARIANT_ARRAY_EXT"/> >+ <enum name="GL_VARIANT_ARRAY_POINTER_EXT"/> >+ <enum name="GL_INVARIANT_VALUE_EXT"/> >+ <enum name="GL_INVARIANT_DATATYPE_EXT"/> >+ <enum name="GL_LOCAL_CONSTANT_VALUE_EXT"/> >+ <enum name="GL_LOCAL_CONSTANT_DATATYPE_EXT"/> >+ <command name="glBeginVertexShaderEXT"/> >+ <command name="glEndVertexShaderEXT"/> >+ <command name="glBindVertexShaderEXT"/> >+ <command name="glGenVertexShadersEXT"/> >+ <command name="glDeleteVertexShaderEXT"/> >+ <command name="glShaderOp1EXT"/> >+ <command name="glShaderOp2EXT"/> >+ <command name="glShaderOp3EXT"/> >+ <command name="glSwizzleEXT"/> >+ <command name="glWriteMaskEXT"/> >+ <command name="glInsertComponentEXT"/> >+ <command name="glExtractComponentEXT"/> >+ <command name="glGenSymbolsEXT"/> >+ <command name="glSetInvariantEXT"/> >+ <command name="glSetLocalConstantEXT"/> >+ <command name="glVariantbvEXT"/> >+ <command name="glVariantsvEXT"/> >+ <command name="glVariantivEXT"/> >+ <command name="glVariantfvEXT"/> >+ <command name="glVariantdvEXT"/> >+ <command name="glVariantubvEXT"/> >+ <command name="glVariantusvEXT"/> >+ <command name="glVariantuivEXT"/> >+ <command name="glVariantPointerEXT"/> >+ <command name="glEnableVariantClientStateEXT"/> >+ <command name="glDisableVariantClientStateEXT"/> >+ <command name="glBindLightParameterEXT"/> >+ <command name="glBindMaterialParameterEXT"/> >+ <command name="glBindTexGenParameterEXT"/> >+ <command name="glBindTextureUnitParameterEXT"/> >+ <command name="glBindParameterEXT"/> >+ <command name="glIsVariantEnabledEXT"/> >+ <command name="glGetVariantBooleanvEXT"/> >+ <command name="glGetVariantIntegervEXT"/> >+ <command name="glGetVariantFloatvEXT"/> >+ <command name="glGetVariantPointervEXT"/> >+ <command name="glGetInvariantBooleanvEXT"/> >+ <command name="glGetInvariantIntegervEXT"/> >+ <command name="glGetInvariantFloatvEXT"/> >+ <command name="glGetLocalConstantBooleanvEXT"/> >+ <command name="glGetLocalConstantIntegervEXT"/> >+ <command name="glGetLocalConstantFloatvEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_vertex_weighting" supported="gl"> >+ <require> >+ <enum name="GL_MODELVIEW0_STACK_DEPTH_EXT"/> >+ <enum name="GL_MODELVIEW1_STACK_DEPTH_EXT"/> >+ <enum name="GL_MODELVIEW0_MATRIX_EXT"/> >+ <enum name="GL_MODELVIEW1_MATRIX_EXT"/> >+ <enum name="GL_VERTEX_WEIGHTING_EXT"/> >+ <enum name="GL_MODELVIEW0_EXT"/> >+ <enum name="GL_MODELVIEW1_EXT"/> >+ <enum name="GL_CURRENT_VERTEX_WEIGHT_EXT"/> >+ <enum name="GL_VERTEX_WEIGHT_ARRAY_EXT"/> >+ <enum name="GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT"/> >+ <enum name="GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT"/> >+ <enum name="GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT"/> >+ <enum name="GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT"/> >+ <command name="glVertexWeightfEXT"/> >+ <command name="glVertexWeightfvEXT"/> >+ <command name="glVertexWeightPointerEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_win32_keyed_mutex" supported="gl|gles2"> >+ <require> >+ <command name="glAcquireKeyedMutexWin32EXT"/> >+ <command name="glReleaseKeyedMutexWin32EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_window_rectangles" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_INCLUSIVE_EXT"/> >+ <enum name="GL_EXCLUSIVE_EXT"/> >+ <enum name="GL_WINDOW_RECTANGLE_EXT"/> >+ <enum name="GL_WINDOW_RECTANGLE_MODE_EXT"/> >+ <enum name="GL_MAX_WINDOW_RECTANGLES_EXT"/> >+ <enum name="GL_NUM_WINDOW_RECTANGLES_EXT"/> >+ <command name="glWindowRectanglesEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_EXT_x11_sync_object" supported="gl"> >+ <require> >+ <enum name="GL_SYNC_X11_FENCE_EXT"/> >+ <command name="glImportSyncEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_FJ_shader_binary_GCCSO" supported="gles2"> >+ <require> >+ <enum name="GL_GCCSO_SHADER_BINARY_FJ"/> >+ </require> >+ </extension> >+ <extension name="GL_GREMEDY_frame_terminator" supported="gl"> >+ <require> >+ <command name="glFrameTerminatorGREMEDY"/> >+ </require> >+ </extension> >+ <extension name="GL_GREMEDY_string_marker" supported="gl"> >+ <require> >+ <command name="glStringMarkerGREMEDY"/> >+ </require> >+ </extension> >+ <extension name="GL_HP_convolution_border_modes" supported="gl"> >+ <require> >+ <enum name="GL_IGNORE_BORDER_HP"/> >+ <enum name="GL_CONSTANT_BORDER_HP"/> >+ <enum name="GL_REPLICATE_BORDER_HP"/> >+ <enum name="GL_CONVOLUTION_BORDER_COLOR_HP"/> >+ </require> >+ </extension> >+ <extension name="GL_HP_image_transform" supported="gl"> >+ <require> >+ <enum name="GL_IMAGE_SCALE_X_HP"/> >+ <enum name="GL_IMAGE_SCALE_Y_HP"/> >+ <enum name="GL_IMAGE_TRANSLATE_X_HP"/> >+ <enum name="GL_IMAGE_TRANSLATE_Y_HP"/> >+ <enum name="GL_IMAGE_ROTATE_ANGLE_HP"/> >+ <enum name="GL_IMAGE_ROTATE_ORIGIN_X_HP"/> >+ <enum name="GL_IMAGE_ROTATE_ORIGIN_Y_HP"/> >+ <enum name="GL_IMAGE_MAG_FILTER_HP"/> >+ <enum name="GL_IMAGE_MIN_FILTER_HP"/> >+ <enum name="GL_IMAGE_CUBIC_WEIGHT_HP"/> >+ <enum name="GL_CUBIC_HP"/> >+ <enum name="GL_AVERAGE_HP"/> >+ <enum name="GL_IMAGE_TRANSFORM_2D_HP"/> >+ <enum name="GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP"/> >+ <enum name="GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP"/> >+ <command name="glImageTransformParameteriHP"/> >+ <command name="glImageTransformParameterfHP"/> >+ <command name="glImageTransformParameterivHP"/> >+ <command name="glImageTransformParameterfvHP"/> >+ <command name="glGetImageTransformParameterivHP"/> >+ <command name="glGetImageTransformParameterfvHP"/> >+ </require> >+ </extension> >+ <extension name="GL_HP_occlusion_test" supported="gl"> >+ <require> >+ <enum name="GL_OCCLUSION_TEST_HP"/> >+ <enum name="GL_OCCLUSION_TEST_RESULT_HP"/> >+ </require> >+ </extension> >+ <extension name="GL_HP_texture_lighting" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_LIGHTING_MODE_HP"/> >+ <enum name="GL_TEXTURE_POST_SPECULAR_HP"/> >+ <enum name="GL_TEXTURE_PRE_SPECULAR_HP"/> >+ </require> >+ </extension> >+ <extension name="GL_IBM_cull_vertex" supported="gl"> >+ <require> >+ <enum name="GL_CULL_VERTEX_IBM"/> >+ </require> >+ </extension> >+ <extension name="GL_IBM_multimode_draw_arrays" supported="gl"> >+ <require> >+ <command name="glMultiModeDrawArraysIBM"/> >+ <command name="glMultiModeDrawElementsIBM"/> >+ </require> >+ </extension> >+ <extension name="GL_IBM_rasterpos_clip" supported="gl"> >+ <require> >+ <enum name="GL_RASTER_POSITION_UNCLIPPED_IBM"/> >+ </require> >+ </extension> >+ <extension name="GL_IBM_static_data" supported="gl"> >+ <require> >+ <enum name="GL_ALL_STATIC_DATA_IBM"/> >+ <enum name="GL_STATIC_VERTEX_ARRAY_IBM"/> >+ <command name="glFlushStaticDataIBM"/> >+ </require> >+ </extension> >+ <extension name="GL_IBM_texture_mirrored_repeat" supported="gl"> >+ <require> >+ <enum name="GL_MIRRORED_REPEAT_IBM"/> >+ </require> >+ </extension> >+ <extension name="GL_IBM_vertex_array_lists" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_ARRAY_LIST_IBM"/> >+ <enum name="GL_NORMAL_ARRAY_LIST_IBM"/> >+ <enum name="GL_COLOR_ARRAY_LIST_IBM"/> >+ <enum name="GL_INDEX_ARRAY_LIST_IBM"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_LIST_IBM"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_LIST_IBM"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_LIST_IBM"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_LIST_IBM"/> >+ <enum name="GL_VERTEX_ARRAY_LIST_STRIDE_IBM"/> >+ <enum name="GL_NORMAL_ARRAY_LIST_STRIDE_IBM"/> >+ <enum name="GL_COLOR_ARRAY_LIST_STRIDE_IBM"/> >+ <enum name="GL_INDEX_ARRAY_LIST_STRIDE_IBM"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM"/> >+ <enum name="GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM"/> >+ <command name="glColorPointerListIBM"/> >+ <command name="glSecondaryColorPointerListIBM"/> >+ <command name="glEdgeFlagPointerListIBM"/> >+ <command name="glFogCoordPointerListIBM"/> >+ <command name="glIndexPointerListIBM"/> >+ <command name="glNormalPointerListIBM"/> >+ <command name="glTexCoordPointerListIBM"/> >+ <command name="glVertexPointerListIBM"/> >+ </require> >+ </extension> >+ <extension name="GL_IMG_bindless_texture" supported="gles2"> >+ <require> >+ <command name="glGetTextureHandleIMG"/> >+ <command name="glGetTextureSamplerHandleIMG"/> >+ <command name="glUniformHandleui64IMG"/> >+ <command name="glUniformHandleui64vIMG"/> >+ <command name="glProgramUniformHandleui64IMG"/> >+ <command name="glProgramUniformHandleui64vIMG"/> >+ </require> >+ </extension> >+ <extension name="GL_IMG_framebuffer_downsample" supported="gles2"> >+ <require> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_AND_DOWNSAMPLE_IMG"/> >+ <enum name="GL_NUM_DOWNSAMPLE_SCALES_IMG"/> >+ <enum name="GL_DOWNSAMPLE_SCALES_IMG"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SCALE_IMG"/> >+ <command name="glFramebufferTexture2DDownsampleIMG"/> >+ <command name="glFramebufferTextureLayerDownsampleIMG"/> >+ </require> >+ </extension> >+ <extension name="GL_IMG_multisampled_render_to_texture" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_RENDERBUFFER_SAMPLES_IMG"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG"/> >+ <enum name="GL_MAX_SAMPLES_IMG"/> >+ <enum name="GL_TEXTURE_SAMPLES_IMG"/> >+ <command name="glRenderbufferStorageMultisampleIMG"/> >+ <command name="glFramebufferTexture2DMultisampleIMG"/> >+ </require> >+ </extension> >+ <extension name="GL_IMG_program_binary" supported="gles2"> >+ <require> >+ <enum name="GL_SGX_PROGRAM_BINARY_IMG"/> >+ </require> >+ </extension> >+ <extension name="GL_IMG_read_format" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_BGRA_IMG"/> >+ <enum name="GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG"/> >+ </require> >+ </extension> >+ <extension name="GL_IMG_shader_binary" supported="gles2"> >+ <require> >+ <enum name="GL_SGX_BINARY_IMG"/> >+ </require> >+ </extension> >+ <extension name="GL_IMG_texture_compression_pvrtc" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG"/> >+ <enum name="GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG"/> >+ <enum name="GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG"/> >+ <enum name="GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG"/> >+ </require> >+ </extension> >+ <extension name="GL_IMG_texture_compression_pvrtc2" supported="gles2"> >+ <require> >+ <enum name="GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG"/> >+ <enum name="GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG"/> >+ </require> >+ </extension> >+ <extension name="GL_IMG_texture_env_enhanced_fixed_function" supported="gles1"> >+ <require> >+ <enum name="GL_MODULATE_COLOR_IMG"/> >+ <enum name="GL_RECIP_ADD_SIGNED_ALPHA_IMG"/> >+ <enum name="GL_TEXTURE_ALPHA_MODULATE_IMG"/> >+ <enum name="GL_FACTOR_ALPHA_MODULATE_IMG"/> >+ <enum name="GL_FRAGMENT_ALPHA_MODULATE_IMG"/> >+ <enum name="GL_ADD_BLEND_IMG"/> >+ <enum name="GL_DOT3_RGBA_IMG"/> >+ </require> >+ </extension> >+ <extension name="GL_IMG_texture_filter_cubic" supported="gles2"> >+ <require> >+ <enum name="GL_CUBIC_IMG"/> >+ <enum name="GL_CUBIC_MIPMAP_NEAREST_IMG"/> >+ <enum name="GL_CUBIC_MIPMAP_LINEAR_IMG"/> >+ </require> >+ </extension> >+ <extension name="GL_IMG_user_clip_plane" supported="gles1"> >+ <require> >+ <enum name="GL_CLIP_PLANE0_IMG"/> >+ <enum name="GL_CLIP_PLANE1_IMG"/> >+ <enum name="GL_CLIP_PLANE2_IMG"/> >+ <enum name="GL_CLIP_PLANE3_IMG"/> >+ <enum name="GL_CLIP_PLANE4_IMG"/> >+ <enum name="GL_CLIP_PLANE5_IMG"/> >+ <enum name="GL_MAX_CLIP_PLANES_IMG"/> >+ <command name="glClipPlanefIMG"/> >+ <command name="glClipPlanexIMG"/> >+ </require> >+ </extension> >+ <extension name="GL_INGR_blend_func_separate" supported="gl"> >+ <require> >+ <command name="glBlendFuncSeparateINGR"/> >+ </require> >+ </extension> >+ <extension name="GL_INGR_color_clamp" supported="gl"> >+ <require> >+ <enum name="GL_RED_MIN_CLAMP_INGR"/> >+ <enum name="GL_GREEN_MIN_CLAMP_INGR"/> >+ <enum name="GL_BLUE_MIN_CLAMP_INGR"/> >+ <enum name="GL_ALPHA_MIN_CLAMP_INGR"/> >+ <enum name="GL_RED_MAX_CLAMP_INGR"/> >+ <enum name="GL_GREEN_MAX_CLAMP_INGR"/> >+ <enum name="GL_BLUE_MAX_CLAMP_INGR"/> >+ <enum name="GL_ALPHA_MAX_CLAMP_INGR"/> >+ </require> >+ </extension> >+ <extension name="GL_INGR_interlace_read" supported="gl"> >+ <require> >+ <enum name="GL_INTERLACE_READ_INGR"/> >+ </require> >+ </extension> >+ <extension name="GL_INTEL_conservative_rasterization" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_CONSERVATIVE_RASTERIZATION_INTEL"/> >+ </require> >+ </extension> >+ <extension name="GL_INTEL_fragment_shader_ordering" supported="gl"/> >+ <extension name="GL_INTEL_framebuffer_CMAA" supported="gl|glcore|gles2"> >+ <require> >+ <command name="glApplyFramebufferAttachmentCMAAINTEL"/> >+ </require> >+ </extension> >+ <extension name="GL_INTEL_map_texture" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_MEMORY_LAYOUT_INTEL"/> >+ <enum name="GL_LAYOUT_DEFAULT_INTEL"/> >+ <enum name="GL_LAYOUT_LINEAR_INTEL"/> >+ <enum name="GL_LAYOUT_LINEAR_CPU_CACHED_INTEL"/> >+ <command name="glSyncTextureINTEL"/> >+ <command name="glUnmapTexture2DINTEL"/> >+ <command name="glMapTexture2DINTEL"/> >+ </require> >+ </extension> >+ <extension name="GL_INTEL_blackhole_render" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_BLACKHOLE_RENDER_INTEL"/> >+ </require> >+ </extension> >+ <extension name="GL_INTEL_parallel_arrays" supported="gl"> >+ <require> >+ <enum name="GL_PARALLEL_ARRAYS_INTEL"/> >+ <enum name="GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL"/> >+ <enum name="GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL"/> >+ <enum name="GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL"/> >+ <command name="glVertexPointervINTEL"/> >+ <command name="glNormalPointervINTEL"/> >+ <command name="glColorPointervINTEL"/> >+ <command name="glTexCoordPointervINTEL"/> >+ </require> >+ </extension> >+ <extension name="GL_INTEL_performance_query" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_PERFQUERY_SINGLE_CONTEXT_INTEL"/> >+ <enum name="GL_PERFQUERY_GLOBAL_CONTEXT_INTEL"/> >+ <enum name="GL_PERFQUERY_WAIT_INTEL"/> >+ <enum name="GL_PERFQUERY_FLUSH_INTEL"/> >+ <enum name="GL_PERFQUERY_DONOT_FLUSH_INTEL"/> >+ <enum name="GL_PERFQUERY_COUNTER_EVENT_INTEL"/> >+ <enum name="GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL"/> >+ <enum name="GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL"/> >+ <enum name="GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL"/> >+ <enum name="GL_PERFQUERY_COUNTER_RAW_INTEL"/> >+ <enum name="GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL"/> >+ <enum name="GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL"/> >+ <enum name="GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL"/> >+ <enum name="GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL"/> >+ <enum name="GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL"/> >+ <enum name="GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL"/> >+ <enum name="GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL"/> >+ <enum name="GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL"/> >+ <enum name="GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL"/> >+ <enum name="GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL"/> >+ <command name="glBeginPerfQueryINTEL"/> >+ <command name="glCreatePerfQueryINTEL"/> >+ <command name="glDeletePerfQueryINTEL"/> >+ <command name="glEndPerfQueryINTEL"/> >+ <command name="glGetFirstPerfQueryIdINTEL"/> >+ <command name="glGetNextPerfQueryIdINTEL"/> >+ <command name="glGetPerfCounterInfoINTEL"/> >+ <command name="glGetPerfQueryDataINTEL"/> >+ <command name="glGetPerfQueryIdByNameINTEL"/> >+ <command name="glGetPerfQueryInfoINTEL"/> >+ </require> >+ </extension> >+ <extension name="GL_KHR_blend_equation_advanced" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_MULTIPLY_KHR"/> >+ <enum name="GL_SCREEN_KHR"/> >+ <enum name="GL_OVERLAY_KHR"/> >+ <enum name="GL_DARKEN_KHR"/> >+ <enum name="GL_LIGHTEN_KHR"/> >+ <enum name="GL_COLORDODGE_KHR"/> >+ <enum name="GL_COLORBURN_KHR"/> >+ <enum name="GL_HARDLIGHT_KHR"/> >+ <enum name="GL_SOFTLIGHT_KHR"/> >+ <enum name="GL_DIFFERENCE_KHR"/> >+ <enum name="GL_EXCLUSION_KHR"/> >+ <enum name="GL_HSL_HUE_KHR"/> >+ <enum name="GL_HSL_SATURATION_KHR"/> >+ <enum name="GL_HSL_COLOR_KHR"/> >+ <enum name="GL_HSL_LUMINOSITY_KHR"/> >+ <command name="glBlendBarrierKHR"/> >+ </require> >+ </extension> >+ <extension name="GL_KHR_blend_equation_advanced_coherent" supported="gl|glcore|gles2"> >+ <require comment="Otherwise identical to GL_KHR_blend_equation_advanced, just different semantic behavior"> >+ <enum name="GL_BLEND_ADVANCED_COHERENT_KHR"/> >+ </require> >+ </extension> >+ <extension name="GL_KHR_context_flush_control" supported="gl|glcore|gles2"> >+ <require api="gl" comment="KHR extensions *mandate* suffixes for ES, unlike for GL"> >+ <enum name="GL_CONTEXT_RELEASE_BEHAVIOR"/> >+ <enum name="GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH"/> >+ <enum name="GL_NONE"/> >+ </require> >+ <require api="gles2"> >+ <enum name="GL_CONTEXT_RELEASE_BEHAVIOR_KHR"/> >+ <enum name="GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR"/> >+ <enum name="GL_NONE"/> >+ </require> >+ </extension> >+ <extension name="GL_KHR_debug" supported="gl|glcore|gles1|gles2"> >+ <require api="gl" comment="KHR extensions *mandate* suffixes for ES, unlike for GL"> >+ <enum name="GL_DEBUG_OUTPUT_SYNCHRONOUS"/> >+ <enum name="GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH"/> >+ <enum name="GL_DEBUG_CALLBACK_FUNCTION"/> >+ <enum name="GL_DEBUG_CALLBACK_USER_PARAM"/> >+ <enum name="GL_DEBUG_SOURCE_API"/> >+ <enum name="GL_DEBUG_SOURCE_WINDOW_SYSTEM"/> >+ <enum name="GL_DEBUG_SOURCE_SHADER_COMPILER"/> >+ <enum name="GL_DEBUG_SOURCE_THIRD_PARTY"/> >+ <enum name="GL_DEBUG_SOURCE_APPLICATION"/> >+ <enum name="GL_DEBUG_SOURCE_OTHER"/> >+ <enum name="GL_DEBUG_TYPE_ERROR"/> >+ <enum name="GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR"/> >+ <enum name="GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR"/> >+ <enum name="GL_DEBUG_TYPE_PORTABILITY"/> >+ <enum name="GL_DEBUG_TYPE_PERFORMANCE"/> >+ <enum name="GL_DEBUG_TYPE_OTHER"/> >+ <enum name="GL_DEBUG_TYPE_MARKER"/> >+ <enum name="GL_DEBUG_TYPE_PUSH_GROUP"/> >+ <enum name="GL_DEBUG_TYPE_POP_GROUP"/> >+ <enum name="GL_DEBUG_SEVERITY_NOTIFICATION"/> >+ <enum name="GL_MAX_DEBUG_GROUP_STACK_DEPTH"/> >+ <enum name="GL_DEBUG_GROUP_STACK_DEPTH"/> >+ <enum name="GL_BUFFER"/> >+ <enum name="GL_SHADER"/> >+ <enum name="GL_PROGRAM"/> >+ <enum name="GL_VERTEX_ARRAY"/> >+ <enum name="GL_QUERY"/> >+ <enum name="GL_PROGRAM_PIPELINE"/> >+ <enum name="GL_SAMPLER"/> >+ <enum name="GL_MAX_LABEL_LENGTH"/> >+ <enum name="GL_MAX_DEBUG_MESSAGE_LENGTH"/> >+ <enum name="GL_MAX_DEBUG_LOGGED_MESSAGES"/> >+ <enum name="GL_DEBUG_LOGGED_MESSAGES"/> >+ <enum name="GL_DEBUG_SEVERITY_HIGH"/> >+ <enum name="GL_DEBUG_SEVERITY_MEDIUM"/> >+ <enum name="GL_DEBUG_SEVERITY_LOW"/> >+ <enum name="GL_DEBUG_OUTPUT"/> >+ <enum name="GL_CONTEXT_FLAG_DEBUG_BIT"/> >+ <enum name="GL_STACK_OVERFLOW"/> >+ <enum name="GL_STACK_UNDERFLOW"/> >+ <command name="glDebugMessageControl"/> >+ <command name="glDebugMessageInsert"/> >+ <command name="glDebugMessageCallback"/> >+ <command name="glGetDebugMessageLog"/> >+ <command name="glPushDebugGroup"/> >+ <command name="glPopDebugGroup"/> >+ <command name="glObjectLabel"/> >+ <command name="glGetObjectLabel"/> >+ <command name="glObjectPtrLabel"/> >+ <command name="glGetObjectPtrLabel"/> >+ <command name="glGetPointerv"/> >+ </require> >+ <require api="gles2"> >+ <enum name="GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR"/> >+ <enum name="GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR"/> >+ <enum name="GL_DEBUG_CALLBACK_FUNCTION_KHR"/> >+ <enum name="GL_DEBUG_CALLBACK_USER_PARAM_KHR"/> >+ <enum name="GL_DEBUG_SOURCE_API_KHR"/> >+ <enum name="GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR"/> >+ <enum name="GL_DEBUG_SOURCE_SHADER_COMPILER_KHR"/> >+ <enum name="GL_DEBUG_SOURCE_THIRD_PARTY_KHR"/> >+ <enum name="GL_DEBUG_SOURCE_APPLICATION_KHR"/> >+ <enum name="GL_DEBUG_SOURCE_OTHER_KHR"/> >+ <enum name="GL_DEBUG_TYPE_ERROR_KHR"/> >+ <enum name="GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR"/> >+ <enum name="GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR"/> >+ <enum name="GL_DEBUG_TYPE_PORTABILITY_KHR"/> >+ <enum name="GL_DEBUG_TYPE_PERFORMANCE_KHR"/> >+ <enum name="GL_DEBUG_TYPE_OTHER_KHR"/> >+ <enum name="GL_DEBUG_TYPE_MARKER_KHR"/> >+ <enum name="GL_DEBUG_TYPE_PUSH_GROUP_KHR"/> >+ <enum name="GL_DEBUG_TYPE_POP_GROUP_KHR"/> >+ <enum name="GL_DEBUG_SEVERITY_NOTIFICATION_KHR"/> >+ <enum name="GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR"/> >+ <enum name="GL_DEBUG_GROUP_STACK_DEPTH_KHR"/> >+ <enum name="GL_BUFFER_KHR"/> >+ <enum name="GL_SHADER_KHR"/> >+ <enum name="GL_PROGRAM_KHR"/> >+ <enum name="GL_VERTEX_ARRAY_KHR"/> >+ <enum name="GL_QUERY_KHR"/> >+ <enum name="GL_PROGRAM_PIPELINE_KHR"/> >+ <enum name="GL_SAMPLER_KHR"/> >+ <enum name="GL_MAX_LABEL_LENGTH_KHR"/> >+ <enum name="GL_MAX_DEBUG_MESSAGE_LENGTH_KHR"/> >+ <enum name="GL_MAX_DEBUG_LOGGED_MESSAGES_KHR"/> >+ <enum name="GL_DEBUG_LOGGED_MESSAGES_KHR"/> >+ <enum name="GL_DEBUG_SEVERITY_HIGH_KHR"/> >+ <enum name="GL_DEBUG_SEVERITY_MEDIUM_KHR"/> >+ <enum name="GL_DEBUG_SEVERITY_LOW_KHR"/> >+ <enum name="GL_DEBUG_OUTPUT_KHR"/> >+ <enum name="GL_CONTEXT_FLAG_DEBUG_BIT_KHR"/> >+ <enum name="GL_STACK_OVERFLOW_KHR"/> >+ <enum name="GL_STACK_UNDERFLOW_KHR"/> >+ <command name="glDebugMessageControlKHR"/> >+ <command name="glDebugMessageInsertKHR"/> >+ <command name="glDebugMessageCallbackKHR"/> >+ <command name="glGetDebugMessageLogKHR"/> >+ <command name="glPushDebugGroupKHR"/> >+ <command name="glPopDebugGroupKHR"/> >+ <command name="glObjectLabelKHR"/> >+ <command name="glGetObjectLabelKHR"/> >+ <command name="glObjectPtrLabelKHR"/> >+ <command name="glGetObjectPtrLabelKHR"/> >+ <command name="glGetPointervKHR"/> >+ </require> >+ <require api="gl" profile="compatibility"> >+ <enum name="GL_DISPLAY_LIST"/> >+ </require> >+ </extension> >+ <extension name="GL_KHR_no_error" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR"/> >+ </require> >+ </extension> >+ <extension name="GL_KHR_robust_buffer_access_behavior" supported="gl|glcore|gles2"/> >+ <extension name="GL_KHR_robustness" supported="gl|glcore|gles2"> >+ <require api="gl" comment="KHR extensions *mandate* suffixes for ES, unlike for GL"> >+ <enum name="GL_NO_ERROR"/> >+ <enum name="GL_CONTEXT_ROBUST_ACCESS"/> >+ <enum name="GL_LOSE_CONTEXT_ON_RESET"/> >+ <enum name="GL_GUILTY_CONTEXT_RESET"/> >+ <enum name="GL_INNOCENT_CONTEXT_RESET"/> >+ <enum name="GL_UNKNOWN_CONTEXT_RESET"/> >+ <enum name="GL_RESET_NOTIFICATION_STRATEGY"/> >+ <enum name="GL_NO_RESET_NOTIFICATION"/> >+ <enum name="GL_CONTEXT_LOST"/> >+ <command name="glGetGraphicsResetStatus"/> >+ <command name="glReadnPixels"/> >+ <command name="glGetnUniformfv"/> >+ <command name="glGetnUniformiv"/> >+ <command name="glGetnUniformuiv"/> >+ </require> >+ <require api="gles2"> >+ <enum name="GL_NO_ERROR"/> >+ <enum name="GL_CONTEXT_ROBUST_ACCESS_KHR"/> >+ <enum name="GL_LOSE_CONTEXT_ON_RESET_KHR"/> >+ <enum name="GL_GUILTY_CONTEXT_RESET_KHR"/> >+ <enum name="GL_INNOCENT_CONTEXT_RESET_KHR"/> >+ <enum name="GL_UNKNOWN_CONTEXT_RESET_KHR"/> >+ <enum name="GL_RESET_NOTIFICATION_STRATEGY_KHR"/> >+ <enum name="GL_NO_RESET_NOTIFICATION_KHR"/> >+ <enum name="GL_CONTEXT_LOST_KHR"/> >+ <command name="glGetGraphicsResetStatusKHR"/> >+ <command name="glReadnPixelsKHR"/> >+ <command name="glGetnUniformfvKHR"/> >+ <command name="glGetnUniformivKHR"/> >+ <command name="glGetnUniformuivKHR"/> >+ </require> >+ </extension> >+ <extension name="GL_KHR_texture_compression_astc_hdr" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_4x4_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_5x4_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_5x5_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_6x5_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_6x6_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_8x5_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_8x6_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_8x8_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x5_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x6_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x8_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x10_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_12x10_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_12x12_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR"/> >+ </require> >+ </extension> >+ <extension name="GL_KHR_texture_compression_astc_ldr" supported="gl|glcore|gles2" comment="API is identical to GL_KHR_texture_compression_astc_hdr extension"> >+ <require> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_4x4_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_5x4_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_5x5_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_6x5_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_6x6_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_8x5_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_8x6_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_8x8_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x5_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x6_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x8_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x10_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_12x10_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_12x12_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR"/> >+ </require> >+ </extension> >+ <extension name="GL_KHR_texture_compression_astc_sliced_3d" supported="gl|glcore|gles2"/> >+ <extension name="GL_KHR_parallel_shader_compile" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_MAX_SHADER_COMPILER_THREADS_KHR"/> >+ <enum name="GL_COMPLETION_STATUS_KHR"/> >+ <command name="glMaxShaderCompilerThreadsKHR"/> >+ </require> >+ </extension> >+ <extension name="GL_MESAX_texture_stack" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_1D_STACK_MESAX"/> >+ <enum name="GL_TEXTURE_2D_STACK_MESAX"/> >+ <enum name="GL_PROXY_TEXTURE_1D_STACK_MESAX"/> >+ <enum name="GL_PROXY_TEXTURE_2D_STACK_MESAX"/> >+ <enum name="GL_TEXTURE_1D_STACK_BINDING_MESAX"/> >+ <enum name="GL_TEXTURE_2D_STACK_BINDING_MESAX"/> >+ </require> >+ </extension> >+ <extension name="GL_MESA_pack_invert" supported="gl"> >+ <require> >+ <enum name="GL_PACK_INVERT_MESA"/> >+ </require> >+ </extension> >+ <extension name="GL_MESA_program_binary_formats" supported="gl|gles2"> >+ <require> >+ <enum name="GL_PROGRAM_BINARY_FORMAT_MESA"/> >+ </require> >+ </extension> >+ <extension name="GL_MESA_resize_buffers" supported="gl"> >+ <require> >+ <command name="glResizeBuffersMESA"/> >+ </require> >+ </extension> >+ <extension name="GL_MESA_shader_integer_functions" supported="gl|gles2"/> >+ <extension name="GL_MESA_tile_raster_order" supported="gl"> >+ <require> >+ <enum name="GL_TILE_RASTER_ORDER_FIXED_MESA"/> >+ <enum name="GL_TILE_RASTER_ORDER_INCREASING_X_MESA"/> >+ <enum name="GL_TILE_RASTER_ORDER_INCREASING_Y_MESA"/> >+ </require> >+ </extension> >+ <extension name="GL_MESA_window_pos" supported="gl"> >+ <require> >+ <command name="glWindowPos2dMESA"/> >+ <command name="glWindowPos2dvMESA"/> >+ <command name="glWindowPos2fMESA"/> >+ <command name="glWindowPos2fvMESA"/> >+ <command name="glWindowPos2iMESA"/> >+ <command name="glWindowPos2ivMESA"/> >+ <command name="glWindowPos2sMESA"/> >+ <command name="glWindowPos2svMESA"/> >+ <command name="glWindowPos3dMESA"/> >+ <command name="glWindowPos3dvMESA"/> >+ <command name="glWindowPos3fMESA"/> >+ <command name="glWindowPos3fvMESA"/> >+ <command name="glWindowPos3iMESA"/> >+ <command name="glWindowPos3ivMESA"/> >+ <command name="glWindowPos3sMESA"/> >+ <command name="glWindowPos3svMESA"/> >+ <command name="glWindowPos4dMESA"/> >+ <command name="glWindowPos4dvMESA"/> >+ <command name="glWindowPos4fMESA"/> >+ <command name="glWindowPos4fvMESA"/> >+ <command name="glWindowPos4iMESA"/> >+ <command name="glWindowPos4ivMESA"/> >+ <command name="glWindowPos4sMESA"/> >+ <command name="glWindowPos4svMESA"/> >+ </require> >+ </extension> >+ <extension name="GL_MESA_ycbcr_texture" supported="gl"> >+ <require> >+ <enum name="GL_UNSIGNED_SHORT_8_8_MESA"/> >+ <enum name="GL_UNSIGNED_SHORT_8_8_REV_MESA"/> >+ <enum name="GL_YCBCR_MESA"/> >+ </require> >+ </extension> >+ <extension name="GL_NVX_blend_equation_advanced_multi_draw_buffers" supported="gl|gles2"/> >+ <extension name="GL_NVX_cross_process_interop" supported="disabled"> >+ <require comment="unpublished experimental extension"> >+ <enum name="GL_EXTERNAL_STORAGE_BIT_NVX"/> >+ </require> >+ </extension> >+ <extension name="GL_NVX_conditional_render" supported="gl"> >+ <require> >+ <command name="glBeginConditionalRenderNVX"/> >+ <command name="glEndConditionalRenderNVX"/> >+ </require> >+ </extension> >+ <extension name="GL_NVX_gpu_memory_info" supported="gl"> >+ <require> >+ <enum name="GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX"/> >+ <enum name="GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX"/> >+ <enum name="GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX"/> >+ <enum name="GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX"/> >+ <enum name="GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX"/> >+ </require> >+ </extension> >+ <extension name="GL_NVX_linked_gpu_multicast" supported="gl"> >+ <require> >+ <enum name="GL_LGPU_SEPARATE_STORAGE_BIT_NVX"/> >+ <enum name="GL_MAX_LGPU_GPUS_NVX"/> >+ <command name="glLGPUNamedBufferSubDataNVX"/> >+ <command name="glLGPUCopyImageSubDataNVX"/> >+ <command name="glLGPUInterlockNVX"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_alpha_to_coverage_dither_control" supported="gl"> >+ <require> >+ <enum name="GL_ALPHA_TO_COVERAGE_DITHER_DEFAULT_NV"/> >+ <enum name="GL_ALPHA_TO_COVERAGE_DITHER_ENABLE_NV"/> >+ <enum name="GL_ALPHA_TO_COVERAGE_DITHER_DISABLE_NV"/> >+ <enum name="GL_ALPHA_TO_COVERAGE_DITHER_MODE_NV"/> >+ <command name="glAlphaToCoverageDitherControlNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_bindless_multi_draw_indirect" supported="gl|glcore"> >+ <require> >+ <command name="glMultiDrawArraysIndirectBindlessNV"/> >+ <command name="glMultiDrawElementsIndirectBindlessNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_bindless_multi_draw_indirect_count" supported="gl|glcore"> >+ <require> >+ <command name="glMultiDrawArraysIndirectBindlessCountNV"/> >+ <command name="glMultiDrawElementsIndirectBindlessCountNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_bindless_texture" supported="gl|glcore|gles2"> >+ <require> >+ <command name="glGetTextureHandleNV"/> >+ <command name="glGetTextureSamplerHandleNV"/> >+ <command name="glMakeTextureHandleResidentNV"/> >+ <command name="glMakeTextureHandleNonResidentNV"/> >+ <command name="glGetImageHandleNV"/> >+ <command name="glMakeImageHandleResidentNV"/> >+ <command name="glMakeImageHandleNonResidentNV"/> >+ <command name="glUniformHandleui64NV"/> >+ <command name="glUniformHandleui64vNV"/> >+ <command name="glProgramUniformHandleui64NV"/> >+ <command name="glProgramUniformHandleui64vNV"/> >+ <command name="glIsTextureHandleResidentNV"/> >+ <command name="glIsImageHandleResidentNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_blend_equation_advanced" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_BLEND_OVERLAP_NV"/> >+ <enum name="GL_BLEND_PREMULTIPLIED_SRC_NV"/> >+ <enum name="GL_BLUE_NV"/> >+ <enum name="GL_COLORBURN_NV"/> >+ <enum name="GL_COLORDODGE_NV"/> >+ <enum name="GL_CONJOINT_NV"/> >+ <enum name="GL_CONTRAST_NV"/> >+ <enum name="GL_DARKEN_NV"/> >+ <enum name="GL_DIFFERENCE_NV"/> >+ <enum name="GL_DISJOINT_NV"/> >+ <enum name="GL_DST_ATOP_NV"/> >+ <enum name="GL_DST_IN_NV"/> >+ <enum name="GL_DST_NV"/> >+ <enum name="GL_DST_OUT_NV"/> >+ <enum name="GL_DST_OVER_NV"/> >+ <enum name="GL_EXCLUSION_NV"/> >+ <enum name="GL_GREEN_NV"/> >+ <enum name="GL_HARDLIGHT_NV"/> >+ <enum name="GL_HARDMIX_NV"/> >+ <enum name="GL_HSL_COLOR_NV"/> >+ <enum name="GL_HSL_HUE_NV"/> >+ <enum name="GL_HSL_LUMINOSITY_NV"/> >+ <enum name="GL_HSL_SATURATION_NV"/> >+ <enum name="GL_INVERT"/> >+ <enum name="GL_INVERT_OVG_NV"/> >+ <enum name="GL_INVERT_RGB_NV"/> >+ <enum name="GL_LIGHTEN_NV"/> >+ <enum name="GL_LINEARBURN_NV"/> >+ <enum name="GL_LINEARDODGE_NV"/> >+ <enum name="GL_LINEARLIGHT_NV"/> >+ <enum name="GL_MINUS_CLAMPED_NV"/> >+ <enum name="GL_MINUS_NV"/> >+ <enum name="GL_MULTIPLY_NV"/> >+ <enum name="GL_OVERLAY_NV"/> >+ <enum name="GL_PINLIGHT_NV"/> >+ <enum name="GL_PLUS_CLAMPED_ALPHA_NV"/> >+ <enum name="GL_PLUS_CLAMPED_NV"/> >+ <enum name="GL_PLUS_DARKER_NV"/> >+ <enum name="GL_PLUS_NV"/> >+ <enum name="GL_RED_NV"/> >+ <enum name="GL_SCREEN_NV"/> >+ <enum name="GL_SOFTLIGHT_NV"/> >+ <enum name="GL_SRC_ATOP_NV"/> >+ <enum name="GL_SRC_IN_NV"/> >+ <enum name="GL_SRC_NV"/> >+ <enum name="GL_SRC_OUT_NV"/> >+ <enum name="GL_SRC_OVER_NV"/> >+ <enum name="GL_UNCORRELATED_NV"/> >+ <enum name="GL_VIVIDLIGHT_NV"/> >+ <enum name="GL_XOR_NV"/> >+ <enum name="GL_ZERO"/> >+ <command name="glBlendParameteriNV"/> >+ <command name="glBlendBarrierNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_blend_equation_advanced_coherent" supported="gl|glcore|gles2"> >+ <require comment="Otherwise identical to GL_NV_blend_equation_advanced, just different semantic behavior"> >+ <enum name="GL_BLEND_ADVANCED_COHERENT_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_blend_minmax_factor" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_FACTOR_MIN_AMD"/> >+ <enum name="GL_FACTOR_MAX_AMD"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_blend_square" supported="gl"/> >+ <extension name="GL_NV_clip_space_w_scaling" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_VIEWPORT_POSITION_W_SCALE_NV"/> >+ <enum name="GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV"/> >+ <enum name="GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV"/> >+ <command name="glViewportPositionWScaleNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_command_list" supported="gl|glcore"> >+ <require> >+ <enum name="GL_TERMINATE_SEQUENCE_COMMAND_NV"/> >+ <enum name="GL_NOP_COMMAND_NV"/> >+ <enum name="GL_DRAW_ELEMENTS_COMMAND_NV"/> >+ <enum name="GL_DRAW_ARRAYS_COMMAND_NV"/> >+ <enum name="GL_DRAW_ELEMENTS_STRIP_COMMAND_NV"/> >+ <enum name="GL_DRAW_ARRAYS_STRIP_COMMAND_NV"/> >+ <enum name="GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV"/> >+ <enum name="GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV"/> >+ <enum name="GL_ELEMENT_ADDRESS_COMMAND_NV"/> >+ <enum name="GL_ATTRIBUTE_ADDRESS_COMMAND_NV"/> >+ <enum name="GL_UNIFORM_ADDRESS_COMMAND_NV"/> >+ <enum name="GL_BLEND_COLOR_COMMAND_NV"/> >+ <enum name="GL_STENCIL_REF_COMMAND_NV"/> >+ <enum name="GL_LINE_WIDTH_COMMAND_NV"/> >+ <enum name="GL_POLYGON_OFFSET_COMMAND_NV"/> >+ <enum name="GL_ALPHA_REF_COMMAND_NV"/> >+ <enum name="GL_VIEWPORT_COMMAND_NV"/> >+ <enum name="GL_SCISSOR_COMMAND_NV"/> >+ <enum name="GL_FRONT_FACE_COMMAND_NV"/> >+ <command name="glCreateStatesNV"/> >+ <command name="glDeleteStatesNV"/> >+ <command name="glIsStateNV"/> >+ <command name="glStateCaptureNV"/> >+ <command name="glGetCommandHeaderNV"/> >+ <command name="glGetStageIndexNV"/> >+ <command name="glDrawCommandsNV"/> >+ <command name="glDrawCommandsAddressNV"/> >+ <command name="glDrawCommandsStatesNV"/> >+ <command name="glDrawCommandsStatesAddressNV"/> >+ <command name="glCreateCommandListsNV"/> >+ <command name="glDeleteCommandListsNV"/> >+ <command name="glIsCommandListNV"/> >+ <command name="glListDrawCommandsStatesClientNV"/> >+ <command name="glCommandListSegmentsNV"/> >+ <command name="glCompileCommandListNV"/> >+ <command name="glCallCommandListNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_compute_program5" supported="gl"> >+ <require> >+ <enum name="GL_COMPUTE_PROGRAM_NV"/> >+ <enum name="GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_conditional_render" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_QUERY_WAIT_NV"/> >+ <enum name="GL_QUERY_NO_WAIT_NV"/> >+ <enum name="GL_QUERY_BY_REGION_WAIT_NV"/> >+ <enum name="GL_QUERY_BY_REGION_NO_WAIT_NV"/> >+ <command name="glBeginConditionalRenderNV"/> >+ <command name="glEndConditionalRenderNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_conservative_raster" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_CONSERVATIVE_RASTERIZATION_NV"/> >+ <enum name="GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV"/> >+ <enum name="GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV"/> >+ <enum name="GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV"/> >+ <command name="glSubpixelPrecisionBiasNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_conservative_raster_dilate" supported="gl|glcore"> >+ <require> >+ <enum name="GL_CONSERVATIVE_RASTER_DILATE_NV"/> >+ <enum name="GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV"/> >+ <enum name="GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV"/> >+ <command name="glConservativeRasterParameterfNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_conservative_raster_pre_snap" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_conservative_raster_pre_snap_triangles" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_CONSERVATIVE_RASTER_MODE_NV"/> >+ <enum name="GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV"/> >+ <enum name="GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV"/> >+ <enum name="GL_CONSERVATIVE_RASTER_MODE_NV"/> >+ <command name="glConservativeRasterParameteriNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_conservative_raster_underestimation" supported="gl|glcore"/> >+ <extension name="GL_NV_copy_buffer" supported="gles2"> >+ <require> >+ <enum name="GL_COPY_READ_BUFFER_NV"/> >+ <enum name="GL_COPY_WRITE_BUFFER_NV"/> >+ <command name="glCopyBufferSubDataNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_copy_depth_to_color" supported="gl"> >+ <require> >+ <enum name="GL_DEPTH_STENCIL_TO_RGBA_NV"/> >+ <enum name="GL_DEPTH_STENCIL_TO_BGRA_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_copy_image" supported="gl"> >+ <require> >+ <command name="glCopyImageSubDataNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_coverage_sample" supported="gles2"> >+ <require> >+ <enum name="GL_COVERAGE_COMPONENT_NV"/> >+ <enum name="GL_COVERAGE_COMPONENT4_NV"/> >+ <enum name="GL_COVERAGE_ATTACHMENT_NV"/> >+ <enum name="GL_COVERAGE_BUFFERS_NV"/> >+ <enum name="GL_COVERAGE_SAMPLES_NV"/> >+ <enum name="GL_COVERAGE_ALL_FRAGMENTS_NV"/> >+ <enum name="GL_COVERAGE_EDGE_FRAGMENTS_NV"/> >+ <enum name="GL_COVERAGE_AUTOMATIC_NV"/> >+ <enum name="GL_COVERAGE_BUFFER_BIT_NV"/> >+ <command name="glCoverageMaskNV"/> >+ <command name="glCoverageOperationNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_deep_texture3D" supported="gl"> >+ <require> >+ <enum name="GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV"/> >+ <enum name="GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_depth_buffer_float" supported="gl"> >+ <require> >+ <enum name="GL_DEPTH_COMPONENT32F_NV"/> >+ <enum name="GL_DEPTH32F_STENCIL8_NV"/> >+ <enum name="GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV"/> >+ <enum name="GL_DEPTH_BUFFER_FLOAT_MODE_NV"/> >+ <command name="glDepthRangedNV"/> >+ <command name="glClearDepthdNV"/> >+ <command name="glDepthBoundsdNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_depth_clamp" supported="gl"> >+ <require> >+ <enum name="GL_DEPTH_CLAMP_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_depth_nonlinear" supported="gles2"> >+ <require> >+ <enum name="GL_DEPTH_COMPONENT16_NONLINEAR_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_draw_buffers" supported="gles2"> >+ <require> >+ <enum name="GL_MAX_DRAW_BUFFERS_NV"/> >+ <enum name="GL_DRAW_BUFFER0_NV"/> >+ <enum name="GL_DRAW_BUFFER1_NV"/> >+ <enum name="GL_DRAW_BUFFER2_NV"/> >+ <enum name="GL_DRAW_BUFFER3_NV"/> >+ <enum name="GL_DRAW_BUFFER4_NV"/> >+ <enum name="GL_DRAW_BUFFER5_NV"/> >+ <enum name="GL_DRAW_BUFFER6_NV"/> >+ <enum name="GL_DRAW_BUFFER7_NV"/> >+ <enum name="GL_DRAW_BUFFER8_NV"/> >+ <enum name="GL_DRAW_BUFFER9_NV"/> >+ <enum name="GL_DRAW_BUFFER10_NV"/> >+ <enum name="GL_DRAW_BUFFER11_NV"/> >+ <enum name="GL_DRAW_BUFFER12_NV"/> >+ <enum name="GL_DRAW_BUFFER13_NV"/> >+ <enum name="GL_DRAW_BUFFER14_NV"/> >+ <enum name="GL_DRAW_BUFFER15_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT0_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT1_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT2_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT3_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT4_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT5_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT6_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT7_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT8_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT9_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT10_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT11_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT12_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT13_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT14_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT15_NV"/> >+ <command name="glDrawBuffersNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_draw_instanced" supported="gles2"> >+ <require> >+ <command name="glDrawArraysInstancedNV"/> >+ <command name="glDrawElementsInstancedNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_draw_texture" supported="gl"> >+ <require> >+ <command name="glDrawTextureNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_draw_vulkan_image" supported="gl|glcore|gles2"> >+ <require> >+ <command name="glDrawVkImageNV"/> >+ <command name="glGetVkProcAddrNV"/> >+ <command name="glWaitVkSemaphoreNV"/> >+ <command name="glSignalVkSemaphoreNV"/> >+ <command name="glSignalVkFenceNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_evaluators" supported="gl"> >+ <require> >+ <enum name="GL_EVAL_2D_NV"/> >+ <enum name="GL_EVAL_TRIANGULAR_2D_NV"/> >+ <enum name="GL_MAP_TESSELLATION_NV"/> >+ <enum name="GL_MAP_ATTRIB_U_ORDER_NV"/> >+ <enum name="GL_MAP_ATTRIB_V_ORDER_NV"/> >+ <enum name="GL_EVAL_FRACTIONAL_TESSELLATION_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB0_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB1_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB2_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB3_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB4_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB5_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB6_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB7_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB8_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB9_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB10_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB11_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB12_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB13_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB14_NV"/> >+ <enum name="GL_EVAL_VERTEX_ATTRIB15_NV"/> >+ <enum name="GL_MAX_MAP_TESSELLATION_NV"/> >+ <enum name="GL_MAX_RATIONAL_EVAL_ORDER_NV"/> >+ <command name="glMapControlPointsNV"/> >+ <command name="glMapParameterivNV"/> >+ <command name="glMapParameterfvNV"/> >+ <command name="glGetMapControlPointsNV"/> >+ <command name="glGetMapParameterivNV"/> >+ <command name="glGetMapParameterfvNV"/> >+ <command name="glGetMapAttribParameterivNV"/> >+ <command name="glGetMapAttribParameterfvNV"/> >+ <command name="glEvalMapsNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_explicit_attrib_location" supported="gles2"/> >+ <extension name="GL_NV_explicit_multisample" supported="gl"> >+ <require> >+ <enum name="GL_SAMPLE_POSITION_NV"/> >+ <enum name="GL_SAMPLE_MASK_NV"/> >+ <enum name="GL_SAMPLE_MASK_VALUE_NV"/> >+ <enum name="GL_TEXTURE_BINDING_RENDERBUFFER_NV"/> >+ <enum name="GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV"/> >+ <enum name="GL_TEXTURE_RENDERBUFFER_NV"/> >+ <enum name="GL_SAMPLER_RENDERBUFFER_NV"/> >+ <enum name="GL_INT_SAMPLER_RENDERBUFFER_NV"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV"/> >+ <enum name="GL_MAX_SAMPLE_MASK_WORDS_NV"/> >+ <command name="glGetMultisamplefvNV"/> >+ <command name="glSampleMaskIndexedNV"/> >+ <command name="glTexRenderbufferNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_fbo_color_attachments" supported="gles2"> >+ <require> >+ <enum name="GL_MAX_COLOR_ATTACHMENTS_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT0_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT1_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT2_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT3_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT4_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT5_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT6_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT7_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT8_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT9_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT10_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT11_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT12_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT13_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT14_NV"/> >+ <enum name="GL_COLOR_ATTACHMENT15_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_fence" supported="gl|gles1|gles2"> >+ <require> >+ <enum name="GL_ALL_COMPLETED_NV"/> >+ <enum name="GL_FENCE_STATUS_NV"/> >+ <enum name="GL_FENCE_CONDITION_NV"/> >+ <command name="glDeleteFencesNV"/> >+ <command name="glGenFencesNV"/> >+ <command name="glIsFenceNV"/> >+ <command name="glTestFenceNV"/> >+ <command name="glGetFenceivNV"/> >+ <command name="glFinishFenceNV"/> >+ <command name="glSetFenceNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_fill_rectangle" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_FILL_RECTANGLE_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_float_buffer" supported="gl"> >+ <require> >+ <enum name="GL_FLOAT_R_NV"/> >+ <enum name="GL_FLOAT_RG_NV"/> >+ <enum name="GL_FLOAT_RGB_NV"/> >+ <enum name="GL_FLOAT_RGBA_NV"/> >+ <enum name="GL_FLOAT_R16_NV"/> >+ <enum name="GL_FLOAT_R32_NV"/> >+ <enum name="GL_FLOAT_RG16_NV"/> >+ <enum name="GL_FLOAT_RG32_NV"/> >+ <enum name="GL_FLOAT_RGB16_NV"/> >+ <enum name="GL_FLOAT_RGB32_NV"/> >+ <enum name="GL_FLOAT_RGBA16_NV"/> >+ <enum name="GL_FLOAT_RGBA32_NV"/> >+ <enum name="GL_TEXTURE_FLOAT_COMPONENTS_NV"/> >+ <enum name="GL_FLOAT_CLEAR_COLOR_VALUE_NV"/> >+ <enum name="GL_FLOAT_RGBA_MODE_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_fog_distance" supported="gl"> >+ <require> >+ <enum name="GL_FOG_DISTANCE_MODE_NV"/> >+ <enum name="GL_EYE_RADIAL_NV"/> >+ <enum name="GL_EYE_PLANE_ABSOLUTE_NV"/> >+ <enum name="GL_EYE_PLANE"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_fragment_coverage_to_color" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_FRAGMENT_COVERAGE_TO_COLOR_NV"/> >+ <enum name="GL_FRAGMENT_COVERAGE_COLOR_NV"/> >+ <command name="glFragmentCoverageColorNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_fragment_program" supported="gl"> >+ <require> >+ <enum name="GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV"/> >+ <enum name="GL_FRAGMENT_PROGRAM_NV"/> >+ <enum name="GL_MAX_TEXTURE_COORDS_NV"/> >+ <enum name="GL_MAX_TEXTURE_IMAGE_UNITS_NV"/> >+ <enum name="GL_FRAGMENT_PROGRAM_BINDING_NV"/> >+ <enum name="GL_PROGRAM_ERROR_STRING_NV"/> >+ </require> >+ <require comment="Some NV_fragment_program entry points are shared with ARB_vertex_program"> >+ <command name="glProgramNamedParameter4fNV"/> >+ <command name="glProgramNamedParameter4fvNV"/> >+ <command name="glProgramNamedParameter4dNV"/> >+ <command name="glProgramNamedParameter4dvNV"/> >+ <command name="glGetProgramNamedParameterfvNV"/> >+ <command name="glGetProgramNamedParameterdvNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_fragment_program2" supported="gl"> >+ <require> >+ <enum name="GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV"/> >+ <enum name="GL_MAX_PROGRAM_CALL_DEPTH_NV"/> >+ <enum name="GL_MAX_PROGRAM_IF_DEPTH_NV"/> >+ <enum name="GL_MAX_PROGRAM_LOOP_DEPTH_NV"/> >+ <enum name="GL_MAX_PROGRAM_LOOP_COUNT_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_fragment_program4" supported="gl"/> >+ <extension name="GL_NV_fragment_program_option" supported="gl"/> >+ <extension name="GL_NV_fragment_shader_interlock" supported="gl|glcore|gles2"/> >+ <extension name="GL_NV_framebuffer_blit" supported="gles2"> >+ <require> >+ <enum name="GL_READ_FRAMEBUFFER_NV"/> >+ <enum name="GL_DRAW_FRAMEBUFFER_NV"/> >+ <enum name="GL_DRAW_FRAMEBUFFER_BINDING_NV"/> >+ <enum name="GL_READ_FRAMEBUFFER_BINDING_NV"/> >+ <command name="glBlitFramebufferNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_framebuffer_mixed_samples" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_RASTER_MULTISAMPLE_EXT"/> >+ <enum name="GL_COVERAGE_MODULATION_TABLE_NV"/> >+ <enum name="GL_RASTER_SAMPLES_EXT"/> >+ <enum name="GL_MAX_RASTER_SAMPLES_EXT"/> >+ <enum name="GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT"/> >+ <enum name="GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT"/> >+ <enum name="GL_EFFECTIVE_RASTER_SAMPLES_EXT"/> >+ <enum name="GL_COLOR_SAMPLES_NV"/> >+ <enum name="GL_DEPTH_SAMPLES_NV"/> >+ <enum name="GL_STENCIL_SAMPLES_NV"/> >+ <enum name="GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV"/> >+ <enum name="GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV"/> >+ <enum name="GL_COVERAGE_MODULATION_NV"/> >+ <enum name="GL_COVERAGE_MODULATION_TABLE_SIZE_NV"/> >+ <command name="glRasterSamplesEXT"/> >+ <command name="glCoverageModulationTableNV"/> >+ <command name="glGetCoverageModulationTableNV"/> >+ <command name="glCoverageModulationNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_framebuffer_multisample" supported="gles2"> >+ <require> >+ <enum name="GL_RENDERBUFFER_SAMPLES_NV"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV"/> >+ <enum name="GL_MAX_SAMPLES_NV"/> >+ <command name="glRenderbufferStorageMultisampleNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_framebuffer_multisample_coverage" supported="gl|glcore"> >+ <require> >+ <enum name="GL_RENDERBUFFER_COVERAGE_SAMPLES_NV"/> >+ <enum name="GL_RENDERBUFFER_COLOR_SAMPLES_NV"/> >+ <enum name="GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV"/> >+ <enum name="GL_MULTISAMPLE_COVERAGE_MODES_NV"/> >+ <command name="glRenderbufferStorageMultisampleCoverageNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_generate_mipmap_sRGB" supported="gles2"/> >+ <extension name="GL_NV_geometry_program4" supported="gl"> >+ <require> >+ <enum name="GL_LINES_ADJACENCY_EXT"/> >+ <enum name="GL_LINE_STRIP_ADJACENCY_EXT"/> >+ <enum name="GL_TRIANGLES_ADJACENCY_EXT"/> >+ <enum name="GL_TRIANGLE_STRIP_ADJACENCY_EXT"/> >+ <enum name="GL_GEOMETRY_PROGRAM_NV"/> >+ <enum name="GL_MAX_PROGRAM_OUTPUT_VERTICES_NV"/> >+ <enum name="GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV"/> >+ <enum name="GL_GEOMETRY_VERTICES_OUT_EXT"/> >+ <enum name="GL_GEOMETRY_INPUT_TYPE_EXT"/> >+ <enum name="GL_GEOMETRY_OUTPUT_TYPE_EXT"/> >+ <enum name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT"/> >+ <enum name="GL_PROGRAM_POINT_SIZE_EXT"/> >+ <command name="glProgramVertexLimitNV"/> >+ <command name="glFramebufferTextureEXT"/> >+ <command name="glFramebufferTextureLayerEXT"/> >+ <command name="glFramebufferTextureFaceEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_geometry_shader4" supported="gl"/> >+ <extension name="GL_NV_geometry_shader_passthrough" supported="gl|glcore|gles2"/> >+ <extension name="GL_NV_gpu_program4" supported="gl"> >+ <require> >+ <enum name="GL_MIN_PROGRAM_TEXEL_OFFSET_NV"/> >+ <enum name="GL_MAX_PROGRAM_TEXEL_OFFSET_NV"/> >+ <enum name="GL_PROGRAM_ATTRIB_COMPONENTS_NV"/> >+ <enum name="GL_PROGRAM_RESULT_COMPONENTS_NV"/> >+ <enum name="GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV"/> >+ <enum name="GL_MAX_PROGRAM_RESULT_COMPONENTS_NV"/> >+ <enum name="GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV"/> >+ <enum name="GL_MAX_PROGRAM_GENERIC_RESULTS_NV"/> >+ <command name="glProgramLocalParameterI4iNV"/> >+ <command name="glProgramLocalParameterI4ivNV"/> >+ <command name="glProgramLocalParametersI4ivNV"/> >+ <command name="glProgramLocalParameterI4uiNV"/> >+ <command name="glProgramLocalParameterI4uivNV"/> >+ <command name="glProgramLocalParametersI4uivNV"/> >+ <command name="glProgramEnvParameterI4iNV"/> >+ <command name="glProgramEnvParameterI4ivNV"/> >+ <command name="glProgramEnvParametersI4ivNV"/> >+ <command name="glProgramEnvParameterI4uiNV"/> >+ <command name="glProgramEnvParameterI4uivNV"/> >+ <command name="glProgramEnvParametersI4uivNV"/> >+ <command name="glGetProgramLocalParameterIivNV"/> >+ <command name="glGetProgramLocalParameterIuivNV"/> >+ <command name="glGetProgramEnvParameterIivNV"/> >+ <command name="glGetProgramEnvParameterIuivNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_gpu_program5" supported="gl"> >+ <require> >+ <enum name="GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV"/> >+ <enum name="GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV"/> >+ <enum name="GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV"/> >+ <enum name="GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV"/> >+ <enum name="GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV"/> >+ <enum name="GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV"/> >+ <enum name="GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV"/> >+ <enum name="GL_MAX_PROGRAM_SUBROUTINE_NUM_NV"/> >+ <command name="glProgramSubroutineParametersuivNV"/> >+ <command name="glGetProgramSubroutineParameteruivNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_gpu_program5_mem_extended" supported="gl"/> >+ <extension name="GL_NV_gpu_shader5" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_INT64_NV"/> >+ <enum name="GL_UNSIGNED_INT64_NV"/> >+ <enum name="GL_INT8_NV"/> >+ <enum name="GL_INT8_VEC2_NV"/> >+ <enum name="GL_INT8_VEC3_NV"/> >+ <enum name="GL_INT8_VEC4_NV"/> >+ <enum name="GL_INT16_NV"/> >+ <enum name="GL_INT16_VEC2_NV"/> >+ <enum name="GL_INT16_VEC3_NV"/> >+ <enum name="GL_INT16_VEC4_NV"/> >+ <enum name="GL_INT64_VEC2_NV"/> >+ <enum name="GL_INT64_VEC3_NV"/> >+ <enum name="GL_INT64_VEC4_NV"/> >+ <enum name="GL_UNSIGNED_INT8_NV"/> >+ <enum name="GL_UNSIGNED_INT8_VEC2_NV"/> >+ <enum name="GL_UNSIGNED_INT8_VEC3_NV"/> >+ <enum name="GL_UNSIGNED_INT8_VEC4_NV"/> >+ <enum name="GL_UNSIGNED_INT16_NV"/> >+ <enum name="GL_UNSIGNED_INT16_VEC2_NV"/> >+ <enum name="GL_UNSIGNED_INT16_VEC3_NV"/> >+ <enum name="GL_UNSIGNED_INT16_VEC4_NV"/> >+ <enum name="GL_UNSIGNED_INT64_VEC2_NV"/> >+ <enum name="GL_UNSIGNED_INT64_VEC3_NV"/> >+ <enum name="GL_UNSIGNED_INT64_VEC4_NV"/> >+ <enum name="GL_FLOAT16_NV"/> >+ <enum name="GL_FLOAT16_VEC2_NV"/> >+ <enum name="GL_FLOAT16_VEC3_NV"/> >+ <enum name="GL_FLOAT16_VEC4_NV"/> >+ <enum name="GL_PATCHES"/> >+ <command name="glUniform1i64NV"/> >+ <command name="glUniform2i64NV"/> >+ <command name="glUniform3i64NV"/> >+ <command name="glUniform4i64NV"/> >+ <command name="glUniform1i64vNV"/> >+ <command name="glUniform2i64vNV"/> >+ <command name="glUniform3i64vNV"/> >+ <command name="glUniform4i64vNV"/> >+ <command name="glUniform1ui64NV"/> >+ <command name="glUniform2ui64NV"/> >+ <command name="glUniform3ui64NV"/> >+ <command name="glUniform4ui64NV"/> >+ <command name="glUniform1ui64vNV"/> >+ <command name="glUniform2ui64vNV"/> >+ <command name="glUniform3ui64vNV"/> >+ <command name="glUniform4ui64vNV"/> >+ <command name="glGetUniformi64vNV"/> >+ </require> >+ <require comment="Supported only if GL_EXT_direct_state_access is supported"> >+ <command name="glProgramUniform1i64NV"/> >+ <command name="glProgramUniform2i64NV"/> >+ <command name="glProgramUniform3i64NV"/> >+ <command name="glProgramUniform4i64NV"/> >+ <command name="glProgramUniform1i64vNV"/> >+ <command name="glProgramUniform2i64vNV"/> >+ <command name="glProgramUniform3i64vNV"/> >+ <command name="glProgramUniform4i64vNV"/> >+ <command name="glProgramUniform1ui64NV"/> >+ <command name="glProgramUniform2ui64NV"/> >+ <command name="glProgramUniform3ui64NV"/> >+ <command name="glProgramUniform4ui64NV"/> >+ <command name="glProgramUniform1ui64vNV"/> >+ <command name="glProgramUniform2ui64vNV"/> >+ <command name="glProgramUniform3ui64vNV"/> >+ <command name="glProgramUniform4ui64vNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_half_float" supported="gl"> >+ <require> >+ <enum name="GL_HALF_FLOAT_NV"/> >+ <command name="glVertex2hNV"/> >+ <command name="glVertex2hvNV"/> >+ <command name="glVertex3hNV"/> >+ <command name="glVertex3hvNV"/> >+ <command name="glVertex4hNV"/> >+ <command name="glVertex4hvNV"/> >+ <command name="glNormal3hNV"/> >+ <command name="glNormal3hvNV"/> >+ <command name="glColor3hNV"/> >+ <command name="glColor3hvNV"/> >+ <command name="glColor4hNV"/> >+ <command name="glColor4hvNV"/> >+ <command name="glTexCoord1hNV"/> >+ <command name="glTexCoord1hvNV"/> >+ <command name="glTexCoord2hNV"/> >+ <command name="glTexCoord2hvNV"/> >+ <command name="glTexCoord3hNV"/> >+ <command name="glTexCoord3hvNV"/> >+ <command name="glTexCoord4hNV"/> >+ <command name="glTexCoord4hvNV"/> >+ <command name="glMultiTexCoord1hNV"/> >+ <command name="glMultiTexCoord1hvNV"/> >+ <command name="glMultiTexCoord2hNV"/> >+ <command name="glMultiTexCoord2hvNV"/> >+ <command name="glMultiTexCoord3hNV"/> >+ <command name="glMultiTexCoord3hvNV"/> >+ <command name="glMultiTexCoord4hNV"/> >+ <command name="glMultiTexCoord4hvNV"/> >+ <command name="glFogCoordhNV"/> >+ <command name="glFogCoordhvNV"/> >+ <command name="glSecondaryColor3hNV"/> >+ <command name="glSecondaryColor3hvNV"/> >+ <command name="glVertexWeighthNV"/> >+ <command name="glVertexWeighthvNV"/> >+ <command name="glVertexAttrib1hNV"/> >+ <command name="glVertexAttrib1hvNV"/> >+ <command name="glVertexAttrib2hNV"/> >+ <command name="glVertexAttrib2hvNV"/> >+ <command name="glVertexAttrib3hNV"/> >+ <command name="glVertexAttrib3hvNV"/> >+ <command name="glVertexAttrib4hNV"/> >+ <command name="glVertexAttrib4hvNV"/> >+ <command name="glVertexAttribs1hvNV"/> >+ <command name="glVertexAttribs2hvNV"/> >+ <command name="glVertexAttribs3hvNV"/> >+ <command name="glVertexAttribs4hvNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_image_formats" supported="gles2"/> >+ <extension name="GL_NV_instanced_arrays" supported="gles2"> >+ <require> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV"/> >+ <command name="glVertexAttribDivisorNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_internalformat_sample_query" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_RENDERBUFFER"/> >+ <enum name="GL_TEXTURE_2D_MULTISAMPLE"/> >+ <enum name="GL_TEXTURE_2D_MULTISAMPLE_ARRAY"/> >+ <enum name="GL_MULTISAMPLES_NV"/> >+ <enum name="GL_SUPERSAMPLE_SCALE_X_NV"/> >+ <enum name="GL_SUPERSAMPLE_SCALE_Y_NV"/> >+ <enum name="GL_CONFORMANT_NV"/> >+ <command name="glGetInternalformatSampleivNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_light_max_exponent" supported="gl"> >+ <require> >+ <enum name="GL_MAX_SHININESS_NV"/> >+ <enum name="GL_MAX_SPOT_EXPONENT_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_gpu_multicast" supported="gl"> >+ <require> >+ <enum name="GL_PER_GPU_STORAGE_BIT_NV"/> >+ <enum name="GL_MULTICAST_GPUS_NV"/> >+ <enum name="GL_RENDER_GPU_MASK_NV"/> >+ <enum name="GL_PER_GPU_STORAGE_NV"/> >+ <enum name="GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV"/> >+ <command name="glRenderGpuMaskNV"/> >+ <command name="glMulticastBufferSubDataNV"/> >+ <command name="glMulticastCopyBufferSubDataNV"/> >+ <command name="glMulticastCopyImageSubDataNV"/> >+ <command name="glMulticastBlitFramebufferNV"/> >+ <command name="glMulticastFramebufferSampleLocationsfvNV"/> >+ <command name="glMulticastBarrierNV"/> >+ <command name="glMulticastWaitSyncNV"/> >+ <command name="glMulticastGetQueryObjectivNV"/> >+ <command name="glMulticastGetQueryObjectuivNV"/> >+ <command name="glMulticastGetQueryObjecti64vNV"/> >+ <command name="glMulticastGetQueryObjectui64vNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_multisample_coverage" supported="gl"> >+ <require> >+ <enum name="GL_SAMPLES_ARB"/> >+ <enum name="GL_COLOR_SAMPLES_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_multisample_filter_hint" supported="gl"> >+ <require> >+ <enum name="GL_MULTISAMPLE_FILTER_HINT_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_non_square_matrices" supported="gles2"> >+ <require> >+ <enum name="GL_FLOAT_MAT2x3_NV"/> >+ <enum name="GL_FLOAT_MAT2x4_NV"/> >+ <enum name="GL_FLOAT_MAT3x2_NV"/> >+ <enum name="GL_FLOAT_MAT3x4_NV"/> >+ <enum name="GL_FLOAT_MAT4x2_NV"/> >+ <enum name="GL_FLOAT_MAT4x3_NV"/> >+ <command name="glUniformMatrix2x3fvNV"/> >+ <command name="glUniformMatrix3x2fvNV"/> >+ <command name="glUniformMatrix2x4fvNV"/> >+ <command name="glUniformMatrix4x2fvNV"/> >+ <command name="glUniformMatrix3x4fvNV"/> >+ <command name="glUniformMatrix4x3fvNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_occlusion_query" supported="gl"> >+ <require> >+ <enum name="GL_PIXEL_COUNTER_BITS_NV"/> >+ <enum name="GL_CURRENT_OCCLUSION_QUERY_ID_NV"/> >+ <enum name="GL_PIXEL_COUNT_NV"/> >+ <enum name="GL_PIXEL_COUNT_AVAILABLE_NV"/> >+ <command name="glGenOcclusionQueriesNV"/> >+ <command name="glDeleteOcclusionQueriesNV"/> >+ <command name="glIsOcclusionQueryNV"/> >+ <command name="glBeginOcclusionQueryNV"/> >+ <command name="glEndOcclusionQueryNV"/> >+ <command name="glGetOcclusionQueryivNV"/> >+ <command name="glGetOcclusionQueryuivNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_packed_depth_stencil" supported="gl"> >+ <require> >+ <enum name="GL_DEPTH_STENCIL_NV"/> >+ <enum name="GL_UNSIGNED_INT_24_8_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_parameter_buffer_object" supported="gl"> >+ <require> >+ <enum name="GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV"/> >+ <enum name="GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV"/> >+ <enum name="GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV"/> >+ <enum name="GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV"/> >+ <enum name="GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV"/> >+ <command name="glProgramBufferParametersfvNV"/> >+ <command name="glProgramBufferParametersIivNV"/> >+ <command name="glProgramBufferParametersIuivNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_parameter_buffer_object2" supported="gl"/> >+ <extension name="GL_NV_path_rendering" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_PATH_FORMAT_SVG_NV"/> >+ <enum name="GL_PATH_FORMAT_PS_NV"/> >+ <enum name="GL_STANDARD_FONT_NAME_NV"/> >+ <enum name="GL_SYSTEM_FONT_NAME_NV"/> >+ <enum name="GL_FILE_NAME_NV"/> >+ <enum name="GL_PATH_STROKE_WIDTH_NV"/> >+ <enum name="GL_PATH_END_CAPS_NV"/> >+ <enum name="GL_PATH_INITIAL_END_CAP_NV"/> >+ <enum name="GL_PATH_TERMINAL_END_CAP_NV"/> >+ <enum name="GL_PATH_JOIN_STYLE_NV"/> >+ <enum name="GL_PATH_MITER_LIMIT_NV"/> >+ <enum name="GL_PATH_DASH_CAPS_NV"/> >+ <enum name="GL_PATH_INITIAL_DASH_CAP_NV"/> >+ <enum name="GL_PATH_TERMINAL_DASH_CAP_NV"/> >+ <enum name="GL_PATH_DASH_OFFSET_NV"/> >+ <enum name="GL_PATH_CLIENT_LENGTH_NV"/> >+ <enum name="GL_PATH_FILL_MODE_NV"/> >+ <enum name="GL_PATH_FILL_MASK_NV"/> >+ <enum name="GL_PATH_FILL_COVER_MODE_NV"/> >+ <enum name="GL_PATH_STROKE_COVER_MODE_NV"/> >+ <enum name="GL_PATH_STROKE_MASK_NV"/> >+ <enum name="GL_COUNT_UP_NV"/> >+ <enum name="GL_COUNT_DOWN_NV"/> >+ <enum name="GL_PATH_OBJECT_BOUNDING_BOX_NV"/> >+ <enum name="GL_CONVEX_HULL_NV"/> >+ <enum name="GL_BOUNDING_BOX_NV"/> >+ <enum name="GL_TRANSLATE_X_NV"/> >+ <enum name="GL_TRANSLATE_Y_NV"/> >+ <enum name="GL_TRANSLATE_2D_NV"/> >+ <enum name="GL_TRANSLATE_3D_NV"/> >+ <enum name="GL_AFFINE_2D_NV"/> >+ <enum name="GL_AFFINE_3D_NV"/> >+ <enum name="GL_TRANSPOSE_AFFINE_2D_NV"/> >+ <enum name="GL_TRANSPOSE_AFFINE_3D_NV"/> >+ <enum name="GL_UTF8_NV"/> >+ <enum name="GL_UTF16_NV"/> >+ <enum name="GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV"/> >+ <enum name="GL_PATH_COMMAND_COUNT_NV"/> >+ <enum name="GL_PATH_COORD_COUNT_NV"/> >+ <enum name="GL_PATH_DASH_ARRAY_COUNT_NV"/> >+ <enum name="GL_PATH_COMPUTED_LENGTH_NV"/> >+ <enum name="GL_PATH_FILL_BOUNDING_BOX_NV"/> >+ <enum name="GL_PATH_STROKE_BOUNDING_BOX_NV"/> >+ <enum name="GL_SQUARE_NV"/> >+ <enum name="GL_ROUND_NV"/> >+ <enum name="GL_TRIANGULAR_NV"/> >+ <enum name="GL_BEVEL_NV"/> >+ <enum name="GL_MITER_REVERT_NV"/> >+ <enum name="GL_MITER_TRUNCATE_NV"/> >+ <enum name="GL_SKIP_MISSING_GLYPH_NV"/> >+ <enum name="GL_USE_MISSING_GLYPH_NV"/> >+ <enum name="GL_PATH_ERROR_POSITION_NV"/> >+ <enum name="GL_ACCUM_ADJACENT_PAIRS_NV"/> >+ <enum name="GL_ADJACENT_PAIRS_NV"/> >+ <enum name="GL_FIRST_TO_REST_NV"/> >+ <enum name="GL_PATH_GEN_MODE_NV"/> >+ <enum name="GL_PATH_GEN_COEFF_NV"/> >+ <enum name="GL_PATH_GEN_COMPONENTS_NV"/> >+ <enum name="GL_PATH_STENCIL_FUNC_NV"/> >+ <enum name="GL_PATH_STENCIL_REF_NV"/> >+ <enum name="GL_PATH_STENCIL_VALUE_MASK_NV"/> >+ <enum name="GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV"/> >+ <enum name="GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV"/> >+ <enum name="GL_PATH_COVER_DEPTH_FUNC_NV"/> >+ <enum name="GL_PATH_DASH_OFFSET_RESET_NV"/> >+ <enum name="GL_MOVE_TO_RESETS_NV"/> >+ <enum name="GL_MOVE_TO_CONTINUES_NV"/> >+ <enum name="GL_CLOSE_PATH_NV"/> >+ <enum name="GL_MOVE_TO_NV"/> >+ <enum name="GL_RELATIVE_MOVE_TO_NV"/> >+ <enum name="GL_LINE_TO_NV"/> >+ <enum name="GL_RELATIVE_LINE_TO_NV"/> >+ <enum name="GL_HORIZONTAL_LINE_TO_NV"/> >+ <enum name="GL_RELATIVE_HORIZONTAL_LINE_TO_NV"/> >+ <enum name="GL_VERTICAL_LINE_TO_NV"/> >+ <enum name="GL_RELATIVE_VERTICAL_LINE_TO_NV"/> >+ <enum name="GL_QUADRATIC_CURVE_TO_NV"/> >+ <enum name="GL_RELATIVE_QUADRATIC_CURVE_TO_NV"/> >+ <enum name="GL_CUBIC_CURVE_TO_NV"/> >+ <enum name="GL_RELATIVE_CUBIC_CURVE_TO_NV"/> >+ <enum name="GL_SMOOTH_QUADRATIC_CURVE_TO_NV"/> >+ <enum name="GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV"/> >+ <enum name="GL_SMOOTH_CUBIC_CURVE_TO_NV"/> >+ <enum name="GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV"/> >+ <enum name="GL_SMALL_CCW_ARC_TO_NV"/> >+ <enum name="GL_RELATIVE_SMALL_CCW_ARC_TO_NV"/> >+ <enum name="GL_SMALL_CW_ARC_TO_NV"/> >+ <enum name="GL_RELATIVE_SMALL_CW_ARC_TO_NV"/> >+ <enum name="GL_LARGE_CCW_ARC_TO_NV"/> >+ <enum name="GL_RELATIVE_LARGE_CCW_ARC_TO_NV"/> >+ <enum name="GL_LARGE_CW_ARC_TO_NV"/> >+ <enum name="GL_RELATIVE_LARGE_CW_ARC_TO_NV"/> >+ <enum name="GL_RESTART_PATH_NV"/> >+ <enum name="GL_DUP_FIRST_CUBIC_CURVE_TO_NV"/> >+ <enum name="GL_DUP_LAST_CUBIC_CURVE_TO_NV"/> >+ <enum name="GL_RECT_NV"/> >+ <enum name="GL_CIRCULAR_CCW_ARC_TO_NV"/> >+ <enum name="GL_CIRCULAR_CW_ARC_TO_NV"/> >+ <enum name="GL_CIRCULAR_TANGENT_ARC_TO_NV"/> >+ <enum name="GL_ARC_TO_NV"/> >+ <enum name="GL_RELATIVE_ARC_TO_NV"/> >+ <enum name="GL_BOLD_BIT_NV"/> >+ <enum name="GL_ITALIC_BIT_NV"/> >+ <enum name="GL_GLYPH_WIDTH_BIT_NV"/> >+ <enum name="GL_GLYPH_HEIGHT_BIT_NV"/> >+ <enum name="GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV"/> >+ <enum name="GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV"/> >+ <enum name="GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV"/> >+ <enum name="GL_GLYPH_VERTICAL_BEARING_X_BIT_NV"/> >+ <enum name="GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV"/> >+ <enum name="GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV"/> >+ <enum name="GL_GLYPH_HAS_KERNING_BIT_NV"/> >+ <enum name="GL_FONT_X_MIN_BOUNDS_BIT_NV"/> >+ <enum name="GL_FONT_Y_MIN_BOUNDS_BIT_NV"/> >+ <enum name="GL_FONT_X_MAX_BOUNDS_BIT_NV"/> >+ <enum name="GL_FONT_Y_MAX_BOUNDS_BIT_NV"/> >+ <enum name="GL_FONT_UNITS_PER_EM_BIT_NV"/> >+ <enum name="GL_FONT_ASCENDER_BIT_NV"/> >+ <enum name="GL_FONT_DESCENDER_BIT_NV"/> >+ <enum name="GL_FONT_HEIGHT_BIT_NV"/> >+ <enum name="GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV"/> >+ <enum name="GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV"/> >+ <enum name="GL_FONT_UNDERLINE_POSITION_BIT_NV"/> >+ <enum name="GL_FONT_UNDERLINE_THICKNESS_BIT_NV"/> >+ <enum name="GL_FONT_HAS_KERNING_BIT_NV"/> >+ <command name="glGenPathsNV"/> >+ <command name="glDeletePathsNV"/> >+ <command name="glIsPathNV"/> >+ <command name="glPathCommandsNV"/> >+ <command name="glPathCoordsNV"/> >+ <command name="glPathSubCommandsNV"/> >+ <command name="glPathSubCoordsNV"/> >+ <command name="glPathStringNV"/> >+ <command name="glPathGlyphsNV"/> >+ <command name="glPathGlyphRangeNV"/> >+ <command name="glWeightPathsNV"/> >+ <command name="glCopyPathNV"/> >+ <command name="glInterpolatePathsNV"/> >+ <command name="glTransformPathNV"/> >+ <command name="glPathParameterivNV"/> >+ <command name="glPathParameteriNV"/> >+ <command name="glPathParameterfvNV"/> >+ <command name="glPathParameterfNV"/> >+ <command name="glPathDashArrayNV"/> >+ <command name="glPathStencilFuncNV"/> >+ <command name="glPathStencilDepthOffsetNV"/> >+ <command name="glStencilFillPathNV"/> >+ <command name="glStencilStrokePathNV"/> >+ <command name="glStencilFillPathInstancedNV"/> >+ <command name="glStencilStrokePathInstancedNV"/> >+ <command name="glPathCoverDepthFuncNV"/> >+ <command name="glCoverFillPathNV"/> >+ <command name="glCoverStrokePathNV"/> >+ <command name="glCoverFillPathInstancedNV"/> >+ <command name="glCoverStrokePathInstancedNV"/> >+ <command name="glGetPathParameterivNV"/> >+ <command name="glGetPathParameterfvNV"/> >+ <command name="glGetPathCommandsNV"/> >+ <command name="glGetPathCoordsNV"/> >+ <command name="glGetPathDashArrayNV"/> >+ <command name="glGetPathMetricsNV"/> >+ <command name="glGetPathMetricRangeNV"/> >+ <command name="glGetPathSpacingNV"/> >+ <command name="glIsPointInFillPathNV"/> >+ <command name="glIsPointInStrokePathNV"/> >+ <command name="glGetPathLengthNV"/> >+ <command name="glPointAlongPathNV"/> >+ </require> >+ <require comment="API revision 1.2"> >+ <enum name="GL_ROUNDED_RECT_NV"/> >+ <enum name="GL_RELATIVE_ROUNDED_RECT_NV"/> >+ <enum name="GL_ROUNDED_RECT2_NV"/> >+ <enum name="GL_RELATIVE_ROUNDED_RECT2_NV"/> >+ <enum name="GL_ROUNDED_RECT4_NV"/> >+ <enum name="GL_RELATIVE_ROUNDED_RECT4_NV"/> >+ <enum name="GL_ROUNDED_RECT8_NV"/> >+ <enum name="GL_RELATIVE_ROUNDED_RECT8_NV"/> >+ <enum name="GL_RELATIVE_RECT_NV"/> >+ <enum name="GL_FONT_GLYPHS_AVAILABLE_NV"/> >+ <enum name="GL_FONT_TARGET_UNAVAILABLE_NV"/> >+ <enum name="GL_FONT_UNAVAILABLE_NV"/> >+ <enum name="GL_FONT_UNINTELLIGIBLE_NV"/> >+ <command name="glMatrixLoad3x2fNV"/> >+ <command name="glMatrixLoad3x3fNV"/> >+ <command name="glMatrixLoadTranspose3x3fNV"/> >+ <command name="glMatrixMult3x2fNV"/> >+ <command name="glMatrixMult3x3fNV"/> >+ <command name="glMatrixMultTranspose3x3fNV"/> >+ <command name="glStencilThenCoverFillPathNV"/> >+ <command name="glStencilThenCoverStrokePathNV"/> >+ <command name="glStencilThenCoverFillPathInstancedNV"/> >+ <command name="glStencilThenCoverStrokePathInstancedNV"/> >+ <command name="glPathGlyphIndexRangeNV"/> >+ </require> >+ <require comment="API revision 1.3"> >+ <enum name="GL_CONIC_CURVE_TO_NV"/> >+ <enum name="GL_RELATIVE_CONIC_CURVE_TO_NV"/> >+ <enum name="GL_FONT_NUM_GLYPH_INDICES_BIT_NV"/> >+ <enum name="GL_STANDARD_FONT_FORMAT_NV"/> >+ <command name="glPathGlyphIndexArrayNV"/> >+ <command name="glPathMemoryGlyphIndexArrayNV"/> >+ <command name="glProgramPathFragmentInputGenNV"/> >+ <command name="glGetProgramResourcefvNV"/> >+ </require> >+ <require api="gl" profile="compatibility"> >+ <enum name="GL_2_BYTES_NV"/> >+ <enum name="GL_3_BYTES_NV"/> >+ <enum name="GL_4_BYTES_NV"/> >+ <enum name="GL_EYE_LINEAR_NV"/> >+ <enum name="GL_OBJECT_LINEAR_NV"/> >+ <enum name="GL_CONSTANT_NV"/> >+ <enum name="GL_PATH_FOG_GEN_MODE_NV"/> >+ <enum name="GL_PRIMARY_COLOR"/> >+ <enum name="GL_PRIMARY_COLOR_NV"/> >+ <enum name="GL_SECONDARY_COLOR_NV"/> >+ <enum name="GL_PATH_GEN_COLOR_FORMAT_NV"/> >+ <command name="glPathColorGenNV"/> >+ <command name="glPathTexGenNV"/> >+ <command name="glPathFogGenNV"/> >+ <command name="glGetPathColorGenivNV"/> >+ <command name="glGetPathColorGenfvNV"/> >+ <command name="glGetPathTexGenivNV"/> >+ <command name="glGetPathTexGenfvNV"/> >+ </require> >+ <require comment="Other API additions of unknown history"> >+ <enum name="GL_PATH_PROJECTION_NV"/> >+ <enum name="GL_PATH_MODELVIEW_NV"/> >+ <enum name="GL_PATH_MODELVIEW_STACK_DEPTH_NV"/> >+ <enum name="GL_PATH_MODELVIEW_MATRIX_NV"/> >+ <enum name="GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV"/> >+ <enum name="GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV"/> >+ <enum name="GL_PATH_PROJECTION_STACK_DEPTH_NV"/> >+ <enum name="GL_PATH_PROJECTION_MATRIX_NV"/> >+ <enum name="GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV"/> >+ <enum name="GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV"/> >+ <enum name="GL_FRAGMENT_INPUT_NV"/> >+ <command name="glMatrixFrustumEXT"/> >+ <command name="glMatrixLoadIdentityEXT"/> >+ <command name="glMatrixLoadTransposefEXT"/> >+ <command name="glMatrixLoadTransposedEXT"/> >+ <command name="glMatrixLoadfEXT"/> >+ <command name="glMatrixLoaddEXT"/> >+ <command name="glMatrixMultTransposefEXT"/> >+ <command name="glMatrixMultTransposedEXT"/> >+ <command name="glMatrixMultfEXT"/> >+ <command name="glMatrixMultdEXT"/> >+ <command name="glMatrixOrthoEXT"/> >+ <command name="glMatrixPopEXT"/> >+ <command name="glMatrixPushEXT"/> >+ <command name="glMatrixRotatefEXT"/> >+ <command name="glMatrixRotatedEXT"/> >+ <command name="glMatrixScalefEXT"/> >+ <command name="glMatrixScaledEXT"/> >+ <command name="glMatrixTranslatefEXT"/> >+ <command name="glMatrixTranslatedEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_path_rendering_shared_edge" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_SHARED_EDGE_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_pixel_data_range" supported="gl"> >+ <require> >+ <enum name="GL_WRITE_PIXEL_DATA_RANGE_NV"/> >+ <enum name="GL_READ_PIXEL_DATA_RANGE_NV"/> >+ <enum name="GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV"/> >+ <enum name="GL_READ_PIXEL_DATA_RANGE_LENGTH_NV"/> >+ <enum name="GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV"/> >+ <enum name="GL_READ_PIXEL_DATA_RANGE_POINTER_NV"/> >+ <command name="glPixelDataRangeNV"/> >+ <command name="glFlushPixelDataRangeNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_pixel_buffer_object" supported="gles2"> >+ <require> >+ <enum name="GL_PIXEL_PACK_BUFFER_NV"/> >+ <enum name="GL_PIXEL_UNPACK_BUFFER_NV"/> >+ <enum name="GL_PIXEL_PACK_BUFFER_BINDING_NV"/> >+ <enum name="GL_PIXEL_UNPACK_BUFFER_BINDING_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_point_sprite" supported="gl"> >+ <require> >+ <enum name="GL_POINT_SPRITE_NV"/> >+ <enum name="GL_COORD_REPLACE_NV"/> >+ <enum name="GL_POINT_SPRITE_R_MODE_NV"/> >+ <command name="glPointParameteriNV"/> >+ <command name="glPointParameterivNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_polygon_mode" supported="gles2"> >+ <require> >+ <enum name="GL_POLYGON_MODE_NV"/> >+ <enum name="GL_POLYGON_OFFSET_POINT_NV"/> >+ <enum name="GL_POLYGON_OFFSET_LINE_NV"/> >+ <enum name="GL_POINT_NV"/> >+ <enum name="GL_LINE_NV"/> >+ <enum name="GL_FILL_NV"/> >+ <command name="glPolygonModeNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_present_video" supported="gl"> >+ <require> >+ <enum name="GL_FRAME_NV"/> >+ <enum name="GL_FIELDS_NV"/> >+ <enum name="GL_CURRENT_TIME_NV"/> >+ <enum name="GL_NUM_FILL_STREAMS_NV"/> >+ <enum name="GL_PRESENT_TIME_NV"/> >+ <enum name="GL_PRESENT_DURATION_NV"/> >+ <command name="glPresentFrameKeyedNV"/> >+ <command name="glPresentFrameDualFillNV"/> >+ <command name="glGetVideoivNV"/> >+ <command name="glGetVideouivNV"/> >+ <command name="glGetVideoi64vNV"/> >+ <command name="glGetVideoui64vNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_primitive_restart" supported="gl"> >+ <require> >+ <enum name="GL_PRIMITIVE_RESTART_NV"/> >+ <enum name="GL_PRIMITIVE_RESTART_INDEX_NV"/> >+ <command name="glPrimitiveRestartNV"/> >+ <command name="glPrimitiveRestartIndexNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_query_resource" supported="gl"> >+ <require> >+ <enum name="GL_QUERY_RESOURCE_TYPE_VIDMEM_ALLOC_NV"/> >+ <enum name="GL_QUERY_RESOURCE_MEMTYPE_VIDMEM_NV"/> >+ <enum name="GL_QUERY_RESOURCE_SYS_RESERVED_NV"/> >+ <enum name="GL_QUERY_RESOURCE_TEXTURE_NV"/> >+ <enum name="GL_QUERY_RESOURCE_RENDERBUFFER_NV"/> >+ <enum name="GL_QUERY_RESOURCE_BUFFEROBJECT_NV"/> >+ <command name="glQueryResourceNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_query_resource_tag" supported="gl"> >+ <require> >+ <command name="glGenQueryResourceTagNV"/> >+ <command name="glDeleteQueryResourceTagNV"/> >+ <command name="glQueryResourceTagNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_read_buffer" supported="gles2"> >+ <require> >+ <enum name="GL_READ_BUFFER_NV"/> >+ <command name="glReadBufferNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_read_buffer_front" supported="gles2"/> >+ <extension name="GL_NV_read_depth" supported="gles2"/> >+ <extension name="GL_NV_read_depth_stencil" supported="gles2"/> >+ <extension name="GL_NV_read_stencil" supported="gles2"/> >+ <extension name="GL_NV_register_combiners" supported="gl"> >+ <require> >+ <enum name="GL_REGISTER_COMBINERS_NV"/> >+ <enum name="GL_VARIABLE_A_NV"/> >+ <enum name="GL_VARIABLE_B_NV"/> >+ <enum name="GL_VARIABLE_C_NV"/> >+ <enum name="GL_VARIABLE_D_NV"/> >+ <enum name="GL_VARIABLE_E_NV"/> >+ <enum name="GL_VARIABLE_F_NV"/> >+ <enum name="GL_VARIABLE_G_NV"/> >+ <enum name="GL_CONSTANT_COLOR0_NV"/> >+ <enum name="GL_CONSTANT_COLOR1_NV"/> >+ <enum name="GL_PRIMARY_COLOR_NV"/> >+ <enum name="GL_SECONDARY_COLOR_NV"/> >+ <enum name="GL_SPARE0_NV"/> >+ <enum name="GL_SPARE1_NV"/> >+ <enum name="GL_DISCARD_NV"/> >+ <enum name="GL_E_TIMES_F_NV"/> >+ <enum name="GL_SPARE0_PLUS_SECONDARY_COLOR_NV"/> >+ <enum name="GL_UNSIGNED_IDENTITY_NV"/> >+ <enum name="GL_UNSIGNED_INVERT_NV"/> >+ <enum name="GL_EXPAND_NORMAL_NV"/> >+ <enum name="GL_EXPAND_NEGATE_NV"/> >+ <enum name="GL_HALF_BIAS_NORMAL_NV"/> >+ <enum name="GL_HALF_BIAS_NEGATE_NV"/> >+ <enum name="GL_SIGNED_IDENTITY_NV"/> >+ <enum name="GL_SIGNED_NEGATE_NV"/> >+ <enum name="GL_SCALE_BY_TWO_NV"/> >+ <enum name="GL_SCALE_BY_FOUR_NV"/> >+ <enum name="GL_SCALE_BY_ONE_HALF_NV"/> >+ <enum name="GL_BIAS_BY_NEGATIVE_ONE_HALF_NV"/> >+ <enum name="GL_COMBINER_INPUT_NV"/> >+ <enum name="GL_COMBINER_MAPPING_NV"/> >+ <enum name="GL_COMBINER_COMPONENT_USAGE_NV"/> >+ <enum name="GL_COMBINER_AB_DOT_PRODUCT_NV"/> >+ <enum name="GL_COMBINER_CD_DOT_PRODUCT_NV"/> >+ <enum name="GL_COMBINER_MUX_SUM_NV"/> >+ <enum name="GL_COMBINER_SCALE_NV"/> >+ <enum name="GL_COMBINER_BIAS_NV"/> >+ <enum name="GL_COMBINER_AB_OUTPUT_NV"/> >+ <enum name="GL_COMBINER_CD_OUTPUT_NV"/> >+ <enum name="GL_COMBINER_SUM_OUTPUT_NV"/> >+ <enum name="GL_MAX_GENERAL_COMBINERS_NV"/> >+ <enum name="GL_NUM_GENERAL_COMBINERS_NV"/> >+ <enum name="GL_COLOR_SUM_CLAMP_NV"/> >+ <enum name="GL_COMBINER0_NV"/> >+ <enum name="GL_COMBINER1_NV"/> >+ <enum name="GL_COMBINER2_NV"/> >+ <enum name="GL_COMBINER3_NV"/> >+ <enum name="GL_COMBINER4_NV"/> >+ <enum name="GL_COMBINER5_NV"/> >+ <enum name="GL_COMBINER6_NV"/> >+ <enum name="GL_COMBINER7_NV"/> >+ <enum name="GL_TEXTURE0_ARB"/> >+ <enum name="GL_TEXTURE1_ARB"/> >+ <enum name="GL_ZERO"/> >+ <enum name="GL_NONE"/> >+ <enum name="GL_FOG"/> >+ <command name="glCombinerParameterfvNV"/> >+ <command name="glCombinerParameterfNV"/> >+ <command name="glCombinerParameterivNV"/> >+ <command name="glCombinerParameteriNV"/> >+ <command name="glCombinerInputNV"/> >+ <command name="glCombinerOutputNV"/> >+ <command name="glFinalCombinerInputNV"/> >+ <command name="glGetCombinerInputParameterfvNV"/> >+ <command name="glGetCombinerInputParameterivNV"/> >+ <command name="glGetCombinerOutputParameterfvNV"/> >+ <command name="glGetCombinerOutputParameterivNV"/> >+ <command name="glGetFinalCombinerInputParameterfvNV"/> >+ <command name="glGetFinalCombinerInputParameterivNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_register_combiners2" supported="gl"> >+ <require> >+ <enum name="GL_PER_STAGE_CONSTANTS_NV"/> >+ <command name="glCombinerStageParameterfvNV"/> >+ <command name="glGetCombinerStageParameterfvNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_robustness_video_memory_purge" supported="gl"> >+ <require> >+ <enum name="GL_PURGED_CONTEXT_RESET_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_sRGB_formats" supported="gles2"> >+ <require> >+ <enum name="GL_SLUMINANCE_NV"/> >+ <enum name="GL_SLUMINANCE_ALPHA_NV"/> >+ <enum name="GL_SRGB8_NV"/> >+ <enum name="GL_SLUMINANCE8_NV"/> >+ <enum name="GL_SLUMINANCE8_ALPHA8_NV"/> >+ <enum name="GL_COMPRESSED_SRGB_S3TC_DXT1_NV"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV"/> >+ <enum name="GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV"/> >+ <enum name="GL_ETC1_SRGB8_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_sample_locations" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV"/> >+ <enum name="GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV"/> >+ <enum name="GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV"/> >+ <enum name="GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV"/> >+ <enum name="GL_SAMPLE_LOCATION_NV"/> >+ <enum name="GL_PROGRAMMABLE_SAMPLE_LOCATION_NV"/> >+ <enum name="GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV"/> >+ <enum name="GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV"/> >+ <command name="glFramebufferSampleLocationsfvNV"/> >+ <command name="glNamedFramebufferSampleLocationsfvNV"/> >+ <command name="glResolveDepthValuesNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_sample_mask_override_coverage" supported="gl|glcore|gles2"/> >+ <extension name="GL_NV_shader_atomic_counters" supported="gl|glcore"/> >+ <extension name="GL_NV_shader_atomic_float" supported="gl|glcore"/> >+ <extension name="GL_NV_shader_atomic_float64" supported="gl|glcore"/> >+ <extension name="GL_NV_shader_atomic_fp16_vector" supported="gl|glcore|gles2"/> >+ <extension name="GL_NV_shader_atomic_int64" supported="gl|glcore"/> >+ <extension name="GL_NV_shader_buffer_load" supported="gl|glcore"> >+ <require> >+ <enum name="GL_BUFFER_GPU_ADDRESS_NV"/> >+ <enum name="GL_GPU_ADDRESS_NV"/> >+ <enum name="GL_MAX_SHADER_BUFFER_ADDRESS_NV"/> >+ <command name="glMakeBufferResidentNV"/> >+ <command name="glMakeBufferNonResidentNV"/> >+ <command name="glIsBufferResidentNV"/> >+ <command name="glMakeNamedBufferResidentNV"/> >+ <command name="glMakeNamedBufferNonResidentNV"/> >+ <command name="glIsNamedBufferResidentNV"/> >+ <command name="glGetBufferParameterui64vNV"/> >+ <command name="glGetNamedBufferParameterui64vNV"/> >+ <command name="glGetIntegerui64vNV"/> >+ <command name="glUniformui64NV"/> >+ <command name="glUniformui64vNV"/> >+ <command name="glGetUniformui64vNV"/> >+ <command name="glProgramUniformui64NV"/> >+ <command name="glProgramUniformui64vNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_shader_buffer_store" supported="gl|glcore"> >+ <require> >+ <enum name="GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV"/> >+ <enum name="GL_READ_WRITE"/> >+ <enum name="GL_WRITE_ONLY"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_shader_noperspective_interpolation" supported="gles2"/> >+ <extension name="GL_NV_shader_storage_buffer_object" supported="gl"/> >+ <extension name="GL_NV_shader_thread_group" supported="gl|glcore"> >+ <require> >+ <enum name="GL_WARP_SIZE_NV"/> >+ <enum name="GL_WARPS_PER_SM_NV"/> >+ <enum name="GL_SM_COUNT_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_shader_thread_shuffle" supported="gl|glcore"/> >+ <extension name="GL_NV_shadow_samplers_array" supported="gles2"> >+ <require> >+ <enum name="GL_SAMPLER_2D_ARRAY_SHADOW_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_shadow_samplers_cube" supported="gles2"> >+ <require> >+ <enum name="GL_SAMPLER_CUBE_SHADOW_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_stereo_view_rendering" supported="gl|glcore|gles2"/> >+ <extension name="GL_NV_tessellation_program5" supported="gl"> >+ <require> >+ <enum name="GL_MAX_PROGRAM_PATCH_ATTRIBS_NV"/> >+ <enum name="GL_TESS_CONTROL_PROGRAM_NV"/> >+ <enum name="GL_TESS_EVALUATION_PROGRAM_NV"/> >+ <enum name="GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV"/> >+ <enum name="GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_texgen_emboss" supported="gl"> >+ <require> >+ <enum name="GL_EMBOSS_LIGHT_NV"/> >+ <enum name="GL_EMBOSS_CONSTANT_NV"/> >+ <enum name="GL_EMBOSS_MAP_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_texgen_reflection" supported="gl"> >+ <require> >+ <enum name="GL_NORMAL_MAP_NV"/> >+ <enum name="GL_REFLECTION_MAP_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_texture_barrier" supported="gl|glcore"> >+ <require> >+ <command name="glTextureBarrierNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_texture_border_clamp" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_BORDER_COLOR_NV"/> >+ <enum name="GL_CLAMP_TO_BORDER_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_texture_compression_s3tc_update" supported="gles2"/> >+ <extension name="GL_NV_texture_compression_vtc" supported="gl"/> >+ <extension name="GL_NV_texture_env_combine4" supported="gl"> >+ <require> >+ <enum name="GL_COMBINE4_NV"/> >+ <enum name="GL_SOURCE3_RGB_NV"/> >+ <enum name="GL_SOURCE3_ALPHA_NV"/> >+ <enum name="GL_OPERAND3_RGB_NV"/> >+ <enum name="GL_OPERAND3_ALPHA_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_texture_expand_normal" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_UNSIGNED_REMAP_MODE_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_texture_multisample" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_COVERAGE_SAMPLES_NV"/> >+ <enum name="GL_TEXTURE_COLOR_SAMPLES_NV"/> >+ <command name="glTexImage2DMultisampleCoverageNV"/> >+ <command name="glTexImage3DMultisampleCoverageNV"/> >+ </require> >+ <require comment="Supported only if GL_EXT_direct_state_access is supported"> >+ <command name="glTextureImage2DMultisampleNV"/> >+ <command name="glTextureImage3DMultisampleNV"/> >+ <command name="glTextureImage2DMultisampleCoverageNV"/> >+ <command name="glTextureImage3DMultisampleCoverageNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_texture_npot_2D_mipmap" supported="gles2"/> >+ <extension name="GL_NV_texture_rectangle" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_RECTANGLE_NV"/> >+ <enum name="GL_TEXTURE_BINDING_RECTANGLE_NV"/> >+ <enum name="GL_PROXY_TEXTURE_RECTANGLE_NV"/> >+ <enum name="GL_MAX_RECTANGLE_TEXTURE_SIZE_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_texture_rectangle_compressed" supported="gl|glcore"/> >+ <extension name="GL_NV_texture_shader" supported="gl"> >+ <require> >+ <enum name="GL_OFFSET_TEXTURE_RECTANGLE_NV"/> >+ <enum name="GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV"/> >+ <enum name="GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV"/> >+ <enum name="GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV"/> >+ <enum name="GL_UNSIGNED_INT_S8_S8_8_8_NV"/> >+ <enum name="GL_UNSIGNED_INT_8_8_S8_S8_REV_NV"/> >+ <enum name="GL_DSDT_MAG_INTENSITY_NV"/> >+ <enum name="GL_SHADER_CONSISTENT_NV"/> >+ <enum name="GL_TEXTURE_SHADER_NV"/> >+ <enum name="GL_SHADER_OPERATION_NV"/> >+ <enum name="GL_CULL_MODES_NV"/> >+ <enum name="GL_OFFSET_TEXTURE_MATRIX_NV"/> >+ <enum name="GL_OFFSET_TEXTURE_SCALE_NV"/> >+ <enum name="GL_OFFSET_TEXTURE_BIAS_NV"/> >+ <enum name="GL_OFFSET_TEXTURE_2D_MATRIX_NV"/> >+ <enum name="GL_OFFSET_TEXTURE_2D_SCALE_NV"/> >+ <enum name="GL_OFFSET_TEXTURE_2D_BIAS_NV"/> >+ <enum name="GL_PREVIOUS_TEXTURE_INPUT_NV"/> >+ <enum name="GL_CONST_EYE_NV"/> >+ <enum name="GL_PASS_THROUGH_NV"/> >+ <enum name="GL_CULL_FRAGMENT_NV"/> >+ <enum name="GL_OFFSET_TEXTURE_2D_NV"/> >+ <enum name="GL_DEPENDENT_AR_TEXTURE_2D_NV"/> >+ <enum name="GL_DEPENDENT_GB_TEXTURE_2D_NV"/> >+ <enum name="GL_DOT_PRODUCT_NV"/> >+ <enum name="GL_DOT_PRODUCT_DEPTH_REPLACE_NV"/> >+ <enum name="GL_DOT_PRODUCT_TEXTURE_2D_NV"/> >+ <enum name="GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV"/> >+ <enum name="GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV"/> >+ <enum name="GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV"/> >+ <enum name="GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV"/> >+ <enum name="GL_HILO_NV"/> >+ <enum name="GL_DSDT_NV"/> >+ <enum name="GL_DSDT_MAG_NV"/> >+ <enum name="GL_DSDT_MAG_VIB_NV"/> >+ <enum name="GL_HILO16_NV"/> >+ <enum name="GL_SIGNED_HILO_NV"/> >+ <enum name="GL_SIGNED_HILO16_NV"/> >+ <enum name="GL_SIGNED_RGBA_NV"/> >+ <enum name="GL_SIGNED_RGBA8_NV"/> >+ <enum name="GL_SIGNED_RGB_NV"/> >+ <enum name="GL_SIGNED_RGB8_NV"/> >+ <enum name="GL_SIGNED_LUMINANCE_NV"/> >+ <enum name="GL_SIGNED_LUMINANCE8_NV"/> >+ <enum name="GL_SIGNED_LUMINANCE_ALPHA_NV"/> >+ <enum name="GL_SIGNED_LUMINANCE8_ALPHA8_NV"/> >+ <enum name="GL_SIGNED_ALPHA_NV"/> >+ <enum name="GL_SIGNED_ALPHA8_NV"/> >+ <enum name="GL_SIGNED_INTENSITY_NV"/> >+ <enum name="GL_SIGNED_INTENSITY8_NV"/> >+ <enum name="GL_DSDT8_NV"/> >+ <enum name="GL_DSDT8_MAG8_NV"/> >+ <enum name="GL_DSDT8_MAG8_INTENSITY8_NV"/> >+ <enum name="GL_SIGNED_RGB_UNSIGNED_ALPHA_NV"/> >+ <enum name="GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV"/> >+ <enum name="GL_HI_SCALE_NV"/> >+ <enum name="GL_LO_SCALE_NV"/> >+ <enum name="GL_DS_SCALE_NV"/> >+ <enum name="GL_DT_SCALE_NV"/> >+ <enum name="GL_MAGNITUDE_SCALE_NV"/> >+ <enum name="GL_VIBRANCE_SCALE_NV"/> >+ <enum name="GL_HI_BIAS_NV"/> >+ <enum name="GL_LO_BIAS_NV"/> >+ <enum name="GL_DS_BIAS_NV"/> >+ <enum name="GL_DT_BIAS_NV"/> >+ <enum name="GL_MAGNITUDE_BIAS_NV"/> >+ <enum name="GL_VIBRANCE_BIAS_NV"/> >+ <enum name="GL_TEXTURE_BORDER_VALUES_NV"/> >+ <enum name="GL_TEXTURE_HI_SIZE_NV"/> >+ <enum name="GL_TEXTURE_LO_SIZE_NV"/> >+ <enum name="GL_TEXTURE_DS_SIZE_NV"/> >+ <enum name="GL_TEXTURE_DT_SIZE_NV"/> >+ <enum name="GL_TEXTURE_MAG_SIZE_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_texture_shader2" supported="gl"> >+ <require> >+ <enum name="GL_DOT_PRODUCT_TEXTURE_3D_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_texture_shader3" supported="gl"> >+ <require> >+ <enum name="GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV"/> >+ <enum name="GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV"/> >+ <enum name="GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV"/> >+ <enum name="GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV"/> >+ <enum name="GL_OFFSET_HILO_TEXTURE_2D_NV"/> >+ <enum name="GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV"/> >+ <enum name="GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV"/> >+ <enum name="GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV"/> >+ <enum name="GL_DEPENDENT_HILO_TEXTURE_2D_NV"/> >+ <enum name="GL_DEPENDENT_RGB_TEXTURE_3D_NV"/> >+ <enum name="GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV"/> >+ <enum name="GL_DOT_PRODUCT_PASS_THROUGH_NV"/> >+ <enum name="GL_DOT_PRODUCT_TEXTURE_1D_NV"/> >+ <enum name="GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV"/> >+ <enum name="GL_HILO8_NV"/> >+ <enum name="GL_SIGNED_HILO8_NV"/> >+ <enum name="GL_FORCE_BLUE_TO_ONE_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_transform_feedback" supported="gl"> >+ <require> >+ <enum name="GL_BACK_PRIMARY_COLOR_NV"/> >+ <enum name="GL_BACK_SECONDARY_COLOR_NV"/> >+ <enum name="GL_TEXTURE_COORD_NV"/> >+ <enum name="GL_CLIP_DISTANCE_NV"/> >+ <enum name="GL_VERTEX_ID_NV"/> >+ <enum name="GL_PRIMITIVE_ID_NV"/> >+ <enum name="GL_GENERIC_ATTRIB_NV"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_ATTRIBS_NV"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV"/> >+ <enum name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV"/> >+ <enum name="GL_ACTIVE_VARYINGS_NV"/> >+ <enum name="GL_ACTIVE_VARYING_MAX_LENGTH_NV"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_VARYINGS_NV"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_START_NV"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_RECORD_NV"/> >+ <enum name="GL_PRIMITIVES_GENERATED_NV"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV"/> >+ <enum name="GL_RASTERIZER_DISCARD_NV"/> >+ <enum name="GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV"/> >+ <enum name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV"/> >+ <enum name="GL_INTERLEAVED_ATTRIBS_NV"/> >+ <enum name="GL_SEPARATE_ATTRIBS_NV"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_NV"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV"/> >+ <enum name="GL_LAYER_NV"/> >+ <command name="glBeginTransformFeedbackNV"/> >+ <command name="glEndTransformFeedbackNV"/> >+ <command name="glTransformFeedbackAttribsNV"/> >+ <command name="glBindBufferRangeNV"/> >+ <command name="glBindBufferOffsetNV"/> >+ <command name="glBindBufferBaseNV"/> >+ <command name="glTransformFeedbackVaryingsNV"/> >+ <command name="glActiveVaryingNV"/> >+ <command name="glGetVaryingLocationNV"/> >+ <command name="glGetActiveVaryingNV"/> >+ <command name="glGetTransformFeedbackVaryingNV"/> >+ </require> >+ <require comment="Extended by GL_ARB_transform_feedback3"> >+ <enum name="GL_NEXT_BUFFER_NV"/> >+ <enum name="GL_SKIP_COMPONENTS4_NV"/> >+ <enum name="GL_SKIP_COMPONENTS3_NV"/> >+ <enum name="GL_SKIP_COMPONENTS2_NV"/> >+ <enum name="GL_SKIP_COMPONENTS1_NV"/> >+ <command name="glTransformFeedbackStreamAttribsNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_transform_feedback2" supported="gl"> >+ <require> >+ <enum name="GL_TRANSFORM_FEEDBACK_NV"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV"/> >+ <enum name="GL_TRANSFORM_FEEDBACK_BINDING_NV"/> >+ <command name="glBindTransformFeedbackNV"/> >+ <command name="glDeleteTransformFeedbacksNV"/> >+ <command name="glGenTransformFeedbacksNV"/> >+ <command name="glIsTransformFeedbackNV"/> >+ <command name="glPauseTransformFeedbackNV"/> >+ <command name="glResumeTransformFeedbackNV"/> >+ <command name="glDrawTransformFeedbackNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_uniform_buffer_unified_memory" supported="gl|glcore"> >+ <require> >+ <enum name="GL_UNIFORM_BUFFER_UNIFIED_NV"/> >+ <enum name="GL_UNIFORM_BUFFER_ADDRESS_NV"/> >+ <enum name="GL_UNIFORM_BUFFER_LENGTH_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_vdpau_interop" supported="gl"> >+ <require> >+ <enum name="GL_SURFACE_STATE_NV"/> >+ <enum name="GL_SURFACE_REGISTERED_NV"/> >+ <enum name="GL_SURFACE_MAPPED_NV"/> >+ <enum name="GL_WRITE_DISCARD_NV"/> >+ <command name="glVDPAUInitNV"/> >+ <command name="glVDPAUFiniNV"/> >+ <command name="glVDPAURegisterVideoSurfaceNV"/> >+ <command name="glVDPAURegisterOutputSurfaceNV"/> >+ <command name="glVDPAUIsSurfaceNV"/> >+ <command name="glVDPAUUnregisterSurfaceNV"/> >+ <command name="glVDPAUGetSurfaceivNV"/> >+ <command name="glVDPAUSurfaceAccessNV"/> >+ <command name="glVDPAUMapSurfacesNV"/> >+ <command name="glVDPAUUnmapSurfacesNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_vertex_array_range" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_ARRAY_RANGE_NV"/> >+ <enum name="GL_VERTEX_ARRAY_RANGE_LENGTH_NV"/> >+ <enum name="GL_VERTEX_ARRAY_RANGE_VALID_NV"/> >+ <enum name="GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV"/> >+ <enum name="GL_VERTEX_ARRAY_RANGE_POINTER_NV"/> >+ <command name="glFlushVertexArrayRangeNV"/> >+ <command name="glVertexArrayRangeNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_vertex_array_range2" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_vertex_attrib_integer_64bit" supported="gl|glcore"> >+ <require> >+ <enum name="GL_INT64_NV"/> >+ <enum name="GL_UNSIGNED_INT64_NV"/> >+ <command name="glVertexAttribL1i64NV"/> >+ <command name="glVertexAttribL2i64NV"/> >+ <command name="glVertexAttribL3i64NV"/> >+ <command name="glVertexAttribL4i64NV"/> >+ <command name="glVertexAttribL1i64vNV"/> >+ <command name="glVertexAttribL2i64vNV"/> >+ <command name="glVertexAttribL3i64vNV"/> >+ <command name="glVertexAttribL4i64vNV"/> >+ <command name="glVertexAttribL1ui64NV"/> >+ <command name="glVertexAttribL2ui64NV"/> >+ <command name="glVertexAttribL3ui64NV"/> >+ <command name="glVertexAttribL4ui64NV"/> >+ <command name="glVertexAttribL1ui64vNV"/> >+ <command name="glVertexAttribL2ui64vNV"/> >+ <command name="glVertexAttribL3ui64vNV"/> >+ <command name="glVertexAttribL4ui64vNV"/> >+ <command name="glGetVertexAttribLi64vNV"/> >+ <command name="glGetVertexAttribLui64vNV"/> >+ <command name="glVertexAttribLFormatNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_vertex_buffer_unified_memory" supported="gl|glcore"> >+ <require> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV"/> >+ <enum name="GL_ELEMENT_ARRAY_UNIFIED_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV"/> >+ <enum name="GL_VERTEX_ARRAY_ADDRESS_NV"/> >+ <enum name="GL_NORMAL_ARRAY_ADDRESS_NV"/> >+ <enum name="GL_COLOR_ARRAY_ADDRESS_NV"/> >+ <enum name="GL_INDEX_ARRAY_ADDRESS_NV"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_ADDRESS_NV"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_ADDRESS_NV"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV"/> >+ <enum name="GL_FOG_COORD_ARRAY_ADDRESS_NV"/> >+ <enum name="GL_ELEMENT_ARRAY_ADDRESS_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV"/> >+ <enum name="GL_VERTEX_ARRAY_LENGTH_NV"/> >+ <enum name="GL_NORMAL_ARRAY_LENGTH_NV"/> >+ <enum name="GL_COLOR_ARRAY_LENGTH_NV"/> >+ <enum name="GL_INDEX_ARRAY_LENGTH_NV"/> >+ <enum name="GL_TEXTURE_COORD_ARRAY_LENGTH_NV"/> >+ <enum name="GL_EDGE_FLAG_ARRAY_LENGTH_NV"/> >+ <enum name="GL_SECONDARY_COLOR_ARRAY_LENGTH_NV"/> >+ <enum name="GL_FOG_COORD_ARRAY_LENGTH_NV"/> >+ <enum name="GL_ELEMENT_ARRAY_LENGTH_NV"/> >+ <enum name="GL_DRAW_INDIRECT_UNIFIED_NV"/> >+ <enum name="GL_DRAW_INDIRECT_ADDRESS_NV"/> >+ <enum name="GL_DRAW_INDIRECT_LENGTH_NV"/> >+ <command name="glBufferAddressRangeNV"/> >+ <command name="glVertexFormatNV"/> >+ <command name="glNormalFormatNV"/> >+ <command name="glColorFormatNV"/> >+ <command name="glIndexFormatNV"/> >+ <command name="glTexCoordFormatNV"/> >+ <command name="glEdgeFlagFormatNV"/> >+ <command name="glSecondaryColorFormatNV"/> >+ <command name="glFogCoordFormatNV"/> >+ <command name="glVertexAttribFormatNV"/> >+ <command name="glVertexAttribIFormatNV"/> >+ <command name="glGetIntegerui64i_vNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_vertex_program" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_PROGRAM_NV"/> >+ <enum name="GL_VERTEX_STATE_PROGRAM_NV"/> >+ <enum name="GL_ATTRIB_ARRAY_SIZE_NV"/> >+ <enum name="GL_ATTRIB_ARRAY_STRIDE_NV"/> >+ <enum name="GL_ATTRIB_ARRAY_TYPE_NV"/> >+ <enum name="GL_CURRENT_ATTRIB_NV"/> >+ <enum name="GL_PROGRAM_LENGTH_NV"/> >+ <enum name="GL_PROGRAM_STRING_NV"/> >+ <enum name="GL_MODELVIEW_PROJECTION_NV"/> >+ <enum name="GL_IDENTITY_NV"/> >+ <enum name="GL_INVERSE_NV"/> >+ <enum name="GL_TRANSPOSE_NV"/> >+ <enum name="GL_INVERSE_TRANSPOSE_NV"/> >+ <enum name="GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV"/> >+ <enum name="GL_MAX_TRACK_MATRICES_NV"/> >+ <enum name="GL_MATRIX0_NV"/> >+ <enum name="GL_MATRIX1_NV"/> >+ <enum name="GL_MATRIX2_NV"/> >+ <enum name="GL_MATRIX3_NV"/> >+ <enum name="GL_MATRIX4_NV"/> >+ <enum name="GL_MATRIX5_NV"/> >+ <enum name="GL_MATRIX6_NV"/> >+ <enum name="GL_MATRIX7_NV"/> >+ <enum name="GL_CURRENT_MATRIX_STACK_DEPTH_NV"/> >+ <enum name="GL_CURRENT_MATRIX_NV"/> >+ <enum name="GL_VERTEX_PROGRAM_POINT_SIZE_NV"/> >+ <enum name="GL_VERTEX_PROGRAM_TWO_SIDE_NV"/> >+ <enum name="GL_PROGRAM_PARAMETER_NV"/> >+ <enum name="GL_ATTRIB_ARRAY_POINTER_NV"/> >+ <enum name="GL_PROGRAM_TARGET_NV"/> >+ <enum name="GL_PROGRAM_RESIDENT_NV"/> >+ <enum name="GL_TRACK_MATRIX_NV"/> >+ <enum name="GL_TRACK_MATRIX_TRANSFORM_NV"/> >+ <enum name="GL_VERTEX_PROGRAM_BINDING_NV"/> >+ <enum name="GL_PROGRAM_ERROR_POSITION_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY0_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY1_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY2_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY3_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY4_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY5_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY6_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY7_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY8_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY9_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY10_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY11_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY12_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY13_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY14_NV"/> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY15_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB0_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB1_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB2_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB3_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB4_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB5_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB6_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB7_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB8_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB9_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB10_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB11_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB12_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB13_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB14_4_NV"/> >+ <enum name="GL_MAP1_VERTEX_ATTRIB15_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB0_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB1_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB2_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB3_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB4_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB5_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB6_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB7_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB8_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB9_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB10_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB11_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB12_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB13_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB14_4_NV"/> >+ <enum name="GL_MAP2_VERTEX_ATTRIB15_4_NV"/> >+ <command name="glAreProgramsResidentNV"/> >+ <command name="glBindProgramNV"/> >+ <command name="glDeleteProgramsNV"/> >+ <command name="glExecuteProgramNV"/> >+ <command name="glGenProgramsNV"/> >+ <command name="glGetProgramParameterdvNV"/> >+ <command name="glGetProgramParameterfvNV"/> >+ <command name="glGetProgramivNV"/> >+ <command name="glGetProgramStringNV"/> >+ <command name="glGetTrackMatrixivNV"/> >+ <command name="glGetVertexAttribdvNV"/> >+ <command name="glGetVertexAttribfvNV"/> >+ <command name="glGetVertexAttribivNV"/> >+ <command name="glGetVertexAttribPointervNV"/> >+ <command name="glIsProgramNV"/> >+ <command name="glLoadProgramNV"/> >+ <command name="glProgramParameter4dNV"/> >+ <command name="glProgramParameter4dvNV"/> >+ <command name="glProgramParameter4fNV"/> >+ <command name="glProgramParameter4fvNV"/> >+ <command name="glProgramParameters4dvNV"/> >+ <command name="glProgramParameters4fvNV"/> >+ <command name="glRequestResidentProgramsNV"/> >+ <command name="glTrackMatrixNV"/> >+ <command name="glVertexAttribPointerNV"/> >+ <command name="glVertexAttrib1dNV"/> >+ <command name="glVertexAttrib1dvNV"/> >+ <command name="glVertexAttrib1fNV"/> >+ <command name="glVertexAttrib1fvNV"/> >+ <command name="glVertexAttrib1sNV"/> >+ <command name="glVertexAttrib1svNV"/> >+ <command name="glVertexAttrib2dNV"/> >+ <command name="glVertexAttrib2dvNV"/> >+ <command name="glVertexAttrib2fNV"/> >+ <command name="glVertexAttrib2fvNV"/> >+ <command name="glVertexAttrib2sNV"/> >+ <command name="glVertexAttrib2svNV"/> >+ <command name="glVertexAttrib3dNV"/> >+ <command name="glVertexAttrib3dvNV"/> >+ <command name="glVertexAttrib3fNV"/> >+ <command name="glVertexAttrib3fvNV"/> >+ <command name="glVertexAttrib3sNV"/> >+ <command name="glVertexAttrib3svNV"/> >+ <command name="glVertexAttrib4dNV"/> >+ <command name="glVertexAttrib4dvNV"/> >+ <command name="glVertexAttrib4fNV"/> >+ <command name="glVertexAttrib4fvNV"/> >+ <command name="glVertexAttrib4sNV"/> >+ <command name="glVertexAttrib4svNV"/> >+ <command name="glVertexAttrib4ubNV"/> >+ <command name="glVertexAttrib4ubvNV"/> >+ <command name="glVertexAttribs1dvNV"/> >+ <command name="glVertexAttribs1fvNV"/> >+ <command name="glVertexAttribs1svNV"/> >+ <command name="glVertexAttribs2dvNV"/> >+ <command name="glVertexAttribs2fvNV"/> >+ <command name="glVertexAttribs2svNV"/> >+ <command name="glVertexAttribs3dvNV"/> >+ <command name="glVertexAttribs3fvNV"/> >+ <command name="glVertexAttribs3svNV"/> >+ <command name="glVertexAttribs4dvNV"/> >+ <command name="glVertexAttribs4fvNV"/> >+ <command name="glVertexAttribs4svNV"/> >+ <command name="glVertexAttribs4ubvNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_vertex_program1_1" supported="gl"/> >+ <extension name="GL_NV_vertex_program2" supported="gl"/> >+ <extension name="GL_NV_vertex_program2_option" supported="gl"> >+ <require> >+ <enum name="GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV"/> >+ <enum name="GL_MAX_PROGRAM_CALL_DEPTH_NV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_vertex_program3" supported="gl"> >+ <require> >+ <enum name="GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_vertex_program4" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV"/> >+ <command name="glVertexAttribI1iEXT"/> >+ <command name="glVertexAttribI2iEXT"/> >+ <command name="glVertexAttribI3iEXT"/> >+ <command name="glVertexAttribI4iEXT"/> >+ <command name="glVertexAttribI1uiEXT"/> >+ <command name="glVertexAttribI2uiEXT"/> >+ <command name="glVertexAttribI3uiEXT"/> >+ <command name="glVertexAttribI4uiEXT"/> >+ <command name="glVertexAttribI1ivEXT"/> >+ <command name="glVertexAttribI2ivEXT"/> >+ <command name="glVertexAttribI3ivEXT"/> >+ <command name="glVertexAttribI4ivEXT"/> >+ <command name="glVertexAttribI1uivEXT"/> >+ <command name="glVertexAttribI2uivEXT"/> >+ <command name="glVertexAttribI3uivEXT"/> >+ <command name="glVertexAttribI4uivEXT"/> >+ <command name="glVertexAttribI4bvEXT"/> >+ <command name="glVertexAttribI4svEXT"/> >+ <command name="glVertexAttribI4ubvEXT"/> >+ <command name="glVertexAttribI4usvEXT"/> >+ <command name="glVertexAttribIPointerEXT"/> >+ <command name="glGetVertexAttribIivEXT"/> >+ <command name="glGetVertexAttribIuivEXT"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_video_capture" supported="gl"> >+ <require> >+ <enum name="GL_VIDEO_BUFFER_NV"/> >+ <enum name="GL_VIDEO_BUFFER_BINDING_NV"/> >+ <enum name="GL_FIELD_UPPER_NV"/> >+ <enum name="GL_FIELD_LOWER_NV"/> >+ <enum name="GL_NUM_VIDEO_CAPTURE_STREAMS_NV"/> >+ <enum name="GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV"/> >+ <enum name="GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV"/> >+ <enum name="GL_LAST_VIDEO_CAPTURE_STATUS_NV"/> >+ <enum name="GL_VIDEO_BUFFER_PITCH_NV"/> >+ <enum name="GL_VIDEO_COLOR_CONVERSION_MATRIX_NV"/> >+ <enum name="GL_VIDEO_COLOR_CONVERSION_MAX_NV"/> >+ <enum name="GL_VIDEO_COLOR_CONVERSION_MIN_NV"/> >+ <enum name="GL_VIDEO_COLOR_CONVERSION_OFFSET_NV"/> >+ <enum name="GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV"/> >+ <enum name="GL_PARTIAL_SUCCESS_NV"/> >+ <enum name="GL_SUCCESS_NV"/> >+ <enum name="GL_FAILURE_NV"/> >+ <enum name="GL_YCBYCR8_422_NV"/> >+ <enum name="GL_YCBAYCR8A_4224_NV"/> >+ <enum name="GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV"/> >+ <enum name="GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV"/> >+ <enum name="GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV"/> >+ <enum name="GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV"/> >+ <enum name="GL_Z4Y12Z4CB12Z4CR12_444_NV"/> >+ <enum name="GL_VIDEO_CAPTURE_FRAME_WIDTH_NV"/> >+ <enum name="GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV"/> >+ <enum name="GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV"/> >+ <enum name="GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV"/> >+ <enum name="GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV"/> >+ <command name="glBeginVideoCaptureNV"/> >+ <command name="glBindVideoCaptureStreamBufferNV"/> >+ <command name="glBindVideoCaptureStreamTextureNV"/> >+ <command name="glEndVideoCaptureNV"/> >+ <command name="glGetVideoCaptureivNV"/> >+ <command name="glGetVideoCaptureStreamivNV"/> >+ <command name="glGetVideoCaptureStreamfvNV"/> >+ <command name="glGetVideoCaptureStreamdvNV"/> >+ <command name="glVideoCaptureNV"/> >+ <command name="glVideoCaptureStreamParameterivNV"/> >+ <command name="glVideoCaptureStreamParameterfvNV"/> >+ <command name="glVideoCaptureStreamParameterdvNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_viewport_array" supported="gles2"> >+ <require> >+ <enum name="GL_MAX_VIEWPORTS_NV"/> >+ <enum name="GL_VIEWPORT_SUBPIXEL_BITS_NV"/> >+ <enum name="GL_VIEWPORT_BOUNDS_RANGE_NV"/> >+ <enum name="GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV"/> >+ <enum name="GL_SCISSOR_BOX"/> >+ <enum name="GL_VIEWPORT"/> >+ <enum name="GL_DEPTH_RANGE"/> >+ <enum name="GL_SCISSOR_TEST"/> >+ <command name="glViewportArrayvNV"/> >+ <command name="glViewportIndexedfNV"/> >+ <command name="glViewportIndexedfvNV"/> >+ <command name="glScissorArrayvNV"/> >+ <command name="glScissorIndexedNV"/> >+ <command name="glScissorIndexedvNV"/> >+ <command name="glDepthRangeArrayfvNV"/> >+ <command name="glDepthRangeIndexedfNV"/> >+ <command name="glGetFloati_vNV"/> >+ <command name="glEnableiNV"/> >+ <command name="glDisableiNV"/> >+ <command name="glIsEnablediNV"/> >+ </require> >+ </extension> >+ <extension name="GL_NV_viewport_array2" supported="gl|glcore|gles2"/> >+ <extension name="GL_NV_viewport_swizzle" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV"/> >+ <enum name="GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV"/> >+ <enum name="GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV"/> >+ <enum name="GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV"/> >+ <enum name="GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV"/> >+ <enum name="GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV"/> >+ <enum name="GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV"/> >+ <enum name="GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV"/> >+ <enum name="GL_VIEWPORT_SWIZZLE_X_NV"/> >+ <enum name="GL_VIEWPORT_SWIZZLE_Y_NV"/> >+ <enum name="GL_VIEWPORT_SWIZZLE_Z_NV"/> >+ <enum name="GL_VIEWPORT_SWIZZLE_W_NV"/> >+ <command name="glViewportSwizzleNV"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_EGL_image" supported="gles1|gles2"> >+ <require> >+ <type name="GLeglImageOES"/> >+ <command name="glEGLImageTargetTexture2DOES"/> >+ <command name="glEGLImageTargetRenderbufferStorageOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_EGL_image_external" supported="gles1|gles2"> >+ <require> >+ <type name="GLeglImageOES"/> >+ <enum name="GL_TEXTURE_EXTERNAL_OES"/> >+ <enum name="GL_TEXTURE_BINDING_EXTERNAL_OES"/> >+ <enum name="GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES"/> >+ </require> >+ <require api="gles2"> >+ <enum name="GL_SAMPLER_EXTERNAL_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_EGL_image_external_essl3" supported="gles2"/> >+ <extension name="GL_OES_blend_equation_separate" supported="gles1"> >+ <require> >+ <enum name="GL_BLEND_EQUATION_RGB_OES"/> >+ <enum name="GL_BLEND_EQUATION_ALPHA_OES"/> >+ <command name="glBlendEquationSeparateOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_blend_func_separate" supported="gles1"> >+ <require> >+ <enum name="GL_BLEND_DST_RGB_OES"/> >+ <enum name="GL_BLEND_SRC_RGB_OES"/> >+ <enum name="GL_BLEND_DST_ALPHA_OES"/> >+ <enum name="GL_BLEND_SRC_ALPHA_OES"/> >+ <command name="glBlendFuncSeparateOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_blend_subtract" supported="gles1"> >+ <require> >+ <enum name="GL_BLEND_EQUATION_OES"/> >+ <enum name="GL_FUNC_ADD_OES"/> >+ <enum name="GL_FUNC_SUBTRACT_OES"/> >+ <enum name="GL_FUNC_REVERSE_SUBTRACT_OES"/> >+ <command name="glBlendEquationOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_byte_coordinates" supported="gl|gles1"> >+ <require> >+ <type name="GLbyte"/> >+ <enum name="GL_BYTE"/> >+ </require> >+ <require api="gl" comment="Immediate-mode entry points don't exist in ES 1.x"> >+ <command name="glMultiTexCoord1bOES"/> >+ <command name="glMultiTexCoord1bvOES"/> >+ <command name="glMultiTexCoord2bOES"/> >+ <command name="glMultiTexCoord2bvOES"/> >+ <command name="glMultiTexCoord3bOES"/> >+ <command name="glMultiTexCoord3bvOES"/> >+ <command name="glMultiTexCoord4bOES"/> >+ <command name="glMultiTexCoord4bvOES"/> >+ <command name="glTexCoord1bOES"/> >+ <command name="glTexCoord1bvOES"/> >+ <command name="glTexCoord2bOES"/> >+ <command name="glTexCoord2bvOES"/> >+ <command name="glTexCoord3bOES"/> >+ <command name="glTexCoord3bvOES"/> >+ <command name="glTexCoord4bOES"/> >+ <command name="glTexCoord4bvOES"/> >+ <command name="glVertex2bOES"/> >+ <command name="glVertex2bvOES"/> >+ <command name="glVertex3bOES"/> >+ <command name="glVertex3bvOES"/> >+ <command name="glVertex4bOES"/> >+ <command name="glVertex4bvOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_compressed_ETC1_RGB8_sub_texture" supported="gles1|gles2"/> >+ <extension name="GL_OES_compressed_ETC1_RGB8_texture" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_ETC1_RGB8_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_compressed_paletted_texture" supported="gl|gles1|gles2"> >+ <require> >+ <enum name="GL_PALETTE4_RGB8_OES"/> >+ <enum name="GL_PALETTE4_RGBA8_OES"/> >+ <enum name="GL_PALETTE4_R5_G6_B5_OES"/> >+ <enum name="GL_PALETTE4_RGBA4_OES"/> >+ <enum name="GL_PALETTE4_RGB5_A1_OES"/> >+ <enum name="GL_PALETTE8_RGB8_OES"/> >+ <enum name="GL_PALETTE8_RGBA8_OES"/> >+ <enum name="GL_PALETTE8_R5_G6_B5_OES"/> >+ <enum name="GL_PALETTE8_RGBA4_OES"/> >+ <enum name="GL_PALETTE8_RGB5_A1_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_copy_image" supported="gles2"> >+ <require> >+ <command name="glCopyImageSubDataOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_depth24" supported="gles1|gles2|glsc2"> >+ <require> >+ <enum name="GL_DEPTH_COMPONENT24_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_depth32" supported="gles1|gles2|glsc2"> >+ <require> >+ <enum name="GL_DEPTH_COMPONENT32_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_depth_texture" supported="gles2"> >+ <require> >+ <enum name="GL_DEPTH_COMPONENT"/> >+ <enum name="GL_UNSIGNED_SHORT"/> >+ <enum name="GL_UNSIGNED_INT"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_draw_buffers_indexed" supported="gles2"> >+ <require> >+ <enum name="GL_BLEND_EQUATION_RGB"/> >+ <enum name="GL_BLEND_EQUATION_ALPHA"/> >+ <enum name="GL_BLEND_SRC_RGB"/> >+ <enum name="GL_BLEND_SRC_ALPHA"/> >+ <enum name="GL_BLEND_DST_RGB"/> >+ <enum name="GL_BLEND_DST_ALPHA"/> >+ <enum name="GL_COLOR_WRITEMASK"/> >+ <enum name="GL_BLEND"/> >+ <enum name="GL_FUNC_ADD"/> >+ <enum name="GL_FUNC_SUBTRACT"/> >+ <enum name="GL_FUNC_REVERSE_SUBTRACT"/> >+ <enum name="GL_MIN"/> >+ <enum name="GL_MAX"/> >+ <enum name="GL_ZERO"/> >+ <enum name="GL_ONE"/> >+ <enum name="GL_SRC_COLOR"/> >+ <enum name="GL_ONE_MINUS_SRC_COLOR"/> >+ <enum name="GL_DST_COLOR"/> >+ <enum name="GL_ONE_MINUS_DST_COLOR"/> >+ <enum name="GL_SRC_ALPHA"/> >+ <enum name="GL_ONE_MINUS_SRC_ALPHA"/> >+ <enum name="GL_DST_ALPHA"/> >+ <enum name="GL_ONE_MINUS_DST_ALPHA"/> >+ <enum name="GL_CONSTANT_COLOR"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_COLOR"/> >+ <enum name="GL_CONSTANT_ALPHA"/> >+ <enum name="GL_ONE_MINUS_CONSTANT_ALPHA"/> >+ <enum name="GL_SRC_ALPHA_SATURATE"/> >+ <command name="glEnableiOES"/> >+ <command name="glDisableiOES"/> >+ <command name="glBlendEquationiOES"/> >+ <command name="glBlendEquationSeparateiOES"/> >+ <command name="glBlendFunciOES"/> >+ <command name="glBlendFuncSeparateiOES"/> >+ <command name="glColorMaskiOES"/> >+ <command name="glIsEnablediOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_draw_elements_base_vertex" supported="gles2"> >+ <require> >+ <command name="glDrawElementsBaseVertexOES"/> >+ <command name="glDrawRangeElementsBaseVertexOES" comment="Supported only if OpenGL ES 3.0 is supported"/> >+ <command name="glDrawElementsInstancedBaseVertexOES" comment="Supported only if OpenGL ES 3.0 is supported"/> >+ <command name="glMultiDrawElementsBaseVertexEXT" comment="Supported only if GL_EXT_multi_draw_arrays is supported"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_draw_texture" supported="gles1"> >+ <require> >+ <enum name="GL_TEXTURE_CROP_RECT_OES"/> >+ <command name="glDrawTexsOES"/> >+ <command name="glDrawTexiOES"/> >+ <command name="glDrawTexxOES"/> >+ <command name="glDrawTexsvOES"/> >+ <command name="glDrawTexivOES"/> >+ <command name="glDrawTexxvOES"/> >+ <command name="glDrawTexfOES"/> >+ <command name="glDrawTexfvOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_element_index_uint" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_UNSIGNED_INT"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_extended_matrix_palette" supported="gles1"/> >+ <extension name="GL_OES_fbo_render_mipmap" supported="gles1|gles2"/> >+ <extension name="GL_OES_fixed_point" supported="gl|gles1"> >+ <require> >+ <enum name="GL_FIXED_OES"/> >+ <command name="glAlphaFuncxOES"/> >+ <command name="glClearColorxOES"/> >+ <command name="glClearDepthxOES"/> >+ <command name="glClipPlanexOES"/> >+ <command name="glColor4xOES"/> >+ <command name="glDepthRangexOES"/> >+ <command name="glFogxOES"/> >+ <command name="glFogxvOES"/> >+ <command name="glFrustumxOES"/> >+ <command name="glGetClipPlanexOES"/> >+ <command name="glGetFixedvOES"/> >+ <command name="glGetTexEnvxvOES"/> >+ <command name="glGetTexParameterxvOES"/> >+ <command name="glLightModelxOES"/> >+ <command name="glLightModelxvOES"/> >+ <command name="glLightxOES"/> >+ <command name="glLightxvOES"/> >+ <command name="glLineWidthxOES"/> >+ <command name="glLoadMatrixxOES"/> >+ <command name="glMaterialxOES"/> >+ <command name="glMaterialxvOES"/> >+ <command name="glMultMatrixxOES"/> >+ <command name="glMultiTexCoord4xOES"/> >+ <command name="glNormal3xOES"/> >+ <command name="glOrthoxOES"/> >+ <command name="glPointParameterxvOES"/> >+ <command name="glPointSizexOES"/> >+ <command name="glPolygonOffsetxOES"/> >+ <command name="glRotatexOES"/> >+ <command name="glScalexOES"/> >+ <command name="glTexEnvxOES"/> >+ <command name="glTexEnvxvOES"/> >+ <command name="glTexParameterxOES"/> >+ <command name="glTexParameterxvOES"/> >+ <command name="glTranslatexOES"/> >+ </require> >+ <require api="gles1" comment="Entry points not in the extension spec, but in the Khronos glext.h. Included for backward compatibility."> >+ <command name="glGetLightxvOES"/> >+ <command name="glGetMaterialxvOES"/> >+ <command name="glPointParameterxOES"/> >+ <command name="glSampleCoveragexOES"/> >+ </require> >+ <require api="gl" comment="Entry points in the extension spec, but not the Khronos glext.h. Correspond to GL-only features it's unlikely were ever implemented against ES 1.x."> >+ <command name="glAccumxOES"/> >+ <command name="glBitmapxOES"/> >+ <command name="glBlendColorxOES"/> >+ <command name="glClearAccumxOES"/> >+ <command name="glColor3xOES"/> >+ <command name="glColor3xvOES"/> >+ <command name="glColor4xvOES"/> >+ <command name="glConvolutionParameterxOES"/> >+ <command name="glConvolutionParameterxvOES"/> >+ <command name="glEvalCoord1xOES"/> >+ <command name="glEvalCoord1xvOES"/> >+ <command name="glEvalCoord2xOES"/> >+ <command name="glEvalCoord2xvOES"/> >+ <command name="glFeedbackBufferxOES"/> >+ <command name="glGetConvolutionParameterxvOES"/> >+ <command name="glGetHistogramParameterxvOES"/> >+ <command name="glGetLightxOES"/> >+ <command name="glGetMapxvOES"/> >+ <command name="glGetMaterialxOES"/> >+ <command name="glGetPixelMapxv"/> >+ <command name="glGetTexGenxvOES"/> >+ <command name="glGetTexLevelParameterxvOES"/> >+ <command name="glIndexxOES"/> >+ <command name="glIndexxvOES"/> >+ <command name="glLoadTransposeMatrixxOES"/> >+ <command name="glMap1xOES"/> >+ <command name="glMap2xOES"/> >+ <command name="glMapGrid1xOES"/> >+ <command name="glMapGrid2xOES"/> >+ <command name="glMultTransposeMatrixxOES"/> >+ <command name="glMultiTexCoord1xOES"/> >+ <command name="glMultiTexCoord1xvOES"/> >+ <command name="glMultiTexCoord2xOES"/> >+ <command name="glMultiTexCoord2xvOES"/> >+ <command name="glMultiTexCoord3xOES"/> >+ <command name="glMultiTexCoord3xvOES"/> >+ <command name="glMultiTexCoord4xvOES"/> >+ <command name="glNormal3xvOES"/> >+ <command name="glPassThroughxOES"/> >+ <command name="glPixelMapx"/> >+ <command name="glPixelStorex"/> >+ <command name="glPixelTransferxOES"/> >+ <command name="glPixelZoomxOES"/> >+ <command name="glPrioritizeTexturesxOES"/> >+ <command name="glRasterPos2xOES"/> >+ <command name="glRasterPos2xvOES"/> >+ <command name="glRasterPos3xOES"/> >+ <command name="glRasterPos3xvOES"/> >+ <command name="glRasterPos4xOES"/> >+ <command name="glRasterPos4xvOES"/> >+ <command name="glRectxOES"/> >+ <command name="glRectxvOES"/> >+ <command name="glTexCoord1xOES"/> >+ <command name="glTexCoord1xvOES"/> >+ <command name="glTexCoord2xOES"/> >+ <command name="glTexCoord2xvOES"/> >+ <command name="glTexCoord3xOES"/> >+ <command name="glTexCoord3xvOES"/> >+ <command name="glTexCoord4xOES"/> >+ <command name="glTexCoord4xvOES"/> >+ <command name="glTexGenxOES"/> >+ <command name="glTexGenxvOES"/> >+ <command name="glVertex2xOES"/> >+ <command name="glVertex2xvOES"/> >+ <command name="glVertex3xOES"/> >+ <command name="glVertex3xvOES"/> >+ <command name="glVertex4xOES"/> >+ <command name="glVertex4xvOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_fragment_precision_high" supported="gles2"> >+ <require> >+ </require> >+ </extension> >+ <extension name="GL_OES_framebuffer_object" supported="gles1"> >+ <require> >+ <enum name="GL_NONE_OES"/> >+ <enum name="GL_FRAMEBUFFER_OES"/> >+ <enum name="GL_RENDERBUFFER_OES"/> >+ <enum name="GL_RGBA4_OES"/> >+ <enum name="GL_RGB5_A1_OES"/> >+ <enum name="GL_RGB565_OES"/> >+ <enum name="GL_DEPTH_COMPONENT16_OES"/> >+ <enum name="GL_RENDERBUFFER_WIDTH_OES"/> >+ <enum name="GL_RENDERBUFFER_HEIGHT_OES"/> >+ <enum name="GL_RENDERBUFFER_INTERNAL_FORMAT_OES"/> >+ <enum name="GL_RENDERBUFFER_RED_SIZE_OES"/> >+ <enum name="GL_RENDERBUFFER_GREEN_SIZE_OES"/> >+ <enum name="GL_RENDERBUFFER_BLUE_SIZE_OES"/> >+ <enum name="GL_RENDERBUFFER_ALPHA_SIZE_OES"/> >+ <enum name="GL_RENDERBUFFER_DEPTH_SIZE_OES"/> >+ <enum name="GL_RENDERBUFFER_STENCIL_SIZE_OES"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES"/> >+ <enum name="GL_COLOR_ATTACHMENT0_OES"/> >+ <enum name="GL_DEPTH_ATTACHMENT_OES"/> >+ <enum name="GL_STENCIL_ATTACHMENT_OES"/> >+ <enum name="GL_FRAMEBUFFER_COMPLETE_OES"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES"/> >+ <enum name="GL_FRAMEBUFFER_UNSUPPORTED_OES"/> >+ <enum name="GL_FRAMEBUFFER_BINDING_OES"/> >+ <enum name="GL_RENDERBUFFER_BINDING_OES"/> >+ <enum name="GL_MAX_RENDERBUFFER_SIZE_OES"/> >+ <enum name="GL_INVALID_FRAMEBUFFER_OPERATION_OES"/> >+ <command name="glIsRenderbufferOES"/> >+ <command name="glBindRenderbufferOES"/> >+ <command name="glDeleteRenderbuffersOES"/> >+ <command name="glGenRenderbuffersOES"/> >+ <command name="glRenderbufferStorageOES"/> >+ <command name="glGetRenderbufferParameterivOES"/> >+ <command name="glIsFramebufferOES"/> >+ <command name="glBindFramebufferOES"/> >+ <command name="glDeleteFramebuffersOES"/> >+ <command name="glGenFramebuffersOES"/> >+ <command name="glCheckFramebufferStatusOES"/> >+ <command name="glFramebufferRenderbufferOES"/> >+ <command name="glFramebufferTexture2DOES"/> >+ <command name="glGetFramebufferAttachmentParameterivOES"/> >+ <command name="glGenerateMipmapOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_geometry_point_size" supported="gles2"/> >+ <extension name="GL_OES_geometry_shader" supported="gles2"> >+ <require> >+ <enum name="GL_GEOMETRY_SHADER_OES"/> >+ <enum name="GL_GEOMETRY_SHADER_BIT_OES"/> >+ <enum name="GL_GEOMETRY_LINKED_VERTICES_OUT_OES"/> >+ <enum name="GL_GEOMETRY_LINKED_INPUT_TYPE_OES"/> >+ <enum name="GL_GEOMETRY_LINKED_OUTPUT_TYPE_OES"/> >+ <enum name="GL_GEOMETRY_SHADER_INVOCATIONS_OES"/> >+ <enum name="GL_LAYER_PROVOKING_VERTEX_OES"/> >+ <enum name="GL_LINES_ADJACENCY_OES"/> >+ <enum name="GL_LINE_STRIP_ADJACENCY_OES"/> >+ <enum name="GL_TRIANGLES_ADJACENCY_OES"/> >+ <enum name="GL_TRIANGLE_STRIP_ADJACENCY_OES"/> >+ <enum name="GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_OES"/> >+ <enum name="GL_MAX_GEOMETRY_UNIFORM_BLOCKS_OES"/> >+ <enum name="GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_OES"/> >+ <enum name="GL_MAX_GEOMETRY_INPUT_COMPONENTS_OES"/> >+ <enum name="GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_OES"/> >+ <enum name="GL_MAX_GEOMETRY_OUTPUT_VERTICES_OES"/> >+ <enum name="GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_OES"/> >+ <enum name="GL_MAX_GEOMETRY_SHADER_INVOCATIONS_OES"/> >+ <enum name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_OES"/> >+ <enum name="GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_OES"/> >+ <enum name="GL_MAX_GEOMETRY_ATOMIC_COUNTERS_OES"/> >+ <enum name="GL_MAX_GEOMETRY_IMAGE_UNIFORMS_OES"/> >+ <enum name="GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_OES"/> >+ <enum name="GL_FIRST_VERTEX_CONVENTION_OES"/> >+ <enum name="GL_LAST_VERTEX_CONVENTION_OES"/> >+ <enum name="GL_UNDEFINED_VERTEX_OES"/> >+ <enum name="GL_PRIMITIVES_GENERATED_OES"/> >+ <enum name="GL_FRAMEBUFFER_DEFAULT_LAYERS_OES"/> >+ <enum name="GL_MAX_FRAMEBUFFER_LAYERS_OES"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_OES"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED_OES"/> >+ <enum name="GL_REFERENCED_BY_GEOMETRY_SHADER_OES"/> >+ <command name="glFramebufferTextureOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_get_program_binary" supported="gles2"> >+ <require> >+ <enum name="GL_PROGRAM_BINARY_LENGTH_OES"/> >+ <enum name="GL_NUM_PROGRAM_BINARY_FORMATS_OES"/> >+ <enum name="GL_PROGRAM_BINARY_FORMATS_OES"/> >+ <command name="glGetProgramBinaryOES"/> >+ <command name="glProgramBinaryOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_gpu_shader5" supported="gles2"/> >+ <extension name="GL_OES_mapbuffer" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_WRITE_ONLY_OES"/> >+ <enum name="GL_BUFFER_ACCESS_OES"/> >+ <enum name="GL_BUFFER_MAPPED_OES"/> >+ <enum name="GL_BUFFER_MAP_POINTER_OES"/> >+ <command name="glMapBufferOES"/> >+ <command name="glUnmapBufferOES"/> >+ <command name="glGetBufferPointervOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_matrix_get" supported="gles1"> >+ <require> >+ <enum name="GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES"/> >+ <enum name="GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES"/> >+ <enum name="GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_matrix_palette" supported="gles1"> >+ <require> >+ <enum name="GL_MAX_VERTEX_UNITS_OES"/> >+ <enum name="GL_MAX_PALETTE_MATRICES_OES"/> >+ <enum name="GL_MATRIX_PALETTE_OES"/> >+ <enum name="GL_MATRIX_INDEX_ARRAY_OES"/> >+ <enum name="GL_WEIGHT_ARRAY_OES"/> >+ <enum name="GL_CURRENT_PALETTE_MATRIX_OES"/> >+ <enum name="GL_MATRIX_INDEX_ARRAY_SIZE_OES"/> >+ <enum name="GL_MATRIX_INDEX_ARRAY_TYPE_OES"/> >+ <enum name="GL_MATRIX_INDEX_ARRAY_STRIDE_OES"/> >+ <enum name="GL_MATRIX_INDEX_ARRAY_POINTER_OES"/> >+ <enum name="GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES"/> >+ <enum name="GL_WEIGHT_ARRAY_SIZE_OES"/> >+ <enum name="GL_WEIGHT_ARRAY_TYPE_OES"/> >+ <enum name="GL_WEIGHT_ARRAY_STRIDE_OES"/> >+ <enum name="GL_WEIGHT_ARRAY_POINTER_OES"/> >+ <enum name="GL_WEIGHT_ARRAY_BUFFER_BINDING_OES"/> >+ <command name="glCurrentPaletteMatrixOES"/> >+ <command name="glLoadPaletteFromModelViewMatrixOES"/> >+ <command name="glMatrixIndexPointerOES"/> >+ <command name="glWeightPointerOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_packed_depth_stencil" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_DEPTH_STENCIL_OES"/> >+ <enum name="GL_UNSIGNED_INT_24_8_OES"/> >+ <enum name="GL_DEPTH24_STENCIL8_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_point_size_array" supported="gles1"> >+ <require> >+ <enum name="GL_POINT_SIZE_ARRAY_OES"/> >+ <enum name="GL_POINT_SIZE_ARRAY_TYPE_OES"/> >+ <enum name="GL_POINT_SIZE_ARRAY_STRIDE_OES"/> >+ <enum name="GL_POINT_SIZE_ARRAY_POINTER_OES"/> >+ <enum name="GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES"/> >+ <command name="glPointSizePointerOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_point_sprite" supported="gles1"> >+ <require> >+ <enum name="GL_POINT_SPRITE_OES"/> >+ <enum name="GL_COORD_REPLACE_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_primitive_bounding_box" supported="gles2"> >+ <require> >+ <enum name="GL_PRIMITIVE_BOUNDING_BOX_OES"/> >+ <command name="glPrimitiveBoundingBoxOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_query_matrix" supported="gl|gles1"> >+ <require> >+ <command name="glQueryMatrixxOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_read_format" supported="gl|gles1"> >+ <require> >+ <enum name="GL_IMPLEMENTATION_COLOR_READ_TYPE_OES"/> >+ <enum name="GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_required_internalformat" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_ALPHA8_OES"/> >+ <enum name="GL_DEPTH_COMPONENT16_OES"/> >+ <enum name="GL_DEPTH_COMPONENT24_OES"/> >+ <enum name="GL_DEPTH24_STENCIL8_OES"/> >+ <enum name="GL_DEPTH_COMPONENT32_OES"/> >+ <enum name="GL_LUMINANCE4_ALPHA4_OES"/> >+ <enum name="GL_LUMINANCE8_ALPHA8_OES"/> >+ <enum name="GL_LUMINANCE8_OES"/> >+ <enum name="GL_RGBA4_OES"/> >+ <enum name="GL_RGB5_A1_OES"/> >+ <enum name="GL_RGB565_OES"/> >+ <enum name="GL_RGB8_OES"/> >+ <enum name="GL_RGBA8_OES"/> >+ <enum name="GL_RGB10_EXT"/> >+ <enum name="GL_RGB10_A2_EXT"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_rgb8_rgba8" supported="gles1|gles2|glsc2"> >+ <require> >+ <enum name="GL_RGB8_OES"/> >+ <enum name="GL_RGBA8_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_sample_shading" supported="gles2"> >+ <require> >+ <command name="glMinSampleShadingOES"/> >+ <enum name="GL_SAMPLE_SHADING_OES"/> >+ <enum name="GL_MIN_SAMPLE_SHADING_VALUE_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_sample_variables" supported="gles2"/> >+ <extension name="GL_OES_shader_image_atomic" supported="gles2"/> >+ <extension name="GL_OES_shader_io_blocks" supported="gles2"/> >+ <extension name="GL_OES_shader_multisample_interpolation" supported="gles2"> >+ <require> >+ <enum name="GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES"/> >+ <enum name="GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES"/> >+ <enum name="GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_single_precision" supported="gl|gles1"> >+ <require> >+ <command name="glClearDepthfOES"/> >+ <command name="glClipPlanefOES"/> >+ <command name="glDepthRangefOES"/> >+ <command name="glFrustumfOES"/> >+ <command name="glGetClipPlanefOES"/> >+ <command name="glOrthofOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_standard_derivatives" supported="gles2|glsc2"> >+ <require> >+ <enum name="GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_stencil1" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_STENCIL_INDEX1_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_stencil4" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_STENCIL_INDEX4_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_stencil8" supported="gles1"> >+ <require> >+ <enum name="GL_STENCIL_INDEX8_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_stencil_wrap" supported="gles1"> >+ <require> >+ <enum name="GL_INCR_WRAP_OES"/> >+ <enum name="GL_DECR_WRAP_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_surfaceless_context" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_FRAMEBUFFER_UNDEFINED_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_tessellation_point_size" supported="gles2"/> >+ <extension name="GL_OES_tessellation_shader" supported="gles2"> >+ <require> >+ <enum name="GL_PATCHES_OES"/> >+ <enum name="GL_PATCH_VERTICES_OES"/> >+ <enum name="GL_TESS_CONTROL_OUTPUT_VERTICES_OES"/> >+ <enum name="GL_TESS_GEN_MODE_OES"/> >+ <enum name="GL_TESS_GEN_SPACING_OES"/> >+ <enum name="GL_TESS_GEN_VERTEX_ORDER_OES"/> >+ <enum name="GL_TESS_GEN_POINT_MODE_OES"/> >+ <enum name="GL_TRIANGLES"/> >+ <enum name="GL_ISOLINES_OES"/> >+ <enum name="GL_QUADS_OES"/> >+ <enum name="GL_EQUAL"/> >+ <enum name="GL_FRACTIONAL_ODD_OES"/> >+ <enum name="GL_FRACTIONAL_EVEN_OES"/> >+ <enum name="GL_CCW"/> >+ <enum name="GL_CW"/> >+ <enum name="GL_MAX_PATCH_VERTICES_OES"/> >+ <enum name="GL_MAX_TESS_GEN_LEVEL_OES"/> >+ <enum name="GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES"/> >+ <enum name="GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES"/> >+ <enum name="GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES"/> >+ <enum name="GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES"/> >+ <enum name="GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_OES"/> >+ <enum name="GL_MAX_TESS_PATCH_COMPONENTS_OES"/> >+ <enum name="GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_OES"/> >+ <enum name="GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_OES"/> >+ <enum name="GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES"/> >+ <enum name="GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES"/> >+ <enum name="GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_OES"/> >+ <enum name="GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_OES"/> >+ <enum name="GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES"/> >+ <enum name="GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES"/> >+ <enum name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES"/> >+ <enum name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES"/> >+ <enum name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES"/> >+ <enum name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES"/> >+ <enum name="GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES"/> >+ <enum name="GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES"/> >+ <enum name="GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES"/> >+ <enum name="GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES"/> >+ <enum name="GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES"/> >+ <enum name="GL_IS_PER_PATCH_OES"/> >+ <enum name="GL_REFERENCED_BY_TESS_CONTROL_SHADER_OES"/> >+ <enum name="GL_REFERENCED_BY_TESS_EVALUATION_SHADER_OES"/> >+ <enum name="GL_TESS_CONTROL_SHADER_OES"/> >+ <enum name="GL_TESS_EVALUATION_SHADER_OES"/> >+ <enum name="GL_TESS_CONTROL_SHADER_BIT_OES"/> >+ <enum name="GL_TESS_EVALUATION_SHADER_BIT_OES"/> >+ <command name="glPatchParameteriOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_texture_3D" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_WRAP_R_OES"/> >+ <enum name="GL_TEXTURE_3D_OES"/> >+ <enum name="GL_TEXTURE_BINDING_3D_OES"/> >+ <enum name="GL_MAX_3D_TEXTURE_SIZE_OES"/> >+ <enum name="GL_SAMPLER_3D_OES"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES"/> >+ <command name="glTexImage3DOES"/> >+ <command name="glTexSubImage3DOES"/> >+ <command name="glCopyTexSubImage3DOES"/> >+ <command name="glCompressedTexImage3DOES"/> >+ <command name="glCompressedTexSubImage3DOES"/> >+ <command name="glFramebufferTexture3DOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_texture_border_clamp" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_BORDER_COLOR_OES"/> >+ <enum name="GL_CLAMP_TO_BORDER_OES"/> >+ <command name="glTexParameterIivOES"/> >+ <command name="glTexParameterIuivOES"/> >+ <command name="glGetTexParameterIivOES"/> >+ <command name="glGetTexParameterIuivOES"/> >+ <command name="glSamplerParameterIivOES"/> >+ <command name="glSamplerParameterIuivOES"/> >+ <command name="glGetSamplerParameterIivOES"/> >+ <command name="glGetSamplerParameterIuivOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_texture_buffer" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_BUFFER_OES"/> >+ <enum name="GL_TEXTURE_BUFFER_BINDING_OES"/> >+ <enum name="GL_MAX_TEXTURE_BUFFER_SIZE_OES"/> >+ <enum name="GL_TEXTURE_BINDING_BUFFER_OES"/> >+ <enum name="GL_TEXTURE_BUFFER_DATA_STORE_BINDING_OES"/> >+ <enum name="GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_OES"/> >+ <enum name="GL_SAMPLER_BUFFER_OES"/> >+ <enum name="GL_INT_SAMPLER_BUFFER_OES"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_BUFFER_OES"/> >+ <enum name="GL_IMAGE_BUFFER_OES"/> >+ <enum name="GL_INT_IMAGE_BUFFER_OES"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_BUFFER_OES"/> >+ <enum name="GL_TEXTURE_BUFFER_OFFSET_OES"/> >+ <enum name="GL_TEXTURE_BUFFER_SIZE_OES"/> >+ <command name="glTexBufferOES"/> >+ <command name="glTexBufferRangeOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_texture_compression_astc" supported="gles2" comment="API is identical to GL_KHR_texture_compression_astc_hdr extension"> >+ <require> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_4x4_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_5x4_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_5x5_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_6x5_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_6x6_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_8x5_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_8x6_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_8x8_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x5_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x6_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x8_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_10x10_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_12x10_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_12x12_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_3x3x3_OES"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_4x3x3_OES"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_4x4x3_OES"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_4x4x4_OES"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_5x4x4_OES"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_5x5x4_OES"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_5x5x5_OES"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_6x5x5_OES"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_6x6x5_OES"/> >+ <enum name="GL_COMPRESSED_RGBA_ASTC_6x6x6_OES"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES"/> >+ <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_texture_cube_map" supported="gles1"> >+ <require> >+ <enum name="GL_NORMAL_MAP_OES"/> >+ <enum name="GL_REFLECTION_MAP_OES"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_OES"/> >+ <enum name="GL_TEXTURE_BINDING_CUBE_MAP_OES"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES"/> >+ <enum name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES"/> >+ <enum name="GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES"/> >+ <enum name="GL_TEXTURE_GEN_MODE_OES"/> >+ <enum name="GL_TEXTURE_GEN_STR_OES"/> >+ <command name="glTexGenfOES"/> >+ <command name="glTexGenfvOES"/> >+ <command name="glTexGeniOES"/> >+ <command name="glTexGenivOES"/> >+ <command name="glTexGenxOES"/> >+ <command name="glTexGenxvOES"/> >+ <command name="glGetTexGenfvOES"/> >+ <command name="glGetTexGenivOES"/> >+ <command name="glGetTexGenxvOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_texture_cube_map_array" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_CUBE_MAP_ARRAY_OES"/> >+ <enum name="GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_OES"/> >+ <enum name="GL_SAMPLER_CUBE_MAP_ARRAY_OES"/> >+ <enum name="GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_OES"/> >+ <enum name="GL_INT_SAMPLER_CUBE_MAP_ARRAY_OES"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_OES"/> >+ <enum name="GL_IMAGE_CUBE_MAP_ARRAY_OES"/> >+ <enum name="GL_INT_IMAGE_CUBE_MAP_ARRAY_OES"/> >+ <enum name="GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_texture_env_crossbar" supported="gles1"/> >+ <extension name="GL_OES_texture_float" supported="gles2"> >+ <require> >+ <enum name="GL_FLOAT"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_texture_float_linear" supported="gles2"/> >+ <extension name="GL_OES_texture_half_float" supported="gles2"> >+ <require> >+ <enum name="GL_HALF_FLOAT_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_texture_half_float_linear" supported="gles2"/> >+ <extension name="GL_OES_texture_mirrored_repeat" supported="gles1"> >+ <require> >+ <enum name="GL_MIRRORED_REPEAT_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_texture_npot" supported="gles1|gles2"/> >+ <extension name="GL_OES_texture_stencil8" supported="gles2"> >+ <require> >+ <enum name="GL_STENCIL_INDEX_OES"/> >+ <enum name="GL_STENCIL_INDEX8_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_texture_storage_multisample_2d_array" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES"/> >+ <enum name="GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES"/> >+ <enum name="GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES"/> >+ <enum name="GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES"/> >+ <enum name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES"/> >+ <command name="glTexStorage3DMultisampleOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_texture_view" supported="gles2"> >+ <require> >+ <enum name="GL_TEXTURE_VIEW_MIN_LEVEL_OES"/> >+ <enum name="GL_TEXTURE_VIEW_NUM_LEVELS_OES"/> >+ <enum name="GL_TEXTURE_VIEW_MIN_LAYER_OES"/> >+ <enum name="GL_TEXTURE_VIEW_NUM_LAYERS_OES"/> >+ <enum name="GL_TEXTURE_IMMUTABLE_LEVELS"/> >+ <command name="glTextureViewOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_vertex_array_object" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_VERTEX_ARRAY_BINDING_OES"/> >+ <command name="glBindVertexArrayOES"/> >+ <command name="glDeleteVertexArraysOES"/> >+ <command name="glGenVertexArraysOES"/> >+ <command name="glIsVertexArrayOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_vertex_half_float" supported="gles2"> >+ <require> >+ <enum name="GL_HALF_FLOAT_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_vertex_type_10_10_10_2" supported="gles2"> >+ <require> >+ <enum name="GL_UNSIGNED_INT_10_10_10_2_OES"/> >+ <enum name="GL_INT_10_10_10_2_OES"/> >+ </require> >+ </extension> >+ <extension name="GL_OES_viewport_array" supported="gles2"> >+ <require> >+ <enum name="GL_SCISSOR_BOX"/> >+ <enum name="GL_VIEWPORT"/> >+ <enum name="GL_DEPTH_RANGE"/> >+ <enum name="GL_SCISSOR_TEST"/> >+ <enum name="GL_MAX_VIEWPORTS_OES"/> >+ <enum name="GL_VIEWPORT_SUBPIXEL_BITS_OES"/> >+ <enum name="GL_VIEWPORT_BOUNDS_RANGE_OES"/> >+ <enum name="GL_VIEWPORT_INDEX_PROVOKING_VERTEX_OES"/> >+ <command name="glViewportArrayvOES"/> >+ <command name="glViewportIndexedfOES"/> >+ <command name="glViewportIndexedfvOES"/> >+ <command name="glScissorArrayvOES"/> >+ <command name="glScissorIndexedOES"/> >+ <command name="glScissorIndexedvOES"/> >+ <command name="glDepthRangeArrayfvOES"/> >+ <command name="glDepthRangeIndexedfOES"/> >+ <command name="glGetFloati_vOES"/> >+ <command name="glEnableiOES"/> >+ <command name="glDisableiOES"/> >+ <command name="glIsEnablediOES"/> >+ </require> >+ </extension> >+ <extension name="GL_OML_interlace" supported="gl"> >+ <require> >+ <enum name="GL_INTERLACE_OML"/> >+ <enum name="GL_INTERLACE_READ_OML"/> >+ </require> >+ </extension> >+ <extension name="GL_OML_resample" supported="gl"> >+ <require> >+ <enum name="GL_PACK_RESAMPLE_OML"/> >+ <enum name="GL_UNPACK_RESAMPLE_OML"/> >+ <enum name="GL_RESAMPLE_REPLICATE_OML"/> >+ <enum name="GL_RESAMPLE_ZERO_FILL_OML"/> >+ <enum name="GL_RESAMPLE_AVERAGE_OML"/> >+ <enum name="GL_RESAMPLE_DECIMATE_OML"/> >+ </require> >+ </extension> >+ <extension name="GL_OML_subsample" supported="gl"> >+ <require> >+ <enum name="GL_FORMAT_SUBSAMPLE_24_24_OML"/> >+ <enum name="GL_FORMAT_SUBSAMPLE_244_244_OML"/> >+ </require> >+ </extension> >+ <extension name="GL_OVR_multiview" supported="gl|glcore|gles2"> >+ <require> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR"/> >+ <enum name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR"/> >+ <enum name="GL_MAX_VIEWS_OVR"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR"/> >+ <command name="glFramebufferTextureMultiviewOVR"/> >+ </require> >+ </extension> >+ <extension name="GL_OVR_multiview2" supported="gl|glcore|gles2"/> >+ <extension name="GL_OVR_multiview_multisampled_render_to_texture" supported="gles2"> >+ <require> >+ <command name="glFramebufferTextureMultisampleMultiviewOVR"/> >+ </require> >+ </extension> >+ <extension name="GL_PGI_misc_hints" supported="gl"> >+ <require> >+ <enum name="GL_PREFER_DOUBLEBUFFER_HINT_PGI"/> >+ <enum name="GL_CONSERVE_MEMORY_HINT_PGI"/> >+ <enum name="GL_RECLAIM_MEMORY_HINT_PGI"/> >+ <enum name="GL_NATIVE_GRAPHICS_HANDLE_PGI"/> >+ <enum name="GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI"/> >+ <enum name="GL_NATIVE_GRAPHICS_END_HINT_PGI"/> >+ <enum name="GL_ALWAYS_FAST_HINT_PGI"/> >+ <enum name="GL_ALWAYS_SOFT_HINT_PGI"/> >+ <enum name="GL_ALLOW_DRAW_OBJ_HINT_PGI"/> >+ <enum name="GL_ALLOW_DRAW_WIN_HINT_PGI"/> >+ <enum name="GL_ALLOW_DRAW_FRG_HINT_PGI"/> >+ <enum name="GL_ALLOW_DRAW_MEM_HINT_PGI"/> >+ <enum name="GL_STRICT_DEPTHFUNC_HINT_PGI"/> >+ <enum name="GL_STRICT_LIGHTING_HINT_PGI"/> >+ <enum name="GL_STRICT_SCISSOR_HINT_PGI"/> >+ <enum name="GL_FULL_STIPPLE_HINT_PGI"/> >+ <enum name="GL_CLIP_NEAR_HINT_PGI"/> >+ <enum name="GL_CLIP_FAR_HINT_PGI"/> >+ <enum name="GL_WIDE_LINE_HINT_PGI"/> >+ <enum name="GL_BACK_NORMALS_HINT_PGI"/> >+ <command name="glHintPGI"/> >+ </require> >+ </extension> >+ <extension name="GL_PGI_vertex_hints" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_DATA_HINT_PGI"/> >+ <enum name="GL_VERTEX_CONSISTENT_HINT_PGI"/> >+ <enum name="GL_MATERIAL_SIDE_HINT_PGI"/> >+ <enum name="GL_MAX_VERTEX_HINT_PGI"/> >+ <enum name="GL_COLOR3_BIT_PGI"/> >+ <enum name="GL_COLOR4_BIT_PGI"/> >+ <enum name="GL_EDGEFLAG_BIT_PGI"/> >+ <enum name="GL_INDEX_BIT_PGI"/> >+ <enum name="GL_MAT_AMBIENT_BIT_PGI"/> >+ <enum name="GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI"/> >+ <enum name="GL_MAT_DIFFUSE_BIT_PGI"/> >+ <enum name="GL_MAT_EMISSION_BIT_PGI"/> >+ <enum name="GL_MAT_COLOR_INDEXES_BIT_PGI"/> >+ <enum name="GL_MAT_SHININESS_BIT_PGI"/> >+ <enum name="GL_MAT_SPECULAR_BIT_PGI"/> >+ <enum name="GL_NORMAL_BIT_PGI"/> >+ <enum name="GL_TEXCOORD1_BIT_PGI"/> >+ <enum name="GL_TEXCOORD2_BIT_PGI"/> >+ <enum name="GL_TEXCOORD3_BIT_PGI"/> >+ <enum name="GL_TEXCOORD4_BIT_PGI"/> >+ <enum name="GL_VERTEX23_BIT_PGI"/> >+ <enum name="GL_VERTEX4_BIT_PGI"/> >+ </require> >+ </extension> >+ <extension name="GL_QCOM_alpha_test" supported="gles2"> >+ <require> >+ <enum name="GL_ALPHA_TEST_QCOM"/> >+ <enum name="GL_ALPHA_TEST_FUNC_QCOM"/> >+ <enum name="GL_ALPHA_TEST_REF_QCOM"/> >+ <command name="glAlphaFuncQCOM"/> >+ </require> >+ </extension> >+ <extension name="GL_QCOM_binning_control" supported="gles2"> >+ <require> >+ <enum name="GL_BINNING_CONTROL_HINT_QCOM"/> >+ <enum name="GL_CPU_OPTIMIZED_QCOM"/> >+ <enum name="GL_GPU_OPTIMIZED_QCOM"/> >+ <enum name="GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM"/> >+ </require> >+ </extension> >+ <extension name="GL_QCOM_driver_control" supported="gles1|gles2"> >+ <require> >+ <command name="glGetDriverControlsQCOM"/> >+ <command name="glGetDriverControlStringQCOM"/> >+ <command name="glEnableDriverControlQCOM"/> >+ <command name="glDisableDriverControlQCOM"/> >+ </require> >+ </extension> >+ <extension name="GL_QCOM_extended_get" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_TEXTURE_WIDTH_QCOM"/> >+ <enum name="GL_TEXTURE_HEIGHT_QCOM"/> >+ <enum name="GL_TEXTURE_DEPTH_QCOM"/> >+ <enum name="GL_TEXTURE_INTERNAL_FORMAT_QCOM"/> >+ <enum name="GL_TEXTURE_FORMAT_QCOM"/> >+ <enum name="GL_TEXTURE_TYPE_QCOM"/> >+ <enum name="GL_TEXTURE_IMAGE_VALID_QCOM"/> >+ <enum name="GL_TEXTURE_NUM_LEVELS_QCOM"/> >+ <enum name="GL_TEXTURE_TARGET_QCOM"/> >+ <enum name="GL_TEXTURE_OBJECT_VALID_QCOM"/> >+ <enum name="GL_STATE_RESTORE"/> >+ <command name="glExtGetTexturesQCOM"/> >+ <command name="glExtGetBuffersQCOM"/> >+ <command name="glExtGetRenderbuffersQCOM"/> >+ <command name="glExtGetFramebuffersQCOM"/> >+ <command name="glExtGetTexLevelParameterivQCOM"/> >+ <command name="glExtTexObjectStateOverrideiQCOM"/> >+ <command name="glExtGetTexSubImageQCOM"/> >+ <command name="glExtGetBufferPointervQCOM"/> >+ </require> >+ </extension> >+ <extension name="GL_QCOM_extended_get2" supported="gles1|gles2"> >+ <require> >+ <command name="glExtGetShadersQCOM"/> >+ <command name="glExtGetProgramsQCOM"/> >+ <command name="glExtIsProgramBinaryQCOM"/> >+ <command name="glExtGetProgramBinarySourceQCOM"/> >+ </require> >+ </extension> >+ <extension name="GL_QCOM_framebuffer_foveated" supported="gles2"> >+ <require> >+ <enum name="GL_FOVEATION_ENABLE_BIT_QCOM"/> >+ <enum name="GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM"/> >+ <command name="glFramebufferFoveationConfigQCOM"/> >+ <command name="glFramebufferFoveationParametersQCOM"/> >+ </require> >+ </extension> >+ <extension name="GL_QCOM_texture_foveated" supported="gles2"> >+ <require> >+ <enum name="GL_FOVEATION_ENABLE_BIT_QCOM"/> >+ <enum name="GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM"/> >+ <enum name="GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM"/> >+ <enum name="GL_TEXTURE_FOVEATED_MIN_PIXEL_DENSITY_QCOM"/> >+ <enum name="GL_TEXTURE_FOVEATED_FEATURE_QUERY_QCOM"/> >+ <enum name="GL_TEXTURE_FOVEATED_NUM_FOCAL_POINTS_QUERY_QCOM"/> >+ <enum name="GL_FRAMEBUFFER_INCOMPLETE_FOVEATION_QCOM"/> >+ <command name="glTextureFoveationParametersQCOM"/> >+ </require> >+ </extension> >+ <extension name="GL_QCOM_perfmon_global_mode" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_PERFMON_GLOBAL_MODE_QCOM"/> >+ </require> >+ </extension> >+ <extension name="GL_QCOM_shader_framebuffer_fetch_noncoherent" supported="gles2"> >+ <require> >+ <enum name="GL_FRAMEBUFFER_FETCH_NONCOHERENT_QCOM"/> >+ <command name="glFramebufferFetchBarrierQCOM"/> >+ </require> >+ </extension> >+ <extension name="GL_QCOM_tiled_rendering" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_COLOR_BUFFER_BIT0_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT1_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT2_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT3_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT4_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT5_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT6_QCOM"/> >+ <enum name="GL_COLOR_BUFFER_BIT7_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT0_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT1_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT2_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT3_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT4_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT5_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT6_QCOM"/> >+ <enum name="GL_DEPTH_BUFFER_BIT7_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT0_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT1_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT2_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT3_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT4_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT5_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT6_QCOM"/> >+ <enum name="GL_STENCIL_BUFFER_BIT7_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT0_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT1_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT2_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT3_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT4_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT5_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT6_QCOM"/> >+ <enum name="GL_MULTISAMPLE_BUFFER_BIT7_QCOM"/> >+ <command name="glStartTilingQCOM"/> >+ <command name="glEndTilingQCOM"/> >+ </require> >+ </extension> >+ <extension name="GL_QCOM_writeonly_rendering" supported="gles1|gles2"> >+ <require> >+ <enum name="GL_WRITEONLY_RENDERING_QCOM"/> >+ </require> >+ </extension> >+ <extension name="GL_REND_screen_coordinates" supported="gl"> >+ <require> >+ <enum name="GL_SCREEN_COORDINATES_REND"/> >+ <enum name="GL_INVERTED_SCREEN_W_REND"/> >+ </require> >+ </extension> >+ <extension name="GL_S3_s3tc" supported="gl"> >+ <require> >+ <enum name="GL_RGB_S3TC"/> >+ <enum name="GL_RGB4_S3TC"/> >+ <enum name="GL_RGBA_S3TC"/> >+ <enum name="GL_RGBA4_S3TC"/> >+ <enum name="GL_RGBA_DXT5_S3TC"/> >+ <enum name="GL_RGBA4_DXT5_S3TC"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_detail_texture" supported="gl"> >+ <require> >+ <enum name="GL_DETAIL_TEXTURE_2D_SGIS"/> >+ <enum name="GL_DETAIL_TEXTURE_2D_BINDING_SGIS"/> >+ <enum name="GL_LINEAR_DETAIL_SGIS"/> >+ <enum name="GL_LINEAR_DETAIL_ALPHA_SGIS"/> >+ <enum name="GL_LINEAR_DETAIL_COLOR_SGIS"/> >+ <enum name="GL_DETAIL_TEXTURE_LEVEL_SGIS"/> >+ <enum name="GL_DETAIL_TEXTURE_MODE_SGIS"/> >+ <enum name="GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS"/> >+ <command name="glDetailTexFuncSGIS"/> >+ <command name="glGetDetailTexFuncSGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_fog_function" supported="gl"> >+ <require> >+ <enum name="GL_FOG_FUNC_SGIS"/> >+ <enum name="GL_FOG_FUNC_POINTS_SGIS"/> >+ <enum name="GL_MAX_FOG_FUNC_POINTS_SGIS"/> >+ <command name="glFogFuncSGIS"/> >+ <command name="glGetFogFuncSGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_generate_mipmap" supported="gl"> >+ <require> >+ <enum name="GL_GENERATE_MIPMAP_SGIS"/> >+ <enum name="GL_GENERATE_MIPMAP_HINT_SGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_multisample" supported="gl"> >+ <require> >+ <enum name="GL_MULTISAMPLE_SGIS"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_MASK_SGIS"/> >+ <enum name="GL_SAMPLE_ALPHA_TO_ONE_SGIS"/> >+ <enum name="GL_SAMPLE_MASK_SGIS"/> >+ <enum name="GL_1PASS_SGIS"/> >+ <enum name="GL_2PASS_0_SGIS"/> >+ <enum name="GL_2PASS_1_SGIS"/> >+ <enum name="GL_4PASS_0_SGIS"/> >+ <enum name="GL_4PASS_1_SGIS"/> >+ <enum name="GL_4PASS_2_SGIS"/> >+ <enum name="GL_4PASS_3_SGIS"/> >+ <enum name="GL_SAMPLE_BUFFERS_SGIS"/> >+ <enum name="GL_SAMPLES_SGIS"/> >+ <enum name="GL_SAMPLE_MASK_VALUE_SGIS"/> >+ <enum name="GL_SAMPLE_MASK_INVERT_SGIS"/> >+ <enum name="GL_SAMPLE_PATTERN_SGIS"/> >+ <command name="glSampleMaskSGIS"/> >+ <command name="glSamplePatternSGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_pixel_texture" supported="gl"> >+ <require> >+ <enum name="GL_PIXEL_TEXTURE_SGIS"/> >+ <enum name="GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS"/> >+ <enum name="GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS"/> >+ <enum name="GL_PIXEL_GROUP_COLOR_SGIS"/> >+ <command name="glPixelTexGenParameteriSGIS"/> >+ <command name="glPixelTexGenParameterivSGIS"/> >+ <command name="glPixelTexGenParameterfSGIS"/> >+ <command name="glPixelTexGenParameterfvSGIS"/> >+ <command name="glGetPixelTexGenParameterivSGIS"/> >+ <command name="glGetPixelTexGenParameterfvSGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_point_line_texgen" supported="gl"> >+ <require> >+ <enum name="GL_EYE_DISTANCE_TO_POINT_SGIS"/> >+ <enum name="GL_OBJECT_DISTANCE_TO_POINT_SGIS"/> >+ <enum name="GL_EYE_DISTANCE_TO_LINE_SGIS"/> >+ <enum name="GL_OBJECT_DISTANCE_TO_LINE_SGIS"/> >+ <enum name="GL_EYE_POINT_SGIS"/> >+ <enum name="GL_OBJECT_POINT_SGIS"/> >+ <enum name="GL_EYE_LINE_SGIS"/> >+ <enum name="GL_OBJECT_LINE_SGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_point_parameters" supported="gl"> >+ <require> >+ <enum name="GL_POINT_SIZE_MIN_SGIS"/> >+ <enum name="GL_POINT_SIZE_MAX_SGIS"/> >+ <enum name="GL_POINT_FADE_THRESHOLD_SIZE_SGIS"/> >+ <enum name="GL_DISTANCE_ATTENUATION_SGIS"/> >+ <command name="glPointParameterfSGIS"/> >+ <command name="glPointParameterfvSGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_sharpen_texture" supported="gl"> >+ <require> >+ <enum name="GL_LINEAR_SHARPEN_SGIS"/> >+ <enum name="GL_LINEAR_SHARPEN_ALPHA_SGIS"/> >+ <enum name="GL_LINEAR_SHARPEN_COLOR_SGIS"/> >+ <enum name="GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS"/> >+ <command name="glSharpenTexFuncSGIS"/> >+ <command name="glGetSharpenTexFuncSGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_texture4D" supported="gl"> >+ <require> >+ <enum name="GL_PACK_SKIP_VOLUMES_SGIS"/> >+ <enum name="GL_PACK_IMAGE_DEPTH_SGIS"/> >+ <enum name="GL_UNPACK_SKIP_VOLUMES_SGIS"/> >+ <enum name="GL_UNPACK_IMAGE_DEPTH_SGIS"/> >+ <enum name="GL_TEXTURE_4D_SGIS"/> >+ <enum name="GL_PROXY_TEXTURE_4D_SGIS"/> >+ <enum name="GL_TEXTURE_4DSIZE_SGIS"/> >+ <enum name="GL_TEXTURE_WRAP_Q_SGIS"/> >+ <enum name="GL_MAX_4D_TEXTURE_SIZE_SGIS"/> >+ <enum name="GL_TEXTURE_4D_BINDING_SGIS"/> >+ <command name="glTexImage4DSGIS"/> >+ <command name="glTexSubImage4DSGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_texture_border_clamp" supported="gl"> >+ <require> >+ <enum name="GL_CLAMP_TO_BORDER_SGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_texture_color_mask" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_COLOR_WRITEMASK_SGIS"/> >+ <command name="glTextureColorMaskSGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_texture_edge_clamp" supported="gl"> >+ <require> >+ <enum name="GL_CLAMP_TO_EDGE_SGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_texture_filter4" supported="gl"> >+ <require> >+ <enum name="GL_FILTER4_SGIS"/> >+ <enum name="GL_TEXTURE_FILTER4_SIZE_SGIS"/> >+ <command name="glGetTexFilterFuncSGIS"/> >+ <command name="glTexFilterFuncSGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_texture_lod" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_MIN_LOD_SGIS"/> >+ <enum name="GL_TEXTURE_MAX_LOD_SGIS"/> >+ <enum name="GL_TEXTURE_BASE_LEVEL_SGIS"/> >+ <enum name="GL_TEXTURE_MAX_LEVEL_SGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIS_texture_select" supported="gl"> >+ <require> >+ <enum name="GL_DUAL_ALPHA4_SGIS"/> >+ <enum name="GL_DUAL_ALPHA8_SGIS"/> >+ <enum name="GL_DUAL_ALPHA12_SGIS"/> >+ <enum name="GL_DUAL_ALPHA16_SGIS"/> >+ <enum name="GL_DUAL_LUMINANCE4_SGIS"/> >+ <enum name="GL_DUAL_LUMINANCE8_SGIS"/> >+ <enum name="GL_DUAL_LUMINANCE12_SGIS"/> >+ <enum name="GL_DUAL_LUMINANCE16_SGIS"/> >+ <enum name="GL_DUAL_INTENSITY4_SGIS"/> >+ <enum name="GL_DUAL_INTENSITY8_SGIS"/> >+ <enum name="GL_DUAL_INTENSITY12_SGIS"/> >+ <enum name="GL_DUAL_INTENSITY16_SGIS"/> >+ <enum name="GL_DUAL_LUMINANCE_ALPHA4_SGIS"/> >+ <enum name="GL_DUAL_LUMINANCE_ALPHA8_SGIS"/> >+ <enum name="GL_QUAD_ALPHA4_SGIS"/> >+ <enum name="GL_QUAD_ALPHA8_SGIS"/> >+ <enum name="GL_QUAD_LUMINANCE4_SGIS"/> >+ <enum name="GL_QUAD_LUMINANCE8_SGIS"/> >+ <enum name="GL_QUAD_INTENSITY4_SGIS"/> >+ <enum name="GL_QUAD_INTENSITY8_SGIS"/> >+ <enum name="GL_DUAL_TEXTURE_SELECT_SGIS"/> >+ <enum name="GL_QUAD_TEXTURE_SELECT_SGIS"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_async" supported="gl"> >+ <require> >+ <enum name="GL_ASYNC_MARKER_SGIX"/> >+ <command name="glAsyncMarkerSGIX"/> >+ <command name="glFinishAsyncSGIX"/> >+ <command name="glPollAsyncSGIX"/> >+ <command name="glGenAsyncMarkersSGIX"/> >+ <command name="glDeleteAsyncMarkersSGIX"/> >+ <command name="glIsAsyncMarkerSGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_async_histogram" supported="gl"> >+ <require> >+ <enum name="GL_ASYNC_HISTOGRAM_SGIX"/> >+ <enum name="GL_MAX_ASYNC_HISTOGRAM_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_async_pixel" supported="gl"> >+ <require> >+ <enum name="GL_ASYNC_TEX_IMAGE_SGIX"/> >+ <enum name="GL_ASYNC_DRAW_PIXELS_SGIX"/> >+ <enum name="GL_ASYNC_READ_PIXELS_SGIX"/> >+ <enum name="GL_MAX_ASYNC_TEX_IMAGE_SGIX"/> >+ <enum name="GL_MAX_ASYNC_DRAW_PIXELS_SGIX"/> >+ <enum name="GL_MAX_ASYNC_READ_PIXELS_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_blend_alpha_minmax" supported="gl"> >+ <require> >+ <enum name="GL_ALPHA_MIN_SGIX"/> >+ <enum name="GL_ALPHA_MAX_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_calligraphic_fragment" supported="gl"> >+ <require> >+ <enum name="GL_CALLIGRAPHIC_FRAGMENT_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_clipmap" supported="gl"> >+ <require> >+ <enum name="GL_LINEAR_CLIPMAP_LINEAR_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_CENTER_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_FRAME_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_OFFSET_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX"/> >+ <enum name="GL_TEXTURE_CLIPMAP_DEPTH_SGIX"/> >+ <enum name="GL_MAX_CLIPMAP_DEPTH_SGIX"/> >+ <enum name="GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX"/> >+ <enum name="GL_NEAREST_CLIPMAP_NEAREST_SGIX"/> >+ <enum name="GL_NEAREST_CLIPMAP_LINEAR_SGIX"/> >+ <enum name="GL_LINEAR_CLIPMAP_NEAREST_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_convolution_accuracy" supported="gl"> >+ <require> >+ <enum name="GL_CONVOLUTION_HINT_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_depth_pass_instrument" supported="gl"/> >+ <extension name="GL_SGIX_depth_texture" supported="gl"> >+ <require> >+ <enum name="GL_DEPTH_COMPONENT16_SGIX"/> >+ <enum name="GL_DEPTH_COMPONENT24_SGIX"/> >+ <enum name="GL_DEPTH_COMPONENT32_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_flush_raster" supported="gl"> >+ <require> >+ <command name="glFlushRasterSGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_fog_offset" supported="gl"> >+ <require> >+ <enum name="GL_FOG_OFFSET_SGIX"/> >+ <enum name="GL_FOG_OFFSET_VALUE_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_fragment_lighting" supported="gl" comment="Incomplete extension"> >+ <require> >+ <enum name="GL_FRAGMENT_LIGHTING_SGIX"/> >+ <enum name="GL_FRAGMENT_COLOR_MATERIAL_SGIX"/> >+ <enum name="GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX"/> >+ <enum name="GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX"/> >+ <enum name="GL_MAX_FRAGMENT_LIGHTS_SGIX"/> >+ <enum name="GL_MAX_ACTIVE_LIGHTS_SGIX"/> >+ <enum name="GL_CURRENT_RASTER_NORMAL_SGIX"/> >+ <enum name="GL_LIGHT_ENV_MODE_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT0_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT1_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT2_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT3_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT4_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT5_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT6_SGIX"/> >+ <enum name="GL_FRAGMENT_LIGHT7_SGIX"/> >+ <command name="glFragmentColorMaterialSGIX"/> >+ <command name="glFragmentLightfSGIX"/> >+ <command name="glFragmentLightfvSGIX"/> >+ <command name="glFragmentLightiSGIX"/> >+ <command name="glFragmentLightivSGIX"/> >+ <command name="glFragmentLightModelfSGIX"/> >+ <command name="glFragmentLightModelfvSGIX"/> >+ <command name="glFragmentLightModeliSGIX"/> >+ <command name="glFragmentLightModelivSGIX"/> >+ <command name="glFragmentMaterialfSGIX"/> >+ <command name="glFragmentMaterialfvSGIX"/> >+ <command name="glFragmentMaterialiSGIX"/> >+ <command name="glFragmentMaterialivSGIX"/> >+ <command name="glGetFragmentLightfvSGIX"/> >+ <command name="glGetFragmentLightivSGIX"/> >+ <command name="glGetFragmentMaterialfvSGIX"/> >+ <command name="glGetFragmentMaterialivSGIX"/> >+ <command name="glLightEnviSGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_framezoom" supported="gl"> >+ <require> >+ <enum name="GL_FRAMEZOOM_SGIX"/> >+ <enum name="GL_FRAMEZOOM_FACTOR_SGIX"/> >+ <enum name="GL_MAX_FRAMEZOOM_FACTOR_SGIX"/> >+ <command name="glFrameZoomSGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_igloo_interface" supported="gl"> >+ <require> >+ <command name="glIglooInterfaceSGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_instruments" supported="gl"> >+ <require> >+ <enum name="GL_INSTRUMENT_BUFFER_POINTER_SGIX"/> >+ <enum name="GL_INSTRUMENT_MEASUREMENTS_SGIX"/> >+ <command name="glGetInstrumentsSGIX"/> >+ <command name="glInstrumentsBufferSGIX"/> >+ <command name="glPollInstrumentsSGIX"/> >+ <command name="glReadInstrumentsSGIX"/> >+ <command name="glStartInstrumentsSGIX"/> >+ <command name="glStopInstrumentsSGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_interlace" supported="gl"> >+ <require> >+ <enum name="GL_INTERLACE_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_ir_instrument1" supported="gl"> >+ <require> >+ <enum name="GL_IR_INSTRUMENT1_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_list_priority" supported="gl"> >+ <require> >+ <enum name="GL_LIST_PRIORITY_SGIX"/> >+ <command name="glGetListParameterfvSGIX"/> >+ <command name="glGetListParameterivSGIX"/> >+ <command name="glListParameterfSGIX"/> >+ <command name="glListParameterfvSGIX"/> >+ <command name="glListParameteriSGIX"/> >+ <command name="glListParameterivSGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_pixel_texture" supported="gl"> >+ <require> >+ <enum name="GL_PIXEL_TEX_GEN_SGIX"/> >+ <enum name="GL_PIXEL_TEX_GEN_MODE_SGIX"/> >+ <command name="glPixelTexGenSGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_pixel_tiles" supported="gl"> >+ <require> >+ <enum name="GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX"/> >+ <enum name="GL_PIXEL_TILE_CACHE_INCREMENT_SGIX"/> >+ <enum name="GL_PIXEL_TILE_WIDTH_SGIX"/> >+ <enum name="GL_PIXEL_TILE_HEIGHT_SGIX"/> >+ <enum name="GL_PIXEL_TILE_GRID_WIDTH_SGIX"/> >+ <enum name="GL_PIXEL_TILE_GRID_HEIGHT_SGIX"/> >+ <enum name="GL_PIXEL_TILE_GRID_DEPTH_SGIX"/> >+ <enum name="GL_PIXEL_TILE_CACHE_SIZE_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_polynomial_ffd" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_DEFORMATION_BIT_SGIX"/> >+ <enum name="GL_GEOMETRY_DEFORMATION_BIT_SGIX"/> >+ <enum name="GL_GEOMETRY_DEFORMATION_SGIX"/> >+ <enum name="GL_TEXTURE_DEFORMATION_SGIX"/> >+ <enum name="GL_DEFORMATIONS_MASK_SGIX"/> >+ <enum name="GL_MAX_DEFORMATION_ORDER_SGIX"/> >+ <command name="glDeformationMap3dSGIX"/> >+ <command name="glDeformationMap3fSGIX"/> >+ <command name="glDeformSGIX"/> >+ <command name="glLoadIdentityDeformationMapSGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_reference_plane" supported="gl"> >+ <require> >+ <enum name="GL_REFERENCE_PLANE_SGIX"/> >+ <enum name="GL_REFERENCE_PLANE_EQUATION_SGIX"/> >+ <command name="glReferencePlaneSGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_resample" supported="gl"> >+ <require> >+ <enum name="GL_PACK_RESAMPLE_SGIX"/> >+ <enum name="GL_UNPACK_RESAMPLE_SGIX"/> >+ <enum name="GL_RESAMPLE_REPLICATE_SGIX"/> >+ <enum name="GL_RESAMPLE_ZERO_FILL_SGIX"/> >+ <enum name="GL_RESAMPLE_DECIMATE_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_scalebias_hint" supported="gl"> >+ <require> >+ <enum name="GL_SCALEBIAS_HINT_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_shadow" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_COMPARE_SGIX"/> >+ <enum name="GL_TEXTURE_COMPARE_OPERATOR_SGIX"/> >+ <enum name="GL_TEXTURE_LEQUAL_R_SGIX"/> >+ <enum name="GL_TEXTURE_GEQUAL_R_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_shadow_ambient" supported="gl"> >+ <require> >+ <enum name="GL_SHADOW_AMBIENT_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_sprite" supported="gl"> >+ <require> >+ <enum name="GL_SPRITE_SGIX"/> >+ <enum name="GL_SPRITE_MODE_SGIX"/> >+ <enum name="GL_SPRITE_AXIS_SGIX"/> >+ <enum name="GL_SPRITE_TRANSLATION_SGIX"/> >+ <enum name="GL_SPRITE_AXIAL_SGIX"/> >+ <enum name="GL_SPRITE_OBJECT_ALIGNED_SGIX"/> >+ <enum name="GL_SPRITE_EYE_ALIGNED_SGIX"/> >+ <command name="glSpriteParameterfSGIX"/> >+ <command name="glSpriteParameterfvSGIX"/> >+ <command name="glSpriteParameteriSGIX"/> >+ <command name="glSpriteParameterivSGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_subsample" supported="gl"> >+ <require> >+ <enum name="GL_PACK_SUBSAMPLE_RATE_SGIX"/> >+ <enum name="GL_UNPACK_SUBSAMPLE_RATE_SGIX"/> >+ <enum name="GL_PIXEL_SUBSAMPLE_4444_SGIX"/> >+ <enum name="GL_PIXEL_SUBSAMPLE_2424_SGIX"/> >+ <enum name="GL_PIXEL_SUBSAMPLE_4242_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_tag_sample_buffer" supported="gl"> >+ <require> >+ <command name="glTagSampleBufferSGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_texture_add_env" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_ENV_BIAS_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_texture_coordinate_clamp" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_MAX_CLAMP_S_SGIX"/> >+ <enum name="GL_TEXTURE_MAX_CLAMP_T_SGIX"/> >+ <enum name="GL_TEXTURE_MAX_CLAMP_R_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_texture_lod_bias" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_LOD_BIAS_S_SGIX"/> >+ <enum name="GL_TEXTURE_LOD_BIAS_T_SGIX"/> >+ <enum name="GL_TEXTURE_LOD_BIAS_R_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_texture_multi_buffer" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_MULTI_BUFFER_HINT_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_texture_scale_bias" supported="gl"> >+ <require> >+ <enum name="GL_POST_TEXTURE_FILTER_BIAS_SGIX"/> >+ <enum name="GL_POST_TEXTURE_FILTER_SCALE_SGIX"/> >+ <enum name="GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX"/> >+ <enum name="GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_vertex_preclip" supported="gl"> >+ <require> >+ <enum name="GL_VERTEX_PRECLIP_SGIX"/> >+ <enum name="GL_VERTEX_PRECLIP_HINT_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_ycrcb" supported="gl"> >+ <require> >+ <enum name="GL_YCRCB_422_SGIX"/> >+ <enum name="GL_YCRCB_444_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGIX_ycrcb_subsample" supported="gl"/> >+ <extension name="GL_SGIX_ycrcba" supported="gl"> >+ <require> >+ <enum name="GL_YCRCB_SGIX"/> >+ <enum name="GL_YCRCBA_SGIX"/> >+ </require> >+ </extension> >+ <extension name="GL_SGI_color_matrix" supported="gl"> >+ <require> >+ <enum name="GL_COLOR_MATRIX_SGI"/> >+ <enum name="GL_COLOR_MATRIX_STACK_DEPTH_SGI"/> >+ <enum name="GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_RED_SCALE_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_RED_BIAS_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI"/> >+ </require> >+ </extension> >+ <extension name="GL_SGI_color_table" supported="gl"> >+ <require> >+ <enum name="GL_COLOR_TABLE_SGI"/> >+ <enum name="GL_POST_CONVOLUTION_COLOR_TABLE_SGI"/> >+ <enum name="GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI"/> >+ <enum name="GL_PROXY_COLOR_TABLE_SGI"/> >+ <enum name="GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI"/> >+ <enum name="GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI"/> >+ <enum name="GL_COLOR_TABLE_SCALE_SGI"/> >+ <enum name="GL_COLOR_TABLE_BIAS_SGI"/> >+ <enum name="GL_COLOR_TABLE_FORMAT_SGI"/> >+ <enum name="GL_COLOR_TABLE_WIDTH_SGI"/> >+ <enum name="GL_COLOR_TABLE_RED_SIZE_SGI"/> >+ <enum name="GL_COLOR_TABLE_GREEN_SIZE_SGI"/> >+ <enum name="GL_COLOR_TABLE_BLUE_SIZE_SGI"/> >+ <enum name="GL_COLOR_TABLE_ALPHA_SIZE_SGI"/> >+ <enum name="GL_COLOR_TABLE_LUMINANCE_SIZE_SGI"/> >+ <enum name="GL_COLOR_TABLE_INTENSITY_SIZE_SGI"/> >+ <command name="glColorTableSGI"/> >+ <command name="glColorTableParameterfvSGI"/> >+ <command name="glColorTableParameterivSGI"/> >+ <command name="glCopyColorTableSGI"/> >+ <command name="glGetColorTableSGI"/> >+ <command name="glGetColorTableParameterfvSGI"/> >+ <command name="glGetColorTableParameterivSGI"/> >+ </require> >+ </extension> >+ <extension name="GL_SGI_texture_color_table" supported="gl"> >+ <require> >+ <enum name="GL_TEXTURE_COLOR_TABLE_SGI"/> >+ <enum name="GL_PROXY_TEXTURE_COLOR_TABLE_SGI"/> >+ </require> >+ </extension> >+ <extension name="GL_SUNX_constant_data" supported="gl"> >+ <require> >+ <enum name="GL_UNPACK_CONSTANT_DATA_SUNX"/> >+ <enum name="GL_TEXTURE_CONSTANT_DATA_SUNX"/> >+ <command name="glFinishTextureSUNX"/> >+ </require> >+ </extension> >+ <extension name="GL_SUN_convolution_border_modes" supported="gl"> >+ <require> >+ <enum name="GL_WRAP_BORDER_SUN"/> >+ </require> >+ </extension> >+ <extension name="GL_SUN_global_alpha" supported="gl"> >+ <require> >+ <enum name="GL_GLOBAL_ALPHA_SUN"/> >+ <enum name="GL_GLOBAL_ALPHA_FACTOR_SUN"/> >+ <command name="glGlobalAlphaFactorbSUN"/> >+ <command name="glGlobalAlphaFactorsSUN"/> >+ <command name="glGlobalAlphaFactoriSUN"/> >+ <command name="glGlobalAlphaFactorfSUN"/> >+ <command name="glGlobalAlphaFactordSUN"/> >+ <command name="glGlobalAlphaFactorubSUN"/> >+ <command name="glGlobalAlphaFactorusSUN"/> >+ <command name="glGlobalAlphaFactoruiSUN"/> >+ </require> >+ </extension> >+ <extension name="GL_SUN_mesh_array" supported="gl"> >+ <require> >+ <enum name="GL_QUAD_MESH_SUN"/> >+ <enum name="GL_TRIANGLE_MESH_SUN"/> >+ <command name="glDrawMeshArraysSUN"/> >+ </require> >+ </extension> >+ <extension name="GL_SUN_slice_accum" supported="gl"> >+ <require> >+ <enum name="GL_SLICE_ACCUM_SUN"/> >+ </require> >+ </extension> >+ <extension name="GL_SUN_triangle_list" supported="gl"> >+ <require> >+ <enum name="GL_RESTART_SUN"/> >+ <enum name="GL_REPLACE_MIDDLE_SUN"/> >+ <enum name="GL_REPLACE_OLDEST_SUN"/> >+ <enum name="GL_TRIANGLE_LIST_SUN"/> >+ <enum name="GL_REPLACEMENT_CODE_SUN"/> >+ <enum name="GL_REPLACEMENT_CODE_ARRAY_SUN"/> >+ <enum name="GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN"/> >+ <enum name="GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN"/> >+ <enum name="GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN"/> >+ <enum name="GL_R1UI_V3F_SUN"/> >+ <enum name="GL_R1UI_C4UB_V3F_SUN"/> >+ <enum name="GL_R1UI_C3F_V3F_SUN"/> >+ <enum name="GL_R1UI_N3F_V3F_SUN"/> >+ <enum name="GL_R1UI_C4F_N3F_V3F_SUN"/> >+ <enum name="GL_R1UI_T2F_V3F_SUN"/> >+ <enum name="GL_R1UI_T2F_N3F_V3F_SUN"/> >+ <enum name="GL_R1UI_T2F_C4F_N3F_V3F_SUN"/> >+ <command name="glReplacementCodeuiSUN"/> >+ <command name="glReplacementCodeusSUN"/> >+ <command name="glReplacementCodeubSUN"/> >+ <command name="glReplacementCodeuivSUN"/> >+ <command name="glReplacementCodeusvSUN"/> >+ <command name="glReplacementCodeubvSUN"/> >+ <command name="glReplacementCodePointerSUN"/> >+ </require> >+ </extension> >+ <extension name="GL_SUN_vertex" supported="gl"> >+ <require> >+ <command name="glColor4ubVertex2fSUN"/> >+ <command name="glColor4ubVertex2fvSUN"/> >+ <command name="glColor4ubVertex3fSUN"/> >+ <command name="glColor4ubVertex3fvSUN"/> >+ <command name="glColor3fVertex3fSUN"/> >+ <command name="glColor3fVertex3fvSUN"/> >+ <command name="glNormal3fVertex3fSUN"/> >+ <command name="glNormal3fVertex3fvSUN"/> >+ <command name="glColor4fNormal3fVertex3fSUN"/> >+ <command name="glColor4fNormal3fVertex3fvSUN"/> >+ <command name="glTexCoord2fVertex3fSUN"/> >+ <command name="glTexCoord2fVertex3fvSUN"/> >+ <command name="glTexCoord4fVertex4fSUN"/> >+ <command name="glTexCoord4fVertex4fvSUN"/> >+ <command name="glTexCoord2fColor4ubVertex3fSUN"/> >+ <command name="glTexCoord2fColor4ubVertex3fvSUN"/> >+ <command name="glTexCoord2fColor3fVertex3fSUN"/> >+ <command name="glTexCoord2fColor3fVertex3fvSUN"/> >+ <command name="glTexCoord2fNormal3fVertex3fSUN"/> >+ <command name="glTexCoord2fNormal3fVertex3fvSUN"/> >+ <command name="glTexCoord2fColor4fNormal3fVertex3fSUN"/> >+ <command name="glTexCoord2fColor4fNormal3fVertex3fvSUN"/> >+ <command name="glTexCoord4fColor4fNormal3fVertex4fSUN"/> >+ <command name="glTexCoord4fColor4fNormal3fVertex4fvSUN"/> >+ <command name="glReplacementCodeuiVertex3fSUN"/> >+ <command name="glReplacementCodeuiVertex3fvSUN"/> >+ <command name="glReplacementCodeuiColor4ubVertex3fSUN"/> >+ <command name="glReplacementCodeuiColor4ubVertex3fvSUN"/> >+ <command name="glReplacementCodeuiColor3fVertex3fSUN"/> >+ <command name="glReplacementCodeuiColor3fVertex3fvSUN"/> >+ <command name="glReplacementCodeuiNormal3fVertex3fSUN"/> >+ <command name="glReplacementCodeuiNormal3fVertex3fvSUN"/> >+ <command name="glReplacementCodeuiColor4fNormal3fVertex3fSUN"/> >+ <command name="glReplacementCodeuiColor4fNormal3fVertex3fvSUN"/> >+ <command name="glReplacementCodeuiTexCoord2fVertex3fSUN"/> >+ <command name="glReplacementCodeuiTexCoord2fVertex3fvSUN"/> >+ <command name="glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN"/> >+ <command name="glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN"/> >+ <command name="glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN"/> >+ <command name="glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN"/> >+ </require> >+ </extension> >+ <extension name="GL_VIV_shader_binary" supported="gles2"> >+ <require> >+ <enum name="GL_SHADER_BINARY_VIV"/> >+ </require> >+ </extension> >+ <extension name="GL_WIN_phong_shading" supported="gl"> >+ <require> >+ <enum name="GL_PHONG_WIN"/> >+ <enum name="GL_PHONG_HINT_WIN"/> >+ </require> >+ </extension> >+ <extension name="GL_WIN_specular_fog" supported="gl"> >+ <require> >+ <enum name="GL_FOG_SPECULAR_TEXTURE_WIN"/> >+ </require> >+ </extension> >+ </extensions> >+</registry> >diff --git a/Source/ThirdParty/ANGLE/scripts/gl_angle_ext.xml b/Source/ThirdParty/ANGLE/scripts/gl_angle_ext.xml >new file mode 100644 >index 00000000000..db7a7c7daef >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/gl_angle_ext.xml >@@ -0,0 +1,1074 @@ >+<?xml version="1.0" encoding="UTF-8"?> >+<registry> >+ <comment> >+ 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. >+ >+ gl_angle_ext.xml >+ Includes data used to auto-generate ANGLE classes. >+ </comment> >+ <!-- SECTION: GL command definitions. --> >+ <commands namespace="GL"> >+ <command> >+ <proto>void <name>glBindUniformLocationCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>const GLchar*</ptype> <name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCoverageModulationCHROMIUM</name></proto> >+ <param><ptype>GLenum</ptype> <name>components</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixLoadfCHROMIUM</name></proto> >+ <param><ptype>GLenum</ptype> <name>matrixMode</name></param> >+ <param><ptype>const GLfloat *</ptype> <name>matrix</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMatrixLoadIdentityCHROMIUM</name></proto> >+ <param><ptype>GLenum</ptype> <name>matrixMode</name></param> >+ </command> >+ <command> >+ <proto>GLuint <name>glGenPathsCHROMIUM</name></proto> >+ <param><ptype>GLsizei</ptype> <name>range</name></param> >+ </command> >+ <command> >+ <proto>void <name>glDeletePathsCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>first</name></param> >+ <param><ptype>GLsizei</ptype> <name>range</name></param> >+ </command> >+ <command> >+ <proto>GLboolean <name>glIsPathCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>path</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathCommandsCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLsizei</ptype> <name>numCommands</name></param> >+ <param><ptype>const GLubyte *</ptype> <name>commands</name></param> >+ <param><ptype>GLsizei</ptype> <name>numCoords</name></param> >+ <param><ptype>GLenum</ptype> <name>coordType</name></param> >+ <param><ptype>const void*</ptype> <name>coords</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathParameterfCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathParameteriCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPathParameterfvCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat *</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPathParameterivCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint *</ptype> <name>value</name></param> >+ </command> >+ <command> >+ <proto>void <name>glPathStencilFuncCHROMIUM</name></proto> >+ <param><ptype>GLenum</ptype> <name>func</name></param> >+ <param><ptype>GLint</ptype> <name>ref</name></param> >+ <param><ptype>GLuint</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilFillPathCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLenum</ptype> <name>fillMode</name></param> >+ <param><ptype>GLuint</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilStrokePathCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLint</ptype> <name>reference</name></param> >+ <param><ptype>GLuint</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCoverFillPathCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLenum</ptype> <name>coverMode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCoverStrokePathCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLenum</ptype> <name>coverMode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilThenCoverFillPathCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLenum</ptype> <name>fillMode</name></param> >+ <param><ptype>GLuint</ptype> <name>mask</name></param> >+ <param><ptype>GLenum</ptype> <name>coverMode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilThenCoverStrokePathCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>path</name></param> >+ <param><ptype>GLint</ptype> <name>reference</name></param> >+ <param><ptype>GLuint</ptype> <name>mask</name></param> >+ <param><ptype>GLenum</ptype> <name>coverMode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCoverFillPathInstancedCHROMIUM</name></proto> >+ <param><ptype>GLsizei</ptype> <name>numPath</name></param> >+ <param><ptype>GLenum</ptype> <name>pathNameType</name></param> >+ <param><ptype>const void *</ptype> <name>paths</name></param> >+ <param><ptype>GLuint</ptype> <name>pathBase</name></param> >+ <param><ptype>GLenum</ptype> <name>coverMode</name></param> >+ <param><ptype>GLenum</ptype> <name>transformType</name></param> >+ <param><ptype>const GLfloat *</ptype> <name>transformValues</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCoverStrokePathInstancedCHROMIUM</name></proto> >+ <param><ptype>GLsizei</ptype> <name>numPath</name></param> >+ <param><ptype>GLenum</ptype> <name>pathNameType</name></param> >+ <param><ptype>const void *</ptype> <name>paths</name></param> >+ <param><ptype>GLuint</ptype> <name>pathBase</name></param> >+ <param><ptype>GLenum</ptype> <name>coverMode</name></param> >+ <param><ptype>GLenum</ptype> <name>transformType</name></param> >+ <param><ptype>const GLfloat *</ptype> <name>transformValues</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilStrokePathInstancedCHROMIUM</name></proto> >+ <param><ptype>GLsizei</ptype> <name>numPath</name></param> >+ <param><ptype>GLenum</ptype> <name>pathNameType</name></param> >+ <param><ptype>const void *</ptype> <name>paths</name></param> >+ <param><ptype>GLuint</ptype> <name>pathBase</name></param> >+ <param><ptype>GLint</ptype> <name>reference</name></param> >+ <param><ptype>GLuint</ptype> <name>mask</name></param> >+ <param><ptype>GLenum</ptype> <name>transformType</name></param> >+ <param><ptype>const GLfloat *</ptype> <name>transformValues</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilFillPathInstancedCHROMIUM</name></proto> >+ <param><ptype>GLsizei</ptype> <name>numPaths</name></param> >+ <param><ptype>GLenum</ptype> <name>pathNameType</name></param> >+ <param><ptype>const void *</ptype> <name>paths</name></param> >+ <param><ptype>GLuint</ptype> <name>pathBase</name></param> >+ <param><ptype>GLenum</ptype> <name>fillMode</name></param> >+ <param><ptype>GLuint</ptype> <name>mask</name></param> >+ <param><ptype>GLenum</ptype> <name>transformType</name></param> >+ <param><ptype>const GLfloat *</ptype> <name>transformValues</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilThenCoverFillPathInstancedCHROMIUM</name></proto> >+ <param><ptype>GLsizei</ptype> <name>numPaths</name></param> >+ <param><ptype>GLenum</ptype> <name>pathNameType</name></param> >+ <param><ptype>const void *</ptype> <name>paths</name></param> >+ <param><ptype>GLuint</ptype> <name>pathBase</name></param> >+ <param><ptype>GLenum</ptype> <name>fillMode</name></param> >+ <param><ptype>GLuint</ptype> <name>mask</name></param> >+ <param><ptype>GLenum</ptype> <name>coverMode</name></param> >+ <param><ptype>GLenum</ptype> <name>transformType</name></param> >+ <param><ptype>const GLfloat *</ptype> <name>transformValues</name></param> >+ </command> >+ <command> >+ <proto>void <name>glStencilThenCoverStrokePathInstancedCHROMIUM</name></proto> >+ <param><ptype>GLsizei</ptype> <name>numPaths</name></param> >+ <param><ptype>GLenum</ptype> <name>pathNameType</name></param> >+ <param><ptype>const void *</ptype> <name>paths</name></param> >+ <param><ptype>GLuint</ptype> <name>pathBase</name></param> >+ <param><ptype>GLint</ptype> <name>reference</name></param> >+ <param><ptype>GLuint</ptype> <name>mask</name></param> >+ <param><ptype>GLenum</ptype> <name>coverMode</name></param> >+ <param><ptype>GLenum</ptype> <name>transformType</name></param> >+ <param><ptype>const GLfloat *</ptype> <name>transformValues</name></param> >+ </command> >+ <command> >+ <proto>void <name>glBindFragmentInputLocationCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>programs</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>const GLchar *</ptype> <name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProgramPathFragmentInputGenCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLenum</ptype> <name>genMode</name></param> >+ <param><ptype>GLint</ptype> <name>components</name></param> >+ <param><ptype>const GLfloat *</ptype> <name>coeffs</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyTextureCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>sourceId</name></param> >+ <param><ptype>GLint</ptype> <name>sourceLevel</name></param> >+ <param><ptype>GLenum</ptype> <name>destTarget</name></param> >+ <param><ptype>GLuint</ptype> <name>destId</name></param> >+ <param><ptype>GLint</ptype> <name>destLevel</name></param> >+ <param><ptype>GLint</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLenum</ptype> <name>destType</name></param> >+ <param><ptype>GLboolean</ptype> <name>unpackFlipY</name></param> >+ <param><ptype>GLboolean</ptype> <name>unpackPremultiplyAlpha</name></param> >+ <param><ptype>GLboolean</ptype> <name>unpackUnmultiplyAlpha</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopySubTextureCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>sourceId</name></param> >+ <param><ptype>GLint</ptype> <name>sourceLevel</name></param> >+ <param><ptype>GLenum</ptype> <name>destTarget</name></param> >+ <param><ptype>GLuint</ptype> <name>destId</name></param> >+ <param><ptype>GLint</ptype> <name>destLevel</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLint</ptype> <name>width</name></param> >+ <param><ptype>GLint</ptype> <name>height</name></param> >+ <param><ptype>GLboolean</ptype> <name>unpackFlipY</name></param> >+ <param><ptype>GLboolean</ptype> <name>unpackPremultiplyAlpha</name></param> >+ <param><ptype>GLboolean</ptype> <name>unpackUnmultiplyAlpha</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedCopyTextureCHROMIUM</name></proto> >+ <param><ptype>GLuint</ptype> <name>sourceId</name></param> >+ <param><ptype>GLuint</ptype> <name>destId</name></param> >+ </command> >+ <command> >+ <proto>void <name>glRequestExtensionANGLE</name></proto> >+ <param><ptype>const GLchar *</ptype> <name>name</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetBooleanvRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLboolean *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetBufferParameterivRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetFloatvRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLfloat *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetFramebufferAttachmentParameterivRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>attachment</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetIntegervRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetRenderbufferParameterivRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetShaderivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>shader</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameterfvRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLfloat *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameterivRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformfvRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLfloat *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribfvRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLfloat *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribPointervRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>void **</ptype> <name>pointer</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReadPixelsRobustANGLE</name></proto> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLsizei *</ptype> <name>columns</name></param> >+ <param><ptype>GLsizei *</ptype> <name>rows</name></param> >+ <param><ptype>void *</ptype> <name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexImage2DRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>const void *</ptype> <name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterfvRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>const GLfloat *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterivRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>const GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexSubImage2DRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>const void *</ptype> <name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexImage3DRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>const void *</ptype> <name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexSubImage3DRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>const void *</ptype> <name>pixels</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexImage2DRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param><ptype>GLsizei</ptype> <name>dataSize</name></param> >+ <param><ptype>const GLvoid *</ptype> <name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexSubImage2DRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLsizei</ptype> <name>xoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>yoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param><ptype>GLsizei</ptype> <name>dataSize</name></param> >+ <param><ptype>const GLvoid *</ptype> <name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexImage3DRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLint</ptype> <name>border</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param><ptype>GLsizei</ptype> <name>dataSize</name></param> >+ <param><ptype>const GLvoid *</ptype> <name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCompressedTexSubImage3DRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ <param><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLsizei</ptype> <name>imageSize</name></param> >+ <param><ptype>GLsizei</ptype> <name>dataSize</name></param> >+ <param><ptype>const GLvoid *</ptype> <name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryivRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryObjectuivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLuint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetBufferPointervRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>void **</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetIntegeri_vRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetInternalformativRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribIivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetVertexAttribIuivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLuint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetUniformuivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLuint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetActiveUniformBlockivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLuint</ptype> <name>uniformBlockIndex</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetInteger64vRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint64 *</ptype> <name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetInteger64i_vRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint64 *</ptype> <name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetBufferParameteri64vRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint64 *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSamplerParameterivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param><ptype>GLuint</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>const GLint *</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSamplerParameterfvRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>const GLfloat *</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetSamplerParameterivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetSamplerParameterfvRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLfloat *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetFramebufferParameterivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetProgramInterfaceivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLenum</ptype> <name>programInterface</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetBooleani_vRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLboolean *</ptype> <name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultisamplefvRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLfloat *</ptype> <name>val</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexLevelParameterivRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexLevelParameterfvRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLfloat *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetPointervRobustANGLERobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>void **</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glReadnPixelsRobustANGLE</name></proto> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLenum</ptype> <name>format</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLsizei *</ptype> <name>columns</name></param> >+ <param><ptype>GLsizei *</ptype> <name>rows</name></param> >+ <param><ptype>void *</ptype> <name>data</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformfvRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLfloat *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetnUniformuivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>program</name></param> >+ <param><ptype>GLint</ptype> <name>location</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLuint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterIivRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>const GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexParameterIuivRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>const GLuint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameterIivRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexParameterIuivRobustANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLuint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSamplerParameterIivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>const GLint *</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSamplerParameterIuivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>const GLuint *</ptype> <name>param</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetSamplerParameterIivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetSamplerParameterIuivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>sampler</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLuint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryObjectivRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryObjecti64vRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLint64 *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetQueryObjectui64vRobustANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>id</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLsizei</ptype> <name>bufSize</name></param> >+ <param><ptype>GLsizei *</ptype> <name>length</name></param> >+ <param><ptype>GLuint64 *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopyTexture3DANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>sourceId</name></param> >+ <param><ptype>GLint</ptype> <name>sourceLevel</name></param> >+ <param><ptype>GLenum</ptype> <name>destTarget</name></param> >+ <param><ptype>GLuint</ptype> <name>destId</name></param> >+ <param><ptype>GLint</ptype> <name>destLevel</name></param> >+ <param><ptype>GLint</ptype> <name>internalFormat</name></param> >+ <param><ptype>GLenum</ptype> <name>destType</name></param> >+ <param><ptype>GLboolean</ptype> <name>unpackFlipY</name></param> >+ <param><ptype>GLboolean</ptype> <name>unpackPremultiplyAlpha</name></param> >+ <param><ptype>GLboolean</ptype> <name>unpackUnmultiplyAlpha</name></param> >+ </command> >+ <command> >+ <proto>void <name>glCopySubTexture3DANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>sourceId</name></param> >+ <param><ptype>GLint</ptype> <name>sourceLevel</name></param> >+ <param><ptype>GLenum</ptype> <name>destTarget</name></param> >+ <param><ptype>GLuint</ptype> <name>destId</name></param> >+ <param><ptype>GLint</ptype> <name>destLevel</name></param> >+ <param><ptype>GLint</ptype> <name>xoffset</name></param> >+ <param><ptype>GLint</ptype> <name>yoffset</name></param> >+ <param><ptype>GLint</ptype> <name>zoffset</name></param> >+ <param><ptype>GLint</ptype> <name>x</name></param> >+ <param><ptype>GLint</ptype> <name>y</name></param> >+ <param><ptype>GLint</ptype> <name>z</name></param> >+ <param><ptype>GLint</ptype> <name>width</name></param> >+ <param><ptype>GLint</ptype> <name>height</name></param> >+ <param><ptype>GLint</ptype> <name>depth</name></param> >+ <param><ptype>GLboolean</ptype> <name>unpackFlipY</name></param> >+ <param><ptype>GLboolean</ptype> <name>unpackPremultiplyAlpha</name></param> >+ <param><ptype>GLboolean</ptype> <name>unpackUnmultiplyAlpha</name></param> >+ </command> >+ <command> >+ <proto>void <name>glTexStorage2DMultisampleANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLsizei</ptype> <name>samples</name></param> >+ <param><ptype>GLenum</ptype> <name>internalformat</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLboolean</ptype> <name>fixedsamplelocations</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexLevelParameterivANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLint *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetTexLevelParameterfvANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>target</name></param> >+ <param><ptype>GLint</ptype> <name>level</name></param> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLfloat *</ptype> <name>params</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawArraysANGLE</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLint</ptype> *<name>firsts</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLsizei</ptype> *<name>counts</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawcount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawArraysInstancedANGLE</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLint</ptype> *<name>firsts</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLsizei</ptype> *<name>counts</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLsizei</ptype> *<name>instanceCounts</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawcount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawElementsANGLE</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLsizei</ptype> *<name>counts</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLvoid</ptype> *const*<name>indices</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawcount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glMultiDrawElementsInstancedANGLE</name></proto> >+ <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLsizei</ptype> *<name>counts</name></param> >+ <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param> >+ <param len="COMPSIZE(primcount)">const <ptype>GLvoid</ptype> *const*<name>indices</name></param> >+ <param len="COMPSIZE(primcount)">const GLsizei*<name>instanceCounts</name></param> >+ <param><ptype>GLsizei</ptype> <name>drawcount</name></param> >+ </command> >+ <command> >+ <proto>void <name>glGetMultisamplefvANGLE</name></proto> >+ <param><ptype>GLenum</ptype> <name>pname</name></param> >+ <param><ptype>GLuint</ptype> <name>index</name></param> >+ <param><ptype>GLfloat *</ptype> <name>val</name></param> >+ </command> >+ <command> >+ <proto>void <name>glSampleMaskiANGLE</name></proto> >+ <param><ptype>GLuint</ptype> <name>maskNumber</name></param> >+ <param><ptype>GLbitfield</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto>void <name>glProvokingVertexANGLE</name></proto> >+ <param group="VertexProvokingMode"><ptype>GLenum</ptype> <name>mode</name></param> >+ </command> >+ <command> >+ <proto>void <name>glLoseContextCHROMIUM</name></proto> >+ <param group="GraphicsResetStatus"><ptype>GLenum</ptype> <name>current</name></param> >+ <param group="GraphicsResetStatus"><ptype>GLenum</ptype> <name>other</name></param> >+ </command> >+ </commands> >+ <!-- SECTION: ANGLE extension interface definitions --> >+ <extensions> >+ <extension name="GL_CHROMIUM_bind_uniform_location" supported='gles2'> >+ <require> >+ <command name="glBindUniformLocationCHROMIUM"/> >+ </require> >+ </extension> >+ <extension name="GL_CHROMIUM_framebuffer_mixed_samples" supported='gles2'> >+ <require> >+ <command name="glMatrixLoadfCHROMIUM"/> >+ <command name="glMatrixLoadIdentityCHROMIUM"/> >+ <command name="glCoverageModulationCHROMIUM"/> >+ </require> >+ </extension> >+ <extension name="GL_CHROMIUM_path_rendering" supported='gles2'> >+ <require> >+ <command name="glGenPathsCHROMIUM"/> >+ <command name="glDeletePathsCHROMIUM"/> >+ <command name="glIsPathCHROMIUM"/> >+ <command name="glPathCommandsCHROMIUM"/> >+ <command name="glPathParameterfCHROMIUM"/> >+ <command name="glPathParameteriCHROMIUM"/> >+ <command name="glGetPathParameterfvCHROMIUM"/> >+ <command name="glGetPathParameterivCHROMIUM"/> >+ <command name="glPathStencilFuncCHROMIUM"/> >+ <command name="glStencilFillPathCHROMIUM"/> >+ <command name="glStencilStrokePathCHROMIUM"/> >+ <command name="glCoverFillPathCHROMIUM"/> >+ <command name="glCoverStrokePathCHROMIUM"/> >+ <command name="glStencilThenCoverFillPathCHROMIUM"/> >+ <command name="glStencilThenCoverStrokePathCHROMIUM"/> >+ <command name="glCoverFillPathInstancedCHROMIUM"/> >+ <command name="glCoverStrokePathInstancedCHROMIUM"/> >+ <command name="glStencilFillPathInstancedCHROMIUM"/> >+ <command name="glStencilStrokePathInstancedCHROMIUM"/> >+ <command name="glStencilThenCoverFillPathInstancedCHROMIUM"/> >+ <command name="glStencilThenCoverStrokePathInstancedCHROMIUM"/> >+ <command name="glBindFragmentInputLocationCHROMIUM"/> >+ <command name="glProgramPathFragmentInputGenCHROMIUM"/> >+ </require> >+ </extension> >+ <extension name="GL_CHROMIUM_copy_texture" supported='gles2'> >+ <require> >+ <command name="glCopyTextureCHROMIUM"/> >+ <command name="glCopySubTextureCHROMIUM"/> >+ </require> >+ </extension> >+ <extension name="GL_CHROMIUM_copy_compressed_texture" supported='gles2'> >+ <require> >+ <command name="glCompressedCopyTextureCHROMIUM"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_request_extension" supported='gles2'> >+ <require> >+ <command name="glRequestExtensionANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_robust_client_memory" supported='gles2'> >+ <require> >+ <command name="glGetBooleanvRobustANGLE"/> >+ <command name="glGetBufferParameterivRobustANGLE"/> >+ <command name="glGetBufferParameteri64vRobustANGLE"/> >+ <command name="glGetFloatvRobustANGLE"/> >+ <command name="glGetFramebufferAttachmentParameterivRobustANGLE"/> >+ <command name="glGetIntegervRobustANGLE"/> >+ <command name="glGetProgramivRobustANGLE"/> >+ <command name="glGetRenderbufferParameterivRobustANGLE"/> >+ <command name="glGetShaderivRobustANGLE"/> >+ <command name="glGetTexParameterfvRobustANGLE"/> >+ <command name="glGetTexParameterivRobustANGLE"/> >+ <command name="glGetUniformfvRobustANGLE"/> >+ <command name="glGetUniformivRobustANGLE"/> >+ <command name="glGetVertexAttribfvRobustANGLE"/> >+ <command name="glGetVertexAttribivRobustANGLE"/> >+ <command name="glGetVertexAttribPointervRobustANGLE"/> >+ <command name="glReadPixelsRobustANGLE"/> >+ <command name="glTexImage2DRobustANGLE"/> >+ <command name="glTexParameterfvRobustANGLE"/> >+ <command name="glTexParameterivRobustANGLE"/> >+ <command name="glTexSubImage2DRobustANGLE"/> >+ <command name="glTexImage3DRobustANGLE"/> >+ <command name="glTexSubImage3DRobustANGLE"/> >+ <command name="glCompressedTexImage2DRobustANGLE"/> >+ <command name="glCompressedTexSubImage2DRobustANGLE"/> >+ <command name="glCompressedTexImage3DRobustANGLE"/> >+ <command name="glCompressedTexSubImage3DRobustANGLE"/> >+ <command name="glGetQueryivRobustANGLE"/> >+ <command name="glGetQueryObjectuivRobustANGLE"/> >+ <command name="glGetBufferPointervRobustANGLE"/> >+ <command name="glGetIntegeri_vRobustANGLE"/> >+ <command name="glGetInternalformativRobustANGLE"/> >+ <command name="glGetVertexAttribIivRobustANGLE"/> >+ <command name="glGetVertexAttribIuivRobustANGLE"/> >+ <command name="glGetUniformuivRobustANGLE"/> >+ <command name="glGetActiveUniformBlockivRobustANGLE"/> >+ <command name="glGetInteger64vRobustANGLE"/> >+ <command name="glGetInteger64i_vRobustANGLE"/> >+ <command name="glSamplerParameterivRobustANGLE"/> >+ <command name="glSamplerParameterfvRobustANGLE"/> >+ <command name="glGetSamplerParameterivRobustANGLE"/> >+ <command name="glGetSamplerParameterfvRobustANGLE"/> >+ <command name="glGetFramebufferParameterivRobustANGLE"/> >+ <command name="glGetProgramInterfaceivRobustANGLE"/> >+ <command name="glGetBooleani_vRobustANGLE"/> >+ <command name="glGetMultisamplefvRobustANGLE"/> >+ <command name="glGetTexLevelParameterivRobustANGLE"/> >+ <command name="glGetTexLevelParameterfvRobustANGLE"/> >+ <command name="glGetPointervRobustANGLERobustANGLE"/> >+ <command name="glReadnPixelsRobustANGLE"/> >+ <command name="glGetnUniformfvRobustANGLE"/> >+ <command name="glGetnUniformivRobustANGLE"/> >+ <command name="glGetnUniformuivRobustANGLE"/> >+ <command name="glTexParameterIivRobustANGLE"/> >+ <command name="glTexParameterIuivRobustANGLE"/> >+ <command name="glGetTexParameterIivRobustANGLE"/> >+ <command name="glGetTexParameterIuivRobustANGLE"/> >+ <command name="glSamplerParameterIivRobustANGLE"/> >+ <command name="glSamplerParameterIuivRobustANGLE"/> >+ <command name="glGetSamplerParameterIivRobustANGLE"/> >+ <command name="glGetSamplerParameterIuivRobustANGLE"/> >+ <command name="glGetQueryObjectivRobustANGLE"/> >+ <command name="glGetQueryObjecti64vRobustANGLE"/> >+ <command name="glGetQueryObjectui64vRobustANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_copy_texture_3d" supported='gles2'> >+ <require> >+ <command name="glCopyTexture3DANGLE"/> >+ <command name="glCopySubTexture3DANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_texture_multisample" supported='gles2'> >+ <require> >+ <command name="glTexStorage2DMultisampleANGLE"/> >+ <command name="glGetTexLevelParameterivANGLE"/> >+ <command name="glGetTexLevelParameterfvANGLE"/> >+ <command name="glGetMultisamplefvANGLE"/> >+ <command name="glSampleMaskiANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_multi_draw" supported='gles2'> >+ <require> >+ <command name="glMultiDrawArraysANGLE"/> >+ <command name="glMultiDrawArraysInstancedANGLE"/> >+ <command name="glMultiDrawElementsANGLE"/> >+ <command name="glMultiDrawElementsInstancedANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_ANGLE_provoking_vertex" supported='gles2'> >+ <require> >+ <enum name="GL_FIRST_VERTEX_CONVENTION"/> >+ <enum name="GL_LAST_VERTEX_CONVENTION"/> >+ <enum name="GL_PROVOKING_VERTEX"/> >+ <command name="glProvokingVertexANGLE"/> >+ </require> >+ </extension> >+ <extension name="GL_CHROMIUM_lose_context" supported='gles2'> >+ <require> >+ <enum name="GL_GUILTY_CONTEXT_RESET"/> >+ <enum name="GL_INNOCENT_CONTEXT_RESET"/> >+ <enum name="GL_UNKNOWN_CONTEXT_RESET"/> >+ <command name="glLoseContextCHROMIUM"/> >+ </require> >+ </extension> >+ </extensions> >+</registry> >diff --git a/Source/ThirdParty/ANGLE/scripts/msvs_projects.py b/Source/ThirdParty/ANGLE/scripts/msvs_projects.py >new file mode 100644 >index 00000000000..08d627738ad >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/msvs_projects.py >@@ -0,0 +1,40 @@ >+#!/usr/bin/python2 >+# >+# 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. >+# >+# msvs_projects.py: >+# A helper utility that generates Visual Studio projects for each of >+# the available directories in 'out', and then runs another helper >+# utility that merges these projects into one solution. >+ >+import sys, os, subprocess >+ >+# Change this to target another VS version. >+target_ide = 'vs2017' >+solution_name = 'ANGLE' >+ >+script_dir = os.path.dirname(sys.argv[0]) >+ >+# Set the CWD to the root ANGLE folder. >+os.chdir(os.path.join(script_dir, '..')) >+ >+out_dir = 'out' >+ >+# Generate the VS solutions for any valid directory. >+def generate_projects(dirname): >+ args = ['gn.bat', 'gen', dirname, '--ide=' + target_ide, '--sln=' + solution_name] >+ print('Running "' + ' '.join(args) + '"') >+ subprocess.call(args) >+ >+for potential_dir in os.listdir(out_dir): >+ path = os.path.join(out_dir, potential_dir) >+ build_ninja_d = os.path.join(path, 'build.ninja.d') >+ if os.path.exists(build_ninja_d): >+ generate_projects(path) >+ >+# Run the helper utility that merges the projects. >+args = ['python', os.path.join('build', 'win', 'gn_meta_sln.py')] >+print('Running "' + ' '.join(args) + '"') >+subprocess.call(args) >diff --git a/Source/ThirdParty/ANGLE/scripts/perf_test_runner.py b/Source/ThirdParty/ANGLE/scripts/perf_test_runner.py >new file mode 100644 >index 00000000000..5d8f9855f43 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/perf_test_runner.py >@@ -0,0 +1,139 @@ >+#!/usr/bin/python2 >+# >+# Copyright 2015 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. >+# >+# perf_test_runner.py: >+# Helper script for running and analyzing perftest results. Runs the >+# tests in an infinite batch, printing out the mean and coefficient of >+# variation of the population continuously. >+# >+ >+import glob >+import subprocess >+import sys >+import os >+import re >+ >+base_path = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) >+ >+# Look for a [Rr]elease build. >+perftests_paths = glob.glob('out/*elease*') >+metric = 'wall_time' >+max_experiments = 10 >+ >+binary_name = 'angle_perftests' >+if sys.platform == 'win32': >+ binary_name += '.exe' >+ >+scores = [] >+ >+# Danke to http://stackoverflow.com/a/27758326 >+def mean(data): >+ """Return the sample arithmetic mean of data.""" >+ n = len(data) >+ if n < 1: >+ raise ValueError('mean requires at least one data point') >+ return float(sum(data))/float(n) # in Python 2 use sum(data)/float(n) >+ >+def sum_of_square_deviations(data, c): >+ """Return sum of square deviations of sequence data.""" >+ ss = sum((float(x)-c)**2 for x in data) >+ return ss >+ >+def coefficient_of_variation(data): >+ """Calculates the population coefficient of variation.""" >+ n = len(data) >+ if n < 2: >+ raise ValueError('variance requires at least two data points') >+ c = mean(data) >+ ss = sum_of_square_deviations(data, c) >+ pvar = ss/n # the population variance >+ stddev = (pvar**0.5) # population standard deviation >+ return stddev / c >+ >+def truncated_list(data, n): >+ """Compute a truncated list, n is truncation size""" >+ if len(data) < n * 2: >+ raise ValueError('list not large enough to truncate') >+ return sorted(data)[n:-n] >+ >+def truncated_mean(data, n): >+ """Compute a truncated mean, n is truncation size""" >+ return mean(truncated_list(data, n)) >+ >+def truncated_cov(data, n): >+ """Compute a truncated coefficient of variation, n is truncation size""" >+ return coefficient_of_variation(truncated_list(data, n)) >+ >+# Find most recent binary >+newest_binary = None >+newest_mtime = None >+ >+for path in perftests_paths: >+ binary_path = os.path.join(base_path, path, binary_name) >+ if os.path.exists(binary_path): >+ binary_mtime = os.path.getmtime(binary_path) >+ if (newest_binary is None) or (binary_mtime > newest_mtime): >+ newest_binary = binary_path >+ newest_mtime = binary_mtime >+ >+perftests_path = newest_binary >+ >+if perftests_path == None or not os.path.exists(perftests_path): >+ print('Cannot find Release %s!' % binary_name) >+ sys.exit(1) >+ >+if sys.platform == 'win32': >+ test_name = 'DrawCallPerfBenchmark.Run/d3d11_null' >+else: >+ test_name = 'DrawCallPerfBenchmark.Run/gl' >+ >+if len(sys.argv) >= 2: >+ test_name = sys.argv[1] >+ >+print('Using test executable: ' + perftests_path) >+print('Test name: ' + test_name) >+ >+def get_results(metric, extra_args=[]): >+ process = subprocess.Popen([perftests_path, '--gtest_filter=' + test_name] + extra_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) >+ output, err = process.communicate() >+ >+ m = re.search(r'Running (\d+) tests', output) >+ if m and int(m.group(1)) > 1: >+ print("Found more than one test result in output:") >+ print(output) >+ sys.exit(3) >+ >+ pattern = metric + r'= ([0-9.]+)' >+ m = re.findall(pattern, output) >+ if m is None: >+ print("Did not find the metric '%s' in the test output:" % metric) >+ print(output) >+ sys.exit(1) >+ >+ return [float(value) for value in m] >+ >+# Calibrate the number of steps >+steps = get_results("steps", ["--calibration"])[0] >+print("running with %d steps." % steps) >+ >+# Loop 'max_experiments' times, running the tests. >+for experiment in range(max_experiments): >+ experiment_scores = get_results(metric, ["--steps", str(steps)]) >+ >+ for score in experiment_scores: >+ sys.stdout.write("%s: %.2f" % (metric, score)) >+ scores.append(score) >+ >+ if (len(scores) > 1): >+ sys.stdout.write(", mean: %.2f" % mean(scores)) >+ sys.stdout.write(", variation: %.2f%%" % (coefficient_of_variation(scores) * 100.0)) >+ >+ if (len(scores) > 7): >+ truncation_n = len(scores) >> 3 >+ sys.stdout.write(", truncated mean: %.2f" % truncated_mean(scores, truncation_n)) >+ sys.stdout.write(", variation: %.2f%%" % (truncated_cov(scores, truncation_n) * 100.0)) >+ >+ print("") >diff --git a/Source/ThirdParty/ANGLE/scripts/registry_xml.py b/Source/ThirdParty/ANGLE/scripts/registry_xml.py >new file mode 100644 >index 00000000000..56f85a6d7d2 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/registry_xml.py >@@ -0,0 +1,232 @@ >+#!/usr/bin/python2 >+# >+# 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. >+# >+# registry_xml.py: >+# Parses information from Khronos registry files.. >+ >+# List of supported extensions. Add to this list to enable new extensions >+# available in gl.xml. >+ >+import sys, os >+import xml.etree.ElementTree as etree >+ >+angle_extensions = [ >+ # ANGLE extensions >+ "GL_CHROMIUM_bind_uniform_location", >+ "GL_CHROMIUM_framebuffer_mixed_samples", >+ "GL_CHROMIUM_path_rendering", >+ "GL_CHROMIUM_copy_texture", >+ "GL_CHROMIUM_copy_compressed_texture", >+ "GL_CHROMIUM_lose_context", >+ "GL_ANGLE_request_extension", >+ "GL_ANGLE_robust_client_memory", >+ "GL_ANGLE_copy_texture_3d", >+] >+ >+gles1_extensions = [ >+ # ES1 (Possibly the min set of extensions needed by Android) >+ "GL_OES_draw_texture", >+ "GL_OES_framebuffer_object", >+ "GL_OES_matrix_palette", >+ "GL_OES_point_size_array", >+ "GL_OES_query_matrix", >+ "GL_OES_texture_cube_map", >+] >+ >+supported_extensions = sorted(angle_extensions + gles1_extensions + [ >+ # ES2+ >+ "GL_ANGLE_framebuffer_blit", >+ "GL_ANGLE_framebuffer_multisample", >+ "GL_ANGLE_instanced_arrays", >+ "GL_ANGLE_provoking_vertex", >+ "GL_ANGLE_texture_multisample", >+ "GL_ANGLE_translated_shader_source", >+ "GL_EXT_blend_func_extended", >+ "GL_EXT_debug_marker", >+ "GL_EXT_discard_framebuffer", >+ "GL_EXT_disjoint_timer_query", >+ "GL_EXT_draw_buffers", >+ "GL_EXT_geometry_shader", >+ "GL_EXT_instanced_arrays", >+ "GL_EXT_map_buffer_range", >+ "GL_EXT_memory_object", >+ "GL_EXT_memory_object_fd", >+ "GL_EXT_occlusion_query_boolean", >+ "GL_EXT_robustness", >+ "GL_EXT_semaphore", >+ "GL_EXT_semaphore_fd", >+ "GL_EXT_texture_storage", >+ "GL_KHR_debug", >+ "GL_NV_fence", >+ "GL_OES_EGL_image", >+ "GL_OES_get_program_binary", >+ "GL_OES_mapbuffer", >+ "GL_OES_texture_border_clamp", >+ "GL_OES_texture_storage_multisample_2d_array", >+ "GL_OES_vertex_array_object", >+ "GL_OVR_multiview", >+ "GL_OVR_multiview2", >+ "GL_KHR_parallel_shader_compile", >+ "GL_ANGLE_multi_draw", >+]) >+ >+supported_egl_extensions = [ >+ "EGL_ANDROID_blob_cache", >+ "EGL_ANDROID_get_frame_timestamps", >+ "EGL_ANDROID_presentation_time", >+ "EGL_ANGLE_d3d_share_handle_client_buffer", >+ "EGL_ANGLE_device_creation", >+ "EGL_ANGLE_device_d3d", >+ "EGL_ANGLE_program_cache_control", >+ "EGL_ANGLE_query_surface_pointer", >+ "EGL_ANGLE_stream_producer_d3d_texture", >+ "EGL_ANGLE_surface_d3d_texture_2d_share_handle", >+ "EGL_ANGLE_window_fixed_size", >+ "EGL_CHROMIUM_get_sync_values", >+ "EGL_EXT_create_context_robustness", >+ "EGL_EXT_device_query", >+ "EGL_EXT_platform_base", >+ "EGL_EXT_platform_device", >+ "EGL_KHR_debug", >+ "EGL_KHR_fence_sync", >+ "EGL_KHR_image", >+ "EGL_KHR_stream", >+ "EGL_KHR_stream_consumer_gltexture", >+ "EGL_KHR_swap_buffers_with_damage", >+ "EGL_KHR_wait_sync", >+ "EGL_NV_post_sub_buffer", >+ "EGL_NV_stream_consumer_gltexture_yuv", >+] >+ >+# Strip these suffixes from Context entry point names. NV is excluded (for now). >+strip_suffixes = ["ANGLE", "EXT", "KHR", "OES", "CHROMIUM"] >+ >+# The EGL_ANGLE_explicit_context extension is generated differently from other extensions. >+# Toggle generation here. >+support_EGL_ANGLE_explicit_context = True >+ >+def script_relative(path): >+ return os.path.join(os.path.dirname(sys.argv[0]), path) >+ >+def path_to(folder, file): >+ return os.path.join(script_relative(".."), "src", folder, file) >+ >+class GLCommandNames: >+ def __init__(self): >+ self.command_names = {} >+ >+ def get_commands(self, version): >+ return self.command_names[version] >+ >+ def get_all_commands(self): >+ cmd_names = [] >+ # Combine all the version lists into a single list >+ for version, version_cmd_names in sorted(self.command_names.iteritems()): >+ cmd_names += version_cmd_names >+ >+ return cmd_names >+ >+ def add_commands(self, version, commands): >+ # Add key if it doesn't exist >+ if version not in self.command_names: >+ self.command_names[version] = [] >+ # Add the commands that aren't duplicates >+ self.command_names[version] += commands >+ >+class RegistryXML: >+ def __init__(self, xml_file, ext_file = None): >+ tree = etree.parse(script_relative(xml_file)) >+ self.root = tree.getroot() >+ if (ext_file): >+ self._AppendANGLEExts(ext_file) >+ self.all_commands = self.root.findall('commands/command') >+ self.all_cmd_names = GLCommandNames() >+ self.commands = {} >+ >+ def _AppendANGLEExts(self, ext_file): >+ angle_ext_tree = etree.parse(script_relative(ext_file)) >+ angle_ext_root = angle_ext_tree.getroot() >+ >+ insertion_point = self.root.findall("./commands")[0] >+ for command in angle_ext_root.iter('commands'): >+ insertion_point.extend(command) >+ >+ insertion_point = self.root.findall("./extensions")[0] >+ for extension in angle_ext_root.iter('extensions'): >+ insertion_point.extend(extension) >+ >+ def AddCommands(self, feature_name, annotation): >+ xpath = ".//feature[@name='%s']//command" % feature_name >+ commands = [cmd.attrib['name'] for cmd in self.root.findall(xpath)] >+ >+ # Remove commands that have already been processed >+ current_cmds = self.all_cmd_names.get_all_commands() >+ commands = [cmd for cmd in commands if cmd not in current_cmds] >+ >+ self.all_cmd_names.add_commands(annotation, commands) >+ self.commands[annotation] = commands >+ >+ def _ClassifySupport(self, supported): >+ if 'gles2' in supported: >+ return 'gl2ext' >+ elif 'gles1' in supported: >+ return 'glext' >+ elif 'egl' in supported: >+ return 'eglext' >+ elif 'wgl' in supported: >+ return 'wglext' >+ else: >+ assert False >+ return 'unknown' >+ >+ def AddExtensionCommands(self, supported_extensions, apis): >+ # Use a first step to run through the extensions so we can generate them >+ # in sorted order. >+ self.ext_data = {} >+ self.ext_dupes = {} >+ ext_annotations = {} >+ >+ for extension in self.root.findall("extensions/extension"): >+ extension_name = extension.attrib['name'] >+ if not extension_name in supported_extensions: >+ continue >+ >+ ext_annotations[extension_name] = self._ClassifySupport(extension.attrib['supported']) >+ >+ ext_cmd_names = [] >+ >+ # There's an extra step here to filter out 'api=gl' extensions. This >+ # is necessary for handling KHR extensions, which have separate entry >+ # point signatures (without the suffix) for desktop GL. Note that this >+ # extra step is necessary because of Etree's limited Xpath support. >+ for require in extension.findall('require'): >+ if 'api' in require.attrib and require.attrib['api'] not in apis: >+ continue >+ >+ # A special case for EXT_texture_storage >+ filter_out_comment = "Supported only if GL_EXT_direct_state_access is supported" >+ if 'comment' in require.attrib and require.attrib['comment'] == filter_out_comment: >+ continue >+ >+ extension_commands = require.findall('command') >+ ext_cmd_names += [command.attrib['name'] for command in extension_commands] >+ >+ self.ext_data[extension_name] = sorted(ext_cmd_names) >+ >+ for extension_name, ext_cmd_names in sorted(self.ext_data.iteritems()): >+ >+ # Detect and filter duplicate extensions. >+ dupes = [] >+ for ext_cmd in ext_cmd_names: >+ if ext_cmd in self.all_cmd_names.get_all_commands(): >+ dupes.append(ext_cmd) >+ >+ for dupe in dupes: >+ ext_cmd_names.remove(dupe) >+ >+ self.ext_data[extension_name] = sorted(ext_cmd_names) >+ self.ext_dupes[extension_name] = dupes >+ self.all_cmd_names.add_commands(ext_annotations[extension_name], ext_cmd_names) >diff --git a/Source/ThirdParty/ANGLE/scripts/remove_files.py b/Source/ThirdParty/ANGLE/scripts/remove_files.py >new file mode 100644 >index 00000000000..f52a1a816ff >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/remove_files.py >@@ -0,0 +1,31 @@ >+#!/usr/bin/python2 >+# >+# 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. >+# >+# remove_files.py: >+# This special action is used to cleanup old files from the build directory. >+# Otherwise ANGLE will pick up the old file(s), causing build or runtime errors. >+# >+ >+import glob >+import os >+import sys >+ >+if len(sys.argv) < 3: >+ print("Usage: " + sys.argv[0] + " <stamp_file> <remove_patterns>") >+ >+stamp_file = sys.argv[1] >+ >+for i in range(2, len(sys.argv)): >+ remove_pattern = sys.argv[i] >+ remove_files = glob.glob(remove_pattern) >+ for f in remove_files: >+ if os.path.isfile(f): >+ os.remove(f) >+ >+# touch a dummy file to keep a timestamp >+with open(stamp_file, "w") as f: >+ f.write("blah") >+ f.close() >diff --git a/Source/ThirdParty/ANGLE/scripts/run_code_generation.py b/Source/ThirdParty/ANGLE/scripts/run_code_generation.py >new file mode 100644 >index 00000000000..b622eac4b1a >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/run_code_generation.py >@@ -0,0 +1,191 @@ >+#!/usr/bin/python2 >+# >+# 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. >+# >+# run_code_generation.py: >+# Runs ANGLE format table and other script code generation scripts. >+ >+import hashlib >+import json >+import os >+import subprocess >+import sys >+ >+script_dir = sys.path[0] >+root_dir = os.path.abspath(os.path.join(script_dir, '..')) >+ >+# auto_script is a standard way for scripts to return their inputs and outputs. >+ >+def get_child_script_dirname(script): >+ # All script names are relative to ANGLE's root >+ return os.path.dirname(os.path.abspath(os.path.join(root_dir, script))) >+ >+# Replace all backslashes with forward slashes to be platform independent >+def clean_path_slashes(path): >+ return path.replace("\\", "/") >+ >+# Takes a script file name which is relative to the code generation script's directory and >+# changes it to be relative to the angle root directory >+def rebase_script_path(script_path, relative_path): >+ return os.path.relpath(os.path.join(os.path.dirname(script_path), relative_path), root_dir) >+ >+def grab_from_script(script, param): >+ res = subprocess.check_output(['python', script, param]).strip() >+ if res == '': >+ return [] >+ return [clean_path_slashes(rebase_script_path(script, name)) for name in res.split(',')] >+ >+def auto_script(script): >+ # Set the CWD to the script directory. >+ os.chdir(get_child_script_dirname(script)) >+ base_script = os.path.basename(script) >+ info = { >+ 'inputs': grab_from_script(base_script, 'inputs'), >+ 'outputs': grab_from_script(base_script, 'outputs') >+ } >+ # Reset the CWD to the root ANGLE directory. >+ os.chdir(root_dir) >+ return info >+ >+hash_fname = "run_code_generation_hashes.json" >+ >+generators = { >+ 'ANGLE format': >+ 'src/libANGLE/renderer/gen_angle_format_table.py', >+ 'ANGLE load functions table': >+ 'src/libANGLE/renderer/gen_load_functions_table.py', >+ 'D3D11 blit shader selection': >+ 'src/libANGLE/renderer/d3d/d3d11/gen_blit11helper.py', >+ 'D3D11 format': >+ 'src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py', >+ 'DXGI format': >+ 'src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py', >+ 'DXGI format support': >+ 'src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py', >+ 'GL copy conversion table': >+ 'src/libANGLE/gen_copy_conversion_table.py', >+ 'GL/EGL/WGL loader': >+ 'scripts/generate_loader.py', >+ 'GL/EGL entry points': >+ 'scripts/generate_entry_points.py', >+ 'GL format map': >+ 'src/libANGLE/gen_format_map.py', >+ 'uniform type': >+ 'src/common/gen_uniform_type_table.py', >+ 'OpenGL dispatch table': >+ 'src/libANGLE/renderer/gl/generate_gl_dispatch_table.py', >+ 'packed enum': >+ 'src/common/gen_packed_gl_enums.py', >+ 'proc table': >+ 'src/libGLESv2/gen_proc_table.py', >+ 'Vulkan format': >+ 'src/libANGLE/renderer/vulkan/gen_vk_format_table.py', >+ 'Vulkan mandatory format support table': >+ 'src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py', >+ 'Vulkan internal shader programs': >+ 'src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py', >+ 'Emulated HLSL functions': >+ 'src/compiler/translator/gen_emulated_builtin_function_tables.py', >+ 'ESSL static builtins': >+ 'src/compiler/translator/gen_builtin_symbols.py', >+} >+ >+ >+def md5(fname): >+ hash_md5 = hashlib.md5() >+ with open(fname, "r") as f: >+ for chunk in iter(lambda: f.read(4096), b""): >+ hash_md5.update(chunk) >+ return hash_md5.hexdigest() >+ >+ >+def any_hash_dirty(name, filenames, new_hashes, old_hashes): >+ found_dirty_hash = False >+ for filename in filenames: >+ key = name + ":" + filename >+ if not os.path.isfile(filename): >+ print('Could not find %s for %s' % (filename, name)) >+ found_dirty_hash = True >+ else: >+ new_hashes[key] = md5(filename) >+ if (not key in old_hashes) or (old_hashes[key] != new_hashes[key]): >+ found_dirty_hash = True >+ return found_dirty_hash >+ >+ >+def any_old_hash_missing(new_hashes, old_hashes): >+ result = False >+ for name, _ in old_hashes.iteritems(): >+ if name not in new_hashes: >+ script, file = name.split(':') >+ print('%s missing from generated hashes for %s.' % (file, script)) >+ result = True >+ return result >+ >+ >+def update_output_hashes(script, outputs, new_hashes): >+ for output in outputs: >+ if not os.path.isfile(output): >+ print('Output is missing from %s: %s' % (script, output)) >+ sys.exit(1) >+ key = script + ":" + output >+ new_hashes[key] = md5(output) >+ >+ >+def main(): >+ os.chdir(script_dir) >+ >+ old_hashes = json.load(open(hash_fname)) >+ new_hashes = {} >+ any_dirty = False >+ >+ verify_only = False >+ if len(sys.argv) > 1 and sys.argv[1] == '--verify-no-dirty': >+ verify_only = True >+ >+ for name, script in sorted(generators.iteritems()): >+ info = auto_script(script) >+ filenames = info['inputs'] + info['outputs'] + [script] >+ if any_hash_dirty(name, filenames, new_hashes, old_hashes): >+ any_dirty = True >+ >+ if not verify_only: >+ # Set the CWD to the script directory. >+ os.chdir(get_child_script_dirname(script)) >+ >+ print('Running ' + name + ' code generator') >+ if subprocess.call(['python', os.path.basename(script)]) != 0: >+ sys.exit(1) >+ >+ if any_old_hash_missing(new_hashes, old_hashes): >+ any_dirty = True >+ >+ if verify_only: >+ sys.exit(any_dirty) >+ >+ if any_dirty: >+ args = [] >+ if os.name == 'nt': >+ args += ['git.bat'] >+ else: >+ args += ['git'] >+ # The diff can be so large the arguments to clang-format can break the Windows command >+ # line length limits. Work around this by calling git cl format with --full. >+ args += ['cl', 'format', '--full'] >+ print('Calling git cl format') >+ subprocess.call(args) >+ >+ # Update the output hashes again since they can be formatted. >+ for name, script in sorted(generators.iteritems()): >+ info = auto_script(script) >+ update_output_hashes(name, info['outputs'], new_hashes) >+ >+ os.chdir(script_dir) >+ json.dump(new_hashes, open(hash_fname, "w"), indent=2, sort_keys=True, >+ separators=(',', ':\n ')) >+ >+ >+if __name__ == '__main__': >+ sys.exit(main()) >diff --git a/Source/ThirdParty/ANGLE/scripts/run_code_generation_hashes.json b/Source/ThirdParty/ANGLE/scripts/run_code_generation_hashes.json >new file mode 100644 >index 00000000000..8e6a1039e79 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/run_code_generation_hashes.json >@@ -0,0 +1,390 @@ >+{ >+ "ANGLE format:src/libANGLE/renderer/FormatID_autogen.h": >+ "083c08bb743bf72a900079890b14184f", >+ "ANGLE format:src/libANGLE/renderer/Format_table_autogen.cpp": >+ "a4cf00b75621bc058c4a1b341bdf6989", >+ "ANGLE format:src/libANGLE/renderer/angle_format.py": >+ "b18ca0fe4835114a4a2f54977b19e798", >+ "ANGLE format:src/libANGLE/renderer/angle_format_data.json": >+ "288d2f350948f8b1928c249234a44b25", >+ "ANGLE format:src/libANGLE/renderer/angle_format_map.json": >+ "be9f9bdbdf785dda05920146e8c55dbb", >+ "ANGLE format:src/libANGLE/renderer/gen_angle_format_table.py": >+ "3d9f679b65f39ccf19bd7bdf5498f837", >+ "ANGLE load functions table:src/libANGLE/renderer/gen_load_functions_table.py": >+ "2dcc3aa0cd700165b588cf53441e243b", >+ "ANGLE load functions table:src/libANGLE/renderer/load_functions_data.json": >+ "816be111bf4d1995589350dceb367315", >+ "ANGLE load functions table:src/libANGLE/renderer/load_functions_table_autogen.cpp": >+ "e6d34c18d41d3a9259f6a3e3ff6e40ff", >+ "D3D11 blit shader selection:src/libANGLE/renderer/d3d/d3d11/Blit11Helper_autogen.inc": >+ "f69cf03a3d868a977fad9e9c0eb0652a", >+ "D3D11 blit shader selection:src/libANGLE/renderer/d3d/d3d11/d3d11_blit_shaders_autogen.gni": >+ "329dbafc64b0cb578348819198abcfea", >+ "D3D11 blit shader selection:src/libANGLE/renderer/d3d/d3d11/gen_blit11helper.py": >+ "38bff72bc17ac25c6b42c98d40c76e20", >+ "D3D11 format:src/libANGLE/renderer/angle_format.py": >+ "b18ca0fe4835114a4a2f54977b19e798", >+ "D3D11 format:src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py": >+ "d3260e0390ad2cd8b07420b7426fad43", >+ "D3D11 format:src/libANGLE/renderer/d3d/d3d11/texture_format_data.json": >+ "d7483ece817e819588f4ca157716dc7b", >+ "D3D11 format:src/libANGLE/renderer/d3d/d3d11/texture_format_map.json": >+ "805d30e2443935e3a3bd68839699e171", >+ "D3D11 format:src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp": >+ "7c42f9e538cb675d13f8b5d2f248ef84", >+ "DXGI format support:src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json": >+ "09195053f8829fc81efe08229b54a8b5", >+ "DXGI format support:src/libANGLE/renderer/d3d/d3d11/dxgi_support_table_autogen.cpp": >+ "7ec32ce0ad41450be7493c1db1130e25", >+ "DXGI format support:src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py": >+ "389a6358534ebad5e232a44944b6123b", >+ "DXGI format:src/libANGLE/renderer/angle_format.py": >+ "b18ca0fe4835114a4a2f54977b19e798", >+ "DXGI format:src/libANGLE/renderer/angle_format_map.json": >+ "be9f9bdbdf785dda05920146e8c55dbb", >+ "DXGI format:src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json": >+ "24f525b05dc665fbbc8c6d68fb863719", >+ "DXGI format:src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp": >+ "32b9860e3fd8e87a89ff9a09e848e516", >+ "DXGI format:src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py": >+ "bed2688ca828fc9fd1904408d33ba007", >+ "ESSL static builtins:src/compiler/translator/ParseContext_autogen.h": >+ "6be7f97ce68aa5ba5ecf30b835bc344d", >+ "ESSL static builtins:src/compiler/translator/SymbolTable_autogen.cpp": >+ "f3b75261653cf1729b11afcee7294494", >+ "ESSL static builtins:src/compiler/translator/SymbolTable_autogen.h": >+ "bdb3c8eab0d48267a2f264e3af635e1a", >+ "ESSL static builtins:src/compiler/translator/builtin_function_declarations.txt": >+ "e5e567406476306ea06984d885be028d", >+ "ESSL static builtins:src/compiler/translator/builtin_symbols_hash_autogen.txt": >+ "e60e2185718a035adfd19ab91536fdb7", >+ "ESSL static builtins:src/compiler/translator/builtin_variables.json": >+ "a8f3d76c3c395e8f6a35dd22eb2e8416", >+ "ESSL static builtins:src/compiler/translator/gen_builtin_symbols.py": >+ "f056dba2fdeac5a5dbad9d8f7b17f55f", >+ "ESSL static builtins:src/compiler/translator/tree_util/BuiltIn_autogen.h": >+ "6df5ab6576da4f364763b581da839b77", >+ "ESSL static builtins:src/tests/compiler_tests/ImmutableString_test_autogen.cpp": >+ "c7994179a311f152df4b4a8513211c87", >+ "Emulated HLSL functions:src/compiler/translator/emulated_builtin_function_data_hlsl.json": >+ "002ad46d144c51fe98d73478aa554ba7", >+ "Emulated HLSL functions:src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp": >+ "1c759ffdd27a86fd8f2d590b2f3dcb56", >+ "Emulated HLSL functions:src/compiler/translator/gen_emulated_builtin_function_tables.py": >+ "c24de0c9ce5f201985c852d2b4b12b98", >+ "GL copy conversion table:src/libANGLE/es3_copy_conversion_formats.json": >+ "54608f6f7d9aa7c59a8458ccf3ab9935", >+ "GL copy conversion table:src/libANGLE/es3_copy_conversion_table_autogen.cpp": >+ "b20d198cf5e292c43170d4873b381b34", >+ "GL copy conversion table:src/libANGLE/gen_copy_conversion_table.py": >+ "92428cef9d97d33ee7063cfa387ccf56", >+ "GL format map:src/libANGLE/es3_format_type_combinations.json": >+ "a232823cd6430f14e28793ccabb968ee", >+ "GL format map:src/libANGLE/format_map_autogen.cpp": >+ "1e1b1c2af35a8a75c4395430d2370758", >+ "GL format map:src/libANGLE/format_map_data.json": >+ "779798d4879e5f73a5a108e3e3fd3095", >+ "GL format map:src/libANGLE/gen_format_map.py": >+ "0fd8c00e8b5afb28a5f8b40d9628b9a4", >+ "GL/EGL entry points:scripts/egl.xml": >+ "842e24514c4cfe09fba703c17a0fd292", >+ "GL/EGL entry points:scripts/egl_angle_ext.xml": >+ "745534010f31fbe8e1a1fcddce15ed2d", >+ "GL/EGL entry points:scripts/entry_point_packed_gl_enums.json": >+ "28238b0f52826c3794eaa1aa940238bf", >+ "GL/EGL entry points:scripts/generate_entry_points.py": >+ "83064b09d168c807431cac137b845b5f", >+ "GL/EGL entry points:scripts/gl.xml": >+ "b470cb06b06cbbe7adb2c8129ec85708", >+ "GL/EGL entry points:scripts/gl_angle_ext.xml": >+ "11e1eb2cbe51ae6e7b8705d3506846d5", >+ "GL/EGL entry points:scripts/registry_xml.py": >+ "3b9a36e0be051dc5b4e5162d54749e49", >+ "GL/EGL entry points:src/libANGLE/Context_gles_1_0_autogen.h": >+ "fad4ec629b41e9d97ff57a132ad946cb", >+ "GL/EGL entry points:src/libANGLE/validationES1_autogen.h": >+ "8d3131d2bf2e6f521f46b44e64a6bff9", >+ "GL/EGL entry points:src/libANGLE/validationES2_autogen.h": >+ "edf0d7d2afdfd6c090f83d40312394ad", >+ "GL/EGL entry points:src/libANGLE/validationES31_autogen.h": >+ "22ef241ea5b79a6abe6589f1afcc80a2", >+ "GL/EGL entry points:src/libANGLE/validationES3_autogen.h": >+ "4617942e5bf67fa5e35675daf66afc5c", >+ "GL/EGL entry points:src/libANGLE/validationESEXT_autogen.h": >+ "d7777a2ca9aea09ae46fd39088206bfc", >+ "GL/EGL entry points:src/libGLESv2/entry_points_enum_autogen.h": >+ "296e06c9ced6c5a9a2b0c54370be8a04", >+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_1_0_autogen.cpp": >+ "196771da8ad7a5beded1dc878410ac11", >+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_1_0_autogen.h": >+ "77fa8d307ebf839838f8812786cddc1a", >+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_2_0_autogen.cpp": >+ "4f86bb77e2f29c6c1994448ab55d772f", >+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_2_0_autogen.h": >+ "3bbaf1cf42fba5d675e5b54cd1d14df7", >+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_3_0_autogen.cpp": >+ "94cf20c29469d508af7f5e0a791ccd6a", >+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_3_0_autogen.h": >+ "395f6978219abd5182bbe80cc367e40c", >+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_3_1_autogen.cpp": >+ "72188430258b99258cef9048f0f4b4ee", >+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_3_1_autogen.h": >+ "043d09a964c740067bf4279e0b544aed", >+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_ext_autogen.cpp": >+ "ea21bf3d72c769362ebe32a226a1836e", >+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_ext_autogen.h": >+ "eb5e13e2da6e217068ae949e900487a0", >+ "GL/EGL entry points:src/libGLESv2/libGLESv2_autogen.cpp": >+ "c99457bcd86a5b94c61185c1bcddfdcb", >+ "GL/EGL entry points:src/libGLESv2/libGLESv2_autogen.def": >+ "f92d6246265e21a5ed7d949d9de1e26e", >+ "GL/EGL/WGL loader:scripts/egl.xml": >+ "842e24514c4cfe09fba703c17a0fd292", >+ "GL/EGL/WGL loader:scripts/egl_angle_ext.xml": >+ "745534010f31fbe8e1a1fcddce15ed2d", >+ "GL/EGL/WGL loader:scripts/generate_loader.py": >+ "475030714c1644b6dfb1f6f08572039d", >+ "GL/EGL/WGL loader:scripts/registry_xml.py": >+ "3b9a36e0be051dc5b4e5162d54749e49", >+ "GL/EGL/WGL loader:scripts/wgl.xml": >+ "aa96419c582af2f6673430e2847693f4", >+ "GL/EGL/WGL loader:src/libEGL/egl_loader_autogen.cpp": >+ "d270ee9f0b0bcbb58f3a8967758d9b38", >+ "GL/EGL/WGL loader:src/libEGL/egl_loader_autogen.h": >+ "77d0a6b43528115ea2ce3a987b25fa91", >+ "GL/EGL/WGL loader:util/egl_loader_autogen.cpp": >+ "d397c5b251c10f44857c9098eab5f9a2", >+ "GL/EGL/WGL loader:util/egl_loader_autogen.h": >+ "897a66bc15e1791e356d7324f2ff94af", >+ "GL/EGL/WGL loader:util/gles_loader_autogen.cpp": >+ "34056ce8d9c18d3cdcd23e16b94508c4", >+ "GL/EGL/WGL loader:util/gles_loader_autogen.h": >+ "0ee94fbf54d7ae8b56d4fabc478fd31e", >+ "GL/EGL/WGL loader:util/windows/wgl_loader_autogen.cpp": >+ "12ffb44e5e743c826e4d84ac65cdba82", >+ "GL/EGL/WGL loader:util/windows/wgl_loader_autogen.h": >+ "e18f6c134b709c5a69ed3b4ff38642d0", >+ "OpenGL dispatch table:scripts/gl.xml": >+ "b470cb06b06cbbe7adb2c8129ec85708", >+ "OpenGL dispatch table:src/libANGLE/renderer/angle_format.py": >+ "b18ca0fe4835114a4a2f54977b19e798", >+ "OpenGL dispatch table:src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp": >+ "96d06b3acf7826aee1ec813a8fa3a867", >+ "OpenGL dispatch table:src/libANGLE/renderer/gl/DispatchTableGL_autogen.h": >+ "ea5eded625b5db7d7b2b7f689c72f14b", >+ "OpenGL dispatch table:src/libANGLE/renderer/gl/generate_gl_dispatch_table.py": >+ "7571edb9e610891ed0c95dc496120cff", >+ "OpenGL dispatch table:src/libANGLE/renderer/gl/gl_bindings_data.json": >+ "1afca09d29ed7788c76cbc9bcfb4de0a", >+ "OpenGL dispatch table:src/libANGLE/renderer/gl/null_functions.cpp": >+ "5470d6b1d7057d797e15b986a31e196e", >+ "OpenGL dispatch table:src/libANGLE/renderer/gl/null_functions.h": >+ "7906751710cab691f9e7365e59b7beed", >+ "Vulkan format:src/libANGLE/renderer/angle_format.py": >+ "b18ca0fe4835114a4a2f54977b19e798", >+ "Vulkan format:src/libANGLE/renderer/angle_format_map.json": >+ "be9f9bdbdf785dda05920146e8c55dbb", >+ "Vulkan format:src/libANGLE/renderer/vulkan/gen_vk_format_table.py": >+ "c1f153d67fa50e5f6683170c83b610d4", >+ "Vulkan format:src/libANGLE/renderer/vulkan/vk_format_map.json": >+ "a6522dc0af17eebfee8b3d6d4723594f", >+ "Vulkan format:src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp": >+ "34dcf4f106f94b03f74c9fd08b22f6ed", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py": >+ "1262e5e903c7dad214ded83625f9d3c4", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc": >+ "caa03e84d757844a099d0e408a162c7e", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc": >+ "e5de095f618b4c5a3f95a0933fac99b8", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000002.inc": >+ "92be0607996ec71596011ae627d1c014", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000003.inc": >+ "6514d0995cdeb9106ae13c638f09ff2d", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000004.inc": >+ "46fe870e1d4dfb51727475f15c5a8696", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000005.inc": >+ "6a6ecd244c5c0db9eb4987ffaa753418", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000006.inc": >+ "dbf87695a067c39af53555d89b583022", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000007.inc": >+ "eb6ee24de79771edeb2841442362c51a", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000008.inc": >+ "7f32ffa7aac75052911555856088fffa", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000009.inc": >+ "1d4f8238c97aa8f0b6cbd358c2b5113f", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000A.inc": >+ "d4a5d3182f4b4d8e73d2c20657111cb1", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000B.inc": >+ "23db7e8e3818a3970d9a89f83b67c01a", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc": >+ "213a2b787f8844ddb76bd4b155cbb9c2", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc": >+ "17b71f1b9a22ed05357f1409f7ff8945", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc": >+ "fc1d4efe95ef97aea9692bb81a368ba6", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc": >+ "91989c25edcb1ea87585a38ee5639760", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc": >+ "5258597cfae463579ad5dd389ed6640b", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc": >+ "5e1e5572e214d9920ac0b917147a5a18", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc": >+ "d39d7c29b08dd9ce3c8819e9d1ca8d02", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc": >+ "f25152b2ad944d39695fe7dadd86e660", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc": >+ "3bd0e4958dbc9d1bbe7e1c613774cb5b", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000009.inc": >+ "9845efd3073ddf7a10b71e225e1d8412", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000A.inc": >+ "e15c71e7e6691929fd6cfa91f9f2225f", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000B.inc": >+ "a45fbca55c9e0e8ebeff1361381b837a", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000C.inc": >+ "b772949f6235efde9f8f046e919024aa", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000D.inc": >+ "1389d5d1ca18163e458a63115f017004", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000E.inc": >+ "66d9462ac3ccbba2338e7363c6041aa7", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000F.inc": >+ "b8e930a6a7357e99476f05cc13436795", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc": >+ "e0baef7dbb3d37d9220fe5c47b699903", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc": >+ "c0574d0edec329664ababf8390f0f8d7", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000001.inc": >+ "40a0d8489dafa815b0b9a1ca7a796583", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000002.inc": >+ "cce2d3897ae18cf9df3eefc9c2e08a2b", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000003.inc": >+ "76e83e0a3df1e9e64009a1de1eac6f0a", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000004.inc": >+ "9b948bda7d8e77b97fbdb334d3a45eb8", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000005.inc": >+ "271bdb4d1e3bddddeec4e422d27d6b43", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000006.inc": >+ "7da53883fadcf31d4f8616f8c7bea8a0", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000007.inc": >+ "a6465f6fb97f25b8581285691140ff83", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000008.inc": >+ "440a8ea2bb8cabd360c7c27c642ae220", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000009.inc": >+ "9e9d743e5da6943bdf98cc18e33ce5ff", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000A.inc": >+ "dedb37d1db52d3579d352c67ab8fb5c7", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000B.inc": >+ "cedcc96ae848cff331769640210fb4ca", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000C.inc": >+ "4b73e2c034d4548467a9a31ae2a330c3", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000D.inc": >+ "5a6a468b452bb8534ee9c96af8fd2298", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000E.inc": >+ "baf91a84a621705a56067644a898a984", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000F.inc": >+ "1d4a9ee861c8da792d1a207e4ee623e3", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000010.inc": >+ "913bd14e42386d7884cd4c71311c6596", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000011.inc": >+ "b6809c60e9c7b113e90cc82753818767", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000012.inc": >+ "93bf55a25b866b73e78dc1253a8eabf3", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000013.inc": >+ "d4aa885da98dde43ad94dd76742c12e6", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000014.inc": >+ "d70d2a7380efaa795bab22445119ac45", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000015.inc": >+ "ae41ff1909b9ab2cd36792d88714e6d3", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000016.inc": >+ "30b4f51388b992e976e0f8e077f12ecd", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000017.inc": >+ "d6694636d0ec7c5c6a81505412f0a790", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000000.inc": >+ "1faa58a55c16b0e9aba212c3d1967bb1", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000001.inc": >+ "7c6856d0d1fbb2f0cf136429718ea73e", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000002.inc": >+ "a45cc3d680ebcb25d20778047a4ddd2d", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000003.inc": >+ "73efe6e89967dcb26f45de624afc2d0b", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000004.inc": >+ "ef0cd7ca1246951a19ce78db185e6a91", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000005.inc": >+ "f26939cccda7d0c518391c76ad04b89b", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000008.inc": >+ "9cba7718c40fec9efa57001e8c096d51", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000009.inc": >+ "c74d02e82a51952716aa5ccf1c5f00df", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000A.inc": >+ "d6a808df6cd1a2c9c53a7a3b6fca9f51", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000B.inc": >+ "b9a74f36b35600bf10b23055ce7d3cf0", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000C.inc": >+ "0c516b1bd6d91da627957522fb4fe8aa", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000D.inc": >+ "db29024c7750f2b53db8e23b01c3b44b", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000010.inc": >+ "15f9a5a9752647caff36fb60574ce5bc", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000011.inc": >+ "6df4a84b18bd0916674f785e38d44249", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000012.inc": >+ "c06bb3eb6ed8341088d5f7fa12582a28", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000013.inc": >+ "dc5420b2fc2cde18713563878b880c7f", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000014.inc": >+ "65bb707b9a817ff4b8a2da5a4a7202b7", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc": >+ "b8ede4184815457b74e4749918236fce", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/BufferUtils.comp": >+ "0c8c050841543da0d7faca2559212aa8", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ConvertVertex.comp": >+ "93649f61036c2fa4739988ad71f413df", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert": >+ "805ec8b2f87d4bd4242dc5b1c58ba3b4", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag": >+ "7f562c60e5df018b0087ecb8642ac821", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag": >+ "20c83ade1efb48a802dc34ca838a2be6", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp": >+ "751f3554fe613d9b4739c7a4ac87b037", >+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h": >+ "930fc6f4a705a0d2121770377d3bc764", >+ "Vulkan internal shader programs:tools/glslang/glslang_validator.exe.sha1": >+ "4e0076daa7a27051c1245b8b339ebd6d", >+ "Vulkan internal shader programs:tools/glslang/glslang_validator.sha1": >+ "ea685e0867a4b3a07ad7e4246ac84e10", >+ "Vulkan mandatory format support table:src/libANGLE/renderer/angle_format.py": >+ "b18ca0fe4835114a4a2f54977b19e798", >+ "Vulkan mandatory format support table:src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py": >+ "417772416d3082400ce05acc2f209c9f", >+ "Vulkan mandatory format support table:src/libANGLE/renderer/vulkan/vk_mandatory_format_support_data.json": >+ "fa2bd54c1bb0ab2cf1d386061a4bc5c5", >+ "Vulkan mandatory format support table:src/libANGLE/renderer/vulkan/vk_mandatory_format_support_table_autogen.cpp": >+ "d20e549634ef32d6ad4e9f0b28e52acf", >+ "Vulkan mandatory format support table:third_party/vulkan-headers/src/registry/vk.xml": >+ "8af0f992bd45c2d9500eb5ed60c256d6", >+ "packed enum:src/common/PackedEGLEnums_autogen.cpp": >+ "c9f7cea85751e5a39b92bccc1d97f3bd", >+ "packed enum:src/common/PackedEGLEnums_autogen.h": >+ "4073274726e0c926765c5ab8b21dc3de", >+ "packed enum:src/common/PackedGLEnums_autogen.cpp": >+ "41faf7a2b9b7a5008269f3e57bbe361d", >+ "packed enum:src/common/PackedGLEnums_autogen.h": >+ "0766f2bb7874b2b6b4aaed4a6d0ef49e", >+ "packed enum:src/common/gen_packed_gl_enums.py": >+ "0cd1a1cb6d5fde8cbac2994db24eb901", >+ "packed enum:src/common/packed_egl_enums.json": >+ "5f591d220ee53b6e54a27d1523a3ab79", >+ "packed enum:src/common/packed_gl_enums.json": >+ "cd2c00958dd8cc546b816dedaf4769d3", >+ "proc table:src/libGLESv2/gen_proc_table.py": >+ "20ebe54894d613de42b0b15ca34078d9", >+ "proc table:src/libGLESv2/proc_table_autogen.cpp": >+ "1e89c264adbe7120edb636013383598b", >+ "proc table:src/libGLESv2/proc_table_data.json": >+ "04123621b8fd5e6d18f9f3c95c190693", >+ "uniform type:src/common/gen_uniform_type_table.py": >+ "fa40444d496ac07cd9dc0cd239e4a499", >+ "uniform type:src/common/uniform_type_info_autogen.cpp": >+ "b31d181bc49ad1c3540401a5c874e692" >+} >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/trigger.bat b/Source/ThirdParty/ANGLE/scripts/trigger.bat >new file mode 100644 >index 00000000000..a2d00d65939 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/trigger.bat >@@ -0,0 +1 @@ >+@python %~dp0\trigger.py %* >diff --git a/Source/ThirdParty/ANGLE/scripts/trigger.py b/Source/ThirdParty/ANGLE/scripts/trigger.py >new file mode 100644 >index 00000000000..f8421ef564f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/trigger.py >@@ -0,0 +1,71 @@ >+#!/usr/bin/python2 >+# >+# 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. >+# >+# trigger.py: >+# Helper script for triggering GPU tests on swarming. >+ >+import argparse >+import os >+import subprocess >+import sys >+ >+ >+def parse_args(): >+ parser = argparse.ArgumentParser(os.path.basename(sys.argv[0])) >+ parser.add_argument('gn_path', help='path to GN. (e.g. out/Release)') >+ parser.add_argument('test', help='test name. (e.g. angle_end2end_tests)') >+ parser.add_argument('os_dim', help='OS dimension. (e.g. Windows-10)') >+ parser.add_argument('gpu_dim', help='GPU dimension. (e.g. intel-hd-630-win10-stable)') >+ parser.add_argument('-s', '--shards', default=1, help='number of shards', type=int) >+ parser.add_argument('-p', '--pool', default='Chrome-GPU', help='swarming pool') >+ parser.add_argument('extra_args', help='extra test command line arguments', nargs='*') >+ return parser.parse_args() >+ >+ >+def main(): >+ args = parse_args() >+ path = args.gn_path.replace('\\', '/') >+ out_gn_path = '//' + path >+ out_file_path = os.path.join(*path.split('/')) >+ >+ mb_script_path = os.path.join('tools', 'mb', 'mb.py') >+ subprocess.call(['python', mb_script_path, 'isolate', out_gn_path, args.test]) >+ >+ isolate_script_path = os.path.join('tools', 'swarming_client', 'isolate.py') >+ isolate_file = os.path.join(out_file_path, '%s.isolate' % args.test) >+ isolated_file = os.path.join(out_file_path, '%s.isolated' % args.test) >+ >+ isolate_args = [ >+ 'python', isolate_script_path, 'archive', >+ '-I', 'https://isolateserver.appspot.com', >+ '-i', isolate_file, >+ '-s', isolated_file] >+ stdout = subprocess.check_output(isolate_args) >+ sha = stdout[:40] >+ >+ print('Got an isolated SHA of %s' % sha) >+ swarming_script_path = os.path.join('tools', 'swarming_client', 'swarming.py') >+ >+ swarmings_args = [ >+ 'python', swarming_script_path, 'trigger', >+ '-S', 'chromium-swarm.appspot.com', >+ '-I', 'isolateserver.appspot.com', >+ '-d', 'os', args.os_dim, >+ '-d', 'pool', args.pool, >+ '-d', 'gpu', args.gpu_dim, >+ '--shards=%d' % args.shards, >+ '-s', sha] >+ >+ if args.extra_args: >+ swarmings_args += ['--'] + args.extra_args >+ >+ print(' '.join(swarmings_args)) >+ subprocess.call(swarmings_args) >+ return 0 >+ >+ >+if __name__ == '__main__': >+ sys.exit(main()) >diff --git a/Source/ThirdParty/ANGLE/scripts/update_canary_angle.py b/Source/ThirdParty/ANGLE/scripts/update_canary_angle.py >new file mode 100644 >index 00000000000..56897d57cc8 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/update_canary_angle.py >@@ -0,0 +1,61 @@ >+#!/usr/bin/python2 >+# >+# Copyright 2016 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. >+# >+# update_canary_angle.py: >+# Helper script that copies Windows ANGLE DLLs into the Canary >+# application directory. Much faster than compiling Chrome from >+# source. The script checks for the most recent DLLs in a set of >+# search paths, and copies that into the most recent Canary >+# binary folder. Only works on Windows. >+ >+import glob, sys, os, shutil >+ >+# Set of search paths. >+script_dir = os.path.dirname(sys.argv[0]) >+os.chdir(os.path.join(script_dir, "..")) >+ >+source_paths = glob.glob('out/*') >+ >+# Default Canary installation path. >+chrome_folder = os.path.join(os.environ['LOCALAPPDATA'], 'Google', 'Chrome SxS', 'Application') >+ >+# Find the most recent ANGLE DLLs >+binary_name = 'libGLESv2.dll' >+newest_folder = None >+newest_mtime = None >+for path in source_paths: >+ binary_path = os.path.join(path, binary_name) >+ if os.path.exists(binary_path): >+ binary_mtime = os.path.getmtime(binary_path) >+ if (newest_folder is None) or (binary_mtime > newest_mtime): >+ newest_folder = path >+ newest_mtime = binary_mtime >+ >+if newest_folder is None: >+ sys.exit("Could not find ANGLE DLLs!") >+ >+source_folder = newest_folder >+ >+# Is a folder a chrome binary directory? >+def is_chrome_bin(str): >+ chrome_file = os.path.join(chrome_folder, str) >+ return os.path.isdir(chrome_file) and all([char.isdigit() or char == '.' for char in str]) >+ >+sorted_chrome_bins = sorted([folder for folder in os.listdir(chrome_folder) if is_chrome_bin(folder)], reverse=True) >+ >+dest_folder = os.path.join(chrome_folder, sorted_chrome_bins[0]) >+ >+print('Copying DLLs from ' + source_folder + ' to ' + dest_folder + '.') >+ >+for dll in ['libGLESv2.dll', 'libEGL.dll']: >+ src = os.path.join(source_folder, dll) >+ if os.path.exists(src): >+ # Make a backup of the original unmodified DLLs if they are present. >+ backup = os.path.join(source_folder, dll + '.backup') >+ if not os.path.exists(backup): >+ shutil.copyfile(src, backup) >+ shutil.copyfile(src, os.path.join(dest_folder, dll)) >+ shutil.copyfile(src + ".pdb", os.path.join(dest_folder, dll + ".pdb")) >diff --git a/Source/ThirdParty/ANGLE/scripts/vk_mandatory_format_support_capture_to_json.js b/Source/ThirdParty/ANGLE/scripts/vk_mandatory_format_support_capture_to_json.js >new file mode 100644 >index 00000000000..0839f83f693 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/vk_mandatory_format_support_capture_to_json.js >@@ -0,0 +1,77 @@ >+/** >+ * 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 script is meant to be executed agaisnt the vulkan spec 31.3.3 tables. >+ * Instructions: Copy all the tables from the HTML source to a plain document >+ * and add a textarea at the bottom with ID='result'. Execute this JS on load >+ * of the document and you should have a JSON string in the textarea with the >+ * mandatory specs included. If the spec changes format / CSS in any way, the >+ * selectors will need to be modified. >+ **/ >+var indexToFeatureMap = []; >+var index = 12; >+ >+var outputJson = {}; >+ >+// Map all features to indexes of squares. >+$("#features-formats-mandatory-features-subbyte td").each(function() { >+ $this = $(this); >+ $this.find("code").each(function() { >+ if ($(this).text().startsWith("VK_FORMAT_FEATURE")) { >+ indexToFeatureMap[index--] = $(this).text(); >+ } >+ }); >+}); >+ >+var allTableIds = >+ ["features-formats-mandatory-features-subbyte", >+ "features-formats-mandatory-features-2byte", >+ "features-formats-mandatory-features-4byte", >+ "features-formats-mandatory-features-10bit", >+ "features-formats-mandatory-features-16bit", >+ "features-formats-mandatory-features-32bit", >+ "features-formats-mandatory-features-64bit", >+ "features-formats-mandatory-features-depth-stencil", >+ "features-formats-mandatory-features-features-bcn", >+ "features-formats-mandatory-features-features-etc", >+ "features-formats-mandatory-features-features-astc"]; >+ >+for (var i = 0; i < allTableIds.length; i++) { >+ $("#" + allTableIds[i] + " td").each(function() { >+ $this = $(this); >+ >+ $this.find("code").each(function() { >+ if (!$(this).text().startsWith("VK_FORMAT_FEATURE") && >+ $(this).text().startsWith("VK_FORMAT")) { >+ // Found one vkFormat to features line. >+ var vkFormat = $(this).text(); >+ var squareIndex = 0; >+ var features = []; >+ var skipEntry = false; >+ >+ $(this).closest("tr").find("td.halign-center").each(function() { >+ // Find all squares with features. >+ if ($(this).text() === "â") { >+ features.push(indexToFeatureMap[squareIndex]); >+ } >+ if ($(this).text() === "â ") { >+ skipEntry = true; >+ return false; // Break; >+ } >+ squareIndex++; >+ }); >+ if (!skipEntry && >+ (features.length > 0)) { >+ Object.defineProperty(outputJson, vkFormat, { >+ value: features, >+ enumerable: true, >+ readable: true, >+ writable: false >+ }); >+ } >+ } >+ }); >+ }); >+} >+$("#result").text(JSON.stringify(outputJson)); >diff --git a/Source/ThirdParty/ANGLE/scripts/wgl.xml b/Source/ThirdParty/ANGLE/scripts/wgl.xml >new file mode 100644 >index 00000000000..49277ed4649 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/wgl.xml >@@ -0,0 +1,1989 @@ >+<?xml version="1.0" encoding="UTF-8"?> >+<registry> >+ <comment> >+Copyright (c) 2013-2018 The Khronos Group Inc. >+ >+Licensed under the Apache License, Version 2.0 (the "License"); >+you may not use this file except in compliance with the License. >+You may obtain a copy of the License at >+ >+ http://www.apache.org/licenses/LICENSE-2.0 >+ >+Unless required by applicable law or agreed to in writing, software >+distributed under the License is distributed on an "AS IS" BASIS, >+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. >+See the License for the specific language governing permissions and >+limitations under the License. >+ >+------------------------------------------------------------------------ >+ >+This file, wgl.xml, is the WGL API Registry. The older ".spec" file >+format has been retired and will no longer be updated with new >+extensions and API versions. The canonical version of the registry, >+together with documentation, schema, and Python generator scripts used >+to generate C header files for WGL, can always be found in the Khronos >+Registry at >+ https://github.com/KhronosGroup/OpenGL-Registry >+ </comment> >+ >+ <!-- SECTION: WGL type definitions. Does not include base Windows types. --> >+ >+ <types> >+ <!-- Dummy placeholders for Windows types --> >+ <type name="BOOL"/> >+ <type name="CHAR"/> >+ <type name="DWORD"/> >+ <type name="FLOAT"/> >+ <type name="GLbitfield"/> >+ <type name="GLboolean"/> >+ <type name="GLenum"/> >+ <type name="GLfloat"/> >+ <type name="GLint"/> >+ <type name="GLsizei"/> >+ <type name="GLuint"/> >+ <type name="GLushort"/> >+ <type name="HANDLE"/> >+ <type name="HDC"/> >+ <type name="HGLRC"/> >+ <type name="INT"/> >+ <type name="INT32"/> >+ <type name="INT64"/> >+ <type name="PROC"/> >+ <type name="RECT"/> >+ <type name="LPCSTR"/> >+ <type name="LPVOID"/> >+ <type name="UINT"/> >+ <type name="USHORT"/> >+ <type name="VOID"/> >+ <!-- Could be filled in from wgltypes.txt --> >+ <type name="COLORREF"/> >+ <type name="HENHMETAFILE"/> >+ <type name="LAYERPLANEDESCRIPTOR"/> >+ <type name="LPGLYPHMETRICSFLOAT"/> >+ <type name="PIXELFORMATDESCRIPTOR"/> >+ <!-- These are dependencies WGL types require to be declared legally --> >+ <!-- Declaring C structures in XML is a pain indentation-wise --> >+ <type>struct <name>_GPU_DEVICE</name> { >+ DWORD cb; >+ CHAR DeviceName[32]; >+ CHAR DeviceString[128]; >+ DWORD Flags; >+ RECT rcVirtualScreen; >+};</type> >+ <!-- These are actual WGL types. Windows types are not included. --> >+ <type>DECLARE_HANDLE(<name>HPBUFFERARB</name>);</type> >+ <type>DECLARE_HANDLE(<name>HPBUFFEREXT</name>);</type> >+ <type>DECLARE_HANDLE(<name>HVIDEOOUTPUTDEVICENV</name>);</type> >+ <type>DECLARE_HANDLE(<name>HPVIDEODEV</name>);</type> >+ <type>DECLARE_HANDLE(<name>HPGPUNV</name>);</type> >+ <type>DECLARE_HANDLE(<name>HGPUNV</name>);</type> >+ <type>DECLARE_HANDLE(<name>HVIDEOINPUTDEVICENV</name>);</type> >+ <type requires="_GPU_DEVICE">typedef struct _GPU_DEVICE <name>GPU_DEVICE</name>;</type> >+ <type requires="_GPU_DEVICE">typedef struct _GPU_DEVICE *<name>PGPU_DEVICE</name>;</type> >+ </types> >+ >+ <!-- SECTION: WGL enumerant (token) definitions. --> >+ >+ <!-- Bitmasks each have their own namespace, although bits are >+ sometimes reused for other purposes --> >+ >+ <enums namespace="WGLLayerPlaneMask" type="bitmask" vendor="MS"> >+ <enum value="0x00000001" name="WGL_SWAP_MAIN_PLANE"/> >+ <enum value="0x00000002" name="WGL_SWAP_OVERLAY1"/> >+ <enum value="0x00000004" name="WGL_SWAP_OVERLAY2"/> >+ <enum value="0x00000008" name="WGL_SWAP_OVERLAY3"/> >+ <enum value="0x00000010" name="WGL_SWAP_OVERLAY4"/> >+ <enum value="0x00000020" name="WGL_SWAP_OVERLAY5"/> >+ <enum value="0x00000040" name="WGL_SWAP_OVERLAY6"/> >+ <enum value="0x00000080" name="WGL_SWAP_OVERLAY7"/> >+ <enum value="0x00000100" name="WGL_SWAP_OVERLAY8"/> >+ <enum value="0x00000200" name="WGL_SWAP_OVERLAY9"/> >+ <enum value="0x00000400" name="WGL_SWAP_OVERLAY10"/> >+ <enum value="0x00000800" name="WGL_SWAP_OVERLAY11"/> >+ <enum value="0x00001000" name="WGL_SWAP_OVERLAY12"/> >+ <enum value="0x00002000" name="WGL_SWAP_OVERLAY13"/> >+ <enum value="0x00004000" name="WGL_SWAP_OVERLAY14"/> >+ <enum value="0x00008000" name="WGL_SWAP_OVERLAY15"/> >+ <enum value="0x00010000" name="WGL_SWAP_UNDERLAY1"/> >+ <enum value="0x00020000" name="WGL_SWAP_UNDERLAY2"/> >+ <enum value="0x00040000" name="WGL_SWAP_UNDERLAY3"/> >+ <enum value="0x00080000" name="WGL_SWAP_UNDERLAY4"/> >+ <enum value="0x00100000" name="WGL_SWAP_UNDERLAY5"/> >+ <enum value="0x00200000" name="WGL_SWAP_UNDERLAY6"/> >+ <enum value="0x00400000" name="WGL_SWAP_UNDERLAY7"/> >+ <enum value="0x00800000" name="WGL_SWAP_UNDERLAY8"/> >+ <enum value="0x01000000" name="WGL_SWAP_UNDERLAY9"/> >+ <enum value="0x02000000" name="WGL_SWAP_UNDERLAY10"/> >+ <enum value="0x04000000" name="WGL_SWAP_UNDERLAY11"/> >+ <enum value="0x08000000" name="WGL_SWAP_UNDERLAY12"/> >+ <enum value="0x10000000" name="WGL_SWAP_UNDERLAY13"/> >+ <enum value="0x20000000" name="WGL_SWAP_UNDERLAY14"/> >+ <enum value="0x40000000" name="WGL_SWAP_UNDERLAY15"/> >+ </enums> >+ >+ <enums namespace="WGLColorBufferMask" type="bitmask" vendor="ARB"> >+ <enum value="0x00000001" name="WGL_FRONT_COLOR_BUFFER_BIT_ARB"/> >+ <enum value="0x00000002" name="WGL_BACK_COLOR_BUFFER_BIT_ARB"/> >+ <enum value="0x00000004" name="WGL_DEPTH_BUFFER_BIT_ARB"/> >+ <enum value="0x00000008" name="WGL_STENCIL_BUFFER_BIT_ARB"/> >+ </enums> >+ >+ <enums namespace="WGLContextFlagsMask" type="bitmask" vendor="ARB"> >+ <enum value="0x00000001" name="WGL_CONTEXT_DEBUG_BIT_ARB"/> >+ <enum value="0x00000002" name="WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB"/> >+ <enum value="0x00000004" name="WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB"/> >+ <enum value="0x00000008" name="WGL_CONTEXT_RESET_ISOLATION_BIT_ARB"/> >+ </enums> >+ >+ <enums namespace="WGLContextProfileMask" type="bitmask" vendor="ARB"> >+ <enum value="0x00000001" name="WGL_CONTEXT_CORE_PROFILE_BIT_ARB"/> >+ <enum value="0x00000002" name="WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB"/> >+ <enum value="0x00000004" name="WGL_CONTEXT_ES_PROFILE_BIT_EXT"/> >+ <enum value="0x00000004" name="WGL_CONTEXT_ES2_PROFILE_BIT_EXT" alias="WGL_CONTEXT_ES_PROFILE_BIT_EXT"/> >+ </enums> >+ >+ <enums namespace="WGLImageBufferMaskI3D" type="bitmask" vendor="I3D"> >+ <enum value="0x00000001" name="WGL_IMAGE_BUFFER_MIN_ACCESS_I3D"/> >+ <enum value="0x00000002" name="WGL_IMAGE_BUFFER_LOCK_I3D"/> >+ </enums> >+ >+ <enums namespace="WGLDXInteropMaskNV" type="bitmask" vendor="NV"> >+ <enum value="0x00000000" name="WGL_ACCESS_READ_ONLY_NV"/> >+ <enum value="0x00000001" name="WGL_ACCESS_READ_WRITE_NV"/> >+ <enum value="0x00000002" name="WGL_ACCESS_WRITE_DISCARD_NV"/> >+ </enums> >+ >+ <!-- The default ("API") enum namespace starts here. While some >+ assigned values may overlap, and different parts of the >+ namespace are reserved for different purposes, it is a single >+ namespace. The "class" attribute indicates some of the reserved >+ purposes but is by no means complete (and cannot be, since many >+ tokens are reused for different purposes in different >+ extensions and API versions). --> >+ >+ <enums namespace="WGL" group="SpecialNumbers" vendor="MS"> >+ <enum value="0" name="WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB"/> >+ <enum value="0" name="WGL_FONT_LINES"/> >+ <enum value="1" name="WGL_FONT_POLYGONS"/> >+ </enums> >+ >+ <enums namespace="WGL" start="0x1F00" end="0x1F02" vendor="ARB" comment="Unclear why AMD used values in this range"> >+ <enum value="0x1F00" name="WGL_GPU_VENDOR_AMD"/> >+ <enum value="0x1F01" name="WGL_GPU_RENDERER_STRING_AMD"/> >+ <enum value="0x1F02" name="WGL_GPU_OPENGL_VERSION_STRING_AMD"/> >+ </enums> >+ >+ <enums namespace="WGL" start="0x2000" end="0x203F" vendor="ARB"> >+ <enum value="0x2000" name="WGL_NUMBER_PIXEL_FORMATS_ARB"/> >+ <enum value="0x2000" name="WGL_NUMBER_PIXEL_FORMATS_EXT"/> >+ <enum value="0x2001" name="WGL_DRAW_TO_WINDOW_ARB"/> >+ <enum value="0x2001" name="WGL_DRAW_TO_WINDOW_EXT"/> >+ <enum value="0x2002" name="WGL_DRAW_TO_BITMAP_ARB"/> >+ <enum value="0x2002" name="WGL_DRAW_TO_BITMAP_EXT"/> >+ <enum value="0x2003" name="WGL_ACCELERATION_ARB"/> >+ <enum value="0x2003" name="WGL_ACCELERATION_EXT"/> >+ <enum value="0x2004" name="WGL_NEED_PALETTE_ARB"/> >+ <enum value="0x2004" name="WGL_NEED_PALETTE_EXT"/> >+ <enum value="0x2005" name="WGL_NEED_SYSTEM_PALETTE_ARB"/> >+ <enum value="0x2005" name="WGL_NEED_SYSTEM_PALETTE_EXT"/> >+ <enum value="0x2006" name="WGL_SWAP_LAYER_BUFFERS_ARB"/> >+ <enum value="0x2006" name="WGL_SWAP_LAYER_BUFFERS_EXT"/> >+ <enum value="0x2007" name="WGL_SWAP_METHOD_ARB"/> >+ <enum value="0x2007" name="WGL_SWAP_METHOD_EXT"/> >+ <enum value="0x2008" name="WGL_NUMBER_OVERLAYS_ARB"/> >+ <enum value="0x2008" name="WGL_NUMBER_OVERLAYS_EXT"/> >+ <enum value="0x2009" name="WGL_NUMBER_UNDERLAYS_ARB"/> >+ <enum value="0x2009" name="WGL_NUMBER_UNDERLAYS_EXT"/> >+ <enum value="0x200A" name="WGL_TRANSPARENT_ARB"/> >+ <enum value="0x200A" name="WGL_TRANSPARENT_EXT"/> >+ <enum value="0x200B" name="WGL_TRANSPARENT_VALUE_EXT"/> >+ <enum value="0x200C" name="WGL_SHARE_DEPTH_ARB"/> >+ <enum value="0x200C" name="WGL_SHARE_DEPTH_EXT"/> >+ <enum value="0x200D" name="WGL_SHARE_STENCIL_ARB"/> >+ <enum value="0x200D" name="WGL_SHARE_STENCIL_EXT"/> >+ <enum value="0x200E" name="WGL_SHARE_ACCUM_ARB"/> >+ <enum value="0x200E" name="WGL_SHARE_ACCUM_EXT"/> >+ <enum value="0x200F" name="WGL_SUPPORT_GDI_ARB"/> >+ <enum value="0x200F" name="WGL_SUPPORT_GDI_EXT"/> >+ <enum value="0x2010" name="WGL_SUPPORT_OPENGL_ARB"/> >+ <enum value="0x2010" name="WGL_SUPPORT_OPENGL_EXT"/> >+ <enum value="0x2011" name="WGL_DOUBLE_BUFFER_ARB"/> >+ <enum value="0x2011" name="WGL_DOUBLE_BUFFER_EXT"/> >+ <enum value="0x2012" name="WGL_STEREO_ARB"/> >+ <enum value="0x2012" name="WGL_STEREO_EXT"/> >+ <enum value="0x2013" name="WGL_PIXEL_TYPE_ARB"/> >+ <enum value="0x2013" name="WGL_PIXEL_TYPE_EXT"/> >+ <enum value="0x2014" name="WGL_COLOR_BITS_ARB"/> >+ <enum value="0x2014" name="WGL_COLOR_BITS_EXT"/> >+ <enum value="0x2015" name="WGL_RED_BITS_ARB"/> >+ <enum value="0x2015" name="WGL_RED_BITS_EXT"/> >+ <enum value="0x2016" name="WGL_RED_SHIFT_ARB"/> >+ <enum value="0x2016" name="WGL_RED_SHIFT_EXT"/> >+ <enum value="0x2017" name="WGL_GREEN_BITS_ARB"/> >+ <enum value="0x2017" name="WGL_GREEN_BITS_EXT"/> >+ <enum value="0x2018" name="WGL_GREEN_SHIFT_ARB"/> >+ <enum value="0x2018" name="WGL_GREEN_SHIFT_EXT"/> >+ <enum value="0x2019" name="WGL_BLUE_BITS_ARB"/> >+ <enum value="0x2019" name="WGL_BLUE_BITS_EXT"/> >+ <enum value="0x201A" name="WGL_BLUE_SHIFT_ARB"/> >+ <enum value="0x201A" name="WGL_BLUE_SHIFT_EXT"/> >+ <enum value="0x201B" name="WGL_ALPHA_BITS_ARB"/> >+ <enum value="0x201B" name="WGL_ALPHA_BITS_EXT"/> >+ <enum value="0x201C" name="WGL_ALPHA_SHIFT_ARB"/> >+ <enum value="0x201C" name="WGL_ALPHA_SHIFT_EXT"/> >+ <enum value="0x201D" name="WGL_ACCUM_BITS_ARB"/> >+ <enum value="0x201D" name="WGL_ACCUM_BITS_EXT"/> >+ <enum value="0x201E" name="WGL_ACCUM_RED_BITS_ARB"/> >+ <enum value="0x201E" name="WGL_ACCUM_RED_BITS_EXT"/> >+ <enum value="0x201F" name="WGL_ACCUM_GREEN_BITS_ARB"/> >+ <enum value="0x201F" name="WGL_ACCUM_GREEN_BITS_EXT"/> >+ <enum value="0x2020" name="WGL_ACCUM_BLUE_BITS_ARB"/> >+ <enum value="0x2020" name="WGL_ACCUM_BLUE_BITS_EXT"/> >+ <enum value="0x2021" name="WGL_ACCUM_ALPHA_BITS_ARB"/> >+ <enum value="0x2021" name="WGL_ACCUM_ALPHA_BITS_EXT"/> >+ <enum value="0x2022" name="WGL_DEPTH_BITS_ARB"/> >+ <enum value="0x2022" name="WGL_DEPTH_BITS_EXT"/> >+ <enum value="0x2023" name="WGL_STENCIL_BITS_ARB"/> >+ <enum value="0x2023" name="WGL_STENCIL_BITS_EXT"/> >+ <enum value="0x2024" name="WGL_AUX_BUFFERS_ARB"/> >+ <enum value="0x2024" name="WGL_AUX_BUFFERS_EXT"/> >+ <enum value="0x2025" name="WGL_NO_ACCELERATION_ARB"/> >+ <enum value="0x2025" name="WGL_NO_ACCELERATION_EXT"/> >+ <enum value="0x2026" name="WGL_GENERIC_ACCELERATION_ARB"/> >+ <enum value="0x2026" name="WGL_GENERIC_ACCELERATION_EXT"/> >+ <enum value="0x2027" name="WGL_FULL_ACCELERATION_ARB"/> >+ <enum value="0x2027" name="WGL_FULL_ACCELERATION_EXT"/> >+ <enum value="0x2028" name="WGL_SWAP_EXCHANGE_ARB"/> >+ <enum value="0x2028" name="WGL_SWAP_EXCHANGE_EXT"/> >+ <enum value="0x2029" name="WGL_SWAP_COPY_ARB"/> >+ <enum value="0x2029" name="WGL_SWAP_COPY_EXT"/> >+ <enum value="0x202A" name="WGL_SWAP_UNDEFINED_ARB"/> >+ <enum value="0x202A" name="WGL_SWAP_UNDEFINED_EXT"/> >+ <enum value="0x202B" name="WGL_TYPE_RGBA_ARB"/> >+ <enum value="0x202B" name="WGL_TYPE_RGBA_EXT"/> >+ <enum value="0x202C" name="WGL_TYPE_COLORINDEX_ARB"/> >+ <enum value="0x202C" name="WGL_TYPE_COLORINDEX_EXT"/> >+ <enum value="0x202D" name="WGL_DRAW_TO_PBUFFER_ARB"/> >+ <enum value="0x202D" name="WGL_DRAW_TO_PBUFFER_EXT"/> >+ <enum value="0x202E" name="WGL_MAX_PBUFFER_PIXELS_ARB"/> >+ <enum value="0x202E" name="WGL_MAX_PBUFFER_PIXELS_EXT"/> >+ <enum value="0x202F" name="WGL_MAX_PBUFFER_WIDTH_ARB"/> >+ <enum value="0x202F" name="WGL_MAX_PBUFFER_WIDTH_EXT"/> >+ <enum value="0x2030" name="WGL_MAX_PBUFFER_HEIGHT_ARB"/> >+ <enum value="0x2030" name="WGL_MAX_PBUFFER_HEIGHT_EXT"/> >+ <enum value="0x2031" name="WGL_OPTIMAL_PBUFFER_WIDTH_EXT"/> >+ <enum value="0x2032" name="WGL_OPTIMAL_PBUFFER_HEIGHT_EXT"/> >+ <enum value="0x2033" name="WGL_PBUFFER_LARGEST_ARB"/> >+ <enum value="0x2033" name="WGL_PBUFFER_LARGEST_EXT"/> >+ <enum value="0x2034" name="WGL_PBUFFER_WIDTH_ARB"/> >+ <enum value="0x2034" name="WGL_PBUFFER_WIDTH_EXT"/> >+ <enum value="0x2035" name="WGL_PBUFFER_HEIGHT_ARB"/> >+ <enum value="0x2035" name="WGL_PBUFFER_HEIGHT_EXT"/> >+ <enum value="0x2036" name="WGL_PBUFFER_LOST_ARB"/> >+ <enum value="0x2037" name="WGL_TRANSPARENT_RED_VALUE_ARB"/> >+ <enum value="0x2038" name="WGL_TRANSPARENT_GREEN_VALUE_ARB"/> >+ <enum value="0x2039" name="WGL_TRANSPARENT_BLUE_VALUE_ARB"/> >+ <enum value="0x203A" name="WGL_TRANSPARENT_ALPHA_VALUE_ARB"/> >+ <enum value="0x203B" name="WGL_TRANSPARENT_INDEX_VALUE_ARB"/> >+ <unused start="0x203C" end="0x203F"/> >+ </enums> >+ >+ <enums namespace="WGL" start="0x2040" end="0x205F" vendor="I3D"> >+ <enum value="0x2040" name="WGL_DEPTH_FLOAT_EXT"/> >+ <enum value="0x2041" name="WGL_SAMPLE_BUFFERS_ARB"/> >+ <enum value="0x2041" name="WGL_SAMPLE_BUFFERS_EXT"/> >+ <enum value="0x2042" name="WGL_COVERAGE_SAMPLES_NV"/> >+ <enum value="0x2042" name="WGL_SAMPLES_ARB"/> >+ <enum value="0x2042" name="WGL_SAMPLES_EXT"/> >+ <enum value="0x2043" name="ERROR_INVALID_PIXEL_TYPE_ARB"/> >+ <enum value="0x2043" name="ERROR_INVALID_PIXEL_TYPE_EXT"/> >+ <enum value="0x2044" name="WGL_GENLOCK_SOURCE_MULTIVIEW_I3D"/> >+ <enum value="0x2045" name="WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D"/> >+ <enum value="0x2046" name="WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D"/> >+ <enum value="0x2047" name="WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D"/> >+ <enum value="0x2048" name="WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D"/> >+ <enum value="0x2049" name="WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D"/> >+ <enum value="0x204A" name="WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D"/> >+ <enum value="0x204B" name="WGL_GENLOCK_SOURCE_EDGE_RISING_I3D"/> >+ <enum value="0x204C" name="WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D"/> >+ <unused start="0x204D"/> >+ <enum value="0x204E" name="WGL_GAMMA_TABLE_SIZE_I3D"/> >+ <enum value="0x204F" name="WGL_GAMMA_EXCLUDE_DESKTOP_I3D"/> >+ <enum value="0x2050" name="WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D"/> >+ <enum value="0x2051" name="WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D"/> >+ <enum value="0x2052" name="WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D"/> >+ <enum value="0x2053" name="WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D"/> >+ <enum value="0x2054" name="ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB"/> >+ <enum value="0x2055" name="WGL_STEREO_EMITTER_ENABLE_3DL"/> >+ <enum value="0x2056" name="WGL_STEREO_EMITTER_DISABLE_3DL"/> >+ <enum value="0x2057" name="WGL_STEREO_POLARITY_NORMAL_3DL"/> >+ <enum value="0x2058" name="WGL_STEREO_POLARITY_INVERT_3DL"/> >+ <unused start="0x2059" end="0x205F"/> >+ </enums> >+ >+ <enums namespace="WGL" start="0x2060" end="0x206F" vendor="3DFX"> >+ <unused start="0x2060" end="0x206F" comment="Could be reclaimed"/> >+ </enums> >+ >+ <enums namespace="WGL" start="0x2070" end="0x209F" vendor="ARB" comment="Shared with GLX; synchronize create_context enums"> >+ <enum value="0x2060" name="WGL_SAMPLE_BUFFERS_3DFX"/> >+ <enum value="0x2061" name="WGL_SAMPLES_3DFX"/> >+ <enum value="0x2070" name="WGL_BIND_TO_TEXTURE_RGB_ARB"/> >+ <enum value="0x2071" name="WGL_BIND_TO_TEXTURE_RGBA_ARB"/> >+ <enum value="0x2072" name="WGL_TEXTURE_FORMAT_ARB"/> >+ <enum value="0x2073" name="WGL_TEXTURE_TARGET_ARB"/> >+ <enum value="0x2074" name="WGL_MIPMAP_TEXTURE_ARB"/> >+ <enum value="0x2075" name="WGL_TEXTURE_RGB_ARB"/> >+ <enum value="0x2076" name="WGL_TEXTURE_RGBA_ARB"/> >+ <enum value="0x2077" name="WGL_NO_TEXTURE_ARB"/> >+ <enum value="0x2078" name="WGL_TEXTURE_CUBE_MAP_ARB"/> >+ <enum value="0x2079" name="WGL_TEXTURE_1D_ARB"/> >+ <enum value="0x207A" name="WGL_TEXTURE_2D_ARB"/> >+ <enum value="0x207B" name="WGL_MIPMAP_LEVEL_ARB"/> >+ <enum value="0x207C" name="WGL_CUBE_MAP_FACE_ARB"/> >+ <enum value="0x207D" name="WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB"/> >+ <enum value="0x207E" name="WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB"/> >+ <enum value="0x207F" name="WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB"/> >+ <enum value="0x2080" name="WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB"/> >+ <enum value="0x2081" name="WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB"/> >+ <enum value="0x2082" name="WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB"/> >+ <enum value="0x2083" name="WGL_FRONT_LEFT_ARB"/> >+ <enum value="0x2084" name="WGL_FRONT_RIGHT_ARB"/> >+ <enum value="0x2085" name="WGL_BACK_LEFT_ARB"/> >+ <enum value="0x2086" name="WGL_BACK_RIGHT_ARB"/> >+ <enum value="0x2087" name="WGL_AUX0_ARB"/> >+ <enum value="0x2088" name="WGL_AUX1_ARB"/> >+ <enum value="0x2089" name="WGL_AUX2_ARB"/> >+ <enum value="0x208A" name="WGL_AUX3_ARB"/> >+ <enum value="0x208B" name="WGL_AUX4_ARB"/> >+ <enum value="0x208C" name="WGL_AUX5_ARB"/> >+ <enum value="0x208D" name="WGL_AUX6_ARB"/> >+ <enum value="0x208E" name="WGL_AUX7_ARB"/> >+ <enum value="0x208F" name="WGL_AUX8_ARB"/> >+ <enum value="0x2090" name="WGL_AUX9_ARB"/> >+ <enum value="0x2091" name="WGL_CONTEXT_MAJOR_VERSION_ARB"/> >+ <enum value="0x2092" name="WGL_CONTEXT_MINOR_VERSION_ARB"/> >+ <enum value="0x2093" name="WGL_CONTEXT_LAYER_PLANE_ARB"/> >+ <enum value="0x2094" name="WGL_CONTEXT_FLAGS_ARB"/> >+ <enum value="0x2095" name="ERROR_INVALID_VERSION_ARB"/> >+ <enum value="0x2096" name="ERROR_INVALID_PROFILE_ARB"/> >+ <enum value="0x2097" name="WGL_CONTEXT_RELEASE_BEHAVIOR_ARB"/> >+ <enum value="0x2098" name="WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB"/> >+ <unused start="0x2099" end="0x209F"/> >+ </enums> >+ >+ <enums namespace="WGL" start="0x20A0" end="0x219F" vendor="NV" comment="shared with GLX"> >+ <enum value="0x20A0" name="WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV"/> >+ <enum value="0x20A1" name="WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV"/> >+ <enum value="0x20A2" name="WGL_TEXTURE_RECTANGLE_NV"/> >+ <enum value="0x20A3" name="WGL_BIND_TO_TEXTURE_DEPTH_NV"/> >+ <enum value="0x20A4" name="WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV"/> >+ <enum value="0x20A5" name="WGL_DEPTH_TEXTURE_FORMAT_NV"/> >+ <enum value="0x20A6" name="WGL_TEXTURE_DEPTH_COMPONENT_NV"/> >+ <enum value="0x20A7" name="WGL_DEPTH_COMPONENT_NV"/> >+ <enum value="0x20A8" name="WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT"/> >+ <enum value="0x20A9" name="WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB"/> >+ <enum value="0x20A9" name="WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT"/> >+ <unused start="0x20AA" end="0x20AF"/> >+ <enum value="0x20B0" name="WGL_FLOAT_COMPONENTS_NV"/> >+ <enum value="0x20B1" name="WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV"/> >+ <enum value="0x20B2" name="WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV"/> >+ <enum value="0x20B3" name="WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV"/> >+ <enum value="0x20B4" name="WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV"/> >+ <enum value="0x20B5" name="WGL_TEXTURE_FLOAT_R_NV"/> >+ <enum value="0x20B6" name="WGL_TEXTURE_FLOAT_RG_NV"/> >+ <enum value="0x20B7" name="WGL_TEXTURE_FLOAT_RGB_NV"/> >+ <enum value="0x20B8" name="WGL_TEXTURE_FLOAT_RGBA_NV"/> >+ <enum value="0x20B9" name="WGL_COLOR_SAMPLES_NV"/> >+ <unused start="0x20BA" end="0x20BF"/> >+ <enum value="0x20C0" name="WGL_BIND_TO_VIDEO_RGB_NV"/> >+ <enum value="0x20C1" name="WGL_BIND_TO_VIDEO_RGBA_NV"/> >+ <enum value="0x20C2" name="WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV"/> >+ <enum value="0x20C3" name="WGL_VIDEO_OUT_COLOR_NV"/> >+ <enum value="0x20C4" name="WGL_VIDEO_OUT_ALPHA_NV"/> >+ <enum value="0x20C5" name="WGL_VIDEO_OUT_DEPTH_NV"/> >+ <enum value="0x20C6" name="WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV"/> >+ <enum value="0x20C7" name="WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV"/> >+ <enum value="0x20C8" name="WGL_VIDEO_OUT_FRAME"/> >+ <enum value="0x20C9" name="WGL_VIDEO_OUT_FIELD_1"/> >+ <enum value="0x20CA" name="WGL_VIDEO_OUT_FIELD_2"/> >+ <enum value="0x20CB" name="WGL_VIDEO_OUT_STACKED_FIELDS_1_2"/> >+ <enum value="0x20CC" name="WGL_VIDEO_OUT_STACKED_FIELDS_2_1"/> >+ <unused start="0x20CD" comment="reserved for GLX_DEVICE_ID_NV (not present in WGL interface)"/> >+ <enum value="0x20CE" name="WGL_UNIQUE_ID_NV"/> >+ <enum value="0x20CF" name="WGL_NUM_VIDEO_CAPTURE_SLOTS_NV"/> >+ <enum value="0x20D0" name="ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV"/> >+ <enum value="0x20D1" name="ERROR_MISSING_AFFINITY_MASK_NV"/> >+ <unused start="0x20D2" end="0x20EF"/> >+ <enum value="0x20F0" name="WGL_NUM_VIDEO_SLOTS_NV"/> >+ <unused start="0x20F1" end="0x219F"/> >+ </enums> >+ >+ <enums namespace="WGL" start="0x21A0" end="0x21AF" vendor="AMD"> >+ <enum value="0x21A0" name="WGL_TYPE_RGBA_FLOAT_ARB"/> >+ <enum value="0x21A0" name="WGL_TYPE_RGBA_FLOAT_ATI"/> >+ <unused start="0x21A1"/> >+ <enum value="0x21A2" name="WGL_GPU_FASTEST_TARGET_GPUS_AMD"/> >+ <enum value="0x21A3" name="WGL_GPU_RAM_AMD"/> >+ <enum value="0x21A4" name="WGL_GPU_CLOCK_AMD"/> >+ <enum value="0x21A5" name="WGL_GPU_NUM_PIPES_AMD"/> >+ <enum value="0x21A5" name="WGL_TEXTURE_RECTANGLE_ATI" comment="Duplicates unrelated WGL_GPU_NUM_PIPES_AMD"/> >+ <enum value="0x21A6" name="WGL_GPU_NUM_SIMD_AMD"/> >+ <enum value="0x21A7" name="WGL_GPU_NUM_RB_AMD"/> >+ <enum value="0x21A8" name="WGL_GPU_NUM_SPI_AMD"/> >+ <unused start="0x21A9" end="0x21AF"/> >+ </enums> >+ >+ <enums namespace="WGL" start="0x21B0" end="0x21BF" vendor="Matrox" comment="could be reclaimed (tentative, RFC sent to ARB 2002/10/3)"> >+ <unused start="0x21B0" end="0x21BF"/> >+ </enums> >+ >+<!-- Please remember that new enumerant allocations must be obtained by >+ request to the Khronos API registrar (see comments at the top of this >+ file) File requests in the Khronos Bugzilla, OpenGL project, Registry >+ component. Also note that some GLX enum values are shared with GL and >+ WGL, and new ranges should be allocated with such overlaps in mind. --> >+ >+<!-- Reservable for future use: 0x21C0-0x2FFF. >+ To generate a new range, allocate multiples of 16 starting at the >+ lowest available point in this block. --> >+ <enums namespace="WGL" start="0x21C0" end="0x2FFF" vendor="ARB"> >+ <unused start="0x21C0" end="0x2FFF" comment="Reserved for future use"/> >+ </enums> >+ >+ <enums namespace="EGL" start="0x3080" end="0x30AF" vendor="KHR" comment="Values shared with EGL. Do not allocate additional values in this range."> >+ <enum value="0x309D" name="WGL_COLORSPACE_EXT"/> >+ <enum value="0x3089" name="WGL_COLORSPACE_SRGB_EXT"/> >+ <enum value="0x308A" name="WGL_COLORSPACE_LINEAR_EXT"/> >+ </enums> >+ >+ <enums namespace="WGL" start="0x31B3" end="0x31B3" vendor="ARB" comment="Shared with GLX."> >+ <enum value="0x31B3" name="WGL_CONTEXT_OPENGL_NO_ERROR_ARB"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x8250" end="0x826F" vendor="ARB" comment="Values shared with GL. Do not allocate additional values in this range."> >+ <enum value="0x8252" name="WGL_LOSE_CONTEXT_ON_RESET_ARB"/> >+ <enum value="0x8256" name="WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB"/> >+ <enum value="0x8261" name="WGL_NO_RESET_NOTIFICATION_ARB"/> >+ </enums> >+ >+ <enums namespace="GL" start="0x9120" end="0x912F" vendor="ARB" comment="Values shared with GL. Do not allocate additional values in this range."> >+ <enum value="0x9126" name="WGL_CONTEXT_PROFILE_MASK_ARB"/> >+ </enums> >+ >+ <!-- SECTION: WGL command definitions. --> >+ <commands namespace="WGL"> >+ <command> >+ <proto>int <name>ChoosePixelFormat</name></proto> >+ <param><ptype>HDC</ptype> <name>hDc</name></param> >+ <param>const <ptype>PIXELFORMATDESCRIPTOR</ptype> *<name>pPfd</name></param> >+ </command> >+ <command> >+ <proto>int <name>DescribePixelFormat</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param>int <name>ipfd</name></param> >+ <param><ptype>UINT</ptype> <name>cjpfd</name></param> >+ <param>const <ptype>PIXELFORMATDESCRIPTOR</ptype> *<name>ppfd</name></param> >+ </command> >+ <command> >+ <proto>int <name>GetPixelFormat</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>SetPixelFormat</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param>int <name>ipfd</name></param> >+ <param>const <ptype>PIXELFORMATDESCRIPTOR</ptype> *<name>ppfd</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>SwapBuffers</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ </command> >+ <command> >+ <proto>void *<name>wglAllocateMemoryNV</name></proto> >+ <param><ptype>GLsizei</ptype> <name>size</name></param> >+ <param><ptype>GLfloat</ptype> <name>readfreq</name></param> >+ <param><ptype>GLfloat</ptype> <name>writefreq</name></param> >+ <param><ptype>GLfloat</ptype> <name>priority</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglAssociateImageBufferEventsI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param>const <ptype>HANDLE</ptype> *<name>pEvent</name></param> >+ <param>const <ptype>LPVOID</ptype> *<name>pAddress</name></param> >+ <param>const <ptype>DWORD</ptype> *<name>pSize</name></param> >+ <param><ptype>UINT</ptype> <name>count</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglBeginFrameTrackingI3D</name></proto> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>wglBindDisplayColorTableEXT</name></proto> >+ <param><ptype>GLushort</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglBindSwapBarrierNV</name></proto> >+ <param><ptype>GLuint</ptype> <name>group</name></param> >+ <param><ptype>GLuint</ptype> <name>barrier</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglBindTexImageARB</name></proto> >+ <param><ptype>HPBUFFERARB</ptype> <name>hPbuffer</name></param> >+ <param>int <name>iBuffer</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglBindVideoCaptureDeviceNV</name></proto> >+ <param><ptype>UINT</ptype> <name>uVideoSlot</name></param> >+ <param><ptype>HVIDEOINPUTDEVICENV</ptype> <name>hDevice</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglBindVideoDeviceNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param>unsigned int <name>uVideoSlot</name></param> >+ <param><ptype>HVIDEOOUTPUTDEVICENV</ptype> <name>hVideoDevice</name></param> >+ <param>const int *<name>piAttribList</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglBindVideoImageNV</name></proto> >+ <param><ptype>HPVIDEODEV</ptype> <name>hVideoDevice</name></param> >+ <param><ptype>HPBUFFERARB</ptype> <name>hPbuffer</name></param> >+ <param>int <name>iVideoBuffer</name></param> >+ </command> >+ <command> >+ <proto><ptype>VOID</ptype> <name>wglBlitContextFramebufferAMD</name></proto> >+ <param><ptype>HGLRC</ptype> <name>dstCtx</name></param> >+ <param><ptype>GLint</ptype> <name>srcX0</name></param> >+ <param><ptype>GLint</ptype> <name>srcY0</name></param> >+ <param><ptype>GLint</ptype> <name>srcX1</name></param> >+ <param><ptype>GLint</ptype> <name>srcY1</name></param> >+ <param><ptype>GLint</ptype> <name>dstX0</name></param> >+ <param><ptype>GLint</ptype> <name>dstY0</name></param> >+ <param><ptype>GLint</ptype> <name>dstX1</name></param> >+ <param><ptype>GLint</ptype> <name>dstY1</name></param> >+ <param><ptype>GLbitfield</ptype> <name>mask</name></param> >+ <param><ptype>GLenum</ptype> <name>filter</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglChoosePixelFormatARB</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param>const int *<name>piAttribIList</name></param> >+ <param>const <ptype>FLOAT</ptype> *<name>pfAttribFList</name></param> >+ <param><ptype>UINT</ptype> <name>nMaxFormats</name></param> >+ <param>int *<name>piFormats</name></param> >+ <param><ptype>UINT</ptype> *<name>nNumFormats</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglChoosePixelFormatEXT</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param>const int *<name>piAttribIList</name></param> >+ <param>const <ptype>FLOAT</ptype> *<name>pfAttribFList</name></param> >+ <param><ptype>UINT</ptype> <name>nMaxFormats</name></param> >+ <param>int *<name>piFormats</name></param> >+ <param><ptype>UINT</ptype> *<name>nNumFormats</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglCopyContext</name></proto> >+ <param><ptype>HGLRC</ptype> <name>hglrcSrc</name></param> >+ <param><ptype>HGLRC</ptype> <name>hglrcDst</name></param> >+ <param><ptype>UINT</ptype> <name>mask</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglCopyImageSubDataNV</name></proto> >+ <param><ptype>HGLRC</ptype> <name>hSrcRC</name></param> >+ <param><ptype>GLuint</ptype> <name>srcName</name></param> >+ <param><ptype>GLenum</ptype> <name>srcTarget</name></param> >+ <param><ptype>GLint</ptype> <name>srcLevel</name></param> >+ <param><ptype>GLint</ptype> <name>srcX</name></param> >+ <param><ptype>GLint</ptype> <name>srcY</name></param> >+ <param><ptype>GLint</ptype> <name>srcZ</name></param> >+ <param><ptype>HGLRC</ptype> <name>hDstRC</name></param> >+ <param><ptype>GLuint</ptype> <name>dstName</name></param> >+ <param><ptype>GLenum</ptype> <name>dstTarget</name></param> >+ <param><ptype>GLint</ptype> <name>dstLevel</name></param> >+ <param><ptype>GLint</ptype> <name>dstX</name></param> >+ <param><ptype>GLint</ptype> <name>dstY</name></param> >+ <param><ptype>GLint</ptype> <name>dstZ</name></param> >+ <param><ptype>GLsizei</ptype> <name>width</name></param> >+ <param><ptype>GLsizei</ptype> <name>height</name></param> >+ <param><ptype>GLsizei</ptype> <name>depth</name></param> >+ </command> >+ <command> >+ <proto><ptype>HDC</ptype> <name>wglCreateAffinityDCNV</name></proto> >+ <param>const <ptype>HGPUNV</ptype> *<name>phGpuList</name></param> >+ </command> >+ <command> >+ <proto><ptype>HGLRC</ptype> <name>wglCreateAssociatedContextAMD</name></proto> >+ <param><ptype>UINT</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto><ptype>HGLRC</ptype> <name>wglCreateAssociatedContextAttribsAMD</name></proto> >+ <param><ptype>UINT</ptype> <name>id</name></param> >+ <param><ptype>HGLRC</ptype> <name>hShareContext</name></param> >+ <param>const int *<name>attribList</name></param> >+ </command> >+ <command> >+ <proto><ptype>HANDLE</ptype> <name>wglCreateBufferRegionARB</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param>int <name>iLayerPlane</name></param> >+ <param><ptype>UINT</ptype> <name>uType</name></param> >+ </command> >+ <command> >+ <proto><ptype>HGLRC</ptype> <name>wglCreateContext</name></proto> >+ <param><ptype>HDC</ptype> <name>hDc</name></param> >+ </command> >+ <command> >+ <proto><ptype>HGLRC</ptype> <name>wglCreateContextAttribsARB</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>HGLRC</ptype> <name>hShareContext</name></param> >+ <param>const int *<name>attribList</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>wglCreateDisplayColorTableEXT</name></proto> >+ <param><ptype>GLushort</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto><ptype>LPVOID</ptype> <name>wglCreateImageBufferI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>DWORD</ptype> <name>dwSize</name></param> >+ <param><ptype>UINT</ptype> <name>uFlags</name></param> >+ </command> >+ <command> >+ <proto><ptype>HGLRC</ptype> <name>wglCreateLayerContext</name></proto> >+ <param><ptype>HDC</ptype> <name>hDc</name></param> >+ <param>int <name>level</name></param> >+ </command> >+ <command> >+ <proto><ptype>HPBUFFERARB</ptype> <name>wglCreatePbufferARB</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param>int <name>iPixelFormat</name></param> >+ <param>int <name>iWidth</name></param> >+ <param>int <name>iHeight</name></param> >+ <param>const int *<name>piAttribList</name></param> >+ </command> >+ <command> >+ <proto><ptype>HPBUFFEREXT</ptype> <name>wglCreatePbufferEXT</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param>int <name>iPixelFormat</name></param> >+ <param>int <name>iWidth</name></param> >+ <param>int <name>iHeight</name></param> >+ <param>const int *<name>piAttribList</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDelayBeforeSwapNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>GLfloat</ptype> <name>seconds</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDeleteAssociatedContextAMD</name></proto> >+ <param><ptype>HGLRC</ptype> <name>hglrc</name></param> >+ </command> >+ <command> >+ <proto><ptype>VOID</ptype> <name>wglDeleteBufferRegionARB</name></proto> >+ <param><ptype>HANDLE</ptype> <name>hRegion</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDeleteContext</name></proto> >+ <param><ptype>HGLRC</ptype> <name>oldContext</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDeleteDCNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDescribeLayerPlane</name></proto> >+ <param><ptype>HDC</ptype> <name>hDc</name></param> >+ <param>int <name>pixelFormat</name></param> >+ <param>int <name>layerPlane</name></param> >+ <param><ptype>UINT</ptype> <name>nBytes</name></param> >+ <param>const <ptype>LAYERPLANEDESCRIPTOR</ptype> *<name>plpd</name></param> >+ </command> >+ <command> >+ <proto><ptype>VOID</ptype> <name>wglDestroyDisplayColorTableEXT</name></proto> >+ <param><ptype>GLushort</ptype> <name>id</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDestroyImageBufferI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>LPVOID</ptype> <name>pAddress</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDestroyPbufferARB</name></proto> >+ <param><ptype>HPBUFFERARB</ptype> <name>hPbuffer</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDestroyPbufferEXT</name></proto> >+ <param><ptype>HPBUFFEREXT</ptype> <name>hPbuffer</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDisableFrameLockI3D</name></proto> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDisableGenlockI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDXCloseDeviceNV</name></proto> >+ <param><ptype>HANDLE</ptype> <name>hDevice</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDXLockObjectsNV</name></proto> >+ <param><ptype>HANDLE</ptype> <name>hDevice</name></param> >+ <param><ptype>GLint</ptype> <name>count</name></param> >+ <param><ptype>HANDLE</ptype> *<name>hObjects</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDXObjectAccessNV</name></proto> >+ <param><ptype>HANDLE</ptype> <name>hObject</name></param> >+ <param><ptype>GLenum</ptype> <name>access</name></param> >+ </command> >+ <command> >+ <proto><ptype>HANDLE</ptype> <name>wglDXOpenDeviceNV</name></proto> >+ <param>void *<name>dxDevice</name></param> >+ </command> >+ <command> >+ <proto><ptype>HANDLE</ptype> <name>wglDXRegisterObjectNV</name></proto> >+ <param><ptype>HANDLE</ptype> <name>hDevice</name></param> >+ <param>void *<name>dxObject</name></param> >+ <param><ptype>GLuint</ptype> <name>name</name></param> >+ <param><ptype>GLenum</ptype> <name>type</name></param> >+ <param><ptype>GLenum</ptype> <name>access</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDXSetResourceShareHandleNV</name></proto> >+ <param>void *<name>dxObject</name></param> >+ <param><ptype>HANDLE</ptype> <name>shareHandle</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDXUnlockObjectsNV</name></proto> >+ <param><ptype>HANDLE</ptype> <name>hDevice</name></param> >+ <param><ptype>GLint</ptype> <name>count</name></param> >+ <param><ptype>HANDLE</ptype> *<name>hObjects</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglDXUnregisterObjectNV</name></proto> >+ <param><ptype>HANDLE</ptype> <name>hDevice</name></param> >+ <param><ptype>HANDLE</ptype> <name>hObject</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglEnableFrameLockI3D</name></proto> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglEnableGenlockI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglEndFrameTrackingI3D</name></proto> >+ </command> >+ <command> >+ <proto><ptype>UINT</ptype> <name>wglEnumerateVideoCaptureDevicesNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hDc</name></param> >+ <param><ptype>HVIDEOINPUTDEVICENV</ptype> *<name>phDeviceList</name></param> >+ </command> >+ <command> >+ <proto>int <name>wglEnumerateVideoDevicesNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>HVIDEOOUTPUTDEVICENV</ptype> *<name>phDeviceList</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglEnumGpuDevicesNV</name></proto> >+ <param><ptype>HGPUNV</ptype> <name>hGpu</name></param> >+ <param><ptype>UINT</ptype> <name>iDeviceIndex</name></param> >+ <param><ptype>PGPU_DEVICE</ptype> <name>lpGpuDevice</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglEnumGpusFromAffinityDCNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hAffinityDC</name></param> >+ <param><ptype>UINT</ptype> <name>iGpuIndex</name></param> >+ <param><ptype>HGPUNV</ptype> *<name>hGpu</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglEnumGpusNV</name></proto> >+ <param><ptype>UINT</ptype> <name>iGpuIndex</name></param> >+ <param><ptype>HGPUNV</ptype> *<name>phGpu</name></param> >+ </command> >+ <command> >+ <proto>void <name>wglFreeMemoryNV</name></proto> >+ <param>void *<name>pointer</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGenlockSampleRateI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>UINT</ptype> <name>uRate</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGenlockSourceDelayI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>UINT</ptype> <name>uDelay</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGenlockSourceEdgeI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>UINT</ptype> <name>uEdge</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGenlockSourceI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>UINT</ptype> <name>uSource</name></param> >+ </command> >+ <command> >+ <proto><ptype>UINT</ptype> <name>wglGetContextGPUIDAMD</name></proto> >+ <param><ptype>HGLRC</ptype> <name>hglrc</name></param> >+ </command> >+ <command> >+ <proto><ptype>HGLRC</ptype> <name>wglGetCurrentAssociatedContextAMD</name></proto> >+ </command> >+ <command> >+ <proto><ptype>HGLRC</ptype> <name>wglGetCurrentContext</name></proto> >+ </command> >+ <command> >+ <proto><ptype>HDC</ptype> <name>wglGetCurrentDC</name></proto> >+ </command> >+ <command> >+ <proto><ptype>HDC</ptype> <name>wglGetCurrentReadDCARB</name></proto> >+ </command> >+ <command> >+ <proto><ptype>HDC</ptype> <name>wglGetCurrentReadDCEXT</name></proto> >+ </command> >+ <command> >+ <proto><ptype>PROC</ptype> <name>wglGetDefaultProcAddress</name></proto> >+ <param><ptype>LPCSTR</ptype> <name>lpszProc</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetDigitalVideoParametersI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param>int <name>iAttribute</name></param> >+ <param>int *<name>piValue</name></param> >+ </command> >+ <command> >+ <proto><ptype>UINT</ptype> <name>GetEnhMetaFilePixelFormat</name></proto> >+ <param><ptype>HENHMETAFILE</ptype> <name>hemf</name></param> >+ <param>const <ptype>PIXELFORMATDESCRIPTOR</ptype> *<name>ppfd</name></param> >+ </command> >+ <command> >+ <proto>const char *<name>wglGetExtensionsStringARB</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ </command> >+ <command> >+ <proto>const char *<name>wglGetExtensionsStringEXT</name></proto> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetFrameUsageI3D</name></proto> >+ <param>float *<name>pUsage</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetGammaTableI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param>int <name>iEntries</name></param> >+ <param><ptype>USHORT</ptype> *<name>puRed</name></param> >+ <param><ptype>USHORT</ptype> *<name>puGreen</name></param> >+ <param><ptype>USHORT</ptype> *<name>puBlue</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetGammaTableParametersI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param>int <name>iAttribute</name></param> >+ <param>int *<name>piValue</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetGenlockSampleRateI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>UINT</ptype> *<name>uRate</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetGenlockSourceDelayI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>UINT</ptype> *<name>uDelay</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetGenlockSourceEdgeI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>UINT</ptype> *<name>uEdge</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetGenlockSourceI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>UINT</ptype> *<name>uSource</name></param> >+ </command> >+ <command> >+ <proto><ptype>UINT</ptype> <name>wglGetGPUIDsAMD</name></proto> >+ <param><ptype>UINT</ptype> <name>maxCount</name></param> >+ <param><ptype>UINT</ptype> *<name>ids</name></param> >+ </command> >+ <command> >+ <proto><ptype>INT</ptype> <name>wglGetGPUInfoAMD</name></proto> >+ <param><ptype>UINT</ptype> <name>id</name></param> >+ <param>int <name>property</name></param> >+ <param><ptype>GLenum</ptype> <name>dataType</name></param> >+ <param><ptype>UINT</ptype> <name>size</name></param> >+ <param>void *<name>data</name></param> >+ </command> >+ <command> >+ <proto>int <name>wglGetLayerPaletteEntries</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param>int <name>iLayerPlane</name></param> >+ <param>int <name>iStart</name></param> >+ <param>int <name>cEntries</name></param> >+ <param>const <ptype>COLORREF</ptype> *<name>pcr</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetMscRateOML</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param><ptype>INT32</ptype> *<name>numerator</name></param> >+ <param><ptype>INT32</ptype> *<name>denominator</name></param> >+ </command> >+ <command> >+ <proto><ptype>HDC</ptype> <name>wglGetPbufferDCARB</name></proto> >+ <param><ptype>HPBUFFERARB</ptype> <name>hPbuffer</name></param> >+ </command> >+ <command> >+ <proto><ptype>HDC</ptype> <name>wglGetPbufferDCEXT</name></proto> >+ <param><ptype>HPBUFFEREXT</ptype> <name>hPbuffer</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetPixelFormatAttribfvARB</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param>int <name>iPixelFormat</name></param> >+ <param>int <name>iLayerPlane</name></param> >+ <param><ptype>UINT</ptype> <name>nAttributes</name></param> >+ <param>const int *<name>piAttributes</name></param> >+ <param><ptype>FLOAT</ptype> *<name>pfValues</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetPixelFormatAttribfvEXT</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param>int <name>iPixelFormat</name></param> >+ <param>int <name>iLayerPlane</name></param> >+ <param><ptype>UINT</ptype> <name>nAttributes</name></param> >+ <param>int *<name>piAttributes</name></param> >+ <param><ptype>FLOAT</ptype> *<name>pfValues</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetPixelFormatAttribivARB</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param>int <name>iPixelFormat</name></param> >+ <param>int <name>iLayerPlane</name></param> >+ <param><ptype>UINT</ptype> <name>nAttributes</name></param> >+ <param>const int *<name>piAttributes</name></param> >+ <param>int *<name>piValues</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetPixelFormatAttribivEXT</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param>int <name>iPixelFormat</name></param> >+ <param>int <name>iLayerPlane</name></param> >+ <param><ptype>UINT</ptype> <name>nAttributes</name></param> >+ <param>int *<name>piAttributes</name></param> >+ <param>int *<name>piValues</name></param> >+ </command> >+ <command> >+ <proto><ptype>PROC</ptype> <name>wglGetProcAddress</name></proto> >+ <param><ptype>LPCSTR</ptype> <name>lpszProc</name></param> >+ </command> >+ <command> >+ <proto>int <name>wglGetSwapIntervalEXT</name></proto> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetSyncValuesOML</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param><ptype>INT64</ptype> *<name>ust</name></param> >+ <param><ptype>INT64</ptype> *<name>msc</name></param> >+ <param><ptype>INT64</ptype> *<name>sbc</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetVideoDeviceNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param>int <name>numDevices</name></param> >+ <param><ptype>HPVIDEODEV</ptype> *<name>hVideoDevice</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglGetVideoInfoNV</name></proto> >+ <param><ptype>HPVIDEODEV</ptype> <name>hpVideoDevice</name></param> >+ <param>unsigned long *<name>pulCounterOutputPbuffer</name></param> >+ <param>unsigned long *<name>pulCounterOutputVideo</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglIsEnabledFrameLockI3D</name></proto> >+ <param><ptype>BOOL</ptype> *<name>pFlag</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglIsEnabledGenlockI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>BOOL</ptype> *<name>pFlag</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglJoinSwapGroupNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>GLuint</ptype> <name>group</name></param> >+ </command> >+ <command> >+ <proto><ptype>GLboolean</ptype> <name>wglLoadDisplayColorTableEXT</name></proto> >+ <param>const <ptype>GLushort</ptype> *<name>table</name></param> >+ <param><ptype>GLuint</ptype> <name>length</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglLockVideoCaptureDeviceNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hDc</name></param> >+ <param><ptype>HVIDEOINPUTDEVICENV</ptype> <name>hDevice</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglMakeAssociatedContextCurrentAMD</name></proto> >+ <param><ptype>HGLRC</ptype> <name>hglrc</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglMakeContextCurrentARB</name></proto> >+ <param><ptype>HDC</ptype> <name>hDrawDC</name></param> >+ <param><ptype>HDC</ptype> <name>hReadDC</name></param> >+ <param><ptype>HGLRC</ptype> <name>hglrc</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglMakeContextCurrentEXT</name></proto> >+ <param><ptype>HDC</ptype> <name>hDrawDC</name></param> >+ <param><ptype>HDC</ptype> <name>hReadDC</name></param> >+ <param><ptype>HGLRC</ptype> <name>hglrc</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglMakeCurrent</name></proto> >+ <param><ptype>HDC</ptype> <name>hDc</name></param> >+ <param><ptype>HGLRC</ptype> <name>newContext</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglQueryCurrentContextNV</name></proto> >+ <param>int <name>iAttribute</name></param> >+ <param>int *<name>piValue</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglQueryFrameCountNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>GLuint</ptype> *<name>count</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglQueryFrameLockMasterI3D</name></proto> >+ <param><ptype>BOOL</ptype> *<name>pFlag</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglQueryFrameTrackingI3D</name></proto> >+ <param><ptype>DWORD</ptype> *<name>pFrameCount</name></param> >+ <param><ptype>DWORD</ptype> *<name>pMissedFrames</name></param> >+ <param>float *<name>pLastMissedUsage</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglQueryGenlockMaxSourceDelayI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>UINT</ptype> *<name>uMaxLineDelay</name></param> >+ <param><ptype>UINT</ptype> *<name>uMaxPixelDelay</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglQueryMaxSwapGroupsNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>GLuint</ptype> *<name>maxGroups</name></param> >+ <param><ptype>GLuint</ptype> *<name>maxBarriers</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglQueryPbufferARB</name></proto> >+ <param><ptype>HPBUFFERARB</ptype> <name>hPbuffer</name></param> >+ <param>int <name>iAttribute</name></param> >+ <param>int *<name>piValue</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglQueryPbufferEXT</name></proto> >+ <param><ptype>HPBUFFEREXT</ptype> <name>hPbuffer</name></param> >+ <param>int <name>iAttribute</name></param> >+ <param>int *<name>piValue</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglQuerySwapGroupNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>GLuint</ptype> *<name>group</name></param> >+ <param><ptype>GLuint</ptype> *<name>barrier</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglQueryVideoCaptureDeviceNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hDc</name></param> >+ <param><ptype>HVIDEOINPUTDEVICENV</ptype> <name>hDevice</name></param> >+ <param>int <name>iAttribute</name></param> >+ <param>int *<name>piValue</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglRealizeLayerPalette</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param>int <name>iLayerPlane</name></param> >+ <param><ptype>BOOL</ptype> <name>bRealize</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglReleaseImageBufferEventsI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param>const <ptype>LPVOID</ptype> *<name>pAddress</name></param> >+ <param><ptype>UINT</ptype> <name>count</name></param> >+ </command> >+ <command> >+ <proto>int <name>wglReleasePbufferDCARB</name></proto> >+ <param><ptype>HPBUFFERARB</ptype> <name>hPbuffer</name></param> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ </command> >+ <command> >+ <proto>int <name>wglReleasePbufferDCEXT</name></proto> >+ <param><ptype>HPBUFFEREXT</ptype> <name>hPbuffer</name></param> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglReleaseTexImageARB</name></proto> >+ <param><ptype>HPBUFFERARB</ptype> <name>hPbuffer</name></param> >+ <param>int <name>iBuffer</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglReleaseVideoCaptureDeviceNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hDc</name></param> >+ <param><ptype>HVIDEOINPUTDEVICENV</ptype> <name>hDevice</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglReleaseVideoDeviceNV</name></proto> >+ <param><ptype>HPVIDEODEV</ptype> <name>hVideoDevice</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglReleaseVideoImageNV</name></proto> >+ <param><ptype>HPBUFFERARB</ptype> <name>hPbuffer</name></param> >+ <param>int <name>iVideoBuffer</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglResetFrameCountNV</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglRestoreBufferRegionARB</name></proto> >+ <param><ptype>HANDLE</ptype> <name>hRegion</name></param> >+ <param>int <name>x</name></param> >+ <param>int <name>y</name></param> >+ <param>int <name>width</name></param> >+ <param>int <name>height</name></param> >+ <param>int <name>xSrc</name></param> >+ <param>int <name>ySrc</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglSaveBufferRegionARB</name></proto> >+ <param><ptype>HANDLE</ptype> <name>hRegion</name></param> >+ <param>int <name>x</name></param> >+ <param>int <name>y</name></param> >+ <param>int <name>width</name></param> >+ <param>int <name>height</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglSendPbufferToVideoNV</name></proto> >+ <param><ptype>HPBUFFERARB</ptype> <name>hPbuffer</name></param> >+ <param>int <name>iBufferType</name></param> >+ <param>unsigned long *<name>pulCounterPbuffer</name></param> >+ <param><ptype>BOOL</ptype> <name>bBlock</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglSetDigitalVideoParametersI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param>int <name>iAttribute</name></param> >+ <param>const int *<name>piValue</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglSetGammaTableI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param>int <name>iEntries</name></param> >+ <param>const <ptype>USHORT</ptype> *<name>puRed</name></param> >+ <param>const <ptype>USHORT</ptype> *<name>puGreen</name></param> >+ <param>const <ptype>USHORT</ptype> *<name>puBlue</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglSetGammaTableParametersI3D</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param>int <name>iAttribute</name></param> >+ <param>const int *<name>piValue</name></param> >+ </command> >+ <command> >+ <proto>int <name>wglSetLayerPaletteEntries</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param>int <name>iLayerPlane</name></param> >+ <param>int <name>iStart</name></param> >+ <param>int <name>cEntries</name></param> >+ <param>const <ptype>COLORREF</ptype> *<name>pcr</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglSetPbufferAttribARB</name></proto> >+ <param><ptype>HPBUFFERARB</ptype> <name>hPbuffer</name></param> >+ <param>const int *<name>piAttribList</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglSetStereoEmitterState3DL</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>UINT</ptype> <name>uState</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglShareLists</name></proto> >+ <param><ptype>HGLRC</ptype> <name>hrcSrvShare</name></param> >+ <param><ptype>HGLRC</ptype> <name>hrcSrvSource</name></param> >+ </command> >+ <command> >+ <proto><ptype>INT64</ptype> <name>wglSwapBuffersMscOML</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param><ptype>INT64</ptype> <name>target_msc</name></param> >+ <param><ptype>INT64</ptype> <name>divisor</name></param> >+ <param><ptype>INT64</ptype> <name>remainder</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglSwapLayerBuffers</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param><ptype>UINT</ptype> <name>fuFlags</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglSwapIntervalEXT</name></proto> >+ <param>int <name>interval</name></param> >+ </command> >+ <command> >+ <proto><ptype>INT64</ptype> <name>wglSwapLayerBuffersMscOML</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param>int <name>fuPlanes</name></param> >+ <param><ptype>INT64</ptype> <name>target_msc</name></param> >+ <param><ptype>INT64</ptype> <name>divisor</name></param> >+ <param><ptype>INT64</ptype> <name>remainder</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglUseFontBitmaps</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>DWORD</ptype> <name>first</name></param> >+ <param><ptype>DWORD</ptype> <name>count</name></param> >+ <param><ptype>DWORD</ptype> <name>listBase</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglUseFontBitmapsA</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>DWORD</ptype> <name>first</name></param> >+ <param><ptype>DWORD</ptype> <name>count</name></param> >+ <param><ptype>DWORD</ptype> <name>listBase</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglUseFontBitmapsW</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>DWORD</ptype> <name>first</name></param> >+ <param><ptype>DWORD</ptype> <name>count</name></param> >+ <param><ptype>DWORD</ptype> <name>listBase</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglUseFontOutlines</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>DWORD</ptype> <name>first</name></param> >+ <param><ptype>DWORD</ptype> <name>count</name></param> >+ <param><ptype>DWORD</ptype> <name>listBase</name></param> >+ <param><ptype>FLOAT</ptype> <name>deviation</name></param> >+ <param><ptype>FLOAT</ptype> <name>extrusion</name></param> >+ <param>int <name>format</name></param> >+ <param><ptype>LPGLYPHMETRICSFLOAT</ptype> <name>lpgmf</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglUseFontOutlinesA</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>DWORD</ptype> <name>first</name></param> >+ <param><ptype>DWORD</ptype> <name>count</name></param> >+ <param><ptype>DWORD</ptype> <name>listBase</name></param> >+ <param><ptype>FLOAT</ptype> <name>deviation</name></param> >+ <param><ptype>FLOAT</ptype> <name>extrusion</name></param> >+ <param>int <name>format</name></param> >+ <param><ptype>LPGLYPHMETRICSFLOAT</ptype> <name>lpgmf</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglUseFontOutlinesW</name></proto> >+ <param><ptype>HDC</ptype> <name>hDC</name></param> >+ <param><ptype>DWORD</ptype> <name>first</name></param> >+ <param><ptype>DWORD</ptype> <name>count</name></param> >+ <param><ptype>DWORD</ptype> <name>listBase</name></param> >+ <param><ptype>FLOAT</ptype> <name>deviation</name></param> >+ <param><ptype>FLOAT</ptype> <name>extrusion</name></param> >+ <param>int <name>format</name></param> >+ <param><ptype>LPGLYPHMETRICSFLOAT</ptype> <name>lpgmf</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglWaitForMscOML</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param><ptype>INT64</ptype> <name>target_msc</name></param> >+ <param><ptype>INT64</ptype> <name>divisor</name></param> >+ <param><ptype>INT64</ptype> <name>remainder</name></param> >+ <param><ptype>INT64</ptype> *<name>ust</name></param> >+ <param><ptype>INT64</ptype> *<name>msc</name></param> >+ <param><ptype>INT64</ptype> *<name>sbc</name></param> >+ </command> >+ <command> >+ <proto><ptype>BOOL</ptype> <name>wglWaitForSbcOML</name></proto> >+ <param><ptype>HDC</ptype> <name>hdc</name></param> >+ <param><ptype>INT64</ptype> <name>target_sbc</name></param> >+ <param><ptype>INT64</ptype> *<name>ust</name></param> >+ <param><ptype>INT64</ptype> *<name>msc</name></param> >+ <param><ptype>INT64</ptype> *<name>sbc</name></param> >+ </command> >+ </commands> >+ >+ <!-- SECTION: WGL API interface definitions. --> >+ <feature api="wgl" name="WGL_VERSION_1_0" number="1.0"> >+ <require> >+ <enum name="WGL_FONT_LINES"/> >+ <enum name="WGL_FONT_POLYGONS"/> >+ <enum name="WGL_SWAP_MAIN_PLANE"/> >+ <enum name="WGL_SWAP_OVERLAY1"/> >+ <enum name="WGL_SWAP_OVERLAY2"/> >+ <enum name="WGL_SWAP_OVERLAY3"/> >+ <enum name="WGL_SWAP_OVERLAY4"/> >+ <enum name="WGL_SWAP_OVERLAY5"/> >+ <enum name="WGL_SWAP_OVERLAY6"/> >+ <enum name="WGL_SWAP_OVERLAY7"/> >+ <enum name="WGL_SWAP_OVERLAY8"/> >+ <enum name="WGL_SWAP_OVERLAY9"/> >+ <enum name="WGL_SWAP_OVERLAY10"/> >+ <enum name="WGL_SWAP_OVERLAY11"/> >+ <enum name="WGL_SWAP_OVERLAY12"/> >+ <enum name="WGL_SWAP_OVERLAY13"/> >+ <enum name="WGL_SWAP_OVERLAY14"/> >+ <enum name="WGL_SWAP_OVERLAY15"/> >+ <enum name="WGL_SWAP_UNDERLAY1"/> >+ <enum name="WGL_SWAP_UNDERLAY2"/> >+ <enum name="WGL_SWAP_UNDERLAY3"/> >+ <enum name="WGL_SWAP_UNDERLAY4"/> >+ <enum name="WGL_SWAP_UNDERLAY5"/> >+ <enum name="WGL_SWAP_UNDERLAY6"/> >+ <enum name="WGL_SWAP_UNDERLAY7"/> >+ <enum name="WGL_SWAP_UNDERLAY8"/> >+ <enum name="WGL_SWAP_UNDERLAY9"/> >+ <enum name="WGL_SWAP_UNDERLAY10"/> >+ <enum name="WGL_SWAP_UNDERLAY11"/> >+ <enum name="WGL_SWAP_UNDERLAY12"/> >+ <enum name="WGL_SWAP_UNDERLAY13"/> >+ <enum name="WGL_SWAP_UNDERLAY14"/> >+ <enum name="WGL_SWAP_UNDERLAY15"/> >+ <command name="ChoosePixelFormat"/> >+ <command name="DescribePixelFormat"/> >+ <command name="GetEnhMetaFilePixelFormat"/> >+ <command name="GetPixelFormat"/> >+ <command name="SetPixelFormat"/> >+ <command name="SwapBuffers"/> >+ <command name="wglCopyContext"/> >+ <command name="wglCreateContext"/> >+ <command name="wglCreateLayerContext"/> >+ <command name="wglDeleteContext"/> >+ <command name="wglDescribeLayerPlane"/> >+ <command name="wglGetCurrentContext"/> >+ <command name="wglGetCurrentDC"/> >+ <command name="wglGetLayerPaletteEntries"/> >+ <command name="wglGetProcAddress"/> >+ <command name="wglMakeCurrent"/> >+ <command name="wglRealizeLayerPalette"/> >+ <command name="wglSetLayerPaletteEntries"/> >+ <command name="wglShareLists"/> >+ <command name="wglSwapLayerBuffers"/> >+ <command name="wglUseFontBitmaps"/> >+ <command name="wglUseFontBitmapsA"/> >+ <command name="wglUseFontBitmapsW"/> >+ <command name="wglUseFontOutlines"/> >+ <command name="wglUseFontOutlinesA"/> >+ <command name="wglUseFontOutlinesW"/> >+ </require> >+ </feature> >+ >+ <!-- SECTION: WGL extension interface definitions --> >+ <extensions> >+ <extension name="WGL_3DFX_multisample" supported="wgl"> >+ <require> >+ <enum name="WGL_SAMPLE_BUFFERS_3DFX"/> >+ <enum name="WGL_SAMPLES_3DFX"/> >+ </require> >+ </extension> >+ <extension name="WGL_3DL_stereo_control" supported="wgl"> >+ <require> >+ <enum name="WGL_STEREO_EMITTER_ENABLE_3DL"/> >+ <enum name="WGL_STEREO_EMITTER_DISABLE_3DL"/> >+ <enum name="WGL_STEREO_POLARITY_NORMAL_3DL"/> >+ <enum name="WGL_STEREO_POLARITY_INVERT_3DL"/> >+ <command name="wglSetStereoEmitterState3DL"/> >+ </require> >+ </extension> >+ <extension name="WGL_AMD_gpu_association" supported="wgl"> >+ <require> >+ <enum name="WGL_GPU_VENDOR_AMD"/> >+ <enum name="WGL_GPU_RENDERER_STRING_AMD"/> >+ <enum name="WGL_GPU_OPENGL_VERSION_STRING_AMD"/> >+ <enum name="WGL_GPU_FASTEST_TARGET_GPUS_AMD"/> >+ <enum name="WGL_GPU_RAM_AMD"/> >+ <enum name="WGL_GPU_CLOCK_AMD"/> >+ <enum name="WGL_GPU_NUM_PIPES_AMD"/> >+ <enum name="WGL_GPU_NUM_SIMD_AMD"/> >+ <enum name="WGL_GPU_NUM_RB_AMD"/> >+ <enum name="WGL_GPU_NUM_SPI_AMD"/> >+ <command name="wglGetGPUIDsAMD"/> >+ <command name="wglGetGPUInfoAMD"/> >+ <command name="wglGetContextGPUIDAMD"/> >+ <command name="wglCreateAssociatedContextAMD"/> >+ <command name="wglCreateAssociatedContextAttribsAMD"/> >+ <command name="wglDeleteAssociatedContextAMD"/> >+ <command name="wglMakeAssociatedContextCurrentAMD"/> >+ <command name="wglGetCurrentAssociatedContextAMD"/> >+ <command name="wglBlitContextFramebufferAMD"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_buffer_region" supported="wgl"> >+ <require> >+ <enum name="WGL_FRONT_COLOR_BUFFER_BIT_ARB"/> >+ <enum name="WGL_BACK_COLOR_BUFFER_BIT_ARB"/> >+ <enum name="WGL_DEPTH_BUFFER_BIT_ARB"/> >+ <enum name="WGL_STENCIL_BUFFER_BIT_ARB"/> >+ <command name="wglCreateBufferRegionARB"/> >+ <command name="wglDeleteBufferRegionARB"/> >+ <command name="wglSaveBufferRegionARB"/> >+ <command name="wglRestoreBufferRegionARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_context_flush_control" supported="wgl"> >+ <require> >+ <enum name="WGL_CONTEXT_RELEASE_BEHAVIOR_ARB"/> >+ <enum name="WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB"/> >+ <enum name="WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_create_context" supported="wgl"> >+ <require> >+ <enum name="WGL_CONTEXT_DEBUG_BIT_ARB"/> >+ <enum name="WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB"/> >+ <enum name="WGL_CONTEXT_MAJOR_VERSION_ARB"/> >+ <enum name="WGL_CONTEXT_MINOR_VERSION_ARB"/> >+ <enum name="WGL_CONTEXT_LAYER_PLANE_ARB"/> >+ <enum name="WGL_CONTEXT_FLAGS_ARB"/> >+ <enum name="ERROR_INVALID_VERSION_ARB"/> >+ <command name="wglCreateContextAttribsARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_create_context_no_error" supported="wgl"> >+ <require> >+ <enum name="WGL_CONTEXT_OPENGL_NO_ERROR_ARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_create_context_profile" supported="wgl"> >+ <require> >+ <enum name="WGL_CONTEXT_PROFILE_MASK_ARB"/> >+ <enum name="WGL_CONTEXT_CORE_PROFILE_BIT_ARB"/> >+ <enum name="WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB"/> >+ <enum name="ERROR_INVALID_PROFILE_ARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_create_context_robustness" supported="wgl"> >+ <require> >+ <enum name="WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB"/> >+ <enum name="WGL_LOSE_CONTEXT_ON_RESET_ARB"/> >+ <enum name="WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB"/> >+ <enum name="WGL_NO_RESET_NOTIFICATION_ARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_extensions_string" supported="wgl"> >+ <require> >+ <command name="wglGetExtensionsStringARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_framebuffer_sRGB" supported="wgl"> >+ <require> >+ <enum name="WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_make_current_read" supported="wgl"> >+ <require> >+ <enum name="ERROR_INVALID_PIXEL_TYPE_ARB"/> >+ <enum name="ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB"/> >+ <command name="wglMakeContextCurrentARB"/> >+ <command name="wglGetCurrentReadDCARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_multisample" supported="wgl"> >+ <require> >+ <enum name="WGL_SAMPLE_BUFFERS_ARB"/> >+ <enum name="WGL_SAMPLES_ARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_pbuffer" supported="wgl"> >+ <require> >+ <enum name="WGL_DRAW_TO_PBUFFER_ARB"/> >+ <enum name="WGL_MAX_PBUFFER_PIXELS_ARB"/> >+ <enum name="WGL_MAX_PBUFFER_WIDTH_ARB"/> >+ <enum name="WGL_MAX_PBUFFER_HEIGHT_ARB"/> >+ <enum name="WGL_PBUFFER_LARGEST_ARB"/> >+ <enum name="WGL_PBUFFER_WIDTH_ARB"/> >+ <enum name="WGL_PBUFFER_HEIGHT_ARB"/> >+ <enum name="WGL_PBUFFER_LOST_ARB"/> >+ <command name="wglCreatePbufferARB"/> >+ <command name="wglGetPbufferDCARB"/> >+ <command name="wglReleasePbufferDCARB"/> >+ <command name="wglDestroyPbufferARB"/> >+ <command name="wglQueryPbufferARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_pixel_format" supported="wgl"> >+ <require> >+ <enum name="WGL_NUMBER_PIXEL_FORMATS_ARB"/> >+ <enum name="WGL_DRAW_TO_WINDOW_ARB"/> >+ <enum name="WGL_DRAW_TO_BITMAP_ARB"/> >+ <enum name="WGL_ACCELERATION_ARB"/> >+ <enum name="WGL_NEED_PALETTE_ARB"/> >+ <enum name="WGL_NEED_SYSTEM_PALETTE_ARB"/> >+ <enum name="WGL_SWAP_LAYER_BUFFERS_ARB"/> >+ <enum name="WGL_SWAP_METHOD_ARB"/> >+ <enum name="WGL_NUMBER_OVERLAYS_ARB"/> >+ <enum name="WGL_NUMBER_UNDERLAYS_ARB"/> >+ <enum name="WGL_TRANSPARENT_ARB"/> >+ <enum name="WGL_TRANSPARENT_RED_VALUE_ARB"/> >+ <enum name="WGL_TRANSPARENT_GREEN_VALUE_ARB"/> >+ <enum name="WGL_TRANSPARENT_BLUE_VALUE_ARB"/> >+ <enum name="WGL_TRANSPARENT_ALPHA_VALUE_ARB"/> >+ <enum name="WGL_TRANSPARENT_INDEX_VALUE_ARB"/> >+ <enum name="WGL_SHARE_DEPTH_ARB"/> >+ <enum name="WGL_SHARE_STENCIL_ARB"/> >+ <enum name="WGL_SHARE_ACCUM_ARB"/> >+ <enum name="WGL_SUPPORT_GDI_ARB"/> >+ <enum name="WGL_SUPPORT_OPENGL_ARB"/> >+ <enum name="WGL_DOUBLE_BUFFER_ARB"/> >+ <enum name="WGL_STEREO_ARB"/> >+ <enum name="WGL_PIXEL_TYPE_ARB"/> >+ <enum name="WGL_COLOR_BITS_ARB"/> >+ <enum name="WGL_RED_BITS_ARB"/> >+ <enum name="WGL_RED_SHIFT_ARB"/> >+ <enum name="WGL_GREEN_BITS_ARB"/> >+ <enum name="WGL_GREEN_SHIFT_ARB"/> >+ <enum name="WGL_BLUE_BITS_ARB"/> >+ <enum name="WGL_BLUE_SHIFT_ARB"/> >+ <enum name="WGL_ALPHA_BITS_ARB"/> >+ <enum name="WGL_ALPHA_SHIFT_ARB"/> >+ <enum name="WGL_ACCUM_BITS_ARB"/> >+ <enum name="WGL_ACCUM_RED_BITS_ARB"/> >+ <enum name="WGL_ACCUM_GREEN_BITS_ARB"/> >+ <enum name="WGL_ACCUM_BLUE_BITS_ARB"/> >+ <enum name="WGL_ACCUM_ALPHA_BITS_ARB"/> >+ <enum name="WGL_DEPTH_BITS_ARB"/> >+ <enum name="WGL_STENCIL_BITS_ARB"/> >+ <enum name="WGL_AUX_BUFFERS_ARB"/> >+ <enum name="WGL_NO_ACCELERATION_ARB"/> >+ <enum name="WGL_GENERIC_ACCELERATION_ARB"/> >+ <enum name="WGL_FULL_ACCELERATION_ARB"/> >+ <enum name="WGL_SWAP_EXCHANGE_ARB"/> >+ <enum name="WGL_SWAP_COPY_ARB"/> >+ <enum name="WGL_SWAP_UNDEFINED_ARB"/> >+ <enum name="WGL_TYPE_RGBA_ARB"/> >+ <enum name="WGL_TYPE_COLORINDEX_ARB"/> >+ <command name="wglGetPixelFormatAttribivARB"/> >+ <command name="wglGetPixelFormatAttribfvARB"/> >+ <command name="wglChoosePixelFormatARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_pixel_format_float" supported="wgl"> >+ <require> >+ <enum name="WGL_TYPE_RGBA_FLOAT_ARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_render_texture" supported="wgl"> >+ <require> >+ <enum name="WGL_BIND_TO_TEXTURE_RGB_ARB"/> >+ <enum name="WGL_BIND_TO_TEXTURE_RGBA_ARB"/> >+ <enum name="WGL_TEXTURE_FORMAT_ARB"/> >+ <enum name="WGL_TEXTURE_TARGET_ARB"/> >+ <enum name="WGL_MIPMAP_TEXTURE_ARB"/> >+ <enum name="WGL_TEXTURE_RGB_ARB"/> >+ <enum name="WGL_TEXTURE_RGBA_ARB"/> >+ <enum name="WGL_NO_TEXTURE_ARB"/> >+ <enum name="WGL_TEXTURE_CUBE_MAP_ARB"/> >+ <enum name="WGL_TEXTURE_1D_ARB"/> >+ <enum name="WGL_TEXTURE_2D_ARB"/> >+ <enum name="WGL_MIPMAP_LEVEL_ARB"/> >+ <enum name="WGL_CUBE_MAP_FACE_ARB"/> >+ <enum name="WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB"/> >+ <enum name="WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB"/> >+ <enum name="WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB"/> >+ <enum name="WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB"/> >+ <enum name="WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB"/> >+ <enum name="WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB"/> >+ <enum name="WGL_FRONT_LEFT_ARB"/> >+ <enum name="WGL_FRONT_RIGHT_ARB"/> >+ <enum name="WGL_BACK_LEFT_ARB"/> >+ <enum name="WGL_BACK_RIGHT_ARB"/> >+ <enum name="WGL_AUX0_ARB"/> >+ <enum name="WGL_AUX1_ARB"/> >+ <enum name="WGL_AUX2_ARB"/> >+ <enum name="WGL_AUX3_ARB"/> >+ <enum name="WGL_AUX4_ARB"/> >+ <enum name="WGL_AUX5_ARB"/> >+ <enum name="WGL_AUX6_ARB"/> >+ <enum name="WGL_AUX7_ARB"/> >+ <enum name="WGL_AUX8_ARB"/> >+ <enum name="WGL_AUX9_ARB"/> >+ <command name="wglBindTexImageARB"/> >+ <command name="wglReleaseTexImageARB"/> >+ <command name="wglSetPbufferAttribARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_robustness_application_isolation" supported="wgl"> >+ <require> >+ <enum name="WGL_CONTEXT_RESET_ISOLATION_BIT_ARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ARB_robustness_share_group_isolation" supported="wgl"> >+ <require> >+ <enum name="WGL_CONTEXT_RESET_ISOLATION_BIT_ARB"/> >+ </require> >+ </extension> >+ <extension name="WGL_ATI_pixel_format_float" supported="wgl"> >+ <require> >+ <enum name="WGL_TYPE_RGBA_FLOAT_ATI"/> >+ </require> >+ </extension> >+ <extension name="WGL_ATI_render_texture_rectangle" supported="wgl"> >+ <require> >+ <enum name="WGL_TEXTURE_RECTANGLE_ATI"/> >+ </require> >+ </extension> >+ <extension name="WGL_EXT_colorspace" supported="wgl"> >+ <require> >+ <enum name="WGL_COLORSPACE_EXT"/> >+ <enum name="WGL_COLORSPACE_SRGB_EXT"/> >+ <enum name="WGL_COLORSPACE_LINEAR_EXT"/> >+ </require> >+ </extension> >+ <extension name="WGL_EXT_create_context_es_profile" supported="wgl"> >+ <require> >+ <enum name="WGL_CONTEXT_ES_PROFILE_BIT_EXT"/> >+ </require> >+ </extension> >+ <extension name="WGL_EXT_create_context_es2_profile" supported="wgl"> >+ <require> >+ <enum name="WGL_CONTEXT_ES2_PROFILE_BIT_EXT"/> >+ </require> >+ </extension> >+ <extension name="WGL_EXT_depth_float" supported="wgl"> >+ <require> >+ <enum name="WGL_DEPTH_FLOAT_EXT"/> >+ </require> >+ </extension> >+ <extension name="WGL_EXT_display_color_table" supported="wgl"> >+ <require> >+ <command name="wglCreateDisplayColorTableEXT"/> >+ <command name="wglLoadDisplayColorTableEXT"/> >+ <command name="wglBindDisplayColorTableEXT"/> >+ <command name="wglDestroyDisplayColorTableEXT"/> >+ </require> >+ </extension> >+ <extension name="WGL_EXT_extensions_string" supported="wgl"> >+ <require> >+ <command name="wglGetExtensionsStringEXT"/> >+ </require> >+ </extension> >+ <extension name="WGL_EXT_framebuffer_sRGB" supported="wgl"> >+ <require> >+ <enum name="WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT"/> >+ </require> >+ </extension> >+ <extension name="WGL_EXT_make_current_read" supported="wgl"> >+ <require> >+ <enum name="ERROR_INVALID_PIXEL_TYPE_EXT"/> >+ <command name="wglMakeContextCurrentEXT"/> >+ <command name="wglGetCurrentReadDCEXT"/> >+ </require> >+ </extension> >+ <extension name="WGL_EXT_multisample" supported="wgl"> >+ <require> >+ <enum name="WGL_SAMPLE_BUFFERS_EXT"/> >+ <enum name="WGL_SAMPLES_EXT"/> >+ </require> >+ </extension> >+ <extension name="WGL_EXT_pbuffer" supported="wgl"> >+ <require> >+ <enum name="WGL_DRAW_TO_PBUFFER_EXT"/> >+ <enum name="WGL_MAX_PBUFFER_PIXELS_EXT"/> >+ <enum name="WGL_MAX_PBUFFER_WIDTH_EXT"/> >+ <enum name="WGL_MAX_PBUFFER_HEIGHT_EXT"/> >+ <enum name="WGL_OPTIMAL_PBUFFER_WIDTH_EXT"/> >+ <enum name="WGL_OPTIMAL_PBUFFER_HEIGHT_EXT"/> >+ <enum name="WGL_PBUFFER_LARGEST_EXT"/> >+ <enum name="WGL_PBUFFER_WIDTH_EXT"/> >+ <enum name="WGL_PBUFFER_HEIGHT_EXT"/> >+ <command name="wglCreatePbufferEXT"/> >+ <command name="wglGetPbufferDCEXT"/> >+ <command name="wglReleasePbufferDCEXT"/> >+ <command name="wglDestroyPbufferEXT"/> >+ <command name="wglQueryPbufferEXT"/> >+ </require> >+ </extension> >+ <extension name="WGL_EXT_pixel_format" supported="wgl"> >+ <require> >+ <enum name="WGL_NUMBER_PIXEL_FORMATS_EXT"/> >+ <enum name="WGL_DRAW_TO_WINDOW_EXT"/> >+ <enum name="WGL_DRAW_TO_BITMAP_EXT"/> >+ <enum name="WGL_ACCELERATION_EXT"/> >+ <enum name="WGL_NEED_PALETTE_EXT"/> >+ <enum name="WGL_NEED_SYSTEM_PALETTE_EXT"/> >+ <enum name="WGL_SWAP_LAYER_BUFFERS_EXT"/> >+ <enum name="WGL_SWAP_METHOD_EXT"/> >+ <enum name="WGL_NUMBER_OVERLAYS_EXT"/> >+ <enum name="WGL_NUMBER_UNDERLAYS_EXT"/> >+ <enum name="WGL_TRANSPARENT_EXT"/> >+ <enum name="WGL_TRANSPARENT_VALUE_EXT"/> >+ <enum name="WGL_SHARE_DEPTH_EXT"/> >+ <enum name="WGL_SHARE_STENCIL_EXT"/> >+ <enum name="WGL_SHARE_ACCUM_EXT"/> >+ <enum name="WGL_SUPPORT_GDI_EXT"/> >+ <enum name="WGL_SUPPORT_OPENGL_EXT"/> >+ <enum name="WGL_DOUBLE_BUFFER_EXT"/> >+ <enum name="WGL_STEREO_EXT"/> >+ <enum name="WGL_PIXEL_TYPE_EXT"/> >+ <enum name="WGL_COLOR_BITS_EXT"/> >+ <enum name="WGL_RED_BITS_EXT"/> >+ <enum name="WGL_RED_SHIFT_EXT"/> >+ <enum name="WGL_GREEN_BITS_EXT"/> >+ <enum name="WGL_GREEN_SHIFT_EXT"/> >+ <enum name="WGL_BLUE_BITS_EXT"/> >+ <enum name="WGL_BLUE_SHIFT_EXT"/> >+ <enum name="WGL_ALPHA_BITS_EXT"/> >+ <enum name="WGL_ALPHA_SHIFT_EXT"/> >+ <enum name="WGL_ACCUM_BITS_EXT"/> >+ <enum name="WGL_ACCUM_RED_BITS_EXT"/> >+ <enum name="WGL_ACCUM_GREEN_BITS_EXT"/> >+ <enum name="WGL_ACCUM_BLUE_BITS_EXT"/> >+ <enum name="WGL_ACCUM_ALPHA_BITS_EXT"/> >+ <enum name="WGL_DEPTH_BITS_EXT"/> >+ <enum name="WGL_STENCIL_BITS_EXT"/> >+ <enum name="WGL_AUX_BUFFERS_EXT"/> >+ <enum name="WGL_NO_ACCELERATION_EXT"/> >+ <enum name="WGL_GENERIC_ACCELERATION_EXT"/> >+ <enum name="WGL_FULL_ACCELERATION_EXT"/> >+ <enum name="WGL_SWAP_EXCHANGE_EXT"/> >+ <enum name="WGL_SWAP_COPY_EXT"/> >+ <enum name="WGL_SWAP_UNDEFINED_EXT"/> >+ <enum name="WGL_TYPE_RGBA_EXT"/> >+ <enum name="WGL_TYPE_COLORINDEX_EXT"/> >+ <command name="wglGetPixelFormatAttribivEXT"/> >+ <command name="wglGetPixelFormatAttribfvEXT"/> >+ <command name="wglChoosePixelFormatEXT"/> >+ </require> >+ </extension> >+ <extension name="WGL_EXT_pixel_format_packed_float" supported="wgl"> >+ <require> >+ <enum name="WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT"/> >+ </require> >+ </extension> >+ <extension name="WGL_EXT_swap_control" supported="wgl"> >+ <require> >+ <command name="wglSwapIntervalEXT"/> >+ <command name="wglGetSwapIntervalEXT"/> >+ </require> >+ </extension> >+ <extension name="WGL_EXT_swap_control_tear" supported="wgl"> >+ <require> >+ </require> >+ </extension> >+ <extension name="WGL_I3D_digital_video_control" supported="wgl"> >+ <require> >+ <enum name="WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D"/> >+ <enum name="WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D"/> >+ <enum name="WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D"/> >+ <enum name="WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D"/> >+ <command name="wglGetDigitalVideoParametersI3D"/> >+ <command name="wglSetDigitalVideoParametersI3D"/> >+ </require> >+ </extension> >+ <extension name="WGL_I3D_gamma" supported="wgl"> >+ <require> >+ <enum name="WGL_GAMMA_TABLE_SIZE_I3D"/> >+ <enum name="WGL_GAMMA_EXCLUDE_DESKTOP_I3D"/> >+ <command name="wglGetGammaTableParametersI3D"/> >+ <command name="wglSetGammaTableParametersI3D"/> >+ <command name="wglGetGammaTableI3D"/> >+ <command name="wglSetGammaTableI3D"/> >+ </require> >+ </extension> >+ <extension name="WGL_I3D_genlock" supported="wgl"> >+ <require> >+ <enum name="WGL_GENLOCK_SOURCE_MULTIVIEW_I3D"/> >+ <enum name="WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D"/> >+ <enum name="WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D"/> >+ <enum name="WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D"/> >+ <enum name="WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D"/> >+ <enum name="WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D"/> >+ <enum name="WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D"/> >+ <enum name="WGL_GENLOCK_SOURCE_EDGE_RISING_I3D"/> >+ <enum name="WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D"/> >+ <command name="wglEnableGenlockI3D"/> >+ <command name="wglDisableGenlockI3D"/> >+ <command name="wglIsEnabledGenlockI3D"/> >+ <command name="wglGenlockSourceI3D"/> >+ <command name="wglGetGenlockSourceI3D"/> >+ <command name="wglGenlockSourceEdgeI3D"/> >+ <command name="wglGetGenlockSourceEdgeI3D"/> >+ <command name="wglGenlockSampleRateI3D"/> >+ <command name="wglGetGenlockSampleRateI3D"/> >+ <command name="wglGenlockSourceDelayI3D"/> >+ <command name="wglGetGenlockSourceDelayI3D"/> >+ <command name="wglQueryGenlockMaxSourceDelayI3D"/> >+ </require> >+ </extension> >+ <extension name="WGL_I3D_image_buffer" supported="wgl"> >+ <require> >+ <enum name="WGL_IMAGE_BUFFER_MIN_ACCESS_I3D"/> >+ <enum name="WGL_IMAGE_BUFFER_LOCK_I3D"/> >+ <command name="wglCreateImageBufferI3D"/> >+ <command name="wglDestroyImageBufferI3D"/> >+ <command name="wglAssociateImageBufferEventsI3D"/> >+ <command name="wglReleaseImageBufferEventsI3D"/> >+ </require> >+ </extension> >+ <extension name="WGL_I3D_swap_frame_lock" supported="wgl"> >+ <require> >+ <command name="wglEnableFrameLockI3D"/> >+ <command name="wglDisableFrameLockI3D"/> >+ <command name="wglIsEnabledFrameLockI3D"/> >+ <command name="wglQueryFrameLockMasterI3D"/> >+ </require> >+ </extension> >+ <extension name="WGL_I3D_swap_frame_usage" supported="wgl"> >+ <require> >+ <command name="wglGetFrameUsageI3D"/> >+ <command name="wglBeginFrameTrackingI3D"/> >+ <command name="wglEndFrameTrackingI3D"/> >+ <command name="wglQueryFrameTrackingI3D"/> >+ </require> >+ </extension> >+ <extension name="WGL_NV_copy_image" supported="wgl"> >+ <require> >+ <command name="wglCopyImageSubDataNV"/> >+ </require> >+ </extension> >+ <extension name="WGL_NV_delay_before_swap" supported="wgl"> >+ <require> >+ <command name="wglDelayBeforeSwapNV"/> >+ </require> >+ </extension> >+ <extension name="WGL_NV_DX_interop" supported="wgl"> >+ <require> >+ <enum name="WGL_ACCESS_READ_ONLY_NV"/> >+ <enum name="WGL_ACCESS_READ_WRITE_NV"/> >+ <enum name="WGL_ACCESS_WRITE_DISCARD_NV"/> >+ <command name="wglDXSetResourceShareHandleNV"/> >+ <command name="wglDXOpenDeviceNV"/> >+ <command name="wglDXCloseDeviceNV"/> >+ <command name="wglDXRegisterObjectNV"/> >+ <command name="wglDXUnregisterObjectNV"/> >+ <command name="wglDXObjectAccessNV"/> >+ <command name="wglDXLockObjectsNV"/> >+ <command name="wglDXUnlockObjectsNV"/> >+ </require> >+ </extension> >+ <extension name="WGL_NV_DX_interop2" supported="wgl"> >+ <require> >+ </require> >+ </extension> >+ <extension name="WGL_NV_float_buffer" supported="wgl"> >+ <require> >+ <enum name="WGL_FLOAT_COMPONENTS_NV"/> >+ <enum name="WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV"/> >+ <enum name="WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV"/> >+ <enum name="WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV"/> >+ <enum name="WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV"/> >+ <enum name="WGL_TEXTURE_FLOAT_R_NV"/> >+ <enum name="WGL_TEXTURE_FLOAT_RG_NV"/> >+ <enum name="WGL_TEXTURE_FLOAT_RGB_NV"/> >+ <enum name="WGL_TEXTURE_FLOAT_RGBA_NV"/> >+ </require> >+ </extension> >+ <extension name="WGL_NV_gpu_affinity" supported="wgl"> >+ <require> >+ <enum name="ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV"/> >+ <enum name="ERROR_MISSING_AFFINITY_MASK_NV"/> >+ <command name="wglEnumGpusNV"/> >+ <command name="wglEnumGpuDevicesNV"/> >+ <command name="wglCreateAffinityDCNV"/> >+ <command name="wglEnumGpusFromAffinityDCNV"/> >+ <command name="wglDeleteDCNV"/> >+ </require> >+ </extension> >+ <extension name="WGL_NV_multisample_coverage" supported="wgl"> >+ <require> >+ <enum name="WGL_COVERAGE_SAMPLES_NV"/> >+ <enum name="WGL_COLOR_SAMPLES_NV"/> >+ </require> >+ </extension> >+ <extension name="WGL_NV_present_video" supported="wgl"> >+ <require> >+ <enum name="WGL_NUM_VIDEO_SLOTS_NV"/> >+ <command name="wglEnumerateVideoDevicesNV"/> >+ <command name="wglBindVideoDeviceNV"/> >+ <command name="wglQueryCurrentContextNV"/> >+ </require> >+ </extension> >+ <extension name="WGL_NV_render_depth_texture" supported="wgl"> >+ <require> >+ <enum name="WGL_BIND_TO_TEXTURE_DEPTH_NV"/> >+ <enum name="WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV"/> >+ <enum name="WGL_DEPTH_TEXTURE_FORMAT_NV"/> >+ <enum name="WGL_TEXTURE_DEPTH_COMPONENT_NV"/> >+ <enum name="WGL_DEPTH_COMPONENT_NV"/> >+ </require> >+ </extension> >+ <extension name="WGL_NV_render_texture_rectangle" supported="wgl"> >+ <require> >+ <enum name="WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV"/> >+ <enum name="WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV"/> >+ <enum name="WGL_TEXTURE_RECTANGLE_NV"/> >+ </require> >+ </extension> >+ <extension name="WGL_NV_swap_group" supported="wgl"> >+ <require> >+ <command name="wglJoinSwapGroupNV"/> >+ <command name="wglBindSwapBarrierNV"/> >+ <command name="wglQuerySwapGroupNV"/> >+ <command name="wglQueryMaxSwapGroupsNV"/> >+ <command name="wglQueryFrameCountNV"/> >+ <command name="wglResetFrameCountNV"/> >+ </require> >+ </extension> >+ <extension name="WGL_NV_video_capture" supported="wgl"> >+ <require> >+ <enum name="WGL_UNIQUE_ID_NV"/> >+ <enum name="WGL_NUM_VIDEO_CAPTURE_SLOTS_NV"/> >+ <command name="wglBindVideoCaptureDeviceNV"/> >+ <command name="wglEnumerateVideoCaptureDevicesNV"/> >+ <command name="wglLockVideoCaptureDeviceNV"/> >+ <command name="wglQueryVideoCaptureDeviceNV"/> >+ <command name="wglReleaseVideoCaptureDeviceNV"/> >+ </require> >+ </extension> >+ <extension name="WGL_NV_video_output" supported="wgl"> >+ <require> >+ <enum name="WGL_BIND_TO_VIDEO_RGB_NV"/> >+ <enum name="WGL_BIND_TO_VIDEO_RGBA_NV"/> >+ <enum name="WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV"/> >+ <enum name="WGL_VIDEO_OUT_COLOR_NV"/> >+ <enum name="WGL_VIDEO_OUT_ALPHA_NV"/> >+ <enum name="WGL_VIDEO_OUT_DEPTH_NV"/> >+ <enum name="WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV"/> >+ <enum name="WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV"/> >+ <enum name="WGL_VIDEO_OUT_FRAME"/> >+ <enum name="WGL_VIDEO_OUT_FIELD_1"/> >+ <enum name="WGL_VIDEO_OUT_FIELD_2"/> >+ <enum name="WGL_VIDEO_OUT_STACKED_FIELDS_1_2"/> >+ <enum name="WGL_VIDEO_OUT_STACKED_FIELDS_2_1"/> >+ <command name="wglGetVideoDeviceNV"/> >+ <command name="wglReleaseVideoDeviceNV"/> >+ <command name="wglBindVideoImageNV"/> >+ <command name="wglReleaseVideoImageNV"/> >+ <command name="wglSendPbufferToVideoNV"/> >+ <command name="wglGetVideoInfoNV"/> >+ </require> >+ </extension> >+ <extension name="WGL_NV_vertex_array_range" supported="wgl"> >+ <require> >+ <command name="wglAllocateMemoryNV"/> >+ <command name="wglFreeMemoryNV"/> >+ </require> >+ </extension> >+ <extension name="WGL_OML_sync_control" supported="wgl"> >+ <require> >+ <command name="wglGetSyncValuesOML"/> >+ <command name="wglGetMscRateOML"/> >+ <command name="wglSwapBuffersMscOML"/> >+ <command name="wglSwapLayerBuffersMscOML"/> >+ <command name="wglWaitForMscOML"/> >+ <command name="wglWaitForSbcOML"/> >+ </require> >+ </extension> >+ </extensions> >+</registry> >diff --git a/Source/ThirdParty/ANGLE/src/angle.gyp b/Source/ThirdParty/ANGLE/src/angle.gyp >deleted file mode 100644 >index aa009482b41..00000000000 >--- a/Source/ThirdParty/ANGLE/src/angle.gyp >+++ /dev/null >@@ -1,481 +0,0 @@ >-# Copyright (c) 2012 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. >- >-{ >- 'variables': >- { >- 'angle_code': 1, >- 'angle_gen_path': '<(SHARED_INTERMEDIATE_DIR)/angle', >- 'angle_id_script_base': 'commit_id.py', >- 'angle_id_script': '<(angle_gen_path)/<(angle_id_script_base)', >- 'angle_id_header_base': 'commit.h', >- 'angle_id_header': '<(angle_gen_path)/id/<(angle_id_header_base)', >- 'angle_use_commit_id%': '<!(python <(angle_id_script_base) check ..)', >- 'angle_enable_d3d9%': 0, >- 'angle_enable_d3d11%': 0, >- 'angle_enable_gl%': 0, >- 'angle_enable_gl_null%': 0, >- 'angle_enable_vulkan%': 0, >- 'angle_enable_essl%': 1, # Enable this for all configs by default >- 'angle_enable_glsl%': 1, # Enable this for all configs by default >- 'angle_enable_hlsl%': 0, >- 'angle_link_glx%': 0, >- 'angle_gl_library_type%': 'shared_library', >- 'dcheck_always_on%': 0, >- 'conditions': >- [ >- ['OS=="win"', >- { >- 'angle_enable_gl%': 1, >- 'angle_enable_gl_null%': 1, >- 'angle_enable_d3d9%': 1, >- 'angle_enable_d3d11%': 1, >- 'angle_enable_hlsl%': 1, >- 'angle_enable_vulkan%': 1, >- }], >- ['OS=="linux" and use_x11==1 and chromeos==0', >- { >- 'angle_enable_gl%': 1, >- 'angle_enable_gl_null%': 1, >- 'angle_enable_vulkan%': 1, >- }], >- ['OS=="mac"', >- { >- 'angle_enable_gl%': 1, >- 'angle_enable_gl_null%': 1, >- }], >- ['use_ozone==1', >- { >- 'angle_enable_gl%': 1, >- 'angle_enable_gl_null%': 1, >- }], >- ], >- 'angle_enable_null%': 1, # Available on all platforms >- }, >- 'includes': >- [ >- 'compiler.gypi', >- 'libGLESv2.gypi', >- 'libEGL.gypi', >- 'vulkan_support/vulkan.gypi', >- ], >- >- 'targets': >- [ >- { >- 'target_name': 'angle_common', >- 'type': 'static_library', >- 'includes': [ '../gyp/common_defines.gypi', ], >- 'sources': >- [ >- '<@(libangle_common_sources)', >- ], >- 'include_dirs': >- [ >- '.', >- '../include', >- 'common/third_party/base', >- ], >- 'dependencies': >- [ >- 'commit_id', >- ], >- 'direct_dependent_settings': >- { >- 'include_dirs': >- [ >- '<(angle_path)/include', >- '<(angle_path)/src', >- '<(angle_path)/src/common/third_party/base', >- ], >- 'conditions': >- [ >- ['dcheck_always_on==1', >- { >- 'configurations': >- { >- 'Release_Base': >- { >- 'defines': >- [ >- 'ANGLE_ENABLE_RELEASE_ASSERTS', >- ], >- }, >- }, >- }], >- ['OS=="win"', >- { >- 'configurations': >- { >- 'Debug_Base': >- { >- 'defines': >- [ >- 'ANGLE_ENABLE_DEBUG_ANNOTATIONS' >- ], >- }, >- }, >- }], >- ], >- }, >- 'conditions': >- [ >- ['dcheck_always_on==1', >- { >- 'configurations': >- { >- 'Release_Base': >- { >- 'defines': >- [ >- 'ANGLE_ENABLE_RELEASE_ASSERTS', >- ], >- }, >- }, >- }], >- ['OS=="win"', >- { >- 'configurations': >- { >- 'Debug_Base': >- { >- 'defines': >- [ >- 'ANGLE_ENABLE_DEBUG_ANNOTATIONS' >- ], >- }, >- }, >- 'sources': >- [ >- '<@(libangle_common_win_sources)', >- ], >- }], >- ['OS=="mac"', >- { >- 'sources': >- [ >- '<@(libangle_common_mac_sources)', >- ], >- 'link_settings': >- { >- 'libraries': >- [ >- '$(SDKROOT)/System/Library/Frameworks/IOKit.framework', >- '$(SDKROOT)/System/Library/Frameworks/CoreFoundation.framework', >- ], >- }, >- }], >- ['OS=="linux"', >- { >- 'sources': >- [ >- '<@(libangle_common_linux_sources)', >- ], >- }] >- ], >- }, >- >- { >- 'target_name': 'angle_image_util', >- 'type': 'static_library', >- 'includes': [ '../gyp/common_defines.gypi', ], >- 'sources': >- [ >- '<@(libangle_image_util_sources)', >- ], >- 'include_dirs': >- [ >- '.', >- '../include', >- ], >- 'dependencies': >- [ >- 'angle_common', >- ], >- 'direct_dependent_settings': >- { >- 'include_dirs': >- [ >- '<(angle_path)/include', >- '<(angle_path)/src', >- ], >- }, >- }, >- >- { >- 'target_name': 'angle_gpu_info_util', >- 'type': 'static_library', >- 'includes': [ '../gyp/common_defines.gypi', ], >- 'sources': >- [ >- '<@(libangle_gpu_info_util_sources)', >- ], >- 'include_dirs': >- [ >- '.', >- '../include', >- ], >- 'dependencies': >- [ >- 'angle_common', >- ], >- 'direct_dependent_settings': >- { >- 'include_dirs': >- [ >- '<(angle_path)/include', >- '<(angle_path)/src', >- ], >- }, >- 'conditions': >- [ >- ['OS=="win"', >- { >- 'sources': >- [ >- '<@(libangle_gpu_info_util_win_sources)', >- ], >- }], >- ['OS=="win" and angle_build_winrt==0', >- { >- 'link_settings': >- { >- 'msvs_settings': >- { >- 'VCLinkerTool': >- { >- 'AdditionalDependencies': >- [ >- 'setupapi.lib' >- ] >- } >- } >- }, >- 'defines': >- [ >- 'GPU_INFO_USE_SETUPAPI', >- ], >- }, >- { >- 'link_settings': >- { >- 'msvs_settings': >- { >- 'VCLinkerTool': >- { >- 'AdditionalDependencies': >- [ >- 'dxgi.lib' >- ] >- } >- } >- }, >- 'defines': >- [ >- 'GPU_INFO_USE_DXGI', >- ], >- }], >- ['OS=="linux"', >- { >- 'sources': >- [ >- '<@(libangle_gpu_info_util_linux_sources)', >- ], >- }], >- ['OS=="linux" and use_x11==1', >- { >- 'sources': >- [ >- '<@(libangle_gpu_info_util_x11_sources)', >- ], >- 'defines': >- [ >- 'GPU_INFO_USE_X11', >- ], >- 'dependencies': >- [ >- '<(angle_path)/src/third_party/libXNVCtrl/libXNVCtrl.gyp:libXNVCtrl', >- ], >- 'link_settings': >- { >- 'ldflags': >- [ >- '<!@(<(pkg-config) --libs-only-L --libs-only-other x11 xi xext)', >- ], >- 'libraries': >- [ >- '<!@(<(pkg-config) --libs-only-l x11 xi xext) -ldl', >- ], >- }, >- }], >- ['OS=="linux" and use_libpci==1', >- { >- 'sources': >- [ >- '<@(libangle_gpu_info_util_libpci_sources)', >- ], >- 'defines': >- [ >- 'GPU_INFO_USE_LIBPCI', >- ], >- 'link_settings': >- { >- 'ldflags': >- [ >- '<!@(<(pkg-config) --libs-only-L --libs-only-other libpci)', >- ], >- 'libraries': >- [ >- '<!@(<(pkg-config) --libs-only-l libpci)', >- ], >- }, >- }], >- ['OS=="mac"', >- { >- 'sources': >- [ >- '<@(libangle_gpu_info_util_mac_sources)', >- ], >- }], >- ], >- }, >- >- { >- 'target_name': 'copy_scripts', >- 'type': 'none', >- 'includes': [ '../gyp/common_defines.gypi', ], >- 'hard_dependency': 1, >- 'copies': >- [ >- { >- 'destination': '<(angle_gen_path)', >- 'files': [ 'copy_compiler_dll.bat', '<(angle_id_script_base)' ], >- }, >- ], >- 'conditions': >- [ >- ['angle_build_winrt==1', >- { >- 'type' : 'shared_library', >- }], >- ], >- }, >- ], >- 'conditions': >- [ >- ['angle_use_commit_id!=0', >- { >- 'targets': >- [ >- { >- 'target_name': 'commit_id', >- 'type': 'none', >- 'includes': [ '../gyp/common_defines.gypi', ], >- 'dependencies': [ 'copy_scripts', ], >- 'hard_dependency': 1, >- 'actions': >- [ >- { >- 'action_name': 'Generate ANGLE Commit ID Header', >- 'message': 'Generating ANGLE Commit ID', >- # reference the git index as an input, so we rebuild on changes to the index >- 'inputs': [ '<(angle_id_script)', '<(angle_path)/.git/index' ], >- 'outputs': [ '<(angle_id_header)' ], >- 'msvs_cygwin_shell': 0, >- 'action': >- [ >- 'python', '<(angle_id_script)', 'gen', '<(angle_path)', '<(angle_id_header)' >- ], >- }, >- ], >- 'all_dependent_settings': >- { >- 'include_dirs': >- [ >- '<(angle_gen_path)', >- ], >- }, >- 'conditions': >- [ >- ['angle_build_winrt==1', >- { >- 'type' : 'shared_library', >- }], >- ], >- } >- ] >- }, >- { # angle_use_commit_id==0 >- 'targets': >- [ >- { >- 'target_name': 'commit_id', >- 'type': 'none', >- 'hard_dependency': 1, >- 'includes': [ '../gyp/common_defines.gypi', ], >- 'copies': >- [ >- { >- 'destination': '<(angle_gen_path)/id', >- 'files': [ '<(angle_id_header_base)' ] >- } >- ], >- 'all_dependent_settings': >- { >- 'include_dirs': >- [ >- '<(angle_gen_path)', >- ], >- }, >- 'conditions': >- [ >- ['angle_build_winrt==1', >- { >- 'type' : 'shared_library', >- }], >- ], >- } >- ] >- }], >- ['OS=="win"', >- { >- 'targets': >- [ >- { >- 'target_name': 'copy_compiler_dll', >- 'type': 'none', >- 'dependencies': [ 'copy_scripts', ], >- 'includes': [ '../gyp/common_defines.gypi', ], >- 'conditions': >- [ >- ['angle_build_winrt==0', >- { >- 'actions': >- [ >- { >- 'action_name': 'copy_dll', >- 'message': 'Copying D3D Compiler DLL...', >- 'msvs_cygwin_shell': 0, >- 'inputs': [ 'copy_compiler_dll.bat' ], >- 'outputs': [ '<(PRODUCT_DIR)/d3dcompiler_47.dll' ], >- 'action': >- [ >- "<(angle_gen_path)/copy_compiler_dll.bat", >- "$(PlatformName)", >- "<(windows_sdk_path)", >- "<(PRODUCT_DIR)" >- ], >- }, >- ], #actions >- }], >- ['angle_build_winrt==1', >- { >- 'type' : 'shared_library', >- }], >- ] >- }, >- ], # targets >- }], >- ] # conditions >-} >diff --git a/Source/ThirdParty/ANGLE/src/commit_id.py b/Source/ThirdParty/ANGLE/src/commit_id.py >index bbdb810ce00..a430103be86 100644 >--- a/Source/ThirdParty/ANGLE/src/commit_id.py >+++ b/Source/ThirdParty/ANGLE/src/commit_id.py >@@ -1,3 +1,11 @@ >+#!/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 commit.h with git commit hash. >+# >+ > import subprocess as sp > import sys > import os >@@ -23,6 +31,9 @@ if operation == 'check': > print("0") > sys.exit(0) > >+if len(sys.argv) < 4 or operation != 'gen': >+ sys.exit(usage) >+ > output_file = sys.argv[3] > commit_id_size = 12 > >diff --git a/Source/ThirdParty/ANGLE/src/common/Color.h b/Source/ThirdParty/ANGLE/src/common/Color.h >index 2b4d2f6fba4..e1de358708e 100644 >--- a/Source/ThirdParty/ANGLE/src/common/Color.h >+++ b/Source/ThirdParty/ANGLE/src/common/Color.h >@@ -9,19 +9,33 @@ > #ifndef COMMON_COLOR_H_ > #define COMMON_COLOR_H_ > >+#include <cstdint> >+ > namespace angle > { > > template <typename T> > struct Color > { >+ Color(); >+ constexpr Color(T r, T g, T b, T a); >+ >+ const T *data() const { return &red; } >+ T *ptr() { return &red; } >+ >+ static Color fromData(const T *data) { return Color(data[0], data[1], data[2], data[3]); } >+ void writeData(T *data) const >+ { >+ data[0] = red; >+ data[1] = green; >+ data[2] = blue; >+ data[3] = alpha; >+ } >+ > T red; > T green; > T blue; > T alpha; >- >- Color(); >- Color(T r, T g, T b, T a); > }; > > template <typename T> >@@ -34,6 +48,42 @@ typedef Color<float> ColorF; > typedef Color<int> ColorI; > typedef Color<unsigned int> ColorUI; > >+struct ColorGeneric >+{ >+ inline ColorGeneric(); >+ inline ColorGeneric(const ColorF &color); >+ inline ColorGeneric(const ColorI &color); >+ inline ColorGeneric(const ColorUI &color); >+ >+ enum class Type : uint8_t >+ { >+ Float = 0, >+ Int = 1, >+ UInt = 2 >+ }; >+ >+ union >+ { >+ ColorF colorF; >+ ColorI colorI; >+ ColorUI colorUI; >+ }; >+ >+ Type type; >+}; >+ >+inline bool operator==(const ColorGeneric &a, const ColorGeneric &b); >+ >+inline bool operator!=(const ColorGeneric &a, const ColorGeneric &b); >+ >+struct DepthStencil >+{ >+ DepthStencil() : depth(0), stencil(0) {} >+ >+ // Double is needed to represent the 32-bit integer range of GL_DEPTH_COMPONENT32. >+ double depth; >+ uint32_t stencil; >+}; > } // namespace angle > > // TODO: Move this fully into the angle namespace >@@ -41,10 +91,11 @@ namespace gl > { > > template <typename T> >-using Color = angle::Color<T>; >-using ColorF = angle::ColorF; >-using ColorI = angle::ColorI; >-using ColorUI = angle::ColorUI; >+using Color = angle::Color<T>; >+using ColorF = angle::ColorF; >+using ColorI = angle::ColorI; >+using ColorUI = angle::ColorUI; >+using ColorGeneric = angle::ColorGeneric; > > } // namespace gl > >diff --git a/Source/ThirdParty/ANGLE/src/common/Color.inl b/Source/ThirdParty/ANGLE/src/common/Color.inl >index c3073256b58..8ce6fcf8984 100644 >--- a/Source/ThirdParty/ANGLE/src/common/Color.inl >+++ b/Source/ThirdParty/ANGLE/src/common/Color.inl >@@ -15,7 +15,7 @@ Color<T>::Color() : Color(0, 0, 0, 0) > } > > template <typename T> >-Color<T>::Color(T r, T g, T b, T a) : red(r), green(g), blue(b), alpha(a) >+constexpr Color<T>::Color(T r, T g, T b, T a) : red(r), green(g), blue(b), alpha(a) > { > } > >@@ -34,4 +34,36 @@ bool operator!=(const Color<T> &a, const Color<T> &b) > return !(a == b); > } > >+ >+ColorGeneric::ColorGeneric() : colorF(), type(Type::Float) {} >+ >+ColorGeneric::ColorGeneric(const ColorF &color) : colorF(color), type(Type::Float) {} >+ >+ColorGeneric::ColorGeneric(const ColorI &color) : colorI(color), type(Type::Int) {} >+ >+ColorGeneric::ColorGeneric(const ColorUI &color) : colorUI(color), type(Type::UInt) {} >+ >+bool operator==(const ColorGeneric &a, const ColorGeneric &b) >+{ >+ if (a.type != b.type) >+ { >+ return false; >+ } >+ switch (a.type) >+ { >+ default: >+ case ColorGeneric::Type::Float: >+ return a.colorF == b.colorF; >+ case ColorGeneric::Type::Int: >+ return a.colorI == b.colorI; >+ case ColorGeneric::Type::UInt: >+ return a.colorUI == b.colorUI; >+ } >+} >+ >+bool operator!=(const ColorGeneric &a, const ColorGeneric &b) >+{ >+ return !(a == b); >+} >+ > } // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/common/FastVector.h b/Source/ThirdParty/ANGLE/src/common/FastVector.h >new file mode 100644 >index 00000000000..7c86a288fc4 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/FastVector.h >@@ -0,0 +1,434 @@ >+// >+// 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. >+// >+// FastVector.h: >+// A vector class with a initial fixed size and variable growth. >+// Based on FixedVector. >+// >+ >+#ifndef COMMON_FASTVECTOR_H_ >+#define COMMON_FASTVECTOR_H_ >+ >+#include "common/debug.h" >+ >+#include <algorithm> >+#include <array> >+#include <initializer_list> >+ >+namespace angle >+{ >+template <class T, size_t N, class Storage = std::array<T, N>> >+class FastVector final >+{ >+ public: >+ using value_type = typename Storage::value_type; >+ using size_type = typename Storage::size_type; >+ using reference = typename Storage::reference; >+ using const_reference = typename Storage::const_reference; >+ using pointer = typename Storage::pointer; >+ using const_pointer = typename Storage::const_pointer; >+ using iterator = T *; >+ using const_iterator = const T *; >+ >+ FastVector(); >+ FastVector(size_type count, const value_type &value); >+ FastVector(size_type count); >+ >+ FastVector(const FastVector<T, N, Storage> &other); >+ FastVector(FastVector<T, N, Storage> &&other); >+ FastVector(std::initializer_list<value_type> init); >+ >+ FastVector<T, N, Storage> &operator=(const FastVector<T, N, Storage> &other); >+ FastVector<T, N, Storage> &operator=(FastVector<T, N, Storage> &&other); >+ FastVector<T, N, Storage> &operator=(std::initializer_list<value_type> init); >+ >+ ~FastVector(); >+ >+ reference at(size_type pos); >+ const_reference at(size_type pos) const; >+ >+ reference operator[](size_type pos); >+ const_reference operator[](size_type pos) const; >+ >+ pointer data(); >+ const_pointer data() const; >+ >+ iterator begin(); >+ const_iterator begin() const; >+ >+ iterator end(); >+ const_iterator end() const; >+ >+ bool empty() const; >+ size_type size() const; >+ >+ void clear(); >+ >+ void push_back(const value_type &value); >+ void push_back(value_type &&value); >+ >+ void pop_back(); >+ >+ reference front(); >+ const_reference front() const; >+ >+ reference back(); >+ const_reference back() const; >+ >+ void swap(FastVector<T, N, Storage> &other); >+ >+ void resize(size_type count); >+ void resize(size_type count, const value_type &value); >+ >+ // Specialty function that removes a known element and might shuffle the list. >+ void remove_and_permute(const value_type &element); >+ >+ private: >+ void assign_from_initializer_list(std::initializer_list<value_type> init); >+ void ensure_capacity(size_t capacity); >+ bool uses_fixed_storage() const; >+ >+ Storage mFixedStorage; >+ pointer mData = mFixedStorage.data(); >+ size_type mSize = 0; >+ size_type mReservedSize = N; >+}; >+ >+template <class T, size_t N, class StorageN, size_t M, class StorageM> >+bool operator==(const FastVector<T, N, StorageN> &a, const FastVector<T, M, StorageM> &b) >+{ >+ return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin()); >+} >+ >+template <class T, size_t N, class StorageN, size_t M, class StorageM> >+bool operator!=(const FastVector<T, N, StorageN> &a, const FastVector<T, M, StorageM> &b) >+{ >+ return !(a == b); >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE bool FastVector<T, N, Storage>::uses_fixed_storage() const >+{ >+ return mData == mFixedStorage.data(); >+} >+ >+template <class T, size_t N, class Storage> >+FastVector<T, N, Storage>::FastVector() >+{} >+ >+template <class T, size_t N, class Storage> >+FastVector<T, N, Storage>::FastVector(size_type count, const value_type &value) >+{ >+ ensure_capacity(count); >+ mSize = count; >+ std::fill(begin(), end(), value); >+} >+ >+template <class T, size_t N, class Storage> >+FastVector<T, N, Storage>::FastVector(size_type count) >+{ >+ ensure_capacity(count); >+ mSize = count; >+} >+ >+template <class T, size_t N, class Storage> >+FastVector<T, N, Storage>::FastVector(const FastVector<T, N, Storage> &other) >+{ >+ ensure_capacity(other.mSize); >+ mSize = other.mSize; >+ std::copy(other.begin(), other.end(), begin()); >+} >+ >+template <class T, size_t N, class Storage> >+FastVector<T, N, Storage>::FastVector(FastVector<T, N, Storage> &&other) : FastVector() >+{ >+ swap(other); >+} >+ >+template <class T, size_t N, class Storage> >+FastVector<T, N, Storage>::FastVector(std::initializer_list<value_type> init) >+{ >+ assign_from_initializer_list(init); >+} >+ >+template <class T, size_t N, class Storage> >+FastVector<T, N, Storage> &FastVector<T, N, Storage>::operator=( >+ const FastVector<T, N, Storage> &other) >+{ >+ ensure_capacity(other.mSize); >+ mSize = other.mSize; >+ std::copy(other.begin(), other.end(), begin()); >+ return *this; >+} >+ >+template <class T, size_t N, class Storage> >+FastVector<T, N, Storage> &FastVector<T, N, Storage>::operator=(FastVector<T, N, Storage> &&other) >+{ >+ swap(*this, other); >+ return *this; >+} >+ >+template <class T, size_t N, class Storage> >+FastVector<T, N, Storage> &FastVector<T, N, Storage>::operator=( >+ std::initializer_list<value_type> init) >+{ >+ assign_from_initializer_list(init); >+ return *this; >+} >+ >+template <class T, size_t N, class Storage> >+FastVector<T, N, Storage>::~FastVector() >+{ >+ clear(); >+ if (!uses_fixed_storage()) >+ { >+ delete[] mData; >+ } >+} >+ >+template <class T, size_t N, class Storage> >+typename FastVector<T, N, Storage>::reference FastVector<T, N, Storage>::at(size_type pos) >+{ >+ ASSERT(pos < mSize); >+ return mData[pos]; >+} >+ >+template <class T, size_t N, class Storage> >+typename FastVector<T, N, Storage>::const_reference FastVector<T, N, Storage>::at( >+ size_type pos) const >+{ >+ ASSERT(pos < mSize); >+ return mData[pos]; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE typename FastVector<T, N, Storage>::reference FastVector<T, N, Storage>::operator[]( >+ size_type pos) >+{ >+ ASSERT(pos < mSize); >+ return mData[pos]; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE >+ typename FastVector<T, N, Storage>::const_reference FastVector<T, N, Storage>::operator[]( >+ size_type pos) const >+{ >+ ASSERT(pos < mSize); >+ return mData[pos]; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE typename FastVector<T, N, Storage>::const_pointer >+angle::FastVector<T, N, Storage>::data() const >+{ >+ ASSERT(!empty()); >+ return mData; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE typename FastVector<T, N, Storage>::pointer angle::FastVector<T, N, Storage>::data() >+{ >+ ASSERT(!empty()); >+ return mData; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE typename FastVector<T, N, Storage>::iterator FastVector<T, N, Storage>::begin() >+{ >+ return mData; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE typename FastVector<T, N, Storage>::const_iterator FastVector<T, N, Storage>::begin() >+ const >+{ >+ return mData; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE typename FastVector<T, N, Storage>::iterator FastVector<T, N, Storage>::end() >+{ >+ return mData + mSize; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE typename FastVector<T, N, Storage>::const_iterator FastVector<T, N, Storage>::end() >+ const >+{ >+ return mData + mSize; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE bool FastVector<T, N, Storage>::empty() const >+{ >+ return mSize == 0; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE typename FastVector<T, N, Storage>::size_type FastVector<T, N, Storage>::size() const >+{ >+ return mSize; >+} >+ >+template <class T, size_t N, class Storage> >+void FastVector<T, N, Storage>::clear() >+{ >+ resize(0); >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE void FastVector<T, N, Storage>::push_back(const value_type &value) >+{ >+ if (mSize == mReservedSize) >+ ensure_capacity(mSize + 1); >+ mData[mSize++] = value; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE void FastVector<T, N, Storage>::push_back(value_type &&value) >+{ >+ if (mSize == mReservedSize) >+ ensure_capacity(mSize + 1); >+ mData[mSize++] = std::move(value); >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE void FastVector<T, N, Storage>::pop_back() >+{ >+ ASSERT(mSize > 0); >+ mSize--; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE typename FastVector<T, N, Storage>::reference FastVector<T, N, Storage>::front() >+{ >+ ASSERT(mSize > 0); >+ return mData[0]; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE typename FastVector<T, N, Storage>::const_reference FastVector<T, N, Storage>::front() >+ const >+{ >+ ASSERT(mSize > 0); >+ return mData[0]; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE typename FastVector<T, N, Storage>::reference FastVector<T, N, Storage>::back() >+{ >+ ASSERT(mSize > 0); >+ return mData[mSize - 1]; >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE typename FastVector<T, N, Storage>::const_reference FastVector<T, N, Storage>::back() >+ const >+{ >+ ASSERT(mSize > 0); >+ return mData[mSize - 1]; >+} >+ >+template <class T, size_t N, class Storage> >+void FastVector<T, N, Storage>::swap(FastVector<T, N, Storage> &other) >+{ >+ std::swap(mSize, other.mSize); >+ >+ pointer tempData = other.mData; >+ if (uses_fixed_storage()) >+ other.mData = other.mFixedStorage.data(); >+ else >+ other.mData = mData; >+ if (tempData == other.mFixedStorage.data()) >+ mData = mFixedStorage.data(); >+ else >+ mData = tempData; >+ std::swap(mReservedSize, other.mReservedSize); >+ >+ if (uses_fixed_storage() || other.uses_fixed_storage()) >+ std::swap(mFixedStorage, other.mFixedStorage); >+} >+ >+template <class T, size_t N, class Storage> >+void FastVector<T, N, Storage>::resize(size_type count) >+{ >+ if (count > mSize) >+ { >+ ensure_capacity(count); >+ } >+ mSize = count; >+} >+ >+template <class T, size_t N, class Storage> >+void FastVector<T, N, Storage>::resize(size_type count, const value_type &value) >+{ >+ if (count > mSize) >+ { >+ ensure_capacity(count); >+ std::fill(mData + mSize, mData + count, value); >+ } >+ mSize = count; >+} >+ >+template <class T, size_t N, class Storage> >+void FastVector<T, N, Storage>::assign_from_initializer_list(std::initializer_list<value_type> init) >+{ >+ ensure_capacity(init.size()); >+ mSize = init.size(); >+ size_t index = 0; >+ for (auto &value : init) >+ { >+ mData[index++] = value; >+ } >+} >+ >+template <class T, size_t N, class Storage> >+ANGLE_INLINE void FastVector<T, N, Storage>::remove_and_permute(const value_type &element) >+{ >+ size_t len = mSize - 1; >+ for (size_t index = 0; index < len; ++index) >+ { >+ if (mData[index] == element) >+ { >+ mData[index] = std::move(mData[len]); >+ break; >+ } >+ } >+ pop_back(); >+} >+ >+template <class T, size_t N, class Storage> >+void FastVector<T, N, Storage>::ensure_capacity(size_t capacity) >+{ >+ // We have a minimum capacity of N. >+ if (mReservedSize < capacity) >+ { >+ ASSERT(capacity > N); >+ size_type newSize = std::max(mReservedSize, N); >+ while (newSize < capacity) >+ { >+ newSize *= 2; >+ } >+ >+ pointer newData = new value_type[newSize]; >+ >+ if (mSize > 0) >+ { >+ std::move(begin(), end(), newData); >+ } >+ >+ if (!uses_fixed_storage()) >+ { >+ delete[] mData; >+ } >+ >+ mData = newData; >+ mReservedSize = newSize; >+ } >+} >+} // namespace angle >+ >+#endif // COMMON_FASTVECTOR_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/FastVector_unittest.cpp b/Source/ThirdParty/ANGLE/src/common/FastVector_unittest.cpp >new file mode 100644 >index 00000000000..d5b7c3bbf86 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/FastVector_unittest.cpp >@@ -0,0 +1,236 @@ >+// >+// 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. >+// >+// FixedVector_unittest: >+// Tests of the FastVector class >+// >+ >+#include <gtest/gtest.h> >+ >+#include "common/FastVector.h" >+ >+namespace angle >+{ >+// Make sure the various constructors compile and do basic checks >+TEST(FastVector, Constructors) >+{ >+ FastVector<int, 5> defaultContructor; >+ EXPECT_EQ(0u, defaultContructor.size()); >+ >+ FastVector<int, 5> count(3); >+ EXPECT_EQ(3u, count.size()); >+ >+ FastVector<int, 5> countAndValue(3, 2); >+ EXPECT_EQ(3u, countAndValue.size()); >+ EXPECT_EQ(2, countAndValue[1]); >+ >+ FastVector<int, 5> copy(countAndValue); >+ EXPECT_EQ(copy, countAndValue); >+ >+ FastVector<int, 5> copyRValue(std::move(count)); >+ EXPECT_EQ(3u, copyRValue.size()); >+ >+ FastVector<int, 5> initializerList{1, 2, 3, 4, 5}; >+ EXPECT_EQ(5u, initializerList.size()); >+ EXPECT_EQ(3, initializerList[2]); >+ >+ FastVector<int, 5> assignCopy(copyRValue); >+ EXPECT_EQ(3u, assignCopy.size()); >+ >+ FastVector<int, 5> assignRValue(std::move(assignCopy)); >+ EXPECT_EQ(3u, assignRValue.size()); >+ >+ FastVector<int, 5> assignmentInitializerList = {1, 2, 3, 4, 5}; >+ EXPECT_EQ(5u, assignmentInitializerList.size()); >+ EXPECT_EQ(3, assignmentInitializerList[2]); >+} >+ >+// Test indexing operations (at, operator[]) >+TEST(FastVector, Indexing) >+{ >+ FastVector<int, 5> vec = {0, 1, 2, 3, 4}; >+ for (int i = 0; i < 5; ++i) >+ { >+ EXPECT_EQ(i, vec.at(i)); >+ EXPECT_EQ(vec[i], vec.at(i)); >+ } >+} >+ >+// Test the push_back functions >+TEST(FastVector, PushBack) >+{ >+ FastVector<int, 5> vec; >+ vec.push_back(1); >+ EXPECT_EQ(1, vec[0]); >+ vec.push_back(1); >+ vec.push_back(1); >+ vec.push_back(1); >+ vec.push_back(1); >+ EXPECT_EQ(5u, vec.size()); >+} >+ >+// Tests growing the fast vector beyond the fixed storage. >+TEST(FastVector, Growth) >+{ >+ constexpr size_t kSize = 4; >+ FastVector<size_t, kSize> vec; >+ >+ for (size_t i = 0; i < kSize * 2; ++i) >+ { >+ vec.push_back(i); >+ } >+ >+ EXPECT_EQ(kSize * 2, vec.size()); >+ >+ for (size_t i = kSize * 2; i > 0; --i) >+ { >+ ASSERT_EQ(vec.back(), i - 1); >+ vec.pop_back(); >+ } >+ >+ EXPECT_EQ(0u, vec.size()); >+} >+ >+// Test the pop_back function >+TEST(FastVector, PopBack) >+{ >+ FastVector<int, 5> vec; >+ vec.push_back(1); >+ EXPECT_EQ(1, (int)vec.size()); >+ vec.pop_back(); >+ EXPECT_EQ(0, (int)vec.size()); >+} >+ >+// Test the back function >+TEST(FastVector, Back) >+{ >+ FastVector<int, 5> vec; >+ vec.push_back(1); >+ vec.push_back(2); >+ EXPECT_EQ(2, vec.back()); >+} >+ >+// Test the back function >+TEST(FastVector, Front) >+{ >+ FastVector<int, 5> vec; >+ vec.push_back(1); >+ vec.push_back(2); >+ EXPECT_EQ(1, vec.front()); >+} >+ >+// Test the sizing operations >+TEST(FastVector, Size) >+{ >+ FastVector<int, 5> vec; >+ EXPECT_TRUE(vec.empty()); >+ EXPECT_EQ(0u, vec.size()); >+ >+ vec.push_back(1); >+ EXPECT_FALSE(vec.empty()); >+ EXPECT_EQ(1u, vec.size()); >+} >+ >+// Test clearing the vector >+TEST(FastVector, Clear) >+{ >+ FastVector<int, 5> vec = {0, 1, 2, 3, 4}; >+ vec.clear(); >+ EXPECT_TRUE(vec.empty()); >+} >+ >+// Test clearing the vector larger than the fixed size. >+TEST(FastVector, ClearWithLargerThanFixedSize) >+{ >+ FastVector<int, 3> vec = {0, 1, 2, 3, 4}; >+ vec.clear(); >+ EXPECT_TRUE(vec.empty()); >+} >+ >+// Test resizing the vector >+TEST(FastVector, Resize) >+{ >+ FastVector<int, 5> vec; >+ vec.resize(5u, 1); >+ EXPECT_EQ(5u, vec.size()); >+ for (int i : vec) >+ { >+ EXPECT_EQ(1, i); >+ } >+ >+ vec.resize(2u); >+ EXPECT_EQ(2u, vec.size()); >+ for (int i : vec) >+ { >+ EXPECT_EQ(1, i); >+ } >+ >+ // Resize to larger than minimum >+ vec.resize(10u, 2); >+ EXPECT_EQ(10u, vec.size()); >+ >+ for (size_t index = 0; index < 2u; ++index) >+ { >+ EXPECT_EQ(1, vec[index]); >+ } >+ for (size_t index = 2u; index < 10u; ++index) >+ { >+ EXPECT_EQ(2, vec[index]); >+ } >+ >+ // Resize back to smaller >+ vec.resize(2u, 2); >+ EXPECT_EQ(2u, vec.size()); >+} >+ >+// Test iterating over the vector >+TEST(FastVector, Iteration) >+{ >+ FastVector<int, 5> vec = {0, 1, 2, 3}; >+ >+ int vistedCount = 0; >+ for (int value : vec) >+ { >+ EXPECT_EQ(vistedCount, value); >+ vistedCount++; >+ } >+ EXPECT_EQ(4, vistedCount); >+} >+ >+// Tests that equality comparisons work even if reserved size differs. >+TEST(FastVector, EqualityWithDifferentReservedSizes) >+{ >+ FastVector<int, 3> vec1 = {1, 2, 3, 4, 5}; >+ FastVector<int, 5> vec2 = {1, 2, 3, 4, 5}; >+ EXPECT_EQ(vec1, vec2); >+ vec2.push_back(6); >+ EXPECT_NE(vec1, vec2); >+} >+ >+// Tests vector operations with a non copyable type. >+TEST(FastVector, NonCopyable) >+{ >+ struct s : angle::NonCopyable >+ { >+ s() : x(0) {} >+ s(int xin) : x(xin) {} >+ s(s &&other) : x(other.x) {} >+ s &operator=(s &&other) >+ { >+ x = other.x; >+ return *this; >+ } >+ int x; >+ }; >+ >+ FastVector<s, 3> vec; >+ vec.push_back(3); >+ EXPECT_EQ(3, vec[0].x); >+ >+ FastVector<s, 3> copy = std::move(vec); >+ EXPECT_EQ(1u, copy.size()); >+ EXPECT_EQ(3, copy[0].x); >+} >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/common/FixedVector.h b/Source/ThirdParty/ANGLE/src/common/FixedVector.h >new file mode 100644 >index 00000000000..764e1ad1944 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/FixedVector.h >@@ -0,0 +1,341 @@ >+// >+// 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. >+// >+// FixedVector.h: >+// A vector class with a maximum size and fixed storage. >+// >+ >+#ifndef COMMON_FIXEDVECTOR_H_ >+#define COMMON_FIXEDVECTOR_H_ >+ >+#include "common/debug.h" >+ >+#include <algorithm> >+#include <array> >+#include <initializer_list> >+ >+namespace angle >+{ >+template <class T, size_t N, class Storage = std::array<T, N>> >+class FixedVector final >+{ >+ public: >+ using value_type = typename Storage::value_type; >+ using size_type = typename Storage::size_type; >+ using reference = typename Storage::reference; >+ using const_reference = typename Storage::const_reference; >+ using pointer = typename Storage::pointer; >+ using const_pointer = typename Storage::const_pointer; >+ using iterator = typename Storage::iterator; >+ using const_iterator = typename Storage::const_iterator; >+ using reverse_iterator = typename Storage::reverse_iterator; >+ using const_reverse_iterator = typename Storage::const_reverse_iterator; >+ >+ FixedVector(); >+ FixedVector(size_type count, const value_type &value); >+ FixedVector(size_type count); >+ >+ FixedVector(const FixedVector<T, N, Storage> &other); >+ FixedVector(FixedVector<T, N, Storage> &&other); >+ FixedVector(std::initializer_list<value_type> init); >+ >+ FixedVector<T, N, Storage> &operator=(const FixedVector<T, N, Storage> &other); >+ FixedVector<T, N, Storage> &operator=(FixedVector<T, N, Storage> &&other); >+ FixedVector<T, N, Storage> &operator=(std::initializer_list<value_type> init); >+ >+ ~FixedVector(); >+ >+ reference at(size_type pos); >+ const_reference at(size_type pos) const; >+ >+ reference operator[](size_type pos); >+ const_reference operator[](size_type pos) const; >+ >+ pointer data(); >+ const_pointer data() const; >+ >+ iterator begin(); >+ const_iterator begin() const; >+ >+ iterator end(); >+ const_iterator end() const; >+ >+ bool empty() const; >+ size_type size() const; >+ size_type max_size() const; >+ >+ void clear(); >+ >+ void push_back(const value_type &value); >+ void push_back(value_type &&value); >+ >+ void pop_back(); >+ reference back(); >+ const_reference back() const; >+ >+ void swap(FixedVector<T, N, Storage> &other); >+ >+ void resize(size_type count); >+ void resize(size_type count, const value_type &value); >+ >+ bool full() const; >+ >+ private: >+ void assign_from_initializer_list(std::initializer_list<value_type> init); >+ >+ Storage mStorage; >+ size_type mSize = 0; >+}; >+ >+template <class T, size_t N, class Storage> >+bool operator==(const FixedVector<T, N, Storage> &a, const FixedVector<T, N, Storage> &b) >+{ >+ return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin()); >+} >+ >+template <class T, size_t N, class Storage> >+bool operator!=(const FixedVector<T, N, Storage> &a, const FixedVector<T, N, Storage> &b) >+{ >+ return !(a == b); >+} >+ >+template <class T, size_t N, class Storage> >+FixedVector<T, N, Storage>::FixedVector() = default; >+ >+template <class T, size_t N, class Storage> >+FixedVector<T, N, Storage>::FixedVector(size_type count, const value_type &value) : mSize(count) >+{ >+ ASSERT(count <= N); >+ std::fill(mStorage.begin(), mStorage.begin() + count, value); >+} >+ >+template <class T, size_t N, class Storage> >+FixedVector<T, N, Storage>::FixedVector(size_type count) : mSize(count) >+{ >+ ASSERT(count <= N); >+} >+ >+template <class T, size_t N, class Storage> >+FixedVector<T, N, Storage>::FixedVector(const FixedVector<T, N, Storage> &other) = default; >+ >+template <class T, size_t N, class Storage> >+FixedVector<T, N, Storage>::FixedVector(FixedVector<T, N, Storage> &&other) = default; >+ >+template <class T, size_t N, class Storage> >+FixedVector<T, N, Storage>::FixedVector(std::initializer_list<value_type> init) >+{ >+ ASSERT(init.size() <= N); >+ assign_from_initializer_list(init); >+} >+ >+template <class T, size_t N, class Storage> >+FixedVector<T, N, Storage> &FixedVector<T, N, Storage>::operator=( >+ const FixedVector<T, N, Storage> &other) = default; >+ >+template <class T, size_t N, class Storage> >+FixedVector<T, N, Storage> &FixedVector<T, N, Storage>::operator=( >+ FixedVector<T, N, Storage> &&other) = default; >+ >+template <class T, size_t N, class Storage> >+FixedVector<T, N, Storage> &FixedVector<T, N, Storage>::operator=( >+ std::initializer_list<value_type> init) >+{ >+ clear(); >+ ASSERT(init.size() <= N); >+ assign_from_initializer_list(init); >+ return this; >+} >+ >+template <class T, size_t N, class Storage> >+FixedVector<T, N, Storage>::~FixedVector() >+{ >+ clear(); >+} >+ >+template <class T, size_t N, class Storage> >+typename FixedVector<T, N, Storage>::reference FixedVector<T, N, Storage>::at(size_type pos) >+{ >+ ASSERT(pos < N); >+ return mStorage.at(pos); >+} >+ >+template <class T, size_t N, class Storage> >+typename FixedVector<T, N, Storage>::const_reference FixedVector<T, N, Storage>::at( >+ size_type pos) const >+{ >+ ASSERT(pos < N); >+ return mStorage.at(pos); >+} >+ >+template <class T, size_t N, class Storage> >+typename FixedVector<T, N, Storage>::reference FixedVector<T, N, Storage>::operator[](size_type pos) >+{ >+ ASSERT(pos < N); >+ return mStorage[pos]; >+} >+ >+template <class T, size_t N, class Storage> >+typename FixedVector<T, N, Storage>::const_reference FixedVector<T, N, Storage>::operator[]( >+ size_type pos) const >+{ >+ ASSERT(pos < N); >+ return mStorage[pos]; >+} >+ >+template <class T, size_t N, class Storage> >+typename FixedVector<T, N, Storage>::const_pointer angle::FixedVector<T, N, Storage>::data() const >+{ >+ return mStorage.data(); >+} >+ >+template <class T, size_t N, class Storage> >+typename FixedVector<T, N, Storage>::pointer angle::FixedVector<T, N, Storage>::data() >+{ >+ return mStorage.data(); >+} >+ >+template <class T, size_t N, class Storage> >+typename FixedVector<T, N, Storage>::iterator FixedVector<T, N, Storage>::begin() >+{ >+ return mStorage.begin(); >+} >+ >+template <class T, size_t N, class Storage> >+typename FixedVector<T, N, Storage>::const_iterator FixedVector<T, N, Storage>::begin() const >+{ >+ return mStorage.begin(); >+} >+ >+template <class T, size_t N, class Storage> >+typename FixedVector<T, N, Storage>::iterator FixedVector<T, N, Storage>::end() >+{ >+ return mStorage.begin() + mSize; >+} >+ >+template <class T, size_t N, class Storage> >+typename FixedVector<T, N, Storage>::const_iterator FixedVector<T, N, Storage>::end() const >+{ >+ return mStorage.begin() + mSize; >+} >+ >+template <class T, size_t N, class Storage> >+bool FixedVector<T, N, Storage>::empty() const >+{ >+ return mSize == 0; >+} >+ >+template <class T, size_t N, class Storage> >+typename FixedVector<T, N, Storage>::size_type FixedVector<T, N, Storage>::size() const >+{ >+ return mSize; >+} >+ >+template <class T, size_t N, class Storage> >+typename FixedVector<T, N, Storage>::size_type FixedVector<T, N, Storage>::max_size() const >+{ >+ return N; >+} >+ >+template <class T, size_t N, class Storage> >+void FixedVector<T, N, Storage>::clear() >+{ >+ resize(0); >+} >+ >+template <class T, size_t N, class Storage> >+void FixedVector<T, N, Storage>::push_back(const value_type &value) >+{ >+ ASSERT(mSize < N); >+ mStorage[mSize] = value; >+ mSize++; >+} >+ >+template <class T, size_t N, class Storage> >+void FixedVector<T, N, Storage>::push_back(value_type &&value) >+{ >+ ASSERT(mSize < N); >+ mStorage[mSize] = std::move(value); >+ mSize++; >+} >+ >+template <class T, size_t N, class Storage> >+void FixedVector<T, N, Storage>::pop_back() >+{ >+ ASSERT(mSize > 0); >+ mSize--; >+} >+ >+template <class T, size_t N, class Storage> >+typename FixedVector<T, N, Storage>::reference FixedVector<T, N, Storage>::back() >+{ >+ ASSERT(mSize > 0); >+ return mStorage[mSize - 1]; >+} >+ >+template <class T, size_t N, class Storage> >+typename FixedVector<T, N, Storage>::const_reference FixedVector<T, N, Storage>::back() const >+{ >+ ASSERT(mSize > 0); >+ return mStorage[mSize - 1]; >+} >+ >+template <class T, size_t N, class Storage> >+void FixedVector<T, N, Storage>::swap(FixedVector<T, N, Storage> &other) >+{ >+ std::swap(mSize, other.mSize); >+ std::swap(mStorage, other.mStorage); >+} >+ >+template <class T, size_t N, class Storage> >+void FixedVector<T, N, Storage>::resize(size_type count) >+{ >+ ASSERT(count <= N); >+ while (mSize > count) >+ { >+ mSize--; >+ mStorage[mSize] = value_type(); >+ } >+ while (mSize < count) >+ { >+ mStorage[mSize] = value_type(); >+ mSize++; >+ } >+} >+ >+template <class T, size_t N, class Storage> >+void FixedVector<T, N, Storage>::resize(size_type count, const value_type &value) >+{ >+ ASSERT(count <= N); >+ while (mSize > count) >+ { >+ mSize--; >+ mStorage[mSize] = value_type(); >+ } >+ while (mSize < count) >+ { >+ mStorage[mSize] = value; >+ mSize++; >+ } >+} >+ >+template <class T, size_t N, class Storage> >+void FixedVector<T, N, Storage>::assign_from_initializer_list( >+ std::initializer_list<value_type> init) >+{ >+ for (auto element : init) >+ { >+ mStorage[mSize] = std::move(element); >+ mSize++; >+ } >+} >+ >+template <class T, size_t N, class Storage> >+bool FixedVector<T, N, Storage>::full() const >+{ >+ return (mSize == N); >+} >+} // namespace angle >+ >+#endif // COMMON_FIXEDVECTOR_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/FixedVector_unittest.cpp b/Source/ThirdParty/ANGLE/src/common/FixedVector_unittest.cpp >new file mode 100644 >index 00000000000..5e6c872556c >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/FixedVector_unittest.cpp >@@ -0,0 +1,148 @@ >+// >+// 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. >+// >+// FixedVector_unittest: >+// Tests of the FixedVector class >+// >+ >+#include <gtest/gtest.h> >+ >+#include "common/FixedVector.h" >+ >+namespace angle >+{ >+// Make sure the various constructors compile and do basic checks >+TEST(FixedVector, Constructors) >+{ >+ FixedVector<int, 5> defaultContructor; >+ EXPECT_EQ(0u, defaultContructor.size()); >+ >+ FixedVector<int, 5> count(3); >+ EXPECT_EQ(3u, count.size()); >+ >+ FixedVector<int, 5> countAndValue(3, 2); >+ EXPECT_EQ(3u, countAndValue.size()); >+ EXPECT_EQ(2, countAndValue[1]); >+ >+ FixedVector<int, 5> copy(countAndValue); >+ EXPECT_EQ(copy, countAndValue); >+ >+ FixedVector<int, 5> copyRValue(std::move(count)); >+ EXPECT_EQ(3u, copyRValue.size()); >+ >+ FixedVector<int, 5> initializerList{1, 2, 3, 4, 5}; >+ EXPECT_EQ(5u, initializerList.size()); >+ EXPECT_EQ(3, initializerList[2]); >+ >+ FixedVector<int, 5> assignCopy(copyRValue); >+ EXPECT_EQ(3u, assignCopy.size()); >+ >+ FixedVector<int, 5> assignRValue(std::move(assignCopy)); >+ EXPECT_EQ(3u, assignRValue.size()); >+ >+ FixedVector<int, 5> assignmentInitializerList = {1, 2, 3, 4, 5}; >+ EXPECT_EQ(5u, assignmentInitializerList.size()); >+ EXPECT_EQ(3, assignmentInitializerList[2]); >+} >+ >+// Test indexing operations (at, operator[]) >+TEST(FixedVector, Indexing) >+{ >+ FixedVector<int, 5> vec = {0, 1, 2, 3, 4}; >+ EXPECT_EQ(0, vec.at(0)); >+ EXPECT_EQ(vec[0], vec.at(0)); >+} >+ >+// Test the push_back functions >+TEST(FixedVector, PushBack) >+{ >+ FixedVector<int, 5> vec; >+ vec.push_back(1); >+ EXPECT_EQ(1, vec[0]); >+ vec.push_back(1); >+ vec.push_back(1); >+ vec.push_back(1); >+ vec.push_back(1); >+ EXPECT_EQ(vec.size(), vec.max_size()); >+} >+ >+// Test the pop_back function >+TEST(FixedVector, PopBack) >+{ >+ FixedVector<int, 5> vec; >+ vec.push_back(1); >+ EXPECT_EQ(1, (int)vec.size()); >+ vec.pop_back(); >+ EXPECT_EQ(0, (int)vec.size()); >+} >+ >+// Test the back function >+TEST(FixedVector, Back) >+{ >+ FixedVector<int, 5> vec; >+ vec.push_back(1); >+ vec.push_back(2); >+ EXPECT_EQ(2, vec.back()); >+} >+ >+// Test the sizing operations >+TEST(FixedVector, Size) >+{ >+ FixedVector<int, 5> vec; >+ EXPECT_TRUE(vec.empty()); >+ EXPECT_EQ(0u, vec.size()); >+ EXPECT_EQ(5u, vec.max_size()); >+ >+ vec.push_back(1); >+ EXPECT_FALSE(vec.empty()); >+ EXPECT_EQ(1u, vec.size()); >+} >+ >+// Test clearing the vector >+TEST(FixedVector, Clear) >+{ >+ FixedVector<int, 5> vec = {0, 1, 2, 3, 4}; >+ vec.clear(); >+ EXPECT_TRUE(vec.empty()); >+} >+ >+// Test resizing the vector >+TEST(FixedVector, Resize) >+{ >+ FixedVector<int, 5> vec; >+ vec.resize(5u, 1); >+ EXPECT_EQ(5u, vec.size()); >+ EXPECT_EQ(1, vec[4]); >+ >+ vec.resize(2u); >+ EXPECT_EQ(2u, vec.size()); >+} >+ >+// Test iterating over the vector >+TEST(FixedVector, Iteration) >+{ >+ FixedVector<int, 5> vec = {0, 1, 2, 3}; >+ >+ int vistedCount = 0; >+ for (int value : vec) >+ { >+ EXPECT_EQ(vistedCount, value); >+ vistedCount++; >+ } >+ EXPECT_EQ(4, vistedCount); >+} >+ >+// Test the "full" method. >+TEST(FixedVector, Full) >+{ >+ FixedVector<int, 2> vec; >+ >+ EXPECT_FALSE(vec.full()); >+ vec.push_back(0); >+ EXPECT_FALSE(vec.full()); >+ vec.push_back(1); >+ EXPECT_TRUE(vec.full()); >+} >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/common/Float16ToFloat32.cpp b/Source/ThirdParty/ANGLE/src/common/Float16ToFloat32.cpp >index acd0d88b607..6c21987704a 100644 >--- a/Source/ThirdParty/ANGLE/src/common/Float16ToFloat32.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/Float16ToFloat32.cpp >@@ -12,2188 +12,284 @@ namespace gl > { > > const static unsigned g_mantissa[2048] = { >- 0x00000000, >- 0x33800000, >- 0x34000000, >- 0x34400000, >- 0x34800000, >- 0x34a00000, >- 0x34c00000, >- 0x34e00000, >- 0x35000000, >- 0x35100000, >- 0x35200000, >- 0x35300000, >- 0x35400000, >- 0x35500000, >- 0x35600000, >- 0x35700000, >- 0x35800000, >- 0x35880000, >- 0x35900000, >- 0x35980000, >- 0x35a00000, >- 0x35a80000, >- 0x35b00000, >- 0x35b80000, >- 0x35c00000, >- 0x35c80000, >- 0x35d00000, >- 0x35d80000, >- 0x35e00000, >- 0x35e80000, >- 0x35f00000, >- 0x35f80000, >- 0x36000000, >- 0x36040000, >- 0x36080000, >- 0x360c0000, >- 0x36100000, >- 0x36140000, >- 0x36180000, >- 0x361c0000, >- 0x36200000, >- 0x36240000, >- 0x36280000, >- 0x362c0000, >- 0x36300000, >- 0x36340000, >- 0x36380000, >- 0x363c0000, >- 0x36400000, >- 0x36440000, >- 0x36480000, >- 0x364c0000, >- 0x36500000, >- 0x36540000, >- 0x36580000, >- 0x365c0000, >- 0x36600000, >- 0x36640000, >- 0x36680000, >- 0x366c0000, >- 0x36700000, >- 0x36740000, >- 0x36780000, >- 0x367c0000, >- 0x36800000, >- 0x36820000, >- 0x36840000, >- 0x36860000, >- 0x36880000, >- 0x368a0000, >- 0x368c0000, >- 0x368e0000, >- 0x36900000, >- 0x36920000, >- 0x36940000, >- 0x36960000, >- 0x36980000, >- 0x369a0000, >- 0x369c0000, >- 0x369e0000, >- 0x36a00000, >- 0x36a20000, >- 0x36a40000, >- 0x36a60000, >- 0x36a80000, >- 0x36aa0000, >- 0x36ac0000, >- 0x36ae0000, >- 0x36b00000, >- 0x36b20000, >- 0x36b40000, >- 0x36b60000, >- 0x36b80000, >- 0x36ba0000, >- 0x36bc0000, >- 0x36be0000, >- 0x36c00000, >- 0x36c20000, >- 0x36c40000, >- 0x36c60000, >- 0x36c80000, >- 0x36ca0000, >- 0x36cc0000, >- 0x36ce0000, >- 0x36d00000, >- 0x36d20000, >- 0x36d40000, >- 0x36d60000, >- 0x36d80000, >- 0x36da0000, >- 0x36dc0000, >- 0x36de0000, >- 0x36e00000, >- 0x36e20000, >- 0x36e40000, >- 0x36e60000, >- 0x36e80000, >- 0x36ea0000, >- 0x36ec0000, >- 0x36ee0000, >- 0x36f00000, >- 0x36f20000, >- 0x36f40000, >- 0x36f60000, >- 0x36f80000, >- 0x36fa0000, >- 0x36fc0000, >- 0x36fe0000, >- 0x37000000, >- 0x37010000, >- 0x37020000, >- 0x37030000, >- 0x37040000, >- 0x37050000, >- 0x37060000, >- 0x37070000, >- 0x37080000, >- 0x37090000, >- 0x370a0000, >- 0x370b0000, >- 0x370c0000, >- 0x370d0000, >- 0x370e0000, >- 0x370f0000, >- 0x37100000, >- 0x37110000, >- 0x37120000, >- 0x37130000, >- 0x37140000, >- 0x37150000, >- 0x37160000, >- 0x37170000, >- 0x37180000, >- 0x37190000, >- 0x371a0000, >- 0x371b0000, >- 0x371c0000, >- 0x371d0000, >- 0x371e0000, >- 0x371f0000, >- 0x37200000, >- 0x37210000, >- 0x37220000, >- 0x37230000, >- 0x37240000, >- 0x37250000, >- 0x37260000, >- 0x37270000, >- 0x37280000, >- 0x37290000, >- 0x372a0000, >- 0x372b0000, >- 0x372c0000, >- 0x372d0000, >- 0x372e0000, >- 0x372f0000, >- 0x37300000, >- 0x37310000, >- 0x37320000, >- 0x37330000, >- 0x37340000, >- 0x37350000, >- 0x37360000, >- 0x37370000, >- 0x37380000, >- 0x37390000, >- 0x373a0000, >- 0x373b0000, >- 0x373c0000, >- 0x373d0000, >- 0x373e0000, >- 0x373f0000, >- 0x37400000, >- 0x37410000, >- 0x37420000, >- 0x37430000, >- 0x37440000, >- 0x37450000, >- 0x37460000, >- 0x37470000, >- 0x37480000, >- 0x37490000, >- 0x374a0000, >- 0x374b0000, >- 0x374c0000, >- 0x374d0000, >- 0x374e0000, >- 0x374f0000, >- 0x37500000, >- 0x37510000, >- 0x37520000, >- 0x37530000, >- 0x37540000, >- 0x37550000, >- 0x37560000, >- 0x37570000, >- 0x37580000, >- 0x37590000, >- 0x375a0000, >- 0x375b0000, >- 0x375c0000, >- 0x375d0000, >- 0x375e0000, >- 0x375f0000, >- 0x37600000, >- 0x37610000, >- 0x37620000, >- 0x37630000, >- 0x37640000, >- 0x37650000, >- 0x37660000, >- 0x37670000, >- 0x37680000, >- 0x37690000, >- 0x376a0000, >- 0x376b0000, >- 0x376c0000, >- 0x376d0000, >- 0x376e0000, >- 0x376f0000, >- 0x37700000, >- 0x37710000, >- 0x37720000, >- 0x37730000, >- 0x37740000, >- 0x37750000, >- 0x37760000, >- 0x37770000, >- 0x37780000, >- 0x37790000, >- 0x377a0000, >- 0x377b0000, >- 0x377c0000, >- 0x377d0000, >- 0x377e0000, >- 0x377f0000, >- 0x37800000, >- 0x37808000, >- 0x37810000, >- 0x37818000, >- 0x37820000, >- 0x37828000, >- 0x37830000, >- 0x37838000, >- 0x37840000, >- 0x37848000, >- 0x37850000, >- 0x37858000, >- 0x37860000, >- 0x37868000, >- 0x37870000, >- 0x37878000, >- 0x37880000, >- 0x37888000, >- 0x37890000, >- 0x37898000, >- 0x378a0000, >- 0x378a8000, >- 0x378b0000, >- 0x378b8000, >- 0x378c0000, >- 0x378c8000, >- 0x378d0000, >- 0x378d8000, >- 0x378e0000, >- 0x378e8000, >- 0x378f0000, >- 0x378f8000, >- 0x37900000, >- 0x37908000, >- 0x37910000, >- 0x37918000, >- 0x37920000, >- 0x37928000, >- 0x37930000, >- 0x37938000, >- 0x37940000, >- 0x37948000, >- 0x37950000, >- 0x37958000, >- 0x37960000, >- 0x37968000, >- 0x37970000, >- 0x37978000, >- 0x37980000, >- 0x37988000, >- 0x37990000, >- 0x37998000, >- 0x379a0000, >- 0x379a8000, >- 0x379b0000, >- 0x379b8000, >- 0x379c0000, >- 0x379c8000, >- 0x379d0000, >- 0x379d8000, >- 0x379e0000, >- 0x379e8000, >- 0x379f0000, >- 0x379f8000, >- 0x37a00000, >- 0x37a08000, >- 0x37a10000, >- 0x37a18000, >- 0x37a20000, >- 0x37a28000, >- 0x37a30000, >- 0x37a38000, >- 0x37a40000, >- 0x37a48000, >- 0x37a50000, >- 0x37a58000, >- 0x37a60000, >- 0x37a68000, >- 0x37a70000, >- 0x37a78000, >- 0x37a80000, >- 0x37a88000, >- 0x37a90000, >- 0x37a98000, >- 0x37aa0000, >- 0x37aa8000, >- 0x37ab0000, >- 0x37ab8000, >- 0x37ac0000, >- 0x37ac8000, >- 0x37ad0000, >- 0x37ad8000, >- 0x37ae0000, >- 0x37ae8000, >- 0x37af0000, >- 0x37af8000, >- 0x37b00000, >- 0x37b08000, >- 0x37b10000, >- 0x37b18000, >- 0x37b20000, >- 0x37b28000, >- 0x37b30000, >- 0x37b38000, >- 0x37b40000, >- 0x37b48000, >- 0x37b50000, >- 0x37b58000, >- 0x37b60000, >- 0x37b68000, >- 0x37b70000, >- 0x37b78000, >- 0x37b80000, >- 0x37b88000, >- 0x37b90000, >- 0x37b98000, >- 0x37ba0000, >- 0x37ba8000, >- 0x37bb0000, >- 0x37bb8000, >- 0x37bc0000, >- 0x37bc8000, >- 0x37bd0000, >- 0x37bd8000, >- 0x37be0000, >- 0x37be8000, >- 0x37bf0000, >- 0x37bf8000, >- 0x37c00000, >- 0x37c08000, >- 0x37c10000, >- 0x37c18000, >- 0x37c20000, >- 0x37c28000, >- 0x37c30000, >- 0x37c38000, >- 0x37c40000, >- 0x37c48000, >- 0x37c50000, >- 0x37c58000, >- 0x37c60000, >- 0x37c68000, >- 0x37c70000, >- 0x37c78000, >- 0x37c80000, >- 0x37c88000, >- 0x37c90000, >- 0x37c98000, >- 0x37ca0000, >- 0x37ca8000, >- 0x37cb0000, >- 0x37cb8000, >- 0x37cc0000, >- 0x37cc8000, >- 0x37cd0000, >- 0x37cd8000, >- 0x37ce0000, >- 0x37ce8000, >- 0x37cf0000, >- 0x37cf8000, >- 0x37d00000, >- 0x37d08000, >- 0x37d10000, >- 0x37d18000, >- 0x37d20000, >- 0x37d28000, >- 0x37d30000, >- 0x37d38000, >- 0x37d40000, >- 0x37d48000, >- 0x37d50000, >- 0x37d58000, >- 0x37d60000, >- 0x37d68000, >- 0x37d70000, >- 0x37d78000, >- 0x37d80000, >- 0x37d88000, >- 0x37d90000, >- 0x37d98000, >- 0x37da0000, >- 0x37da8000, >- 0x37db0000, >- 0x37db8000, >- 0x37dc0000, >- 0x37dc8000, >- 0x37dd0000, >- 0x37dd8000, >- 0x37de0000, >- 0x37de8000, >- 0x37df0000, >- 0x37df8000, >- 0x37e00000, >- 0x37e08000, >- 0x37e10000, >- 0x37e18000, >- 0x37e20000, >- 0x37e28000, >- 0x37e30000, >- 0x37e38000, >- 0x37e40000, >- 0x37e48000, >- 0x37e50000, >- 0x37e58000, >- 0x37e60000, >- 0x37e68000, >- 0x37e70000, >- 0x37e78000, >- 0x37e80000, >- 0x37e88000, >- 0x37e90000, >- 0x37e98000, >- 0x37ea0000, >- 0x37ea8000, >- 0x37eb0000, >- 0x37eb8000, >- 0x37ec0000, >- 0x37ec8000, >- 0x37ed0000, >- 0x37ed8000, >- 0x37ee0000, >- 0x37ee8000, >- 0x37ef0000, >- 0x37ef8000, >- 0x37f00000, >- 0x37f08000, >- 0x37f10000, >- 0x37f18000, >- 0x37f20000, >- 0x37f28000, >- 0x37f30000, >- 0x37f38000, >- 0x37f40000, >- 0x37f48000, >- 0x37f50000, >- 0x37f58000, >- 0x37f60000, >- 0x37f68000, >- 0x37f70000, >- 0x37f78000, >- 0x37f80000, >- 0x37f88000, >- 0x37f90000, >- 0x37f98000, >- 0x37fa0000, >- 0x37fa8000, >- 0x37fb0000, >- 0x37fb8000, >- 0x37fc0000, >- 0x37fc8000, >- 0x37fd0000, >- 0x37fd8000, >- 0x37fe0000, >- 0x37fe8000, >- 0x37ff0000, >- 0x37ff8000, >- 0x38000000, >- 0x38004000, >- 0x38008000, >- 0x3800c000, >- 0x38010000, >- 0x38014000, >- 0x38018000, >- 0x3801c000, >- 0x38020000, >- 0x38024000, >- 0x38028000, >- 0x3802c000, >- 0x38030000, >- 0x38034000, >- 0x38038000, >- 0x3803c000, >- 0x38040000, >- 0x38044000, >- 0x38048000, >- 0x3804c000, >- 0x38050000, >- 0x38054000, >- 0x38058000, >- 0x3805c000, >- 0x38060000, >- 0x38064000, >- 0x38068000, >- 0x3806c000, >- 0x38070000, >- 0x38074000, >- 0x38078000, >- 0x3807c000, >- 0x38080000, >- 0x38084000, >- 0x38088000, >- 0x3808c000, >- 0x38090000, >- 0x38094000, >- 0x38098000, >- 0x3809c000, >- 0x380a0000, >- 0x380a4000, >- 0x380a8000, >- 0x380ac000, >- 0x380b0000, >- 0x380b4000, >- 0x380b8000, >- 0x380bc000, >- 0x380c0000, >- 0x380c4000, >- 0x380c8000, >- 0x380cc000, >- 0x380d0000, >- 0x380d4000, >- 0x380d8000, >- 0x380dc000, >- 0x380e0000, >- 0x380e4000, >- 0x380e8000, >- 0x380ec000, >- 0x380f0000, >- 0x380f4000, >- 0x380f8000, >- 0x380fc000, >- 0x38100000, >- 0x38104000, >- 0x38108000, >- 0x3810c000, >- 0x38110000, >- 0x38114000, >- 0x38118000, >- 0x3811c000, >- 0x38120000, >- 0x38124000, >- 0x38128000, >- 0x3812c000, >- 0x38130000, >- 0x38134000, >- 0x38138000, >- 0x3813c000, >- 0x38140000, >- 0x38144000, >- 0x38148000, >- 0x3814c000, >- 0x38150000, >- 0x38154000, >- 0x38158000, >- 0x3815c000, >- 0x38160000, >- 0x38164000, >- 0x38168000, >- 0x3816c000, >- 0x38170000, >- 0x38174000, >- 0x38178000, >- 0x3817c000, >- 0x38180000, >- 0x38184000, >- 0x38188000, >- 0x3818c000, >- 0x38190000, >- 0x38194000, >- 0x38198000, >- 0x3819c000, >- 0x381a0000, >- 0x381a4000, >- 0x381a8000, >- 0x381ac000, >- 0x381b0000, >- 0x381b4000, >- 0x381b8000, >- 0x381bc000, >- 0x381c0000, >- 0x381c4000, >- 0x381c8000, >- 0x381cc000, >- 0x381d0000, >- 0x381d4000, >- 0x381d8000, >- 0x381dc000, >- 0x381e0000, >- 0x381e4000, >- 0x381e8000, >- 0x381ec000, >- 0x381f0000, >- 0x381f4000, >- 0x381f8000, >- 0x381fc000, >- 0x38200000, >- 0x38204000, >- 0x38208000, >- 0x3820c000, >- 0x38210000, >- 0x38214000, >- 0x38218000, >- 0x3821c000, >- 0x38220000, >- 0x38224000, >- 0x38228000, >- 0x3822c000, >- 0x38230000, >- 0x38234000, >- 0x38238000, >- 0x3823c000, >- 0x38240000, >- 0x38244000, >- 0x38248000, >- 0x3824c000, >- 0x38250000, >- 0x38254000, >- 0x38258000, >- 0x3825c000, >- 0x38260000, >- 0x38264000, >- 0x38268000, >- 0x3826c000, >- 0x38270000, >- 0x38274000, >- 0x38278000, >- 0x3827c000, >- 0x38280000, >- 0x38284000, >- 0x38288000, >- 0x3828c000, >- 0x38290000, >- 0x38294000, >- 0x38298000, >- 0x3829c000, >- 0x382a0000, >- 0x382a4000, >- 0x382a8000, >- 0x382ac000, >- 0x382b0000, >- 0x382b4000, >- 0x382b8000, >- 0x382bc000, >- 0x382c0000, >- 0x382c4000, >- 0x382c8000, >- 0x382cc000, >- 0x382d0000, >- 0x382d4000, >- 0x382d8000, >- 0x382dc000, >- 0x382e0000, >- 0x382e4000, >- 0x382e8000, >- 0x382ec000, >- 0x382f0000, >- 0x382f4000, >- 0x382f8000, >- 0x382fc000, >- 0x38300000, >- 0x38304000, >- 0x38308000, >- 0x3830c000, >- 0x38310000, >- 0x38314000, >- 0x38318000, >- 0x3831c000, >- 0x38320000, >- 0x38324000, >- 0x38328000, >- 0x3832c000, >- 0x38330000, >- 0x38334000, >- 0x38338000, >- 0x3833c000, >- 0x38340000, >- 0x38344000, >- 0x38348000, >- 0x3834c000, >- 0x38350000, >- 0x38354000, >- 0x38358000, >- 0x3835c000, >- 0x38360000, >- 0x38364000, >- 0x38368000, >- 0x3836c000, >- 0x38370000, >- 0x38374000, >- 0x38378000, >- 0x3837c000, >- 0x38380000, >- 0x38384000, >- 0x38388000, >- 0x3838c000, >- 0x38390000, >- 0x38394000, >- 0x38398000, >- 0x3839c000, >- 0x383a0000, >- 0x383a4000, >- 0x383a8000, >- 0x383ac000, >- 0x383b0000, >- 0x383b4000, >- 0x383b8000, >- 0x383bc000, >- 0x383c0000, >- 0x383c4000, >- 0x383c8000, >- 0x383cc000, >- 0x383d0000, >- 0x383d4000, >- 0x383d8000, >- 0x383dc000, >- 0x383e0000, >- 0x383e4000, >- 0x383e8000, >- 0x383ec000, >- 0x383f0000, >- 0x383f4000, >- 0x383f8000, >- 0x383fc000, >- 0x38400000, >- 0x38404000, >- 0x38408000, >- 0x3840c000, >- 0x38410000, >- 0x38414000, >- 0x38418000, >- 0x3841c000, >- 0x38420000, >- 0x38424000, >- 0x38428000, >- 0x3842c000, >- 0x38430000, >- 0x38434000, >- 0x38438000, >- 0x3843c000, >- 0x38440000, >- 0x38444000, >- 0x38448000, >- 0x3844c000, >- 0x38450000, >- 0x38454000, >- 0x38458000, >- 0x3845c000, >- 0x38460000, >- 0x38464000, >- 0x38468000, >- 0x3846c000, >- 0x38470000, >- 0x38474000, >- 0x38478000, >- 0x3847c000, >- 0x38480000, >- 0x38484000, >- 0x38488000, >- 0x3848c000, >- 0x38490000, >- 0x38494000, >- 0x38498000, >- 0x3849c000, >- 0x384a0000, >- 0x384a4000, >- 0x384a8000, >- 0x384ac000, >- 0x384b0000, >- 0x384b4000, >- 0x384b8000, >- 0x384bc000, >- 0x384c0000, >- 0x384c4000, >- 0x384c8000, >- 0x384cc000, >- 0x384d0000, >- 0x384d4000, >- 0x384d8000, >- 0x384dc000, >- 0x384e0000, >- 0x384e4000, >- 0x384e8000, >- 0x384ec000, >- 0x384f0000, >- 0x384f4000, >- 0x384f8000, >- 0x384fc000, >- 0x38500000, >- 0x38504000, >- 0x38508000, >- 0x3850c000, >- 0x38510000, >- 0x38514000, >- 0x38518000, >- 0x3851c000, >- 0x38520000, >- 0x38524000, >- 0x38528000, >- 0x3852c000, >- 0x38530000, >- 0x38534000, >- 0x38538000, >- 0x3853c000, >- 0x38540000, >- 0x38544000, >- 0x38548000, >- 0x3854c000, >- 0x38550000, >- 0x38554000, >- 0x38558000, >- 0x3855c000, >- 0x38560000, >- 0x38564000, >- 0x38568000, >- 0x3856c000, >- 0x38570000, >- 0x38574000, >- 0x38578000, >- 0x3857c000, >- 0x38580000, >- 0x38584000, >- 0x38588000, >- 0x3858c000, >- 0x38590000, >- 0x38594000, >- 0x38598000, >- 0x3859c000, >- 0x385a0000, >- 0x385a4000, >- 0x385a8000, >- 0x385ac000, >- 0x385b0000, >- 0x385b4000, >- 0x385b8000, >- 0x385bc000, >- 0x385c0000, >- 0x385c4000, >- 0x385c8000, >- 0x385cc000, >- 0x385d0000, >- 0x385d4000, >- 0x385d8000, >- 0x385dc000, >- 0x385e0000, >- 0x385e4000, >- 0x385e8000, >- 0x385ec000, >- 0x385f0000, >- 0x385f4000, >- 0x385f8000, >- 0x385fc000, >- 0x38600000, >- 0x38604000, >- 0x38608000, >- 0x3860c000, >- 0x38610000, >- 0x38614000, >- 0x38618000, >- 0x3861c000, >- 0x38620000, >- 0x38624000, >- 0x38628000, >- 0x3862c000, >- 0x38630000, >- 0x38634000, >- 0x38638000, >- 0x3863c000, >- 0x38640000, >- 0x38644000, >- 0x38648000, >- 0x3864c000, >- 0x38650000, >- 0x38654000, >- 0x38658000, >- 0x3865c000, >- 0x38660000, >- 0x38664000, >- 0x38668000, >- 0x3866c000, >- 0x38670000, >- 0x38674000, >- 0x38678000, >- 0x3867c000, >- 0x38680000, >- 0x38684000, >- 0x38688000, >- 0x3868c000, >- 0x38690000, >- 0x38694000, >- 0x38698000, >- 0x3869c000, >- 0x386a0000, >- 0x386a4000, >- 0x386a8000, >- 0x386ac000, >- 0x386b0000, >- 0x386b4000, >- 0x386b8000, >- 0x386bc000, >- 0x386c0000, >- 0x386c4000, >- 0x386c8000, >- 0x386cc000, >- 0x386d0000, >- 0x386d4000, >- 0x386d8000, >- 0x386dc000, >- 0x386e0000, >- 0x386e4000, >- 0x386e8000, >- 0x386ec000, >- 0x386f0000, >- 0x386f4000, >- 0x386f8000, >- 0x386fc000, >- 0x38700000, >- 0x38704000, >- 0x38708000, >- 0x3870c000, >- 0x38710000, >- 0x38714000, >- 0x38718000, >- 0x3871c000, >- 0x38720000, >- 0x38724000, >- 0x38728000, >- 0x3872c000, >- 0x38730000, >- 0x38734000, >- 0x38738000, >- 0x3873c000, >- 0x38740000, >- 0x38744000, >- 0x38748000, >- 0x3874c000, >- 0x38750000, >- 0x38754000, >- 0x38758000, >- 0x3875c000, >- 0x38760000, >- 0x38764000, >- 0x38768000, >- 0x3876c000, >- 0x38770000, >- 0x38774000, >- 0x38778000, >- 0x3877c000, >- 0x38780000, >- 0x38784000, >- 0x38788000, >- 0x3878c000, >- 0x38790000, >- 0x38794000, >- 0x38798000, >- 0x3879c000, >- 0x387a0000, >- 0x387a4000, >- 0x387a8000, >- 0x387ac000, >- 0x387b0000, >- 0x387b4000, >- 0x387b8000, >- 0x387bc000, >- 0x387c0000, >- 0x387c4000, >- 0x387c8000, >- 0x387cc000, >- 0x387d0000, >- 0x387d4000, >- 0x387d8000, >- 0x387dc000, >- 0x387e0000, >- 0x387e4000, >- 0x387e8000, >- 0x387ec000, >- 0x387f0000, >- 0x387f4000, >- 0x387f8000, >- 0x387fc000, >- 0x38000000, >- 0x38002000, >- 0x38004000, >- 0x38006000, >- 0x38008000, >- 0x3800a000, >- 0x3800c000, >- 0x3800e000, >- 0x38010000, >- 0x38012000, >- 0x38014000, >- 0x38016000, >- 0x38018000, >- 0x3801a000, >- 0x3801c000, >- 0x3801e000, >- 0x38020000, >- 0x38022000, >- 0x38024000, >- 0x38026000, >- 0x38028000, >- 0x3802a000, >- 0x3802c000, >- 0x3802e000, >- 0x38030000, >- 0x38032000, >- 0x38034000, >- 0x38036000, >- 0x38038000, >- 0x3803a000, >- 0x3803c000, >- 0x3803e000, >- 0x38040000, >- 0x38042000, >- 0x38044000, >- 0x38046000, >- 0x38048000, >- 0x3804a000, >- 0x3804c000, >- 0x3804e000, >- 0x38050000, >- 0x38052000, >- 0x38054000, >- 0x38056000, >- 0x38058000, >- 0x3805a000, >- 0x3805c000, >- 0x3805e000, >- 0x38060000, >- 0x38062000, >- 0x38064000, >- 0x38066000, >- 0x38068000, >- 0x3806a000, >- 0x3806c000, >- 0x3806e000, >- 0x38070000, >- 0x38072000, >- 0x38074000, >- 0x38076000, >- 0x38078000, >- 0x3807a000, >- 0x3807c000, >- 0x3807e000, >- 0x38080000, >- 0x38082000, >- 0x38084000, >- 0x38086000, >- 0x38088000, >- 0x3808a000, >- 0x3808c000, >- 0x3808e000, >- 0x38090000, >- 0x38092000, >- 0x38094000, >- 0x38096000, >- 0x38098000, >- 0x3809a000, >- 0x3809c000, >- 0x3809e000, >- 0x380a0000, >- 0x380a2000, >- 0x380a4000, >- 0x380a6000, >- 0x380a8000, >- 0x380aa000, >- 0x380ac000, >- 0x380ae000, >- 0x380b0000, >- 0x380b2000, >- 0x380b4000, >- 0x380b6000, >- 0x380b8000, >- 0x380ba000, >- 0x380bc000, >- 0x380be000, >- 0x380c0000, >- 0x380c2000, >- 0x380c4000, >- 0x380c6000, >- 0x380c8000, >- 0x380ca000, >- 0x380cc000, >- 0x380ce000, >- 0x380d0000, >- 0x380d2000, >- 0x380d4000, >- 0x380d6000, >- 0x380d8000, >- 0x380da000, >- 0x380dc000, >- 0x380de000, >- 0x380e0000, >- 0x380e2000, >- 0x380e4000, >- 0x380e6000, >- 0x380e8000, >- 0x380ea000, >- 0x380ec000, >- 0x380ee000, >- 0x380f0000, >- 0x380f2000, >- 0x380f4000, >- 0x380f6000, >- 0x380f8000, >- 0x380fa000, >- 0x380fc000, >- 0x380fe000, >- 0x38100000, >- 0x38102000, >- 0x38104000, >- 0x38106000, >- 0x38108000, >- 0x3810a000, >- 0x3810c000, >- 0x3810e000, >- 0x38110000, >- 0x38112000, >- 0x38114000, >- 0x38116000, >- 0x38118000, >- 0x3811a000, >- 0x3811c000, >- 0x3811e000, >- 0x38120000, >- 0x38122000, >- 0x38124000, >- 0x38126000, >- 0x38128000, >- 0x3812a000, >- 0x3812c000, >- 0x3812e000, >- 0x38130000, >- 0x38132000, >- 0x38134000, >- 0x38136000, >- 0x38138000, >- 0x3813a000, >- 0x3813c000, >- 0x3813e000, >- 0x38140000, >- 0x38142000, >- 0x38144000, >- 0x38146000, >- 0x38148000, >- 0x3814a000, >- 0x3814c000, >- 0x3814e000, >- 0x38150000, >- 0x38152000, >- 0x38154000, >- 0x38156000, >- 0x38158000, >- 0x3815a000, >- 0x3815c000, >- 0x3815e000, >- 0x38160000, >- 0x38162000, >- 0x38164000, >- 0x38166000, >- 0x38168000, >- 0x3816a000, >- 0x3816c000, >- 0x3816e000, >- 0x38170000, >- 0x38172000, >- 0x38174000, >- 0x38176000, >- 0x38178000, >- 0x3817a000, >- 0x3817c000, >- 0x3817e000, >- 0x38180000, >- 0x38182000, >- 0x38184000, >- 0x38186000, >- 0x38188000, >- 0x3818a000, >- 0x3818c000, >- 0x3818e000, >- 0x38190000, >- 0x38192000, >- 0x38194000, >- 0x38196000, >- 0x38198000, >- 0x3819a000, >- 0x3819c000, >- 0x3819e000, >- 0x381a0000, >- 0x381a2000, >- 0x381a4000, >- 0x381a6000, >- 0x381a8000, >- 0x381aa000, >- 0x381ac000, >- 0x381ae000, >- 0x381b0000, >- 0x381b2000, >- 0x381b4000, >- 0x381b6000, >- 0x381b8000, >- 0x381ba000, >- 0x381bc000, >- 0x381be000, >- 0x381c0000, >- 0x381c2000, >- 0x381c4000, >- 0x381c6000, >- 0x381c8000, >- 0x381ca000, >- 0x381cc000, >- 0x381ce000, >- 0x381d0000, >- 0x381d2000, >- 0x381d4000, >- 0x381d6000, >- 0x381d8000, >- 0x381da000, >- 0x381dc000, >- 0x381de000, >- 0x381e0000, >- 0x381e2000, >- 0x381e4000, >- 0x381e6000, >- 0x381e8000, >- 0x381ea000, >- 0x381ec000, >- 0x381ee000, >- 0x381f0000, >- 0x381f2000, >- 0x381f4000, >- 0x381f6000, >- 0x381f8000, >- 0x381fa000, >- 0x381fc000, >- 0x381fe000, >- 0x38200000, >- 0x38202000, >- 0x38204000, >- 0x38206000, >- 0x38208000, >- 0x3820a000, >- 0x3820c000, >- 0x3820e000, >- 0x38210000, >- 0x38212000, >- 0x38214000, >- 0x38216000, >- 0x38218000, >- 0x3821a000, >- 0x3821c000, >- 0x3821e000, >- 0x38220000, >- 0x38222000, >- 0x38224000, >- 0x38226000, >- 0x38228000, >- 0x3822a000, >- 0x3822c000, >- 0x3822e000, >- 0x38230000, >- 0x38232000, >- 0x38234000, >- 0x38236000, >- 0x38238000, >- 0x3823a000, >- 0x3823c000, >- 0x3823e000, >- 0x38240000, >- 0x38242000, >- 0x38244000, >- 0x38246000, >- 0x38248000, >- 0x3824a000, >- 0x3824c000, >- 0x3824e000, >- 0x38250000, >- 0x38252000, >- 0x38254000, >- 0x38256000, >- 0x38258000, >- 0x3825a000, >- 0x3825c000, >- 0x3825e000, >- 0x38260000, >- 0x38262000, >- 0x38264000, >- 0x38266000, >- 0x38268000, >- 0x3826a000, >- 0x3826c000, >- 0x3826e000, >- 0x38270000, >- 0x38272000, >- 0x38274000, >- 0x38276000, >- 0x38278000, >- 0x3827a000, >- 0x3827c000, >- 0x3827e000, >- 0x38280000, >- 0x38282000, >- 0x38284000, >- 0x38286000, >- 0x38288000, >- 0x3828a000, >- 0x3828c000, >- 0x3828e000, >- 0x38290000, >- 0x38292000, >- 0x38294000, >- 0x38296000, >- 0x38298000, >- 0x3829a000, >- 0x3829c000, >- 0x3829e000, >- 0x382a0000, >- 0x382a2000, >- 0x382a4000, >- 0x382a6000, >- 0x382a8000, >- 0x382aa000, >- 0x382ac000, >- 0x382ae000, >- 0x382b0000, >- 0x382b2000, >- 0x382b4000, >- 0x382b6000, >- 0x382b8000, >- 0x382ba000, >- 0x382bc000, >- 0x382be000, >- 0x382c0000, >- 0x382c2000, >- 0x382c4000, >- 0x382c6000, >- 0x382c8000, >- 0x382ca000, >- 0x382cc000, >- 0x382ce000, >- 0x382d0000, >- 0x382d2000, >- 0x382d4000, >- 0x382d6000, >- 0x382d8000, >- 0x382da000, >- 0x382dc000, >- 0x382de000, >- 0x382e0000, >- 0x382e2000, >- 0x382e4000, >- 0x382e6000, >- 0x382e8000, >- 0x382ea000, >- 0x382ec000, >- 0x382ee000, >- 0x382f0000, >- 0x382f2000, >- 0x382f4000, >- 0x382f6000, >- 0x382f8000, >- 0x382fa000, >- 0x382fc000, >- 0x382fe000, >- 0x38300000, >- 0x38302000, >- 0x38304000, >- 0x38306000, >- 0x38308000, >- 0x3830a000, >- 0x3830c000, >- 0x3830e000, >- 0x38310000, >- 0x38312000, >- 0x38314000, >- 0x38316000, >- 0x38318000, >- 0x3831a000, >- 0x3831c000, >- 0x3831e000, >- 0x38320000, >- 0x38322000, >- 0x38324000, >- 0x38326000, >- 0x38328000, >- 0x3832a000, >- 0x3832c000, >- 0x3832e000, >- 0x38330000, >- 0x38332000, >- 0x38334000, >- 0x38336000, >- 0x38338000, >- 0x3833a000, >- 0x3833c000, >- 0x3833e000, >- 0x38340000, >- 0x38342000, >- 0x38344000, >- 0x38346000, >- 0x38348000, >- 0x3834a000, >- 0x3834c000, >- 0x3834e000, >- 0x38350000, >- 0x38352000, >- 0x38354000, >- 0x38356000, >- 0x38358000, >- 0x3835a000, >- 0x3835c000, >- 0x3835e000, >- 0x38360000, >- 0x38362000, >- 0x38364000, >- 0x38366000, >- 0x38368000, >- 0x3836a000, >- 0x3836c000, >- 0x3836e000, >- 0x38370000, >- 0x38372000, >- 0x38374000, >- 0x38376000, >- 0x38378000, >- 0x3837a000, >- 0x3837c000, >- 0x3837e000, >- 0x38380000, >- 0x38382000, >- 0x38384000, >- 0x38386000, >- 0x38388000, >- 0x3838a000, >- 0x3838c000, >- 0x3838e000, >- 0x38390000, >- 0x38392000, >- 0x38394000, >- 0x38396000, >- 0x38398000, >- 0x3839a000, >- 0x3839c000, >- 0x3839e000, >- 0x383a0000, >- 0x383a2000, >- 0x383a4000, >- 0x383a6000, >- 0x383a8000, >- 0x383aa000, >- 0x383ac000, >- 0x383ae000, >- 0x383b0000, >- 0x383b2000, >- 0x383b4000, >- 0x383b6000, >- 0x383b8000, >- 0x383ba000, >- 0x383bc000, >- 0x383be000, >- 0x383c0000, >- 0x383c2000, >- 0x383c4000, >- 0x383c6000, >- 0x383c8000, >- 0x383ca000, >- 0x383cc000, >- 0x383ce000, >- 0x383d0000, >- 0x383d2000, >- 0x383d4000, >- 0x383d6000, >- 0x383d8000, >- 0x383da000, >- 0x383dc000, >- 0x383de000, >- 0x383e0000, >- 0x383e2000, >- 0x383e4000, >- 0x383e6000, >- 0x383e8000, >- 0x383ea000, >- 0x383ec000, >- 0x383ee000, >- 0x383f0000, >- 0x383f2000, >- 0x383f4000, >- 0x383f6000, >- 0x383f8000, >- 0x383fa000, >- 0x383fc000, >- 0x383fe000, >- 0x38400000, >- 0x38402000, >- 0x38404000, >- 0x38406000, >- 0x38408000, >- 0x3840a000, >- 0x3840c000, >- 0x3840e000, >- 0x38410000, >- 0x38412000, >- 0x38414000, >- 0x38416000, >- 0x38418000, >- 0x3841a000, >- 0x3841c000, >- 0x3841e000, >- 0x38420000, >- 0x38422000, >- 0x38424000, >- 0x38426000, >- 0x38428000, >- 0x3842a000, >- 0x3842c000, >- 0x3842e000, >- 0x38430000, >- 0x38432000, >- 0x38434000, >- 0x38436000, >- 0x38438000, >- 0x3843a000, >- 0x3843c000, >- 0x3843e000, >- 0x38440000, >- 0x38442000, >- 0x38444000, >- 0x38446000, >- 0x38448000, >- 0x3844a000, >- 0x3844c000, >- 0x3844e000, >- 0x38450000, >- 0x38452000, >- 0x38454000, >- 0x38456000, >- 0x38458000, >- 0x3845a000, >- 0x3845c000, >- 0x3845e000, >- 0x38460000, >- 0x38462000, >- 0x38464000, >- 0x38466000, >- 0x38468000, >- 0x3846a000, >- 0x3846c000, >- 0x3846e000, >- 0x38470000, >- 0x38472000, >- 0x38474000, >- 0x38476000, >- 0x38478000, >- 0x3847a000, >- 0x3847c000, >- 0x3847e000, >- 0x38480000, >- 0x38482000, >- 0x38484000, >- 0x38486000, >- 0x38488000, >- 0x3848a000, >- 0x3848c000, >- 0x3848e000, >- 0x38490000, >- 0x38492000, >- 0x38494000, >- 0x38496000, >- 0x38498000, >- 0x3849a000, >- 0x3849c000, >- 0x3849e000, >- 0x384a0000, >- 0x384a2000, >- 0x384a4000, >- 0x384a6000, >- 0x384a8000, >- 0x384aa000, >- 0x384ac000, >- 0x384ae000, >- 0x384b0000, >- 0x384b2000, >- 0x384b4000, >- 0x384b6000, >- 0x384b8000, >- 0x384ba000, >- 0x384bc000, >- 0x384be000, >- 0x384c0000, >- 0x384c2000, >- 0x384c4000, >- 0x384c6000, >- 0x384c8000, >- 0x384ca000, >- 0x384cc000, >- 0x384ce000, >- 0x384d0000, >- 0x384d2000, >- 0x384d4000, >- 0x384d6000, >- 0x384d8000, >- 0x384da000, >- 0x384dc000, >- 0x384de000, >- 0x384e0000, >- 0x384e2000, >- 0x384e4000, >- 0x384e6000, >- 0x384e8000, >- 0x384ea000, >- 0x384ec000, >- 0x384ee000, >- 0x384f0000, >- 0x384f2000, >- 0x384f4000, >- 0x384f6000, >- 0x384f8000, >- 0x384fa000, >- 0x384fc000, >- 0x384fe000, >- 0x38500000, >- 0x38502000, >- 0x38504000, >- 0x38506000, >- 0x38508000, >- 0x3850a000, >- 0x3850c000, >- 0x3850e000, >- 0x38510000, >- 0x38512000, >- 0x38514000, >- 0x38516000, >- 0x38518000, >- 0x3851a000, >- 0x3851c000, >- 0x3851e000, >- 0x38520000, >- 0x38522000, >- 0x38524000, >- 0x38526000, >- 0x38528000, >- 0x3852a000, >- 0x3852c000, >- 0x3852e000, >- 0x38530000, >- 0x38532000, >- 0x38534000, >- 0x38536000, >- 0x38538000, >- 0x3853a000, >- 0x3853c000, >- 0x3853e000, >- 0x38540000, >- 0x38542000, >- 0x38544000, >- 0x38546000, >- 0x38548000, >- 0x3854a000, >- 0x3854c000, >- 0x3854e000, >- 0x38550000, >- 0x38552000, >- 0x38554000, >- 0x38556000, >- 0x38558000, >- 0x3855a000, >- 0x3855c000, >- 0x3855e000, >- 0x38560000, >- 0x38562000, >- 0x38564000, >- 0x38566000, >- 0x38568000, >- 0x3856a000, >- 0x3856c000, >- 0x3856e000, >- 0x38570000, >- 0x38572000, >- 0x38574000, >- 0x38576000, >- 0x38578000, >- 0x3857a000, >- 0x3857c000, >- 0x3857e000, >- 0x38580000, >- 0x38582000, >- 0x38584000, >- 0x38586000, >- 0x38588000, >- 0x3858a000, >- 0x3858c000, >- 0x3858e000, >- 0x38590000, >- 0x38592000, >- 0x38594000, >- 0x38596000, >- 0x38598000, >- 0x3859a000, >- 0x3859c000, >- 0x3859e000, >- 0x385a0000, >- 0x385a2000, >- 0x385a4000, >- 0x385a6000, >- 0x385a8000, >- 0x385aa000, >- 0x385ac000, >- 0x385ae000, >- 0x385b0000, >- 0x385b2000, >- 0x385b4000, >- 0x385b6000, >- 0x385b8000, >- 0x385ba000, >- 0x385bc000, >- 0x385be000, >- 0x385c0000, >- 0x385c2000, >- 0x385c4000, >- 0x385c6000, >- 0x385c8000, >- 0x385ca000, >- 0x385cc000, >- 0x385ce000, >- 0x385d0000, >- 0x385d2000, >- 0x385d4000, >- 0x385d6000, >- 0x385d8000, >- 0x385da000, >- 0x385dc000, >- 0x385de000, >- 0x385e0000, >- 0x385e2000, >- 0x385e4000, >- 0x385e6000, >- 0x385e8000, >- 0x385ea000, >- 0x385ec000, >- 0x385ee000, >- 0x385f0000, >- 0x385f2000, >- 0x385f4000, >- 0x385f6000, >- 0x385f8000, >- 0x385fa000, >- 0x385fc000, >- 0x385fe000, >- 0x38600000, >- 0x38602000, >- 0x38604000, >- 0x38606000, >- 0x38608000, >- 0x3860a000, >- 0x3860c000, >- 0x3860e000, >- 0x38610000, >- 0x38612000, >- 0x38614000, >- 0x38616000, >- 0x38618000, >- 0x3861a000, >- 0x3861c000, >- 0x3861e000, >- 0x38620000, >- 0x38622000, >- 0x38624000, >- 0x38626000, >- 0x38628000, >- 0x3862a000, >- 0x3862c000, >- 0x3862e000, >- 0x38630000, >- 0x38632000, >- 0x38634000, >- 0x38636000, >- 0x38638000, >- 0x3863a000, >- 0x3863c000, >- 0x3863e000, >- 0x38640000, >- 0x38642000, >- 0x38644000, >- 0x38646000, >- 0x38648000, >- 0x3864a000, >- 0x3864c000, >- 0x3864e000, >- 0x38650000, >- 0x38652000, >- 0x38654000, >- 0x38656000, >- 0x38658000, >- 0x3865a000, >- 0x3865c000, >- 0x3865e000, >- 0x38660000, >- 0x38662000, >- 0x38664000, >- 0x38666000, >- 0x38668000, >- 0x3866a000, >- 0x3866c000, >- 0x3866e000, >- 0x38670000, >- 0x38672000, >- 0x38674000, >- 0x38676000, >- 0x38678000, >- 0x3867a000, >- 0x3867c000, >- 0x3867e000, >- 0x38680000, >- 0x38682000, >- 0x38684000, >- 0x38686000, >- 0x38688000, >- 0x3868a000, >- 0x3868c000, >- 0x3868e000, >- 0x38690000, >- 0x38692000, >- 0x38694000, >- 0x38696000, >- 0x38698000, >- 0x3869a000, >- 0x3869c000, >- 0x3869e000, >- 0x386a0000, >- 0x386a2000, >- 0x386a4000, >- 0x386a6000, >- 0x386a8000, >- 0x386aa000, >- 0x386ac000, >- 0x386ae000, >- 0x386b0000, >- 0x386b2000, >- 0x386b4000, >- 0x386b6000, >- 0x386b8000, >- 0x386ba000, >- 0x386bc000, >- 0x386be000, >- 0x386c0000, >- 0x386c2000, >- 0x386c4000, >- 0x386c6000, >- 0x386c8000, >- 0x386ca000, >- 0x386cc000, >- 0x386ce000, >- 0x386d0000, >- 0x386d2000, >- 0x386d4000, >- 0x386d6000, >- 0x386d8000, >- 0x386da000, >- 0x386dc000, >- 0x386de000, >- 0x386e0000, >- 0x386e2000, >- 0x386e4000, >- 0x386e6000, >- 0x386e8000, >- 0x386ea000, >- 0x386ec000, >- 0x386ee000, >- 0x386f0000, >- 0x386f2000, >- 0x386f4000, >- 0x386f6000, >- 0x386f8000, >- 0x386fa000, >- 0x386fc000, >- 0x386fe000, >- 0x38700000, >- 0x38702000, >- 0x38704000, >- 0x38706000, >- 0x38708000, >- 0x3870a000, >- 0x3870c000, >- 0x3870e000, >- 0x38710000, >- 0x38712000, >- 0x38714000, >- 0x38716000, >- 0x38718000, >- 0x3871a000, >- 0x3871c000, >- 0x3871e000, >- 0x38720000, >- 0x38722000, >- 0x38724000, >- 0x38726000, >- 0x38728000, >- 0x3872a000, >- 0x3872c000, >- 0x3872e000, >- 0x38730000, >- 0x38732000, >- 0x38734000, >- 0x38736000, >- 0x38738000, >- 0x3873a000, >- 0x3873c000, >- 0x3873e000, >- 0x38740000, >- 0x38742000, >- 0x38744000, >- 0x38746000, >- 0x38748000, >- 0x3874a000, >- 0x3874c000, >- 0x3874e000, >- 0x38750000, >- 0x38752000, >- 0x38754000, >- 0x38756000, >- 0x38758000, >- 0x3875a000, >- 0x3875c000, >- 0x3875e000, >- 0x38760000, >- 0x38762000, >- 0x38764000, >- 0x38766000, >- 0x38768000, >- 0x3876a000, >- 0x3876c000, >- 0x3876e000, >- 0x38770000, >- 0x38772000, >- 0x38774000, >- 0x38776000, >- 0x38778000, >- 0x3877a000, >- 0x3877c000, >- 0x3877e000, >- 0x38780000, >- 0x38782000, >- 0x38784000, >- 0x38786000, >- 0x38788000, >- 0x3878a000, >- 0x3878c000, >- 0x3878e000, >- 0x38790000, >- 0x38792000, >- 0x38794000, >- 0x38796000, >- 0x38798000, >- 0x3879a000, >- 0x3879c000, >- 0x3879e000, >- 0x387a0000, >- 0x387a2000, >- 0x387a4000, >- 0x387a6000, >- 0x387a8000, >- 0x387aa000, >- 0x387ac000, >- 0x387ae000, >- 0x387b0000, >- 0x387b2000, >- 0x387b4000, >- 0x387b6000, >- 0x387b8000, >- 0x387ba000, >- 0x387bc000, >- 0x387be000, >- 0x387c0000, >- 0x387c2000, >- 0x387c4000, >- 0x387c6000, >- 0x387c8000, >- 0x387ca000, >- 0x387cc000, >- 0x387ce000, >- 0x387d0000, >- 0x387d2000, >- 0x387d4000, >- 0x387d6000, >- 0x387d8000, >- 0x387da000, >- 0x387dc000, >- 0x387de000, >- 0x387e0000, >- 0x387e2000, >- 0x387e4000, >- 0x387e6000, >- 0x387e8000, >- 0x387ea000, >- 0x387ec000, >- 0x387ee000, >- 0x387f0000, >- 0x387f2000, >- 0x387f4000, >- 0x387f6000, >- 0x387f8000, >- 0x387fa000, >- 0x387fc000, >- 0x387fe000, >+ 0x00000000, 0x33800000, 0x34000000, 0x34400000, 0x34800000, 0x34a00000, 0x34c00000, 0x34e00000, >+ 0x35000000, 0x35100000, 0x35200000, 0x35300000, 0x35400000, 0x35500000, 0x35600000, 0x35700000, >+ 0x35800000, 0x35880000, 0x35900000, 0x35980000, 0x35a00000, 0x35a80000, 0x35b00000, 0x35b80000, >+ 0x35c00000, 0x35c80000, 0x35d00000, 0x35d80000, 0x35e00000, 0x35e80000, 0x35f00000, 0x35f80000, >+ 0x36000000, 0x36040000, 0x36080000, 0x360c0000, 0x36100000, 0x36140000, 0x36180000, 0x361c0000, >+ 0x36200000, 0x36240000, 0x36280000, 0x362c0000, 0x36300000, 0x36340000, 0x36380000, 0x363c0000, >+ 0x36400000, 0x36440000, 0x36480000, 0x364c0000, 0x36500000, 0x36540000, 0x36580000, 0x365c0000, >+ 0x36600000, 0x36640000, 0x36680000, 0x366c0000, 0x36700000, 0x36740000, 0x36780000, 0x367c0000, >+ 0x36800000, 0x36820000, 0x36840000, 0x36860000, 0x36880000, 0x368a0000, 0x368c0000, 0x368e0000, >+ 0x36900000, 0x36920000, 0x36940000, 0x36960000, 0x36980000, 0x369a0000, 0x369c0000, 0x369e0000, >+ 0x36a00000, 0x36a20000, 0x36a40000, 0x36a60000, 0x36a80000, 0x36aa0000, 0x36ac0000, 0x36ae0000, >+ 0x36b00000, 0x36b20000, 0x36b40000, 0x36b60000, 0x36b80000, 0x36ba0000, 0x36bc0000, 0x36be0000, >+ 0x36c00000, 0x36c20000, 0x36c40000, 0x36c60000, 0x36c80000, 0x36ca0000, 0x36cc0000, 0x36ce0000, >+ 0x36d00000, 0x36d20000, 0x36d40000, 0x36d60000, 0x36d80000, 0x36da0000, 0x36dc0000, 0x36de0000, >+ 0x36e00000, 0x36e20000, 0x36e40000, 0x36e60000, 0x36e80000, 0x36ea0000, 0x36ec0000, 0x36ee0000, >+ 0x36f00000, 0x36f20000, 0x36f40000, 0x36f60000, 0x36f80000, 0x36fa0000, 0x36fc0000, 0x36fe0000, >+ 0x37000000, 0x37010000, 0x37020000, 0x37030000, 0x37040000, 0x37050000, 0x37060000, 0x37070000, >+ 0x37080000, 0x37090000, 0x370a0000, 0x370b0000, 0x370c0000, 0x370d0000, 0x370e0000, 0x370f0000, >+ 0x37100000, 0x37110000, 0x37120000, 0x37130000, 0x37140000, 0x37150000, 0x37160000, 0x37170000, >+ 0x37180000, 0x37190000, 0x371a0000, 0x371b0000, 0x371c0000, 0x371d0000, 0x371e0000, 0x371f0000, >+ 0x37200000, 0x37210000, 0x37220000, 0x37230000, 0x37240000, 0x37250000, 0x37260000, 0x37270000, >+ 0x37280000, 0x37290000, 0x372a0000, 0x372b0000, 0x372c0000, 0x372d0000, 0x372e0000, 0x372f0000, >+ 0x37300000, 0x37310000, 0x37320000, 0x37330000, 0x37340000, 0x37350000, 0x37360000, 0x37370000, >+ 0x37380000, 0x37390000, 0x373a0000, 0x373b0000, 0x373c0000, 0x373d0000, 0x373e0000, 0x373f0000, >+ 0x37400000, 0x37410000, 0x37420000, 0x37430000, 0x37440000, 0x37450000, 0x37460000, 0x37470000, >+ 0x37480000, 0x37490000, 0x374a0000, 0x374b0000, 0x374c0000, 0x374d0000, 0x374e0000, 0x374f0000, >+ 0x37500000, 0x37510000, 0x37520000, 0x37530000, 0x37540000, 0x37550000, 0x37560000, 0x37570000, >+ 0x37580000, 0x37590000, 0x375a0000, 0x375b0000, 0x375c0000, 0x375d0000, 0x375e0000, 0x375f0000, >+ 0x37600000, 0x37610000, 0x37620000, 0x37630000, 0x37640000, 0x37650000, 0x37660000, 0x37670000, >+ 0x37680000, 0x37690000, 0x376a0000, 0x376b0000, 0x376c0000, 0x376d0000, 0x376e0000, 0x376f0000, >+ 0x37700000, 0x37710000, 0x37720000, 0x37730000, 0x37740000, 0x37750000, 0x37760000, 0x37770000, >+ 0x37780000, 0x37790000, 0x377a0000, 0x377b0000, 0x377c0000, 0x377d0000, 0x377e0000, 0x377f0000, >+ 0x37800000, 0x37808000, 0x37810000, 0x37818000, 0x37820000, 0x37828000, 0x37830000, 0x37838000, >+ 0x37840000, 0x37848000, 0x37850000, 0x37858000, 0x37860000, 0x37868000, 0x37870000, 0x37878000, >+ 0x37880000, 0x37888000, 0x37890000, 0x37898000, 0x378a0000, 0x378a8000, 0x378b0000, 0x378b8000, >+ 0x378c0000, 0x378c8000, 0x378d0000, 0x378d8000, 0x378e0000, 0x378e8000, 0x378f0000, 0x378f8000, >+ 0x37900000, 0x37908000, 0x37910000, 0x37918000, 0x37920000, 0x37928000, 0x37930000, 0x37938000, >+ 0x37940000, 0x37948000, 0x37950000, 0x37958000, 0x37960000, 0x37968000, 0x37970000, 0x37978000, >+ 0x37980000, 0x37988000, 0x37990000, 0x37998000, 0x379a0000, 0x379a8000, 0x379b0000, 0x379b8000, >+ 0x379c0000, 0x379c8000, 0x379d0000, 0x379d8000, 0x379e0000, 0x379e8000, 0x379f0000, 0x379f8000, >+ 0x37a00000, 0x37a08000, 0x37a10000, 0x37a18000, 0x37a20000, 0x37a28000, 0x37a30000, 0x37a38000, >+ 0x37a40000, 0x37a48000, 0x37a50000, 0x37a58000, 0x37a60000, 0x37a68000, 0x37a70000, 0x37a78000, >+ 0x37a80000, 0x37a88000, 0x37a90000, 0x37a98000, 0x37aa0000, 0x37aa8000, 0x37ab0000, 0x37ab8000, >+ 0x37ac0000, 0x37ac8000, 0x37ad0000, 0x37ad8000, 0x37ae0000, 0x37ae8000, 0x37af0000, 0x37af8000, >+ 0x37b00000, 0x37b08000, 0x37b10000, 0x37b18000, 0x37b20000, 0x37b28000, 0x37b30000, 0x37b38000, >+ 0x37b40000, 0x37b48000, 0x37b50000, 0x37b58000, 0x37b60000, 0x37b68000, 0x37b70000, 0x37b78000, >+ 0x37b80000, 0x37b88000, 0x37b90000, 0x37b98000, 0x37ba0000, 0x37ba8000, 0x37bb0000, 0x37bb8000, >+ 0x37bc0000, 0x37bc8000, 0x37bd0000, 0x37bd8000, 0x37be0000, 0x37be8000, 0x37bf0000, 0x37bf8000, >+ 0x37c00000, 0x37c08000, 0x37c10000, 0x37c18000, 0x37c20000, 0x37c28000, 0x37c30000, 0x37c38000, >+ 0x37c40000, 0x37c48000, 0x37c50000, 0x37c58000, 0x37c60000, 0x37c68000, 0x37c70000, 0x37c78000, >+ 0x37c80000, 0x37c88000, 0x37c90000, 0x37c98000, 0x37ca0000, 0x37ca8000, 0x37cb0000, 0x37cb8000, >+ 0x37cc0000, 0x37cc8000, 0x37cd0000, 0x37cd8000, 0x37ce0000, 0x37ce8000, 0x37cf0000, 0x37cf8000, >+ 0x37d00000, 0x37d08000, 0x37d10000, 0x37d18000, 0x37d20000, 0x37d28000, 0x37d30000, 0x37d38000, >+ 0x37d40000, 0x37d48000, 0x37d50000, 0x37d58000, 0x37d60000, 0x37d68000, 0x37d70000, 0x37d78000, >+ 0x37d80000, 0x37d88000, 0x37d90000, 0x37d98000, 0x37da0000, 0x37da8000, 0x37db0000, 0x37db8000, >+ 0x37dc0000, 0x37dc8000, 0x37dd0000, 0x37dd8000, 0x37de0000, 0x37de8000, 0x37df0000, 0x37df8000, >+ 0x37e00000, 0x37e08000, 0x37e10000, 0x37e18000, 0x37e20000, 0x37e28000, 0x37e30000, 0x37e38000, >+ 0x37e40000, 0x37e48000, 0x37e50000, 0x37e58000, 0x37e60000, 0x37e68000, 0x37e70000, 0x37e78000, >+ 0x37e80000, 0x37e88000, 0x37e90000, 0x37e98000, 0x37ea0000, 0x37ea8000, 0x37eb0000, 0x37eb8000, >+ 0x37ec0000, 0x37ec8000, 0x37ed0000, 0x37ed8000, 0x37ee0000, 0x37ee8000, 0x37ef0000, 0x37ef8000, >+ 0x37f00000, 0x37f08000, 0x37f10000, 0x37f18000, 0x37f20000, 0x37f28000, 0x37f30000, 0x37f38000, >+ 0x37f40000, 0x37f48000, 0x37f50000, 0x37f58000, 0x37f60000, 0x37f68000, 0x37f70000, 0x37f78000, >+ 0x37f80000, 0x37f88000, 0x37f90000, 0x37f98000, 0x37fa0000, 0x37fa8000, 0x37fb0000, 0x37fb8000, >+ 0x37fc0000, 0x37fc8000, 0x37fd0000, 0x37fd8000, 0x37fe0000, 0x37fe8000, 0x37ff0000, 0x37ff8000, >+ 0x38000000, 0x38004000, 0x38008000, 0x3800c000, 0x38010000, 0x38014000, 0x38018000, 0x3801c000, >+ 0x38020000, 0x38024000, 0x38028000, 0x3802c000, 0x38030000, 0x38034000, 0x38038000, 0x3803c000, >+ 0x38040000, 0x38044000, 0x38048000, 0x3804c000, 0x38050000, 0x38054000, 0x38058000, 0x3805c000, >+ 0x38060000, 0x38064000, 0x38068000, 0x3806c000, 0x38070000, 0x38074000, 0x38078000, 0x3807c000, >+ 0x38080000, 0x38084000, 0x38088000, 0x3808c000, 0x38090000, 0x38094000, 0x38098000, 0x3809c000, >+ 0x380a0000, 0x380a4000, 0x380a8000, 0x380ac000, 0x380b0000, 0x380b4000, 0x380b8000, 0x380bc000, >+ 0x380c0000, 0x380c4000, 0x380c8000, 0x380cc000, 0x380d0000, 0x380d4000, 0x380d8000, 0x380dc000, >+ 0x380e0000, 0x380e4000, 0x380e8000, 0x380ec000, 0x380f0000, 0x380f4000, 0x380f8000, 0x380fc000, >+ 0x38100000, 0x38104000, 0x38108000, 0x3810c000, 0x38110000, 0x38114000, 0x38118000, 0x3811c000, >+ 0x38120000, 0x38124000, 0x38128000, 0x3812c000, 0x38130000, 0x38134000, 0x38138000, 0x3813c000, >+ 0x38140000, 0x38144000, 0x38148000, 0x3814c000, 0x38150000, 0x38154000, 0x38158000, 0x3815c000, >+ 0x38160000, 0x38164000, 0x38168000, 0x3816c000, 0x38170000, 0x38174000, 0x38178000, 0x3817c000, >+ 0x38180000, 0x38184000, 0x38188000, 0x3818c000, 0x38190000, 0x38194000, 0x38198000, 0x3819c000, >+ 0x381a0000, 0x381a4000, 0x381a8000, 0x381ac000, 0x381b0000, 0x381b4000, 0x381b8000, 0x381bc000, >+ 0x381c0000, 0x381c4000, 0x381c8000, 0x381cc000, 0x381d0000, 0x381d4000, 0x381d8000, 0x381dc000, >+ 0x381e0000, 0x381e4000, 0x381e8000, 0x381ec000, 0x381f0000, 0x381f4000, 0x381f8000, 0x381fc000, >+ 0x38200000, 0x38204000, 0x38208000, 0x3820c000, 0x38210000, 0x38214000, 0x38218000, 0x3821c000, >+ 0x38220000, 0x38224000, 0x38228000, 0x3822c000, 0x38230000, 0x38234000, 0x38238000, 0x3823c000, >+ 0x38240000, 0x38244000, 0x38248000, 0x3824c000, 0x38250000, 0x38254000, 0x38258000, 0x3825c000, >+ 0x38260000, 0x38264000, 0x38268000, 0x3826c000, 0x38270000, 0x38274000, 0x38278000, 0x3827c000, >+ 0x38280000, 0x38284000, 0x38288000, 0x3828c000, 0x38290000, 0x38294000, 0x38298000, 0x3829c000, >+ 0x382a0000, 0x382a4000, 0x382a8000, 0x382ac000, 0x382b0000, 0x382b4000, 0x382b8000, 0x382bc000, >+ 0x382c0000, 0x382c4000, 0x382c8000, 0x382cc000, 0x382d0000, 0x382d4000, 0x382d8000, 0x382dc000, >+ 0x382e0000, 0x382e4000, 0x382e8000, 0x382ec000, 0x382f0000, 0x382f4000, 0x382f8000, 0x382fc000, >+ 0x38300000, 0x38304000, 0x38308000, 0x3830c000, 0x38310000, 0x38314000, 0x38318000, 0x3831c000, >+ 0x38320000, 0x38324000, 0x38328000, 0x3832c000, 0x38330000, 0x38334000, 0x38338000, 0x3833c000, >+ 0x38340000, 0x38344000, 0x38348000, 0x3834c000, 0x38350000, 0x38354000, 0x38358000, 0x3835c000, >+ 0x38360000, 0x38364000, 0x38368000, 0x3836c000, 0x38370000, 0x38374000, 0x38378000, 0x3837c000, >+ 0x38380000, 0x38384000, 0x38388000, 0x3838c000, 0x38390000, 0x38394000, 0x38398000, 0x3839c000, >+ 0x383a0000, 0x383a4000, 0x383a8000, 0x383ac000, 0x383b0000, 0x383b4000, 0x383b8000, 0x383bc000, >+ 0x383c0000, 0x383c4000, 0x383c8000, 0x383cc000, 0x383d0000, 0x383d4000, 0x383d8000, 0x383dc000, >+ 0x383e0000, 0x383e4000, 0x383e8000, 0x383ec000, 0x383f0000, 0x383f4000, 0x383f8000, 0x383fc000, >+ 0x38400000, 0x38404000, 0x38408000, 0x3840c000, 0x38410000, 0x38414000, 0x38418000, 0x3841c000, >+ 0x38420000, 0x38424000, 0x38428000, 0x3842c000, 0x38430000, 0x38434000, 0x38438000, 0x3843c000, >+ 0x38440000, 0x38444000, 0x38448000, 0x3844c000, 0x38450000, 0x38454000, 0x38458000, 0x3845c000, >+ 0x38460000, 0x38464000, 0x38468000, 0x3846c000, 0x38470000, 0x38474000, 0x38478000, 0x3847c000, >+ 0x38480000, 0x38484000, 0x38488000, 0x3848c000, 0x38490000, 0x38494000, 0x38498000, 0x3849c000, >+ 0x384a0000, 0x384a4000, 0x384a8000, 0x384ac000, 0x384b0000, 0x384b4000, 0x384b8000, 0x384bc000, >+ 0x384c0000, 0x384c4000, 0x384c8000, 0x384cc000, 0x384d0000, 0x384d4000, 0x384d8000, 0x384dc000, >+ 0x384e0000, 0x384e4000, 0x384e8000, 0x384ec000, 0x384f0000, 0x384f4000, 0x384f8000, 0x384fc000, >+ 0x38500000, 0x38504000, 0x38508000, 0x3850c000, 0x38510000, 0x38514000, 0x38518000, 0x3851c000, >+ 0x38520000, 0x38524000, 0x38528000, 0x3852c000, 0x38530000, 0x38534000, 0x38538000, 0x3853c000, >+ 0x38540000, 0x38544000, 0x38548000, 0x3854c000, 0x38550000, 0x38554000, 0x38558000, 0x3855c000, >+ 0x38560000, 0x38564000, 0x38568000, 0x3856c000, 0x38570000, 0x38574000, 0x38578000, 0x3857c000, >+ 0x38580000, 0x38584000, 0x38588000, 0x3858c000, 0x38590000, 0x38594000, 0x38598000, 0x3859c000, >+ 0x385a0000, 0x385a4000, 0x385a8000, 0x385ac000, 0x385b0000, 0x385b4000, 0x385b8000, 0x385bc000, >+ 0x385c0000, 0x385c4000, 0x385c8000, 0x385cc000, 0x385d0000, 0x385d4000, 0x385d8000, 0x385dc000, >+ 0x385e0000, 0x385e4000, 0x385e8000, 0x385ec000, 0x385f0000, 0x385f4000, 0x385f8000, 0x385fc000, >+ 0x38600000, 0x38604000, 0x38608000, 0x3860c000, 0x38610000, 0x38614000, 0x38618000, 0x3861c000, >+ 0x38620000, 0x38624000, 0x38628000, 0x3862c000, 0x38630000, 0x38634000, 0x38638000, 0x3863c000, >+ 0x38640000, 0x38644000, 0x38648000, 0x3864c000, 0x38650000, 0x38654000, 0x38658000, 0x3865c000, >+ 0x38660000, 0x38664000, 0x38668000, 0x3866c000, 0x38670000, 0x38674000, 0x38678000, 0x3867c000, >+ 0x38680000, 0x38684000, 0x38688000, 0x3868c000, 0x38690000, 0x38694000, 0x38698000, 0x3869c000, >+ 0x386a0000, 0x386a4000, 0x386a8000, 0x386ac000, 0x386b0000, 0x386b4000, 0x386b8000, 0x386bc000, >+ 0x386c0000, 0x386c4000, 0x386c8000, 0x386cc000, 0x386d0000, 0x386d4000, 0x386d8000, 0x386dc000, >+ 0x386e0000, 0x386e4000, 0x386e8000, 0x386ec000, 0x386f0000, 0x386f4000, 0x386f8000, 0x386fc000, >+ 0x38700000, 0x38704000, 0x38708000, 0x3870c000, 0x38710000, 0x38714000, 0x38718000, 0x3871c000, >+ 0x38720000, 0x38724000, 0x38728000, 0x3872c000, 0x38730000, 0x38734000, 0x38738000, 0x3873c000, >+ 0x38740000, 0x38744000, 0x38748000, 0x3874c000, 0x38750000, 0x38754000, 0x38758000, 0x3875c000, >+ 0x38760000, 0x38764000, 0x38768000, 0x3876c000, 0x38770000, 0x38774000, 0x38778000, 0x3877c000, >+ 0x38780000, 0x38784000, 0x38788000, 0x3878c000, 0x38790000, 0x38794000, 0x38798000, 0x3879c000, >+ 0x387a0000, 0x387a4000, 0x387a8000, 0x387ac000, 0x387b0000, 0x387b4000, 0x387b8000, 0x387bc000, >+ 0x387c0000, 0x387c4000, 0x387c8000, 0x387cc000, 0x387d0000, 0x387d4000, 0x387d8000, 0x387dc000, >+ 0x387e0000, 0x387e4000, 0x387e8000, 0x387ec000, 0x387f0000, 0x387f4000, 0x387f8000, 0x387fc000, >+ 0x38000000, 0x38002000, 0x38004000, 0x38006000, 0x38008000, 0x3800a000, 0x3800c000, 0x3800e000, >+ 0x38010000, 0x38012000, 0x38014000, 0x38016000, 0x38018000, 0x3801a000, 0x3801c000, 0x3801e000, >+ 0x38020000, 0x38022000, 0x38024000, 0x38026000, 0x38028000, 0x3802a000, 0x3802c000, 0x3802e000, >+ 0x38030000, 0x38032000, 0x38034000, 0x38036000, 0x38038000, 0x3803a000, 0x3803c000, 0x3803e000, >+ 0x38040000, 0x38042000, 0x38044000, 0x38046000, 0x38048000, 0x3804a000, 0x3804c000, 0x3804e000, >+ 0x38050000, 0x38052000, 0x38054000, 0x38056000, 0x38058000, 0x3805a000, 0x3805c000, 0x3805e000, >+ 0x38060000, 0x38062000, 0x38064000, 0x38066000, 0x38068000, 0x3806a000, 0x3806c000, 0x3806e000, >+ 0x38070000, 0x38072000, 0x38074000, 0x38076000, 0x38078000, 0x3807a000, 0x3807c000, 0x3807e000, >+ 0x38080000, 0x38082000, 0x38084000, 0x38086000, 0x38088000, 0x3808a000, 0x3808c000, 0x3808e000, >+ 0x38090000, 0x38092000, 0x38094000, 0x38096000, 0x38098000, 0x3809a000, 0x3809c000, 0x3809e000, >+ 0x380a0000, 0x380a2000, 0x380a4000, 0x380a6000, 0x380a8000, 0x380aa000, 0x380ac000, 0x380ae000, >+ 0x380b0000, 0x380b2000, 0x380b4000, 0x380b6000, 0x380b8000, 0x380ba000, 0x380bc000, 0x380be000, >+ 0x380c0000, 0x380c2000, 0x380c4000, 0x380c6000, 0x380c8000, 0x380ca000, 0x380cc000, 0x380ce000, >+ 0x380d0000, 0x380d2000, 0x380d4000, 0x380d6000, 0x380d8000, 0x380da000, 0x380dc000, 0x380de000, >+ 0x380e0000, 0x380e2000, 0x380e4000, 0x380e6000, 0x380e8000, 0x380ea000, 0x380ec000, 0x380ee000, >+ 0x380f0000, 0x380f2000, 0x380f4000, 0x380f6000, 0x380f8000, 0x380fa000, 0x380fc000, 0x380fe000, >+ 0x38100000, 0x38102000, 0x38104000, 0x38106000, 0x38108000, 0x3810a000, 0x3810c000, 0x3810e000, >+ 0x38110000, 0x38112000, 0x38114000, 0x38116000, 0x38118000, 0x3811a000, 0x3811c000, 0x3811e000, >+ 0x38120000, 0x38122000, 0x38124000, 0x38126000, 0x38128000, 0x3812a000, 0x3812c000, 0x3812e000, >+ 0x38130000, 0x38132000, 0x38134000, 0x38136000, 0x38138000, 0x3813a000, 0x3813c000, 0x3813e000, >+ 0x38140000, 0x38142000, 0x38144000, 0x38146000, 0x38148000, 0x3814a000, 0x3814c000, 0x3814e000, >+ 0x38150000, 0x38152000, 0x38154000, 0x38156000, 0x38158000, 0x3815a000, 0x3815c000, 0x3815e000, >+ 0x38160000, 0x38162000, 0x38164000, 0x38166000, 0x38168000, 0x3816a000, 0x3816c000, 0x3816e000, >+ 0x38170000, 0x38172000, 0x38174000, 0x38176000, 0x38178000, 0x3817a000, 0x3817c000, 0x3817e000, >+ 0x38180000, 0x38182000, 0x38184000, 0x38186000, 0x38188000, 0x3818a000, 0x3818c000, 0x3818e000, >+ 0x38190000, 0x38192000, 0x38194000, 0x38196000, 0x38198000, 0x3819a000, 0x3819c000, 0x3819e000, >+ 0x381a0000, 0x381a2000, 0x381a4000, 0x381a6000, 0x381a8000, 0x381aa000, 0x381ac000, 0x381ae000, >+ 0x381b0000, 0x381b2000, 0x381b4000, 0x381b6000, 0x381b8000, 0x381ba000, 0x381bc000, 0x381be000, >+ 0x381c0000, 0x381c2000, 0x381c4000, 0x381c6000, 0x381c8000, 0x381ca000, 0x381cc000, 0x381ce000, >+ 0x381d0000, 0x381d2000, 0x381d4000, 0x381d6000, 0x381d8000, 0x381da000, 0x381dc000, 0x381de000, >+ 0x381e0000, 0x381e2000, 0x381e4000, 0x381e6000, 0x381e8000, 0x381ea000, 0x381ec000, 0x381ee000, >+ 0x381f0000, 0x381f2000, 0x381f4000, 0x381f6000, 0x381f8000, 0x381fa000, 0x381fc000, 0x381fe000, >+ 0x38200000, 0x38202000, 0x38204000, 0x38206000, 0x38208000, 0x3820a000, 0x3820c000, 0x3820e000, >+ 0x38210000, 0x38212000, 0x38214000, 0x38216000, 0x38218000, 0x3821a000, 0x3821c000, 0x3821e000, >+ 0x38220000, 0x38222000, 0x38224000, 0x38226000, 0x38228000, 0x3822a000, 0x3822c000, 0x3822e000, >+ 0x38230000, 0x38232000, 0x38234000, 0x38236000, 0x38238000, 0x3823a000, 0x3823c000, 0x3823e000, >+ 0x38240000, 0x38242000, 0x38244000, 0x38246000, 0x38248000, 0x3824a000, 0x3824c000, 0x3824e000, >+ 0x38250000, 0x38252000, 0x38254000, 0x38256000, 0x38258000, 0x3825a000, 0x3825c000, 0x3825e000, >+ 0x38260000, 0x38262000, 0x38264000, 0x38266000, 0x38268000, 0x3826a000, 0x3826c000, 0x3826e000, >+ 0x38270000, 0x38272000, 0x38274000, 0x38276000, 0x38278000, 0x3827a000, 0x3827c000, 0x3827e000, >+ 0x38280000, 0x38282000, 0x38284000, 0x38286000, 0x38288000, 0x3828a000, 0x3828c000, 0x3828e000, >+ 0x38290000, 0x38292000, 0x38294000, 0x38296000, 0x38298000, 0x3829a000, 0x3829c000, 0x3829e000, >+ 0x382a0000, 0x382a2000, 0x382a4000, 0x382a6000, 0x382a8000, 0x382aa000, 0x382ac000, 0x382ae000, >+ 0x382b0000, 0x382b2000, 0x382b4000, 0x382b6000, 0x382b8000, 0x382ba000, 0x382bc000, 0x382be000, >+ 0x382c0000, 0x382c2000, 0x382c4000, 0x382c6000, 0x382c8000, 0x382ca000, 0x382cc000, 0x382ce000, >+ 0x382d0000, 0x382d2000, 0x382d4000, 0x382d6000, 0x382d8000, 0x382da000, 0x382dc000, 0x382de000, >+ 0x382e0000, 0x382e2000, 0x382e4000, 0x382e6000, 0x382e8000, 0x382ea000, 0x382ec000, 0x382ee000, >+ 0x382f0000, 0x382f2000, 0x382f4000, 0x382f6000, 0x382f8000, 0x382fa000, 0x382fc000, 0x382fe000, >+ 0x38300000, 0x38302000, 0x38304000, 0x38306000, 0x38308000, 0x3830a000, 0x3830c000, 0x3830e000, >+ 0x38310000, 0x38312000, 0x38314000, 0x38316000, 0x38318000, 0x3831a000, 0x3831c000, 0x3831e000, >+ 0x38320000, 0x38322000, 0x38324000, 0x38326000, 0x38328000, 0x3832a000, 0x3832c000, 0x3832e000, >+ 0x38330000, 0x38332000, 0x38334000, 0x38336000, 0x38338000, 0x3833a000, 0x3833c000, 0x3833e000, >+ 0x38340000, 0x38342000, 0x38344000, 0x38346000, 0x38348000, 0x3834a000, 0x3834c000, 0x3834e000, >+ 0x38350000, 0x38352000, 0x38354000, 0x38356000, 0x38358000, 0x3835a000, 0x3835c000, 0x3835e000, >+ 0x38360000, 0x38362000, 0x38364000, 0x38366000, 0x38368000, 0x3836a000, 0x3836c000, 0x3836e000, >+ 0x38370000, 0x38372000, 0x38374000, 0x38376000, 0x38378000, 0x3837a000, 0x3837c000, 0x3837e000, >+ 0x38380000, 0x38382000, 0x38384000, 0x38386000, 0x38388000, 0x3838a000, 0x3838c000, 0x3838e000, >+ 0x38390000, 0x38392000, 0x38394000, 0x38396000, 0x38398000, 0x3839a000, 0x3839c000, 0x3839e000, >+ 0x383a0000, 0x383a2000, 0x383a4000, 0x383a6000, 0x383a8000, 0x383aa000, 0x383ac000, 0x383ae000, >+ 0x383b0000, 0x383b2000, 0x383b4000, 0x383b6000, 0x383b8000, 0x383ba000, 0x383bc000, 0x383be000, >+ 0x383c0000, 0x383c2000, 0x383c4000, 0x383c6000, 0x383c8000, 0x383ca000, 0x383cc000, 0x383ce000, >+ 0x383d0000, 0x383d2000, 0x383d4000, 0x383d6000, 0x383d8000, 0x383da000, 0x383dc000, 0x383de000, >+ 0x383e0000, 0x383e2000, 0x383e4000, 0x383e6000, 0x383e8000, 0x383ea000, 0x383ec000, 0x383ee000, >+ 0x383f0000, 0x383f2000, 0x383f4000, 0x383f6000, 0x383f8000, 0x383fa000, 0x383fc000, 0x383fe000, >+ 0x38400000, 0x38402000, 0x38404000, 0x38406000, 0x38408000, 0x3840a000, 0x3840c000, 0x3840e000, >+ 0x38410000, 0x38412000, 0x38414000, 0x38416000, 0x38418000, 0x3841a000, 0x3841c000, 0x3841e000, >+ 0x38420000, 0x38422000, 0x38424000, 0x38426000, 0x38428000, 0x3842a000, 0x3842c000, 0x3842e000, >+ 0x38430000, 0x38432000, 0x38434000, 0x38436000, 0x38438000, 0x3843a000, 0x3843c000, 0x3843e000, >+ 0x38440000, 0x38442000, 0x38444000, 0x38446000, 0x38448000, 0x3844a000, 0x3844c000, 0x3844e000, >+ 0x38450000, 0x38452000, 0x38454000, 0x38456000, 0x38458000, 0x3845a000, 0x3845c000, 0x3845e000, >+ 0x38460000, 0x38462000, 0x38464000, 0x38466000, 0x38468000, 0x3846a000, 0x3846c000, 0x3846e000, >+ 0x38470000, 0x38472000, 0x38474000, 0x38476000, 0x38478000, 0x3847a000, 0x3847c000, 0x3847e000, >+ 0x38480000, 0x38482000, 0x38484000, 0x38486000, 0x38488000, 0x3848a000, 0x3848c000, 0x3848e000, >+ 0x38490000, 0x38492000, 0x38494000, 0x38496000, 0x38498000, 0x3849a000, 0x3849c000, 0x3849e000, >+ 0x384a0000, 0x384a2000, 0x384a4000, 0x384a6000, 0x384a8000, 0x384aa000, 0x384ac000, 0x384ae000, >+ 0x384b0000, 0x384b2000, 0x384b4000, 0x384b6000, 0x384b8000, 0x384ba000, 0x384bc000, 0x384be000, >+ 0x384c0000, 0x384c2000, 0x384c4000, 0x384c6000, 0x384c8000, 0x384ca000, 0x384cc000, 0x384ce000, >+ 0x384d0000, 0x384d2000, 0x384d4000, 0x384d6000, 0x384d8000, 0x384da000, 0x384dc000, 0x384de000, >+ 0x384e0000, 0x384e2000, 0x384e4000, 0x384e6000, 0x384e8000, 0x384ea000, 0x384ec000, 0x384ee000, >+ 0x384f0000, 0x384f2000, 0x384f4000, 0x384f6000, 0x384f8000, 0x384fa000, 0x384fc000, 0x384fe000, >+ 0x38500000, 0x38502000, 0x38504000, 0x38506000, 0x38508000, 0x3850a000, 0x3850c000, 0x3850e000, >+ 0x38510000, 0x38512000, 0x38514000, 0x38516000, 0x38518000, 0x3851a000, 0x3851c000, 0x3851e000, >+ 0x38520000, 0x38522000, 0x38524000, 0x38526000, 0x38528000, 0x3852a000, 0x3852c000, 0x3852e000, >+ 0x38530000, 0x38532000, 0x38534000, 0x38536000, 0x38538000, 0x3853a000, 0x3853c000, 0x3853e000, >+ 0x38540000, 0x38542000, 0x38544000, 0x38546000, 0x38548000, 0x3854a000, 0x3854c000, 0x3854e000, >+ 0x38550000, 0x38552000, 0x38554000, 0x38556000, 0x38558000, 0x3855a000, 0x3855c000, 0x3855e000, >+ 0x38560000, 0x38562000, 0x38564000, 0x38566000, 0x38568000, 0x3856a000, 0x3856c000, 0x3856e000, >+ 0x38570000, 0x38572000, 0x38574000, 0x38576000, 0x38578000, 0x3857a000, 0x3857c000, 0x3857e000, >+ 0x38580000, 0x38582000, 0x38584000, 0x38586000, 0x38588000, 0x3858a000, 0x3858c000, 0x3858e000, >+ 0x38590000, 0x38592000, 0x38594000, 0x38596000, 0x38598000, 0x3859a000, 0x3859c000, 0x3859e000, >+ 0x385a0000, 0x385a2000, 0x385a4000, 0x385a6000, 0x385a8000, 0x385aa000, 0x385ac000, 0x385ae000, >+ 0x385b0000, 0x385b2000, 0x385b4000, 0x385b6000, 0x385b8000, 0x385ba000, 0x385bc000, 0x385be000, >+ 0x385c0000, 0x385c2000, 0x385c4000, 0x385c6000, 0x385c8000, 0x385ca000, 0x385cc000, 0x385ce000, >+ 0x385d0000, 0x385d2000, 0x385d4000, 0x385d6000, 0x385d8000, 0x385da000, 0x385dc000, 0x385de000, >+ 0x385e0000, 0x385e2000, 0x385e4000, 0x385e6000, 0x385e8000, 0x385ea000, 0x385ec000, 0x385ee000, >+ 0x385f0000, 0x385f2000, 0x385f4000, 0x385f6000, 0x385f8000, 0x385fa000, 0x385fc000, 0x385fe000, >+ 0x38600000, 0x38602000, 0x38604000, 0x38606000, 0x38608000, 0x3860a000, 0x3860c000, 0x3860e000, >+ 0x38610000, 0x38612000, 0x38614000, 0x38616000, 0x38618000, 0x3861a000, 0x3861c000, 0x3861e000, >+ 0x38620000, 0x38622000, 0x38624000, 0x38626000, 0x38628000, 0x3862a000, 0x3862c000, 0x3862e000, >+ 0x38630000, 0x38632000, 0x38634000, 0x38636000, 0x38638000, 0x3863a000, 0x3863c000, 0x3863e000, >+ 0x38640000, 0x38642000, 0x38644000, 0x38646000, 0x38648000, 0x3864a000, 0x3864c000, 0x3864e000, >+ 0x38650000, 0x38652000, 0x38654000, 0x38656000, 0x38658000, 0x3865a000, 0x3865c000, 0x3865e000, >+ 0x38660000, 0x38662000, 0x38664000, 0x38666000, 0x38668000, 0x3866a000, 0x3866c000, 0x3866e000, >+ 0x38670000, 0x38672000, 0x38674000, 0x38676000, 0x38678000, 0x3867a000, 0x3867c000, 0x3867e000, >+ 0x38680000, 0x38682000, 0x38684000, 0x38686000, 0x38688000, 0x3868a000, 0x3868c000, 0x3868e000, >+ 0x38690000, 0x38692000, 0x38694000, 0x38696000, 0x38698000, 0x3869a000, 0x3869c000, 0x3869e000, >+ 0x386a0000, 0x386a2000, 0x386a4000, 0x386a6000, 0x386a8000, 0x386aa000, 0x386ac000, 0x386ae000, >+ 0x386b0000, 0x386b2000, 0x386b4000, 0x386b6000, 0x386b8000, 0x386ba000, 0x386bc000, 0x386be000, >+ 0x386c0000, 0x386c2000, 0x386c4000, 0x386c6000, 0x386c8000, 0x386ca000, 0x386cc000, 0x386ce000, >+ 0x386d0000, 0x386d2000, 0x386d4000, 0x386d6000, 0x386d8000, 0x386da000, 0x386dc000, 0x386de000, >+ 0x386e0000, 0x386e2000, 0x386e4000, 0x386e6000, 0x386e8000, 0x386ea000, 0x386ec000, 0x386ee000, >+ 0x386f0000, 0x386f2000, 0x386f4000, 0x386f6000, 0x386f8000, 0x386fa000, 0x386fc000, 0x386fe000, >+ 0x38700000, 0x38702000, 0x38704000, 0x38706000, 0x38708000, 0x3870a000, 0x3870c000, 0x3870e000, >+ 0x38710000, 0x38712000, 0x38714000, 0x38716000, 0x38718000, 0x3871a000, 0x3871c000, 0x3871e000, >+ 0x38720000, 0x38722000, 0x38724000, 0x38726000, 0x38728000, 0x3872a000, 0x3872c000, 0x3872e000, >+ 0x38730000, 0x38732000, 0x38734000, 0x38736000, 0x38738000, 0x3873a000, 0x3873c000, 0x3873e000, >+ 0x38740000, 0x38742000, 0x38744000, 0x38746000, 0x38748000, 0x3874a000, 0x3874c000, 0x3874e000, >+ 0x38750000, 0x38752000, 0x38754000, 0x38756000, 0x38758000, 0x3875a000, 0x3875c000, 0x3875e000, >+ 0x38760000, 0x38762000, 0x38764000, 0x38766000, 0x38768000, 0x3876a000, 0x3876c000, 0x3876e000, >+ 0x38770000, 0x38772000, 0x38774000, 0x38776000, 0x38778000, 0x3877a000, 0x3877c000, 0x3877e000, >+ 0x38780000, 0x38782000, 0x38784000, 0x38786000, 0x38788000, 0x3878a000, 0x3878c000, 0x3878e000, >+ 0x38790000, 0x38792000, 0x38794000, 0x38796000, 0x38798000, 0x3879a000, 0x3879c000, 0x3879e000, >+ 0x387a0000, 0x387a2000, 0x387a4000, 0x387a6000, 0x387a8000, 0x387aa000, 0x387ac000, 0x387ae000, >+ 0x387b0000, 0x387b2000, 0x387b4000, 0x387b6000, 0x387b8000, 0x387ba000, 0x387bc000, 0x387be000, >+ 0x387c0000, 0x387c2000, 0x387c4000, 0x387c6000, 0x387c8000, 0x387ca000, 0x387cc000, 0x387ce000, >+ 0x387d0000, 0x387d2000, 0x387d4000, 0x387d6000, 0x387d8000, 0x387da000, 0x387dc000, 0x387de000, >+ 0x387e0000, 0x387e2000, 0x387e4000, 0x387e6000, 0x387e8000, 0x387ea000, 0x387ec000, 0x387ee000, >+ 0x387f0000, 0x387f2000, 0x387f4000, 0x387f6000, 0x387f8000, 0x387fa000, 0x387fc000, 0x387fe000, > }; > > const static unsigned g_exponent[64] = { >- 0x00000000, >- 0x00800000, >- 0x01000000, >- 0x01800000, >- 0x02000000, >- 0x02800000, >- 0x03000000, >- 0x03800000, >- 0x04000000, >- 0x04800000, >- 0x05000000, >- 0x05800000, >- 0x06000000, >- 0x06800000, >- 0x07000000, >- 0x07800000, >- 0x08000000, >- 0x08800000, >- 0x09000000, >- 0x09800000, >- 0x0a000000, >- 0x0a800000, >- 0x0b000000, >- 0x0b800000, >- 0x0c000000, >- 0x0c800000, >- 0x0d000000, >- 0x0d800000, >- 0x0e000000, >- 0x0e800000, >- 0x0f000000, >- 0x47800000, >- 0x80000000, >- 0x80800000, >- 0x81000000, >- 0x81800000, >- 0x82000000, >- 0x82800000, >- 0x83000000, >- 0x83800000, >- 0x84000000, >- 0x84800000, >- 0x85000000, >- 0x85800000, >- 0x86000000, >- 0x86800000, >- 0x87000000, >- 0x87800000, >- 0x88000000, >- 0x88800000, >- 0x89000000, >- 0x89800000, >- 0x8a000000, >- 0x8a800000, >- 0x8b000000, >- 0x8b800000, >- 0x8c000000, >- 0x8c800000, >- 0x8d000000, >- 0x8d800000, >- 0x8e000000, >- 0x8e800000, >- 0x8f000000, >- 0xc7800000, >+ 0x00000000, 0x00800000, 0x01000000, 0x01800000, 0x02000000, 0x02800000, 0x03000000, 0x03800000, >+ 0x04000000, 0x04800000, 0x05000000, 0x05800000, 0x06000000, 0x06800000, 0x07000000, 0x07800000, >+ 0x08000000, 0x08800000, 0x09000000, 0x09800000, 0x0a000000, 0x0a800000, 0x0b000000, 0x0b800000, >+ 0x0c000000, 0x0c800000, 0x0d000000, 0x0d800000, 0x0e000000, 0x0e800000, 0x0f000000, 0x47800000, >+ 0x80000000, 0x80800000, 0x81000000, 0x81800000, 0x82000000, 0x82800000, 0x83000000, 0x83800000, >+ 0x84000000, 0x84800000, 0x85000000, 0x85800000, 0x86000000, 0x86800000, 0x87000000, 0x87800000, >+ 0x88000000, 0x88800000, 0x89000000, 0x89800000, 0x8a000000, 0x8a800000, 0x8b000000, 0x8b800000, >+ 0x8c000000, 0x8c800000, 0x8d000000, 0x8d800000, 0x8e000000, 0x8e800000, 0x8f000000, 0xc7800000, > }; > > const static unsigned g_offset[64] = { >- 0x00000000, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000000, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >- 0x00000400, >+ 0x00000000, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, >+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, >+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, >+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, >+ 0x00000000, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, >+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, >+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, >+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, > }; > > float float16ToFloat32(unsigned short h) >@@ -2201,5 +297,4 @@ float float16ToFloat32(unsigned short h) > unsigned i32 = g_mantissa[g_offset[h >> 10] + (h & 0x3ff)] + g_exponent[h >> 10]; > return bitCast<float>(i32); > } >-} >- >+} // namespace gl >diff --git a/Source/ThirdParty/ANGLE/src/common/MemoryBuffer.cpp b/Source/ThirdParty/ANGLE/src/common/MemoryBuffer.cpp >index 6f5188c69c8..5e57be225dc 100644 >--- a/Source/ThirdParty/ANGLE/src/common/MemoryBuffer.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/MemoryBuffer.cpp >@@ -15,10 +15,6 @@ namespace angle > { > > // MemoryBuffer implementation. >-MemoryBuffer::MemoryBuffer() : mSize(0), mData(nullptr) >-{ >-} >- > MemoryBuffer::~MemoryBuffer() > { > free(mData); >@@ -41,7 +37,7 @@ bool MemoryBuffer::resize(size_t size) > } > > // Only reallocate if the size has changed. >- uint8_t *newMemory = reinterpret_cast<uint8_t *>(malloc(sizeof(uint8_t) * size)); >+ uint8_t *newMemory = static_cast<uint8_t *>(malloc(sizeof(uint8_t) * size)); > if (newMemory == nullptr) > { > return false; >@@ -82,13 +78,9 @@ MemoryBuffer &MemoryBuffer::operator=(MemoryBuffer &&other) > > // ScratchBuffer implementation. > >-ScratchBuffer::ScratchBuffer(uint32_t lifetime) : mLifetime(lifetime), mResetCounter(lifetime) >-{ >-} >+ScratchBuffer::ScratchBuffer(uint32_t lifetime) : mLifetime(lifetime), mResetCounter(lifetime) {} > >-ScratchBuffer::~ScratchBuffer() >-{ >-} >+ScratchBuffer::~ScratchBuffer() {} > > bool ScratchBuffer::get(size_t requestedSize, MemoryBuffer **memoryBufferOut) > { >diff --git a/Source/ThirdParty/ANGLE/src/common/MemoryBuffer.h b/Source/ThirdParty/ANGLE/src/common/MemoryBuffer.h >index f76b9ee62e6..ae6b64c8c72 100644 >--- a/Source/ThirdParty/ANGLE/src/common/MemoryBuffer.h >+++ b/Source/ThirdParty/ANGLE/src/common/MemoryBuffer.h >@@ -20,7 +20,8 @@ namespace angle > class MemoryBuffer final : NonCopyable > { > public: >- MemoryBuffer(); >+ MemoryBuffer() = default; >+ MemoryBuffer(size_t size) { resize(size); } > ~MemoryBuffer(); > > MemoryBuffer(MemoryBuffer &&other); >@@ -37,11 +38,22 @@ class MemoryBuffer final : NonCopyable > return mData; > } > >+ uint8_t &operator[](size_t pos) >+ { >+ ASSERT(pos < mSize); >+ return mData[pos]; >+ } >+ const uint8_t &operator[](size_t pos) const >+ { >+ ASSERT(pos < mSize); >+ return mData[pos]; >+ } >+ > void fill(uint8_t datum); > > private: >- size_t mSize; >- uint8_t *mData; >+ size_t mSize = 0; >+ uint8_t *mData = nullptr; > }; > > class ScratchBuffer final : NonCopyable >diff --git a/Source/ThirdParty/ANGLE/src/common/Optional_unittest.cpp b/Source/ThirdParty/ANGLE/src/common/Optional_unittest.cpp >index 81004618462..ebae98e3702 100644 >--- a/Source/ThirdParty/ANGLE/src/common/Optional_unittest.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/Optional_unittest.cpp >@@ -44,4 +44,4 @@ TEST(OptionalTest, Copies) > ASSERT_EQ(testValid, testCopy); > } > >-} // namespace >+} // namespace >diff --git a/Source/ThirdParty/ANGLE/src/common/PackedEGLEnums_autogen.cpp b/Source/ThirdParty/ANGLE/src/common/PackedEGLEnums_autogen.cpp >new file mode 100644 >index 00000000000..2af94d4aa7a >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/PackedEGLEnums_autogen.cpp >@@ -0,0 +1,222 @@ >+// GENERATED FILE - DO NOT EDIT. >+// Generated by gen_packed_gl_enums.py using data from packed_egl_enums.json. >+// >+// 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. >+// >+// PackedEGLEnums_autogen.cpp: >+// Implements ANGLE-specific enums classes for EGLenums and functions operating >+// on them. >+ >+#include "common/PackedEGLEnums_autogen.h" >+#include "common/debug.h" >+ >+namespace egl >+{ >+ >+template <> >+CompositorTiming FromEGLenum<CompositorTiming>(EGLenum from) >+{ >+ switch (from) >+ { >+ case EGL_COMPOSITE_DEADLINE_ANDROID: >+ return CompositorTiming::CompositeDeadline; >+ case EGL_COMPOSITE_INTERVAL_ANDROID: >+ return CompositorTiming::CompositInterval; >+ case EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID: >+ return CompositorTiming::CompositToPresentLatency; >+ default: >+ return CompositorTiming::InvalidEnum; >+ } >+} >+ >+EGLenum ToEGLenum(CompositorTiming from) >+{ >+ switch (from) >+ { >+ case CompositorTiming::CompositeDeadline: >+ return EGL_COMPOSITE_DEADLINE_ANDROID; >+ case CompositorTiming::CompositInterval: >+ return EGL_COMPOSITE_INTERVAL_ANDROID; >+ case CompositorTiming::CompositToPresentLatency: >+ return EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+MessageType FromEGLenum<MessageType>(EGLenum from) >+{ >+ switch (from) >+ { >+ case EGL_DEBUG_MSG_CRITICAL_KHR: >+ return MessageType::Critical; >+ case EGL_DEBUG_MSG_ERROR_KHR: >+ return MessageType::Error; >+ case EGL_DEBUG_MSG_WARN_KHR: >+ return MessageType::Warn; >+ case EGL_DEBUG_MSG_INFO_KHR: >+ return MessageType::Info; >+ default: >+ return MessageType::InvalidEnum; >+ } >+} >+ >+EGLenum ToEGLenum(MessageType from) >+{ >+ switch (from) >+ { >+ case MessageType::Critical: >+ return EGL_DEBUG_MSG_CRITICAL_KHR; >+ case MessageType::Error: >+ return EGL_DEBUG_MSG_ERROR_KHR; >+ case MessageType::Warn: >+ return EGL_DEBUG_MSG_WARN_KHR; >+ case MessageType::Info: >+ return EGL_DEBUG_MSG_INFO_KHR; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+ObjectType FromEGLenum<ObjectType>(EGLenum from) >+{ >+ switch (from) >+ { >+ case EGL_OBJECT_THREAD_KHR: >+ return ObjectType::Thread; >+ case EGL_OBJECT_DISPLAY_KHR: >+ return ObjectType::Display; >+ case EGL_OBJECT_CONTEXT_KHR: >+ return ObjectType::Context; >+ case EGL_OBJECT_SURFACE_KHR: >+ return ObjectType::Surface; >+ case EGL_OBJECT_IMAGE_KHR: >+ return ObjectType::Image; >+ case EGL_OBJECT_SYNC_KHR: >+ return ObjectType::Sync; >+ case EGL_OBJECT_STREAM_KHR: >+ return ObjectType::Stream; >+ default: >+ return ObjectType::InvalidEnum; >+ } >+} >+ >+EGLenum ToEGLenum(ObjectType from) >+{ >+ switch (from) >+ { >+ case ObjectType::Thread: >+ return EGL_OBJECT_THREAD_KHR; >+ case ObjectType::Display: >+ return EGL_OBJECT_DISPLAY_KHR; >+ case ObjectType::Context: >+ return EGL_OBJECT_CONTEXT_KHR; >+ case ObjectType::Surface: >+ return EGL_OBJECT_SURFACE_KHR; >+ case ObjectType::Image: >+ return EGL_OBJECT_IMAGE_KHR; >+ case ObjectType::Sync: >+ return EGL_OBJECT_SYNC_KHR; >+ case ObjectType::Stream: >+ return EGL_OBJECT_STREAM_KHR; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+TextureFormat FromEGLenum<TextureFormat>(EGLenum from) >+{ >+ switch (from) >+ { >+ case EGL_NO_TEXTURE: >+ return TextureFormat::NoTexture; >+ case EGL_TEXTURE_RGB: >+ return TextureFormat::RGB; >+ case EGL_TEXTURE_RGBA: >+ return TextureFormat::RGBA; >+ default: >+ return TextureFormat::InvalidEnum; >+ } >+} >+ >+EGLenum ToEGLenum(TextureFormat from) >+{ >+ switch (from) >+ { >+ case TextureFormat::NoTexture: >+ return EGL_NO_TEXTURE; >+ case TextureFormat::RGB: >+ return EGL_TEXTURE_RGB; >+ case TextureFormat::RGBA: >+ return EGL_TEXTURE_RGBA; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+Timestamp FromEGLenum<Timestamp>(EGLenum from) >+{ >+ switch (from) >+ { >+ case EGL_REQUESTED_PRESENT_TIME_ANDROID: >+ return Timestamp::RequestedPresentTime; >+ case EGL_RENDERING_COMPLETE_TIME_ANDROID: >+ return Timestamp::RenderingCompleteTime; >+ case EGL_COMPOSITION_LATCH_TIME_ANDROID: >+ return Timestamp::CompositionLatchTime; >+ case EGL_FIRST_COMPOSITION_START_TIME_ANDROID: >+ return Timestamp::FirstCompositionStartTime; >+ case EGL_LAST_COMPOSITION_START_TIME_ANDROID: >+ return Timestamp::LastCompositionStartTime; >+ case EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID: >+ return Timestamp::FirstCompositionGPUFinishedTime; >+ case EGL_DISPLAY_PRESENT_TIME_ANDROID: >+ return Timestamp::DisplayPresentTime; >+ case EGL_DEQUEUE_READY_TIME_ANDROID: >+ return Timestamp::DequeueReadyTime; >+ case EGL_READS_DONE_TIME_ANDROID: >+ return Timestamp::ReadsDoneTime; >+ default: >+ return Timestamp::InvalidEnum; >+ } >+} >+ >+EGLenum ToEGLenum(Timestamp from) >+{ >+ switch (from) >+ { >+ case Timestamp::RequestedPresentTime: >+ return EGL_REQUESTED_PRESENT_TIME_ANDROID; >+ case Timestamp::RenderingCompleteTime: >+ return EGL_RENDERING_COMPLETE_TIME_ANDROID; >+ case Timestamp::CompositionLatchTime: >+ return EGL_COMPOSITION_LATCH_TIME_ANDROID; >+ case Timestamp::FirstCompositionStartTime: >+ return EGL_FIRST_COMPOSITION_START_TIME_ANDROID; >+ case Timestamp::LastCompositionStartTime: >+ return EGL_LAST_COMPOSITION_START_TIME_ANDROID; >+ case Timestamp::FirstCompositionGPUFinishedTime: >+ return EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID; >+ case Timestamp::DisplayPresentTime: >+ return EGL_DISPLAY_PRESENT_TIME_ANDROID; >+ case Timestamp::DequeueReadyTime: >+ return EGL_DEQUEUE_READY_TIME_ANDROID; >+ case Timestamp::ReadsDoneTime: >+ return EGL_READS_DONE_TIME_ANDROID; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+} // namespace egl >diff --git a/Source/ThirdParty/ANGLE/src/common/PackedEGLEnums_autogen.h b/Source/ThirdParty/ANGLE/src/common/PackedEGLEnums_autogen.h >new file mode 100644 >index 00000000000..68c65d8bab5 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/PackedEGLEnums_autogen.h >@@ -0,0 +1,110 @@ >+// GENERATED FILE - DO NOT EDIT. >+// Generated by gen_packed_gl_enums.py using data from packed_egl_enums.json. >+// >+// 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. >+// >+// PackedEGLEnums_autogen.h: >+// Declares ANGLE-specific enums classes for EGLenums and functions operating >+// on them. >+ >+#ifndef COMMON_PACKEDEGLENUMS_AUTOGEN_H_ >+#define COMMON_PACKEDEGLENUMS_AUTOGEN_H_ >+ >+#include <EGL/egl.h> >+#include <EGL/eglext.h> >+#include <angle_gl.h> >+ >+#include <cstdint> >+ >+namespace egl >+{ >+ >+template <typename Enum> >+Enum FromEGLenum(EGLenum from); >+ >+enum class CompositorTiming : uint8_t >+{ >+ CompositeDeadline = 0, >+ CompositInterval = 1, >+ CompositToPresentLatency = 2, >+ >+ InvalidEnum = 3, >+ EnumCount = 3, >+}; >+ >+template <> >+CompositorTiming FromEGLenum<CompositorTiming>(EGLenum from); >+EGLenum ToEGLenum(CompositorTiming from); >+ >+enum class MessageType : uint8_t >+{ >+ Critical = 0, >+ Error = 1, >+ Warn = 2, >+ Info = 3, >+ >+ InvalidEnum = 4, >+ EnumCount = 4, >+}; >+ >+template <> >+MessageType FromEGLenum<MessageType>(EGLenum from); >+EGLenum ToEGLenum(MessageType from); >+ >+enum class ObjectType : uint8_t >+{ >+ Thread = 0, >+ Display = 1, >+ Context = 2, >+ Surface = 3, >+ Image = 4, >+ Sync = 5, >+ Stream = 6, >+ >+ InvalidEnum = 7, >+ EnumCount = 7, >+}; >+ >+template <> >+ObjectType FromEGLenum<ObjectType>(EGLenum from); >+EGLenum ToEGLenum(ObjectType from); >+ >+enum class TextureFormat : uint8_t >+{ >+ NoTexture = 0, >+ RGB = 1, >+ RGBA = 2, >+ >+ InvalidEnum = 3, >+ EnumCount = 3, >+}; >+ >+template <> >+TextureFormat FromEGLenum<TextureFormat>(EGLenum from); >+EGLenum ToEGLenum(TextureFormat from); >+ >+enum class Timestamp : uint8_t >+{ >+ RequestedPresentTime = 0, >+ RenderingCompleteTime = 1, >+ CompositionLatchTime = 2, >+ FirstCompositionStartTime = 3, >+ LastCompositionStartTime = 4, >+ FirstCompositionGPUFinishedTime = 5, >+ DisplayPresentTime = 6, >+ DequeueReadyTime = 7, >+ ReadsDoneTime = 8, >+ >+ InvalidEnum = 9, >+ EnumCount = 9, >+}; >+ >+template <> >+Timestamp FromEGLenum<Timestamp>(EGLenum from); >+EGLenum ToEGLenum(Timestamp from); >+ >+} // namespace egl >+ >+#endif // COMMON_PACKEDEGLENUMS_AUTOGEN_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/PackedEnums.cpp b/Source/ThirdParty/ANGLE/src/common/PackedEnums.cpp >new file mode 100644 >index 00000000000..60cc785bc6d >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/PackedEnums.cpp >@@ -0,0 +1,259 @@ >+// 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. >+// >+// PackedGLEnums.cpp: >+// Declares ANGLE-specific enums classes for GLEnum and functions operating >+// on them. >+ >+#include "common/PackedEnums.h" >+ >+#include "common/utilities.h" >+ >+namespace gl >+{ >+ >+TextureType TextureTargetToType(TextureTarget target) >+{ >+ switch (target) >+ { >+ case TextureTarget::CubeMapNegativeX: >+ case TextureTarget::CubeMapNegativeY: >+ case TextureTarget::CubeMapNegativeZ: >+ case TextureTarget::CubeMapPositiveX: >+ case TextureTarget::CubeMapPositiveY: >+ case TextureTarget::CubeMapPositiveZ: >+ return TextureType::CubeMap; >+ case TextureTarget::External: >+ return TextureType::External; >+ case TextureTarget::Rectangle: >+ return TextureType::Rectangle; >+ case TextureTarget::_2D: >+ return TextureType::_2D; >+ case TextureTarget::_2DArray: >+ return TextureType::_2DArray; >+ case TextureTarget::_2DMultisample: >+ return TextureType::_2DMultisample; >+ case TextureTarget::_2DMultisampleArray: >+ return TextureType::_2DMultisampleArray; >+ case TextureTarget::_3D: >+ return TextureType::_3D; >+ case TextureTarget::InvalidEnum: >+ return TextureType::InvalidEnum; >+ default: >+ UNREACHABLE(); >+ return TextureType::InvalidEnum; >+ } >+} >+ >+bool IsCubeMapFaceTarget(TextureTarget target) >+{ >+ return TextureTargetToType(target) == TextureType::CubeMap; >+} >+ >+TextureTarget NonCubeTextureTypeToTarget(TextureType type) >+{ >+ switch (type) >+ { >+ case TextureType::External: >+ return TextureTarget::External; >+ case TextureType::Rectangle: >+ return TextureTarget::Rectangle; >+ case TextureType::_2D: >+ return TextureTarget::_2D; >+ case TextureType::_2DArray: >+ return TextureTarget::_2DArray; >+ case TextureType::_2DMultisample: >+ return TextureTarget::_2DMultisample; >+ case TextureType::_2DMultisampleArray: >+ return TextureTarget::_2DMultisampleArray; >+ case TextureType::_3D: >+ return TextureTarget::_3D; >+ default: >+ UNREACHABLE(); >+ return TextureTarget::InvalidEnum; >+ } >+} >+ >+// Check that we can do arithmetic on TextureTarget to convert from / to cube map faces >+static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeX) - >+ static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) == >+ 1u, >+ ""); >+static_assert(static_cast<uint8_t>(TextureTarget::CubeMapPositiveY) - >+ static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) == >+ 2u, >+ ""); >+static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeY) - >+ static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) == >+ 3u, >+ ""); >+static_assert(static_cast<uint8_t>(TextureTarget::CubeMapPositiveZ) - >+ static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) == >+ 4u, >+ ""); >+static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeZ) - >+ static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) == >+ 5u, >+ ""); >+ >+TextureTarget CubeFaceIndexToTextureTarget(size_t face) >+{ >+ ASSERT(face < 6u); >+ return static_cast<TextureTarget>(static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) + face); >+} >+ >+size_t CubeMapTextureTargetToFaceIndex(TextureTarget target) >+{ >+ ASSERT(IsCubeMapFaceTarget(target)); >+ return static_cast<uint8_t>(target) - static_cast<uint8_t>(TextureTarget::CubeMapPositiveX); >+} >+ >+TextureType SamplerTypeToTextureType(GLenum samplerType) >+{ >+ switch (samplerType) >+ { >+ case GL_SAMPLER_2D: >+ case GL_INT_SAMPLER_2D: >+ case GL_UNSIGNED_INT_SAMPLER_2D: >+ case GL_SAMPLER_2D_SHADOW: >+ return TextureType::_2D; >+ >+ case GL_SAMPLER_EXTERNAL_OES: >+ return TextureType::External; >+ >+ case GL_SAMPLER_CUBE: >+ case GL_INT_SAMPLER_CUBE: >+ case GL_UNSIGNED_INT_SAMPLER_CUBE: >+ case GL_SAMPLER_CUBE_SHADOW: >+ return TextureType::CubeMap; >+ >+ case GL_SAMPLER_2D_ARRAY: >+ case GL_INT_SAMPLER_2D_ARRAY: >+ case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: >+ case GL_SAMPLER_2D_ARRAY_SHADOW: >+ return TextureType::_2DArray; >+ >+ case GL_SAMPLER_3D: >+ case GL_INT_SAMPLER_3D: >+ case GL_UNSIGNED_INT_SAMPLER_3D: >+ return TextureType::_3D; >+ >+ case GL_SAMPLER_2D_MULTISAMPLE: >+ case GL_INT_SAMPLER_2D_MULTISAMPLE: >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: >+ return TextureType::_2DMultisample; >+ >+ case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ return TextureType::_2DMultisampleArray; >+ >+ case GL_SAMPLER_2D_RECT_ANGLE: >+ return TextureType::Rectangle; >+ >+ default: >+ UNREACHABLE(); >+ return TextureType::InvalidEnum; >+ } >+} >+ >+bool IsMultisampled(gl::TextureType type) >+{ >+ switch (type) >+ { >+ case gl::TextureType::_2DMultisample: >+ case gl::TextureType::_2DMultisampleArray: >+ return true; >+ default: >+ return false; >+ } >+} >+ >+} // namespace gl >+ >+namespace egl >+{ >+MessageType ErrorCodeToMessageType(EGLint errorCode) >+{ >+ switch (errorCode) >+ { >+ case EGL_BAD_ALLOC: >+ case EGL_CONTEXT_LOST: >+ case EGL_NOT_INITIALIZED: >+ return MessageType::Critical; >+ >+ case EGL_BAD_ACCESS: >+ case EGL_BAD_ATTRIBUTE: >+ case EGL_BAD_CONFIG: >+ case EGL_BAD_CONTEXT: >+ case EGL_BAD_CURRENT_SURFACE: >+ case EGL_BAD_DISPLAY: >+ case EGL_BAD_MATCH: >+ case EGL_BAD_NATIVE_PIXMAP: >+ case EGL_BAD_NATIVE_WINDOW: >+ case EGL_BAD_PARAMETER: >+ case EGL_BAD_SURFACE: >+ case EGL_BAD_STREAM_KHR: >+ case EGL_BAD_STATE_KHR: >+ case EGL_BAD_DEVICE_EXT: >+ return MessageType::Error; >+ >+ case EGL_SUCCESS: >+ default: >+ UNREACHABLE(); >+ return MessageType::InvalidEnum; >+ } >+} >+} // namespace egl >+ >+namespace egl_gl >+{ >+ >+gl::TextureTarget EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget) >+{ >+ ASSERT(egl::IsCubeMapTextureTarget(eglTarget)); >+ return gl::CubeFaceIndexToTextureTarget(egl::CubeMapTextureTargetToLayerIndex(eglTarget)); >+} >+ >+gl::TextureTarget EGLImageTargetToTextureTarget(EGLenum eglTarget) >+{ >+ switch (eglTarget) >+ { >+ case EGL_GL_TEXTURE_2D_KHR: >+ return gl::TextureTarget::_2D; >+ >+ case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR: >+ case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR: >+ case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR: >+ case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR: >+ case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR: >+ case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR: >+ return EGLCubeMapTargetToCubeMapTarget(eglTarget); >+ >+ case EGL_GL_TEXTURE_3D_KHR: >+ return gl::TextureTarget::_3D; >+ >+ default: >+ UNREACHABLE(); >+ return gl::TextureTarget::InvalidEnum; >+ } >+} >+ >+gl::TextureType EGLTextureTargetToTextureType(EGLenum eglTarget) >+{ >+ switch (eglTarget) >+ { >+ case EGL_TEXTURE_2D: >+ return gl::TextureType::_2D; >+ >+ case EGL_TEXTURE_RECTANGLE_ANGLE: >+ return gl::TextureType::Rectangle; >+ >+ default: >+ UNREACHABLE(); >+ return gl::TextureType::InvalidEnum; >+ } >+} >+ >+} // namespace egl_gl >diff --git a/Source/ThirdParty/ANGLE/src/common/PackedEnums.h b/Source/ThirdParty/ANGLE/src/common/PackedEnums.h >new file mode 100644 >index 00000000000..650b168069a >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/PackedEnums.h >@@ -0,0 +1,384 @@ >+// 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. >+// >+// PackedGLEnums_autogen.h: >+// Declares ANGLE-specific enums classes for GLEnum and functions operating >+// on them. >+ >+#ifndef COMMON_PACKEDGLENUMS_H_ >+#define COMMON_PACKEDGLENUMS_H_ >+ >+#include "common/PackedEGLEnums_autogen.h" >+#include "common/PackedGLEnums_autogen.h" >+ >+#include <array> >+#include <bitset> >+#include <cstddef> >+ >+#include <EGL/egl.h> >+ >+#include "common/bitset_utils.h" >+ >+namespace angle >+{ >+ >+// Return the number of elements of a packed enum, including the InvalidEnum element. >+template <typename E> >+constexpr size_t EnumSize() >+{ >+ using UnderlyingType = typename std::underlying_type<E>::type; >+ return static_cast<UnderlyingType>(E::EnumCount); >+} >+ >+// Implementation of AllEnums which allows iterating over all the possible values for a packed enums >+// like so: >+// for (auto value : AllEnums<MyPackedEnum>()) { >+// // Do something with the enum. >+// } >+ >+template <typename E> >+class EnumIterator final >+{ >+ private: >+ using UnderlyingType = typename std::underlying_type<E>::type; >+ >+ public: >+ EnumIterator(E value) : mValue(static_cast<UnderlyingType>(value)) {} >+ EnumIterator &operator++() >+ { >+ mValue++; >+ return *this; >+ } >+ bool operator==(const EnumIterator &other) const { return mValue == other.mValue; } >+ bool operator!=(const EnumIterator &other) const { return mValue != other.mValue; } >+ E operator*() const { return static_cast<E>(mValue); } >+ >+ private: >+ UnderlyingType mValue; >+}; >+ >+template <typename E> >+struct AllEnums >+{ >+ EnumIterator<E> begin() const { return {static_cast<E>(0)}; } >+ EnumIterator<E> end() const { return {E::InvalidEnum}; } >+}; >+ >+// PackedEnumMap<E, T> is like an std::array<T, E::EnumCount> but is indexed with enum values. It >+// implements all of the std::array interface except with enum values instead of indices. >+template <typename E, typename T, size_t MaxSize = EnumSize<E>()> >+class PackedEnumMap >+{ >+ using UnderlyingType = typename std::underlying_type<E>::type; >+ using Storage = std::array<T, MaxSize>; >+ >+ public: >+ using InitPair = std::pair<E, T>; >+ >+ constexpr PackedEnumMap() = default; >+ >+ constexpr PackedEnumMap(std::initializer_list<InitPair> init) : mPrivateData{} >+ { >+ // We use a for loop instead of range-for to work around a limitation in MSVC. >+ for (const InitPair *it = init.begin(); it != init.end(); ++it) >+ { >+ // This horrible const_cast pattern is necessary to work around a constexpr limitation. >+ // See https://stackoverflow.com/q/34199774/ . Note that it should be fixed with C++17. >+ const_cast<T &>(const_cast<const Storage &>( >+ mPrivateData)[static_cast<UnderlyingType>(it->first)]) = it->second; >+ } >+ } >+ >+ // types: >+ using value_type = T; >+ using pointer = T *; >+ using const_pointer = const T *; >+ using reference = T &; >+ using const_reference = const T &; >+ >+ using size_type = size_t; >+ using difference_type = ptrdiff_t; >+ >+ using iterator = typename Storage::iterator; >+ using const_iterator = typename Storage::const_iterator; >+ using reverse_iterator = std::reverse_iterator<iterator>; >+ using const_reverse_iterator = std::reverse_iterator<const_iterator>; >+ >+ // No explicit construct/copy/destroy for aggregate type >+ void fill(const T &u) { mPrivateData.fill(u); } >+ void swap(PackedEnumMap<E, T> &a) noexcept { mPrivateData.swap(a.mPrivateData); } >+ >+ // iterators: >+ iterator begin() noexcept { return mPrivateData.begin(); } >+ const_iterator begin() const noexcept { return mPrivateData.begin(); } >+ iterator end() noexcept { return mPrivateData.end(); } >+ const_iterator end() const noexcept { return mPrivateData.end(); } >+ >+ reverse_iterator rbegin() noexcept { return mPrivateData.rbegin(); } >+ const_reverse_iterator rbegin() const noexcept { return mPrivateData.rbegin(); } >+ reverse_iterator rend() noexcept { return mPrivateData.rend(); } >+ const_reverse_iterator rend() const noexcept { return mPrivateData.rend(); } >+ >+ // capacity: >+ constexpr size_type size() const noexcept { return mPrivateData.size(); } >+ constexpr size_type max_size() const noexcept { return mPrivateData.max_size(); } >+ constexpr bool empty() const noexcept { return mPrivateData.empty(); } >+ >+ // element access: >+ reference operator[](E n) >+ { >+ ASSERT(static_cast<size_t>(n) < mPrivateData.size()); >+ return mPrivateData[static_cast<UnderlyingType>(n)]; >+ } >+ >+ constexpr const_reference operator[](E n) const >+ { >+ ASSERT(static_cast<size_t>(n) < mPrivateData.size()); >+ return mPrivateData[static_cast<UnderlyingType>(n)]; >+ } >+ >+ const_reference at(E n) const { return mPrivateData.at(static_cast<UnderlyingType>(n)); } >+ reference at(E n) { return mPrivateData.at(static_cast<UnderlyingType>(n)); } >+ >+ reference front() { return mPrivateData.front(); } >+ const_reference front() const { return mPrivateData.front(); } >+ reference back() { return mPrivateData.back(); } >+ const_reference back() const { return mPrivateData.back(); } >+ >+ T *data() noexcept { return mPrivateData.data(); } >+ const T *data() const noexcept { return mPrivateData.data(); } >+ >+ private: >+ Storage mPrivateData; >+}; >+ >+// PackedEnumBitSetE> is like an std::bitset<E::EnumCount> but is indexed with enum values. It >+// implements the std::bitset interface except with enum values instead of indices. >+template <typename E, typename DataT = uint32_t> >+using PackedEnumBitSet = BitSetT<EnumSize<E>(), DataT, E>; >+ >+} // namespace angle >+ >+namespace gl >+{ >+ >+TextureType TextureTargetToType(TextureTarget target); >+TextureTarget NonCubeTextureTypeToTarget(TextureType type); >+ >+TextureTarget CubeFaceIndexToTextureTarget(size_t face); >+size_t CubeMapTextureTargetToFaceIndex(TextureTarget target); >+bool IsCubeMapFaceTarget(TextureTarget target); >+ >+constexpr TextureTarget kCubeMapTextureTargetMin = TextureTarget::CubeMapPositiveX; >+constexpr TextureTarget kCubeMapTextureTargetMax = TextureTarget::CubeMapNegativeZ; >+constexpr TextureTarget kAfterCubeMapTextureTargetMax = >+ static_cast<TextureTarget>(static_cast<uint8_t>(kCubeMapTextureTargetMax) + 1); >+struct AllCubeFaceTextureTargets >+{ >+ angle::EnumIterator<TextureTarget> begin() const { return kCubeMapTextureTargetMin; } >+ angle::EnumIterator<TextureTarget> end() const { return kAfterCubeMapTextureTargetMax; } >+}; >+ >+constexpr ShaderType kGLES2ShaderTypeMin = ShaderType::Vertex; >+constexpr ShaderType kGLES2ShaderTypeMax = ShaderType::Fragment; >+constexpr ShaderType kAfterGLES2ShaderTypeMax = >+ static_cast<ShaderType>(static_cast<uint8_t>(kGLES2ShaderTypeMax) + 1); >+struct AllGLES2ShaderTypes >+{ >+ angle::EnumIterator<ShaderType> begin() const { return kGLES2ShaderTypeMin; } >+ angle::EnumIterator<ShaderType> end() const { return kAfterGLES2ShaderTypeMax; } >+}; >+ >+constexpr ShaderType kShaderTypeMin = ShaderType::Vertex; >+constexpr ShaderType kShaderTypeMax = ShaderType::Compute; >+constexpr ShaderType kAfterShaderTypeMax = >+ static_cast<ShaderType>(static_cast<uint8_t>(kShaderTypeMax) + 1); >+struct AllShaderTypes >+{ >+ angle::EnumIterator<ShaderType> begin() const { return kShaderTypeMin; } >+ angle::EnumIterator<ShaderType> end() const { return kAfterShaderTypeMax; } >+}; >+ >+constexpr size_t kGraphicsShaderCount = static_cast<size_t>(ShaderType::EnumCount) - 1u; >+// Arrange the shader types in the order of rendering pipeline >+constexpr std::array<ShaderType, kGraphicsShaderCount> kAllGraphicsShaderTypes = { >+ ShaderType::Vertex, ShaderType::Geometry, ShaderType::Fragment}; >+ >+using ShaderBitSet = angle::PackedEnumBitSet<ShaderType, uint8_t>; >+static_assert(sizeof(ShaderBitSet) == sizeof(uint8_t), "Unexpected size"); >+ >+template <typename T> >+using ShaderMap = angle::PackedEnumMap<ShaderType, T>; >+ >+TextureType SamplerTypeToTextureType(GLenum samplerType); >+ >+bool IsMultisampled(gl::TextureType type); >+ >+enum class PrimitiveMode : uint8_t >+{ >+ Points = 0x0, >+ Lines = 0x1, >+ LineLoop = 0x2, >+ LineStrip = 0x3, >+ Triangles = 0x4, >+ TriangleStrip = 0x5, >+ TriangleFan = 0x6, >+ Unused1 = 0x7, >+ Unused2 = 0x8, >+ Unused3 = 0x9, >+ LinesAdjacency = 0xA, >+ LineStripAdjacency = 0xB, >+ TrianglesAdjacency = 0xC, >+ TriangleStripAdjacency = 0xD, >+ >+ InvalidEnum = 0xE, >+ EnumCount = 0xE, >+}; >+ >+template <> >+constexpr PrimitiveMode FromGLenum<PrimitiveMode>(GLenum from) >+{ >+ if (from >= static_cast<GLenum>(PrimitiveMode::EnumCount)) >+ { >+ return PrimitiveMode::InvalidEnum; >+ } >+ >+ return static_cast<PrimitiveMode>(from); >+} >+ >+constexpr GLenum ToGLenum(PrimitiveMode from) >+{ >+ return static_cast<GLenum>(from); >+} >+ >+static_assert(ToGLenum(PrimitiveMode::Points) == GL_POINTS, "PrimitiveMode violation"); >+static_assert(ToGLenum(PrimitiveMode::Lines) == GL_LINES, "PrimitiveMode violation"); >+static_assert(ToGLenum(PrimitiveMode::LineLoop) == GL_LINE_LOOP, "PrimitiveMode violation"); >+static_assert(ToGLenum(PrimitiveMode::LineStrip) == GL_LINE_STRIP, "PrimitiveMode violation"); >+static_assert(ToGLenum(PrimitiveMode::Triangles) == GL_TRIANGLES, "PrimitiveMode violation"); >+static_assert(ToGLenum(PrimitiveMode::TriangleStrip) == GL_TRIANGLE_STRIP, >+ "PrimitiveMode violation"); >+static_assert(ToGLenum(PrimitiveMode::TriangleFan) == GL_TRIANGLE_FAN, "PrimitiveMode violation"); >+static_assert(ToGLenum(PrimitiveMode::LinesAdjacency) == GL_LINES_ADJACENCY, >+ "PrimitiveMode violation"); >+static_assert(ToGLenum(PrimitiveMode::LineStripAdjacency) == GL_LINE_STRIP_ADJACENCY, >+ "PrimitiveMode violation"); >+static_assert(ToGLenum(PrimitiveMode::TrianglesAdjacency) == GL_TRIANGLES_ADJACENCY, >+ "PrimitiveMode violation"); >+static_assert(ToGLenum(PrimitiveMode::TriangleStripAdjacency) == GL_TRIANGLE_STRIP_ADJACENCY, >+ "PrimitiveMode violation"); >+ >+enum class DrawElementsType : size_t >+{ >+ UnsignedByte = 0, >+ UnsignedShort = 1, >+ UnsignedInt = 2, >+ InvalidEnum = 3, >+ EnumCount = 3, >+}; >+ >+template <> >+constexpr DrawElementsType FromGLenum<DrawElementsType>(GLenum from) >+{ >+ >+ GLenum scaled = (from - GL_UNSIGNED_BYTE); >+ // This code sequence generates a ROR instruction on x86/arm. We want to check if the lowest bit >+ // of scaled is set and if (scaled >> 1) is greater than a non-pot value. If we rotate the >+ // lowest bit to the hightest bit both conditions can be checked with a single test. >+ static_assert(sizeof(GLenum) == 4, "Update (scaled << 31) to sizeof(GLenum) * 8 - 1"); >+ GLenum packed = (scaled >> 1) | (scaled << 31); >+ >+ // operator ? with a simple assignment usually translates to a cmov instruction and thus avoids >+ // a branch. >+ packed = (packed >= static_cast<GLenum>(DrawElementsType::EnumCount)) >+ ? static_cast<GLenum>(DrawElementsType::InvalidEnum) >+ : packed; >+ >+ return static_cast<DrawElementsType>(packed); >+} >+ >+constexpr GLenum ToGLenum(DrawElementsType from) >+{ >+ return ((static_cast<GLenum>(from) << 1) + GL_UNSIGNED_BYTE); >+} >+ >+#define ANGLE_VALIDATE_PACKED_ENUM(type, packed, glenum) \ >+ static_assert(ToGLenum(type::packed) == glenum, #type " violation"); \ >+ static_assert(FromGLenum<type>(glenum) == type::packed, #type " violation") >+ >+ANGLE_VALIDATE_PACKED_ENUM(DrawElementsType, UnsignedByte, GL_UNSIGNED_BYTE); >+ANGLE_VALIDATE_PACKED_ENUM(DrawElementsType, UnsignedShort, GL_UNSIGNED_SHORT); >+ANGLE_VALIDATE_PACKED_ENUM(DrawElementsType, UnsignedInt, GL_UNSIGNED_INT); >+ >+enum class VertexAttribType >+{ >+ Byte = 0, // GLenum == 0x1400 >+ UnsignedByte = 1, // GLenum == 0x1401 >+ Short = 2, // GLenum == 0x1402 >+ UnsignedShort = 3, // GLenum == 0x1403 >+ Int = 4, // GLenum == 0x1404 >+ UnsignedInt = 5, // GLenum == 0x1405 >+ Float = 6, // GLenum == 0x1406 >+ Unused1 = 7, // GLenum == 0x1407 >+ Unused2 = 8, // GLenum == 0x1408 >+ Unused3 = 9, // GLenum == 0x1409 >+ Unused4 = 10, // GLenum == 0x140A >+ HalfFloat = 11, // GLenum == 0x140B >+ Fixed = 12, // GLenum == 0x140C >+ MaxBasicType = 12, >+ UnsignedInt2101010 = 13, // GLenum == 0x8368 >+ Int2101010 = 14, // GLenum == 0x8D9F >+ InvalidEnum = 15, >+ EnumCount = 15, >+}; >+ >+template <> >+constexpr VertexAttribType FromGLenum<VertexAttribType>(GLenum from) >+{ >+ GLenum packed = from - GL_BYTE; >+ if (packed <= static_cast<GLenum>(VertexAttribType::MaxBasicType)) >+ return static_cast<VertexAttribType>(packed); >+ if (from == GL_UNSIGNED_INT_2_10_10_10_REV) >+ return VertexAttribType::UnsignedInt2101010; >+ if (from == GL_INT_2_10_10_10_REV) >+ return VertexAttribType::Int2101010; >+ return VertexAttribType::InvalidEnum; >+} >+ >+constexpr GLenum ToGLenum(VertexAttribType from) >+{ >+ // This could be optimized using a constexpr table. >+ if (from == VertexAttribType::Int2101010) >+ return GL_INT_2_10_10_10_REV; >+ if (from == VertexAttribType::UnsignedInt2101010) >+ return GL_UNSIGNED_INT_2_10_10_10_REV; >+ return static_cast<GLenum>(from) + GL_BYTE; >+} >+ >+ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Byte, GL_BYTE); >+ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, UnsignedByte, GL_UNSIGNED_BYTE); >+ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Short, GL_SHORT); >+ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, UnsignedShort, GL_UNSIGNED_SHORT); >+ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Int, GL_INT); >+ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, UnsignedInt, GL_UNSIGNED_INT); >+ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Float, GL_FLOAT); >+ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, HalfFloat, GL_HALF_FLOAT); >+ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Fixed, GL_FIXED); >+ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Int2101010, GL_INT_2_10_10_10_REV); >+ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, UnsignedInt2101010, GL_UNSIGNED_INT_2_10_10_10_REV); >+} // namespace gl >+ >+namespace egl >+{ >+MessageType ErrorCodeToMessageType(EGLint errorCode); >+} // namespace egl >+ >+namespace egl_gl >+{ >+gl::TextureTarget EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget); >+gl::TextureTarget EGLImageTargetToTextureTarget(EGLenum eglTarget); >+gl::TextureType EGLTextureTargetToTextureType(EGLenum eglTarget); >+} // namespace egl_gl >+ >+#endif // COMMON_PACKEDGLENUMS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/PackedGLEnums_autogen.cpp b/Source/ThirdParty/ANGLE/src/common/PackedGLEnums_autogen.cpp >new file mode 100644 >index 00000000000..81eef31425e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/PackedGLEnums_autogen.cpp >@@ -0,0 +1,1322 @@ >+// GENERATED FILE - DO NOT EDIT. >+// Generated by gen_packed_gl_enums.py using data from packed_gl_enums.json. >+// >+// 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. >+// >+// PackedGLEnums_autogen.cpp: >+// Implements ANGLE-specific enums classes for GLenums and functions operating >+// on them. >+ >+#include "common/PackedGLEnums_autogen.h" >+#include "common/debug.h" >+ >+namespace gl >+{ >+ >+template <> >+AlphaTestFunc FromGLenum<AlphaTestFunc>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_ALWAYS: >+ return AlphaTestFunc::AlwaysPass; >+ case GL_EQUAL: >+ return AlphaTestFunc::Equal; >+ case GL_GEQUAL: >+ return AlphaTestFunc::Gequal; >+ case GL_GREATER: >+ return AlphaTestFunc::Greater; >+ case GL_LEQUAL: >+ return AlphaTestFunc::Lequal; >+ case GL_LESS: >+ return AlphaTestFunc::Less; >+ case GL_NEVER: >+ return AlphaTestFunc::Never; >+ case GL_NOTEQUAL: >+ return AlphaTestFunc::NotEqual; >+ default: >+ return AlphaTestFunc::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(AlphaTestFunc from) >+{ >+ switch (from) >+ { >+ case AlphaTestFunc::AlwaysPass: >+ return GL_ALWAYS; >+ case AlphaTestFunc::Equal: >+ return GL_EQUAL; >+ case AlphaTestFunc::Gequal: >+ return GL_GEQUAL; >+ case AlphaTestFunc::Greater: >+ return GL_GREATER; >+ case AlphaTestFunc::Lequal: >+ return GL_LEQUAL; >+ case AlphaTestFunc::Less: >+ return GL_LESS; >+ case AlphaTestFunc::Never: >+ return GL_NEVER; >+ case AlphaTestFunc::NotEqual: >+ return GL_NOTEQUAL; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+BufferBinding FromGLenum<BufferBinding>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_ARRAY_BUFFER: >+ return BufferBinding::Array; >+ case GL_ATOMIC_COUNTER_BUFFER: >+ return BufferBinding::AtomicCounter; >+ case GL_COPY_READ_BUFFER: >+ return BufferBinding::CopyRead; >+ case GL_COPY_WRITE_BUFFER: >+ return BufferBinding::CopyWrite; >+ case GL_DISPATCH_INDIRECT_BUFFER: >+ return BufferBinding::DispatchIndirect; >+ case GL_DRAW_INDIRECT_BUFFER: >+ return BufferBinding::DrawIndirect; >+ case GL_ELEMENT_ARRAY_BUFFER: >+ return BufferBinding::ElementArray; >+ case GL_PIXEL_PACK_BUFFER: >+ return BufferBinding::PixelPack; >+ case GL_PIXEL_UNPACK_BUFFER: >+ return BufferBinding::PixelUnpack; >+ case GL_SHADER_STORAGE_BUFFER: >+ return BufferBinding::ShaderStorage; >+ case GL_TRANSFORM_FEEDBACK_BUFFER: >+ return BufferBinding::TransformFeedback; >+ case GL_UNIFORM_BUFFER: >+ return BufferBinding::Uniform; >+ default: >+ return BufferBinding::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(BufferBinding from) >+{ >+ switch (from) >+ { >+ case BufferBinding::Array: >+ return GL_ARRAY_BUFFER; >+ case BufferBinding::AtomicCounter: >+ return GL_ATOMIC_COUNTER_BUFFER; >+ case BufferBinding::CopyRead: >+ return GL_COPY_READ_BUFFER; >+ case BufferBinding::CopyWrite: >+ return GL_COPY_WRITE_BUFFER; >+ case BufferBinding::DispatchIndirect: >+ return GL_DISPATCH_INDIRECT_BUFFER; >+ case BufferBinding::DrawIndirect: >+ return GL_DRAW_INDIRECT_BUFFER; >+ case BufferBinding::ElementArray: >+ return GL_ELEMENT_ARRAY_BUFFER; >+ case BufferBinding::PixelPack: >+ return GL_PIXEL_PACK_BUFFER; >+ case BufferBinding::PixelUnpack: >+ return GL_PIXEL_UNPACK_BUFFER; >+ case BufferBinding::ShaderStorage: >+ return GL_SHADER_STORAGE_BUFFER; >+ case BufferBinding::TransformFeedback: >+ return GL_TRANSFORM_FEEDBACK_BUFFER; >+ case BufferBinding::Uniform: >+ return GL_UNIFORM_BUFFER; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+BufferUsage FromGLenum<BufferUsage>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_DYNAMIC_COPY: >+ return BufferUsage::DynamicCopy; >+ case GL_DYNAMIC_DRAW: >+ return BufferUsage::DynamicDraw; >+ case GL_DYNAMIC_READ: >+ return BufferUsage::DynamicRead; >+ case GL_STATIC_COPY: >+ return BufferUsage::StaticCopy; >+ case GL_STATIC_DRAW: >+ return BufferUsage::StaticDraw; >+ case GL_STATIC_READ: >+ return BufferUsage::StaticRead; >+ case GL_STREAM_COPY: >+ return BufferUsage::StreamCopy; >+ case GL_STREAM_DRAW: >+ return BufferUsage::StreamDraw; >+ case GL_STREAM_READ: >+ return BufferUsage::StreamRead; >+ default: >+ return BufferUsage::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(BufferUsage from) >+{ >+ switch (from) >+ { >+ case BufferUsage::DynamicCopy: >+ return GL_DYNAMIC_COPY; >+ case BufferUsage::DynamicDraw: >+ return GL_DYNAMIC_DRAW; >+ case BufferUsage::DynamicRead: >+ return GL_DYNAMIC_READ; >+ case BufferUsage::StaticCopy: >+ return GL_STATIC_COPY; >+ case BufferUsage::StaticDraw: >+ return GL_STATIC_DRAW; >+ case BufferUsage::StaticRead: >+ return GL_STATIC_READ; >+ case BufferUsage::StreamCopy: >+ return GL_STREAM_COPY; >+ case BufferUsage::StreamDraw: >+ return GL_STREAM_DRAW; >+ case BufferUsage::StreamRead: >+ return GL_STREAM_READ; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+ClientVertexArrayType FromGLenum<ClientVertexArrayType>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_COLOR_ARRAY: >+ return ClientVertexArrayType::Color; >+ case GL_NORMAL_ARRAY: >+ return ClientVertexArrayType::Normal; >+ case GL_POINT_SIZE_ARRAY_OES: >+ return ClientVertexArrayType::PointSize; >+ case GL_TEXTURE_COORD_ARRAY: >+ return ClientVertexArrayType::TextureCoord; >+ case GL_VERTEX_ARRAY: >+ return ClientVertexArrayType::Vertex; >+ default: >+ return ClientVertexArrayType::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(ClientVertexArrayType from) >+{ >+ switch (from) >+ { >+ case ClientVertexArrayType::Color: >+ return GL_COLOR_ARRAY; >+ case ClientVertexArrayType::Normal: >+ return GL_NORMAL_ARRAY; >+ case ClientVertexArrayType::PointSize: >+ return GL_POINT_SIZE_ARRAY_OES; >+ case ClientVertexArrayType::TextureCoord: >+ return GL_TEXTURE_COORD_ARRAY; >+ case ClientVertexArrayType::Vertex: >+ return GL_VERTEX_ARRAY; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+CullFaceMode FromGLenum<CullFaceMode>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_BACK: >+ return CullFaceMode::Back; >+ case GL_FRONT: >+ return CullFaceMode::Front; >+ case GL_FRONT_AND_BACK: >+ return CullFaceMode::FrontAndBack; >+ default: >+ return CullFaceMode::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(CullFaceMode from) >+{ >+ switch (from) >+ { >+ case CullFaceMode::Back: >+ return GL_BACK; >+ case CullFaceMode::Front: >+ return GL_FRONT; >+ case CullFaceMode::FrontAndBack: >+ return GL_FRONT_AND_BACK; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+FilterMode FromGLenum<FilterMode>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_NEAREST: >+ return FilterMode::Nearest; >+ case GL_LINEAR: >+ return FilterMode::Linear; >+ case GL_NEAREST_MIPMAP_NEAREST: >+ return FilterMode::NearestMipmapNearest; >+ case GL_NEAREST_MIPMAP_LINEAR: >+ return FilterMode::NearestMipmapLinear; >+ case GL_LINEAR_MIPMAP_LINEAR: >+ return FilterMode::LinearMipmapLinear; >+ default: >+ return FilterMode::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(FilterMode from) >+{ >+ switch (from) >+ { >+ case FilterMode::Nearest: >+ return GL_NEAREST; >+ case FilterMode::Linear: >+ return GL_LINEAR; >+ case FilterMode::NearestMipmapNearest: >+ return GL_NEAREST_MIPMAP_NEAREST; >+ case FilterMode::NearestMipmapLinear: >+ return GL_NEAREST_MIPMAP_LINEAR; >+ case FilterMode::LinearMipmapLinear: >+ return GL_LINEAR_MIPMAP_LINEAR; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+FogMode FromGLenum<FogMode>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_EXP: >+ return FogMode::Exp; >+ case GL_EXP2: >+ return FogMode::Exp2; >+ case GL_LINEAR: >+ return FogMode::Linear; >+ default: >+ return FogMode::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(FogMode from) >+{ >+ switch (from) >+ { >+ case FogMode::Exp: >+ return GL_EXP; >+ case FogMode::Exp2: >+ return GL_EXP2; >+ case FogMode::Linear: >+ return GL_LINEAR; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+GraphicsResetStatus FromGLenum<GraphicsResetStatus>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_NO_ERROR: >+ return GraphicsResetStatus::NoError; >+ case GL_GUILTY_CONTEXT_RESET: >+ return GraphicsResetStatus::GuiltyContextReset; >+ case GL_INNOCENT_CONTEXT_RESET: >+ return GraphicsResetStatus::InnocentContextReset; >+ case GL_UNKNOWN_CONTEXT_RESET: >+ return GraphicsResetStatus::UnknownContextReset; >+ default: >+ return GraphicsResetStatus::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(GraphicsResetStatus from) >+{ >+ switch (from) >+ { >+ case GraphicsResetStatus::NoError: >+ return GL_NO_ERROR; >+ case GraphicsResetStatus::GuiltyContextReset: >+ return GL_GUILTY_CONTEXT_RESET; >+ case GraphicsResetStatus::InnocentContextReset: >+ return GL_INNOCENT_CONTEXT_RESET; >+ case GraphicsResetStatus::UnknownContextReset: >+ return GL_UNKNOWN_CONTEXT_RESET; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+HandleType FromGLenum<HandleType>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_HANDLE_TYPE_OPAQUE_FD_EXT: >+ return HandleType::OpaqueFd; >+ default: >+ return HandleType::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(HandleType from) >+{ >+ switch (from) >+ { >+ case HandleType::OpaqueFd: >+ return GL_HANDLE_TYPE_OPAQUE_FD_EXT; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+HintSetting FromGLenum<HintSetting>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_DONT_CARE: >+ return HintSetting::DontCare; >+ case GL_FASTEST: >+ return HintSetting::Fastest; >+ case GL_NICEST: >+ return HintSetting::Nicest; >+ default: >+ return HintSetting::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(HintSetting from) >+{ >+ switch (from) >+ { >+ case HintSetting::DontCare: >+ return GL_DONT_CARE; >+ case HintSetting::Fastest: >+ return GL_FASTEST; >+ case HintSetting::Nicest: >+ return GL_NICEST; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+LightParameter FromGLenum<LightParameter>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_AMBIENT: >+ return LightParameter::Ambient; >+ case GL_AMBIENT_AND_DIFFUSE: >+ return LightParameter::AmbientAndDiffuse; >+ case GL_CONSTANT_ATTENUATION: >+ return LightParameter::ConstantAttenuation; >+ case GL_DIFFUSE: >+ return LightParameter::Diffuse; >+ case GL_LINEAR_ATTENUATION: >+ return LightParameter::LinearAttenuation; >+ case GL_POSITION: >+ return LightParameter::Position; >+ case GL_QUADRATIC_ATTENUATION: >+ return LightParameter::QuadraticAttenuation; >+ case GL_SPECULAR: >+ return LightParameter::Specular; >+ case GL_SPOT_CUTOFF: >+ return LightParameter::SpotCutoff; >+ case GL_SPOT_DIRECTION: >+ return LightParameter::SpotDirection; >+ case GL_SPOT_EXPONENT: >+ return LightParameter::SpotExponent; >+ default: >+ return LightParameter::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(LightParameter from) >+{ >+ switch (from) >+ { >+ case LightParameter::Ambient: >+ return GL_AMBIENT; >+ case LightParameter::AmbientAndDiffuse: >+ return GL_AMBIENT_AND_DIFFUSE; >+ case LightParameter::ConstantAttenuation: >+ return GL_CONSTANT_ATTENUATION; >+ case LightParameter::Diffuse: >+ return GL_DIFFUSE; >+ case LightParameter::LinearAttenuation: >+ return GL_LINEAR_ATTENUATION; >+ case LightParameter::Position: >+ return GL_POSITION; >+ case LightParameter::QuadraticAttenuation: >+ return GL_QUADRATIC_ATTENUATION; >+ case LightParameter::Specular: >+ return GL_SPECULAR; >+ case LightParameter::SpotCutoff: >+ return GL_SPOT_CUTOFF; >+ case LightParameter::SpotDirection: >+ return GL_SPOT_DIRECTION; >+ case LightParameter::SpotExponent: >+ return GL_SPOT_EXPONENT; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+LogicalOperation FromGLenum<LogicalOperation>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_AND: >+ return LogicalOperation::And; >+ case GL_AND_INVERTED: >+ return LogicalOperation::AndInverted; >+ case GL_AND_REVERSE: >+ return LogicalOperation::AndReverse; >+ case GL_CLEAR: >+ return LogicalOperation::Clear; >+ case GL_COPY: >+ return LogicalOperation::Copy; >+ case GL_COPY_INVERTED: >+ return LogicalOperation::CopyInverted; >+ case GL_EQUIV: >+ return LogicalOperation::Equiv; >+ case GL_INVERT: >+ return LogicalOperation::Invert; >+ case GL_NAND: >+ return LogicalOperation::Nand; >+ case GL_NOOP: >+ return LogicalOperation::Noop; >+ case GL_NOR: >+ return LogicalOperation::Nor; >+ case GL_OR: >+ return LogicalOperation::Or; >+ case GL_OR_INVERTED: >+ return LogicalOperation::OrInverted; >+ case GL_OR_REVERSE: >+ return LogicalOperation::OrReverse; >+ case GL_SET: >+ return LogicalOperation::Set; >+ case GL_XOR: >+ return LogicalOperation::Xor; >+ default: >+ return LogicalOperation::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(LogicalOperation from) >+{ >+ switch (from) >+ { >+ case LogicalOperation::And: >+ return GL_AND; >+ case LogicalOperation::AndInverted: >+ return GL_AND_INVERTED; >+ case LogicalOperation::AndReverse: >+ return GL_AND_REVERSE; >+ case LogicalOperation::Clear: >+ return GL_CLEAR; >+ case LogicalOperation::Copy: >+ return GL_COPY; >+ case LogicalOperation::CopyInverted: >+ return GL_COPY_INVERTED; >+ case LogicalOperation::Equiv: >+ return GL_EQUIV; >+ case LogicalOperation::Invert: >+ return GL_INVERT; >+ case LogicalOperation::Nand: >+ return GL_NAND; >+ case LogicalOperation::Noop: >+ return GL_NOOP; >+ case LogicalOperation::Nor: >+ return GL_NOR; >+ case LogicalOperation::Or: >+ return GL_OR; >+ case LogicalOperation::OrInverted: >+ return GL_OR_INVERTED; >+ case LogicalOperation::OrReverse: >+ return GL_OR_REVERSE; >+ case LogicalOperation::Set: >+ return GL_SET; >+ case LogicalOperation::Xor: >+ return GL_XOR; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+MaterialParameter FromGLenum<MaterialParameter>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_AMBIENT: >+ return MaterialParameter::Ambient; >+ case GL_AMBIENT_AND_DIFFUSE: >+ return MaterialParameter::AmbientAndDiffuse; >+ case GL_DIFFUSE: >+ return MaterialParameter::Diffuse; >+ case GL_EMISSION: >+ return MaterialParameter::Emission; >+ case GL_SHININESS: >+ return MaterialParameter::Shininess; >+ case GL_SPECULAR: >+ return MaterialParameter::Specular; >+ default: >+ return MaterialParameter::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(MaterialParameter from) >+{ >+ switch (from) >+ { >+ case MaterialParameter::Ambient: >+ return GL_AMBIENT; >+ case MaterialParameter::AmbientAndDiffuse: >+ return GL_AMBIENT_AND_DIFFUSE; >+ case MaterialParameter::Diffuse: >+ return GL_DIFFUSE; >+ case MaterialParameter::Emission: >+ return GL_EMISSION; >+ case MaterialParameter::Shininess: >+ return GL_SHININESS; >+ case MaterialParameter::Specular: >+ return GL_SPECULAR; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+MatrixType FromGLenum<MatrixType>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_MODELVIEW: >+ return MatrixType::Modelview; >+ case GL_PROJECTION: >+ return MatrixType::Projection; >+ case GL_TEXTURE: >+ return MatrixType::Texture; >+ default: >+ return MatrixType::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(MatrixType from) >+{ >+ switch (from) >+ { >+ case MatrixType::Modelview: >+ return GL_MODELVIEW; >+ case MatrixType::Projection: >+ return GL_PROJECTION; >+ case MatrixType::Texture: >+ return GL_TEXTURE; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+PointParameter FromGLenum<PointParameter>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_POINT_SIZE_MIN: >+ return PointParameter::PointSizeMin; >+ case GL_POINT_SIZE_MAX: >+ return PointParameter::PointSizeMax; >+ case GL_POINT_FADE_THRESHOLD_SIZE: >+ return PointParameter::PointFadeThresholdSize; >+ case GL_POINT_DISTANCE_ATTENUATION: >+ return PointParameter::PointDistanceAttenuation; >+ default: >+ return PointParameter::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(PointParameter from) >+{ >+ switch (from) >+ { >+ case PointParameter::PointSizeMin: >+ return GL_POINT_SIZE_MIN; >+ case PointParameter::PointSizeMax: >+ return GL_POINT_SIZE_MAX; >+ case PointParameter::PointFadeThresholdSize: >+ return GL_POINT_FADE_THRESHOLD_SIZE; >+ case PointParameter::PointDistanceAttenuation: >+ return GL_POINT_DISTANCE_ATTENUATION; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+ProvokingVertex FromGLenum<ProvokingVertex>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_FIRST_VERTEX_CONVENTION: >+ return ProvokingVertex::FirstVertexConvention; >+ case GL_LAST_VERTEX_CONVENTION: >+ return ProvokingVertex::LastVertexConvention; >+ default: >+ return ProvokingVertex::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(ProvokingVertex from) >+{ >+ switch (from) >+ { >+ case ProvokingVertex::FirstVertexConvention: >+ return GL_FIRST_VERTEX_CONVENTION; >+ case ProvokingVertex::LastVertexConvention: >+ return GL_LAST_VERTEX_CONVENTION; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+QueryType FromGLenum<QueryType>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_ANY_SAMPLES_PASSED: >+ return QueryType::AnySamples; >+ case GL_ANY_SAMPLES_PASSED_CONSERVATIVE: >+ return QueryType::AnySamplesConservative; >+ case GL_COMMANDS_COMPLETED_CHROMIUM: >+ return QueryType::CommandsCompleted; >+ case GL_PRIMITIVES_GENERATED_EXT: >+ return QueryType::PrimitivesGenerated; >+ case GL_TIME_ELAPSED_EXT: >+ return QueryType::TimeElapsed; >+ case GL_TIMESTAMP_EXT: >+ return QueryType::Timestamp; >+ case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: >+ return QueryType::TransformFeedbackPrimitivesWritten; >+ default: >+ return QueryType::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(QueryType from) >+{ >+ switch (from) >+ { >+ case QueryType::AnySamples: >+ return GL_ANY_SAMPLES_PASSED; >+ case QueryType::AnySamplesConservative: >+ return GL_ANY_SAMPLES_PASSED_CONSERVATIVE; >+ case QueryType::CommandsCompleted: >+ return GL_COMMANDS_COMPLETED_CHROMIUM; >+ case QueryType::PrimitivesGenerated: >+ return GL_PRIMITIVES_GENERATED_EXT; >+ case QueryType::TimeElapsed: >+ return GL_TIME_ELAPSED_EXT; >+ case QueryType::Timestamp: >+ return GL_TIMESTAMP_EXT; >+ case QueryType::TransformFeedbackPrimitivesWritten: >+ return GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+ShaderType FromGLenum<ShaderType>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_VERTEX_SHADER: >+ return ShaderType::Vertex; >+ case GL_FRAGMENT_SHADER: >+ return ShaderType::Fragment; >+ case GL_GEOMETRY_SHADER_EXT: >+ return ShaderType::Geometry; >+ case GL_COMPUTE_SHADER: >+ return ShaderType::Compute; >+ default: >+ return ShaderType::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(ShaderType from) >+{ >+ switch (from) >+ { >+ case ShaderType::Vertex: >+ return GL_VERTEX_SHADER; >+ case ShaderType::Fragment: >+ return GL_FRAGMENT_SHADER; >+ case ShaderType::Geometry: >+ return GL_GEOMETRY_SHADER_EXT; >+ case ShaderType::Compute: >+ return GL_COMPUTE_SHADER; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+ShadingModel FromGLenum<ShadingModel>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_FLAT: >+ return ShadingModel::Flat; >+ case GL_SMOOTH: >+ return ShadingModel::Smooth; >+ default: >+ return ShadingModel::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(ShadingModel from) >+{ >+ switch (from) >+ { >+ case ShadingModel::Flat: >+ return GL_FLAT; >+ case ShadingModel::Smooth: >+ return GL_SMOOTH; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+TextureCombine FromGLenum<TextureCombine>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_ADD: >+ return TextureCombine::Add; >+ case GL_ADD_SIGNED: >+ return TextureCombine::AddSigned; >+ case GL_DOT3_RGB: >+ return TextureCombine::Dot3Rgb; >+ case GL_DOT3_RGBA: >+ return TextureCombine::Dot3Rgba; >+ case GL_INTERPOLATE: >+ return TextureCombine::Interpolate; >+ case GL_MODULATE: >+ return TextureCombine::Modulate; >+ case GL_REPLACE: >+ return TextureCombine::Replace; >+ case GL_SUBTRACT: >+ return TextureCombine::Subtract; >+ default: >+ return TextureCombine::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(TextureCombine from) >+{ >+ switch (from) >+ { >+ case TextureCombine::Add: >+ return GL_ADD; >+ case TextureCombine::AddSigned: >+ return GL_ADD_SIGNED; >+ case TextureCombine::Dot3Rgb: >+ return GL_DOT3_RGB; >+ case TextureCombine::Dot3Rgba: >+ return GL_DOT3_RGBA; >+ case TextureCombine::Interpolate: >+ return GL_INTERPOLATE; >+ case TextureCombine::Modulate: >+ return GL_MODULATE; >+ case TextureCombine::Replace: >+ return GL_REPLACE; >+ case TextureCombine::Subtract: >+ return GL_SUBTRACT; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+TextureEnvMode FromGLenum<TextureEnvMode>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_ADD: >+ return TextureEnvMode::Add; >+ case GL_BLEND: >+ return TextureEnvMode::Blend; >+ case GL_COMBINE: >+ return TextureEnvMode::Combine; >+ case GL_DECAL: >+ return TextureEnvMode::Decal; >+ case GL_MODULATE: >+ return TextureEnvMode::Modulate; >+ case GL_REPLACE: >+ return TextureEnvMode::Replace; >+ default: >+ return TextureEnvMode::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(TextureEnvMode from) >+{ >+ switch (from) >+ { >+ case TextureEnvMode::Add: >+ return GL_ADD; >+ case TextureEnvMode::Blend: >+ return GL_BLEND; >+ case TextureEnvMode::Combine: >+ return GL_COMBINE; >+ case TextureEnvMode::Decal: >+ return GL_DECAL; >+ case TextureEnvMode::Modulate: >+ return GL_MODULATE; >+ case TextureEnvMode::Replace: >+ return GL_REPLACE; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+TextureEnvParameter FromGLenum<TextureEnvParameter>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_TEXTURE_ENV_MODE: >+ return TextureEnvParameter::Mode; >+ case GL_TEXTURE_ENV_COLOR: >+ return TextureEnvParameter::Color; >+ case GL_COMBINE_RGB: >+ return TextureEnvParameter::CombineRgb; >+ case GL_COMBINE_ALPHA: >+ return TextureEnvParameter::CombineAlpha; >+ case GL_RGB_SCALE: >+ return TextureEnvParameter::RgbScale; >+ case GL_ALPHA_SCALE: >+ return TextureEnvParameter::AlphaScale; >+ case GL_SRC0_RGB: >+ return TextureEnvParameter::Src0Rgb; >+ case GL_SRC1_RGB: >+ return TextureEnvParameter::Src1Rgb; >+ case GL_SRC2_RGB: >+ return TextureEnvParameter::Src2Rgb; >+ case GL_SRC0_ALPHA: >+ return TextureEnvParameter::Src0Alpha; >+ case GL_SRC1_ALPHA: >+ return TextureEnvParameter::Src1Alpha; >+ case GL_SRC2_ALPHA: >+ return TextureEnvParameter::Src2Alpha; >+ case GL_OPERAND0_RGB: >+ return TextureEnvParameter::Op0Rgb; >+ case GL_OPERAND1_RGB: >+ return TextureEnvParameter::Op1Rgb; >+ case GL_OPERAND2_RGB: >+ return TextureEnvParameter::Op2Rgb; >+ case GL_OPERAND0_ALPHA: >+ return TextureEnvParameter::Op0Alpha; >+ case GL_OPERAND1_ALPHA: >+ return TextureEnvParameter::Op1Alpha; >+ case GL_OPERAND2_ALPHA: >+ return TextureEnvParameter::Op2Alpha; >+ case GL_COORD_REPLACE_OES: >+ return TextureEnvParameter::PointCoordReplace; >+ default: >+ return TextureEnvParameter::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(TextureEnvParameter from) >+{ >+ switch (from) >+ { >+ case TextureEnvParameter::Mode: >+ return GL_TEXTURE_ENV_MODE; >+ case TextureEnvParameter::Color: >+ return GL_TEXTURE_ENV_COLOR; >+ case TextureEnvParameter::CombineRgb: >+ return GL_COMBINE_RGB; >+ case TextureEnvParameter::CombineAlpha: >+ return GL_COMBINE_ALPHA; >+ case TextureEnvParameter::RgbScale: >+ return GL_RGB_SCALE; >+ case TextureEnvParameter::AlphaScale: >+ return GL_ALPHA_SCALE; >+ case TextureEnvParameter::Src0Rgb: >+ return GL_SRC0_RGB; >+ case TextureEnvParameter::Src1Rgb: >+ return GL_SRC1_RGB; >+ case TextureEnvParameter::Src2Rgb: >+ return GL_SRC2_RGB; >+ case TextureEnvParameter::Src0Alpha: >+ return GL_SRC0_ALPHA; >+ case TextureEnvParameter::Src1Alpha: >+ return GL_SRC1_ALPHA; >+ case TextureEnvParameter::Src2Alpha: >+ return GL_SRC2_ALPHA; >+ case TextureEnvParameter::Op0Rgb: >+ return GL_OPERAND0_RGB; >+ case TextureEnvParameter::Op1Rgb: >+ return GL_OPERAND1_RGB; >+ case TextureEnvParameter::Op2Rgb: >+ return GL_OPERAND2_RGB; >+ case TextureEnvParameter::Op0Alpha: >+ return GL_OPERAND0_ALPHA; >+ case TextureEnvParameter::Op1Alpha: >+ return GL_OPERAND1_ALPHA; >+ case TextureEnvParameter::Op2Alpha: >+ return GL_OPERAND2_ALPHA; >+ case TextureEnvParameter::PointCoordReplace: >+ return GL_COORD_REPLACE_OES; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+TextureEnvTarget FromGLenum<TextureEnvTarget>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_TEXTURE_ENV: >+ return TextureEnvTarget::Env; >+ case GL_POINT_SPRITE_OES: >+ return TextureEnvTarget::PointSprite; >+ default: >+ return TextureEnvTarget::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(TextureEnvTarget from) >+{ >+ switch (from) >+ { >+ case TextureEnvTarget::Env: >+ return GL_TEXTURE_ENV; >+ case TextureEnvTarget::PointSprite: >+ return GL_POINT_SPRITE_OES; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+TextureOp FromGLenum<TextureOp>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_ONE_MINUS_SRC_ALPHA: >+ return TextureOp::OneMinusSrcAlpha; >+ case GL_ONE_MINUS_SRC_COLOR: >+ return TextureOp::OneMinusSrcColor; >+ case GL_SRC_ALPHA: >+ return TextureOp::SrcAlpha; >+ case GL_SRC_COLOR: >+ return TextureOp::SrcColor; >+ default: >+ return TextureOp::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(TextureOp from) >+{ >+ switch (from) >+ { >+ case TextureOp::OneMinusSrcAlpha: >+ return GL_ONE_MINUS_SRC_ALPHA; >+ case TextureOp::OneMinusSrcColor: >+ return GL_ONE_MINUS_SRC_COLOR; >+ case TextureOp::SrcAlpha: >+ return GL_SRC_ALPHA; >+ case TextureOp::SrcColor: >+ return GL_SRC_COLOR; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+TextureSrc FromGLenum<TextureSrc>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_CONSTANT: >+ return TextureSrc::Constant; >+ case GL_PREVIOUS: >+ return TextureSrc::Previous; >+ case GL_PRIMARY_COLOR: >+ return TextureSrc::PrimaryColor; >+ case GL_TEXTURE: >+ return TextureSrc::Texture; >+ default: >+ return TextureSrc::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(TextureSrc from) >+{ >+ switch (from) >+ { >+ case TextureSrc::Constant: >+ return GL_CONSTANT; >+ case TextureSrc::Previous: >+ return GL_PREVIOUS; >+ case TextureSrc::PrimaryColor: >+ return GL_PRIMARY_COLOR; >+ case TextureSrc::Texture: >+ return GL_TEXTURE; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+TextureTarget FromGLenum<TextureTarget>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_TEXTURE_2D: >+ return TextureTarget::_2D; >+ case GL_TEXTURE_2D_ARRAY: >+ return TextureTarget::_2DArray; >+ case GL_TEXTURE_2D_MULTISAMPLE: >+ return TextureTarget::_2DMultisample; >+ case GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES: >+ return TextureTarget::_2DMultisampleArray; >+ case GL_TEXTURE_3D: >+ return TextureTarget::_3D; >+ case GL_TEXTURE_EXTERNAL_OES: >+ return TextureTarget::External; >+ case GL_TEXTURE_RECTANGLE_ANGLE: >+ return TextureTarget::Rectangle; >+ case GL_TEXTURE_CUBE_MAP_POSITIVE_X: >+ return TextureTarget::CubeMapPositiveX; >+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: >+ return TextureTarget::CubeMapNegativeX; >+ case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: >+ return TextureTarget::CubeMapPositiveY; >+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: >+ return TextureTarget::CubeMapNegativeY; >+ case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: >+ return TextureTarget::CubeMapPositiveZ; >+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: >+ return TextureTarget::CubeMapNegativeZ; >+ default: >+ return TextureTarget::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(TextureTarget from) >+{ >+ switch (from) >+ { >+ case TextureTarget::_2D: >+ return GL_TEXTURE_2D; >+ case TextureTarget::_2DArray: >+ return GL_TEXTURE_2D_ARRAY; >+ case TextureTarget::_2DMultisample: >+ return GL_TEXTURE_2D_MULTISAMPLE; >+ case TextureTarget::_2DMultisampleArray: >+ return GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES; >+ case TextureTarget::_3D: >+ return GL_TEXTURE_3D; >+ case TextureTarget::External: >+ return GL_TEXTURE_EXTERNAL_OES; >+ case TextureTarget::Rectangle: >+ return GL_TEXTURE_RECTANGLE_ANGLE; >+ case TextureTarget::CubeMapPositiveX: >+ return GL_TEXTURE_CUBE_MAP_POSITIVE_X; >+ case TextureTarget::CubeMapNegativeX: >+ return GL_TEXTURE_CUBE_MAP_NEGATIVE_X; >+ case TextureTarget::CubeMapPositiveY: >+ return GL_TEXTURE_CUBE_MAP_POSITIVE_Y; >+ case TextureTarget::CubeMapNegativeY: >+ return GL_TEXTURE_CUBE_MAP_NEGATIVE_Y; >+ case TextureTarget::CubeMapPositiveZ: >+ return GL_TEXTURE_CUBE_MAP_POSITIVE_Z; >+ case TextureTarget::CubeMapNegativeZ: >+ return GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+TextureType FromGLenum<TextureType>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_TEXTURE_2D: >+ return TextureType::_2D; >+ case GL_TEXTURE_2D_ARRAY: >+ return TextureType::_2DArray; >+ case GL_TEXTURE_2D_MULTISAMPLE: >+ return TextureType::_2DMultisample; >+ case GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES: >+ return TextureType::_2DMultisampleArray; >+ case GL_TEXTURE_3D: >+ return TextureType::_3D; >+ case GL_TEXTURE_EXTERNAL_OES: >+ return TextureType::External; >+ case GL_TEXTURE_RECTANGLE_ANGLE: >+ return TextureType::Rectangle; >+ case GL_TEXTURE_CUBE_MAP: >+ return TextureType::CubeMap; >+ default: >+ return TextureType::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(TextureType from) >+{ >+ switch (from) >+ { >+ case TextureType::_2D: >+ return GL_TEXTURE_2D; >+ case TextureType::_2DArray: >+ return GL_TEXTURE_2D_ARRAY; >+ case TextureType::_2DMultisample: >+ return GL_TEXTURE_2D_MULTISAMPLE; >+ case TextureType::_2DMultisampleArray: >+ return GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES; >+ case TextureType::_3D: >+ return GL_TEXTURE_3D; >+ case TextureType::External: >+ return GL_TEXTURE_EXTERNAL_OES; >+ case TextureType::Rectangle: >+ return GL_TEXTURE_RECTANGLE_ANGLE; >+ case TextureType::CubeMap: >+ return GL_TEXTURE_CUBE_MAP; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+VertexArrayType FromGLenum<VertexArrayType>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_COLOR_ARRAY: >+ return VertexArrayType::Color; >+ case GL_NORMAL_ARRAY: >+ return VertexArrayType::Normal; >+ case GL_POINT_SIZE_ARRAY_OES: >+ return VertexArrayType::PointSize; >+ case GL_TEXTURE_COORD_ARRAY: >+ return VertexArrayType::TextureCoord; >+ case GL_VERTEX_ARRAY: >+ return VertexArrayType::Vertex; >+ default: >+ return VertexArrayType::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(VertexArrayType from) >+{ >+ switch (from) >+ { >+ case VertexArrayType::Color: >+ return GL_COLOR_ARRAY; >+ case VertexArrayType::Normal: >+ return GL_NORMAL_ARRAY; >+ case VertexArrayType::PointSize: >+ return GL_POINT_SIZE_ARRAY_OES; >+ case VertexArrayType::TextureCoord: >+ return GL_TEXTURE_COORD_ARRAY; >+ case VertexArrayType::Vertex: >+ return GL_VERTEX_ARRAY; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+template <> >+WrapMode FromGLenum<WrapMode>(GLenum from) >+{ >+ switch (from) >+ { >+ case GL_CLAMP_TO_EDGE: >+ return WrapMode::ClampToEdge; >+ case GL_CLAMP_TO_BORDER: >+ return WrapMode::ClampToBorder; >+ case GL_MIRRORED_REPEAT: >+ return WrapMode::MirroredRepeat; >+ case GL_REPEAT: >+ return WrapMode::Repeat; >+ default: >+ return WrapMode::InvalidEnum; >+ } >+} >+ >+GLenum ToGLenum(WrapMode from) >+{ >+ switch (from) >+ { >+ case WrapMode::ClampToEdge: >+ return GL_CLAMP_TO_EDGE; >+ case WrapMode::ClampToBorder: >+ return GL_CLAMP_TO_BORDER; >+ case WrapMode::MirroredRepeat: >+ return GL_MIRRORED_REPEAT; >+ case WrapMode::Repeat: >+ return GL_REPEAT; >+ default: >+ UNREACHABLE(); >+ return 0; >+ } >+} >+ >+} // namespace gl >diff --git a/Source/ThirdParty/ANGLE/src/common/PackedGLEnums_autogen.h b/Source/ThirdParty/ANGLE/src/common/PackedGLEnums_autogen.h >new file mode 100644 >index 00000000000..cd65115097f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/PackedGLEnums_autogen.h >@@ -0,0 +1,529 @@ >+// GENERATED FILE - DO NOT EDIT. >+// Generated by gen_packed_gl_enums.py using data from packed_gl_enums.json. >+// >+// 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. >+// >+// PackedGLEnums_autogen.h: >+// Declares ANGLE-specific enums classes for GLenums and functions operating >+// on them. >+ >+#ifndef COMMON_PACKEDGLENUMS_AUTOGEN_H_ >+#define COMMON_PACKEDGLENUMS_AUTOGEN_H_ >+ >+#include <EGL/egl.h> >+#include <EGL/eglext.h> >+#include <angle_gl.h> >+ >+#include <cstdint> >+ >+namespace gl >+{ >+ >+template <typename Enum> >+Enum FromGLenum(GLenum from); >+ >+enum class AlphaTestFunc : uint8_t >+{ >+ AlwaysPass = 0, >+ Equal = 1, >+ Gequal = 2, >+ Greater = 3, >+ Lequal = 4, >+ Less = 5, >+ Never = 6, >+ NotEqual = 7, >+ >+ InvalidEnum = 8, >+ EnumCount = 8, >+}; >+ >+template <> >+AlphaTestFunc FromGLenum<AlphaTestFunc>(GLenum from); >+GLenum ToGLenum(AlphaTestFunc from); >+ >+enum class BufferBinding : uint8_t >+{ >+ Array = 0, >+ AtomicCounter = 1, >+ CopyRead = 2, >+ CopyWrite = 3, >+ DispatchIndirect = 4, >+ DrawIndirect = 5, >+ ElementArray = 6, >+ PixelPack = 7, >+ PixelUnpack = 8, >+ ShaderStorage = 9, >+ TransformFeedback = 10, >+ Uniform = 11, >+ >+ InvalidEnum = 12, >+ EnumCount = 12, >+}; >+ >+template <> >+BufferBinding FromGLenum<BufferBinding>(GLenum from); >+GLenum ToGLenum(BufferBinding from); >+ >+enum class BufferUsage : uint8_t >+{ >+ DynamicCopy = 0, >+ DynamicDraw = 1, >+ DynamicRead = 2, >+ StaticCopy = 3, >+ StaticDraw = 4, >+ StaticRead = 5, >+ StreamCopy = 6, >+ StreamDraw = 7, >+ StreamRead = 8, >+ >+ InvalidEnum = 9, >+ EnumCount = 9, >+}; >+ >+template <> >+BufferUsage FromGLenum<BufferUsage>(GLenum from); >+GLenum ToGLenum(BufferUsage from); >+ >+enum class ClientVertexArrayType : uint8_t >+{ >+ Color = 0, >+ Normal = 1, >+ PointSize = 2, >+ TextureCoord = 3, >+ Vertex = 4, >+ >+ InvalidEnum = 5, >+ EnumCount = 5, >+}; >+ >+template <> >+ClientVertexArrayType FromGLenum<ClientVertexArrayType>(GLenum from); >+GLenum ToGLenum(ClientVertexArrayType from); >+ >+enum class CullFaceMode : uint8_t >+{ >+ Back = 0, >+ Front = 1, >+ FrontAndBack = 2, >+ >+ InvalidEnum = 3, >+ EnumCount = 3, >+}; >+ >+template <> >+CullFaceMode FromGLenum<CullFaceMode>(GLenum from); >+GLenum ToGLenum(CullFaceMode from); >+ >+enum class FilterMode : uint8_t >+{ >+ Nearest = 0, >+ Linear = 1, >+ NearestMipmapNearest = 2, >+ NearestMipmapLinear = 3, >+ LinearMipmapLinear = 4, >+ >+ InvalidEnum = 5, >+ EnumCount = 5, >+}; >+ >+template <> >+FilterMode FromGLenum<FilterMode>(GLenum from); >+GLenum ToGLenum(FilterMode from); >+ >+enum class FogMode : uint8_t >+{ >+ Exp = 0, >+ Exp2 = 1, >+ Linear = 2, >+ >+ InvalidEnum = 3, >+ EnumCount = 3, >+}; >+ >+template <> >+FogMode FromGLenum<FogMode>(GLenum from); >+GLenum ToGLenum(FogMode from); >+ >+enum class GraphicsResetStatus : uint8_t >+{ >+ NoError = 0, >+ GuiltyContextReset = 1, >+ InnocentContextReset = 2, >+ UnknownContextReset = 3, >+ >+ InvalidEnum = 4, >+ EnumCount = 4, >+}; >+ >+template <> >+GraphicsResetStatus FromGLenum<GraphicsResetStatus>(GLenum from); >+GLenum ToGLenum(GraphicsResetStatus from); >+ >+enum class HandleType : uint8_t >+{ >+ OpaqueFd = 0, >+ >+ InvalidEnum = 1, >+ EnumCount = 1, >+}; >+ >+template <> >+HandleType FromGLenum<HandleType>(GLenum from); >+GLenum ToGLenum(HandleType from); >+ >+enum class HintSetting : uint8_t >+{ >+ DontCare = 0, >+ Fastest = 1, >+ Nicest = 2, >+ >+ InvalidEnum = 3, >+ EnumCount = 3, >+}; >+ >+template <> >+HintSetting FromGLenum<HintSetting>(GLenum from); >+GLenum ToGLenum(HintSetting from); >+ >+enum class LightParameter : uint8_t >+{ >+ Ambient = 0, >+ AmbientAndDiffuse = 1, >+ ConstantAttenuation = 2, >+ Diffuse = 3, >+ LinearAttenuation = 4, >+ Position = 5, >+ QuadraticAttenuation = 6, >+ Specular = 7, >+ SpotCutoff = 8, >+ SpotDirection = 9, >+ SpotExponent = 10, >+ >+ InvalidEnum = 11, >+ EnumCount = 11, >+}; >+ >+template <> >+LightParameter FromGLenum<LightParameter>(GLenum from); >+GLenum ToGLenum(LightParameter from); >+ >+enum class LogicalOperation : uint8_t >+{ >+ And = 0, >+ AndInverted = 1, >+ AndReverse = 2, >+ Clear = 3, >+ Copy = 4, >+ CopyInverted = 5, >+ Equiv = 6, >+ Invert = 7, >+ Nand = 8, >+ Noop = 9, >+ Nor = 10, >+ Or = 11, >+ OrInverted = 12, >+ OrReverse = 13, >+ Set = 14, >+ Xor = 15, >+ >+ InvalidEnum = 16, >+ EnumCount = 16, >+}; >+ >+template <> >+LogicalOperation FromGLenum<LogicalOperation>(GLenum from); >+GLenum ToGLenum(LogicalOperation from); >+ >+enum class MaterialParameter : uint8_t >+{ >+ Ambient = 0, >+ AmbientAndDiffuse = 1, >+ Diffuse = 2, >+ Emission = 3, >+ Shininess = 4, >+ Specular = 5, >+ >+ InvalidEnum = 6, >+ EnumCount = 6, >+}; >+ >+template <> >+MaterialParameter FromGLenum<MaterialParameter>(GLenum from); >+GLenum ToGLenum(MaterialParameter from); >+ >+enum class MatrixType : uint8_t >+{ >+ Modelview = 0, >+ Projection = 1, >+ Texture = 2, >+ >+ InvalidEnum = 3, >+ EnumCount = 3, >+}; >+ >+template <> >+MatrixType FromGLenum<MatrixType>(GLenum from); >+GLenum ToGLenum(MatrixType from); >+ >+enum class PointParameter : uint8_t >+{ >+ PointSizeMin = 0, >+ PointSizeMax = 1, >+ PointFadeThresholdSize = 2, >+ PointDistanceAttenuation = 3, >+ >+ InvalidEnum = 4, >+ EnumCount = 4, >+}; >+ >+template <> >+PointParameter FromGLenum<PointParameter>(GLenum from); >+GLenum ToGLenum(PointParameter from); >+ >+enum class ProvokingVertex : uint8_t >+{ >+ FirstVertexConvention = 0, >+ LastVertexConvention = 1, >+ >+ InvalidEnum = 2, >+ EnumCount = 2, >+}; >+ >+template <> >+ProvokingVertex FromGLenum<ProvokingVertex>(GLenum from); >+GLenum ToGLenum(ProvokingVertex from); >+ >+enum class QueryType : uint8_t >+{ >+ AnySamples = 0, >+ AnySamplesConservative = 1, >+ CommandsCompleted = 2, >+ PrimitivesGenerated = 3, >+ TimeElapsed = 4, >+ Timestamp = 5, >+ TransformFeedbackPrimitivesWritten = 6, >+ >+ InvalidEnum = 7, >+ EnumCount = 7, >+}; >+ >+template <> >+QueryType FromGLenum<QueryType>(GLenum from); >+GLenum ToGLenum(QueryType from); >+ >+enum class ShaderType : uint8_t >+{ >+ Vertex = 0, >+ Fragment = 1, >+ Geometry = 2, >+ Compute = 3, >+ >+ InvalidEnum = 4, >+ EnumCount = 4, >+}; >+ >+template <> >+ShaderType FromGLenum<ShaderType>(GLenum from); >+GLenum ToGLenum(ShaderType from); >+ >+enum class ShadingModel : uint8_t >+{ >+ Flat = 0, >+ Smooth = 1, >+ >+ InvalidEnum = 2, >+ EnumCount = 2, >+}; >+ >+template <> >+ShadingModel FromGLenum<ShadingModel>(GLenum from); >+GLenum ToGLenum(ShadingModel from); >+ >+enum class TextureCombine : uint8_t >+{ >+ Add = 0, >+ AddSigned = 1, >+ Dot3Rgb = 2, >+ Dot3Rgba = 3, >+ Interpolate = 4, >+ Modulate = 5, >+ Replace = 6, >+ Subtract = 7, >+ >+ InvalidEnum = 8, >+ EnumCount = 8, >+}; >+ >+template <> >+TextureCombine FromGLenum<TextureCombine>(GLenum from); >+GLenum ToGLenum(TextureCombine from); >+ >+enum class TextureEnvMode : uint8_t >+{ >+ Add = 0, >+ Blend = 1, >+ Combine = 2, >+ Decal = 3, >+ Modulate = 4, >+ Replace = 5, >+ >+ InvalidEnum = 6, >+ EnumCount = 6, >+}; >+ >+template <> >+TextureEnvMode FromGLenum<TextureEnvMode>(GLenum from); >+GLenum ToGLenum(TextureEnvMode from); >+ >+enum class TextureEnvParameter : uint8_t >+{ >+ Mode = 0, >+ Color = 1, >+ CombineRgb = 2, >+ CombineAlpha = 3, >+ RgbScale = 4, >+ AlphaScale = 5, >+ Src0Rgb = 6, >+ Src1Rgb = 7, >+ Src2Rgb = 8, >+ Src0Alpha = 9, >+ Src1Alpha = 10, >+ Src2Alpha = 11, >+ Op0Rgb = 12, >+ Op1Rgb = 13, >+ Op2Rgb = 14, >+ Op0Alpha = 15, >+ Op1Alpha = 16, >+ Op2Alpha = 17, >+ PointCoordReplace = 18, >+ >+ InvalidEnum = 19, >+ EnumCount = 19, >+}; >+ >+template <> >+TextureEnvParameter FromGLenum<TextureEnvParameter>(GLenum from); >+GLenum ToGLenum(TextureEnvParameter from); >+ >+enum class TextureEnvTarget : uint8_t >+{ >+ Env = 0, >+ PointSprite = 1, >+ >+ InvalidEnum = 2, >+ EnumCount = 2, >+}; >+ >+template <> >+TextureEnvTarget FromGLenum<TextureEnvTarget>(GLenum from); >+GLenum ToGLenum(TextureEnvTarget from); >+ >+enum class TextureOp : uint8_t >+{ >+ OneMinusSrcAlpha = 0, >+ OneMinusSrcColor = 1, >+ SrcAlpha = 2, >+ SrcColor = 3, >+ >+ InvalidEnum = 4, >+ EnumCount = 4, >+}; >+ >+template <> >+TextureOp FromGLenum<TextureOp>(GLenum from); >+GLenum ToGLenum(TextureOp from); >+ >+enum class TextureSrc : uint8_t >+{ >+ Constant = 0, >+ Previous = 1, >+ PrimaryColor = 2, >+ Texture = 3, >+ >+ InvalidEnum = 4, >+ EnumCount = 4, >+}; >+ >+template <> >+TextureSrc FromGLenum<TextureSrc>(GLenum from); >+GLenum ToGLenum(TextureSrc from); >+ >+enum class TextureTarget : uint8_t >+{ >+ _2D = 0, >+ _2DArray = 1, >+ _2DMultisample = 2, >+ _2DMultisampleArray = 3, >+ _3D = 4, >+ External = 5, >+ Rectangle = 6, >+ CubeMapPositiveX = 7, >+ CubeMapNegativeX = 8, >+ CubeMapPositiveY = 9, >+ CubeMapNegativeY = 10, >+ CubeMapPositiveZ = 11, >+ CubeMapNegativeZ = 12, >+ >+ InvalidEnum = 13, >+ EnumCount = 13, >+}; >+ >+template <> >+TextureTarget FromGLenum<TextureTarget>(GLenum from); >+GLenum ToGLenum(TextureTarget from); >+ >+enum class TextureType : uint8_t >+{ >+ _2D = 0, >+ _2DArray = 1, >+ _2DMultisample = 2, >+ _2DMultisampleArray = 3, >+ _3D = 4, >+ External = 5, >+ Rectangle = 6, >+ CubeMap = 7, >+ >+ InvalidEnum = 8, >+ EnumCount = 8, >+}; >+ >+template <> >+TextureType FromGLenum<TextureType>(GLenum from); >+GLenum ToGLenum(TextureType from); >+ >+enum class VertexArrayType : uint8_t >+{ >+ Color = 0, >+ Normal = 1, >+ PointSize = 2, >+ TextureCoord = 3, >+ Vertex = 4, >+ >+ InvalidEnum = 5, >+ EnumCount = 5, >+}; >+ >+template <> >+VertexArrayType FromGLenum<VertexArrayType>(GLenum from); >+GLenum ToGLenum(VertexArrayType from); >+ >+enum class WrapMode : uint8_t >+{ >+ ClampToEdge = 0, >+ ClampToBorder = 1, >+ MirroredRepeat = 2, >+ Repeat = 3, >+ >+ InvalidEnum = 4, >+ EnumCount = 4, >+}; >+ >+template <> >+WrapMode FromGLenum<WrapMode>(GLenum from); >+GLenum ToGLenum(WrapMode from); >+ >+} // namespace gl >+ >+#endif // COMMON_PACKEDGLENUMS_AUTOGEN_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/PoolAlloc.cpp b/Source/ThirdParty/ANGLE/src/common/PoolAlloc.cpp >new file mode 100644 >index 00000000000..b6e3702f8f4 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/PoolAlloc.cpp >@@ -0,0 +1,334 @@ >+// >+// 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. >+// >+// PoolAlloc.cpp: >+// Implements the class methods for PoolAllocator and Allocation classes. >+// >+ >+#include "common/PoolAlloc.h" >+ >+#include <assert.h> >+#include <stdint.h> >+#include <stdio.h> >+ >+#include "common/angleutils.h" >+#include "common/debug.h" >+#include "common/mathutil.h" >+#include "common/platform.h" >+#include "common/tls.h" >+ >+namespace angle >+{ >+ >+// >+// Implement the functionality of the PoolAllocator class, which >+// is documented in PoolAlloc.h. >+// >+PoolAllocator::PoolAllocator(int growthIncrement, int allocationAlignment) >+ : mAlignment(allocationAlignment), >+#if !defined(ANGLE_DISABLE_POOL_ALLOC) >+ mPageSize(growthIncrement), >+ mFreeList(0), >+ mInUseList(0), >+ mNumCalls(0), >+ mTotalBytes(0), >+#endif >+ mLocked(false) >+{ >+#if !defined(ANGLE_DISABLE_POOL_ALLOC) >+ if (mAlignment == 1) >+ { >+ // This is a special fast-path where fastAllocation() is enabled >+ mAlignmentMask = 0; >+ mHeaderSkip = sizeof(Header); >+ } >+ else >+ { >+#endif >+ // >+ // Adjust mAlignment to be at least pointer aligned and >+ // power of 2. >+ // >+ size_t minAlign = sizeof(void *); >+ mAlignment &= ~(minAlign - 1); >+ if (mAlignment < minAlign) >+ mAlignment = minAlign; >+ mAlignment = gl::ceilPow2(mAlignment); >+ mAlignmentMask = mAlignment - 1; >+ >+#if !defined(ANGLE_DISABLE_POOL_ALLOC) >+ // >+ // Align header skip >+ // >+ mHeaderSkip = minAlign; >+ if (mHeaderSkip < sizeof(Header)) >+ { >+ mHeaderSkip = rx::roundUp(sizeof(Header), mAlignment); >+ } >+ } >+ // >+ // Don't allow page sizes we know are smaller than all common >+ // OS page sizes. >+ // >+ if (mPageSize < 4 * 1024) >+ mPageSize = 4 * 1024; >+ // >+ // A large mCurrentPageOffset indicates a new page needs to >+ // be obtained to allocate memory. >+ // >+ mCurrentPageOffset = mPageSize; >+#else // !defined(ANGLE_DISABLE_POOL_ALLOC) >+ mStack.push_back({}); >+#endif >+} >+ >+PoolAllocator::~PoolAllocator() >+{ >+#if !defined(ANGLE_DISABLE_POOL_ALLOC) >+ while (mInUseList) >+ { >+ Header *next = mInUseList->nextPage; >+ mInUseList->~Header(); >+ delete[] reinterpret_cast<char *>(mInUseList); >+ mInUseList = next; >+ } >+ // We should not check the guard blocks >+ // here, because we did it already when the block was >+ // placed into the free list. >+ // >+ while (mFreeList) >+ { >+ Header *next = mFreeList->nextPage; >+ delete[] reinterpret_cast<char *>(mFreeList); >+ mFreeList = next; >+ } >+#else // !defined(ANGLE_DISABLE_POOL_ALLOC) >+ for (auto &allocs : mStack) >+ { >+ for (auto alloc : allocs) >+ { >+ free(alloc); >+ } >+ } >+ mStack.clear(); >+#endif >+} >+ >+// >+// Check a single guard block for damage >+// >+void Allocation::checkGuardBlock(unsigned char *blockMem, >+ unsigned char val, >+ const char *locText) const >+{ >+#if defined(ANGLE_POOL_ALLOC_GUARD_BLOCKS) >+ for (size_t x = 0; x < kGuardBlockSize; x++) >+ { >+ if (blockMem[x] != val) >+ { >+ char assertMsg[80]; >+ // We don't print the assert message. It's here just to be helpful. >+ snprintf(assertMsg, sizeof(assertMsg), >+ "PoolAlloc: Damage %s %zu byte allocation at 0x%p\n", locText, mSize, data()); >+ assert(0 && "PoolAlloc: Damage in guard block"); >+ } >+ } >+#endif >+} >+ >+void PoolAllocator::push() >+{ >+#if !defined(ANGLE_DISABLE_POOL_ALLOC) >+ AllocState state = {mCurrentPageOffset, mInUseList}; >+ >+ mStack.push_back(state); >+ >+ // >+ // Indicate there is no current page to allocate from. >+ // >+ mCurrentPageOffset = mPageSize; >+#else // !defined(ANGLE_DISABLE_POOL_ALLOC) >+ mStack.push_back({}); >+#endif >+} >+ >+// >+// Do a mass-deallocation of all the individual allocations >+// that have occurred since the last push(), or since the >+// last pop(), or since the object's creation. >+// >+// The deallocated pages are saved for future allocations. >+// >+void PoolAllocator::pop() >+{ >+ if (mStack.size() < 1) >+ return; >+ >+#if !defined(ANGLE_DISABLE_POOL_ALLOC) >+ Header *page = mStack.back().page; >+ mCurrentPageOffset = mStack.back().offset; >+ >+ while (mInUseList != page) >+ { >+ // invoke destructor to free allocation list >+ mInUseList->~Header(); >+ >+ Header *nextInUse = mInUseList->nextPage; >+ if (mInUseList->pageCount > 1) >+ delete[] reinterpret_cast<char *>(mInUseList); >+ else >+ { >+ mInUseList->nextPage = mFreeList; >+ mFreeList = mInUseList; >+ } >+ mInUseList = nextInUse; >+ } >+ >+ mStack.pop_back(); >+#else // !defined(ANGLE_DISABLE_POOL_ALLOC) >+ for (auto &alloc : mStack.back()) >+ { >+ free(alloc); >+ } >+ mStack.pop_back(); >+#endif >+} >+ >+// >+// Do a mass-deallocation of all the individual allocations >+// that have occurred. >+// >+void PoolAllocator::popAll() >+{ >+ while (mStack.size() > 0) >+ pop(); >+} >+ >+void *PoolAllocator::allocate(size_t numBytes) >+{ >+ ASSERT(!mLocked); >+ >+#if !defined(ANGLE_DISABLE_POOL_ALLOC) >+ // >+ // Just keep some interesting statistics. >+ // >+ ++mNumCalls; >+ mTotalBytes += numBytes; >+ >+ // If we are using guard blocks, all allocations are bracketed by >+ // them: [guardblock][allocation][guardblock]. numBytes is how >+ // much memory the caller asked for. allocationSize is the total >+ // size including guard blocks. In release build, >+ // kGuardBlockSize=0 and this all gets optimized away. >+ size_t allocationSize = Allocation::AllocationSize(numBytes) + mAlignment; >+ // Detect integer overflow. >+ if (allocationSize < numBytes) >+ return 0; >+ >+ // >+ // Do the allocation, most likely case first, for efficiency. >+ // This step could be moved to be inline sometime. >+ // >+ if (allocationSize <= mPageSize - mCurrentPageOffset) >+ { >+ // >+ // Safe to allocate from mCurrentPageOffset. >+ // >+ unsigned char *memory = reinterpret_cast<unsigned char *>(mInUseList) + mCurrentPageOffset; >+ mCurrentPageOffset += allocationSize; >+ mCurrentPageOffset = (mCurrentPageOffset + mAlignmentMask) & ~mAlignmentMask; >+ >+ return initializeAllocation(mInUseList, memory, numBytes); >+ } >+ >+ if (allocationSize > mPageSize - mHeaderSkip) >+ { >+ // >+ // Do a multi-page allocation. Don't mix these with the others. >+ // The OS is efficient in allocating and freeing multiple pages. >+ // >+ size_t numBytesToAlloc = allocationSize + mHeaderSkip; >+ // Detect integer overflow. >+ if (numBytesToAlloc < allocationSize) >+ return 0; >+ >+ Header *memory = reinterpret_cast<Header *>(::new char[numBytesToAlloc]); >+ if (memory == 0) >+ return 0; >+ >+ // Use placement-new to initialize header >+ new (memory) Header(mInUseList, (numBytesToAlloc + mPageSize - 1) / mPageSize); >+ mInUseList = memory; >+ >+ mCurrentPageOffset = mPageSize; // make next allocation come from a new page >+ >+ // No guard blocks for multi-page allocations (yet) >+ void *unalignedPtr = >+ reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(memory) + mHeaderSkip); >+ return std::align(mAlignment, numBytes, unalignedPtr, allocationSize); >+ } >+ unsigned char *newPageAddr = >+ static_cast<unsigned char *>(allocateNewPage(numBytes, allocationSize)); >+ return initializeAllocation(mInUseList, newPageAddr, numBytes); >+#else // !defined(ANGLE_DISABLE_POOL_ALLOC) >+ void *alloc = malloc(numBytes + mAlignmentMask); >+ mStack.back().push_back(alloc); >+ >+ intptr_t intAlloc = reinterpret_cast<intptr_t>(alloc); >+ intAlloc = (intAlloc + mAlignmentMask) & ~mAlignmentMask; >+ return reinterpret_cast<void *>(intAlloc); >+#endif >+} >+ >+#if !defined(ANGLE_DISABLE_POOL_ALLOC) >+void *PoolAllocator::allocateNewPage(size_t numBytes, size_t allocationSize) >+{ >+ // >+ // Need a simple page to allocate from. >+ // >+ Header *memory; >+ if (mFreeList) >+ { >+ memory = mFreeList; >+ mFreeList = mFreeList->nextPage; >+ } >+ else >+ { >+ memory = reinterpret_cast<Header *>(::new char[mPageSize]); >+ if (memory == 0) >+ return 0; >+ } >+ // Use placement-new to initialize header >+ new (memory) Header(mInUseList, 1); >+ mInUseList = memory; >+ >+ unsigned char *ret = reinterpret_cast<unsigned char *>(mInUseList) + mHeaderSkip; >+ mCurrentPageOffset = (mHeaderSkip + allocationSize + mAlignmentMask) & ~mAlignmentMask; >+ return ret; >+} >+#endif >+ >+void PoolAllocator::lock() >+{ >+ ASSERT(!mLocked); >+ mLocked = true; >+} >+ >+void PoolAllocator::unlock() >+{ >+ ASSERT(mLocked); >+ mLocked = false; >+} >+ >+// >+// Check all allocations in a list for damage by calling check on each. >+// >+void Allocation::checkAllocList() const >+{ >+ for (const Allocation *alloc = this; alloc != 0; alloc = alloc->mPrevAlloc) >+ alloc->check(); >+} >+ >+} // namespace angle >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/common/PoolAlloc.h b/Source/ThirdParty/ANGLE/src/common/PoolAlloc.h >new file mode 100644 >index 00000000000..1c902bfdd75 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/PoolAlloc.h >@@ -0,0 +1,276 @@ >+// >+// 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. >+// >+// PoolAlloc.h: >+// Defines the class interface for PoolAllocator and the Allocation >+// class that it uses internally. >+// >+ >+#ifndef COMMON_POOLALLOC_H_ >+#define COMMON_POOLALLOC_H_ >+ >+#if !defined(NDEBUG) >+# define ANGLE_POOL_ALLOC_GUARD_BLOCKS // define to enable guard block sanity checking >+#endif >+ >+// >+// This header defines an allocator that can be used to efficiently >+// allocate a large number of small requests for heap memory, with the >+// intention that they are not individually deallocated, but rather >+// collectively deallocated at one time. >+// >+// This simultaneously >+// >+// * Makes each individual allocation much more efficient; the >+// typical allocation is trivial. >+// * Completely avoids the cost of doing individual deallocation. >+// * Saves the trouble of tracking down and plugging a large class of leaks. >+// >+// Individual classes can use this allocator by supplying their own >+// new and delete methods. >+// >+ >+#include <stddef.h> >+#include <string.h> >+#include <memory> >+#include <vector> >+ >+#include "angleutils.h" >+#include "common/debug.h" >+ >+namespace angle >+{ >+// If we are using guard blocks, we must track each individual >+// allocation. If we aren't using guard blocks, these >+// never get instantiated, so won't have any impact. >+// >+ >+class Allocation >+{ >+ public: >+ Allocation(size_t size, unsigned char *mem, Allocation *prev = 0) >+ : mSize(size), mMem(mem), mPrevAlloc(prev) >+ { >+// Allocations are bracketed: >+// [allocationHeader][initialGuardBlock][userData][finalGuardBlock] >+// This would be cleaner with if (kGuardBlockSize)..., but that >+// makes the compiler print warnings about 0 length memsets, >+// even with the if() protecting them. >+#if defined(ANGLE_POOL_ALLOC_GUARD_BLOCKS) >+ memset(preGuard(), kGuardBlockBeginVal, kGuardBlockSize); >+ memset(data(), kUserDataFill, mSize); >+ memset(postGuard(), kGuardBlockEndVal, kGuardBlockSize); >+#endif >+ } >+ >+ void check() const >+ { >+ checkGuardBlock(preGuard(), kGuardBlockBeginVal, "before"); >+ checkGuardBlock(postGuard(), kGuardBlockEndVal, "after"); >+ } >+ >+ void checkAllocList() const; >+ >+ // Return total size needed to accommodate user buffer of 'size', >+ // plus our tracking data. >+ static size_t AllocationSize(size_t size) { return size + 2 * kGuardBlockSize + HeaderSize(); } >+ >+ // Offset from surrounding buffer to get to user data buffer. >+ static unsigned char *OffsetAllocation(unsigned char *m) >+ { >+ return m + kGuardBlockSize + HeaderSize(); >+ } >+ >+ private: >+ void checkGuardBlock(unsigned char *blockMem, unsigned char val, const char *locText) const; >+ >+ // Find offsets to pre and post guard blocks, and user data buffer >+ unsigned char *preGuard() const { return mMem + HeaderSize(); } >+ unsigned char *data() const { return preGuard() + kGuardBlockSize; } >+ unsigned char *postGuard() const { return data() + mSize; } >+ size_t mSize; // size of the user data area >+ unsigned char *mMem; // beginning of our allocation (pts to header) >+ Allocation *mPrevAlloc; // prior allocation in the chain >+ >+ static constexpr unsigned char kGuardBlockBeginVal = 0xfb; >+ static constexpr unsigned char kGuardBlockEndVal = 0xfe; >+ static constexpr unsigned char kUserDataFill = 0xcd; >+#if defined(ANGLE_POOL_ALLOC_GUARD_BLOCKS) >+ static constexpr size_t kGuardBlockSize = 16; >+ static constexpr size_t HeaderSize() { return sizeof(Allocation); } >+#else >+ static constexpr size_t kGuardBlockSize = 0; >+ static constexpr size_t HeaderSize() { return 0; } >+#endif >+}; >+ >+// >+// There are several stacks. One is to track the pushing and popping >+// of the user, and not yet implemented. The others are simply a >+// repositories of free pages or used pages. >+// >+// Page stacks are linked together with a simple header at the beginning >+// of each allocation obtained from the underlying OS. Multi-page allocations >+// are returned to the OS. Individual page allocations are kept for future >+// re-use. >+// >+// The "page size" used is not, nor must it match, the underlying OS >+// page size. But, having it be about that size or equal to a set of >+// pages is likely most optimal. >+// >+class PoolAllocator : angle::NonCopyable >+{ >+ public: >+ static const int kDefaultAlignment = 16; >+ // >+ // Create PoolAllocator. If alignment is be set to 1 byte then fastAllocate() >+ // function can be used to make allocations with less overhead. >+ // >+ PoolAllocator(int growthIncrement = 8 * 1024, int allocationAlignment = kDefaultAlignment); >+ >+ // >+ // Don't call the destructor just to free up the memory, call pop() >+ // >+ ~PoolAllocator(); >+ >+ // >+ // Call push() to establish a new place to pop memory to. Does not >+ // have to be called to get things started. >+ // >+ void push(); >+ >+ // >+ // Call pop() to free all memory allocated since the last call to push(), >+ // or if no last call to push, frees all memory since first allocation. >+ // >+ void pop(); >+ >+ // >+ // Call popAll() to free all memory allocated. >+ // >+ void popAll(); >+ >+ // >+ // Call allocate() to actually acquire memory. Returns 0 if no memory >+ // available, otherwise a properly aligned pointer to 'numBytes' of memory. >+ // >+ void *allocate(size_t numBytes); >+ >+ // >+ // Call fastAllocate() for a faster allocate function that does minimal bookkeeping >+ // preCondition: Allocator must have been created w/ alignment of 1 >+ ANGLE_INLINE uint8_t *fastAllocate(size_t numBytes) >+ { >+#if defined(ANGLE_DISABLE_POOL_ALLOC) >+ return reinterpret_cast<uint8_t *>(allocate(numBytes)); >+#else >+ ASSERT(mAlignment == 1); >+ // No multi-page allocations >+ ASSERT(numBytes <= (mPageSize - mHeaderSkip)); >+ // >+ // Do the allocation, most likely case inline first, for efficiency. >+ // >+ if (numBytes <= mPageSize - mCurrentPageOffset) >+ { >+ // >+ // Safe to allocate from mCurrentPageOffset. >+ // >+ uint8_t *memory = reinterpret_cast<uint8_t *>(mInUseList) + mCurrentPageOffset; >+ mCurrentPageOffset += numBytes; >+ return memory; >+ } >+ return reinterpret_cast<uint8_t *>(allocateNewPage(numBytes, numBytes)); >+#endif >+ } >+ >+ // >+ // There is no deallocate. The point of this class is that >+ // deallocation can be skipped by the user of it, as the model >+ // of use is to simultaneously deallocate everything at once >+ // by calling pop(), and to not have to solve memory leak problems. >+ // >+ >+ // Catch unwanted allocations. >+ // TODO(jmadill): Remove this when we remove the global allocator. >+ void lock(); >+ void unlock(); >+ >+ private: >+ size_t mAlignment; // all returned allocations will be aligned at >+ // this granularity, which will be a power of 2 >+ size_t mAlignmentMask; >+#if !defined(ANGLE_DISABLE_POOL_ALLOC) >+ friend struct Header; >+ >+ struct Header >+ { >+ Header(Header *nextPage, size_t pageCount) >+ : nextPage(nextPage), >+ pageCount(pageCount) >+# if defined(ANGLE_POOL_ALLOC_GUARD_BLOCKS) >+ , >+ lastAllocation(0) >+# endif >+ {} >+ >+ ~Header() >+ { >+# if defined(ANGLE_POOL_ALLOC_GUARD_BLOCKS) >+ if (lastAllocation) >+ lastAllocation->checkAllocList(); >+# endif >+ } >+ >+ Header *nextPage; >+ size_t pageCount; >+# if defined(ANGLE_POOL_ALLOC_GUARD_BLOCKS) >+ Allocation *lastAllocation; >+# endif >+ }; >+ >+ struct AllocState >+ { >+ size_t offset; >+ Header *page; >+ }; >+ using AllocStack = std::vector<AllocState>; >+ >+ // Slow path of allocation when we have to get a new page. >+ void *allocateNewPage(size_t numBytes, size_t allocationSize); >+ // Track allocations if and only if we're using guard blocks >+ void *initializeAllocation(Header *block, unsigned char *memory, size_t numBytes) >+ { >+# if defined(ANGLE_POOL_ALLOC_GUARD_BLOCKS) >+ new (memory) Allocation(numBytes + mAlignment, memory, block->lastAllocation); >+ block->lastAllocation = reinterpret_cast<Allocation *>(memory); >+# endif >+ // The OffsetAllocation() call is optimized away if !defined(ANGLE_POOL_ALLOC_GUARD_BLOCKS) >+ void *unalignedPtr = Allocation::OffsetAllocation(memory); >+ size_t alignedBytes = numBytes + mAlignment; >+ return std::align(mAlignment, numBytes, unalignedPtr, alignedBytes); >+ } >+ >+ size_t mPageSize; // granularity of allocation from the OS >+ size_t mHeaderSkip; // amount of memory to skip to make room for the >+ // header (basically, size of header, rounded >+ // up to make it aligned >+ size_t mCurrentPageOffset; // next offset in top of inUseList to allocate from >+ Header *mFreeList; // list of popped memory >+ Header *mInUseList; // list of all memory currently being used >+ AllocStack mStack; // stack of where to allocate from, to partition pool >+ >+ int mNumCalls; // just an interesting statistic >+ size_t mTotalBytes; // just an interesting statistic >+ >+#else // !defined(ANGLE_DISABLE_POOL_ALLOC) >+ std::vector<std::vector<void *>> mStack; >+#endif >+ >+ bool mLocked; >+}; >+ >+} // namespace angle >+ >+#endif // COMMON_POOLALLOC_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/PoolAlloc_unittest.cpp b/Source/ThirdParty/ANGLE/src/common/PoolAlloc_unittest.cpp >new file mode 100644 >index 00000000000..bb3eb55f82d >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/PoolAlloc_unittest.cpp >@@ -0,0 +1,78 @@ >+// >+// 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. >+// >+// PoolAlloc_unittest: >+// Tests of the PoolAlloc class >+// >+ >+#include <gtest/gtest.h> >+ >+#include "common/PoolAlloc.h" >+ >+namespace angle >+{ >+// Verify the public interface of PoolAllocator class >+TEST(PoolAllocatorTest, Interface) >+{ >+ size_t numBytes = 1024; >+ constexpr uint32_t kTestValue = 0xbaadbeef; >+ // Create a default pool allocator and allocate from it >+ PoolAllocator poolAllocator; >+ void *allocation = poolAllocator.allocate(numBytes); >+ // Verify non-zero ptr returned >+ EXPECT_NE(nullptr, allocation); >+ // Write to allocation to check later >+ uint32_t *writePtr = static_cast<uint32_t *>(allocation); >+ *writePtr = kTestValue; >+ // Test push and creating a new allocation >+ poolAllocator.push(); >+ allocation = poolAllocator.allocate(numBytes); >+ EXPECT_NE(nullptr, allocation); >+ // Make an allocation that spans multiple pages >+ allocation = poolAllocator.allocate(10 * 1024); >+ // pop previous two allocations >+ poolAllocator.pop(); >+ // Verify first allocation still has data >+ EXPECT_EQ(kTestValue, *writePtr); >+ // Make a bunch of allocations >+ for (uint32_t i = 0; i < 1000; ++i) >+ { >+ numBytes = (rand() % (1024 * 4)) + 1; >+ allocation = poolAllocator.allocate(numBytes); >+ EXPECT_NE(nullptr, allocation); >+ // Write data into full allocation. In debug case if we >+ // overwrite any other allocation we get error. >+ memset(allocation, 0xb8, numBytes); >+ } >+ // Free everything >+ poolAllocator.popAll(); >+} >+ >+#if !defined(ANGLE_POOL_ALLOC_GUARD_BLOCKS) >+// Verify allocations are correctly aligned for different alignments >+class PoolAllocatorAlignmentTest : public testing::TestWithParam<int> >+{}; >+ >+TEST_P(PoolAllocatorAlignmentTest, Alignment) >+{ >+ int alignment = GetParam(); >+ // Create a pool allocator to allocate from >+ PoolAllocator poolAllocator(4096, alignment); >+ // Test a number of allocation sizes for each alignment >+ for (uint32_t i = 0; i < 100; ++i) >+ { >+ // Vary the allocation size around 4k to hit some multi-page allocations >+ void *allocation = poolAllocator.allocate((rand() % (1024 * 4)) + 1); >+ // Verify alignment of allocation matches expected default >+ EXPECT_EQ(0u, (reinterpret_cast<std::uintptr_t>(allocation) % alignment)); >+ } >+} >+ >+INSTANTIATE_TEST_SUITE_P(, >+ PoolAllocatorAlignmentTest, >+ testing::Values(2, 4, 8, 16, 32, 64, 128), >+ testing::PrintToStringParamName()); >+#endif >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/common/aligned_memory.cpp b/Source/ThirdParty/ANGLE/src/common/aligned_memory.cpp >new file mode 100644 >index 00000000000..70a730ef62e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/aligned_memory.cpp >@@ -0,0 +1,64 @@ >+// >+// 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. >+// >+// aligned_memory: An aligned memory allocator. Based on Chrome's base/memory/aligned_memory. >+// >+ >+#include "common/aligned_memory.h" >+ >+#include "common/debug.h" >+#include "common/platform.h" >+ >+#if defined(COMPILER_MSVC) >+# include <malloc.h> >+#else >+# include <stdlib.h> >+#endif >+ >+namespace angle >+{ >+ >+void *AlignedAlloc(size_t size, size_t alignment) >+{ >+ ASSERT(size > 0); >+ ASSERT((alignment & (alignment - 1)) == 0); >+ ASSERT((alignment % sizeof(void *)) == 0); >+ void *ptr = nullptr; >+#if defined(ANGLE_PLATFORM_WINDOWS) >+ ptr = _aligned_malloc(size, alignment); >+// Android technically supports posix_memalign(), but does not expose it in >+// the current version of the library headers used by Chrome. Luckily, >+// memalign() on Android returns pointers which can safely be used with >+// free(), so we can use it instead. Issue filed to document this: >+// http://code.google.com/p/android/issues/detail?id=35391 >+#elif defined(ANGLE_PLATFORM_ANDROID) >+ ptr = memalign(alignment, size); >+#else >+ if (posix_memalign(&ptr, alignment, size)) >+ ptr = nullptr; >+#endif >+ // Since aligned allocations may fail for non-memory related reasons, force a >+ // crash if we encounter a failed allocation. >+ if (!ptr) >+ { >+ ERR() << "If you crashed here, your aligned allocation is incorrect: " >+ << "size=" << size << ", alignment=" << alignment; >+ ASSERT(false); >+ } >+ // Sanity check alignment just to be safe. >+ ASSERT((reinterpret_cast<uintptr_t>(ptr) & (alignment - 1)) == 0); >+ return ptr; >+} >+ >+void AlignedFree(void *ptr) >+{ >+#if defined(_MSC_VER) >+ _aligned_free(ptr); >+#else >+ free(ptr); >+#endif >+} >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/common/aligned_memory.h b/Source/ThirdParty/ANGLE/src/common/aligned_memory.h >new file mode 100644 >index 00000000000..dcbb60d1cb5 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/aligned_memory.h >@@ -0,0 +1,23 @@ >+// >+// 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. >+// >+// aligned_memory: An aligned memory allocator. Based on Chrome's base/memory/aligned_memory. >+// >+ >+#ifndef COMMON_ALIGNED_MEMORY_H_ >+#define COMMON_ALIGNED_MEMORY_H_ >+ >+#include <cstddef> >+ >+namespace angle >+{ >+ >+// This can be replaced with std::aligned_malloc when we have C++17. >+void *AlignedAlloc(size_t size, size_t alignment); >+void AlignedFree(void *ptr); >+ >+} // namespace angle >+ >+#endif // COMMON_ALIGNED_MEMORY_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/aligned_memory_unittest.cpp b/Source/ThirdParty/ANGLE/src/common/aligned_memory_unittest.cpp >new file mode 100644 >index 00000000000..18e2d156fc5 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/aligned_memory_unittest.cpp >@@ -0,0 +1,45 @@ >+// >+// 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. >+// >+// aligned_memory_unittests: Tests for the aligned memory allocator. >+// Tests copied from Chrome: src/base/memory/aligned_memory_unittests.cc. >+// >+ >+#include "common/aligned_memory.h" >+ >+#include <memory> >+ >+#include "gtest/gtest.h" >+ >+#define EXPECT_ALIGNED(ptr, align) EXPECT_EQ(0u, reinterpret_cast<uintptr_t>(ptr) & (align - 1)) >+ >+namespace angle >+{ >+ >+// Test that dynamic allocation works as expected. >+TEST(AlignedMemoryTest, DynamicAllocation) >+{ >+ void *p = AlignedAlloc(8, 8); >+ EXPECT_TRUE(p); >+ EXPECT_ALIGNED(p, 8); >+ AlignedFree(p); >+ >+ p = AlignedAlloc(8, 16); >+ EXPECT_TRUE(p); >+ EXPECT_ALIGNED(p, 16); >+ AlignedFree(p); >+ >+ p = AlignedAlloc(8, 256); >+ EXPECT_TRUE(p); >+ EXPECT_ALIGNED(p, 256); >+ AlignedFree(p); >+ >+ p = AlignedAlloc(8, 4096); >+ EXPECT_TRUE(p); >+ EXPECT_ALIGNED(p, 4096); >+ AlignedFree(p); >+} >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/common/android_util.cpp b/Source/ThirdParty/ANGLE/src/common/android_util.cpp >new file mode 100644 >index 00000000000..17a5fa89056 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/android_util.cpp >@@ -0,0 +1,259 @@ >+// >+// 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. >+// >+ >+// android_util.cpp: Utilities for the using the Android platform >+ >+#include "common/android_util.h" >+ >+// Taken from cutils/native_handle.h: >+// https://android.googlesource.com/platform/system/core/+/master/libcutils/include/cutils/native_handle.h >+typedef struct native_handle >+{ >+ int version; /* sizeof(native_handle_t) */ >+ int numFds; /* number of file-descriptors at &data[0] */ >+ int numInts; /* number of ints at &data[numFds] */ >+ int data[0]; /* numFds + numInts ints */ >+} native_handle_t; >+ >+// Taken from nativebase/nativebase.h >+// https://android.googlesource.com/platform/frameworks/native/+/master/libs/nativebase/include/nativebase/nativebase.h >+typedef const native_handle_t *buffer_handle_t; >+ >+typedef struct android_native_base_t >+{ >+ /* a magic value defined by the actual EGL native type */ >+ int magic; >+ /* the sizeof() of the actual EGL native type */ >+ int version; >+ void *reserved[4]; >+ /* reference-counting interface */ >+ void (*incRef)(struct android_native_base_t *base); >+ void (*decRef)(struct android_native_base_t *base); >+} android_native_base_t; >+ >+typedef struct ANativeWindowBuffer >+{ >+ struct android_native_base_t common; >+ int width; >+ int height; >+ int stride; >+ int format; >+ int usage_deprecated; >+ uintptr_t layerCount; >+ void *reserved[1]; >+ const native_handle_t *handle; >+ uint64_t usage; >+ // we needed extra space for storing the 64-bits usage flags >+ // the number of slots to use from reserved_proc depends on the >+ // architecture. >+ void *reserved_proc[8 - (sizeof(uint64_t) / sizeof(void *))]; >+} ANativeWindowBuffer_t; >+ >+// Taken from android/hardware_buffer.h >+// https://android.googlesource.com/platform/frameworks/native/+/master/libs/nativewindow/include/android/hardware_buffer.h >+ >+// AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM AHARDWAREBUFFER_FORMAT_B4G4R4A4_UNORM, >+// AHARDWAREBUFFER_FORMAT_B5G5R5A1_UNORM formats were deprecated and re-added explicitly. >+ >+// clang-format off >+/** >+ * Buffer pixel formats. >+ */ >+enum { >+ /** >+ * Corresponding formats: >+ * Vulkan: VK_FORMAT_R8G8B8A8_UNORM >+ * OpenGL ES: GL_RGBA8 >+ */ >+ AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM = 1, >+ >+ /** >+ * 32 bits per pixel, 8 bits per channel format where alpha values are >+ * ignored (always opaque). >+ * Corresponding formats: >+ * Vulkan: VK_FORMAT_R8G8B8A8_UNORM >+ * OpenGL ES: GL_RGB8 >+ */ >+ AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM = 2, >+ >+ /** >+ * Corresponding formats: >+ * Vulkan: VK_FORMAT_R8G8B8_UNORM >+ * OpenGL ES: GL_RGB8 >+ */ >+ AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM = 3, >+ >+ /** >+ * Corresponding formats: >+ * Vulkan: VK_FORMAT_R5G6B5_UNORM_PACK16 >+ * OpenGL ES: GL_RGB565 >+ */ >+ AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM = 4, >+ >+ AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM = 5, >+ AHARDWAREBUFFER_FORMAT_B5G5R5A1_UNORM = 6, >+ AHARDWAREBUFFER_FORMAT_B4G4R4A4_UNORM = 7, >+ /** >+ * Corresponding formats: >+ * Vulkan: VK_FORMAT_R16G16B16A16_SFLOAT >+ * OpenGL ES: GL_RGBA16F >+ */ >+ AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT = 0x16, >+ >+ /** >+ * Corresponding formats: >+ * Vulkan: VK_FORMAT_A2B10G10R10_UNORM_PACK32 >+ * OpenGL ES: GL_RGB10_A2 >+ */ >+ AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM = 0x2b, >+ >+ /** >+ * An opaque binary blob format that must have height 1, with width equal to >+ * the buffer size in bytes. >+ */ >+ AHARDWAREBUFFER_FORMAT_BLOB = 0x21, >+ >+ /** >+ * Corresponding formats: >+ * Vulkan: VK_FORMAT_D16_UNORM >+ * OpenGL ES: GL_DEPTH_COMPONENT16 >+ */ >+ AHARDWAREBUFFER_FORMAT_D16_UNORM = 0x30, >+ >+ /** >+ * Corresponding formats: >+ * Vulkan: VK_FORMAT_X8_D24_UNORM_PACK32 >+ * OpenGL ES: GL_DEPTH_COMPONENT24 >+ */ >+ AHARDWAREBUFFER_FORMAT_D24_UNORM = 0x31, >+ >+ /** >+ * Corresponding formats: >+ * Vulkan: VK_FORMAT_D24_UNORM_S8_UINT >+ * OpenGL ES: GL_DEPTH24_STENCIL8 >+ */ >+ AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT = 0x32, >+ >+ /** >+ * Corresponding formats: >+ * Vulkan: VK_FORMAT_D32_SFLOAT >+ * OpenGL ES: GL_DEPTH_COMPONENT32F >+ */ >+ AHARDWAREBUFFER_FORMAT_D32_FLOAT = 0x33, >+ >+ /** >+ * Corresponding formats: >+ * Vulkan: VK_FORMAT_D32_SFLOAT_S8_UINT >+ * OpenGL ES: GL_DEPTH32F_STENCIL8 >+ */ >+ AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT = 0x34, >+ >+ /** >+ * Corresponding formats: >+ * Vulkan: VK_FORMAT_S8_UINT >+ * OpenGL ES: GL_STENCIL_INDEX8 >+ */ >+ AHARDWAREBUFFER_FORMAT_S8_UINT = 0x35, >+}; >+// clang-format on >+ >+namespace >+{ >+ >+template <typename T1, typename T2> >+T1 *offsetPointer(T2 *ptr, int bytes) >+{ >+ return reinterpret_cast<T1 *>(reinterpret_cast<intptr_t>(ptr) + bytes); >+} >+ >+} // anonymous namespace >+ >+namespace angle >+{ >+ >+namespace android >+{ >+ >+struct ANativeWindowBuffer *ClientBufferToANativeWindowBuffer(EGLClientBuffer clientBuffer) >+{ >+ return reinterpret_cast<struct ANativeWindowBuffer *>(clientBuffer); >+} >+ >+void GetANativeWindowBufferProperties(const struct ANativeWindowBuffer *buffer, >+ int *width, >+ int *height, >+ int *depth, >+ int *pixelFormat) >+{ >+ *width = buffer->width; >+ *height = buffer->height; >+ *depth = static_cast<int>(buffer->layerCount); >+ *height = buffer->height; >+ *pixelFormat = buffer->format; >+} >+ >+GLenum NativePixelFormatToGLInternalFormat(int pixelFormat) >+{ >+ switch (pixelFormat) >+ { >+ case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM: >+ return GL_RGBA8; >+ case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM: >+ return GL_RGB8; >+ case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM: >+ return GL_RGB8; >+ case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM: >+ return GL_RGB565; >+ case AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM: >+ return GL_BGRA8_EXT; >+ case AHARDWAREBUFFER_FORMAT_B5G5R5A1_UNORM: >+ return GL_RGB5_A1; >+ case AHARDWAREBUFFER_FORMAT_B4G4R4A4_UNORM: >+ return GL_RGBA4; >+ case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT: >+ return GL_RGBA16F; >+ case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM: >+ return GL_RGB10_A2; >+ case AHARDWAREBUFFER_FORMAT_BLOB: >+ return GL_NONE; >+ case AHARDWAREBUFFER_FORMAT_D16_UNORM: >+ return GL_DEPTH_COMPONENT16; >+ case AHARDWAREBUFFER_FORMAT_D24_UNORM: >+ return GL_DEPTH_COMPONENT24; >+ case AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT: >+ return GL_DEPTH24_STENCIL8; >+ case AHARDWAREBUFFER_FORMAT_D32_FLOAT: >+ return GL_DEPTH_COMPONENT32F; >+ case AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT: >+ return GL_DEPTH32F_STENCIL8; >+ case AHARDWAREBUFFER_FORMAT_S8_UINT: >+ return GL_STENCIL_INDEX8; >+ default: >+ return GL_NONE; >+ } >+} >+ >+struct AHardwareBuffer *ANativeWindowBufferToAHardwareBuffer( >+ struct ANativeWindowBuffer *windowBuffer) >+{ >+ // In the Android system: >+ // - AHardwareBuffer is essentially a typedef of GraphicBuffer. Conversion functions simply >+ // reinterpret_cast. >+ // - GraphicBuffer inherits from two base classes, ANativeWindowBuffer and RefBase. >+ // >+ // GraphicBuffer implements a getter for ANativeWindowBuffer (getNativeBuffer) by static_casting >+ // itself to its base class ANativeWindowBuffer. The offset of the ANativeWindowBuffer pointer >+ // from the GraphicBuffer pointer is 16 bytes. This is likely due to two pointers: The vtable of >+ // GraphicBuffer and the one pointer member of the RefBase class. >+ // >+ // This is not future proof at all. We need to look into getting utilities added to Android to >+ // perform this cast for us. >+ int offset = -(static_cast<int>(sizeof(void *)) * 2); >+ return offsetPointer<struct AHardwareBuffer>(windowBuffer, offset); >+} >+ >+} // namespace android >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/common/android_util.h b/Source/ThirdParty/ANGLE/src/common/android_util.h >new file mode 100644 >index 00000000000..4befd6873ed >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/android_util.h >@@ -0,0 +1,39 @@ >+// >+// 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. >+// >+ >+// android_util.h: Utilities for the using the Android platform >+ >+#ifndef COMMON_ANDROIDUTIL_H_ >+#define COMMON_ANDROIDUTIL_H_ >+ >+#include <EGL/egl.h> >+#include "angle_gl.h" >+ >+struct ANativeWindowBuffer; >+struct AHardwareBuffer; >+ >+namespace angle >+{ >+ >+namespace android >+{ >+ >+struct ANativeWindowBuffer *ClientBufferToANativeWindowBuffer(EGLClientBuffer clientBuffer); >+ >+void GetANativeWindowBufferProperties(const struct ANativeWindowBuffer *buffer, >+ int *width, >+ int *height, >+ int *depth, >+ int *pixelFormat); >+GLenum NativePixelFormatToGLInternalFormat(int pixelFormat); >+ >+struct AHardwareBuffer *ANativeWindowBufferToAHardwareBuffer( >+ struct ANativeWindowBuffer *windowBuffer); >+ >+} // namespace android >+} // namespace angle >+ >+#endif // COMMON_ANDROIDUTIL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/angleutils.cpp b/Source/ThirdParty/ANGLE/src/common/angleutils.cpp >index 739d12a7678..5b7836d32d6 100644 >--- a/Source/ThirdParty/ANGLE/src/common/angleutils.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/angleutils.cpp >@@ -17,7 +17,7 @@ namespace angle > // dirtyPointer is a special value that will make the comparison with any valid pointer fail and > // force the renderer to re-apply the state. > const uintptr_t DirtyPointer = std::numeric_limits<uintptr_t>::max(); >-} >+} // namespace angle > > std::string ArrayString(unsigned int i) > { >@@ -47,7 +47,7 @@ std::string ArrayIndexString(const std::vector<unsigned int> &indices) > return strstr.str(); > } > >-size_t FormatStringIntoVector(const char *fmt, va_list vararg, std::vector<char>& outBuffer) >+size_t FormatStringIntoVector(const char *fmt, va_list vararg, std::vector<char> &outBuffer) > { > // The state of the va_list passed to vsnprintf is undefined after the call, do a copy in case > // we need to grow the buffer. >diff --git a/Source/ThirdParty/ANGLE/src/common/angleutils.h b/Source/ThirdParty/ANGLE/src/common/angleutils.h >index ad32a2f03a9..09adb588921 100644 >--- a/Source/ThirdParty/ANGLE/src/common/angleutils.h >+++ b/Source/ThirdParty/ANGLE/src/common/angleutils.h >@@ -14,9 +14,9 @@ > #include <climits> > #include <cstdarg> > #include <cstddef> >-#include <string> > #include <set> > #include <sstream> >+#include <string> > #include <vector> > > // A helper class to disallow copy and assignment operators >@@ -30,12 +30,12 @@ using Microsoft::WRL::ComPtr; > class NonCopyable > { > protected: >- NonCopyable() = default; >- ~NonCopyable() = default; >+ constexpr NonCopyable() = default; >+ ~NonCopyable() = default; > > private: >- NonCopyable(const NonCopyable&) = delete; >- void operator=(const NonCopyable&) = delete; >+ NonCopyable(const NonCopyable &) = delete; >+ void operator=(const NonCopyable &) = delete; > }; > > extern const uintptr_t DirtyPointer; >@@ -54,8 +54,7 @@ class WrappedArray final : angle::NonCopyable > public: > template <size_t N> > constexpr WrappedArray(const T (&data)[N]) : mArray(&data[0]), mSize(N) >- { >- } >+ {} > > constexpr WrappedArray() : mArray(nullptr), mSize(0) {} > constexpr WrappedArray(const T *data, size_t size) : mArray(data), mSize(size) {} >@@ -86,7 +85,7 @@ void SafeRelease(T (&resourceBlock)[N]) > } > > template <typename T> >-void SafeRelease(T& resource) >+void SafeRelease(T &resource) > { > if (resource) > { >@@ -103,7 +102,7 @@ void SafeDelete(T *&resource) > } > > template <typename T> >-void SafeDeleteContainer(T& resource) >+void SafeDeleteContainer(T &resource) > { > for (auto &element : resource) > { >@@ -113,7 +112,7 @@ void SafeDeleteContainer(T& resource) > } > > template <typename T> >-void SafeDeleteArray(T*& resource) >+void SafeDeleteArray(T *&resource) > { > delete[] resource; > resource = nullptr; >@@ -148,16 +147,17 @@ inline bool IsMaskFlagSet(T mask, T flag) > return (mask & flag) == flag; > } > >-inline const char* MakeStaticString(const std::string &str) >+inline const char *MakeStaticString(const std::string &str) > { >- static std::set<std::string> strings; >- std::set<std::string>::iterator it = strings.find(str); >- if (it != strings.end()) >+ // On the heap so that no destructor runs on application exit. >+ static std::set<std::string> *strings = new std::set<std::string>; >+ std::set<std::string>::iterator it = strings->find(str); >+ if (it != strings->end()) > { > return it->c_str(); > } > >- return strings.insert(str).first->c_str(); >+ return strings->insert(str).first->c_str(); > } > > std::string ArrayString(unsigned int i); >@@ -173,10 +173,7 @@ inline std::string Str(int i) > return strstr.str(); > } > >-size_t FormatStringIntoVector(const char *fmt, va_list vararg, std::vector<char>& buffer); >- >-std::string FormatString(const char *fmt, va_list vararg); >-std::string FormatString(const char *fmt, ...); >+size_t FormatStringIntoVector(const char *fmt, va_list vararg, std::vector<char> &buffer); > > template <typename T> > std::string ToString(const T &value) >@@ -188,9 +185,10 @@ std::string ToString(const T &value) > > // snprintf is not defined with MSVC prior to to msvc14 > #if defined(_MSC_VER) && _MSC_VER < 1900 >-#define snprintf _snprintf >+# define snprintf _snprintf > #endif > >+#define GL_A1RGB5_ANGLEX 0x6AC5 > #define GL_BGRX8_ANGLEX 0x6ABA > #define GL_BGR565_ANGLEX 0x6ABB > #define GL_BGRA4_ANGLEX 0x6ABC >@@ -199,55 +197,137 @@ std::string ToString(const T &value) > #define GL_UINT_64_ANGLEX 0x6ABF > #define GL_BGRA8_SRGB_ANGLEX 0x6AC0 > >-// Hidden enum for the NULL D3D device type. >-#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE 0x6AC0 >- >-// TODO(jmadill): Clean this up at some point. >-#define EGL_PLATFORM_ANGLE_PLATFORM_METHODS_ANGLEX 0x9999 >- >-#define ANGLE_TRY_CHECKED_MATH(result) \ >- if (!result.IsValid()) \ >- { \ >- return gl::InternalError() << "Integer overflow."; \ >- } >+// These are dummy formats used to fit typeless D3D textures that can be bound to EGL pbuffers into >+// the format system (for extension EGL_ANGLE_d3d_texture_client_buffer): >+#define GL_RGBA8_TYPELESS_ANGLEX 0x6AC1 >+#define GL_RGBA8_TYPELESS_SRGB_ANGLEX 0x6AC2 >+#define GL_BGRA8_TYPELESS_ANGLEX 0x6AC3 >+#define GL_BGRA8_TYPELESS_SRGB_ANGLEX 0x6AC4 >+ >+#define GL_R8_SSCALED_ANGLEX 0x6AC6 >+#define GL_RG8_SSCALED_ANGLEX 0x6AC7 >+#define GL_RGB8_SSCALED_ANGLEX 0x6AC8 >+#define GL_RGBA8_SSCALED_ANGLEX 0x6AC9 >+#define GL_R8_USCALED_ANGLEX 0x6ACA >+#define GL_RG8_USCALED_ANGLEX 0x6ACB >+#define GL_RGB8_USCALED_ANGLEX 0x6ACC >+#define GL_RGBA8_USCALED_ANGLEX 0x6ACD >+ >+#define GL_R16_SSCALED_ANGLEX 0x6ACE >+#define GL_RG16_SSCALED_ANGLEX 0x6ACF >+#define GL_RGB16_SSCALED_ANGLEX 0x6AD0 >+#define GL_RGBA16_SSCALED_ANGLEX 0x6AD1 >+#define GL_R16_USCALED_ANGLEX 0x6AD2 >+#define GL_RG16_USCALED_ANGLEX 0x6AD3 >+#define GL_RGB16_USCALED_ANGLEX 0x6AD4 >+#define GL_RGBA16_USCALED_ANGLEX 0x6AD5 >+ >+#define GL_R32_SSCALED_ANGLEX 0x6AD6 >+#define GL_RG32_SSCALED_ANGLEX 0x6AD7 >+#define GL_RGB32_SSCALED_ANGLEX 0x6AD8 >+#define GL_RGBA32_SSCALED_ANGLEX 0x6AD9 >+#define GL_R32_USCALED_ANGLEX 0x6ADA >+#define GL_RG32_USCALED_ANGLEX 0x6ADB >+#define GL_RGB32_USCALED_ANGLEX 0x6ADC >+#define GL_RGBA32_USCALED_ANGLEX 0x6ADD >+ >+#define GL_R32_SNORM_ANGLEX 0x6ADE >+#define GL_RG32_SNORM_ANGLEX 0x6ADF >+#define GL_RGB32_SNORM_ANGLEX 0x6AE0 >+#define GL_RGBA32_SNORM_ANGLEX 0x6AE1 >+#define GL_R32_UNORM_ANGLEX 0x6AE2 >+#define GL_RG32_UNORM_ANGLEX 0x6AE3 >+#define GL_RGB32_UNORM_ANGLEX 0x6AE4 >+#define GL_RGBA32_UNORM_ANGLEX 0x6AE5 >+ >+#define GL_R32_FIXED_ANGLEX 0x6AE6 >+#define GL_RG32_FIXED_ANGLEX 0x6AE7 >+#define GL_RGB32_FIXED_ANGLEX 0x6AE8 >+#define GL_RGBA32_FIXED_ANGLEX 0x6AE9 >+ >+#define GL_RGB10_A2_SINT_ANGLEX 0x6AEA >+#define GL_RGB10_A2_SNORM_ANGLEX 0x6AEB >+#define GL_RGB10_A2_SSCALED_ANGLEX 0x6AEC >+#define GL_RGB10_A2_USCALED_ANGLEX 0x6AED >+ >+#define ANGLE_CHECK_GL_ALLOC(context, result) \ >+ ANGLE_CHECK(context, result, "Failed to allocate host memory", GL_OUT_OF_MEMORY) >+ >+#define ANGLE_CHECK_GL_MATH(context, result) \ >+ ANGLE_CHECK(context, result, "Integer overflow.", GL_INVALID_OPERATION) >+ >+#define ANGLE_GL_UNREACHABLE(context) \ >+ UNREACHABLE(); \ >+ ANGLE_CHECK(context, false, "Unreachable Code.", GL_INVALID_OPERATION) > > // The below inlining code lifted from V8. > #if defined(__clang__) || (defined(__GNUC__) && defined(__has_attribute)) >-#define ANGLE_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline)) >-#define ANGLE_HAS___FORCEINLINE 0 >+# define ANGLE_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline)) >+# define ANGLE_HAS___FORCEINLINE 0 > #elif defined(_MSC_VER) >-#define ANGLE_HAS_ATTRIBUTE_ALWAYS_INLINE 0 >-#define ANGLE_HAS___FORCEINLINE 1 >+# define ANGLE_HAS_ATTRIBUTE_ALWAYS_INLINE 0 >+# define ANGLE_HAS___FORCEINLINE 1 > #else >-#define ANGLE_HAS_ATTRIBUTE_ALWAYS_INLINE 0 >-#define ANGLE_HAS___FORCEINLINE 0 >+# define ANGLE_HAS_ATTRIBUTE_ALWAYS_INLINE 0 >+# define ANGLE_HAS___FORCEINLINE 0 > #endif > > #if defined(NDEBUG) && ANGLE_HAS_ATTRIBUTE_ALWAYS_INLINE >-#define ANGLE_INLINE inline __attribute__((always_inline)) >+# define ANGLE_INLINE inline __attribute__((always_inline)) > #elif defined(NDEBUG) && ANGLE_HAS___FORCEINLINE >-#define ANGLE_INLINE __forceinline >+# define ANGLE_INLINE __forceinline > #else >-#define ANGLE_INLINE inline >+# define ANGLE_INLINE inline > #endif > >+#if defined(__clang__) || (defined(__GNUC__) && defined(__has_attribute)) >+# if __has_attribute(noinline) >+# define ANGLE_NOINLINE __attribute__((noinline)) >+# else >+# define ANGLE_NOINLINE >+# endif >+#elif defined(_MSC_VER) >+# define ANGLE_NOINLINE __declspec(noinline) >+#else >+# define ANGLE_NOINLINE >+#endif >+ >+#if defined(__clang__) || (defined(__GNUC__) && defined(__has_attribute)) >+# if __has_attribute(format) >+# define ANGLE_FORMAT_PRINTF(fmt, args) __attribute__((format(__printf__, fmt, args))) >+# else >+# define ANGLE_FORMAT_PRINTF(fmt, args) >+# endif >+#else >+# define ANGLE_FORMAT_PRINTF(fmt, args) >+#endif >+ >+// Format messes up the # inside the macro. >+// clang-format off > #ifndef ANGLE_STRINGIFY >-#define ANGLE_STRINGIFY(x) #x >+# define ANGLE_STRINGIFY(x) #x > #endif >+// clang-format on > > #ifndef ANGLE_MACRO_STRINGIFY >-#define ANGLE_MACRO_STRINGIFY(x) ANGLE_STRINGIFY(x) >+# define ANGLE_MACRO_STRINGIFY(x) ANGLE_STRINGIFY(x) > #endif > > // Detect support for C++17 [[nodiscard]] > #if !defined(__has_cpp_attribute) >-#define __has_cpp_attribute(name) 0 >+# define __has_cpp_attribute(name) 0 > #endif // !defined(__has_cpp_attribute) > > #if __has_cpp_attribute(nodiscard) >-#define ANGLE_NO_DISCARD [[nodiscard]] >+# define ANGLE_NO_DISCARD [[nodiscard]] > #else >-#define ANGLE_NO_DISCARD >+# define ANGLE_NO_DISCARD > #endif // __has_cpp_attribute(nodiscard) > >-#endif // COMMON_ANGLEUTILS_H_ >+#if __has_cpp_attribute(maybe_unused) >+# define ANGLE_MAYBE_UNUSED [[maybe_unused]] >+#else >+# define ANGLE_MAYBE_UNUSED >+#endif // __has_cpp_attribute(maybe_unused) >+ >+#endif // COMMON_ANGLEUTILS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/bitset_utils.h b/Source/ThirdParty/ANGLE/src/common/bitset_utils.h >index 4166a562a72..591a2609ea7 100644 >--- a/Source/ThirdParty/ANGLE/src/common/bitset_utils.h >+++ b/Source/ThirdParty/ANGLE/src/common/bitset_utils.h >@@ -22,7 +22,7 @@ > namespace angle > { > >-template <size_t N, typename BitsT> >+template <size_t N, typename BitsT, typename ParamT = std::size_t> > class BitSetT final > { > public: >@@ -40,10 +40,10 @@ class BitSetT final > private: > friend class BitSetT; > >- Reference(BitSetT *parent, std::size_t bit) : mParent(parent), mBit(bit) {} >+ Reference(BitSetT *parent, ParamT bit) : mParent(parent), mBit(bit) {} > > BitSetT *mParent; >- std::size_t mBit; >+ ParamT mBit; > }; > > class Iterator final >@@ -54,7 +54,21 @@ class BitSetT final > > bool operator==(const Iterator &other) const; > bool operator!=(const Iterator &other) const; >- std::size_t operator*() const; >+ ParamT operator*() const; >+ >+ // These helper functions allow mutating an iterator in-flight. >+ // They only operate on later bits to ensure we don't iterate the same bit twice. >+ void resetLaterBit(std::size_t index) >+ { >+ ASSERT(index > mCurrentBit); >+ mBitsCopy.reset(index); >+ } >+ >+ void setLaterBit(std::size_t index) >+ { >+ ASSERT(index > mCurrentBit); >+ mBitsCopy.set(index); >+ } > > private: > std::size_t getNextBit(); >@@ -64,8 +78,7 @@ class BitSetT final > }; > > BitSetT(); >- BitSetT(BitsT value); >- ~BitSetT(); >+ constexpr explicit BitSetT(BitsT value); > > BitSetT(const BitSetT &other); > BitSetT &operator=(const BitSetT &other); >@@ -73,10 +86,10 @@ class BitSetT final > bool operator==(const BitSetT &other) const; > bool operator!=(const BitSetT &other) const; > >- constexpr bool operator[](std::size_t pos) const; >- Reference operator[](std::size_t pos) { return Reference(this, pos); } >+ constexpr bool operator[](ParamT pos) const; >+ Reference operator[](ParamT pos) { return Reference(this, pos); } > >- bool test(std::size_t pos) const; >+ bool test(ParamT pos) const; > > bool all() const; > bool any() const; >@@ -90,19 +103,23 @@ class BitSetT final > BitSetT &operator^=(const BitSetT &other); > BitSetT operator~() const; > >+ BitSetT &operator&=(BitsT value); >+ BitSetT &operator|=(BitsT value); >+ BitSetT &operator^=(BitsT value); >+ > BitSetT operator<<(std::size_t pos) const; > BitSetT &operator<<=(std::size_t pos); > BitSetT operator>>(std::size_t pos) const; > BitSetT &operator>>=(std::size_t pos); > > BitSetT &set(); >- BitSetT &set(std::size_t pos, bool value = true); >+ BitSetT &set(ParamT pos, bool value = true); > > BitSetT &reset(); >- BitSetT &reset(std::size_t pos); >+ BitSetT &reset(ParamT pos); > > BitSetT &flip(); >- BitSetT &flip(std::size_t pos); >+ BitSetT &flip(ParamT pos); > > unsigned long to_ulong() const { return static_cast<unsigned long>(mBits); } > BitsT bits() const { return mBits; } >@@ -111,8 +128,15 @@ class BitSetT final > Iterator end() const { return Iterator(BitSetT()); } > > private: >- constexpr static BitsT Bit(std::size_t x) { return (static_cast<BitsT>(1) << x); } >- constexpr static BitsT Mask(std::size_t x) { return ((Bit(x - 1) - 1) << 1) + 1; } >+ constexpr static BitsT Bit(ParamT x) >+ { >+ return (static_cast<BitsT>(1) << static_cast<size_t>(x)); >+ } >+ // Produces a mask of ones up to the "x"th bit. >+ constexpr static BitsT Mask(std::size_t x) >+ { >+ return ((Bit(static_cast<ParamT>(x - 1)) - 1) << 1) + 1; >+ } > > BitsT mBits; > }; >@@ -134,6 +158,20 @@ class IterableBitSet : public std::bitset<N> > bool operator!=(const Iterator &other) const; > unsigned long operator*() const { return mCurrentBit; } > >+ // These helper functions allow mutating an iterator in-flight. >+ // They only operate on later bits to ensure we don't iterate the same bit twice. >+ void resetLaterBit(std::size_t index) >+ { >+ ASSERT(index > mCurrentBit); >+ mBits.reset(index - mOffset); >+ } >+ >+ void setLaterBit(std::size_t index) >+ { >+ ASSERT(index > mCurrentBit); >+ mBits.set(index - mOffset); >+ } >+ > private: > unsigned long getNextBit(); > >@@ -162,7 +200,7 @@ IterableBitSet<N>::Iterator::Iterator(const std::bitset<N> &bitset) > } > > template <size_t N> >-typename IterableBitSet<N>::Iterator &IterableBitSet<N>::Iterator::operator++() >+ANGLE_INLINE typename IterableBitSet<N>::Iterator &IterableBitSet<N>::Iterator::operator++() > { > ASSERT(mBits.any()); > mBits.set(mCurrentBit - mOffset, 0); >@@ -202,152 +240,166 @@ unsigned long IterableBitSet<N>::Iterator::getNextBit() > return 0; > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT>::BitSetT() : mBits(0) >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT>::BitSetT() : mBits(0) > { > static_assert(N > 0, "Bitset type cannot support zero bits."); > static_assert(N <= sizeof(BitsT) * 8, "Bitset type cannot support a size this large."); > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT>::BitSetT(BitsT value) : mBits(value & Mask(N)) >-{ >-} >- >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT>::~BitSetT() >-{ >-} >+template <size_t N, typename BitsT, typename ParamT> >+constexpr BitSetT<N, BitsT, ParamT>::BitSetT(BitsT value) : mBits(value & Mask(N)) >+{} > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT>::BitSetT(const BitSetT &other) : mBits(other.mBits) >-{ >-} >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT>::BitSetT(const BitSetT &other) : mBits(other.mBits) >+{} > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> &BitSetT<N, BitsT>::operator=(const BitSetT &other) >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator=(const BitSetT &other) > { > mBits = other.mBits; > return *this; > } > >-template <size_t N, typename BitsT> >-bool BitSetT<N, BitsT>::operator==(const BitSetT &other) const >+template <size_t N, typename BitsT, typename ParamT> >+bool BitSetT<N, BitsT, ParamT>::operator==(const BitSetT &other) const > { > return mBits == other.mBits; > } > >-template <size_t N, typename BitsT> >-bool BitSetT<N, BitsT>::operator!=(const BitSetT &other) const >+template <size_t N, typename BitsT, typename ParamT> >+bool BitSetT<N, BitsT, ParamT>::operator!=(const BitSetT &other) const > { > return mBits != other.mBits; > } > >-template <size_t N, typename BitsT> >-constexpr bool BitSetT<N, BitsT>::operator[](std::size_t pos) const >+template <size_t N, typename BitsT, typename ParamT> >+constexpr bool BitSetT<N, BitsT, ParamT>::operator[](ParamT pos) const > { > return test(pos); > } > >-template <size_t N, typename BitsT> >-bool BitSetT<N, BitsT>::test(std::size_t pos) const >+template <size_t N, typename BitsT, typename ParamT> >+bool BitSetT<N, BitsT, ParamT>::test(ParamT pos) const > { > return (mBits & Bit(pos)) != 0; > } > >-template <size_t N, typename BitsT> >-bool BitSetT<N, BitsT>::all() const >+template <size_t N, typename BitsT, typename ParamT> >+bool BitSetT<N, BitsT, ParamT>::all() const > { > ASSERT(mBits == (mBits & Mask(N))); > return mBits == Mask(N); > } > >-template <size_t N, typename BitsT> >-bool BitSetT<N, BitsT>::any() const >+template <size_t N, typename BitsT, typename ParamT> >+bool BitSetT<N, BitsT, ParamT>::any() const > { > ASSERT(mBits == (mBits & Mask(N))); > return (mBits != 0); > } > >-template <size_t N, typename BitsT> >-bool BitSetT<N, BitsT>::none() const >+template <size_t N, typename BitsT, typename ParamT> >+bool BitSetT<N, BitsT, ParamT>::none() const > { > ASSERT(mBits == (mBits & Mask(N))); > return (mBits == 0); > } > >-template <size_t N, typename BitsT> >-std::size_t BitSetT<N, BitsT>::count() const >+template <size_t N, typename BitsT, typename ParamT> >+std::size_t BitSetT<N, BitsT, ParamT>::count() const > { > return gl::BitCount(mBits); > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> &BitSetT<N, BitsT>::operator&=(const BitSetT &other) >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator&=(const BitSetT &other) > { > mBits &= other.mBits; > return *this; > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> &BitSetT<N, BitsT>::operator|=(const BitSetT &other) >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator|=(const BitSetT &other) > { > mBits |= other.mBits; > return *this; > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> &BitSetT<N, BitsT>::operator^=(const BitSetT &other) >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator^=(const BitSetT &other) >+{ >+ mBits = mBits ^ other.mBits; >+ return *this; >+} >+ >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> BitSetT<N, BitsT, ParamT>::operator~() const > { >- mBits = (mBits ^ other.mBits) & Mask(N); >+ return BitSetT<N, BitsT, ParamT>(~mBits & Mask(N)); >+} >+ >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator&=(BitsT value) >+{ >+ mBits &= value; > return *this; > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> BitSetT<N, BitsT>::operator~() const >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator|=(BitsT value) > { >- return BitSetT<N, BitsT>(~mBits & Mask(N)); >+ mBits |= value & Mask(N); >+ return *this; >+} >+ >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator^=(BitsT value) >+{ >+ mBits ^= value & Mask(N); >+ return *this; > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> BitSetT<N, BitsT>::operator<<(std::size_t pos) const >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> BitSetT<N, BitsT, ParamT>::operator<<(std::size_t pos) const > { >- return BitSetT<N, BitsT>((mBits << pos) & Mask(N)); >+ return BitSetT<N, BitsT, ParamT>((mBits << pos) & Mask(N)); > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> &BitSetT<N, BitsT>::operator<<=(std::size_t pos) >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator<<=(std::size_t pos) > { > mBits = (mBits << pos & Mask(N)); > return *this; > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> BitSetT<N, BitsT>::operator>>(std::size_t pos) const >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> BitSetT<N, BitsT, ParamT>::operator>>(std::size_t pos) const > { >- return BitSetT<N, BitsT>(mBits >> pos); >+ return BitSetT<N, BitsT, ParamT>(mBits >> pos); > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> &BitSetT<N, BitsT>::operator>>=(std::size_t pos) >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator>>=(std::size_t pos) > { > mBits = ((mBits >> pos) & Mask(N)); > return *this; > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> &BitSetT<N, BitsT>::set() >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::set() > { > mBits = Mask(N); > return *this; > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> &BitSetT<N, BitsT>::set(std::size_t pos, bool value) >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::set(ParamT pos, bool value) > { > if (value) > { >- mBits |= Bit(pos); >+ mBits |= Bit(pos) & Mask(N); > } > else > { >@@ -356,36 +408,36 @@ BitSetT<N, BitsT> &BitSetT<N, BitsT>::set(std::size_t pos, bool value) > return *this; > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> &BitSetT<N, BitsT>::reset() >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::reset() > { > mBits = 0; > return *this; > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> &BitSetT<N, BitsT>::reset(std::size_t pos) >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::reset(ParamT pos) > { > mBits &= ~Bit(pos); > return *this; > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> &BitSetT<N, BitsT>::flip() >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::flip() > { > mBits ^= Mask(N); > return *this; > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT> &BitSetT<N, BitsT>::flip(std::size_t pos) >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::flip(ParamT pos) > { >- mBits ^= Bit(pos); >+ mBits ^= Bit(pos) & Mask(N); > return *this; > } > >-template <size_t N, typename BitsT> >-BitSetT<N, BitsT>::Iterator::Iterator(const BitSetT &bits) : mBitsCopy(bits), mCurrentBit(0) >+template <size_t N, typename BitsT, typename ParamT> >+BitSetT<N, BitsT, ParamT>::Iterator::Iterator(const BitSetT &bits) : mBitsCopy(bits), mCurrentBit(0) > { > if (bits.any()) > { >@@ -393,35 +445,36 @@ BitSetT<N, BitsT>::Iterator::Iterator(const BitSetT &bits) : mBitsCopy(bits), mC > } > } > >-template <size_t N, typename BitsT> >-typename BitSetT<N, BitsT>::Iterator &BitSetT<N, BitsT>::Iterator::operator++() >+template <size_t N, typename BitsT, typename ParamT> >+ANGLE_INLINE typename BitSetT<N, BitsT, ParamT>::Iterator &BitSetT<N, BitsT, ParamT>::Iterator:: >+operator++() > { > ASSERT(mBitsCopy.any()); >- mBitsCopy.reset(mCurrentBit); >+ mBitsCopy.reset(static_cast<ParamT>(mCurrentBit)); > mCurrentBit = getNextBit(); > return *this; > } > >-template <size_t N, typename BitsT> >-bool BitSetT<N, BitsT>::Iterator::operator==(const Iterator &other) const >+template <size_t N, typename BitsT, typename ParamT> >+bool BitSetT<N, BitsT, ParamT>::Iterator::operator==(const Iterator &other) const > { > return mBitsCopy == other.mBitsCopy; > } > >-template <size_t N, typename BitsT> >-bool BitSetT<N, BitsT>::Iterator::operator!=(const Iterator &other) const >+template <size_t N, typename BitsT, typename ParamT> >+bool BitSetT<N, BitsT, ParamT>::Iterator::operator!=(const Iterator &other) const > { > return !(*this == other); > } > >-template <size_t N, typename BitsT> >-std::size_t BitSetT<N, BitsT>::Iterator::operator*() const >+template <size_t N, typename BitsT, typename ParamT> >+ParamT BitSetT<N, BitsT, ParamT>::Iterator::operator*() const > { >- return mCurrentBit; >+ return static_cast<ParamT>(mCurrentBit); > } > >-template <size_t N, typename BitsT> >-std::size_t BitSetT<N, BitsT>::Iterator::getNextBit() >+template <size_t N, typename BitsT, typename ParamT> >+std::size_t BitSetT<N, BitsT, ParamT>::Iterator::getNextBit() > { > if (mBitsCopy.none()) > { >@@ -472,27 +525,33 @@ struct GetBitSet<N, EnableIfBitsFit<N, uint32_t>> > template <size_t N> > using BitSet = typename priv::GetBitSet<N>::Type; > >-} // angle >+} // namespace angle > >-template <size_t N, typename BitsT> >-inline angle::BitSetT<N, BitsT> operator&(const angle::BitSetT<N, BitsT> &lhs, >- const angle::BitSetT<N, BitsT> &rhs) >+template <size_t N, typename BitsT, typename ParamT> >+inline angle::BitSetT<N, BitsT, ParamT> operator&(const angle::BitSetT<N, BitsT, ParamT> &lhs, >+ const angle::BitSetT<N, BitsT, ParamT> &rhs) > { >- return angle::BitSetT<N, BitsT>(lhs.bits() & rhs.bits()); >+ angle::BitSetT<N, BitsT, ParamT> result(lhs); >+ result &= rhs.bits(); >+ return result; > } > >-template <size_t N, typename BitsT> >-inline angle::BitSetT<N, BitsT> operator|(const angle::BitSetT<N, BitsT> &lhs, >- const angle::BitSetT<N, BitsT> &rhs) >+template <size_t N, typename BitsT, typename ParamT> >+inline angle::BitSetT<N, BitsT, ParamT> operator|(const angle::BitSetT<N, BitsT, ParamT> &lhs, >+ const angle::BitSetT<N, BitsT, ParamT> &rhs) > { >- return angle::BitSetT<N, BitsT>(lhs.bits() | rhs.bits()); >+ angle::BitSetT<N, BitsT, ParamT> result(lhs); >+ result |= rhs.bits(); >+ return result; > } > >-template <size_t N, typename BitsT> >-inline angle::BitSetT<N, BitsT> operator^(const angle::BitSetT<N, BitsT> &lhs, >- const angle::BitSetT<N, BitsT> &rhs) >+template <size_t N, typename BitsT, typename ParamT> >+inline angle::BitSetT<N, BitsT, ParamT> operator^(const angle::BitSetT<N, BitsT, ParamT> &lhs, >+ const angle::BitSetT<N, BitsT, ParamT> &rhs) > { >- return angle::BitSetT<N, BitsT>(lhs.bits() ^ rhs.bits()); >+ angle::BitSetT<N, BitsT, ParamT> result(lhs); >+ result ^= rhs.bits(); >+ return result; > } > > #endif // COMMON_BITSETITERATOR_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/bitset_utils_unittest.cpp b/Source/ThirdParty/ANGLE/src/common/bitset_utils_unittest.cpp >index 3394890f25f..7e37ad40a71 100644 >--- a/Source/ThirdParty/ANGLE/src/common/bitset_utils_unittest.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/bitset_utils_unittest.cpp >@@ -15,6 +15,148 @@ using namespace angle; > > namespace > { >+class BitSetTest : public testing::Test >+{ >+ protected: >+ BitSet<12> mBits; >+}; >+ >+TEST_F(BitSetTest, Basic) >+{ >+ EXPECT_FALSE(mBits.all()); >+ EXPECT_FALSE(mBits.any()); >+ EXPECT_TRUE(mBits.none()); >+ EXPECT_EQ(mBits.count(), 0u); >+ >+ // Set every bit to 1. >+ for (size_t i = 0; i < mBits.size(); ++i) >+ { >+ mBits.set(i); >+ >+ EXPECT_EQ(mBits.all(), i + 1 == mBits.size()); >+ EXPECT_TRUE(mBits.any()); >+ EXPECT_FALSE(mBits.none()); >+ EXPECT_EQ(mBits.count(), i + 1); >+ } >+ >+ // Reset every other bit to 0. >+ for (size_t i = 0; i < mBits.size(); i += 2) >+ { >+ mBits.reset(i); >+ >+ EXPECT_FALSE(mBits.all()); >+ EXPECT_TRUE(mBits.any()); >+ EXPECT_FALSE(mBits.none()); >+ EXPECT_EQ(mBits.count(), mBits.size() - i / 2 - 1); >+ } >+ >+ // Flip all bits. >+ for (size_t i = 0; i < mBits.size(); ++i) >+ { >+ mBits.flip(i); >+ >+ EXPECT_FALSE(mBits.all()); >+ EXPECT_TRUE(mBits.any()); >+ EXPECT_FALSE(mBits.none()); >+ EXPECT_EQ(mBits.count(), mBits.size() / 2 + (i % 2 == 0)); >+ } >+ >+ // Make sure the bit pattern is what we expect at this point. >+ for (size_t i = 0; i < mBits.size(); ++i) >+ { >+ EXPECT_EQ(mBits.test(i), i % 2 == 0); >+ EXPECT_EQ(static_cast<bool>(mBits[i]), i % 2 == 0); >+ } >+ >+ // Test that flip, set and reset all bits at once work. >+ mBits.flip(); >+ EXPECT_FALSE(mBits.all()); >+ EXPECT_TRUE(mBits.any()); >+ EXPECT_FALSE(mBits.none()); >+ EXPECT_EQ(mBits.count(), mBits.size() / 2); >+ >+ mBits.set(); >+ EXPECT_TRUE(mBits.all()); >+ EXPECT_TRUE(mBits.any()); >+ EXPECT_FALSE(mBits.none()); >+ EXPECT_EQ(mBits.count(), mBits.size()); >+ >+ mBits.reset(); >+ EXPECT_FALSE(mBits.all()); >+ EXPECT_FALSE(mBits.any()); >+ EXPECT_TRUE(mBits.none()); >+ EXPECT_EQ(mBits.count(), 0u); >+ >+ // Test that out-of-bound sets don't modify the bitset >+ constexpr uint32_t kMask = (1 << 12) - 1; >+ >+ EXPECT_EQ(mBits.set(12).bits() & ~kMask, 0u); >+ EXPECT_EQ(mBits.set(13).bits() & ~kMask, 0u); >+ EXPECT_EQ(mBits.flip(12).bits() & ~kMask, 0u); >+ EXPECT_EQ(mBits.flip(13).bits() & ~kMask, 0u); >+} >+ >+TEST_F(BitSetTest, BitwiseOperators) >+{ >+ // Use a value that has a 1 in the 12th and 13th bits, to make sure masking to exactly 12 bits >+ // does not have an off-by-one error. >+ constexpr uint32_t kSelfValue = 0xF9E4; >+ constexpr uint32_t kOtherValue = 0x5C6A; >+ >+ constexpr uint32_t kMask = (1 << 12) - 1; >+ constexpr uint32_t kSelfMaskedValue = kSelfValue & kMask; >+ constexpr uint32_t kOtherMaskedValue = kOtherValue & kMask; >+ >+ constexpr uint32_t kShift = 3; >+ constexpr uint32_t kSelfShiftedLeft = kSelfMaskedValue << kShift & kMask; >+ constexpr uint32_t kSelfShiftedRight = kSelfMaskedValue >> kShift & kMask; >+ >+ mBits |= kSelfValue; >+ BitSet<12> other(kOtherValue); >+ BitSet<12> anded(kSelfMaskedValue & kOtherMaskedValue); >+ BitSet<12> ored(kSelfMaskedValue | kOtherMaskedValue); >+ BitSet<12> xored(kSelfMaskedValue ^ kOtherMaskedValue); >+ >+ EXPECT_EQ(mBits.bits(), kSelfMaskedValue); >+ EXPECT_EQ(other.bits(), kOtherMaskedValue); >+ >+ EXPECT_EQ(mBits & other, anded); >+ EXPECT_EQ(mBits | other, ored); >+ EXPECT_EQ(mBits ^ other, xored); >+ >+ EXPECT_NE(mBits, other); >+ EXPECT_NE(anded, ored); >+ EXPECT_NE(anded, xored); >+ EXPECT_NE(ored, xored); >+ >+ mBits &= other; >+ EXPECT_EQ(mBits, anded); >+ >+ mBits |= ored; >+ EXPECT_EQ(mBits, ored); >+ >+ mBits ^= other; >+ mBits ^= anded; >+ EXPECT_EQ(mBits, BitSet<12>(kSelfValue)); >+ >+ EXPECT_EQ(mBits << kShift, BitSet<12>(kSelfShiftedLeft)); >+ EXPECT_EQ(mBits >> kShift, BitSet<12>(kSelfShiftedRight)); >+ >+ mBits <<= kShift; >+ EXPECT_EQ(mBits, BitSet<12>(kSelfShiftedLeft)); >+ EXPECT_EQ(mBits.bits() & ~kMask, 0u); >+ >+ mBits = BitSet<12>(kSelfValue); >+ mBits >>= kShift; >+ EXPECT_EQ(mBits, BitSet<12>(kSelfShiftedRight)); >+ EXPECT_EQ(mBits.bits() & ~kMask, 0u); >+ >+ mBits |= kSelfMaskedValue; >+ EXPECT_EQ(mBits.bits() & ~kMask, 0u); >+ mBits ^= kOtherMaskedValue; >+ EXPECT_EQ(mBits.bits() & ~kMask, 0u); >+} >+ > class BitSetIteratorTest : public testing::Test > { > protected: >@@ -55,7 +197,7 @@ TEST_F(BitSetIteratorTest, EmptySet) > for (size_t bit : mStateBits) > { > sawBit = true; >- UNUSED_VARIABLE(bit); >+ ANGLE_UNUSED_VARIABLE(bit); > } > EXPECT_FALSE(sawBit); > } >@@ -109,4 +251,53 @@ TEST_F(BitSetIteratorTest, BitAssignment) > } > } > >+// Tests adding bits to the iterator during iteration. >+TEST_F(BitSetIteratorTest, SetLaterBit) >+{ >+ std::set<size_t> expectedValues = {1, 3, 5, 7, 9}; >+ mStateBits.set(1); >+ >+ std::set<size_t> actualValues; >+ >+ for (auto iter = mStateBits.begin(), end = mStateBits.end(); iter != end; ++iter) >+ { >+ if (*iter == 1) >+ { >+ iter.setLaterBit(3); >+ iter.setLaterBit(5); >+ iter.setLaterBit(7); >+ iter.setLaterBit(9); >+ } >+ >+ actualValues.insert(*iter); >+ } >+ >+ EXPECT_EQ(expectedValues, actualValues); >+} >+ >+// Tests removing bits from the iterator during iteration. >+TEST_F(BitSetIteratorTest, ResetLaterBit) >+{ >+ std::set<size_t> expectedValues = {1, 3, 5, 7, 9}; >+ >+ for (size_t index = 1; index <= 9; ++index) >+ mStateBits.set(index); >+ >+ std::set<size_t> actualValues; >+ >+ for (auto iter = mStateBits.begin(), end = mStateBits.end(); iter != end; ++iter) >+ { >+ if (*iter == 1) >+ { >+ iter.resetLaterBit(2); >+ iter.resetLaterBit(4); >+ iter.resetLaterBit(6); >+ iter.resetLaterBit(8); >+ } >+ >+ actualValues.insert(*iter); >+ } >+ >+ EXPECT_EQ(expectedValues, actualValues); >+} > } // anonymous namespace >diff --git a/Source/ThirdParty/ANGLE/src/common/debug.cpp b/Source/ThirdParty/ANGLE/src/common/debug.cpp >index b02e80be5f1..6a14631f580 100644 >--- a/Source/ThirdParty/ANGLE/src/common/debug.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/debug.cpp >@@ -13,11 +13,16 @@ > #include <array> > #include <cstdio> > #include <fstream> >+#include <mutex> > #include <ostream> > #include <vector> > >-#include "common/angleutils.h" >+#if defined(ANGLE_PLATFORM_ANDROID) >+# include <android/log.h> >+#endif >+ > #include "common/Optional.h" >+#include "common/angleutils.h" > > namespace gl > { >@@ -27,8 +32,10 @@ namespace > > DebugAnnotator *g_debugAnnotator = nullptr; > >+std::mutex *g_debugMutex = nullptr; >+ > constexpr std::array<const char *, LOG_NUM_SEVERITIES> g_logSeverityNames = { >- {"EVENT", "WARN", "ERR"}}; >+ {"EVENT", "WARN", "ERR", "FATAL"}}; > > constexpr const char *LogSeverityName(int severity) > { >@@ -41,7 +48,7 @@ bool ShouldCreateLogMessage(LogSeverity severity) > #if defined(ANGLE_TRACE_ENABLED) > return true; > #elif defined(ANGLE_ENABLE_ASSERTS) >- return severity == LOG_ERR; >+ return severity != LOG_EVENT; > #else > return false; > #endif >@@ -61,6 +68,9 @@ bool ShouldCreatePlatformLogMessage(LogSeverity severity) > #endif > } > >+// This is never instantiated, it's just used for EAT_STREAM_PARAMETERS to an object of the correct >+// type on the LHS of the unused part of the ternary operator. >+std::ostream *gSwallowStream; > } // namespace priv > > bool DebugAnnotationsActive() >@@ -89,10 +99,19 @@ void UninitializeDebugAnnotations() > g_debugAnnotator = nullptr; > } > >-ScopedPerfEventHelper::ScopedPerfEventHelper(const char *format, ...) >+void InitializeDebugMutexIfNeeded() > { >+ if (g_debugMutex == nullptr) >+ { >+ g_debugMutex = new std::mutex(); >+ } >+} >+ >+ScopedPerfEventHelper::ScopedPerfEventHelper(const char *format, ...) : mFunctionName(nullptr) >+{ >+ bool dbgTrace = DebugAnnotationsActive(); > #if !defined(ANGLE_ENABLE_DEBUG_TRACE) >- if (!DebugAnnotationsActive()) >+ if (!dbgTrace) > { > return; > } >@@ -103,14 +122,20 @@ ScopedPerfEventHelper::ScopedPerfEventHelper(const char *format, ...) > std::vector<char> buffer(512); > size_t len = FormatStringIntoVector(format, vararg, buffer); > ANGLE_LOG(EVENT) << std::string(&buffer[0], len); >+ // Pull function name from variable args >+ mFunctionName = va_arg(vararg, const char *); > va_end(vararg); >+ if (dbgTrace) >+ { >+ g_debugAnnotator->beginEvent(mFunctionName, buffer.data()); >+ } > } > > ScopedPerfEventHelper::~ScopedPerfEventHelper() > { > if (DebugAnnotationsActive()) > { >- g_debugAnnotator->endEvent(); >+ g_debugAnnotator->endEvent(mFunctionName); > } > } > >@@ -126,7 +151,13 @@ LogMessage::LogMessage(const char *function, int line, LogSeverity severity) > > LogMessage::~LogMessage() > { >- if (DebugAnnotationsInitialized() && (mSeverity == LOG_ERR || mSeverity == LOG_WARN)) >+ std::unique_lock<std::mutex> lock; >+ if (g_debugMutex != nullptr) >+ { >+ lock = std::unique_lock<std::mutex>(*g_debugMutex); >+ } >+ >+ if (DebugAnnotationsInitialized() && (mSeverity >= LOG_WARN)) > { > g_debugAnnotator->logMessage(*this); > } >@@ -134,6 +165,11 @@ LogMessage::~LogMessage() > { > Trace(getSeverity(), getMessage().c_str()); > } >+ >+ if (mSeverity == LOG_FATAL) >+ { >+ ANGLE_CRASH(); >+ } > } > > void Trace(LogSeverity severity, const char *message) >@@ -147,42 +183,62 @@ void Trace(LogSeverity severity, const char *message) > > if (DebugAnnotationsActive()) > { >- std::wstring formattedWideMessage(str.begin(), str.end()); > > switch (severity) > { > case LOG_EVENT: >- g_debugAnnotator->beginEvent(formattedWideMessage.c_str()); >+ // Debugging logging done in ScopedPerfEventHelper > break; > default: >- g_debugAnnotator->setMarker(formattedWideMessage.c_str()); >+ g_debugAnnotator->setMarker(message); > break; > } > } > >- if (severity == LOG_ERR) >+ if (severity == LOG_FATAL || severity == LOG_ERR || severity == LOG_WARN) > { >+#if defined(ANGLE_PLATFORM_ANDROID) >+ android_LogPriority android_priority = ANDROID_LOG_ERROR; >+ switch (severity) >+ { >+ case LOG_WARN: >+ android_priority = ANDROID_LOG_WARN; >+ break; >+ case LOG_ERR: >+ android_priority = ANDROID_LOG_ERROR; >+ break; >+ case LOG_FATAL: >+ android_priority = ANDROID_LOG_FATAL; >+ break; >+ default: >+ UNREACHABLE(); >+ } >+ __android_log_print(android_priority, "ANGLE", "%s: %s\n", LogSeverityName(severity), >+ str.c_str()); >+#else > // Note: we use fprintf because <iostream> includes static initializers. >- fprintf(stderr, "%s: %s\n", LogSeverityName(severity), str.c_str()); >+ fprintf((severity >= LOG_ERR) ? stderr : stdout, "%s: %s\n", LogSeverityName(severity), >+ str.c_str()); >+#endif > } > > #if defined(ANGLE_PLATFORM_WINDOWS) && \ > (defined(ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER) || !defined(NDEBUG)) >-#if !defined(ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER) >- if (severity == LOG_ERR) >-#endif // !defined(ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER) >+# if !defined(ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER) >+ if (severity >= LOG_ERR) >+# endif // !defined(ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER) > { > OutputDebugStringA(str.c_str()); > } > #endif > > #if defined(ANGLE_ENABLE_DEBUG_TRACE) >-#if defined(NDEBUG) >+# if defined(NDEBUG) > if (severity == LOG_EVENT || severity == LOG_WARN) > { > return; > } >-#endif // defined(NDEBUG) >+# endif // defined(NDEBUG) > static std::ofstream file(TRACE_OUTPUT_FILE, std::ofstream::app); > if (file) > { >@@ -203,18 +259,15 @@ std::string LogMessage::getMessage() const > } > > #if defined(ANGLE_PLATFORM_WINDOWS) >-std::ostream &operator<<(std::ostream &os, const FmtHR &fmt) >+priv::FmtHexHelper<HRESULT> FmtHR(HRESULT value) > { >- os << "HRESULT: "; >- return FmtHexInt(os, fmt.mHR); >+ return priv::FmtHexHelper<HRESULT>("HRESULT: ", value); > } > >-std::ostream &operator<<(std::ostream &os, const FmtErr &fmt) >+priv::FmtHexHelper<DWORD> FmtErr(DWORD value) > { >- os << "error: "; >- return FmtHexInt(os, fmt.mErr); >+ return priv::FmtHexHelper<DWORD>("error: ", value); > } >- > #endif // defined(ANGLE_PLATFORM_WINDOWS) > > } // namespace gl >diff --git a/Source/ThirdParty/ANGLE/src/common/debug.h b/Source/ThirdParty/ANGLE/src/common/debug.h >index 290a4e8bb75..64783687b33 100644 >--- a/Source/ThirdParty/ANGLE/src/common/debug.h >+++ b/Source/ThirdParty/ANGLE/src/common/debug.h >@@ -4,7 +4,8 @@ > // found in the LICENSE file. > // > >-// debug.h: Debugging utilities. >+// debug.h: Debugging utilities. A lot of the logging code is adapted from Chromium's >+// base/logging.h. > > #ifndef COMMON_DEBUG_H_ > #define COMMON_DEBUG_H_ >@@ -12,15 +13,16 @@ > #include <assert.h> > #include <stdio.h> > >-#include <ios> > #include <iomanip> >+#include <ios> > #include <sstream> > #include <string> > > #include "common/angleutils.h" >+#include "common/platform.h" > > #if !defined(TRACE_OUTPUT_FILE) >-#define TRACE_OUTPUT_FILE "angle_debug.txt" >+# define TRACE_OUTPUT_FILE "angle_debug.txt" > #endif > > namespace gl >@@ -30,8 +32,12 @@ namespace gl > class ScopedPerfEventHelper : angle::NonCopyable > { > public: >- ScopedPerfEventHelper(const char* format, ...); >+ ANGLE_FORMAT_PRINTF(2, 3) >+ ScopedPerfEventHelper(const char *format, ...); > ~ScopedPerfEventHelper(); >+ >+ private: >+ const char *mFunctionName; > }; > > using LogSeverity = int; >@@ -40,7 +46,8 @@ using LogSeverity = int; > constexpr LogSeverity LOG_EVENT = 0; > constexpr LogSeverity LOG_WARN = 1; > constexpr LogSeverity LOG_ERR = 2; >-constexpr LogSeverity LOG_NUM_SEVERITIES = 3; >+constexpr LogSeverity LOG_FATAL = 3; >+constexpr LogSeverity LOG_NUM_SEVERITIES = 4; > > void Trace(LogSeverity severity, const char *message); > >@@ -70,17 +77,17 @@ class LogMessage : angle::NonCopyable > std::ostringstream mStream; > }; > >-// Wraps the D3D9/D3D11 debug annotation functions. >+// Wraps the API/Platform-specific debug annotation functions. > // Also handles redirecting logging destination. > class DebugAnnotator : angle::NonCopyable > { > public: >- DebugAnnotator(){}; >- virtual ~DebugAnnotator() { }; >- virtual void beginEvent(const wchar_t *eventName) = 0; >- virtual void endEvent() = 0; >- virtual void setMarker(const wchar_t *markerName) = 0; >- virtual bool getStatus() = 0; >+ DebugAnnotator() {} >+ virtual ~DebugAnnotator() {} >+ virtual void beginEvent(const char *eventName, const char *eventMessage) = 0; >+ virtual void endEvent(const char *eventName) = 0; >+ virtual void setMarker(const char *markerName) = 0; >+ virtual bool getStatus() = 0; > // Log Message Handler that gets passed every log message, > // when debug annotations are initialized, > // replacing default handling by LogMessage. >@@ -92,6 +99,8 @@ void UninitializeDebugAnnotations(); > bool DebugAnnotationsActive(); > bool DebugAnnotationsInitialized(); > >+void InitializeDebugMutexIfNeeded(); >+ > namespace priv > { > // This class is used to explicitly ignore values in the conditional logging macros. This avoids >@@ -104,6 +113,8 @@ class LogMessageVoidify > void operator&(std::ostream &) {} > }; > >+extern std::ostream *gSwallowStream; >+ > // Used by ANGLE_LOG_IS_ON to lazy-evaluate stream arguments. > bool ShouldCreatePlatformLogMessage(LogSeverity severity); > >@@ -124,39 +135,52 @@ std::ostream &FmtHex(std::ostream &os, T value) > > return os; > } >-} // namespace priv > >-#if defined(ANGLE_PLATFORM_WINDOWS) >-class FmtHR >+template <typename T> >+std::ostream &FmtHexAutoSized(std::ostream &os, T value) > { >- public: >- explicit FmtHR(HRESULT hresult) : mHR(hresult) {} >- private: >- HRESULT mHR; >- friend std::ostream &operator<<(std::ostream &os, const FmtHR &fmt); >-}; >+ constexpr int N = sizeof(T) * 2; >+ return priv::FmtHex<N>(os, value); >+} > >-class FmtErr >+template <typename T> >+class FmtHexHelper > { > public: >- explicit FmtErr(DWORD err) : mErr(err) {} >+ FmtHexHelper(const char *prefix, T value) : mPrefix(prefix), mValue(value) {} >+ explicit FmtHexHelper(T value) : mPrefix(nullptr), mValue(value) {} > > private: >- DWORD mErr; >- friend std::ostream &operator<<(std::ostream &os, const FmtErr &fmt); >+ const char *mPrefix; >+ T mValue; >+ >+ friend std::ostream &operator<<(std::ostream &os, const FmtHexHelper &fmt) >+ { >+ if (fmt.mPrefix) >+ { >+ os << fmt.mPrefix; >+ } >+ return FmtHexAutoSized(os, fmt.mValue); >+ } > }; >-#endif // defined(ANGLE_PLATFORM_WINDOWS) >+ >+} // namespace priv > > template <typename T> >-std::ostream &FmtHexShort(std::ostream &os, T value) >+priv::FmtHexHelper<T> FmtHex(T value) > { >- return priv::FmtHex<4>(os, value); >+ return priv::FmtHexHelper<T>(value); > } > >+#if defined(ANGLE_PLATFORM_WINDOWS) >+priv::FmtHexHelper<HRESULT> FmtHR(HRESULT value); >+priv::FmtHexHelper<DWORD> FmtErr(DWORD value); >+#endif // defined(ANGLE_PLATFORM_WINDOWS) >+ > template <typename T> >-std::ostream &FmtHexInt(std::ostream &os, T value) >+std::ostream &FmtHex(std::ostream &os, T value) > { >- return priv::FmtHex<8>(os, value); >+ return priv::FmtHexAutoSized(os, value); > } > > // A few definitions of macros that don't generate much code. These are used >@@ -168,10 +192,13 @@ std::ostream &FmtHexInt(std::ostream &os, T value) > ::gl::ClassName(__FUNCTION__, __LINE__, ::gl::LOG_WARN, ##__VA_ARGS__) > #define COMPACT_ANGLE_LOG_EX_ERR(ClassName, ...) \ > ::gl::ClassName(__FUNCTION__, __LINE__, ::gl::LOG_ERR, ##__VA_ARGS__) >+#define COMPACT_ANGLE_LOG_EX_FATAL(ClassName, ...) \ >+ ::gl::ClassName(__FUNCTION__, __LINE__, ::gl::LOG_FATAL, ##__VA_ARGS__) > > #define COMPACT_ANGLE_LOG_EVENT COMPACT_ANGLE_LOG_EX_EVENT(LogMessage) > #define COMPACT_ANGLE_LOG_WARN COMPACT_ANGLE_LOG_EX_WARN(LogMessage) > #define COMPACT_ANGLE_LOG_ERR COMPACT_ANGLE_LOG_EX_ERR(LogMessage) >+#define COMPACT_ANGLE_LOG_FATAL COMPACT_ANGLE_LOG_EX_FATAL(LogMessage) > > #define ANGLE_LOG_IS_ON(severity) (::gl::priv::ShouldCreatePlatformLogMessage(::gl::LOG_##severity)) > >@@ -195,92 +222,140 @@ std::ostream &FmtHexInt(std::ostream &os, T value) > } // namespace gl > > #if defined(ANGLE_ENABLE_DEBUG_TRACE) || defined(ANGLE_ENABLE_DEBUG_ANNOTATIONS) >-#define ANGLE_TRACE_ENABLED >+# define ANGLE_TRACE_ENABLED > #endif > >-#define ANGLE_EMPTY_STATEMENT for (;;) break > #if !defined(NDEBUG) || defined(ANGLE_ENABLE_RELEASE_ASSERTS) >-#define ANGLE_ENABLE_ASSERTS >+# define ANGLE_ENABLE_ASSERTS > #endif > > #define WARN() ANGLE_LOG(WARN) > #define ERR() ANGLE_LOG(ERR) >+#define FATAL() ANGLE_LOG(FATAL) > > // A macro to log a performance event around a scope. > #if defined(ANGLE_TRACE_ENABLED) >-#if defined(_MSC_VER) >-#define EVENT(message, ...) gl::ScopedPerfEventHelper scopedPerfEventHelper ## __LINE__("%s" message "\n", __FUNCTION__, __VA_ARGS__); >-#else >-#define EVENT(message, ...) gl::ScopedPerfEventHelper scopedPerfEventHelper("%s" message "\n", __FUNCTION__, ##__VA_ARGS__); >-#endif // _MSC_VER >+# if defined(_MSC_VER) >+# define EVENT(message, ...) \ >+ gl::ScopedPerfEventHelper scopedPerfEventHelper##__LINE__("%s" message "\n", \ >+ __FUNCTION__, __VA_ARGS__) >+# else >+# define EVENT(message, ...) \ >+ gl::ScopedPerfEventHelper scopedPerfEventHelper("%s" message "\n", __FUNCTION__, \ >+ ##__VA_ARGS__) >+# endif // _MSC_VER > #else >-#define EVENT(message, ...) (void(0)) >+# define EVENT(message, ...) (void(0)) > #endif > > #if defined(COMPILER_GCC) || defined(__clang__) >-#define ANGLE_CRASH() __builtin_trap() >+# define ANGLE_CRASH() __builtin_trap() > #else >-#define ANGLE_CRASH() ((void)(*(volatile char *)0 = 0)) >+# define ANGLE_CRASH() ((void)(*(volatile char *)0 = 0)), __assume(0) > #endif > > #if !defined(NDEBUG) >-#define ANGLE_ASSERT_IMPL(expression) assert(expression) >+# define ANGLE_ASSERT_IMPL(expression) assert(expression) > #else > // TODO(jmadill): Detect if debugger is attached and break. >-#define ANGLE_ASSERT_IMPL(expression) ANGLE_CRASH() >+# define ANGLE_ASSERT_IMPL(expression) ANGLE_CRASH() > #endif // !defined(NDEBUG) > >+// Note that gSwallowStream is used instead of an arbitrary LOG() stream to avoid the creation of an >+// object with a non-trivial destructor (LogMessage). On MSVC x86 (checked on 2015 Update 3), this >+// causes a few additional pointless instructions to be emitted even at full optimization level, >+// even though the : arm of the ternary operator is clearly never executed. Using a simpler object >+// to be &'d with Voidify() avoids these extra instructions. Using a simpler POD object with a >+// templated operator<< also works to avoid these instructions. However, this causes warnings on >+// statically defined implementations of operator<<(std::ostream, ...) in some .cpp files, because >+// they become defined-but-unreferenced functions. A reinterpret_cast of 0 to an ostream* also is >+// not suitable, because some compilers warn of undefined behavior. >+#define ANGLE_EAT_STREAM_PARAMETERS \ >+ true ? static_cast<void>(0) : ::gl::priv::LogMessageVoidify() & (*::gl::priv::gSwallowStream) >+ > // A macro asserting a condition and outputting failures to the debug log > #if defined(ANGLE_ENABLE_ASSERTS) >-#define ASSERT(expression) \ >- (expression ? static_cast<void>(0) : ((ERR() << "\t! Assert failed in " << __FUNCTION__ << "(" \ >- << __LINE__ << "): " << #expression), \ >- ANGLE_ASSERT_IMPL(expression))) >+# define ASSERT(expression) \ >+ (expression ? static_cast<void>(0) \ >+ : (FATAL() << "\t! Assert failed in " << __FUNCTION__ << "(" << __LINE__ \ >+ << "): " << #expression)) > #else >-// These are just dummy values. >-#define COMPACT_ANGLE_LOG_EX_ASSERT(ClassName, ...) \ >- COMPACT_ANGLE_LOG_EX_EVENT(ClassName, ##__VA_ARGS__) >-#define COMPACT_ANGLE_LOG_ASSERT COMPACT_ANGLE_LOG_EVENT >-namespace gl >-{ >-constexpr LogSeverity LOG_ASSERT = LOG_EVENT; >-} // namespace gl >- >-#define ASSERT(condition) \ >- ANGLE_LAZY_STREAM(ANGLE_LOG_STREAM(ASSERT), false ? !(condition) : false) \ >- << "Check failed: " #condition ". " >+# define ASSERT(condition) ANGLE_EAT_STREAM_PARAMETERS << !(condition) > #endif // defined(ANGLE_ENABLE_ASSERTS) > >-#define UNUSED_VARIABLE(variable) ((void)variable) >+#define UNREACHABLE_IS_NORETURN 0 >+ >+#define ANGLE_UNUSED_VARIABLE(variable) (static_cast<void>(variable)) > > // A macro to indicate unimplemented functionality > #ifndef NOASSERT_UNIMPLEMENTED >-#define NOASSERT_UNIMPLEMENTED 1 >+# define NOASSERT_UNIMPLEMENTED 1 > #endif > > #if defined(ANGLE_TRACE_ENABLED) || defined(ANGLE_ENABLE_ASSERTS) >-#define UNIMPLEMENTED() \ >- { \ >- ERR() << "\t! Unimplemented: " << __FUNCTION__ << "(" << __FILE__ << ":" << __LINE__ \ >- << ")"; \ >- ASSERT(NOASSERT_UNIMPLEMENTED); \ >- } \ >- ANGLE_EMPTY_STATEMENT >+# define UNIMPLEMENTED() \ >+ do \ >+ { \ >+ WARN() << "\t! Unimplemented: " << __FUNCTION__ << "(" << __FILE__ << ":" << __LINE__ \ >+ << ")"; \ >+ ASSERT(NOASSERT_UNIMPLEMENTED); \ >+ } while (0) > > // A macro for code which is not expected to be reached under valid assumptions >-#define UNREACHABLE() \ >- ((ERR() << "\t! Unreachable reached: " << __FUNCTION__ << "(" << __FILE__ << ":" << __LINE__ \ >- << ")"), \ >- ASSERT(false)) >+# define UNREACHABLE() \ >+ do \ >+ { \ >+ FATAL() << "\t! Unreachable reached: " << __FUNCTION__ << "(" << __FILE__ << ":" \ >+ << __LINE__ << ")"; \ >+ } while (0) > #else >-#define UNIMPLEMENTED() \ >- { \ >- ASSERT(NOASSERT_UNIMPLEMENTED); \ >- } \ >- ANGLE_EMPTY_STATEMENT >+# define UNIMPLEMENTED() \ >+ do \ >+ { \ >+ ASSERT(NOASSERT_UNIMPLEMENTED); \ >+ } while (0) > > // A macro for code which is not expected to be reached under valid assumptions >-#define UNREACHABLE() ASSERT(false) >+# define UNREACHABLE() \ >+ do \ >+ { \ >+ ASSERT(false); \ >+ } while (0) > #endif // defined(ANGLE_TRACE_ENABLED) || defined(ANGLE_ENABLE_ASSERTS) > >-#endif // COMMON_DEBUG_H_ >+#if defined(ANGLE_PLATFORM_WINDOWS) >+# define ANGLE_FUNCTION __FUNCTION__ >+#else >+# define ANGLE_FUNCTION __func__ >+#endif >+ >+// Defining ANGLE_ENABLE_STRUCT_PADDING_WARNINGS will enable warnings when members are added to >+// structs to enforce packing. This is helpful for diagnosing unexpected struct sizes when making >+// fast cache variables. >+#if defined(__clang__) >+# define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS \ >+ _Pragma("clang diagnostic push") _Pragma("clang diagnostic error \"-Wpadded\"") >+# define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS _Pragma("clang diagnostic pop") >+#elif defined(COMPILER_GCC) >+# define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS \ >+ _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic error \"-Wpadded\"") >+# define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS _Pragma("GCC diagnostic pop") >+#elif defined(_MSC_VER) >+# define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS \ >+ __pragma(warning(push)) __pragma(warning(error : 4820)) >+# define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS __pragma(warning(pop)) >+#else >+# define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS >+# define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS >+#endif >+ >+#if defined(__clang__) >+# define ANGLE_DISABLE_EXTRA_SEMI_WARNING \ >+ _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wextra-semi\"") >+# define ANGLE_REENABLE_EXTRA_SEMI_WARNING _Pragma("clang diagnostic pop") >+#else >+# define ANGLE_DISABLE_EXTRA_SEMI_WARNING >+# define ANGLE_REENABLE_EXTRA_SEMI_WARNING >+#endif >+ >+#endif // COMMON_DEBUG_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/event_tracer.cpp b/Source/ThirdParty/ANGLE/src/common/event_tracer.cpp >index 6dc8458accf..8e810df8560 100644 >--- a/Source/ThirdParty/ANGLE/src/common/event_tracer.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/event_tracer.cpp >@@ -45,7 +45,6 @@ angle::TraceEventHandle AddTraceEvent(char phase, > angle::TraceEventHandle handle = > platform->addTraceEvent(platform, phase, categoryGroupEnabled, name, id, timestamp, > numArgs, argNames, argTypes, argValues, flags); >- ASSERT(handle != 0); > return handle; > } > >diff --git a/Source/ThirdParty/ANGLE/src/common/event_tracer.h b/Source/ThirdParty/ANGLE/src/common/event_tracer.h >index 9b30c750c1f..0c275524268 100644 >--- a/Source/ThirdParty/ANGLE/src/common/event_tracer.h >+++ b/Source/ThirdParty/ANGLE/src/common/event_tracer.h >@@ -11,7 +11,7 @@ > namespace angle > { > >-const unsigned char *GetTraceCategoryEnabledFlag(const char* name); >+const unsigned char *GetTraceCategoryEnabledFlag(const char *name); > angle::TraceEventHandle AddTraceEvent(char phase, > const unsigned char *categoryGroupEnabled, > const char *name, >@@ -21,6 +21,6 @@ angle::TraceEventHandle AddTraceEvent(char phase, > const unsigned char *argTypes, > const unsigned long long *argValues, > unsigned char flags); >-} >+} // namespace angle > > #endif // COMMON_EVENT_TRACER_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/fuchsia_egl/BUILD.gn b/Source/ThirdParty/ANGLE/src/common/fuchsia_egl/BUILD.gn >new file mode 100644 >index 00000000000..84a12319023 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/fuchsia_egl/BUILD.gn >@@ -0,0 +1,30 @@ >+# Copyright 2019 The Fuchsia 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") >+ >+assert(is_fuchsia) >+ >+config("config") { >+ include_dirs = [ "." ] >+} >+ >+angle_shared_library("fuchsia_egl") { >+ sources = [ >+ "fuchsia_egl.c", >+ ] >+ public = [ >+ "fuchsia_egl.h", >+ ] >+ public_configs = [":config"] >+ deps = [ >+ ":backend", >+ ] >+} >+ >+angle_source_set("backend") { >+ public = [ >+ "fuchsia_egl_backend.h", >+ ] >+} >diff --git a/Source/ThirdParty/ANGLE/src/common/fuchsia_egl/fuchsia_egl.c b/Source/ThirdParty/ANGLE/src/common/fuchsia_egl/fuchsia_egl.c >new file mode 100644 >index 00000000000..d22f1b5e007 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/fuchsia_egl/fuchsia_egl.c >@@ -0,0 +1,75 @@ >+// Copyright 2019 The Fuchsia Authors. All rights reserved. >+// Use of this source code is governed by a BSD-style license that can be >+// found in the LICENSE file. >+ >+#include "fuchsia_egl.h" >+#include "fuchsia_egl_backend.h" >+ >+#include <zircon/assert.h> >+#include <zircon/syscalls.h> >+ >+#define FUCHSIA_EGL_WINDOW_MAGIC 0x80738870 // "FXIP" >+ >+struct fuchsia_egl_window >+{ >+ uint32_t magic; >+ zx_handle_t image_pipe_handle; >+ int32_t width; >+ int32_t height; >+}; >+ >+fuchsia_egl_window *fuchsia_egl_window_create(zx_handle_t image_pipe_handle, >+ int32_t width, >+ int32_t height) >+{ >+ if (width <= 0 || height <= 0) >+ return NULL; >+ >+ fuchsia_egl_window *egl_window = malloc(sizeof(*egl_window)); >+ egl_window->magic = FUCHSIA_EGL_WINDOW_MAGIC; >+ egl_window->image_pipe_handle = image_pipe_handle; >+ egl_window->width = width; >+ egl_window->height = height; >+ return egl_window; >+} >+ >+void fuchsia_egl_window_destroy(fuchsia_egl_window *egl_window) >+{ >+ ZX_ASSERT(egl_window->magic == FUCHSIA_EGL_WINDOW_MAGIC); >+ if (egl_window->image_pipe_handle != ZX_HANDLE_INVALID) >+ { >+ zx_handle_close(egl_window->image_pipe_handle); >+ egl_window->image_pipe_handle = ZX_HANDLE_INVALID; >+ } >+ egl_window->magic = -1U; >+ free(egl_window); >+} >+ >+void fuchsia_egl_window_resize(fuchsia_egl_window *egl_window, int32_t width, int32_t height) >+{ >+ ZX_ASSERT(egl_window->magic == FUCHSIA_EGL_WINDOW_MAGIC); >+ if (width <= 0 || height <= 0) >+ return; >+ egl_window->width = width; >+ egl_window->height = height; >+} >+ >+int32_t fuchsia_egl_window_get_width(fuchsia_egl_window *egl_window) >+{ >+ ZX_ASSERT(egl_window->magic == FUCHSIA_EGL_WINDOW_MAGIC); >+ return egl_window->width; >+} >+ >+int32_t fuchsia_egl_window_get_height(fuchsia_egl_window *egl_window) >+{ >+ ZX_ASSERT(egl_window->magic == FUCHSIA_EGL_WINDOW_MAGIC); >+ return egl_window->height; >+} >+ >+zx_handle_t fuchsia_egl_window_release_image_pipe(fuchsia_egl_window *egl_window) >+{ >+ ZX_ASSERT(egl_window->magic == FUCHSIA_EGL_WINDOW_MAGIC); >+ zx_handle_t image_pipe_handle = egl_window->image_pipe_handle; >+ egl_window->image_pipe_handle = ZX_HANDLE_INVALID; >+ return image_pipe_handle; >+} >diff --git a/Source/ThirdParty/ANGLE/src/common/fuchsia_egl/fuchsia_egl.h b/Source/ThirdParty/ANGLE/src/common/fuchsia_egl/fuchsia_egl.h >new file mode 100644 >index 00000000000..068b87d1db1 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/fuchsia_egl/fuchsia_egl.h >@@ -0,0 +1,42 @@ >+// Copyright 2019 The Fuchsia Authors. All rights reserved. >+// Use of this source code is governed by a BSD-style license that can be >+// found in the LICENSE file. >+ >+#ifndef FUCHSIA_EGL_H_ >+#define FUCHSIA_EGL_H_ >+ >+#include <inttypes.h> >+#include <zircon/types.h> >+ >+#ifdef __cplusplus >+extern "C" { >+#endif >+ >+#if !defined(FUCHSIA_EGL_EXPORT) >+# define FUCHSIA_EGL_EXPORT __attribute__((__visibility__("default"))) >+#endif >+ >+typedef struct fuchsia_egl_window fuchsia_egl_window; >+ >+FUCHSIA_EGL_EXPORT >+fuchsia_egl_window *fuchsia_egl_window_create(zx_handle_t image_pipe_handle, >+ int32_t width, >+ int32_t height); >+ >+FUCHSIA_EGL_EXPORT >+void fuchsia_egl_window_destroy(fuchsia_egl_window *egl_window); >+ >+FUCHSIA_EGL_EXPORT >+void fuchsia_egl_window_resize(fuchsia_egl_window *egl_window, int32_t width, int32_t height); >+ >+FUCHSIA_EGL_EXPORT >+int32_t fuchsia_egl_window_get_width(fuchsia_egl_window *egl_window); >+ >+FUCHSIA_EGL_EXPORT >+int32_t fuchsia_egl_window_get_height(fuchsia_egl_window *egl_window); >+ >+#ifdef __cplusplus >+} >+#endif >+ >+#endif // FUCHSIA_EGL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/fuchsia_egl/fuchsia_egl_backend.h b/Source/ThirdParty/ANGLE/src/common/fuchsia_egl/fuchsia_egl_backend.h >new file mode 100644 >index 00000000000..dcbc3f772bc >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/fuchsia_egl/fuchsia_egl_backend.h >@@ -0,0 +1,25 @@ >+// Copyright 2019 The Fuchsia Authors. All rights reserved. >+// Use of this source code is governed by a BSD-style license that can be >+// found in the LICENSE file. >+ >+#ifndef FUCHSIA_EGL_BACKEND_H_ >+#define FUCHSIA_EGL_BACKEND_H_ >+ >+#include <zircon/types.h> >+ >+#ifdef __cplusplus >+extern "C" { >+#endif >+ >+#if !defined(FUCHSIA_EGL_EXPORT) >+# define FUCHSIA_EGL_EXPORT __attribute__((__visibility__("default"))) >+#endif >+ >+FUCHSIA_EGL_EXPORT >+zx_handle_t fuchsia_egl_window_release_image_pipe(fuchsia_egl_window *egl_window); >+ >+#ifdef __cplusplus >+} >+#endif >+ >+#endif // FUCHSIA_EGL_BACKEND_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/gen_packed_gl_enums.py b/Source/ThirdParty/ANGLE/src/common/gen_packed_gl_enums.py >new file mode 100644 >index 00000000000..2f77e72563b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/gen_packed_gl_enums.py >@@ -0,0 +1,245 @@ >+# 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. >+# >+# gen_packed_gl_enums.py: >+# Code generation for the packed enums. >+# NOTE: don't run this script directly. Run scripts/run_code_generation.py. >+ >+import datetime, json, os, sys >+from collections import namedtuple >+from collections import OrderedDict >+ >+Enum = namedtuple('Enum', ['name', 'values', 'max_value']) >+EnumValue = namedtuple('EnumValue', ['name', 'gl_name', 'value']) >+ >+Generators = [ >+ { >+ 'json': 'packed_gl_enums.json', >+ 'output': 'PackedGLEnums', >+ 'namespace': 'gl', >+ 'enum_type': 'GLenum', >+ }, >+ { >+ 'json': 'packed_egl_enums.json', >+ 'output': 'PackedEGLEnums', >+ 'namespace': 'egl', >+ 'enum_type': 'EGLenum', >+ }, >+] >+ >+def load_enums(path): >+ with open(path) as map_file: >+ enums_dict = json.loads(map_file.read(), object_pairs_hook=OrderedDict) >+ >+ enums = [] >+ for (enum_name, value_list) in enums_dict.iteritems(): >+ >+ values = [] >+ i = 0 >+ >+ for (value_name, value_gl_name) in value_list.iteritems(): >+ values.append(EnumValue(value_name, value_gl_name, i)) >+ i += 1 >+ >+ assert(i < 255) # This makes sure enums fit in the uint8_t >+ enums.append(Enum(enum_name, values, i)) >+ >+ enums.sort(key=lambda enum: enum.name) >+ return enums >+ >+def generate_include_guard(path): >+ return path.replace(".", "_").upper() >+ >+def header_name_from_cpp_name(path): >+ return path.replace(".cpp", ".h") >+ >+header_template = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {data_source_name}. >+// >+// Copyright {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. >+// >+// {file_name}: >+// Declares ANGLE-specific enums classes for {api_enum_name}s and functions operating >+// on them. >+ >+#ifndef COMMON_{include_guard}_ >+#define COMMON_{include_guard}_ >+ >+#include <angle_gl.h> >+#include <EGL/egl.h> >+#include <EGL/eglext.h> >+ >+#include <cstdint> >+ >+namespace {namespace} >+{{ >+ >+template<typename Enum> >+Enum From{api_enum_name}({api_enum_name} from); >+{content} >+}} // namespace {namespace} >+ >+#endif // COMMON_{include_guard}_ >+""" >+ >+enum_declaration_template = """ >+enum class {enum_name} : uint8_t >+{{ >+{value_declarations} >+ >+ InvalidEnum = {max_value}, >+ EnumCount = {max_value}, >+}}; >+ >+template <> >+{enum_name} From{api_enum_name}<{enum_name}>({api_enum_name} from); >+{api_enum_name} To{api_enum_name}({enum_name} from); >+""" >+ >+def write_header(enums, path_prefix, file_name, data_source_name, namespace, api_enum_name): >+ content = [''] >+ >+ for enum in enums: >+ value_declarations = [] >+ for value in enum.values: >+ value_declarations.append(' ' + value.name + ' = ' + str(value.value) + ',') >+ >+ content.append(enum_declaration_template.format( >+ enum_name = enum.name, >+ max_value = str(enum.max_value), >+ value_declarations = '\n'.join(value_declarations), >+ api_enum_name = api_enum_name >+ )) >+ >+ header = header_template.format( >+ content = ''.join(content), >+ copyright_year = datetime.date.today().year, >+ data_source_name = data_source_name, >+ script_name = sys.argv[0], >+ file_name = file_name, >+ include_guard = generate_include_guard(file_name), >+ namespace = namespace, >+ api_enum_name = api_enum_name >+ ) >+ >+ with (open(path_prefix + file_name, 'wt')) as f: >+ f.write(header) >+ >+cpp_template = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {data_source_name}. >+// >+// Copyright {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. >+// >+// {file_name}: >+// Implements ANGLE-specific enums classes for {api_enum_name}s and functions operating >+// on them. >+ >+#include "common/debug.h" >+#include "common/{header_name}" >+ >+namespace {namespace} >+{{ >+{content} >+}} // namespace {namespace} >+""" >+ >+enum_implementation_template = """ >+template <> >+{enum_name} From{api_enum_name}<{enum_name}>({api_enum_name} from) >+{{ >+ switch (from) >+ {{ >+{from_glenum_cases} >+ default: >+ return {enum_name}::InvalidEnum; >+ }} >+}} >+ >+{api_enum_name} To{api_enum_name}({enum_name} from) >+{{ >+ switch (from) >+ {{ >+{to_glenum_cases} >+ default: >+ UNREACHABLE(); >+ return 0; >+ }} >+}} >+""" >+ >+def write_cpp(enums, path_prefix, file_name, data_source_name, namespace, api_enum_name): >+ content = [''] >+ >+ for enum in enums: >+ from_glenum_cases = [] >+ to_glenum_cases = [] >+ for value in enum.values: >+ qualified_name = enum.name + '::' + value.name >+ from_glenum_cases.append(' case ' + value.gl_name + ':\n return ' + qualified_name + ';') >+ to_glenum_cases.append(' case ' + qualified_name + ':\n return ' + value.gl_name + ';') >+ >+ content.append(enum_implementation_template.format( >+ enum_name = enum.name, >+ from_glenum_cases = '\n'.join(from_glenum_cases), >+ max_value = str(enum.max_value), >+ to_glenum_cases = '\n'.join(to_glenum_cases), >+ api_enum_name = api_enum_name >+ )) >+ >+ cpp = cpp_template.format( >+ content = ''.join(content), >+ copyright_year = datetime.date.today().year, >+ data_source_name = data_source_name, >+ script_name = sys.argv[0], >+ file_name = file_name, >+ header_name = header_name_from_cpp_name(file_name), >+ namespace = namespace, >+ api_enum_name = api_enum_name >+ ) >+ >+ with (open(path_prefix + file_name, 'wt')) as f: >+ f.write(cpp) >+ >+ >+def main(): >+ >+ # auto_script parameters. >+ if len(sys.argv) > 1: >+ inputs = [] >+ outputs = [] >+ for generator in Generators: >+ inputs += [generator['json']] >+ outputs += [ >+ generator['output'] + '_autogen.cpp', >+ generator['output'] + '_autogen.h', >+ ] >+ >+ if sys.argv[1] == 'inputs': >+ print ','.join(inputs) >+ elif sys.argv[1] == 'outputs': >+ print ','.join(outputs) >+ else: >+ print('Invalid script parameters') >+ return 1 >+ return 0 >+ >+ path_prefix = os.path.dirname(os.path.realpath(__file__)) + os.path.sep >+ >+ for generator in Generators: >+ json_file = generator['json'] >+ output_file = generator['output'] >+ namespace = generator['namespace'] >+ enum_type = generator['enum_type'] >+ enums = load_enums(path_prefix + json_file) >+ write_header(enums, path_prefix, output_file + '_autogen.h', json_file, namespace, enum_type) >+ write_cpp(enums, path_prefix, output_file + '_autogen.cpp', json_file, namespace, enum_type) >+ return 0 >+ >+ >+if __name__ == '__main__': >+ sys.exit(main()) >diff --git a/Source/ThirdParty/ANGLE/src/common/gen_uniform_type_table.py b/Source/ThirdParty/ANGLE/src/common/gen_uniform_type_table.py >index c824eef10a3..21891a8e327 100644 >--- a/Source/ThirdParty/ANGLE/src/common/gen_uniform_type_table.py >+++ b/Source/ThirdParty/ANGLE/src/common/gen_uniform_type_table.py >@@ -5,6 +5,7 @@ > # > # gen_uniform_type_table.py: > # Code generation for OpenGL uniform type info tables. >+# NOTE: don't run this script directly. Run scripts/run_code_generation.py. > > from datetime import date > >@@ -41,6 +42,7 @@ all_uniform_types = [ > "GL_INT_SAMPLER_2D", > "GL_INT_SAMPLER_2D_ARRAY", > "GL_INT_SAMPLER_2D_MULTISAMPLE", >+ "GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY", > "GL_INT_SAMPLER_3D", > "GL_INT_SAMPLER_CUBE", > "GL_INT_VEC2", >@@ -50,6 +52,7 @@ all_uniform_types = [ > "GL_SAMPLER_2D_ARRAY", > "GL_SAMPLER_2D_ARRAY_SHADOW", > "GL_SAMPLER_2D_MULTISAMPLE", >+ "GL_SAMPLER_2D_MULTISAMPLE_ARRAY", > "GL_SAMPLER_2D_RECT_ANGLE", > "GL_SAMPLER_2D_SHADOW", > "GL_SAMPLER_3D", >@@ -65,6 +68,7 @@ all_uniform_types = [ > "GL_UNSIGNED_INT_SAMPLER_2D", > "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY", > "GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE", >+ "GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY", > "GL_UNSIGNED_INT_SAMPLER_3D", > "GL_UNSIGNED_INT_SAMPLER_CUBE", > "GL_UNSIGNED_INT_VEC2", >@@ -79,6 +83,7 @@ texture_types = { > "2D_ARRAY": "2D_ARRAY", > "2D_ARRAY_SHADOW": "2D_ARRAY", > "2D_MULTISAMPLE": "2D_MULTISAMPLE", >+ "2D_MULTISAMPLE_ARRAY": "2D_MULTISAMPLE_ARRAY", > "2D_RECT_ANGLE": "2D", > "2D_SHADOW": "2D", > "3D": "3D", >@@ -134,7 +139,7 @@ const UniformTypeInfo &GetUniformTypeInfo(GLenum uniformType) > }} // namespace gl > """ > >-type_info_data_template = """{{{type}, {component_type}, {texture_type}, {transposed_type}, {bool_type}, {rows}, {columns}, {components}, {component_size}, {internal_size}, {external_size}, {is_sampler}, {is_matrix}, {is_image} }}""" >+type_info_data_template = """{{{type}, {component_type}, {texture_type}, {transposed_type}, {bool_type}, {sampler_format}, {rows}, {columns}, {components}, {component_size}, {internal_size}, {external_size}, {is_sampler}, {is_matrix}, {is_image} }}""" > type_index_case_template = """case {enum_value}: return {index_value};""" > > def cpp_bool(value): >@@ -177,6 +182,18 @@ def get_bool_type(uniform_type): > else: > return "GL_NONE" > >+def get_sampler_format(uniform_type): >+ if not "_SAMPLER_" in uniform_type: >+ return "SamplerFormat::InvalidEnum" >+ elif "_SHADOW" in uniform_type: >+ return "SamplerFormat::Shadow" >+ elif "GL_UNSIGNED_INT_SAMPLER_" in uniform_type: >+ return "SamplerFormat::Unsigned" >+ elif "GL_INT_SAMPLER_" in uniform_type: >+ return "SamplerFormat::Signed" >+ else: >+ return "SamplerFormat::Float" >+ > def get_rows(uniform_type): > if uniform_type == "GL_NONE": > return "0" >@@ -235,6 +252,7 @@ def gen_type_info(uniform_type): > texture_type = get_texture_type(uniform_type), > transposed_type = get_transposed_type(uniform_type), > bool_type = get_bool_type(uniform_type), >+ sampler_format = get_sampler_format(uniform_type), > rows = get_rows(uniform_type), > columns = get_columns(uniform_type), > components = get_components(uniform_type), >@@ -248,15 +266,37 @@ def gen_type_info(uniform_type): > def gen_type_index_case(index, uniform_type): > return "case " + uniform_type + ": return " + str(index) + ";" > >-uniform_type_info_data = ",\n".join([gen_type_info(uniform_type) for uniform_type in all_uniform_types]) >-uniform_type_index_cases = "\n".join([gen_type_index_case(index, uniform_type) for index, uniform_type in enumerate(all_uniform_types)]) >- >-with open('uniform_type_info_autogen.cpp', 'wt') as out_file: >- output_cpp = template_cpp.format( >- script_name = sys.argv[0], >- copyright_year = date.today().year, >- total_count = len(all_uniform_types), >- uniform_type_info_data = uniform_type_info_data, >- uniform_type_index_cases = uniform_type_index_cases) >- out_file.write(output_cpp) >- out_file.close() >+ >+def main(): >+ >+ # auto_script parameters. >+ if len(sys.argv) > 1: >+ inputs = [] >+ outputs = ['uniform_type_info_autogen.cpp'] >+ >+ if sys.argv[1] == 'inputs': >+ print ','.join(inputs) >+ elif sys.argv[1] == 'outputs': >+ print ','.join(outputs) >+ else: >+ print('Invalid script parameters') >+ return 1 >+ return 0 >+ >+ uniform_type_info_data = ",\n".join([gen_type_info(uniform_type) for uniform_type in all_uniform_types]) >+ uniform_type_index_cases = "\n".join([gen_type_index_case(index, uniform_type) for index, uniform_type in enumerate(all_uniform_types)]) >+ >+ with open('uniform_type_info_autogen.cpp', 'wt') as out_file: >+ output_cpp = template_cpp.format( >+ script_name = sys.argv[0], >+ copyright_year = date.today().year, >+ total_count = len(all_uniform_types), >+ uniform_type_info_data = uniform_type_info_data, >+ uniform_type_index_cases = uniform_type_index_cases) >+ out_file.write(output_cpp) >+ out_file.close() >+ return 0 >+ >+ >+if __name__ == '__main__': >+ sys.exit(main()) >diff --git a/Source/ThirdParty/ANGLE/src/common/hash_utils.h b/Source/ThirdParty/ANGLE/src/common/hash_utils.h >new file mode 100644 >index 00000000000..aec4e7f77c3 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/hash_utils.h >@@ -0,0 +1,39 @@ >+// >+// 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. >+// >+// hash_utils.h: Hashing based helper functions. >+ >+#ifndef COMMON_HASHUTILS_H_ >+#define COMMON_HASHUTILS_H_ >+ >+#include "common/debug.h" >+#include "common/third_party/xxhash/xxhash.h" >+ >+namespace angle >+{ >+// Computes a hash of "key". Any data passed to this function must be multiples of >+// 4 bytes, since the PMurHash32 method can only operate increments of 4-byte words. >+inline std::size_t ComputeGenericHash(const void *key, size_t keySize) >+{ >+ static constexpr unsigned int kSeed = 0xABCDEF98; >+ >+ // We can't support "odd" alignments. ComputeGenericHash requires aligned types >+ ASSERT(keySize % 4 == 0); >+#if defined(ANGLE_IS_64_BIT_CPU) >+ return XXH64(key, keySize, kSeed); >+#else >+ return XXH32(key, keySize, kSeed); >+#endif // defined(ANGLE_IS_64_BIT_CPU) >+} >+ >+template <typename T> >+std::size_t ComputeGenericHash(const T &key) >+{ >+ static_assert(sizeof(key) % 4 == 0, "ComputeGenericHash requires aligned types"); >+ return ComputeGenericHash(&key, sizeof(key)); >+} >+} // namespace angle >+ >+#endif // COMMON_HASHUTILS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/hash_utils_unittest.cpp b/Source/ThirdParty/ANGLE/src/common/hash_utils_unittest.cpp >new file mode 100644 >index 00000000000..490d2d472ea >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/hash_utils_unittest.cpp >@@ -0,0 +1,31 @@ >+// >+// 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. >+// >+// hash_utils_unittest: Hashing helper functions tests. >+ >+#include <gtest/gtest.h> >+ >+#include "common/hash_utils.h" >+ >+using namespace angle; >+ >+namespace >+{ >+// Basic functionality test. >+TEST(HashUtilsTest, ComputeGenericHash) >+{ >+ std::string a = "aSimpleString!!!"; >+ std::string b = "anotherString???"; >+ >+ // Requires a string size aligned to 4 bytes. >+ ASSERT_TRUE(a.size() % 4 == 0); >+ ASSERT_TRUE(b.size() % 4 == 0); >+ >+ size_t aHash = ComputeGenericHash(a.c_str(), a.size()); >+ size_t bHash = ComputeGenericHash(b.c_str(), b.size()); >+ >+ EXPECT_NE(aHash, bHash); >+} >+} // anonymous namespace >diff --git a/Source/ThirdParty/ANGLE/src/common/mathutil.cpp b/Source/ThirdParty/ANGLE/src/common/mathutil.cpp >index 5db997c6641..3e3895fcf18 100644 >--- a/Source/ThirdParty/ANGLE/src/common/mathutil.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/mathutil.cpp >@@ -8,8 +8,8 @@ > > #include "common/mathutil.h" > >-#include <algorithm> > #include <math.h> >+#include <algorithm> > > namespace gl > { >@@ -43,19 +43,25 @@ constexpr float g_sharedexp_max = > > unsigned int convertRGBFloatsTo999E5(float red, float green, float blue) > { >- const float red_c = std::max<float>(0, std::min(g_sharedexp_max, red)); >+ const float red_c = std::max<float>(0, std::min(g_sharedexp_max, red)); > const float green_c = std::max<float>(0, std::min(g_sharedexp_max, green)); >- const float blue_c = std::max<float>(0, std::min(g_sharedexp_max, blue)); >+ const float blue_c = std::max<float>(0, std::min(g_sharedexp_max, blue)); > > const float max_c = std::max<float>(std::max<float>(red_c, green_c), blue_c); >- const float exp_p = std::max<float>(-g_sharedexp_bias - 1, floor(log(max_c))) + 1 + g_sharedexp_bias; >- const int max_s = static_cast<int>(floor((max_c / (pow(2.0f, exp_p - g_sharedexp_bias - g_sharedexp_mantissabits))) + 0.5f)); >- const int exp_s = static_cast<int>((max_s < pow(2.0f, g_sharedexp_mantissabits)) ? exp_p : exp_p + 1); >+ const float exp_p = >+ std::max<float>(-g_sharedexp_bias - 1, floor(log(max_c))) + 1 + g_sharedexp_bias; >+ const int max_s = static_cast<int>( >+ floor((max_c / (pow(2.0f, exp_p - g_sharedexp_bias - g_sharedexp_mantissabits))) + 0.5f)); >+ const int exp_s = >+ static_cast<int>((max_s < pow(2.0f, g_sharedexp_mantissabits)) ? exp_p : exp_p + 1); > > RGB9E5Data output; >- output.R = static_cast<unsigned int>(floor((red_c / (pow(2.0f, exp_s - g_sharedexp_bias - g_sharedexp_mantissabits))) + 0.5f)); >- output.G = static_cast<unsigned int>(floor((green_c / (pow(2.0f, exp_s - g_sharedexp_bias - g_sharedexp_mantissabits))) + 0.5f)); >- output.B = static_cast<unsigned int>(floor((blue_c / (pow(2.0f, exp_s - g_sharedexp_bias - g_sharedexp_mantissabits))) + 0.5f)); >+ output.R = static_cast<unsigned int>( >+ floor((red_c / (pow(2.0f, exp_s - g_sharedexp_bias - g_sharedexp_mantissabits))) + 0.5f)); >+ output.G = static_cast<unsigned int>( >+ floor((green_c / (pow(2.0f, exp_s - g_sharedexp_bias - g_sharedexp_mantissabits))) + 0.5f)); >+ output.B = static_cast<unsigned int>( >+ floor((blue_c / (pow(2.0f, exp_s - g_sharedexp_bias - g_sharedexp_mantissabits))) + 0.5f)); > output.E = exp_s; > > return bitCast<unsigned int>(output); >@@ -63,11 +69,25 @@ unsigned int convertRGBFloatsTo999E5(float red, float green, float blue) > > void convert999E5toRGBFloats(unsigned int input, float *red, float *green, float *blue) > { >- const RGB9E5Data *inputData = reinterpret_cast<const RGB9E5Data*>(&input); >+ const RGB9E5Data *inputData = reinterpret_cast<const RGB9E5Data *>(&input); >+ >+ *red = >+ inputData->R * pow(2.0f, (int)inputData->E - g_sharedexp_bias - g_sharedexp_mantissabits); >+ *green = >+ inputData->G * pow(2.0f, (int)inputData->E - g_sharedexp_bias - g_sharedexp_mantissabits); >+ *blue = >+ inputData->B * pow(2.0f, (int)inputData->E - g_sharedexp_bias - g_sharedexp_mantissabits); >+} > >- *red = inputData->R * pow(2.0f, (int)inputData->E - g_sharedexp_bias - g_sharedexp_mantissabits); >- *green = inputData->G * pow(2.0f, (int)inputData->E - g_sharedexp_bias - g_sharedexp_mantissabits); >- *blue = inputData->B * pow(2.0f, (int)inputData->E - g_sharedexp_bias - g_sharedexp_mantissabits); >+int BitCountPolyfill(uint32_t bits) >+{ >+ int ones = 0; >+ while (bits) >+ { >+ ones += bool(bits & 1); >+ bits >>= 1; >+ } >+ return ones; > } > > } // namespace gl >diff --git a/Source/ThirdParty/ANGLE/src/common/mathutil.h b/Source/ThirdParty/ANGLE/src/common/mathutil.h >index ca6efc567ff..6573dd58986 100644 >--- a/Source/ThirdParty/ANGLE/src/common/mathutil.h >+++ b/Source/ThirdParty/ANGLE/src/common/mathutil.h >@@ -9,12 +9,12 @@ > #ifndef COMMON_MATHUTIL_H_ > #define COMMON_MATHUTIL_H_ > >-#include <limits> >-#include <algorithm> > #include <math.h> >-#include <string.h> > #include <stdint.h> > #include <stdlib.h> >+#include <string.h> >+#include <algorithm> >+#include <limits> > > #include <anglebase/numerics/safe_math.h> > >@@ -25,15 +25,15 @@ namespace angle > { > using base::CheckedNumeric; > using base::IsValueInRangeForNumericType; >-} >+} // namespace angle > > namespace gl > { > >-const unsigned int Float32One = 0x3F800000; >+const unsigned int Float32One = 0x3F800000; > const unsigned short Float16One = 0x3C00; > >-template<typename T> >+template <typename T> > inline bool isPow2(T x) > { > static_assert(std::is_integral<T>::value, "isPow2 must be called on an integer type."); >@@ -43,13 +43,15 @@ inline bool isPow2(T x) > inline int log2(int x) > { > int r = 0; >- while ((x >> r) > 1) r++; >+ while ((x >> r) > 1) >+ r++; > return r; > } > > inline unsigned int ceilPow2(unsigned int x) > { >- if (x != 0) x--; >+ if (x != 0) >+ x--; > x |= x >> 1; > x |= x >> 2; > x |= x >> 4; >@@ -108,7 +110,7 @@ inline int clampCast(bool value) > return static_cast<int>(value); > } > >-template<typename T, typename MIN, typename MAX> >+template <typename T, typename MIN, typename MAX> > inline T clamp(T x, MIN min, MAX max) > { > // Since NaNs fail all comparison tests, a NaN value will default to min >@@ -120,7 +122,7 @@ inline float clamp01(float x) > return clamp(x, 0.0f, 1.0f); > } > >-template<const int n> >+template <const int n> > inline unsigned int unorm(float x) > { > const unsigned int max = 0xFFFFFFFF >> (32 - n); >@@ -142,7 +144,7 @@ inline unsigned int unorm(float x) > inline bool supportsSSE2() > { > #if defined(ANGLE_USE_SSE) >- static bool checked = false; >+ static bool checked = false; > static bool supports = false; > > if (checked) >@@ -150,7 +152,7 @@ inline bool supportsSSE2() > return supports; > } > >-#if defined(ANGLE_PLATFORM_WINDOWS) && !defined(_M_ARM) >+# if defined(ANGLE_PLATFORM_WINDOWS) && !defined(_M_ARM) && !defined(_M_ARM64) > { > int info[4]; > __cpuid(info, 0); >@@ -162,7 +164,7 @@ inline bool supportsSSE2() > supports = (info[3] >> 26) & 1; > } > } >-#endif // defined(ANGLE_PLATFORM_WINDOWS) && !defined(_M_ARM) >+# endif // defined(ANGLE_PLATFORM_WINDOWS) && !defined(_M_ARM) && !defined(_M_ARM64) > checked = true; > return supports; > #else // defined(ANGLE_USE_SSE) >@@ -182,19 +184,19 @@ destType bitCast(const sourceType &source) > inline unsigned short float32ToFloat16(float fp32) > { > unsigned int fp32i = bitCast<unsigned int>(fp32); >- unsigned int sign = (fp32i & 0x80000000) >> 16; >- unsigned int abs = fp32i & 0x7FFFFFFF; >+ unsigned int sign = (fp32i & 0x80000000) >> 16; >+ unsigned int abs = fp32i & 0x7FFFFFFF; > >- if(abs > 0x47FFEFFF) // Infinity >+ if (abs > 0x47FFEFFF) // Infinity > { > return static_cast<unsigned short>(sign | 0x7FFF); > } >- else if(abs < 0x38800000) // Denormal >+ else if (abs < 0x38800000) // Denormal > { > unsigned int mantissa = (abs & 0x007FFFFF) | 0x00800000; >- int e = 113 - (abs >> 23); >+ int e = 113 - (abs >> 23); > >- if(e < 24) >+ if (e < 24) > { > abs = mantissa >> e; > } >@@ -207,7 +209,8 @@ inline unsigned short float32ToFloat16(float fp32) > } > else > { >- return static_cast<unsigned short>(sign | (abs + 0xC8000000 + 0x00000FFF + ((abs >> 13) & 1)) >> 13); >+ return static_cast<unsigned short>( >+ sign | (abs + 0xC8000000 + 0x00000FFF + ((abs >> 13) & 1)) >> 13); > } > } > >@@ -218,24 +221,24 @@ void convert999E5toRGBFloats(unsigned int input, float *red, float *green, float > > inline unsigned short float32ToFloat11(float fp32) > { >- const unsigned int float32MantissaMask = 0x7FFFFF; >- const unsigned int float32ExponentMask = 0x7F800000; >- const unsigned int float32SignMask = 0x80000000; >- const unsigned int float32ValueMask = ~float32SignMask; >+ const unsigned int float32MantissaMask = 0x7FFFFF; >+ const unsigned int float32ExponentMask = 0x7F800000; >+ const unsigned int float32SignMask = 0x80000000; >+ const unsigned int float32ValueMask = ~float32SignMask; > const unsigned int float32ExponentFirstBit = 23; >- const unsigned int float32ExponentBias = 127; >+ const unsigned int float32ExponentBias = 127; > >- const unsigned short float11Max = 0x7BF; >+ const unsigned short float11Max = 0x7BF; > const unsigned short float11MantissaMask = 0x3F; > const unsigned short float11ExponentMask = 0x7C0; >- const unsigned short float11BitMask = 0x7FF; >- const unsigned int float11ExponentBias = 14; >+ const unsigned short float11BitMask = 0x7FF; >+ const unsigned int float11ExponentBias = 14; > > const unsigned int float32Maxfloat11 = 0x477E0000; > const unsigned int float32Minfloat11 = 0x38800000; > > const unsigned int float32Bits = bitCast<unsigned int>(fp32); >- const bool float32Sign = (float32Bits & float32SignMask) == float32SignMask; >+ const bool float32Sign = (float32Bits & float32SignMask) == float32SignMask; > > unsigned int float32Val = float32Bits & float32ValueMask; > >@@ -244,7 +247,9 @@ inline unsigned short float32ToFloat11(float fp32) > // INF or NAN > if ((float32Val & float32MantissaMask) != 0) > { >- return float11ExponentMask | (((float32Val >> 17) | (float32Val >> 11) | (float32Val >> 6) | (float32Val)) & float11MantissaMask); >+ return float11ExponentMask | >+ (((float32Val >> 17) | (float32Val >> 11) | (float32Val >> 6) | (float32Val)) & >+ float11MantissaMask); > } > else if (float32Sign) > { >@@ -272,8 +277,10 @@ inline unsigned short float32ToFloat11(float fp32) > { > // The number is too small to be represented as a normalized float11 > // Convert it to a denormalized value. >- const unsigned int shift = (float32ExponentBias - float11ExponentBias) - (float32Val >> float32ExponentFirstBit); >- float32Val = ((1 << float32ExponentFirstBit) | (float32Val & float32MantissaMask)) >> shift; >+ const unsigned int shift = (float32ExponentBias - float11ExponentBias) - >+ (float32Val >> float32ExponentFirstBit); >+ float32Val = >+ ((1 << float32ExponentFirstBit) | (float32Val & float32MantissaMask)) >> shift; > } > else > { >@@ -287,24 +294,24 @@ inline unsigned short float32ToFloat11(float fp32) > > inline unsigned short float32ToFloat10(float fp32) > { >- const unsigned int float32MantissaMask = 0x7FFFFF; >- const unsigned int float32ExponentMask = 0x7F800000; >- const unsigned int float32SignMask = 0x80000000; >- const unsigned int float32ValueMask = ~float32SignMask; >+ const unsigned int float32MantissaMask = 0x7FFFFF; >+ const unsigned int float32ExponentMask = 0x7F800000; >+ const unsigned int float32SignMask = 0x80000000; >+ const unsigned int float32ValueMask = ~float32SignMask; > const unsigned int float32ExponentFirstBit = 23; >- const unsigned int float32ExponentBias = 127; >+ const unsigned int float32ExponentBias = 127; > >- const unsigned short float10Max = 0x3DF; >+ const unsigned short float10Max = 0x3DF; > const unsigned short float10MantissaMask = 0x1F; > const unsigned short float10ExponentMask = 0x3E0; >- const unsigned short float10BitMask = 0x3FF; >- const unsigned int float10ExponentBias = 14; >+ const unsigned short float10BitMask = 0x3FF; >+ const unsigned int float10ExponentBias = 14; > > const unsigned int float32Maxfloat10 = 0x477C0000; > const unsigned int float32Minfloat10 = 0x38800000; > > const unsigned int float32Bits = bitCast<unsigned int>(fp32); >- const bool float32Sign = (float32Bits & float32SignMask) == float32SignMask; >+ const bool float32Sign = (float32Bits & float32SignMask) == float32SignMask; > > unsigned int float32Val = float32Bits & float32ValueMask; > >@@ -313,7 +320,9 @@ inline unsigned short float32ToFloat10(float fp32) > // INF or NAN > if ((float32Val & float32MantissaMask) != 0) > { >- return float10ExponentMask | (((float32Val >> 18) | (float32Val >> 13) | (float32Val >> 3) | (float32Val)) & float10MantissaMask); >+ return float10ExponentMask | >+ (((float32Val >> 18) | (float32Val >> 13) | (float32Val >> 3) | (float32Val)) & >+ float10MantissaMask); > } > else if (float32Sign) > { >@@ -341,8 +350,10 @@ inline unsigned short float32ToFloat10(float fp32) > { > // The number is too small to be represented as a normalized float11 > // Convert it to a denormalized value. >- const unsigned int shift = (float32ExponentBias - float10ExponentBias) - (float32Val >> float32ExponentFirstBit); >- float32Val = ((1 << float32ExponentFirstBit) | (float32Val & float32MantissaMask)) >> shift; >+ const unsigned int shift = (float32ExponentBias - float10ExponentBias) - >+ (float32Val >> float32ExponentFirstBit); >+ float32Val = >+ ((1 << float32ExponentFirstBit) | (float32Val & float32MantissaMask)) >> shift; > } > else > { >@@ -379,12 +390,11 @@ inline float float11ToFloat32(unsigned short fp11) > { > exponent--; > mantissa <<= 1; >- } >- while ((mantissa & 0x40) == 0); >+ } while ((mantissa & 0x40) == 0); > > mantissa = mantissa & 0x3F; > } >- else // The value is zero >+ else // The value is zero > { > exponent = static_cast<unsigned short>(-112); > } >@@ -418,12 +428,11 @@ inline float float10ToFloat32(unsigned short fp11) > { > exponent--; > mantissa <<= 1; >- } >- while ((mantissa & 0x20) == 0); >+ } while ((mantissa & 0x20) == 0); > > mantissa = mantissa & 0x1F; > } >- else // The value is zero >+ else // The value is zero > { > exponent = static_cast<unsigned short>(-112); > } >@@ -432,13 +441,48 @@ inline float float10ToFloat32(unsigned short fp11) > } > } > >+// Convers to and from float and 16.16 fixed point format. >+ >+inline float FixedToFloat(uint32_t fixedInput) >+{ >+ return static_cast<float>(fixedInput) / 65536.0f; >+} >+ >+inline uint32_t FloatToFixed(float floatInput) >+{ >+ static constexpr uint32_t kHighest = 32767 * 65536 + 65535; >+ static constexpr uint32_t kLowest = static_cast<uint32_t>(-32768 * 65536 + 65535); >+ >+ if (floatInput > 32767.65535) >+ { >+ return kHighest; >+ } >+ else if (floatInput < -32768.65535) >+ { >+ return kLowest; >+ } >+ else >+ { >+ return static_cast<uint32_t>(floatInput * 65536); >+ } >+} >+ > template <typename T> > inline float normalizedToFloat(T input) > { > static_assert(std::numeric_limits<T>::is_integer, "T must be an integer."); > >- const float inverseMax = 1.0f / std::numeric_limits<T>::max(); >- return input * inverseMax; >+ if (sizeof(T) > 2) >+ { >+ // float has only a 23 bit mantissa, so we need to do the calculation in double precision >+ constexpr double inverseMax = 1.0 / std::numeric_limits<T>::max(); >+ return static_cast<float>(input * inverseMax); >+ } >+ else >+ { >+ constexpr float inverseMax = 1.0f / std::numeric_limits<T>::max(); >+ return input * inverseMax; >+ } > } > > template <unsigned int inputBitCount, typename T> >@@ -447,21 +491,47 @@ inline float normalizedToFloat(T input) > static_assert(std::numeric_limits<T>::is_integer, "T must be an integer."); > static_assert(inputBitCount < (sizeof(T) * 8), "T must have more bits than inputBitCount."); > >- const float inverseMax = 1.0f / ((1 << inputBitCount) - 1); >- return input * inverseMax; >+ if (inputBitCount > 23) >+ { >+ // float has only a 23 bit mantissa, so we need to do the calculation in double precision >+ constexpr double inverseMax = 1.0 / ((1 << inputBitCount) - 1); >+ return static_cast<float>(input * inverseMax); >+ } >+ else >+ { >+ constexpr float inverseMax = 1.0f / ((1 << inputBitCount) - 1); >+ return input * inverseMax; >+ } > } > > template <typename T> > inline T floatToNormalized(float input) > { >- return static_cast<T>(std::numeric_limits<T>::max() * input + 0.5f); >+ if (sizeof(T) > 2) >+ { >+ // float has only a 23 bit mantissa, so we need to do the calculation in double precision >+ return static_cast<T>(std::numeric_limits<T>::max() * static_cast<double>(input) + 0.5); >+ } >+ else >+ { >+ return static_cast<T>(std::numeric_limits<T>::max() * input + 0.5f); >+ } > } > > template <unsigned int outputBitCount, typename T> > inline T floatToNormalized(float input) > { > static_assert(outputBitCount < (sizeof(T) * 8), "T must have more bits than outputBitCount."); >- return static_cast<T>(((1 << outputBitCount) - 1) * input + 0.5f); >+ >+ if (outputBitCount > 23) >+ { >+ // float has only a 23 bit mantissa, so we need to do the calculation in double precision >+ return static_cast<T>(((1 << outputBitCount) - 1) * static_cast<double>(input) + 0.5); >+ } >+ else >+ { >+ return static_cast<T>(((1 << outputBitCount) - 1) * input + 0.5f); >+ } > } > > template <unsigned int inputBitCount, unsigned int inputBitStart, typename T> >@@ -563,12 +633,16 @@ inline unsigned short averageHalfFloat(unsigned short a, unsigned short b) > > inline unsigned int averageFloat11(unsigned int a, unsigned int b) > { >- return float32ToFloat11((float11ToFloat32(static_cast<unsigned short>(a)) + float11ToFloat32(static_cast<unsigned short>(b))) * 0.5f); >+ return float32ToFloat11((float11ToFloat32(static_cast<unsigned short>(a)) + >+ float11ToFloat32(static_cast<unsigned short>(b))) * >+ 0.5f); > } > > inline unsigned int averageFloat10(unsigned int a, unsigned int b) > { >- return float32ToFloat10((float10ToFloat32(static_cast<unsigned short>(a)) + float10ToFloat32(static_cast<unsigned short>(b))) * 0.5f); >+ return float32ToFloat10((float10ToFloat32(static_cast<unsigned short>(a)) + >+ float10ToFloat32(static_cast<unsigned short>(b))) * >+ 0.5f); > } > > template <typename T> >@@ -628,6 +702,12 @@ class Range > T low() const { return mLow; } > T high() const { return mHigh; } > >+ void invalidate() >+ { >+ mLow = std::numeric_limits<T>::max(); >+ mHigh = std::numeric_limits<T>::min(); >+ } >+ > private: > T mLow; > T mHigh; >@@ -638,6 +718,9 @@ typedef Range<unsigned int> RangeUI; > > struct IndexRange > { >+ struct Undefined >+ {}; >+ IndexRange(Undefined) {} > IndexRange() : IndexRange(0, 0, 0) {} > IndexRange(size_t start_, size_t end_, size_t vertexIndexCount_) > : start(start_), end(end_), vertexIndexCount(vertexIndexCount_) >@@ -681,21 +764,21 @@ inline float Ldexp(float x, int exp) > inline uint32_t packSnorm2x16(float f1, float f2) > { > int16_t leastSignificantBits = static_cast<int16_t>(roundf(clamp(f1, -1.0f, 1.0f) * 32767.0f)); >- int16_t mostSignificantBits = static_cast<int16_t>(roundf(clamp(f2, -1.0f, 1.0f) * 32767.0f)); >+ int16_t mostSignificantBits = static_cast<int16_t>(roundf(clamp(f2, -1.0f, 1.0f) * 32767.0f)); > return static_cast<uint32_t>(mostSignificantBits) << 16 | > (static_cast<uint32_t>(leastSignificantBits) & 0xFFFF); > } > >-// First, unpacks a single 32-bit unsigned integer u into a pair of 16-bit unsigned integers. Then, each >-// component is converted to a normalized floating-point value to generate the returned two float values. >-// The first float value will be extracted from the least significant bits of the input; >-// the last float value will be extracted from the most-significant bits. >-// The conversion for unpacked fixed-point value to floating point is done as follows: >-// unpackSnorm2x16 : clamp(f / 32767.0, -1, +1) >+// First, unpacks a single 32-bit unsigned integer u into a pair of 16-bit unsigned integers. Then, >+// each component is converted to a normalized floating-point value to generate the returned two >+// float values. The first float value will be extracted from the least significant bits of the >+// input; the last float value will be extracted from the most-significant bits. The conversion for >+// unpacked fixed-point value to floating point is done as follows: unpackSnorm2x16 : clamp(f / >+// 32767.0, -1, +1) > inline void unpackSnorm2x16(uint32_t u, float *f1, float *f2) > { > int16_t leastSignificantBits = static_cast<int16_t>(u & 0xFFFF); >- int16_t mostSignificantBits = static_cast<int16_t>(u >> 16); >+ int16_t mostSignificantBits = static_cast<int16_t>(u >> 16); > *f1 = clamp(static_cast<float>(leastSignificantBits) / 32767.0f, -1.0f, 1.0f); > *f2 = clamp(static_cast<float>(mostSignificantBits) / 32767.0f, -1.0f, 1.0f); > } >@@ -709,22 +792,22 @@ inline void unpackSnorm2x16(uint32_t u, float *f1, float *f2) > inline uint32_t packUnorm2x16(float f1, float f2) > { > uint16_t leastSignificantBits = static_cast<uint16_t>(roundf(clamp(f1, 0.0f, 1.0f) * 65535.0f)); >- uint16_t mostSignificantBits = static_cast<uint16_t>(roundf(clamp(f2, 0.0f, 1.0f) * 65535.0f)); >- return static_cast<uint32_t>(mostSignificantBits) << 16 | static_cast<uint32_t>(leastSignificantBits); >+ uint16_t mostSignificantBits = static_cast<uint16_t>(roundf(clamp(f2, 0.0f, 1.0f) * 65535.0f)); >+ return static_cast<uint32_t>(mostSignificantBits) << 16 | >+ static_cast<uint32_t>(leastSignificantBits); > } > >-// First, unpacks a single 32-bit unsigned integer u into a pair of 16-bit unsigned integers. Then, each >-// component is converted to a normalized floating-point value to generate the returned two float values. >-// The first float value will be extracted from the least significant bits of the input; >-// the last float value will be extracted from the most-significant bits. >-// The conversion for unpacked fixed-point value to floating point is done as follows: >-// unpackUnorm2x16 : f / 65535.0 >+// First, unpacks a single 32-bit unsigned integer u into a pair of 16-bit unsigned integers. Then, >+// each component is converted to a normalized floating-point value to generate the returned two >+// float values. The first float value will be extracted from the least significant bits of the >+// input; the last float value will be extracted from the most-significant bits. The conversion for >+// unpacked fixed-point value to floating point is done as follows: unpackUnorm2x16 : f / 65535.0 > inline void unpackUnorm2x16(uint32_t u, float *f1, float *f2) > { > uint16_t leastSignificantBits = static_cast<uint16_t>(u & 0xFFFF); >- uint16_t mostSignificantBits = static_cast<uint16_t>(u >> 16); >- *f1 = static_cast<float>(leastSignificantBits) / 65535.0f; >- *f2 = static_cast<float>(mostSignificantBits) / 65535.0f; >+ uint16_t mostSignificantBits = static_cast<uint16_t>(u >> 16); >+ *f1 = static_cast<float>(leastSignificantBits) / 65535.0f; >+ *f2 = static_cast<float>(mostSignificantBits) / 65535.0f; > } > > // Helper functions intended to be used only here. >@@ -815,19 +898,20 @@ inline void UnpackSnorm4x8(uint32_t u, float *f) > inline uint32_t packHalf2x16(float f1, float f2) > { > uint16_t leastSignificantBits = static_cast<uint16_t>(float32ToFloat16(f1)); >- uint16_t mostSignificantBits = static_cast<uint16_t>(float32ToFloat16(f2)); >- return static_cast<uint32_t>(mostSignificantBits) << 16 | static_cast<uint32_t>(leastSignificantBits); >+ uint16_t mostSignificantBits = static_cast<uint16_t>(float32ToFloat16(f2)); >+ return static_cast<uint32_t>(mostSignificantBits) << 16 | >+ static_cast<uint32_t>(leastSignificantBits); > } > >-// Returns two floating-point values obtained by unpacking a 32-bit unsigned integer into a pair of 16-bit values, >-// interpreting those values as 16-bit floating-point numbers according to the OpenGL ES Specification, >-// and converting them to 32-bit floating-point values. >-// The first float value is obtained from the 16 least-significant bits of u; >-// the second component is obtained from the 16 most-significant bits of u. >+// Returns two floating-point values obtained by unpacking a 32-bit unsigned integer into a pair of >+// 16-bit values, interpreting those values as 16-bit floating-point numbers according to the OpenGL >+// ES Specification, and converting them to 32-bit floating-point values. The first float value is >+// obtained from the 16 least-significant bits of u; the second component is obtained from the 16 >+// most-significant bits of u. > inline void unpackHalf2x16(uint32_t u, float *f1, float *f2) > { > uint16_t leastSignificantBits = static_cast<uint16_t>(u & 0xFFFF); >- uint16_t mostSignificantBits = static_cast<uint16_t>(u >> 16); >+ uint16_t mostSignificantBits = static_cast<uint16_t>(u >> 16); > > *f1 = float16ToFloat32(leastSignificantBits); > *f2 = float16ToFloat32(mostSignificantBits); >@@ -883,32 +967,64 @@ inline uint32_t BitfieldReverse(uint32_t value) > } > > // Count the 1 bits. >-#if defined(ANGLE_PLATFORM_WINDOWS) >+#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) >+# define ANGLE_HAS_BITCOUNT_32 > inline int BitCount(uint32_t bits) > { > return static_cast<int>(__popcnt(bits)); > } >-#if defined(ANGLE_IS_64_BIT_CPU) >+# if defined(_M_X64) >+# define ANGLE_HAS_BITCOUNT_64 > inline int BitCount(uint64_t bits) > { > return static_cast<int>(__popcnt64(bits)); > } >-#endif // defined(ANGLE_IS_64_BIT_CPU) >-#endif // defined(ANGLE_PLATFORM_WINDOWS) >+# endif // defined(_M_X64) >+#endif // defined(_M_IX86) || defined(_M_X64) > > #if defined(ANGLE_PLATFORM_POSIX) >+# define ANGLE_HAS_BITCOUNT_32 > inline int BitCount(uint32_t bits) > { > return __builtin_popcount(bits); > } > >-#if defined(ANGLE_IS_64_BIT_CPU) >+# if defined(ANGLE_IS_64_BIT_CPU) >+# define ANGLE_HAS_BITCOUNT_64 > inline int BitCount(uint64_t bits) > { > return __builtin_popcountll(bits); > } >-#endif // defined(ANGLE_IS_64_BIT_CPU) >-#endif // defined(ANGLE_PLATFORM_POSIX) >+# endif // defined(ANGLE_IS_64_BIT_CPU) >+#endif // defined(ANGLE_PLATFORM_POSIX) >+ >+int BitCountPolyfill(uint32_t bits); >+ >+#if !defined(ANGLE_HAS_BITCOUNT_32) >+inline int BitCount(const uint32_t bits) >+{ >+ return BitCountPolyfill(bits); >+} >+#endif // !defined(ANGLE_HAS_BITCOUNT_32) >+ >+#if !defined(ANGLE_HAS_BITCOUNT_64) >+inline int BitCount(const uint64_t bits) >+{ >+ return BitCount(static_cast<uint32_t>(bits >> 32)) + BitCount(static_cast<uint32_t>(bits)); >+} >+#endif // !defined(ANGLE_HAS_BITCOUNT_64) >+#undef ANGLE_HAS_BITCOUNT_32 >+#undef ANGLE_HAS_BITCOUNT_64 >+ >+inline int BitCount(uint8_t bits) >+{ >+ return BitCount(static_cast<uint32_t>(bits)); >+} >+ >+inline int BitCount(uint16_t bits) >+{ >+ return BitCount(static_cast<uint32_t>(bits)); >+} > > #if defined(ANGLE_PLATFORM_WINDOWS) > // Return the index of the least significant bit set. Indexing is such that bit 0 is the least >@@ -922,7 +1038,7 @@ inline unsigned long ScanForward(uint32_t bits) > return firstBitIndex; > } > >-#if defined(ANGLE_IS_64_BIT_CPU) >+# if defined(ANGLE_IS_64_BIT_CPU) > inline unsigned long ScanForward(uint64_t bits) > { > ASSERT(bits != 0u); >@@ -931,8 +1047,8 @@ inline unsigned long ScanForward(uint64_t bits) > ASSERT(ret != 0u); > return firstBitIndex; > } >-#endif // defined(ANGLE_IS_64_BIT_CPU) >-#endif // defined(ANGLE_PLATFORM_WINDOWS) >+# endif // defined(ANGLE_IS_64_BIT_CPU) >+#endif // defined(ANGLE_PLATFORM_WINDOWS) > > #if defined(ANGLE_PLATFORM_POSIX) > inline unsigned long ScanForward(uint32_t bits) >@@ -941,14 +1057,24 @@ inline unsigned long ScanForward(uint32_t bits) > return static_cast<unsigned long>(__builtin_ctz(bits)); > } > >-#if defined(ANGLE_IS_64_BIT_CPU) >+# if defined(ANGLE_IS_64_BIT_CPU) > inline unsigned long ScanForward(uint64_t bits) > { > ASSERT(bits != 0u); > return static_cast<unsigned long>(__builtin_ctzll(bits)); > } >-#endif // defined(ANGLE_IS_64_BIT_CPU) >-#endif // defined(ANGLE_PLATFORM_POSIX) >+# endif // defined(ANGLE_IS_64_BIT_CPU) >+#endif // defined(ANGLE_PLATFORM_POSIX) >+ >+inline unsigned long ScanForward(uint8_t bits) >+{ >+ return ScanForward(static_cast<uint32_t>(bits)); >+} >+ >+inline unsigned long ScanForward(uint16_t bits) >+{ >+ return ScanForward(static_cast<uint32_t>(bits)); >+} > > // Return the index of the most significant bit set. Indexing is such that bit 0 is the least > // significant bit. >@@ -963,7 +1089,7 @@ inline unsigned long ScanReverse(unsigned long bits) > #elif defined(ANGLE_PLATFORM_POSIX) > return static_cast<unsigned long>(sizeof(unsigned long) * CHAR_BIT - 1 - __builtin_clzl(bits)); > #else >-#error Please implement bit-scan-reverse for your platform! >+# error Please implement bit-scan-reverse for your platform! > #endif > } > >@@ -998,21 +1124,25 @@ int FindMSB(T bits) > } > > // Returns whether the argument is Not a Number. >-// IEEE 754 single precision NaN representation: Exponent(8 bits) - 255, Mantissa(23 bits) - non-zero. >+// IEEE 754 single precision NaN representation: Exponent(8 bits) - 255, Mantissa(23 bits) - >+// non-zero. > inline bool isNaN(float f) > { > // Exponent mask: ((1u << 8) - 1u) << 23 = 0x7f800000u > // Mantissa mask: ((1u << 23) - 1u) = 0x7fffffu >- return ((bitCast<uint32_t>(f) & 0x7f800000u) == 0x7f800000u) && (bitCast<uint32_t>(f) & 0x7fffffu); >+ return ((bitCast<uint32_t>(f) & 0x7f800000u) == 0x7f800000u) && >+ (bitCast<uint32_t>(f) & 0x7fffffu); > } > > // Returns whether the argument is infinity. >-// IEEE 754 single precision infinity representation: Exponent(8 bits) - 255, Mantissa(23 bits) - zero. >+// IEEE 754 single precision infinity representation: Exponent(8 bits) - 255, Mantissa(23 bits) - >+// zero. > inline bool isInf(float f) > { > // Exponent mask: ((1u << 8) - 1u) << 23 = 0x7f800000u > // Mantissa mask: ((1u << 23) - 1u) = 0x7fffffu >- return ((bitCast<uint32_t>(f) & 0x7f800000u) == 0x7f800000u) && !(bitCast<uint32_t>(f) & 0x7fffffu); >+ return ((bitCast<uint32_t>(f) & 0x7f800000u) == 0x7f800000u) && >+ !(bitCast<uint32_t>(f) & 0x7fffffu); > } > > namespace priv >@@ -1083,6 +1213,17 @@ inline int32_t WrappingMul(int32_t lhs, int32_t rhs) > return static_cast<int32_t>(resultWide); > } > >+inline float scaleScreenDimensionToNdc(float dimensionScreen, float viewportDimension) >+{ >+ return 2.0f * dimensionScreen / viewportDimension; >+} >+ >+inline float scaleScreenCoordinateToNdc(float coordinateScreen, float viewportDimension) >+{ >+ float halfShifted = coordinateScreen / viewportDimension; >+ return 2.0f * (halfShifted - 0.5f); >+} >+ > } // namespace gl > > namespace rx >@@ -1111,8 +1252,8 @@ inline unsigned int UnsignedCeilDivide(unsigned int value, unsigned int divisor) > > #if defined(_MSC_VER) > >-#define ANGLE_ROTL(x,y) _rotl(x,y) >-#define ANGLE_ROTR16(x,y) _rotr16(x,y) >+# define ANGLE_ROTL(x, y) _rotl(x, y) >+# define ANGLE_ROTR16(x, y) _rotr16(x, y) > > #else > >@@ -1126,11 +1267,15 @@ inline uint16_t RotR16(uint16_t x, int8_t r) > return (x >> r) | (x << (16 - r)); > } > >-#define ANGLE_ROTL(x, y) ::rx::RotL(x, y) >-#define ANGLE_ROTR16(x, y) ::rx::RotR16(x, y) >+# define ANGLE_ROTL(x, y) ::rx::RotL(x, y) >+# define ANGLE_ROTR16(x, y) ::rx::RotR16(x, y) > >-#endif // namespace rx >+#endif // namespace rx > >+constexpr unsigned int Log2(unsigned int bytes) >+{ >+ return bytes == 1 ? 0 : (1 + Log2(bytes / 2)); > } >+} // namespace rx > >-#endif // COMMON_MATHUTIL_H_ >+#endif // COMMON_MATHUTIL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/mathutil_unittest.cpp b/Source/ThirdParty/ANGLE/src/common/mathutil_unittest.cpp >index 81f33a43e6c..3c3f11db422 100644 >--- a/Source/ThirdParty/ANGLE/src/common/mathutil_unittest.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/mathutil_unittest.cpp >@@ -20,17 +20,9 @@ namespace > // For floats f1 and f2, unpackSnorm2x16(packSnorm2x16(f1, f2)) should be same as f1 and f2. > TEST(MathUtilTest, packAndUnpackSnorm2x16) > { >- const float input[8][2] = >- { >- { 0.0f, 0.0f }, >- { 1.0f, 1.0f }, >- { -1.0f, 1.0f }, >- { -1.0f, -1.0f }, >- { 0.875f, 0.75f }, >- { 0.00392f, -0.99215f }, >- { -0.000675f, 0.004954f }, >- { -0.6937f, -0.02146f } >- }; >+ const float input[8][2] = { >+ {0.0f, 0.0f}, {1.0f, 1.0f}, {-1.0f, 1.0f}, {-1.0f, -1.0f}, >+ {0.875f, 0.75f}, {0.00392f, -0.99215f}, {-0.000675f, 0.004954f}, {-0.6937f, -0.02146f}}; > const float floatFaultTolerance = 0.0001f; > float outputVal1, outputVal2; > >@@ -50,17 +42,20 @@ TEST(MathUtilTest, packAndUnpackSnorm2x16Infinity) > float outputVal1, outputVal2; > > unpackSnorm2x16(packSnorm2x16(std::numeric_limits<float>::infinity(), >- std::numeric_limits<float>::infinity()), &outputVal1, &outputVal2); >+ std::numeric_limits<float>::infinity()), >+ &outputVal1, &outputVal2); > EXPECT_NEAR(1.0f, outputVal1, floatFaultTolerance); > EXPECT_NEAR(1.0f, outputVal2, floatFaultTolerance); > > unpackSnorm2x16(packSnorm2x16(std::numeric_limits<float>::infinity(), >- -std::numeric_limits<float>::infinity()), &outputVal1, &outputVal2); >+ -std::numeric_limits<float>::infinity()), >+ &outputVal1, &outputVal2); > EXPECT_NEAR(1.0f, outputVal1, floatFaultTolerance); > EXPECT_NEAR(-1.0f, outputVal2, floatFaultTolerance); > > unpackSnorm2x16(packSnorm2x16(-std::numeric_limits<float>::infinity(), >- -std::numeric_limits<float>::infinity()), &outputVal1, &outputVal2); >+ -std::numeric_limits<float>::infinity()), >+ &outputVal1, &outputVal2); > EXPECT_NEAR(-1.0f, outputVal1, floatFaultTolerance); > EXPECT_NEAR(-1.0f, outputVal2, floatFaultTolerance); > } >@@ -69,17 +64,9 @@ TEST(MathUtilTest, packAndUnpackSnorm2x16Infinity) > // For floats f1 and f2, unpackUnorm2x16(packUnorm2x16(f1, f2)) should be same as f1 and f2. > TEST(MathUtilTest, packAndUnpackUnorm2x16) > { >- const float input[8][2] = >- { >- { 0.0f, 0.0f }, >- { 1.0f, 1.0f }, >- { -1.0f, 1.0f }, >- { -1.0f, -1.0f }, >- { 0.875f, 0.75f }, >- { 0.00392f, -0.99215f }, >- { -0.000675f, 0.004954f }, >- { -0.6937f, -0.02146f } >- }; >+ const float input[8][2] = { >+ {0.0f, 0.0f}, {1.0f, 1.0f}, {-1.0f, 1.0f}, {-1.0f, -1.0f}, >+ {0.875f, 0.75f}, {0.00392f, -0.99215f}, {-0.000675f, 0.004954f}, {-0.6937f, -0.02146f}}; > const float floatFaultTolerance = 0.0001f; > float outputVal1, outputVal2; > >@@ -101,17 +88,20 @@ TEST(MathUtilTest, packAndUnpackUnorm2x16Infinity) > float outputVal1, outputVal2; > > unpackUnorm2x16(packUnorm2x16(std::numeric_limits<float>::infinity(), >- std::numeric_limits<float>::infinity()), &outputVal1, &outputVal2); >+ std::numeric_limits<float>::infinity()), >+ &outputVal1, &outputVal2); > EXPECT_NEAR(1.0f, outputVal1, floatFaultTolerance); > EXPECT_NEAR(1.0f, outputVal2, floatFaultTolerance); > > unpackUnorm2x16(packUnorm2x16(std::numeric_limits<float>::infinity(), >- -std::numeric_limits<float>::infinity()), &outputVal1, &outputVal2); >+ -std::numeric_limits<float>::infinity()), >+ &outputVal1, &outputVal2); > EXPECT_NEAR(1.0f, outputVal1, floatFaultTolerance); > EXPECT_NEAR(0.0f, outputVal2, floatFaultTolerance); > > unpackUnorm2x16(packUnorm2x16(-std::numeric_limits<float>::infinity(), >- -std::numeric_limits<float>::infinity()), &outputVal1, &outputVal2); >+ -std::numeric_limits<float>::infinity()), >+ &outputVal1, &outputVal2); > EXPECT_NEAR(0.0f, outputVal1, floatFaultTolerance); > EXPECT_NEAR(0.0f, outputVal2, floatFaultTolerance); > } >@@ -120,16 +110,9 @@ TEST(MathUtilTest, packAndUnpackUnorm2x16Infinity) > // For floats f1 and f2, unpackHalf2x16(packHalf2x16(f1, f2)) should be same as f1 and f2. > TEST(MathUtilTest, packAndUnpackHalf2x16) > { >- const float input[8][2] = >- { >- { 0.0f, 0.0f }, >- { 1.0f, 1.0f }, >- { -1.0f, 1.0f }, >- { -1.0f, -1.0f }, >- { 0.875f, 0.75f }, >- { 0.00392f, -0.99215f }, >- { -0.000675f, 0.004954f }, >- { -0.6937f, -0.02146f }, >+ const float input[8][2] = { >+ {0.0f, 0.0f}, {1.0f, 1.0f}, {-1.0f, 1.0f}, {-1.0f, -1.0f}, >+ {0.875f, 0.75f}, {0.00392f, -0.99215f}, {-0.000675f, 0.004954f}, {-0.6937f, -0.02146f}, > }; > const float floatFaultTolerance = 0.0005f; > float outputVal1, outputVal2; >@@ -276,9 +259,9 @@ TEST(MathUtilTest, BitCount) > EXPECT_EQ(10, gl::BitCount(0x17103121u)); > > #if defined(ANGLE_IS_64_BIT_CPU) >- EXPECT_EQ(0, gl::BitCount(0ull)); >- EXPECT_EQ(32, gl::BitCount(0xFFFFFFFFull)); >- EXPECT_EQ(10, gl::BitCount(0x17103121ull)); >+ EXPECT_EQ(0, gl::BitCount(static_cast<uint64_t>(0ull))); >+ EXPECT_EQ(32, gl::BitCount(static_cast<uint64_t>(0xFFFFFFFFull))); >+ EXPECT_EQ(10, gl::BitCount(static_cast<uint64_t>(0x17103121ull))); > #endif // defined(ANGLE_IS_64_BIT_CPU) > } > >@@ -290,9 +273,9 @@ TEST(MathUtilTest, ScanForward) > EXPECT_EQ(31ul, gl::ScanForward(0x80000000u)); > > #if defined(ANGLE_IS_64_BIT_CPU) >- EXPECT_EQ(0ul, gl::ScanForward(1ull)); >- EXPECT_EQ(16ul, gl::ScanForward(0x80010000ull)); >- EXPECT_EQ(31ul, gl::ScanForward(0x80000000ull)); >+ EXPECT_EQ(0ul, gl::ScanForward(static_cast<uint64_t>(1ull))); >+ EXPECT_EQ(16ul, gl::ScanForward(static_cast<uint64_t>(0x80010000ull))); >+ EXPECT_EQ(31ul, gl::ScanForward(static_cast<uint64_t>(0x80000000ull))); > #endif // defined(ANGLE_IS_64_BIT_CPU) > } > >diff --git a/Source/ThirdParty/ANGLE/src/common/matrix_utils.cpp b/Source/ThirdParty/ANGLE/src/common/matrix_utils.cpp >new file mode 100644 >index 00000000000..59ab4ca4374 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/matrix_utils.cpp >@@ -0,0 +1,285 @@ >+// >+// 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. >+// >+ >+// matrix_utils.cpp: Contains implementations for Mat4 methods. >+ >+#include "common/matrix_utils.h" >+ >+namespace angle >+{ >+ >+Mat4::Mat4() : Mat4(1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f) >+{} >+ >+Mat4::Mat4(const Matrix<float> generalMatrix) : Matrix(std::vector<float>(16, 0), 4, 4) >+{ >+ unsigned int minCols = std::min((unsigned int)4, generalMatrix.columns()); >+ unsigned int minRows = std::min((unsigned int)4, generalMatrix.rows()); >+ for (unsigned int i = 0; i < minCols; i++) >+ { >+ for (unsigned int j = 0; j < minRows; j++) >+ { >+ mElements[j * minCols + i] = generalMatrix.at(j, i); >+ } >+ } >+} >+ >+Mat4::Mat4(const std::vector<float> &elements) : Matrix(elements, 4) {} >+ >+Mat4::Mat4(const float *elements) : Matrix(elements, 4) {} >+ >+Mat4::Mat4(float m00, >+ float m01, >+ float m02, >+ float m03, >+ float m10, >+ float m11, >+ float m12, >+ float m13, >+ float m20, >+ float m21, >+ float m22, >+ float m23, >+ float m30, >+ float m31, >+ float m32, >+ float m33) >+ : Matrix(std::vector<float>(16, 0), 4, 4) >+{ >+ mElements[0] = m00; >+ mElements[1] = m01; >+ mElements[2] = m02; >+ mElements[3] = m03; >+ mElements[4] = m10; >+ mElements[5] = m11; >+ mElements[6] = m12; >+ mElements[7] = m13; >+ mElements[8] = m20; >+ mElements[9] = m21; >+ mElements[10] = m22; >+ mElements[11] = m23; >+ mElements[12] = m30; >+ mElements[13] = m31; >+ mElements[14] = m32; >+ mElements[15] = m33; >+} >+ >+// static >+Mat4 Mat4::Rotate(float angle, const Vector3 &axis) >+{ >+ auto axis_normalized = axis.normalized(); >+ float angle_radians = angle * (3.14159265358979323f / 180.0f); >+ float c = cos(angle_radians); >+ float ci = 1.f - c; >+ float s = sin(angle_radians); >+ >+ float x = axis_normalized.x(); >+ float y = axis_normalized.y(); >+ float z = axis_normalized.z(); >+ >+ float x2 = x * x; >+ float y2 = y * y; >+ float z2 = z * z; >+ >+ float xy = x * y; >+ float yz = y * z; >+ float zx = z * x; >+ >+ float r00 = c + ci * x2; >+ float r01 = ci * xy + s * z; >+ float r02 = ci * zx - s * y; >+ float r03 = 0.f; >+ >+ float r10 = ci * xy - s * z; >+ float r11 = c + ci * y2; >+ float r12 = ci * yz + s * x; >+ float r13 = 0.f; >+ >+ float r20 = ci * zx + s * y; >+ float r21 = ci * yz - s * x; >+ float r22 = c + ci * z2; >+ float r23 = 0.f; >+ >+ float r30 = 0.f; >+ float r31 = 0.f; >+ float r32 = 0.f; >+ float r33 = 1.f; >+ >+ return Mat4(r00, r01, r02, r03, r10, r11, r12, r13, r20, r21, r22, r23, r30, r31, r32, r33); >+} >+ >+// static >+Mat4 Mat4::Translate(const Vector3 &t) >+{ >+ float r00 = 1.f; >+ float r01 = 0.f; >+ float r02 = 0.f; >+ float r03 = 0.f; >+ >+ float r10 = 0.f; >+ float r11 = 1.f; >+ float r12 = 0.f; >+ float r13 = 0.f; >+ >+ float r20 = 0.f; >+ float r21 = 0.f; >+ float r22 = 1.f; >+ float r23 = 0.f; >+ >+ float r30 = t.x(); >+ float r31 = t.y(); >+ float r32 = t.z(); >+ float r33 = 1.f; >+ >+ return Mat4(r00, r01, r02, r03, r10, r11, r12, r13, r20, r21, r22, r23, r30, r31, r32, r33); >+} >+ >+// static >+Mat4 Mat4::Scale(const Vector3 &s) >+{ >+ float r00 = s.x(); >+ float r01 = 0.f; >+ float r02 = 0.f; >+ float r03 = 0.f; >+ >+ float r10 = 0.f; >+ float r11 = s.y(); >+ float r12 = 0.f; >+ float r13 = 0.f; >+ >+ float r20 = 0.f; >+ float r21 = 0.f; >+ float r22 = s.z(); >+ float r23 = 0.f; >+ >+ float r30 = 0.f; >+ float r31 = 0.f; >+ float r32 = 0.f; >+ float r33 = 1.f; >+ >+ return Mat4(r00, r01, r02, r03, r10, r11, r12, r13, r20, r21, r22, r23, r30, r31, r32, r33); >+} >+ >+// static >+Mat4 Mat4::Frustum(float l, float r, float b, float t, float n, float f) >+{ >+ float nn = 2.f * n; >+ float fpn = f + n; >+ float fmn = f - n; >+ float tpb = t + b; >+ float tmb = t - b; >+ float rpl = r + l; >+ float rml = r - l; >+ >+ float r00 = nn / rml; >+ float r01 = 0.f; >+ float r02 = 0.f; >+ float r03 = 0.f; >+ >+ float r10 = 0.f; >+ float r11 = nn / tmb; >+ float r12 = 0.f; >+ float r13 = 0.f; >+ >+ float r20 = rpl / rml; >+ float r21 = tpb / tmb; >+ float r22 = -fpn / fmn; >+ float r23 = -1.f; >+ >+ float r30 = 0.f; >+ float r31 = 0.f; >+ float r32 = -nn * f / fmn; >+ float r33 = 0.f; >+ >+ return Mat4(r00, r01, r02, r03, r10, r11, r12, r13, r20, r21, r22, r23, r30, r31, r32, r33); >+} >+ >+// static >+Mat4 Mat4::Perspective(float fov, float aspectRatio, float n, float f) >+{ >+ const float frustumHeight = tanf(static_cast<float>(fov / 360.0f * 3.14159265358979323)) * n; >+ const float frustumWidth = frustumHeight * aspectRatio; >+ return Frustum(-frustumWidth, frustumWidth, -frustumHeight, frustumHeight, n, f); >+} >+ >+// static >+Mat4 Mat4::Ortho(float l, float r, float b, float t, float n, float f) >+{ >+ float fpn = f + n; >+ float fmn = f - n; >+ float tpb = t + b; >+ float tmb = t - b; >+ float rpl = r + l; >+ float rml = r - l; >+ >+ float r00 = 2.f / rml; >+ float r01 = 0.f; >+ float r02 = 0.f; >+ float r03 = 0.f; >+ >+ float r10 = 0.f; >+ float r11 = 2.f / tmb; >+ float r12 = 0.f; >+ float r13 = 0.f; >+ >+ float r20 = 0.f; >+ float r21 = 0.f; >+ float r22 = -2.f / fmn; >+ float r23 = 0.f; >+ >+ float r30 = -rpl / rml; >+ float r31 = -tpb / tmb; >+ float r32 = -fpn / fmn; >+ float r33 = 1.f; >+ >+ return Mat4(r00, r01, r02, r03, r10, r11, r12, r13, r20, r21, r22, r23, r30, r31, r32, r33); >+} >+ >+Mat4 Mat4::product(const Mat4 &m) >+{ >+ const float *a = mElements.data(); >+ const float *b = m.mElements.data(); >+ >+ return Mat4(a[0] * b[0] + a[4] * b[1] + a[8] * b[2] + a[12] * b[3], >+ a[1] * b[0] + a[5] * b[1] + a[9] * b[2] + a[13] * b[3], >+ a[2] * b[0] + a[6] * b[1] + a[10] * b[2] + a[14] * b[3], >+ a[3] * b[0] + a[7] * b[1] + a[11] * b[2] + a[15] * b[3], >+ >+ a[0] * b[4] + a[4] * b[5] + a[8] * b[6] + a[12] * b[7], >+ a[1] * b[4] + a[5] * b[5] + a[9] * b[6] + a[13] * b[7], >+ a[2] * b[4] + a[6] * b[5] + a[10] * b[6] + a[14] * b[7], >+ a[3] * b[4] + a[7] * b[5] + a[11] * b[6] + a[15] * b[7], >+ >+ a[0] * b[8] + a[4] * b[9] + a[8] * b[10] + a[12] * b[11], >+ a[1] * b[8] + a[5] * b[9] + a[9] * b[10] + a[13] * b[11], >+ a[2] * b[8] + a[6] * b[9] + a[10] * b[10] + a[14] * b[11], >+ a[3] * b[8] + a[7] * b[9] + a[11] * b[10] + a[15] * b[11], >+ >+ a[0] * b[12] + a[4] * b[13] + a[8] * b[14] + a[12] * b[15], >+ a[1] * b[12] + a[5] * b[13] + a[9] * b[14] + a[13] * b[15], >+ a[2] * b[12] + a[6] * b[13] + a[10] * b[14] + a[14] * b[15], >+ a[3] * b[12] + a[7] * b[13] + a[11] * b[14] + a[15] * b[15]); >+} >+ >+Vector4 Mat4::product(const Vector4 &b) >+{ >+ return Vector4( >+ mElements[0] * b.x() + mElements[4] * b.y() + mElements[8] * b.z() + mElements[12] * b.w(), >+ mElements[1] * b.x() + mElements[5] * b.y() + mElements[9] * b.z() + mElements[13] * b.w(), >+ mElements[2] * b.x() + mElements[6] * b.y() + mElements[10] * b.z() + mElements[14] * b.w(), >+ mElements[3] * b.x() + mElements[7] * b.y() + mElements[11] * b.z() + >+ mElements[15] * b.w()); >+} >+ >+void Mat4::dump() >+{ >+ printf("[ %f %f %f %f ]\n", mElements[0], mElements[4], mElements[8], mElements[12]); >+ printf("[ %f %f %f %f ]\n", mElements[1], mElements[5], mElements[9], mElements[13]); >+ printf("[ %f %f %f %f ]\n", mElements[2], mElements[6], mElements[10], mElements[14]); >+ printf("[ %f %f %f %f ]\n", mElements[3], mElements[7], mElements[11], mElements[15]); >+} >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/common/matrix_utils.h b/Source/ThirdParty/ANGLE/src/common/matrix_utils.h >index aa3f89536e3..5a6b9680c23 100644 >--- a/Source/ThirdParty/ANGLE/src/common/matrix_utils.h >+++ b/Source/ThirdParty/ANGLE/src/common/matrix_utils.h >@@ -7,7 +7,8 @@ > // Utility class implementing various matrix operations. > // Supports matrices with minimum 2 and maximum 4 number of rows/columns. > // >-// TODO: Check if we can merge Matrix.h in sample_util with this and replace it with this implementation. >+// TODO: Check if we can merge Matrix.h in sample_util with this and replace it with this >+// implementation. > // TODO: Rename this file to Matrix.h once we remove Matrix.h in sample_util. > > #ifndef COMMON_MATRIX_UTILS_H_ >@@ -17,35 +18,30 @@ > > #include "common/debug.h" > #include "common/mathutil.h" >+#include "common/vector_utils.h" > > namespace angle > { > >-template<typename T> >+template <typename T> > class Matrix > { > public: >- Matrix(const std::vector<T> &elements, const unsigned int &numRows, const unsigned int &numCols) >- : mElements(elements), >- mRows(numRows), >- mCols(numCols) >+ Matrix(const std::vector<T> &elements, const unsigned int numRows, const unsigned int numCols) >+ : mElements(elements), mRows(numRows), mCols(numCols) > { > ASSERT(rows() >= 1 && rows() <= 4); > ASSERT(columns() >= 1 && columns() <= 4); > } > >- Matrix(const std::vector<T> &elements, const unsigned int &size) >- : mElements(elements), >- mRows(size), >- mCols(size) >+ Matrix(const std::vector<T> &elements, const unsigned int size) >+ : mElements(elements), mRows(size), mCols(size) > { > ASSERT(rows() >= 1 && rows() <= 4); > ASSERT(columns() >= 1 && columns() <= 4); > } > >- Matrix(const T *elements, const unsigned int &size) >- : mRows(size), >- mCols(size) >+ Matrix(const T *elements, const unsigned int size) : mRows(size), mCols(size) > { > ASSERT(rows() >= 1 && rows() <= 4); > ASSERT(columns() >= 1 && columns() <= 4); >@@ -53,18 +49,24 @@ class Matrix > mElements.push_back(elements[i]); > } > >- const T &operator()(const unsigned int &rowIndex, const unsigned int &columnIndex) const >+ const T &operator()(const unsigned int rowIndex, const unsigned int columnIndex) const > { >+ ASSERT(rowIndex < mRows); >+ ASSERT(columnIndex < mCols); > return mElements[rowIndex * columns() + columnIndex]; > } > >- T &operator()(const unsigned int &rowIndex, const unsigned int &columnIndex) >+ T &operator()(const unsigned int rowIndex, const unsigned int columnIndex) > { >+ ASSERT(rowIndex < mRows); >+ ASSERT(columnIndex < mCols); > return mElements[rowIndex * columns() + columnIndex]; > } > >- const T &at(const unsigned int &rowIndex, const unsigned int &columnIndex) const >+ const T &at(const unsigned int rowIndex, const unsigned int columnIndex) const > { >+ ASSERT(rowIndex < mRows); >+ ASSERT(columnIndex < mCols); > return operator()(rowIndex, columnIndex); > } > >@@ -89,6 +91,37 @@ class Matrix > return result; > } > >+ void operator*=(const Matrix<T> &m) >+ { >+ ASSERT(columns() == m.rows()); >+ Matrix<T> res = (*this) * m; >+ size_t numElts = res.elements().size(); >+ mElements.resize(numElts); >+ memcpy(mElements.data(), res.data(), numElts * sizeof(float)); >+ } >+ >+ bool operator==(const Matrix<T> &m) const >+ { >+ ASSERT(columns() == m.columns()); >+ ASSERT(rows() == m.rows()); >+ return mElements == m.elements(); >+ } >+ >+ bool operator!=(const Matrix<T> &m) const { return !(mElements == m.elements()); } >+ >+ bool nearlyEqual(T epsilon, const Matrix<T> &m) const >+ { >+ ASSERT(columns() == m.columns()); >+ ASSERT(rows() == m.rows()); >+ const auto &otherElts = m.elements(); >+ for (size_t i = 0; i < otherElts.size(); i++) >+ { >+ if ((mElements[i] - otherElts[i] > epsilon) && (otherElts[i] - mElements[i] > epsilon)) >+ return false; >+ } >+ return true; >+ } >+ > unsigned int size() const > { > ASSERT(rows() == columns()); >@@ -100,13 +133,20 @@ class Matrix > unsigned int columns() const { return mCols; } > > std::vector<T> elements() const { return mElements; } >+ T *data() { return mElements.data(); } > > Matrix<T> compMult(const Matrix<T> &mat1) const > { >- Matrix result(std::vector<T>(mElements.size()), size()); >- for (unsigned int i = 0; i < columns(); i++) >- for (unsigned int j = 0; j < rows(); j++) >- result(i, j) = at(i, j) * mat1(i, j); >+ Matrix result(std::vector<T>(mElements.size()), rows(), columns()); >+ for (unsigned int i = 0; i < rows(); i++) >+ { >+ for (unsigned int j = 0; j < columns(); j++) >+ { >+ T lhs = at(i, j); >+ T rhs = mat1(i, j); >+ result(i, j) = rhs * lhs; >+ } >+ } > > return result; > } >@@ -138,51 +178,69 @@ class Matrix > > switch (size()) > { >- case 2: >- return at(0, 0) * at(1, 1) - at(0, 1) * at(1, 0); >- >- case 3: >- return at(0, 0) * at(1, 1) * at(2, 2) + >- at(0, 1) * at(1, 2) * at(2, 0) + >- at(0, 2) * at(1, 0) * at(2, 1) - >- at(0, 2) * at(1, 1) * at(2, 0) - >- at(0, 1) * at(1, 0) * at(2, 2) - >- at(0, 0) * at(1, 2) * at(2, 1); >- >- case 4: >+ case 2: >+ return at(0, 0) * at(1, 1) - at(0, 1) * at(1, 0); >+ >+ case 3: >+ return at(0, 0) * at(1, 1) * at(2, 2) + at(0, 1) * at(1, 2) * at(2, 0) + >+ at(0, 2) * at(1, 0) * at(2, 1) - at(0, 2) * at(1, 1) * at(2, 0) - >+ at(0, 1) * at(1, 0) * at(2, 2) - at(0, 0) * at(1, 2) * at(2, 1); >+ >+ case 4: > { >- const float minorMatrices[4][3 * 3] = >- { >- { >- at(1, 1), at(2, 1), at(3, 1), >- at(1, 2), at(2, 2), at(3, 2), >- at(1, 3), at(2, 3), at(3, 3), >- }, >- { >- at(1, 0), at(2, 0), at(3, 0), >- at(1, 2), at(2, 2), at(3, 2), >- at(1, 3), at(2, 3), at(3, 3), >- }, >- { >- at(1, 0), at(2, 0), at(3, 0), >- at(1, 1), at(2, 1), at(3, 1), >- at(1, 3), at(2, 3), at(3, 3), >- }, >- { >- at(1, 0), at(2, 0), at(3, 0), >- at(1, 1), at(2, 1), at(3, 1), >- at(1, 2), at(2, 2), at(3, 2), >- } >- }; >- return at(0, 0) * Matrix<T>(minorMatrices[0], 3).determinant() - >- at(0, 1) * Matrix<T>(minorMatrices[1], 3).determinant() + >- at(0, 2) * Matrix<T>(minorMatrices[2], 3).determinant() - >- at(0, 3) * Matrix<T>(minorMatrices[3], 3).determinant(); >+ const float minorMatrices[4][3 * 3] = {{ >+ at(1, 1), >+ at(2, 1), >+ at(3, 1), >+ at(1, 2), >+ at(2, 2), >+ at(3, 2), >+ at(1, 3), >+ at(2, 3), >+ at(3, 3), >+ }, >+ { >+ at(1, 0), >+ at(2, 0), >+ at(3, 0), >+ at(1, 2), >+ at(2, 2), >+ at(3, 2), >+ at(1, 3), >+ at(2, 3), >+ at(3, 3), >+ }, >+ { >+ at(1, 0), >+ at(2, 0), >+ at(3, 0), >+ at(1, 1), >+ at(2, 1), >+ at(3, 1), >+ at(1, 3), >+ at(2, 3), >+ at(3, 3), >+ }, >+ { >+ at(1, 0), >+ at(2, 0), >+ at(3, 0), >+ at(1, 1), >+ at(2, 1), >+ at(3, 1), >+ at(1, 2), >+ at(2, 2), >+ at(3, 2), >+ }}; >+ return at(0, 0) * Matrix<T>(minorMatrices[0], 3).determinant() - >+ at(0, 1) * Matrix<T>(minorMatrices[1], 3).determinant() + >+ at(0, 2) * Matrix<T>(minorMatrices[2], 3).determinant() - >+ at(0, 3) * Matrix<T>(minorMatrices[3], 3).determinant(); > } > >- default: >- UNREACHABLE(); >- break; >+ default: >+ UNREACHABLE(); >+ break; > } > > return T(); >@@ -195,139 +253,83 @@ class Matrix > Matrix<T> cof(std::vector<T>(mElements.size()), rows(), columns()); > switch (size()) > { >- case 2: >- cof(0, 0) = at(1, 1); >- cof(0, 1) = -at(1, 0); >- cof(1, 0) = -at(0, 1); >- cof(1, 1) = at(0, 0); >- break; >- >- case 3: >- cof(0, 0) = at(1, 1) * at(2, 2) - >- at(2, 1) * at(1, 2); >- cof(0, 1) = -(at(1, 0) * at(2, 2) - >- at(2, 0) * at(1, 2)); >- cof(0, 2) = at(1, 0) * at(2, 1) - >- at(2, 0) * at(1, 1); >- cof(1, 0) = -(at(0, 1) * at(2, 2) - >- at(2, 1) * at(0, 2)); >- cof(1, 1) = at(0, 0) * at(2, 2) - >- at(2, 0) * at(0, 2); >- cof(1, 2) = -(at(0, 0) * at(2, 1) - >- at(2, 0) * at(0, 1)); >- cof(2, 0) = at(0, 1) * at(1, 2) - >- at(1, 1) * at(0, 2); >- cof(2, 1) = -(at(0, 0) * at(1, 2) - >- at(1, 0) * at(0, 2)); >- cof(2, 2) = at(0, 0) * at(1, 1) - >- at(1, 0) * at(0, 1); >- break; >- >- case 4: >- cof(0, 0) = at(1, 1) * at(2, 2) * at(3, 3) + >- at(2, 1) * at(3, 2) * at(1, 3) + >- at(3, 1) * at(1, 2) * at(2, 3) - >- at(1, 1) * at(3, 2) * at(2, 3) - >- at(2, 1) * at(1, 2) * at(3, 3) - >- at(3, 1) * at(2, 2) * at(1, 3); >- cof(0, 1) = -(at(1, 0) * at(2, 2) * at(3, 3) + >- at(2, 0) * at(3, 2) * at(1, 3) + >- at(3, 0) * at(1, 2) * at(2, 3) - >- at(1, 0) * at(3, 2) * at(2, 3) - >- at(2, 0) * at(1, 2) * at(3, 3) - >- at(3, 0) * at(2, 2) * at(1, 3)); >- cof(0, 2) = at(1, 0) * at(2, 1) * at(3, 3) + >- at(2, 0) * at(3, 1) * at(1, 3) + >- at(3, 0) * at(1, 1) * at(2, 3) - >- at(1, 0) * at(3, 1) * at(2, 3) - >- at(2, 0) * at(1, 1) * at(3, 3) - >- at(3, 0) * at(2, 1) * at(1, 3); >- cof(0, 3) = -(at(1, 0) * at(2, 1) * at(3, 2) + >- at(2, 0) * at(3, 1) * at(1, 2) + >- at(3, 0) * at(1, 1) * at(2, 2) - >- at(1, 0) * at(3, 1) * at(2, 2) - >- at(2, 0) * at(1, 1) * at(3, 2) - >- at(3, 0) * at(2, 1) * at(1, 2)); >- cof(1, 0) = -(at(0, 1) * at(2, 2) * at(3, 3) + >- at(2, 1) * at(3, 2) * at(0, 3) + >- at(3, 1) * at(0, 2) * at(2, 3) - >- at(0, 1) * at(3, 2) * at(2, 3) - >- at(2, 1) * at(0, 2) * at(3, 3) - >- at(3, 1) * at(2, 2) * at(0, 3)); >- cof(1, 1) = at(0, 0) * at(2, 2) * at(3, 3) + >- at(2, 0) * at(3, 2) * at(0, 3) + >- at(3, 0) * at(0, 2) * at(2, 3) - >- at(0, 0) * at(3, 2) * at(2, 3) - >- at(2, 0) * at(0, 2) * at(3, 3) - >- at(3, 0) * at(2, 2) * at(0, 3); >- cof(1, 2) = -(at(0, 0) * at(2, 1) * at(3, 3) + >- at(2, 0) * at(3, 1) * at(0, 3) + >- at(3, 0) * at(0, 1) * at(2, 3) - >- at(0, 0) * at(3, 1) * at(2, 3) - >- at(2, 0) * at(0, 1) * at(3, 3) - >- at(3, 0) * at(2, 1) * at(0, 3)); >- cof(1, 3) = at(0, 0) * at(2, 1) * at(3, 2) + >- at(2, 0) * at(3, 1) * at(0, 2) + >- at(3, 0) * at(0, 1) * at(2, 2) - >- at(0, 0) * at(3, 1) * at(2, 2) - >- at(2, 0) * at(0, 1) * at(3, 2) - >- at(3, 0) * at(2, 1) * at(0, 2); >- cof(2, 0) = at(0, 1) * at(1, 2) * at(3, 3) + >- at(1, 1) * at(3, 2) * at(0, 3) + >- at(3, 1) * at(0, 2) * at(1, 3) - >- at(0, 1) * at(3, 2) * at(1, 3) - >- at(1, 1) * at(0, 2) * at(3, 3) - >- at(3, 1) * at(1, 2) * at(0, 3); >- cof(2, 1) = -(at(0, 0) * at(1, 2) * at(3, 3) + >- at(1, 0) * at(3, 2) * at(0, 3) + >- at(3, 0) * at(0, 2) * at(1, 3) - >- at(0, 0) * at(3, 2) * at(1, 3) - >- at(1, 0) * at(0, 2) * at(3, 3) - >- at(3, 0) * at(1, 2) * at(0, 3)); >- cof(2, 2) = at(0, 0) * at(1, 1) * at(3, 3) + >- at(1, 0) * at(3, 1) * at(0, 3) + >- at(3, 0) * at(0, 1) * at(1, 3) - >- at(0, 0) * at(3, 1) * at(1, 3) - >- at(1, 0) * at(0, 1) * at(3, 3) - >- at(3, 0) * at(1, 1) * at(0, 3); >- cof(2, 3) = -(at(0, 0) * at(1, 1) * at(3, 2) + >- at(1, 0) * at(3, 1) * at(0, 2) + >- at(3, 0) * at(0, 1) * at(1, 2) - >- at(0, 0) * at(3, 1) * at(1, 2) - >- at(1, 0) * at(0, 1) * at(3, 2) - >- at(3, 0) * at(1, 1) * at(0, 2)); >- cof(3, 0) = -(at(0, 1) * at(1, 2) * at(2, 3) + >- at(1, 1) * at(2, 2) * at(0, 3) + >- at(2, 1) * at(0, 2) * at(1, 3) - >- at(0, 1) * at(2, 2) * at(1, 3) - >- at(1, 1) * at(0, 2) * at(2, 3) - >- at(2, 1) * at(1, 2) * at(0, 3)); >- cof(3, 1) = at(0, 0) * at(1, 2) * at(2, 3) + >- at(1, 0) * at(2, 2) * at(0, 3) + >- at(2, 0) * at(0, 2) * at(1, 3) - >- at(0, 0) * at(2, 2) * at(1, 3) - >- at(1, 0) * at(0, 2) * at(2, 3) - >- at(2, 0) * at(1, 2) * at(0, 3); >- cof(3, 2) = -(at(0, 0) * at(1, 1) * at(2, 3) + >- at(1, 0) * at(2, 1) * at(0, 3) + >- at(2, 0) * at(0, 1) * at(1, 3) - >- at(0, 0) * at(2, 1) * at(1, 3) - >- at(1, 0) * at(0, 1) * at(2, 3) - >- at(2, 0) * at(1, 1) * at(0, 3)); >- cof(3, 3) = at(0, 0) * at(1, 1) * at(2, 2) + >- at(1, 0) * at(2, 1) * at(0, 2) + >- at(2, 0) * at(0, 1) * at(1, 2) - >- at(0, 0) * at(2, 1) * at(1, 2) - >- at(1, 0) * at(0, 1) * at(2, 2) - >- at(2, 0) * at(1, 1) * at(0, 2); >- break; >- >- default: >- UNREACHABLE(); >- break; >+ case 2: >+ cof(0, 0) = at(1, 1); >+ cof(0, 1) = -at(1, 0); >+ cof(1, 0) = -at(0, 1); >+ cof(1, 1) = at(0, 0); >+ break; >+ >+ case 3: >+ cof(0, 0) = at(1, 1) * at(2, 2) - at(2, 1) * at(1, 2); >+ cof(0, 1) = -(at(1, 0) * at(2, 2) - at(2, 0) * at(1, 2)); >+ cof(0, 2) = at(1, 0) * at(2, 1) - at(2, 0) * at(1, 1); >+ cof(1, 0) = -(at(0, 1) * at(2, 2) - at(2, 1) * at(0, 2)); >+ cof(1, 1) = at(0, 0) * at(2, 2) - at(2, 0) * at(0, 2); >+ cof(1, 2) = -(at(0, 0) * at(2, 1) - at(2, 0) * at(0, 1)); >+ cof(2, 0) = at(0, 1) * at(1, 2) - at(1, 1) * at(0, 2); >+ cof(2, 1) = -(at(0, 0) * at(1, 2) - at(1, 0) * at(0, 2)); >+ cof(2, 2) = at(0, 0) * at(1, 1) - at(1, 0) * at(0, 1); >+ break; >+ >+ case 4: >+ cof(0, 0) = at(1, 1) * at(2, 2) * at(3, 3) + at(2, 1) * at(3, 2) * at(1, 3) + >+ at(3, 1) * at(1, 2) * at(2, 3) - at(1, 1) * at(3, 2) * at(2, 3) - >+ at(2, 1) * at(1, 2) * at(3, 3) - at(3, 1) * at(2, 2) * at(1, 3); >+ cof(0, 1) = -(at(1, 0) * at(2, 2) * at(3, 3) + at(2, 0) * at(3, 2) * at(1, 3) + >+ at(3, 0) * at(1, 2) * at(2, 3) - at(1, 0) * at(3, 2) * at(2, 3) - >+ at(2, 0) * at(1, 2) * at(3, 3) - at(3, 0) * at(2, 2) * at(1, 3)); >+ cof(0, 2) = at(1, 0) * at(2, 1) * at(3, 3) + at(2, 0) * at(3, 1) * at(1, 3) + >+ at(3, 0) * at(1, 1) * at(2, 3) - at(1, 0) * at(3, 1) * at(2, 3) - >+ at(2, 0) * at(1, 1) * at(3, 3) - at(3, 0) * at(2, 1) * at(1, 3); >+ cof(0, 3) = -(at(1, 0) * at(2, 1) * at(3, 2) + at(2, 0) * at(3, 1) * at(1, 2) + >+ at(3, 0) * at(1, 1) * at(2, 2) - at(1, 0) * at(3, 1) * at(2, 2) - >+ at(2, 0) * at(1, 1) * at(3, 2) - at(3, 0) * at(2, 1) * at(1, 2)); >+ cof(1, 0) = -(at(0, 1) * at(2, 2) * at(3, 3) + at(2, 1) * at(3, 2) * at(0, 3) + >+ at(3, 1) * at(0, 2) * at(2, 3) - at(0, 1) * at(3, 2) * at(2, 3) - >+ at(2, 1) * at(0, 2) * at(3, 3) - at(3, 1) * at(2, 2) * at(0, 3)); >+ cof(1, 1) = at(0, 0) * at(2, 2) * at(3, 3) + at(2, 0) * at(3, 2) * at(0, 3) + >+ at(3, 0) * at(0, 2) * at(2, 3) - at(0, 0) * at(3, 2) * at(2, 3) - >+ at(2, 0) * at(0, 2) * at(3, 3) - at(3, 0) * at(2, 2) * at(0, 3); >+ cof(1, 2) = -(at(0, 0) * at(2, 1) * at(3, 3) + at(2, 0) * at(3, 1) * at(0, 3) + >+ at(3, 0) * at(0, 1) * at(2, 3) - at(0, 0) * at(3, 1) * at(2, 3) - >+ at(2, 0) * at(0, 1) * at(3, 3) - at(3, 0) * at(2, 1) * at(0, 3)); >+ cof(1, 3) = at(0, 0) * at(2, 1) * at(3, 2) + at(2, 0) * at(3, 1) * at(0, 2) + >+ at(3, 0) * at(0, 1) * at(2, 2) - at(0, 0) * at(3, 1) * at(2, 2) - >+ at(2, 0) * at(0, 1) * at(3, 2) - at(3, 0) * at(2, 1) * at(0, 2); >+ cof(2, 0) = at(0, 1) * at(1, 2) * at(3, 3) + at(1, 1) * at(3, 2) * at(0, 3) + >+ at(3, 1) * at(0, 2) * at(1, 3) - at(0, 1) * at(3, 2) * at(1, 3) - >+ at(1, 1) * at(0, 2) * at(3, 3) - at(3, 1) * at(1, 2) * at(0, 3); >+ cof(2, 1) = -(at(0, 0) * at(1, 2) * at(3, 3) + at(1, 0) * at(3, 2) * at(0, 3) + >+ at(3, 0) * at(0, 2) * at(1, 3) - at(0, 0) * at(3, 2) * at(1, 3) - >+ at(1, 0) * at(0, 2) * at(3, 3) - at(3, 0) * at(1, 2) * at(0, 3)); >+ cof(2, 2) = at(0, 0) * at(1, 1) * at(3, 3) + at(1, 0) * at(3, 1) * at(0, 3) + >+ at(3, 0) * at(0, 1) * at(1, 3) - at(0, 0) * at(3, 1) * at(1, 3) - >+ at(1, 0) * at(0, 1) * at(3, 3) - at(3, 0) * at(1, 1) * at(0, 3); >+ cof(2, 3) = -(at(0, 0) * at(1, 1) * at(3, 2) + at(1, 0) * at(3, 1) * at(0, 2) + >+ at(3, 0) * at(0, 1) * at(1, 2) - at(0, 0) * at(3, 1) * at(1, 2) - >+ at(1, 0) * at(0, 1) * at(3, 2) - at(3, 0) * at(1, 1) * at(0, 2)); >+ cof(3, 0) = -(at(0, 1) * at(1, 2) * at(2, 3) + at(1, 1) * at(2, 2) * at(0, 3) + >+ at(2, 1) * at(0, 2) * at(1, 3) - at(0, 1) * at(2, 2) * at(1, 3) - >+ at(1, 1) * at(0, 2) * at(2, 3) - at(2, 1) * at(1, 2) * at(0, 3)); >+ cof(3, 1) = at(0, 0) * at(1, 2) * at(2, 3) + at(1, 0) * at(2, 2) * at(0, 3) + >+ at(2, 0) * at(0, 2) * at(1, 3) - at(0, 0) * at(2, 2) * at(1, 3) - >+ at(1, 0) * at(0, 2) * at(2, 3) - at(2, 0) * at(1, 2) * at(0, 3); >+ cof(3, 2) = -(at(0, 0) * at(1, 1) * at(2, 3) + at(1, 0) * at(2, 1) * at(0, 3) + >+ at(2, 0) * at(0, 1) * at(1, 3) - at(0, 0) * at(2, 1) * at(1, 3) - >+ at(1, 0) * at(0, 1) * at(2, 3) - at(2, 0) * at(1, 1) * at(0, 3)); >+ cof(3, 3) = at(0, 0) * at(1, 1) * at(2, 2) + at(1, 0) * at(2, 1) * at(0, 2) + >+ at(2, 0) * at(0, 1) * at(1, 2) - at(0, 0) * at(2, 1) * at(1, 2) - >+ at(1, 0) * at(0, 1) * at(2, 2) - at(2, 0) * at(1, 1) * at(0, 2); >+ break; >+ >+ default: >+ UNREACHABLE(); >+ break; > } > >- // The inverse of A is the transpose of the cofactor matrix times the reciprocal of the determinant of A. >+ // The inverse of A is the transpose of the cofactor matrix times the reciprocal of the >+ // determinant of A. > Matrix<T> adjugateMatrix(cof.transpose()); > T det = determinant(); > Matrix<T> result(std::vector<T>(mElements.size()), rows(), columns()); >@@ -356,7 +358,7 @@ class Matrix > } > > template <unsigned int Size> >- static void setToIdentity(T(&matrix)[Size]) >+ static void setToIdentity(T (&matrix)[Size]) > { > static_assert(gl::iSquareRoot<Size>() != 0, "Matrix is not square."); > >@@ -374,13 +376,48 @@ class Matrix > } > } > >- private: >+ protected: > std::vector<T> mElements; > unsigned int mRows; > unsigned int mCols; > }; > >-} // namespace angle >+class Mat4 : public Matrix<float> >+{ >+ public: >+ Mat4(); >+ Mat4(const Matrix<float> generalMatrix); >+ Mat4(const std::vector<float> &elements); >+ Mat4(const float *elements); >+ Mat4(float m00, >+ float m01, >+ float m02, >+ float m03, >+ float m10, >+ float m11, >+ float m12, >+ float m13, >+ float m20, >+ float m21, >+ float m22, >+ float m23, >+ float m30, >+ float m31, >+ float m32, >+ float m33); >+ >+ static Mat4 Rotate(float angle, const Vector3 &axis); >+ static Mat4 Translate(const Vector3 &t); >+ static Mat4 Scale(const Vector3 &s); >+ static Mat4 Frustum(float l, float r, float b, float t, float n, float f); >+ static Mat4 Perspective(float fov, float aspectRatio, float n, float f); >+ static Mat4 Ortho(float l, float r, float b, float t, float n, float f); >+ >+ Mat4 product(const Mat4 &m); >+ Vector4 product(const Vector4 &b); >+ void dump(); >+}; > >-#endif // COMMON_MATRIX_UTILS_H_ >+} // namespace angle > >+#endif // COMMON_MATRIX_UTILS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/matrix_utils_unittest.cpp b/Source/ThirdParty/ANGLE/src/common/matrix_utils_unittest.cpp >index 6e9f92d9a82..5efc39fd50a 100644 >--- a/Source/ThirdParty/ANGLE/src/common/matrix_utils_unittest.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/matrix_utils_unittest.cpp >@@ -16,6 +16,72 @@ using namespace angle; > namespace > { > >+struct RotateArgs >+{ >+ float angle; >+ Vector3 axis; >+}; >+ >+struct TranslateArgs >+{ >+ float x; >+ float y; >+ float z; >+}; >+ >+struct ScaleArgs >+{ >+ float x; >+ float y; >+ float z; >+}; >+ >+struct FrustumArgs >+{ >+ float l; >+ float r; >+ float b; >+ float t; >+ float n; >+ float f; >+}; >+ >+void CheckMat4ExactlyEq(const Matrix<float> &a, const Matrix<float> &b) >+{ >+ for (unsigned int i = 0; i < 4; i++) >+ { >+ for (unsigned int j = 0; i < 4; i++) >+ { >+ EXPECT_EQ(a.at(i, j), b.at(i, j)); >+ } >+ } >+} >+ >+// TODO(lfy): Spec out requirements for matrix precision >+void CheckMatrixCloseToGolden(float *golden, const Mat4 &m) >+{ >+ const float floatFaultTolarance = 0.000001f; >+ const auto &checkElts = m.elements(); >+ for (size_t i = 0; i < checkElts.size(); i++) >+ { >+ EXPECT_NEAR(golden[i], checkElts[i], floatFaultTolarance); >+ } >+} >+ >+void CheckMatrixCloseToGolden(const std::vector<float> &golden, const Mat4 &m) >+{ >+ const float floatFaultTolarance = 0.000001f; >+ const auto &checkElts = m.elements(); >+ for (size_t i = 0; i < golden.size(); i++) >+ { >+ EXPECT_NEAR(golden[i], checkElts[i], floatFaultTolarance); >+ } >+} >+} // namespace >+ >+namespace >+{ >+ > const unsigned int minDimensions = 2; > const unsigned int maxDimensions = 4; > >@@ -49,7 +115,7 @@ TEST(MatrixUtilsTest, MatrixCompMultTest) > { > unsigned int numElements = i * i; > Matrix<float> m1(std::vector<float>(numElements, 2.0f), i); >- Matrix<float> actualResult = m1.compMult(m1); >+ Matrix<float> actualResult = m1.compMult(m1); > std::vector<float> actualResultElements = actualResult.elements(); > std::vector<float> expectedResultElements(numElements, 4.0f); > EXPECT_EQ(expectedResultElements, actualResultElements); >@@ -83,7 +149,8 @@ TEST(MatrixUtilsTest, MatrixTransposeTest) > { > unsigned int numElements = i * j; > Matrix<float> m1(std::vector<float>(numElements, 2.0f), i, j); >- Matrix<float> expectedResult = Matrix<float>(std::vector<float>(numElements, 2.0f), j, i); >+ Matrix<float> expectedResult = >+ Matrix<float>(std::vector<float>(numElements, 2.0f), j, i); > Matrix<float> actualResult = m1.transpose(); > EXPECT_EQ(expectedResult.elements(), actualResult.elements()); > EXPECT_EQ(actualResult.rows(), expectedResult.rows()); >@@ -107,19 +174,11 @@ TEST(MatrixUtilsTest, MatrixDeterminantTest) > > TEST(MatrixUtilsTest, 2x2MatrixInverseTest) > { >- float inputElements[] = >- { >- 2.0f, 5.0f, >- 3.0f, 7.0f >- }; >+ float inputElements[] = {2.0f, 5.0f, 3.0f, 7.0f}; > unsigned int numElements = 4; > std::vector<float> input(inputElements, inputElements + numElements); > Matrix<float> inputMatrix(input, 2); >- float identityElements[] = >- { >- 1.0f, 0.0f, >- 0.0f, 1.0f >- }; >+ float identityElements[] = {1.0f, 0.0f, 0.0f, 1.0f}; > std::vector<float> identityMatrix(identityElements, identityElements + numElements); > // A * inverse(A) = I, where I is identity matrix. > Matrix<float> result = inputMatrix * inputMatrix.inverse(); >@@ -128,57 +187,2255 @@ TEST(MatrixUtilsTest, 2x2MatrixInverseTest) > > TEST(MatrixUtilsTest, 3x3MatrixInverseTest) > { >- float inputElements[] = >- { >- 11.0f, 23.0f, 37.0f, >- 13.0f, 29.0f, 41.0f, >- 19.0f, 31.0f, 43.0f >- }; >+ float inputElements[] = {11.0f, 23.0f, 37.0f, 13.0f, 29.0f, 41.0f, 19.0f, 31.0f, 43.0f}; > unsigned int numElements = 9; > std::vector<float> input(inputElements, inputElements + numElements); > Matrix<float> inputMatrix(input, 3); >- float identityElements[] = >- { >- 1.0f, 0.0f, 0.0f, >- 0.0f, 1.0f, 0.0f, >- 0.0f, 0.0f, 1.0f >- }; >+ float identityElements[] = {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f}; > std::vector<float> identityMatrix(identityElements, identityElements + numElements); > // A * inverse(A) = I, where I is identity matrix. >- Matrix<float> result = inputMatrix * inputMatrix.inverse(); >+ Matrix<float> result = inputMatrix * inputMatrix.inverse(); > std::vector<float> resultElements = result.elements(); >- const float floatFaultTolarance = 0.000001f; >+ const float floatFaultTolarance = 0.000001f; > for (size_t i = 0; i < numElements; i++) > EXPECT_NEAR(resultElements[i], identityMatrix[i], floatFaultTolarance); > } > > TEST(MatrixUtilsTest, 4x4MatrixInverseTest) > { >- float inputElements[] = >- { >- 29.0f, 43.0f, 61.0f, 79.0f, >- 31.0f, 47.0f, 67.0f, 83.0f, >- 37.0f, 53.0f, 71.0f, 89.0f, >- 41.0f, 59.0f, 73.0f, 97.0f >- }; >+ float inputElements[] = {29.0f, 43.0f, 61.0f, 79.0f, 31.0f, 47.0f, 67.0f, 83.0f, >+ 37.0f, 53.0f, 71.0f, 89.0f, 41.0f, 59.0f, 73.0f, 97.0f}; > unsigned int numElements = 16; > std::vector<float> input(inputElements, inputElements + numElements); > Matrix<float> inputMatrix(input, 4); >- float identityElements[] = >- { >- 1.0f, 0.0f, 0.0f, 0.0f, >- 0.0f, 1.0f, 0.0f, 0.0f, >- 0.0f, 0.0f, 1.0f, 0.0f, >- 0.0f, 0.0f, 0.0f, 1.0f, >+ float identityElements[] = { >+ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, >+ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, > }; > std::vector<float> identityMatrix(identityElements, identityElements + numElements); > // A * inverse(A) = I, where I is identity matrix. >- Matrix<float> result = inputMatrix * inputMatrix.inverse(); >+ Matrix<float> result = inputMatrix * inputMatrix.inverse(); > std::vector<float> resultElements = result.elements(); >- const float floatFaultTolarance = 0.00001f; >+ const float floatFaultTolarance = 0.00001f; > for (unsigned int i = 0; i < numElements; i++) > EXPECT_NEAR(resultElements[i], identityMatrix[i], floatFaultTolarance); > } > >+// Tests constructors for mat4; using raw float*, std::vector<float>, >+// and Matrix<float>. >+TEST(MatrixUtilsTest, Mat4Construction) >+{ >+ float elements[] = { >+ 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, >+ 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, >+ }; >+ >+ std::vector<float> elementsVector(16, 0); >+ for (int i = 0; i < 16; i++) >+ { >+ elementsVector[i] = elements[i]; >+ } >+ >+ Matrix<float> a(elements, 4); >+ Mat4 b(elements); >+ Mat4 bVec(elementsVector); >+ >+ CheckMat4ExactlyEq(a, b); >+ CheckMat4ExactlyEq(b, bVec); >+ >+ a.setToIdentity(); >+ b = Mat4(); >+ >+ CheckMat4ExactlyEq(a, b); >+ >+ Mat4 c(0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, >+ 14.0f, 15.0f); >+ Mat4 d(elements); >+ Mat4 e(Matrix<float>(elements, 4)); >+ >+ CheckMat4ExactlyEq(c, d); >+ CheckMat4ExactlyEq(e, d); >+} >+ >+// Tests rotation matrices. >+TEST(MatrixUtilsTest, Mat4Rotate) >+{ >+ // Sanity check. >+ float elementsExpected[] = { >+ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, >+ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, >+ }; >+ >+ std::vector<float> elementsExpectedVector(16, 0); >+ for (int i = 0; i < 16; i++) >+ { >+ elementsExpectedVector[i] = elementsExpected[i]; >+ } >+ >+ Mat4 r = Mat4::Rotate(0.f, Vector3(0.f, 0.f, 1.f)); >+ Mat4 golden(elementsExpected); >+ CheckMatrixCloseToGolden(elementsExpected, r); >+ CheckMatrixCloseToGolden(elementsExpectedVector, r); >+ CheckMat4ExactlyEq(r, golden); >+ >+ // Randomly-generated inputs, outputs using GLM. >+ std::vector<RotateArgs> rotationGoldenInputs; >+ std::vector<std::vector<float>> rotationGoldenOutputs; >+ rotationGoldenInputs.push_back( >+ {-123.2026214599609375f, >+ Vector3(1.4951171875000000f, 8.4370708465576172f, 1.8489227294921875f)}); >+ rotationGoldenInputs.push_back( >+ {-185.3049316406250000f, >+ Vector3(8.3313980102539062f, 5.8317651748657227f, -5.5201716423034668f)}); >+ rotationGoldenInputs.push_back( >+ {89.1301574707031250f, >+ Vector3(-8.5962724685668945f, 2.4547367095947266f, -3.2461600303649902f)}); >+ rotationGoldenInputs.push_back( >+ {64.2547302246093750f, >+ Vector3(-1.9640445709228516f, -9.6942234039306641f, 9.1921043395996094f)}); >+ rotationGoldenInputs.push_back( >+ {-298.5585021972656250f, >+ Vector3(-5.3600544929504395f, -6.4333534240722656f, -5.3734750747680664f)}); >+ rotationGoldenInputs.push_back( >+ {288.2606201171875000f, >+ Vector3(-2.3043875694274902f, -9.8447618484497070f, -0.9124794006347656f)}); >+ rotationGoldenInputs.push_back( >+ {142.3956298828125000f, >+ Vector3(-1.0044975280761719f, -2.5834980010986328f, -0.8451175689697266f)}); >+ rotationGoldenInputs.push_back( >+ {-140.0445861816406250f, >+ Vector3(-1.3710060119628906f, -2.5042991638183594f, -9.7572088241577148f)}); >+ rotationGoldenInputs.push_back( >+ {-338.5443420410156250f, >+ Vector3(6.8056621551513672f, 2.7508878707885742f, -5.8343429565429688f)}); >+ rotationGoldenInputs.push_back( >+ {79.0578613281250000f, >+ Vector3(9.0518493652343750f, -5.5615901947021484f, 6.3559799194335938f)}); >+ rotationGoldenInputs.push_back( >+ {4464.6367187500000000f, >+ Vector3(-53.9424285888671875f, -10.3614959716796875f, 54.3564453125000000f)}); >+ rotationGoldenInputs.push_back( >+ {-2820.6347656250000000f, >+ Vector3(62.1694793701171875f, 82.4977569580078125f, -60.0084800720214844f)}); >+ rotationGoldenInputs.push_back( >+ {3371.0527343750000000f, >+ Vector3(-74.5660324096679688f, -31.3026275634765625f, 96.7252349853515625f)}); >+ rotationGoldenInputs.push_back( >+ {5501.7167968750000000f, >+ Vector3(15.0308380126953125f, 23.2323913574218750f, 66.8295593261718750f)}); >+ rotationGoldenInputs.push_back( >+ {392.1757812500000000f, >+ Vector3(36.5722198486328125f, 69.2820892333984375f, 24.1789474487304688f)}); >+ rotationGoldenInputs.push_back( >+ {-2206.7138671875000000f, >+ Vector3(-91.5292282104492188f, 68.2716674804687500f, 42.0627288818359375f)}); >+ rotationGoldenInputs.push_back( >+ {-4648.8623046875000000f, >+ Vector3(50.7790374755859375f, 43.3964080810546875f, -36.3877525329589844f)}); >+ rotationGoldenInputs.push_back( >+ {2794.6015625000000000f, >+ Vector3(76.2934265136718750f, 63.4901885986328125f, 79.5993041992187500f)}); >+ rotationGoldenInputs.push_back( >+ {2294.6787109375000000f, >+ Vector3(-81.3662338256835938f, 77.6944580078125000f, 10.8423461914062500f)}); >+ rotationGoldenInputs.push_back( >+ {2451.0468750000000000f, >+ Vector3(-80.6299896240234375f, 51.8244628906250000f, 13.6877517700195312f)}); >+ rotationGoldenOutputs.push_back({ >+ -0.5025786161422729f, >+ 0.0775775760412216f, >+ 0.8610438108444214f, >+ 0.0000000000000000f, >+ 0.4305581450462341f, >+ 0.8861245512962341f, >+ 0.1714731603860855f, >+ 0.0000000000000000f, >+ -0.7496895790100098f, >+ 0.4569081664085388f, >+ -0.4787489175796509f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.0388860106468201f, >+ 0.6800884604454041f, >+ -0.7320981621742249f, >+ 0.0000000000000000f, >+ 0.7683026194572449f, >+ -0.4887983798980713f, >+ -0.4132642149925232f, >+ 0.0000000000000000f, >+ -0.6389046907424927f, >+ -0.5464027523994446f, >+ -0.5415209531784058f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.8196773529052734f, >+ -0.5709969997406006f, >+ 0.0457325875759125f, >+ 0.0000000000000000f, >+ 0.1115358471870422f, >+ 0.0807825028896332f, >+ -0.9904716014862061f, >+ 0.0000000000000000f, >+ 0.5618618726730347f, >+ 0.8169679641723633f, >+ 0.1299021989107132f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.4463376104831696f, >+ 0.6722379326820374f, >+ 0.5906597971916199f, >+ 0.0000000000000000f, >+ -0.5541059374809265f, >+ 0.7259115576744080f, >+ -0.4074544310569763f, >+ 0.0000000000000000f, >+ -0.7026730179786682f, >+ -0.1454258561134338f, >+ 0.6964926123619080f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.6295375227928162f, >+ -0.2925493717193604f, >+ 0.7197898030281067f, >+ 0.0000000000000000f, >+ 0.6561784744262695f, >+ 0.6962769031524658f, >+ -0.2909094095230103f, >+ 0.0000000000000000f, >+ -0.4160676598548889f, >+ 0.6554489731788635f, >+ 0.6302970647811890f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.3487194776535034f, >+ 0.2365041077136993f, >+ -0.9068960547447205f, >+ 0.0000000000000000f, >+ 0.0657925531268120f, >+ 0.9590729475021362f, >+ 0.2754095196723938f, >+ 0.0000000000000000f, >+ 0.9349150061607361f, >+ -0.1557076722383499f, >+ 0.3188872337341309f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ -0.5768983364105225f, >+ 0.3758956193923950f, >+ 0.7251832485198975f, >+ 0.0000000000000000f, >+ 0.7318079471588135f, >+ 0.6322251558303833f, >+ 0.2544573545455933f, >+ 0.0000000000000000f, >+ -0.3628296852111816f, >+ 0.6774909496307373f, >+ -0.6398130059242249f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ -0.7344170808792114f, >+ 0.6750319004058838f, >+ 0.0704519301652908f, >+ 0.0000000000000000f, >+ -0.5576634407043457f, >+ -0.6593509316444397f, >+ 0.5042498111724854f, >+ 0.0000000000000000f, >+ 0.3868372440338135f, >+ 0.3310411870479584f, >+ 0.8606789708137512f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.9672066569328308f, >+ -0.2128375321626663f, >+ -0.1386056393384933f, >+ 0.0000000000000000f, >+ 0.2423491925001144f, >+ 0.9366652965545654f, >+ 0.2528339624404907f, >+ 0.0000000000000000f, >+ 0.0760145336389542f, >+ -0.2781336307525635f, >+ 0.9575299024581909f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.6229416728019714f, >+ 0.2379529774188995f, >+ 0.7451993227005005f, >+ 0.0000000000000000f, >+ -0.7701886892318726f, >+ 0.3533243536949158f, >+ 0.5310096740722656f, >+ 0.0000000000000000f, >+ -0.1369417309761047f, >+ -0.9047321081161499f, >+ 0.4033691287040710f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.0691163539886475f, >+ 0.5770183801651001f, >+ -0.8138013482093811f, >+ 0.0000000000000000f, >+ -0.2371776401996613f, >+ -0.7828579545021057f, >+ -0.5752218365669250f, >+ -0.0000000000000000f, >+ -0.9690044522285461f, >+ 0.2327727228403091f, >+ 0.0827475786209106f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.6423799991607666f, >+ -0.2559574246406555f, >+ -0.7223805189132690f, >+ 0.0000000000000000f, >+ 0.6084498763084412f, >+ 0.7434381246566772f, >+ 0.2776480317115784f, >+ 0.0000000000000000f, >+ 0.4659791886806488f, >+ -0.6178879141807556f, >+ 0.6333070397377014f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ -0.0772442221641541f, >+ 0.8218145370483398f, >+ -0.5644945502281189f, >+ 0.0000000000000000f, >+ -0.3352625370025635f, >+ -0.5546256303787231f, >+ -0.7615703344345093f, >+ -0.0000000000000000f, >+ -0.9389528036117554f, >+ 0.1304270327091217f, >+ 0.3183652758598328f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ -0.1511210501194000f, >+ 0.9849811196327209f, >+ -0.0835132896900177f, >+ 0.0000000000000000f, >+ -0.8243820667266846f, >+ -0.0789582207798958f, >+ 0.5604994893074036f, >+ 0.0000000000000000f, >+ 0.5454874038696289f, >+ 0.1535501033067703f, >+ 0.8239331245422363f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.8769769668579102f, >+ 0.2149325907230377f, >+ -0.4297852218151093f, >+ 0.0000000000000000f, >+ -0.0991527736186981f, >+ 0.9560844898223877f, >+ 0.2758098840713501f, >+ 0.0000000000000000f, >+ 0.4701915681362152f, >+ -0.1992645263671875f, >+ 0.8597752451896667f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.8634905815124512f, >+ -0.3842780590057373f, >+ 0.3266716897487640f, >+ 0.0000000000000000f, >+ 0.1189628839492798f, >+ 0.7845909595489502f, >+ 0.6084939241409302f, >+ 0.0000000000000000f, >+ -0.4901345074176788f, >+ -0.4865669906139374f, >+ 0.7232017517089844f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.9201348423957825f, >+ -0.1924955844879150f, >+ -0.3410238325595856f, >+ 0.0000000000000000f, >+ 0.3022402822971344f, >+ 0.9028221964836121f, >+ 0.3058805167675018f, >+ 0.0000000000000000f, >+ 0.2490032464265823f, >+ -0.3845224678516388f, >+ 0.8888981342315674f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.4109522104263306f, >+ -0.3483857214450836f, >+ 0.8424642086029053f, >+ 0.0000000000000000f, >+ 0.8988372087478638f, >+ 0.3092637956142426f, >+ -0.3105604350566864f, >+ 0.0000000000000000f, >+ -0.1523487865924835f, >+ 0.8848635554313660f, >+ 0.4402346611022949f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.1795312762260437f, >+ -0.7746179103851318f, >+ -0.6064119935035706f, >+ 0.0000000000000000f, >+ -0.9110413789749146f, >+ 0.1016657948493958f, >+ -0.3995841145515442f, >+ 0.0000000000000000f, >+ 0.3711764216423035f, >+ 0.6242043375968933f, >+ -0.6874569058418274f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ rotationGoldenOutputs.push_back({ >+ 0.8035809993743896f, >+ -0.4176068902015686f, >+ 0.4241013824939728f, >+ 0.0000000000000000f, >+ -0.1537265181541443f, >+ 0.5427432060241699f, >+ 0.8257105946540833f, >+ 0.0000000000000000f, >+ -0.5750005841255188f, >+ -0.7287209630012512f, >+ 0.3719408810138702f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ EXPECT_EQ(rotationGoldenInputs.size(), rotationGoldenOutputs.size()); >+ >+ for (size_t i = 0; i < rotationGoldenInputs.size(); i++) >+ { >+ const auto &input = rotationGoldenInputs[i]; >+ const auto &output = rotationGoldenOutputs[i]; >+ Mat4 rot = Mat4::Rotate(input.angle, input.axis); >+ CheckMatrixCloseToGolden(output, rot); >+ } >+} >+ >+// Tests mat4 translation. >+TEST(MatrixUtilsTest, Mat4Translate) >+{ >+ float elementsExpected[] = { >+ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, >+ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, >+ }; >+ >+ std::vector<float> elementsExpectedVector(16, 0); >+ for (int i = 0; i < 16; i++) >+ { >+ elementsExpectedVector[i] = elementsExpected[i]; >+ } >+ >+ Mat4 r = Mat4::Translate(Vector3(0.f, 0.f, 0.f)); >+ Mat4 golden(elementsExpected); >+ CheckMatrixCloseToGolden(elementsExpected, r); >+ CheckMatrixCloseToGolden(elementsExpectedVector, r); >+ CheckMat4ExactlyEq(r, golden); >+ >+ float elementsExpected1[] = { >+ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, >+ 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, >+ }; >+ >+ float elementsExpected2[] = { >+ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, >+ 0.0f, 0.0f, 1.0f, 0.0f, 2.0f, 2.0f, 2.0f, 1.0f, >+ }; >+ >+ Mat4 golden1(elementsExpected1); >+ Mat4 golden2(elementsExpected2); >+ >+ Mat4 t1 = Mat4::Translate(Vector3(1.f, 1.f, 1.f)); >+ Mat4 t2 = Mat4::Translate(Vector3(2.f, 2.f, 2.f)); >+ Mat4 t1t1 = t1.product(t1); >+ >+ CheckMat4ExactlyEq(t1, golden1); >+ CheckMat4ExactlyEq(t2, golden2); >+ CheckMat4ExactlyEq(t1t1, golden2); >+} >+ >+// Tests scale for mat4. >+TEST(MatrixUtilsTest, Mat4Scale) >+{ >+ >+ // Sanity check. >+ float elementsExpected[] = { >+ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, >+ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, >+ }; >+ >+ std::vector<float> elementsExpectedVector(16, 0); >+ for (int i = 0; i < 16; i++) >+ { >+ elementsExpectedVector[i] = elementsExpected[i]; >+ } >+ >+ Mat4 r = Mat4::Scale(Vector3(1.f, 1.f, 1.f)); >+ Mat4 golden(elementsExpected); >+ CheckMatrixCloseToGolden(elementsExpected, r); >+ CheckMatrixCloseToGolden(elementsExpectedVector, r); >+ CheckMat4ExactlyEq(r, golden); >+ >+ float elementsExpected2[] = { >+ 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f, 0.0f, >+ 0.0f, 0.0f, 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, >+ }; >+ >+ float elementsExpected4[] = { >+ 4.0f, 0.0f, 0.0f, 0.0f, 0.0f, 4.0f, 0.0f, 0.0f, >+ 0.0f, 0.0f, 4.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, >+ }; >+ >+ Mat4 golden2(elementsExpected2); >+ Mat4 golden4(elementsExpected4); >+ >+ Mat4 t2 = Mat4::Scale(Vector3(2.f, 2.f, 2.f)); >+ Mat4 t2t2 = t2.product(t2); >+ >+ CheckMat4ExactlyEq(t2, golden2); >+ CheckMat4ExactlyEq(t2t2, golden4); >+} >+ >+// Tests frustum matrices. >+TEST(MatrixUtilsTest, Mat4Frustum) >+{ >+ // Randomly-generated inputs, outputs using GLM. >+ std::vector<FrustumArgs> frustumGoldenInputs; >+ std::vector<std::vector<float>> frustumGoldenOutputs; >+ >+ EXPECT_EQ(frustumGoldenInputs.size(), frustumGoldenOutputs.size()); >+ >+ frustumGoldenInputs.push_back({6.5640869140625000f, 2.6196002960205078f, 7.6299438476562500f, >+ -3.5341463088989258f, 1.5971517562866211f, 3.3254327774047852f}); >+ frustumGoldenInputs.push_back({-9.4570913314819336f, -5.3334407806396484f, 0.8660326004028320f, >+ -4.5830192565917969f, -6.7980914115905762f, >+ 4.4744148254394531f}); >+ frustumGoldenInputs.push_back({1.4876422882080078f, 2.8094434738159180f, -1.6803054809570312f, >+ -0.8823823928833008f, 9.7977848052978516f, >+ -8.6204166412353516f}); >+ frustumGoldenInputs.push_back({-3.3456401824951172f, 9.8235015869140625f, 3.5869121551513672f, >+ 5.2356719970703125f, -4.0609388351440430f, 7.7973194122314453f}); >+ frustumGoldenInputs.push_back({9.5381393432617188f, 7.5244369506835938f, 3.2054557800292969f, >+ -5.9051651954650879f, -8.1114397048950195f, >+ -8.9626598358154297f}); >+ frustumGoldenInputs.push_back({4.5731735229492188f, 1.3278274536132812f, -3.2062773704528809f, >+ -7.9090023040771484f, -6.6076564788818359f, >+ 5.1205596923828125f}); >+ frustumGoldenInputs.push_back({1.2519702911376953f, 1.8767604827880859f, 2.7256736755371094f, >+ -9.6021852493286133f, -3.9267930984497070f, >+ 2.3794260025024414f}); >+ frustumGoldenInputs.push_back({-8.9887380599975586f, 6.2763042449951172f, 5.8243169784545898f, >+ 9.2890701293945312f, 1.3859443664550781f, -6.4422101974487305f}); >+ frustumGoldenInputs.push_back({5.7714862823486328f, 1.3688507080078125f, 6.2611656188964844f, >+ -8.5859031677246094f, -3.2825427055358887f, >+ -9.7015857696533203f}); >+ frustumGoldenInputs.push_back({5.4493808746337891f, 7.7383766174316406f, -1.1092796325683594f, >+ -3.6691951751708984f, -8.1641988754272461f, >+ 4.3122081756591797f}); >+ frustumGoldenInputs.push_back({-47.3135452270507812f, 1.1683349609375000f, 36.1483764648437500f, >+ -54.2228546142578125f, 76.4831085205078125f, >+ 51.5773468017578125f}); >+ frustumGoldenInputs.push_back({60.6750030517578125f, -35.2967681884765625f, >+ -32.8269577026367188f, 77.3887939453125000f, >+ 73.3114624023437500f, -54.2619438171386719f}); >+ frustumGoldenInputs.push_back({19.5157546997070312f, 1.3348083496093750f, 34.2350463867187500f, >+ -11.5907974243164062f, -6.4835968017578125f, >+ 30.2026824951171875f}); >+ frustumGoldenInputs.push_back({16.5014953613281250f, -59.4170761108398438f, >+ -22.8201065063476562f, 62.5094299316406250f, >+ -3.9552688598632812f, -76.2280197143554688f}); >+ frustumGoldenInputs.push_back({35.6607666015625000f, -49.5569000244140625f, >+ 97.1632690429687500f, 23.1938247680664062f, 18.6621780395507812f, >+ 55.2039489746093750f}); >+ frustumGoldenInputs.push_back({12.7565383911132812f, -0.8035964965820312f, 94.0040435791015625f, >+ -73.9960327148437500f, -51.3727264404296875f, >+ -21.3958053588867188f}); >+ frustumGoldenInputs.push_back({0.6055984497070312f, -21.7872161865234375f, 22.3246612548828125f, >+ 10.5279464721679688f, -56.8082237243652344f, >+ 24.1726150512695312f}); >+ frustumGoldenInputs.push_back({69.2176513671875000f, -59.0015220642089844f, >+ -38.5509605407714844f, 74.0315246582031250f, >+ 47.9032897949218750f, -89.4692459106445312f}); >+ frustumGoldenInputs.push_back({90.4153137207031250f, 10.0325012207031250f, 16.1712417602539062f, >+ -9.9705123901367188f, 25.6828689575195312f, >+ 51.8659057617187500f}); >+ frustumGoldenInputs.push_back({-89.5869369506835938f, -87.6541290283203125f, >+ -3.0015182495117188f, -46.5026855468750000f, >+ 29.3566131591796875f, -3.5230865478515625f}); >+ frustumGoldenOutputs.push_back({ >+ -0.8098147511482239f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.2861230373382568f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -2.3282337188720703f, >+ -0.3668724894523621f, >+ -2.8482546806335449f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -6.1462464332580566f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ -3.2971229553222656f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 2.4951465129852295f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -3.5867569446563721f, >+ 0.6821345686912537f, >+ 0.2061366289854050f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 5.3967552185058594f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ 14.8248996734619141f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 24.5582180023193359f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 3.2509319782257080f, >+ -3.2116978168487549f, >+ 0.0639241635799408f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -9.1714696884155273f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ -0.6167355179786682f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -4.9260525703430176f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.4918970167636871f, >+ 5.3510427474975586f, >+ -0.3150867819786072f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 5.3404870033264160f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ 8.0562448501586914f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.7806558609008789f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -8.4732360839843750f, >+ 0.2963255345821381f, >+ -20.0583839416503906f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 170.8137969970703125f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ 4.0720810890197754f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 2.8101394176483154f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -1.8182963132858276f, >+ 2.3635828495025635f, >+ 0.1267964988946915f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 5.7698287963867188f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ -12.5699577331542969f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.6370600461959839f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 5.0076503753662109f, >+ 0.5578025579452515f, >+ 0.2453716099262238f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 2.9632694721221924f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ 0.1815840899944305f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.8000248670578003f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.1776892393827438f, >+ 4.3620386123657227f, >+ -0.6459077596664429f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -2.2811365127563477f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ 1.4911717176437378f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.4421805739402771f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -1.6218323707580566f, >+ 0.1565788835287094f, >+ -2.0227515697479248f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 9.9223108291625977f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ -7.1334328651428223f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 6.3784909248352051f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 5.7613725662231445f, >+ 1.8666533231735229f, >+ 0.3087419867515564f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 5.6435680389404297f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ 3.1551213264465332f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -1.6926428079605103f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.9518032073974609f, >+ 0.2000025659799576f, >+ 5.1418004035949707f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 316.7777709960937500f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ -1.5277713537216187f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.3303264379501343f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.2644343674182892f, >+ 0.4043145775794983f, >+ 0.1493220180273056f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -62.3644447326660156f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ 0.7132298350334167f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.2829668223857880f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -1.1468359231948853f, >+ -0.4941370785236359f, >+ -0.6465383172035217f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 10.6754913330078125f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ 0.1041976660490036f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0927057415246964f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.5652843713760376f, >+ 0.4651299417018890f, >+ -1.1094539165496826f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 8.3434572219848633f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ -0.4379884898662567f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.5045915246009827f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.1630663424730301f, >+ -1.6271190643310547f, >+ -2.0214161872863770f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -56.3862075805664062f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ 7.5770230293273926f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.6115797758102417f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.8814766407012939f, >+ -0.1190952509641647f, >+ 2.4274852275848389f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -73.3338088989257812f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ 5.0737905502319336f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 9.6311941146850586f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.9459113478660583f, >+ -2.7848947048187256f, >+ 0.4030041098594666f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 33.9142799377441406f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ -0.7472094297409058f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.8509900569915771f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0796770751476288f, >+ 0.3151517212390900f, >+ -0.3025783598423004f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -62.3977890014648438f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ -0.6390139460563660f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -1.9648925065994263f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -1.2496180534362793f, >+ -0.2371963709592819f, >+ -2.9617946147918701f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -101.7502517700195312f, >+ 0.0000000000000000f, >+ }); >+ frustumGoldenOutputs.push_back({ >+ 30.3771648406982422f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -1.3496931791305542f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -91.7013320922851562f, >+ 1.1379971504211426f, >+ 0.7856983542442322f, >+ -1.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -6.2911696434020996f, >+ 0.0000000000000000f, >+ }); >+ >+ for (size_t i = 0; i < frustumGoldenInputs.size(); i++) >+ { >+ const auto &input = frustumGoldenInputs[i]; >+ const auto &output = frustumGoldenOutputs[i]; >+ Mat4 r = Mat4::Frustum(input.l, input.r, input.b, input.t, input.n, input.f); >+ CheckMatrixCloseToGolden(output, r); >+ } >+} >+ >+// Tests orthographic projection matrices. >+TEST(MatrixUtilsTest, Mat4Ortho) >+{ >+ // Randomly-generated inputs, outputs using GLM. >+ std::vector<FrustumArgs> orthoGoldenInputs; >+ std::vector<std::vector<float>> orthoGoldenOutputs; >+ >+ orthoGoldenInputs.push_back({-1.2515230178833008f, 5.6523618698120117f, -0.7427234649658203f, >+ -2.9657564163208008f, -5.4732933044433594f, -9.6416902542114258f}); >+ orthoGoldenInputs.push_back({-7.8948307037353516f, -8.4146118164062500f, -4.3893952369689941f, >+ 7.4392738342285156f, -8.1261911392211914f, 3.1107978820800781f}); >+ orthoGoldenInputs.push_back({3.1667709350585938f, 3.9134168624877930f, -7.1993961334228516f, >+ -0.2519502639770508f, 5.4625358581542969f, 8.8320560455322266f}); >+ orthoGoldenInputs.push_back({0.3597183227539062f, 5.7859621047973633f, 4.6786174774169922f, >+ -6.4736566543579102f, -2.7510557174682617f, 2.9977531433105469f}); >+ orthoGoldenInputs.push_back({3.2480134963989258f, 9.3551750183105469f, -7.5922241210937500f, >+ -2.5135083198547363f, -4.5282001495361328f, -5.4564580917358398f}); >+ orthoGoldenInputs.push_back({-6.6918325424194336f, -9.6249752044677734f, -6.9591665267944336f, >+ -2.7099137306213379f, -5.5196690559387207f, -9.0791969299316406f}); >+ orthoGoldenInputs.push_back({5.9386453628540039f, -9.1784019470214844f, -1.4078102111816406f, >+ -1.0552892684936523f, 3.7563705444335938f, -6.6715431213378906f}); >+ orthoGoldenInputs.push_back({-8.6238059997558594f, -0.2995386123657227f, 5.6623821258544922f, >+ 7.6483421325683594f, 5.6686410903930664f, -7.1456899642944336f}); >+ orthoGoldenInputs.push_back({2.3857555389404297f, -2.6020836830139160f, 6.7841358184814453f, >+ 0.9868297576904297f, 5.6463518142700195f, -1.7597074508666992f}); >+ orthoGoldenInputs.push_back({4.6028537750244141f, 0.1757516860961914f, -6.1434607505798340f, >+ 6.8524093627929688f, 8.4380626678466797f, -1.4824752807617188f}); >+ orthoGoldenInputs.push_back({40.3382720947265625f, -34.5338973999023438f, -11.1726379394531250f, >+ 21.4206924438476562f, 17.5087890625000000f, 70.2734069824218750f}); >+ orthoGoldenInputs.push_back({85.2872314453125000f, 22.3899002075195312f, -92.8537139892578125f, >+ 7.6059341430664062f, 32.9500732421875000f, -8.1374511718750000f}); >+ orthoGoldenInputs.push_back({33.8771057128906250f, -27.6973648071289062f, 90.3841094970703125f, >+ 85.8473358154296875f, 36.0423278808593750f, >+ -36.5140991210937500f}); >+ orthoGoldenInputs.push_back({-92.4729461669921875f, 7.1592102050781250f, -75.2177963256835938f, >+ 14.4945983886718750f, 10.6297378540039062f, 53.9828796386718750f}); >+ orthoGoldenInputs.push_back({90.2037658691406250f, 54.5332946777343750f, -58.9839515686035156f, >+ 56.7301330566406250f, 63.2403869628906250f, 81.1043853759765625f}); >+ orthoGoldenInputs.push_back({-78.6419067382812500f, 65.5156250000000000f, -78.8265304565429688f, >+ -37.5036048889160156f, 76.9322204589843750f, >+ -0.2213287353515625f}); >+ orthoGoldenInputs.push_back({80.1368560791015625f, 60.2946777343750000f, -27.3523788452148438f, >+ 88.5419616699218750f, -75.3445968627929688f, >+ 83.3852081298828125f}); >+ orthoGoldenInputs.push_back({55.0712585449218750f, -17.4033813476562500f, -98.6088104248046875f, >+ 81.6600952148437500f, 61.1217803955078125f, 73.5973815917968750f}); >+ orthoGoldenInputs.push_back({-48.7522583007812500f, 20.8100433349609375f, -45.6365356445312500f, >+ -13.2819519042968750f, -29.7577133178710938f, >+ 62.1014862060546875f}); >+ orthoGoldenInputs.push_back({-60.3634567260742188f, 71.4023284912109375f, 59.0719757080078125f, >+ 22.6195831298828125f, -32.6802139282226562f, >+ -56.3766899108886719f}); >+ orthoGoldenOutputs.push_back({ >+ 0.2896919548511505f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.8996717929840088f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.4798007607460022f, >+ 0.0000000000000000f, >+ -0.6374438405036926f, >+ -1.6682072877883911f, >+ -3.6260902881622314f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ -3.8477735519409180f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.1690807342529297f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.1779836267232895f, >+ 0.0000000000000000f, >+ -31.3775196075439453f, >+ -0.2578378617763519f, >+ 0.4463289380073547f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ 2.6786458492279053f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.2878755927085876f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.5935563445091248f, >+ 0.0000000000000000f, >+ -9.4826574325561523f, >+ 1.0725302696228027f, >+ -4.2423224449157715f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ 0.3685790896415710f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.1793356239795685f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.3478981554508209f, >+ 0.0000000000000000f, >+ -1.1325846910476685f, >+ -0.1609572321176529f, >+ -0.0429127886891365f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ 0.3274843692779541f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.3938003480434418f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 2.1545734405517578f, >+ 0.0000000000000000f, >+ -2.0636737346649170f, >+ 1.9898203611373901f, >+ -10.7563400268554688f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ -0.6818625330924988f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.4706709980964661f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.5618722438812256f, >+ 0.0000000000000000f, >+ -5.5629096031188965f, >+ 2.2754778861999512f, >+ -4.1013488769531250f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ -0.1323009729385376f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 5.6734218597412109f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.1917929202318192f, >+ 0.0000000000000000f, >+ -0.2143114656209946f, >+ 6.9871010780334473f, >+ -0.2795547246932983f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ 0.2402613908052444f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0070695877075195f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.1560752540826797f, >+ 0.0000000000000000f, >+ 1.0719676017761230f, >+ -6.7024130821228027f, >+ -0.1152653917670250f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ -0.4009752273559570f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.3449878096580505f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.2700491547584534f, >+ 0.0000000000000000f, >+ -0.0433711148798466f, >+ 1.3404442071914673f, >+ 0.5247924923896790f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ -0.4517627954483032f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.1538950353860855f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.2016019672155380f, >+ 0.0000000000000000f, >+ 1.0793980360031128f, >+ -0.0545518361032009f, >+ 0.7011300325393677f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ -0.0267121959477663f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0613622479140759f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0379041880369186f, >+ 0.0000000000000000f, >+ 0.0775237977504730f, >+ -0.3144218325614929f, >+ -1.6636564731597900f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ -0.0317978523671627f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0199084915220737f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0486765764653683f, >+ 0.0000000000000000f, >+ 1.7119507789611816f, >+ 0.8485773205757141f, >+ 0.6038967370986938f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ -0.0324809923768044f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.4408419132232666f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0275647528469563f, >+ 0.0000000000000000f, >+ 0.1003620624542236f, >+ 38.8451042175292969f, >+ -0.0065021286718547f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ 0.0200738403946161f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0222934633493423f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0461327582597733f, >+ 0.0000000000000000f, >+ 0.8562871813774109f, >+ 0.6768652200698853f, >+ -1.4903790950775146f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ -0.0560687854886055f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0172839816659689f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.1119570210576057f, >+ 0.0000000000000000f, >+ 4.0576157569885254f, >+ 0.0194774791598320f, >+ -8.0802049636840820f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ 0.0138737112283707f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0483992844820023f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0259223338216543f, >+ 0.0000000000000000f, >+ 0.0910551249980927f, >+ 2.8151476383209229f, >+ 0.9942626357078552f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ -0.1007953882217407f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0172570981085300f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0126000288873911f, >+ 0.0000000000000000f, >+ 7.0774250030517578f, >+ -0.5279772877693176f, >+ -0.0506559647619724f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ -0.0275958590209484f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0110945366322994f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.1603129208087921f, >+ 0.0000000000000000f, >+ 0.5197387337684631f, >+ 0.0940190702676773f, >+ -10.7986106872558594f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ 0.0287512056529522f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0618150420486927f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0217724516987801f, >+ 0.0000000000000000f, >+ 0.4016861617565155f, >+ 1.8210244178771973f, >+ -0.3521016240119934f, >+ 1.0000000000000000f, >+ }); >+ orthoGoldenOutputs.push_back({ >+ 0.0151784475892782f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0548660829663277f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0844007357954979f, >+ 0.0000000000000000f, >+ -0.0837764739990234f, >+ 2.2410478591918945f, >+ -3.7582340240478516f, >+ 1.0000000000000000f, >+ }); >+ >+ EXPECT_EQ(orthoGoldenInputs.size(), orthoGoldenOutputs.size()); >+ >+ for (size_t i = 0; i < orthoGoldenInputs.size(); i++) >+ { >+ const auto &input = orthoGoldenInputs[i]; >+ const auto &output = orthoGoldenOutputs[i]; >+ Mat4 r = Mat4::Ortho(input.l, input.r, input.b, input.t, input.n, input.f); >+ CheckMatrixCloseToGolden(output, r); >+ } >+} >+ >+// Tests for inverse transpose of mat4, which is a frequent operation done to >+// the modelview matrix, for things such as transformation of normals. >+TEST(MatrixUtilsTest, Mat4InvTr) >+{ >+ >+ std::vector<std::vector<float>> invTrInputs; >+ std::vector<std::vector<float>> invTrOutputs; >+ invTrInputs.push_back({ >+ 0.3247877955436707f, >+ -0.8279561400413513f, >+ 0.4571666717529297f, >+ 0.0000000000000000f, >+ 0.9041201472282410f, >+ 0.1299063563346863f, >+ -0.4070515632629395f, >+ 0.0000000000000000f, >+ 0.2776319682598114f, >+ 0.5455390810966492f, >+ 0.7907638549804688f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ -0.8843839168548584f, >+ 0.3047805428504944f, >+ -0.3535164594650269f, >+ 0.0000000000000000f, >+ 0.4647803902626038f, >+ 0.6447106003761292f, >+ -0.6068999171257019f, >+ 0.0000000000000000f, >+ 0.0429445058107376f, >+ -0.7010400891304016f, >+ -0.7118276357650757f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ -0.4487786889076233f, >+ 0.8632985353469849f, >+ 0.2308966517448425f, >+ 0.0000000000000000f, >+ -0.5765564441680908f, >+ -0.0823006033897400f, >+ -0.8129017353057861f, >+ -0.0000000000000000f, >+ -0.6827739477157593f, >+ -0.4979379475116730f, >+ 0.5346751213073730f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ 0.9865614175796509f, >+ 0.0901400744915009f, >+ -0.1362765878438950f, >+ 0.0000000000000000f, >+ 0.0155128352344036f, >+ 0.7786107659339905f, >+ 0.6273153424263000f, >+ 0.0000000000000000f, >+ 0.1626526862382889f, >+ -0.6209991574287415f, >+ 0.7667490243911743f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ -0.5566663742065430f, >+ 0.8302737474441528f, >+ -0.0277124047279358f, >+ 0.0000000000000000f, >+ -0.0281167924404144f, >+ 0.0145094990730286f, >+ 0.9994993209838867f, >+ 0.0000000000000000f, >+ 0.8302601575851440f, >+ 0.5571669340133667f, >+ 0.0152677297592163f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ 0.4160673320293427f, >+ -0.9093281030654907f, >+ 0.0032218396663666f, >+ 0.0000000000000000f, >+ -0.1397584974765778f, >+ -0.0674473643302917f, >+ -0.9878858327865601f, >+ -0.0000000000000000f, >+ 0.8985296487808228f, >+ 0.4105767309665680f, >+ -0.1551489830017090f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ 0.9039891958236694f, >+ -0.3967807590961456f, >+ -0.1592751741409302f, >+ 0.0000000000000000f, >+ 0.4139676988124847f, >+ 0.9054293632507324f, >+ 0.0939593166112900f, >+ 0.0000000000000000f, >+ 0.1069311797618866f, >+ -0.1508729904890060f, >+ 0.9827527999877930f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ 0.3662135303020477f, >+ 0.2184857577085495f, >+ 0.9045174121856689f, >+ 0.0000000000000000f, >+ -0.6651677489280701f, >+ 0.7412178516387939f, >+ 0.0902667641639709f, >+ 0.0000000000000000f, >+ -0.6507223844528198f, >+ -0.6347126960754395f, >+ 0.4167736768722534f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ 0.3791426718235016f, >+ 0.7277372479438782f, >+ -0.5715323686599731f, >+ 0.0000000000000000f, >+ -0.3511379361152649f, >+ 0.6845993995666504f, >+ 0.6387689113616943f, >+ 0.0000000000000000f, >+ 0.8561266660690308f, >+ -0.0414978563785553f, >+ 0.5150970220565796f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ -0.6766842603683472f, >+ -0.0953263640403748f, >+ -0.7300762534141541f, >+ -0.0000000000000000f, >+ -0.5922094583511353f, >+ 0.6596454977989197f, >+ 0.4627699255943298f, >+ 0.0000000000000000f, >+ 0.4374772906303406f, >+ 0.7455072402954102f, >+ -0.5028247833251953f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ 0.8012667894363403f, >+ -0.5429225564002991f, >+ 0.2514090538024902f, >+ 0.0000000000000000f, >+ 0.3384204804897308f, >+ 0.7577887773513794f, >+ 0.5578778386116028f, >+ 0.0000000000000000f, >+ -0.4933994412422180f, >+ -0.3619270324707031f, >+ 0.7909271121025085f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ 0.6100972890853882f, >+ 0.4051006734371185f, >+ 0.6809366941452026f, >+ 0.0000000000000000f, >+ -0.6470826864242554f, >+ 0.7507012486457825f, >+ 0.1331603974103928f, >+ 0.0000000000000000f, >+ -0.4572366476058960f, >+ -0.5218631625175476f, >+ 0.7201343774795532f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ 0.6304160356521606f, >+ 0.2796489298343658f, >+ -0.7241353392601013f, >+ 0.0000000000000000f, >+ 0.3735889792442322f, >+ 0.7084143161773682f, >+ 0.5988158583641052f, >+ 0.0000000000000000f, >+ 0.6804460883140564f, >+ -0.6480321288108826f, >+ 0.3421219885349274f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ -0.2888220548629761f, >+ 0.9278694987297058f, >+ -0.2358816564083099f, >+ 0.0000000000000000f, >+ 0.8899697065353394f, >+ 0.1693908572196960f, >+ -0.4233919680118561f, >+ 0.0000000000000000f, >+ -0.3528962731361389f, >+ -0.3322124481201172f, >+ -0.8746994137763977f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ 0.7878623008728027f, >+ 0.2866843938827515f, >+ 0.5450551509857178f, >+ 0.0000000000000000f, >+ -0.5206709504127502f, >+ 0.7827371954917908f, >+ 0.3409168124198914f, >+ 0.0000000000000000f, >+ -0.3288993835449219f, >+ -0.5523898601531982f, >+ 0.7659573554992676f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ -0.3225378990173340f, >+ 0.9464974999427795f, >+ 0.0105716586112976f, >+ 0.0000000000000000f, >+ -0.4923008084297180f, >+ -0.1582012772560120f, >+ -0.8559277057647705f, >+ -0.0000000000000000f, >+ -0.8084610104560852f, >+ -0.2812736034393311f, >+ 0.5169874429702759f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ 0.3137793838977814f, >+ 0.3656709790229797f, >+ 0.8762575387954712f, >+ 0.0000000000000000f, >+ 0.8767655491828918f, >+ 0.2426431477069855f, >+ -0.4152186512947083f, >+ 0.0000000000000000f, >+ -0.3644512593746185f, >+ 0.8985595107078552f, >+ -0.2444712668657303f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ 0.8862395882606506f, >+ -0.3831786513328552f, >+ 0.2602950036525726f, >+ 0.0000000000000000f, >+ 0.4416945576667786f, >+ 0.8683440685272217f, >+ -0.2255758643150330f, >+ 0.0000000000000000f, >+ -0.1395897567272186f, >+ 0.3148851394653320f, >+ 0.9388087987899780f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ 0.4614841341972351f, >+ -0.8635553717613220f, >+ -0.2032356113195419f, >+ 0.0000000000000000f, >+ -0.7492366433143616f, >+ -0.5020523071289062f, >+ 0.4319583475589752f, >+ 0.0000000000000000f, >+ -0.4750548601150513f, >+ -0.0470703244209290f, >+ -0.8786963224411011f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrInputs.push_back({ >+ 0.7327640056610107f, >+ -0.5076418519020081f, >+ 0.4531629979610443f, >+ 0.0000000000000000f, >+ -0.0702797919511795f, >+ 0.6059250831604004f, >+ 0.7924112081527710f, >+ 0.0000000000000000f, >+ -0.6768439412117004f, >+ -0.6124986410140991f, >+ 0.4083231091499329f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ 0.3247878849506378f, >+ -0.8279562592506409f, >+ 0.4571668505668640f, >+ -0.0000000000000000f, >+ 0.9041203260421753f, >+ 0.1299064010381699f, >+ -0.4070515930652618f, >+ 0.0000000000000000f, >+ 0.2776320576667786f, >+ 0.5455390810966492f, >+ 0.7907639741897583f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ -0.8843840360641479f, >+ 0.3047805130481720f, >+ -0.3535164594650269f, >+ -0.0000000000000000f, >+ 0.4647804200649261f, >+ 0.6447105407714844f, >+ -0.6068999171257019f, >+ -0.0000000000000000f, >+ 0.0429445207118988f, >+ -0.7010400891304016f, >+ -0.7118277549743652f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ -0.4487787485122681f, >+ 0.8632985949516296f, >+ 0.2308966219425201f, >+ -0.0000000000000000f, >+ -0.5765565037727356f, >+ -0.0823005959391594f, >+ -0.8129017353057861f, >+ 0.0000000000000000f, >+ -0.6827740073204041f, >+ -0.4979379475116730f, >+ 0.5346751213073730f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ 0.9865614175796509f, >+ 0.0901400819420815f, >+ -0.1362766027450562f, >+ -0.0000000000000000f, >+ 0.0155128324404359f, >+ 0.7786108255386353f, >+ 0.6273154020309448f, >+ -0.0000000000000000f, >+ 0.1626526862382889f, >+ -0.6209992170333862f, >+ 0.7667490839958191f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ -0.5566664934158325f, >+ 0.8302738070487976f, >+ -0.0277124084532261f, >+ -0.0000000000000000f, >+ -0.0281168315559626f, >+ 0.0145094739273190f, >+ 0.9994993805885315f, >+ -0.0000000000000000f, >+ 0.8302602171897888f, >+ 0.5571669340133667f, >+ 0.0152676850557327f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ 0.4160673320293427f, >+ -0.9093281030654907f, >+ 0.0032218731939793f, >+ -0.0000000000000000f, >+ -0.1397585272789001f, >+ -0.0674473419785500f, >+ -0.9878858327865601f, >+ 0.0000000000000000f, >+ 0.8985296487808228f, >+ 0.4105767309665680f, >+ -0.1551489681005478f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ 0.9039891958236694f, >+ -0.3967807590961456f, >+ -0.1592751741409302f, >+ -0.0000000000000000f, >+ 0.4139677286148071f, >+ 0.9054294228553772f, >+ 0.0939593166112900f, >+ 0.0000000000000000f, >+ 0.1069311797618866f, >+ -0.1508729755878448f, >+ 0.9827527999877930f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ 0.3662134706974030f, >+ 0.2184857726097107f, >+ 0.9045172333717346f, >+ -0.0000000000000000f, >+ -0.6651675701141357f, >+ 0.7412176728248596f, >+ 0.0902667865157127f, >+ 0.0000000000000000f, >+ -0.6507222652435303f, >+ -0.6347125172615051f, >+ 0.4167735874652863f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ 0.3791427314281464f, >+ 0.7277373671531677f, >+ -0.5715324282646179f, >+ -0.0000000000000000f, >+ -0.3511379957199097f, >+ 0.6845995187759399f, >+ 0.6387690305709839f, >+ -0.0000000000000000f, >+ 0.8561268448829651f, >+ -0.0414978675544262f, >+ 0.5150971412658691f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ -0.6766842603683472f, >+ -0.0953262373805046f, >+ -0.7300761342048645f, >+ -0.0000000000000000f, >+ -0.5922094583511353f, >+ 0.6596452593803406f, >+ 0.4627698063850403f, >+ 0.0000000000000000f, >+ 0.4374772608280182f, >+ 0.7455070018768311f, >+ -0.5028247833251953f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ 0.8012669086456299f, >+ -0.5429226160049438f, >+ 0.2514090836048126f, >+ -0.0000000000000000f, >+ 0.3384204804897308f, >+ 0.7577888369560242f, >+ 0.5578778982162476f, >+ 0.0000000000000000f, >+ -0.4933995306491852f, >+ -0.3619270920753479f, >+ 0.7909271717071533f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ 0.6100972294807434f, >+ 0.4051006138324738f, >+ 0.6809366941452026f, >+ -0.0000000000000000f, >+ -0.6470826268196106f, >+ 0.7507011294364929f, >+ 0.1331604123115540f, >+ 0.0000000000000000f, >+ -0.4572366178035736f, >+ -0.5218631029129028f, >+ 0.7201343774795532f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ 0.6304160952568054f, >+ 0.2796489298343658f, >+ -0.7241354584693909f, >+ -0.0000000000000000f, >+ 0.3735889494419098f, >+ 0.7084143161773682f, >+ 0.5988159179687500f, >+ -0.0000000000000000f, >+ 0.6804461479187012f, >+ -0.6480321288108826f, >+ 0.3421220481395721f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ -0.2888221442699432f, >+ 0.9278693199157715f, >+ -0.2358815670013428f, >+ -0.0000000000000000f, >+ 0.8899695873260498f, >+ 0.1693906933069229f, >+ -0.4233919084072113f, >+ -0.0000000000000000f, >+ -0.3528962433338165f, >+ -0.3322124481201172f, >+ -0.8746994137763977f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ 0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ 0.7878623008728027f, >+ 0.2866844236850739f, >+ 0.5450551509857178f, >+ -0.0000000000000000f, >+ -0.5206709504127502f, >+ 0.7827371954917908f, >+ 0.3409168422222137f, >+ 0.0000000000000000f, >+ -0.3288994133472443f, >+ -0.5523898601531982f, >+ 0.7659573554992676f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ -0.3225379288196564f, >+ 0.9464974999427795f, >+ 0.0105716586112976f, >+ -0.0000000000000000f, >+ -0.4923008382320404f, >+ -0.1582012772560120f, >+ -0.8559277057647705f, >+ 0.0000000000000000f, >+ -0.8084610104560852f, >+ -0.2812735736370087f, >+ 0.5169873833656311f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ 0.3137793540954590f, >+ 0.3656708896160126f, >+ 0.8762574791908264f, >+ -0.0000000000000000f, >+ 0.8767654895782471f, >+ 0.2426430881023407f, >+ -0.4152186512947083f, >+ 0.0000000000000000f, >+ -0.3644512593746185f, >+ 0.8985593318939209f, >+ -0.2444712817668915f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ 0.8862395882606506f, >+ -0.3831786811351776f, >+ 0.2602950334548950f, >+ -0.0000000000000000f, >+ 0.4416945576667786f, >+ 0.8683440685272217f, >+ -0.2255758792161942f, >+ 0.0000000000000000f, >+ -0.1395897865295410f, >+ 0.3148851692676544f, >+ 0.9388088583946228f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ 0.4614838957786560f, >+ -0.8635552525520325f, >+ -0.2032355368137360f, >+ -0.0000000000000000f, >+ -0.7492365241050720f, >+ -0.5020524263381958f, >+ 0.4319583177566528f, >+ 0.0000000000000000f, >+ -0.4750548005104065f, >+ -0.0470703467726707f, >+ -0.8786963820457458f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ invTrOutputs.push_back({ >+ 0.7327639460563660f, >+ -0.5076418519020081f, >+ 0.4531629383563995f, >+ -0.0000000000000000f, >+ -0.0702798143029213f, >+ 0.6059250235557556f, >+ 0.7924111485481262f, >+ 0.0000000000000000f, >+ -0.6768438220024109f, >+ -0.6124985218048096f, >+ 0.4083230793476105f, >+ -0.0000000000000000f, >+ -0.0000000000000000f, >+ 0.0000000000000000f, >+ -0.0000000000000000f, >+ 1.0000000000000000f, >+ }); >+ >+ EXPECT_EQ(invTrInputs.size(), invTrInputs.size()); >+ >+ for (size_t i = 0; i < invTrInputs.size(); i++) >+ { >+ Mat4 a(invTrInputs[i]); >+ CheckMatrixCloseToGolden(invTrOutputs[i], a.transpose().inverse()); >+ } >+} >+ >+// Tests mat4 matrix/matrix multiplication by multiplying two translation matrices. >+TEST(MatrixUtilsTest, Mat4Mult) >+{ >+ Mat4 a, b; >+ CheckMatrixCloseToGolden(a.data(), a.product(b)); >+ >+ Mat4 r = Mat4::Translate(Vector3(1.f, 1.f, 1.f)); >+ CheckMatrixCloseToGolden(r.data(), a.product(r)); >+ >+ Mat4 s = Mat4::Translate(Vector3(2.f, 2.f, 2.f)); >+ Mat4 t = r.product(r); >+ CheckMatrixCloseToGolden(s.data(), t); >+} >+ >+// Tests exact equality. >+TEST(MatrixUtilsTest, ExactEquality) >+{ >+ Mat4 a, b; >+ EXPECT_EQ(a, b); >+ Mat4 c; >+ c(0, 0) += 0.000001f; >+ EXPECT_NE(a, c); >+} >+ >+// Tests near equality. >+TEST(MatrixUtilsTest, NearEquality) >+{ >+ Mat4 a, b; >+ >+ float *bData = b.data(); >+ for (int i = 0; i < 16; i++) >+ { >+ bData[i] += 0.09f; >+ } >+ >+ EXPECT_TRUE(a.nearlyEqual(0.1f, b)); >+ >+ for (int i = 0; i < 16; i++) >+ { >+ bData[i] -= 2 * 0.09f; >+ } >+ >+ EXPECT_TRUE(a.nearlyEqual(0.1f, b)); > } > >+} // namespace >diff --git a/Source/ThirdParty/ANGLE/src/common/packed_egl_enums.json b/Source/ThirdParty/ANGLE/src/common/packed_egl_enums.json >new file mode 100644 >index 00000000000..ec22d1a0d9f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/packed_egl_enums.json >@@ -0,0 +1,43 @@ >+{ >+ "TextureFormat": >+ { >+ "NoTexture": "EGL_NO_TEXTURE", >+ "RGB": "EGL_TEXTURE_RGB", >+ "RGBA": "EGL_TEXTURE_RGBA" >+ }, >+ "ObjectType": >+ { >+ "Thread": "EGL_OBJECT_THREAD_KHR", >+ "Display": "EGL_OBJECT_DISPLAY_KHR", >+ "Context": "EGL_OBJECT_CONTEXT_KHR", >+ "Surface": "EGL_OBJECT_SURFACE_KHR", >+ "Image": "EGL_OBJECT_IMAGE_KHR", >+ "Sync": "EGL_OBJECT_SYNC_KHR", >+ "Stream": "EGL_OBJECT_STREAM_KHR" >+ }, >+ "MessageType": >+ { >+ "Critical": "EGL_DEBUG_MSG_CRITICAL_KHR", >+ "Error": "EGL_DEBUG_MSG_ERROR_KHR", >+ "Warn": "EGL_DEBUG_MSG_WARN_KHR", >+ "Info": "EGL_DEBUG_MSG_INFO_KHR" >+ }, >+ "CompositorTiming": >+ { >+ "CompositeDeadline": "EGL_COMPOSITE_DEADLINE_ANDROID", >+ "CompositInterval": "EGL_COMPOSITE_INTERVAL_ANDROID", >+ "CompositToPresentLatency": "EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID" >+ }, >+ "Timestamp": >+ { >+ "RequestedPresentTime": "EGL_REQUESTED_PRESENT_TIME_ANDROID", >+ "RenderingCompleteTime": "EGL_RENDERING_COMPLETE_TIME_ANDROID", >+ "CompositionLatchTime": "EGL_COMPOSITION_LATCH_TIME_ANDROID", >+ "FirstCompositionStartTime": "EGL_FIRST_COMPOSITION_START_TIME_ANDROID", >+ "LastCompositionStartTime": "EGL_LAST_COMPOSITION_START_TIME_ANDROID", >+ "FirstCompositionGPUFinishedTime": "EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID", >+ "DisplayPresentTime": "EGL_DISPLAY_PRESENT_TIME_ANDROID", >+ "DequeueReadyTime": "EGL_DEQUEUE_READY_TIME_ANDROID", >+ "ReadsDoneTime": "EGL_READS_DONE_TIME_ANDROID" >+ } >+} >diff --git a/Source/ThirdParty/ANGLE/src/common/packed_gl_enums.json b/Source/ThirdParty/ANGLE/src/common/packed_gl_enums.json >new file mode 100644 >index 00000000000..0cff012e375 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/packed_gl_enums.json >@@ -0,0 +1,270 @@ >+{ >+ "AlphaTestFunc": >+ { >+ "AlwaysPass": "GL_ALWAYS", >+ "Equal": "GL_EQUAL", >+ "Gequal": "GL_GEQUAL", >+ "Greater": "GL_GREATER", >+ "Lequal": "GL_LEQUAL", >+ "Less": "GL_LESS", >+ "Never": "GL_NEVER", >+ "NotEqual": "GL_NOTEQUAL" >+ }, >+ "BufferBinding": >+ { >+ "Array": "GL_ARRAY_BUFFER", >+ "AtomicCounter": "GL_ATOMIC_COUNTER_BUFFER", >+ "CopyRead": "GL_COPY_READ_BUFFER", >+ "CopyWrite": "GL_COPY_WRITE_BUFFER", >+ "DispatchIndirect": "GL_DISPATCH_INDIRECT_BUFFER", >+ "DrawIndirect": "GL_DRAW_INDIRECT_BUFFER", >+ "ElementArray": "GL_ELEMENT_ARRAY_BUFFER", >+ "PixelPack": "GL_PIXEL_PACK_BUFFER", >+ "PixelUnpack": "GL_PIXEL_UNPACK_BUFFER", >+ "ShaderStorage": "GL_SHADER_STORAGE_BUFFER", >+ "TransformFeedback": "GL_TRANSFORM_FEEDBACK_BUFFER", >+ "Uniform": "GL_UNIFORM_BUFFER" >+ }, >+ "BufferUsage": >+ { >+ "DynamicCopy": "GL_DYNAMIC_COPY", >+ "DynamicDraw": "GL_DYNAMIC_DRAW", >+ "DynamicRead": "GL_DYNAMIC_READ", >+ "StaticCopy": "GL_STATIC_COPY", >+ "StaticDraw": "GL_STATIC_DRAW", >+ "StaticRead": "GL_STATIC_READ", >+ "StreamCopy": "GL_STREAM_COPY", >+ "StreamDraw": "GL_STREAM_DRAW", >+ "StreamRead": "GL_STREAM_READ" >+ }, >+ "ClientVertexArrayType": >+ { >+ "Color": "GL_COLOR_ARRAY", >+ "Normal": "GL_NORMAL_ARRAY", >+ "PointSize": "GL_POINT_SIZE_ARRAY_OES", >+ "TextureCoord": "GL_TEXTURE_COORD_ARRAY", >+ "Vertex": "GL_VERTEX_ARRAY" >+ }, >+ "CullFaceMode": >+ { >+ "Back": "GL_BACK", >+ "Front": "GL_FRONT", >+ "FrontAndBack": "GL_FRONT_AND_BACK" >+ }, >+ "FogMode": >+ { >+ "Exp": "GL_EXP", >+ "Exp2": "GL_EXP2", >+ "Linear": "GL_LINEAR" >+ }, >+ "GraphicsResetStatus": >+ { >+ "NoError": "GL_NO_ERROR", >+ "GuiltyContextReset": "GL_GUILTY_CONTEXT_RESET", >+ "InnocentContextReset": "GL_INNOCENT_CONTEXT_RESET", >+ "UnknownContextReset": "GL_UNKNOWN_CONTEXT_RESET" >+ }, >+ "HintSetting": >+ { >+ "DontCare": "GL_DONT_CARE", >+ "Fastest": "GL_FASTEST", >+ "Nicest": "GL_NICEST" >+ }, >+ "LogicalOperation": >+ { >+ "And": "GL_AND", >+ "AndInverted": "GL_AND_INVERTED", >+ "AndReverse": "GL_AND_REVERSE", >+ "Clear": "GL_CLEAR", >+ "Copy": "GL_COPY", >+ "CopyInverted": "GL_COPY_INVERTED", >+ "Equiv": "GL_EQUIV", >+ "Invert": "GL_INVERT", >+ "Nand": "GL_NAND", >+ "Noop": "GL_NOOP", >+ "Nor": "GL_NOR", >+ "Or": "GL_OR", >+ "OrInverted": "GL_OR_INVERTED", >+ "OrReverse": "GL_OR_REVERSE", >+ "Set": "GL_SET", >+ "Xor": "GL_XOR" >+ }, >+ "MatrixType": >+ { >+ "Modelview": "GL_MODELVIEW", >+ "Projection": "GL_PROJECTION", >+ "Texture": "GL_TEXTURE" >+ }, >+ "QueryType": >+ { >+ "AnySamples": "GL_ANY_SAMPLES_PASSED", >+ "AnySamplesConservative": "GL_ANY_SAMPLES_PASSED_CONSERVATIVE", >+ "CommandsCompleted": "GL_COMMANDS_COMPLETED_CHROMIUM", >+ "PrimitivesGenerated": "GL_PRIMITIVES_GENERATED_EXT", >+ "TimeElapsed": "GL_TIME_ELAPSED_EXT", >+ "Timestamp": "GL_TIMESTAMP_EXT", >+ "TransformFeedbackPrimitivesWritten": "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN" >+ }, >+ "ShaderType": >+ { >+ "Vertex": "GL_VERTEX_SHADER", >+ "Fragment": "GL_FRAGMENT_SHADER", >+ "Geometry": "GL_GEOMETRY_SHADER_EXT", >+ "Compute": "GL_COMPUTE_SHADER" >+ }, >+ "ShadingModel": >+ { >+ "Flat": "GL_FLAT", >+ "Smooth": "GL_SMOOTH" >+ }, >+ "TextureCombine": >+ { >+ "Add": "GL_ADD", >+ "AddSigned": "GL_ADD_SIGNED", >+ "Dot3Rgb": "GL_DOT3_RGB", >+ "Dot3Rgba": "GL_DOT3_RGBA", >+ "Interpolate": "GL_INTERPOLATE", >+ "Modulate": "GL_MODULATE", >+ "Replace": "GL_REPLACE", >+ "Subtract": "GL_SUBTRACT" >+ }, >+ "TextureEnvMode": >+ { >+ "Add": "GL_ADD", >+ "Blend": "GL_BLEND", >+ "Combine": "GL_COMBINE", >+ "Decal": "GL_DECAL", >+ "Modulate": "GL_MODULATE", >+ "Replace": "GL_REPLACE" >+ }, >+ "TextureEnvTarget": >+ { >+ "Env": "GL_TEXTURE_ENV", >+ "PointSprite": "GL_POINT_SPRITE_OES" >+ }, >+ "TextureEnvParameter": >+ { >+ "Mode": "GL_TEXTURE_ENV_MODE", >+ "Color": "GL_TEXTURE_ENV_COLOR", >+ "CombineRgb": "GL_COMBINE_RGB", >+ "CombineAlpha": "GL_COMBINE_ALPHA", >+ "RgbScale": "GL_RGB_SCALE", >+ "AlphaScale": "GL_ALPHA_SCALE", >+ "Src0Rgb": "GL_SRC0_RGB", >+ "Src1Rgb": "GL_SRC1_RGB", >+ "Src2Rgb": "GL_SRC2_RGB", >+ "Src0Alpha": "GL_SRC0_ALPHA", >+ "Src1Alpha": "GL_SRC1_ALPHA", >+ "Src2Alpha": "GL_SRC2_ALPHA", >+ "Op0Rgb": "GL_OPERAND0_RGB", >+ "Op1Rgb": "GL_OPERAND1_RGB", >+ "Op2Rgb": "GL_OPERAND2_RGB", >+ "Op0Alpha": "GL_OPERAND0_ALPHA", >+ "Op1Alpha": "GL_OPERAND1_ALPHA", >+ "Op2Alpha": "GL_OPERAND2_ALPHA", >+ "PointCoordReplace": "GL_COORD_REPLACE_OES" >+ }, >+ "TextureOp": >+ { >+ "OneMinusSrcAlpha": "GL_ONE_MINUS_SRC_ALPHA", >+ "OneMinusSrcColor": "GL_ONE_MINUS_SRC_COLOR", >+ "SrcAlpha": "GL_SRC_ALPHA", >+ "SrcColor": "GL_SRC_COLOR" >+ }, >+ "TextureSrc": >+ { >+ "Constant": "GL_CONSTANT", >+ "Previous": "GL_PREVIOUS", >+ "PrimaryColor": "GL_PRIMARY_COLOR", >+ "Texture": "GL_TEXTURE" >+ }, >+ "TextureType": >+ { >+ "_2D": "GL_TEXTURE_2D", >+ "_2DArray": "GL_TEXTURE_2D_ARRAY", >+ "_2DMultisample": "GL_TEXTURE_2D_MULTISAMPLE", >+ "_2DMultisampleArray": "GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES", >+ "_3D": "GL_TEXTURE_3D", >+ "External": "GL_TEXTURE_EXTERNAL_OES", >+ "Rectangle": "GL_TEXTURE_RECTANGLE_ANGLE", >+ "CubeMap": "GL_TEXTURE_CUBE_MAP" >+ }, >+ "TextureTarget": >+ { >+ "_2D": "GL_TEXTURE_2D", >+ "_2DArray": "GL_TEXTURE_2D_ARRAY", >+ "_2DMultisample": "GL_TEXTURE_2D_MULTISAMPLE", >+ "_2DMultisampleArray": "GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES", >+ "_3D": "GL_TEXTURE_3D", >+ "External": "GL_TEXTURE_EXTERNAL_OES", >+ "Rectangle": "GL_TEXTURE_RECTANGLE_ANGLE", >+ "CubeMapPositiveX": "GL_TEXTURE_CUBE_MAP_POSITIVE_X", >+ "CubeMapNegativeX": "GL_TEXTURE_CUBE_MAP_NEGATIVE_X", >+ "CubeMapPositiveY": "GL_TEXTURE_CUBE_MAP_POSITIVE_Y", >+ "CubeMapNegativeY": "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y", >+ "CubeMapPositiveZ": "GL_TEXTURE_CUBE_MAP_POSITIVE_Z", >+ "CubeMapNegativeZ": "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z" >+ }, >+ "VertexArrayType": >+ { >+ "Color": "GL_COLOR_ARRAY", >+ "Normal": "GL_NORMAL_ARRAY", >+ "PointSize": "GL_POINT_SIZE_ARRAY_OES", >+ "TextureCoord": "GL_TEXTURE_COORD_ARRAY", >+ "Vertex": "GL_VERTEX_ARRAY" >+ }, >+ "MaterialParameter": >+ { >+ "Ambient": "GL_AMBIENT", >+ "AmbientAndDiffuse": "GL_AMBIENT_AND_DIFFUSE", >+ "Diffuse": "GL_DIFFUSE", >+ "Emission": "GL_EMISSION", >+ "Shininess": "GL_SHININESS", >+ "Specular": "GL_SPECULAR" >+ }, >+ "LightParameter": >+ { >+ "Ambient": "GL_AMBIENT", >+ "AmbientAndDiffuse": "GL_AMBIENT_AND_DIFFUSE", >+ "ConstantAttenuation": "GL_CONSTANT_ATTENUATION", >+ "Diffuse": "GL_DIFFUSE", >+ "LinearAttenuation": "GL_LINEAR_ATTENUATION", >+ "Position": "GL_POSITION", >+ "QuadraticAttenuation": "GL_QUADRATIC_ATTENUATION", >+ "Specular": "GL_SPECULAR", >+ "SpotCutoff": "GL_SPOT_CUTOFF", >+ "SpotDirection": "GL_SPOT_DIRECTION", >+ "SpotExponent": "GL_SPOT_EXPONENT" >+ }, >+ "PointParameter": >+ { >+ "PointSizeMin" : "GL_POINT_SIZE_MIN", >+ "PointSizeMax" : "GL_POINT_SIZE_MAX", >+ "PointFadeThresholdSize" : "GL_POINT_FADE_THRESHOLD_SIZE", >+ "PointDistanceAttenuation" : "GL_POINT_DISTANCE_ATTENUATION" >+ }, >+ "FilterMode": >+ { >+ "Nearest": "GL_NEAREST", >+ "Linear": "GL_LINEAR", >+ "NearestMipmapNearest": "GL_NEAREST_MIPMAP_NEAREST", >+ "NearestMipmapLinear": "GL_NEAREST_MIPMAP_LINEAR", >+ "LinearMipmapLinear": "GL_LINEAR_MIPMAP_LINEAR" >+ }, >+ "WrapMode": >+ { >+ "ClampToEdge": "GL_CLAMP_TO_EDGE", >+ "ClampToBorder": "GL_CLAMP_TO_BORDER", >+ "MirroredRepeat": "GL_MIRRORED_REPEAT", >+ "Repeat": "GL_REPEAT" >+ }, >+ "ProvokingVertex": >+ { >+ "FirstVertexConvention": "GL_FIRST_VERTEX_CONVENTION", >+ "LastVertexConvention": "GL_LAST_VERTEX_CONVENTION" >+ }, >+ "HandleType": >+ { >+ "OpaqueFd": "GL_HANDLE_TYPE_OPAQUE_FD_EXT" >+ } >+} >diff --git a/Source/ThirdParty/ANGLE/src/common/platform.h b/Source/ThirdParty/ANGLE/src/common/platform.h >index 0065fd25196..acb21575ace 100644 >--- a/Source/ThirdParty/ANGLE/src/common/platform.h >+++ b/Source/ThirdParty/ANGLE/src/common/platform.h >@@ -9,95 +9,103 @@ > #ifndef COMMON_PLATFORM_H_ > #define COMMON_PLATFORM_H_ > >-#if defined(_WIN32) || defined(_WIN64) >-# define ANGLE_PLATFORM_WINDOWS 1 >+#if defined(_WIN32) >+# define ANGLE_PLATFORM_WINDOWS 1 >+#elif defined(__Fuchsia__) >+# define ANGLE_PLATFORM_FUCHSIA 1 >+# define ANGLE_PLATFORM_POSIX 1 > #elif defined(__APPLE__) >-# define ANGLE_PLATFORM_APPLE 1 >-# define ANGLE_PLATFORM_POSIX 1 >+# define ANGLE_PLATFORM_APPLE 1 >+# define ANGLE_PLATFORM_POSIX 1 > #elif defined(ANDROID) >-# define ANGLE_PLATFORM_ANDROID 1 >-# define ANGLE_PLATFORM_POSIX 1 >+# define ANGLE_PLATFORM_ANDROID 1 >+# define ANGLE_PLATFORM_POSIX 1 > #elif defined(__linux__) || defined(EMSCRIPTEN) >-# define ANGLE_PLATFORM_LINUX 1 >-# define ANGLE_PLATFORM_POSIX 1 >-#elif defined(__FreeBSD__) || \ >- defined(__OpenBSD__) || \ >- defined(__NetBSD__) || \ >- defined(__DragonFly__) || \ >- defined(__sun) || \ >- defined(__GLIBC__) || \ >- defined(__GNU__) || \ >- defined(__QNX__) || \ >- defined(__Fuchsia__) || \ >- defined(__HAIKU__) >-# define ANGLE_PLATFORM_POSIX 1 >+# define ANGLE_PLATFORM_LINUX 1 >+# define ANGLE_PLATFORM_POSIX 1 >+#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || \ >+ defined(__DragonFly__) || defined(__sun) || defined(__GLIBC__) || defined(__GNU__) || \ >+ defined(__QNX__) || defined(__Fuchsia__) || defined(__HAIKU__) >+# define ANGLE_PLATFORM_POSIX 1 > #else >-# error Unsupported platform. >+# error Unsupported platform. > #endif > > #ifdef ANGLE_PLATFORM_WINDOWS >-# ifndef STRICT >-# define STRICT 1 >-# endif >-# ifndef WIN32_LEAN_AND_MEAN >-# define WIN32_LEAN_AND_MEAN 1 >-# endif >-# ifndef NOMINMAX >-# define NOMINMAX 1 >-# endif >- >-# include <windows.h> >-# include <intrin.h> >- >-# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP) >-# define ANGLE_ENABLE_WINDOWS_STORE 1 >-# endif >- >-# if defined(ANGLE_ENABLE_D3D9) >-# include <d3d9.h> >-# include <d3dcompiler.h> >-# endif >- >-# if defined(ANGLE_ENABLE_D3D11) >-#include <d3d10_1.h> >-#include <d3d11.h> >-#include <d3d11_3.h> >-#include <d3dcompiler.h> >-#include <dxgi.h> >-#include <dxgi1_2.h> >-# endif >- >-#if defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11) >-#include <wrl.h> >-#endif >+# ifndef STRICT >+# define STRICT 1 >+# endif >+# ifndef WIN32_LEAN_AND_MEAN >+# define WIN32_LEAN_AND_MEAN 1 >+# endif >+# ifndef NOMINMAX >+# define NOMINMAX 1 >+# endif >+ >+# include <intrin.h> >+# include <windows.h> >+ >+# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP) >+# define ANGLE_ENABLE_WINDOWS_STORE 1 >+# endif >+ >+# if defined(ANGLE_ENABLE_D3D9) >+# include <d3d9.h> >+# include <d3dcompiler.h> >+# endif > >-# if defined(ANGLE_ENABLE_WINDOWS_STORE) >-# include <dxgi1_3.h> >-# if defined(_DEBUG) >-# include <DXProgrammableCapture.h> >-# include <dxgidebug.h> >-# endif >-# endif >+// Include D3D11 headers when OpenGL is enabled on Windows for interop extensions. >+# if defined(ANGLE_ENABLE_D3D11) || defined(ANGLE_ENABLE_OPENGL) >+# include <d3d10_1.h> >+# include <d3d11.h> >+# include <d3d11_3.h> >+# include <d3dcompiler.h> >+# include <dxgi.h> >+# include <dxgi1_2.h> >+# endif > >-# undef near >-# undef far >+# if defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11) >+# include <wrl.h> >+# endif >+ >+# if defined(ANGLE_ENABLE_WINDOWS_STORE) >+# include <dxgi1_3.h> >+# if defined(_DEBUG) >+# include <DXProgrammableCapture.h> >+# include <dxgidebug.h> >+# endif >+# endif >+ >+# undef near >+# undef far > #endif > >-#if defined(_MSC_VER) && !defined(_M_ARM) >-#include <intrin.h> >-#define ANGLE_USE_SSE >+#if defined(_MSC_VER) && !defined(_M_ARM) && !defined(_M_ARM64) >+# include <intrin.h> >+# define ANGLE_USE_SSE > #elif defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__)) >-#include <x86intrin.h> >-#define ANGLE_USE_SSE >+# include <x86intrin.h> >+# define ANGLE_USE_SSE > #endif > > // Mips and arm devices need to include stddef for size_t. > #if defined(__mips__) || defined(__arm__) || defined(__aarch64__) >-#include <stddef.h> >+# include <stddef.h> > #endif > > // The MemoryBarrier function name collides with a macro under Windows > // We will undef the macro so that the function name does not get replaced > #undef MemoryBarrier > >-#endif // COMMON_PLATFORM_H_ >+// Macro for hinting that an expression is likely to be true/false. >+#if !defined(ANGLE_LIKELY) || !defined(ANGLE_UNLIKELY) >+# if defined(__GNUC__) || defined(__clang__) >+# define ANGLE_LIKELY(x) __builtin_expect(!!(x), 1) >+# define ANGLE_UNLIKELY(x) __builtin_expect(!!(x), 0) >+# else >+# define ANGLE_LIKELY(x) (x) >+# define ANGLE_UNLIKELY(x) (x) >+# endif // defined(__GNUC__) || defined(__clang__) >+#endif // !defined(ANGLE_LIKELY) || !defined(ANGLE_UNLIKELY) >+ >+#endif // COMMON_PLATFORM_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/string_utils.cpp b/Source/ThirdParty/ANGLE/src/common/string_utils.cpp >index 26f384bb2ae..6c0d4b69495 100644 >--- a/Source/ThirdParty/ANGLE/src/common/string_utils.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/string_utils.cpp >@@ -9,9 +9,9 @@ > > #include "string_utils.h" > >-#include <algorithm> > #include <stdlib.h> > #include <string.h> >+#include <algorithm> > #include <fstream> > #include <sstream> > >@@ -64,8 +64,7 @@ std::vector<std::string> SplitString(const std::string &input, > return result; > } > >-void SplitStringAlongWhitespace(const std::string &input, >- std::vector<std::string> *tokensOut) >+void SplitStringAlongWhitespace(const std::string &input, std::vector<std::string> *tokensOut) > { > > std::istringstream stream(input); >@@ -142,7 +141,8 @@ Optional<std::vector<wchar_t>> WidenString(size_t length, const char *cString) > { > std::vector<wchar_t> wcstring(length + 1); > #if !defined(ANGLE_PLATFORM_WINDOWS) >- size_t written = mbstowcs(wcstring.data(), cString, length + 1); >+ mbstate_t mbstate = {}; >+ size_t written = mbsrtowcs(wcstring.data(), &cString, length + 1, &mbstate); > if (written == 0) > { > return Optional<std::vector<wchar_t>>::Invalid(); >diff --git a/Source/ThirdParty/ANGLE/src/common/string_utils.h b/Source/ThirdParty/ANGLE/src/common/string_utils.h >index 07bf1ff81a1..bb1c92993c6 100644 >--- a/Source/ThirdParty/ANGLE/src/common/string_utils.h >+++ b/Source/ThirdParty/ANGLE/src/common/string_utils.h >@@ -37,8 +37,7 @@ std::vector<std::string> SplitString(const std::string &input, > WhitespaceHandling whitespace, > SplitResult resultType); > >-void SplitStringAlongWhitespace(const std::string &input, >- std::vector<std::string> *tokensOut); >+void SplitStringAlongWhitespace(const std::string &input, std::vector<std::string> *tokensOut); > > std::string TrimString(const std::string &input, const std::string &trimChars); > >@@ -70,7 +69,7 @@ bool BeginsWith(const std::string &str, const std::string &prefix, const size_t > // Check if the string str ends with the given suffix. > // Suffix may not be NUL and needs to be NULL terminated. > // The comparison is case sensitive. >-bool EndsWith(const std::string& str, const char* suffix); >+bool EndsWith(const std::string &str, const char *suffix); > > // Convert to lower-case. > void ToLower(std::string *str); >@@ -82,4 +81,4 @@ bool ReplaceSubstring(std::string *str, > > } // namespace angle > >-#endif // LIBANGLE_STRING_UTILS_H_ >+#endif // LIBANGLE_STRING_UTILS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/system_utils.cpp b/Source/ThirdParty/ANGLE/src/common/system_utils.cpp >new file mode 100644 >index 00000000000..9121dfb1c27 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/system_utils.cpp >@@ -0,0 +1,33 @@ >+// >+// 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. >+// >+ >+// system_utils.cpp: Implementation of common functions >+ >+#include "system_utils.h" >+ >+namespace angle >+{ >+ >+bool PrependPathToEnvironmentVar(const char *variableName, const char *path) >+{ >+ std::string oldValue = GetEnvironmentVar(variableName); >+ const char *newValue = nullptr; >+ std::string buf; >+ if (oldValue.empty()) >+ { >+ newValue = path; >+ } >+ else >+ { >+ buf = path; >+ buf += GetPathSeparator(); >+ buf += oldValue; >+ newValue = buf.c_str(); >+ } >+ return SetEnvironmentVar(variableName, newValue); >+} >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/common/system_utils.h b/Source/ThirdParty/ANGLE/src/common/system_utils.h >index d61faa53fd6..2c760417fd0 100644 >--- a/Source/ThirdParty/ANGLE/src/common/system_utils.h >+++ b/Source/ThirdParty/ANGLE/src/common/system_utils.h >@@ -9,19 +9,46 @@ > #ifndef COMMON_SYSTEM_UTILS_H_ > #define COMMON_SYSTEM_UTILS_H_ > >-#include "common/angleutils.h" > #include "common/Optional.h" >+#include "common/angleutils.h" > > namespace angle > { >- >-const char *GetExecutablePath(); >-const char *GetExecutableDirectory(); >+std::string GetExecutablePath(); >+std::string GetExecutableDirectory(); > const char *GetSharedLibraryExtension(); > Optional<std::string> GetCWD(); > bool SetCWD(const char *dirName); > bool SetEnvironmentVar(const char *variableName, const char *value); >+bool UnsetEnvironmentVar(const char *variableName); >+std::string GetEnvironmentVar(const char *variableName); >+const char *GetPathSeparator(); >+bool PrependPathToEnvironmentVar(const char *variableName, const char *path); >+ >+// Run an application and get the output. Gets a nullptr-terminated set of args to execute the >+// application with, and returns the stdout and stderr outputs as well as the exit code. >+// >+// Returns false if it fails to actually execute the application. >+bool RunApp(const std::vector<const char *> &args, >+ std::string *stdoutOut, >+ std::string *stderrOut, >+ int *exitCodeOut); >+ >+class Library : angle::NonCopyable >+{ >+ public: >+ virtual ~Library() {} >+ virtual void *getSymbol(const char *symbolName) = 0; >+ virtual void *getNative() const = 0; >+ >+ template <typename FuncT> >+ void getAs(const char *symbolName, FuncT *funcOut) >+ { >+ *funcOut = reinterpret_cast<FuncT>(getSymbol(symbolName)); >+ } >+}; > >+Library *OpenSharedLibrary(const char *libraryName); > } // namespace angle > > #endif // COMMON_SYSTEM_UTILS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/system_utils_linux.cpp b/Source/ThirdParty/ANGLE/src/common/system_utils_linux.cpp >index 851f9897f3f..f7ea49fc4d3 100644 >--- a/Source/ThirdParty/ANGLE/src/common/system_utils_linux.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/system_utils_linux.cpp >@@ -17,11 +17,7 @@ > > namespace angle > { >- >-namespace >-{ >- >-std::string GetExecutablePathImpl() >+std::string GetExecutablePath() > { > // We cannot use lstat to get the size of /proc/self/exe as it always returns 0 > // so we just use a big buffer and hope the path fits in it. >@@ -37,53 +33,15 @@ std::string GetExecutablePathImpl() > return path; > } > >-std::string GetExecutableDirectoryImpl() >+std::string GetExecutableDirectory() > { > std::string executablePath = GetExecutablePath(); > size_t lastPathSepLoc = executablePath.find_last_of("/"); > return (lastPathSepLoc != std::string::npos) ? executablePath.substr(0, lastPathSepLoc) : ""; > } > >-} // anonymous namespace >- >-const char *GetExecutablePath() >-{ >- // TODO(jmadill): Make global static string thread-safe. >- const static std::string exePath = GetExecutablePathImpl(); >- return exePath.c_str(); >-} >- >-const char *GetExecutableDirectory() >-{ >- // TODO(jmadill): Make global static string thread-safe. >- const static std::string exeDir = GetExecutableDirectoryImpl(); >- return exeDir.c_str(); >-} >- > const char *GetSharedLibraryExtension() > { > return "so"; > } >- >-Optional<std::string> GetCWD() >-{ >- std::array<char, 4096> pathBuf; >- char *result = getcwd(pathBuf.data(), pathBuf.size()); >- if (result == nullptr) >- { >- return Optional<std::string>::Invalid(); >- } >- return std::string(pathBuf.data()); >-} >- >-bool SetCWD(const char *dirName) >-{ >- return (chdir(dirName) == 0); >-} >- >-bool SetEnvironmentVar(const char *variableName, const char *value) >-{ >- return (setenv(variableName, value, 1) == 0); >-} >- > } // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/common/system_utils_mac.cpp b/Source/ThirdParty/ANGLE/src/common/system_utils_mac.cpp >index 9d69fbcd304..f3d9891ebbc 100644 >--- a/Source/ThirdParty/ANGLE/src/common/system_utils_mac.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/system_utils_mac.cpp >@@ -10,19 +10,15 @@ > > #include <unistd.h> > >-#include <cstdlib> > #include <mach-o/dyld.h> >+#include <cstdlib> > #include <vector> > > #include <array> > > namespace angle > { >- >-namespace >-{ >- >-std::string GetExecutablePathImpl() >+std::string GetExecutablePath() > { > std::string result; > >@@ -42,53 +38,15 @@ std::string GetExecutablePathImpl() > return buffer.data(); > } > >-std::string GetExecutableDirectoryImpl() >+std::string GetExecutableDirectory() > { > std::string executablePath = GetExecutablePath(); > size_t lastPathSepLoc = executablePath.find_last_of("/"); > return (lastPathSepLoc != std::string::npos) ? executablePath.substr(0, lastPathSepLoc) : ""; > } > >-} // anonymous namespace >- >-const char *GetExecutablePath() >-{ >- // TODO(jmadill): Make global static string thread-safe. >- const static std::string exePath = GetExecutablePathImpl(); >- return exePath.c_str(); >-} >- >-const char *GetExecutableDirectory() >-{ >- // TODO(jmadill): Make global static string thread-safe. >- const static std::string exeDir = GetExecutableDirectoryImpl(); >- return exeDir.c_str(); >-} >- > const char *GetSharedLibraryExtension() > { > return "dylib"; > } >- >-Optional<std::string> GetCWD() >-{ >- std::array<char, 4096> pathBuf; >- char *result = getcwd(pathBuf.data(), pathBuf.size()); >- if (result == nullptr) >- { >- return Optional<std::string>::Invalid(); >- } >- return std::string(pathBuf.data()); >-} >- >-bool SetCWD(const char *dirName) >-{ >- return (chdir(dirName) == 0); >-} >- >-bool SetEnvironmentVar(const char *variableName, const char *value) >-{ >- return (setenv(variableName, value, 1) == 0); >-} >- > } // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/common/system_utils_posix.cpp b/Source/ThirdParty/ANGLE/src/common/system_utils_posix.cpp >new file mode 100644 >index 00000000000..fe7db695a8b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/system_utils_posix.cpp >@@ -0,0 +1,258 @@ >+// >+// 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. >+// >+ >+// system_utils_posix.cpp: Implementation of POSIX OS-specific functions. >+ >+#include "system_utils.h" >+ >+#include <array> >+ >+#include <dlfcn.h> >+#include <sys/types.h> >+#include <sys/wait.h> >+#include <unistd.h> >+ >+// On BSDs (including mac), environ is not declared anywhere: >+// https://stackoverflow.com/a/31347357/912144 >+extern char **environ; >+ >+namespace angle >+{ >+ >+namespace >+{ >+struct ScopedPipe >+{ >+ ~ScopedPipe() >+ { >+ closeEndPoint(0); >+ closeEndPoint(1); >+ } >+ void closeEndPoint(int index) >+ { >+ if (fds[index] >= 0) >+ { >+ close(fds[index]); >+ fds[index] = -1; >+ } >+ } >+ int fds[2] = { >+ -1, >+ -1, >+ }; >+}; >+ >+void ReadEntireFile(int fd, std::string *out) >+{ >+ out->clear(); >+ >+ while (true) >+ { >+ char buffer[256]; >+ ssize_t bytesRead = read(fd, buffer, sizeof(buffer)); >+ >+ // If interrupted, retry. >+ if (bytesRead < 0 && errno == EINTR) >+ { >+ continue; >+ } >+ >+ // If failed, or nothing to read, we are done. >+ if (bytesRead <= 0) >+ { >+ break; >+ } >+ >+ out->append(buffer, bytesRead); >+ } >+} >+} // anonymous namespace >+ >+Optional<std::string> GetCWD() >+{ >+ std::array<char, 4096> pathBuf; >+ char *result = getcwd(pathBuf.data(), pathBuf.size()); >+ if (result == nullptr) >+ { >+ return Optional<std::string>::Invalid(); >+ } >+ return std::string(pathBuf.data()); >+} >+ >+bool SetCWD(const char *dirName) >+{ >+ return (chdir(dirName) == 0); >+} >+ >+bool UnsetEnvironmentVar(const char *variableName) >+{ >+ return (unsetenv(variableName) == 0); >+} >+ >+bool SetEnvironmentVar(const char *variableName, const char *value) >+{ >+ return (setenv(variableName, value, 1) == 0); >+} >+ >+std::string GetEnvironmentVar(const char *variableName) >+{ >+ const char *value = getenv(variableName); >+ return (value == nullptr ? std::string() : std::string(value)); >+} >+ >+const char *GetPathSeparator() >+{ >+ return ":"; >+} >+ >+bool RunApp(const std::vector<const char *> &args, >+ std::string *stdoutOut, >+ std::string *stderrOut, >+ int *exitCodeOut) >+{ >+ if (args.size() == 0 || args.back() != nullptr) >+ { >+ return false; >+ } >+ >+ ScopedPipe stdoutPipe; >+ ScopedPipe stderrPipe; >+ >+ // Create pipes for stdout and stderr. >+ if (stdoutOut && pipe(stdoutPipe.fds) != 0) >+ { >+ return false; >+ } >+ if (stderrOut && pipe(stderrPipe.fds) != 0) >+ { >+ return false; >+ } >+ >+ pid_t pid = fork(); >+ if (pid < 0) >+ { >+ return false; >+ } >+ >+ if (pid == 0) >+ { >+ // Child. Execute the application. >+ >+ // Redirect stdout and stderr to the pipe fds. >+ if (stdoutOut) >+ { >+ if (dup2(stdoutPipe.fds[1], STDOUT_FILENO) < 0) >+ { >+ _exit(errno); >+ } >+ } >+ if (stderrOut) >+ { >+ if (dup2(stderrPipe.fds[1], STDERR_FILENO) < 0) >+ { >+ _exit(errno); >+ } >+ } >+ >+ // Execute the application, which doesn't return unless failed. Note: execve takes argv as >+ // `char * const *` for historical reasons. It is safe to const_cast it: >+ // >+ // http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html >+ // >+ // > The statement about argv[] and envp[] being constants is included to make explicit to >+ // future writers of language bindings that these objects are completely constant. Due to a >+ // limitation of the ISO C standard, it is not possible to state that idea in standard C. >+ // Specifying two levels of const- qualification for the argv[] and envp[] parameters for >+ // the exec functions may seem to be the natural choice, given that these functions do not >+ // modify either the array of pointers or the characters to which the function points, but >+ // this would disallow existing correct code. Instead, only the array of pointers is noted >+ // as constant. >+ execve(args[0], const_cast<char *const *>(args.data()), environ); >+ _exit(errno); >+ } >+ >+ // Parent. Read child output from the pipes and clean it up. >+ >+ // Close the write end of the pipes, so EOF can be generated when child exits. >+ stdoutPipe.closeEndPoint(1); >+ stderrPipe.closeEndPoint(1); >+ >+ // Read back the output of the child. >+ if (stdoutOut) >+ { >+ ReadEntireFile(stdoutPipe.fds[0], stdoutOut); >+ } >+ if (stderrOut) >+ { >+ ReadEntireFile(stderrPipe.fds[0], stderrOut); >+ } >+ >+ // Cleanup the child. >+ int status = 0; >+ do >+ { >+ pid_t changedPid = waitpid(pid, &status, 0); >+ if (changedPid < 0 && errno == EINTR) >+ { >+ continue; >+ } >+ if (changedPid < 0) >+ { >+ return false; >+ } >+ } while (!WIFEXITED(status) && !WIFSIGNALED(status)); >+ >+ // Retrieve the error code. >+ if (exitCodeOut) >+ { >+ *exitCodeOut = WEXITSTATUS(status); >+ } >+ >+ return true; >+} >+ >+class PosixLibrary : public Library >+{ >+ public: >+ PosixLibrary(const char *libraryName) >+ { >+ char buffer[1000]; >+ int ret = snprintf(buffer, 1000, "%s.%s", libraryName, GetSharedLibraryExtension()); >+ if (ret > 0 && ret < 1000) >+ { >+ mModule = dlopen(buffer, RTLD_NOW); >+ } >+ } >+ >+ ~PosixLibrary() override >+ { >+ if (mModule) >+ { >+ dlclose(mModule); >+ } >+ } >+ >+ void *getSymbol(const char *symbolName) override >+ { >+ if (!mModule) >+ { >+ return nullptr; >+ } >+ >+ return dlsym(mModule, symbolName); >+ } >+ >+ void *getNative() const override { return mModule; } >+ >+ private: >+ void *mModule = nullptr; >+}; >+ >+Library *OpenSharedLibrary(const char *libraryName) >+{ >+ return new PosixLibrary(libraryName); >+} >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/common/system_utils_unittest.cpp b/Source/ThirdParty/ANGLE/src/common/system_utils_unittest.cpp >new file mode 100644 >index 00000000000..7a5948a4936 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/system_utils_unittest.cpp >@@ -0,0 +1,142 @@ >+// >+// 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. >+ >+// system_utils_unittest.cpp: Unit tests for ANGLE's system utility functions >+ >+#include "gmock/gmock.h" >+#include "gtest/gtest.h" >+ >+#include "common/system_utils.h" >+#include "common/system_utils_unittest_helper.h" >+ >+using namespace angle; >+ >+namespace >+{ >+#if defined(ANGLE_PLATFORM_WINDOWS) >+constexpr char kRunAppHelperExecutable[] = "angle_unittests_helper.exe"; >+#else >+constexpr char kRunAppHelperExecutable[] = "angle_unittests_helper"; >+#endif >+ >+// Transforms various line endings into C/Unix line endings: >+// >+// - A\nB -> A\nB >+// - A\rB -> A\nB >+// - A\r\nB -> A\nB >+std::string NormalizeNewLines(const std::string &str) >+{ >+ std::string result; >+ >+ for (size_t i = 0; i < str.size(); ++i) >+ { >+ if (str[i] == '\r') >+ { >+ if (i + 1 < str.size() && str[i + 1] == '\n') >+ { >+ ++i; >+ } >+ result += '\n'; >+ } >+ else >+ { >+ result += str[i]; >+ } >+ } >+ >+ return result; >+} >+ >+// Test getting the executable path >+TEST(SystemUtils, ExecutablePath) >+{ >+#if defined(ANGLE_PLATFORM_FUCHSIA) >+ // TODO: fuchsia support. http://anglebug.com/3161 >+ return; >+#endif >+ >+ std::string executablePath = GetExecutablePath(); >+ EXPECT_NE("", executablePath); >+} >+ >+// Test getting the executable directory >+TEST(SystemUtils, ExecutableDir) >+{ >+#if defined(ANGLE_PLATFORM_FUCHSIA) >+ // TODO: fuchsia support. http://anglebug.com/3161 >+ return; >+#endif >+ >+ std::string executableDir = GetExecutableDirectory(); >+ EXPECT_NE("", executableDir); >+ >+ std::string executablePath = GetExecutablePath(); >+ EXPECT_LT(executableDir.size(), executablePath.size()); >+ EXPECT_EQ(0, strncmp(executableDir.c_str(), executablePath.c_str(), executableDir.size())); >+} >+ >+// Test setting environment variables >+TEST(SystemUtils, Environment) >+{ >+ constexpr char kEnvVarName[] = "UNITTEST_ENV_VARIABLE"; >+ constexpr char kEnvVarValue[] = "The quick brown fox jumps over the lazy dog"; >+ >+ bool setEnvDone = SetEnvironmentVar(kEnvVarName, kEnvVarValue); >+ EXPECT_TRUE(setEnvDone); >+ >+ std::string readback = GetEnvironmentVar(kEnvVarName); >+ EXPECT_EQ(kEnvVarValue, readback); >+ >+ bool unsetEnvDone = UnsetEnvironmentVar(kEnvVarName); >+ EXPECT_TRUE(unsetEnvDone); >+ >+ readback = GetEnvironmentVar(kEnvVarName); >+ EXPECT_EQ("", readback); >+} >+ >+// Test running an external application and receiving its output >+TEST(SystemUtils, RunApp) >+{ >+#if defined(ANGLE_PLATFORM_ANDROID) >+ // TODO: android support. http://anglebug.com/3125 >+ return; >+#endif >+ >+#if defined(ANGLE_PLATFORM_FUCHSIA) >+ // TODO: fuchsia support. http://anglebug.com/3161 >+ return; >+#endif >+ >+ std::string executablePath = GetExecutableDirectory(); >+ EXPECT_NE(executablePath, ""); >+ executablePath += "/"; >+ executablePath += kRunAppHelperExecutable; >+ >+ std::vector<const char *> args = {executablePath.c_str(), kRunAppTestArg1, kRunAppTestArg2, >+ nullptr}; >+ >+ std::string stdoutOutput; >+ std::string stderrOutput; >+ int exitCode = EXIT_FAILURE; >+ >+ // Test that the application can be executed. >+ bool ranApp = RunApp(args, &stdoutOutput, &stderrOutput, &exitCode); >+ EXPECT_TRUE(ranApp); >+ EXPECT_EQ(kRunAppTestStdout, NormalizeNewLines(stdoutOutput)); >+ EXPECT_EQ(kRunAppTestStderr, NormalizeNewLines(stderrOutput)); >+ EXPECT_EQ(EXIT_SUCCESS, exitCode); >+ >+ // Test that environment variables reach the cild. >+ bool setEnvDone = SetEnvironmentVar(kRunAppTestEnvVarName, kRunAppTestEnvVarValue); >+ EXPECT_TRUE(setEnvDone); >+ >+ ranApp = RunApp(args, &stdoutOutput, &stderrOutput, &exitCode); >+ EXPECT_TRUE(ranApp); >+ EXPECT_EQ("", stdoutOutput); >+ EXPECT_EQ(kRunAppTestEnvVarValue, NormalizeNewLines(stderrOutput)); >+ EXPECT_EQ(EXIT_SUCCESS, exitCode); >+} >+ >+} // anonymous namespace >diff --git a/Source/ThirdParty/ANGLE/src/common/system_utils_unittest_helper.cpp b/Source/ThirdParty/ANGLE/src/common/system_utils_unittest_helper.cpp >new file mode 100644 >index 00000000000..f1bfa69b48c >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/system_utils_unittest_helper.cpp >@@ -0,0 +1,33 @@ >+// >+// 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. >+ >+// system_utils_unittest_helper.cpp: Helper to the SystemUtils.RunApp unittest >+ >+#include "common/system_utils_unittest_helper.h" >+#include <string.h> >+#include "common/system_utils.h" >+ >+int main(int argc, char **argv) >+{ >+ if (argc != 3 || strcmp(argv[1], kRunAppTestArg1) != 0 || strcmp(argv[2], kRunAppTestArg2) != 0) >+ { >+ fprintf(stderr, "Expected command line:\n%s %s %s\n", argv[0], kRunAppTestArg1, >+ kRunAppTestArg2); >+ return EXIT_FAILURE; >+ } >+ >+ std::string env = angle::GetEnvironmentVar(kRunAppTestEnvVarName); >+ if (env == "") >+ { >+ printf("%s", kRunAppTestStdout); >+ fprintf(stderr, "%s", kRunAppTestStderr); >+ } >+ else >+ { >+ fprintf(stderr, "%s", env.c_str()); >+ } >+ >+ return EXIT_SUCCESS; >+} >diff --git a/Source/ThirdParty/ANGLE/src/common/system_utils_unittest_helper.h b/Source/ThirdParty/ANGLE/src/common/system_utils_unittest_helper.h >new file mode 100644 >index 00000000000..660bde1afe7 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/system_utils_unittest_helper.h >@@ -0,0 +1,21 @@ >+// >+// 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. >+ >+// system_utils_unittest_helper.h: Constants used by the SystemUtils.RunApp unittest >+ >+#ifndef COMMON_SYSTEM_UTILS_UNITTEST_HELPER_H_ >+#define COMMON_SYSTEM_UTILS_UNITTEST_HELPER_H_ >+ >+namespace >+{ >+constexpr char kRunAppTestEnvVarName[] = "RUN_APP_TEST_ENV"; >+constexpr char kRunAppTestEnvVarValue[] = "RunAppTest environment variable value\n"; >+constexpr char kRunAppTestStdout[] = "RunAppTest stdout test\n"; >+constexpr char kRunAppTestStderr[] = "RunAppTest stderr test\n .. that expands multiple lines\n"; >+constexpr char kRunAppTestArg1[] = "--expected-arg1"; >+constexpr char kRunAppTestArg2[] = "expected_arg2"; >+} // anonymous namespace >+ >+#endif // COMMON_SYSTEM_UTILS_UNITTEST_HELPER_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/system_utils_win.cpp b/Source/ThirdParty/ANGLE/src/common/system_utils_win.cpp >index 8e53d3403d6..816d1131246 100644 >--- a/Source/ThirdParty/ANGLE/src/common/system_utils_win.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/system_utils_win.cpp >@@ -15,11 +15,57 @@ > > namespace angle > { >- > namespace > { >+struct ScopedPipe >+{ >+ ~ScopedPipe() >+ { >+ closeReadHandle(); >+ closeWriteHandle(); >+ } >+ void closeReadHandle() >+ { >+ if (readHandle) >+ { >+ CloseHandle(readHandle); >+ readHandle = nullptr; >+ } >+ } >+ void closeWriteHandle() >+ { >+ if (writeHandle) >+ { >+ CloseHandle(writeHandle); >+ writeHandle = nullptr; >+ } >+ } >+ HANDLE readHandle = nullptr; >+ HANDLE writeHandle = nullptr; >+}; >+ >+void ReadEntireFile(HANDLE handle, std::string *out) >+{ >+ out->clear(); >+ >+ while (true) >+ { >+ char buffer[256]; >+ DWORD bytesRead; > >-std::string GetExecutablePathImpl() >+ BOOL success = ReadFile(handle, buffer, sizeof(buffer), &bytesRead, nullptr); >+ >+ if (!success || bytesRead == 0) >+ { >+ break; >+ } >+ >+ out->append(buffer, bytesRead); >+ } >+} >+} // anonymous namespace >+ >+std::string GetExecutablePath() > { > std::array<char, MAX_PATH> executableFileBuf; > DWORD executablePathLen = GetModuleFileNameA(nullptr, executableFileBuf.data(), >@@ -27,29 +73,13 @@ std::string GetExecutablePathImpl() > return (executablePathLen > 0 ? std::string(executableFileBuf.data()) : ""); > } > >-std::string GetExecutableDirectoryImpl() >+std::string GetExecutableDirectory() > { > std::string executablePath = GetExecutablePath(); > size_t lastPathSepLoc = executablePath.find_last_of("\\/"); > return (lastPathSepLoc != std::string::npos) ? executablePath.substr(0, lastPathSepLoc) : ""; > } > >-} // anonymous namespace >- >-const char *GetExecutablePath() >-{ >- // TODO(jmadill): Make global static string thread-safe. >- const static std::string exePath = GetExecutablePathImpl(); >- return exePath.c_str(); >-} >- >-const char *GetExecutableDirectory() >-{ >- // TODO(jmadill): Make global static string thread-safe. >- const static std::string exeDir = GetExecutableDirectoryImpl(); >- return exeDir.c_str(); >-} >- > const char *GetSharedLibraryExtension() > { > return "dll"; >@@ -71,9 +101,182 @@ bool SetCWD(const char *dirName) > return (SetCurrentDirectoryA(dirName) == TRUE); > } > >+bool UnsetEnvironmentVar(const char *variableName) >+{ >+ return (SetEnvironmentVariableA(variableName, nullptr) == TRUE); >+} >+ > bool SetEnvironmentVar(const char *variableName, const char *value) > { > return (SetEnvironmentVariableA(variableName, value) == TRUE); > } > >+std::string GetEnvironmentVar(const char *variableName) >+{ >+ std::array<char, MAX_PATH> oldValue; >+ DWORD result = >+ GetEnvironmentVariableA(variableName, oldValue.data(), static_cast<DWORD>(oldValue.size())); >+ if (result == 0) >+ { >+ return std::string(); >+ } >+ else >+ { >+ return std::string(oldValue.data()); >+ } >+} >+ >+const char *GetPathSeparator() >+{ >+ return ";"; >+} >+ >+bool RunApp(const std::vector<const char *> &args, >+ std::string *stdoutOut, >+ std::string *stderrOut, >+ int *exitCodeOut) >+{ >+ ScopedPipe stdoutPipe; >+ ScopedPipe stderrPipe; >+ >+ SECURITY_ATTRIBUTES sa_attr; >+ // Set the bInheritHandle flag so pipe handles are inherited. >+ sa_attr.nLength = sizeof(SECURITY_ATTRIBUTES); >+ sa_attr.bInheritHandle = TRUE; >+ sa_attr.lpSecurityDescriptor = nullptr; >+ >+ // Create pipes for stdout and stderr. Ensure the read handles to the pipes are not inherited. >+ if (stdoutOut && !CreatePipe(&stdoutPipe.readHandle, &stdoutPipe.writeHandle, &sa_attr, 0) && >+ !SetHandleInformation(stdoutPipe.readHandle, HANDLE_FLAG_INHERIT, 0)) >+ { >+ return false; >+ } >+ if (stderrOut && !CreatePipe(&stderrPipe.readHandle, &stderrPipe.writeHandle, &sa_attr, 0) && >+ !SetHandleInformation(stderrPipe.readHandle, HANDLE_FLAG_INHERIT, 0)) >+ { >+ return false; >+ } >+ >+ // Concat the nicely separated arguments into one string so the application has to reparse it. >+ // We don't support quotation and spaces in arguments currently. >+ std::vector<char> commandLineString; >+ for (const char *arg : args) >+ { >+ if (arg) >+ { >+ if (!commandLineString.empty()) >+ { >+ commandLineString.push_back(' '); >+ } >+ commandLineString.insert(commandLineString.end(), arg, arg + strlen(arg)); >+ } >+ } >+ commandLineString.push_back('\0'); >+ >+ STARTUPINFOA startInfo = {}; >+ >+ startInfo.cb = sizeof(STARTUPINFOA); >+ startInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE); >+ if (stdoutOut) >+ { >+ startInfo.hStdOutput = stdoutPipe.writeHandle; >+ } >+ else >+ { >+ startInfo.hStdError = GetStdHandle(STD_OUTPUT_HANDLE); >+ } >+ if (stderrOut) >+ { >+ startInfo.hStdError = stderrPipe.writeHandle; >+ } >+ else >+ { >+ startInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE); >+ } >+ startInfo.dwFlags |= STARTF_USESTDHANDLES; >+ >+ // Create the child process. >+ PROCESS_INFORMATION processInfo = {}; >+ if (!CreateProcessA(nullptr, commandLineString.data(), nullptr, nullptr, >+ TRUE, // Handles are inherited. >+ 0, nullptr, nullptr, &startInfo, &processInfo)) >+ { >+ return false; >+ } >+ >+ // Close the write end of the pipes, so EOF can be generated when child exits. >+ stdoutPipe.closeWriteHandle(); >+ stderrPipe.closeWriteHandle(); >+ >+ // Read back the output of the child. >+ if (stdoutOut) >+ { >+ ReadEntireFile(stdoutPipe.readHandle, stdoutOut); >+ } >+ if (stderrOut) >+ { >+ ReadEntireFile(stderrPipe.readHandle, stderrOut); >+ } >+ >+ // Cleanup the child. >+ bool success = WaitForSingleObject(processInfo.hProcess, INFINITE) == WAIT_OBJECT_0; >+ >+ if (success) >+ { >+ DWORD exitCode = 0; >+ success = GetExitCodeProcess(processInfo.hProcess, &exitCode); >+ >+ if (success) >+ { >+ *exitCodeOut = static_cast<int>(exitCode); >+ } >+ } >+ >+ CloseHandle(processInfo.hProcess); >+ CloseHandle(processInfo.hThread); >+ >+ return success; >+} >+ >+class Win32Library : public Library >+{ >+ public: >+ Win32Library(const char *libraryName) >+ { >+ char buffer[MAX_PATH]; >+ int ret = snprintf(buffer, MAX_PATH, "%s.%s", libraryName, GetSharedLibraryExtension()); >+ if (ret > 0 && ret < MAX_PATH) >+ { >+ mModule = LoadLibraryA(buffer); >+ } >+ } >+ >+ ~Win32Library() override >+ { >+ if (mModule) >+ { >+ FreeLibrary(mModule); >+ } >+ } >+ >+ void *getSymbol(const char *symbolName) override >+ { >+ if (!mModule) >+ { >+ return nullptr; >+ } >+ >+ return reinterpret_cast<void *>(GetProcAddress(mModule, symbolName)); >+ } >+ >+ void *getNative() const override { return reinterpret_cast<void *>(mModule); } >+ >+ private: >+ HMODULE mModule = nullptr; >+}; >+ >+Library *OpenSharedLibrary(const char *libraryName) >+{ >+ return new Win32Library(libraryName); >+} > } // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/logging.h b/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/logging.h >index 85ad82b47da..73f81e87f21 100644 >--- a/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/logging.h >+++ b/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/logging.h >@@ -11,16 +11,16 @@ > #include "common/debug.h" > > #ifndef DCHECK >-#define DCHECK(X) ASSERT(X) >+# define DCHECK(X) ASSERT(X) > #endif > > #ifndef CHECK >-#define CHECK(X) ASSERT(X) >+# define CHECK(X) ASSERT(X) > #endif > > // Unfortunately ANGLE relies on ASSERT being an empty statement, which these libs don't respect. > #ifndef NOTREACHED >-#define NOTREACHED() UNREACHABLE() >+# define NOTREACHED() ({ UNREACHABLE(); }) > #endif > > #endif // ANGLEBASE_LOGGING_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_conversions.h b/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_conversions.h >index 43babc31a80..b37a36cd319 100644 >--- a/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_conversions.h >+++ b/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_conversions.h >@@ -148,15 +148,13 @@ class StrictNumeric > // Copy constructor. > template <typename Src> > constexpr StrictNumeric(const StrictNumeric<Src> &rhs) : value_(strict_cast<T>(rhs.value_)) >- { >- } >+ {} > > // This is not an explicit constructor because we implicitly upgrade regular > // numerics to StrictNumerics to make them easier to use. > template <typename Src> > constexpr StrictNumeric(Src value) : value_(strict_cast<T>(value)) >- { >- } >+ {} > > // The numeric cast operator basically handles all the magic. > template <typename Dst> >diff --git a/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_conversions_impl.h b/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_conversions_impl.h >index 10ed6c7a7f8..67cc4c92940 100644 >--- a/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_conversions_impl.h >+++ b/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_conversions_impl.h >@@ -150,12 +150,11 @@ struct NarrowingRange > // The following logic avoids warnings where the max function is > // instantiated with invalid values for a bit shift (even though > // such a function can never be called). >- static const int shift = (MaxExponent<Src>::value > MaxExponent<Dst>::value && >- SrcLimits::digits < DstLimits::digits && >- SrcLimits::is_iec559 && >- DstLimits::is_integer) >- ? (DstLimits::digits - SrcLimits::digits) >- : 0; >+ static const int shift = >+ (MaxExponent<Src>::value > MaxExponent<Dst>::value && >+ SrcLimits::digits < DstLimits::digits && SrcLimits::is_iec559 && DstLimits::is_integer) >+ ? (DstLimits::digits - SrcLimits::digits) >+ : 0; > > static constexpr Dst max() > { >diff --git a/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_math.h b/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_math.h >index 3af4db63f76..457acc0d771 100644 >--- a/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_math.h >+++ b/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_math.h >@@ -64,13 +64,11 @@ class CheckedNumeric > // Copy constructor. > template <typename Src> > CheckedNumeric(const CheckedNumeric<Src> &rhs) : state_(rhs.ValueUnsafe(), rhs.validity()) >- { >- } >+ {} > > template <typename Src> > CheckedNumeric(Src value, RangeConstraint validity) : state_(value, validity) >- { >- } >+ {} > > // This is not an explicit constructor because we implicitly upgrade regular > // numerics to CheckedNumerics to make them easier to use. >@@ -86,8 +84,7 @@ class CheckedNumeric > template <typename Src> > CheckedNumeric(StrictNumeric<Src> value) // NOLINT(runtime/explicit) > : state_(static_cast<Src>(value)) >- { >- } >+ {} > > // IsValid() is the public API to test if a CheckedNumeric is currently valid. > bool IsValid() const { return validity() == RANGE_VALID; } >@@ -247,7 +244,7 @@ class CheckedNumeric > // * We skip range checks for floating points. > // * We skip range checks for destination integers with sufficient range. > // TODO(jschuh): extract these out into templates. >-#define ANGLEBASE_NUMERIC_ARITHMETIC_OPERATORS(NAME, OP, COMPOUND_OP) \ >+#define ANGLEBASE_NUMERIC_ARITHMETIC_OPERATORS(NAME, OP, COMPOUND_OP) \ > /* Binary arithmetic operator for CheckedNumerics of the same type. */ \ > template <typename T> \ > CheckedNumeric<typename ArithmeticPromotion<T>::type> operator OP( \ >diff --git a/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_math_impl.h b/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_math_impl.h >index 2831cc6cebc..778fb8daaae 100644 >--- a/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_math_impl.h >+++ b/Source/ThirdParty/ANGLE/src/common/third_party/base/anglebase/numerics/safe_math_impl.h >@@ -364,7 +364,7 @@ CheckedUnsignedAbs(T value) > > // These are the floating point stubs that the compiler needs to see. Only the > // negation operation is ever called. >-#define ANGLEBASE_FLOAT_ARITHMETIC_STUBS(NAME) \ >+#define ANGLEBASE_FLOAT_ARITHMETIC_STUBS(NAME) \ > template <typename T> \ > typename std::enable_if<std::numeric_limits<T>::is_iec559, T>::type Checked##NAME( \ > T, T, RangeConstraint *) \ >@@ -416,8 +416,7 @@ struct GetNumericRepresentation > > template <typename T, NumericRepresentation type = GetNumericRepresentation<T>::value> > class CheckedNumericState >-{ >-}; >+{}; > > // Integrals require quite a bit of additional housekeeping to manage state. > template <typename T> >@@ -446,16 +445,14 @@ class CheckedNumericState<T, NUMERIC_INTEGER> > CheckedNumericState(const CheckedNumericState<Src> &rhs) > : value_(static_cast<T>(rhs.value())), > validity_(GetRangeConstraint(rhs.validity() | DstRangeRelationToSrcRange<T>(rhs.value()))) >- { >- } >+ {} > > template <typename Src> > explicit CheckedNumericState( > Src value, > typename std::enable_if<std::numeric_limits<Src>::is_specialized, int>::type = 0) > : value_(static_cast<T>(value)), validity_(DstRangeRelationToSrcRange<T>(value)) >- { >- } >+ {} > > RangeConstraint validity() const { return validity_; } > T value() const { return value_; } >@@ -508,14 +505,12 @@ class CheckedNumericState<T, NUMERIC_FLOATING> > Src value, > typename std::enable_if<std::numeric_limits<Src>::is_specialized, int>::type = 0) > : value_(static_cast<T>(value)) >- { >- } >+ {} > > // Copy constructor. > template <typename Src> > CheckedNumericState(const CheckedNumericState<Src> &rhs) : value_(static_cast<T>(rhs.value())) >- { >- } >+ {} > > RangeConstraint validity() const > { >diff --git a/Source/ThirdParty/ANGLE/src/common/third_party/smhasher/src/PMurHash.cpp b/Source/ThirdParty/ANGLE/src/common/third_party/smhasher/src/PMurHash.cpp >index 2d608e97dd2..379e5ce3d5b 100644 >--- a/Source/ThirdParty/ANGLE/src/common/third_party/smhasher/src/PMurHash.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/third_party/smhasher/src/PMurHash.cpp >@@ -9,7 +9,7 @@ > */ > > /*----------------------------------------------------------------------------- >- >+ > If you want to understand the MurmurHash algorithm you would be much better > off reading the original source. Just point your browser at: > http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp >@@ -47,8 +47,8 @@ on big endian machines, or a byte-by-byte read if the endianess is unknown. > > -----------------------------------------------------------------------------*/ > >- > #include "PMurHash.h" >+#include <stdint.h> > > /* I used ugly type names in the header to avoid potential conflicts with > * application or system typedefs & defines. Since I'm not including any more >@@ -56,11 +56,11 @@ on big endian machines, or a byte-by-byte read if the endianess is unknown. > #undef uint32_t > #define uint32_t MH_UINT32 > #undef uint8_t >-#define uint8_t MH_UINT8 >+#define uint8_t MH_UINT8 > > /* MSVC warnings we choose to ignore */ > #if defined(_MSC_VER) >- #pragma warning(disable: 4127) /* conditional expression is constant */ >+# pragma warning(disable : 4127) /* conditional expression is constant */ > #endif > > /*----------------------------------------------------------------------------- >@@ -74,117 +74,109 @@ on big endian machines, or a byte-by-byte read if the endianess is unknown. > * ROTL32(x,r) Rotate x left by r bits > */ > >-#if !defined(__BYTE_ORDER) && defined(__GNUC__) >- #define __BIG_ENDIAN __ORDER_BIG_ENDIAN__ >- #define __LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ >- #define __BYTE_ORDER __BYTE_ORDER__ >-#endif >- > /* Convention is to define __BYTE_ORDER == to one of these values */ > #if !defined(__BIG_ENDIAN) >- #define __BIG_ENDIAN 4321 >+# define __BIG_ENDIAN 4321 > #endif > #if !defined(__LITTLE_ENDIAN) >- #define __LITTLE_ENDIAN 1234 >+# define __LITTLE_ENDIAN 1234 > #endif > > /* I386 */ > #if defined(_M_IX86) || defined(__i386__) || defined(__i386) || defined(i386) >- #if !defined(__BYTE_ORDER) >- #define __BYTE_ORDER __LITTLE_ENDIAN >- #endif >- #define UNALIGNED_SAFE >+# define __BYTE_ORDER __LITTLE_ENDIAN >+# define UNALIGNED_SAFE > #endif > > /* gcc 'may' define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ to 1 (Note the trailing __), > * or even _LITTLE_ENDIAN or _BIG_ENDIAN (Note the single _ prefix) */ > #if !defined(__BYTE_ORDER) >- #if defined(__LITTLE_ENDIAN__) && __LITTLE_ENDIAN__==1 || defined(_LITTLE_ENDIAN) && _LITTLE_ENDIAN==1 >- #define __BYTE_ORDER __LITTLE_ENDIAN >- #elif defined(__BIG_ENDIAN__) && __BIG_ENDIAN__==1 || defined(_BIG_ENDIAN) && _BIG_ENDIAN==1 >- #define __BYTE_ORDER __BIG_ENDIAN >- #endif >+# if defined(__LITTLE_ENDIAN__) && __LITTLE_ENDIAN__ == 1 || \ >+ defined(_LITTLE_ENDIAN) && _LITTLE_ENDIAN == 1 >+# define __BYTE_ORDER __LITTLE_ENDIAN >+# elif defined(__BIG_ENDIAN__) && __BIG_ENDIAN__ == 1 || defined(_BIG_ENDIAN) && _BIG_ENDIAN == 1 >+# define __BYTE_ORDER __BIG_ENDIAN >+# endif > #endif > > /* gcc (usually) defines xEL/EB macros for ARM and MIPS endianess */ > #if !defined(__BYTE_ORDER) >- #if defined(__ARMEL__) || defined(__MIPSEL__) >- #define __BYTE_ORDER __LITTLE_ENDIAN >- #endif >- #if defined(__ARMEB__) || defined(__MIPSEB__) >- #define __BYTE_ORDER __BIG_ENDIAN >- #endif >+# if defined(__ARMEL__) || defined(__MIPSEL__) >+# define __BYTE_ORDER __LITTLE_ENDIAN >+# endif >+# if defined(__ARMEB__) || defined(__MIPSEB__) >+# define __BYTE_ORDER __BIG_ENDIAN >+# endif > #endif > > /* Now find best way we can to READ_UINT32 */ >-#if __BYTE_ORDER==__LITTLE_ENDIAN >- /* CPU endian matches murmurhash algorithm, so read 32-bit word directly */ >-#if defined(__clang__) >-#pragma clang diagnostic push >-#pragma clang diagnostic ignored "-Wcast-align" >-#endif >- #define READ_UINT32(ptr) (*((uint32_t*)(ptr))) >-#if defined(__clang__) >-#pragma clang diagnostic pop >-#endif >-#elif __BYTE_ORDER==__BIG_ENDIAN >- /* TODO: Add additional cases below where a compiler provided bswap32 is available */ >- #if defined(__GNUC__) && (__GNUC__>4 || (__GNUC__==4 && __GNUC_MINOR__>=3)) >- #define READ_UINT32(ptr) (__builtin_bswap32(*((uint32_t*)(ptr)))) >- #else >- /* Without a known fast bswap32 we're just as well off doing this */ >- #define READ_UINT32(ptr) (ptr[0]|ptr[1]<<8|ptr[2]<<16|ptr[3]<<24) >- #define UNALIGNED_SAFE >- #endif >+#if __BYTE_ORDER == __LITTLE_ENDIAN >+/* CPU endian matches murmurhash algorithm, so read 32-bit word directly */ >+# define READ_UINT32(ptr) (*((uint32_t *)(ptr))) >+#elif __BYTE_ORDER == __BIG_ENDIAN >+/* TODO: Add additional cases below where a compiler provided bswap32 is available */ >+# if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) >+# define READ_UINT32(ptr) (__builtin_bswap32(*((uint32_t *)(ptr)))) >+# else >+/* Without a known fast bswap32 we're just as well off doing this */ >+# define READ_UINT32(ptr) (ptr[0] | ptr[1] << 8 | ptr[2] << 16 | ptr[3] << 24) >+# define UNALIGNED_SAFE >+# endif > #else >- /* Unknown endianess so last resort is to read individual bytes */ >- #define READ_UINT32(ptr) (ptr[0]|ptr[1]<<8|ptr[2]<<16|ptr[3]<<24) >+/* Unknown endianess so last resort is to read individual bytes */ >+# define READ_UINT32(ptr) (ptr[0] | ptr[1] << 8 | ptr[2] << 16 | ptr[3] << 24) > >- /* Since we're not doing word-reads we can skip the messing about with realignment */ >- #define UNALIGNED_SAFE >+/* Since we're not doing word-reads we can skip the messing about with realignment */ >+# define UNALIGNED_SAFE > #endif > > /* Find best way to ROTL32 */ > #if defined(_MSC_VER) >- #include <stdlib.h> /* Microsoft put _rotl declaration in here */ >- #define ROTL32(x,r) _rotl(x,r) >+# include <stdlib.h> /* Microsoft put _rotl declaration in here */ >+# define ROTL32(x, r) _rotl(x, r) > #else >- /* gcc recognises this code and generates a rotate instruction for CPUs with one */ >- #define ROTL32(x,r) (((uint32_t)x << r) | ((uint32_t)x >> (32 - r))) >+/* gcc recognises this code and generates a rotate instruction for CPUs with one */ >+# define ROTL32(x, r) (((uint32_t)x << r) | ((uint32_t)x >> (32 - r))) > #endif > >- > /*----------------------------------------------------------------------------- > * Core murmurhash algorithm macros */ > >-#define C1 (0xcc9e2d51) >-#define C2 (0x1b873593) >+#define C1 (0xcc9e2d51) >+#define C2 (0x1b873593) > > /* This is the main processing body of the algorithm. It operates > * on each full 32-bits of input. */ >-#define DOBLOCK(h1, k1) do{ \ >- k1 *= C1; \ >- k1 = ROTL32(k1,15); \ >- k1 *= C2; \ >- \ >- h1 ^= k1; \ >- h1 = ROTL32(h1,13); \ >- h1 = h1*5+0xe6546b64; \ >- }while(0) >- >+#define DOBLOCK(h1, k1) \ >+ do \ >+ { \ >+ k1 *= C1; \ >+ k1 = ROTL32(k1, 15); \ >+ k1 *= C2; \ >+ \ >+ h1 ^= k1; \ >+ h1 = ROTL32(h1, 13); \ >+ h1 = h1 * 5 + 0xe6546b64; \ >+ } while (0) > > /* Append unaligned bytes to carry, forcing hash churn if we have 4 bytes */ > /* cnt=bytes to process, h1=name of h1 var, c=carry, n=bytes in c, ptr/len=payload */ >-#define DOBYTES(cnt, h1, c, n, ptr, len) do{ \ >- int _i = cnt; \ >- while(_i--) { \ >- c = c>>8 | *ptr++<<24; \ >- n++; len--; \ >- if(n==4) { \ >- DOBLOCK(h1, c); \ >- n = 0; \ >- } \ >- } }while(0) >+#define DOBYTES(cnt, h1, c, n, ptr, len) \ >+ do \ >+ { \ >+ int _i = cnt; \ >+ while (_i--) \ >+ { \ >+ c = c >> 8 | *ptr++ << 24; \ >+ n++; \ >+ len--; \ >+ if (n == 4) \ >+ { \ >+ DOBLOCK(h1, c); \ >+ n = 0; \ >+ } \ >+ } \ >+ } while (0) > > /*---------------------------------------------------------------------------*/ > >@@ -194,135 +186,119 @@ namespace angle > * if wanted. Both ph1 and pcarry are required arguments. */ > void PMurHash32_Process(uint32_t *ph1, uint32_t *pcarry, const void *key, int len) > { >- uint32_t h1 = *ph1; >- uint32_t c = *pcarry; >+ uint32_t h1 = *ph1; >+ uint32_t c = *pcarry; > >- const uint8_t *ptr = (uint8_t*)key; >- const uint8_t *end; >+ const uint8_t *ptr = (uint8_t *)key; >+ const uint8_t *end; > >- /* Extract carry count from low 2 bits of c value */ >- int n = c & 3; >+ /* Extract carry count from low 2 bits of c value */ >+ int n = c & 3; > > #if defined(UNALIGNED_SAFE) >- /* This CPU handles unaligned word access */ >+ /* This CPU handles unaligned word access */ > >- /* Consume any carry bytes */ >- int i = (4-n) & 3; >- if(i && i <= len) { >- DOBYTES(i, h1, c, n, ptr, len); >- } >- >- /* Process 32-bit chunks */ >- end = ptr + len/4*4; >- for( ; ptr < end ; ptr+=4) { >- uint32_t k1 = READ_UINT32(ptr); >- DOBLOCK(h1, k1); >- } >+ /* Consume any carry bytes */ >+ int i = (4 - n) & 3; >+ if (i && i <= len) >+ { >+ DOBYTES(i, h1, c, n, ptr, len); >+ } > >-#else /*UNALIGNED_SAFE*/ >- /* This CPU does not handle unaligned word access */ >+ /* Process 32-bit chunks */ >+ end = ptr + len / 4 * 4; >+ for (; ptr < end; ptr += 4) >+ { >+ uint32_t k1 = READ_UINT32(ptr); >+ DOBLOCK(h1, k1); >+ } > >- /* Consume enough so that the next data byte is word aligned */ >- int i = -(long)ptr & 3; >- if(i && i <= len) { >- DOBYTES(i, h1, c, n, ptr, len); >- } >+#else /*UNALIGNED_SAFE*/ >+ /* This CPU does not handle unaligned word access */ > >- /* We're now aligned. Process in aligned blocks. Specialise for each possible carry count */ >- end = ptr + len/4*4; >- switch(n) { /* how many bytes in c */ >- case 0: /* c=[----] w=[3210] b=[3210]=w c'=[----] */ >- for( ; ptr < end ; ptr+=4) { >-#if defined(__clang__) >-#pragma clang diagnostic push >-#pragma clang diagnostic ignored "-Wcast-align" >-#endif >- uint32_t k1 = READ_UINT32(ptr); >-#if defined(__clang__) >-#pragma clang diagnostic pop >-#endif >- DOBLOCK(h1, k1); >- } >- break; >- case 1: /* c=[0---] w=[4321] b=[3210]=c>>24|w<<8 c'=[4---] */ >- for( ; ptr < end ; ptr+=4) { >- uint32_t k1 = c>>24; >-#if defined(__clang__) >-#pragma clang diagnostic push >-#pragma clang diagnostic ignored "-Wcast-align" >-#endif >- c = READ_UINT32(ptr); >-#if defined(__clang__) >-#pragma clang diagnostic pop >-#endif >- k1 |= c<<8; >- DOBLOCK(h1, k1); >+ /* Consume enough so that the next data byte is word aligned */ >+ int i = -(intptr_t)ptr & 3; >+ if (i && i <= len) >+ { >+ DOBYTES(i, h1, c, n, ptr, len); > } >- break; >- case 2: /* c=[10--] w=[5432] b=[3210]=c>>16|w<<16 c'=[54--] */ >- for( ; ptr < end ; ptr+=4) { >- uint32_t k1 = c>>16; >-#if defined(__clang__) >-#pragma clang diagnostic push >-#pragma clang diagnostic ignored "-Wcast-align" >-#endif >- c = READ_UINT32(ptr); >-#if defined(__clang__) >-#pragma clang diagnostic pop >-#endif >- k1 |= c<<16; >- DOBLOCK(h1, k1); >- } >- break; >- case 3: /* c=[210-] w=[6543] b=[3210]=c>>8|w<<24 c'=[654-] */ >- for( ; ptr < end ; ptr+=4) { >- uint32_t k1 = c>>8; >-#if defined(__clang__) >-#pragma clang diagnostic push >-#pragma clang diagnostic ignored "-Wcast-align" >-#endif >- c = READ_UINT32(ptr); >-#if defined(__clang__) >-#pragma clang diagnostic pop >-#endif >- k1 |= c<<24; >- DOBLOCK(h1, k1); >+ >+ /* We're now aligned. Process in aligned blocks. Specialise for each possible carry count */ >+ end = ptr + len / 4 * 4; >+ switch (n) >+ { /* how many bytes in c */ >+ case 0: /* c=[----] w=[3210] b=[3210]=w c'=[----] */ >+ for (; ptr < end; ptr += 4) >+ { >+ uint32_t k1 = READ_UINT32(ptr); >+ DOBLOCK(h1, k1); >+ } >+ break; >+ case 1: /* c=[0---] w=[4321] b=[3210]=c>>24|w<<8 c'=[4---] */ >+ for (; ptr < end; ptr += 4) >+ { >+ uint32_t k1 = c >> 24; >+ c = READ_UINT32(ptr); >+ k1 |= c << 8; >+ DOBLOCK(h1, k1); >+ } >+ break; >+ case 2: /* c=[10--] w=[5432] b=[3210]=c>>16|w<<16 c'=[54--] */ >+ for (; ptr < end; ptr += 4) >+ { >+ uint32_t k1 = c >> 16; >+ c = READ_UINT32(ptr); >+ k1 |= c << 16; >+ DOBLOCK(h1, k1); >+ } >+ break; >+ case 3: /* c=[210-] w=[6543] b=[3210]=c>>8|w<<24 c'=[654-] */ >+ for (; ptr < end; ptr += 4) >+ { >+ uint32_t k1 = c >> 8; >+ c = READ_UINT32(ptr); >+ k1 |= c << 24; >+ DOBLOCK(h1, k1); >+ } > } >- } > #endif /*UNALIGNED_SAFE*/ > >- /* Advance over whole 32-bit chunks, possibly leaving 1..3 bytes */ >- len -= len/4*4; >+ /* Advance over whole 32-bit chunks, possibly leaving 1..3 bytes */ >+ len -= len / 4 * 4; > >- /* Append any remaining bytes into carry */ >- DOBYTES(len, h1, c, n, ptr, len); >+ /* Append any remaining bytes into carry */ >+ DOBYTES(len, h1, c, n, ptr, len); > >- /* Copy out new running hash and carry */ >- *ph1 = h1; >- *pcarry = (c & ~0xff) | n; >-} >+ /* Copy out new running hash and carry */ >+ *ph1 = h1; >+ *pcarry = (c & ~0xff) | n; >+} > > /*---------------------------------------------------------------------------*/ > > /* Finalize a hash. To match the original Murmur3A the total_length must be provided */ > uint32_t PMurHash32_Result(uint32_t h, uint32_t carry, uint32_t total_length) > { >- uint32_t k1; >- int n = carry & 3; >- if(n) { >- k1 = carry >> (4-n)*8; >- k1 *= C1; k1 = ROTL32(k1,15); k1 *= C2; h ^= k1; >- } >- h ^= total_length; >+ uint32_t k1; >+ int n = carry & 3; >+ if (n) >+ { >+ k1 = carry >> (4 - n) * 8; >+ k1 *= C1; >+ k1 = ROTL32(k1, 15); >+ k1 *= C2; >+ h ^= k1; >+ } >+ h ^= total_length; > >- /* fmix */ >- h ^= h >> 16; >- h *= 0x85ebca6b; >- h ^= h >> 13; >- h *= 0xc2b2ae35; >- h ^= h >> 16; >+ /* fmix */ >+ h ^= h >> 16; >+ h *= 0x85ebca6b; >+ h ^= h >> 13; >+ h *= 0xc2b2ae35; >+ h ^= h >> 16; > >- return h; >+ return h; > } > > /*---------------------------------------------------------------------------*/ >@@ -330,9 +306,9 @@ uint32_t PMurHash32_Result(uint32_t h, uint32_t carry, uint32_t total_length) > /* Murmur3A compatable all-at-once */ > uint32_t PMurHash32(uint32_t seed, const void *key, int len) > { >- uint32_t h1=seed, carry=0; >- PMurHash32_Process(&h1, &carry, key, len); >- return PMurHash32_Result(h1, carry, len); >+ uint32_t h1 = seed, carry = 0; >+ PMurHash32_Process(&h1, &carry, key, len); >+ return PMurHash32_Result(h1, carry, len); > } > > /*---------------------------------------------------------------------------*/ >@@ -340,9 +316,9 @@ uint32_t PMurHash32(uint32_t seed, const void *key, int len) > /* Provide an API suitable for smhasher */ > void PMurHash32_test(const void *key, int len, uint32_t seed, void *out) > { >- uint32_t h1=seed, carry=0; >- const uint8_t *ptr = (uint8_t*)key; >- const uint8_t *end = ptr + len; >+ uint32_t h1 = seed, carry = 0; >+ const uint8_t *ptr = (uint8_t *)key; >+ const uint8_t *end = ptr + len; > > #if 0 /* Exercise the progressive processing */ > while(ptr < end) { >@@ -353,11 +329,11 @@ void PMurHash32_test(const void *key, int len, uint32_t seed, void *out) > ptr = mid; > } > #else >- PMurHash32_Process(&h1, &carry, ptr, (int)(end-ptr)); >+ PMurHash32_Process(&h1, &carry, ptr, (int)(end - ptr)); > #endif >- h1 = PMurHash32_Result(h1, carry, len); >- *(uint32_t*)out = h1; >-} >+ h1 = PMurHash32_Result(h1, carry, len); >+ *(uint32_t *)out = h1; > } >+} // namespace angle > > /*---------------------------------------------------------------------------*/ >diff --git a/Source/ThirdParty/ANGLE/src/common/third_party/smhasher/src/PMurHash.h b/Source/ThirdParty/ANGLE/src/common/third_party/smhasher/src/PMurHash.h >index 57c56c538d6..0a3c96fa142 100644 >--- a/Source/ThirdParty/ANGLE/src/common/third_party/smhasher/src/PMurHash.h >+++ b/Source/ThirdParty/ANGLE/src/common/third_party/smhasher/src/PMurHash.h >@@ -16,35 +16,33 @@ > > /* First look for special cases */ > #if defined(_MSC_VER) >- #define MH_UINT32 unsigned long >+# define MH_UINT32 unsigned long > #endif > > /* If the compiler says it's C99 then take its word for it */ >-#if !defined(MH_UINT32) && ( \ >- defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L ) >- #include <stdint.h> >- #define MH_UINT32 uint32_t >+#if !defined(MH_UINT32) && (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) >+# include <stdint.h> >+# define MH_UINT32 uint32_t > #endif > > /* Otherwise try testing against max value macros from limit.h */ > #if !defined(MH_UINT32) >- #include <limits.h> >- #if (USHRT_MAX == 0xffffffffUL) >- #define MH_UINT32 unsigned short >- #elif (UINT_MAX == 0xffffffffUL) >- #define MH_UINT32 unsigned int >- #elif (ULONG_MAX == 0xffffffffUL) >- #define MH_UINT32 unsigned long >- #endif >+# include <limits.h> >+# if (USHRT_MAX == 0xffffffffUL) >+# define MH_UINT32 unsigned short >+# elif (UINT_MAX == 0xffffffffUL) >+# define MH_UINT32 unsigned int >+# elif (ULONG_MAX == 0xffffffffUL) >+# define MH_UINT32 unsigned long >+# endif > #endif > > #if !defined(MH_UINT32) >- #error Unable to determine type name for unsigned 32-bit int >+# error Unable to determine type name for unsigned 32-bit int > #endif > > /* I'm yet to work on a platform where 'unsigned char' is not 8 bits */ >-#define MH_UINT8 unsigned char >- >+#define MH_UINT8 unsigned char > > /* ------------------------------------------------------------------------- */ > /* Prototypes */ >@@ -56,4 +54,4 @@ MH_UINT32 PMurHash32_Result(MH_UINT32 h1, MH_UINT32 carry, MH_UINT32 total_lengt > MH_UINT32 PMurHash32(MH_UINT32 seed, const void *key, int len); > > void PMurHash32_test(const void *key, int len, MH_UINT32 seed, void *out); >-} >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/LICENSE b/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/LICENSE >new file mode 100644 >index 00000000000..7de801ed1bc >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/LICENSE >@@ -0,0 +1,24 @@ >+xxHash Library >+Copyright (c) 2012-2014, Yann Collet >+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. >+ >+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 HOLDER 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. >diff --git a/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/README.chromium b/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/README.chromium >new file mode 100644 >index 00000000000..ba6652c3974 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/README.chromium >@@ -0,0 +1,8 @@ >+Name: xxHash >+URL: https://github.com/Cyan4973/xxHash >+License: BSD >+License File: LICENSE >+Security Critical: yes >+ >+Description: >+Extremely fast non-cryptographic hash algorithm >diff --git a/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/README.md b/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/README.md >new file mode 100644 >index 00000000000..6a0ad1910a8 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/README.md >@@ -0,0 +1,167 @@ >+xxHash - Extremely fast hash algorithm >+====================================== >+ >+xxHash is an Extremely fast Hash algorithm, running at RAM speed limits. >+It successfully completes the [SMHasher](http://code.google.com/p/smhasher/wiki/SMHasher) test suite >+which evaluates collision, dispersion and randomness qualities of hash functions. >+Code is highly portable, and hashes are identical on all platforms (little / big endian). >+ >+|Branch |Status | >+|------------|---------| >+|master | [](https://travis-ci.org/Cyan4973/xxHash?branch=master) | >+|dev | [](https://travis-ci.org/Cyan4973/xxHash?branch=dev) | >+ >+ >+ >+Benchmarks >+------------------------- >+ >+The benchmark uses SMHasher speed test, compiled with Visual 2010 on a Windows Seven 32-bit box. >+The reference system uses a Core 2 Duo @3GHz >+ >+ >+| Name | Speed | Quality | Author | >+|---------------|----------|:-------:|------------------| >+| [xxHash] | 5.4 GB/s | 10 | Y.C. | >+| MurmurHash 3a | 2.7 GB/s | 10 | Austin Appleby | >+| SBox | 1.4 GB/s | 9 | Bret Mulvey | >+| Lookup3 | 1.2 GB/s | 9 | Bob Jenkins | >+| CityHash64 | 1.05 GB/s| 10 | Pike & Alakuijala| >+| FNV | 0.55 GB/s| 5 | Fowler, Noll, Vo | >+| CRC32 | 0.43 GB/s| 9 | | >+| MD5-32 | 0.33 GB/s| 10 | Ronald L.Rivest | >+| SHA1-32 | 0.28 GB/s| 10 | | >+ >+[xxHash]: http://www.xxhash.com >+ >+Q.Score is a measure of quality of the hash function. >+It depends on successfully passing SMHasher test set. >+10 is a perfect score. >+Algorithms with a score < 5 are not listed on this table. >+ >+A more recent version, XXH64, has been created thanks to [Mathias Westerdahl](https://github.com/JCash), >+which offers superior speed and dispersion for 64-bit systems. >+Note however that 32-bit applications will still run faster using the 32-bit version. >+ >+SMHasher speed test, compiled using GCC 4.8.2, on Linux Mint 64-bit. >+The reference system uses a Core i5-3340M @2.7GHz >+ >+| Version | Speed on 64-bit | Speed on 32-bit | >+|------------|------------------|------------------| >+| XXH64 | 13.8 GB/s | 1.9 GB/s | >+| XXH32 | 6.8 GB/s | 6.0 GB/s | >+ >+This project also includes a command line utility, named `xxhsum`, offering similar features as `md5sum`, >+thanks to [Takayuki Matsuoka](https://github.com/t-mat) contributions. >+ >+ >+### License >+ >+The library files `xxhash.c` and `xxhash.h` are BSD licensed. >+The utility `xxhsum` is GPL licensed. >+ >+ >+### Build modifiers >+ >+The following macros can be set at compilation time, >+they modify xxhash behavior. They are all disabled by default. >+ >+- `XXH_INLINE_ALL` : Make all functions `inline`, with bodies directly included within `xxhash.h`. >+ There is no need for an `xxhash.o` module in this case. >+ Inlining functions is generally beneficial for speed on small keys. >+ It's especially effective when key length is a compile time constant, >+ with observed performance improvement in the +200% range . >+ See [this article](https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html) for details. >+- `XXH_ACCEPT_NULL_INPUT_POINTER` : if set to `1`, when input is a null-pointer, >+ xxhash result is the same as a zero-length key >+ (instead of a dereference segfault). >+- `XXH_FORCE_MEMORY_ACCESS` : default method `0` uses a portable `memcpy()` notation. >+ Method `1` uses a gcc-specific `packed` attribute, which can provide better performance for some targets. >+ Method `2` forces unaligned reads, which is not standard compliant, but might sometimes be the only way to extract better performance. >+- `XXH_CPU_LITTLE_ENDIAN` : by default, endianess is determined at compile time. >+ It's possible to skip auto-detection and force format to little-endian, by setting this macro to 1. >+ Setting it to 0 forces big-endian. >+- `XXH_FORCE_NATIVE_FORMAT` : on big-endian systems : use native number representation. >+ Breaks consistency with little-endian results. >+- `XXH_PRIVATE_API` : same impact as `XXH_INLINE_ALL`. >+ Name underlines that symbols will not be published on library public interface. >+- `XXH_NAMESPACE` : prefix all symbols with the value of `XXH_NAMESPACE`. >+ Useful to evade symbol naming collisions, >+ in case of multiple inclusions of xxHash source code. >+ Client applications can still use regular function name, >+ symbols are automatically translated through `xxhash.h`. >+- `XXH_STATIC_LINKING_ONLY` : gives access to state declaration for static allocation. >+ Incompatible with dynamic linking, due to risks of ABI changes. >+- `XXH_NO_LONG_LONG` : removes support for XXH64, >+ for targets without 64-bit support. >+ >+ >+### Example >+ >+Calling xxhash 64-bit variant from a C program : >+ >+```c >+#include "xxhash.h" >+ >+unsigned long long calcul_hash(const void* buffer, size_t length) >+{ >+ unsigned long long const seed = 0; /* or any other value */ >+ unsigned long long const hash = XXH64(buffer, length, seed); >+ return hash; >+} >+``` >+ >+Using streaming variant is more involved, but makes it possible to provide data in multiple rounds : >+```c >+#include "stdlib.h" /* abort() */ >+#include "xxhash.h" >+ >+ >+unsigned long long calcul_hash_streaming(someCustomType handler) >+{ >+ XXH64_state_t* const state = XXH64_createState(); >+ if (state==NULL) abort(); >+ >+ size_t const bufferSize = SOME_VALUE; >+ void* const buffer = malloc(bufferSize); >+ if (buffer==NULL) abort(); >+ >+ unsigned long long const seed = 0; /* or any other value */ >+ XXH_errorcode const resetResult = XXH64_reset(state, seed); >+ if (resetResult == XXH_ERROR) abort(); >+ >+ (...) >+ while ( /* any condition */ ) { >+ size_t const length = get_more_data(buffer, bufferSize, handler); /* undescribed */ >+ XXH_errorcode const addResult = XXH64_update(state, buffer, length); >+ if (addResult == XXH_ERROR) abort(); >+ (...) >+ } >+ >+ (...) >+ unsigned long long const hash = XXH64_digest(state); >+ >+ free(buffer); >+ XXH64_freeState(state); >+ >+ return hash; >+} >+``` >+ >+ >+### Other programming languages >+ >+Beyond the C reference version, >+xxHash is also available on many programming languages, >+thanks to great contributors. >+They are [listed here](http://www.xxhash.com/#other-languages). >+ >+ >+### Branch Policy >+ >+> - The "master" branch is considered stable, at all times. >+> - The "dev" branch is the one where all contributions must be merged >+ before being promoted to master. >+> + If you plan to propose a patch, please commit into the "dev" branch, >+ or its own feature branch. >+ Direct commit to "master" are not permitted. >diff --git a/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/xxhash.c b/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/xxhash.c >new file mode 100644 >index 00000000000..13669b2a4d9 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/xxhash.c >@@ -0,0 +1,1030 @@ >+/* >+* xxHash - Fast Hash algorithm >+* Copyright (C) 2012-2016, Yann Collet >+* >+* BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) >+* >+* 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. >+* >+* 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. >+* >+* You can contact the author at : >+* - xxHash homepage: http://www.xxhash.com >+* - xxHash source repository : https://github.com/Cyan4973/xxHash >+*/ >+ >+ >+/* ************************************* >+* Tuning parameters >+***************************************/ >+/*!XXH_FORCE_MEMORY_ACCESS : >+ * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. >+ * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. >+ * The below switch allow to select different access method for improved performance. >+ * Method 0 (default) : use `memcpy()`. Safe and portable. >+ * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). >+ * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. >+ * Method 2 : direct access. This method doesn't depend on compiler but violate C standard. >+ * It can generate buggy code on targets which do not support unaligned memory accesses. >+ * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) >+ * See http://stackoverflow.com/a/32095106/646947 for details. >+ * Prefer these methods in priority order (0 > 1 > 2) >+ */ >+#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ >+# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ >+ || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ >+ || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) >+# define XXH_FORCE_MEMORY_ACCESS 2 >+# elif (defined(__INTEL_COMPILER) && !defined(_WIN32)) || \ >+ (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ >+ || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ >+ || defined(__ARM_ARCH_7S__) )) >+# define XXH_FORCE_MEMORY_ACCESS 1 >+# endif >+#endif >+ >+/*!XXH_ACCEPT_NULL_INPUT_POINTER : >+ * If input pointer is NULL, xxHash default behavior is to dereference it, triggering a segfault. >+ * When this macro is enabled, xxHash actively checks input for null pointer. >+ * It it is, result for null input pointers is the same as a null-length input. >+ */ >+#ifndef XXH_ACCEPT_NULL_INPUT_POINTER /* can be defined externally */ >+# define XXH_ACCEPT_NULL_INPUT_POINTER 0 >+#endif >+ >+/*!XXH_FORCE_NATIVE_FORMAT : >+ * By default, xxHash library provides endian-independent Hash values, based on little-endian convention. >+ * Results are therefore identical for little-endian and big-endian CPU. >+ * This comes at a performance cost for big-endian CPU, since some swapping is required to emulate little-endian format. >+ * Should endian-independence be of no importance for your application, you may set the #define below to 1, >+ * to improve speed for Big-endian CPU. >+ * This option has no impact on Little_Endian CPU. >+ */ >+#ifndef XXH_FORCE_NATIVE_FORMAT /* can be defined externally */ >+# define XXH_FORCE_NATIVE_FORMAT 0 >+#endif >+ >+/*!XXH_FORCE_ALIGN_CHECK : >+ * This is a minor performance trick, only useful with lots of very small keys. >+ * It means : check for aligned/unaligned input. >+ * The check costs one initial branch per hash; >+ * set it to 0 when the input is guaranteed to be aligned, >+ * or when alignment doesn't matter for performance. >+ */ >+#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ >+# if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) >+# define XXH_FORCE_ALIGN_CHECK 0 >+# else >+# define XXH_FORCE_ALIGN_CHECK 1 >+# endif >+#endif >+ >+ >+/* ************************************* >+* Includes & Memory related functions >+***************************************/ >+/*! Modify the local functions below should you wish to use some other memory routines >+* for malloc(), free() */ >+#include <stdlib.h> >+static void* XXH_malloc(size_t s) { return malloc(s); } >+static void XXH_free (void* p) { free(p); } >+/*! and for memcpy() */ >+#include <string.h> >+static void* XXH_memcpy(void* dest, const void* src, size_t size) { return memcpy(dest,src,size); } >+ >+#include <assert.h> /* assert */ >+ >+#define XXH_STATIC_LINKING_ONLY >+#include "xxhash.h" >+ >+ >+/* ************************************* >+* Compiler Specific Options >+***************************************/ >+#ifdef _MSC_VER /* Visual Studio */ >+# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ >+# define FORCE_INLINE static __forceinline >+#else >+# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ >+# ifdef __GNUC__ >+# define FORCE_INLINE static inline __attribute__((always_inline)) >+# else >+# define FORCE_INLINE static inline >+# endif >+# else >+# define FORCE_INLINE static >+# endif /* __STDC_VERSION__ */ >+#endif >+ >+ >+/* ************************************* >+* Basic Types >+***************************************/ >+#ifndef MEM_MODULE >+# if !defined (__VMS) \ >+ && (defined (__cplusplus) \ >+ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) >+# include <stdint.h> >+ typedef uint8_t BYTE; >+ typedef uint16_t U16; >+ typedef uint32_t U32; >+# else >+ typedef unsigned char BYTE; >+ typedef unsigned short U16; >+ typedef unsigned int U32; >+# endif >+#endif >+ >+#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) >+ >+/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ >+static U32 XXH_read32(const void* memPtr) { return *(const U32*) memPtr; } >+ >+#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) >+ >+/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ >+/* currently only defined for gcc and icc */ >+typedef union { U32 u32; } __attribute__((packed)) unalign; >+static U32 XXH_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } >+ >+#else >+ >+/* portable and safe solution. Generally efficient. >+ * see : http://stackoverflow.com/a/32095106/646947 >+ */ >+static U32 XXH_read32(const void* memPtr) >+{ >+ U32 val; >+ memcpy(&val, memPtr, sizeof(val)); >+ return val; >+} >+ >+#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ >+ >+ >+/* **************************************** >+* Compiler-specific Functions and Macros >+******************************************/ >+#define XXH_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) >+ >+/* Note : although _rotl exists for minGW (GCC under windows), performance seems poor */ >+#if defined(_MSC_VER) >+# define XXH_rotl32(x,r) _rotl(x,r) >+# define XXH_rotl64(x,r) _rotl64(x,r) >+#else >+# define XXH_rotl32(x,r) ((x << r) | (x >> (32 - r))) >+# define XXH_rotl64(x,r) ((x << r) | (x >> (64 - r))) >+#endif >+ >+#if defined(_MSC_VER) /* Visual Studio */ >+# define XXH_swap32 _byteswap_ulong >+#elif XXH_GCC_VERSION >= 403 >+# define XXH_swap32 __builtin_bswap32 >+#else >+static U32 XXH_swap32 (U32 x) >+{ >+ return ((x << 24) & 0xff000000 ) | >+ ((x << 8) & 0x00ff0000 ) | >+ ((x >> 8) & 0x0000ff00 ) | >+ ((x >> 24) & 0x000000ff ); >+} >+#endif >+ >+ >+/* ************************************* >+* Architecture Macros >+***************************************/ >+typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess; >+ >+/* XXH_CPU_LITTLE_ENDIAN can be defined externally, for example on the compiler command line */ >+#ifndef XXH_CPU_LITTLE_ENDIAN >+static int XXH_isLittleEndian(void) >+{ >+ const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ >+ return one.c[0]; >+} >+# define XXH_CPU_LITTLE_ENDIAN XXH_isLittleEndian() >+#endif >+ >+ >+/* *************************** >+* Memory reads >+*****************************/ >+typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment; >+ >+FORCE_INLINE U32 XXH_readLE32_align(const void* ptr, XXH_endianess endian, XXH_alignment align) >+{ >+ if (align==XXH_unaligned) >+ return endian==XXH_littleEndian ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr)); >+ else >+ return endian==XXH_littleEndian ? *(const U32*)ptr : XXH_swap32(*(const U32*)ptr); >+} >+ >+FORCE_INLINE U32 XXH_readLE32(const void* ptr, XXH_endianess endian) >+{ >+ return XXH_readLE32_align(ptr, endian, XXH_unaligned); >+} >+ >+static U32 XXH_readBE32(const void* ptr) >+{ >+ return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr); >+} >+ >+ >+/* ************************************* >+* Macros >+***************************************/ >+#define XXH_STATIC_ASSERT(c) { enum { XXH_sa = 1/(int)(!!(c)) }; } /* use after variable declarations */ >+XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; } >+ >+ >+/* ******************************************************************* >+* 32-bit hash functions >+*********************************************************************/ >+static const U32 PRIME32_1 = 2654435761U; /* 0b10011110001101110111100110110001 */ >+static const U32 PRIME32_2 = 2246822519U; /* 0b10000101111010111100101001110111 */ >+static const U32 PRIME32_3 = 3266489917U; /* 0b11000010101100101010111000111101 */ >+static const U32 PRIME32_4 = 668265263U; /* 0b00100111110101001110101100101111 */ >+static const U32 PRIME32_5 = 374761393U; /* 0b00010110010101100110011110110001 */ >+ >+static U32 XXH32_round(U32 seed, U32 input) >+{ >+ seed += input * PRIME32_2; >+ seed = XXH_rotl32(seed, 13); >+ seed *= PRIME32_1; >+ return seed; >+} >+ >+/* mix all bits */ >+static U32 XXH32_avalanche(U32 h32) >+{ >+ h32 ^= h32 >> 15; >+ h32 *= PRIME32_2; >+ h32 ^= h32 >> 13; >+ h32 *= PRIME32_3; >+ h32 ^= h32 >> 16; >+ return(h32); >+} >+ >+#define XXH_get32bits(p) XXH_readLE32_align(p, endian, align) >+ >+static U32 >+XXH32_finalize(U32 h32, const void* ptr, size_t len, >+ XXH_endianess endian, XXH_alignment align) >+ >+{ >+ const BYTE* p = (const BYTE*)ptr; >+ >+#define PROCESS1 \ >+ h32 += (*p++) * PRIME32_5; \ >+ h32 = XXH_rotl32(h32, 11) * PRIME32_1 ; >+ >+#define PROCESS4 \ >+ h32 += XXH_get32bits(p) * PRIME32_3; \ >+ p+=4; \ >+ h32 = XXH_rotl32(h32, 17) * PRIME32_4 ; >+ >+ switch(len&15) /* or switch(bEnd - p) */ >+ { >+ case 12: PROCESS4; >+ /* fallthrough */ >+ case 8: PROCESS4; >+ /* fallthrough */ >+ case 4: PROCESS4; >+ return XXH32_avalanche(h32); >+ >+ case 13: PROCESS4; >+ /* fallthrough */ >+ case 9: PROCESS4; >+ /* fallthrough */ >+ case 5: PROCESS4; >+ PROCESS1; >+ return XXH32_avalanche(h32); >+ >+ case 14: PROCESS4; >+ /* fallthrough */ >+ case 10: PROCESS4; >+ /* fallthrough */ >+ case 6: PROCESS4; >+ PROCESS1; >+ PROCESS1; >+ return XXH32_avalanche(h32); >+ >+ case 15: PROCESS4; >+ /* fallthrough */ >+ case 11: PROCESS4; >+ /* fallthrough */ >+ case 7: PROCESS4; >+ /* fallthrough */ >+ case 3: PROCESS1; >+ /* fallthrough */ >+ case 2: PROCESS1; >+ /* fallthrough */ >+ case 1: PROCESS1; >+ /* fallthrough */ >+ case 0: return XXH32_avalanche(h32); >+ } >+ assert(0); >+ return h32; /* reaching this point is deemed impossible */ >+} >+ >+ >+FORCE_INLINE U32 >+XXH32_endian_align(const void* input, size_t len, U32 seed, >+ XXH_endianess endian, XXH_alignment align) >+{ >+ const BYTE* p = (const BYTE*)input; >+ const BYTE* bEnd = p + len; >+ U32 h32; >+ >+#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) >+ if (p==NULL) { >+ len=0; >+ bEnd=p=(const BYTE*)(size_t)16; >+ } >+#endif >+ >+ if (len>=16) { >+ const BYTE* const limit = bEnd - 15; >+ U32 v1 = seed + PRIME32_1 + PRIME32_2; >+ U32 v2 = seed + PRIME32_2; >+ U32 v3 = seed + 0; >+ U32 v4 = seed - PRIME32_1; >+ >+ do { >+ v1 = XXH32_round(v1, XXH_get32bits(p)); p+=4; >+ v2 = XXH32_round(v2, XXH_get32bits(p)); p+=4; >+ v3 = XXH32_round(v3, XXH_get32bits(p)); p+=4; >+ v4 = XXH32_round(v4, XXH_get32bits(p)); p+=4; >+ } while (p < limit); >+ >+ h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) >+ + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18); >+ } else { >+ h32 = seed + PRIME32_5; >+ } >+ >+ h32 += (U32)len; >+ >+ return XXH32_finalize(h32, p, len&15, endian, align); >+} >+ >+ >+XXH_PUBLIC_API unsigned int XXH32 (const void* input, size_t len, unsigned int seed) >+{ >+#if 0 >+ /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ >+ XXH32_state_t state; >+ XXH32_reset(&state, seed); >+ XXH32_update(&state, input, len); >+ return XXH32_digest(&state); >+#else >+ XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; >+ >+ if (XXH_FORCE_ALIGN_CHECK) { >+ if ((((size_t)input) & 3) == 0) { /* Input is 4-bytes aligned, leverage the speed benefit */ >+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) >+ return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned); >+ else >+ return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned); >+ } } >+ >+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) >+ return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned); >+ else >+ return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned); >+#endif >+} >+ >+ >+ >+/*====== Hash streaming ======*/ >+ >+XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void) >+{ >+ return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t)); >+} >+XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr) >+{ >+ XXH_free(statePtr); >+ return XXH_OK; >+} >+ >+XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState) >+{ >+ memcpy(dstState, srcState, sizeof(*dstState)); >+} >+ >+XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, unsigned int seed) >+{ >+ XXH32_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */ >+ memset(&state, 0, sizeof(state)); >+ state.v1 = seed + PRIME32_1 + PRIME32_2; >+ state.v2 = seed + PRIME32_2; >+ state.v3 = seed + 0; >+ state.v4 = seed - PRIME32_1; >+ /* do not write into reserved, planned to be removed in a future version */ >+ memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved)); >+ return XXH_OK; >+} >+ >+ >+FORCE_INLINE XXH_errorcode >+XXH32_update_endian(XXH32_state_t* state, const void* input, size_t len, XXH_endianess endian) >+{ >+ if (input==NULL) >+#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) >+ return XXH_OK; >+#else >+ return XXH_ERROR; >+#endif >+ >+ { const BYTE* p = (const BYTE*)input; >+ const BYTE* const bEnd = p + len; >+ >+ state->total_len_32 += (unsigned)len; >+ state->large_len |= (len>=16) | (state->total_len_32>=16); >+ >+ if (state->memsize + len < 16) { /* fill in tmp buffer */ >+ XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, len); >+ state->memsize += (unsigned)len; >+ return XXH_OK; >+ } >+ >+ if (state->memsize) { /* some data left from previous update */ >+ XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, 16-state->memsize); >+ { const U32* p32 = state->mem32; >+ state->v1 = XXH32_round(state->v1, XXH_readLE32(p32, endian)); p32++; >+ state->v2 = XXH32_round(state->v2, XXH_readLE32(p32, endian)); p32++; >+ state->v3 = XXH32_round(state->v3, XXH_readLE32(p32, endian)); p32++; >+ state->v4 = XXH32_round(state->v4, XXH_readLE32(p32, endian)); >+ } >+ p += 16-state->memsize; >+ state->memsize = 0; >+ } >+ >+ if (p <= bEnd-16) { >+ const BYTE* const limit = bEnd - 16; >+ U32 v1 = state->v1; >+ U32 v2 = state->v2; >+ U32 v3 = state->v3; >+ U32 v4 = state->v4; >+ >+ do { >+ v1 = XXH32_round(v1, XXH_readLE32(p, endian)); p+=4; >+ v2 = XXH32_round(v2, XXH_readLE32(p, endian)); p+=4; >+ v3 = XXH32_round(v3, XXH_readLE32(p, endian)); p+=4; >+ v4 = XXH32_round(v4, XXH_readLE32(p, endian)); p+=4; >+ } while (p<=limit); >+ >+ state->v1 = v1; >+ state->v2 = v2; >+ state->v3 = v3; >+ state->v4 = v4; >+ } >+ >+ if (p < bEnd) { >+ XXH_memcpy(state->mem32, p, (size_t)(bEnd-p)); >+ state->memsize = (unsigned)(bEnd-p); >+ } >+ } >+ >+ return XXH_OK; >+} >+ >+ >+XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* state_in, const void* input, size_t len) >+{ >+ XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; >+ >+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) >+ return XXH32_update_endian(state_in, input, len, XXH_littleEndian); >+ else >+ return XXH32_update_endian(state_in, input, len, XXH_bigEndian); >+} >+ >+ >+FORCE_INLINE U32 >+XXH32_digest_endian (const XXH32_state_t* state, XXH_endianess endian) >+{ >+ U32 h32; >+ >+ if (state->large_len) { >+ h32 = XXH_rotl32(state->v1, 1) >+ + XXH_rotl32(state->v2, 7) >+ + XXH_rotl32(state->v3, 12) >+ + XXH_rotl32(state->v4, 18); >+ } else { >+ h32 = state->v3 /* == seed */ + PRIME32_5; >+ } >+ >+ h32 += state->total_len_32; >+ >+ return XXH32_finalize(h32, state->mem32, state->memsize, endian, XXH_aligned); >+} >+ >+ >+XXH_PUBLIC_API unsigned int XXH32_digest (const XXH32_state_t* state_in) >+{ >+ XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; >+ >+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) >+ return XXH32_digest_endian(state_in, XXH_littleEndian); >+ else >+ return XXH32_digest_endian(state_in, XXH_bigEndian); >+} >+ >+ >+/*====== Canonical representation ======*/ >+ >+/*! Default XXH result types are basic unsigned 32 and 64 bits. >+* The canonical representation follows human-readable write convention, aka big-endian (large digits first). >+* These functions allow transformation of hash result into and from its canonical format. >+* This way, hash values can be written into a file or buffer, remaining comparable across different systems. >+*/ >+ >+XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash) >+{ >+ XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t)); >+ if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash); >+ memcpy(dst, &hash, sizeof(*dst)); >+} >+ >+XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src) >+{ >+ return XXH_readBE32(src); >+} >+ >+ >+#ifndef XXH_NO_LONG_LONG >+ >+/* ******************************************************************* >+* 64-bit hash functions >+*********************************************************************/ >+ >+/*====== Memory access ======*/ >+ >+#ifndef MEM_MODULE >+# define MEM_MODULE >+# if !defined (__VMS) \ >+ && (defined (__cplusplus) \ >+ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) >+# include <stdint.h> >+ typedef uint64_t U64; >+# else >+ /* if compiler doesn't support unsigned long long, replace by another 64-bit type */ >+ typedef unsigned long long U64; >+# endif >+#endif >+ >+ >+#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) >+ >+/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ >+static U64 XXH_read64(const void* memPtr) { return *(const U64*) memPtr; } >+ >+#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) >+ >+/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ >+/* currently only defined for gcc and icc */ >+typedef union { U32 u32; U64 u64; } __attribute__((packed)) unalign64; >+static U64 XXH_read64(const void* ptr) { return ((const unalign64*)ptr)->u64; } >+ >+#else >+ >+/* portable and safe solution. Generally efficient. >+ * see : http://stackoverflow.com/a/32095106/646947 >+ */ >+ >+static U64 XXH_read64(const void* memPtr) >+{ >+ U64 val; >+ memcpy(&val, memPtr, sizeof(val)); >+ return val; >+} >+ >+#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ >+ >+#if defined(_MSC_VER) /* Visual Studio */ >+# define XXH_swap64 _byteswap_uint64 >+#elif XXH_GCC_VERSION >= 403 >+# define XXH_swap64 __builtin_bswap64 >+#else >+static U64 XXH_swap64 (U64 x) >+{ >+ return ((x << 56) & 0xff00000000000000ULL) | >+ ((x << 40) & 0x00ff000000000000ULL) | >+ ((x << 24) & 0x0000ff0000000000ULL) | >+ ((x << 8) & 0x000000ff00000000ULL) | >+ ((x >> 8) & 0x00000000ff000000ULL) | >+ ((x >> 24) & 0x0000000000ff0000ULL) | >+ ((x >> 40) & 0x000000000000ff00ULL) | >+ ((x >> 56) & 0x00000000000000ffULL); >+} >+#endif >+ >+FORCE_INLINE U64 XXH_readLE64_align(const void* ptr, XXH_endianess endian, XXH_alignment align) >+{ >+ if (align==XXH_unaligned) >+ return endian==XXH_littleEndian ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr)); >+ else >+ return endian==XXH_littleEndian ? *(const U64*)ptr : XXH_swap64(*(const U64*)ptr); >+} >+ >+FORCE_INLINE U64 XXH_readLE64(const void* ptr, XXH_endianess endian) >+{ >+ return XXH_readLE64_align(ptr, endian, XXH_unaligned); >+} >+ >+static U64 XXH_readBE64(const void* ptr) >+{ >+ return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr); >+} >+ >+ >+/*====== xxh64 ======*/ >+ >+static const U64 PRIME64_1 = 11400714785074694791ULL; /* 0b1001111000110111011110011011000110000101111010111100101010000111 */ >+static const U64 PRIME64_2 = 14029467366897019727ULL; /* 0b1100001010110010101011100011110100100111110101001110101101001111 */ >+static const U64 PRIME64_3 = 1609587929392839161ULL; /* 0b0001011001010110011001111011000110011110001101110111100111111001 */ >+static const U64 PRIME64_4 = 9650029242287828579ULL; /* 0b1000010111101011110010100111011111000010101100101010111001100011 */ >+static const U64 PRIME64_5 = 2870177450012600261ULL; /* 0b0010011111010100111010110010111100010110010101100110011111000101 */ >+ >+static U64 XXH64_round(U64 acc, U64 input) >+{ >+ acc += input * PRIME64_2; >+ acc = XXH_rotl64(acc, 31); >+ acc *= PRIME64_1; >+ return acc; >+} >+ >+static U64 XXH64_mergeRound(U64 acc, U64 val) >+{ >+ val = XXH64_round(0, val); >+ acc ^= val; >+ acc = acc * PRIME64_1 + PRIME64_4; >+ return acc; >+} >+ >+static U64 XXH64_avalanche(U64 h64) >+{ >+ h64 ^= h64 >> 33; >+ h64 *= PRIME64_2; >+ h64 ^= h64 >> 29; >+ h64 *= PRIME64_3; >+ h64 ^= h64 >> 32; >+ return h64; >+} >+ >+ >+#define XXH_get64bits(p) XXH_readLE64_align(p, endian, align) >+ >+static U64 >+XXH64_finalize(U64 h64, const void* ptr, size_t len, >+ XXH_endianess endian, XXH_alignment align) >+{ >+ const BYTE* p = (const BYTE*)ptr; >+ >+#define PROCESS1_64 \ >+ h64 ^= (*p++) * PRIME64_5; \ >+ h64 = XXH_rotl64(h64, 11) * PRIME64_1; >+ >+#define PROCESS4_64 \ >+ h64 ^= (U64)(XXH_get32bits(p)) * PRIME64_1; \ >+ p+=4; \ >+ h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3; >+ >+#define PROCESS8_64 { \ >+ U64 const k1 = XXH64_round(0, XXH_get64bits(p)); \ >+ p+=8; \ >+ h64 ^= k1; \ >+ h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4; \ >+} >+ >+ switch(len&31) { >+ case 24: PROCESS8_64; >+ /* fallthrough */ >+ case 16: PROCESS8_64; >+ /* fallthrough */ >+ case 8: PROCESS8_64; >+ return XXH64_avalanche(h64); >+ >+ case 28: PROCESS8_64; >+ /* fallthrough */ >+ case 20: PROCESS8_64; >+ /* fallthrough */ >+ case 12: PROCESS8_64; >+ /* fallthrough */ >+ case 4: PROCESS4_64; >+ return XXH64_avalanche(h64); >+ >+ case 25: PROCESS8_64; >+ /* fallthrough */ >+ case 17: PROCESS8_64; >+ /* fallthrough */ >+ case 9: PROCESS8_64; >+ PROCESS1_64; >+ return XXH64_avalanche(h64); >+ >+ case 29: PROCESS8_64; >+ /* fallthrough */ >+ case 21: PROCESS8_64; >+ /* fallthrough */ >+ case 13: PROCESS8_64; >+ /* fallthrough */ >+ case 5: PROCESS4_64; >+ PROCESS1_64; >+ return XXH64_avalanche(h64); >+ >+ case 26: PROCESS8_64; >+ /* fallthrough */ >+ case 18: PROCESS8_64; >+ /* fallthrough */ >+ case 10: PROCESS8_64; >+ PROCESS1_64; >+ PROCESS1_64; >+ return XXH64_avalanche(h64); >+ >+ case 30: PROCESS8_64; >+ /* fallthrough */ >+ case 22: PROCESS8_64; >+ /* fallthrough */ >+ case 14: PROCESS8_64; >+ /* fallthrough */ >+ case 6: PROCESS4_64; >+ PROCESS1_64; >+ PROCESS1_64; >+ return XXH64_avalanche(h64); >+ >+ case 27: PROCESS8_64; >+ /* fallthrough */ >+ case 19: PROCESS8_64; >+ /* fallthrough */ >+ case 11: PROCESS8_64; >+ PROCESS1_64; >+ PROCESS1_64; >+ PROCESS1_64; >+ return XXH64_avalanche(h64); >+ >+ case 31: PROCESS8_64; >+ /* fallthrough */ >+ case 23: PROCESS8_64; >+ /* fallthrough */ >+ case 15: PROCESS8_64; >+ /* fallthrough */ >+ case 7: PROCESS4_64; >+ /* fallthrough */ >+ case 3: PROCESS1_64; >+ /* fallthrough */ >+ case 2: PROCESS1_64; >+ /* fallthrough */ >+ case 1: PROCESS1_64; >+ /* fallthrough */ >+ case 0: return XXH64_avalanche(h64); >+ } >+ >+ /* impossible to reach */ >+ assert(0); >+ return 0; /* unreachable, but some compilers complain without it */ >+} >+ >+FORCE_INLINE U64 >+XXH64_endian_align(const void* input, size_t len, U64 seed, >+ XXH_endianess endian, XXH_alignment align) >+{ >+ const BYTE* p = (const BYTE*)input; >+ const BYTE* bEnd = p + len; >+ U64 h64; >+ >+#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) >+ if (p==NULL) { >+ len=0; >+ bEnd=p=(const BYTE*)(size_t)32; >+ } >+#endif >+ >+ if (len>=32) { >+ const BYTE* const limit = bEnd - 32; >+ U64 v1 = seed + PRIME64_1 + PRIME64_2; >+ U64 v2 = seed + PRIME64_2; >+ U64 v3 = seed + 0; >+ U64 v4 = seed - PRIME64_1; >+ >+ do { >+ v1 = XXH64_round(v1, XXH_get64bits(p)); p+=8; >+ v2 = XXH64_round(v2, XXH_get64bits(p)); p+=8; >+ v3 = XXH64_round(v3, XXH_get64bits(p)); p+=8; >+ v4 = XXH64_round(v4, XXH_get64bits(p)); p+=8; >+ } while (p<=limit); >+ >+ h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); >+ h64 = XXH64_mergeRound(h64, v1); >+ h64 = XXH64_mergeRound(h64, v2); >+ h64 = XXH64_mergeRound(h64, v3); >+ h64 = XXH64_mergeRound(h64, v4); >+ >+ } else { >+ h64 = seed + PRIME64_5; >+ } >+ >+ h64 += (U64) len; >+ >+ return XXH64_finalize(h64, p, len, endian, align); >+} >+ >+ >+XXH_PUBLIC_API unsigned long long XXH64 (const void* input, size_t len, unsigned long long seed) >+{ >+#if 0 >+ /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ >+ XXH64_state_t state; >+ XXH64_reset(&state, seed); >+ XXH64_update(&state, input, len); >+ return XXH64_digest(&state); >+#else >+ XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; >+ >+ if (XXH_FORCE_ALIGN_CHECK) { >+ if ((((size_t)input) & 7)==0) { /* Input is aligned, let's leverage the speed advantage */ >+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) >+ return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned); >+ else >+ return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned); >+ } } >+ >+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) >+ return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned); >+ else >+ return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned); >+#endif >+} >+ >+/*====== Hash Streaming ======*/ >+ >+XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void) >+{ >+ return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t)); >+} >+XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr) >+{ >+ XXH_free(statePtr); >+ return XXH_OK; >+} >+ >+XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dstState, const XXH64_state_t* srcState) >+{ >+ memcpy(dstState, srcState, sizeof(*dstState)); >+} >+ >+XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH64_state_t* statePtr, unsigned long long seed) >+{ >+ XXH64_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */ >+ memset(&state, 0, sizeof(state)); >+ state.v1 = seed + PRIME64_1 + PRIME64_2; >+ state.v2 = seed + PRIME64_2; >+ state.v3 = seed + 0; >+ state.v4 = seed - PRIME64_1; >+ /* do not write into reserved, planned to be removed in a future version */ >+ memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved)); >+ return XXH_OK; >+} >+ >+FORCE_INLINE XXH_errorcode >+XXH64_update_endian (XXH64_state_t* state, const void* input, size_t len, XXH_endianess endian) >+{ >+ if (input==NULL) >+#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) >+ return XXH_OK; >+#else >+ return XXH_ERROR; >+#endif >+ >+ { const BYTE* p = (const BYTE*)input; >+ const BYTE* const bEnd = p + len; >+ >+ state->total_len += len; >+ >+ if (state->memsize + len < 32) { /* fill in tmp buffer */ >+ XXH_memcpy(((BYTE*)state->mem64) + state->memsize, input, len); >+ state->memsize += (U32)len; >+ return XXH_OK; >+ } >+ >+ if (state->memsize) { /* tmp buffer is full */ >+ XXH_memcpy(((BYTE*)state->mem64) + state->memsize, input, 32-state->memsize); >+ state->v1 = XXH64_round(state->v1, XXH_readLE64(state->mem64+0, endian)); >+ state->v2 = XXH64_round(state->v2, XXH_readLE64(state->mem64+1, endian)); >+ state->v3 = XXH64_round(state->v3, XXH_readLE64(state->mem64+2, endian)); >+ state->v4 = XXH64_round(state->v4, XXH_readLE64(state->mem64+3, endian)); >+ p += 32-state->memsize; >+ state->memsize = 0; >+ } >+ >+ if (p+32 <= bEnd) { >+ const BYTE* const limit = bEnd - 32; >+ U64 v1 = state->v1; >+ U64 v2 = state->v2; >+ U64 v3 = state->v3; >+ U64 v4 = state->v4; >+ >+ do { >+ v1 = XXH64_round(v1, XXH_readLE64(p, endian)); p+=8; >+ v2 = XXH64_round(v2, XXH_readLE64(p, endian)); p+=8; >+ v3 = XXH64_round(v3, XXH_readLE64(p, endian)); p+=8; >+ v4 = XXH64_round(v4, XXH_readLE64(p, endian)); p+=8; >+ } while (p<=limit); >+ >+ state->v1 = v1; >+ state->v2 = v2; >+ state->v3 = v3; >+ state->v4 = v4; >+ } >+ >+ if (p < bEnd) { >+ XXH_memcpy(state->mem64, p, (size_t)(bEnd-p)); >+ state->memsize = (unsigned)(bEnd-p); >+ } >+ } >+ >+ return XXH_OK; >+} >+ >+XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* state_in, const void* input, size_t len) >+{ >+ XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; >+ >+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) >+ return XXH64_update_endian(state_in, input, len, XXH_littleEndian); >+ else >+ return XXH64_update_endian(state_in, input, len, XXH_bigEndian); >+} >+ >+FORCE_INLINE U64 XXH64_digest_endian (const XXH64_state_t* state, XXH_endianess endian) >+{ >+ U64 h64; >+ >+ if (state->total_len >= 32) { >+ U64 const v1 = state->v1; >+ U64 const v2 = state->v2; >+ U64 const v3 = state->v3; >+ U64 const v4 = state->v4; >+ >+ h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); >+ h64 = XXH64_mergeRound(h64, v1); >+ h64 = XXH64_mergeRound(h64, v2); >+ h64 = XXH64_mergeRound(h64, v3); >+ h64 = XXH64_mergeRound(h64, v4); >+ } else { >+ h64 = state->v3 /*seed*/ + PRIME64_5; >+ } >+ >+ h64 += (U64) state->total_len; >+ >+ return XXH64_finalize(h64, state->mem64, (size_t)state->total_len, endian, XXH_aligned); >+} >+ >+XXH_PUBLIC_API unsigned long long XXH64_digest (const XXH64_state_t* state_in) >+{ >+ XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; >+ >+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) >+ return XXH64_digest_endian(state_in, XXH_littleEndian); >+ else >+ return XXH64_digest_endian(state_in, XXH_bigEndian); >+} >+ >+ >+/*====== Canonical representation ======*/ >+ >+XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash) >+{ >+ XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t)); >+ if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash); >+ memcpy(dst, &hash, sizeof(*dst)); >+} >+ >+XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src) >+{ >+ return XXH_readBE64(src); >+} >+ >+#endif /* XXH_NO_LONG_LONG */ >diff --git a/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/xxhash.h b/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/xxhash.h >new file mode 100644 >index 00000000000..0de203c947b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/xxhash.h >@@ -0,0 +1,341 @@ >+/* >+ xxHash - Extremely Fast Hash algorithm >+ Header File >+ Copyright (C) 2012-2016, Yann Collet. >+ >+ BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) >+ >+ 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. >+ >+ 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. >+ >+ You can contact the author at : >+ - xxHash source repository : https://github.com/Cyan4973/xxHash >+*/ >+ >+/* Notice extracted from xxHash homepage : >+ >+xxHash is an extremely fast Hash algorithm, running at RAM speed limits. >+It also successfully passes all tests from the SMHasher suite. >+ >+Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz) >+ >+Name Speed Q.Score Author >+xxHash 5.4 GB/s 10 >+CrapWow 3.2 GB/s 2 Andrew >+MumurHash 3a 2.7 GB/s 10 Austin Appleby >+SpookyHash 2.0 GB/s 10 Bob Jenkins >+SBox 1.4 GB/s 9 Bret Mulvey >+Lookup3 1.2 GB/s 9 Bob Jenkins >+SuperFastHash 1.2 GB/s 1 Paul Hsieh >+CityHash64 1.05 GB/s 10 Pike & Alakuijala >+FNV 0.55 GB/s 5 Fowler, Noll, Vo >+CRC32 0.43 GB/s 9 >+MD5-32 0.33 GB/s 10 Ronald L. Rivest >+SHA1-32 0.28 GB/s 10 >+ >+Q.Score is a measure of quality of the hash function. >+It depends on successfully passing SMHasher test set. >+10 is a perfect score. >+ >+A 64-bit version, named XXH64, is available since r35. >+It offers much better speed, but for 64-bit applications only. >+Name Speed on 64 bits Speed on 32 bits >+XXH64 13.8 GB/s 1.9 GB/s >+XXH32 6.8 GB/s 6.0 GB/s >+*/ >+ >+#ifndef XXHASH_H_5627135585666179 >+#define XXHASH_H_5627135585666179 1 >+ >+#if defined(__cplusplus) >+extern "C" { >+#endif >+ >+/* **************************** >+ * Definitions >+ ******************************/ >+#include <stddef.h> /* size_t */ >+typedef enum >+{ >+ XXH_OK = 0, >+ XXH_ERROR >+} XXH_errorcode; >+ >+/* **************************** >+ * API modifier >+ ******************************/ >+/** XXH_INLINE_ALL (and XXH_PRIVATE_API) >+ * This is useful to include xxhash functions in `static` mode >+ * in order to inline them, and remove their symbol from the public list. >+ * Inlining can offer dramatic performance improvement on small keys. >+ * Methodology : >+ * #define XXH_INLINE_ALL >+ * #include "xxhash.h" >+ * `xxhash.c` is automatically included. >+ * It's not useful to compile and link it as a separate module. >+ */ >+#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) >+# ifndef XXH_STATIC_LINKING_ONLY >+# define XXH_STATIC_LINKING_ONLY >+# endif >+# if defined(__GNUC__) >+# define XXH_PUBLIC_API static __inline __attribute__((unused)) >+#elif defined(__cplusplus) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 \ >+ */) >+# define XXH_PUBLIC_API static inline >+# elif defined(_MSC_VER) >+# define XXH_PUBLIC_API static __inline >+# else >+/* this version may generate warnings for unused static functions */ >+# define XXH_PUBLIC_API static >+# endif >+#else >+# define XXH_PUBLIC_API /* do nothing */ >+#endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */ >+ >+/*! XXH_NAMESPACE, aka Namespace Emulation : >+ * >+ * If you want to include _and expose_ xxHash functions from within your own library, >+ * but also want to avoid symbol collisions with other libraries which may also include xxHash, >+ * >+ * you can use XXH_NAMESPACE, to automatically prefix any public symbol from xxhash library >+ * with the value of XXH_NAMESPACE (therefore, avoid NULL and numeric values). >+ * >+ * Note that no change is required within the calling program as long as it includes `xxhash.h` : >+ * regular symbol name will be automatically translated by this header. >+ */ >+#ifdef XXH_NAMESPACE >+# define XXH_CAT(A, B) A##B >+# define XXH_NAME2(A, B) XXH_CAT(A, B) >+# define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber) >+# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32) >+# define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState) >+# define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState) >+# define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset) >+# define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update) >+# define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest) >+# define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState) >+# define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash) >+# define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical) >+# define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64) >+# define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState) >+# define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState) >+# define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset) >+# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update) >+# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest) >+# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState) >+# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash) >+# define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical) >+#endif >+ >+/* ************************************* >+ * Version >+ ***************************************/ >+#define XXH_VERSION_MAJOR 0 >+#define XXH_VERSION_MINOR 6 >+#define XXH_VERSION_RELEASE 5 >+#define XXH_VERSION_NUMBER \ >+ (XXH_VERSION_MAJOR * 100 * 100 + XXH_VERSION_MINOR * 100 + XXH_VERSION_RELEASE) >+XXH_PUBLIC_API unsigned XXH_versionNumber(void); >+ >+/*-********************************************************************** >+ * 32-bit hash >+ ************************************************************************/ >+typedef unsigned int XXH32_hash_t; >+ >+/*! XXH32() : >+ Calculate the 32-bit hash of sequence "length" bytes stored at memory address "input". >+ The memory between input & input+length must be valid (allocated and read-accessible). >+ "seed" can be used to alter the result predictably. >+ Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark) : 5.4 GB/s */ >+XXH_PUBLIC_API XXH32_hash_t XXH32(const void *input, size_t length, unsigned int seed); >+ >+/*====== Streaming ======*/ >+typedef struct XXH32_state_s XXH32_state_t; /* incomplete type */ >+XXH_PUBLIC_API XXH32_state_t *XXH32_createState(void); >+XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t *statePtr); >+XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t *dst_state, const XXH32_state_t *src_state); >+ >+XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t *statePtr, unsigned int seed); >+XXH_PUBLIC_API XXH_errorcode XXH32_update(XXH32_state_t *statePtr, >+ const void *input, >+ size_t length); >+XXH_PUBLIC_API XXH32_hash_t XXH32_digest(const XXH32_state_t *statePtr); >+ >+/* >+ * Streaming functions generate the xxHash of an input provided in multiple segments. >+ * Note that, for small input, they are slower than single-call functions, due to state >+ * management. For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized. >+ * >+ * XXH state must first be allocated, using XXH*_createState() . >+ * >+ * Start a new hash by initializing state with a seed, using XXH*_reset(). >+ * >+ * Then, feed the hash state by calling XXH*_update() as many times as necessary. >+ * The function returns an error code, with 0 meaning OK, and any other value meaning there is >+ * an error. >+ * >+ * Finally, a hash value can be produced anytime, by using XXH*_digest(). >+ * This function returns the nn-bits hash as an int or long long. >+ * >+ * It's still possible to continue inserting input into the hash state after a digest, >+ * and generate some new hashes later on, by calling again XXH*_digest(). >+ * >+ * When done, free XXH state space if it was allocated dynamically. >+ */ >+ >+/*====== Canonical representation ======*/ >+ >+typedef struct >+{ >+ unsigned char digest[4]; >+} XXH32_canonical_t; >+XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t *dst, XXH32_hash_t hash); >+XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t *src); >+ >+/* Default result type for XXH functions are primitive unsigned 32 and 64 bits. >+ * The canonical representation uses human-readable write convention, aka big-endian (large >+ * digits first). These functions allow transformation of hash result into and from its >+ * canonical format. This way, hash values can be written into a file / memory, and remain >+ * comparable on different systems and programs. >+ */ >+ >+#ifndef XXH_NO_LONG_LONG >+/*-********************************************************************** >+ * 64-bit hash >+ ************************************************************************/ >+typedef unsigned long long XXH64_hash_t; >+ >+/*! XXH64() : >+ Calculate the 64-bit hash of sequence of length "len" stored at memory address "input". >+ "seed" can be used to alter the result predictably. >+ This function runs faster on 64-bit systems, but slower on 32-bit systems (see benchmark). >+*/ >+XXH_PUBLIC_API XXH64_hash_t XXH64(const void *input, size_t length, unsigned long long seed); >+ >+/*====== Streaming ======*/ >+typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */ >+XXH_PUBLIC_API XXH64_state_t *XXH64_createState(void); >+XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t *statePtr); >+XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t *dst_state, const XXH64_state_t *src_state); >+ >+XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH64_state_t *statePtr, unsigned long long seed); >+XXH_PUBLIC_API XXH_errorcode XXH64_update(XXH64_state_t *statePtr, >+ const void *input, >+ size_t length); >+XXH_PUBLIC_API XXH64_hash_t XXH64_digest(const XXH64_state_t *statePtr); >+ >+/*====== Canonical representation ======*/ >+typedef struct >+{ >+ unsigned char digest[8]; >+} XXH64_canonical_t; >+XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t *dst, XXH64_hash_t hash); >+XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t *src); >+#endif /* XXH_NO_LONG_LONG */ >+ >+#ifdef XXH_STATIC_LINKING_ONLY >+ >+/* ================================================================================================ >+ This section contains declarations which are not guaranteed to remain stable. >+ They may change in future versions, becoming incompatible with a different version of the >+library. These declarations should only be used with static linking. Never use them in >+association with dynamic linking ! >+=================================================================================================== >+*/ >+ >+/* These definitions are only present to allow >+ * static allocation of XXH state, on stack or in a struct for example. >+ * Never **ever** use members directly. */ >+ >+# if !defined(__VMS) && (defined(__cplusplus) || (defined(__STDC_VERSION__) && \ >+ (__STDC_VERSION__ >= 199901L) /* C99 */)) >+# include <stdint.h> >+ >+struct XXH32_state_s >+{ >+ uint32_t total_len_32; >+ uint32_t large_len; >+ uint32_t v1; >+ uint32_t v2; >+ uint32_t v3; >+ uint32_t v4; >+ uint32_t mem32[4]; >+ uint32_t memsize; >+ uint32_t reserved; /* never read nor write, might be removed in a future version */ >+}; /* typedef'd to XXH32_state_t */ >+ >+struct XXH64_state_s >+{ >+ uint64_t total_len; >+ uint64_t v1; >+ uint64_t v2; >+ uint64_t v3; >+ uint64_t v4; >+ uint64_t mem64[4]; >+ uint32_t memsize; >+ uint32_t reserved[2]; /* never read nor write, might be removed in a future version */ >+}; /* typedef'd to XXH64_state_t */ >+ >+# else >+ >+struct XXH32_state_s >+{ >+ unsigned total_len_32; >+ unsigned large_len; >+ unsigned v1; >+ unsigned v2; >+ unsigned v3; >+ unsigned v4; >+ unsigned mem32[4]; >+ unsigned memsize; >+ unsigned reserved; /* never read nor write, might be removed in a future version */ >+}; /* typedef'd to XXH32_state_t */ >+ >+# ifndef XXH_NO_LONG_LONG /* remove 64-bit support */ >+struct XXH64_state_s >+{ >+ unsigned long long total_len; >+ unsigned long long v1; >+ unsigned long long v2; >+ unsigned long long v3; >+ unsigned long long v4; >+ unsigned long long mem64[4]; >+ unsigned memsize; >+ unsigned reserved[2]; /* never read nor write, might be removed in a future version */ >+}; /* typedef'd to XXH64_state_t */ >+# endif >+ >+# endif >+ >+# if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) >+# include "xxhash.c" /* include xxhash function bodies as `static`, for inlining */ >+# endif >+ >+#endif /* XXH_STATIC_LINKING_ONLY */ >+ >+#if defined(__cplusplus) >+} >+#endif >+ >+#endif /* XXHASH_H_5627135585666179 */ >diff --git a/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/xxhash_fuzzer.cpp b/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/xxhash_fuzzer.cpp >new file mode 100644 >index 00000000000..638c1920445 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/common/third_party/xxhash/xxhash_fuzzer.cpp >@@ -0,0 +1,46 @@ >+// >+// 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. >+// >+// xxHash Fuzzer test: >+// Integration with Chromium's libfuzzer for xxHash. >+ >+#include <cstddef> >+#include <cstdint> >+#include <cstring> >+ >+#include "xxhash.h" >+ >+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) >+{ >+#if !defined(XXH_NO_LONG_LONG) >+ // Test 64-bit hash. >+ size_t seedSize64 = sizeof(unsigned long long); >+ if (size < seedSize64) >+ { >+ XXH64(data, size, 0ull); >+ } >+ else >+ { >+ unsigned long long seed64; >+ memcpy(&seed64, data, seedSize64); >+ XXH64(&data[seedSize64], size - seedSize64, seed64); >+ } >+#endif // !defined(XXH_NO_LONG_LONG) >+ >+ // Test 32-bit hash. >+ size_t seedSize32 = sizeof(unsigned int); >+ if (size < seedSize32) >+ { >+ XXH64(data, size, 0ull); >+ } >+ else >+ { >+ unsigned long long seed32; >+ memcpy(&seed32, data, seedSize32); >+ XXH32(&data[seedSize32], size - seedSize32, seed32); >+ } >+ >+ return 0; >+} >diff --git a/Source/ThirdParty/ANGLE/src/common/tls.cpp b/Source/ThirdParty/ANGLE/src/common/tls.cpp >index 10a10252f4c..20977f48cfb 100644 >--- a/Source/ThirdParty/ANGLE/src/common/tls.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/tls.cpp >@@ -11,24 +11,24 @@ > #include <assert.h> > > #ifdef ANGLE_ENABLE_WINDOWS_STORE >-#include <vector> >-#include <set> >-#include <map> >-#include <mutex> >+# include <map> >+# include <mutex> >+# include <set> >+# include <vector> > >-#include <wrl/client.h> >-#include <wrl/async.h> >-#include <Windows.System.Threading.h> >+# include <Windows.System.Threading.h> >+# include <wrl/async.h> >+# include <wrl/client.h> > > using namespace std; > using namespace Windows::Foundation; > using namespace ABI::Windows::System::Threading; > > // Thread local storage for Windows Store support >-typedef vector<void*> ThreadLocalData; >+typedef vector<void *> ThreadLocalData; > >-static __declspec(thread) ThreadLocalData* currentThreadData = nullptr; >-static set<ThreadLocalData*> allThreadData; >+static __declspec(thread) ThreadLocalData *currentThreadData = nullptr; >+static set<ThreadLocalData *> allThreadData; > static DWORD nextTlsIndex = 0; > static vector<DWORD> freeTlsIndices; > >@@ -39,7 +39,7 @@ TLSIndex CreateTLSIndex() > TLSIndex index; > > #ifdef ANGLE_PLATFORM_WINDOWS >-#ifdef ANGLE_ENABLE_WINDOWS_STORE >+# ifdef ANGLE_ENABLE_WINDOWS_STORE > if (!freeTlsIndices.empty()) > { > DWORD result = freeTlsIndices.back(); >@@ -50,9 +50,9 @@ TLSIndex CreateTLSIndex() > { > index = nextTlsIndex++; > } >-#else >+# else > index = TlsAlloc(); >-#endif >+# endif > > #elif defined(ANGLE_PLATFORM_POSIX) > // Create global pool key >@@ -62,7 +62,8 @@ TLSIndex CreateTLSIndex() > } > #endif > >- assert(index != TLS_INVALID_INDEX && "CreateTLSIndex(): Unable to allocate Thread Local Storage"); >+ assert(index != TLS_INVALID_INDEX && >+ "CreateTLSIndex(): Unable to allocate Thread Local Storage"); > return index; > } > >@@ -75,7 +76,7 @@ bool DestroyTLSIndex(TLSIndex index) > } > > #ifdef ANGLE_PLATFORM_WINDOWS >-#ifdef ANGLE_ENABLE_WINDOWS_STORE >+# ifdef ANGLE_ENABLE_WINDOWS_STORE > assert(index < nextTlsIndex); > assert(find(freeTlsIndices.begin(), freeTlsIndices.end(), index) == freeTlsIndices.end()); > >@@ -88,9 +89,9 @@ bool DestroyTLSIndex(TLSIndex index) > } > } > return true; >-#else >+# else > return (TlsFree(index) == TRUE); >-#endif >+# endif > #elif defined(ANGLE_PLATFORM_POSIX) > return (pthread_key_delete(index) == 0); > #endif >@@ -105,8 +106,8 @@ bool SetTLSValue(TLSIndex index, void *value) > } > > #ifdef ANGLE_PLATFORM_WINDOWS >-#ifdef ANGLE_ENABLE_WINDOWS_STORE >- ThreadLocalData* threadData = currentThreadData; >+# ifdef ANGLE_ENABLE_WINDOWS_STORE >+ ThreadLocalData *threadData = currentThreadData; > if (!threadData) > { > threadData = new ThreadLocalData(index + 1, nullptr); >@@ -120,9 +121,9 @@ bool SetTLSValue(TLSIndex index, void *value) > > threadData->at(index) = value; > return true; >-#else >+# else > return (TlsSetValue(index, value) == TRUE); >-#endif >+# endif > #elif defined(ANGLE_PLATFORM_POSIX) > return (pthread_setspecific(index, value) == 0); > #endif >@@ -137,8 +138,8 @@ void *GetTLSValue(TLSIndex index) > } > > #ifdef ANGLE_PLATFORM_WINDOWS >-#ifdef ANGLE_ENABLE_WINDOWS_STORE >- ThreadLocalData* threadData = currentThreadData; >+# ifdef ANGLE_ENABLE_WINDOWS_STORE >+ ThreadLocalData *threadData = currentThreadData; > if (threadData && threadData->size() > index) > { > return threadData->at(index); >@@ -147,9 +148,9 @@ void *GetTLSValue(TLSIndex index) > { > return nullptr; > } >-#else >+# else > return TlsGetValue(index); >-#endif >+# endif > #elif defined(ANGLE_PLATFORM_POSIX) > return pthread_getspecific(index); > #endif >diff --git a/Source/ThirdParty/ANGLE/src/common/tls.h b/Source/ThirdParty/ANGLE/src/common/tls.h >index ca9e07ab700..33c776adc5b 100644 >--- a/Source/ThirdParty/ANGLE/src/common/tls.h >+++ b/Source/ThirdParty/ANGLE/src/common/tls.h >@@ -14,24 +14,24 @@ > #ifdef ANGLE_PLATFORM_WINDOWS > > // TLS does not exist for Windows Store and needs to be emulated >-# ifdef ANGLE_ENABLE_WINDOWS_STORE >-# ifndef TLS_OUT_OF_INDEXES >-# define TLS_OUT_OF_INDEXES static_cast<DWORD>(0xFFFFFFFF) >-# endif >-# ifndef CREATE_SUSPENDED >-# define CREATE_SUSPENDED 0x00000004 >-# endif >-# endif >- typedef DWORD TLSIndex; >-# define TLS_INVALID_INDEX (TLS_OUT_OF_INDEXES) >+# ifdef ANGLE_ENABLE_WINDOWS_STORE >+# ifndef TLS_OUT_OF_INDEXES >+# define TLS_OUT_OF_INDEXES static_cast<DWORD>(0xFFFFFFFF) >+# endif >+# ifndef CREATE_SUSPENDED >+# define CREATE_SUSPENDED 0x00000004 >+# endif >+# endif >+typedef DWORD TLSIndex; >+# define TLS_INVALID_INDEX (TLS_OUT_OF_INDEXES) > #elif defined(ANGLE_PLATFORM_POSIX) >-# include <pthread.h> >-# include <semaphore.h> >-# include <errno.h> >- typedef pthread_key_t TLSIndex; >-# define TLS_INVALID_INDEX (static_cast<TLSIndex>(-1)) >+# include <errno.h> >+# include <pthread.h> >+# include <semaphore.h> >+typedef pthread_key_t TLSIndex; >+# define TLS_INVALID_INDEX (static_cast<TLSIndex>(-1)) > #else >-# error Unsupported platform. >+# error Unsupported platform. > #endif > > // TODO(kbr): for POSIX platforms this will have to be changed to take >@@ -43,4 +43,4 @@ bool DestroyTLSIndex(TLSIndex index); > bool SetTLSValue(TLSIndex index, void *value); > void *GetTLSValue(TLSIndex index); > >-#endif // COMMON_TLS_H_ >+#endif // COMMON_TLS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/common/uniform_type_info_autogen.cpp b/Source/ThirdParty/ANGLE/src/common/uniform_type_info_autogen.cpp >index 9c199128a4a..1de2146dc0f 100644 >--- a/Source/ThirdParty/ANGLE/src/common/uniform_type_info_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/uniform_type_info_autogen.cpp >@@ -1,7 +1,7 @@ > // GENERATED FILE - DO NOT EDIT. > // Generated by gen_uniform_type_table.py. > // >-// Copyright 2017 The ANGLE Project Authors. All rights reserved. >+// 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. > // >@@ -18,124 +18,152 @@ namespace gl > > namespace > { >-constexpr std::array<UniformTypeInfo, 59> kInfoTable = { >- {{GL_NONE, GL_NONE, GL_NONE, GL_NONE, GL_NONE, 0, 0, 0, 0, 0 * 0, 0 * 0, false, false, false}, >- {GL_BOOL, GL_BOOL, GL_NONE, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), sizeof(GLint) * 4, >- sizeof(GLint) * 1, false, false, false}, >- {GL_BOOL_VEC2, GL_BOOL, GL_NONE, GL_NONE, GL_BOOL_VEC2, 1, 2, 2, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 2, false, false, false}, >- {GL_BOOL_VEC3, GL_BOOL, GL_NONE, GL_NONE, GL_BOOL_VEC3, 1, 3, 3, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 3, false, false, false}, >- {GL_BOOL_VEC4, GL_BOOL, GL_NONE, GL_NONE, GL_BOOL_VEC4, 1, 4, 4, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 4, false, false, false}, >- {GL_FLOAT, GL_FLOAT, GL_NONE, GL_NONE, GL_BOOL, 1, 1, 1, sizeof(GLfloat), sizeof(GLfloat) * 4, >- sizeof(GLfloat) * 1, false, false, false}, >- {GL_FLOAT_MAT2, GL_FLOAT, GL_NONE, GL_FLOAT_MAT2, GL_NONE, 2, 2, 4, sizeof(GLfloat), >- sizeof(GLfloat) * 8, sizeof(GLfloat) * 4, false, true, false}, >- {GL_FLOAT_MAT2x3, GL_FLOAT, GL_NONE, GL_FLOAT_MAT3x2, GL_NONE, 3, 2, 6, sizeof(GLfloat), >- sizeof(GLfloat) * 12, sizeof(GLfloat) * 6, false, true, false}, >- {GL_FLOAT_MAT2x4, GL_FLOAT, GL_NONE, GL_FLOAT_MAT4x2, GL_NONE, 4, 2, 8, sizeof(GLfloat), >- sizeof(GLfloat) * 16, sizeof(GLfloat) * 8, false, true, false}, >- {GL_FLOAT_MAT3, GL_FLOAT, GL_NONE, GL_FLOAT_MAT3, GL_NONE, 3, 3, 9, sizeof(GLfloat), >- sizeof(GLfloat) * 12, sizeof(GLfloat) * 9, false, true, false}, >- {GL_FLOAT_MAT3x2, GL_FLOAT, GL_NONE, GL_FLOAT_MAT2x3, GL_NONE, 2, 3, 6, sizeof(GLfloat), >- sizeof(GLfloat) * 8, sizeof(GLfloat) * 6, false, true, false}, >- {GL_FLOAT_MAT3x4, GL_FLOAT, GL_NONE, GL_FLOAT_MAT4x3, GL_NONE, 4, 3, 12, sizeof(GLfloat), >- sizeof(GLfloat) * 16, sizeof(GLfloat) * 12, false, true, false}, >- {GL_FLOAT_MAT4, GL_FLOAT, GL_NONE, GL_FLOAT_MAT4, GL_NONE, 4, 4, 16, sizeof(GLfloat), >- sizeof(GLfloat) * 16, sizeof(GLfloat) * 16, false, true, false}, >- {GL_FLOAT_MAT4x2, GL_FLOAT, GL_NONE, GL_FLOAT_MAT2x4, GL_NONE, 2, 4, 8, sizeof(GLfloat), >- sizeof(GLfloat) * 8, sizeof(GLfloat) * 8, false, true, false}, >- {GL_FLOAT_MAT4x3, GL_FLOAT, GL_NONE, GL_FLOAT_MAT3x4, GL_NONE, 3, 4, 12, sizeof(GLfloat), >- sizeof(GLfloat) * 12, sizeof(GLfloat) * 12, false, true, false}, >- {GL_FLOAT_VEC2, GL_FLOAT, GL_NONE, GL_NONE, GL_BOOL_VEC2, 1, 2, 2, sizeof(GLfloat), >- sizeof(GLfloat) * 4, sizeof(GLfloat) * 2, false, false, false}, >- {GL_FLOAT_VEC3, GL_FLOAT, GL_NONE, GL_NONE, GL_BOOL_VEC3, 1, 3, 3, sizeof(GLfloat), >- sizeof(GLfloat) * 4, sizeof(GLfloat) * 3, false, false, false}, >- {GL_FLOAT_VEC4, GL_FLOAT, GL_NONE, GL_NONE, GL_BOOL_VEC4, 1, 4, 4, sizeof(GLfloat), >- sizeof(GLfloat) * 4, sizeof(GLfloat) * 4, false, false, false}, >- {GL_IMAGE_2D, GL_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >- {GL_IMAGE_2D_ARRAY, GL_INT, GL_TEXTURE_2D_ARRAY, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >- {GL_IMAGE_3D, GL_INT, GL_TEXTURE_3D, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >- {GL_IMAGE_CUBE, GL_INT, GL_TEXTURE_CUBE_MAP, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >- {GL_INT, GL_INT, GL_NONE, GL_NONE, GL_BOOL, 1, 1, 1, sizeof(GLint), sizeof(GLint) * 4, >- sizeof(GLint) * 1, false, false, false}, >- {GL_INT_IMAGE_2D, GL_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >- {GL_INT_IMAGE_2D_ARRAY, GL_INT, GL_TEXTURE_2D_ARRAY, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >- {GL_INT_IMAGE_3D, GL_INT, GL_TEXTURE_3D, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >- {GL_INT_IMAGE_CUBE, GL_INT, GL_TEXTURE_CUBE_MAP, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >- {GL_INT_SAMPLER_2D, GL_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_INT_SAMPLER_2D_ARRAY, GL_INT, GL_TEXTURE_2D_ARRAY, GL_NONE, GL_NONE, 1, 1, 1, >+constexpr std::array<UniformTypeInfo, 62> kInfoTable = { >+ {{GL_NONE, GL_NONE, GL_NONE, GL_NONE, GL_NONE, SamplerFormat::InvalidEnum, 0, 0, 0, 0, 0 * 0, >+ 0 * 0, false, false, false}, >+ {GL_BOOL, GL_BOOL, GL_NONE, GL_NONE, GL_NONE, SamplerFormat::InvalidEnum, 1, 1, 1, >+ sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, false}, >+ {GL_BOOL_VEC2, GL_BOOL, GL_NONE, GL_NONE, GL_BOOL_VEC2, SamplerFormat::InvalidEnum, 1, 2, 2, >+ sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 2, false, false, false}, >+ {GL_BOOL_VEC3, GL_BOOL, GL_NONE, GL_NONE, GL_BOOL_VEC3, SamplerFormat::InvalidEnum, 1, 3, 3, >+ sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 3, false, false, false}, >+ {GL_BOOL_VEC4, GL_BOOL, GL_NONE, GL_NONE, GL_BOOL_VEC4, SamplerFormat::InvalidEnum, 1, 4, 4, >+ sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 4, false, false, false}, >+ {GL_FLOAT, GL_FLOAT, GL_NONE, GL_NONE, GL_BOOL, SamplerFormat::InvalidEnum, 1, 1, 1, >+ sizeof(GLfloat), sizeof(GLfloat) * 4, sizeof(GLfloat) * 1, false, false, false}, >+ {GL_FLOAT_MAT2, GL_FLOAT, GL_NONE, GL_FLOAT_MAT2, GL_NONE, SamplerFormat::InvalidEnum, 2, 2, 4, >+ sizeof(GLfloat), sizeof(GLfloat) * 8, sizeof(GLfloat) * 4, false, true, false}, >+ {GL_FLOAT_MAT2x3, GL_FLOAT, GL_NONE, GL_FLOAT_MAT3x2, GL_NONE, SamplerFormat::InvalidEnum, 3, >+ 2, 6, sizeof(GLfloat), sizeof(GLfloat) * 12, sizeof(GLfloat) * 6, false, true, false}, >+ {GL_FLOAT_MAT2x4, GL_FLOAT, GL_NONE, GL_FLOAT_MAT4x2, GL_NONE, SamplerFormat::InvalidEnum, 4, >+ 2, 8, sizeof(GLfloat), sizeof(GLfloat) * 16, sizeof(GLfloat) * 8, false, true, false}, >+ {GL_FLOAT_MAT3, GL_FLOAT, GL_NONE, GL_FLOAT_MAT3, GL_NONE, SamplerFormat::InvalidEnum, 3, 3, 9, >+ sizeof(GLfloat), sizeof(GLfloat) * 12, sizeof(GLfloat) * 9, false, true, false}, >+ {GL_FLOAT_MAT3x2, GL_FLOAT, GL_NONE, GL_FLOAT_MAT2x3, GL_NONE, SamplerFormat::InvalidEnum, 2, >+ 3, 6, sizeof(GLfloat), sizeof(GLfloat) * 8, sizeof(GLfloat) * 6, false, true, false}, >+ {GL_FLOAT_MAT3x4, GL_FLOAT, GL_NONE, GL_FLOAT_MAT4x3, GL_NONE, SamplerFormat::InvalidEnum, 4, >+ 3, 12, sizeof(GLfloat), sizeof(GLfloat) * 16, sizeof(GLfloat) * 12, false, true, false}, >+ {GL_FLOAT_MAT4, GL_FLOAT, GL_NONE, GL_FLOAT_MAT4, GL_NONE, SamplerFormat::InvalidEnum, 4, 4, >+ 16, sizeof(GLfloat), sizeof(GLfloat) * 16, sizeof(GLfloat) * 16, false, true, false}, >+ {GL_FLOAT_MAT4x2, GL_FLOAT, GL_NONE, GL_FLOAT_MAT2x4, GL_NONE, SamplerFormat::InvalidEnum, 2, >+ 4, 8, sizeof(GLfloat), sizeof(GLfloat) * 8, sizeof(GLfloat) * 8, false, true, false}, >+ {GL_FLOAT_MAT4x3, GL_FLOAT, GL_NONE, GL_FLOAT_MAT3x4, GL_NONE, SamplerFormat::InvalidEnum, 3, >+ 4, 12, sizeof(GLfloat), sizeof(GLfloat) * 12, sizeof(GLfloat) * 12, false, true, false}, >+ {GL_FLOAT_VEC2, GL_FLOAT, GL_NONE, GL_NONE, GL_BOOL_VEC2, SamplerFormat::InvalidEnum, 1, 2, 2, >+ sizeof(GLfloat), sizeof(GLfloat) * 4, sizeof(GLfloat) * 2, false, false, false}, >+ {GL_FLOAT_VEC3, GL_FLOAT, GL_NONE, GL_NONE, GL_BOOL_VEC3, SamplerFormat::InvalidEnum, 1, 3, 3, >+ sizeof(GLfloat), sizeof(GLfloat) * 4, sizeof(GLfloat) * 3, false, false, false}, >+ {GL_FLOAT_VEC4, GL_FLOAT, GL_NONE, GL_NONE, GL_BOOL_VEC4, SamplerFormat::InvalidEnum, 1, 4, 4, >+ sizeof(GLfloat), sizeof(GLfloat) * 4, sizeof(GLfloat) * 4, false, false, false}, >+ {GL_IMAGE_2D, GL_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, SamplerFormat::InvalidEnum, 1, 1, 1, >+ sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >+ {GL_IMAGE_2D_ARRAY, GL_INT, GL_TEXTURE_2D_ARRAY, GL_NONE, GL_NONE, SamplerFormat::InvalidEnum, >+ 1, 1, 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >+ {GL_IMAGE_3D, GL_INT, GL_TEXTURE_3D, GL_NONE, GL_NONE, SamplerFormat::InvalidEnum, 1, 1, 1, >+ sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >+ {GL_IMAGE_CUBE, GL_INT, GL_TEXTURE_CUBE_MAP, GL_NONE, GL_NONE, SamplerFormat::InvalidEnum, 1, >+ 1, 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >+ {GL_INT, GL_INT, GL_NONE, GL_NONE, GL_BOOL, SamplerFormat::InvalidEnum, 1, 1, 1, sizeof(GLint), >+ sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, false}, >+ {GL_INT_IMAGE_2D, GL_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, SamplerFormat::InvalidEnum, 1, 1, 1, >+ sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >+ {GL_INT_IMAGE_2D_ARRAY, GL_INT, GL_TEXTURE_2D_ARRAY, GL_NONE, GL_NONE, >+ SamplerFormat::InvalidEnum, 1, 1, 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, >+ false, false, true}, >+ {GL_INT_IMAGE_3D, GL_INT, GL_TEXTURE_3D, GL_NONE, GL_NONE, SamplerFormat::InvalidEnum, 1, 1, 1, >+ sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >+ {GL_INT_IMAGE_CUBE, GL_INT, GL_TEXTURE_CUBE_MAP, GL_NONE, GL_NONE, SamplerFormat::InvalidEnum, >+ 1, 1, 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, false, false, true}, >+ {GL_INT_SAMPLER_2D, GL_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, SamplerFormat::Signed, 1, 1, 1, > sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_INT_SAMPLER_2D_MULTISAMPLE, GL_INT, GL_TEXTURE_2D_MULTISAMPLE, GL_NONE, GL_NONE, 1, 1, 1, >+ {GL_INT_SAMPLER_2D_ARRAY, GL_INT, GL_TEXTURE_2D_ARRAY, GL_NONE, GL_NONE, SamplerFormat::Signed, >+ 1, 1, 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >+ {GL_INT_SAMPLER_2D_MULTISAMPLE, GL_INT, GL_TEXTURE_2D_MULTISAMPLE, GL_NONE, GL_NONE, >+ SamplerFormat::Signed, 1, 1, 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, >+ false, false}, >+ {GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY, GL_INT, GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_NONE, >+ GL_NONE, SamplerFormat::Signed, 1, 1, 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, >+ true, false, false}, >+ {GL_INT_SAMPLER_3D, GL_INT, GL_TEXTURE_3D, GL_NONE, GL_NONE, SamplerFormat::Signed, 1, 1, 1, > sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_INT_SAMPLER_3D, GL_INT, GL_TEXTURE_3D, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_INT_SAMPLER_CUBE, GL_INT, GL_TEXTURE_CUBE_MAP, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_INT_VEC2, GL_INT, GL_NONE, GL_NONE, GL_BOOL_VEC2, 1, 2, 2, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 2, false, false, false}, >- {GL_INT_VEC3, GL_INT, GL_NONE, GL_NONE, GL_BOOL_VEC3, 1, 3, 3, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 3, false, false, false}, >- {GL_INT_VEC4, GL_INT, GL_NONE, GL_NONE, GL_BOOL_VEC4, 1, 4, 4, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 4, false, false, false}, >- {GL_SAMPLER_2D, GL_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_SAMPLER_2D_ARRAY, GL_INT, GL_TEXTURE_2D_ARRAY, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_SAMPLER_2D_ARRAY_SHADOW, GL_INT, GL_TEXTURE_2D_ARRAY, GL_NONE, GL_NONE, 1, 1, 1, >+ {GL_INT_SAMPLER_CUBE, GL_INT, GL_TEXTURE_CUBE_MAP, GL_NONE, GL_NONE, SamplerFormat::Signed, 1, >+ 1, 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >+ {GL_INT_VEC2, GL_INT, GL_NONE, GL_NONE, GL_BOOL_VEC2, SamplerFormat::InvalidEnum, 1, 2, 2, >+ sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 2, false, false, false}, >+ {GL_INT_VEC3, GL_INT, GL_NONE, GL_NONE, GL_BOOL_VEC3, SamplerFormat::InvalidEnum, 1, 3, 3, >+ sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 3, false, false, false}, >+ {GL_INT_VEC4, GL_INT, GL_NONE, GL_NONE, GL_BOOL_VEC4, SamplerFormat::InvalidEnum, 1, 4, 4, >+ sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 4, false, false, false}, >+ {GL_SAMPLER_2D, GL_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, SamplerFormat::Float, 1, 1, 1, > sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_SAMPLER_2D_MULTISAMPLE, GL_INT, GL_TEXTURE_2D_MULTISAMPLE, GL_NONE, GL_NONE, 1, 1, 1, >+ {GL_SAMPLER_2D_ARRAY, GL_INT, GL_TEXTURE_2D_ARRAY, GL_NONE, GL_NONE, SamplerFormat::Float, 1, >+ 1, 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >+ {GL_SAMPLER_2D_ARRAY_SHADOW, GL_INT, GL_TEXTURE_2D_ARRAY, GL_NONE, GL_NONE, >+ SamplerFormat::Shadow, 1, 1, 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, >+ false, false}, >+ {GL_SAMPLER_2D_MULTISAMPLE, GL_INT, GL_TEXTURE_2D_MULTISAMPLE, GL_NONE, GL_NONE, >+ SamplerFormat::Float, 1, 1, 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, >+ false, false}, >+ {GL_SAMPLER_2D_MULTISAMPLE_ARRAY, GL_INT, GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_NONE, GL_NONE, >+ SamplerFormat::Float, 1, 1, 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, >+ false, false}, >+ {GL_SAMPLER_2D_RECT_ANGLE, GL_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, SamplerFormat::Float, 1, 1, >+ 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >+ {GL_SAMPLER_2D_SHADOW, GL_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, SamplerFormat::Shadow, 1, 1, 1, > sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_SAMPLER_2D_RECT_ANGLE, GL_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_SAMPLER_2D_SHADOW, GL_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_SAMPLER_3D, GL_INT, GL_TEXTURE_3D, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_SAMPLER_CUBE, GL_INT, GL_TEXTURE_CUBE_MAP, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_SAMPLER_CUBE_SHADOW, GL_INT, GL_TEXTURE_CUBE_MAP, GL_NONE, GL_NONE, 1, 1, 1, sizeof(GLint), >- sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_SAMPLER_EXTERNAL_OES, GL_INT, GL_TEXTURE_EXTERNAL_OES, GL_NONE, GL_NONE, 1, 1, 1, >+ {GL_SAMPLER_3D, GL_INT, GL_TEXTURE_3D, GL_NONE, GL_NONE, SamplerFormat::Float, 1, 1, 1, > sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >- {GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_BOOL, 1, 1, 1, sizeof(GLuint), >- sizeof(GLuint) * 4, sizeof(GLuint) * 1, false, false, false}, >- {GL_UNSIGNED_INT_ATOMIC_COUNTER, GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_NONE, 1, 1, 1, >- sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, false, false, false}, >- {GL_UNSIGNED_INT_IMAGE_2D, GL_UNSIGNED_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, 1, 1, 1, >- sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, false, false, true}, >- {GL_UNSIGNED_INT_IMAGE_2D_ARRAY, GL_UNSIGNED_INT, GL_TEXTURE_2D_ARRAY, GL_NONE, GL_NONE, 1, 1, >- 1, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, false, false, true}, >- {GL_UNSIGNED_INT_IMAGE_3D, GL_UNSIGNED_INT, GL_TEXTURE_3D, GL_NONE, GL_NONE, 1, 1, 1, >- sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, false, false, true}, >- {GL_UNSIGNED_INT_IMAGE_CUBE, GL_UNSIGNED_INT, GL_TEXTURE_CUBE_MAP, GL_NONE, GL_NONE, 1, 1, 1, >- sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, false, false, true}, >- {GL_UNSIGNED_INT_SAMPLER_2D, GL_UNSIGNED_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, 1, 1, 1, >- sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, true, false, false}, >- {GL_UNSIGNED_INT_SAMPLER_2D_ARRAY, GL_UNSIGNED_INT, GL_TEXTURE_2D_ARRAY, GL_NONE, GL_NONE, 1, >- 1, 1, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, true, false, false}, >+ {GL_SAMPLER_CUBE, GL_INT, GL_TEXTURE_CUBE_MAP, GL_NONE, GL_NONE, SamplerFormat::Float, 1, 1, 1, >+ sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >+ {GL_SAMPLER_CUBE_SHADOW, GL_INT, GL_TEXTURE_CUBE_MAP, GL_NONE, GL_NONE, SamplerFormat::Shadow, >+ 1, 1, 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, false, false}, >+ {GL_SAMPLER_EXTERNAL_OES, GL_INT, GL_TEXTURE_EXTERNAL_OES, GL_NONE, GL_NONE, >+ SamplerFormat::Float, 1, 1, 1, sizeof(GLint), sizeof(GLint) * 4, sizeof(GLint) * 1, true, >+ false, false}, >+ {GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_BOOL, SamplerFormat::InvalidEnum, 1, 1, >+ 1, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, false, false, false}, >+ {GL_UNSIGNED_INT_ATOMIC_COUNTER, GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_NONE, >+ SamplerFormat::InvalidEnum, 1, 1, 1, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, >+ false, false, false}, >+ {GL_UNSIGNED_INT_IMAGE_2D, GL_UNSIGNED_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, >+ SamplerFormat::InvalidEnum, 1, 1, 1, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, >+ false, false, true}, >+ {GL_UNSIGNED_INT_IMAGE_2D_ARRAY, GL_UNSIGNED_INT, GL_TEXTURE_2D_ARRAY, GL_NONE, GL_NONE, >+ SamplerFormat::InvalidEnum, 1, 1, 1, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, >+ false, false, true}, >+ {GL_UNSIGNED_INT_IMAGE_3D, GL_UNSIGNED_INT, GL_TEXTURE_3D, GL_NONE, GL_NONE, >+ SamplerFormat::InvalidEnum, 1, 1, 1, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, >+ false, false, true}, >+ {GL_UNSIGNED_INT_IMAGE_CUBE, GL_UNSIGNED_INT, GL_TEXTURE_CUBE_MAP, GL_NONE, GL_NONE, >+ SamplerFormat::InvalidEnum, 1, 1, 1, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, >+ false, false, true}, >+ {GL_UNSIGNED_INT_SAMPLER_2D, GL_UNSIGNED_INT, GL_TEXTURE_2D, GL_NONE, GL_NONE, >+ SamplerFormat::Unsigned, 1, 1, 1, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, >+ true, false, false}, >+ {GL_UNSIGNED_INT_SAMPLER_2D_ARRAY, GL_UNSIGNED_INT, GL_TEXTURE_2D_ARRAY, GL_NONE, GL_NONE, >+ SamplerFormat::Unsigned, 1, 1, 1, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, >+ true, false, false}, > {GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE, GL_UNSIGNED_INT, GL_TEXTURE_2D_MULTISAMPLE, GL_NONE, >- GL_NONE, 1, 1, 1, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, true, false, false}, >- {GL_UNSIGNED_INT_SAMPLER_3D, GL_UNSIGNED_INT, GL_TEXTURE_3D, GL_NONE, GL_NONE, 1, 1, 1, >+ GL_NONE, SamplerFormat::Unsigned, 1, 1, 1, sizeof(GLuint), sizeof(GLuint) * 4, >+ sizeof(GLuint) * 1, true, false, false}, >+ {GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY, GL_UNSIGNED_INT, >+ GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_NONE, GL_NONE, SamplerFormat::Unsigned, 1, 1, 1, > sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, true, false, false}, >- {GL_UNSIGNED_INT_SAMPLER_CUBE, GL_UNSIGNED_INT, GL_TEXTURE_CUBE_MAP, GL_NONE, GL_NONE, 1, 1, 1, >- sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, true, false, false}, >- {GL_UNSIGNED_INT_VEC2, GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_BOOL_VEC2, 1, 2, 2, >- sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 2, false, false, false}, >- {GL_UNSIGNED_INT_VEC3, GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_BOOL_VEC3, 1, 3, 3, >- sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 3, false, false, false}, >- {GL_UNSIGNED_INT_VEC4, GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_BOOL_VEC4, 1, 4, 4, >- sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 4, false, false, false}}}; >+ {GL_UNSIGNED_INT_SAMPLER_3D, GL_UNSIGNED_INT, GL_TEXTURE_3D, GL_NONE, GL_NONE, >+ SamplerFormat::Unsigned, 1, 1, 1, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, >+ true, false, false}, >+ {GL_UNSIGNED_INT_SAMPLER_CUBE, GL_UNSIGNED_INT, GL_TEXTURE_CUBE_MAP, GL_NONE, GL_NONE, >+ SamplerFormat::Unsigned, 1, 1, 1, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 1, >+ true, false, false}, >+ {GL_UNSIGNED_INT_VEC2, GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_BOOL_VEC2, >+ SamplerFormat::InvalidEnum, 1, 2, 2, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 2, >+ false, false, false}, >+ {GL_UNSIGNED_INT_VEC3, GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_BOOL_VEC3, >+ SamplerFormat::InvalidEnum, 1, 3, 3, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 3, >+ false, false, false}, >+ {GL_UNSIGNED_INT_VEC4, GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_BOOL_VEC4, >+ SamplerFormat::InvalidEnum, 1, 4, 4, sizeof(GLuint), sizeof(GLuint) * 4, sizeof(GLuint) * 4, >+ false, false, false}}}; > > size_t GetTypeInfoIndex(GLenum uniformType) > { >@@ -201,64 +229,70 @@ size_t GetTypeInfoIndex(GLenum uniformType) > return 28; > case GL_INT_SAMPLER_2D_MULTISAMPLE: > return 29; >- case GL_INT_SAMPLER_3D: >+ case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: > return 30; >- case GL_INT_SAMPLER_CUBE: >+ case GL_INT_SAMPLER_3D: > return 31; >- case GL_INT_VEC2: >+ case GL_INT_SAMPLER_CUBE: > return 32; >- case GL_INT_VEC3: >+ case GL_INT_VEC2: > return 33; >- case GL_INT_VEC4: >+ case GL_INT_VEC3: > return 34; >- case GL_SAMPLER_2D: >+ case GL_INT_VEC4: > return 35; >- case GL_SAMPLER_2D_ARRAY: >+ case GL_SAMPLER_2D: > return 36; >- case GL_SAMPLER_2D_ARRAY_SHADOW: >+ case GL_SAMPLER_2D_ARRAY: > return 37; >- case GL_SAMPLER_2D_MULTISAMPLE: >+ case GL_SAMPLER_2D_ARRAY_SHADOW: > return 38; >- case GL_SAMPLER_2D_RECT_ANGLE: >+ case GL_SAMPLER_2D_MULTISAMPLE: > return 39; >- case GL_SAMPLER_2D_SHADOW: >+ case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: > return 40; >- case GL_SAMPLER_3D: >+ case GL_SAMPLER_2D_RECT_ANGLE: > return 41; >- case GL_SAMPLER_CUBE: >+ case GL_SAMPLER_2D_SHADOW: > return 42; >- case GL_SAMPLER_CUBE_SHADOW: >+ case GL_SAMPLER_3D: > return 43; >- case GL_SAMPLER_EXTERNAL_OES: >+ case GL_SAMPLER_CUBE: > return 44; >- case GL_UNSIGNED_INT: >+ case GL_SAMPLER_CUBE_SHADOW: > return 45; >- case GL_UNSIGNED_INT_ATOMIC_COUNTER: >+ case GL_SAMPLER_EXTERNAL_OES: > return 46; >- case GL_UNSIGNED_INT_IMAGE_2D: >+ case GL_UNSIGNED_INT: > return 47; >- case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: >+ case GL_UNSIGNED_INT_ATOMIC_COUNTER: > return 48; >- case GL_UNSIGNED_INT_IMAGE_3D: >+ case GL_UNSIGNED_INT_IMAGE_2D: > return 49; >- case GL_UNSIGNED_INT_IMAGE_CUBE: >+ case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: > return 50; >- case GL_UNSIGNED_INT_SAMPLER_2D: >+ case GL_UNSIGNED_INT_IMAGE_3D: > return 51; >- case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: >+ case GL_UNSIGNED_INT_IMAGE_CUBE: > return 52; >- case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: >+ case GL_UNSIGNED_INT_SAMPLER_2D: > return 53; >- case GL_UNSIGNED_INT_SAMPLER_3D: >+ case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: > return 54; >- case GL_UNSIGNED_INT_SAMPLER_CUBE: >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: > return 55; >- case GL_UNSIGNED_INT_VEC2: >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: > return 56; >- case GL_UNSIGNED_INT_VEC3: >+ case GL_UNSIGNED_INT_SAMPLER_3D: > return 57; >- case GL_UNSIGNED_INT_VEC4: >+ case GL_UNSIGNED_INT_SAMPLER_CUBE: > return 58; >+ case GL_UNSIGNED_INT_VEC2: >+ return 59; >+ case GL_UNSIGNED_INT_VEC3: >+ return 60; >+ case GL_UNSIGNED_INT_VEC4: >+ return 61; > default: > UNREACHABLE(); > return 0; >diff --git a/Source/ThirdParty/ANGLE/src/common/utilities.cpp b/Source/ThirdParty/ANGLE/src/common/utilities.cpp >index 6dae9cc51f8..84be99016ea 100644 >--- a/Source/ThirdParty/ANGLE/src/common/utilities.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/utilities.cpp >@@ -7,16 +7,17 @@ > // utilities.cpp: Conversion functions and other utility routines. > > #include "common/utilities.h" >+#include <GLSLANG/ShaderVars.h> > #include "common/mathutil.h" > #include "common/platform.h" > > #include <set> > > #if defined(ANGLE_ENABLE_WINDOWS_STORE) >-# include <wrl.h> >-# include <wrl/wrappers/corewrappers.h> >-# include <windows.applicationmodel.core.h> >-# include <windows.graphics.display.h> >+# include <windows.applicationmodel.core.h> >+# include <windows.graphics.display.h> >+# include <wrl.h> >+# include <wrl/wrappers/corewrappers.h> > #endif > > namespace >@@ -101,72 +102,75 @@ int VariableComponentCount(GLenum type) > > GLenum VariableComponentType(GLenum type) > { >- switch(type) >+ switch (type) > { >- case GL_BOOL: >- case GL_BOOL_VEC2: >- case GL_BOOL_VEC3: >- case GL_BOOL_VEC4: >- return GL_BOOL; >- case GL_FLOAT: >- case GL_FLOAT_VEC2: >- case GL_FLOAT_VEC3: >- case GL_FLOAT_VEC4: >- case GL_FLOAT_MAT2: >- case GL_FLOAT_MAT3: >- case GL_FLOAT_MAT4: >- case GL_FLOAT_MAT2x3: >- case GL_FLOAT_MAT3x2: >- case GL_FLOAT_MAT2x4: >- case GL_FLOAT_MAT4x2: >- case GL_FLOAT_MAT3x4: >- case GL_FLOAT_MAT4x3: >- return GL_FLOAT; >- case GL_INT: >- case GL_SAMPLER_2D: >- case GL_SAMPLER_2D_RECT_ANGLE: >- case GL_SAMPLER_3D: >- case GL_SAMPLER_CUBE: >- case GL_SAMPLER_2D_ARRAY: >- case GL_SAMPLER_EXTERNAL_OES: >- case GL_SAMPLER_2D_MULTISAMPLE: >- case GL_INT_SAMPLER_2D: >- case GL_INT_SAMPLER_3D: >- case GL_INT_SAMPLER_CUBE: >- case GL_INT_SAMPLER_2D_ARRAY: >- case GL_INT_SAMPLER_2D_MULTISAMPLE: >- case GL_UNSIGNED_INT_SAMPLER_2D: >- case GL_UNSIGNED_INT_SAMPLER_3D: >- case GL_UNSIGNED_INT_SAMPLER_CUBE: >- case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: >- case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: >- case GL_SAMPLER_2D_SHADOW: >- case GL_SAMPLER_CUBE_SHADOW: >- case GL_SAMPLER_2D_ARRAY_SHADOW: >- case GL_INT_VEC2: >- case GL_INT_VEC3: >- case GL_INT_VEC4: >- case GL_IMAGE_2D: >- case GL_INT_IMAGE_2D: >- case GL_UNSIGNED_INT_IMAGE_2D: >- case GL_IMAGE_3D: >- case GL_INT_IMAGE_3D: >- case GL_UNSIGNED_INT_IMAGE_3D: >- case GL_IMAGE_2D_ARRAY: >- case GL_INT_IMAGE_2D_ARRAY: >- case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: >- case GL_IMAGE_CUBE: >- case GL_INT_IMAGE_CUBE: >- case GL_UNSIGNED_INT_IMAGE_CUBE: >- case GL_UNSIGNED_INT_ATOMIC_COUNTER: >- return GL_INT; >- case GL_UNSIGNED_INT: >- case GL_UNSIGNED_INT_VEC2: >- case GL_UNSIGNED_INT_VEC3: >- case GL_UNSIGNED_INT_VEC4: >- return GL_UNSIGNED_INT; >- default: >- UNREACHABLE(); >+ case GL_BOOL: >+ case GL_BOOL_VEC2: >+ case GL_BOOL_VEC3: >+ case GL_BOOL_VEC4: >+ return GL_BOOL; >+ case GL_FLOAT: >+ case GL_FLOAT_VEC2: >+ case GL_FLOAT_VEC3: >+ case GL_FLOAT_VEC4: >+ case GL_FLOAT_MAT2: >+ case GL_FLOAT_MAT3: >+ case GL_FLOAT_MAT4: >+ case GL_FLOAT_MAT2x3: >+ case GL_FLOAT_MAT3x2: >+ case GL_FLOAT_MAT2x4: >+ case GL_FLOAT_MAT4x2: >+ case GL_FLOAT_MAT3x4: >+ case GL_FLOAT_MAT4x3: >+ return GL_FLOAT; >+ case GL_INT: >+ case GL_SAMPLER_2D: >+ case GL_SAMPLER_2D_RECT_ANGLE: >+ case GL_SAMPLER_3D: >+ case GL_SAMPLER_CUBE: >+ case GL_SAMPLER_2D_ARRAY: >+ case GL_SAMPLER_EXTERNAL_OES: >+ case GL_SAMPLER_2D_MULTISAMPLE: >+ case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_INT_SAMPLER_2D: >+ case GL_INT_SAMPLER_3D: >+ case GL_INT_SAMPLER_CUBE: >+ case GL_INT_SAMPLER_2D_ARRAY: >+ case GL_INT_SAMPLER_2D_MULTISAMPLE: >+ case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_UNSIGNED_INT_SAMPLER_2D: >+ case GL_UNSIGNED_INT_SAMPLER_3D: >+ case GL_UNSIGNED_INT_SAMPLER_CUBE: >+ case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_SAMPLER_2D_SHADOW: >+ case GL_SAMPLER_CUBE_SHADOW: >+ case GL_SAMPLER_2D_ARRAY_SHADOW: >+ case GL_INT_VEC2: >+ case GL_INT_VEC3: >+ case GL_INT_VEC4: >+ case GL_IMAGE_2D: >+ case GL_INT_IMAGE_2D: >+ case GL_UNSIGNED_INT_IMAGE_2D: >+ case GL_IMAGE_3D: >+ case GL_INT_IMAGE_3D: >+ case GL_UNSIGNED_INT_IMAGE_3D: >+ case GL_IMAGE_2D_ARRAY: >+ case GL_INT_IMAGE_2D_ARRAY: >+ case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: >+ case GL_IMAGE_CUBE: >+ case GL_INT_IMAGE_CUBE: >+ case GL_UNSIGNED_INT_IMAGE_CUBE: >+ case GL_UNSIGNED_INT_ATOMIC_COUNTER: >+ return GL_INT; >+ case GL_UNSIGNED_INT: >+ case GL_UNSIGNED_INT_VEC2: >+ case GL_UNSIGNED_INT_VEC3: >+ case GL_UNSIGNED_INT_VEC4: >+ return GL_UNSIGNED_INT; >+ default: >+ UNREACHABLE(); > } > > return GL_NONE; >@@ -174,13 +178,18 @@ GLenum VariableComponentType(GLenum type) > > size_t VariableComponentSize(GLenum type) > { >- switch(type) >+ switch (type) > { >- case GL_BOOL: return sizeof(GLint); >- case GL_FLOAT: return sizeof(GLfloat); >- case GL_INT: return sizeof(GLint); >- case GL_UNSIGNED_INT: return sizeof(GLuint); >- default: UNREACHABLE(); >+ case GL_BOOL: >+ return sizeof(GLint); >+ case GL_FLOAT: >+ return sizeof(GLfloat); >+ case GL_INT: >+ return sizeof(GLint); >+ case GL_UNSIGNED_INT: >+ return sizeof(GLuint); >+ default: >+ UNREACHABLE(); > } > > return 0; >@@ -201,26 +210,26 @@ GLenum VariableBoolVectorType(GLenum type) > { > switch (type) > { >- case GL_FLOAT: >- case GL_INT: >- case GL_UNSIGNED_INT: >- return GL_BOOL; >- case GL_FLOAT_VEC2: >- case GL_INT_VEC2: >- case GL_UNSIGNED_INT_VEC2: >- return GL_BOOL_VEC2; >- case GL_FLOAT_VEC3: >- case GL_INT_VEC3: >- case GL_UNSIGNED_INT_VEC3: >- return GL_BOOL_VEC3; >- case GL_FLOAT_VEC4: >- case GL_INT_VEC4: >- case GL_UNSIGNED_INT_VEC4: >- return GL_BOOL_VEC4; >- >- default: >- UNREACHABLE(); >- return GL_NONE; >+ case GL_FLOAT: >+ case GL_INT: >+ case GL_UNSIGNED_INT: >+ return GL_BOOL; >+ case GL_FLOAT_VEC2: >+ case GL_INT_VEC2: >+ case GL_UNSIGNED_INT_VEC2: >+ return GL_BOOL_VEC2; >+ case GL_FLOAT_VEC3: >+ case GL_INT_VEC3: >+ case GL_UNSIGNED_INT_VEC3: >+ return GL_BOOL_VEC3; >+ case GL_FLOAT_VEC4: >+ case GL_INT_VEC4: >+ case GL_UNSIGNED_INT_VEC4: >+ return GL_BOOL_VEC4; >+ >+ default: >+ UNREACHABLE(); >+ return GL_NONE; > } > } > >@@ -228,72 +237,75 @@ int VariableRowCount(GLenum type) > { > switch (type) > { >- case GL_NONE: >- return 0; >- case GL_BOOL: >- case GL_FLOAT: >- case GL_INT: >- case GL_UNSIGNED_INT: >- case GL_BOOL_VEC2: >- case GL_FLOAT_VEC2: >- case GL_INT_VEC2: >- case GL_UNSIGNED_INT_VEC2: >- case GL_BOOL_VEC3: >- case GL_FLOAT_VEC3: >- case GL_INT_VEC3: >- case GL_UNSIGNED_INT_VEC3: >- case GL_BOOL_VEC4: >- case GL_FLOAT_VEC4: >- case GL_INT_VEC4: >- case GL_UNSIGNED_INT_VEC4: >- case GL_SAMPLER_2D: >- case GL_SAMPLER_3D: >- case GL_SAMPLER_CUBE: >- case GL_SAMPLER_2D_ARRAY: >- case GL_SAMPLER_EXTERNAL_OES: >- case GL_SAMPLER_2D_RECT_ANGLE: >- case GL_SAMPLER_2D_MULTISAMPLE: >- case GL_INT_SAMPLER_2D: >- case GL_INT_SAMPLER_3D: >- case GL_INT_SAMPLER_CUBE: >- case GL_INT_SAMPLER_2D_ARRAY: >- case GL_INT_SAMPLER_2D_MULTISAMPLE: >- case GL_UNSIGNED_INT_SAMPLER_2D: >- case GL_UNSIGNED_INT_SAMPLER_3D: >- case GL_UNSIGNED_INT_SAMPLER_CUBE: >- case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: >- case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: >- case GL_SAMPLER_2D_SHADOW: >- case GL_SAMPLER_CUBE_SHADOW: >- case GL_SAMPLER_2D_ARRAY_SHADOW: >- case GL_IMAGE_2D: >- case GL_INT_IMAGE_2D: >- case GL_UNSIGNED_INT_IMAGE_2D: >- case GL_IMAGE_2D_ARRAY: >- case GL_INT_IMAGE_2D_ARRAY: >- case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: >- case GL_IMAGE_3D: >- case GL_INT_IMAGE_3D: >- case GL_UNSIGNED_INT_IMAGE_3D: >- case GL_IMAGE_CUBE: >- case GL_INT_IMAGE_CUBE: >- case GL_UNSIGNED_INT_IMAGE_CUBE: >- case GL_UNSIGNED_INT_ATOMIC_COUNTER: >- return 1; >- case GL_FLOAT_MAT2: >- case GL_FLOAT_MAT3x2: >- case GL_FLOAT_MAT4x2: >- return 2; >- case GL_FLOAT_MAT3: >- case GL_FLOAT_MAT2x3: >- case GL_FLOAT_MAT4x3: >- return 3; >- case GL_FLOAT_MAT4: >- case GL_FLOAT_MAT2x4: >- case GL_FLOAT_MAT3x4: >- return 4; >- default: >- UNREACHABLE(); >+ case GL_NONE: >+ return 0; >+ case GL_BOOL: >+ case GL_FLOAT: >+ case GL_INT: >+ case GL_UNSIGNED_INT: >+ case GL_BOOL_VEC2: >+ case GL_FLOAT_VEC2: >+ case GL_INT_VEC2: >+ case GL_UNSIGNED_INT_VEC2: >+ case GL_BOOL_VEC3: >+ case GL_FLOAT_VEC3: >+ case GL_INT_VEC3: >+ case GL_UNSIGNED_INT_VEC3: >+ case GL_BOOL_VEC4: >+ case GL_FLOAT_VEC4: >+ case GL_INT_VEC4: >+ case GL_UNSIGNED_INT_VEC4: >+ case GL_SAMPLER_2D: >+ case GL_SAMPLER_3D: >+ case GL_SAMPLER_CUBE: >+ case GL_SAMPLER_2D_ARRAY: >+ case GL_SAMPLER_EXTERNAL_OES: >+ case GL_SAMPLER_2D_RECT_ANGLE: >+ case GL_SAMPLER_2D_MULTISAMPLE: >+ case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_INT_SAMPLER_2D: >+ case GL_INT_SAMPLER_3D: >+ case GL_INT_SAMPLER_CUBE: >+ case GL_INT_SAMPLER_2D_ARRAY: >+ case GL_INT_SAMPLER_2D_MULTISAMPLE: >+ case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_UNSIGNED_INT_SAMPLER_2D: >+ case GL_UNSIGNED_INT_SAMPLER_3D: >+ case GL_UNSIGNED_INT_SAMPLER_CUBE: >+ case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_SAMPLER_2D_SHADOW: >+ case GL_SAMPLER_CUBE_SHADOW: >+ case GL_SAMPLER_2D_ARRAY_SHADOW: >+ case GL_IMAGE_2D: >+ case GL_INT_IMAGE_2D: >+ case GL_UNSIGNED_INT_IMAGE_2D: >+ case GL_IMAGE_2D_ARRAY: >+ case GL_INT_IMAGE_2D_ARRAY: >+ case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: >+ case GL_IMAGE_3D: >+ case GL_INT_IMAGE_3D: >+ case GL_UNSIGNED_INT_IMAGE_3D: >+ case GL_IMAGE_CUBE: >+ case GL_INT_IMAGE_CUBE: >+ case GL_UNSIGNED_INT_IMAGE_CUBE: >+ case GL_UNSIGNED_INT_ATOMIC_COUNTER: >+ return 1; >+ case GL_FLOAT_MAT2: >+ case GL_FLOAT_MAT3x2: >+ case GL_FLOAT_MAT4x2: >+ return 2; >+ case GL_FLOAT_MAT3: >+ case GL_FLOAT_MAT2x3: >+ case GL_FLOAT_MAT4x3: >+ return 3; >+ case GL_FLOAT_MAT4: >+ case GL_FLOAT_MAT2x4: >+ case GL_FLOAT_MAT3x4: >+ return 4; >+ default: >+ UNREACHABLE(); > } > > return 0; >@@ -303,72 +315,75 @@ int VariableColumnCount(GLenum type) > { > switch (type) > { >- case GL_NONE: >- return 0; >- case GL_BOOL: >- case GL_FLOAT: >- case GL_INT: >- case GL_UNSIGNED_INT: >- case GL_SAMPLER_2D: >- case GL_SAMPLER_3D: >- case GL_SAMPLER_CUBE: >- case GL_SAMPLER_2D_ARRAY: >- case GL_SAMPLER_2D_MULTISAMPLE: >- case GL_INT_SAMPLER_2D: >- case GL_INT_SAMPLER_3D: >- case GL_INT_SAMPLER_CUBE: >- case GL_INT_SAMPLER_2D_ARRAY: >- case GL_INT_SAMPLER_2D_MULTISAMPLE: >- case GL_SAMPLER_EXTERNAL_OES: >- case GL_SAMPLER_2D_RECT_ANGLE: >- case GL_UNSIGNED_INT_SAMPLER_2D: >- case GL_UNSIGNED_INT_SAMPLER_3D: >- case GL_UNSIGNED_INT_SAMPLER_CUBE: >- case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: >- case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: >- case GL_SAMPLER_2D_SHADOW: >- case GL_SAMPLER_CUBE_SHADOW: >- case GL_SAMPLER_2D_ARRAY_SHADOW: >- case GL_IMAGE_2D: >- case GL_INT_IMAGE_2D: >- case GL_UNSIGNED_INT_IMAGE_2D: >- case GL_IMAGE_3D: >- case GL_INT_IMAGE_3D: >- case GL_UNSIGNED_INT_IMAGE_3D: >- case GL_IMAGE_2D_ARRAY: >- case GL_INT_IMAGE_2D_ARRAY: >- case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: >- case GL_IMAGE_CUBE: >- case GL_INT_IMAGE_CUBE: >- case GL_UNSIGNED_INT_IMAGE_CUBE: >- case GL_UNSIGNED_INT_ATOMIC_COUNTER: >- return 1; >- case GL_BOOL_VEC2: >- case GL_FLOAT_VEC2: >- case GL_INT_VEC2: >- case GL_UNSIGNED_INT_VEC2: >- case GL_FLOAT_MAT2: >- case GL_FLOAT_MAT2x3: >- case GL_FLOAT_MAT2x4: >- return 2; >- case GL_BOOL_VEC3: >- case GL_FLOAT_VEC3: >- case GL_INT_VEC3: >- case GL_UNSIGNED_INT_VEC3: >- case GL_FLOAT_MAT3: >- case GL_FLOAT_MAT3x2: >- case GL_FLOAT_MAT3x4: >- return 3; >- case GL_BOOL_VEC4: >- case GL_FLOAT_VEC4: >- case GL_INT_VEC4: >- case GL_UNSIGNED_INT_VEC4: >- case GL_FLOAT_MAT4: >- case GL_FLOAT_MAT4x2: >- case GL_FLOAT_MAT4x3: >- return 4; >- default: >- UNREACHABLE(); >+ case GL_NONE: >+ return 0; >+ case GL_BOOL: >+ case GL_FLOAT: >+ case GL_INT: >+ case GL_UNSIGNED_INT: >+ case GL_SAMPLER_2D: >+ case GL_SAMPLER_3D: >+ case GL_SAMPLER_CUBE: >+ case GL_SAMPLER_2D_ARRAY: >+ case GL_SAMPLER_2D_MULTISAMPLE: >+ case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_INT_SAMPLER_2D: >+ case GL_INT_SAMPLER_3D: >+ case GL_INT_SAMPLER_CUBE: >+ case GL_INT_SAMPLER_2D_ARRAY: >+ case GL_INT_SAMPLER_2D_MULTISAMPLE: >+ case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_SAMPLER_EXTERNAL_OES: >+ case GL_SAMPLER_2D_RECT_ANGLE: >+ case GL_UNSIGNED_INT_SAMPLER_2D: >+ case GL_UNSIGNED_INT_SAMPLER_3D: >+ case GL_UNSIGNED_INT_SAMPLER_CUBE: >+ case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_SAMPLER_2D_SHADOW: >+ case GL_SAMPLER_CUBE_SHADOW: >+ case GL_SAMPLER_2D_ARRAY_SHADOW: >+ case GL_IMAGE_2D: >+ case GL_INT_IMAGE_2D: >+ case GL_UNSIGNED_INT_IMAGE_2D: >+ case GL_IMAGE_3D: >+ case GL_INT_IMAGE_3D: >+ case GL_UNSIGNED_INT_IMAGE_3D: >+ case GL_IMAGE_2D_ARRAY: >+ case GL_INT_IMAGE_2D_ARRAY: >+ case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: >+ case GL_IMAGE_CUBE: >+ case GL_INT_IMAGE_CUBE: >+ case GL_UNSIGNED_INT_IMAGE_CUBE: >+ case GL_UNSIGNED_INT_ATOMIC_COUNTER: >+ return 1; >+ case GL_BOOL_VEC2: >+ case GL_FLOAT_VEC2: >+ case GL_INT_VEC2: >+ case GL_UNSIGNED_INT_VEC2: >+ case GL_FLOAT_MAT2: >+ case GL_FLOAT_MAT2x3: >+ case GL_FLOAT_MAT2x4: >+ return 2; >+ case GL_BOOL_VEC3: >+ case GL_FLOAT_VEC3: >+ case GL_INT_VEC3: >+ case GL_UNSIGNED_INT_VEC3: >+ case GL_FLOAT_MAT3: >+ case GL_FLOAT_MAT3x2: >+ case GL_FLOAT_MAT3x4: >+ return 3; >+ case GL_BOOL_VEC4: >+ case GL_FLOAT_VEC4: >+ case GL_INT_VEC4: >+ case GL_UNSIGNED_INT_VEC4: >+ case GL_FLOAT_MAT4: >+ case GL_FLOAT_MAT4x2: >+ case GL_FLOAT_MAT4x3: >+ return 4; >+ default: >+ UNREACHABLE(); > } > > return 0; >@@ -378,27 +393,30 @@ bool IsSamplerType(GLenum type) > { > switch (type) > { >- case GL_SAMPLER_2D: >- case GL_SAMPLER_3D: >- case GL_SAMPLER_CUBE: >- case GL_SAMPLER_2D_ARRAY: >- case GL_SAMPLER_EXTERNAL_OES: >- case GL_SAMPLER_2D_MULTISAMPLE: >- case GL_SAMPLER_2D_RECT_ANGLE: >- case GL_INT_SAMPLER_2D: >- case GL_INT_SAMPLER_3D: >- case GL_INT_SAMPLER_CUBE: >- case GL_INT_SAMPLER_2D_ARRAY: >- case GL_INT_SAMPLER_2D_MULTISAMPLE: >- case GL_UNSIGNED_INT_SAMPLER_2D: >- case GL_UNSIGNED_INT_SAMPLER_3D: >- case GL_UNSIGNED_INT_SAMPLER_CUBE: >- case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: >- case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: >- case GL_SAMPLER_2D_SHADOW: >- case GL_SAMPLER_CUBE_SHADOW: >- case GL_SAMPLER_2D_ARRAY_SHADOW: >- return true; >+ case GL_SAMPLER_2D: >+ case GL_SAMPLER_3D: >+ case GL_SAMPLER_CUBE: >+ case GL_SAMPLER_2D_ARRAY: >+ case GL_SAMPLER_EXTERNAL_OES: >+ case GL_SAMPLER_2D_MULTISAMPLE: >+ case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_SAMPLER_2D_RECT_ANGLE: >+ case GL_INT_SAMPLER_2D: >+ case GL_INT_SAMPLER_3D: >+ case GL_INT_SAMPLER_CUBE: >+ case GL_INT_SAMPLER_2D_ARRAY: >+ case GL_INT_SAMPLER_2D_MULTISAMPLE: >+ case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_UNSIGNED_INT_SAMPLER_2D: >+ case GL_UNSIGNED_INT_SAMPLER_3D: >+ case GL_UNSIGNED_INT_SAMPLER_CUBE: >+ case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_SAMPLER_2D_SHADOW: >+ case GL_SAMPLER_CUBE_SHADOW: >+ case GL_SAMPLER_2D_ARRAY_SHADOW: >+ return true; > } > > return false; >@@ -425,6 +443,30 @@ bool IsImageType(GLenum type) > return false; > } > >+bool IsImage2DType(GLenum type) >+{ >+ switch (type) >+ { >+ case GL_IMAGE_2D: >+ case GL_INT_IMAGE_2D: >+ case GL_UNSIGNED_INT_IMAGE_2D: >+ return true; >+ case GL_IMAGE_3D: >+ case GL_INT_IMAGE_3D: >+ case GL_UNSIGNED_INT_IMAGE_3D: >+ case GL_IMAGE_2D_ARRAY: >+ case GL_INT_IMAGE_2D_ARRAY: >+ case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: >+ case GL_IMAGE_CUBE: >+ case GL_INT_IMAGE_CUBE: >+ case GL_UNSIGNED_INT_IMAGE_CUBE: >+ return false; >+ default: >+ UNREACHABLE(); >+ return false; >+ } >+} >+ > bool IsAtomicCounterType(GLenum type) > { > return type == GL_UNSIGNED_INT_ATOMIC_COUNTER; >@@ -436,50 +478,6 @@ bool IsOpaqueType(GLenum type) > return IsImageType(type) || IsSamplerType(type) || IsAtomicCounterType(type); > } > >-GLenum SamplerTypeToTextureType(GLenum samplerType) >-{ >- switch (samplerType) >- { >- case GL_SAMPLER_2D: >- case GL_INT_SAMPLER_2D: >- case GL_UNSIGNED_INT_SAMPLER_2D: >- case GL_SAMPLER_2D_SHADOW: >- return GL_TEXTURE_2D; >- >- case GL_SAMPLER_EXTERNAL_OES: >- return GL_TEXTURE_EXTERNAL_OES; >- >- case GL_SAMPLER_CUBE: >- case GL_INT_SAMPLER_CUBE: >- case GL_UNSIGNED_INT_SAMPLER_CUBE: >- case GL_SAMPLER_CUBE_SHADOW: >- return GL_TEXTURE_CUBE_MAP; >- >- case GL_SAMPLER_2D_ARRAY: >- case GL_INT_SAMPLER_2D_ARRAY: >- case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: >- case GL_SAMPLER_2D_ARRAY_SHADOW: >- return GL_TEXTURE_2D_ARRAY; >- >- case GL_SAMPLER_3D: >- case GL_INT_SAMPLER_3D: >- case GL_UNSIGNED_INT_SAMPLER_3D: >- return GL_TEXTURE_3D; >- >- case GL_SAMPLER_2D_MULTISAMPLE: >- case GL_INT_SAMPLER_2D_MULTISAMPLE: >- case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: >- return GL_TEXTURE_2D_MULTISAMPLE; >- >- case GL_SAMPLER_2D_RECT_ANGLE: >- return GL_TEXTURE_RECTANGLE_ANGLE; >- >- default: >- UNREACHABLE(); >- return 0; >- } >-} >- > bool IsMatrixType(GLenum type) > { > return VariableRowCount(type) > 1; >@@ -494,16 +492,27 @@ GLenum TransposeMatrixType(GLenum type) > > switch (type) > { >- case GL_FLOAT_MAT2: return GL_FLOAT_MAT2; >- case GL_FLOAT_MAT3: return GL_FLOAT_MAT3; >- case GL_FLOAT_MAT4: return GL_FLOAT_MAT4; >- case GL_FLOAT_MAT2x3: return GL_FLOAT_MAT3x2; >- case GL_FLOAT_MAT3x2: return GL_FLOAT_MAT2x3; >- case GL_FLOAT_MAT2x4: return GL_FLOAT_MAT4x2; >- case GL_FLOAT_MAT4x2: return GL_FLOAT_MAT2x4; >- case GL_FLOAT_MAT3x4: return GL_FLOAT_MAT4x3; >- case GL_FLOAT_MAT4x3: return GL_FLOAT_MAT3x4; >- default: UNREACHABLE(); return GL_NONE; >+ case GL_FLOAT_MAT2: >+ return GL_FLOAT_MAT2; >+ case GL_FLOAT_MAT3: >+ return GL_FLOAT_MAT3; >+ case GL_FLOAT_MAT4: >+ return GL_FLOAT_MAT4; >+ case GL_FLOAT_MAT2x3: >+ return GL_FLOAT_MAT3x2; >+ case GL_FLOAT_MAT3x2: >+ return GL_FLOAT_MAT2x3; >+ case GL_FLOAT_MAT2x4: >+ return GL_FLOAT_MAT4x2; >+ case GL_FLOAT_MAT4x2: >+ return GL_FLOAT_MAT2x4; >+ case GL_FLOAT_MAT3x4: >+ return GL_FLOAT_MAT4x3; >+ case GL_FLOAT_MAT4x3: >+ return GL_FLOAT_MAT3x4; >+ default: >+ UNREACHABLE(); >+ return GL_NONE; > } > } > >@@ -528,7 +537,8 @@ int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsig > { > ASSERT(allocationSize <= bitsSize); > >- unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize); >+ unsigned int mask = std::numeric_limits<unsigned int>::max() >> >+ (std::numeric_limits<unsigned int>::digits - allocationSize); > > for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++) > { >@@ -544,45 +554,22 @@ int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsig > return -1; > } > >-static_assert(GL_TEXTURE_CUBE_MAP_NEGATIVE_X - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 1, "Unexpected GL cube map enum value."); >-static_assert(GL_TEXTURE_CUBE_MAP_POSITIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 2, "Unexpected GL cube map enum value."); >-static_assert(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 3, "Unexpected GL cube map enum value."); >-static_assert(GL_TEXTURE_CUBE_MAP_POSITIVE_Z - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 4, "Unexpected GL cube map enum value."); >-static_assert(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 5, "Unexpected GL cube map enum value."); >- >-bool IsCubeMapTextureTarget(GLenum target) >-{ >- return (target >= FirstCubeMapTextureTarget && target <= LastCubeMapTextureTarget); >-} >- >-size_t CubeMapTextureTargetToLayerIndex(GLenum target) >-{ >- ASSERT(IsCubeMapTextureTarget(target)); >- return target - static_cast<size_t>(FirstCubeMapTextureTarget); >-} >- >-GLenum LayerIndexToCubeMapTextureTarget(size_t index) >-{ >- ASSERT(index <= (LastCubeMapTextureTarget - FirstCubeMapTextureTarget)); >- return FirstCubeMapTextureTarget + static_cast<GLenum>(index); >-} >- >-IndexRange ComputeIndexRange(GLenum indexType, >+IndexRange ComputeIndexRange(DrawElementsType indexType, > const GLvoid *indices, > size_t count, > bool primitiveRestartEnabled) > { > switch (indexType) > { >- case GL_UNSIGNED_BYTE: >+ case DrawElementsType::UnsignedByte: > return ComputeTypedIndexRange(static_cast<const GLubyte *>(indices), count, > primitiveRestartEnabled, > GetPrimitiveRestartIndex(indexType)); >- case GL_UNSIGNED_SHORT: >+ case DrawElementsType::UnsignedShort: > return ComputeTypedIndexRange(static_cast<const GLushort *>(indices), count, > primitiveRestartEnabled, > GetPrimitiveRestartIndex(indexType)); >- case GL_UNSIGNED_INT: >+ case DrawElementsType::UnsignedInt: > return ComputeTypedIndexRange(static_cast<const GLuint *>(indices), count, > primitiveRestartEnabled, > GetPrimitiveRestartIndex(indexType)); >@@ -592,15 +579,15 @@ IndexRange ComputeIndexRange(GLenum indexType, > } > } > >-GLuint GetPrimitiveRestartIndex(GLenum indexType) >+GLuint GetPrimitiveRestartIndex(DrawElementsType indexType) > { > switch (indexType) > { >- case GL_UNSIGNED_BYTE: >+ case DrawElementsType::UnsignedByte: > return 0xFF; >- case GL_UNSIGNED_SHORT: >+ case DrawElementsType::UnsignedShort: > return 0xFFFF; >- case GL_UNSIGNED_INT: >+ case DrawElementsType::UnsignedInt: > return 0xFFFFFFFF; > default: > UNREACHABLE(); >@@ -608,25 +595,35 @@ GLuint GetPrimitiveRestartIndex(GLenum indexType) > } > } > >-bool IsTriangleMode(GLenum drawMode) >+bool IsTriangleMode(PrimitiveMode drawMode) > { > switch (drawMode) > { >- case GL_TRIANGLES: >- case GL_TRIANGLE_FAN: >- case GL_TRIANGLE_STRIP: >- return true; >- case GL_POINTS: >- case GL_LINES: >- case GL_LINE_LOOP: >- case GL_LINE_STRIP: >- return false; >- default: UNREACHABLE(); >+ case PrimitiveMode::Triangles: >+ case PrimitiveMode::TriangleFan: >+ case PrimitiveMode::TriangleStrip: >+ return true; >+ case PrimitiveMode::Points: >+ case PrimitiveMode::Lines: >+ case PrimitiveMode::LineLoop: >+ case PrimitiveMode::LineStrip: >+ return false; >+ default: >+ UNREACHABLE(); > } > > return false; > } > >+namespace priv >+{ >+const angle::PackedEnumMap<PrimitiveMode, bool> gLineModes = { >+ {{PrimitiveMode::LineLoop, true}, >+ {PrimitiveMode::LineStrip, true}, >+ {PrimitiveMode::LineStripAdjacency, true}, >+ {PrimitiveMode::Lines, true}}}; >+} // namespace priv >+ > bool IsIntegerFormat(GLenum unsizedFormat) > { > switch (unsizedFormat) >@@ -648,90 +645,93 @@ int VariableSortOrder(GLenum type) > { > switch (type) > { >- // 1. Arrays of mat4 and mat4 >- // Non-square matrices of type matCxR consume the same space as a square >- // matrix of type matN where N is the greater of C and R >- case GL_FLOAT_MAT4: >- case GL_FLOAT_MAT2x4: >- case GL_FLOAT_MAT3x4: >- case GL_FLOAT_MAT4x2: >- case GL_FLOAT_MAT4x3: >- return 0; >- >- // 2. Arrays of mat2 and mat2 (since they occupy full rows) >- case GL_FLOAT_MAT2: >- return 1; >- >- // 3. Arrays of vec4 and vec4 >- case GL_FLOAT_VEC4: >- case GL_INT_VEC4: >- case GL_BOOL_VEC4: >- case GL_UNSIGNED_INT_VEC4: >- return 2; >- >- // 4. Arrays of mat3 and mat3 >- case GL_FLOAT_MAT3: >- case GL_FLOAT_MAT2x3: >- case GL_FLOAT_MAT3x2: >- return 3; >- >- // 5. Arrays of vec3 and vec3 >- case GL_FLOAT_VEC3: >- case GL_INT_VEC3: >- case GL_BOOL_VEC3: >- case GL_UNSIGNED_INT_VEC3: >- return 4; >- >- // 6. Arrays of vec2 and vec2 >- case GL_FLOAT_VEC2: >- case GL_INT_VEC2: >- case GL_BOOL_VEC2: >- case GL_UNSIGNED_INT_VEC2: >- return 5; >- >- // 7. Single component types >- case GL_FLOAT: >- case GL_INT: >- case GL_BOOL: >- case GL_UNSIGNED_INT: >- case GL_SAMPLER_2D: >- case GL_SAMPLER_CUBE: >- case GL_SAMPLER_EXTERNAL_OES: >- case GL_SAMPLER_2D_RECT_ANGLE: >- case GL_SAMPLER_2D_ARRAY: >- case GL_SAMPLER_2D_MULTISAMPLE: >- case GL_SAMPLER_3D: >- case GL_INT_SAMPLER_2D: >- case GL_INT_SAMPLER_3D: >- case GL_INT_SAMPLER_CUBE: >- case GL_INT_SAMPLER_2D_ARRAY: >- case GL_INT_SAMPLER_2D_MULTISAMPLE: >- case GL_UNSIGNED_INT_SAMPLER_2D: >- case GL_UNSIGNED_INT_SAMPLER_3D: >- case GL_UNSIGNED_INT_SAMPLER_CUBE: >- case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: >- case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: >- case GL_SAMPLER_2D_SHADOW: >- case GL_SAMPLER_2D_ARRAY_SHADOW: >- case GL_SAMPLER_CUBE_SHADOW: >- case GL_IMAGE_2D: >- case GL_INT_IMAGE_2D: >- case GL_UNSIGNED_INT_IMAGE_2D: >- case GL_IMAGE_3D: >- case GL_INT_IMAGE_3D: >- case GL_UNSIGNED_INT_IMAGE_3D: >- case GL_IMAGE_2D_ARRAY: >- case GL_INT_IMAGE_2D_ARRAY: >- case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: >- case GL_IMAGE_CUBE: >- case GL_INT_IMAGE_CUBE: >- case GL_UNSIGNED_INT_IMAGE_CUBE: >- case GL_UNSIGNED_INT_ATOMIC_COUNTER: >- return 6; >- >- default: >- UNREACHABLE(); >- return 0; >+ // 1. Arrays of mat4 and mat4 >+ // Non-square matrices of type matCxR consume the same space as a square >+ // matrix of type matN where N is the greater of C and R >+ case GL_FLOAT_MAT4: >+ case GL_FLOAT_MAT2x4: >+ case GL_FLOAT_MAT3x4: >+ case GL_FLOAT_MAT4x2: >+ case GL_FLOAT_MAT4x3: >+ return 0; >+ >+ // 2. Arrays of mat2 and mat2 (since they occupy full rows) >+ case GL_FLOAT_MAT2: >+ return 1; >+ >+ // 3. Arrays of vec4 and vec4 >+ case GL_FLOAT_VEC4: >+ case GL_INT_VEC4: >+ case GL_BOOL_VEC4: >+ case GL_UNSIGNED_INT_VEC4: >+ return 2; >+ >+ // 4. Arrays of mat3 and mat3 >+ case GL_FLOAT_MAT3: >+ case GL_FLOAT_MAT2x3: >+ case GL_FLOAT_MAT3x2: >+ return 3; >+ >+ // 5. Arrays of vec3 and vec3 >+ case GL_FLOAT_VEC3: >+ case GL_INT_VEC3: >+ case GL_BOOL_VEC3: >+ case GL_UNSIGNED_INT_VEC3: >+ return 4; >+ >+ // 6. Arrays of vec2 and vec2 >+ case GL_FLOAT_VEC2: >+ case GL_INT_VEC2: >+ case GL_BOOL_VEC2: >+ case GL_UNSIGNED_INT_VEC2: >+ return 5; >+ >+ // 7. Single component types >+ case GL_FLOAT: >+ case GL_INT: >+ case GL_BOOL: >+ case GL_UNSIGNED_INT: >+ case GL_SAMPLER_2D: >+ case GL_SAMPLER_CUBE: >+ case GL_SAMPLER_EXTERNAL_OES: >+ case GL_SAMPLER_2D_RECT_ANGLE: >+ case GL_SAMPLER_2D_ARRAY: >+ case GL_SAMPLER_2D_MULTISAMPLE: >+ case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_SAMPLER_3D: >+ case GL_INT_SAMPLER_2D: >+ case GL_INT_SAMPLER_3D: >+ case GL_INT_SAMPLER_CUBE: >+ case GL_INT_SAMPLER_2D_ARRAY: >+ case GL_INT_SAMPLER_2D_MULTISAMPLE: >+ case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_UNSIGNED_INT_SAMPLER_2D: >+ case GL_UNSIGNED_INT_SAMPLER_3D: >+ case GL_UNSIGNED_INT_SAMPLER_CUBE: >+ case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: >+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: >+ case GL_SAMPLER_2D_SHADOW: >+ case GL_SAMPLER_2D_ARRAY_SHADOW: >+ case GL_SAMPLER_CUBE_SHADOW: >+ case GL_IMAGE_2D: >+ case GL_INT_IMAGE_2D: >+ case GL_UNSIGNED_INT_IMAGE_2D: >+ case GL_IMAGE_3D: >+ case GL_INT_IMAGE_3D: >+ case GL_UNSIGNED_INT_IMAGE_3D: >+ case GL_IMAGE_2D_ARRAY: >+ case GL_INT_IMAGE_2D_ARRAY: >+ case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: >+ case GL_IMAGE_CUBE: >+ case GL_INT_IMAGE_CUBE: >+ case GL_UNSIGNED_INT_IMAGE_CUBE: >+ case GL_UNSIGNED_INT_ATOMIC_COUNTER: >+ return 6; >+ >+ default: >+ UNREACHABLE(); >+ return 0; > } > } > >@@ -770,6 +770,38 @@ std::string ParseResourceName(const std::string &name, std::vector<unsigned int> > return name.substr(0, baseNameLength); > } > >+const sh::ShaderVariable *FindShaderVarField(const sh::ShaderVariable &var, >+ const std::string &fullName) >+{ >+ if (var.fields.empty()) >+ { >+ return nullptr; >+ } >+ size_t pos = fullName.find_first_of("."); >+ if (pos == std::string::npos) >+ { >+ return nullptr; >+ } >+ std::string topName = fullName.substr(0, pos); >+ if (topName != var.name) >+ { >+ return nullptr; >+ } >+ std::string fieldName = fullName.substr(pos + 1); >+ if (fieldName.empty()) >+ { >+ return nullptr; >+ } >+ for (const auto &field : var.fields) >+ { >+ if (field.name == fieldName) >+ { >+ return &field; >+ } >+ } >+ return nullptr; >+} >+ > unsigned int ArraySizeProduct(const std::vector<unsigned int> &arraySizes) > { > unsigned int arraySizeProduct = 1u; >@@ -915,6 +947,18 @@ bool IsRenderbufferTarget(EGLenum target) > return target == EGL_GL_RENDERBUFFER_KHR; > } > >+bool IsExternalImageTarget(EGLenum target) >+{ >+ switch (target) >+ { >+ case EGL_NATIVE_BUFFER_ANDROID: >+ return true; >+ >+ default: >+ return false; >+ } >+} >+ > const char *GetGenericErrorMessage(EGLint error) > { > switch (error) >@@ -963,36 +1007,6 @@ const char *GetGenericErrorMessage(EGLint error) > > namespace egl_gl > { >-GLenum EGLCubeMapTargetToGLCubeMapTarget(EGLenum eglTarget) >-{ >- ASSERT(egl::IsCubeMapTextureTarget(eglTarget)); >- return gl::LayerIndexToCubeMapTextureTarget(egl::CubeMapTextureTargetToLayerIndex(eglTarget)); >-} >- >-GLenum EGLImageTargetToGLTextureTarget(EGLenum eglTarget) >-{ >- switch (eglTarget) >- { >- case EGL_GL_TEXTURE_2D_KHR: >- return GL_TEXTURE_2D; >- >- case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR: >- case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR: >- case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR: >- case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR: >- case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR: >- case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR: >- return EGLCubeMapTargetToGLCubeMapTarget(eglTarget); >- >- case EGL_GL_TEXTURE_3D_KHR: >- return GL_TEXTURE_3D; >- >- default: >- UNREACHABLE(); >- return GL_NONE; >- } >-} >- > GLuint EGLClientBufferToGLObjectHandle(EGLClientBuffer buffer) > { > return static_cast<GLuint>(reinterpret_cast<uintptr_t>(buffer)); >@@ -1016,12 +1030,18 @@ EGLenum GLComponentTypeToEGLColorComponentType(GLenum glComponentType) > return EGL_NONE; > } > } >+ >+EGLClientBuffer GLObjectHandleToEGLClientBuffer(GLuint handle) >+{ >+ return reinterpret_cast<EGLClientBuffer>(static_cast<uintptr_t>(handle)); >+} >+ > } // namespace gl_egl > > #if !defined(ANGLE_ENABLE_WINDOWS_STORE) > std::string getTempPath() > { >-#ifdef ANGLE_PLATFORM_WINDOWS >+# ifdef ANGLE_PLATFORM_WINDOWS > char path[MAX_PATH]; > DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path); > if (pathLen == 0) >@@ -1038,15 +1058,15 @@ std::string getTempPath() > } > > return path; >-#else >+# else > UNIMPLEMENTED(); > return ""; >-#endif >+# endif > } > >-void writeFile(const char* path, const void* content, size_t size) >+void writeFile(const char *path, const void *content, size_t size) > { >- FILE* file = fopen(path, "w"); >+ FILE *file = fopen(path, "w"); > if (!file) > { > UNREACHABLE(); >@@ -1056,9 +1076,9 @@ void writeFile(const char* path, const void* content, size_t size) > fwrite(content, sizeof(char), size, file); > fclose(file); > } >-#endif // !ANGLE_ENABLE_WINDOWS_STORE >+#endif // !ANGLE_ENABLE_WINDOWS_STORE > >-#if defined (ANGLE_PLATFORM_WINDOWS) >+#if defined(ANGLE_PLATFORM_WINDOWS) > > // Causes the thread to relinquish the remainder of its time slice to any > // other thread that is ready to run.If there are no other threads ready >diff --git a/Source/ThirdParty/ANGLE/src/common/utilities.h b/Source/ThirdParty/ANGLE/src/common/utilities.h >index f2f9c63d0e6..9dcb06e8a2d 100644 >--- a/Source/ThirdParty/ANGLE/src/common/utilities.h >+++ b/Source/ThirdParty/ANGLE/src/common/utilities.h >@@ -15,9 +15,17 @@ > #include <math.h> > #include <string> > #include <vector> >+ > #include "angle_gl.h" > >+#include "common/PackedEnums.h" > #include "common/mathutil.h" >+#include "common/platform.h" >+ >+namespace sh >+{ >+struct ShaderVariable; >+} > > namespace gl > { >@@ -31,9 +39,9 @@ int VariableRowCount(GLenum type); > int VariableColumnCount(GLenum type); > bool IsSamplerType(GLenum type); > bool IsImageType(GLenum type); >+bool IsImage2DType(GLenum type); > bool IsAtomicCounterType(GLenum type); > bool IsOpaqueType(GLenum type); >-GLenum SamplerTypeToTextureType(GLenum samplerType); > bool IsMatrixType(GLenum type); > GLenum TransposeMatrixType(GLenum type); > int VariableRegisterCount(GLenum type); >@@ -44,12 +52,6 @@ GLenum VariableBoolVectorType(GLenum type); > > int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize); > >-static const GLenum FirstCubeMapTextureTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X; >-static const GLenum LastCubeMapTextureTarget = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; >-bool IsCubeMapTextureTarget(GLenum target); >-size_t CubeMapTextureTargetToLayerIndex(GLenum target); >-GLenum LayerIndexToCubeMapTextureTarget(size_t index); >- > // Parse the base resource name and array indices. Returns the base name of the resource. > // If the provided name doesn't index an array, the outSubscripts vector will be empty. > // If the provided name indexes an array, the outSubscripts vector will contain indices with >@@ -57,17 +59,33 @@ GLenum LayerIndexToCubeMapTextureTarget(size_t index); > // outSubscripts. > std::string ParseResourceName(const std::string &name, std::vector<unsigned int> *outSubscripts); > >+// Find the child field which matches 'fullName' == var.name + "." + field.name. >+// Return nullptr if not found. >+const sh::ShaderVariable *FindShaderVarField(const sh::ShaderVariable &var, >+ const std::string &fullName); >+ > // Find the range of index values in the provided indices pointer. Primitive restart indices are > // only counted in the range if primitive restart is disabled. >-IndexRange ComputeIndexRange(GLenum indexType, >+IndexRange ComputeIndexRange(DrawElementsType indexType, > const GLvoid *indices, > size_t count, > bool primitiveRestartEnabled); > > // Get the primitive restart index value for the given index type. >-GLuint GetPrimitiveRestartIndex(GLenum indexType); >+GLuint GetPrimitiveRestartIndex(DrawElementsType indexType); >+ >+bool IsTriangleMode(PrimitiveMode drawMode); >+ >+namespace priv >+{ >+extern const angle::PackedEnumMap<PrimitiveMode, bool> gLineModes; >+} // namespace priv >+ >+ANGLE_INLINE bool IsLineMode(PrimitiveMode primitiveMode) >+{ >+ return priv::gLineModes[primitiveMode]; >+} > >-bool IsTriangleMode(GLenum drawMode); > bool IsIntegerFormat(GLenum unsizedFormat); > > // Returns the product of the sizes in the vector, or 1 if the vector is empty. Doesn't currently >@@ -79,44 +97,41 @@ unsigned int ArraySizeProduct(const std::vector<unsigned int> &arraySizes); > // GL_INVALID_INDEX and write the length of the original string. > unsigned int ParseArrayIndex(const std::string &name, size_t *nameLengthWithoutArrayIndexOut); > >+enum class SamplerFormat : uint8_t >+{ >+ Float = 0, >+ Unsigned = 1, >+ Signed = 2, >+ Shadow = 3, >+ >+ InvalidEnum = 4, >+ EnumCount = 4, >+}; >+ > struct UniformTypeInfo final : angle::NonCopyable > { >- constexpr UniformTypeInfo(GLenum type, >- GLenum componentType, >- GLenum samplerTextureType, >- GLenum transposedMatrixType, >- GLenum boolVectorType, >- int rowCount, >- int columnCount, >- int componentCount, >- size_t componentSize, >- size_t internalSize, >- size_t externalSize, >- bool isSampler, >- bool isMatrixType, >- bool isImageType) >- : type(type), >- componentType(componentType), >- samplerTextureType(samplerTextureType), >- transposedMatrixType(transposedMatrixType), >- boolVectorType(boolVectorType), >- rowCount(rowCount), >- columnCount(columnCount), >- componentCount(componentCount), >- componentSize(componentSize), >- internalSize(internalSize), >- externalSize(externalSize), >- isSampler(isSampler), >- isMatrixType(isMatrixType), >- isImageType(isImageType) >- { >- } >+ inline constexpr UniformTypeInfo(GLenum type, >+ GLenum componentType, >+ GLenum textureType, >+ GLenum transposedMatrixType, >+ GLenum boolVectorType, >+ SamplerFormat samplerFormat, >+ int rowCount, >+ int columnCount, >+ int componentCount, >+ size_t componentSize, >+ size_t internalSize, >+ size_t externalSize, >+ bool isSampler, >+ bool isMatrixType, >+ bool isImageType); > > GLenum type; > GLenum componentType; >- GLenum samplerTextureType; >+ GLenum textureType; > GLenum transposedMatrixType; > GLenum boolVectorType; >+ SamplerFormat samplerFormat; > int rowCount; > int columnCount; > int componentCount; >@@ -128,45 +143,83 @@ struct UniformTypeInfo final : angle::NonCopyable > bool isImageType; > }; > >+inline constexpr UniformTypeInfo::UniformTypeInfo(GLenum type, >+ GLenum componentType, >+ GLenum textureType, >+ GLenum transposedMatrixType, >+ GLenum boolVectorType, >+ SamplerFormat samplerFormat, >+ int rowCount, >+ int columnCount, >+ int componentCount, >+ size_t componentSize, >+ size_t internalSize, >+ size_t externalSize, >+ bool isSampler, >+ bool isMatrixType, >+ bool isImageType) >+ : type(type), >+ componentType(componentType), >+ textureType(textureType), >+ transposedMatrixType(transposedMatrixType), >+ boolVectorType(boolVectorType), >+ samplerFormat(samplerFormat), >+ rowCount(rowCount), >+ columnCount(columnCount), >+ componentCount(componentCount), >+ componentSize(componentSize), >+ internalSize(internalSize), >+ externalSize(externalSize), >+ isSampler(isSampler), >+ isMatrixType(isMatrixType), >+ isImageType(isImageType) >+{} >+ > const UniformTypeInfo &GetUniformTypeInfo(GLenum uniformType); > > const char *GetGenericErrorMessage(GLenum error); > > unsigned int ElementTypeSize(GLenum elementType); > >+template <typename T> >+T GetClampedVertexCount(size_t vertexCount) >+{ >+ static constexpr size_t kMax = static_cast<size_t>(std::numeric_limits<T>::max()); >+ return static_cast<T>(vertexCount > kMax ? kMax : vertexCount); >+} > } // namespace gl > > namespace egl > { > static const EGLenum FirstCubeMapTextureTarget = EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR; >-static const EGLenum LastCubeMapTextureTarget = EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR; >+static const EGLenum LastCubeMapTextureTarget = EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR; > bool IsCubeMapTextureTarget(EGLenum target); > size_t CubeMapTextureTargetToLayerIndex(EGLenum target); > EGLenum LayerIndexToCubeMapTextureTarget(size_t index); > bool IsTextureTarget(EGLenum target); > bool IsRenderbufferTarget(EGLenum target); >+bool IsExternalImageTarget(EGLenum target); > > const char *GetGenericErrorMessage(EGLint error); > } // namespace egl > > namespace egl_gl > { >-GLenum EGLCubeMapTargetToGLCubeMapTarget(EGLenum eglTarget); >-GLenum EGLImageTargetToGLTextureTarget(EGLenum eglTarget); > GLuint EGLClientBufferToGLObjectHandle(EGLClientBuffer buffer); > } > > namespace gl_egl > { > EGLenum GLComponentTypeToEGLColorComponentType(GLenum glComponentType); >+EGLClientBuffer GLObjectHandleToEGLClientBuffer(GLuint handle); > } // namespace gl_egl > > #if !defined(ANGLE_ENABLE_WINDOWS_STORE) > std::string getTempPath(); >-void writeFile(const char* path, const void* data, size_t size); >+void writeFile(const char *path, const void *data, size_t size); > #endif > >-#if defined (ANGLE_PLATFORM_WINDOWS) >+#if defined(ANGLE_PLATFORM_WINDOWS) > void ScheduleYield(); > #endif > >diff --git a/Source/ThirdParty/ANGLE/src/common/vector_utils.h b/Source/ThirdParty/ANGLE/src/common/vector_utils.h >index 9f5bee1a4ad..d23a836288c 100644 >--- a/Source/ThirdParty/ANGLE/src/common/vector_utils.h >+++ b/Source/ThirdParty/ANGLE/src/common/vector_utils.h >@@ -367,7 +367,7 @@ Vector<Dimension, Type> &VectorBase<Dimension, Type>::operator+=( > { > mData[i] += other.mData[i]; > } >- return *reinterpret_cast<Vector<Dimension, Type> *>(this); >+ return *static_cast<Vector<Dimension, Type> *>(this); > } > > template <size_t Dimension, typename Type> >@@ -378,7 +378,7 @@ Vector<Dimension, Type> &VectorBase<Dimension, Type>::operator-=( > { > mData[i] -= other.mData[i]; > } >- return *reinterpret_cast<Vector<Dimension, Type> *>(this); >+ return *static_cast<Vector<Dimension, Type> *>(this); > } > > template <size_t Dimension, typename Type> >@@ -389,7 +389,7 @@ Vector<Dimension, Type> &VectorBase<Dimension, Type>::operator*=( > { > mData[i] *= other.mData[i]; > } >- return *reinterpret_cast<Vector<Dimension, Type> *>(this); >+ return *static_cast<Vector<Dimension, Type> *>(this); > } > > template <size_t Dimension, typename Type> >@@ -400,7 +400,7 @@ Vector<Dimension, Type> &VectorBase<Dimension, Type>::operator/=( > { > mData[i] /= other.mData[i]; > } >- return *reinterpret_cast<Vector<Dimension, Type> *>(this); >+ return *static_cast<Vector<Dimension, Type> *>(this); > } > > template <size_t Dimension, typename Type> >@@ -410,7 +410,7 @@ Vector<Dimension, Type> &VectorBase<Dimension, Type>::operator*=(Type other) > { > mData[i] *= other; > } >- return *reinterpret_cast<Vector<Dimension, Type> *>(this); >+ return *static_cast<Vector<Dimension, Type> *>(this); > } > > template <size_t Dimension, typename Type> >@@ -420,7 +420,7 @@ Vector<Dimension, Type> &VectorBase<Dimension, Type>::operator/=(Type other) > { > mData[i] /= other; > } >- return *reinterpret_cast<Vector<Dimension, Type> *>(this); >+ return *static_cast<Vector<Dimension, Type> *>(this); > } > > // Implementation of comparison operators >diff --git a/Source/ThirdParty/ANGLE/src/common/version.h b/Source/ThirdParty/ANGLE/src/common/version.h >index e7ffa7cab34..ff96e599191 100644 >--- a/Source/ThirdParty/ANGLE/src/common/version.h >+++ b/Source/ThirdParty/ANGLE/src/common/version.h >@@ -13,16 +13,15 @@ > #define ANGLE_MINOR_VERSION 1 > > #ifndef ANGLE_REVISION >-#define ANGLE_REVISION 0 >+# define ANGLE_REVISION 0 > #endif > >-#define ANGLE_STRINGIFY(x) #x >+#define ANGLE_STRINGIFY(x) #x > #define ANGLE_MACRO_STRINGIFY(x) ANGLE_STRINGIFY(x) > >-#define ANGLE_VERSION_STRING \ >- ANGLE_MACRO_STRINGIFY(ANGLE_MAJOR_VERSION) "." \ >- ANGLE_MACRO_STRINGIFY(ANGLE_MINOR_VERSION) "." \ >- ANGLE_MACRO_STRINGIFY(ANGLE_REVISION) "." \ >- ANGLE_COMMIT_HASH >+#define ANGLE_VERSION_STRING \ >+ ANGLE_MACRO_STRINGIFY(ANGLE_MAJOR_VERSION) \ >+ "." ANGLE_MACRO_STRINGIFY(ANGLE_MINOR_VERSION) "." ANGLE_MACRO_STRINGIFY( \ >+ ANGLE_REVISION) "." ANGLE_COMMIT_HASH > >-#endif // COMMON_VERSION_H_ >+#endif // COMMON_VERSION_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler.gni b/Source/ThirdParty/ANGLE/src/compiler.gni >new file mode 100644 >index 00000000000..9fced4d7190 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler.gni >@@ -0,0 +1,309 @@ >+# Copyright (c) 2013 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. >+ >+angle_translator_sources = [ >+ "include/EGL/egl.h", >+ "include/EGL/eglext.h", >+ "include/EGL/eglplatform.h", >+ "include/GLES2/gl2.h", >+ "include/GLES2/gl2ext.h", >+ "include/GLES2/gl2platform.h", >+ "include/GLES3/gl3.h", >+ "include/GLES3/gl3platform.h", >+ "include/GLES3/gl31.h", >+ "include/GLES3/gl32.h", >+ "include/GLSLANG/ShaderLang.h", >+ "include/GLSLANG/ShaderVars.h", >+ "include/KHR/khrplatform.h", >+ "include/angle_gl.h", >+ "src/compiler/translator/BaseTypes.h", >+ "src/compiler/translator/BuiltInFunctionEmulator.cpp", >+ "src/compiler/translator/BuiltInFunctionEmulator.h", >+ "src/compiler/translator/CallDAG.cpp", >+ "src/compiler/translator/CallDAG.h", >+ "src/compiler/translator/CodeGen.cpp", >+ "src/compiler/translator/CollectVariables.cpp", >+ "src/compiler/translator/CollectVariables.h", >+ "src/compiler/translator/Common.h", >+ "src/compiler/translator/Compiler.cpp", >+ "src/compiler/translator/Compiler.h", >+ "src/compiler/translator/ConstantUnion.cpp", >+ "src/compiler/translator/ConstantUnion.h", >+ "src/compiler/translator/Declarator.cpp", >+ "src/compiler/translator/Declarator.h", >+ "src/compiler/translator/Diagnostics.cpp", >+ "src/compiler/translator/Diagnostics.h", >+ "src/compiler/translator/DirectiveHandler.cpp", >+ "src/compiler/translator/DirectiveHandler.h", >+ "src/compiler/translator/ExtensionBehavior.cpp", >+ "src/compiler/translator/ExtensionBehavior.h", >+ "src/compiler/translator/FlagStd140Structs.cpp", >+ "src/compiler/translator/FlagStd140Structs.h", >+ "src/compiler/translator/FunctionLookup.cpp", >+ "src/compiler/translator/FunctionLookup.h", >+ "src/compiler/translator/HashNames.cpp", >+ "src/compiler/translator/HashNames.h", >+ "src/compiler/translator/ImmutableString.cpp", >+ "src/compiler/translator/ImmutableString.h", >+ "src/compiler/translator/ImmutableStringBuilder.cpp", >+ "src/compiler/translator/ImmutableStringBuilder.h", >+ "src/compiler/translator/InfoSink.cpp", >+ "src/compiler/translator/InfoSink.h", >+ "src/compiler/translator/Initialize.cpp", >+ "src/compiler/translator/Initialize.h", >+ "src/compiler/translator/InitializeDll.cpp", >+ "src/compiler/translator/InitializeDll.h", >+ "src/compiler/translator/InitializeGlobals.h", >+ "src/compiler/translator/IntermNode.h", >+ "src/compiler/translator/IntermNode.cpp", >+ "src/compiler/translator/IsASTDepthBelowLimit.cpp", >+ "src/compiler/translator/IsASTDepthBelowLimit.h", >+ "src/compiler/translator/Operator.cpp", >+ "src/compiler/translator/Operator.h", >+ "src/compiler/translator/OutputTree.cpp", >+ "src/compiler/translator/OutputTree.h", >+ "src/compiler/translator/ParseContext.cpp", >+ "src/compiler/translator/ParseContext.h", >+ "src/compiler/translator/ParseContext_autogen.h", >+ "src/compiler/translator/PoolAlloc.cpp", >+ "src/compiler/translator/PoolAlloc.h", >+ "src/compiler/translator/Pragma.h", >+ "src/compiler/translator/QualifierTypes.h", >+ "src/compiler/translator/QualifierTypes.cpp", >+ "src/compiler/translator/Severity.h", >+ "src/compiler/translator/ShaderLang.cpp", >+ "src/compiler/translator/ShaderVars.cpp", >+ "src/compiler/translator/StaticType.h", >+ "src/compiler/translator/Symbol.cpp", >+ "src/compiler/translator/Symbol.h", >+ "src/compiler/translator/SymbolTable.cpp", >+ "src/compiler/translator/SymbolTable.h", >+ "src/compiler/translator/SymbolTable_autogen.cpp", >+ "src/compiler/translator/SymbolTable_autogen.h", >+ "src/compiler/translator/SymbolUniqueId.cpp", >+ "src/compiler/translator/SymbolUniqueId.h", >+ "src/compiler/translator/Types.cpp", >+ "src/compiler/translator/Types.h", >+ "src/compiler/translator/ValidateAST.cpp", >+ "src/compiler/translator/ValidateAST.h", >+ "src/compiler/translator/ValidateGlobalInitializer.cpp", >+ "src/compiler/translator/ValidateGlobalInitializer.h", >+ "src/compiler/translator/ValidateLimitations.cpp", >+ "src/compiler/translator/ValidateLimitations.h", >+ "src/compiler/translator/ValidateMaxParameters.h", >+ "src/compiler/translator/ValidateMaxParameters.cpp", >+ "src/compiler/translator/ValidateOutputs.cpp", >+ "src/compiler/translator/ValidateOutputs.h", >+ "src/compiler/translator/ValidateSwitch.cpp", >+ "src/compiler/translator/ValidateSwitch.h", >+ "src/compiler/translator/ValidateVaryingLocations.cpp", >+ "src/compiler/translator/ValidateVaryingLocations.h", >+ "src/compiler/translator/VariablePacker.cpp", >+ "src/compiler/translator/VariablePacker.h", >+ "src/compiler/translator/blocklayout.cpp", >+ "src/compiler/translator/blocklayout.h", >+ "src/compiler/translator/glslang.h", >+ "src/compiler/translator/glslang.l", >+ "src/compiler/translator/glslang.y", >+ "src/compiler/translator/glslang_lex.cpp", >+ "src/compiler/translator/glslang_tab.cpp", >+ "src/compiler/translator/glslang_tab.h", >+ "src/compiler/translator/length_limits.h", >+ "src/compiler/translator/util.cpp", >+ "src/compiler/translator/util.h", >+ "src/compiler/translator/tree_ops/AddAndTrueToLoopCondition.cpp", >+ "src/compiler/translator/tree_ops/AddAndTrueToLoopCondition.h", >+ "src/compiler/translator/tree_ops/BreakVariableAliasingInInnerLoops.cpp", >+ "src/compiler/translator/tree_ops/BreakVariableAliasingInInnerLoops.h", >+ "src/compiler/translator/tree_ops/ClampFragDepth.cpp", >+ "src/compiler/translator/tree_ops/ClampFragDepth.h", >+ "src/compiler/translator/tree_ops/ClampPointSize.cpp", >+ "src/compiler/translator/tree_ops/ClampPointSize.h", >+ "src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.h", >+ "src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp", >+ "src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp", >+ "src/compiler/translator/tree_ops/DeferGlobalInitializers.h", >+ "src/compiler/translator/tree_ops/EmulateGLDrawID.cpp", >+ "src/compiler/translator/tree_ops/EmulateGLDrawID.h", >+ "src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.cpp", >+ "src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.h", >+ "src/compiler/translator/tree_ops/EmulatePrecision.cpp", >+ "src/compiler/translator/tree_ops/EmulatePrecision.h", >+ "src/compiler/translator/tree_ops/ExpandIntegerPowExpressions.cpp", >+ "src/compiler/translator/tree_ops/ExpandIntegerPowExpressions.h", >+ "src/compiler/translator/tree_ops/FoldExpressions.cpp", >+ "src/compiler/translator/tree_ops/FoldExpressions.h", >+ "src/compiler/translator/tree_ops/InitializeVariables.cpp", >+ "src/compiler/translator/tree_ops/InitializeVariables.h", >+ "src/compiler/translator/tree_ops/NameEmbeddedUniformStructs.cpp", >+ "src/compiler/translator/tree_ops/NameEmbeddedUniformStructs.h", >+ "src/compiler/translator/tree_ops/PruneEmptyCases.cpp", >+ "src/compiler/translator/tree_ops/PruneEmptyCases.h", >+ "src/compiler/translator/tree_ops/PruneNoOps.cpp", >+ "src/compiler/translator/tree_ops/PruneNoOps.h", >+ "src/compiler/translator/tree_ops/RecordConstantPrecision.cpp", >+ "src/compiler/translator/tree_ops/RecordConstantPrecision.h", >+ "src/compiler/translator/tree_ops/RegenerateStructNames.cpp", >+ "src/compiler/translator/tree_ops/RegenerateStructNames.h", >+ "src/compiler/translator/tree_ops/RemoveArrayLengthMethod.cpp", >+ "src/compiler/translator/tree_ops/RemoveArrayLengthMethod.h", >+ "src/compiler/translator/tree_ops/RemoveInvariantDeclaration.cpp", >+ "src/compiler/translator/tree_ops/RemoveInvariantDeclaration.h", >+ "src/compiler/translator/tree_ops/RemovePow.cpp", >+ "src/compiler/translator/tree_ops/RemovePow.h", >+ "src/compiler/translator/tree_ops/RemoveUnreferencedVariables.cpp", >+ "src/compiler/translator/tree_ops/RemoveUnreferencedVariables.h", >+ "src/compiler/translator/tree_ops/RewriteAtomicFunctionExpressions.cpp", >+ "src/compiler/translator/tree_ops/RewriteAtomicFunctionExpressions.h", >+ "src/compiler/translator/tree_ops/RewriteDoWhile.cpp", >+ "src/compiler/translator/tree_ops/RewriteDoWhile.h", >+ "src/compiler/translator/tree_ops/RewriteExpressionsWithShaderStorageBlock.cpp", >+ "src/compiler/translator/tree_ops/RewriteExpressionsWithShaderStorageBlock.h", >+ "src/compiler/translator/tree_ops/RewriteStructSamplers.cpp", >+ "src/compiler/translator/tree_ops/RewriteStructSamplers.h", >+ "src/compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.cpp", >+ "src/compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.h", >+ "src/compiler/translator/tree_ops/RewriteTexelFetchOffset.cpp", >+ "src/compiler/translator/tree_ops/RewriteTexelFetchOffset.h", >+ "src/compiler/translator/tree_ops/RewriteUnaryMinusOperatorFloat.cpp", >+ "src/compiler/translator/tree_ops/RewriteUnaryMinusOperatorFloat.h", >+ "src/compiler/translator/tree_ops/RewriteUnaryMinusOperatorInt.cpp", >+ "src/compiler/translator/tree_ops/RewriteUnaryMinusOperatorInt.h", >+ "src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.cpp", >+ "src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.h", >+ "src/compiler/translator/tree_ops/SeparateDeclarations.cpp", >+ "src/compiler/translator/tree_ops/SeparateDeclarations.h", >+ "src/compiler/translator/tree_ops/SimplifyLoopConditions.cpp", >+ "src/compiler/translator/tree_ops/SimplifyLoopConditions.h", >+ "src/compiler/translator/tree_ops/SplitSequenceOperator.cpp", >+ "src/compiler/translator/tree_ops/SplitSequenceOperator.h", >+ "src/compiler/translator/tree_ops/UnfoldShortCircuitAST.cpp", >+ "src/compiler/translator/tree_ops/UnfoldShortCircuitAST.h", >+ "src/compiler/translator/tree_ops/UseInterfaceBlockFields.cpp", >+ "src/compiler/translator/tree_ops/UseInterfaceBlockFields.h", >+ "src/compiler/translator/tree_ops/VectorizeVectorScalarArithmetic.cpp", >+ "src/compiler/translator/tree_ops/VectorizeVectorScalarArithmetic.h", >+ "src/compiler/translator/tree_util/BuiltIn_autogen.h", >+ "src/compiler/translator/tree_util/FindMain.cpp", >+ "src/compiler/translator/tree_util/FindMain.h", >+ "src/compiler/translator/tree_util/FindSymbolNode.cpp", >+ "src/compiler/translator/tree_util/FindSymbolNode.h", >+ "src/compiler/translator/tree_util/IntermNodePatternMatcher.cpp", >+ "src/compiler/translator/tree_util/IntermNodePatternMatcher.h", >+ "src/compiler/translator/tree_util/IntermNode_util.cpp", >+ "src/compiler/translator/tree_util/IntermNode_util.h", >+ "src/compiler/translator/tree_util/IntermTraverse.cpp", >+ "src/compiler/translator/tree_util/IntermTraverse.h", >+ "src/compiler/translator/tree_util/NodeSearch.h", >+ "src/compiler/translator/tree_util/ReplaceVariable.cpp", >+ "src/compiler/translator/tree_util/ReplaceVariable.h", >+ "src/compiler/translator/tree_util/RunAtTheEndOfShader.cpp", >+ "src/compiler/translator/tree_util/RunAtTheEndOfShader.h", >+ "src/compiler/translator/tree_util/Visit.h", >+ "src/third_party/compiler/ArrayBoundsClamper.cpp", >+ "src/third_party/compiler/ArrayBoundsClamper.h", >+] >+angle_translator_essl_sources = [ >+ "src/compiler/translator/OutputESSL.cpp", >+ "src/compiler/translator/OutputESSL.h", >+ "src/compiler/translator/TranslatorESSL.cpp", >+ "src/compiler/translator/TranslatorESSL.h", >+] >+angle_translator_glsl_sources = [ >+ "src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp", >+ "src/compiler/translator/BuiltInFunctionEmulatorGLSL.h", >+ "src/compiler/translator/ExtensionGLSL.cpp", >+ "src/compiler/translator/ExtensionGLSL.h", >+ "src/compiler/translator/OutputGLSL.cpp", >+ "src/compiler/translator/OutputGLSL.h", >+ "src/compiler/translator/OutputGLSLBase.cpp", >+ "src/compiler/translator/OutputGLSLBase.h", >+ "src/compiler/translator/TranslatorGLSL.cpp", >+ "src/compiler/translator/TranslatorGLSL.h", >+ "src/compiler/translator/VersionGLSL.cpp", >+ "src/compiler/translator/VersionGLSL.h", >+] >+angle_translator_hlsl_sources = [ >+ "src/compiler/translator/ASTMetadataHLSL.cpp", >+ "src/compiler/translator/ASTMetadataHLSL.h", >+ "src/compiler/translator/AtomicCounterFunctionHLSL.cpp", >+ "src/compiler/translator/AtomicCounterFunctionHLSL.h", >+ "src/compiler/translator/blocklayoutHLSL.cpp", >+ "src/compiler/translator/blocklayoutHLSL.h", >+ "src/compiler/translator/BuiltInFunctionEmulatorHLSL.cpp", >+ "src/compiler/translator/BuiltInFunctionEmulatorHLSL.h", >+ "src/compiler/translator/OutputHLSL.cpp", >+ "src/compiler/translator/OutputHLSL.h", >+ "src/compiler/translator/ResourcesHLSL.cpp", >+ "src/compiler/translator/ResourcesHLSL.h", >+ "src/compiler/translator/ShaderStorageBlockFunctionHLSL.cpp", >+ "src/compiler/translator/ShaderStorageBlockFunctionHLSL.h", >+ "src/compiler/translator/ShaderStorageBlockOutputHLSL.cpp", >+ "src/compiler/translator/ShaderStorageBlockOutputHLSL.h", >+ "src/compiler/translator/StructureHLSL.cpp", >+ "src/compiler/translator/StructureHLSL.h", >+ "src/compiler/translator/TextureFunctionHLSL.cpp", >+ "src/compiler/translator/TextureFunctionHLSL.h", >+ "src/compiler/translator/ImageFunctionHLSL.cpp", >+ "src/compiler/translator/ImageFunctionHLSL.h", >+ "src/compiler/translator/TranslatorHLSL.cpp", >+ "src/compiler/translator/TranslatorHLSL.h", >+ "src/compiler/translator/UtilsHLSL.cpp", >+ "src/compiler/translator/UtilsHLSL.h", >+ "src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp", >+ "src/compiler/translator/tree_ops/AddDefaultReturnStatements.cpp", >+ "src/compiler/translator/tree_ops/AddDefaultReturnStatements.h", >+ "src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.cpp", >+ "src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.h", >+ "src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp", >+ "src/compiler/translator/tree_ops/RemoveDynamicIndexing.h", >+ "src/compiler/translator/tree_ops/RemoveSwitchFallThrough.cpp", >+ "src/compiler/translator/tree_ops/RemoveSwitchFallThrough.h", >+ "src/compiler/translator/tree_ops/RewriteElseBlocks.cpp", >+ "src/compiler/translator/tree_ops/RewriteElseBlocks.h", >+ "src/compiler/translator/tree_ops/SeparateArrayConstructorStatements.cpp", >+ "src/compiler/translator/tree_ops/SeparateArrayConstructorStatements.h", >+ "src/compiler/translator/tree_ops/SeparateArrayInitialization.cpp", >+ "src/compiler/translator/tree_ops/SeparateArrayInitialization.h", >+ "src/compiler/translator/tree_ops/SeparateExpressionsReturningArrays.cpp", >+ "src/compiler/translator/tree_ops/SeparateExpressionsReturningArrays.h", >+ "src/compiler/translator/tree_ops/UnfoldShortCircuitToIf.cpp", >+ "src/compiler/translator/tree_ops/UnfoldShortCircuitToIf.h", >+ "src/compiler/translator/tree_ops/WrapSwitchStatementsInBlocks.cpp", >+ "src/compiler/translator/tree_ops/WrapSwitchStatementsInBlocks.h", >+] >+angle_translator_lib_vulkan_sources = [ >+ "src/compiler/translator/OutputVulkanGLSL.cpp", >+ "src/compiler/translator/OutputVulkanGLSL.h", >+ "src/compiler/translator/TranslatorVulkan.cpp", >+ "src/compiler/translator/TranslatorVulkan.h", >+] >+angle_preprocessor_sources = [ >+ "src/compiler/preprocessor/DiagnosticsBase.cpp", >+ "src/compiler/preprocessor/DiagnosticsBase.h", >+ "src/compiler/preprocessor/DirectiveHandlerBase.cpp", >+ "src/compiler/preprocessor/DirectiveHandlerBase.h", >+ "src/compiler/preprocessor/DirectiveParser.cpp", >+ "src/compiler/preprocessor/DirectiveParser.h", >+ "src/compiler/preprocessor/ExpressionParser.cpp", >+ "src/compiler/preprocessor/ExpressionParser.h", >+ "src/compiler/preprocessor/ExpressionParser.y", >+ "src/compiler/preprocessor/Input.cpp", >+ "src/compiler/preprocessor/Input.h", >+ "src/compiler/preprocessor/Lexer.cpp", >+ "src/compiler/preprocessor/Lexer.h", >+ "src/compiler/preprocessor/Macro.cpp", >+ "src/compiler/preprocessor/Macro.h", >+ "src/compiler/preprocessor/MacroExpander.cpp", >+ "src/compiler/preprocessor/MacroExpander.h", >+ "src/compiler/preprocessor/Preprocessor.cpp", >+ "src/compiler/preprocessor/Preprocessor.h", >+ "src/compiler/preprocessor/SourceLocation.h", >+ "src/compiler/preprocessor/Token.cpp", >+ "src/compiler/preprocessor/Token.h", >+ "src/compiler/preprocessor/Tokenizer.cpp", >+ "src/compiler/preprocessor/Tokenizer.h", >+ "src/compiler/preprocessor/Tokenizer.l", >+ "src/compiler/preprocessor/numeric_lex.h", >+] >diff --git a/Source/ThirdParty/ANGLE/src/compiler.gypi b/Source/ThirdParty/ANGLE/src/compiler.gypi >deleted file mode 100644 >index e4adfb38871..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler.gypi >+++ /dev/null >@@ -1,393 +0,0 @@ >-# Copyright (c) 2013 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. >- >-{ >- 'variables': >- { >- # These file lists are shared with the GN build. >- 'angle_translator_sources': >- [ >- '../include/EGL/egl.h', >- '../include/EGL/eglext.h', >- '../include/EGL/eglplatform.h', >- '../include/GLES2/gl2.h', >- '../include/GLES2/gl2ext.h', >- '../include/GLES2/gl2platform.h', >- '../include/GLES3/gl3.h', >- '../include/GLES3/gl3platform.h', >- '../include/GLES3/gl31.h', >- '../include/GLES3/gl32.h', >- '../include/GLSLANG/ShaderLang.h', >- '../include/GLSLANG/ShaderVars.h', >- '../include/KHR/khrplatform.h', >- '../include/angle_gl.h', >- 'compiler/translator/AddAndTrueToLoopCondition.cpp', >- 'compiler/translator/AddAndTrueToLoopCondition.h', >- 'compiler/translator/BaseTypes.h', >- 'compiler/translator/BuiltInFunctionEmulator.cpp', >- 'compiler/translator/BuiltInFunctionEmulator.h', >- 'compiler/translator/BreakVariableAliasingInInnerLoops.cpp', >- 'compiler/translator/BreakVariableAliasingInInnerLoops.h', >- 'compiler/translator/Cache.cpp', >- 'compiler/translator/Cache.h', >- 'compiler/translator/CallDAG.cpp', >- 'compiler/translator/CallDAG.h', >- 'compiler/translator/ClampPointSize.cpp', >- 'compiler/translator/ClampPointSize.h', >- 'compiler/translator/CodeGen.cpp', >- 'compiler/translator/CollectVariables.cpp', >- 'compiler/translator/CollectVariables.h', >- 'compiler/translator/Common.h', >- 'compiler/translator/Compiler.cpp', >- 'compiler/translator/Compiler.h', >- 'compiler/translator/ConstantUnion.cpp', >- 'compiler/translator/ConstantUnion.h', >- 'compiler/translator/DeclareAndInitBuiltinsForInstancedMultiview.h', >- 'compiler/translator/DeclareAndInitBuiltinsForInstancedMultiview.cpp', >- 'compiler/translator/DeferGlobalInitializers.cpp', >- 'compiler/translator/DeferGlobalInitializers.h', >- 'compiler/translator/Diagnostics.cpp', >- 'compiler/translator/Diagnostics.h', >- 'compiler/translator/DirectiveHandler.cpp', >- 'compiler/translator/DirectiveHandler.h', >- 'compiler/translator/EmulateGLFragColorBroadcast.cpp', >- 'compiler/translator/EmulateGLFragColorBroadcast.h', >- 'compiler/translator/EmulatePrecision.cpp', >- 'compiler/translator/EmulatePrecision.h', >- 'compiler/translator/ExpandIntegerPowExpressions.cpp', >- 'compiler/translator/ExpandIntegerPowExpressions.h', >- 'compiler/translator/ExtensionBehavior.cpp', >- 'compiler/translator/ExtensionBehavior.h', >- 'compiler/translator/FindMain.cpp', >- 'compiler/translator/FindMain.h', >- 'compiler/translator/FindSymbolNode.cpp', >- 'compiler/translator/FindSymbolNode.h', >- 'compiler/translator/FlagStd140Structs.cpp', >- 'compiler/translator/FlagStd140Structs.h', >- 'compiler/translator/HashNames.cpp', >- 'compiler/translator/HashNames.h', >- 'compiler/translator/InfoSink.cpp', >- 'compiler/translator/InfoSink.h', >- 'compiler/translator/Initialize.cpp', >- 'compiler/translator/Initialize.h', >- 'compiler/translator/InitializeDll.cpp', >- 'compiler/translator/InitializeDll.h', >- 'compiler/translator/InitializeGlobals.h', >- 'compiler/translator/InitializeVariables.cpp', >- 'compiler/translator/InitializeVariables.h', >- 'compiler/translator/IntermNode.h', >- 'compiler/translator/IntermNode.cpp', >- 'compiler/translator/IntermNodePatternMatcher.cpp', >- 'compiler/translator/IntermNodePatternMatcher.h', >- 'compiler/translator/IntermNode_util.cpp', >- 'compiler/translator/IntermNode_util.h', >- 'compiler/translator/IntermTraverse.cpp', >- 'compiler/translator/IntermTraverse.h', >- 'compiler/translator/IsASTDepthBelowLimit.cpp', >- 'compiler/translator/IsASTDepthBelowLimit.h', >- 'compiler/translator/NodeSearch.h', >- 'compiler/translator/Operator.cpp', >- 'compiler/translator/Operator.h', >- 'compiler/translator/OutputTree.cpp', >- 'compiler/translator/OutputTree.h', >- 'compiler/translator/ParamType.h', >- 'compiler/translator/ParseContext.cpp', >- 'compiler/translator/ParseContext.h', >- 'compiler/translator/PoolAlloc.cpp', >- 'compiler/translator/PoolAlloc.h', >- 'compiler/translator/Pragma.h', >- 'compiler/translator/PruneNoOps.cpp', >- 'compiler/translator/PruneNoOps.h', >- 'compiler/translator/QualifierTypes.h', >- 'compiler/translator/QualifierTypes.cpp', >- 'compiler/translator/RecordConstantPrecision.cpp', >- 'compiler/translator/RecordConstantPrecision.h', >- 'compiler/translator/RegenerateStructNames.cpp', >- 'compiler/translator/RegenerateStructNames.h', >- 'compiler/translator/RemoveArrayLengthMethod.cpp', >- 'compiler/translator/RemoveArrayLengthMethod.h', >- 'compiler/translator/RemoveEmptySwitchStatements.cpp', >- 'compiler/translator/RemoveEmptySwitchStatements.h', >- 'compiler/translator/RemoveInvariantDeclaration.cpp', >- 'compiler/translator/RemoveInvariantDeclaration.h', >- 'compiler/translator/RemoveNoOpCasesFromEndOfSwitchStatements.cpp', >- 'compiler/translator/RemoveNoOpCasesFromEndOfSwitchStatements.h', >- 'compiler/translator/RemovePow.cpp', >- 'compiler/translator/RemovePow.h', >- 'compiler/translator/RemoveUnreferencedVariables.cpp', >- 'compiler/translator/RemoveUnreferencedVariables.h', >- 'compiler/translator/RewriteDoWhile.cpp', >- 'compiler/translator/RewriteDoWhile.h', >- 'compiler/translator/RewriteTexelFetchOffset.cpp', >- 'compiler/translator/RewriteTexelFetchOffset.h', >- 'compiler/translator/RewriteUnaryMinusOperatorFloat.cpp', >- 'compiler/translator/RewriteUnaryMinusOperatorFloat.h', >- 'compiler/translator/RewriteUnaryMinusOperatorInt.cpp', >- 'compiler/translator/RewriteUnaryMinusOperatorInt.h', >- 'compiler/translator/RunAtTheEndOfShader.cpp', >- 'compiler/translator/RunAtTheEndOfShader.h', >- 'compiler/translator/ScalarizeVecAndMatConstructorArgs.cpp', >- 'compiler/translator/ScalarizeVecAndMatConstructorArgs.h', >- 'compiler/translator/SearchSymbol.cpp', >- 'compiler/translator/SearchSymbol.h', >- 'compiler/translator/SeparateDeclarations.cpp', >- 'compiler/translator/SeparateDeclarations.h', >- 'compiler/translator/Severity.h', >- 'compiler/translator/ShaderLang.cpp', >- 'compiler/translator/ShaderVars.cpp', >- 'compiler/translator/SimplifyLoopConditions.cpp', >- 'compiler/translator/SimplifyLoopConditions.h', >- 'compiler/translator/SplitSequenceOperator.cpp', >- 'compiler/translator/SplitSequenceOperator.h', >- 'compiler/translator/SymbolTable.cpp', >- 'compiler/translator/SymbolTable.h', >- 'compiler/translator/SymbolUniqueId.cpp', >- 'compiler/translator/SymbolUniqueId.h', >- 'compiler/translator/Types.cpp', >- 'compiler/translator/Types.h', >- 'compiler/translator/UnfoldShortCircuitAST.cpp', >- 'compiler/translator/UnfoldShortCircuitAST.h', >- 'compiler/translator/UseInterfaceBlockFields.cpp', >- 'compiler/translator/UseInterfaceBlockFields.h', >- 'compiler/translator/ValidateGlobalInitializer.cpp', >- 'compiler/translator/ValidateGlobalInitializer.h', >- 'compiler/translator/ValidateLimitations.cpp', >- 'compiler/translator/ValidateLimitations.h', >- 'compiler/translator/ValidateMaxParameters.h', >- 'compiler/translator/ValidateMaxParameters.cpp', >- 'compiler/translator/ValidateOutputs.cpp', >- 'compiler/translator/ValidateOutputs.h', >- 'compiler/translator/ValidateSwitch.cpp', >- 'compiler/translator/ValidateSwitch.h', >- 'compiler/translator/ValidateVaryingLocations.cpp', >- 'compiler/translator/ValidateVaryingLocations.h', >- 'compiler/translator/VariablePacker.cpp', >- 'compiler/translator/VariablePacker.h', >- 'compiler/translator/VectorizeVectorScalarArithmetic.cpp', >- 'compiler/translator/VectorizeVectorScalarArithmetic.h', >- 'compiler/translator/blocklayout.cpp', >- 'compiler/translator/blocklayout.h', >- 'compiler/translator/glslang.h', >- 'compiler/translator/glslang.l', >- 'compiler/translator/glslang.y', >- 'compiler/translator/glslang_lex.cpp', >- 'compiler/translator/glslang_tab.cpp', >- 'compiler/translator/glslang_tab.h', >- 'compiler/translator/length_limits.h', >- 'compiler/translator/util.cpp', >- 'compiler/translator/util.h', >- 'third_party/compiler/ArrayBoundsClamper.cpp', >- 'third_party/compiler/ArrayBoundsClamper.h', >- ], >- 'angle_translator_essl_sources': >- [ >- 'compiler/translator/OutputESSL.cpp', >- 'compiler/translator/OutputESSL.h', >- 'compiler/translator/TranslatorESSL.cpp', >- 'compiler/translator/TranslatorESSL.h', >- ], >- 'angle_translator_glsl_sources': >- [ >- 'compiler/translator/BuiltInFunctionEmulatorGLSL.cpp', >- 'compiler/translator/BuiltInFunctionEmulatorGLSL.h', >- 'compiler/translator/ExtensionGLSL.cpp', >- 'compiler/translator/ExtensionGLSL.h', >- 'compiler/translator/OutputGLSL.cpp', >- 'compiler/translator/OutputGLSL.h', >- 'compiler/translator/OutputGLSLBase.cpp', >- 'compiler/translator/OutputGLSLBase.h', >- 'compiler/translator/TranslatorGLSL.cpp', >- 'compiler/translator/TranslatorGLSL.h', >- 'compiler/translator/VersionGLSL.cpp', >- 'compiler/translator/VersionGLSL.h', >- ], >- 'angle_translator_hlsl_sources': >- [ >- 'compiler/translator/AddDefaultReturnStatements.cpp', >- 'compiler/translator/AddDefaultReturnStatements.h', >- 'compiler/translator/ArrayReturnValueToOutParameter.cpp', >- 'compiler/translator/ArrayReturnValueToOutParameter.h', >- 'compiler/translator/ASTMetadataHLSL.cpp', >- 'compiler/translator/ASTMetadataHLSL.h', >- 'compiler/translator/blocklayoutHLSL.cpp', >- 'compiler/translator/blocklayoutHLSL.h', >- 'compiler/translator/BuiltInFunctionEmulatorHLSL.cpp', >- 'compiler/translator/BuiltInFunctionEmulatorHLSL.h', >- 'compiler/translator/OutputHLSL.cpp', >- 'compiler/translator/OutputHLSL.h', >- 'compiler/translator/RemoveDynamicIndexing.cpp', >- 'compiler/translator/RemoveDynamicIndexing.h', >- 'compiler/translator/RemoveSwitchFallThrough.cpp', >- 'compiler/translator/RemoveSwitchFallThrough.h', >- 'compiler/translator/RewriteElseBlocks.cpp', >- 'compiler/translator/RewriteElseBlocks.h', >- 'compiler/translator/SeparateArrayInitialization.cpp', >- 'compiler/translator/SeparateArrayInitialization.h', >- 'compiler/translator/SeparateExpressionsReturningArrays.cpp', >- 'compiler/translator/SeparateExpressionsReturningArrays.h', >- 'compiler/translator/StructureHLSL.cpp', >- 'compiler/translator/StructureHLSL.h', >- 'compiler/translator/TextureFunctionHLSL.cpp', >- 'compiler/translator/TextureFunctionHLSL.h', >- 'compiler/translator/ImageFunctionHLSL.cpp', >- 'compiler/translator/ImageFunctionHLSL.h', >- 'compiler/translator/TranslatorHLSL.cpp', >- 'compiler/translator/TranslatorHLSL.h', >- 'compiler/translator/UnfoldShortCircuitToIf.cpp', >- 'compiler/translator/UnfoldShortCircuitToIf.h', >- 'compiler/translator/UniformHLSL.cpp', >- 'compiler/translator/UniformHLSL.h', >- 'compiler/translator/UtilsHLSL.cpp', >- 'compiler/translator/UtilsHLSL.h', >- 'compiler/translator/WrapSwitchStatementsInBlocks.cpp', >- 'compiler/translator/WrapSwitchStatementsInBlocks.h', >- 'compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp', >- ], >- 'angle_translator_lib_vulkan_sources': >- [ >- 'compiler/translator/OutputVulkanGLSL.cpp', >- 'compiler/translator/OutputVulkanGLSL.h', >- 'compiler/translator/TranslatorVulkan.cpp', >- 'compiler/translator/TranslatorVulkan.h', >- ], >- 'angle_preprocessor_sources': >- [ >- 'compiler/preprocessor/DiagnosticsBase.cpp', >- 'compiler/preprocessor/DiagnosticsBase.h', >- 'compiler/preprocessor/DirectiveHandlerBase.cpp', >- 'compiler/preprocessor/DirectiveHandlerBase.h', >- 'compiler/preprocessor/DirectiveParser.cpp', >- 'compiler/preprocessor/DirectiveParser.h', >- 'compiler/preprocessor/ExpressionParser.cpp', >- 'compiler/preprocessor/ExpressionParser.h', >- 'compiler/preprocessor/ExpressionParser.y', >- 'compiler/preprocessor/Input.cpp', >- 'compiler/preprocessor/Input.h', >- 'compiler/preprocessor/Lexer.cpp', >- 'compiler/preprocessor/Lexer.h', >- 'compiler/preprocessor/Macro.cpp', >- 'compiler/preprocessor/Macro.h', >- 'compiler/preprocessor/MacroExpander.cpp', >- 'compiler/preprocessor/MacroExpander.h', >- 'compiler/preprocessor/Preprocessor.cpp', >- 'compiler/preprocessor/Preprocessor.h', >- 'compiler/preprocessor/SourceLocation.h', >- 'compiler/preprocessor/Token.cpp', >- 'compiler/preprocessor/Token.h', >- 'compiler/preprocessor/Tokenizer.cpp', >- 'compiler/preprocessor/Tokenizer.h', >- 'compiler/preprocessor/Tokenizer.l', >- 'compiler/preprocessor/numeric_lex.h', >- ], >- }, >- # Everything below this is duplicated in the GN build. If you change >- # anything also change angle/BUILD.gn >- 'targets': >- [ >- { >- 'target_name': 'preprocessor', >- 'type': 'static_library', >- 'dependencies': [ 'angle_common' ], >- 'includes': [ '../gyp/common_defines.gypi', ], >- 'sources': [ '<@(angle_preprocessor_sources)', ], >- }, >- { >- 'target_name': 'translator', >- 'type': 'static_library', >- 'dependencies': [ 'preprocessor', 'angle_common' ], >- 'includes': [ '../gyp/common_defines.gypi', ], >- 'include_dirs': >- [ >- '.', >- '../include', >- ], >- 'sources': >- [ >- '<@(angle_translator_sources)', >- ], >- 'msvs_settings': >- { >- 'VCLibrarianTool': >- { >- 'AdditionalOptions': ['/ignore:4221'] >- }, >- }, >- 'conditions': >- [ >- ['angle_enable_essl==1', >- { >- 'defines': >- [ >- 'ANGLE_ENABLE_ESSL', >- ], >- 'direct_dependent_settings': >- { >- 'defines': >- [ >- 'ANGLE_ENABLE_ESSL', >- ], >- }, >- 'sources': >- [ >- '<@(angle_translator_essl_sources)', >- ], >- }], >- ['angle_enable_glsl==1', >- { >- 'defines': >- [ >- 'ANGLE_ENABLE_GLSL', >- ], >- 'direct_dependent_settings': >- { >- 'defines': >- [ >- 'ANGLE_ENABLE_GLSL', >- ], >- }, >- 'sources': >- [ >- '<@(angle_translator_glsl_sources)', >- ], >- }], >- ['angle_enable_hlsl==1', >- { >- 'defines': >- [ >- 'ANGLE_ENABLE_HLSL', >- ], >- 'direct_dependent_settings': >- { >- 'defines': >- [ >- 'ANGLE_ENABLE_HLSL', >- ], >- }, >- 'sources': >- [ >- '<@(angle_translator_hlsl_sources)', >- ], >- }], >- ['angle_enable_vulkan==1', >- { >- 'defines': >- [ >- 'ANGLE_ENABLE_VULKAN', >- ], >- 'direct_dependent_settings': >- { >- 'defines': >- [ >- 'ANGLE_ENABLE_VULKAN', >- ], >- }, >- 'sources': >- [ >- '<@(angle_translator_lib_vulkan_sources)', >- ], >- }], >- ], >- }, >- ], >-} >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.cpp >index c89bc9fa763..575b151432d 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.cpp >@@ -8,12 +8,13 @@ > > #include "common/debug.h" > >-namespace pp >+namespace angle > { > >-Diagnostics::~Diagnostics() >+namespace pp > { >-} >+ >+Diagnostics::~Diagnostics() {} > > void Diagnostics::report(ID id, const SourceLocation &loc, const std::string &text) > { >@@ -141,3 +142,5 @@ const char *Diagnostics::message(ID id) > } > > } // namespace pp >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.h >index ea376146063..bb90bf08292 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.h >@@ -9,6 +9,9 @@ > > #include <string> > >+namespace angle >+{ >+ > namespace pp > { > >@@ -61,6 +64,7 @@ class Diagnostics > PP_INVALID_LINE_NUMBER, > PP_INVALID_FILE_NUMBER, > PP_INVALID_LINE_DIRECTIVE, >+ PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL1, > PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL3, > PP_UNDEFINED_SHIFT, > PP_TOKENIZER_ERROR, >@@ -69,7 +73,6 @@ class Diagnostics > PP_WARNING_BEGIN, > PP_EOF_IN_DIRECTIVE, > PP_UNRECOGNIZED_PRAGMA, >- PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL1, > PP_WARNING_MACRO_NAME_RESERVED, > PP_WARNING_END > }; >@@ -87,4 +90,6 @@ class Diagnostics > > } // namespace pp > >+} // namespace angle >+ > #endif // COMPILER_PREPROCESSOR_DIAGNOSTICSBASE_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveHandlerBase.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveHandlerBase.cpp >index 049dae9071c..c359ebcfd8c 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveHandlerBase.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveHandlerBase.cpp >@@ -6,11 +6,14 @@ > > #include "compiler/preprocessor/DirectiveHandlerBase.h" > >-namespace pp >+namespace angle > { > >-DirectiveHandler::~DirectiveHandler() >+namespace pp > { >-} >+ >+DirectiveHandler::~DirectiveHandler() {} > > } // namespace pp >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveHandlerBase.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveHandlerBase.h >index 6c81d015f56..858bc1da630 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveHandlerBase.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveHandlerBase.h >@@ -9,6 +9,9 @@ > > #include <string> > >+namespace angle >+{ >+ > namespace pp > { > >@@ -40,4 +43,6 @@ class DirectiveHandler > > } // namespace pp > >+} // namespace angle >+ > #endif // COMPILER_PREPROCESSOR_DIRECTIVEHANDLERBASE_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.cpp >index f6c57639908..e99d843b2d3 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.cpp >@@ -18,6 +18,9 @@ > #include "compiler/preprocessor/Token.h" > #include "compiler/preprocessor/Tokenizer.h" > >+namespace angle >+{ >+ > namespace > { > enum DirectiveType >@@ -134,76 +137,15 @@ bool isMacroPredefined(const std::string &name, const pp::MacroSet ¯oSet) > return iter != macroSet.end() ? iter->second->predefined : false; > } > >-} // namespace anonymous >+} // namespace > > namespace pp > { >- >-class DefinedParser : public Lexer >-{ >- public: >- DefinedParser(Lexer *lexer, const MacroSet *macroSet, Diagnostics *diagnostics) >- : mLexer(lexer), mMacroSet(macroSet), mDiagnostics(diagnostics) >- { >- } >- >- protected: >- void lex(Token *token) override >- { >- const char kDefined[] = "defined"; >- >- mLexer->lex(token); >- if (token->type != Token::IDENTIFIER) >- return; >- if (token->text != kDefined) >- return; >- >- bool paren = false; >- mLexer->lex(token); >- if (token->type == '(') >- { >- paren = true; >- mLexer->lex(token); >- } >- >- if (token->type != Token::IDENTIFIER) >- { >- mDiagnostics->report(Diagnostics::PP_UNEXPECTED_TOKEN, token->location, token->text); >- skipUntilEOD(mLexer, token); >- return; >- } >- MacroSet::const_iterator iter = mMacroSet->find(token->text); >- std::string expression = iter != mMacroSet->end() ? "1" : "0"; >- >- if (paren) >- { >- mLexer->lex(token); >- if (token->type != ')') >- { >- mDiagnostics->report(Diagnostics::PP_UNEXPECTED_TOKEN, token->location, >- token->text); >- skipUntilEOD(mLexer, token); >- return; >- } >- } >- >- // We have a valid defined operator. >- // Convert the current token into a CONST_INT token. >- token->type = Token::CONST_INT; >- token->text = expression; >- } >- >- private: >- Lexer *mLexer; >- const MacroSet *mMacroSet; >- Diagnostics *mDiagnostics; >-}; >- > DirectiveParser::DirectiveParser(Tokenizer *tokenizer, > MacroSet *macroSet, > Diagnostics *diagnostics, > DirectiveHandler *directiveHandler, >- int maxMacroExpansionDepth) >+ const PreprocessorSettings &settings) > : mPastFirstStatement(false), > mSeenNonPreprocessorToken(false), > mTokenizer(tokenizer), >@@ -211,13 +153,10 @@ DirectiveParser::DirectiveParser(Tokenizer *tokenizer, > mDiagnostics(diagnostics), > mDirectiveHandler(directiveHandler), > mShaderVersion(100), >- mMaxMacroExpansionDepth(maxMacroExpansionDepth) >-{ >-} >+ mSettings(settings) >+{} > >-DirectiveParser::~DirectiveParser() >-{ >-} >+DirectiveParser::~DirectiveParser() {} > > void DirectiveParser::lex(Token *token) > { >@@ -840,7 +779,7 @@ void DirectiveParser::parseLine(Token *token) > bool parsedFileNumber = false; > int line = 0, file = 0; > >- MacroExpander macroExpander(mTokenizer, mMacroSet, mDiagnostics, mMaxMacroExpansionDepth); >+ MacroExpander macroExpander(mTokenizer, mMacroSet, mDiagnostics, mSettings, false); > > // Lex the first token after "#line" so we can check it for EOD. > macroExpander.lex(token); >@@ -948,8 +887,7 @@ int DirectiveParser::parseExpressionIf(Token *token) > { > ASSERT((getDirective(token) == DIRECTIVE_IF) || (getDirective(token) == DIRECTIVE_ELIF)); > >- DefinedParser definedParser(mTokenizer, mMacroSet, mDiagnostics); >- MacroExpander macroExpander(&definedParser, mMacroSet, mDiagnostics, mMaxMacroExpansionDepth); >+ MacroExpander macroExpander(mTokenizer, mMacroSet, mDiagnostics, mSettings, true); > ExpressionParser expressionParser(¯oExpander, mDiagnostics); > > int expression = 0; >@@ -998,3 +936,5 @@ int DirectiveParser::parseExpressionIfdef(Token *token) > } > > } // namespace pp >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.h >index 29c30a8239f..eb8a2ee9a2e 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.h >@@ -9,8 +9,12 @@ > > #include "compiler/preprocessor/Lexer.h" > #include "compiler/preprocessor/Macro.h" >+#include "compiler/preprocessor/Preprocessor.h" > #include "compiler/preprocessor/SourceLocation.h" > >+namespace angle >+{ >+ > namespace pp > { > >@@ -25,7 +29,7 @@ class DirectiveParser : public Lexer > MacroSet *macroSet, > Diagnostics *diagnostics, > DirectiveHandler *directiveHandler, >- int maxMacroExpansionDepth); >+ const PreprocessorSettings &settings); > ~DirectiveParser() override; > > void lex(Token *token) override; >@@ -62,8 +66,7 @@ class DirectiveParser : public Lexer > > ConditionalBlock() > : skipBlock(false), skipGroup(false), foundValidGroup(false), foundElseGroup(false) >- { >- } >+ {} > }; > bool mPastFirstStatement; > bool mSeenNonPreprocessorToken; // Tracks if a non-preprocessor token has been seen yet. Some >@@ -75,9 +78,11 @@ class DirectiveParser : public Lexer > Diagnostics *mDiagnostics; > DirectiveHandler *mDirectiveHandler; > int mShaderVersion; >- int mMaxMacroExpansionDepth; >+ const PreprocessorSettings mSettings; > }; > > } // namespace pp > >+} // namespace angle >+ > #endif // COMPILER_PREPROCESSOR_DIRECTIVEPARSER_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.cpp >index c0f8b9c97df..461c2145ddb 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.cpp >@@ -1,7 +1,5 @@ > /* A Bison parser, made by GNU Bison 3.0.4. */ > >-/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */ >- > /* Bison implementation for Yacc-like parsers in C > > Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. >@@ -60,18 +58,15 @@ > /* Pull parsers. */ > #define YYPULL 1 > >- > /* Substitute the variable and function names. */ >-#define yyparse ppparse >-#define yylex pplex >-#define yyerror pperror >-#define yydebug ppdebug >-#define yynerrs ppnerrs >- >+#define yyparse ppparse >+#define yylex pplex >+#define yyerror pperror >+#define yydebug ppdebug >+#define yynerrs ppnerrs > > /* Copy the first part of user declarations. */ > >- > // > // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. > // Use of this source code is governed by a BSD-style license that can be >@@ -82,26 +77,26 @@ > > #if defined(__GNUC__) > // Triggered by the auto-generated pplval variable. >-#if !defined(__clang__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) >-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" >-#else >-#pragma GCC diagnostic ignored "-Wuninitialized" >-#endif >+# if !defined(__clang__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) >+# pragma GCC diagnostic ignored "-Wmaybe-uninitialized" >+# else >+# pragma GCC diagnostic ignored "-Wuninitialized" >+# endif > #elif defined(_MSC_VER) >-#pragma warning(disable: 4065 4244 4701 4702) >+# pragma warning(disable : 4065 4244 4701 4702) > #endif > > #include "ExpressionParser.h" > > #if defined(_MSC_VER) >-#include <malloc.h> >+# include <malloc.h> > #else >-#include <stdlib.h> >+# include <stdlib.h> > #endif > >+#include <stdint.h> > #include <cassert> > #include <sstream> >-#include <stdint.h> > > #include "DiagnosticsBase.h" > #include "Lexer.h" >@@ -116,16 +111,17 @@ typedef uint32_t UNSIGNED_TYPE; > #define YYSTYPE_IS_TRIVIAL 1 > #define YYSTYPE_IS_DECLARED 1 > >-namespace { >+namespace >+{ > struct Context > { >- pp::Diagnostics* diagnostics; >- pp::Lexer* lexer; >- pp::Token* token; >- int* result; >+ angle::pp::Diagnostics *diagnostics; >+ angle::pp::Lexer *lexer; >+ angle::pp::Token *token; >+ int *result; > bool parsePresetToken; > >- pp::ExpressionParser::ErrorSettings errorSettings; >+ angle::pp::ExpressionParser::ErrorSettings errorSettings; > bool *valid; > > void startIgnoreErrors() { ++ignoreErrors; } >@@ -137,32 +133,28 @@ struct Context > }; > } // namespace > >+static int yylex(YYSTYPE *lvalp, Context *context); >+static void yyerror(Context *context, const char *reason); > >-static int yylex(YYSTYPE* lvalp, Context* context); >-static void yyerror(Context* context, const char* reason); >- >- >- >-# ifndef YY_NULLPTR >-# if defined __cplusplus && 201103L <= __cplusplus >-# define YY_NULLPTR nullptr >-# else >-# define YY_NULLPTR 0 >-# endif >-# endif >+#ifndef YY_NULLPTR >+# if defined __cplusplus && 201103L <= __cplusplus >+# define YY_NULLPTR nullptr >+# else >+# define YY_NULLPTR 0 >+# endif >+#endif > > /* Enabling verbose error messages. */ > #ifdef YYERROR_VERBOSE >-# undef YYERROR_VERBOSE >-# define YYERROR_VERBOSE 1 >+# undef YYERROR_VERBOSE >+# define YYERROR_VERBOSE 1 > #else >-# define YYERROR_VERBOSE 0 >+# define YYERROR_VERBOSE 0 > #endif > >- > /* Debug traces. */ > #ifndef YYDEBUG >-# define YYDEBUG 0 >+# define YYDEBUG 0 > #endif > #if YYDEBUG > extern int ppdebug; >@@ -170,42 +162,36 @@ extern int ppdebug; > > /* Token type. */ > #ifndef YYTOKENTYPE >-# define YYTOKENTYPE >- enum yytokentype >- { >- TOK_CONST_INT = 258, >+# define YYTOKENTYPE >+enum yytokentype >+{ >+ TOK_CONST_INT = 258, > TOK_IDENTIFIER = 259, >- TOK_OP_OR = 260, >- TOK_OP_AND = 261, >- TOK_OP_EQ = 262, >- TOK_OP_NE = 263, >- TOK_OP_LE = 264, >- TOK_OP_GE = 265, >- TOK_OP_LEFT = 266, >- TOK_OP_RIGHT = 267, >- TOK_UNARY = 268 >- }; >+ TOK_OP_OR = 260, >+ TOK_OP_AND = 261, >+ TOK_OP_EQ = 262, >+ TOK_OP_NE = 263, >+ TOK_OP_LE = 264, >+ TOK_OP_GE = 265, >+ TOK_OP_LEFT = 266, >+ TOK_OP_RIGHT = 267, >+ TOK_UNARY = 268 >+}; > #endif > > /* Value type. */ >-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED >+#if !defined YYSTYPE && !defined YYSTYPE_IS_DECLARED > typedef int YYSTYPE; >-# define YYSTYPE_IS_TRIVIAL 1 >-# define YYSTYPE_IS_DECLARED 1 >+# define YYSTYPE_IS_TRIVIAL 1 >+# define YYSTYPE_IS_DECLARED 1 > #endif > >- >- >-int ppparse (Context *context); >- >- >+int ppparse(Context *context); > > /* Copy the second part of user declarations. */ > >- >- > #ifdef short >-# undef short >+# undef short > #endif > > #ifdef YYTYPE_UINT8 >@@ -233,271 +219,242 @@ typedef short int yytype_int16; > #endif > > #ifndef YYSIZE_T >-# ifdef __SIZE_TYPE__ >-# define YYSIZE_T __SIZE_TYPE__ >-# elif defined size_t >-# define YYSIZE_T size_t >-# elif ! defined YYSIZE_T >-# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ >-# define YYSIZE_T size_t >-# else >-# define YYSIZE_T unsigned int >-# endif >+# ifdef __SIZE_TYPE__ >+# define YYSIZE_T __SIZE_TYPE__ >+# elif defined size_t >+# define YYSIZE_T size_t >+# elif !defined YYSIZE_T >+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ >+# define YYSIZE_T size_t >+# else >+# define YYSIZE_T unsigned int >+# endif > #endif > >-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) >+#define YYSIZE_MAXIMUM ((YYSIZE_T)-1) > > #ifndef YY_ >-# if defined YYENABLE_NLS && YYENABLE_NLS >-# if ENABLE_NLS >-# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ >-# define YY_(Msgid) dgettext ("bison-runtime", Msgid) >-# endif >-# endif >-# ifndef YY_ >-# define YY_(Msgid) Msgid >-# endif >+# if defined YYENABLE_NLS && YYENABLE_NLS >+# if ENABLE_NLS >+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ >+# define YY_(Msgid) dgettext("bison-runtime", Msgid) >+# endif >+# endif >+# ifndef YY_ >+# define YY_(Msgid) Msgid >+# endif > #endif > > #ifndef YY_ATTRIBUTE >-# if (defined __GNUC__ \ >- && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ >- || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C >-# define YY_ATTRIBUTE(Spec) __attribute__(Spec) >-# else >-# define YY_ATTRIBUTE(Spec) /* empty */ >-# endif >+# if (defined __GNUC__ && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) || \ >+ defined __SUNPRO_C && 0x5110 <= __SUNPRO_C >+# define YY_ATTRIBUTE(Spec) __attribute__(Spec) >+# else >+# define YY_ATTRIBUTE(Spec) /* empty */ >+# endif > #endif > > #ifndef YY_ATTRIBUTE_PURE >-# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) >+# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE((__pure__)) > #endif > > #ifndef YY_ATTRIBUTE_UNUSED >-# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) >+# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE((__unused__)) > #endif > >-#if !defined _Noreturn \ >- && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) >-# if defined _MSC_VER && 1200 <= _MSC_VER >-# define _Noreturn __declspec (noreturn) >-# else >-# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) >-# endif >+#if !defined _Noreturn && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) >+# if defined _MSC_VER && 1200 <= _MSC_VER >+# define _Noreturn __declspec(noreturn) >+# else >+# define _Noreturn YY_ATTRIBUTE((__noreturn__)) >+# endif > #endif > > /* Suppress unused-variable warnings by "using" E. */ >-#if ! defined lint || defined __GNUC__ >-# define YYUSE(E) ((void) (E)) >+#if !defined lint || defined __GNUC__ >+# define YYUSE(E) ((void)(E)) > #else >-# define YYUSE(E) /* empty */ >+# define YYUSE(E) /* empty */ > #endif > > #if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ > /* Suppress an incorrect diagnostic about yylval being uninitialized. */ >-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ >- _Pragma ("GCC diagnostic push") \ >- _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ >- _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") >-# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ >- _Pragma ("GCC diagnostic pop") >+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ >+ _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic ignored \"-Wuninitialized\"") \ >+ _Pragma("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") >+# define YY_IGNORE_MAYBE_UNINITIALIZED_END _Pragma("GCC diagnostic pop") > #else >-# define YY_INITIAL_VALUE(Value) Value >+# define YY_INITIAL_VALUE(Value) Value > #endif > #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN >-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN >-# define YY_IGNORE_MAYBE_UNINITIALIZED_END >+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN >+# define YY_IGNORE_MAYBE_UNINITIALIZED_END > #endif > #ifndef YY_INITIAL_VALUE >-# define YY_INITIAL_VALUE(Value) /* Nothing. */ >+# define YY_INITIAL_VALUE(Value) /* Nothing. */ > #endif > >- >-#if ! defined yyoverflow || YYERROR_VERBOSE >+#if !defined yyoverflow || YYERROR_VERBOSE > > /* The parser invokes alloca or malloc; define the necessary symbols. */ > >-# ifdef YYSTACK_USE_ALLOCA >-# if YYSTACK_USE_ALLOCA >-# ifdef __GNUC__ >-# define YYSTACK_ALLOC __builtin_alloca >-# elif defined __BUILTIN_VA_ARG_INCR >-# include <alloca.h> /* INFRINGES ON USER NAME SPACE */ >-# elif defined _AIX >-# define YYSTACK_ALLOC __alloca >-# elif defined _MSC_VER >-# include <malloc.h> /* INFRINGES ON USER NAME SPACE */ >-# define alloca _alloca >-# else >-# define YYSTACK_ALLOC alloca >-# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS >-# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ >- /* Use EXIT_SUCCESS as a witness for stdlib.h. */ >-# ifndef EXIT_SUCCESS >-# define EXIT_SUCCESS 0 >-# endif >+# ifdef YYSTACK_USE_ALLOCA >+# if YYSTACK_USE_ALLOCA >+# ifdef __GNUC__ >+# define YYSTACK_ALLOC __builtin_alloca >+# elif defined __BUILTIN_VA_ARG_INCR >+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */ >+# elif defined _AIX >+# define YYSTACK_ALLOC __alloca >+# elif defined _MSC_VER >+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */ >+# define alloca _alloca >+# else >+# define YYSTACK_ALLOC alloca >+# if !defined _ALLOCA_H && !defined EXIT_SUCCESS >+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ >+/* Use EXIT_SUCCESS as a witness for stdlib.h. */ >+# ifndef EXIT_SUCCESS >+# define EXIT_SUCCESS 0 >+# endif >+# endif >+# endif >+# endif > # endif >-# endif >-# endif >-# endif >- >-# ifdef YYSTACK_ALLOC >- /* Pacify GCC's 'empty if-body' warning. */ >-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) >-# ifndef YYSTACK_ALLOC_MAXIMUM >- /* The OS might guarantee only one guard page at the bottom of the stack, >- and a page size can be as small as 4096 bytes. So we cannot safely >- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number >- to allow for a few compiler-allocated temporary stack slots. */ >-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ >-# endif >-# else >-# define YYSTACK_ALLOC YYMALLOC >-# define YYSTACK_FREE YYFREE >-# ifndef YYSTACK_ALLOC_MAXIMUM >-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM >-# endif >-# if (defined __cplusplus && ! defined EXIT_SUCCESS \ >- && ! ((defined YYMALLOC || defined malloc) \ >- && (defined YYFREE || defined free))) >-# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ >-# ifndef EXIT_SUCCESS >-# define EXIT_SUCCESS 0 >-# endif >-# endif >-# ifndef YYMALLOC >-# define YYMALLOC malloc >-# if ! defined malloc && ! defined EXIT_SUCCESS >-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ >-# endif >-# endif >-# ifndef YYFREE >-# define YYFREE free >-# if ! defined free && ! defined EXIT_SUCCESS >-void free (void *); /* INFRINGES ON USER NAME SPACE */ >-# endif >-# endif >-# endif >-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ > >+# ifdef YYSTACK_ALLOC >+/* Pacify GCC's 'empty if-body' warning. */ >+# define YYSTACK_FREE(Ptr) \ >+ do \ >+ { /* empty */ \ >+ ; \ >+ } while (0) >+# ifndef YYSTACK_ALLOC_MAXIMUM >+/* The OS might guarantee only one guard page at the bottom of the stack, >+ and a page size can be as small as 4096 bytes. So we cannot safely >+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number >+ to allow for a few compiler-allocated temporary stack slots. */ >+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ >+# endif >+# else >+# define YYSTACK_ALLOC YYMALLOC >+# define YYSTACK_FREE YYFREE >+# ifndef YYSTACK_ALLOC_MAXIMUM >+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM >+# endif >+# if (defined __cplusplus && !defined EXIT_SUCCESS && \ >+ !((defined YYMALLOC || defined malloc) && (defined YYFREE || defined free))) >+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ >+# ifndef EXIT_SUCCESS >+# define EXIT_SUCCESS 0 >+# endif >+# endif >+# ifndef YYMALLOC >+# define YYMALLOC malloc >+# if !defined malloc && !defined EXIT_SUCCESS >+void *malloc(YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ >+# endif >+# endif >+# ifndef YYFREE >+# define YYFREE free >+# if !defined free && !defined EXIT_SUCCESS >+void free(void *); /* INFRINGES ON USER NAME SPACE */ >+# endif >+# endif >+# endif >+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ > >-#if (! defined yyoverflow \ >- && (! defined __cplusplus \ >- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) >+#if (!defined yyoverflow && \ >+ (!defined __cplusplus || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) > > /* A type that is properly aligned for any stack member. */ > union yyalloc > { >- yytype_int16 yyss_alloc; >- YYSTYPE yyvs_alloc; >+ yytype_int16 yyss_alloc; >+ YYSTYPE yyvs_alloc; > }; > > /* The size of the maximum gap between one aligned stack and the next. */ >-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) >+# define YYSTACK_GAP_MAXIMUM (sizeof(union yyalloc) - 1) > > /* The size of an array large to enough to hold all stacks, each with > N elements. */ >-# define YYSTACK_BYTES(N) \ >- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ >- + YYSTACK_GAP_MAXIMUM) >+# define YYSTACK_BYTES(N) ((N) * (sizeof(yytype_int16) + sizeof(YYSTYPE)) + YYSTACK_GAP_MAXIMUM) > >-# define YYCOPY_NEEDED 1 >+# define YYCOPY_NEEDED 1 > > /* Relocate STACK from its old location to the new one. The > local variables YYSIZE and YYSTACKSIZE give the old and new number of > elements in the stack, and YYPTR gives the new location of the > stack. Advance YYPTR to a properly aligned location for the next > stack. */ >-# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ >- do \ >- { \ >- YYSIZE_T yynewbytes; \ >- YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ >- Stack = &yyptr->Stack_alloc; \ >- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ >- yyptr += yynewbytes / sizeof (*yyptr); \ >- } \ >- while (0) >+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ >+ do \ >+ { \ >+ YYSIZE_T yynewbytes; \ >+ YYCOPY(&yyptr->Stack_alloc, Stack, yysize); \ >+ Stack = &yyptr->Stack_alloc; \ >+ yynewbytes = yystacksize * sizeof(*Stack) + YYSTACK_GAP_MAXIMUM; \ >+ yyptr += yynewbytes / sizeof(*yyptr); \ >+ } while (0) > > #endif > > #if defined YYCOPY_NEEDED && YYCOPY_NEEDED > /* Copy COUNT objects from SRC to DST. The source and destination do > not overlap. */ >-# ifndef YYCOPY >-# if defined __GNUC__ && 1 < __GNUC__ >-# define YYCOPY(Dst, Src, Count) \ >- __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) >-# else >-# define YYCOPY(Dst, Src, Count) \ >- do \ >- { \ >- YYSIZE_T yyi; \ >- for (yyi = 0; yyi < (Count); yyi++) \ >- (Dst)[yyi] = (Src)[yyi]; \ >- } \ >- while (0) >-# endif >-# endif >+# ifndef YYCOPY >+# if defined __GNUC__ && 1 < __GNUC__ >+# define YYCOPY(Dst, Src, Count) __builtin_memcpy(Dst, Src, (Count) * sizeof(*(Src))) >+# else >+# define YYCOPY(Dst, Src, Count) \ >+ do \ >+ { \ >+ YYSIZE_T yyi; \ >+ for (yyi = 0; yyi < (Count); yyi++) \ >+ (Dst)[yyi] = (Src)[yyi]; \ >+ } while (0) >+# endif >+# endif > #endif /* !YYCOPY_NEEDED */ > > /* YYFINAL -- State number of the termination state. */ >-#define YYFINAL 15 >+#define YYFINAL 15 > /* YYLAST -- Last index in YYTABLE. */ >-#define YYLAST 176 >+#define YYLAST 176 > > /* YYNTOKENS -- Number of terminals. */ >-#define YYNTOKENS 28 >+#define YYNTOKENS 28 > /* YYNNTS -- Number of nonterminals. */ >-#define YYNNTS 5 >+#define YYNNTS 5 > /* YYNRULES -- Number of rules. */ >-#define YYNRULES 29 >+#define YYNRULES 29 > /* YYNSTATES -- Number of states. */ >-#define YYNSTATES 55 >+#define YYNSTATES 55 > > /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned > by yylex, with out-of-bounds checking. */ >-#define YYUNDEFTOK 2 >-#define YYMAXUTOK 268 >+#define YYUNDEFTOK 2 >+#define YYMAXUTOK 268 > >-#define YYTRANSLATE(YYX) \ >- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) >+#define YYTRANSLATE(YYX) ((unsigned int)(YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) > > /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM > as returned by yylex, without out-of-bounds checking. */ >-static const yytype_uint8 yytranslate[] = >-{ >- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 24, 2, 2, 2, 22, 9, 2, >- 26, 27, 20, 18, 2, 19, 2, 21, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 12, 2, 13, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 7, 2, 25, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, >- 5, 6, 10, 11, 14, 15, 16, 17, 23 >-}; >+static const yytype_uint8 yytranslate[] = { >+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >+ 2, 2, 2, 2, 2, 2, 24, 2, 2, 2, 22, 9, 2, 26, 27, 20, 18, 2, 19, 2, 21, 2, 2, 2, 2, 2, 2, >+ 2, 2, 2, 2, 2, 2, 12, 2, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 25, 2, 2, 2, 2, 2, 2, 2, 2, >+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, >+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 10, 11, 14, 15, 16, 17, 23}; > > #if YYDEBUG >- /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ >+/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ > static const yytype_uint16 yyrline[] = {0, 108, 108, 115, 116, 127, 127, 148, 148, 169, > 172, 175, 178, 181, 184, 187, 190, 193, 196, 221, > 243, 246, 249, 275, 302, 305, 308, 311, 323, 326}; >@@ -506,249 +463,188 @@ static const yytype_uint16 yyrline[] = {0, 108, 108, 115, 116, 127, 127, 148, > #if YYDEBUG || YYERROR_VERBOSE || 0 > /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. > First, the terminals, then, starting at YYNTOKENS, nonterminals. */ >-static const char *const yytname[] = >-{ >- "$end", "error", "$undefined", "TOK_CONST_INT", "TOK_IDENTIFIER", >- "TOK_OP_OR", "TOK_OP_AND", "'|'", "'^'", "'&'", "TOK_OP_EQ", "TOK_OP_NE", >- "'<'", "'>'", "TOK_OP_LE", "TOK_OP_GE", "TOK_OP_LEFT", "TOK_OP_RIGHT", >- "'+'", "'-'", "'*'", "'/'", "'%'", "TOK_UNARY", "'!'", "'~'", "'('", >- "')'", "$accept", "input", "expression", "$@1", "$@2", YY_NULLPTR >-}; >+static const char *const yytname[] = { >+ "$end", "error", "$undefined", "TOK_CONST_INT", "TOK_IDENTIFIER", >+ "TOK_OP_OR", "TOK_OP_AND", "'|'", "'^'", "'&'", >+ "TOK_OP_EQ", "TOK_OP_NE", "'<'", "'>'", "TOK_OP_LE", >+ "TOK_OP_GE", "TOK_OP_LEFT", "TOK_OP_RIGHT", "'+'", "'-'", >+ "'*'", "'/'", "'%'", "TOK_UNARY", "'!'", >+ "'~'", "'('", "')'", "$accept", "input", >+ "expression", "$@1", "$@2", YY_NULLPTR}; > #endif > >-# ifdef YYPRINT >+#ifdef YYPRINT > /* YYTOKNUM[NUM] -- (External) token number corresponding to the > (internal) symbol number NUM (which must be that of a token). */ >-static const yytype_uint16 yytoknum[] = >-{ >- 0, 256, 257, 258, 259, 260, 261, 124, 94, 38, >- 262, 263, 60, 62, 264, 265, 266, 267, 43, 45, >- 42, 47, 37, 268, 33, 126, 40, 41 >-}; >-# endif >+static const yytype_uint16 yytoknum[] = {0, 256, 257, 258, 259, 260, 261, 124, 94, 38, >+ 262, 263, 60, 62, 264, 265, 266, 267, 43, 45, >+ 42, 47, 37, 268, 33, 126, 40, 41}; >+#endif > > #define YYPACT_NINF -12 > >-#define yypact_value_is_default(Yystate) \ >- (!!((Yystate) == (-12))) >+#define yypact_value_is_default(Yystate) (!!((Yystate) == (-12))) > > #define YYTABLE_NINF -1 > >-#define yytable_value_is_error(Yytable_value) \ >- 0 >- >- /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing >- STATE-NUM. */ >-static const yytype_int16 yypact[] = >-{ >- 31, -12, -12, 31, 31, 31, 31, 31, 51, 76, >- -12, -12, -12, -12, 53, -12, -12, -12, 31, 31, >- 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, >- 31, 31, 31, 31, -12, 31, 31, 124, 138, 26, >- 149, 149, -11, -11, -11, -11, 154, 154, -8, -8, >- -12, -12, -12, 93, 109 >-}; >- >- /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. >- Performed when YYTABLE does not specify something else to do. Zero >- means the default is an error. */ >-static const yytype_uint8 yydefact[] = >-{ >- 0, 3, 4, 0, 0, 0, 0, 0, 0, 2, >- 28, 27, 25, 26, 0, 1, 5, 7, 0, 0, >- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 0, 29, 0, 0, 9, 10, 11, >- 13, 12, 17, 16, 15, 14, 19, 18, 21, 20, >- 24, 23, 22, 6, 8 >-}; >- >- /* YYPGOTO[NTERM-NUM]. */ >-static const yytype_int8 yypgoto[] = >-{ >- -12, -12, -3, -12, -12 >-}; >- >- /* YYDEFGOTO[NTERM-NUM]. */ >-static const yytype_int8 yydefgoto[] = >-{ >- -1, 8, 9, 35, 36 >-}; >- >- /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If >- positive, shift that token. If negative, reduce the rule whose >- number is the opposite. If YYTABLE_NINF, syntax error. */ >-static const yytype_uint8 yytable[] = >-{ >- 10, 11, 12, 13, 14, 27, 28, 29, 30, 31, >- 32, 33, 31, 32, 33, 37, 38, 39, 40, 41, >- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, >- 52, 0, 53, 54, 1, 2, 21, 22, 23, 24, >- 25, 26, 27, 28, 29, 30, 31, 32, 33, 3, >- 4, 15, 0, 0, 0, 5, 6, 7, 16, 17, >- 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, >- 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, >- 34, 16, 17, 18, 19, 20, 21, 22, 23, 24, >- 25, 26, 27, 28, 29, 30, 31, 32, 33, 17, >- 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, >- 28, 29, 30, 31, 32, 33, 18, 19, 20, 21, >- 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, >- 32, 33, 19, 20, 21, 22, 23, 24, 25, 26, >- 27, 28, 29, 30, 31, 32, 33, 20, 21, 22, >- 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, >- 33, 23, 24, 25, 26, 27, 28, 29, 30, 31, >- 32, 33, 29, 30, 31, 32, 33 >-}; >- >-static const yytype_int8 yycheck[] = >-{ >- 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, >- 21, 22, 20, 21, 22, 18, 19, 20, 21, 22, >- 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, >- 33, -1, 35, 36, 3, 4, 10, 11, 12, 13, >- 14, 15, 16, 17, 18, 19, 20, 21, 22, 18, >- 19, 0, -1, -1, -1, 24, 25, 26, 5, 6, >- 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, >- 17, 18, 19, 20, 21, 22, -1, -1, -1, -1, >- 27, 5, 6, 7, 8, 9, 10, 11, 12, 13, >- 14, 15, 16, 17, 18, 19, 20, 21, 22, 6, >- 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, >- 17, 18, 19, 20, 21, 22, 7, 8, 9, 10, >- 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, >- 21, 22, 8, 9, 10, 11, 12, 13, 14, 15, >- 16, 17, 18, 19, 20, 21, 22, 9, 10, 11, >- 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, >- 22, 12, 13, 14, 15, 16, 17, 18, 19, 20, >- 21, 22, 18, 19, 20, 21, 22 >-}; >- >- /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing >- symbol of state STATE-NUM. */ >-static const yytype_uint8 yystos[] = >-{ >- 0, 3, 4, 18, 19, 24, 25, 26, 29, 30, >- 30, 30, 30, 30, 30, 0, 5, 6, 7, 8, >- 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, >- 19, 20, 21, 22, 27, 31, 32, 30, 30, 30, >- 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, >- 30, 30, 30, 30, 30 >-}; >- >- /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ >-static const yytype_uint8 yyr1[] = >-{ >- 0, 28, 29, 30, 30, 31, 30, 32, 30, 30, >- 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, >- 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 >-}; >- >- /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ >-static const yytype_uint8 yyr2[] = >-{ >- 0, 2, 1, 1, 1, 0, 4, 0, 4, 3, >- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, >- 3, 3, 3, 3, 3, 2, 2, 2, 2, 3 >-}; >- >- >-#define yyerrok (yyerrstatus = 0) >-#define yyclearin (yychar = YYEMPTY) >-#define YYEMPTY (-2) >-#define YYEOF 0 >- >-#define YYACCEPT goto yyacceptlab >-#define YYABORT goto yyabortlab >-#define YYERROR goto yyerrorlab >- >- >-#define YYRECOVERING() (!!yyerrstatus) >- >-#define YYBACKUP(Token, Value) \ >-do \ >- if (yychar == YYEMPTY) \ >- { \ >- yychar = (Token); \ >- yylval = (Value); \ >- YYPOPSTACK (yylen); \ >- yystate = *yyssp; \ >- goto yybackup; \ >- } \ >- else \ >- { \ >- yyerror (context, YY_("syntax error: cannot back up")); \ >- YYERROR; \ >- } \ >-while (0) >+#define yytable_value_is_error(Yytable_value) 0 >+ >+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing >+ STATE-NUM. */ >+static const yytype_int16 yypact[] = { >+ 31, -12, -12, 31, 31, 31, 31, 31, 51, 76, -12, -12, -12, -12, 53, -12, -12, -12, 31, >+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, -12, 31, 31, 124, >+ 138, 26, 149, 149, -11, -11, -11, -11, 154, 154, -8, -8, -12, -12, -12, 93, 109}; >+ >+/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. >+ Performed when YYTABLE does not specify something else to do. Zero >+ means the default is an error. */ >+static const yytype_uint8 yydefact[] = {0, 3, 4, 0, 0, 0, 0, 0, 0, 2, 28, 27, 25, 26, >+ 0, 1, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 0, 0, 29, 0, 0, 9, 10, 11, 13, 12, >+ 17, 16, 15, 14, 19, 18, 21, 20, 24, 23, 22, 6, 8}; >+ >+/* YYPGOTO[NTERM-NUM]. */ >+static const yytype_int8 yypgoto[] = {-12, -12, -3, -12, -12}; >+ >+/* YYDEFGOTO[NTERM-NUM]. */ >+static const yytype_int8 yydefgoto[] = {-1, 8, 9, 35, 36}; >+ >+/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If >+ positive, shift that token. If negative, reduce the rule whose >+ number is the opposite. If YYTABLE_NINF, syntax error. */ >+static const yytype_uint8 yytable[] = { >+ 10, 11, 12, 13, 14, 27, 28, 29, 30, 31, 32, 33, 31, 32, 33, 37, 38, 39, 40, 41, 42, 43, 44, >+ 45, 46, 47, 48, 49, 50, 51, 52, 0, 53, 54, 1, 2, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, >+ 31, 32, 33, 3, 4, 15, 0, 0, 0, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, >+ 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, 34, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, >+ 27, 28, 29, 30, 31, 32, 33, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, >+ 33, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 19, 20, 21, 22, 23, 24, >+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, >+ 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 29, 30, 31, 32, 33}; >+ >+static const yytype_int8 yycheck[] = { >+ 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 20, 21, 22, 18, 19, 20, 21, 22, 23, 24, 25, >+ 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, >+ 20, 21, 22, 18, 19, 0, -1, -1, -1, 24, 25, 26, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, >+ 16, 17, 18, 19, 20, 21, 22, -1, -1, -1, -1, 27, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, >+ 16, 17, 18, 19, 20, 21, 22, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, >+ 22, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 8, 9, 10, 11, 12, 13, >+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, >+ 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 18, 19, 20, 21, 22}; >+ >+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing >+ symbol of state STATE-NUM. */ >+static const yytype_uint8 yystos[] = {0, 3, 4, 18, 19, 24, 25, 26, 29, 30, 30, 30, 30, 30, >+ 30, 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, >+ 17, 18, 19, 20, 21, 22, 27, 31, 32, 30, 30, 30, 30, 30, >+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}; >+ >+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ >+static const yytype_uint8 yyr1[] = {0, 28, 29, 30, 30, 31, 30, 32, 30, 30, 30, 30, 30, 30, 30, >+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}; >+ >+/* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ >+static const yytype_uint8 yyr2[] = {0, 2, 1, 1, 1, 0, 4, 0, 4, 3, 3, 3, 3, 3, 3, >+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3}; >+ >+#define yyerrok (yyerrstatus = 0) >+#define yyclearin (yychar = YYEMPTY) >+#define YYEMPTY (-2) >+#define YYEOF 0 >+ >+#define YYACCEPT goto yyacceptlab >+#define YYABORT goto yyabortlab >+#define YYERROR goto yyerrorlab >+ >+#define YYRECOVERING() (!!yyerrstatus) >+ >+#define YYBACKUP(Token, Value) \ >+ do \ >+ if (yychar == YYEMPTY) \ >+ { \ >+ yychar = (Token); \ >+ yylval = (Value); \ >+ YYPOPSTACK(yylen); \ >+ yystate = *yyssp; \ >+ goto yybackup; \ >+ } \ >+ else \ >+ { \ >+ yyerror(context, YY_("syntax error: cannot back up")); \ >+ YYERROR; \ >+ } \ >+ while (0) > > /* Error token number */ >-#define YYTERROR 1 >-#define YYERRCODE 256 >- >- >+#define YYTERROR 1 >+#define YYERRCODE 256 > > /* Enable debugging if requested. */ > #if YYDEBUG > >-# ifndef YYFPRINTF >-# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ >-# define YYFPRINTF fprintf >-# endif >+# ifndef YYFPRINTF >+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ >+# define YYFPRINTF fprintf >+# endif > >-# define YYDPRINTF(Args) \ >-do { \ >- if (yydebug) \ >- YYFPRINTF Args; \ >-} while (0) >+# define YYDPRINTF(Args) \ >+ do \ >+ { \ >+ if (yydebug) \ >+ YYFPRINTF Args; \ >+ } while (0) > > /* This macro is provided for backward compatibility. */ >-#ifndef YY_LOCATION_PRINT >-# define YY_LOCATION_PRINT(File, Loc) ((void) 0) >-#endif >- >- >-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ >-do { \ >- if (yydebug) \ >- { \ >- YYFPRINTF (stderr, "%s ", Title); \ >- yy_symbol_print (stderr, \ >- Type, Value, context); \ >- YYFPRINTF (stderr, "\n"); \ >- } \ >-} while (0) >+# ifndef YY_LOCATION_PRINT >+# define YY_LOCATION_PRINT(File, Loc) ((void)0) >+# endif > >+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ >+ do \ >+ { \ >+ if (yydebug) \ >+ { \ >+ YYFPRINTF(stderr, "%s ", Title); \ >+ yy_symbol_print(stderr, Type, Value, context); \ >+ YYFPRINTF(stderr, "\n"); \ >+ } \ >+ } while (0) > > /*----------------------------------------. > | Print this symbol's value on YYOUTPUT. | > `----------------------------------------*/ > >-static void >-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Context *context) >+static void yy_symbol_value_print(FILE *yyoutput, >+ int yytype, >+ YYSTYPE const *const yyvaluep, >+ Context *context) > { >- FILE *yyo = yyoutput; >- YYUSE (yyo); >- YYUSE (context); >- if (!yyvaluep) >- return; >-# ifdef YYPRINT >- if (yytype < YYNTOKENS) >- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); >-# endif >- YYUSE (yytype); >+ FILE *yyo = yyoutput; >+ YYUSE(yyo); >+ YYUSE(context); >+ if (!yyvaluep) >+ return; >+# ifdef YYPRINT >+ if (yytype < YYNTOKENS) >+ YYPRINT(yyoutput, yytoknum[yytype], *yyvaluep); >+# endif >+ YYUSE(yytype); > } > >- > /*--------------------------------. > | Print this symbol on YYOUTPUT. | > `--------------------------------*/ > >-static void >-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Context *context) >+static void yy_symbol_print(FILE *yyoutput, >+ int yytype, >+ YYSTYPE const *const yyvaluep, >+ Context *context) > { >- YYFPRINTF (yyoutput, "%s %s (", >- yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); >+ YYFPRINTF(yyoutput, "%s %s (", yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); > >- yy_symbol_value_print (yyoutput, yytype, yyvaluep, context); >- YYFPRINTF (yyoutput, ")"); >+ yy_symbol_value_print(yyoutput, yytype, yyvaluep, context); >+ YYFPRINTF(yyoutput, ")"); > } > > /*------------------------------------------------------------------. >@@ -756,69 +652,64 @@ yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Con > | TOP (included). | > `------------------------------------------------------------------*/ > >-static void >-yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) >+static void yy_stack_print(yytype_int16 *yybottom, yytype_int16 *yytop) > { >- YYFPRINTF (stderr, "Stack now"); >- for (; yybottom <= yytop; yybottom++) >+ YYFPRINTF(stderr, "Stack now"); >+ for (; yybottom <= yytop; yybottom++) > { >- int yybot = *yybottom; >- YYFPRINTF (stderr, " %d", yybot); >+ int yybot = *yybottom; >+ YYFPRINTF(stderr, " %d", yybot); > } >- YYFPRINTF (stderr, "\n"); >+ YYFPRINTF(stderr, "\n"); > } > >-# define YY_STACK_PRINT(Bottom, Top) \ >-do { \ >- if (yydebug) \ >- yy_stack_print ((Bottom), (Top)); \ >-} while (0) >- >+# define YY_STACK_PRINT(Bottom, Top) \ >+ do \ >+ { \ >+ if (yydebug) \ >+ yy_stack_print((Bottom), (Top)); \ >+ } while (0) > > /*------------------------------------------------. > | Report that the YYRULE is going to be reduced. | > `------------------------------------------------*/ > >-static void >-yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule, Context *context) >+static void yy_reduce_print(yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule, Context *context) > { >- unsigned long int yylno = yyrline[yyrule]; >- int yynrhs = yyr2[yyrule]; >- int yyi; >- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", >- yyrule - 1, yylno); >- /* The symbols being reduced. */ >- for (yyi = 0; yyi < yynrhs; yyi++) >+ unsigned long int yylno = yyrline[yyrule]; >+ int yynrhs = yyr2[yyrule]; >+ int yyi; >+ YYFPRINTF(stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); >+ /* The symbols being reduced. */ >+ for (yyi = 0; yyi < yynrhs; yyi++) > { >- YYFPRINTF (stderr, " $%d = ", yyi + 1); >- yy_symbol_print (stderr, >- yystos[yyssp[yyi + 1 - yynrhs]], >- &(yyvsp[(yyi + 1) - (yynrhs)]) >- , context); >- YYFPRINTF (stderr, "\n"); >+ YYFPRINTF(stderr, " $%d = ", yyi + 1); >+ yy_symbol_print(stderr, yystos[yyssp[yyi + 1 - yynrhs]], &(yyvsp[(yyi + 1) - (yynrhs)]), >+ context); >+ YYFPRINTF(stderr, "\n"); > } > } > >-# define YY_REDUCE_PRINT(Rule) \ >-do { \ >- if (yydebug) \ >- yy_reduce_print (yyssp, yyvsp, Rule, context); \ >-} while (0) >+# define YY_REDUCE_PRINT(Rule) \ >+ do \ >+ { \ >+ if (yydebug) \ >+ yy_reduce_print(yyssp, yyvsp, Rule, context); \ >+ } while (0) > > /* Nonzero means print parse trace. It is left uninitialized so that > multiple parsers can coexist. */ > int yydebug; > #else /* !YYDEBUG */ >-# define YYDPRINTF(Args) >-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) >-# define YY_STACK_PRINT(Bottom, Top) >-# define YY_REDUCE_PRINT(Rule) >+# define YYDPRINTF(Args) >+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) >+# define YY_STACK_PRINT(Bottom, Top) >+# define YY_REDUCE_PRINT(Rule) > #endif /* !YYDEBUG */ > >- > /* YYINITDEPTH -- initial size of the parser's stacks. */ > #ifndef YYINITDEPTH >-# define YYINITDEPTH 200 >+# define YYINITDEPTH 200 > #endif > > /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only >@@ -829,49 +720,46 @@ int yydebug; > evaluated with infinite-precision integer arithmetic. */ > > #ifndef YYMAXDEPTH >-# define YYMAXDEPTH 10000 >+# define YYMAXDEPTH 10000 > #endif > >- > #if YYERROR_VERBOSE > >-# ifndef yystrlen >-# if defined __GLIBC__ && defined _STRING_H >-# define yystrlen strlen >-# else >+# ifndef yystrlen >+# if defined __GLIBC__ && defined _STRING_H >+# define yystrlen strlen >+# else > /* Return the length of YYSTR. */ >-static YYSIZE_T >-yystrlen (const char *yystr) >+static YYSIZE_T yystrlen(const char *yystr) > { >- YYSIZE_T yylen; >- for (yylen = 0; yystr[yylen]; yylen++) >- continue; >- return yylen; >+ YYSIZE_T yylen; >+ for (yylen = 0; yystr[yylen]; yylen++) >+ continue; >+ return yylen; > } >-# endif >-# endif >+# endif >+# endif > >-# ifndef yystpcpy >-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE >-# define yystpcpy stpcpy >-# else >+# ifndef yystpcpy >+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE >+# define yystpcpy stpcpy >+# else > /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in > YYDEST. */ >-static char * >-yystpcpy (char *yydest, const char *yysrc) >+static char *yystpcpy(char *yydest, const char *yysrc) > { >- char *yyd = yydest; >- const char *yys = yysrc; >+ char *yyd = yydest; >+ const char *yys = yysrc; > >- while ((*yyd++ = *yys++) != '\0') >- continue; >+ while ((*yyd++ = *yys++) != '\0') >+ continue; > >- return yyd - 1; >+ return yyd - 1; > } >-# endif >-# endif >+# endif >+# endif > >-# ifndef yytnamerr >+# ifndef yytnamerr > /* Copy to YYRES the contents of YYSTR after stripping away unnecessary > quotes and backslashes, so that it's suitable for yyerror. The > heuristic is that double-quoting is unnecessary unless the string >@@ -879,45 +767,44 @@ yystpcpy (char *yydest, const char *yysrc) > backslash-backslash). YYSTR is taken from yytname. If YYRES is > null, do not copy; instead, return the length of what the result > would have been. */ >-static YYSIZE_T >-yytnamerr (char *yyres, const char *yystr) >+static YYSIZE_T yytnamerr(char *yyres, const char *yystr) > { >- if (*yystr == '"') >+ if (*yystr == '"') > { >- YYSIZE_T yyn = 0; >- char const *yyp = yystr; >- >- for (;;) >- switch (*++yyp) >- { >- case '\'': >- case ',': >- goto do_not_strip_quotes; >- >- case '\\': >- if (*++yyp != '\\') >- goto do_not_strip_quotes; >- /* Fall through. */ >- default: >- if (yyres) >- yyres[yyn] = *yyp; >- yyn++; >- break; >+ YYSIZE_T yyn = 0; >+ char const *yyp = yystr; >+ >+ for (;;) >+ switch (*++yyp) >+ { >+ case '\'': >+ case ',': >+ goto do_not_strip_quotes; >+ >+ case '\\': >+ if (*++yyp != '\\') >+ goto do_not_strip_quotes; >+ /* Fall through. */ >+ default: >+ if (yyres) >+ yyres[yyn] = *yyp; >+ yyn++; >+ break; > >- case '"': >- if (yyres) >- yyres[yyn] = '\0'; >- return yyn; >- } >- do_not_strip_quotes: ; >+ case '"': >+ if (yyres) >+ yyres[yyn] = '\0'; >+ return yyn; >+ } >+ do_not_strip_quotes:; > } > >- if (! yyres) >- return yystrlen (yystr); >+ if (!yyres) >+ return yystrlen(yystr); > >- return yystpcpy (yyres, yystr) - yyres; >+ return yystpcpy(yyres, yystr) - yyres; > } >-# endif >+# endif > > /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message > about the unexpected token YYTOKEN for the state stack whose top is >@@ -927,131 +814,130 @@ yytnamerr (char *yyres, const char *yystr) > not large enough to hold the message. In that case, also set > *YYMSG_ALLOC to the required number of bytes. Return 2 if the > required number of bytes is too large to store. */ >-static int >-yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, >- yytype_int16 *yyssp, int yytoken) >+static int yysyntax_error(YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) > { >- YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); >- YYSIZE_T yysize = yysize0; >- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; >- /* Internationalized format string. */ >- const char *yyformat = YY_NULLPTR; >- /* Arguments of yyformat. */ >- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; >- /* Number of reported tokens (one for the "unexpected", one per >- "expected"). */ >- int yycount = 0; >- >- /* There are many possibilities here to consider: >- - If this state is a consistent state with a default action, then >- the only way this function was invoked is if the default action >- is an error action. In that case, don't check for expected >- tokens because there are none. >- - The only way there can be no lookahead present (in yychar) is if >- this state is a consistent state with a default action. Thus, >- detecting the absence of a lookahead is sufficient to determine >- that there is no unexpected or expected token to report. In that >- case, just report a simple "syntax error". >- - Don't assume there isn't a lookahead just because this state is a >- consistent state with a default action. There might have been a >- previous inconsistent state, consistent state with a non-default >- action, or user semantic action that manipulated yychar. >- - Of course, the expected token list depends on states to have >- correct lookahead information, and it depends on the parser not >- to perform extra reductions after fetching a lookahead from the >- scanner and before detecting a syntax error. Thus, state merging >- (from LALR or IELR) and default reductions corrupt the expected >- token list. However, the list is correct for canonical LR with >- one exception: it will still contain any token that will not be >- accepted due to an error action in a later state. >- */ >- if (yytoken != YYEMPTY) >+ YYSIZE_T yysize0 = yytnamerr(YY_NULLPTR, yytname[yytoken]); >+ YYSIZE_T yysize = yysize0; >+ enum >+ { >+ YYERROR_VERBOSE_ARGS_MAXIMUM = 5 >+ }; >+ /* Internationalized format string. */ >+ const char *yyformat = YY_NULLPTR; >+ /* Arguments of yyformat. */ >+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; >+ /* Number of reported tokens (one for the "unexpected", one per >+ "expected"). */ >+ int yycount = 0; >+ >+ /* There are many possibilities here to consider: >+ - If this state is a consistent state with a default action, then >+ the only way this function was invoked is if the default action >+ is an error action. In that case, don't check for expected >+ tokens because there are none. >+ - The only way there can be no lookahead present (in yychar) is if >+ this state is a consistent state with a default action. Thus, >+ detecting the absence of a lookahead is sufficient to determine >+ that there is no unexpected or expected token to report. In that >+ case, just report a simple "syntax error". >+ - Don't assume there isn't a lookahead just because this state is a >+ consistent state with a default action. There might have been a >+ previous inconsistent state, consistent state with a non-default >+ action, or user semantic action that manipulated yychar. >+ - Of course, the expected token list depends on states to have >+ correct lookahead information, and it depends on the parser not >+ to perform extra reductions after fetching a lookahead from the >+ scanner and before detecting a syntax error. Thus, state merging >+ (from LALR or IELR) and default reductions corrupt the expected >+ token list. However, the list is correct for canonical LR with >+ one exception: it will still contain any token that will not be >+ accepted due to an error action in a later state. >+ */ >+ if (yytoken != YYEMPTY) > { >- int yyn = yypact[*yyssp]; >- yyarg[yycount++] = yytname[yytoken]; >- if (!yypact_value_is_default (yyn)) >+ int yyn = yypact[*yyssp]; >+ yyarg[yycount++] = yytname[yytoken]; >+ if (!yypact_value_is_default(yyn)) > { >- /* Start YYX at -YYN if negative to avoid negative indexes in >- YYCHECK. In other words, skip the first -YYN actions for >- this state because they are default actions. */ >- int yyxbegin = yyn < 0 ? -yyn : 0; >- /* Stay within bounds of both yycheck and yytname. */ >- int yychecklim = YYLAST - yyn + 1; >- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; >- int yyx; >- >- for (yyx = yyxbegin; yyx < yyxend; ++yyx) >- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR >- && !yytable_value_is_error (yytable[yyx + yyn])) >- { >- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) >- { >- yycount = 1; >- yysize = yysize0; >- break; >- } >- yyarg[yycount++] = yytname[yyx]; >+ /* Start YYX at -YYN if negative to avoid negative indexes in >+ YYCHECK. In other words, skip the first -YYN actions for >+ this state because they are default actions. */ >+ int yyxbegin = yyn < 0 ? -yyn : 0; >+ /* Stay within bounds of both yycheck and yytname. */ >+ int yychecklim = YYLAST - yyn + 1; >+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; >+ int yyx; >+ >+ for (yyx = yyxbegin; yyx < yyxend; ++yyx) >+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR && >+ !yytable_value_is_error(yytable[yyx + yyn])) > { >- YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); >- if (! (yysize <= yysize1 >- && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) >- return 2; >- yysize = yysize1; >+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) >+ { >+ yycount = 1; >+ yysize = yysize0; >+ break; >+ } >+ yyarg[yycount++] = yytname[yyx]; >+ { >+ YYSIZE_T yysize1 = yysize + yytnamerr(YY_NULLPTR, yytname[yyx]); >+ if (!(yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) >+ return 2; >+ yysize = yysize1; >+ } > } >- } > } > } > >- switch (yycount) >+ switch (yycount) > { >-# define YYCASE_(N, S) \ >- case N: \ >- yyformat = S; \ >- break >- YYCASE_(0, YY_("syntax error")); >- YYCASE_(1, YY_("syntax error, unexpected %s")); >- YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); >- YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); >- YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); >- YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); >-# undef YYCASE_ >+# define YYCASE_(N, S) \ >+ case N: \ >+ yyformat = S; \ >+ break >+ YYCASE_(0, YY_("syntax error")); >+ YYCASE_(1, YY_("syntax error, unexpected %s")); >+ YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); >+ YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); >+ YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); >+ YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); >+# undef YYCASE_ > } > >- { >- YYSIZE_T yysize1 = yysize + yystrlen (yyformat); >- if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) >- return 2; >- yysize = yysize1; >- } >+ { >+ YYSIZE_T yysize1 = yysize + yystrlen(yyformat); >+ if (!(yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) >+ return 2; >+ yysize = yysize1; >+ } > >- if (*yymsg_alloc < yysize) >+ if (*yymsg_alloc < yysize) > { >- *yymsg_alloc = 2 * yysize; >- if (! (yysize <= *yymsg_alloc >- && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) >- *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; >- return 1; >+ *yymsg_alloc = 2 * yysize; >+ if (!(yysize <= *yymsg_alloc && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) >+ *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; >+ return 1; > } > >- /* Avoid sprintf, as that infringes on the user's name space. >- Don't have undefined behavior even if the translation >- produced a string with the wrong number of "%s"s. */ >- { >- char *yyp = *yymsg; >- int yyi = 0; >- while ((*yyp = *yyformat) != '\0') >- if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) >- { >- yyp += yytnamerr (yyp, yyarg[yyi++]); >- yyformat += 2; >- } >- else >- { >- yyp++; >- yyformat++; >- } >- } >- return 0; >+ /* Avoid sprintf, as that infringes on the user's name space. >+ Don't have undefined behavior even if the translation >+ produced a string with the wrong number of "%s"s. */ >+ { >+ char *yyp = *yymsg; >+ int yyi = 0; >+ while ((*yyp = *yyformat) != '\0') >+ if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) >+ { >+ yyp += yytnamerr(yyp, yyarg[yyi++]); >+ yyformat += 2; >+ } >+ else >+ { >+ yyp++; >+ yyformat++; >+ } >+ } >+ return 0; > } > #endif /* YYERROR_VERBOSE */ > >@@ -1059,39 +945,33 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, > | Release the memory associated to this symbol. | > `-----------------------------------------------*/ > >-static void >-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, Context *context) >+static void yydestruct(const char *yymsg, int yytype, YYSTYPE *yyvaluep, Context *context) > { >- YYUSE (yyvaluep); >- YYUSE (context); >- if (!yymsg) >- yymsg = "Deleting"; >- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); >- >- YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN >- YYUSE (yytype); >- YY_IGNORE_MAYBE_UNINITIALIZED_END >+ YYUSE(yyvaluep); >+ YYUSE(context); >+ if (!yymsg) >+ yymsg = "Deleting"; >+ YY_SYMBOL_PRINT(yymsg, yytype, yyvaluep, yylocationp); >+ >+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN >+ YYUSE(yytype); >+ YY_IGNORE_MAYBE_UNINITIALIZED_END > } > >- >- >- > /*----------. > | yyparse. | > `----------*/ > >-int >-yyparse (Context *context) >+int yyparse(Context *context) > { >-/* The lookahead symbol. */ >-int yychar; >- >+ /* The lookahead symbol. */ >+ int yychar; > >-/* The semantic value of the lookahead symbol. */ >-/* Default value used for initialization, for pacifying older GCCs >- or non-GCC compilers. */ >-YY_INITIAL_VALUE (static YYSTYPE yyval_default;) >-YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); >+ /* The semantic value of the lookahead symbol. */ >+ /* Default value used for initialization, for pacifying older GCCs >+ or non-GCC compilers. */ >+ YY_INITIAL_VALUE(static YYSTYPE yyval_default;) >+ YYSTYPE yylval YY_INITIAL_VALUE(= yyval_default); > > /* Number of syntax errors so far. */ > int yynerrs; >@@ -1119,804 +999,779 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); > > YYSIZE_T yystacksize; > >- int yyn; >- int yyresult; >- /* Lookahead token as an internal (translated) token number. */ >- int yytoken = 0; >- /* The variables used to return semantic value and location from the >- action routines. */ >- YYSTYPE yyval; >+ int yyn; >+ int yyresult; >+ /* Lookahead token as an internal (translated) token number. */ >+ int yytoken = 0; >+ /* The variables used to return semantic value and location from the >+ action routines. */ >+ YYSTYPE yyval; > > #if YYERROR_VERBOSE >- /* Buffer for error messages, and its allocated size. */ >- char yymsgbuf[128]; >- char *yymsg = yymsgbuf; >- YYSIZE_T yymsg_alloc = sizeof yymsgbuf; >+ /* Buffer for error messages, and its allocated size. */ >+ char yymsgbuf[128]; >+ char *yymsg = yymsgbuf; >+ YYSIZE_T yymsg_alloc = sizeof yymsgbuf; > #endif > >-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) >+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) > >- /* The number of symbols on the RHS of the reduced rule. >- Keep to zero when no symbol should be popped. */ >- int yylen = 0; >+ /* The number of symbols on the RHS of the reduced rule. >+ Keep to zero when no symbol should be popped. */ >+ int yylen = 0; > >- yyssp = yyss = yyssa; >- yyvsp = yyvs = yyvsa; >- yystacksize = YYINITDEPTH; >+ yyssp = yyss = yyssa; >+ yyvsp = yyvs = yyvsa; >+ yystacksize = YYINITDEPTH; > >- YYDPRINTF ((stderr, "Starting parse\n")); >+ YYDPRINTF((stderr, "Starting parse\n")); > >- yystate = 0; >- yyerrstatus = 0; >- yynerrs = 0; >- yychar = YYEMPTY; /* Cause a token to be read. */ >- goto yysetstate; >+ yystate = 0; >+ yyerrstatus = 0; >+ yynerrs = 0; >+ yychar = YYEMPTY; /* Cause a token to be read. */ >+ goto yysetstate; > >-/*------------------------------------------------------------. >-| yynewstate -- Push a new state, which is found in yystate. | >-`------------------------------------------------------------*/ >- yynewstate: >- /* In all cases, when you get here, the value and location stacks >- have just been pushed. So pushing a state here evens the stacks. */ >- yyssp++; >+ /*------------------------------------------------------------. >+ | yynewstate -- Push a new state, which is found in yystate. | >+ `------------------------------------------------------------*/ >+yynewstate: >+ /* In all cases, when you get here, the value and location stacks >+ have just been pushed. So pushing a state here evens the stacks. */ >+ yyssp++; > >- yysetstate: >- *yyssp = yystate; >+yysetstate: >+ *yyssp = yystate; > >- if (yyss + yystacksize - 1 <= yyssp) >+ if (yyss + yystacksize - 1 <= yyssp) > { >- /* Get the current used size of the three stacks, in elements. */ >- YYSIZE_T yysize = yyssp - yyss + 1; >+ /* Get the current used size of the three stacks, in elements. */ >+ YYSIZE_T yysize = yyssp - yyss + 1; > > #ifdef yyoverflow >- { >- /* Give user a chance to reallocate the stack. Use copies of >- these so that the &'s don't force the real ones into >- memory. */ >- YYSTYPE *yyvs1 = yyvs; >- yytype_int16 *yyss1 = yyss; >- >- /* Each stack pointer address is followed by the size of the >- data in use in that stack, in bytes. This used to be a >- conditional around just the two extra args, but that might >- be undefined if yyoverflow is a macro. */ >- yyoverflow (YY_("memory exhausted"), >- &yyss1, yysize * sizeof (*yyssp), >- &yyvs1, yysize * sizeof (*yyvsp), >- &yystacksize); >- >- yyss = yyss1; >- yyvs = yyvs1; >- } >+ { >+ /* Give user a chance to reallocate the stack. Use copies of >+ these so that the &'s don't force the real ones into >+ memory. */ >+ YYSTYPE *yyvs1 = yyvs; >+ yytype_int16 *yyss1 = yyss; >+ >+ /* Each stack pointer address is followed by the size of the >+ data in use in that stack, in bytes. This used to be a >+ conditional around just the two extra args, but that might >+ be undefined if yyoverflow is a macro. */ >+ yyoverflow(YY_("memory exhausted"), &yyss1, yysize * sizeof(*yyssp), &yyvs1, >+ yysize * sizeof(*yyvsp), &yystacksize); >+ >+ yyss = yyss1; >+ yyvs = yyvs1; >+ } > #else /* no yyoverflow */ >-# ifndef YYSTACK_RELOCATE >- goto yyexhaustedlab; >-# else >- /* Extend the stack our own way. */ >- if (YYMAXDEPTH <= yystacksize) >+# ifndef YYSTACK_RELOCATE > goto yyexhaustedlab; >- yystacksize *= 2; >- if (YYMAXDEPTH < yystacksize) >- yystacksize = YYMAXDEPTH; >- >- { >- yytype_int16 *yyss1 = yyss; >- union yyalloc *yyptr = >- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); >- if (! yyptr) >- goto yyexhaustedlab; >- YYSTACK_RELOCATE (yyss_alloc, yyss); >- YYSTACK_RELOCATE (yyvs_alloc, yyvs); >-# undef YYSTACK_RELOCATE >- if (yyss1 != yyssa) >- YYSTACK_FREE (yyss1); >- } >-# endif >+# else >+ /* Extend the stack our own way. */ >+ if (YYMAXDEPTH <= yystacksize) >+ goto yyexhaustedlab; >+ yystacksize *= 2; >+ if (YYMAXDEPTH < yystacksize) >+ yystacksize = YYMAXDEPTH; >+ >+ { >+ yytype_int16 *yyss1 = yyss; >+ union yyalloc *yyptr = (union yyalloc *)YYSTACK_ALLOC(YYSTACK_BYTES(yystacksize)); >+ if (!yyptr) >+ goto yyexhaustedlab; >+ YYSTACK_RELOCATE(yyss_alloc, yyss); >+ YYSTACK_RELOCATE(yyvs_alloc, yyvs); >+# undef YYSTACK_RELOCATE >+ if (yyss1 != yyssa) >+ YYSTACK_FREE(yyss1); >+ } >+# endif > #endif /* no yyoverflow */ > >- yyssp = yyss + yysize - 1; >- yyvsp = yyvs + yysize - 1; >+ yyssp = yyss + yysize - 1; >+ yyvsp = yyvs + yysize - 1; > >- YYDPRINTF ((stderr, "Stack size increased to %lu\n", >- (unsigned long int) yystacksize)); >+ YYDPRINTF((stderr, "Stack size increased to %lu\n", (unsigned long int)yystacksize)); > >- if (yyss + yystacksize - 1 <= yyssp) >- YYABORT; >+ if (yyss + yystacksize - 1 <= yyssp) >+ YYABORT; > } > >- YYDPRINTF ((stderr, "Entering state %d\n", yystate)); >+ YYDPRINTF((stderr, "Entering state %d\n", yystate)); > >- if (yystate == YYFINAL) >- YYACCEPT; >+ if (yystate == YYFINAL) >+ YYACCEPT; > >- goto yybackup; >+ goto yybackup; > > /*-----------. > | yybackup. | > `-----------*/ > yybackup: > >- /* Do appropriate processing given the current state. Read a >- lookahead token if we need one and don't already have one. */ >+ /* Do appropriate processing given the current state. Read a >+ lookahead token if we need one and don't already have one. */ > >- /* First try to decide what to do without reference to lookahead token. */ >- yyn = yypact[yystate]; >- if (yypact_value_is_default (yyn)) >- goto yydefault; >+ /* First try to decide what to do without reference to lookahead token. */ >+ yyn = yypact[yystate]; >+ if (yypact_value_is_default(yyn)) >+ goto yydefault; > >- /* Not known => get a lookahead token if don't already have one. */ >+ /* Not known => get a lookahead token if don't already have one. */ > >- /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ >- if (yychar == YYEMPTY) >+ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ >+ if (yychar == YYEMPTY) > { >- YYDPRINTF ((stderr, "Reading a token: ")); >- yychar = yylex (&yylval, context); >+ YYDPRINTF((stderr, "Reading a token: ")); >+ yychar = yylex(&yylval, context); > } > >- if (yychar <= YYEOF) >+ if (yychar <= YYEOF) > { >- yychar = yytoken = YYEOF; >- YYDPRINTF ((stderr, "Now at end of input.\n")); >+ yychar = yytoken = YYEOF; >+ YYDPRINTF((stderr, "Now at end of input.\n")); > } >- else >+ else > { >- yytoken = YYTRANSLATE (yychar); >- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); >+ yytoken = YYTRANSLATE(yychar); >+ YY_SYMBOL_PRINT("Next token is", yytoken, &yylval, &yylloc); > } > >- /* If the proper action on seeing token YYTOKEN is to reduce or to >- detect an error, take that action. */ >- yyn += yytoken; >- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) >- goto yydefault; >- yyn = yytable[yyn]; >- if (yyn <= 0) >+ /* If the proper action on seeing token YYTOKEN is to reduce or to >+ detect an error, take that action. */ >+ yyn += yytoken; >+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) >+ goto yydefault; >+ yyn = yytable[yyn]; >+ if (yyn <= 0) > { >- if (yytable_value_is_error (yyn)) >- goto yyerrlab; >- yyn = -yyn; >- goto yyreduce; >+ if (yytable_value_is_error(yyn)) >+ goto yyerrlab; >+ yyn = -yyn; >+ goto yyreduce; > } > >- /* Count tokens shifted since error; after three, turn off error >- status. */ >- if (yyerrstatus) >- yyerrstatus--; >- >- /* Shift the lookahead token. */ >- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); >+ /* Count tokens shifted since error; after three, turn off error >+ status. */ >+ if (yyerrstatus) >+ yyerrstatus--; > >- /* Discard the shifted token. */ >- yychar = YYEMPTY; >+ /* Shift the lookahead token. */ >+ YY_SYMBOL_PRINT("Shifting", yytoken, &yylval, &yylloc); > >- yystate = yyn; >- YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN >- *++yyvsp = yylval; >- YY_IGNORE_MAYBE_UNINITIALIZED_END >+ /* Discard the shifted token. */ >+ yychar = YYEMPTY; > >- goto yynewstate; >+ yystate = yyn; >+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN >+ *++yyvsp = yylval; >+ YY_IGNORE_MAYBE_UNINITIALIZED_END > >+ goto yynewstate; > > /*-----------------------------------------------------------. > | yydefault -- do the default action for the current state. | > `-----------------------------------------------------------*/ > yydefault: >- yyn = yydefact[yystate]; >- if (yyn == 0) >- goto yyerrlab; >- goto yyreduce; >- >+ yyn = yydefact[yystate]; >+ if (yyn == 0) >+ goto yyerrlab; >+ goto yyreduce; > > /*-----------------------------. > | yyreduce -- Do a reduction. | > `-----------------------------*/ > yyreduce: >- /* yyn is the number of a rule to reduce with. */ >- yylen = yyr2[yyn]; >+ /* yyn is the number of a rule to reduce with. */ >+ yylen = yyr2[yyn]; > >- /* If YYLEN is nonzero, implement the default value of the action: >- '$$ = $1'. >+ /* If YYLEN is nonzero, implement the default value of the action: >+ '$$ = $1'. > >- Otherwise, the following line sets YYVAL to garbage. >- This behavior is undocumented and Bison >- users should not rely upon it. Assigning to YYVAL >- unconditionally makes the parser a bit smaller, and it avoids a >- GCC warning that YYVAL may be used uninitialized. */ >- yyval = yyvsp[1-yylen]; >+ Otherwise, the following line sets YYVAL to garbage. >+ This behavior is undocumented and Bison >+ users should not rely upon it. Assigning to YYVAL >+ unconditionally makes the parser a bit smaller, and it avoids a >+ GCC warning that YYVAL may be used uninitialized. */ >+ yyval = yyvsp[1 - yylen]; > >- >- YY_REDUCE_PRINT (yyn); >- switch (yyn) >+ YY_REDUCE_PRINT(yyn); >+ switch (yyn) > { > case 2: > >- { >- *(context->result) = static_cast<int>((yyvsp[0])); >- YYACCEPT; >- } >+ { >+ *(context->result) = static_cast<int>((yyvsp[0])); >+ YYACCEPT; >+ } > >- break; >+ break; > >- case 4: >+ case 4: > >- { >- if (!context->isIgnoringErrors()) > { >- // This rule should be applied right after the token is lexed, so we can >- // refer to context->token in the error message. >- context->diagnostics->report(context->errorSettings.unexpectedIdentifier, >- context->token->location, context->token->text); >- *(context->valid) = false; >+ if (!context->isIgnoringErrors()) >+ { >+ // This rule should be applied right after the token is lexed, so we can >+ // refer to context->token in the error message. >+ context->diagnostics->report(context->errorSettings.unexpectedIdentifier, >+ context->token->location, context->token->text); >+ *(context->valid) = false; >+ } >+ (yyval) = (yyvsp[0]); > } >- (yyval) = (yyvsp[0]); >- } > >- break; >+ break; > >- case 5: >+ case 5: > >- { >- if ((yyvsp[-1]) != 0) > { >- // Ignore errors in the short-circuited part of the expression. >- // ESSL3.00 section 3.4: >- // If an operand is not evaluated, the presence of undefined identifiers >- // in the operand will not cause an error. >- // Unevaluated division by zero should not cause an error either. >- context->startIgnoreErrors(); >+ if ((yyvsp[-1]) != 0) >+ { >+ // Ignore errors in the short-circuited part of the expression. >+ // ESSL3.00 section 3.4: >+ // If an operand is not evaluated, the presence of undefined identifiers >+ // in the operand will not cause an error. >+ // Unevaluated division by zero should not cause an error either. >+ context->startIgnoreErrors(); >+ } > } >- } > >- break; >+ break; > >- case 6: >+ case 6: > >- { >- if ((yyvsp[-3]) != 0) >- { >- context->endIgnoreErrors(); >- (yyval) = static_cast<YYSTYPE>(1); >- } >- else > { >- (yyval) = (yyvsp[-3]) || (yyvsp[0]); >+ if ((yyvsp[-3]) != 0) >+ { >+ context->endIgnoreErrors(); >+ (yyval) = static_cast<YYSTYPE>(1); >+ } >+ else >+ { >+ (yyval) = (yyvsp[-3]) || (yyvsp[0]); >+ } > } >- } > >- break; >+ break; > >- case 7: >+ case 7: > >- { >- if ((yyvsp[-1]) == 0) > { >- // Ignore errors in the short-circuited part of the expression. >- // ESSL3.00 section 3.4: >- // If an operand is not evaluated, the presence of undefined identifiers >- // in the operand will not cause an error. >- // Unevaluated division by zero should not cause an error either. >- context->startIgnoreErrors(); >+ if ((yyvsp[-1]) == 0) >+ { >+ // Ignore errors in the short-circuited part of the expression. >+ // ESSL3.00 section 3.4: >+ // If an operand is not evaluated, the presence of undefined identifiers >+ // in the operand will not cause an error. >+ // Unevaluated division by zero should not cause an error either. >+ context->startIgnoreErrors(); >+ } > } >- } > >- break; >+ break; > >- case 8: >+ case 8: > >- { >- if ((yyvsp[-3]) == 0) > { >- context->endIgnoreErrors(); >- (yyval) = static_cast<YYSTYPE>(0); >- } >- else >- { >- (yyval) = (yyvsp[-3]) && (yyvsp[0]); >+ if ((yyvsp[-3]) == 0) >+ { >+ context->endIgnoreErrors(); >+ (yyval) = static_cast<YYSTYPE>(0); >+ } >+ else >+ { >+ (yyval) = (yyvsp[-3]) && (yyvsp[0]); >+ } > } >- } > >- break; >+ break; > >- case 9: >+ case 9: > >- { >- (yyval) = (yyvsp[-2]) | (yyvsp[0]); >- } >+ { >+ (yyval) = (yyvsp[-2]) | (yyvsp[0]); >+ } > >- break; >+ break; > >- case 10: >+ case 10: > >- { >- (yyval) = (yyvsp[-2]) ^ (yyvsp[0]); >- } >+ { >+ (yyval) = (yyvsp[-2]) ^ (yyvsp[0]); >+ } > >- break; >+ break; > >- case 11: >+ case 11: > >- { >- (yyval) = (yyvsp[-2]) & (yyvsp[0]); >- } >+ { >+ (yyval) = (yyvsp[-2]) & (yyvsp[0]); >+ } > >- break; >+ break; > >- case 12: >+ case 12: > >- { >- (yyval) = (yyvsp[-2]) != (yyvsp[0]); >- } >+ { >+ (yyval) = (yyvsp[-2]) != (yyvsp[0]); >+ } > >- break; >+ break; > >- case 13: >+ case 13: > >- { >- (yyval) = (yyvsp[-2]) == (yyvsp[0]); >- } >+ { >+ (yyval) = (yyvsp[-2]) == (yyvsp[0]); >+ } > >- break; >+ break; > >- case 14: >+ case 14: > >- { >- (yyval) = (yyvsp[-2]) >= (yyvsp[0]); >- } >+ { >+ (yyval) = (yyvsp[-2]) >= (yyvsp[0]); >+ } > >- break; >+ break; > >- case 15: >+ case 15: > >- { >- (yyval) = (yyvsp[-2]) <= (yyvsp[0]); >- } >+ { >+ (yyval) = (yyvsp[-2]) <= (yyvsp[0]); >+ } > >- break; >+ break; > >- case 16: >+ case 16: > >- { >- (yyval) = (yyvsp[-2]) > (yyvsp[0]); >- } >+ { >+ (yyval) = (yyvsp[-2]) > (yyvsp[0]); >+ } > >- break; >+ break; > >- case 17: >+ case 17: > >- { >- (yyval) = (yyvsp[-2]) < (yyvsp[0]); >- } >+ { >+ (yyval) = (yyvsp[-2]) < (yyvsp[0]); >+ } > >- break; >+ break; > >- case 18: >+ case 18: > >- { >- if ((yyvsp[0]) < 0 || (yyvsp[0]) > 31) > { >- if (!context->isIgnoringErrors()) >+ if ((yyvsp[0]) < 0 || (yyvsp[0]) > 31) > { >- std::ostringstream stream; >- stream << (yyvsp[-2]) << " >> " << (yyvsp[0]); >- std::string text = stream.str(); >- context->diagnostics->report(pp::Diagnostics::PP_UNDEFINED_SHIFT, >- context->token->location, >- text.c_str()); >- *(context->valid) = false; >+ if (!context->isIgnoringErrors()) >+ { >+ std::ostringstream stream; >+ stream << (yyvsp[-2]) << " >> " << (yyvsp[0]); >+ std::string text = stream.str(); >+ context->diagnostics->report(angle::pp::Diagnostics::PP_UNDEFINED_SHIFT, >+ context->token->location, text.c_str()); >+ *(context->valid) = false; >+ } >+ (yyval) = static_cast<YYSTYPE>(0); >+ } >+ else if ((yyvsp[-2]) < 0) >+ { >+ // Logical shift right. >+ (yyval) = >+ static_cast<YYSTYPE>(static_cast<UNSIGNED_TYPE>((yyvsp[-2])) >> (yyvsp[0])); >+ } >+ else >+ { >+ (yyval) = (yyvsp[-2]) >> (yyvsp[0]); > } >- (yyval) = static_cast<YYSTYPE>(0); >- } >- else if ((yyvsp[-2]) < 0) >- { >- // Logical shift right. >- (yyval) = static_cast<YYSTYPE>(static_cast<UNSIGNED_TYPE>((yyvsp[-2])) >> (yyvsp[0])); >- } >- else >- { >- (yyval) = (yyvsp[-2]) >> (yyvsp[0]); > } >- } > >- break; >+ break; > >- case 19: >+ case 19: > >- { >- if ((yyvsp[0]) < 0 || (yyvsp[0]) > 31) > { >- if (!context->isIgnoringErrors()) >+ if ((yyvsp[0]) < 0 || (yyvsp[0]) > 31) > { >- std::ostringstream stream; >- stream << (yyvsp[-2]) << " << " << (yyvsp[0]); >- std::string text = stream.str(); >- context->diagnostics->report(pp::Diagnostics::PP_UNDEFINED_SHIFT, >- context->token->location, >- text.c_str()); >- *(context->valid) = false; >+ if (!context->isIgnoringErrors()) >+ { >+ std::ostringstream stream; >+ stream << (yyvsp[-2]) << " << " << (yyvsp[0]); >+ std::string text = stream.str(); >+ context->diagnostics->report(angle::pp::Diagnostics::PP_UNDEFINED_SHIFT, >+ context->token->location, text.c_str()); >+ *(context->valid) = false; >+ } >+ (yyval) = static_cast<YYSTYPE>(0); >+ } >+ else >+ { >+ // Logical shift left. Casting to unsigned is needed to ensure there's no signed >+ // integer overflow, which some tools treat as an error. >+ (yyval) = >+ static_cast<YYSTYPE>(static_cast<UNSIGNED_TYPE>((yyvsp[-2])) << (yyvsp[0])); > } >- (yyval) = static_cast<YYSTYPE>(0); >- } >- else >- { >- // Logical shift left. Casting to unsigned is needed to ensure there's no signed integer >- // overflow, which some tools treat as an error. >- (yyval) = static_cast<YYSTYPE>(static_cast<UNSIGNED_TYPE>((yyvsp[-2])) << (yyvsp[0])); > } >- } > >- break; >+ break; > >- case 20: >+ case 20: > >- { >- (yyval) = gl::WrappingDiff<YYSTYPE>((yyvsp[-2]), (yyvsp[0])); >- } >+ { >+ (yyval) = gl::WrappingDiff<YYSTYPE>((yyvsp[-2]), (yyvsp[0])); >+ } > >- break; >+ break; > >- case 21: >+ case 21: > >- { >- (yyval) = gl::WrappingSum<YYSTYPE>((yyvsp[-2]), (yyvsp[0])); >- } >+ { >+ (yyval) = gl::WrappingSum<YYSTYPE>((yyvsp[-2]), (yyvsp[0])); >+ } > >- break; >+ break; > >- case 22: >+ case 22: > >- { >- if ((yyvsp[0]) == 0) > { >- if (!context->isIgnoringErrors()) >+ if ((yyvsp[0]) == 0) > { >- std::ostringstream stream; >- stream << (yyvsp[-2]) << " % " << (yyvsp[0]); >- std::string text = stream.str(); >- context->diagnostics->report(pp::Diagnostics::PP_DIVISION_BY_ZERO, >- context->token->location, >- text.c_str()); >- *(context->valid) = false; >+ if (!context->isIgnoringErrors()) >+ { >+ std::ostringstream stream; >+ stream << (yyvsp[-2]) << " % " << (yyvsp[0]); >+ std::string text = stream.str(); >+ context->diagnostics->report(angle::pp::Diagnostics::PP_DIVISION_BY_ZERO, >+ context->token->location, text.c_str()); >+ *(context->valid) = false; >+ } >+ (yyval) = static_cast<YYSTYPE>(0); >+ } >+ else if (((yyvsp[-2]) == std::numeric_limits<YYSTYPE>::min()) && ((yyvsp[0]) == -1)) >+ { >+ // Check for the special case where the minimum representable number is >+ // divided by -1. If left alone this has undefined results. >+ (yyval) = 0; >+ } >+ else >+ { >+ (yyval) = (yyvsp[-2]) % (yyvsp[0]); > } >- (yyval) = static_cast<YYSTYPE>(0); >- } >- else if (((yyvsp[-2]) == std::numeric_limits<YYSTYPE>::min()) && ((yyvsp[0]) == -1)) >- { >- // Check for the special case where the minimum representable number is >- // divided by -1. If left alone this has undefined results. >- (yyval) = 0; >- } >- else >- { >- (yyval) = (yyvsp[-2]) % (yyvsp[0]); > } >- } > >- break; >+ break; > >- case 23: >+ case 23: > >- { >- if ((yyvsp[0]) == 0) > { >- if (!context->isIgnoringErrors()) >+ if ((yyvsp[0]) == 0) > { >- std::ostringstream stream; >- stream << (yyvsp[-2]) << " / " << (yyvsp[0]); >- std::string text = stream.str(); >- context->diagnostics->report(pp::Diagnostics::PP_DIVISION_BY_ZERO, >- context->token->location, >- text.c_str()); >- *(context->valid) = false; >+ if (!context->isIgnoringErrors()) >+ { >+ std::ostringstream stream; >+ stream << (yyvsp[-2]) << " / " << (yyvsp[0]); >+ std::string text = stream.str(); >+ context->diagnostics->report(angle::pp::Diagnostics::PP_DIVISION_BY_ZERO, >+ context->token->location, text.c_str()); >+ *(context->valid) = false; >+ } >+ (yyval) = static_cast<YYSTYPE>(0); >+ } >+ else if (((yyvsp[-2]) == std::numeric_limits<YYSTYPE>::min()) && ((yyvsp[0]) == -1)) >+ { >+ // Check for the special case where the minimum representable number is >+ // divided by -1. If left alone this leads to integer overflow in C++, which >+ // has undefined results. >+ (yyval) = std::numeric_limits<YYSTYPE>::max(); >+ } >+ else >+ { >+ (yyval) = (yyvsp[-2]) / (yyvsp[0]); > } >- (yyval) = static_cast<YYSTYPE>(0); >- } >- else if (((yyvsp[-2]) == std::numeric_limits<YYSTYPE>::min()) && ((yyvsp[0]) == -1)) >- { >- // Check for the special case where the minimum representable number is >- // divided by -1. If left alone this leads to integer overflow in C++, which >- // has undefined results. >- (yyval) = std::numeric_limits<YYSTYPE>::max(); >- } >- else >- { >- (yyval) = (yyvsp[-2]) / (yyvsp[0]); > } >- } > >- break; >+ break; > >- case 24: >+ case 24: > >- { >- (yyval) = gl::WrappingMul((yyvsp[-2]), (yyvsp[0])); >- } >+ { >+ (yyval) = gl::WrappingMul((yyvsp[-2]), (yyvsp[0])); >+ } > >- break; >+ break; > >- case 25: >+ case 25: > >- { >- (yyval) = ! (yyvsp[0]); >- } >+ { >+ (yyval) = !(yyvsp[0]); >+ } > >- break; >+ break; > >- case 26: >+ case 26: > >- { >- (yyval) = ~ (yyvsp[0]); >- } >+ { >+ (yyval) = ~(yyvsp[0]); >+ } > >- break; >+ break; > >- case 27: >+ case 27: > >- { >- // Check for negation of minimum representable integer to prevent undefined signed int >- // overflow. >- if ((yyvsp[0]) == std::numeric_limits<YYSTYPE>::min()) >- { >- (yyval) = std::numeric_limits<YYSTYPE>::min(); >- } >- else > { >- (yyval) = -(yyvsp[0]); >+ // Check for negation of minimum representable integer to prevent undefined signed int >+ // overflow. >+ if ((yyvsp[0]) == std::numeric_limits<YYSTYPE>::min()) >+ { >+ (yyval) = std::numeric_limits<YYSTYPE>::min(); >+ } >+ else >+ { >+ (yyval) = -(yyvsp[0]); >+ } > } >- } >- >- break; >- >- case 28: > >- { >- (yyval) = + (yyvsp[0]); >- } >+ break; > >- break; >+ case 28: > >- case 29: >+ { >+ (yyval) = +(yyvsp[0]); >+ } > >- { >- (yyval) = (yyvsp[-1]); >- } >+ break; > >- break; >+ case 29: > >+ { >+ (yyval) = (yyvsp[-1]); >+ } > >+ break; > >- default: break; >+ default: >+ break; > } >- /* User semantic actions sometimes alter yychar, and that requires >- that yytoken be updated with the new translation. We take the >- approach of translating immediately before every use of yytoken. >- One alternative is translating here after every semantic action, >- but that translation would be missed if the semantic action invokes >- YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or >- if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an >- incorrect destructor might then be invoked immediately. In the >- case of YYERROR or YYBACKUP, subsequent parser actions might lead >- to an incorrect destructor call or verbose syntax error message >- before the lookahead is translated. */ >- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); >- >- YYPOPSTACK (yylen); >- yylen = 0; >- YY_STACK_PRINT (yyss, yyssp); >- >- *++yyvsp = yyval; >- >- /* Now 'shift' the result of the reduction. Determine what state >- that goes to, based on the state we popped back to and the rule >- number reduced by. */ >- >- yyn = yyr1[yyn]; >- >- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; >- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) >- yystate = yytable[yystate]; >- else >- yystate = yydefgoto[yyn - YYNTOKENS]; >- >- goto yynewstate; >- >+ /* User semantic actions sometimes alter yychar, and that requires >+ that yytoken be updated with the new translation. We take the >+ approach of translating immediately before every use of yytoken. >+ One alternative is translating here after every semantic action, >+ but that translation would be missed if the semantic action invokes >+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or >+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an >+ incorrect destructor might then be invoked immediately. In the >+ case of YYERROR or YYBACKUP, subsequent parser actions might lead >+ to an incorrect destructor call or verbose syntax error message >+ before the lookahead is translated. */ >+ YY_SYMBOL_PRINT("-> $$ =", yyr1[yyn], &yyval, &yyloc); >+ >+ YYPOPSTACK(yylen); >+ yylen = 0; >+ YY_STACK_PRINT(yyss, yyssp); >+ >+ *++yyvsp = yyval; >+ >+ /* Now 'shift' the result of the reduction. Determine what state >+ that goes to, based on the state we popped back to and the rule >+ number reduced by. */ >+ >+ yyn = yyr1[yyn]; >+ >+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; >+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) >+ yystate = yytable[yystate]; >+ else >+ yystate = yydefgoto[yyn - YYNTOKENS]; >+ >+ goto yynewstate; > > /*--------------------------------------. > | yyerrlab -- here on detecting error. | > `--------------------------------------*/ > yyerrlab: >- /* Make sure we have latest lookahead translation. See comments at >- user semantic actions for why this is necessary. */ >- yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); >+ /* Make sure we have latest lookahead translation. See comments at >+ user semantic actions for why this is necessary. */ >+ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE(yychar); > >- /* If not already recovering from an error, report this error. */ >- if (!yyerrstatus) >+ /* If not already recovering from an error, report this error. */ >+ if (!yyerrstatus) > { >- ++yynerrs; >-#if ! YYERROR_VERBOSE >- yyerror (context, YY_("syntax error")); >+ ++yynerrs; >+#if !YYERROR_VERBOSE >+ yyerror(context, YY_("syntax error")); > #else >-# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ >- yyssp, yytoken) >- { >- char const *yymsgp = YY_("syntax error"); >- int yysyntax_error_status; >- yysyntax_error_status = YYSYNTAX_ERROR; >- if (yysyntax_error_status == 0) >- yymsgp = yymsg; >- else if (yysyntax_error_status == 1) >- { >- if (yymsg != yymsgbuf) >- YYSTACK_FREE (yymsg); >- yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); >- if (!yymsg) >- { >- yymsg = yymsgbuf; >- yymsg_alloc = sizeof yymsgbuf; >- yysyntax_error_status = 2; >- } >- else >- { >- yysyntax_error_status = YYSYNTAX_ERROR; >+# define YYSYNTAX_ERROR yysyntax_error(&yymsg_alloc, &yymsg, yyssp, yytoken) >+ { >+ char const *yymsgp = YY_("syntax error"); >+ int yysyntax_error_status; >+ yysyntax_error_status = YYSYNTAX_ERROR; >+ if (yysyntax_error_status == 0) > yymsgp = yymsg; >- } >- } >- yyerror (context, yymsgp); >- if (yysyntax_error_status == 2) >- goto yyexhaustedlab; >- } >-# undef YYSYNTAX_ERROR >+ else if (yysyntax_error_status == 1) >+ { >+ if (yymsg != yymsgbuf) >+ YYSTACK_FREE(yymsg); >+ yymsg = (char *)YYSTACK_ALLOC(yymsg_alloc); >+ if (!yymsg) >+ { >+ yymsg = yymsgbuf; >+ yymsg_alloc = sizeof yymsgbuf; >+ yysyntax_error_status = 2; >+ } >+ else >+ { >+ yysyntax_error_status = YYSYNTAX_ERROR; >+ yymsgp = yymsg; >+ } >+ } >+ yyerror(context, yymsgp); >+ if (yysyntax_error_status == 2) >+ goto yyexhaustedlab; >+ } >+# undef YYSYNTAX_ERROR > #endif > } > >- >- >- if (yyerrstatus == 3) >+ if (yyerrstatus == 3) > { >- /* If just tried and failed to reuse lookahead token after an >- error, discard it. */ >+ /* If just tried and failed to reuse lookahead token after an >+ error, discard it. */ > >- if (yychar <= YYEOF) >+ if (yychar <= YYEOF) > { >- /* Return failure if at end of input. */ >- if (yychar == YYEOF) >- YYABORT; >+ /* Return failure if at end of input. */ >+ if (yychar == YYEOF) >+ YYABORT; > } >- else >+ else > { >- yydestruct ("Error: discarding", >- yytoken, &yylval, context); >- yychar = YYEMPTY; >+ yydestruct("Error: discarding", yytoken, &yylval, context); >+ yychar = YYEMPTY; > } > } > >- /* Else will try to reuse lookahead token after shifting the error >- token. */ >- goto yyerrlab1; >- >+ /* Else will try to reuse lookahead token after shifting the error >+ token. */ >+ goto yyerrlab1; > > /*---------------------------------------------------. > | yyerrorlab -- error raised explicitly by YYERROR. | > `---------------------------------------------------*/ > yyerrorlab: > >- /* Pacify compilers like GCC when the user code never invokes >- YYERROR and the label yyerrorlab therefore never appears in user >- code. */ >- if (/*CONSTCOND*/ 0) >- goto yyerrorlab; >- >- /* Do not reclaim the symbols of the rule whose action triggered >- this YYERROR. */ >- YYPOPSTACK (yylen); >- yylen = 0; >- YY_STACK_PRINT (yyss, yyssp); >- yystate = *yyssp; >- goto yyerrlab1; >+ /* Pacify compilers like GCC when the user code never invokes >+ YYERROR and the label yyerrorlab therefore never appears in user >+ code. */ >+ if (/*CONSTCOND*/ 0) >+ goto yyerrorlab; > >+ /* Do not reclaim the symbols of the rule whose action triggered >+ this YYERROR. */ >+ YYPOPSTACK(yylen); >+ yylen = 0; >+ YY_STACK_PRINT(yyss, yyssp); >+ yystate = *yyssp; >+ goto yyerrlab1; > > /*-------------------------------------------------------------. > | yyerrlab1 -- common code for both syntax error and YYERROR. | > `-------------------------------------------------------------*/ > yyerrlab1: >- yyerrstatus = 3; /* Each real token shifted decrements this. */ >+ yyerrstatus = 3; /* Each real token shifted decrements this. */ > >- for (;;) >+ for (;;) > { >- yyn = yypact[yystate]; >- if (!yypact_value_is_default (yyn)) >+ yyn = yypact[yystate]; >+ if (!yypact_value_is_default(yyn)) > { >- yyn += YYTERROR; >- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) >+ yyn += YYTERROR; >+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) > { >- yyn = yytable[yyn]; >- if (0 < yyn) >- break; >+ yyn = yytable[yyn]; >+ if (0 < yyn) >+ break; > } > } > >- /* Pop the current state because it cannot handle the error token. */ >- if (yyssp == yyss) >- YYABORT; >- >+ /* Pop the current state because it cannot handle the error token. */ >+ if (yyssp == yyss) >+ YYABORT; > >- yydestruct ("Error: popping", >- yystos[yystate], yyvsp, context); >- YYPOPSTACK (1); >- yystate = *yyssp; >- YY_STACK_PRINT (yyss, yyssp); >+ yydestruct("Error: popping", yystos[yystate], yyvsp, context); >+ YYPOPSTACK(1); >+ yystate = *yyssp; >+ YY_STACK_PRINT(yyss, yyssp); > } > >- YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN >- *++yyvsp = yylval; >- YY_IGNORE_MAYBE_UNINITIALIZED_END >- >+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN >+ *++yyvsp = yylval; >+ YY_IGNORE_MAYBE_UNINITIALIZED_END > >- /* Shift the error token. */ >- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); >- >- yystate = yyn; >- goto yynewstate; >+ /* Shift the error token. */ >+ YY_SYMBOL_PRINT("Shifting", yystos[yyn], yyvsp, yylsp); > >+ yystate = yyn; >+ goto yynewstate; > > /*-------------------------------------. > | yyacceptlab -- YYACCEPT comes here. | > `-------------------------------------*/ > yyacceptlab: >- yyresult = 0; >- goto yyreturn; >+ yyresult = 0; >+ goto yyreturn; > > /*-----------------------------------. > | yyabortlab -- YYABORT comes here. | > `-----------------------------------*/ > yyabortlab: >- yyresult = 1; >- goto yyreturn; >+ yyresult = 1; >+ goto yyreturn; > > #if !defined yyoverflow || YYERROR_VERBOSE > /*-------------------------------------------------. > | yyexhaustedlab -- memory exhaustion comes here. | > `-------------------------------------------------*/ > yyexhaustedlab: >- yyerror (context, YY_("memory exhausted")); >- yyresult = 2; >- /* Fall through. */ >+ yyerror(context, YY_("memory exhausted")); >+ yyresult = 2; >+ /* Fall through. */ > #endif > > yyreturn: >- if (yychar != YYEMPTY) >+ if (yychar != YYEMPTY) > { >- /* Make sure we have latest lookahead translation. See comments at >- user semantic actions for why this is necessary. */ >- yytoken = YYTRANSLATE (yychar); >- yydestruct ("Cleanup: discarding lookahead", >- yytoken, &yylval, context); >+ /* Make sure we have latest lookahead translation. See comments at >+ user semantic actions for why this is necessary. */ >+ yytoken = YYTRANSLATE(yychar); >+ yydestruct("Cleanup: discarding lookahead", yytoken, &yylval, context); > } >- /* Do not reclaim the symbols of the rule whose action triggered >- this YYABORT or YYACCEPT. */ >- YYPOPSTACK (yylen); >- YY_STACK_PRINT (yyss, yyssp); >- while (yyssp != yyss) >+ /* Do not reclaim the symbols of the rule whose action triggered >+ this YYABORT or YYACCEPT. */ >+ YYPOPSTACK(yylen); >+ YY_STACK_PRINT(yyss, yyssp); >+ while (yyssp != yyss) > { >- yydestruct ("Cleanup: popping", >- yystos[*yyssp], yyvsp, context); >- YYPOPSTACK (1); >+ yydestruct("Cleanup: popping", yystos[*yyssp], yyvsp, context); >+ YYPOPSTACK(1); > } > #ifndef yyoverflow >- if (yyss != yyssa) >- YYSTACK_FREE (yyss); >+ if (yyss != yyssa) >+ YYSTACK_FREE(yyss); > #endif > #if YYERROR_VERBOSE >- if (yymsg != yymsgbuf) >- YYSTACK_FREE (yymsg); >+ if (yymsg != yymsgbuf) >+ YYSTACK_FREE(yymsg); > #endif >- return yyresult; >+ return yyresult; > } > >- >- > int yylex(YYSTYPE *lvalp, Context *context) > { >- pp::Token *token = context->token; >+ angle::pp::Token *token = context->token; > if (!context->parsePresetToken) > { > context->lexer->lex(token); >@@ -1927,67 +1782,69 @@ int yylex(YYSTYPE *lvalp, Context *context) > > switch (token->type) > { >- case pp::Token::CONST_INT: { >- unsigned int val = 0; >- int testVal = 0; >- if (!token->uValue(&val) || (!token->iValue(&testVal) && >- context->errorSettings.integerLiteralsMustFit32BitSignedRange)) >+ case angle::pp::Token::CONST_INT: > { >- context->diagnostics->report(pp::Diagnostics::PP_INTEGER_OVERFLOW, >- token->location, token->text); >- *(context->valid) = false; >+ unsigned int val = 0; >+ int testVal = 0; >+ if (!token->uValue(&val) || >+ (!token->iValue(&testVal) && >+ context->errorSettings.integerLiteralsMustFit32BitSignedRange)) >+ { >+ context->diagnostics->report(angle::pp::Diagnostics::PP_INTEGER_OVERFLOW, >+ token->location, token->text); >+ *(context->valid) = false; >+ } >+ *lvalp = static_cast<YYSTYPE>(val); >+ type = TOK_CONST_INT; >+ break; > } >- *lvalp = static_cast<YYSTYPE>(val); >- type = TOK_CONST_INT; >- break; >- } >- case pp::Token::IDENTIFIER: >- *lvalp = static_cast<YYSTYPE>(-1); >- type = TOK_IDENTIFIER; >- break; >- case pp::Token::OP_OR: >- type = TOK_OP_OR; >- break; >- case pp::Token::OP_AND: >- type = TOK_OP_AND; >- break; >- case pp::Token::OP_NE: >- type = TOK_OP_NE; >- break; >- case pp::Token::OP_EQ: >- type = TOK_OP_EQ; >- break; >- case pp::Token::OP_GE: >- type = TOK_OP_GE; >- break; >- case pp::Token::OP_LE: >- type = TOK_OP_LE; >- break; >- case pp::Token::OP_RIGHT: >- type = TOK_OP_RIGHT; >- break; >- case pp::Token::OP_LEFT: >- type = TOK_OP_LEFT; >- break; >- case '|': >- case '^': >- case '&': >- case '>': >- case '<': >- case '-': >- case '+': >- case '%': >- case '/': >- case '*': >- case '!': >- case '~': >- case '(': >- case ')': >- type = token->type; >- break; >+ case angle::pp::Token::IDENTIFIER: >+ *lvalp = static_cast<YYSTYPE>(-1); >+ type = TOK_IDENTIFIER; >+ break; >+ case angle::pp::Token::OP_OR: >+ type = TOK_OP_OR; >+ break; >+ case angle::pp::Token::OP_AND: >+ type = TOK_OP_AND; >+ break; >+ case angle::pp::Token::OP_NE: >+ type = TOK_OP_NE; >+ break; >+ case angle::pp::Token::OP_EQ: >+ type = TOK_OP_EQ; >+ break; >+ case angle::pp::Token::OP_GE: >+ type = TOK_OP_GE; >+ break; >+ case angle::pp::Token::OP_LE: >+ type = TOK_OP_LE; >+ break; >+ case angle::pp::Token::OP_RIGHT: >+ type = TOK_OP_RIGHT; >+ break; >+ case angle::pp::Token::OP_LEFT: >+ type = TOK_OP_LEFT; >+ break; >+ case '|': >+ case '^': >+ case '&': >+ case '>': >+ case '<': >+ case '-': >+ case '+': >+ case '%': >+ case '/': >+ case '*': >+ case '!': >+ case '~': >+ case '(': >+ case ')': >+ type = token->type; >+ break; > >- default: >- break; >+ default: >+ break; > } > > return type; >@@ -1995,18 +1852,19 @@ int yylex(YYSTYPE *lvalp, Context *context) > > void yyerror(Context *context, const char *reason) > { >- context->diagnostics->report(pp::Diagnostics::PP_INVALID_EXPRESSION, >- context->token->location, >- reason); >+ context->diagnostics->report(angle::pp::Diagnostics::PP_INVALID_EXPRESSION, >+ context->token->location, reason); > } > >-namespace pp { >+namespace angle >+{ > >-ExpressionParser::ExpressionParser(Lexer *lexer, Diagnostics *diagnostics) >- : mLexer(lexer), >- mDiagnostics(diagnostics) >+namespace pp > { >-} >+ >+ExpressionParser::ExpressionParser(Lexer *lexer, Diagnostics *diagnostics) >+ : mLexer(lexer), mDiagnostics(diagnostics) >+{} > > bool ExpressionParser::parse(Token *token, > int *result, >@@ -2015,32 +1873,34 @@ bool ExpressionParser::parse(Token *token, > bool *valid) > { > Context context; >- context.diagnostics = mDiagnostics; >- context.lexer = mLexer; >- context.token = token; >- context.result = result; >- context.ignoreErrors = 0; >+ context.diagnostics = mDiagnostics; >+ context.lexer = mLexer; >+ context.token = token; >+ context.result = result; >+ context.ignoreErrors = 0; > context.parsePresetToken = parsePresetToken; > context.errorSettings = errorSettings; > context.valid = valid; >- int ret = yyparse(&context); >+ int ret = yyparse(&context); > switch (ret) > { >- case 0: >- case 1: >- break; >+ case 0: >+ case 1: >+ break; > >- case 2: >- mDiagnostics->report(Diagnostics::PP_OUT_OF_MEMORY, token->location, ""); >- break; >+ case 2: >+ mDiagnostics->report(Diagnostics::PP_OUT_OF_MEMORY, token->location, ""); >+ break; > >- default: >- assert(false); >- mDiagnostics->report(Diagnostics::PP_INTERNAL_ERROR, token->location, ""); >- break; >+ default: >+ assert(false); >+ mDiagnostics->report(Diagnostics::PP_INTERNAL_ERROR, token->location, ""); >+ break; > } > > return ret == 0; > } > > } // namespace pp >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.h >index 0f2901b8786..c5cd7f7d8bb 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.h >@@ -10,6 +10,9 @@ > #include "common/angleutils.h" > #include "compiler/preprocessor/DiagnosticsBase.h" > >+namespace angle >+{ >+ > namespace pp > { > >@@ -40,4 +43,6 @@ class ExpressionParser : angle::NonCopyable > > } // namespace pp > >+} // namespace angle >+ > #endif // COMPILER_PREPROCESSOR_EXPRESSIONPARSER_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.y b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.y >index 68d7cc3958c..6ddf9122c71 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.y >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.y >@@ -59,13 +59,13 @@ typedef uint32_t UNSIGNED_TYPE; > namespace { > struct Context > { >- pp::Diagnostics* diagnostics; >- pp::Lexer* lexer; >- pp::Token* token; >+ angle::pp::Diagnostics *diagnostics; >+ angle::pp::Lexer *lexer; >+ angle::pp::Token *token; > int* result; > bool parsePresetToken; > >- pp::ExpressionParser::ErrorSettings errorSettings; >+ angle::pp::ExpressionParser::ErrorSettings errorSettings; > bool *valid; > > void startIgnoreErrors() { ++ignoreErrors; } >@@ -201,7 +201,7 @@ expression > std::ostringstream stream; > stream << $1 << " >> " << $3; > std::string text = stream.str(); >- context->diagnostics->report(pp::Diagnostics::PP_UNDEFINED_SHIFT, >+ context->diagnostics->report(angle::pp::Diagnostics::PP_UNDEFINED_SHIFT, > context->token->location, > text.c_str()); > *(context->valid) = false; >@@ -226,7 +226,7 @@ expression > std::ostringstream stream; > stream << $1 << " << " << $3; > std::string text = stream.str(); >- context->diagnostics->report(pp::Diagnostics::PP_UNDEFINED_SHIFT, >+ context->diagnostics->report(angle::pp::Diagnostics::PP_UNDEFINED_SHIFT, > context->token->location, > text.c_str()); > *(context->valid) = false; >@@ -254,7 +254,7 @@ expression > std::ostringstream stream; > stream << $1 << " % " << $3; > std::string text = stream.str(); >- context->diagnostics->report(pp::Diagnostics::PP_DIVISION_BY_ZERO, >+ context->diagnostics->report(angle::pp::Diagnostics::PP_DIVISION_BY_ZERO, > context->token->location, > text.c_str()); > *(context->valid) = false; >@@ -280,7 +280,7 @@ expression > std::ostringstream stream; > stream << $1 << " / " << $3; > std::string text = stream.str(); >- context->diagnostics->report(pp::Diagnostics::PP_DIVISION_BY_ZERO, >+ context->diagnostics->report(angle::pp::Diagnostics::PP_DIVISION_BY_ZERO, > context->token->location, > text.c_str()); > *(context->valid) = false; >@@ -332,7 +332,7 @@ expression > > int yylex(YYSTYPE *lvalp, Context *context) > { >- pp::Token *token = context->token; >+ angle::pp::Token *token = context->token; > if (!context->parsePresetToken) > { > context->lexer->lex(token); >@@ -343,13 +343,13 @@ int yylex(YYSTYPE *lvalp, Context *context) > > switch (token->type) > { >- case pp::Token::CONST_INT: { >+ case angle::pp::Token::CONST_INT: { > unsigned int val = 0; > int testVal = 0; > if (!token->uValue(&val) || (!token->iValue(&testVal) && > context->errorSettings.integerLiteralsMustFit32BitSignedRange)) > { >- context->diagnostics->report(pp::Diagnostics::PP_INTEGER_OVERFLOW, >+ context->diagnostics->report(angle::pp::Diagnostics::PP_INTEGER_OVERFLOW, > token->location, token->text); > *(context->valid) = false; > } >@@ -357,32 +357,32 @@ int yylex(YYSTYPE *lvalp, Context *context) > type = TOK_CONST_INT; > break; > } >- case pp::Token::IDENTIFIER: >+ case angle::pp::Token::IDENTIFIER: > *lvalp = static_cast<YYSTYPE>(-1); > type = TOK_IDENTIFIER; > break; >- case pp::Token::OP_OR: >+ case angle::pp::Token::OP_OR: > type = TOK_OP_OR; > break; >- case pp::Token::OP_AND: >+ case angle::pp::Token::OP_AND: > type = TOK_OP_AND; > break; >- case pp::Token::OP_NE: >+ case angle::pp::Token::OP_NE: > type = TOK_OP_NE; > break; >- case pp::Token::OP_EQ: >+ case angle::pp::Token::OP_EQ: > type = TOK_OP_EQ; > break; >- case pp::Token::OP_GE: >+ case angle::pp::Token::OP_GE: > type = TOK_OP_GE; > break; >- case pp::Token::OP_LE: >+ case angle::pp::Token::OP_LE: > type = TOK_OP_LE; > break; >- case pp::Token::OP_RIGHT: >+ case angle::pp::Token::OP_RIGHT: > type = TOK_OP_RIGHT; > break; >- case pp::Token::OP_LEFT: >+ case angle::pp::Token::OP_LEFT: > type = TOK_OP_LEFT; > break; > case '|': >@@ -411,11 +411,13 @@ int yylex(YYSTYPE *lvalp, Context *context) > > void yyerror(Context *context, const char *reason) > { >- context->diagnostics->report(pp::Diagnostics::PP_INVALID_EXPRESSION, >+ context->diagnostics->report(angle::pp::Diagnostics::PP_INVALID_EXPRESSION, > context->token->location, > reason); > } > >+namespace angle { >+ > namespace pp { > > ExpressionParser::ExpressionParser(Lexer *lexer, Diagnostics *diagnostics) >@@ -460,3 +462,5 @@ bool ExpressionParser::parse(Token *token, > } > > } // namespace pp >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.cpp >index 0f2327b823d..8d1cac5386b 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.cpp >@@ -11,16 +11,15 @@ > > #include "common/debug.h" > >-namespace pp >+namespace angle > { > >-Input::Input() : mCount(0), mString(0) >+namespace pp > { >-} > >-Input::~Input() >-{ >-} >+Input::Input() : mCount(0), mString(0) {} >+ >+Input::~Input() {} > > Input::Input(size_t count, const char *const string[], const int length[]) > : mCount(count), mString(string) >@@ -127,3 +126,5 @@ size_t Input::read(char *buf, size_t maxSize, int *lineNo) > } > > } // namespace pp >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.h >index 8c7c7ee19ee..e2150f899e4 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.h >@@ -10,6 +10,9 @@ > #include <cstddef> > #include <vector> > >+namespace angle >+{ >+ > namespace pp > { > >@@ -51,4 +54,6 @@ class Input > > } // namespace pp > >+} // namespace angle >+ > #endif // COMPILER_PREPROCESSOR_INPUT_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Lexer.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Lexer.cpp >index 89cb3cf44e4..4fc7797f567 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Lexer.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Lexer.cpp >@@ -6,11 +6,14 @@ > > #include "compiler/preprocessor/Lexer.h" > >-namespace pp >+namespace angle > { > >-Lexer::~Lexer() >+namespace pp > { >-} >+ >+Lexer::~Lexer() {} > > } // namespace pp >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Lexer.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Lexer.h >index 775bc0a202a..c26770745fc 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Lexer.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Lexer.h >@@ -9,6 +9,9 @@ > > #include "common/angleutils.h" > >+namespace angle >+{ >+ > namespace pp > { > >@@ -24,4 +27,6 @@ class Lexer : angle::NonCopyable > > } // namespace pp > >+} // namespace angle >+ > #endif // COMPILER_PREPROCESSOR_LEXER_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.cpp >index 52e2312fe60..a7a2f87b55f 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.cpp >@@ -9,16 +9,15 @@ > #include "common/angleutils.h" > #include "compiler/preprocessor/Token.h" > >-namespace pp >+namespace angle > { > >-Macro::Macro() : predefined(false), disabled(false), expansionCount(0), type(kTypeObj) >+namespace pp > { >-} > >-Macro::~Macro() >-{ >-} >+Macro::Macro() : predefined(false), disabled(false), expansionCount(0), type(kTypeObj) {} >+ >+Macro::~Macro() {} > > bool Macro::equals(const Macro &other) const > { >@@ -42,3 +41,5 @@ void PredefineMacro(MacroSet *macroSet, const char *name, int value) > } > > } // namespace pp >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.h >index c42e172ef9d..d7880f4eb3c 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.h >@@ -12,6 +12,9 @@ > #include <string> > #include <vector> > >+namespace angle >+{ >+ > namespace pp > { > >@@ -47,4 +50,6 @@ void PredefineMacro(MacroSet *macroSet, const char *name, int value); > > } // namespace pp > >+} // namespace angle >+ > #endif // COMPILER_PREPROCESSOR_MACRO_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.cpp >index 6e2accf29da..32083c3e354 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.cpp >@@ -6,12 +6,16 @@ > > #include "compiler/preprocessor/MacroExpander.h" > >+#include <GLSLANG/ShaderLang.h> > #include <algorithm> > > #include "common/debug.h" > #include "compiler/preprocessor/DiagnosticsBase.h" > #include "compiler/preprocessor/Token.h" > >+namespace angle >+{ >+ > namespace pp > { > >@@ -70,7 +74,7 @@ MacroExpander::ScopedMacroReenabler::ScopedMacroReenabler(MacroExpander *expande > MacroExpander::ScopedMacroReenabler::~ScopedMacroReenabler() > { > mExpander->mDeferReenablingMacros = false; >- for (const auto& macro : mExpander->mMacrosToReenable) >+ for (const std::shared_ptr<Macro> ¯o : mExpander->mMacrosToReenable) > { > // Copying the string here by using substr is a check for use-after-free. It detects > // use-after-free more reliably than just toggling the disabled flag. >@@ -83,15 +87,16 @@ MacroExpander::ScopedMacroReenabler::~ScopedMacroReenabler() > MacroExpander::MacroExpander(Lexer *lexer, > MacroSet *macroSet, > Diagnostics *diagnostics, >- int allowedMacroExpansionDepth) >+ const PreprocessorSettings &settings, >+ bool parseDefined) > : mLexer(lexer), > mMacroSet(macroSet), > mDiagnostics(diagnostics), >+ mParseDefined(parseDefined), > mTotalTokensInContexts(0), >- mAllowedMacroExpansionDepth(allowedMacroExpansionDepth), >+ mSettings(settings), > mDeferReenablingMacros(false) >-{ >-} >+{} > > MacroExpander::~MacroExpander() > { >@@ -111,6 +116,51 @@ void MacroExpander::lex(Token *token) > if (token->type != Token::IDENTIFIER) > break; > >+ // Defined operator is parsed here since it may be generated by macro expansion. >+ // Defined operator produced by macro expansion has undefined behavior according to C++ >+ // spec, which the GLSL spec references (see C++14 draft spec section 16.1.4), but this >+ // behavior is needed for passing dEQP tests, which enforce stricter compatibility between >+ // implementations. >+ if (mParseDefined && token->text == kDefined) >+ { >+ // Defined inside a macro is forbidden in WebGL. >+ if (!mContextStack.empty() && sh::IsWebGLBasedSpec(mSettings.shaderSpec)) >+ break; >+ >+ bool paren = false; >+ getToken(token); >+ if (token->type == '(') >+ { >+ paren = true; >+ getToken(token); >+ } >+ if (token->type != Token::IDENTIFIER) >+ { >+ mDiagnostics->report(Diagnostics::PP_UNEXPECTED_TOKEN, token->location, >+ token->text); >+ break; >+ } >+ auto iter = mMacroSet->find(token->text); >+ std::string expression = iter != mMacroSet->end() ? "1" : "0"; >+ >+ if (paren) >+ { >+ getToken(token); >+ if (token->type != ')') >+ { >+ mDiagnostics->report(Diagnostics::PP_UNEXPECTED_TOKEN, token->location, >+ token->text); >+ break; >+ } >+ } >+ >+ // We have a valid defined operator. >+ // Convert the current token into a CONST_INT token. >+ token->type = Token::CONST_INT; >+ token->text = expression; >+ break; >+ } >+ > if (token->expansionDisabled()) > break; > >@@ -383,13 +433,15 @@ bool MacroExpander::collectMacroArgs(const Macro ¯o, > for (auto &arg : *args) > { > TokenLexer lexer(&arg); >- if (mAllowedMacroExpansionDepth < 1) >+ if (mSettings.maxMacroExpansionDepth < 1) > { > mDiagnostics->report(Diagnostics::PP_MACRO_INVOCATION_CHAIN_TOO_DEEP, token.location, > token.text); > return false; > } >- MacroExpander expander(&lexer, mMacroSet, mDiagnostics, mAllowedMacroExpansionDepth - 1); >+ PreprocessorSettings nestedSettings(mSettings.shaderSpec); >+ nestedSettings.maxMacroExpansionDepth = mSettings.maxMacroExpansionDepth - 1; >+ MacroExpander expander(&lexer, mMacroSet, mDiagnostics, nestedSettings, mParseDefined); > > arg.clear(); > expander.lex(&token); >@@ -454,13 +506,9 @@ void MacroExpander::replaceMacroParams(const Macro ¯o, > } > } > >-MacroExpander::MacroContext::MacroContext() : macro(0), index(0) >-{ >-} >+MacroExpander::MacroContext::MacroContext() : macro(0), index(0) {} > >-MacroExpander::MacroContext::~MacroContext() >-{ >-} >+MacroExpander::MacroContext::~MacroContext() {} > > bool MacroExpander::MacroContext::empty() const > { >@@ -479,3 +527,5 @@ void MacroExpander::MacroContext::unget() > } > > } // namespace pp >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.h >index fae7676fb0f..837bd73302e 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.h >@@ -12,6 +12,10 @@ > > #include "compiler/preprocessor/Lexer.h" > #include "compiler/preprocessor/Macro.h" >+#include "compiler/preprocessor/Preprocessor.h" >+ >+namespace angle >+{ > > namespace pp > { >@@ -25,7 +29,8 @@ class MacroExpander : public Lexer > MacroExpander(Lexer *lexer, > MacroSet *macroSet, > Diagnostics *diagnostics, >- int allowedMacroExpansionDepth); >+ const PreprocessorSettings &settings, >+ bool parseDefined); > ~MacroExpander() override; > > void lex(Token *token) override; >@@ -65,12 +70,13 @@ class MacroExpander : public Lexer > Lexer *mLexer; > MacroSet *mMacroSet; > Diagnostics *mDiagnostics; >+ bool mParseDefined; > > std::unique_ptr<Token> mReserveToken; > std::vector<MacroContext *> mContextStack; > size_t mTotalTokensInContexts; > >- int mAllowedMacroExpansionDepth; >+ PreprocessorSettings mSettings; > > bool mDeferReenablingMacros; > std::vector<std::shared_ptr<Macro>> mMacrosToReenable; >@@ -80,4 +86,6 @@ class MacroExpander : public Lexer > > } // namespace pp > >+} // namespace angle >+ > #endif // COMPILER_PREPROCESSOR_MACROEXPANDER_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Preprocessor.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Preprocessor.cpp >index 349c7b06c71..ec6f7e14306 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Preprocessor.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Preprocessor.cpp >@@ -14,6 +14,9 @@ > #include "compiler/preprocessor/Token.h" > #include "compiler/preprocessor/Tokenizer.h" > >+namespace angle >+{ >+ > namespace pp > { > >@@ -30,14 +33,9 @@ struct PreprocessorImpl > const PreprocessorSettings &settings) > : diagnostics(diag), > tokenizer(diag), >- directiveParser(&tokenizer, >- ¯oSet, >- diag, >- directiveHandler, >- settings.maxMacroExpansionDepth), >- macroExpander(&directiveParser, ¯oSet, diag, settings.maxMacroExpansionDepth) >- { >- } >+ directiveParser(&tokenizer, ¯oSet, diag, directiveHandler, settings), >+ macroExpander(&directiveParser, ¯oSet, diag, settings, false) >+ {} > }; > > Preprocessor::Preprocessor(Diagnostics *diagnostics, >@@ -105,3 +103,5 @@ void Preprocessor::setMaxTokenSize(size_t maxTokenSize) > } > > } // namespace pp >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Preprocessor.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Preprocessor.h >index 2fe504f7f9b..58b4a70ec75 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Preprocessor.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Preprocessor.h >@@ -9,8 +9,12 @@ > > #include <cstddef> > >+#include "GLSLANG/ShaderLang.h" > #include "common/angleutils.h" > >+namespace angle >+{ >+ > namespace pp > { > >@@ -19,10 +23,16 @@ class DirectiveHandler; > struct PreprocessorImpl; > struct Token; > >-struct PreprocessorSettings : private angle::NonCopyable >+struct PreprocessorSettings final > { >- PreprocessorSettings() : maxMacroExpansionDepth(1000) {} >+ PreprocessorSettings(ShShaderSpec shaderSpec) >+ : maxMacroExpansionDepth(1000), shaderSpec(shaderSpec) >+ {} >+ >+ PreprocessorSettings(const PreprocessorSettings &other) = default; >+ > int maxMacroExpansionDepth; >+ ShShaderSpec shaderSpec; > }; > > class Preprocessor : angle::NonCopyable >@@ -57,4 +67,6 @@ class Preprocessor : angle::NonCopyable > > } // namespace pp > >+} // namespace angle >+ > #endif // COMPILER_PREPROCESSOR_PREPROCESSOR_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/SourceLocation.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/SourceLocation.h >index 51908a3b4bd..61d1af057cd 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/SourceLocation.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/SourceLocation.h >@@ -7,6 +7,9 @@ > #ifndef COMPILER_PREPROCESSOR_SOURCELOCATION_H_ > #define COMPILER_PREPROCESSOR_SOURCELOCATION_H_ > >+namespace angle >+{ >+ > namespace pp > { > >@@ -36,4 +39,6 @@ inline bool operator!=(const SourceLocation &lhs, const SourceLocation &rhs) > > } // namespace pp > >+} // namespace angle >+ > #endif // COMPILER_PREPROCESSOR_SOURCELOCATION_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Token.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Token.cpp >index ce0ce94f49a..45b917bf03c 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Token.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Token.cpp >@@ -9,6 +9,9 @@ > #include "common/debug.h" > #include "compiler/preprocessor/numeric_lex.h" > >+namespace angle >+{ >+ > namespace pp > { > >@@ -62,12 +65,6 @@ bool Token::uValue(unsigned int *value) const > return numeric_lex_int(text, value); > } > >-bool Token::fValue(float *value) const >-{ >- ASSERT(type == CONST_FLOAT); >- return numeric_lex_float(text, value); >-} >- > std::ostream &operator<<(std::ostream &out, const Token &token) > { > if (token.hasLeadingSpace()) >@@ -78,3 +75,5 @@ std::ostream &operator<<(std::ostream &out, const Token &token) > } > > } // namespace pp >+ >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Token.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Token.h >index 26732ab64d2..436c5b6db74 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Token.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Token.h >@@ -12,6 +12,9 @@ > > #include "compiler/preprocessor/SourceLocation.h" > >+namespace angle >+{ >+ > namespace pp > { > >@@ -21,7 +24,7 @@ struct Token > { > // Calling this ERROR causes a conflict with wingdi.h > GOT_ERROR = -1, >- LAST = 0, // EOF. >+ LAST = 0, // EOF. > > IDENTIFIER = 258, > >@@ -84,7 +87,6 @@ struct Token > // Returns false if the parsed value cannot fit into an int or float. > bool iValue(int *value) const; > bool uValue(unsigned int *value) const; >- bool fValue(float *value) const; > > int type; > unsigned int flags; >@@ -104,6 +106,10 @@ inline bool operator!=(const Token &lhs, const Token &rhs) > > std::ostream &operator<<(std::ostream &out, const Token &token); > >-} // namepsace pp >+constexpr char kDefined[] = "defined"; >+ >+} // namespace pp >+ >+} // namespace angle > > #endif // COMPILER_PREPROCESSOR_TOKEN_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.cpp >index d7fad68f1fe..2ce67b73863 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.cpp >@@ -7,457 +7,355 @@ > > // This file is auto-generated by generate_parser.sh. DO NOT EDIT! > >- >- >-#define YY_INT_ALIGNED short int >+#define YY_INT_ALIGNED short int > > /* A lexical scanner generated by flex */ > >- >- >- >- >- >- >- >- >- > #define FLEX_SCANNER > #define YY_FLEX_MAJOR_VERSION 2 > #define YY_FLEX_MINOR_VERSION 6 > #define YY_FLEX_SUBMINOR_VERSION 4 > #if YY_FLEX_SUBMINOR_VERSION > 0 >-#define FLEX_BETA >+# define FLEX_BETA > #endif > >- >- >- >- >- >- >- >- >- >- >- >- >- > #ifdef yy_create_buffer >-#define pp_create_buffer_ALREADY_DEFINED >+# define pp_create_buffer_ALREADY_DEFINED > #else >-#define yy_create_buffer pp_create_buffer >+# define yy_create_buffer pp_create_buffer > #endif > >- > #ifdef yy_delete_buffer >-#define pp_delete_buffer_ALREADY_DEFINED >+# define pp_delete_buffer_ALREADY_DEFINED > #else >-#define yy_delete_buffer pp_delete_buffer >+# define yy_delete_buffer pp_delete_buffer > #endif > >- > #ifdef yy_scan_buffer >-#define pp_scan_buffer_ALREADY_DEFINED >+# define pp_scan_buffer_ALREADY_DEFINED > #else >-#define yy_scan_buffer pp_scan_buffer >+# define yy_scan_buffer pp_scan_buffer > #endif > >- > #ifdef yy_scan_string >-#define pp_scan_string_ALREADY_DEFINED >+# define pp_scan_string_ALREADY_DEFINED > #else >-#define yy_scan_string pp_scan_string >+# define yy_scan_string pp_scan_string > #endif > >- > #ifdef yy_scan_bytes >-#define pp_scan_bytes_ALREADY_DEFINED >+# define pp_scan_bytes_ALREADY_DEFINED > #else >-#define yy_scan_bytes pp_scan_bytes >+# define yy_scan_bytes pp_scan_bytes > #endif > >- > #ifdef yy_init_buffer >-#define pp_init_buffer_ALREADY_DEFINED >+# define pp_init_buffer_ALREADY_DEFINED > #else >-#define yy_init_buffer pp_init_buffer >+# define yy_init_buffer pp_init_buffer > #endif > >- > #ifdef yy_flush_buffer >-#define pp_flush_buffer_ALREADY_DEFINED >+# define pp_flush_buffer_ALREADY_DEFINED > #else >-#define yy_flush_buffer pp_flush_buffer >+# define yy_flush_buffer pp_flush_buffer > #endif > >- > #ifdef yy_load_buffer_state >-#define pp_load_buffer_state_ALREADY_DEFINED >+# define pp_load_buffer_state_ALREADY_DEFINED > #else >-#define yy_load_buffer_state pp_load_buffer_state >+# define yy_load_buffer_state pp_load_buffer_state > #endif > >- > #ifdef yy_switch_to_buffer >-#define pp_switch_to_buffer_ALREADY_DEFINED >+# define pp_switch_to_buffer_ALREADY_DEFINED > #else >-#define yy_switch_to_buffer pp_switch_to_buffer >+# define yy_switch_to_buffer pp_switch_to_buffer > #endif > >- > #ifdef yypush_buffer_state >-#define pppush_buffer_state_ALREADY_DEFINED >+# define pppush_buffer_state_ALREADY_DEFINED > #else >-#define yypush_buffer_state pppush_buffer_state >+# define yypush_buffer_state pppush_buffer_state > #endif > >- > #ifdef yypop_buffer_state >-#define pppop_buffer_state_ALREADY_DEFINED >+# define pppop_buffer_state_ALREADY_DEFINED > #else >-#define yypop_buffer_state pppop_buffer_state >+# define yypop_buffer_state pppop_buffer_state > #endif > >- > #ifdef yyensure_buffer_stack >-#define ppensure_buffer_stack_ALREADY_DEFINED >+# define ppensure_buffer_stack_ALREADY_DEFINED > #else >-#define yyensure_buffer_stack ppensure_buffer_stack >+# define yyensure_buffer_stack ppensure_buffer_stack > #endif > >- > #ifdef yylex >-#define pplex_ALREADY_DEFINED >+# define pplex_ALREADY_DEFINED > #else >-#define yylex pplex >+# define yylex pplex > #endif > >- > #ifdef yyrestart >-#define pprestart_ALREADY_DEFINED >+# define pprestart_ALREADY_DEFINED > #else >-#define yyrestart pprestart >+# define yyrestart pprestart > #endif > >- > #ifdef yylex_init >-#define pplex_init_ALREADY_DEFINED >+# define pplex_init_ALREADY_DEFINED > #else >-#define yylex_init pplex_init >+# define yylex_init pplex_init > #endif > >- > #ifdef yylex_init_extra >-#define pplex_init_extra_ALREADY_DEFINED >+# define pplex_init_extra_ALREADY_DEFINED > #else >-#define yylex_init_extra pplex_init_extra >+# define yylex_init_extra pplex_init_extra > #endif > >- > #ifdef yylex_destroy >-#define pplex_destroy_ALREADY_DEFINED >+# define pplex_destroy_ALREADY_DEFINED > #else >-#define yylex_destroy pplex_destroy >+# define yylex_destroy pplex_destroy > #endif > >- > #ifdef yyget_debug >-#define ppget_debug_ALREADY_DEFINED >+# define ppget_debug_ALREADY_DEFINED > #else >-#define yyget_debug ppget_debug >+# define yyget_debug ppget_debug > #endif > >- > #ifdef yyset_debug >-#define ppset_debug_ALREADY_DEFINED >+# define ppset_debug_ALREADY_DEFINED > #else >-#define yyset_debug ppset_debug >+# define yyset_debug ppset_debug > #endif > >- > #ifdef yyget_extra >-#define ppget_extra_ALREADY_DEFINED >+# define ppget_extra_ALREADY_DEFINED > #else >-#define yyget_extra ppget_extra >+# define yyget_extra ppget_extra > #endif > >- > #ifdef yyset_extra >-#define ppset_extra_ALREADY_DEFINED >+# define ppset_extra_ALREADY_DEFINED > #else >-#define yyset_extra ppset_extra >+# define yyset_extra ppset_extra > #endif > >- > #ifdef yyget_in >-#define ppget_in_ALREADY_DEFINED >+# define ppget_in_ALREADY_DEFINED > #else >-#define yyget_in ppget_in >+# define yyget_in ppget_in > #endif > >- > #ifdef yyset_in >-#define ppset_in_ALREADY_DEFINED >+# define ppset_in_ALREADY_DEFINED > #else >-#define yyset_in ppset_in >+# define yyset_in ppset_in > #endif > >- > #ifdef yyget_out >-#define ppget_out_ALREADY_DEFINED >+# define ppget_out_ALREADY_DEFINED > #else >-#define yyget_out ppget_out >+# define yyget_out ppget_out > #endif > >- > #ifdef yyset_out >-#define ppset_out_ALREADY_DEFINED >+# define ppset_out_ALREADY_DEFINED > #else >-#define yyset_out ppset_out >+# define yyset_out ppset_out > #endif > >- > #ifdef yyget_leng >-#define ppget_leng_ALREADY_DEFINED >+# define ppget_leng_ALREADY_DEFINED > #else >-#define yyget_leng ppget_leng >+# define yyget_leng ppget_leng > #endif > >- > #ifdef yyget_text >-#define ppget_text_ALREADY_DEFINED >+# define ppget_text_ALREADY_DEFINED > #else >-#define yyget_text ppget_text >+# define yyget_text ppget_text > #endif > >- > #ifdef yyget_lineno >-#define ppget_lineno_ALREADY_DEFINED >+# define ppget_lineno_ALREADY_DEFINED > #else >-#define yyget_lineno ppget_lineno >+# define yyget_lineno ppget_lineno > #endif > >- > #ifdef yyset_lineno >-#define ppset_lineno_ALREADY_DEFINED >+# define ppset_lineno_ALREADY_DEFINED > #else >-#define yyset_lineno ppset_lineno >+# define yyset_lineno ppset_lineno > #endif > >- >- > #ifdef yyget_column >-#define ppget_column_ALREADY_DEFINED >+# define ppget_column_ALREADY_DEFINED > #else >-#define yyget_column ppget_column >+# define yyget_column ppget_column > #endif > >- > #ifdef yyset_column >-#define ppset_column_ALREADY_DEFINED >+# define ppset_column_ALREADY_DEFINED > #else >-#define yyset_column ppset_column >+# define yyset_column ppset_column > #endif > >- >- > #ifdef yywrap >-#define ppwrap_ALREADY_DEFINED >+# define ppwrap_ALREADY_DEFINED > #else >-#define yywrap ppwrap >+# define yywrap ppwrap > #endif > >- >- >- >- > #ifdef yyget_lval >-#define ppget_lval_ALREADY_DEFINED >+# define ppget_lval_ALREADY_DEFINED > #else >-#define yyget_lval ppget_lval >+# define yyget_lval ppget_lval > #endif > >- > #ifdef yyset_lval >-#define ppset_lval_ALREADY_DEFINED >+# define ppset_lval_ALREADY_DEFINED > #else >-#define yyset_lval ppset_lval >+# define yyset_lval ppset_lval > #endif > >- >- >- >- > #ifdef yyget_lloc >-#define ppget_lloc_ALREADY_DEFINED >+# define ppget_lloc_ALREADY_DEFINED > #else >-#define yyget_lloc ppget_lloc >+# define yyget_lloc ppget_lloc > #endif > >- > #ifdef yyset_lloc >-#define ppset_lloc_ALREADY_DEFINED >+# define ppset_lloc_ALREADY_DEFINED > #else >-#define yyset_lloc ppset_lloc >+# define yyset_lloc ppset_lloc > #endif > >- >- >- > #ifdef yyalloc >-#define ppalloc_ALREADY_DEFINED >+# define ppalloc_ALREADY_DEFINED > #else >-#define yyalloc ppalloc >+# define yyalloc ppalloc > #endif > >- > #ifdef yyrealloc >-#define pprealloc_ALREADY_DEFINED >+# define pprealloc_ALREADY_DEFINED > #else >-#define yyrealloc pprealloc >+# define yyrealloc pprealloc > #endif > >- > #ifdef yyfree >-#define ppfree_ALREADY_DEFINED >+# define ppfree_ALREADY_DEFINED > #else >-#define yyfree ppfree >+# define yyfree ppfree > #endif > >- >- >- >- >- >- >- >- > /* First, we deal with platform-specific or compiler-specific issues. */ > > /* begin standard C headers. */ >-#include <stdio.h> >-#include <string.h> > #include <errno.h> >+#include <stdio.h> > #include <stdlib.h> >+#include <string.h> > > /* end standard C headers. */ > > /* flex integer type definitions */ > > #ifndef FLEXINT_H >-#define FLEXINT_H >+# define FLEXINT_H > > /* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */ > >-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L >+# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L > > /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, >- * if you want the limit (max/min) macros for int types. >+ * if you want the limit (max/min) macros for int types. > */ >-#ifndef __STDC_LIMIT_MACROS >-#define __STDC_LIMIT_MACROS 1 >-#endif >+# ifndef __STDC_LIMIT_MACROS >+# define __STDC_LIMIT_MACROS 1 >+# endif > >-#include <inttypes.h> >+# include <inttypes.h> > typedef int8_t flex_int8_t; > typedef uint8_t flex_uint8_t; > typedef int16_t flex_int16_t; > typedef uint16_t flex_uint16_t; > typedef int32_t flex_int32_t; > typedef uint32_t flex_uint32_t; >-#else >+# else > typedef signed char flex_int8_t; > typedef short int flex_int16_t; > typedef int flex_int32_t; >-typedef unsigned char flex_uint8_t; >+typedef unsigned char flex_uint8_t; > typedef unsigned short int flex_uint16_t; > typedef unsigned int flex_uint32_t; > > /* Limits of integral types. */ >-#ifndef INT8_MIN >-#define INT8_MIN (-128) >-#endif >-#ifndef INT16_MIN >-#define INT16_MIN (-32767-1) >-#endif >-#ifndef INT32_MIN >-#define INT32_MIN (-2147483647-1) >-#endif >-#ifndef INT8_MAX >-#define INT8_MAX (127) >-#endif >-#ifndef INT16_MAX >-#define INT16_MAX (32767) >-#endif >-#ifndef INT32_MAX >-#define INT32_MAX (2147483647) >-#endif >-#ifndef UINT8_MAX >-#define UINT8_MAX (255U) >-#endif >-#ifndef UINT16_MAX >-#define UINT16_MAX (65535U) >-#endif >-#ifndef UINT32_MAX >-#define UINT32_MAX (4294967295U) >-#endif >- >-#ifndef SIZE_MAX >-#define SIZE_MAX (~(size_t)0) >-#endif >- >-#endif /* ! C99 */ >+# ifndef INT8_MIN >+# define INT8_MIN (-128) >+# endif >+# ifndef INT16_MIN >+# define INT16_MIN (-32767 - 1) >+# endif >+# ifndef INT32_MIN >+# define INT32_MIN (-2147483647 - 1) >+# endif >+# ifndef INT8_MAX >+# define INT8_MAX (127) >+# endif >+# ifndef INT16_MAX >+# define INT16_MAX (32767) >+# endif >+# ifndef INT32_MAX >+# define INT32_MAX (2147483647) >+# endif >+# ifndef UINT8_MAX >+# define UINT8_MAX (255U) >+# endif >+# ifndef UINT16_MAX >+# define UINT16_MAX (65535U) >+# endif >+# ifndef UINT32_MAX >+# define UINT32_MAX (4294967295U) >+# endif >+ >+# ifndef SIZE_MAX >+# define SIZE_MAX (~(size_t)0) >+# endif >+ >+# endif /* ! C99 */ > > #endif /* ! FLEXINT_H */ > >- > /* begin standard C++ headers. */ > > /* TODO: this is always defined, so inline it */ > #define yyconst const > > #if defined(__GNUC__) && __GNUC__ >= 3 >-#define yynoreturn __attribute__((__noreturn__)) >+# define yynoreturn __attribute__((__noreturn__)) > #else >-#define yynoreturn >+# define yynoreturn > #endif > > /* Returned upon end-of-file. */ > #define YY_NULL 0 > >- > /* Promotes a possibly negative, possibly signed char to an > * integer in range [0..255] for use as an array index. > */ >-#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) >- >- >- >- >+#define YY_SC_TO_UI(c) ((YY_CHAR)(c)) > > /* An opaque pointer. */ > #ifndef YY_TYPEDEF_YY_SCANNER_T >-#define YY_TYPEDEF_YY_SCANNER_T >-typedef void* yyscan_t; >+# define YY_TYPEDEF_YY_SCANNER_T >+typedef void *yyscan_t; > #endif > >- >- >- >- >- >- >- >- >- >- >- >- >- >- >- >- > /* For convenience, these vars (plus the bison vars far below) > are macros in the reentrant scanner. */ > #define yyin yyg->yyin_r >@@ -469,18 +367,6 @@ typedef void* yyscan_t; > #define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) > #define yy_flex_debug yyg->yy_flex_debug_r > >- >- >- >- >- >- >- >- >- >- >- >- > /* Enter a start condition. This macro really ought to take a parameter, > * but we do it the disgusting crufty way forced on us by the ()-less > * definition of BEGIN. >@@ -495,385 +381,285 @@ typedef void* yyscan_t; > /* Action number for EOF rule of a given start state. */ > #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) > /* Special action meaning "start processing a new file". */ >-#define YY_NEW_FILE yyrestart( yyin , yyscanner ) >+#define YY_NEW_FILE yyrestart(yyin, yyscanner) > #define YY_END_OF_BUFFER_CHAR 0 > >- > /* Size of default input buffer. */ > #ifndef YY_BUF_SIZE >-#ifdef __ia64__ >+# ifdef __ia64__ > /* On IA-64, the buffer size is 16k, not 8k. > * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. > * Ditto for the __ia64__ case accordingly. > */ >-#define YY_BUF_SIZE 32768 >-#else >-#define YY_BUF_SIZE 16384 >-#endif /* __ia64__ */ >+# define YY_BUF_SIZE 32768 >+# else >+# define YY_BUF_SIZE 16384 >+# endif /* __ia64__ */ > #endif > >- > /* The state buf must be large enough to hold one state per character in the main buffer. > */ >-#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) >- >- >+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) > > #ifndef YY_TYPEDEF_YY_BUFFER_STATE >-#define YY_TYPEDEF_YY_BUFFER_STATE >+# define YY_TYPEDEF_YY_BUFFER_STATE > typedef struct yy_buffer_state *YY_BUFFER_STATE; > #endif > > #ifndef YY_TYPEDEF_YY_SIZE_T >-#define YY_TYPEDEF_YY_SIZE_T >+# define YY_TYPEDEF_YY_SIZE_T > typedef size_t yy_size_t; > #endif > >- >- >- > #define EOB_ACT_CONTINUE_SCAN 0 > #define EOB_ACT_END_OF_FILE 1 > #define EOB_ACT_LAST_MATCH 2 >- >- #define YY_LESS_LINENO(n) >- #define YY_LINENO_REWIND_TO(ptr) >- >-/* Return all but the first "n" matched characters back to the input stream. */ >-#define yyless(n) \ >- do \ >- { \ >- /* Undo effects of setting up yytext. */ \ >- int yyless_macro_arg = (n); \ >- YY_LESS_LINENO(yyless_macro_arg);\ >- *yy_cp = yyg->yy_hold_char; \ >- YY_RESTORE_YY_MORE_OFFSET \ >- yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ >- YY_DO_BEFORE_ACTION; /* set up yytext again */ \ >- } \ >- while ( 0 ) >-#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) > >+#define YY_LESS_LINENO(n) >+#define YY_LINENO_REWIND_TO(ptr) >+ >+/* Return all but the first "n" matched characters back to the input stream. */ >+#define yyless(n) \ >+ do \ >+ { \ >+ /* Undo effects of setting up yytext. */ \ >+ int yyless_macro_arg = (n); \ >+ YY_LESS_LINENO(yyless_macro_arg); \ >+ *yy_cp = yyg->yy_hold_char; \ >+ YY_RESTORE_YY_MORE_OFFSET \ >+ yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ >+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ >+ } while (0) >+#define unput(c) yyunput(c, yyg->yytext_ptr, yyscanner) > > #ifndef YY_STRUCT_YY_BUFFER_STATE >-#define YY_STRUCT_YY_BUFFER_STATE >+# define YY_STRUCT_YY_BUFFER_STATE > struct yy_buffer_state >- { >- FILE *yy_input_file; >- >- >+{ >+ FILE *yy_input_file; > >- char *yy_ch_buf; /* input buffer */ >- char *yy_buf_pos; /* current position in input buffer */ >+ char *yy_ch_buf; /* input buffer */ >+ char *yy_buf_pos; /* current position in input buffer */ > >- /* Size of input buffer in bytes, not including room for EOB >- * characters. >- */ >- int yy_buf_size; >+ /* Size of input buffer in bytes, not including room for EOB >+ * characters. >+ */ >+ int yy_buf_size; > >- /* Number of characters read into yy_ch_buf, not including EOB >- * characters. >- */ >- int yy_n_chars; >+ /* Number of characters read into yy_ch_buf, not including EOB >+ * characters. >+ */ >+ int yy_n_chars; > >- /* Whether we "own" the buffer - i.e., we know we created it, >- * and can realloc() it to grow it, and should free() it to >- * delete it. >- */ >- int yy_is_our_buffer; >+ /* Whether we "own" the buffer - i.e., we know we created it, >+ * and can realloc() it to grow it, and should free() it to >+ * delete it. >+ */ >+ int yy_is_our_buffer; > >- /* Whether this is an "interactive" input source; if so, and >- * if we're using stdio for input, then we want to use getc() >- * instead of fread(), to make sure we stop fetching input after >- * each newline. >- */ >- int yy_is_interactive; >+ /* Whether this is an "interactive" input source; if so, and >+ * if we're using stdio for input, then we want to use getc() >+ * instead of fread(), to make sure we stop fetching input after >+ * each newline. >+ */ >+ int yy_is_interactive; > >- /* Whether we're considered to be at the beginning of a line. >- * If so, '^' rules will be active on the next match, otherwise >- * not. >- */ >- int yy_at_bol; >+ /* Whether we're considered to be at the beginning of a line. >+ * If so, '^' rules will be active on the next match, otherwise >+ * not. >+ */ >+ int yy_at_bol; > > int yy_bs_lineno; /**< The line count. */ > int yy_bs_column; /**< The column count. */ > >- >- /* Whether to try to fill the input buffer when we reach the >- * end of it. >- */ >- int yy_fill_buffer; >- >- int yy_buffer_status; >- >-#define YY_BUFFER_NEW 0 >-#define YY_BUFFER_NORMAL 1 >- /* When an EOF's been seen but there's still some text to process >- * then we mark the buffer as YY_EOF_PENDING, to indicate that we >- * shouldn't try reading from the input source any more. We might >- * still have a bunch of tokens to match, though, because of >- * possible backing-up. >- * >- * When we actually see the EOF, we change the status to "new" >- * (via yyrestart()), so that the user can continue scanning by >- * just pointing yyin at a new input file. >- */ >-#define YY_BUFFER_EOF_PENDING 2 >- >- }; >+ /* Whether to try to fill the input buffer when we reach the >+ * end of it. >+ */ >+ int yy_fill_buffer; >+ >+ int yy_buffer_status; >+ >+# define YY_BUFFER_NEW 0 >+# define YY_BUFFER_NORMAL 1 >+ /* When an EOF's been seen but there's still some text to process >+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we >+ * shouldn't try reading from the input source any more. We might >+ * still have a bunch of tokens to match, though, because of >+ * possible backing-up. >+ * >+ * When we actually see the EOF, we change the status to "new" >+ * (via yyrestart()), so that the user can continue scanning by >+ * just pointing yyin at a new input file. >+ */ >+# define YY_BUFFER_EOF_PENDING 2 >+}; > #endif /* !YY_STRUCT_YY_BUFFER_STATE */ > >- >- >- > /* We provide macros for accessing buffer states in case in the > * future we want to put the buffer states in a more general > * "scanner state". > * > * Returns the top of the stack, or NULL. > */ >-#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ >- ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ >- : NULL) >+#define YY_CURRENT_BUFFER \ >+ (yyg->yy_buffer_stack ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] : NULL) > /* Same as previous macro, but useful when we know that the buffer stack is not > * NULL or when we need an lvalue. For internal use only. > */ > #define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] > >+void yyrestart(FILE *input_file, yyscan_t yyscanner); >+void yy_switch_to_buffer(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner); >+YY_BUFFER_STATE yy_create_buffer(FILE *file, int size, yyscan_t yyscanner); >+void yy_delete_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner); >+void yy_flush_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner); >+void yypush_buffer_state(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner); >+void yypop_buffer_state(yyscan_t yyscanner); > >+static void yyensure_buffer_stack(yyscan_t yyscanner); >+static void yy_load_buffer_state(yyscan_t yyscanner); >+static void yy_init_buffer(YY_BUFFER_STATE b, FILE *file, yyscan_t yyscanner); >+#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER, yyscanner) > >+YY_BUFFER_STATE yy_scan_buffer(char *base, yy_size_t size, yyscan_t yyscanner); >+YY_BUFFER_STATE yy_scan_string(const char *yy_str, yyscan_t yyscanner); >+YY_BUFFER_STATE yy_scan_bytes(const char *bytes, int len, yyscan_t yyscanner); > >- >-void yyrestart ( FILE *input_file , yyscan_t yyscanner ); >-void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); >-YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); >-void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); >-void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); >-void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); >-void yypop_buffer_state ( yyscan_t yyscanner ); >- >- >-static void yyensure_buffer_stack ( yyscan_t yyscanner ); >-static void yy_load_buffer_state ( yyscan_t yyscanner ); >-static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner ); >-#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner) >- >- >-YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); >-YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); >-YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner ); >- >- >-void *yyalloc ( yy_size_t , yyscan_t yyscanner ); >-void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); >-void yyfree ( void * , yyscan_t yyscanner ); >- >+void *yyalloc(yy_size_t, yyscan_t yyscanner); >+void *yyrealloc(void *, yy_size_t, yyscan_t yyscanner); >+void yyfree(void *, yyscan_t yyscanner); > > #define yy_new_buffer yy_create_buffer >-#define yy_set_interactive(is_interactive) \ >- { \ >- if ( ! YY_CURRENT_BUFFER ){ \ >- yyensure_buffer_stack (yyscanner); \ >- YY_CURRENT_BUFFER_LVALUE = \ >- yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ >- } \ >- YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ >- } >-#define yy_set_bol(at_bol) \ >- { \ >- if ( ! YY_CURRENT_BUFFER ){\ >- yyensure_buffer_stack (yyscanner); \ >- YY_CURRENT_BUFFER_LVALUE = \ >- yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ >- } \ >- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ >- } >+#define yy_set_interactive(is_interactive) \ >+ { \ >+ if (!YY_CURRENT_BUFFER) \ >+ { \ >+ yyensure_buffer_stack(yyscanner); \ >+ YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner); \ >+ } \ >+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ >+ } >+#define yy_set_bol(at_bol) \ >+ { \ >+ if (!YY_CURRENT_BUFFER) \ >+ { \ >+ yyensure_buffer_stack(yyscanner); \ >+ YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner); \ >+ } \ >+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ >+ } > #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) > >- > /* Begin user sect3 */ > >-#define ppwrap(yyscanner) (/*CONSTCOND*/1) >+#define ppwrap(yyscanner) (/*CONSTCOND*/ 1) > #define YY_SKIP_YYWRAP > typedef flex_uint8_t YY_CHAR; > >- > typedef int yy_state_type; > > #define yytext_ptr yytext_r > >- >- >- >- >- >-static yy_state_type yy_get_previous_state ( yyscan_t yyscanner ); >-static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner); >-static int yy_get_next_buffer ( yyscan_t yyscanner ); >-static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); >- >- >- >+static yy_state_type yy_get_previous_state(yyscan_t yyscanner); >+static yy_state_type yy_try_NUL_trans(yy_state_type current_state, yyscan_t yyscanner); >+static int yy_get_next_buffer(yyscan_t yyscanner); >+static void yynoreturn yy_fatal_error(const char *msg, yyscan_t yyscanner); > > /* Done after the current pattern has been matched and before the > * corresponding action - sets up yytext. > */ >-#define YY_DO_BEFORE_ACTION \ >- yyg->yytext_ptr = yy_bp; \ >- yyleng = (int) (yy_cp - yy_bp); \ >- yyg->yy_hold_char = *yy_cp; \ >- *yy_cp = '\0'; \ >- yyg->yy_c_buf_p = yy_cp; >+#define YY_DO_BEFORE_ACTION \ >+ yyg->yytext_ptr = yy_bp; \ >+ yyleng = (int)(yy_cp - yy_bp); \ >+ yyg->yy_hold_char = *yy_cp; \ >+ *yy_cp = '\0'; \ >+ yyg->yy_c_buf_p = yy_cp; > #define YY_NUM_RULES 37 > #define YY_END_OF_BUFFER 38 > /* This struct is not used in this scanner, > but its presence is necessary. */ > struct yy_trans_info >- { >- flex_int32_t yy_verify; >- flex_int32_t yy_nxt; >- }; >-static const flex_int16_t yy_accept[95] = >- { 0, >- 0, 0, 0, 0, 38, 36, 34, 35, 35, 33, >- 7, 33, 33, 33, 33, 33, 33, 33, 33, 9, >- 9, 33, 33, 33, 8, 33, 33, 3, 5, 5, >- 4, 34, 35, 19, 27, 20, 30, 25, 12, 23, >- 13, 24, 10, 2, 1, 26, 10, 9, 11, 11, >- 11, 9, 11, 9, 9, 14, 16, 18, 17, 15, >- 8, 31, 21, 32, 22, 3, 5, 6, 11, 10, >- 11, 10, 1, 10, 11, 10, 0, 10, 9, 9, >- 9, 28, 29, 0, 10, 10, 10, 10, 9, 10, >- 10, 9, 10, 0 >- >- } ; >- >-static const YY_CHAR yy_ec[256] = >- { 0, >- 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, >- 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 2, 5, 1, 6, 1, 7, 8, 1, 9, >- 9, 10, 11, 9, 12, 13, 14, 15, 16, 16, >- 16, 16, 16, 16, 16, 17, 17, 9, 9, 18, >- 19, 20, 9, 1, 21, 21, 21, 21, 22, 23, >- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, >- 24, 24, 24, 24, 25, 24, 24, 26, 24, 24, >- 9, 1, 9, 27, 24, 1, 21, 21, 21, 21, >- >- 22, 23, 24, 24, 24, 24, 24, 24, 24, 24, >- 24, 24, 24, 24, 24, 24, 25, 24, 24, 26, >- 24, 24, 9, 28, 9, 9, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1 >- } ; >- >-static const YY_CHAR yy_meta[29] = >- { 0, >- 1, 1, 2, 2, 1, 1, 1, 1, 1, 3, >- 1, 1, 4, 1, 5, 5, 5, 1, 1, 1, >- 5, 5, 5, 5, 5, 5, 1, 1 >- } ; >- >-static const flex_int16_t yy_base[100] = >- { 0, >- 0, 0, 26, 28, 133, 195, 130, 195, 128, 105, >- 195, 104, 25, 195, 100, 23, 27, 32, 31, 38, >- 50, 38, 93, 49, 0, 16, 51, 0, 195, 105, >- 87, 93, 195, 195, 195, 195, 195, 195, 195, 195, >- 195, 195, 67, 195, 0, 195, 81, 55, 84, 98, >- 110, 53, 61, 0, 52, 39, 195, 195, 195, 33, >- 0, 195, 195, 195, 195, 0, 195, 195, 113, 0, >- 126, 0, 0, 0, 133, 0, 56, 128, 0, 133, >- 0, 195, 195, 101, 141, 143, 145, 0, 15, 154, >- 195, 0, 195, 195, 177, 32, 182, 187, 189 >- >- } ; >- >-static const flex_int16_t yy_def[100] = >- { 0, >- 94, 1, 95, 95, 94, 94, 94, 94, 94, 94, >- 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, >- 20, 94, 94, 94, 96, 94, 94, 97, 94, 94, >- 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, >- 94, 94, 94, 94, 98, 94, 94, 20, 20, 49, >- 50, 50, 99, 21, 50, 94, 94, 94, 94, 94, >- 96, 94, 94, 94, 94, 97, 94, 94, 43, 43, >- 69, 69, 98, 47, 50, 50, 94, 51, 50, 99, >- 50, 94, 94, 94, 71, 75, 94, 50, 50, 94, >- 94, 50, 94, 0, 94, 94, 94, 94, 94 >- >- } ; >- >-static const flex_int16_t yy_nxt[224] = >- { 0, >- 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, >- 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, >- 25, 25, 25, 25, 25, 25, 26, 27, 29, 30, >- 29, 30, 36, 39, 62, 31, 61, 31, 41, 92, >- 44, 40, 63, 37, 45, 42, 43, 43, 43, 46, >- 47, 83, 48, 48, 49, 56, 57, 82, 50, 51, >- 50, 50, 52, 53, 54, 54, 54, 59, 60, 64, >- 87, 87, 87, 50, 55, 50, 81, 79, 65, 69, >- 50, 70, 70, 70, 50, 50, 50, 69, 71, 72, >- 69, 69, 69, 50, 32, 74, 74, 74, 49, 49, >- >- 68, 50, 75, 76, 50, 50, 50, 67, 50, 50, >- 50, 58, 50, 50, 50, 90, 90, 90, 38, 50, >- 77, 77, 35, 34, 78, 78, 78, 69, 69, 69, >- 33, 32, 94, 94, 69, 69, 84, 84, 94, 94, >- 85, 85, 85, 84, 84, 50, 94, 86, 86, 86, >- 88, 94, 94, 94, 94, 94, 50, 89, 50, 87, >- 87, 87, 94, 72, 94, 76, 94, 91, 90, 90, >- 90, 94, 94, 94, 94, 94, 93, 28, 28, 28, >- 28, 28, 66, 94, 94, 66, 66, 73, 94, 73, >- 73, 73, 80, 80, 5, 94, 94, 94, 94, 94, >- >- 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, >- 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, >- 94, 94, 94 >- } ; >- >-static const flex_int16_t yy_chk[224] = >- { 0, >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, >- 4, 4, 13, 16, 26, 3, 96, 4, 17, 89, >- 19, 16, 26, 13, 19, 17, 18, 18, 18, 19, >- 20, 60, 20, 20, 20, 22, 22, 56, 20, 20, >- 20, 20, 20, 20, 21, 21, 21, 24, 24, 27, >- 77, 77, 77, 53, 21, 21, 55, 52, 27, 43, >- 48, 43, 43, 43, 53, 53, 53, 43, 43, 43, >- 43, 43, 43, 47, 32, 47, 47, 47, 49, 49, >- >- 31, 47, 47, 47, 47, 47, 47, 30, 49, 49, >- 50, 23, 50, 50, 50, 84, 84, 84, 15, 50, >- 51, 51, 12, 10, 51, 51, 51, 69, 69, 69, >- 9, 7, 5, 0, 69, 69, 71, 71, 78, 78, >- 71, 71, 71, 75, 75, 80, 0, 75, 75, 75, >- 78, 85, 85, 86, 86, 0, 80, 80, 80, 87, >- 87, 87, 0, 85, 0, 86, 0, 87, 90, 90, >- 90, 0, 0, 0, 0, 0, 90, 95, 95, 95, >- 95, 95, 97, 0, 0, 97, 97, 98, 0, 98, >- 98, 98, 99, 99, 94, 94, 94, 94, 94, 94, >- >- 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, >- 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, >- 94, 94, 94 >- } ; >+{ >+ flex_int32_t yy_verify; >+ flex_int32_t yy_nxt; >+}; >+static const flex_int16_t yy_accept[95] = { >+ 0, 0, 0, 0, 0, 38, 36, 34, 35, 35, 33, 7, 33, 33, 33, 33, 33, 33, 33, 33, 9, 9, 33, 33, >+ 33, 8, 33, 33, 3, 5, 5, 4, 34, 35, 19, 27, 20, 30, 25, 12, 23, 13, 24, 10, 2, 1, 26, 10, >+ 9, 11, 11, 11, 9, 11, 9, 9, 14, 16, 18, 17, 15, 8, 31, 21, 32, 22, 3, 5, 6, 11, 10, 11, >+ 10, 1, 10, 11, 10, 0, 10, 9, 9, 9, 28, 29, 0, 10, 10, 10, 10, 9, 10, 10, 9, 10, 0 >+ >+}; >+ >+static const YY_CHAR yy_ec[256] = { >+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, >+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 1, 6, 1, 7, 8, 1, 9, 9, >+ 10, 11, 9, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 17, 17, 9, 9, 18, 19, 20, >+ 9, 1, 21, 21, 21, 21, 22, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, >+ 24, 25, 24, 24, 26, 24, 24, 9, 1, 9, 27, 24, 1, 21, 21, 21, 21, >+ >+ 22, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 24, 24, 26, 24, >+ 24, 9, 28, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >+ >+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; >+ >+static const YY_CHAR yy_meta[29] = {0, 1, 1, 2, 2, 1, 1, 1, 1, 1, 3, 1, 1, 4, 1, >+ 5, 5, 5, 1, 1, 1, 5, 5, 5, 5, 5, 5, 1, 1}; >+ >+static const flex_int16_t yy_base[100] = { >+ 0, 0, 0, 26, 28, 133, 195, 130, 195, 128, 105, 195, 104, 25, 195, 100, 23, >+ 27, 32, 31, 38, 50, 38, 93, 49, 0, 16, 51, 0, 195, 105, 87, 93, 195, >+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 67, 195, 0, 195, 81, 55, 84, 98, >+ 110, 53, 61, 0, 52, 39, 195, 195, 195, 33, 0, 195, 195, 195, 195, 0, 195, >+ 195, 113, 0, 126, 0, 0, 0, 133, 0, 56, 128, 0, 133, 0, 195, 195, 101, >+ 141, 143, 145, 0, 15, 154, 195, 0, 195, 195, 177, 32, 182, 187, 189 >+ >+}; >+ >+static const flex_int16_t yy_def[100] = { >+ 0, 94, 1, 95, 95, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, >+ 20, 94, 94, 94, 96, 94, 94, 97, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, >+ 94, 94, 94, 98, 94, 94, 20, 20, 49, 50, 50, 99, 21, 50, 94, 94, 94, 94, 94, 96, 94, >+ 94, 94, 94, 97, 94, 94, 43, 43, 69, 69, 98, 47, 50, 50, 94, 51, 50, 99, 50, 94, 94, >+ 94, 71, 75, 94, 50, 50, 94, 94, 50, 94, 0, 94, 94, 94, 94, 94 >+ >+}; >+ >+static const flex_int16_t yy_nxt[224] = { >+ 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25, 25, >+ 25, 25, 25, 25, 26, 27, 29, 30, 29, 30, 36, 39, 62, 31, 61, 31, 41, 92, 44, 40, 63, 37, 45, >+ 42, 43, 43, 43, 46, 47, 83, 48, 48, 49, 56, 57, 82, 50, 51, 50, 50, 52, 53, 54, 54, 54, 59, >+ 60, 64, 87, 87, 87, 50, 55, 50, 81, 79, 65, 69, 50, 70, 70, 70, 50, 50, 50, 69, 71, 72, 69, >+ 69, 69, 50, 32, 74, 74, 74, 49, 49, >+ >+ 68, 50, 75, 76, 50, 50, 50, 67, 50, 50, 50, 58, 50, 50, 50, 90, 90, 90, 38, 50, 77, 77, 35, >+ 34, 78, 78, 78, 69, 69, 69, 33, 32, 94, 94, 69, 69, 84, 84, 94, 94, 85, 85, 85, 84, 84, 50, >+ 94, 86, 86, 86, 88, 94, 94, 94, 94, 94, 50, 89, 50, 87, 87, 87, 94, 72, 94, 76, 94, 91, 90, >+ 90, 90, 94, 94, 94, 94, 94, 93, 28, 28, 28, 28, 28, 66, 94, 94, 66, 66, 73, 94, 73, 73, 73, >+ 80, 80, 5, 94, 94, 94, 94, 94, >+ >+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94}; >+ >+static const flex_int16_t yy_chk[224] = { >+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >+ 1, 1, 1, 1, 1, 1, 3, 3, 4, 4, 13, 16, 26, 3, 96, 4, 17, 89, 19, 16, 26, 13, 19, >+ 17, 18, 18, 18, 19, 20, 60, 20, 20, 20, 22, 22, 56, 20, 20, 20, 20, 20, 20, 21, 21, 21, 24, >+ 24, 27, 77, 77, 77, 53, 21, 21, 55, 52, 27, 43, 48, 43, 43, 43, 53, 53, 53, 43, 43, 43, 43, >+ 43, 43, 47, 32, 47, 47, 47, 49, 49, >+ >+ 31, 47, 47, 47, 47, 47, 47, 30, 49, 49, 50, 23, 50, 50, 50, 84, 84, 84, 15, 50, 51, 51, 12, >+ 10, 51, 51, 51, 69, 69, 69, 9, 7, 5, 0, 69, 69, 71, 71, 78, 78, 71, 71, 71, 75, 75, 80, >+ 0, 75, 75, 75, 78, 85, 85, 86, 86, 0, 80, 80, 80, 87, 87, 87, 0, 85, 0, 86, 0, 87, 90, >+ 90, 90, 0, 0, 0, 0, 0, 90, 95, 95, 95, 95, 95, 97, 0, 0, 97, 97, 98, 0, 98, 98, 98, >+ 99, 99, 94, 94, 94, 94, 94, 94, >+ >+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94}; > > /* The intent behind this definition is that it'll catch > * any uses of REJECT which flex missed. >@@ -897,7 +683,7 @@ IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh. > */ > > #if defined(_MSC_VER) >-#pragma warning(disable: 4005) >+# pragma warning(disable : 4005) > #endif > > #include "compiler/preprocessor/Tokenizer.h" >@@ -907,80 +693,76 @@ IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh. > > #if defined(__GNUC__) > // Triggered by the auto-generated yy_fatal_error function. >-#pragma GCC diagnostic ignored "-Wmissing-noreturn" >+# pragma GCC diagnostic ignored "-Wmissing-noreturn" > #elif defined(_MSC_VER) >-#pragma warning(disable: 4244) >+# pragma warning(disable : 4244) >+#endif >+#if defined(__clang__) >+// Flex uses `/*FALLTHROUGH*/` instead of dedicated statements. >+# pragma GCC diagnostic ignored "-Wimplicit-fallthrough" >+// Flex isn't semi-colon clean. >+# pragma clang diagnostic ignored "-Wextra-semi-stmt" > #endif > > // Workaround for flex using the register keyword, deprecated in C++11. > #ifdef __cplusplus >-#if __cplusplus > 199711L >-#define register >-#endif >+# if __cplusplus > 199711L >+# define register >+# endif > #endif > > typedef std::string YYSTYPE; >-typedef pp::SourceLocation YYLTYPE; >+typedef angle::pp::SourceLocation YYLTYPE; > > // Use the unused yycolumn variable to track file (string) number. > #define yyfileno yycolumn > > #define YY_USER_INIT \ >- do { \ >- yyfileno = 0; \ >- yylineno = 1; \ >+ do \ >+ { \ >+ yyfileno = 0; \ >+ yylineno = 1; \ > yyextra->leadingSpace = false; \ >- yyextra->lineStart = true; \ >- } while(0); >+ yyextra->lineStart = true; \ >+ } while (0); > >+#define YY_NO_INPUT > #define YY_USER_ACTION \ > do \ > { \ >- pp::Input* input = &yyextra->input; \ >- pp::Input::Location* scanLoc = &yyextra->scanLoc; \ >+ angle::pp::Input *input = &yyextra->input; \ >+ angle::pp::Input::Location *scanLoc = &yyextra->scanLoc; \ > while ((scanLoc->sIndex < input->count()) && \ > (scanLoc->cIndex >= input->length(scanLoc->sIndex))) \ > { \ > scanLoc->cIndex -= input->length(scanLoc->sIndex++); \ >- ++yyfileno; yylineno = 1; \ >+ ++yyfileno; \ >+ yylineno = 1; \ > } \ > yylloc->file = yyfileno; \ > yylloc->line = yylineno; \ > scanLoc->cIndex += yyleng; \ >- } while(0); >- >-#define YY_INPUT(buf, result, maxSize) \ >- result = yyextra->input.read(buf, maxSize, &yylineno); >- >- >- >+ } while (0); > >+#define YY_INPUT(buf, result, maxSize) result = yyextra->input.read(buf, maxSize, &yylineno); > > #define INITIAL 0 > #define COMMENT 1 > >- >- >- >- >- >-#define YY_EXTRA_TYPE pp::Tokenizer::Context* >- >- >- >+#define YY_EXTRA_TYPE angle::pp::Tokenizer::Context * > > /* Holds the entire state of the reentrant scanner. */ > struct yyguts_t >- { >+{ > > /* User-defined. Not touched by flex. */ > YY_EXTRA_TYPE yyextra_r; > > /* The rest are the same as the globals declared in the non-reentrant scanner. */ > FILE *yyin_r, *yyout_r; >- size_t yy_buffer_stack_top; /**< index of top of stack. */ >- size_t yy_buffer_stack_max; /**< capacity of stack. */ >- YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ >+ size_t yy_buffer_stack_top; /**< index of top of stack. */ >+ size_t yy_buffer_stack_max; /**< capacity of stack. */ >+ YY_BUFFER_STATE *yy_buffer_stack; /**< Stack as an array. */ > char yy_hold_char; > int yy_n_chars; > int yyleng_r; >@@ -992,1203 +774,1070 @@ struct yyguts_t > int yy_start_stack_depth; > int *yy_start_stack; > yy_state_type yy_last_accepting_state; >- char* yy_last_accepting_cpos; >+ char *yy_last_accepting_cpos; > > int yylineno_r; > int yy_flex_debug_r; > >- >- >- > char *yytext_r; > int yy_more_flag; > int yy_more_len; > >+ YYSTYPE *yylval_r; > >+ YYLTYPE *yylloc_r; > >- YYSTYPE * yylval_r; >- >+}; /* end struct yyguts_t */ > >+static int yy_init_globals(yyscan_t yyscanner); > >- YYLTYPE * yylloc_r; >+/* This must go here because YYSTYPE and YYLTYPE are included >+ * from bison output in section 1.*/ >+#define yylval yyg->yylval_r > >+#define yylloc yyg->yylloc_r > >- }; /* end struct yyguts_t */ >- >- >- >- >-static int yy_init_globals ( yyscan_t yyscanner ); >- >- >- >- >- >- /* This must go here because YYSTYPE and YYLTYPE are included >- * from bison output in section 1.*/ >- # define yylval yyg->yylval_r >- >- >- >- # define yylloc yyg->yylloc_r >- >- >- >-int yylex_init (yyscan_t* scanner); >- >-int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); >- >+int yylex_init(yyscan_t *scanner); > >+int yylex_init_extra(YY_EXTRA_TYPE user_defined, yyscan_t *scanner); > > /* Accessor methods to globals. > These are made visible to non-reentrant scanners for convenience. */ > >+int yylex_destroy(yyscan_t yyscanner); > >-int yylex_destroy ( yyscan_t yyscanner ); >- >- >- >-int yyget_debug ( yyscan_t yyscanner ); >- >- >- >-void yyset_debug ( int debug_flag , yyscan_t yyscanner ); >- >- >- >-YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); >- >- >- >-void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); >- >- >- >-FILE *yyget_in ( yyscan_t yyscanner ); >- >- >- >-void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); >- >+int yyget_debug(yyscan_t yyscanner); > >+void yyset_debug(int debug_flag, yyscan_t yyscanner); > >-FILE *yyget_out ( yyscan_t yyscanner ); >+YY_EXTRA_TYPE yyget_extra(yyscan_t yyscanner); > >+void yyset_extra(YY_EXTRA_TYPE user_defined, yyscan_t yyscanner); > >+FILE *yyget_in(yyscan_t yyscanner); > >-void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); >+void yyset_in(FILE *_in_str, yyscan_t yyscanner); > >+FILE *yyget_out(yyscan_t yyscanner); > >+void yyset_out(FILE *_out_str, yyscan_t yyscanner); > >- int yyget_leng ( yyscan_t yyscanner ); >+int yyget_leng(yyscan_t yyscanner); > >+char *yyget_text(yyscan_t yyscanner); > >+int yyget_lineno(yyscan_t yyscanner); > >-char *yyget_text ( yyscan_t yyscanner ); >+void yyset_lineno(int _line_number, yyscan_t yyscanner); > >+int yyget_column(yyscan_t yyscanner); > >+void yyset_column(int _column_no, yyscan_t yyscanner); > >-int yyget_lineno ( yyscan_t yyscanner ); >+YYSTYPE *yyget_lval(yyscan_t yyscanner); > >+void yyset_lval(YYSTYPE *yylval_param, yyscan_t yyscanner); > >+YYLTYPE *yyget_lloc(yyscan_t yyscanner); > >-void yyset_lineno ( int _line_number , yyscan_t yyscanner ); >- >- >- >- >-int yyget_column ( yyscan_t yyscanner ); >- >- >- >- >- >-void yyset_column ( int _column_no , yyscan_t yyscanner ); >- >- >- >- >-YYSTYPE * yyget_lval ( yyscan_t yyscanner ); >- >- >-void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner ); >- >- >- >- YYLTYPE *yyget_lloc ( yyscan_t yyscanner ); >- >- >- >- void yyset_lloc ( YYLTYPE * yylloc_param , yyscan_t yyscanner ); >- >- >+void yyset_lloc(YYLTYPE *yylloc_param, yyscan_t yyscanner); > > /* Macros after this point can all be overridden by user definitions in > * section 1. > */ > > #ifndef YY_SKIP_YYWRAP >-#ifdef __cplusplus >-extern "C" int yywrap ( yyscan_t yyscanner ); >-#else >-extern int yywrap ( yyscan_t yyscanner ); >-#endif >+# ifdef __cplusplus >+extern "C" int yywrap(yyscan_t yyscanner); >+# else >+extern int yywrap(yyscan_t yyscanner); >+# endif > #endif > > #ifndef YY_NO_UNPUT >- >-#endif > >+#endif > > #ifndef yytext_ptr >-static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); >+static void yy_flex_strncpy(char *, const char *, int, yyscan_t yyscanner); > #endif > > #ifdef YY_NEED_STRLEN >-static int yy_flex_strlen ( const char * , yyscan_t yyscanner); >+static int yy_flex_strlen(const char *, yyscan_t yyscanner); > #endif > >-#if 0 // #ifndef YY_NO_INPUT >-#ifdef __cplusplus >-static int yyinput ( yyscan_t yyscanner ); >-#else >-static int input ( yyscan_t yyscanner ); >-#endif >+#ifndef YY_NO_INPUT >+# ifdef __cplusplus >+static int yyinput(yyscan_t yyscanner); >+# else >+static int input(yyscan_t yyscanner); >+# endif > > #endif > >- >- >- >- >- >- >- > /* Amount of stuff to slurp up with each read. */ > #ifndef YY_READ_BUF_SIZE >-#ifdef __ia64__ >+# ifdef __ia64__ > /* On IA-64, the buffer size is 16k, not 8k */ >-#define YY_READ_BUF_SIZE 16384 >-#else >-#define YY_READ_BUF_SIZE 8192 >-#endif /* __ia64__ */ >+# define YY_READ_BUF_SIZE 16384 >+# else >+# define YY_READ_BUF_SIZE 8192 >+# endif /* __ia64__ */ > #endif > >- > /* Copy whatever the last rule matched to the standard output. */ > #ifndef ECHO > /* This used to be an fputs(), but since the string might contain NUL's, > * we now use fwrite(). > */ >-#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) >+# define ECHO \ >+ do \ >+ { \ >+ if (fwrite(yytext, (size_t)yyleng, 1, yyout)) \ >+ { \ >+ } \ >+ } while (0) > #endif > >- >- > /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, > * is returned in "result". > */ > #ifndef YY_INPUT >-#define YY_INPUT(buf,result,max_size) \ >- if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ >- { \ >- int c = '*'; \ >- int n; \ >- for ( n = 0; n < max_size && \ >- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ >- buf[n] = (char) c; \ >- if ( c == '\n' ) \ >- buf[n++] = (char) c; \ >- if ( c == EOF && ferror( yyin ) ) \ >- YY_FATAL_ERROR( "input in flex scanner failed" ); \ >- result = n; \ >- } \ >- else \ >- { \ >- errno=0; \ >- while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ >- { \ >- if( errno != EINTR) \ >- { \ >- YY_FATAL_ERROR( "input in flex scanner failed" ); \ >- break; \ >- } \ >- errno=0; \ >- clearerr(yyin); \ >- } \ >- }\ >-\ >+# define YY_INPUT(buf, result, max_size) \ >+ if (YY_CURRENT_BUFFER_LVALUE->yy_is_interactive) \ >+ { \ >+ int c = '*'; \ >+ int n; \ >+ for (n = 0; n < max_size && (c = getc(yyin)) != EOF && c != '\n'; ++n) \ >+ buf[n] = (char)c; \ >+ if (c == '\n') \ >+ buf[n++] = (char)c; \ >+ if (c == EOF && ferror(yyin)) \ >+ YY_FATAL_ERROR("input in flex scanner failed"); \ >+ result = n; \ >+ } \ >+ else \ >+ { \ >+ errno = 0; \ >+ while ((result = (int)fread(buf, 1, (yy_size_t)max_size, yyin)) == 0 && ferror(yyin)) \ >+ { \ >+ if (errno != EINTR) \ >+ { \ >+ YY_FATAL_ERROR("input in flex scanner failed"); \ >+ break; \ >+ } \ >+ errno = 0; \ >+ clearerr(yyin); \ >+ } \ >+ } > > #endif > >- >- > /* No semi-colon after return; correct usage is to write "yyterminate();" - > * we don't want an extra ';' after the "return" because that will cause > * some compilers to complain about unreachable statements. > */ > #ifndef yyterminate >-#define yyterminate() return YY_NULL >+# define yyterminate() return YY_NULL > #endif > >- > /* Number of entries by which start-condition stack grows. */ > #ifndef YY_START_STACK_INCR >-#define YY_START_STACK_INCR 25 >+# define YY_START_STACK_INCR 25 > #endif > >- > /* Report a fatal error. */ > #ifndef YY_FATAL_ERROR >-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) >+# define YY_FATAL_ERROR(msg) yy_fatal_error(msg, yyscanner) > #endif > >- >- > /* end tables serialization structures and prototypes */ > >- >- > /* Default declaration of generated scanner - a define so the user can > * easily add parameters. > */ > #ifndef YY_DECL >-#define YY_DECL_IS_OURS 1 >- >- >+# define YY_DECL_IS_OURS 1 > >+extern int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, yyscan_t yyscanner); > >- >- >- >- >- >- >- >- >- >- >- >- >- >-extern int yylex \ >- (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner); >- >-#define YY_DECL int yylex \ >- (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner) >+# define YY_DECL int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, yyscan_t yyscanner) > #endif /* !YY_DECL */ > >- > /* Code executed at the beginning of each rule, after yytext and yyleng > * have been set up. > */ > #ifndef YY_USER_ACTION >-#define YY_USER_ACTION >+# define YY_USER_ACTION > #endif > >- >- > /* Code executed at the end of each rule. */ > #ifndef YY_BREAK >-#define YY_BREAK /*LINTED*/break; >+# define YY_BREAK /*LINTED*/ break; > #endif > >- >- >-#define YY_RULE_SETUP \ >- YY_USER_ACTION >- >+#define YY_RULE_SETUP YY_USER_ACTION > > /** The main scanner function which does all the work. > */ > YY_DECL > { >- yy_state_type yy_current_state; >- char *yy_cp, *yy_bp; >- int yy_act; >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ yy_state_type yy_current_state; >+ char *yy_cp, *yy_bp; >+ int yy_act; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > >+ yylval = yylval_param; > >+ yylloc = yylloc_param; > >- >- yylval = yylval_param; >- >- >- >- yylloc = yylloc_param; >- >- >- if ( !yyg->yy_init ) >- { >- yyg->yy_init = 1; >+ if (!yyg->yy_init) >+ { >+ yyg->yy_init = 1; > > #ifdef YY_USER_INIT >- YY_USER_INIT; >+ YY_USER_INIT; > #endif > >+ if (!yyg->yy_start) >+ yyg->yy_start = 1; /* first start state */ > >+ if (!yyin) >+ yyin = stdin; > >- if ( ! yyg->yy_start ) >- yyg->yy_start = 1; /* first start state */ >+ if (!yyout) >+ yyout = stdout; > >- if ( ! yyin ) >- yyin = stdin; >+ if (!YY_CURRENT_BUFFER) >+ { >+ yyensure_buffer_stack(yyscanner); >+ YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner); >+ } > >- if ( ! yyout ) >- yyout = stdout; >+ yy_load_buffer_state(yyscanner); >+ } > >- if ( ! YY_CURRENT_BUFFER ) { >- yyensure_buffer_stack (yyscanner); >- YY_CURRENT_BUFFER_LVALUE = >- yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); >- } >+ { > >- yy_load_buffer_state( yyscanner ); >- } >+ /* Line comment */ >+ >+ while (/*CONSTCOND*/ 1) /* loops until end-of-file is reached */ >+ { >+ yy_cp = yyg->yy_c_buf_p; >+ >+ /* Support of yytext. */ >+ *yy_cp = yyg->yy_hold_char; >+ >+ /* yy_bp points to the position in yy_ch_buf of the start of >+ * the current run. >+ */ >+ yy_bp = yy_cp; >+ >+ yy_current_state = yyg->yy_start; >+ yy_match: >+ do >+ { >+ YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; >+ if (yy_accept[yy_current_state]) >+ { >+ yyg->yy_last_accepting_state = yy_current_state; >+ yyg->yy_last_accepting_cpos = yy_cp; >+ } >+ while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) >+ { >+ yy_current_state = (int)yy_def[yy_current_state]; >+ if (yy_current_state >= 95) >+ yy_c = yy_meta[yy_c]; >+ } >+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; >+ ++yy_cp; >+ } while (yy_current_state != 94); >+ yy_cp = yyg->yy_last_accepting_cpos; >+ yy_current_state = yyg->yy_last_accepting_state; >+ >+ yy_find_action: >+ yy_act = yy_accept[yy_current_state]; >+ >+ YY_DO_BEFORE_ACTION; >+ >+ do_action: /* This label is used only to access EOF actions. */ >+ >+ switch (yy_act) >+ { /* beginning of action switch */ >+ case 0: /* must back up */ >+ /* undo the effects of YY_DO_BEFORE_ACTION */ >+ *yy_cp = yyg->yy_hold_char; >+ yy_cp = yyg->yy_last_accepting_cpos; >+ yy_current_state = yyg->yy_last_accepting_state; >+ goto yy_find_action; >+ >+ case 1: >+ YY_RULE_SETUP >+ >+ YY_BREAK >+ /* Block comment */ >+ /* Line breaks are just counted - not returned. */ >+ /* The comment is replaced by a single space. */ >+ case 2: >+ YY_RULE_SETUP { BEGIN(COMMENT); } >+ YY_BREAK >+ case 3: >+ YY_RULE_SETUP >+ >+ YY_BREAK >+ case 4: >+ YY_RULE_SETUP >+ >+ YY_BREAK >+ case 5: >+ /* rule 5 can match eol */ >+ YY_RULE_SETUP >+ { >+ if (yylineno == INT_MAX) >+ { >+ *yylval = "Integer overflow on line number"; >+ return angle::pp::Token::GOT_ERROR; >+ } >+ ++yylineno; >+ } >+ YY_BREAK >+ case 6: >+ YY_RULE_SETUP >+ { >+ yyextra->leadingSpace = true; >+ BEGIN(INITIAL); >+ } >+ YY_BREAK >+ case 7: >+ YY_RULE_SETUP >+ { >+ // # is only valid at start of line for preprocessor directives. >+ yylval->assign(1, yytext[0]); >+ return yyextra->lineStart ? angle::pp::Token::PP_HASH >+ : angle::pp::Token::PP_OTHER; >+ } >+ YY_BREAK >+ case 8: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::IDENTIFIER; >+ } >+ YY_BREAK >+ case 9: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::CONST_INT; >+ } >+ YY_BREAK >+ case 10: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::CONST_FLOAT; >+ } >+ YY_BREAK >+ /* Anything that starts with a {DIGIT} or .{DIGIT} must be a number. */ >+ /* Rule to catch all invalid integers and floats. */ >+ case 11: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::PP_NUMBER; >+ } >+ YY_BREAK >+ case 12: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_INC; >+ } >+ YY_BREAK >+ case 13: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_DEC; >+ } >+ YY_BREAK >+ case 14: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_LEFT; >+ } >+ YY_BREAK >+ case 15: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_RIGHT; >+ } >+ YY_BREAK >+ case 16: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_LE; >+ } >+ YY_BREAK >+ case 17: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_GE; >+ } >+ YY_BREAK >+ case 18: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_EQ; >+ } >+ YY_BREAK >+ case 19: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_NE; >+ } >+ YY_BREAK >+ case 20: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_AND; >+ } >+ YY_BREAK >+ case 21: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_XOR; >+ } >+ YY_BREAK >+ case 22: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_OR; >+ } >+ YY_BREAK >+ case 23: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_ADD_ASSIGN; >+ } >+ YY_BREAK >+ case 24: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_SUB_ASSIGN; >+ } >+ YY_BREAK >+ case 25: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_MUL_ASSIGN; >+ } >+ YY_BREAK >+ case 26: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_DIV_ASSIGN; >+ } >+ YY_BREAK >+ case 27: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_MOD_ASSIGN; >+ } >+ YY_BREAK >+ case 28: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_LEFT_ASSIGN; >+ } >+ YY_BREAK >+ case 29: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_RIGHT_ASSIGN; >+ } >+ YY_BREAK >+ case 30: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_AND_ASSIGN; >+ } >+ YY_BREAK >+ case 31: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_XOR_ASSIGN; >+ } >+ YY_BREAK >+ case 32: >+ YY_RULE_SETUP >+ { >+ yylval->assign(yytext, yyleng); >+ return angle::pp::Token::OP_OR_ASSIGN; >+ } >+ YY_BREAK >+ case 33: >+ YY_RULE_SETUP >+ { >+ yylval->assign(1, yytext[0]); >+ return yytext[0]; >+ } >+ YY_BREAK >+ case 34: >+ YY_RULE_SETUP { yyextra->leadingSpace = true; } >+ YY_BREAK >+ case 35: >+ /* rule 35 can match eol */ >+ YY_RULE_SETUP >+ { >+ if (yylineno == INT_MAX) >+ { >+ *yylval = "Integer overflow on line number"; >+ return angle::pp::Token::GOT_ERROR; >+ } >+ ++yylineno; >+ yylval->assign(1, '\n'); >+ return '\n'; >+ } >+ YY_BREAK >+ case 36: >+ YY_RULE_SETUP >+ { >+ yylval->assign(1, yytext[0]); >+ return angle::pp::Token::PP_OTHER; >+ } >+ YY_BREAK >+ case YY_STATE_EOF(INITIAL): >+ case YY_STATE_EOF(COMMENT): >+ { >+ // YY_USER_ACTION is not invoked for handling EOF. >+ // Set the location for EOF token manually. >+ angle::pp::Input *input = &yyextra->input; >+ angle::pp::Input::Location *scanLoc = &yyextra->scanLoc; >+ yy_size_t sIndexMax = input->count() ? input->count() - 1 : 0; >+ if (scanLoc->sIndex != sIndexMax) >+ { >+ // We can only reach here if there are empty strings at the >+ // end of the input. >+ scanLoc->sIndex = sIndexMax; >+ scanLoc->cIndex = 0; >+ // FIXME: this is not 64-bit clean. >+ yyfileno = static_cast<int>(sIndexMax); >+ yylineno = 1; >+ } >+ yylloc->file = yyfileno; >+ yylloc->line = yylineno; >+ yylval->clear(); >+ >+ // Line number overflows fake EOFs to exit early, check for this case. >+ if (yylineno == INT_MAX) >+ { >+ yyextra->diagnostics->report(angle::pp::Diagnostics::PP_TOKENIZER_ERROR, >+ angle::pp::SourceLocation(yyfileno, yylineno), >+ "Integer overflow on line number"); >+ } >+ else if (YY_START == COMMENT) >+ { >+ yyextra->diagnostics->report(angle::pp::Diagnostics::PP_EOF_IN_COMMENT, >+ angle::pp::SourceLocation(yyfileno, yylineno), >+ "EOF while in a comment"); >+ } >+ yyterminate(); >+ } >+ YY_BREAK >+ case 37: >+ YY_RULE_SETUP >+ ECHO; >+ YY_BREAK >+ >+ case YY_END_OF_BUFFER: >+ { >+ /* Amount of text matched not including the EOB char. */ >+ int yy_amount_of_matched_text = (int)(yy_cp - yyg->yytext_ptr) - 1; >+ >+ /* Undo the effects of YY_DO_BEFORE_ACTION. */ >+ *yy_cp = yyg->yy_hold_char; >+ YY_RESTORE_YY_MORE_OFFSET >+ >+ if (YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW) >+ { >+ /* We're scanning a new file or input source. It's >+ * possible that this happened because the user >+ * just pointed yyin at a new source and called >+ * yylex(). If so, then we have to assure >+ * consistency between YY_CURRENT_BUFFER and our >+ * globals. Here is the right place to do so, because >+ * this is the first action (other than possibly a >+ * back-up) that will match for the new input source. >+ */ >+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; >+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; >+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; >+ } >+ >+ /* Note that here we test for yy_c_buf_p "<=" to the position >+ * of the first EOB in the buffer, since yy_c_buf_p will >+ * already have been incremented past the NUL character >+ * (since all states make transitions on EOB to the >+ * end-of-buffer state). Contrast this with the test >+ * in input(). >+ */ >+ if (yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]) >+ { /* This was really a NUL. */ >+ yy_state_type yy_next_state; >+ >+ yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; >+ >+ yy_current_state = yy_get_previous_state(yyscanner); >+ >+ /* Okay, we're now positioned to make the NUL >+ * transition. We couldn't have >+ * yy_get_previous_state() go ahead and do it >+ * for us because it doesn't know how to deal >+ * with the possibility of jamming (and we don't >+ * want to build jamming into it because then it >+ * will run more slowly). >+ */ >+ >+ yy_next_state = yy_try_NUL_trans(yy_current_state, yyscanner); >+ >+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; >+ >+ if (yy_next_state) >+ { >+ /* Consume the NUL. */ >+ yy_cp = ++yyg->yy_c_buf_p; >+ yy_current_state = yy_next_state; >+ goto yy_match; >+ } >+ >+ else >+ { >+ yy_cp = yyg->yy_last_accepting_cpos; >+ yy_current_state = yyg->yy_last_accepting_state; >+ goto yy_find_action; >+ } >+ } >+ >+ else >+ switch (yy_get_next_buffer(yyscanner)) >+ { >+ case EOB_ACT_END_OF_FILE: >+ { >+ yyg->yy_did_buffer_switch_on_eof = 0; >+ >+ if (yywrap(yyscanner)) >+ { >+ /* Note: because we've taken care in >+ * yy_get_next_buffer() to have set up >+ * yytext, we can now set up >+ * yy_c_buf_p so that if some total >+ * hoser (like flex itself) wants to >+ * call the scanner after we return the >+ * YY_NULL, it'll still work - another >+ * YY_NULL will get returned. >+ */ >+ yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; >+ >+ yy_act = YY_STATE_EOF(YY_START); >+ goto do_action; >+ } >+ >+ else >+ { >+ if (!yyg->yy_did_buffer_switch_on_eof) >+ YY_NEW_FILE; >+ } >+ break; >+ } >+ >+ case EOB_ACT_CONTINUE_SCAN: >+ yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; >+ >+ yy_current_state = yy_get_previous_state(yyscanner); >+ >+ yy_cp = yyg->yy_c_buf_p; >+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; >+ goto yy_match; >+ >+ case EOB_ACT_LAST_MATCH: >+ yyg->yy_c_buf_p = >+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; >+ >+ yy_current_state = yy_get_previous_state(yyscanner); >+ >+ yy_cp = yyg->yy_c_buf_p; >+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; >+ goto yy_find_action; >+ } >+ break; >+ } >+ >+ default: >+ YY_FATAL_ERROR("fatal flex scanner internal error--no action found"); >+ } /* end of action switch */ >+ } /* end of scanning one token */ >+ } /* end of user's declarations */ >+} /* end of yylex */ > >- { >+/* yy_get_next_buffer - try to read in a new buffer >+ * >+ * Returns a code representing an action: >+ * EOB_ACT_LAST_MATCH - >+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position >+ * EOB_ACT_END_OF_FILE - end of file >+ */ >+static int yy_get_next_buffer(yyscan_t yyscanner) >+{ >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; >+ char *source = yyg->yytext_ptr; >+ int number_to_move, i; >+ int ret_val; >+ >+ if (yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1]) >+ YY_FATAL_ERROR("fatal flex scanner internal error--end of buffer missed"); >+ >+ if (YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0) >+ { /* Don't try to fill the buffer, so this is an EOF. */ >+ if (yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1) >+ { >+ /* We matched a single character, the EOB, so >+ * treat this as a final EOF. >+ */ >+ return EOB_ACT_END_OF_FILE; >+ } >+ >+ else >+ { >+ /* We matched some text prior to the EOB, first >+ * process it. >+ */ >+ return EOB_ACT_LAST_MATCH; >+ } >+ } > >+ /* Try to read more data. */ > >- /* Line comment */ >+ /* First move last chars to start of buffer. */ >+ number_to_move = (int)(yyg->yy_c_buf_p - yyg->yytext_ptr - 1); > >- while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ >- { >- yy_cp = yyg->yy_c_buf_p; >+ for (i = 0; i < number_to_move; ++i) >+ *(dest++) = *(source++); > >- /* Support of yytext. */ >- *yy_cp = yyg->yy_hold_char; >+ if (YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING) >+ /* don't do the read, it's not guaranteed to return an EOF, >+ * just force an EOF >+ */ >+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; > >- /* yy_bp points to the position in yy_ch_buf of the start of >- * the current run. >- */ >- yy_bp = yy_cp; >+ else >+ { >+ int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; > >- yy_current_state = yyg->yy_start; >-yy_match: >- do >- { >- YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; >- if ( yy_accept[yy_current_state] ) >- { >- yyg->yy_last_accepting_state = yy_current_state; >- yyg->yy_last_accepting_cpos = yy_cp; >- } >- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) >- { >- yy_current_state = (int) yy_def[yy_current_state]; >- if ( yy_current_state >= 95 ) >- yy_c = yy_meta[yy_c]; >- } >- yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; >- ++yy_cp; >- } >- while ( yy_current_state != 94 ); >- yy_cp = yyg->yy_last_accepting_cpos; >- yy_current_state = yyg->yy_last_accepting_state; >+ while (num_to_read <= 0) >+ { /* Not enough room in the buffer - grow it. */ > >-yy_find_action: >- yy_act = yy_accept[yy_current_state]; >+ /* just a shorter name for the current buffer */ >+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; > >- YY_DO_BEFORE_ACTION; >+ int yy_c_buf_p_offset = (int)(yyg->yy_c_buf_p - b->yy_ch_buf); > >+ if (b->yy_is_our_buffer) >+ { >+ int new_size = b->yy_buf_size * 2; > >+ if (new_size <= 0) >+ b->yy_buf_size += b->yy_buf_size / 8; >+ else >+ b->yy_buf_size *= 2; > >-do_action: /* This label is used only to access EOF actions. */ >+ b->yy_ch_buf = (char *) >+ /* Include room in for 2 EOB chars. */ >+ yyrealloc((void *)b->yy_ch_buf, (yy_size_t)(b->yy_buf_size + 2), yyscanner); >+ } >+ else >+ /* Can't grow it, we don't own it. */ >+ b->yy_ch_buf = NULL; > >+ if (!b->yy_ch_buf) >+ YY_FATAL_ERROR("fatal error - scanner input buffer overflow"); > >- switch ( yy_act ) >- { /* beginning of action switch */ >- case 0: /* must back up */ >- /* undo the effects of YY_DO_BEFORE_ACTION */ >- *yy_cp = yyg->yy_hold_char; >- yy_cp = yyg->yy_last_accepting_cpos; >- yy_current_state = yyg->yy_last_accepting_state; >- goto yy_find_action; >+ yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; > >-case 1: >-YY_RULE_SETUP >+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; >+ } > >- YY_BREAK >-/* Block comment */ >-/* Line breaks are just counted - not returned. */ >-/* The comment is replaced by a single space. */ >-case 2: >-YY_RULE_SETUP >-{ BEGIN(COMMENT); } >- YY_BREAK >-case 3: >-YY_RULE_SETUP >+ if (num_to_read > YY_READ_BUF_SIZE) >+ num_to_read = YY_READ_BUF_SIZE; > >- YY_BREAK >-case 4: >-YY_RULE_SETUP >+ /* Read in more data. */ >+ yy_size_t ret = 0; >+ YY_INPUT((&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), ret, num_to_read); >+ yyg->yy_n_chars = static_cast<int>(ret); > >- YY_BREAK >-case 5: >-/* rule 5 can match eol */ >-YY_RULE_SETUP >-{ >- if (yylineno == INT_MAX) >- { >- *yylval = "Integer overflow on line number"; >- return pp::Token::GOT_ERROR; >- } >- ++yylineno; >-} >- YY_BREAK >-case 6: >-YY_RULE_SETUP >-{ >- yyextra->leadingSpace = true; >- BEGIN(INITIAL); >-} >- YY_BREAK >-case 7: >-YY_RULE_SETUP >-{ >- // # is only valid at start of line for preprocessor directives. >- yylval->assign(1, yytext[0]); >- return yyextra->lineStart ? pp::Token::PP_HASH : pp::Token::PP_OTHER; >-} >- YY_BREAK >-case 8: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::IDENTIFIER; >-} >- YY_BREAK >-case 9: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::CONST_INT; >-} >- YY_BREAK >-case 10: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::CONST_FLOAT; >-} >- YY_BREAK >-/* Anything that starts with a {DIGIT} or .{DIGIT} must be a number. */ >-/* Rule to catch all invalid integers and floats. */ >-case 11: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::PP_NUMBER; >-} >- YY_BREAK >-case 12: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_INC; >-} >- YY_BREAK >-case 13: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_DEC; >-} >- YY_BREAK >-case 14: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_LEFT; >-} >- YY_BREAK >-case 15: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_RIGHT; >-} >- YY_BREAK >-case 16: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_LE; >-} >- YY_BREAK >-case 17: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_GE; >-} >- YY_BREAK >-case 18: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_EQ; >-} >- YY_BREAK >-case 19: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_NE; >-} >- YY_BREAK >-case 20: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_AND; >-} >- YY_BREAK >-case 21: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_XOR; >-} >- YY_BREAK >-case 22: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_OR; >-} >- YY_BREAK >-case 23: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_ADD_ASSIGN; >-} >- YY_BREAK >-case 24: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_SUB_ASSIGN; >-} >- YY_BREAK >-case 25: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_MUL_ASSIGN; >-} >- YY_BREAK >-case 26: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_DIV_ASSIGN; >-} >- YY_BREAK >-case 27: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_MOD_ASSIGN; >-} >- YY_BREAK >-case 28: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_LEFT_ASSIGN; >-} >- YY_BREAK >-case 29: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_RIGHT_ASSIGN; >-} >- YY_BREAK >-case 30: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_AND_ASSIGN; >-} >- YY_BREAK >-case 31: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_XOR_ASSIGN; >-} >- YY_BREAK >-case 32: >-YY_RULE_SETUP >-{ >- yylval->assign(yytext, yyleng); >- return pp::Token::OP_OR_ASSIGN; >-} >- YY_BREAK >-case 33: >-YY_RULE_SETUP >-{ >- yylval->assign(1, yytext[0]); >- return yytext[0]; >-} >- YY_BREAK >-case 34: >-YY_RULE_SETUP >-{ yyextra->leadingSpace = true; } >- YY_BREAK >-case 35: >-/* rule 35 can match eol */ >-YY_RULE_SETUP >-{ >- if (yylineno == INT_MAX) >- { >- *yylval = "Integer overflow on line number"; >- return pp::Token::GOT_ERROR; >+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; > } >- ++yylineno; >- yylval->assign(1, '\n'); >- return '\n'; >-} >- YY_BREAK >-case 36: >-YY_RULE_SETUP >-{ >- yylval->assign(1, yytext[0]); >- return pp::Token::PP_OTHER; >-} >- YY_BREAK >-case YY_STATE_EOF(INITIAL): >-case YY_STATE_EOF(COMMENT): >-{ >- // YY_USER_ACTION is not invoked for handling EOF. >- // Set the location for EOF token manually. >- pp::Input* input = &yyextra->input; >- pp::Input::Location* scanLoc = &yyextra->scanLoc; >- yy_size_t sIndexMax = input->count() ? input->count() - 1 : 0; >- if (scanLoc->sIndex != sIndexMax) >- { >- // We can only reach here if there are empty strings at the >- // end of the input. >- scanLoc->sIndex = sIndexMax; scanLoc->cIndex = 0; >- // FIXME: this is not 64-bit clean. >- yyfileno = static_cast<int>(sIndexMax); yylineno = 1; >- } >- yylloc->file = yyfileno; >- yylloc->line = yylineno; >- yylval->clear(); > >- // Line number overflows fake EOFs to exit early, check for this case. >- if (yylineno == INT_MAX) >+ if (yyg->yy_n_chars == 0) > { >- yyextra->diagnostics->report(pp::Diagnostics::PP_TOKENIZER_ERROR, >- pp::SourceLocation(yyfileno, yylineno), >- "Integer overflow on line number"); >+ if (number_to_move == YY_MORE_ADJ) >+ { >+ ret_val = EOB_ACT_END_OF_FILE; >+ yyrestart(yyin, yyscanner); >+ } >+ >+ else >+ { >+ ret_val = EOB_ACT_LAST_MATCH; >+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; >+ } > } >- else if (YY_START == COMMENT) >+ >+ else >+ ret_val = EOB_ACT_CONTINUE_SCAN; >+ >+ if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) > { >- yyextra->diagnostics->report(pp::Diagnostics::PP_EOF_IN_COMMENT, >- pp::SourceLocation(yyfileno, yylineno), >- "EOF while in a comment"); >+ /* Extend the array by 50%, plus the number we really need. */ >+ int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); >+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *)yyrealloc( >+ (void *)YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t)new_size, yyscanner); >+ if (!YY_CURRENT_BUFFER_LVALUE->yy_ch_buf) >+ YY_FATAL_ERROR("out of dynamic memory in yy_get_next_buffer()"); >+ /* "- 2" to take care of EOB's */ >+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int)(new_size - 2); > } >- yyterminate(); >-} >- YY_BREAK >-case 37: >-YY_RULE_SETUP >-ECHO; >- YY_BREAK >- >- case YY_END_OF_BUFFER: >- { >- /* Amount of text matched not including the EOB char. */ >- int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; >- >- /* Undo the effects of YY_DO_BEFORE_ACTION. */ >- *yy_cp = yyg->yy_hold_char; >- YY_RESTORE_YY_MORE_OFFSET >- >- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) >- { >- /* We're scanning a new file or input source. It's >- * possible that this happened because the user >- * just pointed yyin at a new source and called >- * yylex(). If so, then we have to assure >- * consistency between YY_CURRENT_BUFFER and our >- * globals. Here is the right place to do so, because >- * this is the first action (other than possibly a >- * back-up) that will match for the new input source. >- */ >- yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; >- YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; >- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; >- } >- >- /* Note that here we test for yy_c_buf_p "<=" to the position >- * of the first EOB in the buffer, since yy_c_buf_p will >- * already have been incremented past the NUL character >- * (since all states make transitions on EOB to the >- * end-of-buffer state). Contrast this with the test >- * in input(). >- */ >- if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) >- { /* This was really a NUL. */ >- yy_state_type yy_next_state; >- >- yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; >- >- yy_current_state = yy_get_previous_state( yyscanner ); >- >- /* Okay, we're now positioned to make the NUL >- * transition. We couldn't have >- * yy_get_previous_state() go ahead and do it >- * for us because it doesn't know how to deal >- * with the possibility of jamming (and we don't >- * want to build jamming into it because then it >- * will run more slowly). >- */ >- >- yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); >- >- yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; >- >- if ( yy_next_state ) >- { >- /* Consume the NUL. */ >- yy_cp = ++yyg->yy_c_buf_p; >- yy_current_state = yy_next_state; >- goto yy_match; >- } >- >- else >- { >- yy_cp = yyg->yy_last_accepting_cpos; >- yy_current_state = yyg->yy_last_accepting_state; >- goto yy_find_action; >- } >- } >- >- else switch ( yy_get_next_buffer( yyscanner ) ) >- { >- case EOB_ACT_END_OF_FILE: >- { >- yyg->yy_did_buffer_switch_on_eof = 0; >- >- if ( yywrap( yyscanner ) ) >- { >- /* Note: because we've taken care in >- * yy_get_next_buffer() to have set up >- * yytext, we can now set up >- * yy_c_buf_p so that if some total >- * hoser (like flex itself) wants to >- * call the scanner after we return the >- * YY_NULL, it'll still work - another >- * YY_NULL will get returned. >- */ >- yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; >- >- yy_act = YY_STATE_EOF(YY_START); >- goto do_action; >- } >- >- else >- { >- if ( ! yyg->yy_did_buffer_switch_on_eof ) >- YY_NEW_FILE; >- } >- break; >- } >- >- case EOB_ACT_CONTINUE_SCAN: >- yyg->yy_c_buf_p = >- yyg->yytext_ptr + yy_amount_of_matched_text; >- >- yy_current_state = yy_get_previous_state( yyscanner ); >- >- yy_cp = yyg->yy_c_buf_p; >- yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; >- goto yy_match; >- >- case EOB_ACT_LAST_MATCH: >- yyg->yy_c_buf_p = >- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; >- >- yy_current_state = yy_get_previous_state( yyscanner ); >- >- yy_cp = yyg->yy_c_buf_p; >- yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; >- goto yy_find_action; >- } >- break; >- } >- >- default: >- YY_FATAL_ERROR( >- "fatal flex scanner internal error--no action found" ); >- } /* end of action switch */ >- } /* end of scanning one token */ >- } /* end of user's declarations */ >-} /* end of yylex */ > >+ yyg->yy_n_chars += number_to_move; >+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; >+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; > >+ yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; > >+ return ret_val; >+} > >+/* yy_get_previous_state - get the state just before the EOB char was reached */ > >-/* yy_get_next_buffer - try to read in a new buffer >- * >- * Returns a code representing an action: >- * EOB_ACT_LAST_MATCH - >- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position >- * EOB_ACT_END_OF_FILE - end of file >- */ >-static int yy_get_next_buffer (yyscan_t yyscanner) >+static yy_state_type yy_get_previous_state(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; >- char *source = yyg->yytext_ptr; >- int number_to_move, i; >- int ret_val; >- >- if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) >- YY_FATAL_ERROR( >- "fatal flex scanner internal error--end of buffer missed" ); >- >- if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) >- { /* Don't try to fill the buffer, so this is an EOF. */ >- if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) >- { >- /* We matched a single character, the EOB, so >- * treat this as a final EOF. >- */ >- return EOB_ACT_END_OF_FILE; >- } >- >- else >- { >- /* We matched some text prior to the EOB, first >- * process it. >- */ >- return EOB_ACT_LAST_MATCH; >- } >- } >- >- /* Try to read more data. */ >- >- /* First move last chars to start of buffer. */ >- number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1); >- >- for ( i = 0; i < number_to_move; ++i ) >- *(dest++) = *(source++); >- >- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) >- /* don't do the read, it's not guaranteed to return an EOF, >- * just force an EOF >- */ >- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; >- >- else >- { >- int num_to_read = >- YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; >- >- while ( num_to_read <= 0 ) >- { /* Not enough room in the buffer - grow it. */ >- >- /* just a shorter name for the current buffer */ >- YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; >- >- int yy_c_buf_p_offset = >- (int) (yyg->yy_c_buf_p - b->yy_ch_buf); >- >- if ( b->yy_is_our_buffer ) >- { >- int new_size = b->yy_buf_size * 2; >- >- if ( new_size <= 0 ) >- b->yy_buf_size += b->yy_buf_size / 8; >- else >- b->yy_buf_size *= 2; >- >- b->yy_ch_buf = (char *) >- /* Include room in for 2 EOB chars. */ >- yyrealloc( (void *) b->yy_ch_buf, >- (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); >- } >- else >- /* Can't grow it, we don't own it. */ >- b->yy_ch_buf = NULL; >- >- if ( ! b->yy_ch_buf ) >- YY_FATAL_ERROR( >- "fatal error - scanner input buffer overflow" ); >- >- yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; >- >- num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - >- number_to_move - 1; >- >- } >- >- if ( num_to_read > YY_READ_BUF_SIZE ) >- num_to_read = YY_READ_BUF_SIZE; >- >- /* Read in more data. */ >- yy_size_t ret = 0; >- YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), >- ret, num_to_read ); >- yyg->yy_n_chars = static_cast<int>(ret); >- >- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; >- } >- >- if ( yyg->yy_n_chars == 0 ) >- { >- if ( number_to_move == YY_MORE_ADJ ) >- { >- ret_val = EOB_ACT_END_OF_FILE; >- yyrestart( yyin , yyscanner); >- } >- >- else >- { >- ret_val = EOB_ACT_LAST_MATCH; >- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = >- YY_BUFFER_EOF_PENDING; >- } >- } >- >- else >- ret_val = EOB_ACT_CONTINUE_SCAN; >- >- if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { >- /* Extend the array by 50%, plus the number we really need. */ >- int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); >- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( >- (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner ); >- if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) >- YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); >- /* "- 2" to take care of EOB's */ >- YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); >- } >- >- yyg->yy_n_chars += number_to_move; >- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; >- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; >- >- yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; >- >- return ret_val; >-} >+ yy_state_type yy_current_state; >+ char *yy_cp; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > >+ yy_current_state = yyg->yy_start; > >-/* yy_get_previous_state - get the state just before the EOB char was reached */ >+ for (yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp) >+ { >+ YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); >+ if (yy_accept[yy_current_state]) >+ { >+ yyg->yy_last_accepting_state = yy_current_state; >+ yyg->yy_last_accepting_cpos = yy_cp; >+ } >+ while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) >+ { >+ yy_current_state = (int)yy_def[yy_current_state]; >+ if (yy_current_state >= 95) >+ yy_c = yy_meta[yy_c]; >+ } >+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; >+ } > >- static yy_state_type yy_get_previous_state (yyscan_t yyscanner) >-{ >- yy_state_type yy_current_state; >- char *yy_cp; >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- >- yy_current_state = yyg->yy_start; >- >- for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) >- { >- YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); >- if ( yy_accept[yy_current_state] ) >- { >- yyg->yy_last_accepting_state = yy_current_state; >- yyg->yy_last_accepting_cpos = yy_cp; >- } >- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) >- { >- yy_current_state = (int) yy_def[yy_current_state]; >- if ( yy_current_state >= 95 ) >- yy_c = yy_meta[yy_c]; >- } >- yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; >- } >- >- return yy_current_state; >+ return yy_current_state; > } > >- > /* yy_try_NUL_trans - try to make a transition on the NUL character > * > * synopsis > * next_state = yy_try_NUL_trans( current_state ); > */ >- static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) >+static yy_state_type yy_try_NUL_trans(yy_state_type yy_current_state, yyscan_t yyscanner) > { >- int yy_is_jam; >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ >- char *yy_cp = yyg->yy_c_buf_p; >- >- YY_CHAR yy_c = 1; >- if ( yy_accept[yy_current_state] ) >- { >- yyg->yy_last_accepting_state = yy_current_state; >- yyg->yy_last_accepting_cpos = yy_cp; >- } >- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) >- { >- yy_current_state = (int) yy_def[yy_current_state]; >- if ( yy_current_state >= 95 ) >- yy_c = yy_meta[yy_c]; >- } >- yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; >- yy_is_jam = (yy_current_state == 94); >- >- (void)yyg; >- return yy_is_jam ? 0 : yy_current_state; >-} >+ int yy_is_jam; >+ struct yyguts_t *yyg = >+ (struct yyguts_t *)yyscanner; /* This var may be unused depending upon options. */ >+ char *yy_cp = yyg->yy_c_buf_p; >+ >+ YY_CHAR yy_c = 1; >+ if (yy_accept[yy_current_state]) >+ { >+ yyg->yy_last_accepting_state = yy_current_state; >+ yyg->yy_last_accepting_cpos = yy_cp; >+ } >+ while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) >+ { >+ yy_current_state = (int)yy_def[yy_current_state]; >+ if (yy_current_state >= 95) >+ yy_c = yy_meta[yy_c]; >+ } >+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; >+ yy_is_jam = (yy_current_state == 94); > >+ (void)yyg; >+ return yy_is_jam ? 0 : yy_current_state; >+} > > #ifndef YY_NO_UNPUT > > #endif > >-#if 0 // #ifndef YY_NO_INPUT >-#ifdef __cplusplus >- static int yyinput (yyscan_t yyscanner) >-#else >- static int input (yyscan_t yyscanner) >-#endif >+#ifndef YY_NO_INPUT >+# ifdef __cplusplus >+static int yyinput(yyscan_t yyscanner) >+# else >+static int input(yyscan_t yyscanner) >+# endif > > { >- int c; >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- >- *yyg->yy_c_buf_p = yyg->yy_hold_char; >- >- if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) >- { >- /* yy_c_buf_p now points to the character we want to return. >- * If this occurs *before* the EOB characters, then it's a >- * valid NUL; if not, then we've hit the end of the buffer. >- */ >- if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) >- /* This was really a NUL. */ >- *yyg->yy_c_buf_p = '\0'; >- >- else >- { /* need more input */ >- int offset = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr); >- ++yyg->yy_c_buf_p; >- >- switch ( yy_get_next_buffer( yyscanner ) ) >- { >- case EOB_ACT_LAST_MATCH: >- /* This happens because yy_g_n_b() >- * sees that we've accumulated a >- * token and flags that we need to >- * try matching the token before >- * proceeding. But for input(), >- * there's no matching to consider. >- * So convert the EOB_ACT_LAST_MATCH >- * to EOB_ACT_END_OF_FILE. >- */ >- >- /* Reset buffer status. */ >- yyrestart( yyin , yyscanner); >- >- /*FALLTHROUGH*/ >- >- case EOB_ACT_END_OF_FILE: >- { >- if ( yywrap( yyscanner ) ) >- return 0; >- >- if ( ! yyg->yy_did_buffer_switch_on_eof ) >- YY_NEW_FILE; >-#ifdef __cplusplus >- return yyinput(yyscanner); >-#else >- return input(yyscanner); >-#endif >- } >+ int c; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > >- case EOB_ACT_CONTINUE_SCAN: >- yyg->yy_c_buf_p = yyg->yytext_ptr + offset; >- break; >- } >- } >- } >+ *yyg->yy_c_buf_p = yyg->yy_hold_char; > >- c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ >- *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ >- yyg->yy_hold_char = *++yyg->yy_c_buf_p; >+ if (*yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR) >+ { >+ /* yy_c_buf_p now points to the character we want to return. >+ * If this occurs *before* the EOB characters, then it's a >+ * valid NUL; if not, then we've hit the end of the buffer. >+ */ >+ if (yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]) >+ /* This was really a NUL. */ >+ *yyg->yy_c_buf_p = '\0'; >+ >+ else >+ { /* need more input */ >+ int offset = (int)(yyg->yy_c_buf_p - yyg->yytext_ptr); >+ ++yyg->yy_c_buf_p; >+ >+ switch (yy_get_next_buffer(yyscanner)) >+ { >+ case EOB_ACT_LAST_MATCH: >+ /* This happens because yy_g_n_b() >+ * sees that we've accumulated a >+ * token and flags that we need to >+ * try matching the token before >+ * proceeding. But for input(), >+ * there's no matching to consider. >+ * So convert the EOB_ACT_LAST_MATCH >+ * to EOB_ACT_END_OF_FILE. >+ */ >+ >+ /* Reset buffer status. */ >+ yyrestart(yyin, yyscanner); >+ >+ /*FALLTHROUGH*/ >+ >+ case EOB_ACT_END_OF_FILE: >+ { >+ if (yywrap(yyscanner)) >+ return 0; >+ >+ if (!yyg->yy_did_buffer_switch_on_eof) >+ YY_NEW_FILE; >+# ifdef __cplusplus >+ return yyinput(yyscanner); >+# else >+ return input(yyscanner); >+# endif >+ } >+ >+ case EOB_ACT_CONTINUE_SCAN: >+ yyg->yy_c_buf_p = yyg->yytext_ptr + offset; >+ break; >+ } >+ } >+ } > >+ c = *(unsigned char *)yyg->yy_c_buf_p; /* cast for 8-bit char's */ >+ *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ >+ yyg->yy_hold_char = *++yyg->yy_c_buf_p; > >- return c; >+ return c; > } >-#endif /* ifndef YY_NO_INPUT */ >+#endif /* ifndef YY_NO_INPUT */ > > /** Immediately switch to a different input stream. > * @param input_file A readable stream. > * @param yyscanner The scanner object. > * @note This function does not reset the start condition to @c INITIAL . > */ >- void yyrestart (FILE * input_file , yyscan_t yyscanner) >+void yyrestart(FILE *input_file, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > >- if ( ! YY_CURRENT_BUFFER ){ >- yyensure_buffer_stack (yyscanner); >- YY_CURRENT_BUFFER_LVALUE = >- yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); >- } >+ if (!YY_CURRENT_BUFFER) >+ { >+ yyensure_buffer_stack(yyscanner); >+ YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner); >+ } > >- yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner); >- yy_load_buffer_state( yyscanner ); >+ yy_init_buffer(YY_CURRENT_BUFFER, input_file, yyscanner); >+ yy_load_buffer_state(yyscanner); > } > >- > /** Switch to a different input buffer. > * @param new_buffer The new input buffer. > * @param yyscanner The scanner object. > */ >- void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) >+void yy_switch_to_buffer(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > >- /* TODO. We should be able to replace this entire function body >- * with >- * yypop_buffer_state(); >- * yypush_buffer_state(new_buffer); >+ /* TODO. We should be able to replace this entire function body >+ * with >+ * yypop_buffer_state(); >+ * yypush_buffer_state(new_buffer); > */ >- yyensure_buffer_stack (yyscanner); >- if ( YY_CURRENT_BUFFER == new_buffer ) >- return; >- >- if ( YY_CURRENT_BUFFER ) >- { >- /* Flush out information for old buffer. */ >- *yyg->yy_c_buf_p = yyg->yy_hold_char; >- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; >- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; >- } >- >- YY_CURRENT_BUFFER_LVALUE = new_buffer; >- yy_load_buffer_state( yyscanner ); >- >- /* We don't actually know whether we did this switch during >- * EOF (yywrap()) processing, but the only time this flag >- * is looked at is after yywrap() is called, so it's safe >- * to go ahead and always set it. >- */ >- yyg->yy_did_buffer_switch_on_eof = 1; >-} >+ yyensure_buffer_stack(yyscanner); >+ if (YY_CURRENT_BUFFER == new_buffer) >+ return; > >+ if (YY_CURRENT_BUFFER) >+ { >+ /* Flush out information for old buffer. */ >+ *yyg->yy_c_buf_p = yyg->yy_hold_char; >+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; >+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; >+ } >+ >+ YY_CURRENT_BUFFER_LVALUE = new_buffer; >+ yy_load_buffer_state(yyscanner); >+ >+ /* We don't actually know whether we did this switch during >+ * EOF (yywrap()) processing, but the only time this flag >+ * is looked at is after yywrap() is called, so it's safe >+ * to go ahead and always set it. >+ */ >+ yyg->yy_did_buffer_switch_on_eof = 1; >+} > >-static void yy_load_buffer_state (yyscan_t yyscanner) >+static void yy_load_buffer_state(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; >- yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; >- yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; >- yyg->yy_hold_char = *yyg->yy_c_buf_p; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; >+ yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; >+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; >+ yyg->yy_hold_char = *yyg->yy_c_buf_p; > } > > /** Allocate and initialize an input buffer state. >@@ -2197,110 +1846,106 @@ static void yy_load_buffer_state (yyscan_t yyscanner) > * @param yyscanner The scanner object. > * @return the allocated buffer state. > */ >- YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) >+YY_BUFFER_STATE yy_create_buffer(FILE *file, int size, yyscan_t yyscanner) > { >- YY_BUFFER_STATE b; >- >- b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); >- if ( ! b ) >- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); >+ YY_BUFFER_STATE b; > >- b->yy_buf_size = size; >+ b = (YY_BUFFER_STATE)yyalloc(sizeof(struct yy_buffer_state), yyscanner); >+ if (!b) >+ YY_FATAL_ERROR("out of dynamic memory in yy_create_buffer()"); > >- /* yy_ch_buf has to be 2 characters longer than the size given because >- * we need to put in 2 end-of-buffer characters. >- */ >- b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); >- if ( ! b->yy_ch_buf ) >- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); >+ b->yy_buf_size = size; > >- b->yy_is_our_buffer = 1; >+ /* yy_ch_buf has to be 2 characters longer than the size given because >+ * we need to put in 2 end-of-buffer characters. >+ */ >+ b->yy_ch_buf = (char *)yyalloc((yy_size_t)(b->yy_buf_size + 2), yyscanner); >+ if (!b->yy_ch_buf) >+ YY_FATAL_ERROR("out of dynamic memory in yy_create_buffer()"); > >- yy_init_buffer( b, file , yyscanner); >+ b->yy_is_our_buffer = 1; > >- return b; >-} >+ yy_init_buffer(b, file, yyscanner); > >+ return b; >+} > > /** Destroy the buffer. > * @param b a buffer created with yy_create_buffer() > * @param yyscanner The scanner object. > */ >- void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) >+void yy_delete_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > >- if ( ! b ) >- return; >+ if (!b) >+ return; > >- if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ >- YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; >+ if (b == YY_CURRENT_BUFFER) /* Not sure if we should pop here. */ >+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE)0; > >- if ( b->yy_is_our_buffer ) >- yyfree( (void *) b->yy_ch_buf , yyscanner ); >+ if (b->yy_is_our_buffer) >+ yyfree((void *)b->yy_ch_buf, yyscanner); > >- yyfree( (void *) b , yyscanner ); >+ yyfree((void *)b, yyscanner); > } > >- > /* Initializes or reinitializes a buffer. > * This function is sometimes called more than once on the same buffer, > * such as during a yyrestart() or at EOF. > */ >- static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) >+static void yy_init_buffer(YY_BUFFER_STATE b, FILE *file, yyscan_t yyscanner) > > { >- int oerrno = errno; >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ int oerrno = errno; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > >- yy_flush_buffer( b , yyscanner); >+ yy_flush_buffer(b, yyscanner); > >- b->yy_input_file = file; >- b->yy_fill_buffer = 1; >+ b->yy_input_file = file; >+ b->yy_fill_buffer = 1; > > /* If b is the current buffer, then yy_init_buffer was _probably_ > * called from yyrestart() or through yy_get_next_buffer. > * In that case, we don't want to reset the lineno or column. > */ >- if (b != YY_CURRENT_BUFFER){ >+ if (b != YY_CURRENT_BUFFER) >+ { > b->yy_bs_lineno = 1; > b->yy_bs_column = 0; > } > >+ b->yy_is_interactive = 0; > >- >- b->yy_is_interactive = 0; >- >- >- errno = oerrno; >+ errno = oerrno; > } > > /** Discard all buffered characters. On the next scan, YY_INPUT will be called. > * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. > * @param yyscanner The scanner object. > */ >- void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) >+void yy_flush_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- if ( ! b ) >- return; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ if (!b) >+ return; > >- b->yy_n_chars = 0; >+ b->yy_n_chars = 0; > >- /* We always need two end-of-buffer characters. The first causes >- * a transition to the end-of-buffer state. The second causes >- * a jam in that state. >- */ >- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; >- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; >+ /* We always need two end-of-buffer characters. The first causes >+ * a transition to the end-of-buffer state. The second causes >+ * a jam in that state. >+ */ >+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; >+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; > >- b->yy_buf_pos = &b->yy_ch_buf[0]; >+ b->yy_buf_pos = &b->yy_ch_buf[0]; > >- b->yy_at_bol = 1; >- b->yy_buffer_status = YY_BUFFER_NEW; >+ b->yy_at_bol = 1; >+ b->yy_buffer_status = YY_BUFFER_NEW; > >- if ( b == YY_CURRENT_BUFFER ) >- yy_load_buffer_state( yyscanner ); >+ if (b == YY_CURRENT_BUFFER) >+ yy_load_buffer_state(yyscanner); > } > > /** Pushes the new state onto the stack. The new state becomes >@@ -2309,107 +1954,101 @@ static void yy_load_buffer_state (yyscan_t yyscanner) > * @param new_buffer The new state. > * @param yyscanner The scanner object. > */ >-void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) >+void yypush_buffer_state(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- if (new_buffer == NULL) >- return; >- >- yyensure_buffer_stack(yyscanner); >- >- /* This block is copied from yy_switch_to_buffer. */ >- if ( YY_CURRENT_BUFFER ) >- { >- /* Flush out information for old buffer. */ >- *yyg->yy_c_buf_p = yyg->yy_hold_char; >- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; >- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; >- } >- >- /* Only push if top exists. Otherwise, replace top. */ >- if (YY_CURRENT_BUFFER) >- yyg->yy_buffer_stack_top++; >- YY_CURRENT_BUFFER_LVALUE = new_buffer; >- >- /* copied from yy_switch_to_buffer. */ >- yy_load_buffer_state( yyscanner ); >- yyg->yy_did_buffer_switch_on_eof = 1; >-} >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ if (new_buffer == NULL) >+ return; > >+ yyensure_buffer_stack(yyscanner); >+ >+ /* This block is copied from yy_switch_to_buffer. */ >+ if (YY_CURRENT_BUFFER) >+ { >+ /* Flush out information for old buffer. */ >+ *yyg->yy_c_buf_p = yyg->yy_hold_char; >+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; >+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; >+ } >+ >+ /* Only push if top exists. Otherwise, replace top. */ >+ if (YY_CURRENT_BUFFER) >+ yyg->yy_buffer_stack_top++; >+ YY_CURRENT_BUFFER_LVALUE = new_buffer; >+ >+ /* copied from yy_switch_to_buffer. */ >+ yy_load_buffer_state(yyscanner); >+ yyg->yy_did_buffer_switch_on_eof = 1; >+} > > /** Removes and deletes the top of the stack, if present. > * The next element becomes the new top. > * @param yyscanner The scanner object. > */ >-void yypop_buffer_state (yyscan_t yyscanner) >+void yypop_buffer_state(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- if (!YY_CURRENT_BUFFER) >- return; >- >- yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner); >- YY_CURRENT_BUFFER_LVALUE = NULL; >- if (yyg->yy_buffer_stack_top > 0) >- --yyg->yy_buffer_stack_top; >- >- if (YY_CURRENT_BUFFER) { >- yy_load_buffer_state( yyscanner ); >- yyg->yy_did_buffer_switch_on_eof = 1; >- } >-} >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ if (!YY_CURRENT_BUFFER) >+ return; > >+ yy_delete_buffer(YY_CURRENT_BUFFER, yyscanner); >+ YY_CURRENT_BUFFER_LVALUE = NULL; >+ if (yyg->yy_buffer_stack_top > 0) >+ --yyg->yy_buffer_stack_top; >+ >+ if (YY_CURRENT_BUFFER) >+ { >+ yy_load_buffer_state(yyscanner); >+ yyg->yy_did_buffer_switch_on_eof = 1; >+ } >+} > > /* Allocates the stack if it does not exist. > * Guarantees space for at least one push. > */ >-static void yyensure_buffer_stack (yyscan_t yyscanner) >+static void yyensure_buffer_stack(yyscan_t yyscanner) > { >- yy_size_t num_to_alloc; >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ yy_size_t num_to_alloc; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > >- if (!yyg->yy_buffer_stack) { >+ if (!yyg->yy_buffer_stack) >+ { > >- /* First allocation is just for 2 elements, since we don't know if this >- * scanner will even need a stack. We use 2 instead of 1 to avoid an >- * immediate realloc on the next call. >+ /* First allocation is just for 2 elements, since we don't know if this >+ * scanner will even need a stack. We use 2 instead of 1 to avoid an >+ * immediate realloc on the next call. > */ >- num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ >- yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc >- (num_to_alloc * sizeof(struct yy_buffer_state*) >- , yyscanner); >- if ( ! yyg->yy_buffer_stack ) >- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); >- >- >- memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); >- >- yyg->yy_buffer_stack_max = num_to_alloc; >- yyg->yy_buffer_stack_top = 0; >- return; >- } >- >- if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ >- >- /* Increase the buffer to prepare for a possible push. */ >- yy_size_t grow_size = 8 /* arbitrary grow size */; >- >- num_to_alloc = yyg->yy_buffer_stack_max + grow_size; >- yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc >- (yyg->yy_buffer_stack, >- num_to_alloc * sizeof(struct yy_buffer_state*) >- , yyscanner); >- if ( ! yyg->yy_buffer_stack ) >- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); >- >- /* zero only the new slots.*/ >- memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); >- yyg->yy_buffer_stack_max = num_to_alloc; >- } >-} >+ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ >+ yyg->yy_buffer_stack = (struct yy_buffer_state **)yyalloc( >+ num_to_alloc * sizeof(struct yy_buffer_state *), yyscanner); >+ if (!yyg->yy_buffer_stack) >+ YY_FATAL_ERROR("out of dynamic memory in yyensure_buffer_stack()"); > >+ memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state *)); > >+ yyg->yy_buffer_stack_max = num_to_alloc; >+ yyg->yy_buffer_stack_top = 0; >+ return; >+ } >+ >+ if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1) >+ { > >+ /* Increase the buffer to prepare for a possible push. */ >+ yy_size_t grow_size = 8 /* arbitrary grow size */; > >+ num_to_alloc = yyg->yy_buffer_stack_max + grow_size; >+ yyg->yy_buffer_stack = (struct yy_buffer_state **)yyrealloc( >+ yyg->yy_buffer_stack, num_to_alloc * sizeof(struct yy_buffer_state *), yyscanner); >+ if (!yyg->yy_buffer_stack) >+ YY_FATAL_ERROR("out of dynamic memory in yyensure_buffer_stack()"); >+ >+ /* zero only the new slots.*/ >+ memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, >+ grow_size * sizeof(struct yy_buffer_state *)); >+ yyg->yy_buffer_stack_max = num_to_alloc; >+ } >+} > > /** Setup the input buffer state to scan directly from a user-specified character buffer. > * @param base the character buffer >@@ -2417,37 +2056,33 @@ static void yyensure_buffer_stack (yyscan_t yyscanner) > * @param yyscanner The scanner object. > * @return the newly allocated buffer state object. > */ >-YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) >+YY_BUFFER_STATE yy_scan_buffer(char *base, yy_size_t size, yyscan_t yyscanner) > { >- YY_BUFFER_STATE b; >- >- if ( size < 2 || >- base[size-2] != YY_END_OF_BUFFER_CHAR || >- base[size-1] != YY_END_OF_BUFFER_CHAR ) >- /* They forgot to leave room for the EOB's. */ >- return NULL; >- >- b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); >- if ( ! b ) >- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); >- >- b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ >- b->yy_buf_pos = b->yy_ch_buf = base; >- b->yy_is_our_buffer = 0; >- b->yy_input_file = NULL; >- b->yy_n_chars = b->yy_buf_size; >- b->yy_is_interactive = 0; >- b->yy_at_bol = 1; >- b->yy_fill_buffer = 0; >- b->yy_buffer_status = YY_BUFFER_NEW; >- >- yy_switch_to_buffer( b , yyscanner ); >- >- return b; >-} >+ YY_BUFFER_STATE b; > >+ if (size < 2 || base[size - 2] != YY_END_OF_BUFFER_CHAR || >+ base[size - 1] != YY_END_OF_BUFFER_CHAR) >+ /* They forgot to leave room for the EOB's. */ >+ return NULL; > >+ b = (YY_BUFFER_STATE)yyalloc(sizeof(struct yy_buffer_state), yyscanner); >+ if (!b) >+ YY_FATAL_ERROR("out of dynamic memory in yy_scan_buffer()"); > >+ b->yy_buf_size = (int)(size - 2); /* "- 2" to take care of EOB's */ >+ b->yy_buf_pos = b->yy_ch_buf = base; >+ b->yy_is_our_buffer = 0; >+ b->yy_input_file = NULL; >+ b->yy_n_chars = b->yy_buf_size; >+ b->yy_is_interactive = 0; >+ b->yy_at_bol = 1; >+ b->yy_fill_buffer = 0; >+ b->yy_buffer_status = YY_BUFFER_NEW; >+ >+ yy_switch_to_buffer(b, yyscanner); >+ >+ return b; >+} > > /** Setup the input buffer state to scan a string. The next call to yylex() will > * scan from a @e copy of @a str. >@@ -2457,14 +2092,11 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscann > * @note If you want to scan bytes that may contain NUL values, then use > * yy_scan_bytes() instead. > */ >-YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner) >+YY_BUFFER_STATE yy_scan_string(const char *yystr, yyscan_t yyscanner) > { >- >- return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner); >-} >- >- > >+ return yy_scan_bytes(yystr, (int)strlen(yystr), yyscanner); >+} > > /** Setup the input buffer state to scan the given bytes. The next call to yylex() will > * scan from a @e copy of @a bytes. >@@ -2473,295 +2105,233 @@ YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner) > * @param yyscanner The scanner object. > * @return the newly allocated buffer state object. > */ >-YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner) >+YY_BUFFER_STATE yy_scan_bytes(const char *yybytes, int _yybytes_len, yyscan_t yyscanner) > { >- YY_BUFFER_STATE b; >- char *buf; >- yy_size_t n; >- int i; >- >- /* Get memory for full buffer, including space for trailing EOB's. */ >- n = (yy_size_t) (_yybytes_len + 2); >- buf = (char *) yyalloc( n , yyscanner ); >- if ( ! buf ) >- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); >- >- for ( i = 0; i < _yybytes_len; ++i ) >- buf[i] = yybytes[i]; >- >- buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; >- >- b = yy_scan_buffer( buf, n , yyscanner); >- if ( ! b ) >- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); >- >- /* It's okay to grow etc. this buffer, and we should throw it >- * away when we're done. >- */ >- b->yy_is_our_buffer = 1; >- >- return b; >-} >- >- >- >- >+ YY_BUFFER_STATE b; >+ char *buf; >+ yy_size_t n; >+ int i; > >+ /* Get memory for full buffer, including space for trailing EOB's. */ >+ n = (yy_size_t)(_yybytes_len + 2); >+ buf = (char *)yyalloc(n, yyscanner); >+ if (!buf) >+ YY_FATAL_ERROR("out of dynamic memory in yy_scan_bytes()"); > >+ for (i = 0; i < _yybytes_len; ++i) >+ buf[i] = yybytes[i]; > >+ buf[_yybytes_len] = buf[_yybytes_len + 1] = YY_END_OF_BUFFER_CHAR; > >+ b = yy_scan_buffer(buf, n, yyscanner); >+ if (!b) >+ YY_FATAL_ERROR("bad buffer in yy_scan_bytes()"); > >+ /* It's okay to grow etc. this buffer, and we should throw it >+ * away when we're done. >+ */ >+ b->yy_is_our_buffer = 1; > >+ return b; >+} > > #ifndef YY_EXIT_FAILURE >-#define YY_EXIT_FAILURE 2 >+# define YY_EXIT_FAILURE 2 > #endif > >-static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) >+static void yynoreturn yy_fatal_error(const char *msg, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- (void)yyg; >- fprintf( stderr, "%s\n", msg ); >- exit( YY_EXIT_FAILURE ); >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ (void)yyg; >+ fprintf(stderr, "%s\n", msg); >+ exit(YY_EXIT_FAILURE); > } > > /* Redefine yyless() so it works in section 3 code. */ > > #undef yyless >-#define yyless(n) \ >- do \ >- { \ >- /* Undo effects of setting up yytext. */ \ >- int yyless_macro_arg = (n); \ >- YY_LESS_LINENO(yyless_macro_arg);\ >- yytext[yyleng] = yyg->yy_hold_char; \ >- yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ >- yyg->yy_hold_char = *yyg->yy_c_buf_p; \ >- *yyg->yy_c_buf_p = '\0'; \ >- yyleng = yyless_macro_arg; \ >- } \ >- while ( 0 ) >- >- >+#define yyless(n) \ >+ do \ >+ { \ >+ /* Undo effects of setting up yytext. */ \ >+ int yyless_macro_arg = (n); \ >+ YY_LESS_LINENO(yyless_macro_arg); \ >+ yytext[yyleng] = yyg->yy_hold_char; \ >+ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ >+ yyg->yy_hold_char = *yyg->yy_c_buf_p; \ >+ *yyg->yy_c_buf_p = '\0'; \ >+ yyleng = yyless_macro_arg; \ >+ } while (0) > > /* Accessor methods (get/set functions) to struct members. */ > >- > /** Get the user-defined data for this scanner. > * @param yyscanner The scanner object. > */ >-YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) >+YY_EXTRA_TYPE yyget_extra(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > return yyextra; > } > >- >- > /** Get the current line number. > * @param yyscanner The scanner object. > */ >-int yyget_lineno (yyscan_t yyscanner) >+int yyget_lineno(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ >+ if (!YY_CURRENT_BUFFER) >+ return 0; > >- >- if (! YY_CURRENT_BUFFER) >- return 0; >- > return yylineno; > } > >- >- >- > /** Get the current column number. > * @param yyscanner The scanner object. > */ >-int yyget_column (yyscan_t yyscanner) >+int yyget_column(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ >+ if (!YY_CURRENT_BUFFER) >+ return 0; > >- >- if (! YY_CURRENT_BUFFER) >- return 0; >- > return yycolumn; > } > >- >- >- > /** Get the input stream. > * @param yyscanner The scanner object. > */ >-FILE *yyget_in (yyscan_t yyscanner) >+FILE *yyget_in(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > return yyin; > } > >- >- > /** Get the output stream. > * @param yyscanner The scanner object. > */ >-FILE *yyget_out (yyscan_t yyscanner) >+FILE *yyget_out(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > return yyout; > } > >- >- > /** Get the length of the current token. > * @param yyscanner The scanner object. > */ >-int yyget_leng (yyscan_t yyscanner) >+int yyget_leng(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > return yyleng; > } > >- > /** Get the current token. > * @param yyscanner The scanner object. > */ > >-char *yyget_text (yyscan_t yyscanner) >+char *yyget_text(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > return yytext; > } > >- >- > /** Set the user-defined data. This data is never touched by the scanner. > * @param user_defined The data to be associated with this scanner. > * @param yyscanner The scanner object. > */ >-void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) >+void yyset_extra(YY_EXTRA_TYPE user_defined, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- yyextra = user_defined ; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ yyextra = user_defined; > } > >- >- > /** Set the current line number. > * @param _line_number line number > * @param yyscanner The scanner object. > */ >-void yyset_lineno (int _line_number , yyscan_t yyscanner) >+void yyset_lineno(int _line_number, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ >+ /* lineno is only valid if an input buffer exists. */ >+ if (!YY_CURRENT_BUFFER) >+ YY_FATAL_ERROR("yyset_lineno called with no buffer"); > >- >- /* lineno is only valid if an input buffer exists. */ >- if (! YY_CURRENT_BUFFER ) >- YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); >- > yylineno = _line_number; > } > >- >- >- > /** Set the current column. > * @param _column_no column number > * @param yyscanner The scanner object. > */ >-void yyset_column (int _column_no , yyscan_t yyscanner) >+void yyset_column(int _column_no, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ >+ /* column is only valid if an input buffer exists. */ >+ if (!YY_CURRENT_BUFFER) >+ YY_FATAL_ERROR("yyset_column called with no buffer"); > >- >- /* column is only valid if an input buffer exists. */ >- if (! YY_CURRENT_BUFFER ) >- YY_FATAL_ERROR( "yyset_column called with no buffer" ); >- > yycolumn = _column_no; > } > >- >- >- >- > /** Set the input stream. This does not discard the current > * input buffer. > * @param _in_str A readable stream. > * @param yyscanner The scanner object. > * @see yy_switch_to_buffer > */ >-void yyset_in (FILE * _in_str , yyscan_t yyscanner) >+void yyset_in(FILE *_in_str, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- yyin = _in_str ; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ yyin = _in_str; > } > >- >- >-void yyset_out (FILE * _out_str , yyscan_t yyscanner) >+void yyset_out(FILE *_out_str, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- yyout = _out_str ; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ yyout = _out_str; > } > >- >- >- >-int yyget_debug (yyscan_t yyscanner) >+int yyget_debug(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > return yy_flex_debug; > } > >- >- >-void yyset_debug (int _bdebug , yyscan_t yyscanner) >+void yyset_debug(int _bdebug, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- yy_flex_debug = _bdebug ; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ yy_flex_debug = _bdebug; > } > >- > /* Accessor methods for yylval and yylloc */ > >- >-YYSTYPE * yyget_lval (yyscan_t yyscanner) >+YYSTYPE *yyget_lval(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > return yylval; > } > >- >- >-void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) >+void yyset_lval(YYSTYPE *yylval_param, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- yylval = yylval_param; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ yylval = yylval_param; > } > >- >- >- >-YYLTYPE *yyget_lloc (yyscan_t yyscanner) >+YYLTYPE *yyget_lloc(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > return yylloc; > } >- > >- >-void yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner) >+void yyset_lloc(YYLTYPE *yylloc_param, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- yylloc = yylloc_param; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ yylloc = yylloc_param; > } >- >- >- >- > > /* User-visible API */ > >@@ -2769,27 +2339,28 @@ void yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner) > * the ONLY reentrant function that doesn't take the scanner as the last argument. > * That's why we explicitly handle the declaration, instead of using our macros. > */ >-int yylex_init(yyscan_t* ptr_yy_globals) >+int yylex_init(yyscan_t *ptr_yy_globals) > { >- if (ptr_yy_globals == NULL){ >+ if (ptr_yy_globals == NULL) >+ { > errno = EINVAL; > return 1; > } > >- *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); >+ *ptr_yy_globals = (yyscan_t)yyalloc(sizeof(struct yyguts_t), NULL); > >- if (*ptr_yy_globals == NULL){ >+ if (*ptr_yy_globals == NULL) >+ { > errno = ENOMEM; > return 1; > } > > /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ >- memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); >+ memset(*ptr_yy_globals, 0x00, sizeof(struct yyguts_t)); > >- return yy_init_globals ( *ptr_yy_globals ); >+ return yy_init_globals(*ptr_yy_globals); > } > >- > /* yylex_init_extra has the same functionality as yylex_init, but follows the > * convention of taking the scanner as the last argument. Note however, that > * this is a *pointer* to a scanner, as it will be allocated by this call (and >@@ -2797,65 +2368,59 @@ int yylex_init(yyscan_t* ptr_yy_globals) > * The user defined value in the first argument will be available to yyalloc in > * the yyextra field. > */ >-int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals ) >+int yylex_init_extra(YY_EXTRA_TYPE yy_user_defined, yyscan_t *ptr_yy_globals) > { > struct yyguts_t dummy_yyguts; > >- yyset_extra (yy_user_defined, &dummy_yyguts); >+ yyset_extra(yy_user_defined, &dummy_yyguts); > >- if (ptr_yy_globals == NULL){ >+ if (ptr_yy_globals == NULL) >+ { > errno = EINVAL; > return 1; > } > >- *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); >+ *ptr_yy_globals = (yyscan_t)yyalloc(sizeof(struct yyguts_t), &dummy_yyguts); > >- if (*ptr_yy_globals == NULL){ >+ if (*ptr_yy_globals == NULL) >+ { > errno = ENOMEM; > return 1; > } > > /* By setting to 0xAA, we expose bugs in > yy_init_globals. Leave at 0x00 for releases. */ >- memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); >+ memset(*ptr_yy_globals, 0x00, sizeof(struct yyguts_t)); > >- yyset_extra (yy_user_defined, *ptr_yy_globals); >+ yyset_extra(yy_user_defined, *ptr_yy_globals); > >- return yy_init_globals ( *ptr_yy_globals ); >+ return yy_init_globals(*ptr_yy_globals); > } > >- >-static int yy_init_globals (yyscan_t yyscanner) >+static int yy_init_globals(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > /* Initialization is the same as for the non-reentrant scanner. > * This function is called from yylex_destroy(), so don't allocate here. > */ > >- >- yyg->yy_buffer_stack = NULL; >+ yyg->yy_buffer_stack = NULL; > yyg->yy_buffer_stack_top = 0; > yyg->yy_buffer_stack_max = 0; >- yyg->yy_c_buf_p = NULL; >- yyg->yy_init = 0; >- yyg->yy_start = 0; >- >+ yyg->yy_c_buf_p = NULL; >+ yyg->yy_init = 0; >+ yyg->yy_start = 0; > >- yyg->yy_start_stack_ptr = 0; >+ yyg->yy_start_stack_ptr = 0; > yyg->yy_start_stack_depth = 0; >- yyg->yy_start_stack = NULL; >- >- >- >- >- >+ yyg->yy_start_stack = NULL; > > /* Defined in main.c */ > #ifdef YY_STDINIT >- yyin = stdin; >+ yyin = stdin; > yyout = stdout; > #else >- yyin = NULL; >+ yyin = NULL; > yyout = NULL; > #endif > >@@ -2865,120 +2430,100 @@ static int yy_init_globals (yyscan_t yyscanner) > return 0; > } > >- > /* yylex_destroy is for both reentrant and non-reentrant scanners. */ >-int yylex_destroy (yyscan_t yyscanner) >+int yylex_destroy(yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; > > /* Pop the buffer stack, destroying each element. */ >- while(YY_CURRENT_BUFFER){ >- yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner ); >- YY_CURRENT_BUFFER_LVALUE = NULL; >- yypop_buffer_state(yyscanner); >- } >- >- /* Destroy the stack itself. */ >- yyfree(yyg->yy_buffer_stack , yyscanner); >- yyg->yy_buffer_stack = NULL; >+ while (YY_CURRENT_BUFFER) >+ { >+ yy_delete_buffer(YY_CURRENT_BUFFER, yyscanner); >+ YY_CURRENT_BUFFER_LVALUE = NULL; >+ yypop_buffer_state(yyscanner); >+ } > >+ /* Destroy the stack itself. */ >+ yyfree(yyg->yy_buffer_stack, yyscanner); >+ yyg->yy_buffer_stack = NULL; > > /* Destroy the start condition stack. */ >- yyfree( yyg->yy_start_stack , yyscanner ); >- yyg->yy_start_stack = NULL; >- >- >- >+ yyfree(yyg->yy_start_stack, yyscanner); >+ yyg->yy_start_stack = NULL; > > /* Reset the globals. This is important in a non-reentrant scanner so the next time > * yylex() is called, initialization will occur. */ >- yy_init_globals( yyscanner); >+ yy_init_globals(yyscanner); > > /* Destroy the main struct (reentrant only). */ >- yyfree ( yyscanner , yyscanner ); >+ yyfree(yyscanner, yyscanner); > yyscanner = NULL; > return 0; > } > >- >- > /* > * Internal utility routines. > */ > >- >- > #ifndef yytext_ptr >-static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner) >+static void yy_flex_strncpy(char *s1, const char *s2, int n, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- (void)yyg; >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ (void)yyg; > >- int i; >- for ( i = 0; i < n; ++i ) >- s1[i] = s2[i]; >+ int i; >+ for (i = 0; i < n; ++i) >+ s1[i] = s2[i]; > } > #endif > >- >- > #ifdef YY_NEED_STRLEN >-static int yy_flex_strlen (const char * s , yyscan_t yyscanner) >+static int yy_flex_strlen(const char *s, yyscan_t yyscanner) > { >- int n; >- for ( n = 0; s[n]; ++n ) >- ; >+ int n; >+ for (n = 0; s[n]; ++n) >+ ; > >- return n; >+ return n; > } > #endif > >- >- >-void *yyalloc (yy_size_t size , yyscan_t yyscanner) >+void *yyalloc(yy_size_t size, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- (void)yyg; >- return malloc(size); >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ (void)yyg; >+ return malloc(size); > } > >- >- >-void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) >+void *yyrealloc(void *ptr, yy_size_t size, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- (void)yyg; >- >- /* The cast to (char *) in the following accommodates both >- * implementations that use char* generic pointers, and those >- * that use void* generic pointers. It works with the latter >- * because both ANSI C and C++ allow castless assignment from >- * any pointer type to void*, and deal with argument conversions >- * as though doing an assignment. >- */ >- return realloc(ptr, size); >-} >- >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ (void)yyg; > >+ /* The cast to (char *) in the following accommodates both >+ * implementations that use char* generic pointers, and those >+ * that use void* generic pointers. It works with the latter >+ * because both ANSI C and C++ allow castless assignment from >+ * any pointer type to void*, and deal with argument conversions >+ * as though doing an assignment. >+ */ >+ return realloc(ptr, size); >+} > >-void yyfree (void * ptr , yyscan_t yyscanner) >+void yyfree(void *ptr, yyscan_t yyscanner) > { >- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; >- (void)yyg; >- free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ >+ struct yyguts_t *yyg = (struct yyguts_t *)yyscanner; >+ (void)yyg; >+ free((char *)ptr); /* see yyrealloc() for (char *) cast */ > } > >- > #define YYTABLES_NAME "yytables" > >+namespace angle >+{ > >- >- >- >- >- >- >-namespace pp { >+namespace pp >+{ > > Tokenizer::Tokenizer(Diagnostics *diagnostics) : mHandle(nullptr), mMaxTokenSize(256) > { >@@ -2990,7 +2535,7 @@ Tokenizer::~Tokenizer() > destroyScanner(); > } > >-bool Tokenizer::init(size_t count, const char * const string[], const int length[]) >+bool Tokenizer::init(size_t count, const char *const string[], const int length[]) > { > if ((count > 0) && (string == 0)) > return false; >@@ -3032,8 +2577,7 @@ void Tokenizer::lex(Token *token) > > if (token->text.size() > mMaxTokenSize) > { >- mContext.diagnostics->report(Diagnostics::PP_TOKEN_TOO_LONG, >- token->location, token->text); >+ mContext.diagnostics->report(Diagnostics::PP_TOKEN_TOO_LONG, token->location, token->text); > token->text.erase(mMaxTokenSize); > } > >@@ -3066,4 +2610,4 @@ void Tokenizer::destroyScanner() > > } // namespace pp > >- >+} // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.h >index af4fd7ce7b1..4609179a06e 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.h >@@ -11,6 +11,9 @@ > #include "compiler/preprocessor/Input.h" > #include "compiler/preprocessor/Lexer.h" > >+namespace angle >+{ >+ > namespace pp > { > >@@ -55,4 +58,6 @@ class Tokenizer : public Lexer > > } // namespace pp > >+} // namespace angle >+ > #endif // COMPILER_PREPROCESSOR_TOKENIZER_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.l b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.l >index 096812d45f1..94db185ef7b 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.l >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.l >@@ -38,6 +38,12 @@ IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh. > #elif defined(_MSC_VER) > #pragma warning(disable: 4244) > #endif >+#if defined(__clang__) >+// Flex uses `/*FALLTHROUGH*/` instead of dedicated statements. >+#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" >+// Flex isn't semi-colon clean. >+#pragma clang diagnostic ignored "-Wextra-semi-stmt" >+#endif > > // Workaround for flex using the register keyword, deprecated in C++11. > #ifdef __cplusplus >@@ -47,7 +53,7 @@ IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh. > #endif > > typedef std::string YYSTYPE; >-typedef pp::SourceLocation YYLTYPE; >+typedef angle::pp::SourceLocation YYLTYPE; > > // Use the unused yycolumn variable to track file (string) number. > #define yyfileno yycolumn >@@ -60,11 +66,12 @@ typedef pp::SourceLocation YYLTYPE; > yyextra->lineStart = true; \ > } while(0); > >+#define YY_NO_INPUT > #define YY_USER_ACTION \ > do \ > { \ >- pp::Input* input = &yyextra->input; \ >- pp::Input::Location* scanLoc = &yyextra->scanLoc; \ >+ angle::pp::Input* input = &yyextra->input; \ >+ angle::pp::Input::Location* scanLoc = &yyextra->scanLoc; \ > while ((scanLoc->sIndex < input->count()) && \ > (scanLoc->cIndex >= input->length(scanLoc->sIndex))) \ > { \ >@@ -84,7 +91,7 @@ typedef pp::SourceLocation YYLTYPE; > %option noyywrap nounput never-interactive > %option reentrant bison-bridge bison-locations > %option prefix="pp" >-%option extra-type="pp::Tokenizer::Context*" >+%option extra-type="angle::pp::Tokenizer::Context*" > %x COMMENT > > NEWLINE \n|\r|\r\n >@@ -114,7 +121,7 @@ FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".") > if (yylineno == INT_MAX) > { > *yylval = "Integer overflow on line number"; >- return pp::Token::GOT_ERROR; >+ return angle::pp::Token::GOT_ERROR; > } > ++yylineno; > } >@@ -126,114 +133,114 @@ FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".") > # { > // # is only valid at start of line for preprocessor directives. > yylval->assign(1, yytext[0]); >- return yyextra->lineStart ? pp::Token::PP_HASH : pp::Token::PP_OTHER; >+ return yyextra->lineStart ? angle::pp::Token::PP_HASH : angle::pp::Token::PP_OTHER; > } > > {IDENTIFIER} { > yylval->assign(yytext, yyleng); >- return pp::Token::IDENTIFIER; >+ return angle::pp::Token::IDENTIFIER; > } > > ({DECIMAL_CONSTANT}[uU]?)|({OCTAL_CONSTANT}[uU]?)|({HEXADECIMAL_CONSTANT}[uU]?) { > yylval->assign(yytext, yyleng); >- return pp::Token::CONST_INT; >+ return angle::pp::Token::CONST_INT; > } > > ({DIGIT}+{EXPONENT_PART}[fF]?)|({FRACTIONAL_CONSTANT}{EXPONENT_PART}?[fF]?) { > yylval->assign(yytext, yyleng); >- return pp::Token::CONST_FLOAT; >+ return angle::pp::Token::CONST_FLOAT; > } > > /* Anything that starts with a {DIGIT} or .{DIGIT} must be a number. */ > /* Rule to catch all invalid integers and floats. */ > ({DIGIT}+[_a-zA-Z0-9.]*)|("."{DIGIT}+[_a-zA-Z0-9.]*) { > yylval->assign(yytext, yyleng); >- return pp::Token::PP_NUMBER; >+ return angle::pp::Token::PP_NUMBER; > } > > "++" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_INC; >+ return angle::pp::Token::OP_INC; > } > "--" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_DEC; >+ return angle::pp::Token::OP_DEC; > } > "<<" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_LEFT; >+ return angle::pp::Token::OP_LEFT; > } > ">>" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_RIGHT; >+ return angle::pp::Token::OP_RIGHT; > } > "<=" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_LE; >+ return angle::pp::Token::OP_LE; > } > ">=" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_GE; >+ return angle::pp::Token::OP_GE; > } > "==" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_EQ; >+ return angle::pp::Token::OP_EQ; > } > "!=" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_NE; >+ return angle::pp::Token::OP_NE; > } > "&&" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_AND; >+ return angle::pp::Token::OP_AND; > } > "^^" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_XOR; >+ return angle::pp::Token::OP_XOR; > } > "||" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_OR; >+ return angle::pp::Token::OP_OR; > } > "+=" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_ADD_ASSIGN; >+ return angle::pp::Token::OP_ADD_ASSIGN; > } > "-=" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_SUB_ASSIGN; >+ return angle::pp::Token::OP_SUB_ASSIGN; > } > "*=" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_MUL_ASSIGN; >+ return angle::pp::Token::OP_MUL_ASSIGN; > } > "/=" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_DIV_ASSIGN; >+ return angle::pp::Token::OP_DIV_ASSIGN; > } > "%=" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_MOD_ASSIGN; >+ return angle::pp::Token::OP_MOD_ASSIGN; > } > "<<=" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_LEFT_ASSIGN; >+ return angle::pp::Token::OP_LEFT_ASSIGN; > } > ">>=" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_RIGHT_ASSIGN; >+ return angle::pp::Token::OP_RIGHT_ASSIGN; > } > "&=" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_AND_ASSIGN; >+ return angle::pp::Token::OP_AND_ASSIGN; > } > "^=" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_XOR_ASSIGN; >+ return angle::pp::Token::OP_XOR_ASSIGN; > } > "|=" { > yylval->assign(yytext, yyleng); >- return pp::Token::OP_OR_ASSIGN; >+ return angle::pp::Token::OP_OR_ASSIGN; > } > > {PUNCTUATOR} { >@@ -247,7 +254,7 @@ FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".") > if (yylineno == INT_MAX) > { > *yylval = "Integer overflow on line number"; >- return pp::Token::GOT_ERROR; >+ return angle::pp::Token::GOT_ERROR; > } > ++yylineno; > yylval->assign(1, '\n'); >@@ -256,14 +263,14 @@ FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".") > > . { > yylval->assign(1, yytext[0]); >- return pp::Token::PP_OTHER; >+ return angle::pp::Token::PP_OTHER; > } > > <*><<EOF>> { > // YY_USER_ACTION is not invoked for handling EOF. > // Set the location for EOF token manually. >- pp::Input* input = &yyextra->input; >- pp::Input::Location* scanLoc = &yyextra->scanLoc; >+ angle::pp::Input* input = &yyextra->input; >+ angle::pp::Input::Location* scanLoc = &yyextra->scanLoc; > yy_size_t sIndexMax = input->count() ? input->count() - 1 : 0; > if (scanLoc->sIndex != sIndexMax) > { >@@ -279,14 +286,14 @@ FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".") > > // Line number overflows fake EOFs to exit early, check for this case. > if (yylineno == INT_MAX) { >- yyextra->diagnostics->report(pp::Diagnostics::PP_TOKENIZER_ERROR, >- pp::SourceLocation(yyfileno, yylineno), >+ yyextra->diagnostics->report(angle::pp::Diagnostics::PP_TOKENIZER_ERROR, >+ angle::pp::SourceLocation(yyfileno, yylineno), > "Integer overflow on line number"); > } > else if (YY_START == COMMENT) > { >- yyextra->diagnostics->report(pp::Diagnostics::PP_EOF_IN_COMMENT, >- pp::SourceLocation(yyfileno, yylineno), >+ yyextra->diagnostics->report(angle::pp::Diagnostics::PP_EOF_IN_COMMENT, >+ angle::pp::SourceLocation(yyfileno, yylineno), > "EOF while in a comment"); > } > yyterminate(); >@@ -294,6 +301,8 @@ FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".") > > %% > >+namespace angle { >+ > namespace pp { > > Tokenizer::Tokenizer(Diagnostics *diagnostics) : mHandle(nullptr), mMaxTokenSize(256) >@@ -382,3 +391,5 @@ void Tokenizer::destroyScanner() > > } // namespace pp > >+} // namespace angle >+ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/numeric_lex.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/numeric_lex.h >index 6ea779ab8f6..2203d8ac8f9 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/numeric_lex.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/numeric_lex.h >@@ -9,9 +9,11 @@ > #ifndef COMPILER_PREPROCESSOR_NUMERICLEX_H_ > #define COMPILER_PREPROCESSOR_NUMERICLEX_H_ > >-#include <cmath> > #include <sstream> > >+namespace angle >+{ >+ > namespace pp > { > >@@ -45,28 +47,8 @@ bool numeric_lex_int(const std::string &str, IntType *value) > return !stream.fail(); > } > >-template <typename FloatType> >-bool numeric_lex_float(const std::string &str, FloatType *value) >-{ >-// On 64-bit Intel Android, istringstream is broken. Until this is fixed in >-// a newer NDK, don't use it. Android doesn't have locale support, so this >-// doesn't have to force the C locale. >-// TODO(thakis): Remove this once this bug has been fixed in the NDK and >-// that NDK has been rolled into chromium. >-#if defined(ANGLE_PLATFORM_ANDROID) && __x86_64__ >- *value = strtod(str.c_str(), nullptr); >- return errno != ERANGE; >-#else >- std::istringstream stream(str); >- // Force "C" locale so that decimal character is always '.', and >- // not dependent on the current locale. >- stream.imbue(std::locale::classic()); >- >- stream >> (*value); >- return !stream.fail() && std::isfinite(*value); >-#endif >-} >+} // namespace pp > >-} // namespace pp. >+} // namespace angle > > #endif // COMPILER_PREPROCESSOR_NUMERICLEX_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.cpp >index b04fc28259f..e2d4df3d5a7 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.cpp >@@ -9,8 +9,8 @@ > #include "compiler/translator/ASTMetadataHLSL.h" > > #include "compiler/translator/CallDAG.h" >-#include "compiler/translator/IntermTraverse.h" > #include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > > namespace sh > { >@@ -35,15 +35,15 @@ class PullGradient : public TIntermTraverser > ASSERT(index < metadataList->size()); > > // ESSL 100 builtin gradient functions >- mGradientBuiltinFunctions.insert("texture2D"); >- mGradientBuiltinFunctions.insert("texture2DProj"); >- mGradientBuiltinFunctions.insert("textureCube"); >+ mGradientBuiltinFunctions.insert(ImmutableString("texture2D")); >+ mGradientBuiltinFunctions.insert(ImmutableString("texture2DProj")); >+ mGradientBuiltinFunctions.insert(ImmutableString("textureCube")); > > // ESSL 300 builtin gradient functions >- mGradientBuiltinFunctions.insert("texture"); >- mGradientBuiltinFunctions.insert("textureProj"); >- mGradientBuiltinFunctions.insert("textureOffset"); >- mGradientBuiltinFunctions.insert("textureProjOffset"); >+ mGradientBuiltinFunctions.insert(ImmutableString("texture")); >+ mGradientBuiltinFunctions.insert(ImmutableString("textureProj")); >+ mGradientBuiltinFunctions.insert(ImmutableString("textureOffset")); >+ mGradientBuiltinFunctions.insert(ImmutableString("textureProjOffset")); > > // ESSL 310 doesn't add builtin gradient functions > } >@@ -105,6 +105,7 @@ class PullGradient : public TIntermTraverser > case EOpDFdy: > case EOpFwidth: > onGradient(); >+ break; > default: > break; > } >@@ -119,7 +120,7 @@ class PullGradient : public TIntermTraverser > { > if (node->getOp() == EOpCallFunctionInAST) > { >- size_t calleeIndex = mDag.findIndex(node->getFunctionSymbolInfo()); >+ size_t calleeIndex = mDag.findIndex(node->getFunction()->uniqueId()); > ASSERT(calleeIndex != CallDAG::InvalidIndex && calleeIndex < mIndex); > > if ((*mMetadataList)[calleeIndex].mUsesGradient) >@@ -129,7 +130,7 @@ class PullGradient : public TIntermTraverser > } > else if (node->getOp() == EOpCallBuiltInFunction) > { >- if (mGradientBuiltinFunctions.find(node->getFunctionSymbolInfo()->getName()) != >+ if (mGradientBuiltinFunctions.find(node->getFunction()->name()) != > mGradientBuiltinFunctions.end()) > { > onGradient(); >@@ -151,7 +152,7 @@ class PullGradient : public TIntermTraverser > std::vector<TIntermNode *> mParents; > > // A list of builtin functions that use gradients >- std::set<TString> mGradientBuiltinFunctions; >+ std::set<ImmutableString> mGradientBuiltinFunctions; > }; > > // Traverses the AST of a function definition to compute the the discontinuous loops >@@ -169,8 +170,7 @@ class PullComputeDiscontinuousAndGradientLoops : public TIntermTraverser > mMetadata(&(*metadataList)[index]), > mIndex(index), > mDag(dag) >- { >- } >+ {} > > void traverse(TIntermFunctionDefinition *node) > { >@@ -288,7 +288,7 @@ class PullComputeDiscontinuousAndGradientLoops : public TIntermTraverser > { > if (visit == PreVisit && node->getOp() == EOpCallFunctionInAST) > { >- size_t calleeIndex = mDag.findIndex(node->getFunctionSymbolInfo()); >+ size_t calleeIndex = mDag.findIndex(node->getFunction()->uniqueId()); > ASSERT(calleeIndex != CallDAG::InvalidIndex && calleeIndex < mIndex); > > if ((*mMetadataList)[calleeIndex].mHasGradientLoopInCallGraph) >@@ -335,8 +335,7 @@ class PushDiscontinuousLoops : public TIntermTraverser > mIndex(index), > mDag(dag), > mNestedDiscont(mMetadata->mCalledInDiscontinuousLoop ? 1 : 0) >- { >- } >+ {} > > void traverse(TIntermFunctionDefinition *node) > { >@@ -367,7 +366,7 @@ class PushDiscontinuousLoops : public TIntermTraverser > case EOpCallFunctionInAST: > if (visit == PreVisit && mNestedDiscont > 0) > { >- size_t calleeIndex = mDag.findIndex(node->getFunctionSymbolInfo()); >+ size_t calleeIndex = mDag.findIndex(node->getFunction()->uniqueId()); > ASSERT(calleeIndex != CallDAG::InvalidIndex && calleeIndex < mIndex); > > (*mMetadataList)[calleeIndex].mCalledInDiscontinuousLoop = true; >@@ -387,7 +386,7 @@ class PushDiscontinuousLoops : public TIntermTraverser > > int mNestedDiscont; > }; >-} >+} // namespace > > bool ASTMetadataHLSL::hasGradientInCallGraph(TIntermLoop *node) > { >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.h >index 550a522b864..da00faabeb0 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.h >@@ -27,8 +27,7 @@ struct ASTMetadataHLSL > mCalledInDiscontinuousLoop(false), > mHasGradientLoopInCallGraph(false), > mNeedsLod0(false) >- { >- } >+ {} > > // Here "something uses a gradient" means here that it either contains a > // gradient operation, or a call to a function that uses a gradient. >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/AddAndTrueToLoopCondition.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/AddAndTrueToLoopCondition.cpp >deleted file mode 100644 >index 6a051042330..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/AddAndTrueToLoopCondition.cpp >+++ /dev/null >@@ -1,59 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >- >-#include "compiler/translator/AddAndTrueToLoopCondition.h" >- >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-// An AST traverser that rewrites for and while loops by replacing "condition" with >-// "condition && true" to work around condition bug on Intel Mac. >-class AddAndTrueToLoopConditionTraverser : public TIntermTraverser >-{ >- public: >- AddAndTrueToLoopConditionTraverser() : TIntermTraverser(true, false, false) {} >- >- bool visitLoop(Visit, TIntermLoop *loop) override >- { >- // do-while loop doesn't have this bug. >- if (loop->getType() != ELoopFor && loop->getType() != ELoopWhile) >- { >- return true; >- } >- >- // For loop may not have a condition. >- if (loop->getCondition() == nullptr) >- { >- return true; >- } >- >- // Constant true. >- TConstantUnion *trueConstant = new TConstantUnion(); >- trueConstant->setBConst(true); >- TIntermTyped *trueValue = new TIntermConstantUnion(trueConstant, TType(EbtBool)); >- >- // CONDITION && true. >- TIntermBinary *andOp = new TIntermBinary(EOpLogicalAnd, loop->getCondition(), trueValue); >- loop->setCondition(andOp); >- >- return true; >- } >-}; >- >-} // anonymous namespace >- >-void AddAndTrueToLoopCondition(TIntermNode *root) >-{ >- AddAndTrueToLoopConditionTraverser traverser; >- root->traverse(&traverser); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/AddAndTrueToLoopCondition.h b/Source/ThirdParty/ANGLE/src/compiler/translator/AddAndTrueToLoopCondition.h >deleted file mode 100644 >index 34debe0ed97..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/AddAndTrueToLoopCondition.h >+++ /dev/null >@@ -1,20 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >- >-// Rewrite condition in for and while loops to work around driver bug on Intel Mac. >- >-#ifndef COMPILER_TRANSLATOR_ADDANDTRUETOLOOPCONDITION_H_ >-#define COMPILER_TRANSLATOR_ADDANDTRUETOLOOPCONDITION_H_ >- >-class TIntermNode; >-namespace sh >-{ >- >-void AddAndTrueToLoopCondition(TIntermNode *root); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_ADDANDTRUETOLOOPCONDITION_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/AddDefaultReturnStatements.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/AddDefaultReturnStatements.cpp >deleted file mode 100644 >index 4dfe60c0bcb..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/AddDefaultReturnStatements.cpp >+++ /dev/null >@@ -1,58 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >-// AddDefaultReturnStatements.cpp: Add default return statements to functions that do not end in a >-// return. >-// >- >-#include "compiler/translator/AddDefaultReturnStatements.h" >- >-#include "compiler/translator/IntermNode.h" >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/util.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-bool NeedsReturnStatement(TIntermFunctionDefinition *node, TType *returnType) >-{ >- *returnType = node->getFunctionPrototype()->getType(); >- if (returnType->getBasicType() == EbtVoid) >- { >- return false; >- } >- >- TIntermBlock *bodyNode = node->getBody(); >- TIntermBranch *returnNode = bodyNode->getSequence()->back()->getAsBranchNode(); >- if (returnNode != nullptr && returnNode->getFlowOp() == EOpReturn) >- { >- return false; >- } >- >- return true; >-} >- >-} // anonymous namespace >- >-void AddDefaultReturnStatements(TIntermBlock *root) >-{ >- TType returnType; >- for (TIntermNode *node : *root->getSequence()) >- { >- TIntermFunctionDefinition *definition = node->getAsFunctionDefinition(); >- if (definition != nullptr && NeedsReturnStatement(definition, &returnType)) >- { >- TIntermBranch *branch = new TIntermBranch(EOpReturn, CreateZeroNode(returnType)); >- >- TIntermBlock *bodyNode = definition->getBody(); >- bodyNode->getSequence()->push_back(branch); >- } >- } >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/AddDefaultReturnStatements.h b/Source/ThirdParty/ANGLE/src/compiler/translator/AddDefaultReturnStatements.h >deleted file mode 100644 >index 40a70ad8c2a..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/AddDefaultReturnStatements.h >+++ /dev/null >@@ -1,22 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >-// AddDefaultReturnStatements.h: Add default return statements to functions that do not end in a >-// return. >-// >- >-#ifndef COMPILER_TRANSLATOR_ADDDEFAULTRETURNSTATEMENTS_H_ >-#define COMPILER_TRANSLATOR_ADDDEFAULTRETURNSTATEMENTS_H_ >- >-class TIntermBlock; >- >-namespace sh >-{ >- >-void AddDefaultReturnStatements(TIntermBlock *root); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_ADDDEFAULTRETURNSTATEMENTS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ArrayReturnValueToOutParameter.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ArrayReturnValueToOutParameter.cpp >deleted file mode 100644 >index 17721fb0dc0..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ArrayReturnValueToOutParameter.cpp >+++ /dev/null >@@ -1,213 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// The ArrayReturnValueToOutParameter function changes return values of an array type to out >-// parameters in function definitions, prototypes, and call sites. >- >-#include "compiler/translator/ArrayReturnValueToOutParameter.h" >- >-#include <map> >- >-#include "compiler/translator/IntermTraverse.h" >-#include "compiler/translator/SymbolTable.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-void CopyAggregateChildren(TIntermAggregateBase *from, TIntermAggregateBase *to) >-{ >- const TIntermSequence *fromSequence = from->getSequence(); >- for (size_t ii = 0; ii < fromSequence->size(); ++ii) >- { >- to->getSequence()->push_back(fromSequence->at(ii)); >- } >-} >- >-TIntermSymbol *CreateReturnValueSymbol(const TSymbolUniqueId &id, const TType &type) >-{ >- TIntermSymbol *node = new TIntermSymbol(id, "angle_return", type); >- node->setInternal(true); >- node->getTypePointer()->setQualifier(EvqOut); >- return node; >-} >- >-TIntermAggregate *CreateReplacementCall(TIntermAggregate *originalCall, >- TIntermTyped *returnValueTarget) >-{ >- TIntermSequence *replacementArguments = new TIntermSequence(); >- TIntermSequence *originalArguments = originalCall->getSequence(); >- for (auto &arg : *originalArguments) >- { >- replacementArguments->push_back(arg); >- } >- replacementArguments->push_back(returnValueTarget); >- TIntermAggregate *replacementCall = TIntermAggregate::CreateFunctionCall( >- TType(EbtVoid), originalCall->getFunctionSymbolInfo()->getId(), >- originalCall->getFunctionSymbolInfo()->getNameObj(), replacementArguments); >- replacementCall->setLine(originalCall->getLine()); >- return replacementCall; >-} >- >-class ArrayReturnValueToOutParameterTraverser : private TIntermTraverser >-{ >- public: >- static void apply(TIntermNode *root, TSymbolTable *symbolTable); >- >- private: >- ArrayReturnValueToOutParameterTraverser(TSymbolTable *symbolTable); >- >- bool visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) override; >- bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override; >- bool visitAggregate(Visit visit, TIntermAggregate *node) override; >- bool visitBranch(Visit visit, TIntermBranch *node) override; >- bool visitBinary(Visit visit, TIntermBinary *node) override; >- >- // Set when traversal is inside a function with array return value. >- TIntermFunctionDefinition *mFunctionWithArrayReturnValue; >- >- // Map from function symbol ids to array return value ids. >- std::map<int, TSymbolUniqueId *> mReturnValueIds; >-}; >- >-void ArrayReturnValueToOutParameterTraverser::apply(TIntermNode *root, TSymbolTable *symbolTable) >-{ >- ArrayReturnValueToOutParameterTraverser arrayReturnValueToOutParam(symbolTable); >- root->traverse(&arrayReturnValueToOutParam); >- arrayReturnValueToOutParam.updateTree(); >-} >- >-ArrayReturnValueToOutParameterTraverser::ArrayReturnValueToOutParameterTraverser( >- TSymbolTable *symbolTable) >- : TIntermTraverser(true, false, true, symbolTable), mFunctionWithArrayReturnValue(nullptr) >-{ >-} >- >-bool ArrayReturnValueToOutParameterTraverser::visitFunctionDefinition( >- Visit visit, >- TIntermFunctionDefinition *node) >-{ >- if (node->getFunctionPrototype()->isArray() && visit == PreVisit) >- { >- // Replacing the function header is done on visitFunctionPrototype(). >- mFunctionWithArrayReturnValue = node; >- } >- if (visit == PostVisit) >- { >- mFunctionWithArrayReturnValue = nullptr; >- } >- return true; >-} >- >-bool ArrayReturnValueToOutParameterTraverser::visitFunctionPrototype(Visit visit, >- TIntermFunctionPrototype *node) >-{ >- if (visit == PreVisit && node->isArray()) >- { >- // Replace the whole prototype node with another node that has the out parameter >- // added. Also set the function to return void. >- TIntermFunctionPrototype *replacement = >- new TIntermFunctionPrototype(TType(EbtVoid), node->getFunctionSymbolInfo()->getId()); >- CopyAggregateChildren(node, replacement); >- const TSymbolUniqueId &functionId = node->getFunctionSymbolInfo()->getId(); >- if (mReturnValueIds.find(functionId.get()) == mReturnValueIds.end()) >- { >- mReturnValueIds[functionId.get()] = new TSymbolUniqueId(mSymbolTable); >- } >- replacement->getSequence()->push_back( >- CreateReturnValueSymbol(*mReturnValueIds[functionId.get()], node->getType())); >- *replacement->getFunctionSymbolInfo() = *node->getFunctionSymbolInfo(); >- replacement->setLine(node->getLine()); >- >- queueReplacement(replacement, OriginalNode::IS_DROPPED); >- } >- return false; >-} >- >-bool ArrayReturnValueToOutParameterTraverser::visitAggregate(Visit visit, TIntermAggregate *node) >-{ >- ASSERT(!node->isArray() || node->getOp() != EOpCallInternalRawFunction); >- if (visit == PreVisit && node->isArray() && node->getOp() == EOpCallFunctionInAST) >- { >- // Handle call sites where the returned array is not assigned. >- // Examples where f() is a function returning an array: >- // 1. f(); >- // 2. another_array == f(); >- // 3. another_function(f()); >- // 4. return f(); >- // Cases 2 to 4 are already converted to simpler cases by >- // SeparateExpressionsReturningArrays, so we only need to worry about the case where a >- // function call returning an array forms an expression by itself. >- TIntermBlock *parentBlock = getParentNode()->getAsBlock(); >- if (parentBlock) >- { >- nextTemporaryId(); >- TIntermSequence replacements; >- replacements.push_back(createTempDeclaration(node->getType())); >- TIntermSymbol *returnSymbol = createTempSymbol(node->getType()); >- replacements.push_back(CreateReplacementCall(node, returnSymbol)); >- mMultiReplacements.push_back( >- NodeReplaceWithMultipleEntry(parentBlock, node, replacements)); >- } >- return false; >- } >- return true; >-} >- >-bool ArrayReturnValueToOutParameterTraverser::visitBranch(Visit visit, TIntermBranch *node) >-{ >- if (mFunctionWithArrayReturnValue && node->getFlowOp() == EOpReturn) >- { >- // Instead of returning a value, assign to the out parameter and then return. >- TIntermSequence replacements; >- >- TIntermTyped *expression = node->getExpression(); >- ASSERT(expression != nullptr); >- const TSymbolUniqueId &functionId = >- mFunctionWithArrayReturnValue->getFunctionSymbolInfo()->getId(); >- ASSERT(mReturnValueIds.find(functionId.get()) != mReturnValueIds.end()); >- const TSymbolUniqueId &returnValueId = *mReturnValueIds[functionId.get()]; >- TIntermSymbol *returnValueSymbol = >- CreateReturnValueSymbol(returnValueId, expression->getType()); >- TIntermBinary *replacementAssignment = >- new TIntermBinary(EOpAssign, returnValueSymbol, expression); >- replacementAssignment->setLine(expression->getLine()); >- replacements.push_back(replacementAssignment); >- >- TIntermBranch *replacementBranch = new TIntermBranch(EOpReturn, nullptr); >- replacementBranch->setLine(node->getLine()); >- replacements.push_back(replacementBranch); >- >- mMultiReplacements.push_back( >- NodeReplaceWithMultipleEntry(getParentNode()->getAsBlock(), node, replacements)); >- } >- return false; >-} >- >-bool ArrayReturnValueToOutParameterTraverser::visitBinary(Visit visit, TIntermBinary *node) >-{ >- if (node->getOp() == EOpAssign && node->getLeft()->isArray()) >- { >- TIntermAggregate *rightAgg = node->getRight()->getAsAggregate(); >- ASSERT(rightAgg == nullptr || rightAgg->getOp() != EOpCallInternalRawFunction); >- if (rightAgg != nullptr && rightAgg->getOp() == EOpCallFunctionInAST) >- { >- TIntermAggregate *replacementCall = CreateReplacementCall(rightAgg, node->getLeft()); >- queueReplacement(replacementCall, OriginalNode::IS_DROPPED); >- } >- } >- return false; >-} >- >-} // namespace >- >-void ArrayReturnValueToOutParameter(TIntermNode *root, TSymbolTable *symbolTable) >-{ >- ArrayReturnValueToOutParameterTraverser::apply(root, symbolTable); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ArrayReturnValueToOutParameter.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ArrayReturnValueToOutParameter.h >deleted file mode 100644 >index 469c7a3b149..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ArrayReturnValueToOutParameter.h >+++ /dev/null >@@ -1,22 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// The ArrayReturnValueToOutParameter function changes return values of an array type to out >-// parameters in function definitions, prototypes and call sites. >- >-#ifndef COMPILER_TRANSLATOR_ARRAYRETURNVALUETOOUTPARAMETER_H_ >-#define COMPILER_TRANSLATOR_ARRAYRETURNVALUETOOUTPARAMETER_H_ >- >-namespace sh >-{ >- >-class TIntermNode; >-class TSymbolTable; >- >-void ArrayReturnValueToOutParameter(TIntermNode *root, TSymbolTable *symbolTable); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_ARRAYRETURNVALUETOOUTPARAMETER_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/AtomicCounterFunctionHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/AtomicCounterFunctionHLSL.cpp >new file mode 100644 >index 00000000000..52b8b878c36 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/AtomicCounterFunctionHLSL.cpp >@@ -0,0 +1,112 @@ >+// >+// Copyright (c) 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. >+// >+// AtomicCounterFunctionHLSL: Class for writing implementation of atomic counter functions into HLSL >+// output. >+// >+ >+#include "compiler/translator/AtomicCounterFunctionHLSL.h" >+ >+#include "compiler/translator/Common.h" >+#include "compiler/translator/ImmutableStringBuilder.h" >+#include "compiler/translator/InfoSink.h" >+#include "compiler/translator/IntermNode.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+constexpr ImmutableString kAtomicCounter("atomicCounter"); >+constexpr ImmutableString kAtomicCounterIncrement("atomicCounterIncrement"); >+constexpr ImmutableString kAtomicCounterDecrement("atomicCounterDecrement"); >+constexpr ImmutableString kAtomicCounterBaseName("_acbase_"); >+} // namespace >+ >+AtomicCounterFunctionHLSL::AtomicCounterFunctionHLSL(bool forceResolution) >+ : mForceResolution(forceResolution) >+{} >+ >+ImmutableString AtomicCounterFunctionHLSL::useAtomicCounterFunction(const ImmutableString &name) >+{ >+ // The largest string that will be create created is "_acbase_increment" or "_acbase_decrement" >+ ImmutableStringBuilder hlslFunctionNameSB(kAtomicCounterBaseName.length() + >+ strlen("increment")); >+ hlslFunctionNameSB << kAtomicCounterBaseName; >+ >+ AtomicCounterFunction atomicMethod; >+ if (kAtomicCounter == name) >+ { >+ atomicMethod = AtomicCounterFunction::LOAD; >+ hlslFunctionNameSB << "load"; >+ } >+ else if (kAtomicCounterIncrement == name) >+ { >+ atomicMethod = AtomicCounterFunction::INCREMENT; >+ hlslFunctionNameSB << "increment"; >+ } >+ else if (kAtomicCounterDecrement == name) >+ { >+ atomicMethod = AtomicCounterFunction::DECREMENT; >+ hlslFunctionNameSB << "decrement"; >+ } >+ else >+ { >+ atomicMethod = AtomicCounterFunction::INVALID; >+ UNREACHABLE(); >+ } >+ >+ ImmutableString hlslFunctionName(hlslFunctionNameSB); >+ mAtomicCounterFunctions[hlslFunctionName] = atomicMethod; >+ >+ return hlslFunctionName; >+} >+ >+void AtomicCounterFunctionHLSL::atomicCounterFunctionHeader(TInfoSinkBase &out) >+{ >+ for (auto &atomicFunction : mAtomicCounterFunctions) >+ { >+ out << "uint " << atomicFunction.first >+ << "(in RWByteAddressBuffer counter, int address)\n" >+ "{\n" >+ " uint ret;\n"; >+ >+ switch (atomicFunction.second) >+ { >+ case AtomicCounterFunction::INCREMENT: >+ out << " counter.InterlockedAdd(address, 1u, ret);\n"; >+ break; >+ case AtomicCounterFunction::DECREMENT: >+ out << " counter.InterlockedAdd(address, 0u - 1u, ret);\n" >+ " ret -= 1u;\n"; // atomicCounterDecrement is a post-decrement op >+ break; >+ case AtomicCounterFunction::LOAD: >+ out << " ret = counter.Load(address);\n"; >+ break; >+ default: >+ UNREACHABLE(); >+ break; >+ } >+ >+ if (mForceResolution && atomicFunction.second != AtomicCounterFunction::LOAD) >+ { >+ out << " if (ret == 0) {\n" >+ " ret = 0 - ret;\n" >+ " }\n"; >+ } >+ >+ out << " return ret;\n" >+ "}\n\n"; >+ } >+} >+ >+ImmutableString getAtomicCounterNameForBinding(int binding) >+{ >+ std::stringstream counterName = sh::InitializeStream<std::stringstream>(); >+ counterName << kAtomicCounterBaseName << binding; >+ return ImmutableString(counterName.str()); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/AtomicCounterFunctionHLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/AtomicCounterFunctionHLSL.h >new file mode 100644 >index 00000000000..e658df3c203 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/AtomicCounterFunctionHLSL.h >@@ -0,0 +1,50 @@ >+// >+// Copyright (c) 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. >+// >+// AtomicCounterFunctionHLSL: Class for writing implementation of atomic counter functions into HLSL >+// output. >+// >+ >+#ifndef COMPILER_TRANSLATOR_ATOMICCOUNTERFUNCTIONHLSL_H_ >+#define COMPILER_TRANSLATOR_ATOMICCOUNTERFUNCTIONHLSL_H_ >+ >+#include <map> >+ >+#include "compiler/translator/Common.h" >+#include "compiler/translator/ImmutableString.h" >+ >+namespace sh >+{ >+ >+class TInfoSinkBase; >+struct TLayoutQualifier; >+ >+class AtomicCounterFunctionHLSL final : angle::NonCopyable >+{ >+ public: >+ AtomicCounterFunctionHLSL(bool forceResolution); >+ >+ ImmutableString useAtomicCounterFunction(const ImmutableString &name); >+ >+ void atomicCounterFunctionHeader(TInfoSinkBase &out); >+ >+ private: >+ enum class AtomicCounterFunction >+ { >+ LOAD, >+ INCREMENT, >+ DECREMENT, >+ INVALID >+ }; >+ >+ std::map<ImmutableString, AtomicCounterFunction> mAtomicCounterFunctions; >+ bool mForceResolution; >+}; >+ >+ImmutableString getAtomicCounterNameForBinding(int binding); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_ATOMICCOUNTERFUNCTIONHLSL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/BaseTypes.h b/Source/ThirdParty/ANGLE/src/compiler/translator/BaseTypes.h >index b2070f3bafb..62a0e947a23 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/BaseTypes.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/BaseTypes.h >@@ -10,8 +10,9 @@ > #include <algorithm> > #include <array> > >-#include "common/debug.h" > #include "GLSLANG/ShaderLang.h" >+#include "common/debug.h" >+#include "compiler/translator/ImmutableString.h" > > namespace sh > { >@@ -56,18 +57,12 @@ enum TBasicType > EbtInt, > EbtUInt, > EbtBool, >- EbtGVec4, // non type: represents vec4, ivec4, and uvec4 >- EbtGenType, // non type: represents float, vec2, vec3, and vec4 >- EbtGenIType, // non type: represents int, ivec2, ivec3, and ivec4 >- EbtGenUType, // non type: represents uint, uvec2, uvec3, and uvec4 >- EbtGenBType, // non type: represents bool, bvec2, bvec3, and bvec4 >- EbtVec, // non type: represents vec2, vec3, and vec4 >- EbtIVec, // non type: represents ivec2, ivec3, and ivec4 >- EbtUVec, // non type: represents uvec2, uvec3, and uvec4 >- EbtBVec, // non type: represents bvec2, bvec3, and bvec4 >+ >+ EbtAtomicCounter, > EbtYuvCscStandardEXT, // Only valid if EXT_YUV_target exists. >+ > EbtGuardSamplerBegin, // non type: see implementation of IsSampler() >- EbtSampler2D, >+ EbtSampler2D = EbtGuardSamplerBegin, > EbtSampler3D, > EbtSamplerCube, > EbtSampler2DArray, >@@ -75,30 +70,27 @@ enum TBasicType > EbtSamplerExternal2DY2YEXT, // Only valid if GL_EXT_YUV_target exists. > EbtSampler2DRect, // Only valid if GL_ARB_texture_rectangle exists. > EbtSampler2DMS, >+ EbtSampler2DMSArray, > EbtISampler2D, > EbtISampler3D, > EbtISamplerCube, > EbtISampler2DArray, > EbtISampler2DMS, >+ EbtISampler2DMSArray, > EbtUSampler2D, > EbtUSampler3D, > EbtUSamplerCube, > EbtUSampler2DArray, > EbtUSampler2DMS, >+ EbtUSampler2DMSArray, > EbtSampler2DShadow, > EbtSamplerCubeShadow, > EbtSampler2DArrayShadow, >- EbtGuardSamplerEnd, // non type: see implementation of IsSampler() >- EbtGSampler2D, // non type: represents sampler2D, isampler2D, and usampler2D >- EbtGSampler3D, // non type: represents sampler3D, isampler3D, and usampler3D >- EbtGSamplerCube, // non type: represents samplerCube, isamplerCube, and usamplerCube >- EbtGSampler2DArray, // non type: represents sampler2DArray, isampler2DArray, and >- // usampler2DArray >- EbtGSampler2DMS, // non type: represents sampler2DMS, isampler2DMS, and usampler2DMS >+ EbtGuardSamplerEnd = EbtSampler2DArrayShadow, // non type: see implementation of IsSampler() > > // images > EbtGuardImageBegin, >- EbtImage2D, >+ EbtImage2D = EbtGuardImageBegin, > EbtIImage2D, > EbtUImage2D, > EbtImage3D, >@@ -110,94 +102,41 @@ enum TBasicType > EbtImageCube, > EbtIImageCube, > EbtUImageCube, >- EbtGuardImageEnd, >+ EbtGuardImageEnd = EbtUImageCube, > >- EbtGuardGImageBegin, >- EbtGImage2D, // non type: represents image2D, uimage2D, iimage2D >- EbtGImage3D, // non type: represents image3D, uimage3D, iimage3D >- EbtGImage2DArray, // non type: represents image2DArray, uimage2DArray, iimage2DArray >- EbtGImageCube, // non type: represents imageCube, uimageCube, iimageCube >- EbtGuardGImageEnd, >+ EbtLastSimpleType = EbtGuardImageEnd, > > EbtStruct, > EbtInterfaceBlock, >- EbtAddress, // should be deprecated?? >- >- EbtAtomicCounter, > > // end of list >- EbtLast >+ EbtLast = EbtInterfaceBlock > }; > >-inline TBasicType convertGImageToFloatImage(TBasicType type) >-{ >- switch (type) >- { >- case EbtGImage2D: >- return EbtImage2D; >- case EbtGImage3D: >- return EbtImage3D; >- case EbtGImage2DArray: >- return EbtImage2DArray; >- case EbtGImageCube: >- return EbtImageCube; >- default: >- UNREACHABLE(); >- } >- return EbtLast; >-} >- >-inline TBasicType convertGImageToIntImage(TBasicType type) >+constexpr char GetBasicMangledName(TBasicType t) > { >- switch (type) >+ if (t > EbtLastSimpleType) > { >- case EbtGImage2D: >- return EbtIImage2D; >- case EbtGImage3D: >- return EbtIImage3D; >- case EbtGImage2DArray: >- return EbtIImage2DArray; >- case EbtGImageCube: >- return EbtIImageCube; >- default: >- UNREACHABLE(); >+ return '{'; > } >- return EbtLast; >-} >- >-inline TBasicType convertGImageToUnsignedImage(TBasicType type) >-{ >- switch (type) >+ static_assert(EbtLastSimpleType < 52, "We only use alphabetic characters for mangled names"); >+ if (t < 26) > { >- case EbtGImage2D: >- return EbtUImage2D; >- case EbtGImage3D: >- return EbtUImage3D; >- case EbtGImage2DArray: >- return EbtUImage2DArray; >- case EbtGImageCube: >- return EbtUImageCube; >- default: >- UNREACHABLE(); >+ return static_cast<char>('A' + t); > } >- return EbtLast; >+ return static_cast<char>('a' - 26 + t); > } > > const char *getBasicString(TBasicType t); > > inline bool IsSampler(TBasicType type) > { >- return type > EbtGuardSamplerBegin && type < EbtGuardSamplerEnd; >+ return type >= EbtGuardSamplerBegin && type <= EbtGuardSamplerEnd; > } > > inline bool IsImage(TBasicType type) > { >- return type > EbtGuardImageBegin && type < EbtGuardImageEnd; >-} >- >-inline bool IsGImage(TBasicType type) >-{ >- return type > EbtGuardGImageBegin && type < EbtGuardGImageEnd; >+ return type >= EbtGuardImageBegin && type <= EbtGuardImageEnd; > } > > inline bool IsAtomicCounter(TBasicType type) >@@ -219,11 +158,13 @@ inline bool IsIntegerSampler(TBasicType type) > case EbtISamplerCube: > case EbtISampler2DArray: > case EbtISampler2DMS: >+ case EbtISampler2DMSArray: > case EbtUSampler2D: > case EbtUSampler3D: > case EbtUSamplerCube: > case EbtUSampler2DArray: > case EbtUSampler2DMS: >+ case EbtUSampler2DMSArray: > return true; > case EbtSampler2D: > case EbtSampler3D: >@@ -236,6 +177,7 @@ inline bool IsIntegerSampler(TBasicType type) > case EbtSamplerCubeShadow: > case EbtSampler2DArrayShadow: > case EbtSampler2DMS: >+ case EbtSampler2DMSArray: > return false; > default: > assert(!IsSampler(type)); >@@ -244,6 +186,31 @@ inline bool IsIntegerSampler(TBasicType type) > return false; > } > >+inline bool IsIntegerSamplerUnsigned(TBasicType type) >+{ >+ switch (type) >+ { >+ case EbtISampler2D: >+ case EbtISampler3D: >+ case EbtISamplerCube: >+ case EbtISampler2DArray: >+ case EbtISampler2DMS: >+ case EbtISampler2DMSArray: >+ return false; >+ case EbtUSampler2D: >+ case EbtUSampler3D: >+ case EbtUSamplerCube: >+ case EbtUSampler2DArray: >+ case EbtUSampler2DMS: >+ case EbtUSampler2DMSArray: >+ return true; >+ default: >+ assert(!IsIntegerSampler(type)); >+ } >+ >+ return false; >+} >+ > inline bool IsSampler2DMS(TBasicType type) > { > switch (type) >@@ -257,6 +224,19 @@ inline bool IsSampler2DMS(TBasicType type) > } > } > >+inline bool IsSampler2DMSArray(TBasicType type) >+{ >+ switch (type) >+ { >+ case EbtSampler2DMSArray: >+ case EbtISampler2DMSArray: >+ case EbtUSampler2DMSArray: >+ return true; >+ default: >+ return false; >+ } >+} >+ > inline bool IsFloatImage(TBasicType type) > { > switch (type) >@@ -307,6 +287,8 @@ inline bool IsUnsignedImage(TBasicType type) > return false; > } > >+// Samplers are divided into 4 disjoint categories: 2D, cube, 3D, and array. >+// Array samplers are not 2D samplers. > inline bool IsSampler2D(TBasicType type) > { > switch (type) >@@ -314,18 +296,21 @@ inline bool IsSampler2D(TBasicType type) > case EbtSampler2D: > case EbtISampler2D: > case EbtUSampler2D: >- case EbtSampler2DArray: >- case EbtISampler2DArray: >- case EbtUSampler2DArray: > case EbtSampler2DRect: > case EbtSamplerExternalOES: > case EbtSamplerExternal2DY2YEXT: > case EbtSampler2DShadow: >- case EbtSampler2DArrayShadow: > case EbtSampler2DMS: > case EbtISampler2DMS: > case EbtUSampler2DMS: > return true; >+ case EbtSampler2DArray: >+ case EbtISampler2DArray: >+ case EbtUSampler2DArray: >+ case EbtSampler2DMSArray: >+ case EbtISampler2DMSArray: >+ case EbtUSampler2DMSArray: >+ case EbtSampler2DArrayShadow: > case EbtSampler3D: > case EbtISampler3D: > case EbtUSampler3D: >@@ -357,14 +342,17 @@ inline bool IsSamplerCube(TBasicType type) > case EbtSampler2DRect: > case EbtSampler2DArray: > case EbtSampler2DMS: >+ case EbtSampler2DMSArray: > case EbtISampler2D: > case EbtISampler3D: > case EbtISampler2DArray: > case EbtISampler2DMS: >+ case EbtISampler2DMSArray: > case EbtUSampler2D: > case EbtUSampler3D: > case EbtUSampler2DArray: > case EbtUSampler2DMS: >+ case EbtUSampler2DMSArray: > case EbtSampler2DShadow: > case EbtSampler2DArrayShadow: > return false; >@@ -390,14 +378,17 @@ inline bool IsSampler3D(TBasicType type) > case EbtSampler2DRect: > case EbtSampler2DArray: > case EbtSampler2DMS: >+ case EbtSampler2DMSArray: > case EbtISampler2D: > case EbtISamplerCube: > case EbtISampler2DArray: > case EbtISampler2DMS: >+ case EbtISampler2DMSArray: > case EbtUSampler2D: > case EbtUSamplerCube: > case EbtUSampler2DArray: > case EbtUSampler2DMS: >+ case EbtUSampler2DMSArray: > case EbtSampler2DShadow: > case EbtSamplerCubeShadow: > case EbtSampler2DArrayShadow: >@@ -416,6 +407,9 @@ inline bool IsSamplerArray(TBasicType type) > case EbtSampler2DArray: > case EbtISampler2DArray: > case EbtUSampler2DArray: >+ case EbtSampler2DMSArray: >+ case EbtISampler2DMSArray: >+ case EbtUSampler2DMSArray: > case EbtSampler2DArrayShadow: > return true; > case EbtSampler2D: >@@ -456,11 +450,13 @@ inline bool IsShadowSampler(TBasicType type) > case EbtISamplerCube: > case EbtISampler2DArray: > case EbtISampler2DMS: >+ case EbtISampler2DMSArray: > case EbtUSampler2D: > case EbtUSampler3D: > case EbtUSamplerCube: > case EbtUSampler2DArray: > case EbtUSampler2DMS: >+ case EbtUSampler2DMSArray: > case EbtSampler2D: > case EbtSampler3D: > case EbtSamplerCube: >@@ -469,6 +465,7 @@ inline bool IsShadowSampler(TBasicType type) > case EbtSampler2DRect: > case EbtSampler2DArray: > case EbtSampler2DMS: >+ case EbtSampler2DMSArray: > return false; > default: > assert(!IsSampler(type)); >@@ -623,6 +620,8 @@ enum TQualifier > EvqPosition, > EvqPointSize, > >+ EvqDrawID, // ANGLE_multi_draw >+ > // built-ins read by fragment shader > EvqFragCoord, > EvqFrontFacing, >@@ -673,7 +672,7 @@ enum TQualifier > EvqRestrict, > EvqVolatile, > >- // GLSL ES 3.1 extension OES_geometry_shader qualifiers >+ // GLSL ES 3.1 extension EXT_geometry_shader qualifiers > EvqGeometryIn, > EvqGeometryOut, > EvqPerVertexIn, // gl_in >@@ -757,7 +756,8 @@ struct TLayoutQualifier > return location == -1 && binding == -1 && offset == -1 && numViews == -1 && yuv == false && > matrixPacking == EmpUnspecified && blockStorage == EbsUnspecified && > !localSize.isAnyValueSet() && imageInternalFormat == EiifUnspecified && >- primitiveType == EptUndefined && invocations == 0 && maxVertices == -1; >+ primitiveType == EptUndefined && invocations == 0 && maxVertices == -1 && >+ index == -1; > } > > bool isCombinationValid() const >@@ -767,7 +767,7 @@ struct TLayoutQualifier > bool geometryShaderSpecified = > (primitiveType != EptUndefined) || (invocations != 0) || (maxVertices != -1); > bool otherLayoutQualifiersSpecified = >- (location != -1 || binding != -1 || matrixPacking != EmpUnspecified || >+ (location != -1 || binding != -1 || index != -1 || matrixPacking != EmpUnspecified || > blockStorage != EbsUnspecified || imageInternalFormat != EiifUnspecified); > > // we can have either the work group size specified, or number of views, >@@ -777,7 +777,7 @@ struct TLayoutQualifier > 1; > } > >- bool isLocalSizeEqual(const sh::WorkGroupSize &localSizeIn) const >+ bool isLocalSizeEqual(const WorkGroupSize &localSizeIn) const > { > return localSize.isWorkGroupSizeMatching(localSizeIn); > } >@@ -788,7 +788,7 @@ struct TLayoutQualifier > TLayoutBlockStorage blockStorage; > > // Compute shader layout qualifiers. >- sh::WorkGroupSize localSize; >+ WorkGroupSize localSize; > > int binding; > int offset; >@@ -807,6 +807,9 @@ struct TLayoutQualifier > int invocations; > int maxVertices; > >+ // EXT_blend_func_extended fragment output layout qualifier >+ int index; >+ > private: > explicit constexpr TLayoutQualifier(int /*placeholder*/) > : location(-1), >@@ -821,9 +824,9 @@ struct TLayoutQualifier > yuv(false), > primitiveType(EptUndefined), > invocations(0), >- maxVertices(-1) >- { >- } >+ maxVertices(-1), >+ index(-1) >+ {} > }; > > struct TMemoryQualifier >@@ -856,8 +859,7 @@ struct TMemoryQualifier > coherent(false), > restrictQualifier(false), > volatileQualifier(false) >- { >- } >+ {} > }; > > inline const char *getWorkGroupSizeString(size_t dimension) >@@ -904,6 +906,7 @@ inline const char *getQualifierString(TQualifier q) > case EvqVertexID: return "VertexID"; > case EvqPosition: return "Position"; > case EvqPointSize: return "PointSize"; >+ case EvqDrawID: return "DrawID"; > case EvqFragCoord: return "FragCoord"; > case EvqFrontFacing: return "FrontFacing"; > case EvqPointCoord: return "PointCoord"; >@@ -1017,7 +1020,7 @@ inline const char *getImageInternalFormatString(TLayoutImageInternalFormat iifq) > } > } > >-inline TYuvCscStandardEXT getYuvCscStandardEXT(const std::string &str) >+inline TYuvCscStandardEXT getYuvCscStandardEXT(const ImmutableString &str) > { > if (str == "itu_601") > return EycsItu601; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/BreakVariableAliasingInInnerLoops.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/BreakVariableAliasingInInnerLoops.cpp >deleted file mode 100644 >index d6a1e025def..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/BreakVariableAliasingInInnerLoops.cpp >+++ /dev/null >@@ -1,107 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >- >-// BreakVariableAliasingInInnerLoops.h: To optimize simple assignments, the HLSL compiler frontend >-// may record a variable as aliasing another. Sometimes the alias information gets garbled >-// so we work around this issue by breaking the aliasing chain in inner loops. >- >-#include "BreakVariableAliasingInInnerLoops.h" >- >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/IntermTraverse.h" >- >-// A HLSL compiler developer gave us more details on the root cause and the workaround needed: >-// The root problem is that if the HLSL compiler is applying aliasing information even on >-// incomplete simulations (in this case, a single pass). The bug is triggered by an assignment >-// that comes from a series of assignments, possibly with swizzled or ternary operators with >-// known conditionals, where the source is before the loop. >-// So, a workaround is to add a +0 term to variables the first time they are assigned to in >-// an inner loop (if they are declared in an outside scope, otherwise there is no need). >-// This will break the aliasing chain. >- >-// For simplicity here we add a +0 to any assignment that is in at least two nested loops. Because >-// the bug only shows up with swizzles, and ternary assignment, whole array or whole structure >-// assignment don't need a workaround. >- >-namespace sh >-{ >- >-namespace >-{ >- >-class AliasingBreaker : public TIntermTraverser >-{ >- public: >- AliasingBreaker() : TIntermTraverser(true, false, true) {} >- >- protected: >- bool visitBinary(Visit visit, TIntermBinary *binary) >- { >- if (visit != PreVisit) >- { >- return false; >- } >- >- if (mLoopLevel < 2 || !binary->isAssignment()) >- { >- return true; >- } >- >- TIntermTyped *B = binary->getRight(); >- TType type = B->getType(); >- >- if (!type.isScalar() && !type.isVector() && !type.isMatrix()) >- { >- return true; >- } >- >- if (type.isArray() || IsSampler(type.getBasicType())) >- { >- return true; >- } >- >- // We have a scalar / vector / matrix assignment with loop depth 2. >- // Transform it from >- // A = B >- // to >- // A = (B + typeof<B>(0)); >- >- TIntermBinary *bPlusZero = new TIntermBinary(EOpAdd, B, CreateZeroNode(type)); >- bPlusZero->setLine(B->getLine()); >- >- binary->replaceChildNode(B, bPlusZero); >- >- return true; >- } >- >- bool visitLoop(Visit visit, TIntermLoop *loop) >- { >- if (visit == PreVisit) >- { >- mLoopLevel++; >- } >- else >- { >- ASSERT(mLoopLevel > 0); >- mLoopLevel--; >- } >- >- return true; >- } >- >- private: >- int mLoopLevel = 0; >-}; >- >-} // anonymous namespace >- >-void BreakVariableAliasingInInnerLoops(TIntermNode *root) >-{ >- AliasingBreaker breaker; >- root->traverse(&breaker); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/BreakVariableAliasingInInnerLoops.h b/Source/ThirdParty/ANGLE/src/compiler/translator/BreakVariableAliasingInInnerLoops.h >deleted file mode 100644 >index b1d906f9198..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/BreakVariableAliasingInInnerLoops.h >+++ /dev/null >@@ -1,23 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >- >-// BreakVariableAliasingInInnerLoops.h: To optimize simple assignments, the HLSL compiler frontend >-// may record a variable as aliasing another. Sometimes the alias information gets garbled >-// so we work around this issue by breaking the aliasing chain in inner loops. >- >-#ifndef COMPILER_TRANSLATOR_BREAKVARIABLEALIASINGININNERLOOPS_H_ >-#define COMPILER_TRANSLATOR_BREAKVARIABLEALIASINGININNERLOOPS_H_ >- >-class TIntermNode; >- >-namespace sh >-{ >- >-void BreakVariableAliasingInInnerLoops(TIntermNode *root); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_BREAKVARIABLEALIASINGININNERLOOPS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.cpp >index 905e634fd14..290f84df689 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.cpp >@@ -6,9 +6,9 @@ > > #include "compiler/translator/BuiltInFunctionEmulator.h" > #include "angle_gl.h" >-#include "compiler/translator/Cache.h" >-#include "compiler/translator/IntermTraverse.h" >-#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/StaticType.h" >+#include "compiler/translator/Symbol.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > > namespace sh > { >@@ -18,15 +18,13 @@ class BuiltInFunctionEmulator::BuiltInFunctionEmulationMarker : public TIntermTr > public: > BuiltInFunctionEmulationMarker(BuiltInFunctionEmulator &emulator) > : TIntermTraverser(true, false, false), mEmulator(emulator) >- { >- } >+ {} > > bool visitUnary(Visit visit, TIntermUnary *node) override > { >- if (visit == PreVisit) >+ if (node->getFunction()) > { >- bool needToEmulate = >- mEmulator.setFunctionCalled(node->getOp(), node->getOperand()->getType()); >+ bool needToEmulate = mEmulator.setFunctionCalled(node->getFunction()); > if (needToEmulate) > node->setUseEmulatedFunction(); > } >@@ -35,56 +33,15 @@ class BuiltInFunctionEmulator::BuiltInFunctionEmulationMarker : public TIntermTr > > bool visitAggregate(Visit visit, TIntermAggregate *node) override > { >- if (visit == PreVisit) >+ // Here we handle all the built-in functions mapped to ops, not just the ones that are >+ // currently identified as problematic. >+ if (node->isConstructor() || node->isFunctionCall()) > { >- // Here we handle all the built-in functions mapped to ops, not just the ones that are >- // currently identified as problematic. >- if (node->isConstructor() || node->isFunctionCall()) >- { >- return true; >- } >- const TIntermSequence &sequence = *(node->getSequence()); >- bool needToEmulate = false; >- // Right now we only handle built-in functions with two to four parameters. >- if (sequence.size() == 2) >- { >- TIntermTyped *param1 = sequence[0]->getAsTyped(); >- TIntermTyped *param2 = sequence[1]->getAsTyped(); >- if (!param1 || !param2) >- return true; >- needToEmulate = mEmulator.setFunctionCalled(node->getOp(), param1->getType(), >- param2->getType()); >- } >- else if (sequence.size() == 3) >- { >- TIntermTyped *param1 = sequence[0]->getAsTyped(); >- TIntermTyped *param2 = sequence[1]->getAsTyped(); >- TIntermTyped *param3 = sequence[2]->getAsTyped(); >- if (!param1 || !param2 || !param3) >- return true; >- needToEmulate = mEmulator.setFunctionCalled(node->getOp(), param1->getType(), >- param2->getType(), param3->getType()); >- } >- else if (sequence.size() == 4) >- { >- TIntermTyped *param1 = sequence[0]->getAsTyped(); >- TIntermTyped *param2 = sequence[1]->getAsTyped(); >- TIntermTyped *param3 = sequence[2]->getAsTyped(); >- TIntermTyped *param4 = sequence[3]->getAsTyped(); >- if (!param1 || !param2 || !param3 || !param4) >- return true; >- needToEmulate = >- mEmulator.setFunctionCalled(node->getOp(), param1->getType(), param2->getType(), >- param3->getType(), param4->getType()); >- } >- else >- { >- return true; >- } >- >- if (needToEmulate) >- node->setUseEmulatedFunction(); >+ return true; > } >+ bool needToEmulate = mEmulator.setFunctionCalled(node->getFunction()); >+ if (needToEmulate) >+ node->setUseEmulatedFunction(); > return true; > } > >@@ -92,78 +49,21 @@ class BuiltInFunctionEmulator::BuiltInFunctionEmulationMarker : public TIntermTr > BuiltInFunctionEmulator &mEmulator; > }; > >-BuiltInFunctionEmulator::BuiltInFunctionEmulator() >-{ >-} >- >-FunctionId BuiltInFunctionEmulator::addEmulatedFunction(TOperator op, >- const TType *param, >- const char *emulatedFunctionDefinition) >-{ >- FunctionId id(op, param); >- mEmulatedFunctions[id] = std::string(emulatedFunctionDefinition); >- return id; >-} >- >-FunctionId BuiltInFunctionEmulator::addEmulatedFunction(TOperator op, >- const TType *param1, >- const TType *param2, >- const char *emulatedFunctionDefinition) >-{ >- FunctionId id(op, param1, param2); >- mEmulatedFunctions[id] = std::string(emulatedFunctionDefinition); >- return id; >-} >- >-FunctionId BuiltInFunctionEmulator::addEmulatedFunctionWithDependency( >- const FunctionId &dependency, >- TOperator op, >- const TType *param1, >- const TType *param2, >- const char *emulatedFunctionDefinition) >-{ >- FunctionId id(op, param1, param2); >- mEmulatedFunctions[id] = std::string(emulatedFunctionDefinition); >- mFunctionDependencies[id] = dependency; >- return id; >-} >- >-FunctionId BuiltInFunctionEmulator::addEmulatedFunction(TOperator op, >- const TType *param1, >- const TType *param2, >- const TType *param3, >- const char *emulatedFunctionDefinition) >-{ >- FunctionId id(op, param1, param2, param3); >- mEmulatedFunctions[id] = std::string(emulatedFunctionDefinition); >- return id; >-} >+BuiltInFunctionEmulator::BuiltInFunctionEmulator() {} > >-FunctionId BuiltInFunctionEmulator::addEmulatedFunction(TOperator op, >- const TType *param1, >- const TType *param2, >- const TType *param3, >- const TType *param4, >- const char *emulatedFunctionDefinition) >+void BuiltInFunctionEmulator::addEmulatedFunction(const TSymbolUniqueId &uniqueId, >+ const char *emulatedFunctionDefinition) > { >- FunctionId id(op, param1, param2, param3, param4); >- mEmulatedFunctions[id] = std::string(emulatedFunctionDefinition); >- return id; >+ mEmulatedFunctions[uniqueId.get()] = std::string(emulatedFunctionDefinition); > } > >-FunctionId BuiltInFunctionEmulator::addEmulatedFunctionWithDependency( >- const FunctionId &dependency, >- TOperator op, >- const TType *param1, >- const TType *param2, >- const TType *param3, >- const TType *param4, >+void BuiltInFunctionEmulator::addEmulatedFunctionWithDependency( >+ const TSymbolUniqueId &dependency, >+ const TSymbolUniqueId &uniqueId, > const char *emulatedFunctionDefinition) > { >- FunctionId id(op, param1, param2, param3, param4); >- mEmulatedFunctions[id] = std::string(emulatedFunctionDefinition); >- mFunctionDependencies[id] = dependency; >- return id; >+ mEmulatedFunctions[uniqueId.get()] = std::string(emulatedFunctionDefinition); >+ mFunctionDependencies[uniqueId.get()] = dependency.get(); > } > > bool BuiltInFunctionEmulator::isOutputEmpty() const >@@ -182,47 +82,18 @@ void BuiltInFunctionEmulator::outputEmulatedFunctions(TInfoSinkBase &out) const > } > } > >-bool BuiltInFunctionEmulator::setFunctionCalled(TOperator op, const TType ¶m) >-{ >- return setFunctionCalled(FunctionId(op, ¶m)); >-} >- >-bool BuiltInFunctionEmulator::setFunctionCalled(TOperator op, >- const TType ¶m1, >- const TType ¶m2) >-{ >- return setFunctionCalled(FunctionId(op, ¶m1, ¶m2)); >-} >- >-bool BuiltInFunctionEmulator::setFunctionCalled(TOperator op, >- const TType ¶m1, >- const TType ¶m2, >- const TType ¶m3) >-{ >- return setFunctionCalled(FunctionId(op, ¶m1, ¶m2, ¶m3)); >-} >- >-bool BuiltInFunctionEmulator::setFunctionCalled(TOperator op, >- const TType ¶m1, >- const TType ¶m2, >- const TType ¶m3, >- const TType ¶m4) >-{ >- return setFunctionCalled(FunctionId(op, ¶m1, ¶m2, ¶m3, ¶m4)); >-} >- >-const char *BuiltInFunctionEmulator::findEmulatedFunction(const FunctionId &functionId) const >+const char *BuiltInFunctionEmulator::findEmulatedFunction(int uniqueId) const > { > for (const auto &queryFunction : mQueryFunctions) > { >- const char *result = queryFunction(functionId); >+ const char *result = queryFunction(uniqueId); > if (result) > { > return result; > } > } > >- const auto &result = mEmulatedFunctions.find(functionId); >+ const auto &result = mEmulatedFunctions.find(uniqueId); > if (result != mEmulatedFunctions.end()) > { > return result->second.c_str(); >@@ -231,27 +102,31 @@ const char *BuiltInFunctionEmulator::findEmulatedFunction(const FunctionId &func > return nullptr; > } > >-bool BuiltInFunctionEmulator::setFunctionCalled(const FunctionId &functionId) >+bool BuiltInFunctionEmulator::setFunctionCalled(const TFunction *function) >+{ >+ ASSERT(function != nullptr); >+ return setFunctionCalled(function->uniqueId().get()); >+} >+ >+bool BuiltInFunctionEmulator::setFunctionCalled(int uniqueId) > { >- if (!findEmulatedFunction(functionId)) >+ if (!findEmulatedFunction(uniqueId)) > { > return false; > } > > for (size_t i = 0; i < mFunctions.size(); ++i) > { >- if (mFunctions[i] == functionId) >+ if (mFunctions[i] == uniqueId) > return true; > } > // If the function depends on another, mark the dependency as called. >- auto dependency = mFunctionDependencies.find(functionId); >+ auto dependency = mFunctionDependencies.find(uniqueId); > if (dependency != mFunctionDependencies.end()) > { > setFunctionCalled((*dependency).second); > } >- // Copy the functionId if it needs to be stored, to make sure that the TType pointers inside >- // remain valid and constant. >- mFunctions.push_back(functionId.getCopy()); >+ mFunctions.push_back(uniqueId); > return true; > } > >@@ -284,72 +159,4 @@ void BuiltInFunctionEmulator::WriteEmulatedFunctionName(TInfoSinkBase &out, cons > out << name << "_emu"; > } > >-FunctionId::FunctionId() >- : mOp(EOpNull), >- mParam1(TCache::getType(EbtVoid)), >- mParam2(TCache::getType(EbtVoid)), >- mParam3(TCache::getType(EbtVoid)), >- mParam4(TCache::getType(EbtVoid)) >-{ >-} >- >-FunctionId::FunctionId(TOperator op, const TType *param) >- : mOp(op), >- mParam1(param), >- mParam2(TCache::getType(EbtVoid)), >- mParam3(TCache::getType(EbtVoid)), >- mParam4(TCache::getType(EbtVoid)) >-{ >-} >- >-FunctionId::FunctionId(TOperator op, const TType *param1, const TType *param2) >- : mOp(op), >- mParam1(param1), >- mParam2(param2), >- mParam3(TCache::getType(EbtVoid)), >- mParam4(TCache::getType(EbtVoid)) >-{ >-} >- >-FunctionId::FunctionId(TOperator op, const TType *param1, const TType *param2, const TType *param3) >- : mOp(op), mParam1(param1), mParam2(param2), mParam3(param3), mParam4(TCache::getType(EbtVoid)) >-{ >-} >- >-FunctionId::FunctionId(TOperator op, >- const TType *param1, >- const TType *param2, >- const TType *param3, >- const TType *param4) >- : mOp(op), mParam1(param1), mParam2(param2), mParam3(param3), mParam4(param4) >-{ >-} >- >-bool FunctionId::operator==(const FunctionId &other) const >-{ >- return (mOp == other.mOp && *mParam1 == *other.mParam1 && *mParam2 == *other.mParam2 && >- *mParam3 == *other.mParam3 && *mParam4 == *other.mParam4); >-} >- >-bool FunctionId::operator<(const FunctionId &other) const >-{ >- if (mOp != other.mOp) >- return mOp < other.mOp; >- if (*mParam1 != *other.mParam1) >- return *mParam1 < *other.mParam1; >- if (*mParam2 != *other.mParam2) >- return *mParam2 < *other.mParam2; >- if (*mParam3 != *other.mParam3) >- return *mParam3 < *other.mParam3; >- if (*mParam4 != *other.mParam4) >- return *mParam4 < *other.mParam4; >- return false; // all fields are equal >-} >- >-FunctionId FunctionId::getCopy() const >-{ >- return FunctionId(mOp, new TType(*mParam1), new TType(*mParam2), new TType(*mParam3), >- new TType(*mParam4)); >-} >- > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.h b/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.h >index 5f15f662249..d15e83d75c8 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.h >@@ -8,82 +8,15 @@ > #define COMPILER_TRANSLATOR_BUILTINFUNCTIONEMULATOR_H_ > > #include "compiler/translator/InfoSink.h" >-#include "compiler/translator/IntermNode.h" >-#include "compiler/translator/ParamType.h" > > namespace sh > { > >-struct MiniFunctionId >-{ >- constexpr MiniFunctionId(TOperator op = EOpNull, >- ParamType paramType1 = ParamType::Void, >- ParamType paramType2 = ParamType::Void, >- ParamType paramType3 = ParamType::Void, >- ParamType paramType4 = ParamType::Void) >- : op(op), >- paramType1(paramType1), >- paramType2(paramType2), >- paramType3(paramType3), >- paramType4(paramType4) >- { >- } >- >- TOperator op; >- ParamType paramType1; >- ParamType paramType2; >- ParamType paramType3; >- ParamType paramType4; >-}; >- >-class FunctionId final >-{ >- public: >- FunctionId(); >- FunctionId(TOperator op, const TType *param); >- FunctionId(TOperator op, const TType *param1, const TType *param2); >- FunctionId(TOperator op, const TType *param1, const TType *param2, const TType *param3); >- FunctionId(TOperator op, >- const TType *param1, >- const TType *param2, >- const TType *param3, >- const TType *param4); >+class TIntermNode; >+class TFunction; >+class TSymbolUniqueId; > >- FunctionId(const FunctionId &) = default; >- FunctionId &operator=(const FunctionId &) = default; >- >- bool operator==(const FunctionId &other) const; >- bool operator<(const FunctionId &other) const; >- >- FunctionId getCopy() const; >- >- private: >- friend bool operator==(const MiniFunctionId &miniId, const FunctionId &functionId); >- TOperator mOp; >- >- // The memory that these TType objects use is freed by PoolAllocator. The >- // BuiltInFunctionEmulator's lifetime can extend until after the memory pool is freed, but >- // that's not an issue since this class never destructs these objects. >- const TType *mParam1; >- const TType *mParam2; >- const TType *mParam3; >- const TType *mParam4; >-}; >- >-inline bool operator==(ParamType paramType, const TType *type) >-{ >- return SameParamType(paramType, type->getBasicType(), type->getNominalSize(), >- type->getSecondarySize()); >-} >- >-inline bool operator==(const MiniFunctionId &miniId, const FunctionId &functionId) >-{ >- return miniId.op == functionId.mOp && miniId.paramType1 == functionId.mParam1 && >- miniId.paramType2 == functionId.mParam2 && miniId.paramType3 == functionId.mParam3 && >- miniId.paramType4 == functionId.mParam4; >-} >- >-using BuiltinQueryFunc = const char *(const FunctionId &); >+using BuiltinQueryFunc = const char *(int); > > // > // This class decides which built-in functions need to be replaced with the emulated ones. It can be >@@ -108,37 +41,12 @@ class BuiltInFunctionEmulator > void outputEmulatedFunctions(TInfoSinkBase &out) const; > > // Add functions that need to be emulated. >- FunctionId addEmulatedFunction(TOperator op, >- const TType *param, >- const char *emulatedFunctionDefinition); >- FunctionId addEmulatedFunction(TOperator op, >- const TType *param1, >- const TType *param2, >- const char *emulatedFunctionDefinition); >- FunctionId addEmulatedFunction(TOperator op, >- const TType *param1, >- const TType *param2, >- const TType *param3, >- const char *emulatedFunctionDefinition); >- FunctionId addEmulatedFunction(TOperator op, >- const TType *param1, >- const TType *param2, >- const TType *param3, >- const TType *param4, >- const char *emulatedFunctionDefinition); >- >- FunctionId addEmulatedFunctionWithDependency(const FunctionId &dependency, >- TOperator op, >- const TType *param1, >- const TType *param2, >- const char *emulatedFunctionDefinition); >- FunctionId addEmulatedFunctionWithDependency(const FunctionId &dependency, >- TOperator op, >- const TType *param1, >- const TType *param2, >- const TType *param3, >- const TType *param4, >- const char *emulatedFunctionDefinition); >+ void addEmulatedFunction(const TSymbolUniqueId &uniqueId, >+ const char *emulatedFunctionDefinition); >+ >+ void addEmulatedFunctionWithDependency(const TSymbolUniqueId &dependency, >+ const TSymbolUniqueId &uniqueId, >+ const char *emulatedFunctionDefinition); > > void addFunctionMap(BuiltinQueryFunc queryFunc); > >@@ -148,31 +56,20 @@ class BuiltInFunctionEmulator > // Records that a function is called by the shader and might need to be emulated. If the > // function is not in mEmulatedFunctions, this becomes a no-op. Returns true if the function > // call needs to be replaced with an emulated one. >- bool setFunctionCalled(TOperator op, const TType ¶m); >- bool setFunctionCalled(TOperator op, const TType ¶m1, const TType ¶m2); >- bool setFunctionCalled(TOperator op, >- const TType ¶m1, >- const TType ¶m2, >- const TType ¶m3); >- bool setFunctionCalled(TOperator op, >- const TType ¶m1, >- const TType ¶m2, >- const TType ¶m3, >- const TType ¶m4); >- >- bool setFunctionCalled(const FunctionId &functionId); >+ bool setFunctionCalled(const TFunction *function); >+ bool setFunctionCalled(int uniqueId); > >- const char *findEmulatedFunction(const FunctionId &functionId) const; >+ const char *findEmulatedFunction(int uniqueId) const; > >- // Map from function id to emulated function definition >- std::map<FunctionId, std::string> mEmulatedFunctions; >+ // Map from function unique id to emulated function definition >+ std::map<int, std::string> mEmulatedFunctions; > > // Map from dependent functions to their dependencies. This structure allows each function to > // have at most one dependency. >- std::map<FunctionId, FunctionId> mFunctionDependencies; >+ std::map<int, int> mFunctionDependencies; > > // Called function ids >- std::vector<FunctionId> mFunctions; >+ std::vector<int> mFunctions; > > // Constexpr function tables. > std::vector<BuiltinQueryFunc *> mQueryFunctions; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp >index 27ee04da35e..dc485274804 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp >@@ -4,12 +4,12 @@ > // found in the LICENSE file. > // > >+#include "compiler/translator/BuiltInFunctionEmulatorGLSL.h" >+ > #include "angle_gl.h" > #include "compiler/translator/BuiltInFunctionEmulator.h" >-#include "compiler/translator/BuiltInFunctionEmulatorGLSL.h" >-#include "compiler/translator/Cache.h" >-#include "compiler/translator/SymbolTable.h" > #include "compiler/translator/VersionGLSL.h" >+#include "compiler/translator/tree_util/BuiltIn_autogen.h" > > namespace sh > { >@@ -19,8 +19,7 @@ void InitBuiltInAbsFunctionEmulatorForGLSLWorkarounds(BuiltInFunctionEmulator *e > { > if (shaderType == GL_VERTEX_SHADER) > { >- const TType *int1 = TCache::getType(EbtInt); >- emu->addEmulatedFunction(EOpAbs, int1, "int abs_emu(int x) { return x * sign(x); }"); >+ emu->addEmulatedFunction(BuiltInId::abs_Int1, "int abs_emu(int x) { return x * sign(x); }"); > } > } > >@@ -31,17 +30,12 @@ void InitBuiltInIsnanFunctionEmulatorForGLSLWorkarounds(BuiltInFunctionEmulator > if (targetGLSLVersion < GLSL_VERSION_130) > return; > >- const TType *float1 = TCache::getType(EbtFloat); >- const TType *float2 = TCache::getType(EbtFloat, 2); >- const TType *float3 = TCache::getType(EbtFloat, 3); >- const TType *float4 = TCache::getType(EbtFloat, 4); >- > // !(x > 0.0 || x < 0.0 || x == 0.0) will be optimized and always equal to false. > emu->addEmulatedFunction( >- EOpIsNan, float1, >+ BuiltInId::isnan_Float1, > "bool isnan_emu(float x) { return (x > 0.0 || x < 0.0) ? false : x != 0.0; }"); > emu->addEmulatedFunction( >- EOpIsNan, float2, >+ BuiltInId::isnan_Float2, > "bvec2 isnan_emu(vec2 x)\n" > "{\n" > " bvec2 isnan;\n" >@@ -52,7 +46,7 @@ void InitBuiltInIsnanFunctionEmulatorForGLSLWorkarounds(BuiltInFunctionEmulator > " return isnan;\n" > "}\n"); > emu->addEmulatedFunction( >- EOpIsNan, float3, >+ BuiltInId::isnan_Float3, > "bvec3 isnan_emu(vec3 x)\n" > "{\n" > " bvec3 isnan;\n" >@@ -63,7 +57,7 @@ void InitBuiltInIsnanFunctionEmulatorForGLSLWorkarounds(BuiltInFunctionEmulator > " return isnan;\n" > "}\n"); > emu->addEmulatedFunction( >- EOpIsNan, float4, >+ BuiltInId::isnan_Float4, > "bvec4 isnan_emu(vec4 x)\n" > "{\n" > " bvec4 isnan;\n" >@@ -77,21 +71,24 @@ void InitBuiltInIsnanFunctionEmulatorForGLSLWorkarounds(BuiltInFunctionEmulator > > void InitBuiltInAtanFunctionEmulatorForGLSLWorkarounds(BuiltInFunctionEmulator *emu) > { >- const TType *float1 = TCache::getType(EbtFloat); >- auto floatFuncId = emu->addEmulatedFunction( >- EOpAtan, float1, float1, >- "emu_precision float atan_emu(emu_precision float y, emu_precision " >- "float x)\n" >- "{\n" >- " if (x > 0.0) return atan(y / x);\n" >- " else if (x < 0.0 && y >= 0.0) return atan(y / x) + 3.14159265;\n" >- " else if (x < 0.0 && y < 0.0) return atan(y / x) - 3.14159265;\n" >- " else return 1.57079632 * sign(y);\n" >- "}\n"); >+ emu->addEmulatedFunction(BuiltInId::atan_Float1_Float1, >+ "emu_precision float atan_emu(emu_precision float y, emu_precision " >+ "float x)\n" >+ "{\n" >+ " if (x > 0.0) return atan(y / x);\n" >+ " else if (x < 0.0 && y >= 0.0) return atan(y / x) + 3.14159265;\n" >+ " else if (x < 0.0 && y < 0.0) return atan(y / x) - 3.14159265;\n" >+ " else return 1.57079632 * sign(y);\n" >+ "}\n"); >+ static const std::array<TSymbolUniqueId, 4> ids = { >+ BuiltInId::atan_Float1_Float1, >+ BuiltInId::atan_Float2_Float2, >+ BuiltInId::atan_Float3_Float3, >+ BuiltInId::atan_Float4_Float4, >+ }; > for (int dim = 2; dim <= 4; ++dim) > { >- const TType *floatVec = TCache::getType(EbtFloat, static_cast<unsigned char>(dim)); >- std::stringstream ss; >+ std::stringstream ss = sh::InitializeStream<std::stringstream>(); > ss << "emu_precision vec" << dim << " atan_emu(emu_precision vec" << dim > << " y, emu_precision vec" << dim << " x)\n" > << "{\n" >@@ -107,7 +104,7 @@ void InitBuiltInAtanFunctionEmulatorForGLSLWorkarounds(BuiltInFunctionEmulator * > } > ss << ");\n" > "}\n"; >- emu->addEmulatedFunctionWithDependency(floatFuncId, EOpAtan, floatVec, floatVec, >+ emu->addEmulatedFunctionWithDependency(BuiltInId::atan_Float1_Float1, ids[dim - 1], > ss.str().c_str()); > } > } >@@ -120,11 +117,8 @@ void InitBuiltInFunctionEmulatorForGLSLMissingFunctions(BuiltInFunctionEmulator > // Emulate packUnorm2x16 and unpackUnorm2x16 (GLSL 4.10) > if (targetGLSLVersion < GLSL_VERSION_410) > { >- const TType *float2 = TCache::getType(EbtFloat, 2); >- const TType *uint1 = TCache::getType(EbtUInt); >- > // clang-format off >- emu->addEmulatedFunction(EOpPackUnorm2x16, float2, >+ emu->addEmulatedFunction(BuiltInId::packUnorm2x16_Float2, > "uint packUnorm2x16_emu(vec2 v)\n" > "{\n" > " int x = int(round(clamp(v.x, 0.0, 1.0) * 65535.0));\n" >@@ -132,7 +126,7 @@ void InitBuiltInFunctionEmulatorForGLSLMissingFunctions(BuiltInFunctionEmulator > " return uint((y << 16) | (x & 0xFFFF));\n" > "}\n"); > >- emu->addEmulatedFunction(EOpUnpackUnorm2x16, uint1, >+ emu->addEmulatedFunction(BuiltInId::unpackUnorm2x16_UInt1, > "vec2 unpackUnorm2x16_emu(uint u)\n" > "{\n" > " float x = float(u & 0xFFFFu) / 65535.0;\n" >@@ -146,11 +140,8 @@ void InitBuiltInFunctionEmulatorForGLSLMissingFunctions(BuiltInFunctionEmulator > // by using floatBitsToInt, floatBitsToUint, intBitsToFloat, and uintBitsToFloat (GLSL 3.30). > if (targetGLSLVersion >= GLSL_VERSION_330 && targetGLSLVersion < GLSL_VERSION_420) > { >- const TType *float2 = TCache::getType(EbtFloat, 2); >- const TType *uint1 = TCache::getType(EbtUInt); >- > // clang-format off >- emu->addEmulatedFunction(EOpPackSnorm2x16, float2, >+ emu->addEmulatedFunction(BuiltInId::packSnorm2x16_Float2, > "uint packSnorm2x16_emu(vec2 v)\n" > "{\n" > " #if defined(GL_ARB_shading_language_packing)\n" >@@ -161,7 +152,7 @@ void InitBuiltInFunctionEmulatorForGLSLMissingFunctions(BuiltInFunctionEmulator > " return uint((y << 16) | (x & 0xFFFF));\n" > " #endif\n" > "}\n"); >- emu->addEmulatedFunction(EOpUnpackSnorm2x16, uint1, >+ emu->addEmulatedFunction(BuiltInId::unpackSnorm2x16_UInt1, > "#if !defined(GL_ARB_shading_language_packing)\n" > " float fromSnorm(uint x)\n" > " {\n" >@@ -182,7 +173,7 @@ void InitBuiltInFunctionEmulatorForGLSLMissingFunctions(BuiltInFunctionEmulator > "}\n"); > // Functions uint f32tof16(float val) and float f16tof32(uint val) are > // based on the OpenGL redbook Appendix Session "Floating-Point Formats Used in OpenGL". >- emu->addEmulatedFunction(EOpPackHalf2x16, float2, >+ emu->addEmulatedFunction(BuiltInId::packHalf2x16_Float2, > "#if !defined(GL_ARB_shading_language_packing)\n" > " uint f32tof16(float val)\n" > " {\n" >@@ -229,7 +220,7 @@ void InitBuiltInFunctionEmulatorForGLSLMissingFunctions(BuiltInFunctionEmulator > " return (y << 16) | x;\n" > " #endif\n" > "}\n"); >- emu->addEmulatedFunction(EOpUnpackHalf2x16, uint1, >+ emu->addEmulatedFunction(BuiltInId::unpackHalf2x16_UInt1, > "#if !defined(GL_ARB_shading_language_packing)\n" > " float f16tof32(uint val)\n" > " {\n" >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorHLSL.cpp >index e78d86d00a3..b4bca0d36de 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorHLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorHLSL.cpp >@@ -4,17 +4,17 @@ > // found in the LICENSE file. > // > >+#include "compiler/translator/BuiltInFunctionEmulatorHLSL.h" > #include "angle_gl.h" > #include "compiler/translator/BuiltInFunctionEmulator.h" >-#include "compiler/translator/BuiltInFunctionEmulatorHLSL.h" >-#include "compiler/translator/SymbolTable.h" > #include "compiler/translator/VersionGLSL.h" >+#include "compiler/translator/tree_util/BuiltIn_autogen.h" > > namespace sh > { > > // Defined in emulated_builtin_functions_hlsl_autogen.cpp. >-const char *FindHLSLFunction(const FunctionId &functionID); >+const char *FindHLSLFunction(int uniqueId); > > void InitBuiltInIsnanFunctionEmulatorForHLSLWorkarounds(BuiltInFunctionEmulator *emu, > int targetGLSLVersion) >@@ -22,12 +22,7 @@ void InitBuiltInIsnanFunctionEmulatorForHLSLWorkarounds(BuiltInFunctionEmulator > if (targetGLSLVersion < GLSL_VERSION_130) > return; > >- TType *float1 = new TType(EbtFloat); >- TType *float2 = new TType(EbtFloat, 2); >- TType *float3 = new TType(EbtFloat, 3); >- TType *float4 = new TType(EbtFloat, 4); >- >- emu->addEmulatedFunction(EOpIsNan, float1, >+ emu->addEmulatedFunction(BuiltInId::isnan_Float1, > "bool isnan_emu(float x)\n" > "{\n" > " return (x > 0.0 || x < 0.0) ? false : x != 0.0;\n" >@@ -35,7 +30,7 @@ void InitBuiltInIsnanFunctionEmulatorForHLSLWorkarounds(BuiltInFunctionEmulator > "\n"); > > emu->addEmulatedFunction( >- EOpIsNan, float2, >+ BuiltInId::isnan_Float2, > "bool2 isnan_emu(float2 x)\n" > "{\n" > " bool2 isnan;\n" >@@ -47,7 +42,7 @@ void InitBuiltInIsnanFunctionEmulatorForHLSLWorkarounds(BuiltInFunctionEmulator > "}\n"); > > emu->addEmulatedFunction( >- EOpIsNan, float3, >+ BuiltInId::isnan_Float3, > "bool3 isnan_emu(float3 x)\n" > "{\n" > " bool3 isnan;\n" >@@ -59,7 +54,7 @@ void InitBuiltInIsnanFunctionEmulatorForHLSLWorkarounds(BuiltInFunctionEmulator > "}\n"); > > emu->addEmulatedFunction( >- EOpIsNan, float4, >+ BuiltInId::isnan_Float4, > "bool4 isnan_emu(float4 x)\n" > "{\n" > " bool4 isnan;\n" >@@ -73,43 +68,35 @@ void InitBuiltInIsnanFunctionEmulatorForHLSLWorkarounds(BuiltInFunctionEmulator > > void InitBuiltInFunctionEmulatorForHLSL(BuiltInFunctionEmulator *emu) > { >- TType *int1 = new TType(EbtInt); >- TType *int2 = new TType(EbtInt, 2); >- TType *int3 = new TType(EbtInt, 3); >- TType *int4 = new TType(EbtInt, 4); >- TType *uint1 = new TType(EbtUInt); >- TType *uint2 = new TType(EbtUInt, 2); >- TType *uint3 = new TType(EbtUInt, 3); >- TType *uint4 = new TType(EbtUInt, 4); >- > emu->addFunctionMap(FindHLSLFunction); > > // (a + b2^16) * (c + d2^16) = ac + (ad + bc) * 2^16 + bd * 2^32 > // Also note that below, a * d + ((a * c) >> 16) is guaranteed not to overflow, because: > // a <= 0xffff, d <= 0xffff, ((a * c) >> 16) <= 0xffff and 0xffff * 0xffff + 0xffff = 0xffff0000 >- FunctionId umulExtendedUint1 = emu->addEmulatedFunction( >- EOpUmulExtended, uint1, uint1, uint1, uint1, >- "void umulExtended_emu(uint x, uint y, out uint msb, out uint lsb)\n" >- "{\n" >- " lsb = x * y;\n" >- " uint a = (x & 0xffffu);\n" >- " uint b = (x >> 16);\n" >- " uint c = (y & 0xffffu);\n" >- " uint d = (y >> 16);\n" >- " uint ad = a * d + ((a * c) >> 16);\n" >- " uint bc = b * c;\n" >- " uint carry = uint(ad > (0xffffffffu - bc));\n" >- " msb = ((ad + bc) >> 16) + (carry << 16) + b * d;\n" >- "}\n"); >+ emu->addEmulatedFunction(BuiltInId::umulExtended_UInt1_UInt1_UInt1_UInt1, >+ "void umulExtended_emu(uint x, uint y, out uint msb, out uint lsb)\n" >+ "{\n" >+ " lsb = x * y;\n" >+ " uint a = (x & 0xffffu);\n" >+ " uint b = (x >> 16);\n" >+ " uint c = (y & 0xffffu);\n" >+ " uint d = (y >> 16);\n" >+ " uint ad = a * d + ((a * c) >> 16);\n" >+ " uint bc = b * c;\n" >+ " uint carry = uint(ad > (0xffffffffu - bc));\n" >+ " msb = ((ad + bc) >> 16) + (carry << 16) + b * d;\n" >+ "}\n"); > emu->addEmulatedFunctionWithDependency( >- umulExtendedUint1, EOpUmulExtended, uint2, uint2, uint2, uint2, >+ BuiltInId::umulExtended_UInt1_UInt1_UInt1_UInt1, >+ BuiltInId::umulExtended_UInt2_UInt2_UInt2_UInt2, > "void umulExtended_emu(uint2 x, uint2 y, out uint2 msb, out uint2 lsb)\n" > "{\n" > " umulExtended_emu(x.x, y.x, msb.x, lsb.x);\n" > " umulExtended_emu(x.y, y.y, msb.y, lsb.y);\n" > "}\n"); > emu->addEmulatedFunctionWithDependency( >- umulExtendedUint1, EOpUmulExtended, uint3, uint3, uint3, uint3, >+ BuiltInId::umulExtended_UInt1_UInt1_UInt1_UInt1, >+ BuiltInId::umulExtended_UInt3_UInt3_UInt3_UInt3, > "void umulExtended_emu(uint3 x, uint3 y, out uint3 msb, out uint3 lsb)\n" > "{\n" > " umulExtended_emu(x.x, y.x, msb.x, lsb.x);\n" >@@ -117,7 +104,8 @@ void InitBuiltInFunctionEmulatorForHLSL(BuiltInFunctionEmulator *emu) > " umulExtended_emu(x.z, y.z, msb.z, lsb.z);\n" > "}\n"); > emu->addEmulatedFunctionWithDependency( >- umulExtendedUint1, EOpUmulExtended, uint4, uint4, uint4, uint4, >+ BuiltInId::umulExtended_UInt1_UInt1_UInt1_UInt1, >+ BuiltInId::umulExtended_UInt4_UInt4_UInt4_UInt4, > "void umulExtended_emu(uint4 x, uint4 y, out uint4 msb, out uint4 lsb)\n" > "{\n" > " umulExtended_emu(x.x, y.x, msb.x, lsb.x);\n" >@@ -130,8 +118,9 @@ void InitBuiltInFunctionEmulatorForHLSL(BuiltInFunctionEmulator *emu) > // result needs to be negative. > // TODO(oetuaho): Note that this code doesn't take one edge case into account, where x or y is > // -2^31. abs(-2^31) is undefined. >- FunctionId imulExtendedInt1 = emu->addEmulatedFunctionWithDependency( >- umulExtendedUint1, EOpImulExtended, int1, int1, int1, int1, >+ emu->addEmulatedFunctionWithDependency( >+ BuiltInId::umulExtended_UInt1_UInt1_UInt1_UInt1, >+ BuiltInId::imulExtended_Int1_Int1_Int1_Int1, > "void imulExtended_emu(int x, int y, out int msb, out int lsb)\n" > "{\n" > " uint unsignedMsb;\n" >@@ -156,14 +145,14 @@ void InitBuiltInFunctionEmulatorForHLSL(BuiltInFunctionEmulator *emu) > " }\n" > "}\n"); > emu->addEmulatedFunctionWithDependency( >- imulExtendedInt1, EOpImulExtended, int2, int2, int2, int2, >+ BuiltInId::imulExtended_Int1_Int1_Int1_Int1, BuiltInId::imulExtended_Int2_Int2_Int2_Int2, > "void imulExtended_emu(int2 x, int2 y, out int2 msb, out int2 lsb)\n" > "{\n" > " imulExtended_emu(x.x, y.x, msb.x, lsb.x);\n" > " imulExtended_emu(x.y, y.y, msb.y, lsb.y);\n" > "}\n"); > emu->addEmulatedFunctionWithDependency( >- imulExtendedInt1, EOpImulExtended, int3, int3, int3, int3, >+ BuiltInId::imulExtended_Int1_Int1_Int1_Int1, BuiltInId::imulExtended_Int3_Int3_Int3_Int3, > "void imulExtended_emu(int3 x, int3 y, out int3 msb, out int3 lsb)\n" > "{\n" > " imulExtended_emu(x.x, y.x, msb.x, lsb.x);\n" >@@ -171,7 +160,7 @@ void InitBuiltInFunctionEmulatorForHLSL(BuiltInFunctionEmulator *emu) > " imulExtended_emu(x.z, y.z, msb.z, lsb.z);\n" > "}\n"); > emu->addEmulatedFunctionWithDependency( >- imulExtendedInt1, EOpImulExtended, int4, int4, int4, int4, >+ BuiltInId::imulExtended_Int1_Int1_Int1_Int1, BuiltInId::imulExtended_Int4_Int4_Int4_Int4, > "void imulExtended_emu(int4 x, int4 y, out int4 msb, out int4 lsb)\n" > "{\n" > " imulExtended_emu(x.x, y.x, msb.x, lsb.x);\n" >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Cache.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/Cache.cpp >deleted file mode 100644 >index 417e82403ab..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Cache.cpp >+++ /dev/null >@@ -1,99 +0,0 @@ >-// >-// Copyright (c) 2015 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. >-// >- >-// Cache.cpp: Implements a cache for various commonly created objects. >- >-#include <limits> >- >-#include "common/angleutils.h" >-#include "common/debug.h" >-#include "compiler/translator/Cache.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class TScopedAllocator : angle::NonCopyable >-{ >- public: >- TScopedAllocator(TPoolAllocator *allocator) : mPreviousAllocator(GetGlobalPoolAllocator()) >- { >- SetGlobalPoolAllocator(allocator); >- } >- ~TScopedAllocator() { SetGlobalPoolAllocator(mPreviousAllocator); } >- >- private: >- TPoolAllocator *mPreviousAllocator; >-}; >- >-} // namespace >- >-TCache::TypeKey::TypeKey(TBasicType basicType, >- TPrecision precision, >- TQualifier qualifier, >- unsigned char primarySize, >- unsigned char secondarySize) >-{ >- static_assert(sizeof(components) <= sizeof(value), "TypeKey::value is too small"); >- >- const size_t MaxEnumValue = std::numeric_limits<EnumComponentType>::max(); >- >- // TODO: change to static_assert() once we deprecate MSVC 2013 support >- ASSERT(MaxEnumValue >= EbtLast && MaxEnumValue >= EbpLast && MaxEnumValue >= EvqLast && >- "TypeKey::EnumComponentType is too small"); >- >- value = 0; >- components.basicType = static_cast<EnumComponentType>(basicType); >- components.precision = static_cast<EnumComponentType>(precision); >- components.qualifier = static_cast<EnumComponentType>(qualifier); >- components.primarySize = primarySize; >- components.secondarySize = secondarySize; >-} >- >-TCache *TCache::sCache = nullptr; >- >-TCache::TCache() >-{ >-} >- >-void TCache::initialize() >-{ >- if (sCache == nullptr) >- { >- sCache = new TCache(); >- } >-} >- >-void TCache::destroy() >-{ >- SafeDelete(sCache); >-} >- >-const TType *TCache::getType(TBasicType basicType, >- TPrecision precision, >- TQualifier qualifier, >- unsigned char primarySize, >- unsigned char secondarySize) >-{ >- TypeKey key(basicType, precision, qualifier, primarySize, secondarySize); >- auto it = sCache->mTypes.find(key); >- if (it != sCache->mTypes.end()) >- { >- return it->second; >- } >- >- TScopedAllocator scopedAllocator(&sCache->mAllocator); >- >- TType *type = new TType(basicType, precision, qualifier, primarySize, secondarySize); >- type->realize(); >- sCache->mTypes.insert(std::make_pair(key, type)); >- >- return type; >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Cache.h b/Source/ThirdParty/ANGLE/src/compiler/translator/Cache.h >deleted file mode 100644 >index a182b07f514..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Cache.h >+++ /dev/null >@@ -1,84 +0,0 @@ >-// >-// Copyright (c) 2015 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. >-// >- >-// Cache.h: Implements a cache for various commonly created objects. >- >-#ifndef COMPILER_TRANSLATOR_CACHE_H_ >-#define COMPILER_TRANSLATOR_CACHE_H_ >- >-#include <stdint.h> >-#include <string.h> >-#include <map> >- >-#include "compiler/translator/Types.h" >-#include "compiler/translator/PoolAlloc.h" >- >-namespace sh >-{ >- >-class TCache >-{ >- public: >- static void initialize(); >- static void destroy(); >- >- static const TType *getType(TBasicType basicType, TPrecision precision) >- { >- return getType(basicType, precision, EvqTemporary, 1, 1); >- } >- static const TType *getType(TBasicType basicType, >- unsigned char primarySize = 1, >- unsigned char secondarySize = 1) >- { >- return getType(basicType, EbpUndefined, EvqGlobal, primarySize, secondarySize); >- } >- static const TType *getType(TBasicType basicType, >- TQualifier qualifier, >- unsigned char primarySize = 1, >- unsigned char secondarySize = 1) >- { >- return getType(basicType, EbpUndefined, qualifier, primarySize, secondarySize); >- } >- static const TType *getType(TBasicType basicType, >- TPrecision precision, >- TQualifier qualifier, >- unsigned char primarySize, >- unsigned char secondarySize); >- >- private: >- TCache(); >- >- union TypeKey { >- TypeKey(TBasicType basicType, >- TPrecision precision, >- TQualifier qualifier, >- unsigned char primarySize, >- unsigned char secondarySize); >- >- typedef uint8_t EnumComponentType; >- struct >- { >- EnumComponentType basicType; >- EnumComponentType precision; >- EnumComponentType qualifier; >- unsigned char primarySize; >- unsigned char secondarySize; >- } components; >- uint64_t value; >- >- bool operator<(const TypeKey &other) const { return value < other.value; } >- }; >- typedef std::map<TypeKey, const TType *> TypeMap; >- >- TypeMap mTypes; >- TPoolAllocator mAllocator; >- >- static TCache *sCache; >-}; >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_CACHE_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/CallDAG.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/CallDAG.cpp >index 5f54e808984..63c8cd0f92e 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/CallDAG.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/CallDAG.cpp >@@ -11,8 +11,8 @@ > #include "compiler/translator/CallDAG.h" > > #include "compiler/translator/Diagnostics.h" >-#include "compiler/translator/IntermTraverse.h" > #include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > > namespace sh > { >@@ -23,12 +23,11 @@ class CallDAG::CallDAGCreator : public TIntermTraverser > { > public: > CallDAGCreator(TDiagnostics *diagnostics) >- : TIntermTraverser(true, false, true), >+ : TIntermTraverser(true, false, false), > mDiagnostics(diagnostics), > mCurrentFunction(nullptr), > mCurrentIndex(0) >- { >- } >+ {} > > InitResult assignIndices() > { >@@ -36,7 +35,7 @@ class CallDAG::CallDAGCreator : public TIntermTraverser > for (auto &it : mFunctions) > { > // Skip unimplemented functions >- if (it.second.node) >+ if (it.second.definitionNode) > { > InitResult result = assignIndicesInternal(&it.second); > if (result != INITDAG_SUCCESS) >@@ -65,15 +64,14 @@ class CallDAG::CallDAGCreator : public TIntermTraverser > { > CreatorFunctionData &data = it.second; > // Skip unimplemented functions >- if (!data.node) >+ if (!data.definitionNode) > { > continue; > } > ASSERT(data.index < records->size()); > Record &record = (*records)[data.index]; > >- record.name = data.name.data(); >- record.node = data.node; >+ record.node = data.definitionNode; > > record.callees.reserve(data.callees.size()); > for (auto &callee : data.callees) >@@ -81,19 +79,20 @@ class CallDAG::CallDAGCreator : public TIntermTraverser > record.callees.push_back(static_cast<int>(callee->index)); > } > >- (*idToIndex)[data.node->getFunctionSymbolInfo()->getId().get()] = >- static_cast<int>(data.index); >+ (*idToIndex)[it.first] = static_cast<int>(data.index); > } > } > > private: > struct CreatorFunctionData > { >- CreatorFunctionData() : node(nullptr), index(0), indexAssigned(false), visiting(false) {} >+ CreatorFunctionData() >+ : definitionNode(nullptr), name(""), index(0), indexAssigned(false), visiting(false) >+ {} > > std::set<CreatorFunctionData *> callees; >- TIntermFunctionDefinition *node; >- TString name; >+ TIntermFunctionDefinition *definitionNode; >+ ImmutableString name; > size_t index; > bool indexAssigned; > bool visiting; >@@ -101,54 +100,36 @@ class CallDAG::CallDAGCreator : public TIntermTraverser > > bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override > { >- // Create the record if need be and remember the node. >- if (visit == PreVisit) >- { >- auto it = mFunctions.find(node->getFunctionSymbolInfo()->getId().get()); >- >- if (it == mFunctions.end()) >- { >- mCurrentFunction = &mFunctions[node->getFunctionSymbolInfo()->getId().get()]; >- mCurrentFunction->name = node->getFunctionSymbolInfo()->getName(); >- } >- else >- { >- mCurrentFunction = &it->second; >- ASSERT(mCurrentFunction->name == node->getFunctionSymbolInfo()->getName()); >- } >- >- mCurrentFunction->node = node; >- } >- else if (visit == PostVisit) >- { >- mCurrentFunction = nullptr; >- } >- return true; >+ // Create the record if need be and remember the definition node. >+ mCurrentFunction = &mFunctions[node->getFunction()->uniqueId().get()]; >+ // Name will be overwritten here. If we've already traversed the prototype of this function, >+ // it should have had the same name. >+ ASSERT(mCurrentFunction->name == "" || >+ mCurrentFunction->name == node->getFunction()->name()); >+ mCurrentFunction->name = node->getFunction()->name(); >+ mCurrentFunction->definitionNode = node; >+ >+ node->getBody()->traverse(this); >+ mCurrentFunction = nullptr; >+ return false; > } > >- bool visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) override >+ void visitFunctionPrototype(TIntermFunctionPrototype *node) override > { >- ASSERT(visit == PreVisit); >- if (mCurrentFunction != nullptr) >- { >- return false; >- } >+ ASSERT(mCurrentFunction == nullptr); > > // Function declaration, create an empty record. >- auto &record = mFunctions[node->getFunctionSymbolInfo()->getId().get()]; >- record.name = node->getFunctionSymbolInfo()->getName(); >- >- // No need to traverse the parameters. >- return false; >+ auto &record = mFunctions[node->getFunction()->uniqueId().get()]; >+ record.name = node->getFunction()->name(); > } > >- // Aggregates the AST node for each function as well as the name of the functions called by it >+ // Track functions called from another function. > bool visitAggregate(Visit visit, TIntermAggregate *node) override > { >- if (visit == PreVisit && node->getOp() == EOpCallFunctionInAST) >+ if (node->getOp() == EOpCallFunctionInAST) > { > // Function call, add the callees >- auto it = mFunctions.find(node->getFunctionSymbolInfo()->getId().get()); >+ auto it = mFunctions.find(node->getFunction()->uniqueId().get()); > ASSERT(it != mFunctions.end()); > > // We might be traversing the initializer of a global variable. Even though function >@@ -190,7 +171,7 @@ class CallDAG::CallDAGCreator : public TIntermTraverser > > InitResult result = INITDAG_SUCCESS; > >- std::stringstream errorStream; >+ std::stringstream errorStream = sh::InitializeStream<std::stringstream>(); > > while (!functionsToProcess.empty()) > { >@@ -206,7 +187,7 @@ class CallDAG::CallDAGCreator : public TIntermTraverser > continue; > } > >- if (!function->node) >+ if (!function->definitionNode) > { > errorStream << "Undefined function '" << function->name > << ")' used in the following call chain:"; >@@ -277,19 +258,15 @@ class CallDAG::CallDAGCreator : public TIntermTraverser > > // CallDAG > >-CallDAG::CallDAG() >-{ >-} >+CallDAG::CallDAG() {} > >-CallDAG::~CallDAG() >-{ >-} >+CallDAG::~CallDAG() {} > > const size_t CallDAG::InvalidIndex = std::numeric_limits<size_t>::max(); > >-size_t CallDAG::findIndex(const TFunctionSymbolInfo *functionInfo) const >+size_t CallDAG::findIndex(const TSymbolUniqueId &id) const > { >- auto it = mFunctionIdToIndex.find(functionInfo->getId().get()); >+ auto it = mFunctionIdToIndex.find(id.get()); > > if (it == mFunctionIdToIndex.end()) > { >@@ -307,13 +284,6 @@ const CallDAG::Record &CallDAG::getRecordFromIndex(size_t index) const > return mRecords[index]; > } > >-const CallDAG::Record &CallDAG::getRecord(const TIntermAggregate *function) const >-{ >- size_t index = findIndex(function->getFunctionSymbolInfo()); >- ASSERT(index != InvalidIndex && index < mRecords.size()); >- return mRecords[index]; >-} >- > size_t CallDAG::size() const > { > return mRecords.size(); >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/CallDAG.h b/Source/ThirdParty/ANGLE/src/compiler/translator/CallDAG.h >index 155081c9a29..813fc75573c 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/CallDAG.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/CallDAG.h >@@ -24,10 +24,10 @@ namespace sh > // This class is used to precompute that function call DAG so that it > // can be reused by multiple analyses. > // >-// It stores a vector of function records, with one record per function. >+// It stores a vector of function records, with one record per defined function. > // Records are accessed by index but a function symbol id can be converted >-// to the index of the corresponding record. The records mostly contain the >-// AST node of the function and the indices of the function's callees. >+// to the index of the corresponding record. The records contain the AST node >+// of the function definition and the indices of the function's callees. > // > // In addition, records are in reverse topological order: a function F being > // called by a function G will have index index(F) < index(G), that way >@@ -41,8 +41,7 @@ class CallDAG : angle::NonCopyable > > struct Record > { >- std::string name; >- TIntermFunctionDefinition *node; >+ TIntermFunctionDefinition *node; // Guaranteed to be non-null. > std::vector<int> callees; > }; > >@@ -58,10 +57,9 @@ class CallDAG : angle::NonCopyable > InitResult init(TIntermNode *root, TDiagnostics *diagnostics); > > // Returns InvalidIndex if the function wasn't found >- size_t findIndex(const TFunctionSymbolInfo *functionInfo) const; >+ size_t findIndex(const TSymbolUniqueId &id) const; > > const Record &getRecordFromIndex(size_t index) const; >- const Record &getRecord(const TIntermAggregate *function) const; > size_t size() const; > void clear(); > >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ClampPointSize.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ClampPointSize.cpp >deleted file mode 100644 >index 8598a137f53..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ClampPointSize.cpp >+++ /dev/null >@@ -1,47 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// ClampPointSize.cpp: Limit the value that is written to gl_PointSize. >-// >- >-#include "compiler/translator/ClampPointSize.h" >- >-#include "compiler/translator/FindSymbolNode.h" >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/RunAtTheEndOfShader.h" >-#include "compiler/translator/SymbolTable.h" >- >-namespace sh >-{ >- >-void ClampPointSize(TIntermBlock *root, float maxPointSize, TSymbolTable *symbolTable) >-{ >- // Only clamp gl_PointSize if it's used in the shader. >- if (!FindSymbolNode(root, TString("gl_PointSize"), EbtFloat)) >- { >- return; >- } >- >- TIntermSymbol *pointSizeNode = ReferenceBuiltInVariable("gl_PointSize", *symbolTable, 100); >- >- TConstantUnion *maxPointSizeConstant = new TConstantUnion(); >- maxPointSizeConstant->setFConst(maxPointSize); >- TIntermConstantUnion *maxPointSizeNode = >- new TIntermConstantUnion(maxPointSizeConstant, TType(EbtFloat, EbpHigh, EvqConst)); >- >- // min(gl_PointSize, maxPointSize) >- TIntermSequence *minArguments = new TIntermSequence(); >- minArguments->push_back(pointSizeNode->deepCopy()); >- minArguments->push_back(maxPointSizeNode); >- TIntermTyped *clampedPointSize = >- CreateBuiltInFunctionCallNode("min", minArguments, *symbolTable, 100); >- >- // gl_PointSize = min(gl_PointSize, maxPointSize) >- TIntermBinary *assignPointSize = new TIntermBinary(EOpAssign, pointSizeNode, clampedPointSize); >- >- RunAtTheEndOfShader(root, assignPointSize, symbolTable); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ClampPointSize.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ClampPointSize.h >deleted file mode 100644 >index 0c71ae6b0d2..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ClampPointSize.h >+++ /dev/null >@@ -1,22 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// ClampPointSize.h: Limit the value that is written to gl_PointSize. >-// >- >-#ifndef COMPILER_TRANSLATOR_CLAMPPOINTSIZE_H_ >-#define COMPILER_TRANSLATOR_CLAMPPOINTSIZE_H_ >- >-namespace sh >-{ >- >-class TIntermBlock; >-class TSymbolTable; >- >-void ClampPointSize(TIntermBlock *root, float maxPointSize, TSymbolTable *symbolTable); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_CLAMPPOINTSIZE_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/CodeGen.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/CodeGen.cpp >index 3e25cc2339a..6dc9485589f 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/CodeGen.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/CodeGen.cpp >@@ -5,19 +5,19 @@ > // > > #ifdef ANGLE_ENABLE_ESSL >-#include "compiler/translator/TranslatorESSL.h" >+# include "compiler/translator/TranslatorESSL.h" > #endif // ANGLE_ENABLE_ESSL > > #ifdef ANGLE_ENABLE_GLSL >-#include "compiler/translator/TranslatorGLSL.h" >+# include "compiler/translator/TranslatorGLSL.h" > #endif // ANGLE_ENABLE_GLSL > > #ifdef ANGLE_ENABLE_HLSL >-#include "compiler/translator/TranslatorHLSL.h" >+# include "compiler/translator/TranslatorHLSL.h" > #endif // ANGLE_ENABLE_HLSL > > #ifdef ANGLE_ENABLE_VULKAN >-#include "compiler/translator/TranslatorVulkan.h" >+# include "compiler/translator/TranslatorVulkan.h" > #endif // ANGLE_ENABLE_VULKAN > > #include "compiler/translator/util.h" >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/CollectVariables.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/CollectVariables.cpp >index bd8cbc971ab..cbaaf83b27d 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/CollectVariables.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/CollectVariables.cpp >@@ -10,8 +10,8 @@ > #include "angle_gl.h" > #include "common/utilities.h" > #include "compiler/translator/HashNames.h" >-#include "compiler/translator/IntermTraverse.h" > #include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > #include "compiler/translator/util.h" > > namespace sh >@@ -38,7 +38,7 @@ BlockLayoutType GetBlockLayoutType(TLayoutBlockStorage blockStorage) > } > } > >-// TODO(jiawei.shao@intel.com): implement GL_OES_shader_io_blocks. >+// TODO(jiawei.shao@intel.com): implement GL_EXT_shader_io_blocks. > BlockType GetBlockType(TQualifier qualifier) > { > switch (qualifier) >@@ -56,37 +56,38 @@ BlockType GetBlockType(TQualifier qualifier) > } > > template <class VarT> >-VarT *FindVariable(const TString &name, std::vector<VarT> *infoList) >+VarT *FindVariable(const ImmutableString &name, std::vector<VarT> *infoList) > { > // TODO(zmo): optimize this function. > for (size_t ii = 0; ii < infoList->size(); ++ii) > { >- if ((*infoList)[ii].name.c_str() == name) >+ if (name == (*infoList)[ii].name) > return &((*infoList)[ii]); > } > > return nullptr; > } > >-// Note that this shouldn't be called for interface blocks - static use information is collected for >+// Note that this shouldn't be called for interface blocks - active information is collected for > // individual fields in case of interface blocks. >-void MarkStaticallyUsed(ShaderVariable *variable) >+void MarkActive(ShaderVariable *variable) > { >- if (!variable->staticUse) >+ if (!variable->active) > { > if (variable->isStruct()) > { > // Conservatively assume all fields are statically used as well. > for (auto &field : variable->fields) > { >- MarkStaticallyUsed(&field); >+ MarkActive(&field); > } > } >- variable->staticUse = true; >+ ASSERT(variable->staticUse); >+ variable->active = true; > } > } > >-ShaderVariable *FindVariableInInterfaceBlock(const TString &name, >+ShaderVariable *FindVariableInInterfaceBlock(const ImmutableString &name, > const TInterfaceBlock *interfaceBlock, > std::vector<InterfaceBlock> *infoList) > { >@@ -96,6 +97,7 @@ ShaderVariable *FindVariableInInterfaceBlock(const TString &name, > > // Set static use on the parent interface block here > namedBlock->staticUse = true; >+ namedBlock->active = true; > return FindVariable(name, &namedBlock->fields); > } > >@@ -114,37 +116,45 @@ class CollectVariablesTraverser : public TIntermTraverser > std::vector<InterfaceBlock> *inBlocks, > ShHashFunction64 hashFunction, > TSymbolTable *symbolTable, >- int shaderVersion, > GLenum shaderType, > const TExtensionBehavior &extensionBehavior); > >+ bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) override; > void visitSymbol(TIntermSymbol *symbol) override; > bool visitDeclaration(Visit, TIntermDeclaration *node) override; > bool visitBinary(Visit visit, TIntermBinary *binaryNode) override; > > private: >- std::string getMappedName(const TName &name) const; >- >+ std::string getMappedName(const TSymbol *symbol) const; >+ >+ void setFieldOrVariableProperties(const TType &type, >+ bool staticUse, >+ ShaderVariable *variableOut) const; >+ void setFieldProperties(const TType &type, >+ const ImmutableString &name, >+ bool staticUse, >+ ShaderVariable *variableOut) const; > void setCommonVariableProperties(const TType &type, >- const TName &name, >+ const TVariable &variable, > ShaderVariable *variableOut) const; > > Attribute recordAttribute(const TIntermSymbol &variable) const; > OutputVariable recordOutputVariable(const TIntermSymbol &variable) const; > Varying recordVarying(const TIntermSymbol &variable) const; >- void recordInterfaceBlock(const TType &interfaceBlockType, >+ void recordInterfaceBlock(const char *instanceName, >+ const TType &interfaceBlockType, > InterfaceBlock *interfaceBlock) const; > Uniform recordUniform(const TIntermSymbol &variable) const; > >- void setBuiltInInfoFromSymbolTable(const char *name, ShaderVariable *info); >+ void setBuiltInInfoFromSymbol(const TVariable &variable, ShaderVariable *info); > >- void recordBuiltInVaryingUsed(const char *name, >+ void recordBuiltInVaryingUsed(const TVariable &variable, > bool *addedFlag, > std::vector<Varying> *varyings); >- void recordBuiltInFragmentOutputUsed(const char *name, bool *addedFlag); >- void recordBuiltInAttributeUsed(const char *name, bool *addedFlag); >+ void recordBuiltInFragmentOutputUsed(const TVariable &variable, bool *addedFlag); >+ void recordBuiltInAttributeUsed(const TVariable &variable, bool *addedFlag); > InterfaceBlock *recordGLInUsed(const TType &glInType); >- InterfaceBlock *findNamedInterfaceBlock(const TString &name) const; >+ InterfaceBlock *findNamedInterfaceBlock(const ImmutableString &name) const; > > std::vector<Attribute> *mAttribs; > std::vector<OutputVariable> *mOutputVariables; >@@ -164,6 +174,7 @@ class CollectVariablesTraverser : public TIntermTraverser > bool mInstanceIDAdded; > bool mVertexIDAdded; > bool mPointSizeAdded; >+ bool mDrawIDAdded; > > // Vertex Shader and Geometry Shader builtins > bool mPositionAdded; >@@ -191,7 +202,6 @@ class CollectVariablesTraverser : public TIntermTraverser > > ShHashFunction64 mHashFunction; > >- int mShaderVersion; > GLenum mShaderType; > const TExtensionBehavior &mExtensionBehavior; > }; >@@ -207,7 +217,6 @@ CollectVariablesTraverser::CollectVariablesTraverser( > std::vector<sh::InterfaceBlock> *inBlocks, > ShHashFunction64 hashFunction, > TSymbolTable *symbolTable, >- int shaderVersion, > GLenum shaderType, > const TExtensionBehavior &extensionBehavior) > : TIntermTraverser(true, false, false, symbolTable), >@@ -223,6 +232,7 @@ CollectVariablesTraverser::CollectVariablesTraverser( > mInstanceIDAdded(false), > mVertexIDAdded(false), > mPointSizeAdded(false), >+ mDrawIDAdded(false), > mPositionAdded(false), > mPointCoordAdded(false), > mFrontFacingAdded(false), >@@ -240,36 +250,31 @@ CollectVariablesTraverser::CollectVariablesTraverser( > mPrimitiveIDAdded(false), > mLayerAdded(false), > mHashFunction(hashFunction), >- mShaderVersion(shaderVersion), > mShaderType(shaderType), > mExtensionBehavior(extensionBehavior) >-{ >-} >+{} > >-std::string CollectVariablesTraverser::getMappedName(const TName &name) const >+std::string CollectVariablesTraverser::getMappedName(const TSymbol *symbol) const > { >- return HashName(name, mHashFunction, nullptr).c_str(); >+ return HashName(symbol, mHashFunction, nullptr).data(); > } > >-void CollectVariablesTraverser::setBuiltInInfoFromSymbolTable(const char *name, >- ShaderVariable *info) >+void CollectVariablesTraverser::setBuiltInInfoFromSymbol(const TVariable &variable, >+ ShaderVariable *info) > { >- TVariable *symbolTableVar = >- reinterpret_cast<TVariable *>(mSymbolTable->findBuiltIn(name, mShaderVersion)); >- ASSERT(symbolTableVar); >- const TType &type = symbolTableVar->getType(); >+ const TType &type = variable.getType(); > >- info->name = name; >- info->mappedName = name; >+ info->name = variable.name().data(); >+ info->mappedName = variable.name().data(); > info->type = GLVariableType(type); >- info->precision = GLVariablePrecision(type); >+ info->precision = GLVariablePrecision(type); > if (auto *arraySizes = type.getArraySizes()) > { > info->arraySizes.assign(arraySizes->begin(), arraySizes->end()); > } > } > >-void CollectVariablesTraverser::recordBuiltInVaryingUsed(const char *name, >+void CollectVariablesTraverser::recordBuiltInVaryingUsed(const TVariable &variable, > bool *addedFlag, > std::vector<Varying> *varyings) > { >@@ -277,33 +282,38 @@ void CollectVariablesTraverser::recordBuiltInVaryingUsed(const char *name, > if (!(*addedFlag)) > { > Varying info; >- setBuiltInInfoFromSymbolTable(name, &info); >+ setBuiltInInfoFromSymbol(variable, &info); > info.staticUse = true; >- info.isInvariant = mSymbolTable->isVaryingInvariant(name); >+ info.active = true; >+ info.isInvariant = mSymbolTable->isVaryingInvariant(variable); > varyings->push_back(info); > (*addedFlag) = true; > } > } > >-void CollectVariablesTraverser::recordBuiltInFragmentOutputUsed(const char *name, bool *addedFlag) >+void CollectVariablesTraverser::recordBuiltInFragmentOutputUsed(const TVariable &variable, >+ bool *addedFlag) > { > if (!(*addedFlag)) > { > OutputVariable info; >- setBuiltInInfoFromSymbolTable(name, &info); >+ setBuiltInInfoFromSymbol(variable, &info); > info.staticUse = true; >+ info.active = true; > mOutputVariables->push_back(info); > (*addedFlag) = true; > } > } > >-void CollectVariablesTraverser::recordBuiltInAttributeUsed(const char *name, bool *addedFlag) >+void CollectVariablesTraverser::recordBuiltInAttributeUsed(const TVariable &variable, >+ bool *addedFlag) > { > if (!(*addedFlag)) > { > Attribute info; >- setBuiltInInfoFromSymbolTable(name, &info); >+ setBuiltInInfoFromSymbol(variable, &info); > info.staticUse = true; >+ info.active = true; > info.location = -1; > mAttribs->push_back(info); > (*addedFlag) = true; >@@ -316,8 +326,7 @@ InterfaceBlock *CollectVariablesTraverser::recordGLInUsed(const TType &glInType) > { > ASSERT(glInType.getQualifier() == EvqPerVertexIn); > InterfaceBlock info; >- recordInterfaceBlock(glInType, &info); >- info.staticUse = true; >+ recordInterfaceBlock("gl_in", glInType, &info); > > mPerVertexInAdded = true; > mInBlocks->push_back(info); >@@ -325,33 +334,45 @@ InterfaceBlock *CollectVariablesTraverser::recordGLInUsed(const TType &glInType) > } > else > { >- return FindVariable("gl_PerVertex", mInBlocks); >+ return FindVariable(ImmutableString("gl_PerVertex"), mInBlocks); > } > } > >-// We want to check whether a uniform/varying is statically used >-// because we only count the used ones in packing computing. >-// Also, gl_FragCoord, gl_PointCoord, and gl_FrontFacing count >-// toward varying counting if they are statically used in a fragment >-// shader. >+bool CollectVariablesTraverser::visitInvariantDeclaration(Visit visit, >+ TIntermInvariantDeclaration *node) >+{ >+ // We should not mark variables as active just based on an invariant declaration, so we don't >+ // traverse the symbols declared invariant. >+ return false; >+} >+ >+// We want to check whether a uniform/varying is active because we need to skip updating inactive >+// ones. We also only count the active ones in packing computing. Also, gl_FragCoord, gl_PointCoord, >+// and gl_FrontFacing count toward varying counting if they are active in a fragment shader. > void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) > { > ASSERT(symbol != nullptr); > >- if (symbol->getName().isInternal()) >+ if (symbol->variable().symbolType() == SymbolType::AngleInternal || >+ symbol->variable().symbolType() == SymbolType::Empty) > { >- // Internal variables are not collected. >+ // Internal variables or nameless variables are not collected. > return; > } > >- ShaderVariable *var = nullptr; >- const TString &symbolName = symbol->getName().getString(); >+ ShaderVariable *var = nullptr; > >- if (IsVaryingIn(symbol->getQualifier())) >+ const ImmutableString &symbolName = symbol->getName(); >+ >+ // Check the qualifier from the variable, not from the symbol node. The node may have a >+ // different qualifier if it's the result of a folded ternary node. >+ TQualifier qualifier = symbol->variable().getType().getQualifier(); >+ >+ if (IsVaryingIn(qualifier)) > { > var = FindVariable(symbolName, mInputVaryings); > } >- else if (IsVaryingOut(symbol->getQualifier())) >+ else if (IsVaryingOut(qualifier)) > { > var = FindVariable(symbolName, mOutputVaryings); > } >@@ -361,7 +382,7 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) > } > else if (symbolName == "gl_DepthRange") > { >- ASSERT(symbol->getQualifier() == EvqUniform); >+ ASSERT(qualifier == EvqUniform); > > if (!mDepthRangeAdded) > { >@@ -372,6 +393,7 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) > info.type = GL_NONE; > info.precision = GL_NONE; > info.staticUse = true; >+ info.active = true; > > ShaderVariable nearInfo(GL_FLOAT); > const char kNearName[] = "near"; >@@ -379,6 +401,7 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) > nearInfo.mappedName = kNearName; > nearInfo.precision = GL_HIGH_FLOAT; > nearInfo.staticUse = true; >+ nearInfo.active = true; > > ShaderVariable farInfo(GL_FLOAT); > const char kFarName[] = "far"; >@@ -386,6 +409,7 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) > farInfo.mappedName = kFarName; > farInfo.precision = GL_HIGH_FLOAT; > farInfo.staticUse = true; >+ farInfo.active = true; > > ShaderVariable diffInfo(GL_FLOAT); > const char kDiffName[] = "diff"; >@@ -393,6 +417,7 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) > diffInfo.mappedName = kDiffName; > diffInfo.precision = GL_HIGH_FLOAT; > diffInfo.staticUse = true; >+ diffInfo.active = true; > > info.fields.push_back(nearInfo); > info.fields.push_back(farInfo); >@@ -404,7 +429,7 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) > } > else > { >- switch (symbol->getQualifier()) >+ switch (qualifier) > { > case EvqAttribute: > case EvqVertexIn: >@@ -426,7 +451,7 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) > } > > // It's an internal error to reference an undefined user uniform >- ASSERT(symbolName.compare(0, 3, "gl_") != 0 || var); >+ ASSERT(!symbolName.beginsWith("gl_") || var); > } > break; > case EvqBuffer: >@@ -437,108 +462,99 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) > } > break; > case EvqFragCoord: >- recordBuiltInVaryingUsed("gl_FragCoord", &mFragCoordAdded, mInputVaryings); >+ recordBuiltInVaryingUsed(symbol->variable(), &mFragCoordAdded, mInputVaryings); > return; > case EvqFrontFacing: >- recordBuiltInVaryingUsed("gl_FrontFacing", &mFrontFacingAdded, mInputVaryings); >+ recordBuiltInVaryingUsed(symbol->variable(), &mFrontFacingAdded, mInputVaryings); > return; > case EvqPointCoord: >- recordBuiltInVaryingUsed("gl_PointCoord", &mPointCoordAdded, mInputVaryings); >+ recordBuiltInVaryingUsed(symbol->variable(), &mPointCoordAdded, mInputVaryings); > return; > case EvqInstanceID: > // Whenever the SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW option is set, > // gl_InstanceID is added inside expressions to initialize ViewID_OVR and >- // InstanceID. gl_InstanceID is not added to the symbol table for ESSL1 shaders >- // which makes it necessary to populate the type information explicitly instead of >- // extracting it from the symbol table. >- if (!mInstanceIDAdded) >- { >- Attribute info; >- const char kName[] = "gl_InstanceID"; >- info.name = kName; >- info.mappedName = kName; >- info.type = GL_INT; >- info.precision = GL_HIGH_INT; // Defined by spec. >- info.staticUse = true; >- info.location = -1; >- mAttribs->push_back(info); >- mInstanceIDAdded = true; >- } >+ // InstanceID. Note that gl_InstanceID is not added to the symbol table for ESSL1 >+ // shaders. >+ recordBuiltInAttributeUsed(symbol->variable(), &mInstanceIDAdded); > return; > case EvqVertexID: >- recordBuiltInAttributeUsed("gl_VertexID", &mVertexIDAdded); >+ recordBuiltInAttributeUsed(symbol->variable(), &mVertexIDAdded); > return; > case EvqPosition: >- recordBuiltInVaryingUsed("gl_Position", &mPositionAdded, mOutputVaryings); >+ recordBuiltInVaryingUsed(symbol->variable(), &mPositionAdded, mOutputVaryings); > return; > case EvqPointSize: >- recordBuiltInVaryingUsed("gl_PointSize", &mPointSizeAdded, mOutputVaryings); >+ recordBuiltInVaryingUsed(symbol->variable(), &mPointSizeAdded, mOutputVaryings); >+ return; >+ case EvqDrawID: >+ recordBuiltInAttributeUsed(symbol->variable(), &mDrawIDAdded); > return; > case EvqLastFragData: >- recordBuiltInVaryingUsed("gl_LastFragData", &mLastFragDataAdded, mInputVaryings); >+ recordBuiltInVaryingUsed(symbol->variable(), &mLastFragDataAdded, mInputVaryings); > return; > case EvqFragColor: >- recordBuiltInFragmentOutputUsed("gl_FragColor", &mFragColorAdded); >+ recordBuiltInFragmentOutputUsed(symbol->variable(), &mFragColorAdded); > return; > case EvqFragData: > if (!mFragDataAdded) > { > OutputVariable info; >- setBuiltInInfoFromSymbolTable("gl_FragData", &info); >+ setBuiltInInfoFromSymbol(symbol->variable(), &info); > if (!IsExtensionEnabled(mExtensionBehavior, TExtension::EXT_draw_buffers)) > { > ASSERT(info.arraySizes.size() == 1u); > info.arraySizes.back() = 1u; > } > info.staticUse = true; >+ info.active = true; > mOutputVariables->push_back(info); > mFragDataAdded = true; > } > return; > case EvqFragDepthEXT: >- recordBuiltInFragmentOutputUsed("gl_FragDepthEXT", &mFragDepthEXTAdded); >+ recordBuiltInFragmentOutputUsed(symbol->variable(), &mFragDepthEXTAdded); > return; > case EvqFragDepth: >- recordBuiltInFragmentOutputUsed("gl_FragDepth", &mFragDepthAdded); >+ recordBuiltInFragmentOutputUsed(symbol->variable(), &mFragDepthAdded); > return; > case EvqSecondaryFragColorEXT: >- recordBuiltInFragmentOutputUsed("gl_SecondaryFragColorEXT", >- &mSecondaryFragColorEXTAdded); >+ recordBuiltInFragmentOutputUsed(symbol->variable(), &mSecondaryFragColorEXTAdded); > return; > case EvqSecondaryFragDataEXT: >- recordBuiltInFragmentOutputUsed("gl_SecondaryFragDataEXT", >- &mSecondaryFragDataEXTAdded); >+ recordBuiltInFragmentOutputUsed(symbol->variable(), &mSecondaryFragDataEXTAdded); > return; > case EvqInvocationID: >- recordBuiltInVaryingUsed("gl_InvocationID", &mInvocationIDAdded, mInputVaryings); >+ recordBuiltInVaryingUsed(symbol->variable(), &mInvocationIDAdded, mInputVaryings); > break; > case EvqPrimitiveIDIn: >- recordBuiltInVaryingUsed("gl_PrimitiveIDIn", &mPrimitiveIDInAdded, mInputVaryings); >+ recordBuiltInVaryingUsed(symbol->variable(), &mPrimitiveIDInAdded, mInputVaryings); > break; > case EvqPrimitiveID: >- if (mShaderType == GL_GEOMETRY_SHADER_OES) >+ if (mShaderType == GL_GEOMETRY_SHADER_EXT) > { >- recordBuiltInVaryingUsed("gl_PrimitiveID", &mPrimitiveIDAdded, mOutputVaryings); >+ recordBuiltInVaryingUsed(symbol->variable(), &mPrimitiveIDAdded, >+ mOutputVaryings); > } > else > { > ASSERT(mShaderType == GL_FRAGMENT_SHADER); >- recordBuiltInVaryingUsed("gl_PrimitiveID", &mPrimitiveIDAdded, mInputVaryings); >+ recordBuiltInVaryingUsed(symbol->variable(), &mPrimitiveIDAdded, >+ mInputVaryings); > } > break; > case EvqLayer: >- if (mShaderType == GL_GEOMETRY_SHADER_OES) >+ if (mShaderType == GL_GEOMETRY_SHADER_EXT) > { >- recordBuiltInVaryingUsed("gl_Layer", &mLayerAdded, mOutputVaryings); >+ recordBuiltInVaryingUsed(symbol->variable(), &mLayerAdded, mOutputVaryings); > } > else if (mShaderType == GL_FRAGMENT_SHADER) > { >- recordBuiltInVaryingUsed("gl_Layer", &mLayerAdded, mInputVaryings); >+ recordBuiltInVaryingUsed(symbol->variable(), &mLayerAdded, mInputVaryings); > } > else > { > ASSERT(mShaderType == GL_VERTEX_SHADER && >- IsExtensionEnabled(mExtensionBehavior, TExtension::OVR_multiview)); >+ IsExtensionEnabled(mExtensionBehavior, TExtension::OVR_multiview2)); > } > break; > default: >@@ -547,18 +563,19 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) > } > if (var) > { >- MarkStaticallyUsed(var); >+ MarkActive(var); > } > } > >-void CollectVariablesTraverser::setCommonVariableProperties(const TType &type, >- const TName &name, >- ShaderVariable *variableOut) const >+void CollectVariablesTraverser::setFieldOrVariableProperties(const TType &type, >+ bool staticUse, >+ ShaderVariable *variableOut) const > { > ASSERT(variableOut); > >- const TStructure *structure = type.getStruct(); >+ variableOut->staticUse = staticUse; > >+ const TStructure *structure = type.getStruct(); > if (!structure) > { > variableOut->type = GLVariableType(type); >@@ -567,36 +584,60 @@ void CollectVariablesTraverser::setCommonVariableProperties(const TType &type, > else > { > // Structures use a NONE type that isn't exposed outside ANGLE. >- variableOut->type = GL_NONE; >- variableOut->structName = structure->name().c_str(); >+ variableOut->type = GL_NONE; >+ if (structure->symbolType() != SymbolType::Empty) >+ { >+ variableOut->structName = structure->name().data(); >+ } > > const TFieldList &fields = structure->fields(); > >- for (TField *field : fields) >+ for (const TField *field : fields) > { > // Regardless of the variable type (uniform, in/out etc.) its fields are always plain > // ShaderVariable objects. > ShaderVariable fieldVariable; >- setCommonVariableProperties(*field->type(), TName(field->name()), &fieldVariable); >+ setFieldProperties(*field->type(), field->name(), staticUse, &fieldVariable); > variableOut->fields.push_back(fieldVariable); > } > } >- variableOut->name = name.getString().c_str(); >- variableOut->mappedName = getMappedName(name); >- > if (auto *arraySizes = type.getArraySizes()) > { > variableOut->arraySizes.assign(arraySizes->begin(), arraySizes->end()); > } > } > >+void CollectVariablesTraverser::setFieldProperties(const TType &type, >+ const ImmutableString &name, >+ bool staticUse, >+ ShaderVariable *variableOut) const >+{ >+ ASSERT(variableOut); >+ setFieldOrVariableProperties(type, staticUse, variableOut); >+ variableOut->name.assign(name.data(), name.length()); >+ variableOut->mappedName = HashName(name, mHashFunction, nullptr).data(); >+} >+ >+void CollectVariablesTraverser::setCommonVariableProperties(const TType &type, >+ const TVariable &variable, >+ ShaderVariable *variableOut) const >+{ >+ ASSERT(variableOut); >+ >+ variableOut->staticUse = mSymbolTable->isStaticallyUsed(variable); >+ setFieldOrVariableProperties(type, variableOut->staticUse, variableOut); >+ ASSERT(variable.symbolType() != SymbolType::Empty); >+ variableOut->name.assign(variable.name().data(), variable.name().length()); >+ variableOut->mappedName = getMappedName(&variable); >+} >+ > Attribute CollectVariablesTraverser::recordAttribute(const TIntermSymbol &variable) const > { > const TType &type = variable.getType(); > ASSERT(!type.getStruct()); > > Attribute attribute; >- setCommonVariableProperties(type, variable.getName(), &attribute); >+ setCommonVariableProperties(type, variable.variable(), &attribute); > > attribute.location = type.getLayoutQualifier().location; > return attribute; >@@ -608,9 +649,10 @@ OutputVariable CollectVariablesTraverser::recordOutputVariable(const TIntermSymb > ASSERT(!type.getStruct()); > > OutputVariable outputVariable; >- setCommonVariableProperties(type, variable.getName(), &outputVariable); >+ setCommonVariableProperties(type, variable.variable(), &outputVariable); > > outputVariable.location = type.getLayoutQualifier().location; >+ outputVariable.index = type.getLayoutQualifier().index; > return outputVariable; > } > >@@ -619,7 +661,7 @@ Varying CollectVariablesTraverser::recordVarying(const TIntermSymbol &variable) > const TType &type = variable.getType(); > > Varying varying; >- setCommonVariableProperties(type, variable.getName(), &varying); >+ setCommonVariableProperties(type, variable.variable(), &varying); > varying.location = type.getLayoutQualifier().location; > > switch (type.getQualifier()) >@@ -631,8 +673,7 @@ Varying CollectVariablesTraverser::recordVarying(const TIntermSymbol &variable) > case EvqFlatOut: > case EvqCentroidOut: > case EvqGeometryOut: >- if (mSymbolTable->isVaryingInvariant(std::string(variable.getSymbol().c_str())) || >- type.isInvariant()) >+ if (mSymbolTable->isVaryingInvariant(variable.variable()) || type.isInvariant()) > { > varying.isInvariant = true; > } >@@ -645,8 +686,9 @@ Varying CollectVariablesTraverser::recordVarying(const TIntermSymbol &variable) > return varying; > } > >-// TODO(jiawei.shao@intel.com): implement GL_OES_shader_io_blocks. >-void CollectVariablesTraverser::recordInterfaceBlock(const TType &interfaceBlockType, >+// TODO(jiawei.shao@intel.com): implement GL_EXT_shader_io_blocks. >+void CollectVariablesTraverser::recordInterfaceBlock(const char *instanceName, >+ const TType &interfaceBlockType, > InterfaceBlock *interfaceBlock) const > { > ASSERT(interfaceBlockType.getBasicType() == EbtInterfaceBlock); >@@ -655,42 +697,82 @@ void CollectVariablesTraverser::recordInterfaceBlock(const TType &interfaceBlock > const TInterfaceBlock *blockType = interfaceBlockType.getInterfaceBlock(); > ASSERT(blockType); > >- interfaceBlock->name = blockType->name().c_str(); >- interfaceBlock->mappedName = getMappedName(TName(blockType->name())); >- interfaceBlock->instanceName = >- (blockType->hasInstanceName() ? blockType->instanceName().c_str() : ""); >+ interfaceBlock->name = blockType->name().data(); >+ interfaceBlock->mappedName = getMappedName(blockType); >+ if (instanceName != nullptr) >+ { >+ interfaceBlock->instanceName = instanceName; >+ const TSymbol *blockSymbol = nullptr; >+ if (strncmp(instanceName, "gl_in", 5u) == 0) >+ { >+ blockSymbol = mSymbolTable->getGlInVariableWithArraySize(); >+ } >+ else >+ { >+ blockSymbol = mSymbolTable->findGlobal(ImmutableString(instanceName)); >+ } >+ ASSERT(blockSymbol && blockSymbol->isVariable()); >+ interfaceBlock->staticUse = >+ mSymbolTable->isStaticallyUsed(*static_cast<const TVariable *>(blockSymbol)); >+ } > ASSERT(!interfaceBlockType.isArrayOfArrays()); // Disallowed by GLSL ES 3.10 section 4.3.9 >- interfaceBlock->arraySize = interfaceBlockType.isArray() ? interfaceBlockType.getOutermostArraySize() : 0; >+ interfaceBlock->arraySize = >+ interfaceBlockType.isArray() ? interfaceBlockType.getOutermostArraySize() : 0; > > interfaceBlock->blockType = GetBlockType(interfaceBlockType.getQualifier()); > if (interfaceBlock->blockType == BlockType::BLOCK_UNIFORM || > interfaceBlock->blockType == BlockType::BLOCK_BUFFER) > { >- interfaceBlock->isRowMajorLayout = (blockType->matrixPacking() == EmpRowMajor); >+ // TODO(oetuaho): Remove setting isRowMajorLayout. >+ interfaceBlock->isRowMajorLayout = false; > interfaceBlock->binding = blockType->blockBinding(); > interfaceBlock->layout = GetBlockLayoutType(blockType->blockStorage()); > } > > // Gather field information >+ bool anyFieldStaticallyUsed = false; > for (const TField *field : blockType->fields()) > { > const TType &fieldType = *field->type(); > >+ bool staticUse = false; >+ if (instanceName == nullptr) >+ { >+ // Static use of individual fields has been recorded, since they are present in the >+ // symbol table as variables. >+ const TSymbol *fieldSymbol = mSymbolTable->findGlobal(field->name()); >+ ASSERT(fieldSymbol && fieldSymbol->isVariable()); >+ staticUse = >+ mSymbolTable->isStaticallyUsed(*static_cast<const TVariable *>(fieldSymbol)); >+ if (staticUse) >+ { >+ anyFieldStaticallyUsed = true; >+ } >+ } >+ > InterfaceBlockField fieldVariable; >- setCommonVariableProperties(fieldType, TName(field->name()), &fieldVariable); >+ setFieldProperties(fieldType, field->name(), staticUse, &fieldVariable); > fieldVariable.isRowMajorLayout = > (fieldType.getLayoutQualifier().matrixPacking == EmpRowMajor); > interfaceBlock->fields.push_back(fieldVariable); > } >+ if (anyFieldStaticallyUsed) >+ { >+ interfaceBlock->staticUse = true; >+ } > } > > Uniform CollectVariablesTraverser::recordUniform(const TIntermSymbol &variable) const > { > Uniform uniform; >- setCommonVariableProperties(variable.getType(), variable.getName(), &uniform); >- uniform.binding = variable.getType().getLayoutQualifier().binding; >- uniform.location = variable.getType().getLayoutQualifier().location; >- uniform.offset = variable.getType().getLayoutQualifier().offset; >+ setCommonVariableProperties(variable.getType(), variable.variable(), &uniform); >+ uniform.binding = variable.getType().getLayoutQualifier().binding; >+ uniform.imageUnitFormat = >+ GetImageInternalFormatType(variable.getType().getLayoutQualifier().imageInternalFormat); >+ uniform.location = variable.getType().getLayoutQualifier().location; >+ uniform.offset = variable.getType().getLayoutQualifier().offset; >+ uniform.readonly = variable.getType().getMemoryQualifier().readonly; >+ uniform.writeonly = variable.getType().getMemoryQualifier().writeonly; > return uniform; > } > >@@ -718,17 +800,20 @@ bool CollectVariablesTraverser::visitDeclaration(Visit, TIntermDeclaration *node > // uniforms, varyings, outputs and interface blocks cannot be initialized in a shader, we > // must have only TIntermSymbol nodes in the sequence in the cases we are interested in. > const TIntermSymbol &variable = *variableNode->getAsSymbolNode(); >- if (variable.getName().isInternal()) >+ if (variable.variable().symbolType() == SymbolType::AngleInternal) > { > // Internal variables are not collected. > continue; > } > >- // TODO(jiawei.shao@intel.com): implement GL_OES_shader_io_blocks. >+ // TODO(jiawei.shao@intel.com): implement GL_EXT_shader_io_blocks. > if (typedNode.getBasicType() == EbtInterfaceBlock) > { > InterfaceBlock interfaceBlock; >- recordInterfaceBlock(variable.getType(), &interfaceBlock); >+ recordInterfaceBlock(variable.variable().symbolType() != SymbolType::Empty >+ ? variable.getName().data() >+ : nullptr, >+ variable.getType(), &interfaceBlock); > > switch (qualifier) > { >@@ -744,6 +829,7 @@ bool CollectVariablesTraverser::visitDeclaration(Visit, TIntermDeclaration *node > } > else > { >+ ASSERT(variable.variable().symbolType() != SymbolType::Empty); > switch (qualifier) > { > case EvqAttribute: >@@ -777,8 +863,9 @@ bool CollectVariablesTraverser::visitDeclaration(Visit, TIntermDeclaration *node > } > > // TODO(jiawei.shao@intel.com): add search on mInBlocks and mOutBlocks when implementing >-// GL_OES_shader_io_blocks. >-InterfaceBlock *CollectVariablesTraverser::findNamedInterfaceBlock(const TString &blockName) const >+// GL_EXT_shader_io_blocks. >+InterfaceBlock *CollectVariablesTraverser::findNamedInterfaceBlock( >+ const ImmutableString &blockName) const > { > InterfaceBlock *namedBlock = FindVariable(blockName, mUniformBlocks); > if (!namedBlock) >@@ -792,7 +879,7 @@ bool CollectVariablesTraverser::visitBinary(Visit, TIntermBinary *binaryNode) > { > if (binaryNode->getOp() == EOpIndexDirectInterfaceBlock) > { >- // NOTE: we do not determine static use for individual blocks of an array >+ // NOTE: we do not determine static use / activeness for individual blocks of an array. > TIntermTyped *blockNode = binaryNode->getLeft()->getAsTyped(); > ASSERT(blockNode); > >@@ -826,10 +913,15 @@ bool CollectVariablesTraverser::visitBinary(Visit, TIntermBinary *binaryNode) > namedBlock = findNamedInterfaceBlock(interfaceBlock->name()); > } > ASSERT(namedBlock); >- namedBlock->staticUse = true; >+ ASSERT(namedBlock->staticUse); >+ namedBlock->active = true; > unsigned int fieldIndex = static_cast<unsigned int>(constantUnion->getIConst(0)); > ASSERT(fieldIndex < namedBlock->fields.size()); >+ // TODO(oetuaho): Would be nicer to record static use of fields of named interface blocks >+ // more accurately at parse time - now we only mark the fields statically used if they are >+ // active. http://anglebug.com/2440 > namedBlock->fields[fieldIndex].staticUse = true; >+ namedBlock->fields[fieldIndex].active = true; > > if (traverseIndexExpression) > { >@@ -855,14 +947,12 @@ void CollectVariables(TIntermBlock *root, > std::vector<InterfaceBlock> *inBlocks, > ShHashFunction64 hashFunction, > TSymbolTable *symbolTable, >- int shaderVersion, > GLenum shaderType, > const TExtensionBehavior &extensionBehavior) > { > CollectVariablesTraverser collect(attributes, outputVariables, uniforms, inputVaryings, > outputVaryings, uniformBlocks, shaderStorageBlocks, inBlocks, >- hashFunction, symbolTable, shaderVersion, shaderType, >- extensionBehavior); >+ hashFunction, symbolTable, shaderType, extensionBehavior); > root->traverse(&collect); > } > >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/CollectVariables.h b/Source/ThirdParty/ANGLE/src/compiler/translator/CollectVariables.h >index 4d0d1192e0d..84494a1433c 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/CollectVariables.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/CollectVariables.h >@@ -29,9 +29,8 @@ void CollectVariables(TIntermBlock *root, > std::vector<InterfaceBlock> *inBlocks, > ShHashFunction64 hashFunction, > TSymbolTable *symbolTable, >- int shaderVersion, > GLenum shaderType, > const TExtensionBehavior &extensionBehavior); >-} >+} // namespace sh > > #endif // COMPILER_TRANSLATOR_COLLECTVARIABLES_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Common.h b/Source/ThirdParty/ANGLE/src/compiler/translator/Common.h >index cb3a680d85a..179cfe21ee5 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Common.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Common.h >@@ -7,13 +7,13 @@ > #ifndef COMPILER_TRANSLATOR_COMMON_H_ > #define COMPILER_TRANSLATOR_COMMON_H_ > >+#include <stdio.h> >+#include <limits> > #include <map> > #include <sstream> > #include <string> > #include <unordered_map> > #include <vector> >-#include <limits> >-#include <stdio.h> > > #include "common/angleutils.h" > #include "common/debug.h" >@@ -34,7 +34,7 @@ struct TSourceLoc > // > // Put POOL_ALLOCATOR_NEW_DELETE in base classes to make them use this scheme. > // >-#define POOL_ALLOCATOR_NEW_DELETE() \ >+#define POOL_ALLOCATOR_NEW_DELETE \ > void *operator new(size_t s) { return GetGlobalPoolAllocator()->allocate(s); } \ > void *operator new(size_t, void *_Where) { return (_Where); } \ > void operator delete(void *) {} \ >@@ -50,11 +50,6 @@ struct TSourceLoc > typedef pool_allocator<char> TStringAllocator; > typedef std::basic_string<char, std::char_traits<char>, TStringAllocator> TString; > typedef std::basic_ostringstream<char, std::char_traits<char>, TStringAllocator> TStringStream; >-inline TString *NewPoolTString(const char *s) >-{ >- void *memory = GetGlobalPoolAllocator()->allocate(sizeof(TString)); >- return new (memory) TString(s); >-} > > // > // Persistent string memory. Should only be used for strings that survive >@@ -70,7 +65,7 @@ template <class T> > class TVector : public std::vector<T, pool_allocator<T>> > { > public: >- POOL_ALLOCATOR_NEW_DELETE(); >+ POOL_ALLOCATOR_NEW_DELETE > > typedef typename std::vector<T, pool_allocator<T>>::size_type size_type; > TVector() : std::vector<T, pool_allocator<T>>() {} >@@ -82,7 +77,7 @@ template <class K, class D, class H = std::hash<K>, class CMP = std::equal_to<K> > class TUnorderedMap : public std::unordered_map<K, D, H, CMP, pool_allocator<std::pair<const K, D>>> > { > public: >- POOL_ALLOCATOR_NEW_DELETE(); >+ POOL_ALLOCATOR_NEW_DELETE > typedef pool_allocator<std::pair<const K, D>> tAllocator; > > TUnorderedMap() : std::unordered_map<K, D, H, CMP, tAllocator>() {} >@@ -91,23 +86,21 @@ class TUnorderedMap : public std::unordered_map<K, D, H, CMP, pool_allocator<std > : std::unordered_map<K, D, H, CMP, tAllocator>( > std::unordered_map<K, D, H, CMP, tAllocator>::key_compare(), > a) >- { >- } >+ {} > }; > > template <class K, class D, class CMP = std::less<K>> > class TMap : public std::map<K, D, CMP, pool_allocator<std::pair<const K, D>>> > { > public: >- POOL_ALLOCATOR_NEW_DELETE(); >+ POOL_ALLOCATOR_NEW_DELETE > typedef pool_allocator<std::pair<const K, D>> tAllocator; > > TMap() : std::map<K, D, CMP, tAllocator>() {} > // use correct two-stage name lookup supported in gcc 3.4 and above > TMap(const tAllocator &a) > : std::map<K, D, CMP, tAllocator>(std::map<K, D, CMP, tAllocator>::key_compare(), a) >- { >- } >+ {} > }; > > // Integer to TString conversion >@@ -121,6 +114,26 @@ inline TString str(T i) > return buffer; > } > >+// Allocate a char array in the global memory pool. str must be a null terminated string. strLength >+// is the length without the null terminator. >+inline const char *AllocatePoolCharArray(const char *str, size_t strLength) >+{ >+ size_t requiredSize = strLength + 1; >+ char *buffer = static_cast<char *>(GetGlobalPoolAllocator()->allocate(requiredSize)); >+ memcpy(buffer, str, requiredSize); >+ ASSERT(buffer[strLength] == '\0'); >+ return buffer; >+} >+ >+// Initialize a new stream which must be imbued with the classic locale >+template <typename T> >+T InitializeStream() >+{ >+ T stream; >+ stream.imbue(std::locale::classic()); >+ return stream; >+} >+ > } // namespace sh > > namespace std >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.cpp >index 594147d8695..a31eda779b1 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.cpp >@@ -10,42 +10,45 @@ > > #include "angle_gl.h" > #include "common/utilities.h" >-#include "compiler/translator/AddAndTrueToLoopCondition.h" >-#include "compiler/translator/Cache.h" > #include "compiler/translator/CallDAG.h" >-#include "compiler/translator/ClampPointSize.h" > #include "compiler/translator/CollectVariables.h" >-#include "compiler/translator/DeclareAndInitBuiltinsForInstancedMultiview.h" >-#include "compiler/translator/DeferGlobalInitializers.h" >-#include "compiler/translator/EmulateGLFragColorBroadcast.h" >-#include "compiler/translator/EmulatePrecision.h" > #include "compiler/translator/Initialize.h" >-#include "compiler/translator/InitializeVariables.h" >-#include "compiler/translator/IntermNodePatternMatcher.h" > #include "compiler/translator/IsASTDepthBelowLimit.h" > #include "compiler/translator/OutputTree.h" > #include "compiler/translator/ParseContext.h" >-#include "compiler/translator/PruneNoOps.h" >-#include "compiler/translator/RegenerateStructNames.h" >-#include "compiler/translator/RemoveArrayLengthMethod.h" >-#include "compiler/translator/RemoveEmptySwitchStatements.h" >-#include "compiler/translator/RemoveInvariantDeclaration.h" >-#include "compiler/translator/RemoveNoOpCasesFromEndOfSwitchStatements.h" >-#include "compiler/translator/RemovePow.h" >-#include "compiler/translator/RemoveUnreferencedVariables.h" >-#include "compiler/translator/RewriteDoWhile.h" >-#include "compiler/translator/ScalarizeVecAndMatConstructorArgs.h" >-#include "compiler/translator/SeparateDeclarations.h" >-#include "compiler/translator/SimplifyLoopConditions.h" >-#include "compiler/translator/SplitSequenceOperator.h" >-#include "compiler/translator/UnfoldShortCircuitAST.h" >-#include "compiler/translator/UseInterfaceBlockFields.h" > #include "compiler/translator/ValidateLimitations.h" > #include "compiler/translator/ValidateMaxParameters.h" > #include "compiler/translator/ValidateOutputs.h" > #include "compiler/translator/ValidateVaryingLocations.h" > #include "compiler/translator/VariablePacker.h" >-#include "compiler/translator/VectorizeVectorScalarArithmetic.h" >+#include "compiler/translator/tree_ops/AddAndTrueToLoopCondition.h" >+#include "compiler/translator/tree_ops/ClampFragDepth.h" >+#include "compiler/translator/tree_ops/ClampPointSize.h" >+#include "compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.h" >+#include "compiler/translator/tree_ops/DeferGlobalInitializers.h" >+#include "compiler/translator/tree_ops/EmulateGLDrawID.h" >+#include "compiler/translator/tree_ops/EmulateGLFragColorBroadcast.h" >+#include "compiler/translator/tree_ops/EmulatePrecision.h" >+#include "compiler/translator/tree_ops/FoldExpressions.h" >+#include "compiler/translator/tree_ops/InitializeVariables.h" >+#include "compiler/translator/tree_ops/PruneEmptyCases.h" >+#include "compiler/translator/tree_ops/PruneNoOps.h" >+#include "compiler/translator/tree_ops/RegenerateStructNames.h" >+#include "compiler/translator/tree_ops/RemoveArrayLengthMethod.h" >+#include "compiler/translator/tree_ops/RemoveInvariantDeclaration.h" >+#include "compiler/translator/tree_ops/RemovePow.h" >+#include "compiler/translator/tree_ops/RemoveUnreferencedVariables.h" >+#include "compiler/translator/tree_ops/RewriteDoWhile.h" >+#include "compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.h" >+#include "compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.h" >+#include "compiler/translator/tree_ops/SeparateDeclarations.h" >+#include "compiler/translator/tree_ops/SimplifyLoopConditions.h" >+#include "compiler/translator/tree_ops/SplitSequenceOperator.h" >+#include "compiler/translator/tree_ops/UnfoldShortCircuitAST.h" >+#include "compiler/translator/tree_ops/UseInterfaceBlockFields.h" >+#include "compiler/translator/tree_ops/VectorizeVectorScalarArithmetic.h" >+#include "compiler/translator/tree_util/BuiltIn_autogen.h" >+#include "compiler/translator/tree_util/IntermNodePatternMatcher.h" > #include "compiler/translator/util.h" > #include "third_party/compiler/ArrayBoundsClamper.h" > >@@ -65,7 +68,7 @@ void DumpFuzzerCase(char const *const *shaderStrings, > { > static int fileIndex = 0; > >- std::ostringstream o; >+ std::ostringstream o = sh::InitializeStream<std::ostringstream>(); > o << "corpus/" << fileIndex++ << ".sample"; > std::string s = o.str(); > >@@ -90,11 +93,6 @@ void DumpFuzzerCase(char const *const *shaderStrings, > #endif // defined(ANGLE_ENABLE_FUZZER_CORPUS_OUTPUT) > } // anonymous namespace > >-bool IsWebGLBasedSpec(ShShaderSpec spec) >-{ >- return (spec == SH_WEBGL_SPEC || spec == SH_WEBGL2_SPEC || spec == SH_WEBGL3_SPEC); >-} >- > bool IsGLSL130OrNewer(ShShaderOutput output) > { > return (output == SH_GLSL_130_OUTPUT || output == SH_GLSL_140_OUTPUT || >@@ -158,7 +156,7 @@ int GetMaxUniformVectorsForShaderType(GLenum shaderType, const ShBuiltInResource > // TODO (jiawei.shao@intel.com): check if we need finer-grained component counting > case GL_COMPUTE_SHADER: > return resources.MaxComputeUniformComponents / 4; >- case GL_GEOMETRY_SHADER_OES: >+ case GL_GEOMETRY_SHADER_EXT: > return resources.MaxGeometryUniformComponents / 4; > default: > UNREACHABLE(); >@@ -172,7 +170,7 @@ namespace > class TScopedPoolAllocator > { > public: >- TScopedPoolAllocator(TPoolAllocator *allocator) : mAllocator(allocator) >+ TScopedPoolAllocator(angle::PoolAllocator *allocator) : mAllocator(allocator) > { > mAllocator->push(); > SetGlobalPoolAllocator(mAllocator); >@@ -184,7 +182,7 @@ class TScopedPoolAllocator > } > > private: >- TPoolAllocator *mAllocator; >+ angle::PoolAllocator *mAllocator; > }; > > class TScopedSymbolTableLevel >@@ -192,12 +190,12 @@ class TScopedSymbolTableLevel > public: > TScopedSymbolTableLevel(TSymbolTable *table) : mTable(table) > { >- ASSERT(mTable->atBuiltInLevel()); >+ ASSERT(mTable->isEmpty()); > mTable->push(); > } > ~TScopedSymbolTableLevel() > { >- while (!mTable->atBuiltInLevel()) >+ while (!mTable->isEmpty()) > mTable->pop(); > } > >@@ -224,6 +222,51 @@ int MapSpecToShaderVersion(ShShaderSpec spec) > } > } > >+bool ValidateFragColorAndFragData(GLenum shaderType, >+ int shaderVersion, >+ const TSymbolTable &symbolTable, >+ TDiagnostics *diagnostics) >+{ >+ if (shaderVersion > 100 || shaderType != GL_FRAGMENT_SHADER) >+ { >+ return true; >+ } >+ >+ bool usesFragColor = false; >+ bool usesFragData = false; >+ // This validation is a bit stricter than the spec - it's only an error to write to >+ // both FragData and FragColor. But because it's better not to have reads from undefined >+ // variables, we always return an error if they are both referenced, rather than only if they >+ // are written. >+ if (symbolTable.isStaticallyUsed(*BuiltInVariable::gl_FragColor()) || >+ symbolTable.isStaticallyUsed(*BuiltInVariable::gl_SecondaryFragColorEXT())) >+ { >+ usesFragColor = true; >+ } >+ // Extension variables may not always be initialized (saves some time at symbol table init). >+ bool secondaryFragDataUsed = >+ symbolTable.gl_SecondaryFragDataEXT() != nullptr && >+ symbolTable.isStaticallyUsed(*symbolTable.gl_SecondaryFragDataEXT()); >+ if (symbolTable.isStaticallyUsed(*symbolTable.gl_FragData()) || secondaryFragDataUsed) >+ { >+ usesFragData = true; >+ } >+ if (usesFragColor && usesFragData) >+ { >+ const char *errorMessage = "cannot use both gl_FragData and gl_FragColor"; >+ if (symbolTable.isStaticallyUsed(*BuiltInVariable::gl_SecondaryFragColorEXT()) || >+ secondaryFragDataUsed) >+ { >+ errorMessage = >+ "cannot use both output variable sets (gl_FragData, gl_SecondaryFragDataEXT)" >+ " and (gl_FragColor, gl_SecondaryFragColorEXT)"; >+ } >+ diagnostics->globalError(errorMessage); >+ return false; >+ } >+ return true; >+} >+ > } // namespace > > TShHandleBase::TShHandleBase() >@@ -239,19 +282,13 @@ TShHandleBase::~TShHandleBase() > } > > TCompiler::TCompiler(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output) >- : variablesCollected(false), >+ : mVariablesCollected(false), > mGLPositionInitialized(false), >- shaderType(type), >- shaderSpec(spec), >- outputType(output), >- maxUniformVectors(0), >- maxExpressionComplexity(0), >- maxCallStackDepth(0), >- maxFunctionParameters(0), >- fragmentPrecisionHigh(false), >- clampingStrategy(SH_CLAMP_WITH_CLAMP_INTRINSIC), >- builtInFunctionEmulator(), >- mDiagnostics(infoSink.info), >+ mShaderType(type), >+ mShaderSpec(spec), >+ mOutputType(output), >+ mBuiltInFunctionEmulator(), >+ mDiagnostics(mInfoSink.info), > mSourcePath(nullptr), > mComputeShaderLocalSizeDeclared(false), > mComputeShaderLocalSize(1), >@@ -259,45 +296,32 @@ TCompiler::TCompiler(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output) > mGeometryShaderInvocations(0), > mGeometryShaderInputPrimitiveType(EptUndefined), > mGeometryShaderOutputPrimitiveType(EptUndefined) >-{ >-} >+{} > >-TCompiler::~TCompiler() >-{ >-} >+TCompiler::~TCompiler() {} > > bool TCompiler::shouldRunLoopAndIndexingValidation(ShCompileOptions compileOptions) const > { > // If compiling an ESSL 1.00 shader for WebGL, or if its been requested through the API, > // validate loop and indexing as well (to verify that the shader only uses minimal functionality > // of ESSL 1.00 as in Appendix A of the spec). >- return (IsWebGLBasedSpec(shaderSpec) && shaderVersion == 100) || >+ return (IsWebGLBasedSpec(mShaderSpec) && mShaderVersion == 100) || > (compileOptions & SH_VALIDATE_LOOP_INDEXING); > } > > bool TCompiler::Init(const ShBuiltInResources &resources) > { >- shaderVersion = 100; >- >- maxUniformVectors = GetMaxUniformVectorsForShaderType(shaderType, resources); >- >- maxExpressionComplexity = resources.MaxExpressionComplexity; >- maxCallStackDepth = resources.MaxCallStackDepth; >- maxFunctionParameters = resources.MaxFunctionParameters; >- > SetGlobalPoolAllocator(&allocator); > > // Generate built-in symbol table. >- if (!InitBuiltInSymbolTable(resources)) >+ if (!initBuiltInSymbolTable(resources)) > return false; >- InitExtensionBehavior(resources, extensionBehavior); >- fragmentPrecisionHigh = resources.FragmentPrecisionHigh == 1; > >- arrayBoundsClamper.SetClampingStrategy(resources.ArrayIndexClampingStrategy); >- clampingStrategy = resources.ArrayIndexClampingStrategy; >- >- hashFunction = resources.HashFunction; >+ mResources = resources; >+ setResourceString(); > >+ InitExtensionBehavior(resources, mExtensionBehavior); >+ mArrayBoundsClamper.SetClampingStrategy(resources.ArrayIndexClampingStrategy); > return true; > } > >@@ -318,7 +342,19 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[], > ASSERT(GetGlobalPoolAllocator()); > > // Reset the extension behavior for each compilation unit. >- ResetExtensionBehavior(extensionBehavior); >+ ResetExtensionBehavior(mExtensionBehavior); >+ >+ // If gl_DrawID is not supported, remove it from the available extensions >+ // Currently we only allow emulation of gl_DrawID >+ const bool glDrawIDSupported = (compileOptions & SH_EMULATE_GL_DRAW_ID) != 0u; >+ if (!glDrawIDSupported) >+ { >+ auto it = mExtensionBehavior.find(TExtension::ANGLE_multi_draw); >+ if (it != mExtensionBehavior.end()) >+ { >+ mExtensionBehavior.erase(it); >+ } >+ } > > // First string is path of source file if flag is set. The actual source follows. > size_t firstSource = 0; >@@ -328,14 +364,15 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[], > ++firstSource; > } > >- TParseContext parseContext(symbolTable, extensionBehavior, shaderType, shaderSpec, >+ TParseContext parseContext(mSymbolTable, mExtensionBehavior, mShaderType, mShaderSpec, > compileOptions, true, &mDiagnostics, getResources()); > >- parseContext.setFragmentPrecisionHighOnESSL1(fragmentPrecisionHigh); >+ parseContext.setFragmentPrecisionHighOnESSL1(mResources.FragmentPrecisionHigh == 1); > > // We preserve symbols at the built-in level from compile-to-compile. > // Start pushing the user-defined symbols at global level. >- TScopedSymbolTableLevel scopedSymbolLevel(&symbolTable); >+ TScopedSymbolTableLevel globalLevel(&mSymbolTable); >+ ASSERT(mSymbolTable.atGlobalLevel()); > > // Parse shader. > if (PaParseStrings(numStrings - firstSource, &shaderStrings[firstSource], nullptr, >@@ -351,9 +388,8 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[], > > setASTMetadata(parseContext); > >- if (MapSpecToShaderVersion(shaderSpec) < shaderVersion) >+ if (!checkShaderVersion(&parseContext)) > { >- mDiagnostics.globalError("unsupported shader version"); > return nullptr; > } > >@@ -366,22 +402,63 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[], > return root; > } > >+bool TCompiler::checkShaderVersion(TParseContext *parseContext) >+{ >+ if (MapSpecToShaderVersion(mShaderSpec) < mShaderVersion) >+ { >+ mDiagnostics.globalError("unsupported shader version"); >+ return false; >+ } >+ >+ ASSERT(parseContext); >+ switch (mShaderType) >+ { >+ case GL_COMPUTE_SHADER: >+ if (mShaderVersion < 310) >+ { >+ mDiagnostics.globalError("Compute shader is not supported in this shader version."); >+ return false; >+ } >+ break; >+ >+ case GL_GEOMETRY_SHADER_EXT: >+ if (mShaderVersion < 310) >+ { >+ mDiagnostics.globalError( >+ "Geometry shader is not supported in this shader version."); >+ return false; >+ } >+ else >+ { >+ ASSERT(mShaderVersion == 310); >+ if (!parseContext->checkCanUseExtension(sh::TSourceLoc(), >+ TExtension::EXT_geometry_shader)) >+ { >+ return false; >+ } >+ } >+ break; >+ >+ default: >+ break; >+ } >+ >+ return true; >+} >+ > void TCompiler::setASTMetadata(const TParseContext &parseContext) > { >- shaderVersion = parseContext.getShaderVersion(); >+ mShaderVersion = parseContext.getShaderVersion(); > > mPragma = parseContext.pragma(); >- symbolTable.setGlobalInvariant(mPragma.stdgl.invariantAll); >+ mSymbolTable.setGlobalInvariant(mPragma.stdgl.invariantAll); > > mComputeShaderLocalSizeDeclared = parseContext.isComputeShaderLocalSizeDeclared(); > mComputeShaderLocalSize = parseContext.getComputeShaderLocalSize(); > > mNumViews = parseContext.getNumViews(); > >- // Highp might have been auto-enabled based on shader version >- fragmentPrecisionHigh = parseContext.getFragmentPrecisionHigh(); >- >- if (shaderType == GL_GEOMETRY_SHADER_OES) >+ if (mShaderType == GL_GEOMETRY_SHADER_EXT) > { > mGeometryShaderInputPrimitiveType = parseContext.getGeometryShaderInputPrimitiveType(); > mGeometryShaderOutputPrimitiveType = parseContext.getGeometryShaderOutputPrimitiveType(); >@@ -400,6 +477,27 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root, > return false; > } > >+ if (shouldRunLoopAndIndexingValidation(compileOptions) && >+ !ValidateLimitations(root, mShaderType, &mSymbolTable, &mDiagnostics)) >+ { >+ return false; >+ } >+ >+ if (!ValidateFragColorAndFragData(mShaderType, mShaderVersion, mSymbolTable, &mDiagnostics)) >+ { >+ return false; >+ } >+ >+ // Fold expressions that could not be folded before validation that was done as a part of >+ // parsing. >+ FoldExpressions(root, &mDiagnostics); >+ // Folding should only be able to generate warnings. >+ ASSERT(mDiagnostics.numErrors() == 0); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } >+ > // We prune no-ops to work around driver bugs and to keep AST processing and output simple. > // The following kinds of no-ops are pruned: > // 1. Empty declarations "int;". >@@ -407,17 +505,11 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root, > // for float, so float literal statements would end up with no precision which is > // invalid ESSL. > // After this empty declarations are not allowed in the AST. >- PruneNoOps(root); >- >- // In case the last case inside a switch statement is a certain type of no-op, GLSL >- // compilers in drivers may not accept it. In this case we clean up the dead code from the >- // end of switch statements. This is also required because PruneNoOps may have left switch >- // statements that only contained an empty declaration inside the final case in an invalid >- // state. Relies on that PruneNoOps has already been run. >- RemoveNoOpCasesFromEndOfSwitchStatements(root, &symbolTable); >- >- // Remove empty switch statements - this makes output simpler. >- RemoveEmptySwitchStatements(root); >+ PruneNoOps(root, &mSymbolTable); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > > // Create the function DAG and check there is no recursion > if (!initCallDag(root)) >@@ -431,8 +523,8 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root, > } > > // Checks which functions are used and if "main" exists >- functionMetadata.clear(); >- functionMetadata.resize(mCallDag.size()); >+ mFunctionMetadata.clear(); >+ mFunctionMetadata.resize(mCallDag.size()); > if (!tagUsedFunctions()) > { > return false; >@@ -441,29 +533,26 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root, > if (!(compileOptions & SH_DONT_PRUNE_UNUSED_FUNCTIONS)) > { > pruneUnusedFunctions(root); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > } > >- if (shaderVersion >= 310 && !ValidateVaryingLocations(root, &mDiagnostics, shaderType)) >- { >- return false; >- } >- >- if (shaderVersion >= 300 && shaderType == GL_FRAGMENT_SHADER && >- !ValidateOutputs(root, getExtensionBehavior(), compileResources.MaxDrawBuffers, >- &mDiagnostics)) >+ if (mShaderVersion >= 310 && !ValidateVaryingLocations(root, &mDiagnostics, mShaderType)) > { > return false; > } > >- if (shouldRunLoopAndIndexingValidation(compileOptions) && >- !ValidateLimitations(root, shaderType, &symbolTable, shaderVersion, &mDiagnostics)) >+ if (mShaderVersion >= 300 && mShaderType == GL_FRAGMENT_SHADER && >+ !ValidateOutputs(root, getExtensionBehavior(), mResources.MaxDrawBuffers, &mDiagnostics)) > { > return false; > } > > // Fail compilation if precision emulation not supported. > if (getResources().WEBGL_debug_shader_precision && getPragma().debugShaderPrecision && >- !EmulatePrecision::SupportedInLanguage(outputType)) >+ !EmulatePrecision::SupportedInLanguage(mOutputType)) > { > mDiagnostics.globalError("Precision emulation not supported for this output type."); > return false; >@@ -472,124 +561,224 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root, > // Clamping uniform array bounds needs to happen after validateLimitations pass. > if (compileOptions & SH_CLAMP_INDIRECT_ARRAY_BOUNDS) > { >- arrayBoundsClamper.MarkIndirectArrayBoundsForClamping(root); >+ mArrayBoundsClamper.MarkIndirectArrayBoundsForClamping(root); > } > > if ((compileOptions & SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW) && >- parseContext.isExtensionEnabled(TExtension::OVR_multiview) && >+ parseContext.isExtensionEnabled(TExtension::OVR_multiview2) && > getShaderType() != GL_COMPUTE_SHADER) > { >- DeclareAndInitBuiltinsForInstancedMultiview(root, mNumViews, shaderType, compileOptions, >- outputType, &symbolTable); >+ DeclareAndInitBuiltinsForInstancedMultiview(root, mNumViews, mShaderType, compileOptions, >+ mOutputType, &mSymbolTable); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > } > > // This pass might emit short circuits so keep it before the short circuit unfolding > if (compileOptions & SH_REWRITE_DO_WHILE_LOOPS) >- RewriteDoWhile(root, &symbolTable); >+ { >+ RewriteDoWhile(root, &mSymbolTable); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } >+ } > > if (compileOptions & SH_ADD_AND_TRUE_TO_LOOP_CONDITION) >- sh::AddAndTrueToLoopCondition(root); >+ { >+ AddAndTrueToLoopCondition(root); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } >+ } > > if (compileOptions & SH_UNFOLD_SHORT_CIRCUIT) > { >- UnfoldShortCircuitAST unfoldShortCircuit; >- root->traverse(&unfoldShortCircuit); >- unfoldShortCircuit.updateTree(); >+ UnfoldShortCircuitAST(root); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > } > > if (compileOptions & SH_REMOVE_POW_WITH_CONSTANT_EXPONENT) > { >- RemovePow(root); >+ RemovePow(root, &mSymbolTable); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > } > > if (compileOptions & SH_REGENERATE_STRUCT_NAMES) > { >- RegenerateStructNames gen(&symbolTable, shaderVersion); >+ RegenerateStructNames gen(&mSymbolTable); > root->traverse(&gen); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > } > >- if (shaderType == GL_FRAGMENT_SHADER && shaderVersion == 100 && >- compileResources.EXT_draw_buffers && compileResources.MaxDrawBuffers > 1 && >- IsExtensionEnabled(extensionBehavior, TExtension::EXT_draw_buffers)) >+ if (mShaderType == GL_VERTEX_SHADER && >+ IsExtensionEnabled(mExtensionBehavior, TExtension::ANGLE_multi_draw)) > { >- EmulateGLFragColorBroadcast(root, compileResources.MaxDrawBuffers, &outputVariables, >- &symbolTable, shaderVersion); >+ if ((compileOptions & SH_EMULATE_GL_DRAW_ID) != 0) >+ { >+ EmulateGLDrawID(root, &mSymbolTable, &mUniforms, >+ shouldCollectVariables(compileOptions)); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } >+ } > } > >+ if (mShaderType == GL_FRAGMENT_SHADER && mShaderVersion == 100 && mResources.EXT_draw_buffers && >+ mResources.MaxDrawBuffers > 1 && >+ IsExtensionEnabled(mExtensionBehavior, TExtension::EXT_draw_buffers)) >+ { >+ EmulateGLFragColorBroadcast(root, mResources.MaxDrawBuffers, &mOutputVariables, >+ &mSymbolTable, mShaderVersion); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } >+ } >+ >+ int simplifyScalarized = (compileOptions & SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS) >+ ? IntermNodePatternMatcher::kScalarizedVecOrMatConstructor >+ : 0; >+ > // Split multi declarations and remove calls to array length(). > // Note that SimplifyLoopConditions needs to be run before any other AST transformations > // that may need to generate new statements from loop conditions or loop expressions. >- SimplifyLoopConditions( >- root, >- IntermNodePatternMatcher::kMultiDeclaration | IntermNodePatternMatcher::kArrayLengthMethod, >- &getSymbolTable(), getShaderVersion()); >+ SimplifyLoopConditions(root, >+ IntermNodePatternMatcher::kMultiDeclaration | >+ IntermNodePatternMatcher::kArrayLengthMethod | simplifyScalarized, >+ &getSymbolTable()); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > > // Note that separate declarations need to be run before other AST transformations that > // generate new statements from expressions. > SeparateDeclarations(root); >+ mValidateASTOptions.validateMultiDeclarations = true; >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > >- SplitSequenceOperator(root, IntermNodePatternMatcher::kArrayLengthMethod, &getSymbolTable(), >- getShaderVersion()); >+ SplitSequenceOperator(root, IntermNodePatternMatcher::kArrayLengthMethod | simplifyScalarized, >+ &getSymbolTable()); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > > RemoveArrayLengthMethod(root); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } >+ >+ RemoveUnreferencedVariables(root, &mSymbolTable); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > >- RemoveUnreferencedVariables(root, &symbolTable); >+ // In case the last case inside a switch statement is a certain type of no-op, GLSL compilers in >+ // drivers may not accept it. In this case we clean up the dead code from the end of switch >+ // statements. This is also required because PruneNoOps or RemoveUnreferencedVariables may have >+ // left switch statements that only contained an empty declaration inside the final case in an >+ // invalid state. Relies on that PruneNoOps and RemoveUnreferencedVariables have already been >+ // run. >+ PruneEmptyCases(root); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > > // Built-in function emulation needs to happen after validateLimitations pass. > // TODO(jmadill): Remove global pool allocator. > GetGlobalPoolAllocator()->lock(); >- initBuiltInFunctionEmulator(&builtInFunctionEmulator, compileOptions); >+ initBuiltInFunctionEmulator(&mBuiltInFunctionEmulator, compileOptions); > GetGlobalPoolAllocator()->unlock(); >- builtInFunctionEmulator.markBuiltInFunctionsForEmulation(root); >+ mBuiltInFunctionEmulator.markBuiltInFunctionsForEmulation(root); > >+ bool highPrecisionSupported = mShaderVersion > 100 || mShaderType != GL_FRAGMENT_SHADER || >+ mResources.FragmentPrecisionHigh == 1; > if (compileOptions & SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS) > { >- ScalarizeVecAndMatConstructorArgs(root, shaderType, fragmentPrecisionHigh, &symbolTable); >+ ScalarizeVecAndMatConstructorArgs(root, mShaderType, highPrecisionSupported, &mSymbolTable); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > } > > if (shouldCollectVariables(compileOptions)) > { >- ASSERT(!variablesCollected); >- CollectVariables(root, &attributes, &outputVariables, &uniforms, &inputVaryings, >- &outputVaryings, &uniformBlocks, &shaderStorageBlocks, &inBlocks, >- hashFunction, &symbolTable, shaderVersion, shaderType, extensionBehavior); >+ ASSERT(!mVariablesCollected); >+ CollectVariables(root, &mAttributes, &mOutputVariables, &mUniforms, &mInputVaryings, >+ &mOutputVaryings, &mUniformBlocks, &mShaderStorageBlocks, &mInBlocks, >+ mResources.HashFunction, &mSymbolTable, mShaderType, mExtensionBehavior); > collectInterfaceBlocks(); >- variablesCollected = true; >+ mVariablesCollected = true; > if (compileOptions & SH_USE_UNUSED_STANDARD_SHARED_BLOCKS) > { > useAllMembersInUnusedStandardAndSharedBlocks(root); > } > if (compileOptions & SH_ENFORCE_PACKING_RESTRICTIONS) > { >+ int maxUniformVectors = GetMaxUniformVectorsForShaderType(mShaderType, mResources); > // Returns true if, after applying the packing rules in the GLSL ES 1.00.17 spec > // Appendix A, section 7, the shader does not use too many uniforms. >- if (!CheckVariablesInPackingLimits(maxUniformVectors, uniforms)) >+ if (!CheckVariablesInPackingLimits(maxUniformVectors, mUniforms)) > { > mDiagnostics.globalError("too many uniforms"); > return false; > } > } >- if (compileOptions & SH_INIT_OUTPUT_VARIABLES) >+ if ((compileOptions & SH_INIT_OUTPUT_VARIABLES) && (mShaderType != GL_COMPUTE_SHADER)) > { > initializeOutputVariables(root); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > } > } > > // Removing invariant declarations must be done after collecting variables. > // Otherwise, built-in invariant declarations don't apply. >- if (RemoveInvariant(shaderType, shaderVersion, outputType, compileOptions)) >+ if (RemoveInvariant(mShaderType, mShaderVersion, mOutputType, compileOptions)) > { > RemoveInvariantDeclaration(root); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > } > > // gl_Position is always written in compatibility output mode. > // It may have been already initialized among other output variables, in that case we don't > // need to initialize it twice. >- if (shaderType == GL_VERTEX_SHADER && !mGLPositionInitialized && >- ((compileOptions & SH_INIT_GL_POSITION) || (outputType == SH_GLSL_COMPATIBILITY_OUTPUT))) >+ if (mShaderType == GL_VERTEX_SHADER && !mGLPositionInitialized && >+ ((compileOptions & SH_INIT_GL_POSITION) || (mOutputType == SH_GLSL_COMPATIBILITY_OUTPUT))) > { > initializeGLPosition(root); > mGLPositionInitialized = true; >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > } > > // DeferGlobalInitializers needs to be run before other AST transformations that generate new >@@ -599,7 +788,12 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root, > bool initializeLocalsAndGlobals = > (compileOptions & SH_INITIALIZE_UNINITIALIZED_LOCALS) && !IsOutputHLSL(getOutputType()); > bool canUseLoopsToInitialize = !(compileOptions & SH_DONT_USE_LOOPS_TO_INITIALIZE_VARIABLES); >- DeferGlobalInitializers(root, initializeLocalsAndGlobals, canUseLoopsToInitialize, &symbolTable); >+ DeferGlobalInitializers(root, initializeLocalsAndGlobals, canUseLoopsToInitialize, >+ highPrecisionSupported, &mSymbolTable); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > > if (initializeLocalsAndGlobals) > { >@@ -616,21 +810,55 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root, > SimplifyLoopConditions(root, > IntermNodePatternMatcher::kArrayDeclaration | > IntermNodePatternMatcher::kNamelessStructDeclaration, >- &getSymbolTable(), getShaderVersion()); >+ &getSymbolTable()); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > } > > InitializeUninitializedLocals(root, getShaderVersion(), canUseLoopsToInitialize, >- &getSymbolTable()); >+ highPrecisionSupported, &getSymbolTable()); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > } > > if (getShaderType() == GL_VERTEX_SHADER && (compileOptions & SH_CLAMP_POINT_SIZE)) > { >- ClampPointSize(root, compileResources.MaxPointSize, &getSymbolTable()); >+ ClampPointSize(root, mResources.MaxPointSize, &getSymbolTable()); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } >+ } >+ >+ if (getShaderType() == GL_FRAGMENT_SHADER && (compileOptions & SH_CLAMP_FRAG_DEPTH)) >+ { >+ ClampFragDepth(root, &getSymbolTable()); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } >+ } >+ >+ if (compileOptions & SH_REWRITE_REPEATED_ASSIGN_TO_SWIZZLED) >+ { >+ sh::RewriteRepeatedAssignToSwizzled(root); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > } > > if (compileOptions & SH_REWRITE_VECTOR_SCALAR_ARITHMETIC) > { > VectorizeVectorScalarArithmetic(root, &getSymbolTable()); >+ if (!ValidateAST(root, &mDiagnostics, mValidateASTOptions)) >+ { >+ return false; >+ } > } > > return true; >@@ -641,7 +869,8 @@ bool TCompiler::compile(const char *const shaderStrings[], > ShCompileOptions compileOptionsIn) > { > #if defined(ANGLE_ENABLE_FUZZER_CORPUS_OUTPUT) >- DumpFuzzerCase(shaderStrings, numStrings, shaderType, shaderSpec, outputType, compileOptionsIn); >+ DumpFuzzerCase(shaderStrings, numStrings, mShaderType, mShaderSpec, mOutputType, >+ compileOptionsIn); > #endif // defined(ANGLE_ENABLE_FUZZER_CORPUS_OUTPUT) > > if (numStrings == 0) >@@ -662,7 +891,7 @@ bool TCompiler::compile(const char *const shaderStrings[], > if (root) > { > if (compileOptions & SH_INTERMEDIATE_TREE) >- OutputTree(root, infoSink.info); >+ OutputTree(root, mInfoSink.info); > > if (compileOptions & SH_OBJECT_CODE) > { >@@ -670,6 +899,22 @@ bool TCompiler::compile(const char *const shaderStrings[], > translate(root, compileOptions, &perfDiagnostics); > } > >+ if (mShaderType == GL_VERTEX_SHADER && >+ IsExtensionEnabled(mExtensionBehavior, TExtension::ANGLE_multi_draw)) >+ { >+ if ((compileOptions & SH_EMULATE_GL_DRAW_ID) != 0) >+ { >+ for (auto &uniform : mUniforms) >+ { >+ if (uniform.name == "angle_DrawID" && uniform.mappedName == "angle_DrawID") >+ { >+ uniform.name = "gl_DrawID"; >+ break; >+ } >+ } >+ } >+ } >+ > // The IntermNode tree doesn't need to be deleted here, since the > // memory will be freed in a big chunk by the PoolAllocator. > return true; >@@ -677,7 +922,7 @@ bool TCompiler::compile(const char *const shaderStrings[], > return false; > } > >-bool TCompiler::InitBuiltInSymbolTable(const ShBuiltInResources &resources) >+bool TCompiler::initBuiltInSymbolTable(const ShBuiltInResources &resources) > { > if (resources.MaxDrawBuffers < 1) > { >@@ -688,168 +933,124 @@ bool TCompiler::InitBuiltInSymbolTable(const ShBuiltInResources &resources) > return false; > } > >- compileResources = resources; >- setResourceString(); >- >- ASSERT(symbolTable.isEmpty()); >- symbolTable.push(); // COMMON_BUILTINS >- symbolTable.push(); // ESSL1_BUILTINS >- symbolTable.push(); // ESSL3_BUILTINS >- symbolTable.push(); // ESSL3_1_BUILTINS >- symbolTable.push(); // GLSL_BUILTINS >- >- switch (shaderType) >- { >- case GL_FRAGMENT_SHADER: >- symbolTable.setDefaultPrecision(EbtInt, EbpMedium); >- break; >- case GL_VERTEX_SHADER: >- case GL_COMPUTE_SHADER: >- case GL_GEOMETRY_SHADER_OES: >- symbolTable.setDefaultPrecision(EbtInt, EbpHigh); >- symbolTable.setDefaultPrecision(EbtFloat, EbpHigh); >- break; >- default: >- UNREACHABLE(); >- } >- // Set defaults for sampler types that have default precision, even those that are >- // only available if an extension exists. >- // New sampler types in ESSL3 don't have default precision. ESSL1 types do. >- initSamplerDefaultPrecision(EbtSampler2D); >- initSamplerDefaultPrecision(EbtSamplerCube); >- // SamplerExternalOES is specified in the extension to have default precision. >- initSamplerDefaultPrecision(EbtSamplerExternalOES); >- // SamplerExternal2DY2YEXT is specified in the extension to have default precision. >- initSamplerDefaultPrecision(EbtSamplerExternal2DY2YEXT); >- // It isn't specified whether Sampler2DRect has default precision. >- initSamplerDefaultPrecision(EbtSampler2DRect); >- >- symbolTable.setDefaultPrecision(EbtAtomicCounter, EbpHigh); >- >- InsertBuiltInFunctions(shaderType, shaderSpec, resources, symbolTable); >- >- IdentifyBuiltIns(shaderType, shaderSpec, resources, symbolTable); >+ mSymbolTable.initializeBuiltIns(mShaderType, mShaderSpec, resources); > > return true; > } > >-void TCompiler::initSamplerDefaultPrecision(TBasicType samplerType) >-{ >- ASSERT(samplerType > EbtGuardSamplerBegin && samplerType < EbtGuardSamplerEnd); >- symbolTable.setDefaultPrecision(samplerType, EbpLow); >-} >- > void TCompiler::setResourceString() > { >- std::ostringstream strstream; >+ std::ostringstream strstream = sh::InitializeStream<std::ostringstream>(); > > // clang-format off >- strstream << ":MaxVertexAttribs:" << compileResources.MaxVertexAttribs >- << ":MaxVertexUniformVectors:" << compileResources.MaxVertexUniformVectors >- << ":MaxVaryingVectors:" << compileResources.MaxVaryingVectors >- << ":MaxVertexTextureImageUnits:" << compileResources.MaxVertexTextureImageUnits >- << ":MaxCombinedTextureImageUnits:" << compileResources.MaxCombinedTextureImageUnits >- << ":MaxTextureImageUnits:" << compileResources.MaxTextureImageUnits >- << ":MaxFragmentUniformVectors:" << compileResources.MaxFragmentUniformVectors >- << ":MaxDrawBuffers:" << compileResources.MaxDrawBuffers >- << ":OES_standard_derivatives:" << compileResources.OES_standard_derivatives >- << ":OES_EGL_image_external:" << compileResources.OES_EGL_image_external >- << ":OES_EGL_image_external_essl3:" << compileResources.OES_EGL_image_external_essl3 >- << ":NV_EGL_stream_consumer_external:" << compileResources.NV_EGL_stream_consumer_external >- << ":ARB_texture_rectangle:" << compileResources.ARB_texture_rectangle >- << ":EXT_draw_buffers:" << compileResources.EXT_draw_buffers >- << ":FragmentPrecisionHigh:" << compileResources.FragmentPrecisionHigh >- << ":MaxExpressionComplexity:" << compileResources.MaxExpressionComplexity >- << ":MaxCallStackDepth:" << compileResources.MaxCallStackDepth >- << ":MaxFunctionParameters:" << compileResources.MaxFunctionParameters >- << ":EXT_blend_func_extended:" << compileResources.EXT_blend_func_extended >- << ":EXT_frag_depth:" << compileResources.EXT_frag_depth >- << ":EXT_shader_texture_lod:" << compileResources.EXT_shader_texture_lod >- << ":EXT_shader_framebuffer_fetch:" << compileResources.EXT_shader_framebuffer_fetch >- << ":NV_shader_framebuffer_fetch:" << compileResources.NV_shader_framebuffer_fetch >- << ":ARM_shader_framebuffer_fetch:" << compileResources.ARM_shader_framebuffer_fetch >- << ":OVR_multiview:" << compileResources.OVR_multiview >- << ":EXT_YUV_target:" << compileResources.EXT_YUV_target >- << ":OES_geometry_shader:" << compileResources.OES_geometry_shader >- << ":MaxVertexOutputVectors:" << compileResources.MaxVertexOutputVectors >- << ":MaxFragmentInputVectors:" << compileResources.MaxFragmentInputVectors >- << ":MinProgramTexelOffset:" << compileResources.MinProgramTexelOffset >- << ":MaxProgramTexelOffset:" << compileResources.MaxProgramTexelOffset >- << ":MaxDualSourceDrawBuffers:" << compileResources.MaxDualSourceDrawBuffers >- << ":MaxViewsOVR:" << compileResources.MaxViewsOVR >- << ":NV_draw_buffers:" << compileResources.NV_draw_buffers >- << ":WEBGL_debug_shader_precision:" << compileResources.WEBGL_debug_shader_precision >- << ":MinProgramTextureGatherOffset:" << compileResources.MinProgramTextureGatherOffset >- << ":MaxProgramTextureGatherOffset:" << compileResources.MaxProgramTextureGatherOffset >- << ":MaxImageUnits:" << compileResources.MaxImageUnits >- << ":MaxVertexImageUniforms:" << compileResources.MaxVertexImageUniforms >- << ":MaxFragmentImageUniforms:" << compileResources.MaxFragmentImageUniforms >- << ":MaxComputeImageUniforms:" << compileResources.MaxComputeImageUniforms >- << ":MaxCombinedImageUniforms:" << compileResources.MaxCombinedImageUniforms >- << ":MaxCombinedShaderOutputResources:" << compileResources.MaxCombinedShaderOutputResources >- << ":MaxComputeWorkGroupCountX:" << compileResources.MaxComputeWorkGroupCount[0] >- << ":MaxComputeWorkGroupCountY:" << compileResources.MaxComputeWorkGroupCount[1] >- << ":MaxComputeWorkGroupCountZ:" << compileResources.MaxComputeWorkGroupCount[2] >- << ":MaxComputeWorkGroupSizeX:" << compileResources.MaxComputeWorkGroupSize[0] >- << ":MaxComputeWorkGroupSizeY:" << compileResources.MaxComputeWorkGroupSize[1] >- << ":MaxComputeWorkGroupSizeZ:" << compileResources.MaxComputeWorkGroupSize[2] >- << ":MaxComputeUniformComponents:" << compileResources.MaxComputeUniformComponents >- << ":MaxComputeTextureImageUnits:" << compileResources.MaxComputeTextureImageUnits >- << ":MaxComputeAtomicCounters:" << compileResources.MaxComputeAtomicCounters >- << ":MaxComputeAtomicCounterBuffers:" << compileResources.MaxComputeAtomicCounterBuffers >- << ":MaxVertexAtomicCounters:" << compileResources.MaxVertexAtomicCounters >- << ":MaxFragmentAtomicCounters:" << compileResources.MaxFragmentAtomicCounters >- << ":MaxCombinedAtomicCounters:" << compileResources.MaxCombinedAtomicCounters >- << ":MaxAtomicCounterBindings:" << compileResources.MaxAtomicCounterBindings >- << ":MaxVertexAtomicCounterBuffers:" << compileResources.MaxVertexAtomicCounterBuffers >- << ":MaxFragmentAtomicCounterBuffers:" << compileResources.MaxFragmentAtomicCounterBuffers >- << ":MaxCombinedAtomicCounterBuffers:" << compileResources.MaxCombinedAtomicCounterBuffers >- << ":MaxAtomicCounterBufferSize:" << compileResources.MaxAtomicCounterBufferSize >- << ":MaxGeometryUniformComponents:" << compileResources.MaxGeometryUniformComponents >- << ":MaxGeometryUniformBlocks:" << compileResources.MaxGeometryUniformBlocks >- << ":MaxGeometryInputComponents:" << compileResources.MaxGeometryInputComponents >- << ":MaxGeometryOutputComponents:" << compileResources.MaxGeometryOutputComponents >- << ":MaxGeometryOutputVertices:" << compileResources.MaxGeometryOutputVertices >- << ":MaxGeometryTotalOutputComponents:" << compileResources.MaxGeometryTotalOutputComponents >- << ":MaxGeometryTextureImageUnits:" << compileResources.MaxGeometryTextureImageUnits >- << ":MaxGeometryAtomicCounterBuffers:" << compileResources.MaxGeometryAtomicCounterBuffers >- << ":MaxGeometryAtomicCounters:" << compileResources.MaxGeometryAtomicCounters >- << ":MaxGeometryShaderStorageBlocks:" << compileResources.MaxGeometryShaderStorageBlocks >- << ":MaxGeometryShaderInvocations:" << compileResources.MaxGeometryShaderInvocations >- << ":MaxGeometryImageUniforms:" << compileResources.MaxGeometryImageUniforms; >+ strstream << ":MaxVertexAttribs:" << mResources.MaxVertexAttribs >+ << ":MaxVertexUniformVectors:" << mResources.MaxVertexUniformVectors >+ << ":MaxVaryingVectors:" << mResources.MaxVaryingVectors >+ << ":MaxVertexTextureImageUnits:" << mResources.MaxVertexTextureImageUnits >+ << ":MaxCombinedTextureImageUnits:" << mResources.MaxCombinedTextureImageUnits >+ << ":MaxTextureImageUnits:" << mResources.MaxTextureImageUnits >+ << ":MaxFragmentUniformVectors:" << mResources.MaxFragmentUniformVectors >+ << ":MaxDrawBuffers:" << mResources.MaxDrawBuffers >+ << ":OES_standard_derivatives:" << mResources.OES_standard_derivatives >+ << ":OES_EGL_image_external:" << mResources.OES_EGL_image_external >+ << ":OES_EGL_image_external_essl3:" << mResources.OES_EGL_image_external_essl3 >+ << ":NV_EGL_stream_consumer_external:" << mResources.NV_EGL_stream_consumer_external >+ << ":ARB_texture_rectangle:" << mResources.ARB_texture_rectangle >+ << ":EXT_draw_buffers:" << mResources.EXT_draw_buffers >+ << ":FragmentPrecisionHigh:" << mResources.FragmentPrecisionHigh >+ << ":MaxExpressionComplexity:" << mResources.MaxExpressionComplexity >+ << ":MaxCallStackDepth:" << mResources.MaxCallStackDepth >+ << ":MaxFunctionParameters:" << mResources.MaxFunctionParameters >+ << ":EXT_blend_func_extended:" << mResources.EXT_blend_func_extended >+ << ":EXT_frag_depth:" << mResources.EXT_frag_depth >+ << ":EXT_shader_texture_lod:" << mResources.EXT_shader_texture_lod >+ << ":EXT_shader_framebuffer_fetch:" << mResources.EXT_shader_framebuffer_fetch >+ << ":NV_shader_framebuffer_fetch:" << mResources.NV_shader_framebuffer_fetch >+ << ":ARM_shader_framebuffer_fetch:" << mResources.ARM_shader_framebuffer_fetch >+ << ":OVR_multiview2:" << mResources.OVR_multiview2 >+ << ":EXT_YUV_target:" << mResources.EXT_YUV_target >+ << ":EXT_geometry_shader:" << mResources.EXT_geometry_shader >+ << ":MaxVertexOutputVectors:" << mResources.MaxVertexOutputVectors >+ << ":MaxFragmentInputVectors:" << mResources.MaxFragmentInputVectors >+ << ":MinProgramTexelOffset:" << mResources.MinProgramTexelOffset >+ << ":MaxProgramTexelOffset:" << mResources.MaxProgramTexelOffset >+ << ":MaxDualSourceDrawBuffers:" << mResources.MaxDualSourceDrawBuffers >+ << ":MaxViewsOVR:" << mResources.MaxViewsOVR >+ << ":NV_draw_buffers:" << mResources.NV_draw_buffers >+ << ":WEBGL_debug_shader_precision:" << mResources.WEBGL_debug_shader_precision >+ << ":ANGLE_multi_draw:" << mResources.ANGLE_multi_draw >+ << ":MinProgramTextureGatherOffset:" << mResources.MinProgramTextureGatherOffset >+ << ":MaxProgramTextureGatherOffset:" << mResources.MaxProgramTextureGatherOffset >+ << ":MaxImageUnits:" << mResources.MaxImageUnits >+ << ":MaxVertexImageUniforms:" << mResources.MaxVertexImageUniforms >+ << ":MaxFragmentImageUniforms:" << mResources.MaxFragmentImageUniforms >+ << ":MaxComputeImageUniforms:" << mResources.MaxComputeImageUniforms >+ << ":MaxCombinedImageUniforms:" << mResources.MaxCombinedImageUniforms >+ << ":MaxCombinedShaderOutputResources:" << mResources.MaxCombinedShaderOutputResources >+ << ":MaxComputeWorkGroupCountX:" << mResources.MaxComputeWorkGroupCount[0] >+ << ":MaxComputeWorkGroupCountY:" << mResources.MaxComputeWorkGroupCount[1] >+ << ":MaxComputeWorkGroupCountZ:" << mResources.MaxComputeWorkGroupCount[2] >+ << ":MaxComputeWorkGroupSizeX:" << mResources.MaxComputeWorkGroupSize[0] >+ << ":MaxComputeWorkGroupSizeY:" << mResources.MaxComputeWorkGroupSize[1] >+ << ":MaxComputeWorkGroupSizeZ:" << mResources.MaxComputeWorkGroupSize[2] >+ << ":MaxComputeUniformComponents:" << mResources.MaxComputeUniformComponents >+ << ":MaxComputeTextureImageUnits:" << mResources.MaxComputeTextureImageUnits >+ << ":MaxComputeAtomicCounters:" << mResources.MaxComputeAtomicCounters >+ << ":MaxComputeAtomicCounterBuffers:" << mResources.MaxComputeAtomicCounterBuffers >+ << ":MaxVertexAtomicCounters:" << mResources.MaxVertexAtomicCounters >+ << ":MaxFragmentAtomicCounters:" << mResources.MaxFragmentAtomicCounters >+ << ":MaxCombinedAtomicCounters:" << mResources.MaxCombinedAtomicCounters >+ << ":MaxAtomicCounterBindings:" << mResources.MaxAtomicCounterBindings >+ << ":MaxVertexAtomicCounterBuffers:" << mResources.MaxVertexAtomicCounterBuffers >+ << ":MaxFragmentAtomicCounterBuffers:" << mResources.MaxFragmentAtomicCounterBuffers >+ << ":MaxCombinedAtomicCounterBuffers:" << mResources.MaxCombinedAtomicCounterBuffers >+ << ":MaxAtomicCounterBufferSize:" << mResources.MaxAtomicCounterBufferSize >+ << ":MaxGeometryUniformComponents:" << mResources.MaxGeometryUniformComponents >+ << ":MaxGeometryUniformBlocks:" << mResources.MaxGeometryUniformBlocks >+ << ":MaxGeometryInputComponents:" << mResources.MaxGeometryInputComponents >+ << ":MaxGeometryOutputComponents:" << mResources.MaxGeometryOutputComponents >+ << ":MaxGeometryOutputVertices:" << mResources.MaxGeometryOutputVertices >+ << ":MaxGeometryTotalOutputComponents:" << mResources.MaxGeometryTotalOutputComponents >+ << ":MaxGeometryTextureImageUnits:" << mResources.MaxGeometryTextureImageUnits >+ << ":MaxGeometryAtomicCounterBuffers:" << mResources.MaxGeometryAtomicCounterBuffers >+ << ":MaxGeometryAtomicCounters:" << mResources.MaxGeometryAtomicCounters >+ << ":MaxGeometryShaderStorageBlocks:" << mResources.MaxGeometryShaderStorageBlocks >+ << ":MaxGeometryShaderInvocations:" << mResources.MaxGeometryShaderInvocations >+ << ":MaxGeometryImageUniforms:" << mResources.MaxGeometryImageUniforms; > // clang-format on > >- builtInResourcesString = strstream.str(); >+ mBuiltInResourcesString = strstream.str(); > } > > void TCompiler::collectInterfaceBlocks() > { >- ASSERT(interfaceBlocks.empty()); >- interfaceBlocks.reserve(uniformBlocks.size() + shaderStorageBlocks.size() + inBlocks.size()); >- interfaceBlocks.insert(interfaceBlocks.end(), uniformBlocks.begin(), uniformBlocks.end()); >- interfaceBlocks.insert(interfaceBlocks.end(), shaderStorageBlocks.begin(), >- shaderStorageBlocks.end()); >- interfaceBlocks.insert(interfaceBlocks.end(), inBlocks.begin(), inBlocks.end()); >+ ASSERT(mInterfaceBlocks.empty()); >+ mInterfaceBlocks.reserve(mUniformBlocks.size() + mShaderStorageBlocks.size() + >+ mInBlocks.size()); >+ mInterfaceBlocks.insert(mInterfaceBlocks.end(), mUniformBlocks.begin(), mUniformBlocks.end()); >+ mInterfaceBlocks.insert(mInterfaceBlocks.end(), mShaderStorageBlocks.begin(), >+ mShaderStorageBlocks.end()); >+ mInterfaceBlocks.insert(mInterfaceBlocks.end(), mInBlocks.begin(), mInBlocks.end()); > } > > void TCompiler::clearResults() > { >- arrayBoundsClamper.Cleanup(); >- infoSink.info.erase(); >- infoSink.obj.erase(); >- infoSink.debug.erase(); >+ mArrayBoundsClamper.Cleanup(); >+ mInfoSink.info.erase(); >+ mInfoSink.obj.erase(); >+ mInfoSink.debug.erase(); > mDiagnostics.resetErrorCount(); > >- attributes.clear(); >- outputVariables.clear(); >- uniforms.clear(); >- inputVaryings.clear(); >- outputVaryings.clear(); >- interfaceBlocks.clear(); >- uniformBlocks.clear(); >- shaderStorageBlocks.clear(); >- inBlocks.clear(); >- variablesCollected = false; >+ mAttributes.clear(); >+ mOutputVariables.clear(); >+ mUniforms.clear(); >+ mInputVaryings.clear(); >+ mOutputVaryings.clear(); >+ mInterfaceBlocks.clear(); >+ mUniformBlocks.clear(); >+ mShaderStorageBlocks.clear(); >+ mInBlocks.clear(); >+ mVariablesCollected = false; > mGLPositionInitialized = false; > > mNumViews = -1; >@@ -859,11 +1060,13 @@ void TCompiler::clearResults() > mGeometryShaderInvocations = 0; > mGeometryShaderMaxVertices = -1; > >- builtInFunctionEmulator.cleanup(); >+ mBuiltInFunctionEmulator.cleanup(); > >- nameMap.clear(); >+ mNameMap.clear(); > >- mSourcePath = nullptr; >+ mSourcePath = nullptr; >+ >+ mSymbolTable.clearCompilationResults(); > } > > bool TCompiler::initCallDag(TIntermNode *root) >@@ -891,32 +1094,35 @@ bool TCompiler::checkCallDepth() > > for (size_t i = 0; i < mCallDag.size(); i++) > { >- int depth = 0; >- auto &record = mCallDag.getRecordFromIndex(i); >+ int depth = 0; >+ const CallDAG::Record &record = mCallDag.getRecordFromIndex(i); > >- for (auto &calleeIndex : record.callees) >+ for (const int &calleeIndex : record.callees) > { > depth = std::max(depth, depths[calleeIndex] + 1); > } > > depths[i] = depth; > >- if (depth >= maxCallStackDepth) >+ if (depth >= mResources.MaxCallStackDepth) > { > // Trace back the function chain to have a meaningful info log. >- std::stringstream errorStream; >- errorStream << "Call stack too deep (larger than " << maxCallStackDepth >- << ") with the following call chain: " << record.name; >+ std::stringstream errorStream = sh::InitializeStream<std::stringstream>(); >+ errorStream << "Call stack too deep (larger than " << mResources.MaxCallStackDepth >+ << ") with the following call chain: " >+ << record.node->getFunction()->name(); > > int currentFunction = static_cast<int>(i); > int currentDepth = depth; > > while (currentFunction != -1) > { >- errorStream << " -> " << mCallDag.getRecordFromIndex(currentFunction).name; >+ errorStream >+ << " -> " >+ << mCallDag.getRecordFromIndex(currentFunction).node->getFunction()->name(); > > int nextFunction = -1; >- for (auto &calleeIndex : mCallDag.getRecordFromIndex(currentFunction).callees) >+ for (const int &calleeIndex : mCallDag.getRecordFromIndex(currentFunction).callees) > { > if (depths[calleeIndex] == currentDepth - 1) > { >@@ -943,7 +1149,7 @@ bool TCompiler::tagUsedFunctions() > // Search from main, starting from the end of the DAG as it usually is the root. > for (size_t i = mCallDag.size(); i-- > 0;) > { >- if (mCallDag.getRecordFromIndex(i).name == "main") >+ if (mCallDag.getRecordFromIndex(i).node->getFunction()->isMain()) > { > internalTagUsedFunction(i); > return true; >@@ -956,12 +1162,12 @@ bool TCompiler::tagUsedFunctions() > > void TCompiler::internalTagUsedFunction(size_t index) > { >- if (functionMetadata[index].used) >+ if (mFunctionMetadata[index].used) > { > return; > } > >- functionMetadata[index].used = true; >+ mFunctionMetadata[index].used = true; > > for (int calleeIndex : mCallDag.getRecordFromIndex(index).callees) > { >@@ -975,30 +1181,29 @@ class TCompiler::UnusedPredicate > public: > UnusedPredicate(const CallDAG *callDag, const std::vector<FunctionMetadata> *metadatas) > : mCallDag(callDag), mMetadatas(metadatas) >- { >- } >+ {} > > bool operator()(TIntermNode *node) > { > const TIntermFunctionPrototype *asFunctionPrototype = node->getAsFunctionPrototypeNode(); > const TIntermFunctionDefinition *asFunctionDefinition = node->getAsFunctionDefinition(); > >- const TFunctionSymbolInfo *functionInfo = nullptr; >+ const TFunction *func = nullptr; > > if (asFunctionDefinition) > { >- functionInfo = asFunctionDefinition->getFunctionSymbolInfo(); >+ func = asFunctionDefinition->getFunction(); > } > else if (asFunctionPrototype) > { >- functionInfo = asFunctionPrototype->getFunctionSymbolInfo(); >+ func = asFunctionPrototype->getFunction(); > } >- if (functionInfo == nullptr) >+ if (func == nullptr) > { > return false; > } > >- size_t callDagIndex = mCallDag->findIndex(functionInfo); >+ size_t callDagIndex = mCallDag->findIndex(func->uniqueId()); > if (callDagIndex == CallDAG::InvalidIndex) > { > // This happens only for unimplemented prototypes which are thus unused >@@ -1017,7 +1222,7 @@ class TCompiler::UnusedPredicate > > void TCompiler::pruneUnusedFunctions(TIntermBlock *root) > { >- UnusedPredicate isUnused(&mCallDag, &functionMetadata); >+ UnusedPredicate isUnused(&mCallDag, &mFunctionMetadata); > TIntermSequence *sequence = root->getSequence(); > > if (!sequence->empty()) >@@ -1029,13 +1234,13 @@ void TCompiler::pruneUnusedFunctions(TIntermBlock *root) > > bool TCompiler::limitExpressionComplexity(TIntermBlock *root) > { >- if (!IsASTDepthBelowLimit(root, maxExpressionComplexity)) >+ if (!IsASTDepthBelowLimit(root, mResources.MaxExpressionComplexity)) > { > mDiagnostics.globalError("Expression too complex."); > return false; > } > >- if (!ValidateMaxParameters(root, maxFunctionParameters)) >+ if (!ValidateMaxParameters(root, mResources.MaxFunctionParameters)) > { > mDiagnostics.globalError("Function has too many parameters."); > return false; >@@ -1051,7 +1256,7 @@ bool TCompiler::shouldCollectVariables(ShCompileOptions compileOptions) > > bool TCompiler::wereVariablesCollected() const > { >- return variablesCollected; >+ return mVariablesCollected; > } > > void TCompiler::initializeGLPosition(TIntermBlock *root) >@@ -1060,14 +1265,15 @@ void TCompiler::initializeGLPosition(TIntermBlock *root) > sh::ShaderVariable var(GL_FLOAT_VEC4); > var.name = "gl_Position"; > list.push_back(var); >- InitializeVariables(root, list, &symbolTable, shaderVersion, extensionBehavior, false); >+ InitializeVariables(root, list, &mSymbolTable, mShaderVersion, mExtensionBehavior, false, >+ false); > } > > void TCompiler::useAllMembersInUnusedStandardAndSharedBlocks(TIntermBlock *root) > { > sh::InterfaceBlockList list; > >- for (const auto& block : uniformBlocks) >+ for (const sh::InterfaceBlock &block : mUniformBlocks) > { > if (!block.staticUse && > (block.layout == sh::BLOCKLAYOUT_STD140 || block.layout == sh::BLOCKLAYOUT_SHARED)) >@@ -1076,15 +1282,15 @@ void TCompiler::useAllMembersInUnusedStandardAndSharedBlocks(TIntermBlock *root) > } > } > >- sh::UseInterfaceBlockFields(root, list, symbolTable); >+ sh::UseInterfaceBlockFields(root, list, mSymbolTable); > } > > void TCompiler::initializeOutputVariables(TIntermBlock *root) > { > InitVariableList list; >- if (shaderType == GL_VERTEX_SHADER || shaderType == GL_GEOMETRY_SHADER_OES) >+ if (mShaderType == GL_VERTEX_SHADER || mShaderType == GL_GEOMETRY_SHADER_EXT) > { >- for (const auto& var : outputVaryings) >+ for (const sh::Varying &var : mOutputVaryings) > { > list.push_back(var); > if (var.name == "gl_Position") >@@ -1096,18 +1302,19 @@ void TCompiler::initializeOutputVariables(TIntermBlock *root) > } > else > { >- ASSERT(shaderType == GL_FRAGMENT_SHADER); >- for (const auto& var : outputVariables) >+ ASSERT(mShaderType == GL_FRAGMENT_SHADER); >+ for (const sh::OutputVariable &var : mOutputVariables) > { > list.push_back(var); > } > } >- InitializeVariables(root, list, &symbolTable, shaderVersion, extensionBehavior, false); >+ InitializeVariables(root, list, &mSymbolTable, mShaderVersion, mExtensionBehavior, false, >+ false); > } > > const TExtensionBehavior &TCompiler::getExtensionBehavior() const > { >- return extensionBehavior; >+ return mExtensionBehavior; > } > > const char *TCompiler::getSourcePath() const >@@ -1117,29 +1324,29 @@ const char *TCompiler::getSourcePath() const > > const ShBuiltInResources &TCompiler::getResources() const > { >- return compileResources; >+ return mResources; > } > > const ArrayBoundsClamper &TCompiler::getArrayBoundsClamper() const > { >- return arrayBoundsClamper; >+ return mArrayBoundsClamper; > } > > ShArrayIndexClampingStrategy TCompiler::getArrayIndexClampingStrategy() const > { >- return clampingStrategy; >+ return mResources.ArrayIndexClampingStrategy; > } > > const BuiltInFunctionEmulator &TCompiler::getBuiltInFunctionEmulator() const > { >- return builtInFunctionEmulator; >+ return mBuiltInFunctionEmulator; > } > > void TCompiler::writePragma(ShCompileOptions compileOptions) > { > if (!(compileOptions & SH_FLATTEN_PRAGMA_STDGL_INVARIANT_ALL)) > { >- TInfoSinkBase &sink = infoSink.obj; >+ TInfoSinkBase &sink = mInfoSink.obj; > if (mPragma.stdgl.invariantAll) > sink << "#pragma STDGL invariant(all)\n"; > } >@@ -1147,17 +1354,17 @@ void TCompiler::writePragma(ShCompileOptions compileOptions) > > bool TCompiler::isVaryingDefined(const char *varyingName) > { >- ASSERT(variablesCollected); >- for (size_t ii = 0; ii < inputVaryings.size(); ++ii) >+ ASSERT(mVariablesCollected); >+ for (size_t ii = 0; ii < mInputVaryings.size(); ++ii) > { >- if (inputVaryings[ii].name == varyingName) >+ if (mInputVaryings[ii].name == varyingName) > { > return true; > } > } >- for (size_t ii = 0; ii < outputVaryings.size(); ++ii) >+ for (size_t ii = 0; ii < mOutputVaryings.size(); ++ii) > { >- if (outputVaryings[ii].name == varyingName) >+ if (mOutputVaryings[ii].name == varyingName) > { > return true; > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.h b/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.h >index 753cfb8e7b2..392f7ecd29d 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.h >@@ -24,6 +24,7 @@ > #include "compiler/translator/InfoSink.h" > #include "compiler/translator/Pragma.h" > #include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/ValidateAST.h" > #include "third_party/compiler/ArrayBoundsClamper.h" > > namespace sh >@@ -35,11 +36,6 @@ class TParseContext; > class TranslatorHLSL; > #endif // ANGLE_ENABLE_HLSL > >-// >-// Helper function to identify specs that are based on the WebGL spec. >-// >-bool IsWebGLBasedSpec(ShShaderSpec spec); >- > // > // Helper function to check if the shader type is GLSL. > // >@@ -71,7 +67,7 @@ class TShHandleBase > protected: > // Memory allocator. Allocates and tracks memory required by the compiler. > // Deallocates all memory when compiler is destructed. >- TPoolAllocator allocator; >+ angle::PoolAllocator allocator; > }; > > // >@@ -99,8 +95,8 @@ class TCompiler : public TShHandleBase > ShCompileOptions compileOptions); > > // Get results of the last compilation. >- int getShaderVersion() const { return shaderVersion; } >- TInfoSink &getInfoSink() { return infoSink; } >+ int getShaderVersion() const { return mShaderVersion; } >+ TInfoSink &getInfoSink() { return mInfoSink; } > > bool isComputeShaderLocalSizeDeclared() const { return mComputeShaderLocalSizeDeclared; } > const sh::WorkGroupSize &getComputeShaderLocalSize() const { return mComputeShaderLocalSize; } >@@ -109,25 +105,25 @@ class TCompiler : public TShHandleBase > // Clears the results from the previous compilation. > void clearResults(); > >- const std::vector<sh::Attribute> &getAttributes() const { return attributes; } >- const std::vector<sh::OutputVariable> &getOutputVariables() const { return outputVariables; } >- const std::vector<sh::Uniform> &getUniforms() const { return uniforms; } >- const std::vector<sh::Varying> &getInputVaryings() const { return inputVaryings; } >- const std::vector<sh::Varying> &getOutputVaryings() const { return outputVaryings; } >- const std::vector<sh::InterfaceBlock> &getInterfaceBlocks() const { return interfaceBlocks; } >- const std::vector<sh::InterfaceBlock> &getUniformBlocks() const { return uniformBlocks; } >+ const std::vector<sh::Attribute> &getAttributes() const { return mAttributes; } >+ const std::vector<sh::OutputVariable> &getOutputVariables() const { return mOutputVariables; } >+ const std::vector<sh::Uniform> &getUniforms() const { return mUniforms; } >+ const std::vector<sh::Varying> &getInputVaryings() const { return mInputVaryings; } >+ const std::vector<sh::Varying> &getOutputVaryings() const { return mOutputVaryings; } >+ const std::vector<sh::InterfaceBlock> &getInterfaceBlocks() const { return mInterfaceBlocks; } >+ const std::vector<sh::InterfaceBlock> &getUniformBlocks() const { return mUniformBlocks; } > const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks() const > { >- return shaderStorageBlocks; >+ return mShaderStorageBlocks; > } >- const std::vector<sh::InterfaceBlock> &getInBlocks() const { return inBlocks; } >+ const std::vector<sh::InterfaceBlock> &getInBlocks() const { return mInBlocks; } > >- ShHashFunction64 getHashFunction() const { return hashFunction; } >- NameMap &getNameMap() { return nameMap; } >- TSymbolTable &getSymbolTable() { return symbolTable; } >- ShShaderSpec getShaderSpec() const { return shaderSpec; } >- ShShaderOutput getOutputType() const { return outputType; } >- const std::string &getBuiltInResourcesString() const { return builtInResourcesString; } >+ ShHashFunction64 getHashFunction() const { return mResources.HashFunction; } >+ NameMap &getNameMap() { return mNameMap; } >+ TSymbolTable &getSymbolTable() { return mSymbolTable; } >+ ShShaderSpec getShaderSpec() const { return mShaderSpec; } >+ ShShaderOutput getOutputType() const { return mOutputType; } >+ const std::string &getBuiltInResourcesString() const { return mBuiltInResourcesString; } > > bool shouldRunLoopAndIndexingValidation(ShCompileOptions compileOptions) const; > >@@ -145,36 +141,17 @@ class TCompiler : public TShHandleBase > return mGeometryShaderOutputPrimitiveType; > } > >- sh::GLenum getShaderType() const { return shaderType; } >+ sh::GLenum getShaderType() const { return mShaderType; } > > protected: >- // Initialize symbol-table with built-in symbols. >- bool InitBuiltInSymbolTable(const ShBuiltInResources &resources); >- // Compute the string representation of the built-in resources >- void setResourceString(); >- // Return false if the call depth is exceeded. >- bool checkCallDepth(); > // Add emulated functions to the built-in function emulator. > virtual void initBuiltInFunctionEmulator(BuiltInFunctionEmulator *emu, >- ShCompileOptions compileOptions){}; >+ ShCompileOptions compileOptions) >+ {} > // Translate to object code. May generate performance warnings through the diagnostics. > virtual void translate(TIntermBlock *root, > ShCompileOptions compileOptions, > PerformanceDiagnostics *perfDiagnostics) = 0; >- // Insert statements to reference all members in unused uniform blocks with standard and shared >- // layout. This is to work around a Mac driver that treats unused standard/shared >- // uniform blocks as inactive. >- void useAllMembersInUnusedStandardAndSharedBlocks(TIntermBlock *root); >- // Insert statements to initialize output variables in the beginning of main(). >- // This is to avoid undefined behaviors. >- void initializeOutputVariables(TIntermBlock *root); >- // Insert gl_Position = vec4(0,0,0,0) to the beginning of main(). >- // It is to work around a Linux driver bug where missing this causes compile failure >- // while spec says it is allowed. >- // This function should only be applied to vertex shaders. >- void initializeGLPosition(TIntermBlock *root); >- // Return true if the maximum expression complexity is below the limit. >- bool limitExpressionComplexity(TIntermBlock *root); > // Get built-in extensions with default behavior. > const TExtensionBehavior &getExtensionBehavior() const; > const char *getSourcePath() const; >@@ -191,28 +168,46 @@ class TCompiler : public TShHandleBase > virtual bool shouldCollectVariables(ShCompileOptions compileOptions); > > bool wereVariablesCollected() const; >- std::vector<sh::Attribute> attributes; >- std::vector<sh::OutputVariable> outputVariables; >- std::vector<sh::Uniform> uniforms; >- std::vector<sh::Varying> inputVaryings; >- std::vector<sh::Varying> outputVaryings; >- std::vector<sh::InterfaceBlock> interfaceBlocks; >- std::vector<sh::InterfaceBlock> uniformBlocks; >- std::vector<sh::InterfaceBlock> shaderStorageBlocks; >- std::vector<sh::InterfaceBlock> inBlocks; >+ std::vector<sh::Attribute> mAttributes; >+ std::vector<sh::OutputVariable> mOutputVariables; >+ std::vector<sh::Uniform> mUniforms; >+ std::vector<sh::Varying> mInputVaryings; >+ std::vector<sh::Varying> mOutputVaryings; >+ std::vector<sh::InterfaceBlock> mInterfaceBlocks; >+ std::vector<sh::InterfaceBlock> mUniformBlocks; >+ std::vector<sh::InterfaceBlock> mShaderStorageBlocks; >+ std::vector<sh::InterfaceBlock> mInBlocks; > > private: >+ // Initialize symbol-table with built-in symbols. >+ bool initBuiltInSymbolTable(const ShBuiltInResources &resources); >+ // Compute the string representation of the built-in resources >+ void setResourceString(); >+ // Return false if the call depth is exceeded. >+ bool checkCallDepth(); >+ // Insert statements to reference all members in unused uniform blocks with standard and shared >+ // layout. This is to work around a Mac driver that treats unused standard/shared >+ // uniform blocks as inactive. >+ void useAllMembersInUnusedStandardAndSharedBlocks(TIntermBlock *root); >+ // Insert statements to initialize output variables in the beginning of main(). >+ // This is to avoid undefined behaviors. >+ void initializeOutputVariables(TIntermBlock *root); >+ // Insert gl_Position = vec4(0,0,0,0) to the beginning of main(). >+ // It is to work around a Linux driver bug where missing this causes compile failure >+ // while spec says it is allowed. >+ // This function should only be applied to vertex shaders. >+ void initializeGLPosition(TIntermBlock *root); >+ // Return true if the maximum expression complexity is below the limit. >+ bool limitExpressionComplexity(TIntermBlock *root); > // Creates the function call DAG for further analysis, returning false if there is a recursion > bool initCallDag(TIntermNode *root); > // Return false if "main" doesn't exist > bool tagUsedFunctions(); > void internalTagUsedFunction(size_t index); > >- void initSamplerDefaultPrecision(TBasicType samplerType); >- > void collectInterfaceBlocks(); > >- bool variablesCollected; >+ bool mVariablesCollected; > > bool mGLPositionInitialized; > >@@ -228,14 +223,17 @@ class TCompiler : public TShHandleBase > // version. > void setASTMetadata(const TParseContext &parseContext); > >+ // Check if shader version meets the requirement. >+ bool checkShaderVersion(TParseContext *parseContext); >+ > // Does checks that need to be run after parsing is complete and returns true if they pass. > bool checkAndSimplifyAST(TIntermBlock *root, > const TParseContext &parseContext, > ShCompileOptions compileOptions); > >- sh::GLenum shaderType; >- ShShaderSpec shaderSpec; >- ShShaderOutput outputType; >+ sh::GLenum mShaderType; >+ ShShaderSpec mShaderSpec; >+ ShShaderOutput mOutputType; > > struct FunctionMetadata > { >@@ -244,30 +242,23 @@ class TCompiler : public TShHandleBase > }; > > CallDAG mCallDag; >- std::vector<FunctionMetadata> functionMetadata; >+ std::vector<FunctionMetadata> mFunctionMetadata; > >- int maxUniformVectors; >- int maxExpressionComplexity; >- int maxCallStackDepth; >- int maxFunctionParameters; >- >- ShBuiltInResources compileResources; >- std::string builtInResourcesString; >+ ShBuiltInResources mResources; >+ std::string mBuiltInResourcesString; > > // Built-in symbol table for the given language, spec, and resources. > // It is preserved from compile-to-compile. >- TSymbolTable symbolTable; >+ TSymbolTable mSymbolTable; > // Built-in extensions with default behavior. >- TExtensionBehavior extensionBehavior; >- bool fragmentPrecisionHigh; >+ TExtensionBehavior mExtensionBehavior; > >- ArrayBoundsClamper arrayBoundsClamper; >- ShArrayIndexClampingStrategy clampingStrategy; >- BuiltInFunctionEmulator builtInFunctionEmulator; >+ ArrayBoundsClamper mArrayBoundsClamper; >+ BuiltInFunctionEmulator mBuiltInFunctionEmulator; > > // Results of compilation. >- int shaderVersion; >- TInfoSink infoSink; // Output sink. >+ int mShaderVersion; >+ TInfoSink mInfoSink; // Output sink. > TDiagnostics mDiagnostics; > const char *mSourcePath; // Path of source file or NULL > >@@ -285,10 +276,12 @@ class TCompiler : public TShHandleBase > TLayoutPrimitiveType mGeometryShaderOutputPrimitiveType; > > // name hashing. >- ShHashFunction64 hashFunction; >- NameMap nameMap; >+ NameMap mNameMap; > > TPragma mPragma; >+ >+ // Track what should be validated given passes currently applied. >+ ValidateASTOptions mValidateASTOptions; > }; > > // >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ConstantUnion.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ConstantUnion.cpp >index 7004aedee3f..c6389f40ef5 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ConstantUnion.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ConstantUnion.cpp >@@ -157,7 +157,16 @@ bool TConstantUnion::cast(TBasicType newType, const TConstantUnion &constant) > setUConst(static_cast<unsigned int>(constant.getBConst())); > break; > case EbtFloat: >- setUConst(static_cast<unsigned int>(constant.getFConst())); >+ if (constant.getFConst() < 0.0f) >+ { >+ // Avoid undefined behavior in C++ by first casting to signed int. >+ setUConst( >+ static_cast<unsigned int>(static_cast<int>(constant.getFConst()))); >+ } >+ else >+ { >+ setUConst(static_cast<unsigned int>(constant.getFConst())); >+ } > break; > default: > return false; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ConstantUnion.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ConstantUnion.h >index c1b3db90707..155fcd44b08 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ConstantUnion.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ConstantUnion.h >@@ -9,8 +9,8 @@ > > #include <assert.h> > >-#include "compiler/translator/Common.h" > #include "compiler/translator/BaseTypes.h" >+#include "compiler/translator/Common.h" > > namespace sh > { >@@ -20,7 +20,7 @@ class TDiagnostics; > class TConstantUnion > { > public: >- POOL_ALLOCATOR_NEW_DELETE(); >+ POOL_ALLOCATOR_NEW_DELETE > TConstantUnion(); > > bool cast(TBasicType newType, const TConstantUnion &constant); >@@ -100,8 +100,10 @@ class TConstantUnion > TConstantUnion operator||(const TConstantUnion &constant) const; > > TBasicType getType() const { return type; } >+ > private: >- union { >+ union >+ { > int iConst; // used for ivec, scalar ints > unsigned int uConst; // used for uvec, scalar uints > bool bConst; // used for bvec, scalar bools >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Declarator.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/Declarator.cpp >new file mode 100644 >index 00000000000..7a17a82b6a0 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Declarator.cpp >@@ -0,0 +1,33 @@ >+// >+// Copyright (c) 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. >+// >+// Declarator.cpp: >+// Declarator type for parsing structure field declarators. >+ >+#include "compiler/translator/Declarator.h" >+ >+namespace sh >+{ >+ >+TDeclarator::TDeclarator(const ImmutableString &name, const TSourceLoc &line) >+ : mName(name), mArraySizes(nullptr), mLine(line) >+{ >+ ASSERT(mName != ""); >+} >+ >+TDeclarator::TDeclarator(const ImmutableString &name, >+ const TVector<unsigned int> *arraySizes, >+ const TSourceLoc &line) >+ : mName(name), mArraySizes(arraySizes), mLine(line) >+{ >+ ASSERT(mArraySizes); >+} >+ >+bool TDeclarator::isArray() const >+{ >+ return mArraySizes != nullptr && mArraySizes->size() > 0; >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Declarator.h b/Source/ThirdParty/ANGLE/src/compiler/translator/Declarator.h >new file mode 100644 >index 00000000000..5b5d26b53ad >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Declarator.h >@@ -0,0 +1,49 @@ >+// >+// Copyright (c) 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. >+// >+// Declarator.h: >+// Declarator type for parsing structure field declarators. >+ >+#ifndef COMPILER_TRANSLATOR_DECLARATOR_H_ >+#define COMPILER_TRANSLATOR_DECLARATOR_H_ >+ >+#include "compiler/translator/Common.h" >+#include "compiler/translator/ImmutableString.h" >+ >+namespace sh >+{ >+ >+// Declarator like "a[2][4]". Only used for parsing structure field declarators. >+class TDeclarator : angle::NonCopyable >+{ >+ public: >+ POOL_ALLOCATOR_NEW_DELETE >+ TDeclarator(const ImmutableString &name, const TSourceLoc &line); >+ >+ TDeclarator(const ImmutableString &name, >+ const TVector<unsigned int> *arraySizes, >+ const TSourceLoc &line); >+ >+ const ImmutableString &name() const { return mName; } >+ >+ bool isArray() const; >+ const TVector<unsigned int> *arraySizes() const { return mArraySizes; } >+ >+ const TSourceLoc &line() const { return mLine; } >+ >+ private: >+ const ImmutableString mName; >+ >+ // Outermost array size is stored at the end of the vector. >+ const TVector<unsigned int> *const mArraySizes; >+ >+ const TSourceLoc mLine; >+}; >+ >+using TDeclaratorList = TVector<TDeclarator *>; >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_DECLARATOR_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/DeclareAndInitBuiltinsForInstancedMultiview.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/DeclareAndInitBuiltinsForInstancedMultiview.cpp >deleted file mode 100644 >index ce9828f1f91..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/DeclareAndInitBuiltinsForInstancedMultiview.cpp >+++ /dev/null >@@ -1,221 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// Applies the necessary AST transformations to support multiview rendering through instancing. >-// Check the header file For more information. >-// >- >-#include "compiler/translator/DeclareAndInitBuiltinsForInstancedMultiview.h" >- >-#include "compiler/translator/FindMain.h" >-#include "compiler/translator/InitializeVariables.h" >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/IntermTraverse.h" >-#include "compiler/translator/SymbolTable.h" >-#include "compiler/translator/util.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class ReplaceVariableTraverser : public TIntermTraverser >-{ >- public: >- ReplaceVariableTraverser(const TString &symbolName, TIntermSymbol *newSymbol) >- : TIntermTraverser(true, false, false), mSymbolName(symbolName), mNewSymbol(newSymbol) >- { >- } >- >- void visitSymbol(TIntermSymbol *node) override >- { >- TName &name = node->getName(); >- if (name.getString() == mSymbolName) >- { >- queueReplacement(mNewSymbol->deepCopy(), OriginalNode::IS_DROPPED); >- } >- } >- >- private: >- TString mSymbolName; >- TIntermSymbol *mNewSymbol; >-}; >- >-TIntermSymbol *CreateGLInstanceIDSymbol(const TSymbolTable &symbolTable) >-{ >- return ReferenceBuiltInVariable("gl_InstanceID", symbolTable, 300); >-} >- >-// Adds the InstanceID and ViewID_OVR initializers to the end of the initializers' sequence. >-void InitializeViewIDAndInstanceID(TIntermTyped *viewIDSymbol, >- TIntermTyped *instanceIDSymbol, >- unsigned numberOfViews, >- const TSymbolTable &symbolTable, >- TIntermSequence *initializers) >-{ >- // Create an unsigned numberOfViews node. >- TConstantUnion *numberOfViewsUnsignedConstant = new TConstantUnion(); >- numberOfViewsUnsignedConstant->setUConst(numberOfViews); >- TIntermConstantUnion *numberOfViewsUint = >- new TIntermConstantUnion(numberOfViewsUnsignedConstant, TType(EbtUInt, EbpHigh, EvqConst)); >- >- // Create a uint(gl_InstanceID) node. >- TIntermSequence *glInstanceIDSymbolCastArguments = new TIntermSequence(); >- glInstanceIDSymbolCastArguments->push_back(CreateGLInstanceIDSymbol(symbolTable)); >- TIntermAggregate *glInstanceIDAsUint = TIntermAggregate::CreateConstructor( >- TType(EbtUInt, EbpHigh, EvqTemporary), glInstanceIDSymbolCastArguments); >- >- // Create a uint(gl_InstanceID) / numberOfViews node. >- TIntermBinary *normalizedInstanceID = >- new TIntermBinary(EOpDiv, glInstanceIDAsUint, numberOfViewsUint); >- >- // Create an int(uint(gl_InstanceID) / numberOfViews) node. >- TIntermSequence *normalizedInstanceIDCastArguments = new TIntermSequence(); >- normalizedInstanceIDCastArguments->push_back(normalizedInstanceID); >- TIntermAggregate *normalizedInstanceIDAsInt = TIntermAggregate::CreateConstructor( >- TType(EbtInt, EbpHigh, EvqTemporary), normalizedInstanceIDCastArguments); >- >- // Create an InstanceID = int(uint(gl_InstanceID) / numberOfViews) node. >- TIntermBinary *instanceIDInitializer = >- new TIntermBinary(EOpAssign, instanceIDSymbol->deepCopy(), normalizedInstanceIDAsInt); >- initializers->push_back(instanceIDInitializer); >- >- // Create a uint(gl_InstanceID) % numberOfViews node. >- TIntermBinary *normalizedViewID = >- new TIntermBinary(EOpIMod, glInstanceIDAsUint->deepCopy(), numberOfViewsUint->deepCopy()); >- >- // Create a ViewID_OVR = uint(gl_InstanceID) % numberOfViews node. >- TIntermBinary *viewIDInitializer = >- new TIntermBinary(EOpAssign, viewIDSymbol->deepCopy(), normalizedViewID); >- initializers->push_back(viewIDInitializer); >-} >- >-// Replaces every occurrence of a symbol with the name specified in symbolName with newSymbolNode. >-void ReplaceSymbol(TIntermBlock *root, const TString &symbolName, TIntermSymbol *newSymbolNode) >-{ >- ReplaceVariableTraverser traverser(symbolName, newSymbolNode); >- root->traverse(&traverser); >- traverser.updateTree(); >-} >- >-void DeclareGlobalVariable(TIntermBlock *root, TIntermTyped *typedNode) >-{ >- TIntermSequence *globalSequence = root->getSequence(); >- TIntermDeclaration *declaration = new TIntermDeclaration(); >- declaration->appendDeclarator(typedNode->deepCopy()); >- globalSequence->insert(globalSequence->begin(), declaration); >-} >- >-// Adds a branch to write int(ViewID_OVR) to either gl_ViewportIndex or gl_Layer. The branch is >-// added to the end of the initializers' sequence. >-void SelectViewIndexInVertexShader(TIntermTyped *viewIDSymbol, >- TIntermTyped *multiviewBaseViewLayerIndexSymbol, >- TIntermSequence *initializers, >- const TSymbolTable &symbolTable) >-{ >- // Create an int(ViewID_OVR) node. >- TIntermSequence *viewIDSymbolCastArguments = new TIntermSequence(); >- viewIDSymbolCastArguments->push_back(viewIDSymbol); >- TIntermAggregate *viewIDAsInt = TIntermAggregate::CreateConstructor( >- TType(EbtInt, EbpHigh, EvqTemporary), viewIDSymbolCastArguments); >- >- // Create a gl_ViewportIndex node. >- TIntermSymbol *viewportIndexSymbol = >- ReferenceBuiltInVariable("gl_ViewportIndex", symbolTable, 0); >- >- // Create a { gl_ViewportIndex = int(ViewID_OVR) } node. >- TIntermBlock *viewportIndexInitializerInBlock = new TIntermBlock(); >- viewportIndexInitializerInBlock->appendStatement( >- new TIntermBinary(EOpAssign, viewportIndexSymbol, viewIDAsInt)); >- >- // Create a gl_Layer node. >- TIntermSymbol *layerSymbol = ReferenceBuiltInVariable("gl_Layer", symbolTable, 0); >- >- // Create an int(ViewID_OVR) + multiviewBaseViewLayerIndex node >- TIntermBinary *sumOfViewIDAndBaseViewIndex = >- new TIntermBinary(EOpAdd, viewIDAsInt->deepCopy(), multiviewBaseViewLayerIndexSymbol); >- >- // Create a { gl_Layer = int(ViewID_OVR) + multiviewBaseViewLayerIndex } node. >- TIntermBlock *layerInitializerInBlock = new TIntermBlock(); >- layerInitializerInBlock->appendStatement( >- new TIntermBinary(EOpAssign, layerSymbol, sumOfViewIDAndBaseViewIndex)); >- >- // Create a node to compare whether the base view index uniform is less than zero. >- TIntermBinary *multiviewBaseViewLayerIndexZeroComparison = >- new TIntermBinary(EOpLessThan, multiviewBaseViewLayerIndexSymbol->deepCopy(), >- CreateZeroNode(TType(EbtInt, EbpHigh, EvqConst))); >- >- // Create an if-else statement to select the code path. >- TIntermIfElse *multiviewBranch = >- new TIntermIfElse(multiviewBaseViewLayerIndexZeroComparison, >- viewportIndexInitializerInBlock, layerInitializerInBlock); >- >- initializers->push_back(multiviewBranch); >-} >- >-} // namespace >- >-void DeclareAndInitBuiltinsForInstancedMultiview(TIntermBlock *root, >- unsigned numberOfViews, >- GLenum shaderType, >- ShCompileOptions compileOptions, >- ShShaderOutput shaderOutput, >- TSymbolTable *symbolTable) >-{ >- ASSERT(shaderType == GL_VERTEX_SHADER || shaderType == GL_FRAGMENT_SHADER); >- >- TQualifier viewIDQualifier = (shaderType == GL_VERTEX_SHADER) ? EvqFlatOut : EvqFlatIn; >- TIntermSymbol *viewIDSymbol = new TIntermSymbol(symbolTable->nextUniqueId(), "ViewID_OVR", >- TType(EbtUInt, EbpHigh, viewIDQualifier)); >- viewIDSymbol->setInternal(true); >- >- DeclareGlobalVariable(root, viewIDSymbol); >- ReplaceSymbol(root, "gl_ViewID_OVR", viewIDSymbol); >- if (shaderType == GL_VERTEX_SHADER) >- { >- // Replacing gl_InstanceID with InstanceID should happen before adding the initializers of >- // InstanceID and ViewID. >- TIntermSymbol *instanceIDSymbol = new TIntermSymbol( >- symbolTable->nextUniqueId(), "InstanceID", TType(EbtInt, EbpHigh, EvqGlobal)); >- instanceIDSymbol->setInternal(true); >- DeclareGlobalVariable(root, instanceIDSymbol); >- ReplaceSymbol(root, "gl_InstanceID", instanceIDSymbol); >- >- TIntermSequence *initializers = new TIntermSequence(); >- InitializeViewIDAndInstanceID(viewIDSymbol, instanceIDSymbol, numberOfViews, *symbolTable, >- initializers); >- >- // The AST transformation which adds the expression to select the viewport index should >- // be done only for the GLSL and ESSL output. >- const bool selectView = (compileOptions & SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER) != 0u; >- // Assert that if the view is selected in the vertex shader, then the output is >- // either GLSL or ESSL. >- ASSERT(!selectView || IsOutputGLSL(shaderOutput) || IsOutputESSL(shaderOutput)); >- if (selectView) >- { >- // Add a uniform to switch between side-by-side and layered rendering. >- TIntermSymbol *multiviewBaseViewLayerIndexSymbol = >- new TIntermSymbol(symbolTable->nextUniqueId(), "multiviewBaseViewLayerIndex", >- TType(EbtInt, EbpHigh, EvqUniform)); >- multiviewBaseViewLayerIndexSymbol->setInternal(true); >- DeclareGlobalVariable(root, multiviewBaseViewLayerIndexSymbol); >- >- // Setting a value to gl_ViewportIndex or gl_Layer should happen after ViewID_OVR's >- // initialization. >- SelectViewIndexInVertexShader(viewIDSymbol->deepCopy(), >- multiviewBaseViewLayerIndexSymbol->deepCopy(), >- initializers, *symbolTable); >- } >- >- // Insert initializers at the beginning of main(). >- TIntermBlock *initializersBlock = new TIntermBlock(); >- initializersBlock->getSequence()->swap(*initializers); >- TIntermBlock *mainBody = FindMainBody(root); >- mainBody->getSequence()->insert(mainBody->getSequence()->begin(), initializersBlock); >- } >-} >- >-} // namespace sh >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/DeclareAndInitBuiltinsForInstancedMultiview.h b/Source/ThirdParty/ANGLE/src/compiler/translator/DeclareAndInitBuiltinsForInstancedMultiview.h >deleted file mode 100644 >index b4ab05fd0e7..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/DeclareAndInitBuiltinsForInstancedMultiview.h >+++ /dev/null >@@ -1,48 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// Regardless of the shader type, the following AST transformations are applied: >-// - Add declaration of View_ID_OVR. >-// - Replace every occurrence of gl_ViewID_OVR with ViewID_OVR, mark ViewID_OVR as internal and >-// declare it as a flat varying. >-// >-// If the shader type is a vertex shader, the following AST transformations are applied: >-// - Replace every occurrence of gl_InstanceID with InstanceID, mark InstanceID as internal and set >-// its qualifier to EvqTemporary. >-// - Add initializers of ViewID_OVR and InstanceID to the beginning of the body of main. The pass >-// should be executed before any variables get collected so that usage of gl_InstanceID is recorded. >-// - If the output is ESSL or GLSL and the SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER option is >-// enabled, the expression >-// "if (multiviewBaseViewLayerIndex < 0) { >-// gl_ViewportIndex = int(ViewID_OVR); >-// } else { >-// gl_Layer = int(ViewID_OVR) + multiviewBaseViewLayerIndex; >-// }" >-// is added after ViewID and InstanceID are initialized. Also, MultiviewRenderPath is added as a >-// uniform. >-// >- >-#ifndef COMPILER_TRANSLATOR_DECLAREANDINITBUILTINSFORINSTANCEDMULTIVIEW_H_ >-#define COMPILER_TRANSLATOR_DECLAREANDINITBUILTINSFORINSTANCEDMULTIVIEW_H_ >- >-#include "GLSLANG/ShaderLang.h" >-#include "angle_gl.h" >- >-namespace sh >-{ >- >-class TIntermBlock; >-class TSymbolTable; >- >-void DeclareAndInitBuiltinsForInstancedMultiview(TIntermBlock *root, >- unsigned numberOfViews, >- GLenum shaderType, >- ShCompileOptions compileOptions, >- ShShaderOutput shaderOutput, >- TSymbolTable *symbolTable); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_DECLAREANDINITBUILTINSFORINSTANCEDMULTIVIEW_H_ >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/DeferGlobalInitializers.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/DeferGlobalInitializers.cpp >deleted file mode 100644 >index 67d51ea87b9..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/DeferGlobalInitializers.cpp >+++ /dev/null >@@ -1,147 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >-// DeferGlobalInitializers is an AST traverser that moves global initializers into a separate >-// function that is called in the beginning of main(). This enables initialization of globals with >-// uniforms or non-constant globals, as allowed by the WebGL spec. Some initializers referencing >-// non-constants may need to be unfolded into if statements in HLSL - this kind of steps should be >-// done after DeferGlobalInitializers is run. Note that it's important that the function definition >-// is at the end of the shader, as some globals may be declared after main(). >-// >-// It can also initialize all uninitialized globals. >-// >- >-#include "compiler/translator/DeferGlobalInitializers.h" >- >-#include "compiler/translator/FindMain.h" >-#include "compiler/translator/InitializeVariables.h" >-#include "compiler/translator/IntermNode.h" >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/SymbolTable.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-void GetDeferredInitializers(TIntermDeclaration *declaration, >- bool initializeUninitializedGlobals, >- bool canUseLoopsToInitialize, >- TIntermSequence *deferredInitializersOut, >- TSymbolTable *symbolTable) >-{ >- // SeparateDeclarations should have already been run. >- ASSERT(declaration->getSequence()->size() == 1); >- >- TIntermNode *declarator = declaration->getSequence()->back(); >- TIntermBinary *init = declarator->getAsBinaryNode(); >- if (init) >- { >- TIntermSymbol *symbolNode = init->getLeft()->getAsSymbolNode(); >- ASSERT(symbolNode); >- TIntermTyped *expression = init->getRight(); >- >- if ((expression->getQualifier() != EvqConst || >- (expression->getAsConstantUnion() == nullptr && >- !expression->isConstructorWithOnlyConstantUnionParameters()))) >- { >- // For variables which are not constant, defer their real initialization until >- // after we initialize uniforms. >- // Deferral is done also in any cases where the variable has not been constant >- // folded, since otherwise there's a chance that HLSL output will generate extra >- // statements from the initializer expression. >- >- // Change const global to a regular global if its initialization is deferred. >- // This can happen if ANGLE has not been able to fold the constant expression used >- // as an initializer. >- ASSERT(symbolNode->getQualifier() == EvqConst || >- symbolNode->getQualifier() == EvqGlobal); >- if (symbolNode->getQualifier() == EvqConst) >- { >- symbolNode->getTypePointer()->setQualifier(EvqGlobal); >- } >- >- TIntermBinary *deferredInit = >- new TIntermBinary(EOpAssign, symbolNode->deepCopy(), init->getRight()); >- deferredInitializersOut->push_back(deferredInit); >- >- // Remove the initializer from the global scope and just declare the global instead. >- declaration->replaceChildNode(init, symbolNode); >- } >- } >- else if (initializeUninitializedGlobals) >- { >- TIntermSymbol *symbolNode = declarator->getAsSymbolNode(); >- ASSERT(symbolNode); >- >- // Ignore ANGLE internal variables. >- if (symbolNode->getName().isInternal()) >- return; >- >- if (symbolNode->getQualifier() == EvqGlobal && symbolNode->getSymbol() != "") >- { >- TIntermSequence *initCode = >- CreateInitCode(symbolNode, canUseLoopsToInitialize, symbolTable); >- deferredInitializersOut->insert(deferredInitializersOut->end(), initCode->begin(), >- initCode->end()); >- } >- } >-} >- >-void InsertInitCallToMain(TIntermBlock *root, >- TIntermSequence *deferredInitializers, >- TSymbolTable *symbolTable) >-{ >- TIntermBlock *initGlobalsBlock = new TIntermBlock(); >- initGlobalsBlock->getSequence()->swap(*deferredInitializers); >- >- TSymbolUniqueId initGlobalsFunctionId(symbolTable); >- >- const char *kInitGlobalsFunctionName = "initGlobals"; >- >- TIntermFunctionPrototype *initGlobalsFunctionPrototype = >- CreateInternalFunctionPrototypeNode(TType(), kInitGlobalsFunctionName, initGlobalsFunctionId); >- root->getSequence()->insert(root->getSequence()->begin(), initGlobalsFunctionPrototype); >- TIntermFunctionDefinition *initGlobalsFunctionDefinition = CreateInternalFunctionDefinitionNode( >- TType(), kInitGlobalsFunctionName, initGlobalsBlock, initGlobalsFunctionId); >- root->appendStatement(initGlobalsFunctionDefinition); >- >- TIntermAggregate *initGlobalsCall = CreateInternalFunctionCallNode( >- TType(), kInitGlobalsFunctionName, initGlobalsFunctionId, new TIntermSequence()); >- >- TIntermBlock *mainBody = FindMainBody(root); >- mainBody->getSequence()->insert(mainBody->getSequence()->begin(), initGlobalsCall); >-} >- >-} // namespace >- >-void DeferGlobalInitializers(TIntermBlock *root, >- bool initializeUninitializedGlobals, >- bool canUseLoopsToInitialize, >- TSymbolTable *symbolTable) >-{ >- TIntermSequence *deferredInitializers = new TIntermSequence(); >- >- // Loop over all global statements and process the declarations. This is simpler than using a >- // traverser. >- for (TIntermNode *statement : *root->getSequence()) >- { >- TIntermDeclaration *declaration = statement->getAsDeclarationNode(); >- if (declaration) >- { >- GetDeferredInitializers(declaration, initializeUninitializedGlobals, >- canUseLoopsToInitialize, deferredInitializers, symbolTable); >- } >- } >- >- // Add the function with initialization and the call to that. >- if (!deferredInitializers->empty()) >- { >- InsertInitCallToMain(root, deferredInitializers, symbolTable); >- } >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/DeferGlobalInitializers.h b/Source/ThirdParty/ANGLE/src/compiler/translator/DeferGlobalInitializers.h >deleted file mode 100644 >index 86930a585fc..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/DeferGlobalInitializers.h >+++ /dev/null >@@ -1,32 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >-// DeferGlobalInitializers is an AST traverser that moves global initializers into a separate >-// function that is called in the beginning of main(). This enables initialization of globals with >-// uniforms or non-constant globals, as allowed by the WebGL spec. Some initializers referencing >-// non-constants may need to be unfolded into if statements in HLSL - this kind of steps should be >-// done after DeferGlobalInitializers is run. Note that it's important that the function definition >-// is at the end of the shader, as some globals may be declared after main(). >-// >-// It can also initialize all uninitialized globals. >-// >- >-#ifndef COMPILER_TRANSLATOR_DEFERGLOBALINITIALIZERS_H_ >-#define COMPILER_TRANSLATOR_DEFERGLOBALINITIALIZERS_H_ >- >-namespace sh >-{ >- >-class TIntermBlock; >-class TSymbolTable; >- >-void DeferGlobalInitializers(TIntermBlock *root, >- bool initializeUninitializedGlobals, >- bool canUseLoopsToInitialize, >- TSymbolTable *symbolTable); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_DEFERGLOBALINITIALIZERS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Diagnostics.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/Diagnostics.cpp >index 1744e5ab3ef..5ec4867cbba 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Diagnostics.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Diagnostics.cpp >@@ -16,15 +16,12 @@ namespace sh > > TDiagnostics::TDiagnostics(TInfoSinkBase &infoSink) > : mInfoSink(infoSink), mNumErrors(0), mNumWarnings(0) >-{ >-} >+{} > >-TDiagnostics::~TDiagnostics() >-{ >-} >+TDiagnostics::~TDiagnostics() {} > > void TDiagnostics::writeInfo(Severity severity, >- const pp::SourceLocation &loc, >+ const angle::pp::SourceLocation &loc, > const char *reason, > const char *token) > { >@@ -54,19 +51,23 @@ void TDiagnostics::globalError(const char *message) > mInfoSink << message << "\n"; > } > >-void TDiagnostics::error(const pp::SourceLocation &loc, const char *reason, const char *token) >+void TDiagnostics::error(const angle::pp::SourceLocation &loc, >+ const char *reason, >+ const char *token) > { > writeInfo(SH_ERROR, loc, reason, token); > } > >-void TDiagnostics::warning(const pp::SourceLocation &loc, const char *reason, const char *token) >+void TDiagnostics::warning(const angle::pp::SourceLocation &loc, >+ const char *reason, >+ const char *token) > { > writeInfo(SH_WARNING, loc, reason, token); > } > > void TDiagnostics::error(const TSourceLoc &loc, const char *reason, const char *token) > { >- pp::SourceLocation srcLoc; >+ angle::pp::SourceLocation srcLoc; > srcLoc.file = loc.first_file; > srcLoc.line = loc.first_line; > error(srcLoc, reason, token); >@@ -74,13 +75,13 @@ void TDiagnostics::error(const TSourceLoc &loc, const char *reason, const char * > > void TDiagnostics::warning(const TSourceLoc &loc, const char *reason, const char *token) > { >- pp::SourceLocation srcLoc; >+ angle::pp::SourceLocation srcLoc; > srcLoc.file = loc.first_file; > srcLoc.line = loc.first_line; > warning(srcLoc, reason, token); > } > >-void TDiagnostics::print(ID id, const pp::SourceLocation &loc, const std::string &text) >+void TDiagnostics::print(ID id, const angle::pp::SourceLocation &loc, const std::string &text) > { > writeInfo(isError(id) ? SH_ERROR : SH_WARNING, loc, message(id), text.c_str()); > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Diagnostics.h b/Source/ThirdParty/ANGLE/src/compiler/translator/Diagnostics.h >index 55b88991df5..121b6f3c2a0 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Diagnostics.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Diagnostics.h >@@ -17,7 +17,7 @@ namespace sh > class TInfoSinkBase; > struct TSourceLoc; > >-class TDiagnostics : public pp::Diagnostics, angle::NonCopyable >+class TDiagnostics : public angle::pp::Diagnostics, angle::NonCopyable > { > public: > TDiagnostics(TInfoSinkBase &infoSink); >@@ -26,8 +26,8 @@ class TDiagnostics : public pp::Diagnostics, angle::NonCopyable > int numErrors() const { return mNumErrors; } > int numWarnings() const { return mNumWarnings; } > >- void error(const pp::SourceLocation &loc, const char *reason, const char *token); >- void warning(const pp::SourceLocation &loc, const char *reason, const char *token); >+ void error(const angle::pp::SourceLocation &loc, const char *reason, const char *token); >+ void warning(const angle::pp::SourceLocation &loc, const char *reason, const char *token); > > void error(const TSourceLoc &loc, const char *reason, const char *token); > void warning(const TSourceLoc &loc, const char *reason, const char *token); >@@ -38,11 +38,11 @@ class TDiagnostics : public pp::Diagnostics, angle::NonCopyable > > protected: > void writeInfo(Severity severity, >- const pp::SourceLocation &loc, >+ const angle::pp::SourceLocation &loc, > const char *reason, > const char *token); > >- void print(ID id, const pp::SourceLocation &loc, const std::string &text) override; >+ void print(ID id, const angle::pp::SourceLocation &loc, const std::string &text) override; > > private: > TInfoSinkBase &mInfoSink; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.cpp >index 485e66670c7..e468fd44d3b 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.cpp >@@ -10,6 +10,7 @@ > > #include "angle_gl.h" > #include "common/debug.h" >+#include "compiler/translator/Common.h" > #include "compiler/translator/Diagnostics.h" > > namespace sh >@@ -43,19 +44,16 @@ TDirectiveHandler::TDirectiveHandler(TExtensionBehavior &extBehavior, > mShaderVersion(shaderVersion), > mShaderType(shaderType), > mDebugShaderPrecisionSupported(debugShaderPrecisionSupported) >-{ >-} >+{} > >-TDirectiveHandler::~TDirectiveHandler() >-{ >-} >+TDirectiveHandler::~TDirectiveHandler() {} > >-void TDirectiveHandler::handleError(const pp::SourceLocation &loc, const std::string &msg) >+void TDirectiveHandler::handleError(const angle::pp::SourceLocation &loc, const std::string &msg) > { > mDiagnostics.error(loc, msg.c_str(), ""); > } > >-void TDirectiveHandler::handlePragma(const pp::SourceLocation &loc, >+void TDirectiveHandler::handlePragma(const angle::pp::SourceLocation &loc, > const std::string &name, > const std::string &value, > bool stdgl) >@@ -119,7 +117,7 @@ void TDirectiveHandler::handlePragma(const pp::SourceLocation &loc, > } > else > { >- mDiagnostics.report(pp::Diagnostics::PP_UNRECOGNIZED_PRAGMA, loc, name); >+ mDiagnostics.report(angle::pp::Diagnostics::PP_UNRECOGNIZED_PRAGMA, loc, name); > return; > } > >@@ -130,7 +128,7 @@ void TDirectiveHandler::handlePragma(const pp::SourceLocation &loc, > } > } > >-void TDirectiveHandler::handleExtension(const pp::SourceLocation &loc, >+void TDirectiveHandler::handleExtension(const angle::pp::SourceLocation &loc, > const std::string &name, > const std::string &behavior) > { >@@ -185,7 +183,7 @@ void TDirectiveHandler::handleExtension(const pp::SourceLocation &loc, > } > } > >-void TDirectiveHandler::handleVersion(const pp::SourceLocation &loc, int version) >+void TDirectiveHandler::handleVersion(const angle::pp::SourceLocation &loc, int version) > { > if (version == 100 || version == 300 || version == 310) > { >@@ -193,7 +191,7 @@ void TDirectiveHandler::handleVersion(const pp::SourceLocation &loc, int version > } > else > { >- std::stringstream stream; >+ std::stringstream stream = sh::InitializeStream<std::stringstream>(); > stream << version; > std::string str = stream.str(); > mDiagnostics.error(loc, "version number not supported", str.c_str()); >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.h b/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.h >index 8e8cb9bbf6f..b5b92821031 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.h >@@ -7,17 +7,17 @@ > #ifndef COMPILER_TRANSLATOR_DIRECTIVEHANDLER_H_ > #define COMPILER_TRANSLATOR_DIRECTIVEHANDLER_H_ > >+#include "GLSLANG/ShaderLang.h" > #include "common/angleutils.h" >+#include "compiler/preprocessor/DirectiveHandlerBase.h" > #include "compiler/translator/ExtensionBehavior.h" > #include "compiler/translator/Pragma.h" >-#include "compiler/preprocessor/DirectiveHandlerBase.h" >-#include "GLSLANG/ShaderLang.h" > > namespace sh > { > class TDiagnostics; > >-class TDirectiveHandler : public pp::DirectiveHandler, angle::NonCopyable >+class TDirectiveHandler : public angle::pp::DirectiveHandler, angle::NonCopyable > { > public: > TDirectiveHandler(TExtensionBehavior &extBehavior, >@@ -30,18 +30,18 @@ class TDirectiveHandler : public pp::DirectiveHandler, angle::NonCopyable > const TPragma &pragma() const { return mPragma; } > const TExtensionBehavior &extensionBehavior() const { return mExtensionBehavior; } > >- void handleError(const pp::SourceLocation &loc, const std::string &msg) override; >+ void handleError(const angle::pp::SourceLocation &loc, const std::string &msg) override; > >- void handlePragma(const pp::SourceLocation &loc, >+ void handlePragma(const angle::pp::SourceLocation &loc, > const std::string &name, > const std::string &value, > bool stdgl) override; > >- void handleExtension(const pp::SourceLocation &loc, >+ void handleExtension(const angle::pp::SourceLocation &loc, > const std::string &name, > const std::string &behavior) override; > >- void handleVersion(const pp::SourceLocation &loc, int version) override; >+ void handleVersion(const angle::pp::SourceLocation &loc, int version) override; > > private: > TPragma mPragma; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/EmulateGLFragColorBroadcast.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/EmulateGLFragColorBroadcast.cpp >deleted file mode 100644 >index 189ea341eb9..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/EmulateGLFragColorBroadcast.cpp >+++ /dev/null >@@ -1,129 +0,0 @@ >-// >-// Copyright (c) 2002-2016 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. >-// >-// gl_FragColor needs to broadcast to all color buffers in ES2 if >-// GL_EXT_draw_buffers is explicitly enabled in a fragment shader. >-// >-// We emulate this by replacing all gl_FragColor with gl_FragData[0], and in the end >-// of main() function, assigning gl_FragData[1], ..., gl_FragData[maxDrawBuffers-1] >-// with gl_FragData[0]. >-// >- >-#include "compiler/translator/EmulateGLFragColorBroadcast.h" >- >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/IntermTraverse.h" >-#include "compiler/translator/RunAtTheEndOfShader.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class GLFragColorBroadcastTraverser : public TIntermTraverser >-{ >- public: >- GLFragColorBroadcastTraverser(int maxDrawBuffers, TSymbolTable *symbolTable, int shaderVersion) >- : TIntermTraverser(true, false, false, symbolTable), >- mGLFragColorUsed(false), >- mMaxDrawBuffers(maxDrawBuffers), >- mShaderVersion(shaderVersion) >- { >- } >- >- void broadcastGLFragColor(TIntermBlock *root); >- >- bool isGLFragColorUsed() const { return mGLFragColorUsed; } >- >- protected: >- void visitSymbol(TIntermSymbol *node) override; >- >- TIntermBinary *constructGLFragDataNode(int index) const; >- TIntermBinary *constructGLFragDataAssignNode(int index) const; >- >- private: >- bool mGLFragColorUsed; >- int mMaxDrawBuffers; >- const int mShaderVersion; >-}; >- >-TIntermBinary *GLFragColorBroadcastTraverser::constructGLFragDataNode(int index) const >-{ >- TIntermSymbol *symbol = >- ReferenceBuiltInVariable(TString("gl_FragData"), *mSymbolTable, mShaderVersion); >- TIntermTyped *indexNode = CreateIndexNode(index); >- >- TIntermBinary *binary = new TIntermBinary(EOpIndexDirect, symbol, indexNode); >- return binary; >-} >- >-TIntermBinary *GLFragColorBroadcastTraverser::constructGLFragDataAssignNode(int index) const >-{ >- TIntermTyped *fragDataIndex = constructGLFragDataNode(index); >- TIntermTyped *fragDataZero = constructGLFragDataNode(0); >- >- return new TIntermBinary(EOpAssign, fragDataIndex, fragDataZero); >-} >- >-void GLFragColorBroadcastTraverser::visitSymbol(TIntermSymbol *node) >-{ >- if (node->getSymbol() == "gl_FragColor") >- { >- queueReplacement(constructGLFragDataNode(0), OriginalNode::IS_DROPPED); >- mGLFragColorUsed = true; >- } >-} >- >-void GLFragColorBroadcastTraverser::broadcastGLFragColor(TIntermBlock *root) >-{ >- ASSERT(mMaxDrawBuffers > 1); >- if (!mGLFragColorUsed) >- { >- return; >- } >- >- TIntermBlock *broadcastBlock = new TIntermBlock(); >- // Now insert statements >- // gl_FragData[1] = gl_FragData[0]; >- // ... >- // gl_FragData[maxDrawBuffers - 1] = gl_FragData[0]; >- for (int colorIndex = 1; colorIndex < mMaxDrawBuffers; ++colorIndex) >- { >- broadcastBlock->appendStatement(constructGLFragDataAssignNode(colorIndex)); >- } >- RunAtTheEndOfShader(root, broadcastBlock, mSymbolTable); >-} >- >-} // namespace anonymous >- >-void EmulateGLFragColorBroadcast(TIntermBlock *root, >- int maxDrawBuffers, >- std::vector<sh::OutputVariable> *outputVariables, >- TSymbolTable *symbolTable, >- int shaderVersion) >-{ >- ASSERT(maxDrawBuffers > 1); >- GLFragColorBroadcastTraverser traverser(maxDrawBuffers, symbolTable, shaderVersion); >- root->traverse(&traverser); >- if (traverser.isGLFragColorUsed()) >- { >- traverser.updateTree(); >- traverser.broadcastGLFragColor(root); >- for (auto &var : *outputVariables) >- { >- if (var.name == "gl_FragColor") >- { >- // TODO(zmo): Find a way to keep the original variable information. >- var.name = "gl_FragData"; >- var.mappedName = "gl_FragData"; >- var.arraySizes.push_back(maxDrawBuffers); >- ASSERT(var.arraySizes.size() == 1u); >- } >- } >- } >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/EmulateGLFragColorBroadcast.h b/Source/ThirdParty/ANGLE/src/compiler/translator/EmulateGLFragColorBroadcast.h >deleted file mode 100644 >index e652b7e07e6..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/EmulateGLFragColorBroadcast.h >+++ /dev/null >@@ -1,31 +0,0 @@ >-// >-// Copyright (c) 2002-2016 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. >-// >-// Emulate gl_FragColor broadcast behaviors in ES2 where >-// GL_EXT_draw_buffers is explicitly enabled in a fragment shader. >-// >- >-#ifndef COMPILER_TRANSLATOR_EMULATEGLFRAGCOLORBROADCAST_H_ >-#define COMPILER_TRANSLATOR_EMULATEGLFRAGCOLORBROADCAST_H_ >- >-#include <vector> >- >-namespace sh >-{ >-struct OutputVariable; >-class TIntermBlock; >-class TSymbolTable; >- >-// Replace all gl_FragColor with gl_FragData[0], and in the end of main() function, >-// assign gl_FragData[1] ... gl_FragData[maxDrawBuffers - 1] with gl_FragData[0]. >-// If gl_FragColor is in outputVariables, it is replaced by gl_FragData. >-void EmulateGLFragColorBroadcast(TIntermBlock *root, >- int maxDrawBuffers, >- std::vector<OutputVariable> *outputVariables, >- TSymbolTable *symbolTable, >- int shaderVersion); >-} >- >-#endif // COMPILER_TRANSLATOR_EMULATEGLFRAGCOLORBROADCAST_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/EmulatePrecision.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/EmulatePrecision.cpp >deleted file mode 100644 >index ba09fd77dff..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/EmulatePrecision.cpp >+++ /dev/null >@@ -1,751 +0,0 @@ >-// >-// Copyright (c) 2002-2014 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. >-// >- >-#include "compiler/translator/EmulatePrecision.h" >- >-#include <memory> >- >-namespace sh >-{ >- >-namespace >-{ >- >-class RoundingHelperWriter : angle::NonCopyable >-{ >- public: >- static RoundingHelperWriter *createHelperWriter(const ShShaderOutput outputLanguage); >- >- void writeCommonRoundingHelpers(TInfoSinkBase &sink, const int shaderVersion); >- void writeCompoundAssignmentHelper(TInfoSinkBase &sink, >- const char *lType, >- const char *rType, >- const char *opStr, >- const char *opNameStr); >- >- virtual ~RoundingHelperWriter() {} >- >- protected: >- RoundingHelperWriter(const ShShaderOutput outputLanguage) : mOutputLanguage(outputLanguage) {} >- RoundingHelperWriter() = delete; >- >- const ShShaderOutput mOutputLanguage; >- >- private: >- virtual std::string getTypeString(const char *glslType) = 0; >- virtual void writeFloatRoundingHelpers(TInfoSinkBase &sink) = 0; >- virtual void writeVectorRoundingHelpers(TInfoSinkBase &sink, const unsigned int size) = 0; >- virtual void writeMatrixRoundingHelper(TInfoSinkBase &sink, >- const unsigned int columns, >- const unsigned int rows, >- const char *functionName) = 0; >-}; >- >-class RoundingHelperWriterGLSL : public RoundingHelperWriter >-{ >- public: >- RoundingHelperWriterGLSL(const ShShaderOutput outputLanguage) >- : RoundingHelperWriter(outputLanguage) >- { >- } >- >- private: >- std::string getTypeString(const char *glslType) override; >- void writeFloatRoundingHelpers(TInfoSinkBase &sink) override; >- void writeVectorRoundingHelpers(TInfoSinkBase &sink, const unsigned int size) override; >- void writeMatrixRoundingHelper(TInfoSinkBase &sink, >- const unsigned int columns, >- const unsigned int rows, >- const char *functionName) override; >-}; >- >-class RoundingHelperWriterESSL : public RoundingHelperWriterGLSL >-{ >- public: >- RoundingHelperWriterESSL(const ShShaderOutput outputLanguage) >- : RoundingHelperWriterGLSL(outputLanguage) >- { >- } >- >- private: >- std::string getTypeString(const char *glslType) override; >-}; >- >-class RoundingHelperWriterHLSL : public RoundingHelperWriter >-{ >- public: >- RoundingHelperWriterHLSL(const ShShaderOutput outputLanguage) >- : RoundingHelperWriter(outputLanguage) >- { >- } >- >- private: >- std::string getTypeString(const char *glslType) override; >- void writeFloatRoundingHelpers(TInfoSinkBase &sink) override; >- void writeVectorRoundingHelpers(TInfoSinkBase &sink, const unsigned int size) override; >- void writeMatrixRoundingHelper(TInfoSinkBase &sink, >- const unsigned int columns, >- const unsigned int rows, >- const char *functionName) override; >-}; >- >-RoundingHelperWriter *RoundingHelperWriter::createHelperWriter(const ShShaderOutput outputLanguage) >-{ >- ASSERT(EmulatePrecision::SupportedInLanguage(outputLanguage)); >- switch (outputLanguage) >- { >- case SH_HLSL_4_1_OUTPUT: >- return new RoundingHelperWriterHLSL(outputLanguage); >- case SH_ESSL_OUTPUT: >- return new RoundingHelperWriterESSL(outputLanguage); >- default: >- return new RoundingHelperWriterGLSL(outputLanguage); >- } >-} >- >-void RoundingHelperWriter::writeCommonRoundingHelpers(TInfoSinkBase &sink, const int shaderVersion) >-{ >- // Write the angle_frm functions that round floating point numbers to >- // half precision, and angle_frl functions that round them to minimum lowp >- // precision. >- >- writeFloatRoundingHelpers(sink); >- writeVectorRoundingHelpers(sink, 2); >- writeVectorRoundingHelpers(sink, 3); >- writeVectorRoundingHelpers(sink, 4); >- if (shaderVersion > 100) >- { >- for (unsigned int columns = 2; columns <= 4; ++columns) >- { >- for (unsigned int rows = 2; rows <= 4; ++rows) >- { >- writeMatrixRoundingHelper(sink, columns, rows, "angle_frm"); >- writeMatrixRoundingHelper(sink, columns, rows, "angle_frl"); >- } >- } >- } >- else >- { >- for (unsigned int size = 2; size <= 4; ++size) >- { >- writeMatrixRoundingHelper(sink, size, size, "angle_frm"); >- writeMatrixRoundingHelper(sink, size, size, "angle_frl"); >- } >- } >-} >- >-void RoundingHelperWriter::writeCompoundAssignmentHelper(TInfoSinkBase &sink, >- const char *lType, >- const char *rType, >- const char *opStr, >- const char *opNameStr) >-{ >- std::string lTypeStr = getTypeString(lType); >- std::string rTypeStr = getTypeString(rType); >- >- // Note that y should be passed through angle_frm at the function call site, >- // but x can't be passed through angle_frm there since it is an inout parameter. >- // So only pass x and the result through angle_frm here. >- // clang-format off >- sink << >- lTypeStr << " angle_compound_" << opNameStr << "_frm(inout " << lTypeStr << " x, in " << rTypeStr << " y) {\n" >- " x = angle_frm(angle_frm(x) " << opStr << " y);\n" >- " return x;\n" >- "}\n"; >- sink << >- lTypeStr << " angle_compound_" << opNameStr << "_frl(inout " << lTypeStr << " x, in " << rTypeStr << " y) {\n" >- " x = angle_frl(angle_frl(x) " << opStr << " y);\n" >- " return x;\n" >- "}\n"; >- // clang-format on >-} >- >-std::string RoundingHelperWriterGLSL::getTypeString(const char *glslType) >-{ >- return glslType; >-} >- >-std::string RoundingHelperWriterESSL::getTypeString(const char *glslType) >-{ >- std::stringstream typeStrStr; >- typeStrStr << "highp " << glslType; >- return typeStrStr.str(); >-} >- >-void RoundingHelperWriterGLSL::writeFloatRoundingHelpers(TInfoSinkBase &sink) >-{ >- // Unoptimized version of angle_frm for single floats: >- // >- // int webgl_maxNormalExponent(in int exponentBits) >- // { >- // int possibleExponents = int(exp2(float(exponentBits))); >- // int exponentBias = possibleExponents / 2 - 1; >- // int allExponentBitsOne = possibleExponents - 1; >- // return (allExponentBitsOne - 1) - exponentBias; >- // } >- // >- // float angle_frm(in float x) >- // { >- // int mantissaBits = 10; >- // int exponentBits = 5; >- // float possibleMantissas = exp2(float(mantissaBits)); >- // float mantissaMax = 2.0 - 1.0 / possibleMantissas; >- // int maxNE = webgl_maxNormalExponent(exponentBits); >- // float max = exp2(float(maxNE)) * mantissaMax; >- // if (x > max) >- // { >- // return max; >- // } >- // if (x < -max) >- // { >- // return -max; >- // } >- // float exponent = floor(log2(abs(x))); >- // if (abs(x) == 0.0 || exponent < -float(maxNE)) >- // { >- // return 0.0 * sign(x) >- // } >- // x = x * exp2(-(exponent - float(mantissaBits))); >- // x = sign(x) * floor(abs(x)); >- // return x * exp2(exponent - float(mantissaBits)); >- // } >- >- // All numbers with a magnitude less than 2^-15 are subnormal, and are >- // flushed to zero. >- >- // Note the constant numbers below: >- // a) 65504 is the maximum possible mantissa (1.1111111111 in binary) times >- // 2^15, the maximum normal exponent. >- // b) 10.0 is the number of mantissa bits. >- // c) -25.0 is the minimum normal half-float exponent -15.0 minus the number >- // of mantissa bits. >- // d) + 1e-30 is to make sure the argument of log2() won't be zero. It can >- // only affect the result of log2 on x where abs(x) < 1e-22. Since these >- // numbers will be flushed to zero either way (2^-15 is the smallest >- // normal positive number), this does not introduce any error. >- >- std::string floatType = getTypeString("float"); >- >- // clang-format off >- sink << >- floatType << " angle_frm(in " << floatType << " x) {\n" >- " x = clamp(x, -65504.0, 65504.0);\n" >- " " << floatType << " exponent = floor(log2(abs(x) + 1e-30)) - 10.0;\n" >- " bool isNonZero = (exponent >= -25.0);\n" >- " x = x * exp2(-exponent);\n" >- " x = sign(x) * floor(abs(x));\n" >- " return x * exp2(exponent) * float(isNonZero);\n" >- "}\n"; >- >- sink << >- floatType << " angle_frl(in " << floatType << " x) {\n" >- " x = clamp(x, -2.0, 2.0);\n" >- " x = x * 256.0;\n" >- " x = sign(x) * floor(abs(x));\n" >- " return x * 0.00390625;\n" >- "}\n"; >- // clang-format on >-} >- >-void RoundingHelperWriterGLSL::writeVectorRoundingHelpers(TInfoSinkBase &sink, >- const unsigned int size) >-{ >- std::stringstream vecTypeStrStr; >- vecTypeStrStr << "vec" << size; >- std::string vecType = getTypeString(vecTypeStrStr.str().c_str()); >- >- // clang-format off >- sink << >- vecType << " angle_frm(in " << vecType << " v) {\n" >- " v = clamp(v, -65504.0, 65504.0);\n" >- " " << vecType << " exponent = floor(log2(abs(v) + 1e-30)) - 10.0;\n" >- " bvec" << size << " isNonZero = greaterThanEqual(exponent, vec" << size << "(-25.0));\n" >- " v = v * exp2(-exponent);\n" >- " v = sign(v) * floor(abs(v));\n" >- " return v * exp2(exponent) * vec" << size << "(isNonZero);\n" >- "}\n"; >- >- sink << >- vecType << " angle_frl(in " << vecType << " v) {\n" >- " v = clamp(v, -2.0, 2.0);\n" >- " v = v * 256.0;\n" >- " v = sign(v) * floor(abs(v));\n" >- " return v * 0.00390625;\n" >- "}\n"; >- // clang-format on >-} >- >-void RoundingHelperWriterGLSL::writeMatrixRoundingHelper(TInfoSinkBase &sink, >- const unsigned int columns, >- const unsigned int rows, >- const char *functionName) >-{ >- std::stringstream matTypeStrStr; >- matTypeStrStr << "mat" << columns; >- if (rows != columns) >- { >- matTypeStrStr << "x" << rows; >- } >- std::string matType = getTypeString(matTypeStrStr.str().c_str()); >- >- sink << matType << " " << functionName << "(in " << matType << " m) {\n" >- << " " << matType << " rounded;\n"; >- >- for (unsigned int i = 0; i < columns; ++i) >- { >- sink << " rounded[" << i << "] = " << functionName << "(m[" << i << "]);\n"; >- } >- >- sink << " return rounded;\n" >- "}\n"; >-} >- >-static const char *GetHLSLTypeStr(const char *floatTypeStr) >-{ >- if (strcmp(floatTypeStr, "float") == 0) >- { >- return "float"; >- } >- if (strcmp(floatTypeStr, "vec2") == 0) >- { >- return "float2"; >- } >- if (strcmp(floatTypeStr, "vec3") == 0) >- { >- return "float3"; >- } >- if (strcmp(floatTypeStr, "vec4") == 0) >- { >- return "float4"; >- } >- if (strcmp(floatTypeStr, "mat2") == 0) >- { >- return "float2x2"; >- } >- if (strcmp(floatTypeStr, "mat3") == 0) >- { >- return "float3x3"; >- } >- if (strcmp(floatTypeStr, "mat4") == 0) >- { >- return "float4x4"; >- } >- if (strcmp(floatTypeStr, "mat2x3") == 0) >- { >- return "float2x3"; >- } >- if (strcmp(floatTypeStr, "mat2x4") == 0) >- { >- return "float2x4"; >- } >- if (strcmp(floatTypeStr, "mat3x2") == 0) >- { >- return "float3x2"; >- } >- if (strcmp(floatTypeStr, "mat3x4") == 0) >- { >- return "float3x4"; >- } >- if (strcmp(floatTypeStr, "mat4x2") == 0) >- { >- return "float4x2"; >- } >- if (strcmp(floatTypeStr, "mat4x3") == 0) >- { >- return "float4x3"; >- } >- UNREACHABLE(); >- return nullptr; >-} >- >-std::string RoundingHelperWriterHLSL::getTypeString(const char *glslType) >-{ >- return GetHLSLTypeStr(glslType); >-} >- >-void RoundingHelperWriterHLSL::writeFloatRoundingHelpers(TInfoSinkBase &sink) >-{ >- // In HLSL scalars are the same as 1-vectors. >- writeVectorRoundingHelpers(sink, 1); >-} >- >-void RoundingHelperWriterHLSL::writeVectorRoundingHelpers(TInfoSinkBase &sink, >- const unsigned int size) >-{ >- std::stringstream vecTypeStrStr; >- vecTypeStrStr << "float" << size; >- std::string vecType = vecTypeStrStr.str(); >- >- // clang-format off >- sink << >- vecType << " angle_frm(" << vecType << " v) {\n" >- " v = clamp(v, -65504.0, 65504.0);\n" >- " " << vecType << " exponent = floor(log2(abs(v) + 1e-30)) - 10.0;\n" >- " bool" << size << " isNonZero = exponent < -25.0;\n" >- " v = v * exp2(-exponent);\n" >- " v = sign(v) * floor(abs(v));\n" >- " return v * exp2(exponent) * (float" << size << ")(isNonZero);\n" >- "}\n"; >- >- sink << >- vecType << " angle_frl(" << vecType << " v) {\n" >- " v = clamp(v, -2.0, 2.0);\n" >- " v = v * 256.0;\n" >- " v = sign(v) * floor(abs(v));\n" >- " return v * 0.00390625;\n" >- "}\n"; >- // clang-format on >-} >- >-void RoundingHelperWriterHLSL::writeMatrixRoundingHelper(TInfoSinkBase &sink, >- const unsigned int columns, >- const unsigned int rows, >- const char *functionName) >-{ >- std::stringstream matTypeStrStr; >- matTypeStrStr << "float" << columns << "x" << rows; >- std::string matType = matTypeStrStr.str(); >- >- sink << matType << " " << functionName << "(" << matType << " m) {\n" >- << " " << matType << " rounded;\n"; >- >- for (unsigned int i = 0; i < columns; ++i) >- { >- sink << " rounded[" << i << "] = " << functionName << "(m[" << i << "]);\n"; >- } >- >- sink << " return rounded;\n" >- "}\n"; >-} >- >-bool canRoundFloat(const TType &type) >-{ >- return type.getBasicType() == EbtFloat && !type.isArray() && >- (type.getPrecision() == EbpLow || type.getPrecision() == EbpMedium); >-} >- >-TIntermAggregate *createInternalFunctionCallNode(const TType &type, >- TString name, >- TIntermSequence *arguments) >-{ >- TName nameObj(name); >- nameObj.setInternal(true); >- TIntermAggregate *callNode = >- TIntermAggregate::Create(type, EOpCallInternalRawFunction, arguments); >- callNode->getFunctionSymbolInfo()->setNameObj(nameObj); >- return callNode; >-} >- >-TIntermAggregate *createRoundingFunctionCallNode(TIntermTyped *roundedChild) >-{ >- TString roundFunctionName; >- if (roundedChild->getPrecision() == EbpMedium) >- roundFunctionName = "angle_frm"; >- else >- roundFunctionName = "angle_frl"; >- TIntermSequence *arguments = new TIntermSequence(); >- arguments->push_back(roundedChild); >- TIntermAggregate *callNode = >- createInternalFunctionCallNode(roundedChild->getType(), roundFunctionName, arguments); >- callNode->getFunctionSymbolInfo()->setKnownToNotHaveSideEffects(true); >- return callNode; >-} >- >-TIntermAggregate *createCompoundAssignmentFunctionCallNode(TIntermTyped *left, >- TIntermTyped *right, >- const char *opNameStr) >-{ >- std::stringstream strstr; >- if (left->getPrecision() == EbpMedium) >- strstr << "angle_compound_" << opNameStr << "_frm"; >- else >- strstr << "angle_compound_" << opNameStr << "_frl"; >- TString functionName = strstr.str().c_str(); >- TIntermSequence *arguments = new TIntermSequence(); >- arguments->push_back(left); >- arguments->push_back(right); >- return createInternalFunctionCallNode(left->getType(), functionName, arguments); >-} >- >-bool ParentUsesResult(TIntermNode *parent, TIntermTyped *node) >-{ >- if (!parent) >- { >- return false; >- } >- >- TIntermBlock *blockParent = parent->getAsBlock(); >- // If the parent is a block, the result is not assigned anywhere, >- // so rounding it is not needed. In particular, this can avoid a lot of >- // unnecessary rounding of unused return values of assignment. >- if (blockParent) >- { >- return false; >- } >- TIntermBinary *binaryParent = parent->getAsBinaryNode(); >- if (binaryParent && binaryParent->getOp() == EOpComma && (binaryParent->getRight() != node)) >- { >- return false; >- } >- return true; >-} >- >-bool ParentConstructorTakesCareOfRounding(TIntermNode *parent, TIntermTyped *node) >-{ >- if (!parent) >- { >- return false; >- } >- TIntermAggregate *parentConstructor = parent->getAsAggregate(); >- if (!parentConstructor || parentConstructor->getOp() != EOpConstruct) >- { >- return false; >- } >- if (parentConstructor->getPrecision() != node->getPrecision()) >- { >- return false; >- } >- return canRoundFloat(parentConstructor->getType()); >-} >- >-} // namespace anonymous >- >-EmulatePrecision::EmulatePrecision(TSymbolTable *symbolTable, int shaderVersion) >- : TLValueTrackingTraverser(true, true, true, symbolTable, shaderVersion), >- mDeclaringVariables(false) >-{ >-} >- >-void EmulatePrecision::visitSymbol(TIntermSymbol *node) >-{ >- TIntermNode *parent = getParentNode(); >- if (canRoundFloat(node->getType()) && ParentUsesResult(parent, node) && >- !ParentConstructorTakesCareOfRounding(parent, node) && !mDeclaringVariables && >- !isLValueRequiredHere()) >- { >- TIntermNode *replacement = createRoundingFunctionCallNode(node); >- queueReplacement(replacement, OriginalNode::BECOMES_CHILD); >- } >-} >- >-bool EmulatePrecision::visitBinary(Visit visit, TIntermBinary *node) >-{ >- bool visitChildren = true; >- >- TOperator op = node->getOp(); >- >- // RHS of initialize is not being declared. >- if (op == EOpInitialize && visit == InVisit) >- mDeclaringVariables = false; >- >- if ((op == EOpIndexDirectStruct) && visit == InVisit) >- visitChildren = false; >- >- if (visit != PreVisit) >- return visitChildren; >- >- const TType &type = node->getType(); >- bool roundFloat = canRoundFloat(type); >- >- if (roundFloat) >- { >- switch (op) >- { >- // Math operators that can result in a float may need to apply rounding to the return >- // value. Note that in the case of assignment, the rounding is applied to its return >- // value here, not the value being assigned. >- case EOpAssign: >- case EOpAdd: >- case EOpSub: >- case EOpMul: >- case EOpDiv: >- case EOpVectorTimesScalar: >- case EOpVectorTimesMatrix: >- case EOpMatrixTimesVector: >- case EOpMatrixTimesScalar: >- case EOpMatrixTimesMatrix: >- { >- TIntermNode *parent = getParentNode(); >- if (!ParentUsesResult(parent, node) || >- ParentConstructorTakesCareOfRounding(parent, node)) >- { >- break; >- } >- TIntermNode *replacement = createRoundingFunctionCallNode(node); >- queueReplacement(replacement, OriginalNode::BECOMES_CHILD); >- break; >- } >- >- // Compound assignment cases need to replace the operator with a function call. >- case EOpAddAssign: >- { >- mEmulateCompoundAdd.insert( >- TypePair(type.getBuiltInTypeNameString(), >- node->getRight()->getType().getBuiltInTypeNameString())); >- TIntermNode *replacement = createCompoundAssignmentFunctionCallNode( >- node->getLeft(), node->getRight(), "add"); >- queueReplacement(replacement, OriginalNode::IS_DROPPED); >- break; >- } >- case EOpSubAssign: >- { >- mEmulateCompoundSub.insert( >- TypePair(type.getBuiltInTypeNameString(), >- node->getRight()->getType().getBuiltInTypeNameString())); >- TIntermNode *replacement = createCompoundAssignmentFunctionCallNode( >- node->getLeft(), node->getRight(), "sub"); >- queueReplacement(replacement, OriginalNode::IS_DROPPED); >- break; >- } >- case EOpMulAssign: >- case EOpVectorTimesMatrixAssign: >- case EOpVectorTimesScalarAssign: >- case EOpMatrixTimesScalarAssign: >- case EOpMatrixTimesMatrixAssign: >- { >- mEmulateCompoundMul.insert( >- TypePair(type.getBuiltInTypeNameString(), >- node->getRight()->getType().getBuiltInTypeNameString())); >- TIntermNode *replacement = createCompoundAssignmentFunctionCallNode( >- node->getLeft(), node->getRight(), "mul"); >- queueReplacement(replacement, OriginalNode::IS_DROPPED); >- break; >- } >- case EOpDivAssign: >- { >- mEmulateCompoundDiv.insert( >- TypePair(type.getBuiltInTypeNameString(), >- node->getRight()->getType().getBuiltInTypeNameString())); >- TIntermNode *replacement = createCompoundAssignmentFunctionCallNode( >- node->getLeft(), node->getRight(), "div"); >- queueReplacement(replacement, OriginalNode::IS_DROPPED); >- break; >- } >- default: >- // The rest of the binary operations should not need precision emulation. >- break; >- } >- } >- return visitChildren; >-} >- >-bool EmulatePrecision::visitDeclaration(Visit visit, TIntermDeclaration *node) >-{ >- // Variable or interface block declaration. >- if (visit == PreVisit) >- { >- mDeclaringVariables = true; >- } >- else if (visit == InVisit) >- { >- mDeclaringVariables = true; >- } >- else >- { >- mDeclaringVariables = false; >- } >- return true; >-} >- >-bool EmulatePrecision::visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) >-{ >- return false; >-} >- >-bool EmulatePrecision::visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) >-{ >- return false; >-} >- >-bool EmulatePrecision::visitAggregate(Visit visit, TIntermAggregate *node) >-{ >- if (visit != PreVisit) >- return true; >- switch (node->getOp()) >- { >- case EOpCallInternalRawFunction: >- case EOpCallFunctionInAST: >- // User-defined function return values are not rounded. The calculations that produced >- // the value inside the function definition should have been rounded. >- break; >- case EOpConstruct: >- if (node->getBasicType() == EbtStruct) >- { >- break; >- } >- default: >- TIntermNode *parent = getParentNode(); >- if (canRoundFloat(node->getType()) && ParentUsesResult(parent, node) && >- !ParentConstructorTakesCareOfRounding(parent, node)) >- { >- TIntermNode *replacement = createRoundingFunctionCallNode(node); >- queueReplacement(replacement, OriginalNode::BECOMES_CHILD); >- } >- break; >- } >- return true; >-} >- >-bool EmulatePrecision::visitUnary(Visit visit, TIntermUnary *node) >-{ >- switch (node->getOp()) >- { >- case EOpNegative: >- case EOpLogicalNot: >- case EOpPostIncrement: >- case EOpPostDecrement: >- case EOpPreIncrement: >- case EOpPreDecrement: >- case EOpLogicalNotComponentWise: >- break; >- default: >- if (canRoundFloat(node->getType()) && visit == PreVisit) >- { >- TIntermNode *replacement = createRoundingFunctionCallNode(node); >- queueReplacement(replacement, OriginalNode::BECOMES_CHILD); >- } >- break; >- } >- >- return true; >-} >- >-void EmulatePrecision::writeEmulationHelpers(TInfoSinkBase &sink, >- const int shaderVersion, >- const ShShaderOutput outputLanguage) >-{ >- std::unique_ptr<RoundingHelperWriter> roundingHelperWriter( >- RoundingHelperWriter::createHelperWriter(outputLanguage)); >- >- roundingHelperWriter->writeCommonRoundingHelpers(sink, shaderVersion); >- >- EmulationSet::const_iterator it; >- for (it = mEmulateCompoundAdd.begin(); it != mEmulateCompoundAdd.end(); it++) >- roundingHelperWriter->writeCompoundAssignmentHelper(sink, it->lType, it->rType, "+", "add"); >- for (it = mEmulateCompoundSub.begin(); it != mEmulateCompoundSub.end(); it++) >- roundingHelperWriter->writeCompoundAssignmentHelper(sink, it->lType, it->rType, "-", "sub"); >- for (it = mEmulateCompoundDiv.begin(); it != mEmulateCompoundDiv.end(); it++) >- roundingHelperWriter->writeCompoundAssignmentHelper(sink, it->lType, it->rType, "/", "div"); >- for (it = mEmulateCompoundMul.begin(); it != mEmulateCompoundMul.end(); it++) >- roundingHelperWriter->writeCompoundAssignmentHelper(sink, it->lType, it->rType, "*", "mul"); >-} >- >-// static >-bool EmulatePrecision::SupportedInLanguage(const ShShaderOutput outputLanguage) >-{ >- switch (outputLanguage) >- { >- case SH_HLSL_4_1_OUTPUT: >- case SH_ESSL_OUTPUT: >- return true; >- default: >- // Other languages not yet supported >- return (outputLanguage == SH_GLSL_COMPATIBILITY_OUTPUT || >- sh::IsGLSL130OrNewer(outputLanguage)); >- } >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/EmulatePrecision.h b/Source/ThirdParty/ANGLE/src/compiler/translator/EmulatePrecision.h >deleted file mode 100644 >index 80444654102..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/EmulatePrecision.h >+++ /dev/null >@@ -1,73 +0,0 @@ >-// >-// Copyright (c) 2002-2014 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. >-// >- >-#ifndef COMPILER_TRANSLATOR_EMULATE_PRECISION_H_ >-#define COMPILER_TRANSLATOR_EMULATE_PRECISION_H_ >- >-#include "GLSLANG/ShaderLang.h" >-#include "common/angleutils.h" >-#include "compiler/translator/Compiler.h" >-#include "compiler/translator/InfoSink.h" >-#include "compiler/translator/IntermTraverse.h" >- >-// This class gathers all compound assignments from the AST and can then write >-// the functions required for their precision emulation. This way there is no >-// need to write a huge number of variations of the emulated compound assignment >-// to every translated shader with emulation enabled. >- >-namespace sh >-{ >- >-class EmulatePrecision : public TLValueTrackingTraverser >-{ >- public: >- EmulatePrecision(TSymbolTable *symbolTable, int shaderVersion); >- >- void visitSymbol(TIntermSymbol *node) override; >- bool visitBinary(Visit visit, TIntermBinary *node) override; >- bool visitUnary(Visit visit, TIntermUnary *node) override; >- bool visitAggregate(Visit visit, TIntermAggregate *node) override; >- bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) override; >- bool visitDeclaration(Visit visit, TIntermDeclaration *node) override; >- bool visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) override; >- >- void writeEmulationHelpers(TInfoSinkBase &sink, >- const int shaderVersion, >- const ShShaderOutput outputLanguage); >- >- static bool SupportedInLanguage(const ShShaderOutput outputLanguage); >- >- private: >- struct TypePair >- { >- TypePair(const char *l, const char *r) : lType(l), rType(r) {} >- >- const char *lType; >- const char *rType; >- }; >- >- struct TypePairComparator >- { >- bool operator()(const TypePair &l, const TypePair &r) const >- { >- if (l.lType == r.lType) >- return l.rType < r.rType; >- return l.lType < r.lType; >- } >- }; >- >- typedef std::set<TypePair, TypePairComparator> EmulationSet; >- EmulationSet mEmulateCompoundAdd; >- EmulationSet mEmulateCompoundSub; >- EmulationSet mEmulateCompoundMul; >- EmulationSet mEmulateCompoundDiv; >- >- bool mDeclaringVariables; >-}; >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_EMULATE_PRECISION_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ExpandIntegerPowExpressions.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ExpandIntegerPowExpressions.cpp >deleted file mode 100644 >index f17dd73657b..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ExpandIntegerPowExpressions.cpp >+++ /dev/null >@@ -1,153 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >-// Implementation of the integer pow expressions HLSL bug workaround. >-// See header for more info. >- >-#include "compiler/translator/ExpandIntegerPowExpressions.h" >- >-#include <cmath> >-#include <cstdlib> >- >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class Traverser : public TIntermTraverser >-{ >- public: >- static void Apply(TIntermNode *root, TSymbolTable *symbolTable); >- >- private: >- Traverser(TSymbolTable *symbolTable); >- bool visitAggregate(Visit visit, TIntermAggregate *node) override; >- void nextIteration(); >- >- bool mFound = false; >-}; >- >-// static >-void Traverser::Apply(TIntermNode *root, TSymbolTable *symbolTable) >-{ >- Traverser traverser(symbolTable); >- do >- { >- traverser.nextIteration(); >- root->traverse(&traverser); >- if (traverser.mFound) >- { >- traverser.updateTree(); >- } >- } while (traverser.mFound); >-} >- >-Traverser::Traverser(TSymbolTable *symbolTable) : TIntermTraverser(true, false, false, symbolTable) >-{ >-} >- >-void Traverser::nextIteration() >-{ >- mFound = false; >- nextTemporaryId(); >-} >- >-bool Traverser::visitAggregate(Visit visit, TIntermAggregate *node) >-{ >- if (mFound) >- { >- return false; >- } >- >- // Test 0: skip non-pow operators. >- if (node->getOp() != EOpPow) >- { >- return true; >- } >- >- const TIntermSequence *sequence = node->getSequence(); >- ASSERT(sequence->size() == 2u); >- const TIntermConstantUnion *constantNode = sequence->at(1)->getAsConstantUnion(); >- >- // Test 1: check for a single constant. >- if (!constantNode || constantNode->getNominalSize() != 1) >- { >- return true; >- } >- >- const TConstantUnion *constant = constantNode->getUnionArrayPointer(); >- >- TConstantUnion asFloat; >- asFloat.cast(EbtFloat, *constant); >- >- float value = asFloat.getFConst(); >- >- // Test 2: value is in the problematic range. >- if (value < -5.0f || value > 9.0f) >- { >- return true; >- } >- >- // Test 3: value is integer or pretty close to an integer. >- float absval = std::abs(value); >- float frac = absval - std::round(absval); >- if (frac > 0.0001f) >- { >- return true; >- } >- >- // Test 4: skip -1, 0, and 1 >- int exponent = static_cast<int>(value); >- int n = std::abs(exponent); >- if (n < 2) >- { >- return true; >- } >- >- // Potential problem case detected, apply workaround. >- nextTemporaryId(); >- >- TIntermTyped *lhs = sequence->at(0)->getAsTyped(); >- ASSERT(lhs); >- >- TIntermDeclaration *init = createTempInitDeclaration(lhs); >- TIntermTyped *current = createTempSymbol(lhs->getType()); >- >- insertStatementInParentBlock(init); >- >- // Create a chain of n-1 multiples. >- for (int i = 1; i < n; ++i) >- { >- TIntermBinary *mul = new TIntermBinary(EOpMul, current, createTempSymbol(lhs->getType())); >- mul->setLine(node->getLine()); >- current = mul; >- } >- >- // For negative pow, compute the reciprocal of the positive pow. >- if (exponent < 0) >- { >- TConstantUnion *oneVal = new TConstantUnion(); >- oneVal->setFConst(1.0f); >- TIntermConstantUnion *oneNode = new TIntermConstantUnion(oneVal, node->getType()); >- TIntermBinary *div = new TIntermBinary(EOpDiv, oneNode, current); >- current = div; >- } >- >- queueReplacement(current, OriginalNode::IS_DROPPED); >- mFound = true; >- return false; >-} >- >-} // anonymous namespace >- >-void ExpandIntegerPowExpressions(TIntermNode *root, TSymbolTable *symbolTable) >-{ >- Traverser::Apply(root, symbolTable); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ExpandIntegerPowExpressions.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ExpandIntegerPowExpressions.h >deleted file mode 100644 >index 0074e5d6635..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ExpandIntegerPowExpressions.h >+++ /dev/null >@@ -1,29 +0,0 @@ >-// >-// Copyright (c) 2016 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 mutating tree traversal works around a bug in the HLSL compiler optimizer with "pow" that >-// manifests under the following conditions: >-// >-// - If pow() has a literal exponent value >-// - ... and this value is integer or within 10e-6 of an integer >-// - ... and it is in {-4, -3, -2, 2, 3, 4, 5, 6, 7, 8} >-// >-// The workaround is to replace the pow with a series of multiplies. >-// See http://anglebug.com/851 >- >-#ifndef COMPILER_TRANSLATOR_EXPANDINTEGERPOWEXPRESSIONS_H_ >-#define COMPILER_TRANSLATOR_EXPANDINTEGERPOWEXPRESSIONS_H_ >- >-namespace sh >-{ >- >-class TIntermNode; >-class TSymbolTable; >- >-void ExpandIntegerPowExpressions(TIntermNode *root, TSymbolTable *symbolTable); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_EXPANDINTEGERPOWEXPRESSIONS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.cpp >index 3f910b90500..e6028193986 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.cpp >@@ -12,23 +12,25 @@ > > #include <string.h> > >-#define LIST_EXTENSIONS(OP) \ >- OP(ARB_texture_rectangle) \ >- OP(ARM_shader_framebuffer_fetch) \ >- OP(EXT_blend_func_extended) \ >- OP(EXT_draw_buffers) \ >- OP(EXT_frag_depth) \ >- OP(EXT_geometry_shader) \ >- OP(EXT_shader_framebuffer_fetch) \ >- OP(EXT_shader_texture_lod) \ >- OP(EXT_YUV_target) \ >- OP(NV_EGL_stream_consumer_external) \ >- OP(NV_shader_framebuffer_fetch) \ >- OP(OES_EGL_image_external) \ >- OP(OES_EGL_image_external_essl3) \ >- OP(OES_geometry_shader) \ >- OP(OES_standard_derivatives) \ >- OP(OVR_multiview) >+#define LIST_EXTENSIONS(OP) \ >+ OP(ARB_texture_rectangle) \ >+ OP(ANGLE_texture_multisample) \ >+ OP(ARM_shader_framebuffer_fetch) \ >+ OP(EXT_blend_func_extended) \ >+ OP(EXT_draw_buffers) \ >+ OP(EXT_frag_depth) \ >+ OP(EXT_geometry_shader) \ >+ OP(EXT_shader_framebuffer_fetch) \ >+ OP(EXT_shader_texture_lod) \ >+ OP(EXT_YUV_target) \ >+ OP(NV_EGL_stream_consumer_external) \ >+ OP(NV_shader_framebuffer_fetch) \ >+ OP(OES_EGL_image_external) \ >+ OP(OES_EGL_image_external_essl3) \ >+ OP(OES_standard_derivatives) \ >+ OP(OES_texture_storage_multisample_2d_array) \ >+ OP(OVR_multiview2) \ >+ OP(ANGLE_multi_draw) > > namespace sh > { >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.h >index 09cc03f10f0..161cc664775 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.h >@@ -19,6 +19,7 @@ enum class TExtension > UNDEFINED, // Special value used to indicate no extension. > > ARB_texture_rectangle, >+ ANGLE_texture_multisample, > ARM_shader_framebuffer_fetch, > EXT_blend_func_extended, > EXT_draw_buffers, >@@ -31,9 +32,10 @@ enum class TExtension > NV_shader_framebuffer_fetch, > OES_EGL_image_external, > OES_EGL_image_external_essl3, >- OES_geometry_shader, > OES_standard_derivatives, >- OVR_multiview >+ OES_texture_storage_multisample_2d_array, >+ OVR_multiview2, >+ ANGLE_multi_draw, > }; > > enum TBehavior >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.cpp >index 5b5dc580e9a..8a7aca95f2c 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.cpp >@@ -15,8 +15,7 @@ namespace sh > > TExtensionGLSL::TExtensionGLSL(ShShaderOutput output) > : TIntermTraverser(true, false, false), mTargetVersion(ShaderOutputTypeToGLSLVersion(output)) >-{ >-} >+{} > > const std::set<std::string> &TExtensionGLSL::getEnabledExtensions() const > { >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.h >index a1b9cb2225d..9d752c4eaf9 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.h >@@ -12,7 +12,7 @@ > #include <set> > #include <string> > >-#include "compiler/translator/IntermTraverse.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > > namespace sh > { >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/FindMain.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/FindMain.cpp >deleted file mode 100644 >index 7417fbac8ae..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/FindMain.cpp >+++ /dev/null >@@ -1,38 +0,0 @@ >-// >-// Copyright (c) 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. >-// >- >-// FindMain.cpp: Find the main() function definition in a given AST. >- >-#include "compiler/translator/FindMain.h" >- >-#include "compiler/translator/IntermNode.h" >- >-namespace sh >-{ >- >-TIntermFunctionDefinition *FindMain(TIntermBlock *root) >-{ >- for (TIntermNode *node : *root->getSequence()) >- { >- TIntermFunctionDefinition *nodeFunction = node->getAsFunctionDefinition(); >- if (nodeFunction != nullptr && nodeFunction->getFunctionSymbolInfo()->isMain()) >- { >- return nodeFunction; >- } >- } >- return nullptr; >-} >- >-TIntermBlock *FindMainBody(TIntermBlock *root) >-{ >- TIntermFunctionDefinition *main = FindMain(root); >- ASSERT(main != nullptr); >- TIntermBlock *mainBody = main->getBody(); >- ASSERT(mainBody != nullptr); >- return mainBody; >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/FindMain.h b/Source/ThirdParty/ANGLE/src/compiler/translator/FindMain.h >deleted file mode 100644 >index bf2c45d871e..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/FindMain.h >+++ /dev/null >@@ -1,23 +0,0 @@ >-// >-// Copyright (c) 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. >-// >- >-// FindMain.h: Adds functions to get the main function definition and its body. >- >-#ifndef COMPILER_TRANSLATOR_FINDMAIN_H_ >-#define COMPILER_TRANSLATOR_FINDMAIN_H_ >- >-namespace sh >-{ >- >-class TIntermBlock; >-class TIntermFunctionDefinition; >- >-TIntermFunctionDefinition *FindMain(TIntermBlock *root); >-TIntermBlock *FindMainBody(TIntermBlock *root); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_FINDMAIN_H_ >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/FindSymbolNode.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/FindSymbolNode.cpp >deleted file mode 100644 >index a2a10f128d6..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/FindSymbolNode.cpp >+++ /dev/null >@@ -1,58 +0,0 @@ >-// >-// Copyright (c) 2015 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. >-// >-// FindSymbol.cpp: >-// Utility for finding a symbol node inside an AST tree. >- >-#include "compiler/translator/FindSymbolNode.h" >- >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class SymbolFinder : public TIntermTraverser >-{ >- public: >- SymbolFinder(const TString &symbolName, TBasicType basicType) >- : TIntermTraverser(true, false, false), >- mSymbolName(symbolName), >- mNodeFound(nullptr), >- mBasicType(basicType) >- { >- } >- >- void visitSymbol(TIntermSymbol *node) >- { >- if (node->getBasicType() == mBasicType && node->getSymbol() == mSymbolName) >- { >- mNodeFound = node; >- } >- } >- >- bool isFound() const { return mNodeFound != nullptr; } >- const TIntermSymbol *getNode() const { return mNodeFound; } >- >- private: >- TString mSymbolName; >- TIntermSymbol *mNodeFound; >- TBasicType mBasicType; >-}; >- >-} // anonymous namespace >- >-const TIntermSymbol *FindSymbolNode(TIntermNode *root, >- const TString &symbolName, >- TBasicType basicType) >-{ >- SymbolFinder finder(symbolName, basicType); >- root->traverse(&finder); >- return finder.getNode(); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/FindSymbolNode.h b/Source/ThirdParty/ANGLE/src/compiler/translator/FindSymbolNode.h >deleted file mode 100644 >index 08dfb9a2224..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/FindSymbolNode.h >+++ /dev/null >@@ -1,27 +0,0 @@ >-// >-// Copyright (c) 2015 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. >-// >-// FindSymbolNode.h: >-// Utility for finding a symbol node inside an AST tree. >- >-#ifndef COMPILER_TRANSLATOR_FIND_SYMBOL_H_ >-#define COMPILER_TRANSLATOR_FIND_SYMBOL_H_ >- >-#include "compiler/translator/BaseTypes.h" >-#include "compiler/translator/Common.h" >- >-namespace sh >-{ >- >-class TIntermNode; >-class TIntermSymbol; >- >-const TIntermSymbol *FindSymbolNode(TIntermNode *root, >- const TString &symbolName, >- TBasicType basicType); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_FIND_SYMBOL_H_ >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/FlagStd140Structs.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/FlagStd140Structs.cpp >index fba837f55c7..368854f0682 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/FlagStd140Structs.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/FlagStd140Structs.cpp >@@ -8,7 +8,8 @@ > > #include "compiler/translator/FlagStd140Structs.h" > >-#include "compiler/translator/IntermTraverse.h" >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > > namespace sh > { >@@ -27,13 +28,13 @@ class FlagStd140StructsTraverser : public TIntermTraverser > bool visitDeclaration(Visit visit, TIntermDeclaration *node) override; > > private: >- void mapBlockStructMembers(TIntermSymbol *blockDeclarator, TInterfaceBlock *block); >+ void mapBlockStructMembers(TIntermSymbol *blockDeclarator, const TInterfaceBlock *block); > > std::vector<MappedStruct> mMappedStructs; > }; > > void FlagStd140StructsTraverser::mapBlockStructMembers(TIntermSymbol *blockDeclarator, >- TInterfaceBlock *block) >+ const TInterfaceBlock *block) > { > for (auto *field : block->fields()) > { >@@ -52,7 +53,7 @@ bool FlagStd140StructsTraverser::visitDeclaration(Visit visit, TIntermDeclaratio > TIntermTyped *declarator = node->getSequence()->back()->getAsTyped(); > if (declarator->getBasicType() == EbtInterfaceBlock) > { >- TInterfaceBlock *block = declarator->getType().getInterfaceBlock(); >+ const TInterfaceBlock *block = declarator->getType().getInterfaceBlock(); > if (block->blockStorage() == EbsStd140) > { > mapBlockStructMembers(declarator->getAsSymbolNode(), block); >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/FlagStd140Structs.h b/Source/ThirdParty/ANGLE/src/compiler/translator/FlagStd140Structs.h >index f548d8b6ed1..ce035d91850 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/FlagStd140Structs.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/FlagStd140Structs.h >@@ -25,6 +25,6 @@ struct MappedStruct > }; > > std::vector<MappedStruct> FlagStd140Structs(TIntermNode *node); >-} >+} // namespace sh > > #endif // COMPILER_TRANSLATOR_FLAGSTD140STRUCTS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/FunctionLookup.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/FunctionLookup.cpp >new file mode 100644 >index 00000000000..e49d2ace339 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/FunctionLookup.cpp >@@ -0,0 +1,103 @@ >+// >+// Copyright (c) 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. >+// >+// FunctionLookup.cpp: Used for storing function calls that have not yet been resolved during >+// parsing. >+// >+ >+#include "compiler/translator/FunctionLookup.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+const char kFunctionMangledNameSeparator = '('; >+ >+constexpr const ImmutableString kEmptyName(""); >+ >+} // anonymous namespace >+ >+TFunctionLookup::TFunctionLookup(const ImmutableString &name, >+ const TType *constructorType, >+ const TSymbol *symbol) >+ : mName(name), mConstructorType(constructorType), mThisNode(nullptr), mSymbol(symbol) >+{} >+ >+// static >+TFunctionLookup *TFunctionLookup::CreateConstructor(const TType *type) >+{ >+ ASSERT(type != nullptr); >+ return new TFunctionLookup(kEmptyName, type, nullptr); >+} >+ >+// static >+TFunctionLookup *TFunctionLookup::CreateFunctionCall(const ImmutableString &name, >+ const TSymbol *symbol) >+{ >+ ASSERT(name != ""); >+ return new TFunctionLookup(name, nullptr, symbol); >+} >+ >+const ImmutableString &TFunctionLookup::name() const >+{ >+ return mName; >+} >+ >+ImmutableString TFunctionLookup::getMangledName() const >+{ >+ return GetMangledName(mName.data(), mArguments); >+} >+ >+ImmutableString TFunctionLookup::GetMangledName(const char *functionName, >+ const TIntermSequence &arguments) >+{ >+ std::string newName(functionName); >+ newName += kFunctionMangledNameSeparator; >+ >+ for (TIntermNode *argument : arguments) >+ { >+ newName += argument->getAsTyped()->getType().getMangledName(); >+ } >+ return ImmutableString(newName); >+} >+ >+bool TFunctionLookup::isConstructor() const >+{ >+ return mConstructorType != nullptr; >+} >+ >+const TType &TFunctionLookup::constructorType() const >+{ >+ return *mConstructorType; >+} >+ >+void TFunctionLookup::setThisNode(TIntermTyped *thisNode) >+{ >+ mThisNode = thisNode; >+} >+ >+TIntermTyped *TFunctionLookup::thisNode() const >+{ >+ return mThisNode; >+} >+ >+void TFunctionLookup::addArgument(TIntermTyped *argument) >+{ >+ mArguments.push_back(argument); >+} >+ >+TIntermSequence &TFunctionLookup::arguments() >+{ >+ return mArguments; >+} >+ >+const TSymbol *TFunctionLookup::symbol() const >+{ >+ return mSymbol; >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/FunctionLookup.h b/Source/ThirdParty/ANGLE/src/compiler/translator/FunctionLookup.h >new file mode 100644 >index 00000000000..62b07f23a17 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/FunctionLookup.h >@@ -0,0 +1,59 @@ >+// >+// Copyright (c) 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. >+// >+// FunctionLookup.h: Used for storing function calls that have not yet been resolved during parsing. >+// >+ >+#ifndef COMPILER_TRANSLATOR_FUNCTIONLOOKUP_H_ >+#define COMPILER_TRANSLATOR_FUNCTIONLOOKUP_H_ >+ >+#include "compiler/translator/ImmutableString.h" >+#include "compiler/translator/IntermNode.h" >+ >+namespace sh >+{ >+ >+// A function look-up. >+class TFunctionLookup : angle::NonCopyable >+{ >+ public: >+ POOL_ALLOCATOR_NEW_DELETE >+ >+ static TFunctionLookup *CreateConstructor(const TType *type); >+ static TFunctionLookup *CreateFunctionCall(const ImmutableString &name, const TSymbol *symbol); >+ >+ const ImmutableString &name() const; >+ ImmutableString getMangledName() const; >+ static ImmutableString GetMangledName(const char *functionName, >+ const TIntermSequence &arguments); >+ >+ bool isConstructor() const; >+ const TType &constructorType() const; >+ >+ void setThisNode(TIntermTyped *thisNode); >+ TIntermTyped *thisNode() const; >+ >+ void addArgument(TIntermTyped *argument); >+ TIntermSequence &arguments(); >+ >+ // Symbol looked up in the lexical phase using only the name of the function. >+ // This does not necessarily correspond to the correct overloaded function. >+ const TSymbol *symbol() const; >+ >+ private: >+ TFunctionLookup(const ImmutableString &name, >+ const TType *constructorType, >+ const TSymbol *symbol); >+ >+ const ImmutableString mName; >+ const TType *const mConstructorType; >+ TIntermTyped *mThisNode; >+ TIntermSequence mArguments; >+ const TSymbol *mSymbol; >+}; >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_FUNCTIONLOOKUP_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/HashNames.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/HashNames.cpp >index 6bc90faf94c..6994c10afaf 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/HashNames.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/HashNames.cpp >@@ -6,67 +6,89 @@ > > #include "compiler/translator/HashNames.h" > >+#include "compiler/translator/ImmutableString.h" >+#include "compiler/translator/ImmutableStringBuilder.h" > #include "compiler/translator/IntermNode.h" >+#include "compiler/translator/Symbol.h" > > namespace sh > { > > namespace > { >- >-// GLSL ES 3.00.6 section 3.9: the maximum length of an identifier is 1024 characters. >-static const unsigned int kESSLMaxIdentifierLength = 1024u; >- >-static const char *kHashedNamePrefix = "webgl_"; >+constexpr const ImmutableString kHashedNamePrefix("webgl_"); > > // Can't prefix with just _ because then we might introduce a double underscore, which is not safe > // in GLSL (ESSL 3.00.6 section 3.8: All identifiers containing a double underscore are reserved for > // use by the underlying implementation). u is short for user-defined. >-static const char *kUnhashedNamePrefix = "_u"; >-static const unsigned int kUnhashedNamePrefixLength = 2u; >+constexpr const ImmutableString kUnhashedNamePrefix("_u"); > >-TString HashName(const TString &name, ShHashFunction64 hashFunction) >+ImmutableString HashName(const ImmutableString &name, ShHashFunction64 hashFunction) > { > ASSERT(!name.empty()); > ASSERT(hashFunction); >- khronos_uint64_t number = (*hashFunction)(name.c_str(), name.length()); >- TStringStream stream; >- stream << kHashedNamePrefix << std::hex << number; >- TString hashedName = stream.str(); >+ khronos_uint64_t number = (*hashFunction)(name.data(), name.length()); >+ >+ // Build the hashed name in place. >+ static const unsigned int kHexStrMaxLength = sizeof(number) * 2; >+ static const size_t kHashedNameMaxLength = kHashedNamePrefix.length() + kHexStrMaxLength; >+ >+ ImmutableStringBuilder hashedName(kHashedNameMaxLength); >+ hashedName << kHashedNamePrefix; >+ >+ hashedName.appendHex(number); >+ > return hashedName; > } > > } // anonymous namespace > >-TString HashName(const TName &name, ShHashFunction64 hashFunction, NameMap *nameMap) >+ImmutableString HashName(const ImmutableString &name, >+ ShHashFunction64 hashFunction, >+ NameMap *nameMap) > { >- if (name.getString().empty() || name.isInternal()) >- { >- return name.getString(); >- } > if (hashFunction == nullptr) > { >- if (name.getString().length() + kUnhashedNamePrefixLength > kESSLMaxIdentifierLength) >+ if (name.length() + kUnhashedNamePrefix.length() > kESSLMaxIdentifierLength) > { > // If the identifier length is already close to the limit, we can't prefix it. This is > // not a problem since there are no builtins or ANGLE's internal variables that would > // have as long names and could conflict. >- return name.getString(); >+ return name; > } >- return kUnhashedNamePrefix + name.getString(); >+ ImmutableStringBuilder prefixedName(kUnhashedNamePrefix.length() + name.length()); >+ prefixedName << kUnhashedNamePrefix << name; >+ return prefixedName; > } > if (nameMap) > { >- NameMap::const_iterator it = nameMap->find(name.getString().c_str()); >+ NameMap::const_iterator it = nameMap->find(name.data()); > if (it != nameMap->end()) >- return it->second.c_str(); >+ { >+ // TODO(oetuaho): Would be nice if we didn't need to allocate a string here. >+ return ImmutableString(it->second); >+ } > } >- TString hashedName = HashName(name.getString(), hashFunction); >+ ImmutableString hashedName = HashName(name, hashFunction); > if (nameMap) > { >- (*nameMap)[name.getString().c_str()] = hashedName.c_str(); >+ (*nameMap)[name.data()] = hashedName.data(); > } > return hashedName; > } > >+ImmutableString HashName(const TSymbol *symbol, ShHashFunction64 hashFunction, NameMap *nameMap) >+{ >+ if (symbol->symbolType() == SymbolType::Empty) >+ { >+ return kEmptyImmutableString; >+ } >+ if (symbol->symbolType() == SymbolType::AngleInternal || >+ symbol->symbolType() == SymbolType::BuiltIn) >+ { >+ return symbol->name(); >+ } >+ return HashName(symbol->name(), hashFunction, nameMap); >+} >+ > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/HashNames.h b/Source/ThirdParty/ANGLE/src/compiler/translator/HashNames.h >index 28e861b3098..132cb593374 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/HashNames.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/HashNames.h >@@ -17,11 +17,16 @@ namespace sh > > typedef std::map<TPersistString, TPersistString> NameMap; > >-class TName; >+class ImmutableString; >+class TSymbol; >+ >+ImmutableString HashName(const ImmutableString &name, >+ ShHashFunction64 hashFunction, >+ NameMap *nameMap); > > // Hash user-defined name for GLSL output, with special handling for internal names. > // The nameMap parameter is optional and is used to cache hashed names if set. >-TString HashName(const TName &name, ShHashFunction64 hashFunction, NameMap *nameMap); >+ImmutableString HashName(const TSymbol *symbol, ShHashFunction64 hashFunction, NameMap *nameMap); > > } // namespace sh > >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ImageFunctionHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ImageFunctionHLSL.cpp >index 40b5e1f1e2a..d60cce09e51 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ImageFunctionHLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ImageFunctionHLSL.cpp >@@ -7,24 +7,48 @@ > // > > #include "compiler/translator/ImageFunctionHLSL.h" >+#include "compiler/translator/ImmutableStringBuilder.h" > #include "compiler/translator/UtilsHLSL.h" > > namespace sh > { > > // static >-void ImageFunctionHLSL::OutputImageFunctionArgumentList( >+ImmutableString ImageFunctionHLSL::GetImageReference( > TInfoSinkBase &out, > const ImageFunctionHLSL::ImageFunction &imageFunction) > { >+ static const ImmutableString kImageIndexStr("[index]"); > if (imageFunction.readonly) > { >- out << TextureString(imageFunction.image, imageFunction.imageInternalFormat) << " tex"; >+ static const ImmutableString kReadonlyImagesStr("readonlyImages"); >+ ImmutableString suffix( >+ TextureGroupSuffix(imageFunction.image, imageFunction.imageInternalFormat)); >+ out << " const uint index = imageIndex - readonlyImageIndexOffset" << suffix.data() >+ << ";\n"; >+ ImmutableStringBuilder imageRefBuilder(kReadonlyImagesStr.length() + suffix.length() + >+ kImageIndexStr.length()); >+ imageRefBuilder << kReadonlyImagesStr << suffix << kImageIndexStr; >+ return imageRefBuilder; > } > else > { >- out << RWTextureString(imageFunction.image, imageFunction.imageInternalFormat) << " tex"; >+ static const ImmutableString kImagesStr("images"); >+ ImmutableString suffix( >+ RWTextureGroupSuffix(imageFunction.image, imageFunction.imageInternalFormat)); >+ out << " const uint index = imageIndex - imageIndexOffset" << suffix.data() << ";\n"; >+ ImmutableStringBuilder imageRefBuilder(kImagesStr.length() + suffix.length() + >+ kImageIndexStr.length()); >+ imageRefBuilder << kImagesStr << suffix << kImageIndexStr; >+ return imageRefBuilder; > } >+} >+ >+void ImageFunctionHLSL::OutputImageFunctionArgumentList( >+ TInfoSinkBase &out, >+ const ImageFunctionHLSL::ImageFunction &imageFunction) >+{ >+ out << "uint imageIndex"; > > if (imageFunction.method == ImageFunctionHLSL::ImageFunction::Method::LOAD || > imageFunction.method == ImageFunctionHLSL::ImageFunction::Method::STORE) >@@ -84,7 +108,7 @@ void ImageFunctionHLSL::OutputImageFunctionArgumentList( > void ImageFunctionHLSL::OutputImageSizeFunctionBody( > TInfoSinkBase &out, > const ImageFunctionHLSL::ImageFunction &imageFunction, >- const TString &imageReference) >+ const ImmutableString &imageReference) > { > if (IsImage3D(imageFunction.image) || IsImage2DArray(imageFunction.image) || > IsImageCube(imageFunction.image)) >@@ -115,7 +139,7 @@ void ImageFunctionHLSL::OutputImageSizeFunctionBody( > void ImageFunctionHLSL::OutputImageLoadFunctionBody( > TInfoSinkBase &out, > const ImageFunctionHLSL::ImageFunction &imageFunction, >- const TString &imageReference) >+ const ImmutableString &imageReference) > { > if (IsImage3D(imageFunction.image) || IsImage2DArray(imageFunction.image) || > IsImageCube(imageFunction.image)) >@@ -134,7 +158,7 @@ void ImageFunctionHLSL::OutputImageLoadFunctionBody( > void ImageFunctionHLSL::OutputImageStoreFunctionBody( > TInfoSinkBase &out, > const ImageFunctionHLSL::ImageFunction &imageFunction, >- const TString &imageReference) >+ const ImmutableString &imageReference) > { > if (IsImage3D(imageFunction.image) || IsImage2DArray(imageFunction.image) || > IsImage2D(imageFunction.image) || IsImageCube(imageFunction.image)) >@@ -145,28 +169,34 @@ void ImageFunctionHLSL::OutputImageStoreFunctionBody( > UNREACHABLE(); > } > >-TString ImageFunctionHLSL::ImageFunction::name() const >+ImmutableString ImageFunctionHLSL::ImageFunction::name() const > { >- TString name = "gl_image"; >+ static const ImmutableString kGlImageName("gl_image"); >+ >+ ImmutableString suffix(nullptr); > if (readonly) > { >- name += TextureTypeSuffix(image, imageInternalFormat); >+ suffix = ImmutableString(TextureTypeSuffix(image, imageInternalFormat)); > } > else > { >- name += RWTextureTypeSuffix(image, imageInternalFormat); >+ suffix = ImmutableString(RWTextureTypeSuffix(image, imageInternalFormat)); > } > >+ ImmutableStringBuilder name(kGlImageName.length() + suffix.length() + 5u); >+ >+ name << kGlImageName << suffix; >+ > switch (method) > { > case Method::SIZE: >- name += "Size"; >+ name << "Size"; > break; > case Method::LOAD: >- name += "Load"; >+ name << "Load"; > break; > case Method::STORE: >- name += "Store"; >+ name << "Store"; > break; > default: > UNREACHABLE(); >@@ -175,6 +205,36 @@ TString ImageFunctionHLSL::ImageFunction::name() const > return name; > } > >+ImageFunctionHLSL::ImageFunction::DataType ImageFunctionHLSL::ImageFunction::getDataType( >+ TLayoutImageInternalFormat format) const >+{ >+ switch (format) >+ { >+ case EiifRGBA32F: >+ case EiifRGBA16F: >+ case EiifR32F: >+ return ImageFunction::DataType::FLOAT4; >+ case EiifRGBA32UI: >+ case EiifRGBA16UI: >+ case EiifRGBA8UI: >+ case EiifR32UI: >+ return ImageFunction::DataType::UINT4; >+ case EiifRGBA32I: >+ case EiifRGBA16I: >+ case EiifRGBA8I: >+ case EiifR32I: >+ return ImageFunction::DataType::INT4; >+ case EiifRGBA8: >+ return ImageFunction::DataType::UNORM_FLOAT4; >+ case EiifRGBA8_SNORM: >+ return ImageFunction::DataType::SNORM_FLOAT4; >+ default: >+ UNREACHABLE(); >+ } >+ >+ return ImageFunction::DataType::NONE; >+} >+ > const char *ImageFunctionHLSL::ImageFunction::getReturnType() const > { > if (method == ImageFunction::Method::SIZE) >@@ -235,20 +295,21 @@ const char *ImageFunctionHLSL::ImageFunction::getReturnType() const > > bool ImageFunctionHLSL::ImageFunction::operator<(const ImageFunction &rhs) const > { >- return std::tie(image, imageInternalFormat, readonly, method) < >- std::tie(rhs.image, rhs.imageInternalFormat, rhs.readonly, rhs.method); >+ return std::tie(image, type, method, readonly) < >+ std::tie(rhs.image, rhs.type, rhs.method, rhs.readonly); > } > >-TString ImageFunctionHLSL::useImageFunction(const TString &name, >- const TBasicType &type, >- TLayoutImageInternalFormat imageInternalFormat, >- bool readonly) >+ImmutableString ImageFunctionHLSL::useImageFunction(const ImmutableString &name, >+ const TBasicType &type, >+ TLayoutImageInternalFormat imageInternalFormat, >+ bool readonly) > { > ASSERT(IsImage(type)); > ImageFunction imageFunction; > imageFunction.image = type; > imageFunction.imageInternalFormat = imageInternalFormat; > imageFunction.readonly = readonly; >+ imageFunction.type = imageFunction.getDataType(imageInternalFormat); > > if (name == "imageSize") > { >@@ -273,6 +334,13 @@ void ImageFunctionHLSL::imageFunctionHeader(TInfoSinkBase &out) > { > for (const ImageFunction &imageFunction : mUsesImage) > { >+ // Skip to generate image2D functions here, dynamically generate these >+ // functions when linking, or after dispatch or draw. >+ if (IsImage2D(imageFunction.image)) >+ { >+ mUsedImage2DFunctionNames.insert(imageFunction.name().data()); >+ continue; >+ } > // Function header > out << imageFunction.getReturnType() << " " << imageFunction.name() << "("; > >@@ -281,8 +349,7 @@ void ImageFunctionHLSL::imageFunctionHeader(TInfoSinkBase &out) > out << ")\n" > "{\n"; > >- TString imageReference("tex"); >- >+ ImmutableString imageReference = GetImageReference(out, imageFunction); > if (imageFunction.method == ImageFunction::Method::SIZE) > { > OutputImageSizeFunctionBody(out, imageFunction, imageReference); >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ImageFunctionHLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ImageFunctionHLSL.h >index 9db17a6bbf0..56c1dcc8e08 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ImageFunctionHLSL.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ImageFunctionHLSL.h >@@ -25,12 +25,16 @@ class ImageFunctionHLSL final : angle::NonCopyable > public: > // Returns the name of the image function implementation to caller. > // The name that's passed in is the name of the GLSL image function that it should implement. >- TString useImageFunction(const TString &name, >- const TBasicType &type, >- TLayoutImageInternalFormat imageInternalFormat, >- bool readonly); >+ ImmutableString useImageFunction(const ImmutableString &name, >+ const TBasicType &type, >+ TLayoutImageInternalFormat imageInternalFormat, >+ bool readonly); > > void imageFunctionHeader(TInfoSinkBase &out); >+ const std::set<std::string> &getUsedImage2DFunctionNames() const >+ { >+ return mUsedImage2DFunctionNames; >+ } > > private: > struct ImageFunction >@@ -43,32 +47,48 @@ class ImageFunctionHLSL final : angle::NonCopyable > STORE > }; > >- TString name() const; >+ enum class DataType >+ { >+ NONE, >+ FLOAT4, >+ UINT4, >+ INT4, >+ UNORM_FLOAT4, >+ SNORM_FLOAT4 >+ }; >+ >+ ImmutableString name() const; > > bool operator<(const ImageFunction &rhs) const; > >+ DataType getDataType(TLayoutImageInternalFormat format) const; >+ > const char *getReturnType() const; > > TBasicType image; > TLayoutImageInternalFormat imageInternalFormat; > bool readonly; > Method method; >+ DataType type; > }; > >+ static ImmutableString GetImageReference(TInfoSinkBase &out, >+ const ImageFunctionHLSL::ImageFunction &imageFunction); > static void OutputImageFunctionArgumentList( > TInfoSinkBase &out, > const ImageFunctionHLSL::ImageFunction &imageFunction); > static void OutputImageSizeFunctionBody(TInfoSinkBase &out, > const ImageFunctionHLSL::ImageFunction &imageFunction, >- const TString &imageReference); >+ const ImmutableString &imageReference); > static void OutputImageLoadFunctionBody(TInfoSinkBase &out, > const ImageFunctionHLSL::ImageFunction &imageFunction, >- const TString &imageReference); >+ const ImmutableString &imageReference); > static void OutputImageStoreFunctionBody(TInfoSinkBase &out, > const ImageFunctionHLSL::ImageFunction &imageFunction, >- const TString &imageReference); >+ const ImmutableString &imageReference); > using ImageFunctionSet = std::set<ImageFunction>; > ImageFunctionSet mUsesImage; >+ std::set<std::string> mUsedImage2DFunctionNames; > }; > > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ImmutableString.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ImmutableString.cpp >new file mode 100644 >index 00000000000..38f3fa052ce >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ImmutableString.cpp >@@ -0,0 +1,69 @@ >+// >+// Copyright (c) 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. >+// >+// ImmutableString.cpp: Wrapper for static or pool allocated char arrays, that are guaranteed to be >+// valid and unchanged for the duration of the compilation. >+// >+ >+#include "compiler/translator/ImmutableString.h" >+ >+std::ostream &operator<<(std::ostream &os, const sh::ImmutableString &str) >+{ >+ return os.write(str.data(), str.length()); >+} >+ >+#if defined(_MSC_VER) >+# pragma warning(disable : 4309) // truncation of constant value >+#endif >+ >+namespace sh >+{ >+ >+template <> >+const size_t ImmutableString::FowlerNollVoHash<4>::kFnvPrime = 16777619u; >+ >+template <> >+const size_t ImmutableString::FowlerNollVoHash<4>::kFnvOffsetBasis = 0x811c9dc5u; >+ >+template <> >+const size_t ImmutableString::FowlerNollVoHash<8>::kFnvPrime = >+ static_cast<size_t>(1099511628211ull); >+ >+template <> >+const size_t ImmutableString::FowlerNollVoHash<8>::kFnvOffsetBasis = >+ static_cast<size_t>(0xcbf29ce484222325ull); >+ >+uint32_t ImmutableString::mangledNameHash() const >+{ >+ const char *dataPtr = data(); >+ uint32_t hash = static_cast<uint32_t>(FowlerNollVoHash<4>::kFnvOffsetBasis); >+ const uint32_t kMaxSixBitValue = (1u << 6) - 1u; >+ uint32_t parenLocation = kMaxSixBitValue; >+ uint32_t hasArrayOrBlockParamBit = 0u; >+ uint32_t index = 0; >+ while (dataPtr[index] != '\0') >+ { >+ hash = hash ^ dataPtr[index]; >+ hash = hash * static_cast<uint32_t>(FowlerNollVoHash<4>::kFnvPrime); >+ if (dataPtr[index] == '(') >+ { >+ // We should only reach here once, since this function should not be called with invalid >+ // mangled names. >+ ASSERT(parenLocation == kMaxSixBitValue); >+ parenLocation = index; >+ } >+ else if (dataPtr[index] == '{' || dataPtr[index] == '[') >+ { >+ hasArrayOrBlockParamBit = 1u; >+ } >+ ++index; >+ } >+ // Should not be called with strings longer than 63 characters. >+ ASSERT(index <= kMaxSixBitValue); >+ return ((hash >> 13) ^ (hash & 0x1fff)) | (index << 19) | (parenLocation << 25) | >+ (hasArrayOrBlockParamBit << 31); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ImmutableString.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ImmutableString.h >new file mode 100644 >index 00000000000..5f08ea06cc2 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ImmutableString.h >@@ -0,0 +1,144 @@ >+// >+// Copyright (c) 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. >+// >+// ImmutableString.h: Wrapper for static or pool allocated char arrays, that are guaranteed to be >+// valid and unchanged for the duration of the compilation. >+// >+ >+#ifndef COMPILER_TRANSLATOR_IMMUTABLESTRING_H_ >+#define COMPILER_TRANSLATOR_IMMUTABLESTRING_H_ >+ >+#include <string> >+ >+#include "common/string_utils.h" >+#include "compiler/translator/Common.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+constexpr size_t constStrlen(const char *str) >+{ >+ if (str == nullptr) >+ { >+ return 0u; >+ } >+ size_t len = 0u; >+ while (*(str + len) != '\0') >+ { >+ ++len; >+ } >+ return len; >+} >+} // namespace >+ >+class ImmutableString >+{ >+ public: >+ // The data pointer passed in must be one of: >+ // 1. nullptr (only valid with length 0). >+ // 2. a null-terminated static char array like a string literal. >+ // 3. a null-terminated pool allocated char array. This can't be c_str() of a local TString, >+ // since when a TString goes out of scope it clears its first character. >+ explicit constexpr ImmutableString(const char *data) : mData(data), mLength(constStrlen(data)) >+ {} >+ >+ constexpr ImmutableString(const char *data, size_t length) : mData(data), mLength(length) {} >+ >+ ImmutableString(const std::string &str) >+ : mData(AllocatePoolCharArray(str.c_str(), str.size())), mLength(str.size()) >+ {} >+ >+ constexpr ImmutableString(const ImmutableString &) = default; >+ >+ ImmutableString &operator=(const ImmutableString &) = default; >+ >+ constexpr const char *data() const { return mData ? mData : ""; } >+ constexpr size_t length() const { return mLength; } >+ >+ char operator[](size_t index) const { return data()[index]; } >+ >+ constexpr bool empty() const { return mLength == 0; } >+ bool beginsWith(const char *prefix) const { return angle::BeginsWith(data(), prefix); } >+ constexpr bool beginsWith(const ImmutableString &prefix) const >+ { >+ return mLength >= prefix.length() && memcmp(data(), prefix.data(), prefix.length()) == 0; >+ } >+ bool contains(const char *substr) const { return strstr(data(), substr) != nullptr; } >+ >+ constexpr bool operator==(const ImmutableString &b) const >+ { >+ if (mLength != b.mLength) >+ { >+ return false; >+ } >+ return memcmp(data(), b.data(), mLength) == 0; >+ } >+ constexpr bool operator!=(const ImmutableString &b) const { return !(*this == b); } >+ constexpr bool operator==(const char *b) const >+ { >+ if (b == nullptr) >+ { >+ return empty(); >+ } >+ return strcmp(data(), b) == 0; >+ } >+ constexpr bool operator!=(const char *b) const { return !(*this == b); } >+ bool operator==(const std::string &b) const >+ { >+ return mLength == b.length() && memcmp(data(), b.c_str(), mLength) == 0; >+ } >+ bool operator!=(const std::string &b) const { return !(*this == b); } >+ >+ constexpr bool operator<(const ImmutableString &b) const >+ { >+ if (mLength < b.mLength) >+ { >+ return true; >+ } >+ if (mLength > b.mLength) >+ { >+ return false; >+ } >+ return (memcmp(data(), b.data(), mLength) < 0); >+ } >+ >+ template <size_t hashBytes> >+ struct FowlerNollVoHash >+ { >+ static const size_t kFnvOffsetBasis; >+ static const size_t kFnvPrime; >+ >+ constexpr size_t operator()(const ImmutableString &a) const >+ { >+ const char *data = a.data(); >+ size_t hash = kFnvOffsetBasis; >+ while ((*data) != '\0') >+ { >+ hash = hash ^ (*data); >+ hash = hash * kFnvPrime; >+ ++data; >+ } >+ return hash; >+ } >+ }; >+ >+ // This hash encodes the opening parentheses location (if any), name length and whether the name >+ // contains { or [ characters in addition to a 19-bit hash. This way the hash is more useful for >+ // lookups. The string passed in should be at most 63 characters. >+ uint32_t mangledNameHash() const; >+ >+ private: >+ const char *mData; >+ size_t mLength; >+}; >+ >+constexpr ImmutableString kEmptyImmutableString(""); >+} // namespace sh >+ >+std::ostream &operator<<(std::ostream &os, const sh::ImmutableString &str); >+ >+#endif // COMPILER_TRANSLATOR_IMMUTABLESTRING_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ImmutableStringBuilder.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ImmutableStringBuilder.cpp >new file mode 100644 >index 00000000000..d7d0a0135d1 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ImmutableStringBuilder.cpp >@@ -0,0 +1,63 @@ >+// >+// Copyright (c) 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. >+// >+// ImmutableStringBuilder.cpp: Stringstream-like utility for building pool allocated strings where >+// the maximum length is known in advance. >+// >+ >+#include "compiler/translator/ImmutableStringBuilder.h" >+ >+#include <stdio.h> >+ >+namespace sh >+{ >+ >+ImmutableStringBuilder &ImmutableStringBuilder::operator<<(const ImmutableString &str) >+{ >+ ASSERT(mData != nullptr); >+ ASSERT(mPos + str.length() <= mMaxLength); >+ memcpy(mData + mPos, str.data(), str.length()); >+ mPos += str.length(); >+ return *this; >+} >+ >+ImmutableStringBuilder &ImmutableStringBuilder::operator<<(const char *str) >+{ >+ ASSERT(mData != nullptr); >+ size_t len = strlen(str); >+ ASSERT(mPos + len <= mMaxLength); >+ memcpy(mData + mPos, str, len); >+ mPos += len; >+ return *this; >+} >+ >+ImmutableStringBuilder &ImmutableStringBuilder::operator<<(const char &c) >+{ >+ ASSERT(mData != nullptr); >+ ASSERT(mPos + 1 <= mMaxLength); >+ mData[mPos++] = c; >+ return *this; >+} >+ >+void ImmutableStringBuilder::appendDecimal(const uint32_t &u) >+{ >+ int numChars = snprintf(mData + mPos, mMaxLength - mPos, "%d", u); >+ ASSERT(numChars >= 0); >+ ASSERT(mPos + numChars <= mMaxLength); >+ mPos += numChars; >+} >+ >+ImmutableStringBuilder::operator ImmutableString() >+{ >+ mData[mPos] = '\0'; >+ ImmutableString str(static_cast<const char *>(mData), mPos); >+#if defined(ANGLE_ENABLE_ASSERTS) >+ // Make sure that nothing is added to the string after it is finalized. >+ mData = nullptr; >+#endif >+ return str; >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ImmutableStringBuilder.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ImmutableStringBuilder.h >new file mode 100644 >index 00000000000..e68459169f4 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ImmutableStringBuilder.h >@@ -0,0 +1,80 @@ >+// >+// Copyright (c) 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. >+// >+// ImmutableStringBuilder.h: Stringstream-like utility for building pool allocated strings where the >+// maximum length is known in advance. >+// >+ >+#ifndef COMPILER_TRANSLATOR_IMMUTABLESTRINGBUILDER_H_ >+#define COMPILER_TRANSLATOR_IMMUTABLESTRINGBUILDER_H_ >+ >+#include "compiler/translator/ImmutableString.h" >+ >+namespace sh >+{ >+ >+class ImmutableStringBuilder >+{ >+ public: >+ ImmutableStringBuilder(size_t maxLength) >+ : mPos(0u), mMaxLength(maxLength), mData(AllocateEmptyPoolCharArray(maxLength)) >+ {} >+ >+ ImmutableStringBuilder &operator<<(const ImmutableString &str); >+ >+ ImmutableStringBuilder &operator<<(const char *str); >+ >+ ImmutableStringBuilder &operator<<(const char &c); >+ >+ // This invalidates the ImmutableStringBuilder, so it should only be called once. >+ operator ImmutableString(); >+ >+ void appendDecimal(const uint32_t &i); >+ >+ template <typename T> >+ void appendHex(T number) >+ { >+ ASSERT(mData != nullptr); >+ ASSERT(mPos + sizeof(T) * 2u <= mMaxLength); >+ int index = static_cast<int>(sizeof(T)) * 2 - 1; >+ // Loop through leading zeroes. >+ while (((number >> (index * 4)) & 0xfu) == 0 && index > 0) >+ { >+ --index; >+ } >+ // Write the rest of the hex digits. >+ while (index >= 0) >+ { >+ char digit = static_cast<char>((number >> (index * 4)) & 0xfu); >+ char digitChar = (digit < 10) ? (digit + '0') : (digit + ('a' - 10)); >+ mData[mPos++] = digitChar; >+ --index; >+ } >+ } >+ >+ template <typename T> >+ static constexpr size_t GetHexCharCount() >+ { >+ return sizeof(T) * 2; >+ } >+ >+ private: >+ inline static char *AllocateEmptyPoolCharArray(size_t strLength) >+ { >+ size_t requiredSize = strLength + 1u; >+ return static_cast<char *>(GetGlobalPoolAllocator()->allocate(requiredSize)); >+ } >+ >+ size_t mPos; >+ size_t mMaxLength; >+ char *mData; >+}; >+ >+// GLSL ES 3.00.6 section 3.9: the maximum length of an identifier is 1024 characters. >+constexpr unsigned int kESSLMaxIdentifierLength = 1024u; >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_IMMUTABLESTRINGBUILDER_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.cpp >index db26aa67e83..e8a84530818 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.cpp >@@ -6,6 +6,9 @@ > > #include "compiler/translator/InfoSink.h" > >+#include "compiler/translator/ImmutableString.h" >+#include "compiler/translator/Types.h" >+ > namespace sh > { > >@@ -25,9 +28,48 @@ void TInfoSinkBase::prefix(Severity severity) > } > } > >+TInfoSinkBase &TInfoSinkBase::operator<<(const ImmutableString &str) >+{ >+ sink.append(str.data()); >+ return *this; >+} >+ >+TInfoSinkBase &TInfoSinkBase::operator<<(const TType &type) >+{ >+ if (type.isInvariant()) >+ sink.append("invariant "); >+ if (type.getQualifier() != EvqTemporary && type.getQualifier() != EvqGlobal) >+ { >+ sink.append(type.getQualifierString()); >+ sink.append(" "); >+ } >+ if (type.getPrecision() != EbpUndefined) >+ { >+ sink.append(type.getPrecisionString()); >+ sink.append(" "); >+ } >+ if (type.isArray()) >+ { >+ for (auto arraySizeIter = type.getArraySizes()->rbegin(); >+ arraySizeIter != type.getArraySizes()->rend(); ++arraySizeIter) >+ { >+ *this << "array[" << (*arraySizeIter) << "] of "; >+ } >+ } >+ if (type.isMatrix()) >+ { >+ *this << type.getCols() << "X" << type.getRows() << " matrix of "; >+ } >+ else if (type.isVector()) >+ *this << type.getNominalSize() << "-component vector of "; >+ >+ sink.append(type.getBasicString()); >+ return *this; >+} >+ > void TInfoSinkBase::location(int file, int line) > { >- TPersistStringStream stream; >+ TPersistStringStream stream = sh::InitializeStream<TPersistStringStream>(); > if (line) > stream << file << ":" << line; > else >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.h b/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.h >index 2705f48d599..100d06ec6bf 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.h >@@ -15,6 +15,9 @@ > namespace sh > { > >+class ImmutableString; >+class TType; >+ > // Returns the fractional part of the given floating-point number. > inline float fractionalPart(float f) > { >@@ -22,6 +25,8 @@ inline float fractionalPart(float f) > return modff(f, &intPart); > } > >+class ImmutableString; >+ > // > // Encapsulate info logs for all objects that have them. > // >@@ -36,7 +41,7 @@ class TInfoSinkBase > template <typename T> > TInfoSinkBase &operator<<(const T &t) > { >- TPersistStringStream stream; >+ TPersistStringStream stream = sh::InitializeStream<TPersistStringStream>(); > stream << t; > sink.append(stream.str()); > return *this; >@@ -63,6 +68,10 @@ class TInfoSinkBase > sink.append(str.c_str()); > return *this; > } >+ TInfoSinkBase &operator<<(const ImmutableString &str); >+ >+ TInfoSinkBase &operator<<(const TType &type); >+ > // Make sure floats are written with correct precision. > TInfoSinkBase &operator<<(float f) > { >@@ -70,7 +79,7 @@ class TInfoSinkBase > // does not have a fractional part, the default precision format does > // not write the decimal portion which gets interpreted as integer by > // the compiler. >- TPersistStringStream stream; >+ TPersistStringStream stream = sh::InitializeStream<TPersistStringStream>(); > if (fractionalPart(f) == 0.0f) > { > stream.precision(1); >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.cpp >index 6f8baee96b2..aec19c960c0 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.cpp >@@ -4,1052 +4,11 @@ > // found in the LICENSE file. > // > >-// >-// Create symbols that declare built-in definitions, add built-ins that >-// cannot be expressed in the files, and establish mappings between >-// built-in functions and operators. >-// >- > #include "compiler/translator/Initialize.h" >-#include "compiler/translator/Cache.h" >- >-#include "compiler/translator/IntermNode.h" >-#include "angle_gl.h" > > namespace sh > { > >-void InsertBuiltInFunctions(sh::GLenum type, >- ShShaderSpec spec, >- const ShBuiltInResources &resources, >- TSymbolTable &symbolTable) >-{ >- const TType *voidType = TCache::getType(EbtVoid); >- const TType *float1 = TCache::getType(EbtFloat); >- const TType *float2 = TCache::getType(EbtFloat, 2); >- const TType *float3 = TCache::getType(EbtFloat, 3); >- const TType *float4 = TCache::getType(EbtFloat, 4); >- const TType *int1 = TCache::getType(EbtInt); >- const TType *int2 = TCache::getType(EbtInt, 2); >- const TType *int3 = TCache::getType(EbtInt, 3); >- const TType *uint1 = TCache::getType(EbtUInt); >- const TType *bool1 = TCache::getType(EbtBool); >- const TType *genType = TCache::getType(EbtGenType); >- const TType *genIType = TCache::getType(EbtGenIType); >- const TType *genUType = TCache::getType(EbtGenUType); >- const TType *genBType = TCache::getType(EbtGenBType); >- >- // >- // Angle and Trigonometric Functions. >- // >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpRadians, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpDegrees, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpSin, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpCos, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpTan, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpAsin, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpAcos, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpAtan, genType, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpAtan, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpSinh, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpCosh, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpTanh, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpAsinh, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpAcosh, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpAtanh, genType, genType); >- >- // >- // Exponential Functions. >- // >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpPow, genType, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpExp, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpLog, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpExp2, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpLog2, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpSqrt, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpInverseSqrt, genType, genType); >- >- // >- // Common Functions. >- // >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpAbs, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpAbs, genIType, genIType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpSign, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpSign, genIType, genIType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpFloor, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpTrunc, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpRound, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpRoundEven, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpCeil, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpFract, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpMod, genType, genType, float1); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpMod, genType, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpMin, genType, genType, float1); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpMin, genType, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMin, genIType, genIType, genIType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMin, genIType, genIType, int1); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMin, genUType, genUType, genUType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMin, genUType, genUType, uint1); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpMax, genType, genType, float1); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpMax, genType, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMax, genIType, genIType, genIType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMax, genIType, genIType, int1); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMax, genUType, genUType, genUType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMax, genUType, genUType, uint1); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpClamp, genType, genType, float1, float1); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpClamp, genType, genType, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpClamp, genIType, genIType, int1, int1); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpClamp, genIType, genIType, genIType, genIType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpClamp, genUType, genUType, uint1, uint1); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpClamp, genUType, genUType, genUType, genUType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpMix, genType, genType, genType, float1); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpMix, genType, genType, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMix, genType, genType, genType, genBType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpStep, genType, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpStep, genType, float1, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpSmoothStep, genType, genType, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpSmoothStep, genType, float1, float1, genType); >- >- const TType *outGenType = TCache::getType(EbtGenType, EvqOut); >- const TType *outGenIType = TCache::getType(EbtGenIType, EvqOut); >- >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpModf, genType, genType, outGenType); >- >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpIsNan, genBType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpIsInf, genBType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpFloatBitsToInt, genIType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpFloatBitsToUint, genUType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpIntBitsToFloat, genType, genIType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpUintBitsToFloat, genType, genUType); >- >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpFrexp, genType, genType, outGenIType); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpLdexp, genType, genType, genIType); >- >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpPackSnorm2x16, uint1, float2); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpPackUnorm2x16, uint1, float2); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpPackHalf2x16, uint1, float2); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpUnpackSnorm2x16, float2, uint1); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpUnpackUnorm2x16, float2, uint1); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpUnpackHalf2x16, float2, uint1); >- >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpPackUnorm4x8, uint1, float4); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpPackSnorm4x8, uint1, float4); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpUnpackUnorm4x8, float4, uint1); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpUnpackSnorm4x8, float4, uint1); >- >- // >- // Geometric Functions. >- // >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpLength, float1, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpDistance, float1, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpDot, float1, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpCross, float3, float3, float3); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpNormalize, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpFaceforward, genType, genType, genType, >- genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpReflect, genType, genType, genType); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpRefract, genType, genType, genType, float1); >- >- const TType *mat2 = TCache::getType(EbtFloat, 2, 2); >- const TType *mat3 = TCache::getType(EbtFloat, 3, 3); >- const TType *mat4 = TCache::getType(EbtFloat, 4, 4); >- const TType *mat2x3 = TCache::getType(EbtFloat, 2, 3); >- const TType *mat3x2 = TCache::getType(EbtFloat, 3, 2); >- const TType *mat2x4 = TCache::getType(EbtFloat, 2, 4); >- const TType *mat4x2 = TCache::getType(EbtFloat, 4, 2); >- const TType *mat3x4 = TCache::getType(EbtFloat, 3, 4); >- const TType *mat4x3 = TCache::getType(EbtFloat, 4, 3); >- >- // >- // Matrix Functions. >- // >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpMulMatrixComponentWise, mat2, mat2, mat2); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpMulMatrixComponentWise, mat3, mat3, mat3); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpMulMatrixComponentWise, mat4, mat4, mat4); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMulMatrixComponentWise, mat2x3, mat2x3, mat2x3); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMulMatrixComponentWise, mat3x2, mat3x2, mat3x2); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMulMatrixComponentWise, mat2x4, mat2x4, mat2x4); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMulMatrixComponentWise, mat4x2, mat4x2, mat4x2); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMulMatrixComponentWise, mat3x4, mat3x4, mat3x4); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpMulMatrixComponentWise, mat4x3, mat4x3, mat4x3); >- >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpOuterProduct, mat2, float2, float2); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpOuterProduct, mat3, float3, float3); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpOuterProduct, mat4, float4, float4); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpOuterProduct, mat2x3, float3, float2); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpOuterProduct, mat3x2, float2, float3); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpOuterProduct, mat2x4, float4, float2); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpOuterProduct, mat4x2, float2, float4); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpOuterProduct, mat3x4, float4, float3); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpOuterProduct, mat4x3, float3, float4); >- >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpTranspose, mat2, mat2); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpTranspose, mat3, mat3); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpTranspose, mat4, mat4); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpTranspose, mat2x3, mat3x2); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpTranspose, mat3x2, mat2x3); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpTranspose, mat2x4, mat4x2); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpTranspose, mat4x2, mat2x4); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpTranspose, mat3x4, mat4x3); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpTranspose, mat4x3, mat3x4); >- >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpDeterminant, float1, mat2); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpDeterminant, float1, mat3); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpDeterminant, float1, mat4); >- >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpInverse, mat2, mat2); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpInverse, mat3, mat3); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpInverse, mat4, mat4); >- >- const TType *vec = TCache::getType(EbtVec); >- const TType *ivec = TCache::getType(EbtIVec); >- const TType *uvec = TCache::getType(EbtUVec); >- const TType *bvec = TCache::getType(EbtBVec); >- >- // >- // Vector relational functions. >- // >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpLessThanComponentWise, bvec, vec, vec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpLessThanComponentWise, bvec, ivec, ivec); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpLessThanComponentWise, bvec, uvec, uvec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpLessThanEqualComponentWise, bvec, vec, vec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpLessThanEqualComponentWise, bvec, ivec, ivec); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpLessThanEqualComponentWise, bvec, uvec, uvec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpGreaterThanComponentWise, bvec, vec, vec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpGreaterThanComponentWise, bvec, ivec, ivec); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpGreaterThanComponentWise, bvec, uvec, uvec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpGreaterThanEqualComponentWise, bvec, vec, vec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpGreaterThanEqualComponentWise, bvec, ivec, >- ivec); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpGreaterThanEqualComponentWise, bvec, uvec, uvec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpEqualComponentWise, bvec, vec, vec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpEqualComponentWise, bvec, ivec, ivec); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpEqualComponentWise, bvec, uvec, uvec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpEqualComponentWise, bvec, bvec, bvec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpNotEqualComponentWise, bvec, vec, vec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpNotEqualComponentWise, bvec, ivec, ivec); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpNotEqualComponentWise, bvec, uvec, uvec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpNotEqualComponentWise, bvec, bvec, bvec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpAny, bool1, bvec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpAll, bool1, bvec); >- symbolTable.insertBuiltInOp(COMMON_BUILTINS, EOpLogicalNotComponentWise, bvec, bvec); >- >- // >- // Integer functions >- // >- const TType *outGenUType = TCache::getType(EbtGenUType, EvqOut); >- >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpBitfieldExtract, genIType, genIType, int1, >- int1); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpBitfieldExtract, genUType, genUType, int1, >- int1); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpBitfieldInsert, genIType, genIType, genIType, >- int1, int1); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpBitfieldInsert, genUType, genUType, genUType, >- int1, int1); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpBitfieldReverse, genIType, genIType); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpBitfieldReverse, genUType, genUType); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpBitCount, genIType, genIType); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpBitCount, genIType, genUType); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpFindLSB, genIType, genIType); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpFindLSB, genIType, genUType); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpFindMSB, genIType, genIType); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpFindMSB, genIType, genUType); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpUaddCarry, genUType, genUType, genUType, >- outGenUType); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpUsubBorrow, genUType, genUType, genUType, >- outGenUType); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpUmulExtended, voidType, genUType, genUType, >- outGenUType, outGenUType); >- symbolTable.insertBuiltInOp(ESSL3_1_BUILTINS, EOpImulExtended, voidType, genIType, genIType, >- outGenIType, outGenIType); >- >- const TType *sampler2D = TCache::getType(EbtSampler2D); >- const TType *samplerCube = TCache::getType(EbtSamplerCube); >- >- // >- // Texture Functions for GLSL ES 1.0 >- // >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2D", sampler2D, float2); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", sampler2D, float3); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", sampler2D, float4); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCube", samplerCube, float3); >- >- if (resources.OES_EGL_image_external || resources.NV_EGL_stream_consumer_external) >- { >- const TType *samplerExternalOES = TCache::getType(EbtSamplerExternalOES); >- >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2D", samplerExternalOES, float2); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", samplerExternalOES, >- float3); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", samplerExternalOES, >- float4); >- } >- >- if (resources.ARB_texture_rectangle) >- { >- const TType *sampler2DRect = TCache::getType(EbtSampler2DRect); >- >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRect", sampler2DRect, float2); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRectProj", sampler2DRect, >- float3); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRectProj", sampler2DRect, >- float4); >- } >- >- if (resources.EXT_shader_texture_lod) >- { >- /* The *Grad* variants are new to both vertex and fragment shaders; the fragment >- * shader specific pieces are added separately below. >- */ >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, TExtension::EXT_shader_texture_lod, float4, >- "texture2DGradEXT", sampler2D, float2, float2, float2); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, TExtension::EXT_shader_texture_lod, float4, >- "texture2DProjGradEXT", sampler2D, float3, float2, float2); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, TExtension::EXT_shader_texture_lod, float4, >- "texture2DProjGradEXT", sampler2D, float4, float2, float2); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, TExtension::EXT_shader_texture_lod, float4, >- "textureCubeGradEXT", samplerCube, float3, float3, float3); >- } >- >- if (type == GL_FRAGMENT_SHADER) >- { >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2D", sampler2D, float2, float1); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", sampler2D, float3, >- float1); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", sampler2D, float4, >- float1); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCube", samplerCube, float3, >- float1); >- >- if (resources.OES_standard_derivatives) >- { >- symbolTable.insertBuiltInOp(ESSL1_BUILTINS, EOpDFdx, >- TExtension::OES_standard_derivatives, genType, genType); >- symbolTable.insertBuiltInOp(ESSL1_BUILTINS, EOpDFdy, >- TExtension::OES_standard_derivatives, genType, genType); >- symbolTable.insertBuiltInOp(ESSL1_BUILTINS, EOpFwidth, >- TExtension::OES_standard_derivatives, genType, genType); >- } >- >- if (resources.EXT_shader_texture_lod) >- { >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, TExtension::EXT_shader_texture_lod, float4, >- "texture2DLodEXT", sampler2D, float2, float1); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, TExtension::EXT_shader_texture_lod, float4, >- "texture2DProjLodEXT", sampler2D, float3, float1); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, TExtension::EXT_shader_texture_lod, float4, >- "texture2DProjLodEXT", sampler2D, float4, float1); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, TExtension::EXT_shader_texture_lod, float4, >- "textureCubeLodEXT", samplerCube, float3, float1); >- } >- } >- >- if (type == GL_VERTEX_SHADER) >- { >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DLod", sampler2D, float2, >- float1); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjLod", sampler2D, float3, >- float1); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjLod", sampler2D, float4, >- float1); >- symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCubeLod", samplerCube, float3, >- float1); >- } >- >- const TType *gvec4 = TCache::getType(EbtGVec4); >- >- const TType *gsampler2D = TCache::getType(EbtGSampler2D); >- const TType *gsamplerCube = TCache::getType(EbtGSamplerCube); >- const TType *gsampler3D = TCache::getType(EbtGSampler3D); >- const TType *gsampler2DArray = TCache::getType(EbtGSampler2DArray); >- const TType *gsampler2DMS = TCache::getType(EbtGSampler2DMS); >- >- // >- // Texture Functions for GLSL ES 3.0 >- // >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler2D, float2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler3D, float3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsamplerCube, float3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler2DArray, float3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler2D, float3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler2D, float4); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler3D, float4); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod", gsampler2D, float2, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod", gsampler3D, float3, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod", gsamplerCube, float3, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod", gsampler2DArray, float3, float1); >- >- if (resources.OES_EGL_image_external_essl3) >- { >- const TType *samplerExternalOES = TCache::getType(EbtSamplerExternalOES); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "texture", samplerExternalOES, float2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "textureProj", samplerExternalOES, >- float3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "textureProj", samplerExternalOES, >- float4); >- } >- >- if (resources.EXT_YUV_target) >- { >- const TType *samplerExternal2DY2YEXT = TCache::getType(EbtSamplerExternal2DY2YEXT); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, TExtension::EXT_YUV_target, float4, "texture", >- samplerExternal2DY2YEXT, float2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, TExtension::EXT_YUV_target, float4, "textureProj", >- samplerExternal2DY2YEXT, float3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, TExtension::EXT_YUV_target, float4, "textureProj", >- samplerExternal2DY2YEXT, float4); >- >- const TType *yuvCscStandardEXT = TCache::getType(EbtYuvCscStandardEXT); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, TExtension::EXT_YUV_target, float3, "rgb_2_yuv", >- float3, yuvCscStandardEXT); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, TExtension::EXT_YUV_target, float3, "yuv_2_rgb", >- float3, yuvCscStandardEXT); >- } >- >- if (type == GL_FRAGMENT_SHADER) >- { >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler2D, float2, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler3D, float3, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsamplerCube, float3, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler2DArray, float3, >- float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler2D, float3, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler2D, float4, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler3D, float4, float1); >- >- if (resources.OES_EGL_image_external_essl3) >- { >- const TType *samplerExternalOES = TCache::getType(EbtSamplerExternalOES); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "texture", samplerExternalOES, float2, >- float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "textureProj", samplerExternalOES, >- float3, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "textureProj", samplerExternalOES, >- float4, float1); >- } >- >- if (resources.EXT_YUV_target) >- { >- const TType *samplerExternal2DY2YEXT = TCache::getType(EbtSamplerExternal2DY2YEXT); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, TExtension::EXT_YUV_target, float4, "texture", >- samplerExternal2DY2YEXT, float2, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, TExtension::EXT_YUV_target, float4, >- "textureProj", samplerExternal2DY2YEXT, float3, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, TExtension::EXT_YUV_target, float4, >- "textureProj", samplerExternal2DY2YEXT, float4, float1); >- } >- } >- >- const TType *sampler2DShadow = TCache::getType(EbtSampler2DShadow); >- const TType *samplerCubeShadow = TCache::getType(EbtSamplerCubeShadow); >- const TType *sampler2DArrayShadow = TCache::getType(EbtSampler2DArrayShadow); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", sampler2DShadow, float3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", samplerCubeShadow, float4); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", sampler2DArrayShadow, float4); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProj", sampler2DShadow, float4); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureLod", sampler2DShadow, float3, >- float1); >- >- if (type == GL_FRAGMENT_SHADER) >- { >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", sampler2DShadow, float3, >- float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", samplerCubeShadow, float4, >- float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProj", sampler2DShadow, float4, >- float1); >- } >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", gsampler2D, int1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "textureSize", gsampler3D, int1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", gsamplerCube, int1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "textureSize", gsampler2DArray, int1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", sampler2DShadow, int1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", samplerCubeShadow, int1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "textureSize", sampler2DArrayShadow, int1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", gsampler2DMS); >- >- if (resources.OES_EGL_image_external_essl3) >- { >- const TType *samplerExternalOES = TCache::getType(EbtSamplerExternalOES); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", samplerExternalOES, int1); >- } >- >- if (resources.EXT_YUV_target) >- { >- const TType *samplerExternal2DY2YEXT = TCache::getType(EbtSamplerExternal2DY2YEXT); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, TExtension::EXT_YUV_target, int2, "textureSize", >- samplerExternal2DY2YEXT, int1); >- } >- >- if (type == GL_FRAGMENT_SHADER) >- { >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpDFdx, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpDFdy, genType, genType); >- symbolTable.insertBuiltInOp(ESSL3_BUILTINS, EOpFwidth, genType, genType); >- } >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler2D, float2, int2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler3D, float3, int3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureOffset", sampler2DShadow, float3, >- int2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler2DArray, float3, >- int2); >- >- if (type == GL_FRAGMENT_SHADER) >- { >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler2D, float2, int2, >- float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler3D, float3, int3, >- float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureOffset", sampler2DShadow, float3, >- int2, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler2DArray, float3, >- int2, float1); >- } >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler2D, float3, int2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler2D, float4, int2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler3D, float4, int3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjOffset", sampler2DShadow, float4, >- int2); >- >- if (type == GL_FRAGMENT_SHADER) >- { >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler2D, float3, >- int2, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler2D, float4, >- int2, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler3D, float4, >- int3, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjOffset", sampler2DShadow, >- float4, int2, float1); >- } >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLodOffset", gsampler2D, float2, float1, >- int2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLodOffset", gsampler3D, float3, float1, >- int3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureLodOffset", sampler2DShadow, float3, >- float1, int2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLodOffset", gsampler2DArray, float3, >- float1, int2); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLod", gsampler2D, float3, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLod", gsampler2D, float4, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLod", gsampler3D, float4, float1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjLod", sampler2DShadow, float4, >- float1); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLodOffset", gsampler2D, float3, >- float1, int2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLodOffset", gsampler2D, float4, >- float1, int2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLodOffset", gsampler3D, float4, >- float1, int3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjLodOffset", sampler2DShadow, >- float4, float1, int2); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetch", gsampler2D, int2, int1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetch", gsampler3D, int3, int1); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetch", gsampler2DArray, int3, int1); >- >- if (resources.OES_EGL_image_external_essl3) >- { >- const TType *samplerExternalOES = TCache::getType(EbtSamplerExternalOES); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "texelFetch", samplerExternalOES, int2, >- int1); >- } >- >- if (resources.EXT_YUV_target) >- { >- const TType *samplerExternal2DY2YEXT = TCache::getType(EbtSamplerExternal2DY2YEXT); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, TExtension::EXT_YUV_target, float4, "texelFetch", >- samplerExternal2DY2YEXT, int2, int1); >- } >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetchOffset", gsampler2D, int2, int1, >- int2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetchOffset", gsampler3D, int3, int1, >- int3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetchOffset", gsampler2DArray, int3, >- int1, int2); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad", gsampler2D, float2, float2, >- float2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad", gsampler3D, float3, float3, >- float3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad", gsamplerCube, float3, float3, >- float3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGrad", sampler2DShadow, float3, >- float2, float2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGrad", samplerCubeShadow, float4, >- float3, float3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad", gsampler2DArray, float3, float2, >- float2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGrad", sampler2DArrayShadow, float4, >- float2, float2); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGradOffset", gsampler2D, float2, >- float2, float2, int2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGradOffset", gsampler3D, float3, >- float3, float3, int3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGradOffset", sampler2DShadow, float3, >- float2, float2, int2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGradOffset", gsampler2DArray, float3, >- float2, float2, int2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGradOffset", sampler2DArrayShadow, >- float4, float2, float2, int2); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGrad", gsampler2D, float3, float2, >- float2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGrad", gsampler2D, float4, float2, >- float2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGrad", gsampler3D, float4, float3, >- float3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjGrad", sampler2DShadow, float4, >- float2, float2); >- >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGradOffset", gsampler2D, float3, >- float2, float2, int2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGradOffset", gsampler2D, float4, >- float2, float2, int2); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGradOffset", gsampler3D, float4, >- float3, float3, int3); >- symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjGradOffset", sampler2DShadow, >- float4, float2, float2, int2); >- >- const TType *atomicCounter = TCache::getType(EbtAtomicCounter); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, uint1, "atomicCounter", atomicCounter); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, uint1, "atomicCounterIncrement", atomicCounter); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, uint1, "atomicCounterDecrement", atomicCounter); >- >- // Insert all atomic memory functions >- const TType *int1InOut = TCache::getType(EbtInt, EvqInOut); >- const TType *uint1InOut = TCache::getType(EbtUInt, EvqInOut); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, uint1, "atomicAdd", uint1InOut, uint1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int1, "atomicAdd", int1InOut, int1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, uint1, "atomicMin", uint1InOut, uint1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int1, "atomicMin", int1InOut, int1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, uint1, "atomicMax", uint1InOut, uint1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int1, "atomicMax", int1InOut, int1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, uint1, "atomicAnd", uint1InOut, uint1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int1, "atomicAnd", int1InOut, int1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, uint1, "atomicOr", uint1InOut, uint1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int1, "atomicOr", int1InOut, int1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, uint1, "atomicXor", uint1InOut, uint1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int1, "atomicXor", int1InOut, int1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, uint1, "atomicExchange", uint1InOut, uint1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int1, "atomicExchange", int1InOut, int1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, uint1, "atomicCompSwap", uint1InOut, uint1, uint1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int1, "atomicCompSwap", int1InOut, int1, int1); >- >- const TType *gimage2D = TCache::getType(EbtGImage2D); >- const TType *gimage3D = TCache::getType(EbtGImage3D); >- const TType *gimage2DArray = TCache::getType(EbtGImage2DArray); >- const TType *gimageCube = TCache::getType(EbtGImageCube); >- >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, voidType, "imageStore", gimage2D, int2, gvec4); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, voidType, "imageStore", gimage3D, int3, gvec4); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, voidType, "imageStore", gimage2DArray, int3, gvec4); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, voidType, "imageStore", gimageCube, int3, gvec4); >- >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "imageLoad", gimage2D, int2); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "imageLoad", gimage3D, int3); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "imageLoad", gimage2DArray, int3); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "imageLoad", gimageCube, int3); >- >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int2, "imageSize", gimage2D); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int3, "imageSize", gimage3D); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int3, "imageSize", gimage2DArray); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int2, "imageSize", gimageCube); >- >- symbolTable.insertBuiltInFunctionNoParameters(ESSL3_1_BUILTINS, EOpMemoryBarrier, voidType, >- "memoryBarrier"); >- symbolTable.insertBuiltInFunctionNoParameters(ESSL3_1_BUILTINS, EOpMemoryBarrierAtomicCounter, >- voidType, "memoryBarrierAtomicCounter"); >- symbolTable.insertBuiltInFunctionNoParameters(ESSL3_1_BUILTINS, EOpMemoryBarrierBuffer, >- voidType, "memoryBarrierBuffer"); >- symbolTable.insertBuiltInFunctionNoParameters(ESSL3_1_BUILTINS, EOpMemoryBarrierImage, voidType, >- "memoryBarrierImage"); >- >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "texelFetch", gsampler2DMS, int2, int1); >- >- // Insert all variations of textureGather. >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "textureGather", gsampler2D, float2); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "textureGather", gsampler2D, float2, int1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "textureGather", gsampler2DArray, float3); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "textureGather", gsampler2DArray, float3, >- int1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "textureGather", gsamplerCube, float3); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "textureGather", gsamplerCube, float3, int1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, float4, "textureGather", sampler2DShadow, float2); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, float4, "textureGather", sampler2DShadow, float2, >- float1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, float4, "textureGather", sampler2DArrayShadow, >- float3); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, float4, "textureGather", sampler2DArrayShadow, >- float3, float1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, float4, "textureGather", samplerCubeShadow, float3); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, float4, "textureGather", samplerCubeShadow, float3, >- float1); >- >- // Insert all variations of textureGatherOffset. >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "textureGatherOffset", gsampler2D, float2, >- int2); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "textureGatherOffset", gsampler2D, float2, >- int2, int1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "textureGatherOffset", gsampler2DArray, >- float3, int2); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "textureGatherOffset", gsampler2DArray, >- float3, int2, int1); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, float4, "textureGatherOffset", sampler2DShadow, >- float2, float1, int2); >- symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, float4, "textureGatherOffset", sampler2DArrayShadow, >- float3, float1, int2); >- >- if (type == GL_COMPUTE_SHADER) >- { >- symbolTable.insertBuiltInFunctionNoParameters(ESSL3_1_BUILTINS, EOpBarrier, voidType, >- "barrier"); >- symbolTable.insertBuiltInFunctionNoParameters(ESSL3_1_BUILTINS, EOpMemoryBarrierShared, >- voidType, "memoryBarrierShared"); >- symbolTable.insertBuiltInFunctionNoParameters(ESSL3_1_BUILTINS, EOpGroupMemoryBarrier, >- voidType, "groupMemoryBarrier"); >- } >- >- if (type == GL_GEOMETRY_SHADER_OES) >- { >- TExtension extension = TExtension::OES_geometry_shader; >- symbolTable.insertBuiltInFunctionNoParametersExt(ESSL3_1_BUILTINS, extension, EOpEmitVertex, >- voidType, "EmitVertex"); >- symbolTable.insertBuiltInFunctionNoParametersExt(ESSL3_1_BUILTINS, extension, >- EOpEndPrimitive, voidType, "EndPrimitive"); >- } >- >- // >- // Depth range in window coordinates >- // >- TFieldList *fields = NewPoolTFieldList(); >- TSourceLoc zeroSourceLoc = {0, 0, 0, 0}; >- auto highpFloat1 = new TType(EbtFloat, EbpHigh, EvqGlobal, 1); >- TField *near = new TField(highpFloat1, NewPoolTString("near"), zeroSourceLoc); >- TField *far = new TField(highpFloat1, NewPoolTString("far"), zeroSourceLoc); >- TField *diff = new TField(highpFloat1, NewPoolTString("diff"), zeroSourceLoc); >- fields->push_back(near); >- fields->push_back(far); >- fields->push_back(diff); >- TStructure *depthRangeStruct = >- new TStructure(&symbolTable, NewPoolTString("gl_DepthRangeParameters"), fields); >- symbolTable.insertStructType(COMMON_BUILTINS, depthRangeStruct); >- TType depthRangeType(depthRangeStruct); >- depthRangeType.setQualifier(EvqUniform); >- symbolTable.insertVariable(COMMON_BUILTINS, "gl_DepthRange", depthRangeType); >- >- // >- // Implementation dependent built-in constants. >- // >- symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexAttribs", resources.MaxVertexAttribs, >- EbpMedium); >- symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexUniformVectors", >- resources.MaxVertexUniformVectors, EbpMedium); >- symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexTextureImageUnits", >- resources.MaxVertexTextureImageUnits, EbpMedium); >- symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxCombinedTextureImageUnits", >- resources.MaxCombinedTextureImageUnits, EbpMedium); >- symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxTextureImageUnits", >- resources.MaxTextureImageUnits, EbpMedium); >- symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxFragmentUniformVectors", >- resources.MaxFragmentUniformVectors, EbpMedium); >- >- symbolTable.insertConstInt(ESSL1_BUILTINS, "gl_MaxVaryingVectors", resources.MaxVaryingVectors, >- EbpMedium); >- >- symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxDrawBuffers", resources.MaxDrawBuffers, >- EbpMedium); >- if (resources.EXT_blend_func_extended) >- { >- symbolTable.insertConstIntExt(COMMON_BUILTINS, TExtension::EXT_blend_func_extended, >- "gl_MaxDualSourceDrawBuffersEXT", >- resources.MaxDualSourceDrawBuffers, EbpMedium); >- } >- >- symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxVertexOutputVectors", >- resources.MaxVertexOutputVectors, EbpMedium); >- symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxFragmentInputVectors", >- resources.MaxFragmentInputVectors, EbpMedium); >- symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MinProgramTexelOffset", >- resources.MinProgramTexelOffset, EbpMedium); >- symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxProgramTexelOffset", >- resources.MaxProgramTexelOffset, EbpMedium); >- >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxImageUnits", resources.MaxImageUnits, >- EbpMedium); >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxVertexImageUniforms", >- resources.MaxVertexImageUniforms, EbpMedium); >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxFragmentImageUniforms", >- resources.MaxFragmentImageUniforms, EbpMedium); >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxComputeImageUniforms", >- resources.MaxComputeImageUniforms, EbpMedium); >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxCombinedImageUniforms", >- resources.MaxCombinedImageUniforms, EbpMedium); >- >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxCombinedShaderOutputResources", >- resources.MaxCombinedShaderOutputResources, EbpMedium); >- >- symbolTable.insertConstIvec3(ESSL3_1_BUILTINS, "gl_MaxComputeWorkGroupCount", >- resources.MaxComputeWorkGroupCount, EbpHigh); >- symbolTable.insertConstIvec3(ESSL3_1_BUILTINS, "gl_MaxComputeWorkGroupSize", >- resources.MaxComputeWorkGroupSize, EbpHigh); >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxComputeUniformComponents", >- resources.MaxComputeUniformComponents, EbpMedium); >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxComputeTextureImageUnits", >- resources.MaxComputeTextureImageUnits, EbpMedium); >- >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxComputeAtomicCounters", >- resources.MaxComputeAtomicCounters, EbpMedium); >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxComputeAtomicCounterBuffers", >- resources.MaxComputeAtomicCounterBuffers, EbpMedium); >- >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxVertexAtomicCounters", >- resources.MaxVertexAtomicCounters, EbpMedium); >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxFragmentAtomicCounters", >- resources.MaxFragmentAtomicCounters, EbpMedium); >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxCombinedAtomicCounters", >- resources.MaxCombinedAtomicCounters, EbpMedium); >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxAtomicCounterBindings", >- resources.MaxAtomicCounterBindings, EbpMedium); >- >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxVertexAtomicCounterBuffers", >- resources.MaxVertexAtomicCounterBuffers, EbpMedium); >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxFragmentAtomicCounterBuffers", >- resources.MaxFragmentAtomicCounterBuffers, EbpMedium); >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxCombinedAtomicCounterBuffers", >- resources.MaxCombinedAtomicCounterBuffers, EbpMedium); >- symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxAtomicCounterBufferSize", >- resources.MaxAtomicCounterBufferSize, EbpMedium); >- >- if (resources.OES_geometry_shader) >- { >- TExtension ext = TExtension::OES_geometry_shader; >- symbolTable.insertConstIntExt(ESSL3_1_BUILTINS, ext, "gl_MaxGeometryInputComponents", >- resources.MaxGeometryInputComponents, EbpMedium); >- symbolTable.insertConstIntExt(ESSL3_1_BUILTINS, ext, "gl_MaxGeometryOutputComponents", >- resources.MaxGeometryOutputComponents, EbpMedium); >- symbolTable.insertConstIntExt(ESSL3_1_BUILTINS, ext, "gl_MaxGeometryImageUniforms", >- resources.MaxGeometryImageUniforms, EbpMedium); >- symbolTable.insertConstIntExt(ESSL3_1_BUILTINS, ext, "gl_MaxGeometryTextureImageUnits", >- resources.MaxGeometryTextureImageUnits, EbpMedium); >- symbolTable.insertConstIntExt(ESSL3_1_BUILTINS, ext, "gl_MaxGeometryOutputVertices", >- resources.MaxGeometryOutputVertices, EbpMedium); >- symbolTable.insertConstIntExt(ESSL3_1_BUILTINS, ext, "gl_MaxGeometryTotalOutputComponents", >- resources.MaxGeometryTotalOutputComponents, EbpMedium); >- symbolTable.insertConstIntExt(ESSL3_1_BUILTINS, ext, "gl_MaxGeometryUniformComponents", >- resources.MaxGeometryUniformComponents, EbpMedium); >- symbolTable.insertConstIntExt(ESSL3_1_BUILTINS, ext, "gl_MaxGeometryAtomicCounters", >- resources.MaxGeometryAtomicCounters, EbpMedium); >- symbolTable.insertConstIntExt(ESSL3_1_BUILTINS, ext, "gl_MaxGeometryAtomicCounterBuffers", >- resources.MaxGeometryAtomicCounterBuffers, EbpMedium); >- } >-} >- >-void IdentifyBuiltIns(sh::GLenum type, >- ShShaderSpec spec, >- const ShBuiltInResources &resources, >- TSymbolTable &symbolTable) >-{ >- // >- // Insert some special built-in variables that are not in >- // the built-in header files. >- // >- >- if (resources.OVR_multiview && type != GL_COMPUTE_SHADER) >- { >- symbolTable.insertVariableExt(ESSL3_BUILTINS, TExtension::OVR_multiview, "gl_ViewID_OVR", >- TType(EbtUInt, EbpHigh, EvqViewIDOVR, 1)); >- >- // ESSL 1.00 doesn't have unsigned integers, so gl_ViewID_OVR is a signed integer in ESSL >- // 1.00. This is specified in the WEBGL_multiview spec. >- symbolTable.insertVariableExt(ESSL1_BUILTINS, TExtension::OVR_multiview, "gl_ViewID_OVR", >- TType(EbtInt, EbpHigh, EvqViewIDOVR, 1)); >- } >- >- switch (type) >- { >- case GL_FRAGMENT_SHADER: >- { >- symbolTable.insertVariable(COMMON_BUILTINS, "gl_FragCoord", >- TType(EbtFloat, EbpMedium, EvqFragCoord, 4)); >- symbolTable.insertVariable(COMMON_BUILTINS, "gl_FrontFacing", >- TType(EbtBool, EbpUndefined, EvqFrontFacing, 1)); >- symbolTable.insertVariable(COMMON_BUILTINS, "gl_PointCoord", >- TType(EbtFloat, EbpMedium, EvqPointCoord, 2)); >- >- symbolTable.insertVariable(ESSL1_BUILTINS, "gl_FragColor", >- TType(EbtFloat, EbpMedium, EvqFragColor, 4)); >- TType fragData(EbtFloat, EbpMedium, EvqFragData, 4); >- if (spec != SH_WEBGL2_SPEC && spec != SH_WEBGL3_SPEC) >- { >- fragData.makeArray(resources.MaxDrawBuffers); >- } >- else >- { >- fragData.makeArray(1u); >- } >- symbolTable.insertVariable(ESSL1_BUILTINS, "gl_FragData", fragData); >- >- if (resources.EXT_blend_func_extended) >- { >- symbolTable.insertVariableExt( >- ESSL1_BUILTINS, TExtension::EXT_blend_func_extended, "gl_SecondaryFragColorEXT", >- TType(EbtFloat, EbpMedium, EvqSecondaryFragColorEXT, 4)); >- TType secondaryFragData(EbtFloat, EbpMedium, EvqSecondaryFragDataEXT, 4, 1); >- secondaryFragData.makeArray(resources.MaxDualSourceDrawBuffers); >- symbolTable.insertVariableExt(ESSL1_BUILTINS, TExtension::EXT_blend_func_extended, >- "gl_SecondaryFragDataEXT", secondaryFragData); >- } >- >- if (resources.EXT_frag_depth) >- { >- symbolTable.insertVariableExt( >- ESSL1_BUILTINS, TExtension::EXT_frag_depth, "gl_FragDepthEXT", >- TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium, >- EvqFragDepthEXT, 1)); >- } >- >- symbolTable.insertVariable(ESSL3_BUILTINS, "gl_FragDepth", >- TType(EbtFloat, EbpHigh, EvqFragDepth, 1)); >- >- if (resources.EXT_shader_framebuffer_fetch || resources.NV_shader_framebuffer_fetch) >- { >- TType lastFragData(EbtFloat, EbpMedium, EvqLastFragData, 4, 1); >- lastFragData.makeArray(resources.MaxDrawBuffers); >- >- if (resources.EXT_shader_framebuffer_fetch) >- { >- symbolTable.insertVariableExt(ESSL1_BUILTINS, >- TExtension::EXT_shader_framebuffer_fetch, >- "gl_LastFragData", lastFragData); >- } >- else if (resources.NV_shader_framebuffer_fetch) >- { >- symbolTable.insertVariableExt( >- ESSL1_BUILTINS, TExtension::NV_shader_framebuffer_fetch, "gl_LastFragColor", >- TType(EbtFloat, EbpMedium, EvqLastFragColor, 4)); >- symbolTable.insertVariableExt(ESSL1_BUILTINS, >- TExtension::NV_shader_framebuffer_fetch, >- "gl_LastFragData", lastFragData); >- } >- } >- else if (resources.ARM_shader_framebuffer_fetch) >- { >- symbolTable.insertVariableExt( >- ESSL1_BUILTINS, TExtension::ARM_shader_framebuffer_fetch, "gl_LastFragColorARM", >- TType(EbtFloat, EbpMedium, EvqLastFragColor, 4)); >- } >- >- if (resources.OES_geometry_shader) >- { >- TExtension extension = TExtension::OES_geometry_shader; >- symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_PrimitiveID", >- TType(EbtInt, EbpHigh, EvqPrimitiveID, 1)); >- symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_Layer", >- TType(EbtInt, EbpHigh, EvqLayer, 1)); >- } >- >- break; >- } >- case GL_VERTEX_SHADER: >- { >- symbolTable.insertVariable(COMMON_BUILTINS, "gl_Position", >- TType(EbtFloat, EbpHigh, EvqPosition, 4)); >- symbolTable.insertVariable(COMMON_BUILTINS, "gl_PointSize", >- TType(EbtFloat, EbpMedium, EvqPointSize, 1)); >- symbolTable.insertVariable(ESSL3_BUILTINS, "gl_InstanceID", >- TType(EbtInt, EbpHigh, EvqInstanceID, 1)); >- symbolTable.insertVariable(ESSL3_BUILTINS, "gl_VertexID", >- TType(EbtInt, EbpHigh, EvqVertexID, 1)); >- >- // For internal use by ANGLE - not exposed to the parser. >- symbolTable.insertVariable(GLSL_BUILTINS, "gl_ViewportIndex", >- TType(EbtInt, EbpHigh, EvqViewportIndex)); >- // gl_Layer exists in other shader stages in ESSL, but not in vertex shader so far. >- symbolTable.insertVariable(GLSL_BUILTINS, "gl_Layer", TType(EbtInt, EbpHigh, EvqLayer)); >- break; >- } >- case GL_COMPUTE_SHADER: >- { >- symbolTable.insertVariable(ESSL3_1_BUILTINS, "gl_NumWorkGroups", >- TType(EbtUInt, EbpUndefined, EvqNumWorkGroups, 3)); >- symbolTable.insertVariable(ESSL3_1_BUILTINS, "gl_WorkGroupSize", >- TType(EbtUInt, EbpUndefined, EvqWorkGroupSize, 3)); >- symbolTable.insertVariable(ESSL3_1_BUILTINS, "gl_WorkGroupID", >- TType(EbtUInt, EbpUndefined, EvqWorkGroupID, 3)); >- symbolTable.insertVariable(ESSL3_1_BUILTINS, "gl_LocalInvocationID", >- TType(EbtUInt, EbpUndefined, EvqLocalInvocationID, 3)); >- symbolTable.insertVariable(ESSL3_1_BUILTINS, "gl_GlobalInvocationID", >- TType(EbtUInt, EbpUndefined, EvqGlobalInvocationID, 3)); >- symbolTable.insertVariable(ESSL3_1_BUILTINS, "gl_LocalInvocationIndex", >- TType(EbtUInt, EbpUndefined, EvqLocalInvocationIndex, 1)); >- break; >- } >- >- case GL_GEOMETRY_SHADER_OES: >- { >- TExtension extension = TExtension::OES_geometry_shader; >- >- // Add built-in interface block gl_PerVertex and the built-in array gl_in. >- // TODO(jiawei.shao@intel.com): implement GL_OES_geometry_point_size. >- const TString *glPerVertexString = NewPoolTString("gl_PerVertex"); >- symbolTable.insertInterfaceBlockNameExt(ESSL3_1_BUILTINS, extension, glPerVertexString); >- >- TFieldList *fieldList = NewPoolTFieldList(); >- TSourceLoc zeroSourceLoc = {0, 0, 0, 0}; >- TField *glPositionField = new TField(new TType(EbtFloat, EbpHigh, EvqPosition, 4), >- NewPoolTString("gl_Position"), zeroSourceLoc); >- fieldList->push_back(glPositionField); >- >- TInterfaceBlock *glInBlock = new TInterfaceBlock( >- glPerVertexString, fieldList, NewPoolTString("gl_in"), TLayoutQualifier::Create()); >- >- // The array size of gl_in is undefined until we get a valid input primitive >- // declaration. >- TType glInType(glInBlock, EvqPerVertexIn, TLayoutQualifier::Create()); >- glInType.makeArray(0u); >- symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_in", glInType); >- >- TType glPositionType(EbtFloat, EbpHigh, EvqPosition, 4); >- glPositionType.setInterfaceBlock(new TInterfaceBlock( >- glPerVertexString, fieldList, nullptr, TLayoutQualifier::Create())); >- symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_Position", >- glPositionType); >- symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_PrimitiveIDIn", >- TType(EbtInt, EbpHigh, EvqPrimitiveIDIn, 1)); >- symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_InvocationID", >- TType(EbtInt, EbpHigh, EvqInvocationID, 1)); >- symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_PrimitiveID", >- TType(EbtInt, EbpHigh, EvqPrimitiveID, 1)); >- symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_Layer", >- TType(EbtInt, EbpHigh, EvqLayer, 1)); >- >- break; >- } >- default: >- UNREACHABLE(); >- } >-} >- > void InitExtensionBehavior(const ShBuiltInResources &resources, TExtensionBehavior &extBehavior) > { > if (resources.OES_standard_derivatives) >@@ -1102,19 +61,30 @@ void InitExtensionBehavior(const ShBuiltInResources &resources, TExtensionBehavi > { > extBehavior[TExtension::ARM_shader_framebuffer_fetch] = EBhUndefined; > } >- if (resources.OVR_multiview) >+ if (resources.OVR_multiview2) > { >- extBehavior[TExtension::OVR_multiview] = EBhUndefined; >+ extBehavior[TExtension::OVR_multiview2] = EBhUndefined; > } > if (resources.EXT_YUV_target) > { > extBehavior[TExtension::EXT_YUV_target] = EBhUndefined; > } >- if (resources.OES_geometry_shader) >+ if (resources.EXT_geometry_shader) > { >- extBehavior[TExtension::OES_geometry_shader] = EBhUndefined; > extBehavior[TExtension::EXT_geometry_shader] = EBhUndefined; > } >+ if (resources.OES_texture_storage_multisample_2d_array) >+ { >+ extBehavior[TExtension::OES_texture_storage_multisample_2d_array] = EBhUndefined; >+ } >+ if (resources.ANGLE_texture_multisample) >+ { >+ extBehavior[TExtension::ANGLE_texture_multisample] = EBhUndefined; >+ } >+ if (resources.ANGLE_multi_draw) >+ { >+ extBehavior[TExtension::ANGLE_multi_draw] = EBhUndefined; >+ } > } > > void ResetExtensionBehavior(TExtensionBehavior &extBehavior) >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.h b/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.h >index 2e61218a0f1..290af566847 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.h >@@ -14,16 +14,6 @@ > namespace sh > { > >-void InsertBuiltInFunctions(sh::GLenum type, >- ShShaderSpec spec, >- const ShBuiltInResources &resources, >- TSymbolTable &table); >- >-void IdentifyBuiltIns(sh::GLenum type, >- ShShaderSpec spec, >- const ShBuiltInResources &resources, >- TSymbolTable &symbolTable); >- > void InitExtensionBehavior(const ShBuiltInResources &resources, > TExtensionBehavior &extensionBehavior); > >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeDll.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeDll.cpp >index 43c215f52b5..06983645008 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeDll.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeDll.cpp >@@ -4,7 +4,6 @@ > // found in the LICENSE file. > // > >-#include "compiler/translator/Cache.h" > #include "compiler/translator/InitializeDll.h" > #include "compiler/translator/InitializeGlobals.h" > >@@ -23,15 +22,12 @@ bool InitProcess() > return false; > } > >- TCache::initialize(); >- > return true; > } > > void DetachProcess() > { > FreePoolIndex(); >- TCache::destroy(); > } > > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeVariables.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeVariables.cpp >deleted file mode 100644 >index aa1a042facd..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeVariables.cpp >+++ /dev/null >@@ -1,290 +0,0 @@ >-// >-// Copyright (c) 2002-2013 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. >-// >- >-#include "compiler/translator/InitializeVariables.h" >- >-#include "angle_gl.h" >-#include "common/debug.h" >-#include "compiler/translator/FindMain.h" >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/IntermTraverse.h" >-#include "compiler/translator/SymbolTable.h" >-#include "compiler/translator/util.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-void AddArrayZeroInitSequence(const TIntermTyped *initializedNode, >- bool canUseLoopsToInitialize, >- TIntermSequence *initSequenceOut, >- TSymbolTable *symbolTable); >- >-void AddStructZeroInitSequence(const TIntermTyped *initializedNode, >- bool canUseLoopsToInitialize, >- TIntermSequence *initSequenceOut, >- TSymbolTable *symbolTable); >- >-TIntermBinary *CreateZeroInitAssignment(const TIntermTyped *initializedNode) >-{ >- TIntermTyped *zero = CreateZeroNode(initializedNode->getType()); >- return new TIntermBinary(EOpAssign, initializedNode->deepCopy(), zero); >-} >- >-void AddZeroInitSequence(const TIntermTyped *initializedNode, >- bool canUseLoopsToInitialize, >- TIntermSequence *initSequenceOut, >- TSymbolTable *symbolTable) >-{ >- if (initializedNode->isArray()) >- { >- AddArrayZeroInitSequence(initializedNode, canUseLoopsToInitialize, initSequenceOut, >- symbolTable); >- } >- else if (initializedNode->getType().isStructureContainingArrays() || >- initializedNode->getType().isNamelessStruct()) >- { >- AddStructZeroInitSequence(initializedNode, canUseLoopsToInitialize, initSequenceOut, >- symbolTable); >- } >- else >- { >- initSequenceOut->push_back(CreateZeroInitAssignment(initializedNode)); >- } >-} >- >-void AddStructZeroInitSequence(const TIntermTyped *initializedNode, >- bool canUseLoopsToInitialize, >- TIntermSequence *initSequenceOut, >- TSymbolTable *symbolTable) >-{ >- ASSERT(initializedNode->getBasicType() == EbtStruct); >- const TStructure *structType = initializedNode->getType().getStruct(); >- for (int i = 0; i < static_cast<int>(structType->fields().size()); ++i) >- { >- TIntermBinary *element = new TIntermBinary(EOpIndexDirectStruct, >- initializedNode->deepCopy(), CreateIndexNode(i)); >- // Structs can't be defined inside structs, so the type of a struct field can't be a >- // nameless struct. >- ASSERT(!element->getType().isNamelessStruct()); >- AddZeroInitSequence(element, canUseLoopsToInitialize, initSequenceOut, symbolTable); >- } >-} >- >-void AddArrayZeroInitStatementList(const TIntermTyped *initializedNode, >- bool canUseLoopsToInitialize, >- TIntermSequence *initSequenceOut, >- TSymbolTable *symbolTable) >-{ >- for (unsigned int i = 0; i < initializedNode->getOutermostArraySize(); ++i) >- { >- TIntermBinary *element = >- new TIntermBinary(EOpIndexDirect, initializedNode->deepCopy(), CreateIndexNode(i)); >- AddZeroInitSequence(element, canUseLoopsToInitialize, initSequenceOut, symbolTable); >- } >-} >- >-void AddArrayZeroInitForLoop(const TIntermTyped *initializedNode, >- TIntermSequence *initSequenceOut, >- TSymbolTable *symbolTable) >-{ >- ASSERT(initializedNode->isArray()); >- TSymbolUniqueId indexSymbol(symbolTable); >- >- TIntermSymbol *indexSymbolNode = CreateTempSymbolNode(indexSymbol, TType(EbtInt), EvqTemporary); >- TIntermDeclaration *indexInit = >- CreateTempInitDeclarationNode(indexSymbol, CreateZeroNode(TType(EbtInt)), EvqTemporary); >- TIntermConstantUnion *arraySizeNode = CreateIndexNode(initializedNode->getOutermostArraySize()); >- TIntermBinary *indexSmallerThanSize = >- new TIntermBinary(EOpLessThan, indexSymbolNode->deepCopy(), arraySizeNode); >- TIntermUnary *indexIncrement = new TIntermUnary(EOpPreIncrement, indexSymbolNode->deepCopy()); >- >- TIntermBlock *forLoopBody = new TIntermBlock(); >- TIntermSequence *forLoopBodySeq = forLoopBody->getSequence(); >- >- TIntermBinary *element = new TIntermBinary(EOpIndexIndirect, initializedNode->deepCopy(), >- indexSymbolNode->deepCopy()); >- AddZeroInitSequence(element, true, forLoopBodySeq, symbolTable); >- >- TIntermLoop *forLoop = >- new TIntermLoop(ELoopFor, indexInit, indexSmallerThanSize, indexIncrement, forLoopBody); >- initSequenceOut->push_back(forLoop); >-} >- >-void AddArrayZeroInitSequence(const TIntermTyped *initializedNode, >- bool canUseLoopsToInitialize, >- TIntermSequence *initSequenceOut, >- TSymbolTable *symbolTable) >-{ >- // The array elements are assigned one by one to keep the AST compatible with ESSL 1.00 which >- // doesn't have array assignment. We'll do this either with a for loop or just a list of >- // statements assigning to each array index. Note that it is important to have the array init in >- // the right order to workaround http://crbug.com/709317 >- bool isSmallArray = initializedNode->getOutermostArraySize() <= 1u || >- (initializedNode->getBasicType() != EbtStruct && >- !initializedNode->getType().isArrayOfArrays() && >- initializedNode->getOutermostArraySize() <= 3u); >- if (initializedNode->getQualifier() == EvqFragData || >- initializedNode->getQualifier() == EvqFragmentOut || isSmallArray || >- !canUseLoopsToInitialize) >- { >- // Fragment outputs should not be indexed by non-constant indices. >- // Also it doesn't make sense to use loops to initialize very small arrays. >- AddArrayZeroInitStatementList(initializedNode, canUseLoopsToInitialize, initSequenceOut, >- symbolTable); >- } >- else >- { >- AddArrayZeroInitForLoop(initializedNode, initSequenceOut, symbolTable); >- } >-} >- >-void InsertInitCode(TIntermSequence *mainBody, >- const InitVariableList &variables, >- TSymbolTable *symbolTable, >- int shaderVersion, >- const TExtensionBehavior &extensionBehavior, >- bool canUseLoopsToInitialize) >-{ >- for (const auto &var : variables) >- { >- TString name = TString(var.name.c_str()); >- size_t pos = name.find_last_of('['); >- if (pos != TString::npos) >- { >- name = name.substr(0, pos); >- } >- >- TIntermTyped *initializedSymbol = nullptr; >- if (var.isBuiltIn()) >- { >- initializedSymbol = ReferenceBuiltInVariable(name, *symbolTable, shaderVersion); >- if (initializedSymbol->getQualifier() == EvqFragData && >- !IsExtensionEnabled(extensionBehavior, TExtension::EXT_draw_buffers)) >- { >- // If GL_EXT_draw_buffers is disabled, only the 0th index of gl_FragData can be >- // written to. >- // TODO(oetuaho): This is a bit hacky and would be better to remove, if we came up >- // with a good way to do it. Right now "gl_FragData" in symbol table is initialized >- // to have the array size of MaxDrawBuffers, and the initialization happens before >- // the shader sets the extensions it is using. >- initializedSymbol = >- new TIntermBinary(EOpIndexDirect, initializedSymbol, CreateIndexNode(0)); >- } >- } >- else >- { >- initializedSymbol = ReferenceGlobalVariable(name, *symbolTable); >- } >- ASSERT(initializedSymbol != nullptr); >- >- TIntermSequence *initCode = >- CreateInitCode(initializedSymbol, canUseLoopsToInitialize, symbolTable); >- mainBody->insert(mainBody->begin(), initCode->begin(), initCode->end()); >- } >-} >- >-class InitializeLocalsTraverser : public TIntermTraverser >-{ >- public: >- InitializeLocalsTraverser(int shaderVersion, >- TSymbolTable *symbolTable, >- bool canUseLoopsToInitialize) >- : TIntermTraverser(true, false, false, symbolTable), >- mShaderVersion(shaderVersion), >- mCanUseLoopsToInitialize(canUseLoopsToInitialize) >- { >- } >- >- protected: >- bool visitDeclaration(Visit visit, TIntermDeclaration *node) override >- { >- for (TIntermNode *declarator : *node->getSequence()) >- { >- if (!mInGlobalScope && !declarator->getAsBinaryNode()) >- { >- TIntermSymbol *symbol = declarator->getAsSymbolNode(); >- ASSERT(symbol); >- if (symbol->getSymbol() == "") >- { >- continue; >- } >- >- // Arrays may need to be initialized one element at a time, since ESSL 1.00 does not >- // support array constructors or assigning arrays. >- bool arrayConstructorUnavailable = >- (symbol->isArray() || symbol->getType().isStructureContainingArrays()) && >- mShaderVersion == 100; >- // Nameless struct constructors can't be referred to, so they also need to be >- // initialized one element at a time. >- // TODO(oetuaho): Check if it makes sense to initialize using a loop, even if we >- // could use an initializer. It could at least reduce code size for very large >- // arrays, but could hurt runtime performance. >- if (arrayConstructorUnavailable || symbol->getType().isNamelessStruct()) >- { >- // SimplifyLoopConditions should have been run so the parent node of this node >- // should not be a loop. >- ASSERT(getParentNode()->getAsLoopNode() == nullptr); >- // SeparateDeclarations should have already been run, so we don't need to worry >- // about further declarators in this declaration depending on the effects of >- // this declarator. >- ASSERT(node->getSequence()->size() == 1); >- insertStatementsInParentBlock( >- TIntermSequence(), >- *CreateInitCode(symbol, mCanUseLoopsToInitialize, mSymbolTable)); >- } >- else >- { >- TIntermBinary *init = >- new TIntermBinary(EOpInitialize, symbol, CreateZeroNode(symbol->getType())); >- queueReplacementWithParent(node, symbol, init, OriginalNode::BECOMES_CHILD); >- } >- } >- } >- return false; >- } >- >- private: >- int mShaderVersion; >- bool mCanUseLoopsToInitialize; >-}; >- >-} // namespace anonymous >- >-TIntermSequence *CreateInitCode(const TIntermTyped *initializedSymbol, >- bool canUseLoopsToInitialize, >- TSymbolTable *symbolTable) >-{ >- TIntermSequence *initCode = new TIntermSequence(); >- AddZeroInitSequence(initializedSymbol, canUseLoopsToInitialize, initCode, symbolTable); >- return initCode; >-} >- >-void InitializeUninitializedLocals(TIntermBlock *root, >- int shaderVersion, >- bool canUseLoopsToInitialize, >- TSymbolTable *symbolTable) >-{ >- InitializeLocalsTraverser traverser(shaderVersion, symbolTable, canUseLoopsToInitialize); >- root->traverse(&traverser); >- traverser.updateTree(); >-} >- >-void InitializeVariables(TIntermBlock *root, >- const InitVariableList &vars, >- TSymbolTable *symbolTable, >- int shaderVersion, >- const TExtensionBehavior &extensionBehavior, >- bool canUseLoopsToInitialize) >-{ >- TIntermBlock *body = FindMainBody(root); >- InsertInitCode(body->getSequence(), vars, symbolTable, shaderVersion, extensionBehavior, >- canUseLoopsToInitialize); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeVariables.h b/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeVariables.h >deleted file mode 100644 >index 1a7b3c0f241..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeVariables.h >+++ /dev/null >@@ -1,53 +0,0 @@ >-// >-// Copyright (c) 2002-2013 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. >-// >- >-#ifndef COMPILER_TRANSLATOR_INITIALIZEVARIABLES_H_ >-#define COMPILER_TRANSLATOR_INITIALIZEVARIABLES_H_ >- >-#include <GLSLANG/ShaderLang.h> >- >-#include "compiler/translator/ExtensionBehavior.h" >-#include "compiler/translator/IntermNode.h" >- >-namespace sh >-{ >-class TSymbolTable; >- >-typedef std::vector<sh::ShaderVariable> InitVariableList; >- >-// For all of the functions below: If canUseLoopsToInitialize is set, for loops are used instead of >-// a large number of initializers where it can make sense, such as for initializing large arrays. >- >-// Return a sequence of assignment operations to initialize "initializedSymbol". initializedSymbol >-// may be an array, struct or any combination of these, as long as it contains only basic types. >-TIntermSequence *CreateInitCode(const TIntermTyped *initializedSymbol, >- bool canUseLoopsToInitialize, >- TSymbolTable *symbolTable); >- >-// Initialize all uninitialized local variables, so that undefined behavior is avoided. >-void InitializeUninitializedLocals(TIntermBlock *root, >- int shaderVersion, >- bool canUseLoopsToInitialize, >- TSymbolTable *symbolTable); >- >-// This function can initialize all the types that CreateInitCode is able to initialize. All >-// variables must be globals which can be found in the symbol table. For now it is used for the >-// following two scenarios: >-// 1. Initializing gl_Position; >-// 2. Initializing output variables referred to in the shader source. >-// Note: The type of each lvalue in an initializer is retrieved from the symbol table. gl_FragData >-// requires special handling because the number of indices which can be initialized is determined by >-// enabled extensions. >-void InitializeVariables(TIntermBlock *root, >- const InitVariableList &vars, >- TSymbolTable *symbolTable, >- int shaderVersion, >- const TExtensionBehavior &extensionBehavior, >- bool canUseLoopsToInitialize); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_INITIALIZEVARIABLES_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.cpp >index a57ffcb4bc4..f460174d5b1 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.cpp >@@ -18,6 +18,7 @@ > #include "common/mathutil.h" > #include "common/matrix_utils.h" > #include "compiler/translator/Diagnostics.h" >+#include "compiler/translator/ImmutableString.h" > #include "compiler/translator/IntermNode.h" > #include "compiler/translator/SymbolTable.h" > #include "compiler/translator/util.h" >@@ -41,7 +42,7 @@ TConstantUnion *Vectorize(const TConstantUnion &constant, size_t size) > { > TConstantUnion *constUnion = new TConstantUnion[size]; > for (unsigned int i = 0; i < size; ++i) >- constUnion[i] = constant; >+ constUnion[i] = constant; > > return constUnion; > } >@@ -95,23 +96,19 @@ float VectorDotProduct(const TConstantUnion *paramArray1, > return result; > } > >-TIntermTyped *CreateFoldedNode(const TConstantUnion *constArray, >- const TIntermTyped *originalNode, >- TQualifier qualifier) >+TIntermTyped *CreateFoldedNode(const TConstantUnion *constArray, const TIntermTyped *originalNode) > { >- if (constArray == nullptr) >- { >- return nullptr; >- } >+ ASSERT(constArray != nullptr); >+ // Note that we inherit whatever qualifier the folded node had. Nodes may be constant folded >+ // without being qualified as constant. > TIntermTyped *folded = new TIntermConstantUnion(constArray, originalNode->getType()); >- folded->getTypePointer()->setQualifier(qualifier); > folded->setLine(originalNode->getLine()); > return folded; > } > > angle::Matrix<float> GetMatrix(const TConstantUnion *paramArray, >- const unsigned int &rows, >- const unsigned int &cols) >+ const unsigned int rows, >+ const unsigned int cols) > { > std::vector<float> elements; > for (size_t i = 0; i < rows * cols; i++) >@@ -122,7 +119,7 @@ angle::Matrix<float> GetMatrix(const TConstantUnion *paramArray, > return angle::Matrix<float>(elements, cols, rows).transpose(); > } > >-angle::Matrix<float> GetMatrix(const TConstantUnion *paramArray, const unsigned int &size) >+angle::Matrix<float> GetMatrix(const TConstantUnion *paramArray, const unsigned int size) > { > std::vector<float> elements; > for (size_t i = 0; i < size * size; i++) >@@ -142,7 +139,43 @@ void SetUnionArrayFromMatrix(const angle::Matrix<float> &m, TConstantUnion *resu > resultArray[i].setFConst(resultElements[i]); > } > >-} // namespace anonymous >+bool CanFoldAggregateBuiltInOp(TOperator op) >+{ >+ switch (op) >+ { >+ case EOpAtan: >+ case EOpPow: >+ case EOpMod: >+ case EOpMin: >+ case EOpMax: >+ case EOpClamp: >+ case EOpMix: >+ case EOpStep: >+ case EOpSmoothstep: >+ case EOpLdexp: >+ case EOpMulMatrixComponentWise: >+ case EOpOuterProduct: >+ case EOpEqualComponentWise: >+ case EOpNotEqualComponentWise: >+ case EOpLessThanComponentWise: >+ case EOpLessThanEqualComponentWise: >+ case EOpGreaterThanComponentWise: >+ case EOpGreaterThanEqualComponentWise: >+ case EOpDistance: >+ case EOpDot: >+ case EOpCross: >+ case EOpFaceforward: >+ case EOpReflect: >+ case EOpRefract: >+ case EOpBitfieldExtract: >+ case EOpBitfieldInsert: >+ return true; >+ default: >+ return false; >+ } >+} >+ >+} // namespace > > //////////////////////////////////////////////////////////////// > // >@@ -150,7 +183,9 @@ void SetUnionArrayFromMatrix(const angle::Matrix<float> &m, TConstantUnion *resu > // > //////////////////////////////////////////////////////////////// > >-void TIntermTyped::setTypePreservePrecision(const TType &t) >+TIntermExpression::TIntermExpression(const TType &t) : TIntermTyped(), mType(t) {} >+ >+void TIntermExpression::setTypePreservePrecision(const TType &t) > { > TPrecision precision = getPrecision(); > mType = t; >@@ -159,11 +194,69 @@ void TIntermTyped::setTypePreservePrecision(const TType &t) > } > > #define REPLACE_IF_IS(node, type, original, replacement) \ >- if (node == original) \ >+ do \ > { \ >- node = static_cast<type *>(replacement); \ >- return true; \ >+ if (node == original) \ >+ { \ >+ node = static_cast<type *>(replacement); \ >+ return true; \ >+ } \ >+ } while (0) >+ >+size_t TIntermSymbol::getChildCount() const >+{ >+ return 0; >+} >+ >+TIntermNode *TIntermSymbol::getChildNode(size_t index) const >+{ >+ UNREACHABLE(); >+ return nullptr; >+} >+ >+size_t TIntermConstantUnion::getChildCount() const >+{ >+ return 0; >+} >+ >+TIntermNode *TIntermConstantUnion::getChildNode(size_t index) const >+{ >+ UNREACHABLE(); >+ return nullptr; >+} >+ >+size_t TIntermLoop::getChildCount() const >+{ >+ return (mInit ? 1 : 0) + (mCond ? 1 : 0) + (mExpr ? 1 : 0) + (mBody ? 1 : 0); >+} >+ >+TIntermNode *TIntermLoop::getChildNode(size_t index) const >+{ >+ TIntermNode *children[4]; >+ unsigned int childIndex = 0; >+ if (mInit) >+ { >+ children[childIndex] = mInit; >+ ++childIndex; >+ } >+ if (mCond) >+ { >+ children[childIndex] = mCond; >+ ++childIndex; >+ } >+ if (mExpr) >+ { >+ children[childIndex] = mExpr; >+ ++childIndex; > } >+ if (mBody) >+ { >+ children[childIndex] = mBody; >+ ++childIndex; >+ } >+ ASSERT(index < childIndex); >+ return children[index]; >+} > > bool TIntermLoop::replaceChildNode(TIntermNode *original, TIntermNode *replacement) > { >@@ -175,12 +268,36 @@ bool TIntermLoop::replaceChildNode(TIntermNode *original, TIntermNode *replaceme > return false; > } > >+size_t TIntermBranch::getChildCount() const >+{ >+ return (mExpression ? 1 : 0); >+} >+ >+TIntermNode *TIntermBranch::getChildNode(size_t index) const >+{ >+ ASSERT(mExpression); >+ ASSERT(index == 0); >+ return mExpression; >+} >+ > bool TIntermBranch::replaceChildNode(TIntermNode *original, TIntermNode *replacement) > { > REPLACE_IF_IS(mExpression, TIntermTyped, original, replacement); > return false; > } > >+size_t TIntermSwizzle::getChildCount() const >+{ >+ return 1; >+} >+ >+TIntermNode *TIntermSwizzle::getChildNode(size_t index) const >+{ >+ ASSERT(mOperand); >+ ASSERT(index == 0); >+ return mOperand; >+} >+ > bool TIntermSwizzle::replaceChildNode(TIntermNode *original, TIntermNode *replacement) > { > ASSERT(original->getAsTyped()->getType() == replacement->getAsTyped()->getType()); >@@ -188,6 +305,21 @@ bool TIntermSwizzle::replaceChildNode(TIntermNode *original, TIntermNode *replac > return false; > } > >+size_t TIntermBinary::getChildCount() const >+{ >+ return 2; >+} >+ >+TIntermNode *TIntermBinary::getChildNode(size_t index) const >+{ >+ ASSERT(index < 2); >+ if (index == 0) >+ { >+ return mLeft; >+ } >+ return mRight; >+} >+ > bool TIntermBinary::replaceChildNode(TIntermNode *original, TIntermNode *replacement) > { > REPLACE_IF_IS(mLeft, TIntermTyped, original, replacement); >@@ -195,6 +327,18 @@ bool TIntermBinary::replaceChildNode(TIntermNode *original, TIntermNode *replace > return false; > } > >+size_t TIntermUnary::getChildCount() const >+{ >+ return 1; >+} >+ >+TIntermNode *TIntermUnary::getChildNode(size_t index) const >+{ >+ ASSERT(mOperand); >+ ASSERT(index == 0); >+ return mOperand; >+} >+ > bool TIntermUnary::replaceChildNode(TIntermNode *original, TIntermNode *replacement) > { > ASSERT(original->getAsTyped()->getType() == replacement->getAsTyped()->getType()); >@@ -202,12 +346,39 @@ bool TIntermUnary::replaceChildNode(TIntermNode *original, TIntermNode *replacem > return false; > } > >+size_t TIntermInvariantDeclaration::getChildCount() const >+{ >+ return 1; >+} >+ >+TIntermNode *TIntermInvariantDeclaration::getChildNode(size_t index) const >+{ >+ ASSERT(mSymbol); >+ ASSERT(index == 0); >+ return mSymbol; >+} >+ > bool TIntermInvariantDeclaration::replaceChildNode(TIntermNode *original, TIntermNode *replacement) > { > REPLACE_IF_IS(mSymbol, TIntermSymbol, original, replacement); > return false; > } > >+size_t TIntermFunctionDefinition::getChildCount() const >+{ >+ return 2; >+} >+ >+TIntermNode *TIntermFunctionDefinition::getChildNode(size_t index) const >+{ >+ ASSERT(index < 2); >+ if (index == 0) >+ { >+ return mPrototype; >+ } >+ return mBody; >+} >+ > bool TIntermFunctionDefinition::replaceChildNode(TIntermNode *original, TIntermNode *replacement) > { > REPLACE_IF_IS(mPrototype, TIntermFunctionPrototype, original, replacement); >@@ -215,19 +386,60 @@ bool TIntermFunctionDefinition::replaceChildNode(TIntermNode *original, TIntermN > return false; > } > >+size_t TIntermAggregate::getChildCount() const >+{ >+ return mArguments.size(); >+} >+ >+TIntermNode *TIntermAggregate::getChildNode(size_t index) const >+{ >+ return mArguments[index]; >+} >+ > bool TIntermAggregate::replaceChildNode(TIntermNode *original, TIntermNode *replacement) > { > return replaceChildNodeInternal(original, replacement); > } > >+size_t TIntermBlock::getChildCount() const >+{ >+ return mStatements.size(); >+} >+ >+TIntermNode *TIntermBlock::getChildNode(size_t index) const >+{ >+ return mStatements[index]; >+} >+ > bool TIntermBlock::replaceChildNode(TIntermNode *original, TIntermNode *replacement) > { > return replaceChildNodeInternal(original, replacement); > } > >+size_t TIntermFunctionPrototype::getChildCount() const >+{ >+ return 0; >+} >+ >+TIntermNode *TIntermFunctionPrototype::getChildNode(size_t index) const >+{ >+ UNREACHABLE(); >+ return nullptr; >+} >+ > bool TIntermFunctionPrototype::replaceChildNode(TIntermNode *original, TIntermNode *replacement) > { >- return replaceChildNodeInternal(original, replacement); >+ return false; >+} >+ >+size_t TIntermDeclaration::getChildCount() const >+{ >+ return mDeclarators.size(); >+} >+ >+TIntermNode *TIntermDeclaration::getChildNode(size_t index) const >+{ >+ return mDeclarators[index]; > } > > bool TIntermDeclaration::replaceChildNode(TIntermNode *original, TIntermNode *replacement) >@@ -271,69 +483,83 @@ bool TIntermAggregateBase::insertChildNodes(TIntermSequence::size_type position, > return true; > } > >-TIntermAggregate *TIntermAggregate::CreateFunctionCall(const TFunction &func, >- TIntermSequence *arguments) >+TIntermSymbol::TIntermSymbol(const TVariable *variable) : TIntermTyped(), mVariable(variable) {} >+ >+bool TIntermSymbol::hasConstantValue() const > { >- TIntermAggregate *callNode = >- new TIntermAggregate(func.getReturnType(), EOpCallFunctionInAST, arguments); >- callNode->getFunctionSymbolInfo()->setFromFunction(func); >- return callNode; >+ return variable().getConstPointer() != nullptr; > } > >-TIntermAggregate *TIntermAggregate::CreateFunctionCall(const TType &type, >- const TSymbolUniqueId &id, >- const TName &name, >+const TConstantUnion *TIntermSymbol::getConstantValue() const >+{ >+ return variable().getConstPointer(); >+} >+ >+const TSymbolUniqueId &TIntermSymbol::uniqueId() const >+{ >+ return mVariable->uniqueId(); >+} >+ >+ImmutableString TIntermSymbol::getName() const >+{ >+ return mVariable->name(); >+} >+ >+const TType &TIntermSymbol::getType() const >+{ >+ return mVariable->getType(); >+} >+ >+TIntermAggregate *TIntermAggregate::CreateFunctionCall(const TFunction &func, > TIntermSequence *arguments) > { >- TIntermAggregate *callNode = new TIntermAggregate(type, EOpCallFunctionInAST, arguments); >- callNode->getFunctionSymbolInfo()->setId(id); >- callNode->getFunctionSymbolInfo()->setNameObj(name); >- return callNode; >+ return new TIntermAggregate(&func, func.getReturnType(), EOpCallFunctionInAST, arguments); > } > >-TIntermAggregate *TIntermAggregate::CreateBuiltInFunctionCall(const TFunction &func, >- TIntermSequence *arguments) >+TIntermAggregate *TIntermAggregate::CreateRawFunctionCall(const TFunction &func, >+ TIntermSequence *arguments) > { >- TIntermAggregate *callNode = >- new TIntermAggregate(func.getReturnType(), EOpCallBuiltInFunction, arguments); >- callNode->getFunctionSymbolInfo()->setFromFunction(func); >- // Note that name needs to be set before texture function type is determined. >- callNode->setBuiltInFunctionPrecision(); >- return callNode; >+ return new TIntermAggregate(&func, func.getReturnType(), EOpCallInternalRawFunction, arguments); > } > >-TIntermAggregate *TIntermAggregate::CreateConstructor(const TType &type, >- TIntermSequence *arguments) >+TIntermAggregate *TIntermAggregate::CreateBuiltInFunctionCall(const TFunction &func, >+ TIntermSequence *arguments) > { >- return new TIntermAggregate(type, EOpConstruct, arguments); >+ // op should be either EOpCallBuiltInFunction or a specific math op. >+ ASSERT(func.getBuiltInOp() != EOpNull); >+ return new TIntermAggregate(&func, func.getReturnType(), func.getBuiltInOp(), arguments); > } > >-TIntermAggregate *TIntermAggregate::Create(const TType &type, >- TOperator op, >- TIntermSequence *arguments) >+TIntermAggregate *TIntermAggregate::CreateConstructor(const TType &type, TIntermSequence *arguments) > { >- TIntermAggregate *node = new TIntermAggregate(type, op, arguments); >- ASSERT(op != EOpCallFunctionInAST); // Should use CreateFunctionCall >- ASSERT(op != EOpCallBuiltInFunction); // Should use CreateBuiltInFunctionCall >- ASSERT(!node->isConstructor()); // Should use CreateConstructor >- return node; >+ return new TIntermAggregate(nullptr, type, EOpConstruct, arguments); > } > >-TIntermAggregate::TIntermAggregate(const TType &type, TOperator op, TIntermSequence *arguments) >- : TIntermOperator(op), mUseEmulatedFunction(false), mGotPrecisionFromChildren(false) >+TIntermAggregate::TIntermAggregate(const TFunction *func, >+ const TType &type, >+ TOperator op, >+ TIntermSequence *arguments) >+ : TIntermOperator(op, type), >+ mUseEmulatedFunction(false), >+ mGotPrecisionFromChildren(false), >+ mFunction(func) > { > if (arguments != nullptr) > { > mArguments.swap(*arguments); > } >- setTypePrecisionAndQualifier(type); >+ ASSERT(mFunction == nullptr || mFunction->symbolType() != SymbolType::Empty); >+ setPrecisionAndQualifier(); > } > >-void TIntermAggregate::setTypePrecisionAndQualifier(const TType &type) >+void TIntermAggregate::setPrecisionAndQualifier() > { >- setType(type); > mType.setQualifier(EvqTemporary); >- if (!isFunctionCall()) >+ if (mOp == EOpCallBuiltInFunction) >+ { >+ setBuiltInFunctionPrecision(); >+ } >+ else if (!isFunctionCall()) > { > if (isConstructor()) > { >@@ -440,13 +666,13 @@ void TIntermAggregate::setBuiltInFunctionPrecision() > } > // ESSL 3.0 spec section 8: textureSize always gets highp precision. > // All other functions that take a sampler are assumed to be texture functions. >- if (mFunctionInfo.getName().find("textureSize") == 0) >+ if (mFunction->name() == "textureSize") > mType.setPrecision(EbpHigh); > else > mType.setPrecision(precision); > } > >-TString TIntermAggregate::getSymbolTableMangledName() const >+const char *TIntermAggregate::functionName() const > { > ASSERT(!isConstructor()); > switch (mOp) >@@ -454,16 +680,161 @@ TString TIntermAggregate::getSymbolTableMangledName() const > case EOpCallInternalRawFunction: > case EOpCallBuiltInFunction: > case EOpCallFunctionInAST: >- return TFunction::GetMangledNameFromCall(mFunctionInfo.getName(), mArguments); >+ return mFunction->name().data(); > default: >- TString opString = GetOperatorString(mOp); >- return TFunction::GetMangledNameFromCall(opString, mArguments); >+ return GetOperatorString(mOp); >+ } >+} >+ >+bool TIntermAggregate::hasConstantValue() const >+{ >+ if (!isConstructor()) >+ { >+ return false; >+ } >+ for (TIntermNode *constructorArg : mArguments) >+ { >+ if (!constructorArg->getAsTyped()->hasConstantValue()) >+ { >+ return false; >+ } >+ } >+ return true; >+} >+ >+const TConstantUnion *TIntermAggregate::getConstantValue() const >+{ >+ if (!hasConstantValue()) >+ { >+ return nullptr; >+ } >+ ASSERT(isConstructor()); >+ ASSERT(mArguments.size() > 0u); >+ >+ TConstantUnion *constArray = nullptr; >+ if (isArray()) >+ { >+ size_t elementSize = mArguments.front()->getAsTyped()->getType().getObjectSize(); >+ constArray = new TConstantUnion[elementSize * getOutermostArraySize()]; >+ >+ size_t elementOffset = 0u; >+ for (TIntermNode *constructorArg : mArguments) >+ { >+ const TConstantUnion *elementConstArray = >+ constructorArg->getAsTyped()->getConstantValue(); >+ ASSERT(elementConstArray); >+ size_t elementSizeBytes = sizeof(TConstantUnion) * elementSize; >+ memcpy(static_cast<void *>(&constArray[elementOffset]), >+ static_cast<const void *>(elementConstArray), elementSizeBytes); >+ elementOffset += elementSize; >+ } >+ return constArray; >+ } >+ >+ size_t resultSize = getType().getObjectSize(); >+ constArray = new TConstantUnion[resultSize]; >+ TBasicType basicType = getBasicType(); >+ >+ size_t resultIndex = 0u; >+ >+ if (mArguments.size() == 1u) >+ { >+ TIntermNode *argument = mArguments.front(); >+ TIntermTyped *argumentTyped = argument->getAsTyped(); >+ const TConstantUnion *argumentConstantValue = argumentTyped->getConstantValue(); >+ // Check the special case of constructing a matrix diagonal from a single scalar, >+ // or a vector from a single scalar. >+ if (argumentTyped->getType().getObjectSize() == 1u) >+ { >+ if (isMatrix()) >+ { >+ int resultCols = getType().getCols(); >+ int resultRows = getType().getRows(); >+ for (int col = 0; col < resultCols; ++col) >+ { >+ for (int row = 0; row < resultRows; ++row) >+ { >+ if (col == row) >+ { >+ constArray[resultIndex].cast(basicType, argumentConstantValue[0]); >+ } >+ else >+ { >+ constArray[resultIndex].setFConst(0.0f); >+ } >+ ++resultIndex; >+ } >+ } >+ } >+ else >+ { >+ while (resultIndex < resultSize) >+ { >+ constArray[resultIndex].cast(basicType, argumentConstantValue[0]); >+ ++resultIndex; >+ } >+ } >+ ASSERT(resultIndex == resultSize); >+ return constArray; >+ } >+ else if (isMatrix() && argumentTyped->isMatrix()) >+ { >+ // The special case of constructing a matrix from a matrix. >+ int argumentCols = argumentTyped->getType().getCols(); >+ int argumentRows = argumentTyped->getType().getRows(); >+ int resultCols = getType().getCols(); >+ int resultRows = getType().getRows(); >+ for (int col = 0; col < resultCols; ++col) >+ { >+ for (int row = 0; row < resultRows; ++row) >+ { >+ if (col < argumentCols && row < argumentRows) >+ { >+ constArray[resultIndex].cast( >+ basicType, argumentConstantValue[col * argumentRows + row]); >+ } >+ else if (col == row) >+ { >+ constArray[resultIndex].setFConst(1.0f); >+ } >+ else >+ { >+ constArray[resultIndex].setFConst(0.0f); >+ } >+ ++resultIndex; >+ } >+ } >+ ASSERT(resultIndex == resultSize); >+ return constArray; >+ } >+ } >+ >+ for (TIntermNode *argument : mArguments) >+ { >+ TIntermTyped *argumentTyped = argument->getAsTyped(); >+ size_t argumentSize = argumentTyped->getType().getObjectSize(); >+ const TConstantUnion *argumentConstantValue = argumentTyped->getConstantValue(); >+ for (size_t i = 0u; i < argumentSize; ++i) >+ { >+ if (resultIndex >= resultSize) >+ break; >+ constArray[resultIndex].cast(basicType, argumentConstantValue[i]); >+ ++resultIndex; >+ } > } >+ ASSERT(resultIndex == resultSize); >+ return constArray; > } > > bool TIntermAggregate::hasSideEffects() const > { >- if (isFunctionCall() && mFunctionInfo.isKnownToNotHaveSideEffects()) >+ if (getQualifier() == EvqConst) >+ { >+ return false; >+ } >+ bool calledFunctionHasNoSideEffects = >+ isFunctionCall() && mFunction != nullptr && mFunction->isKnownToNotHaveSideEffects(); >+ if (calledFunctionHasNoSideEffects || isConstructor()) > { > for (TIntermNode *arg : mArguments) > { >@@ -490,10 +861,10 @@ void TIntermBlock::appendStatement(TIntermNode *statement) > } > } > >-void TIntermFunctionPrototype::appendParameter(TIntermSymbol *parameter) >+void TIntermBlock::insertStatement(size_t insertPosition, TIntermNode *statement) > { >- ASSERT(parameter != nullptr); >- mParameters.push_back(parameter); >+ ASSERT(statement != nullptr); >+ mStatements.insert(mStatements.begin() + insertPosition, statement); > } > > void TIntermDeclaration::appendDeclarator(TIntermTyped *declarator) >@@ -507,6 +878,25 @@ void TIntermDeclaration::appendDeclarator(TIntermTyped *declarator) > mDeclarators.push_back(declarator); > } > >+size_t TIntermTernary::getChildCount() const >+{ >+ return 3; >+} >+ >+TIntermNode *TIntermTernary::getChildNode(size_t index) const >+{ >+ ASSERT(index < 3); >+ if (index == 0) >+ { >+ return mCondition; >+ } >+ if (index == 1) >+ { >+ return mTrueExpression; >+ } >+ return mFalseExpression; >+} >+ > bool TIntermTernary::replaceChildNode(TIntermNode *original, TIntermNode *replacement) > { > REPLACE_IF_IS(mCondition, TIntermTyped, original, replacement); >@@ -515,6 +905,24 @@ bool TIntermTernary::replaceChildNode(TIntermNode *original, TIntermNode *replac > return false; > } > >+size_t TIntermIfElse::getChildCount() const >+{ >+ return 1 + (mTrueBlock ? 1 : 0) + (mFalseBlock ? 1 : 0); >+} >+ >+TIntermNode *TIntermIfElse::getChildNode(size_t index) const >+{ >+ if (index == 0) >+ { >+ return mCondition; >+ } >+ if (mTrueBlock && index == 1) >+ { >+ return mTrueBlock; >+ } >+ return mFalseBlock; >+} >+ > bool TIntermIfElse::replaceChildNode(TIntermNode *original, TIntermNode *replacement) > { > REPLACE_IF_IS(mCondition, TIntermTyped, original, replacement); >@@ -523,6 +931,21 @@ bool TIntermIfElse::replaceChildNode(TIntermNode *original, TIntermNode *replace > return false; > } > >+size_t TIntermSwitch::getChildCount() const >+{ >+ return 2; >+} >+ >+TIntermNode *TIntermSwitch::getChildNode(size_t index) const >+{ >+ ASSERT(index < 2); >+ if (index == 0) >+ { >+ return mInit; >+ } >+ return mStatementList; >+} >+ > bool TIntermSwitch::replaceChildNode(TIntermNode *original, TIntermNode *replacement) > { > REPLACE_IF_IS(mInit, TIntermTyped, original, replacement); >@@ -531,90 +954,64 @@ bool TIntermSwitch::replaceChildNode(TIntermNode *original, TIntermNode *replace > return false; > } > >-bool TIntermCase::replaceChildNode(TIntermNode *original, TIntermNode *replacement) >-{ >- REPLACE_IF_IS(mCondition, TIntermTyped, original, replacement); >- return false; >-} >- >-TIntermTyped::TIntermTyped(const TIntermTyped &node) : TIntermNode(), mType(node.mType) >+size_t TIntermCase::getChildCount() const > { >- // Copy constructor is disallowed for TIntermNode in order to disallow it for subclasses that >- // don't explicitly allow it, so normal TIntermNode constructor is used to construct the copy. >- // We need to manually copy any fields of TIntermNode besides handling fields in TIntermTyped. >- mLine = node.mLine; >+ return (mCondition ? 1 : 0); > } > >-bool TIntermTyped::isConstructorWithOnlyConstantUnionParameters() >+TIntermNode *TIntermCase::getChildNode(size_t index) const > { >- TIntermAggregate *constructor = getAsAggregate(); >- if (!constructor || !constructor->isConstructor()) >- { >- return false; >- } >- for (TIntermNode *&node : *constructor->getSequence()) >- { >- if (!node->getAsConstantUnion()) >- return false; >- } >- return true; >+ ASSERT(index == 0); >+ ASSERT(mCondition); >+ return mCondition; > } > >-TIntermConstantUnion::TIntermConstantUnion(const TIntermConstantUnion &node) : TIntermTyped(node) >+bool TIntermCase::replaceChildNode(TIntermNode *original, TIntermNode *replacement) > { >- mUnionArrayPointer = node.mUnionArrayPointer; >+ REPLACE_IF_IS(mCondition, TIntermTyped, original, replacement); >+ return false; > } > >-void TFunctionSymbolInfo::setFromFunction(const TFunction &function) >+TIntermTyped::TIntermTyped(const TIntermTyped &node) : TIntermNode() > { >- setName(function.getName()); >- setId(TSymbolUniqueId(function)); >+ // Copy constructor is disallowed for TIntermNode in order to disallow it for subclasses that >+ // don't explicitly allow it, so normal TIntermNode constructor is used to construct the copy. >+ // We need to manually copy any fields of TIntermNode. >+ mLine = node.mLine; > } > >-TFunctionSymbolInfo::TFunctionSymbolInfo(const TSymbolUniqueId &id) >- : mId(new TSymbolUniqueId(id)), mKnownToNotHaveSideEffects(false) >+bool TIntermTyped::hasConstantValue() const > { >+ return false; > } > >-TFunctionSymbolInfo::TFunctionSymbolInfo(const TFunctionSymbolInfo &info) >- : mName(info.mName), mId(nullptr), mKnownToNotHaveSideEffects(info.mKnownToNotHaveSideEffects) >+const TConstantUnion *TIntermTyped::getConstantValue() const > { >- if (info.mId) >- { >- mId = new TSymbolUniqueId(*info.mId); >- } >+ return nullptr; > } > >-TFunctionSymbolInfo &TFunctionSymbolInfo::operator=(const TFunctionSymbolInfo &info) >+TIntermConstantUnion::TIntermConstantUnion(const TIntermConstantUnion &node) >+ : TIntermExpression(node) > { >- mName = info.mName; >- if (info.mId) >- { >- mId = new TSymbolUniqueId(*info.mId); >- } >- else >- { >- mId = nullptr; >- } >- return *this; >+ mUnionArrayPointer = node.mUnionArrayPointer; > } > >-void TFunctionSymbolInfo::setId(const TSymbolUniqueId &id) >+TIntermFunctionPrototype::TIntermFunctionPrototype(const TFunction *function) >+ : TIntermTyped(), mFunction(function) > { >- mId = new TSymbolUniqueId(id); >+ ASSERT(mFunction->symbolType() != SymbolType::Empty); > } > >-const TSymbolUniqueId &TFunctionSymbolInfo::getId() const >+const TType &TIntermFunctionPrototype::getType() const > { >- ASSERT(mId); >- return *mId; >+ return mFunction->getReturnType(); > } > > TIntermAggregate::TIntermAggregate(const TIntermAggregate &node) > : TIntermOperator(node), > mUseEmulatedFunction(node.mUseEmulatedFunction), > mGotPrecisionFromChildren(node.mGotPrecisionFromChildren), >- mFunctionInfo(node.mFunctionInfo) >+ mFunction(node.mFunction) > { > for (TIntermNode *arg : node.mArguments) > { >@@ -629,18 +1026,18 @@ TIntermAggregate *TIntermAggregate::shallowCopy() const > { > TIntermSequence *copySeq = new TIntermSequence(); > copySeq->insert(copySeq->begin(), getSequence()->begin(), getSequence()->end()); >- TIntermAggregate *copyNode = new TIntermAggregate(mType, mOp, copySeq); >- *copyNode->getFunctionSymbolInfo() = mFunctionInfo; >+ TIntermAggregate *copyNode = new TIntermAggregate(mFunction, mType, mOp, copySeq); > copyNode->setLine(mLine); > return copyNode; > } > >-TIntermSwizzle::TIntermSwizzle(const TIntermSwizzle &node) : TIntermTyped(node) >+TIntermSwizzle::TIntermSwizzle(const TIntermSwizzle &node) : TIntermExpression(node) > { > TIntermTyped *operandCopy = node.mOperand->deepCopy(); > ASSERT(operandCopy != nullptr); >- mOperand = operandCopy; >- mSwizzleOffsets = node.mSwizzleOffsets; >+ mOperand = operandCopy; >+ mSwizzleOffsets = node.mSwizzleOffsets; >+ mHasFoldedDuplicateOffsets = node.mHasFoldedDuplicateOffsets; > } > > TIntermBinary::TIntermBinary(const TIntermBinary &node) >@@ -654,14 +1051,16 @@ TIntermBinary::TIntermBinary(const TIntermBinary &node) > } > > TIntermUnary::TIntermUnary(const TIntermUnary &node) >- : TIntermOperator(node), mUseEmulatedFunction(node.mUseEmulatedFunction) >+ : TIntermOperator(node), >+ mUseEmulatedFunction(node.mUseEmulatedFunction), >+ mFunction(node.mFunction) > { > TIntermTyped *operandCopy = node.mOperand->deepCopy(); > ASSERT(operandCopy != nullptr); > mOperand = operandCopy; > } > >-TIntermTernary::TIntermTernary(const TIntermTernary &node) : TIntermTyped(node) >+TIntermTernary::TIntermTernary(const TIntermTernary &node) : TIntermExpression(node) > { > TIntermTyped *conditionCopy = node.mCondition->deepCopy(); > TIntermTyped *trueCopy = node.mTrueExpression->deepCopy(); >@@ -861,8 +1260,8 @@ void TIntermUnary::promote() > static_cast<unsigned char>(mOperand->getType().getRows()), > static_cast<unsigned char>(mOperand->getType().getCols()))); > break; >- case EOpIsInf: >- case EOpIsNan: >+ case EOpIsinf: >+ case EOpIsnan: > setType(TType(EbtBool, EbpUndefined, resultQualifier, operandPrimarySize)); > break; > case EOpBitfieldReverse: >@@ -885,27 +1284,42 @@ void TIntermUnary::promote() > } > > TIntermSwizzle::TIntermSwizzle(TIntermTyped *operand, const TVector<int> &swizzleOffsets) >- : TIntermTyped(TType(EbtFloat, EbpUndefined)), >+ : TIntermExpression(TType(EbtFloat, EbpUndefined)), > mOperand(operand), >- mSwizzleOffsets(swizzleOffsets) >+ mSwizzleOffsets(swizzleOffsets), >+ mHasFoldedDuplicateOffsets(false) > { >+ ASSERT(mOperand); > ASSERT(mSwizzleOffsets.size() <= 4); > promote(); > } > >-TIntermUnary::TIntermUnary(TOperator op, TIntermTyped *operand) >- : TIntermOperator(op), mOperand(operand), mUseEmulatedFunction(false) >+TIntermUnary::TIntermUnary(TOperator op, TIntermTyped *operand, const TFunction *function) >+ : TIntermOperator(op), mOperand(operand), mUseEmulatedFunction(false), mFunction(function) > { >+ ASSERT(mOperand); > promote(); > } > > TIntermBinary::TIntermBinary(TOperator op, TIntermTyped *left, TIntermTyped *right) > : TIntermOperator(op), mLeft(left), mRight(right), mAddIndexClamp(false) > { >+ ASSERT(mLeft); >+ ASSERT(mRight); > promote(); > } > >-TIntermInvariantDeclaration::TIntermInvariantDeclaration(TIntermSymbol *symbol, const TSourceLoc &line) >+TIntermBinary *TIntermBinary::CreateComma(TIntermTyped *left, >+ TIntermTyped *right, >+ int shaderVersion) >+{ >+ TIntermBinary *node = new TIntermBinary(EOpComma, left, right); >+ node->getTypePointer()->setQualifier(GetCommaQualifier(shaderVersion, left, right)); >+ return node; >+} >+ >+TIntermInvariantDeclaration::TIntermInvariantDeclaration(TIntermSymbol *symbol, >+ const TSourceLoc &line) > : TIntermNode(), mSymbol(symbol) > { > ASSERT(symbol); >@@ -915,11 +1329,14 @@ TIntermInvariantDeclaration::TIntermInvariantDeclaration(TIntermSymbol *symbol, > TIntermTernary::TIntermTernary(TIntermTyped *cond, > TIntermTyped *trueExpression, > TIntermTyped *falseExpression) >- : TIntermTyped(trueExpression->getType()), >+ : TIntermExpression(trueExpression->getType()), > mCondition(cond), > mTrueExpression(trueExpression), > mFalseExpression(falseExpression) > { >+ ASSERT(mCondition); >+ ASSERT(mTrueExpression); >+ ASSERT(mFalseExpression); > getTypePointer()->setQualifier( > TIntermTernary::DetermineQualifier(cond, trueExpression, falseExpression)); > } >@@ -943,6 +1360,7 @@ TIntermLoop::TIntermLoop(TLoopType type, > TIntermIfElse::TIntermIfElse(TIntermTyped *cond, TIntermBlock *trueB, TIntermBlock *falseB) > : TIntermNode(), mCondition(cond), mTrueBlock(trueB), mFalseBlock(falseB) > { >+ ASSERT(mCondition); > // Prune empty false blocks so that there won't be unnecessary operations done on it. > if (mFalseBlock && mFalseBlock->getSequence()->empty()) > { >@@ -953,6 +1371,7 @@ TIntermIfElse::TIntermIfElse(TIntermTyped *cond, TIntermBlock *trueB, TIntermBlo > TIntermSwitch::TIntermSwitch(TIntermTyped *init, TIntermBlock *statementList) > : TIntermNode(), mInit(init), mStatementList(statementList) > { >+ ASSERT(mInit); > ASSERT(mStatementList); > } > >@@ -975,18 +1394,16 @@ TQualifier TIntermTernary::DetermineQualifier(TIntermTyped *cond, > return EvqTemporary; > } > >-TIntermTyped *TIntermTernary::fold() >+TIntermTyped *TIntermTernary::fold(TDiagnostics * /* diagnostics */) > { > if (mCondition->getAsConstantUnion()) > { > if (mCondition->getAsConstantUnion()->getBConst(0)) > { >- mTrueExpression->getTypePointer()->setQualifier(mType.getQualifier()); > return mTrueExpression; > } > else > { >- mFalseExpression->getTypePointer()->setQualifier(mType.getQualifier()); > return mFalseExpression; > } > } >@@ -1006,6 +1423,10 @@ void TIntermSwizzle::promote() > > bool TIntermSwizzle::hasDuplicateOffsets() const > { >+ if (mHasFoldedDuplicateOffsets) >+ { >+ return true; >+ } > int offsetCount[4] = {0u, 0u, 0u, 0u}; > for (const auto offset : mSwizzleOffsets) > { >@@ -1018,6 +1439,11 @@ bool TIntermSwizzle::hasDuplicateOffsets() const > return false; > } > >+void TIntermSwizzle::setHasFoldedDuplicateOffsets(bool hasFoldedDuplicateOffsets) >+{ >+ mHasFoldedDuplicateOffsets = hasFoldedDuplicateOffsets; >+} >+ > bool TIntermSwizzle::offsetsMatch(int offset) const > { > return mSwizzleOffsets.size() == 1 && mSwizzleOffsets[0] == offset; >@@ -1269,26 +1695,38 @@ void TIntermBinary::promote() > } > } > >-const TConstantUnion *TIntermConstantUnion::foldIndexing(int index) >+bool TIntermConstantUnion::hasConstantValue() const > { >- if (isArray()) >+ return true; >+} >+ >+const TConstantUnion *TIntermConstantUnion::getConstantValue() const >+{ >+ return mUnionArrayPointer; >+} >+ >+const TConstantUnion *TIntermConstantUnion::FoldIndexing(const TType &type, >+ const TConstantUnion *constArray, >+ int index) >+{ >+ if (type.isArray()) > { >- ASSERT(index < static_cast<int>(getType().getOutermostArraySize())); >- TType arrayElementType = getType(); >+ ASSERT(index < static_cast<int>(type.getOutermostArraySize())); >+ TType arrayElementType(type); > arrayElementType.toArrayElementType(); > size_t arrayElementSize = arrayElementType.getObjectSize(); >- return &mUnionArrayPointer[arrayElementSize * index]; >+ return &constArray[arrayElementSize * index]; > } >- else if (isMatrix()) >+ else if (type.isMatrix()) > { >- ASSERT(index < getType().getCols()); >- int size = getType().getRows(); >- return &mUnionArrayPointer[size * index]; >+ ASSERT(index < type.getCols()); >+ int size = type.getRows(); >+ return &constArray[size * index]; > } >- else if (isVector()) >+ else if (type.isVector()) > { >- ASSERT(index < getType().getNominalSize()); >- return &mUnionArrayPointer[index]; >+ ASSERT(index < type.getNominalSize()); >+ return &constArray[index]; > } > else > { >@@ -1297,8 +1735,26 @@ const TConstantUnion *TIntermConstantUnion::foldIndexing(int index) > } > } > >-TIntermTyped *TIntermSwizzle::fold() >+TIntermTyped *TIntermSwizzle::fold(TDiagnostics * /* diagnostics */) > { >+ TIntermSwizzle *operandSwizzle = mOperand->getAsSwizzleNode(); >+ if (operandSwizzle) >+ { >+ // We need to fold the two swizzles into one, so that repeated swizzling can't cause stack >+ // overflow in ParseContext::checkCanBeLValue(). >+ bool hadDuplicateOffsets = operandSwizzle->hasDuplicateOffsets(); >+ TVector<int> foldedOffsets; >+ for (int offset : mSwizzleOffsets) >+ { >+ // Offset should already be validated. >+ ASSERT(static_cast<size_t>(offset) < operandSwizzle->mSwizzleOffsets.size()); >+ foldedOffsets.push_back(operandSwizzle->mSwizzleOffsets[offset]); >+ } >+ operandSwizzle->mSwizzleOffsets = foldedOffsets; >+ operandSwizzle->setType(getType()); >+ operandSwizzle->setHasFoldedDuplicateOffsets(hadDuplicateOffsets); >+ return operandSwizzle; >+ } > TIntermConstantUnion *operandConstant = mOperand->getAsConstantUnion(); > if (operandConstant == nullptr) > { >@@ -1308,15 +1764,15 @@ TIntermTyped *TIntermSwizzle::fold() > TConstantUnion *constArray = new TConstantUnion[mSwizzleOffsets.size()]; > for (size_t i = 0; i < mSwizzleOffsets.size(); ++i) > { >- constArray[i] = *operandConstant->foldIndexing(mSwizzleOffsets.at(i)); >+ constArray[i] = *TIntermConstantUnion::FoldIndexing( >+ operandConstant->getType(), operandConstant->getConstantValue(), mSwizzleOffsets.at(i)); > } >- return CreateFoldedNode(constArray, this, mType.getQualifier()); >+ return CreateFoldedNode(constArray, this); > } > > TIntermTyped *TIntermBinary::fold(TDiagnostics *diagnostics) > { >- TIntermConstantUnion *leftConstant = mLeft->getAsConstantUnion(); >- TIntermConstantUnion *rightConstant = mRight->getAsConstantUnion(); >+ const TConstantUnion *rightConstant = mRight->getConstantValue(); > switch (mOp) > { > case EOpComma: >@@ -1325,63 +1781,127 @@ TIntermTyped *TIntermBinary::fold(TDiagnostics *diagnostics) > { > return this; > } >- mRight->getTypePointer()->setQualifier(mType.getQualifier()); > return mRight; > } > case EOpIndexDirect: >+ case EOpIndexDirectStruct: > { >- if (leftConstant == nullptr || rightConstant == nullptr) >- { >- return this; >- } >- int index = rightConstant->getIConst(0); >- >- const TConstantUnion *constArray = leftConstant->foldIndexing(index); >- if (!constArray) >+ if (rightConstant == nullptr) > { > return this; > } >- return CreateFoldedNode(constArray, this, mType.getQualifier()); >- } >- case EOpIndexDirectStruct: >- { >- if (leftConstant == nullptr || rightConstant == nullptr) >+ size_t index = static_cast<size_t>(rightConstant->getIConst()); >+ TIntermAggregate *leftAggregate = mLeft->getAsAggregate(); >+ if (leftAggregate && leftAggregate->isConstructor() && leftAggregate->isArray() && >+ !leftAggregate->hasSideEffects()) > { >- return this; >+ ASSERT(index < leftAggregate->getSequence()->size()); >+ // This transformation can't add complexity as we're eliminating the constructor >+ // entirely. >+ return leftAggregate->getSequence()->at(index)->getAsTyped(); > } >- const TFieldList &fields = mLeft->getType().getStruct()->fields(); >- size_t index = static_cast<size_t>(rightConstant->getIConst(0)); > >- size_t previousFieldsSize = 0; >- for (size_t i = 0; i < index; ++i) >+ // If the indexed value is already a constant union, we can't increase duplication of >+ // data by folding the indexing. Also fold the node in case it's generally beneficial to >+ // replace this type of node with a constant union even if that would mean duplicating >+ // data. >+ if (mLeft->getAsConstantUnion() || getType().canReplaceWithConstantUnion()) > { >- previousFieldsSize += fields[i]->type()->getObjectSize(); >+ const TConstantUnion *constantValue = getConstantValue(); >+ if (constantValue == nullptr) >+ { >+ return this; >+ } >+ return CreateFoldedNode(constantValue, this); > } >- >- const TConstantUnion *constArray = leftConstant->getUnionArrayPointer(); >- return CreateFoldedNode(constArray + previousFieldsSize, this, mType.getQualifier()); >+ return this; > } > case EOpIndexIndirect: > case EOpIndexDirectInterfaceBlock: >+ case EOpInitialize: > // Can never be constant folded. > return this; > default: > { >- if (leftConstant == nullptr || rightConstant == nullptr) >+ if (rightConstant == nullptr) >+ { >+ return this; >+ } >+ const TConstantUnion *leftConstant = mLeft->getConstantValue(); >+ if (leftConstant == nullptr) > { > return this; > } >- TConstantUnion *constArray = >- leftConstant->foldBinary(mOp, rightConstant, diagnostics, mLeft->getLine()); >+ const TConstantUnion *constArray = >+ TIntermConstantUnion::FoldBinary(mOp, leftConstant, mLeft->getType(), rightConstant, >+ mRight->getType(), diagnostics, mLeft->getLine()); > if (!constArray) > { > return this; > } >+ return CreateFoldedNode(constArray, this); >+ } >+ } >+} >+ >+bool TIntermBinary::hasConstantValue() const >+{ >+ switch (mOp) >+ { >+ case EOpIndexDirect: >+ case EOpIndexDirectStruct: >+ { >+ if (mLeft->hasConstantValue() && mRight->hasConstantValue()) >+ { >+ return true; >+ } >+ break; >+ } >+ default: >+ break; >+ } >+ return false; >+} > >- // Nodes may be constant folded without being qualified as constant. >- return CreateFoldedNode(constArray, this, mType.getQualifier()); >+const TConstantUnion *TIntermBinary::getConstantValue() const >+{ >+ if (!hasConstantValue()) >+ { >+ return nullptr; >+ } >+ >+ const TConstantUnion *leftConstantValue = mLeft->getConstantValue(); >+ int index = mRight->getConstantValue()->getIConst(); >+ const TConstantUnion *constIndexingResult = nullptr; >+ if (mOp == EOpIndexDirect) >+ { >+ constIndexingResult = >+ TIntermConstantUnion::FoldIndexing(mLeft->getType(), leftConstantValue, index); >+ } >+ else >+ { >+ ASSERT(mOp == EOpIndexDirectStruct); >+ const TFieldList &fields = mLeft->getType().getStruct()->fields(); >+ >+ size_t previousFieldsSize = 0; >+ for (int i = 0; i < index; ++i) >+ { >+ previousFieldsSize += fields[i]->type()->getObjectSize(); > } >+ constIndexingResult = leftConstantValue + previousFieldsSize; > } >+ return constIndexingResult; >+} >+ >+const ImmutableString &TIntermBinary::getIndexStructFieldName() const >+{ >+ ASSERT(mOp == EOpIndexDirectStruct); >+ >+ const TType &lhsType = mLeft->getType(); >+ const TStructure *structure = lhsType.getStruct(); >+ const int index = mRight->getAsConstantUnion()->getIConst(0); >+ >+ return structure->fields()[index]->name(); > } > > TIntermTyped *TIntermUnary::fold(TDiagnostics *diagnostics) >@@ -1435,9 +1955,7 @@ TIntermTyped *TIntermUnary::fold(TDiagnostics *diagnostics) > { > return this; > } >- >- // Nodes may be constant folded without being qualified as constant. >- return CreateFoldedNode(constArray, this, mType.getQualifier()); >+ return CreateFoldedNode(constArray, this); > } > > TIntermTyped *TIntermAggregate::fold(TDiagnostics *diagnostics) >@@ -1450,14 +1968,49 @@ TIntermTyped *TIntermAggregate::fold(TDiagnostics *diagnostics) > return this; > } > } >- TConstantUnion *constArray = nullptr; >+ const TConstantUnion *constArray = nullptr; > if (isConstructor()) >- constArray = TIntermConstantUnion::FoldAggregateConstructor(this); >- else >+ { >+ if (mType.canReplaceWithConstantUnion()) >+ { >+ constArray = getConstantValue(); >+ if (constArray && mType.getBasicType() == EbtUInt) >+ { >+ // Check if we converted a negative float to uint and issue a warning in that case. >+ size_t sizeRemaining = mType.getObjectSize(); >+ for (TIntermNode *arg : mArguments) >+ { >+ TIntermTyped *typedArg = arg->getAsTyped(); >+ if (typedArg->getBasicType() == EbtFloat) >+ { >+ const TConstantUnion *argValue = typedArg->getConstantValue(); >+ size_t castSize = >+ std::min(typedArg->getType().getObjectSize(), sizeRemaining); >+ for (size_t i = 0; i < castSize; ++i) >+ { >+ if (argValue[i].getFConst() < 0.0f) >+ { >+ // ESSL 3.00.6 section 5.4.1. >+ diagnostics->warning( >+ mLine, "casting a negative float to uint is undefined", >+ mType.getBuiltInTypeNameString()); >+ } >+ } >+ } >+ sizeRemaining -= typedArg->getType().getObjectSize(); >+ } >+ } >+ } >+ } >+ else if (CanFoldAggregateBuiltInOp(mOp)) >+ { > constArray = TIntermConstantUnion::FoldAggregateBuiltIn(this, diagnostics); >- >- // Nodes may be constant folded without being qualified as constant. >- return CreateFoldedNode(constArray, this, getQualifier()); >+ } >+ if (constArray == nullptr) >+ { >+ return this; >+ } >+ return CreateFoldedNode(constArray, this); > } > > // >@@ -1466,28 +2019,28 @@ TIntermTyped *TIntermAggregate::fold(TDiagnostics *diagnostics) > // > // Returns the constant value to keep using or nullptr. > // >-TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op, >- TIntermConstantUnion *rightNode, >- TDiagnostics *diagnostics, >- const TSourceLoc &line) >+const TConstantUnion *TIntermConstantUnion::FoldBinary(TOperator op, >+ const TConstantUnion *leftArray, >+ const TType &leftType, >+ const TConstantUnion *rightArray, >+ const TType &rightType, >+ TDiagnostics *diagnostics, >+ const TSourceLoc &line) > { >- const TConstantUnion *leftArray = getUnionArrayPointer(); >- const TConstantUnion *rightArray = rightNode->getUnionArrayPointer(); >- > ASSERT(leftArray && rightArray); > >- size_t objectSize = getType().getObjectSize(); >+ size_t objectSize = leftType.getObjectSize(); > > // for a case like float f = vec4(2, 3, 4, 5) + 1.2; >- if (rightNode->getType().getObjectSize() == 1 && objectSize > 1) >+ if (rightType.getObjectSize() == 1 && objectSize > 1) > { >- rightArray = Vectorize(*rightNode->getUnionArrayPointer(), objectSize); >+ rightArray = Vectorize(*rightArray, objectSize); > } >- else if (rightNode->getType().getObjectSize() > 1 && objectSize == 1) >+ else if (rightType.getObjectSize() > 1 && objectSize == 1) > { > // for a case like float f = 1.2 + vec4(2, 3, 4, 5); >- leftArray = Vectorize(*getUnionArrayPointer(), rightNode->getType().getObjectSize()); >- objectSize = rightNode->getType().getObjectSize(); >+ leftArray = Vectorize(*leftArray, rightType.getObjectSize()); >+ objectSize = rightType.getObjectSize(); > } > > TConstantUnion *resultArray = nullptr; >@@ -1519,12 +2072,12 @@ TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op, > case EOpMatrixTimesMatrix: > { > // TODO(jmadll): This code should check for overflows. >- ASSERT(getType().getBasicType() == EbtFloat && rightNode->getBasicType() == EbtFloat); >+ ASSERT(leftType.getBasicType() == EbtFloat && rightType.getBasicType() == EbtFloat); > >- const int leftCols = getCols(); >- const int leftRows = getRows(); >- const int rightCols = rightNode->getType().getCols(); >- const int rightRows = rightNode->getType().getRows(); >+ const int leftCols = leftType.getCols(); >+ const int leftRows = leftType.getRows(); >+ const int rightCols = rightType.getCols(); >+ const int rightRows = rightType.getRows(); > const int resultCols = rightCols; > const int resultRows = leftRows; > >@@ -1552,7 +2105,7 @@ TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op, > resultArray = new TConstantUnion[objectSize]; > for (size_t i = 0; i < objectSize; i++) > { >- switch (getType().getBasicType()) >+ switch (leftType.getBasicType()) > { > case EbtFloat: > { >@@ -1564,15 +2117,15 @@ TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op, > if (dividend == 0.0f) > { > diagnostics->warning( >- getLine(), >+ line, > "Zero divided by zero during constant folding generated NaN", > "/"); > resultArray[i].setFConst(std::numeric_limits<float>::quiet_NaN()); > } > else > { >- diagnostics->warning(getLine(), >- "Divide by zero during constant folding", "/"); >+ diagnostics->warning(line, "Divide by zero during constant folding", >+ "/"); > bool negativeResult = > std::signbit(dividend) != std::signbit(divisor); > resultArray[i].setFConst( >@@ -1582,7 +2135,7 @@ TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op, > } > else if (gl::isInf(dividend) && gl::isInf(divisor)) > { >- diagnostics->warning(getLine(), >+ diagnostics->warning(line, > "Infinity divided by infinity during constant " > "folding generated NaN", > "/"); >@@ -1594,8 +2147,7 @@ TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op, > if (!gl::isInf(dividend) && gl::isInf(result)) > { > diagnostics->warning( >- getLine(), "Constant folded division overflowed to infinity", >- "/"); >+ line, "Constant folded division overflowed to infinity", "/"); > } > resultArray[i].setFConst(result); > } >@@ -1605,7 +2157,7 @@ TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op, > if (rightArray[i] == 0) > { > diagnostics->warning( >- getLine(), "Divide by zero error during constant folding", "/"); >+ line, "Divide by zero error during constant folding", "/"); > resultArray[i].setIConst(INT_MAX); > } > else >@@ -1637,11 +2189,11 @@ TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op, > if (lhs < 0 || divisor < 0) > { > // ESSL 3.00.6 section 5.9: Results of modulus are undefined >- // when >- // either one of the operands is negative. >- diagnostics->warning(getLine(), >+ // when either one of the operands is negative. >+ diagnostics->warning(line, > "Negative modulus operator operand " >- "encountered during constant folding", >+ "encountered during constant folding. " >+ "Results are undefined.", > "%"); > resultArray[i].setIConst(0); > } >@@ -1657,7 +2209,7 @@ TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op, > if (rightArray[i] == 0) > { > diagnostics->warning( >- getLine(), "Divide by zero error during constant folding", "/"); >+ line, "Divide by zero error during constant folding", "/"); > resultArray[i].setUConst(UINT_MAX); > } > else >@@ -1687,10 +2239,10 @@ TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op, > case EOpMatrixTimesVector: > { > // TODO(jmadll): This code should check for overflows. >- ASSERT(rightNode->getBasicType() == EbtFloat); >+ ASSERT(rightType.getBasicType() == EbtFloat); > >- const int matrixCols = getCols(); >- const int matrixRows = getRows(); >+ const int matrixCols = leftType.getCols(); >+ const int matrixRows = leftType.getRows(); > > resultArray = new TConstantUnion[matrixRows]; > >@@ -1711,10 +2263,10 @@ TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op, > case EOpVectorTimesMatrix: > { > // TODO(jmadll): This code should check for overflows. >- ASSERT(getType().getBasicType() == EbtFloat); >+ ASSERT(leftType.getBasicType() == EbtFloat); > >- const int matrixCols = rightNode->getType().getCols(); >- const int matrixRows = rightNode->getType().getRows(); >+ const int matrixCols = rightType.getCols(); >+ const int matrixRows = rightType.getRows(); > > resultArray = new TConstantUnion[matrixCols]; > >@@ -1754,7 +2306,7 @@ TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op, > > case EOpLogicalXor: > { >- ASSERT(getType().getBasicType() == EbtBool); >+ ASSERT(leftType.getBasicType() == EbtBool); > resultArray = new TConstantUnion[objectSize]; > for (size_t i = 0; i < objectSize; i++) > { >@@ -1765,17 +2317,17 @@ TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op, > > case EOpBitwiseAnd: > resultArray = new TConstantUnion[objectSize]; >- for (size_t i = 0; i < objectSize; i++) >+ for (size_t i = 0; i < objectSize; i++) > resultArray[i] = leftArray[i] & rightArray[i]; > break; > case EOpBitwiseXor: > resultArray = new TConstantUnion[objectSize]; >- for (size_t i = 0; i < objectSize; i++) >+ for (size_t i = 0; i < objectSize; i++) > resultArray[i] = leftArray[i] ^ rightArray[i]; > break; > case EOpBitwiseOr: > resultArray = new TConstantUnion[objectSize]; >- for (size_t i = 0; i < objectSize; i++) >+ for (size_t i = 0; i < objectSize; i++) > resultArray[i] = leftArray[i] | rightArray[i]; > break; > case EOpBitShiftLeft: >@@ -1853,7 +2405,7 @@ TConstantUnion *TIntermConstantUnion::foldUnaryNonComponentWise(TOperator op) > // Do operations where the return type may have a different number of components compared to the > // operand type. > >- const TConstantUnion *operandArray = getUnionArrayPointer(); >+ const TConstantUnion *operandArray = getConstantValue(); > ASSERT(operandArray); > > size_t objectSize = getType().getObjectSize(); >@@ -2040,7 +2592,7 @@ TConstantUnion *TIntermConstantUnion::foldUnaryComponentWise(TOperator op, > // component of the operand. Also folds normalize, though the divisor in that case takes all > // components into account. > >- const TConstantUnion *operandArray = getUnionArrayPointer(); >+ const TConstantUnion *operandArray = getConstantValue(); > ASSERT(operandArray); > > size_t objectSize = getType().getObjectSize(); >@@ -2299,12 +2851,12 @@ TConstantUnion *TIntermConstantUnion::foldUnaryComponentWise(TOperator op, > break; > } > >- case EOpIsNan: >+ case EOpIsnan: > ASSERT(getType().getBasicType() == EbtFloat); > resultArray[i].setBConst(gl::isNaN(operandArray[0].getFConst())); > break; > >- case EOpIsInf: >+ case EOpIsinf: > ASSERT(getType().getBasicType() == EbtFloat); > resultArray[i].setBConst(gl::isInf(operandArray[0].getFConst())); > break; >@@ -2369,7 +2921,7 @@ TConstantUnion *TIntermConstantUnion::foldUnaryComponentWise(TOperator op, > foldFloatTypeUnary(operandArray[i], &sqrtf, &resultArray[i]); > break; > >- case EOpInverseSqrt: >+ case EOpInversesqrt: > // There is no stdlib built-in function equavalent for GLES built-in inversesqrt(), > // so getting the square root first using builtin function sqrt() and then taking > // its inverse. >@@ -2504,146 +3056,11 @@ void TIntermConstantUnion::foldFloatTypeUnary(const TConstantUnion ¶meter, > result->setFConst(builtinFunc(parameter.getFConst())); > } > >-// static >-TConstantUnion *TIntermConstantUnion::FoldAggregateConstructor(TIntermAggregate *aggregate) >-{ >- ASSERT(aggregate->getSequence()->size() > 0u); >- size_t resultSize = aggregate->getType().getObjectSize(); >- TConstantUnion *resultArray = new TConstantUnion[resultSize]; >- TBasicType basicType = aggregate->getBasicType(); >- >- size_t resultIndex = 0u; >- >- if (aggregate->getSequence()->size() == 1u) >- { >- TIntermNode *argument = aggregate->getSequence()->front(); >- TIntermConstantUnion *argumentConstant = argument->getAsConstantUnion(); >- const TConstantUnion *argumentUnionArray = argumentConstant->getUnionArrayPointer(); >- // Check the special case of constructing a matrix diagonal from a single scalar, >- // or a vector from a single scalar. >- if (argumentConstant->getType().getObjectSize() == 1u) >- { >- if (aggregate->isMatrix()) >- { >- int resultCols = aggregate->getType().getCols(); >- int resultRows = aggregate->getType().getRows(); >- for (int col = 0; col < resultCols; ++col) >- { >- for (int row = 0; row < resultRows; ++row) >- { >- if (col == row) >- { >- resultArray[resultIndex].cast(basicType, argumentUnionArray[0]); >- } >- else >- { >- resultArray[resultIndex].setFConst(0.0f); >- } >- ++resultIndex; >- } >- } >- } >- else >- { >- while (resultIndex < resultSize) >- { >- resultArray[resultIndex].cast(basicType, argumentUnionArray[0]); >- ++resultIndex; >- } >- } >- ASSERT(resultIndex == resultSize); >- return resultArray; >- } >- else if (aggregate->isMatrix() && argumentConstant->isMatrix()) >- { >- // The special case of constructing a matrix from a matrix. >- int argumentCols = argumentConstant->getType().getCols(); >- int argumentRows = argumentConstant->getType().getRows(); >- int resultCols = aggregate->getType().getCols(); >- int resultRows = aggregate->getType().getRows(); >- for (int col = 0; col < resultCols; ++col) >- { >- for (int row = 0; row < resultRows; ++row) >- { >- if (col < argumentCols && row < argumentRows) >- { >- resultArray[resultIndex].cast(basicType, >- argumentUnionArray[col * argumentRows + row]); >- } >- else if (col == row) >- { >- resultArray[resultIndex].setFConst(1.0f); >- } >- else >- { >- resultArray[resultIndex].setFConst(0.0f); >- } >- ++resultIndex; >- } >- } >- ASSERT(resultIndex == resultSize); >- return resultArray; >- } >- } >- >- for (TIntermNode *&argument : *aggregate->getSequence()) >- { >- TIntermConstantUnion *argumentConstant = argument->getAsConstantUnion(); >- size_t argumentSize = argumentConstant->getType().getObjectSize(); >- const TConstantUnion *argumentUnionArray = argumentConstant->getUnionArrayPointer(); >- for (size_t i = 0u; i < argumentSize; ++i) >- { >- if (resultIndex >= resultSize) >- break; >- resultArray[resultIndex].cast(basicType, argumentUnionArray[i]); >- ++resultIndex; >- } >- } >- ASSERT(resultIndex == resultSize); >- return resultArray; >-} >- >-bool TIntermAggregate::CanFoldAggregateBuiltInOp(TOperator op) >-{ >- switch (op) >- { >- case EOpAtan: >- case EOpPow: >- case EOpMod: >- case EOpMin: >- case EOpMax: >- case EOpClamp: >- case EOpMix: >- case EOpStep: >- case EOpSmoothStep: >- case EOpLdexp: >- case EOpMulMatrixComponentWise: >- case EOpOuterProduct: >- case EOpEqualComponentWise: >- case EOpNotEqualComponentWise: >- case EOpLessThanComponentWise: >- case EOpLessThanEqualComponentWise: >- case EOpGreaterThanComponentWise: >- case EOpGreaterThanEqualComponentWise: >- case EOpDistance: >- case EOpDot: >- case EOpCross: >- case EOpFaceforward: >- case EOpReflect: >- case EOpRefract: >- case EOpBitfieldExtract: >- case EOpBitfieldInsert: >- return true; >- default: >- return false; >- } >-} >- > // static > TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *aggregate, > TDiagnostics *diagnostics) > { >- TOperator op = aggregate->getOp(); >+ TOperator op = aggregate->getOp(); > TIntermSequence *arguments = aggregate->getSequence(); > unsigned int argsCount = static_cast<unsigned int>(arguments->size()); > std::vector<const TConstantUnion *> unionArrays(argsCount); >@@ -2661,7 +3078,7 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg > basicType = argConstant->getType().getBasicType(); > loc = argConstant->getLine(); > } >- unionArrays[i] = argConstant->getUnionArrayPointer(); >+ unionArrays[i] = argConstant->getConstantValue(); > objectSizes[i] = argConstant->getType().getObjectSize(); > if (objectSizes[i] > maxObjectSize) > maxObjectSize = objectSizes[i]; >@@ -3021,10 +3438,12 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg > ASSERT(basicType == EbtFloat && (*arguments)[0]->getAsTyped()->isMatrix() && > (*arguments)[1]->getAsTyped()->isMatrix()); > // Perform component-wise matrix multiplication. >- resultArray = new TConstantUnion[maxObjectSize]; >- int size = (*arguments)[0]->getAsTyped()->getNominalSize(); >- angle::Matrix<float> result = >- GetMatrix(unionArrays[0], size).compMult(GetMatrix(unionArrays[1], size)); >+ resultArray = new TConstantUnion[maxObjectSize]; >+ int rows = (*arguments)[0]->getAsTyped()->getRows(); >+ int cols = (*arguments)[0]->getAsTyped()->getCols(); >+ angle::Matrix<float> lhs = GetMatrix(unionArrays[0], rows, cols); >+ angle::Matrix<float> rhs = GetMatrix(unionArrays[1], rows, cols); >+ angle::Matrix<float> result = lhs.compMult(rhs); > SetUnionArrayFromMatrix(result, resultArray); > break; > } >@@ -3127,7 +3546,7 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg > break; > } > >- case EOpSmoothStep: >+ case EOpSmoothstep: > { > ASSERT(basicType == EbtFloat); > resultArray = new TConstantUnion[maxObjectSize]; >@@ -3327,4 +3746,22 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg > return resultArray; > } > >+// TIntermPreprocessorDirective implementation. >+TIntermPreprocessorDirective::TIntermPreprocessorDirective(PreprocessorDirective directive, >+ ImmutableString command) >+ : mDirective(directive), mCommand(std::move(command)) >+{} >+ >+TIntermPreprocessorDirective::~TIntermPreprocessorDirective() = default; >+ >+size_t TIntermPreprocessorDirective::getChildCount() const >+{ >+ return 0; >+} >+ >+TIntermNode *TIntermPreprocessorDirective::getChildNode(size_t index) const >+{ >+ UNREACHABLE(); >+ return nullptr; >+} > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.h b/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.h >index 2170916201b..2380599a09f 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.h >@@ -24,9 +24,11 @@ > #include "common/angleutils.h" > #include "compiler/translator/Common.h" > #include "compiler/translator/ConstantUnion.h" >+#include "compiler/translator/ImmutableString.h" > #include "compiler/translator/Operator.h" > #include "compiler/translator/SymbolUniqueId.h" > #include "compiler/translator/Types.h" >+#include "compiler/translator/tree_util/Visit.h" > > namespace sh > { >@@ -53,32 +55,12 @@ class TIntermSymbol; > class TIntermLoop; > class TInfoSink; > class TInfoSinkBase; >-class TIntermRaw; > class TIntermBranch; >+class TIntermPreprocessorDirective; > > class TSymbolTable; > class TFunction; >- >-// Encapsulate an identifier string and track whether it is coming from the original shader code >-// (not internal) or from ANGLE (internal). Usually internal names shouldn't be decorated or hashed. >-class TName >-{ >- public: >- POOL_ALLOCATOR_NEW_DELETE(); >- explicit TName(const TString &name) : mName(name), mIsInternal(false) {} >- TName() : mName(), mIsInternal(false) {} >- TName(const TName &) = default; >- TName &operator=(const TName &) = default; >- >- const TString &getString() const { return mName; } >- void setString(const TString &string) { mName = string; } >- bool isInternal() const { return mIsInternal; } >- void setInternal(bool isInternal) { mIsInternal = isInternal; } >- >- private: >- TString mName; >- bool mIsInternal; >-}; >+class TVariable; > > // > // Base class for the tree nodes >@@ -86,7 +68,7 @@ class TName > class TIntermNode : angle::NonCopyable > { > public: >- POOL_ALLOCATOR_NEW_DELETE(); >+ POOL_ALLOCATOR_NEW_DELETE > TIntermNode() > { > // TODO: Move this to TSourceLoc constructor >@@ -99,27 +81,31 @@ class TIntermNode : angle::NonCopyable > const TSourceLoc &getLine() const { return mLine; } > void setLine(const TSourceLoc &l) { mLine = l; } > >- virtual void traverse(TIntermTraverser *) = 0; >- virtual TIntermTyped *getAsTyped() { return 0; } >- virtual TIntermConstantUnion *getAsConstantUnion() { return 0; } >+ virtual void traverse(TIntermTraverser *it); >+ virtual bool visit(Visit visit, TIntermTraverser *it) = 0; >+ >+ virtual TIntermTyped *getAsTyped() { return nullptr; } >+ virtual TIntermConstantUnion *getAsConstantUnion() { return nullptr; } > virtual TIntermFunctionDefinition *getAsFunctionDefinition() { return nullptr; } >- virtual TIntermAggregate *getAsAggregate() { return 0; } >+ virtual TIntermAggregate *getAsAggregate() { return nullptr; } > virtual TIntermBlock *getAsBlock() { return nullptr; } > virtual TIntermFunctionPrototype *getAsFunctionPrototypeNode() { return nullptr; } > virtual TIntermInvariantDeclaration *getAsInvariantDeclarationNode() { return nullptr; } > virtual TIntermDeclaration *getAsDeclarationNode() { return nullptr; } > virtual TIntermSwizzle *getAsSwizzleNode() { return nullptr; } >- virtual TIntermBinary *getAsBinaryNode() { return 0; } >- virtual TIntermUnary *getAsUnaryNode() { return 0; } >+ virtual TIntermBinary *getAsBinaryNode() { return nullptr; } >+ virtual TIntermUnary *getAsUnaryNode() { return nullptr; } > virtual TIntermTernary *getAsTernaryNode() { return nullptr; } > virtual TIntermIfElse *getAsIfElseNode() { return nullptr; } >- virtual TIntermSwitch *getAsSwitchNode() { return 0; } >- virtual TIntermCase *getAsCaseNode() { return 0; } >- virtual TIntermSymbol *getAsSymbolNode() { return 0; } >- virtual TIntermLoop *getAsLoopNode() { return 0; } >- virtual TIntermRaw *getAsRawNode() { return 0; } >- virtual TIntermBranch *getAsBranchNode() { return 0; } >- >+ virtual TIntermSwitch *getAsSwitchNode() { return nullptr; } >+ virtual TIntermCase *getAsCaseNode() { return nullptr; } >+ virtual TIntermSymbol *getAsSymbolNode() { return nullptr; } >+ virtual TIntermLoop *getAsLoopNode() { return nullptr; } >+ virtual TIntermBranch *getAsBranchNode() { return nullptr; } >+ virtual TIntermPreprocessorDirective *getAsPreprocessorDirective() { return nullptr; } >+ >+ virtual size_t getChildCount() const = 0; >+ virtual TIntermNode *getChildNode(size_t index) const = 0; > // Replace a child node. Return true if |original| is a child > // node and it is replaced; otherwise, return false. > virtual bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) = 0; >@@ -143,47 +129,47 @@ struct TIntermNodePair > class TIntermTyped : public TIntermNode > { > public: >- TIntermTyped(const TType &t) : mType(t) {} >+ TIntermTyped() {} > > virtual TIntermTyped *deepCopy() const = 0; > > TIntermTyped *getAsTyped() override { return this; } > >+ virtual TIntermTyped *fold(TDiagnostics *diagnostics) { return this; } >+ >+ // getConstantValue() returns the constant value that this node represents, if any. It >+ // should only be used after nodes have been replaced with their folded versions returned >+ // from fold(). hasConstantValue() returns true if getConstantValue() will return a value. >+ virtual bool hasConstantValue() const; >+ virtual const TConstantUnion *getConstantValue() const; >+ > // True if executing the expression represented by this node affects state, like values of > // variables. False if the executing the expression only computes its return value without > // affecting state. May return true conservatively. > virtual bool hasSideEffects() const = 0; > >- void setType(const TType &t) { mType = t; } >- void setTypePreservePrecision(const TType &t); >- const TType &getType() const { return mType; } >- TType *getTypePointer() { return &mType; } >- >- TBasicType getBasicType() const { return mType.getBasicType(); } >- TQualifier getQualifier() const { return mType.getQualifier(); } >- TPrecision getPrecision() const { return mType.getPrecision(); } >- TMemoryQualifier getMemoryQualifier() const { return mType.getMemoryQualifier(); } >- int getCols() const { return mType.getCols(); } >- int getRows() const { return mType.getRows(); } >- int getNominalSize() const { return mType.getNominalSize(); } >- int getSecondarySize() const { return mType.getSecondarySize(); } >+ virtual const TType &getType() const = 0; > >- bool isInterfaceBlock() const { return mType.isInterfaceBlock(); } >- bool isMatrix() const { return mType.isMatrix(); } >- bool isArray() const { return mType.isArray(); } >- bool isVector() const { return mType.isVector(); } >- bool isScalar() const { return mType.isScalar(); } >- bool isScalarInt() const { return mType.isScalarInt(); } >- const char *getBasicString() const { return mType.getBasicString(); } >- TString getCompleteString() const { return mType.getCompleteString(); } >+ TBasicType getBasicType() const { return getType().getBasicType(); } >+ TQualifier getQualifier() const { return getType().getQualifier(); } >+ TPrecision getPrecision() const { return getType().getPrecision(); } >+ TMemoryQualifier getMemoryQualifier() const { return getType().getMemoryQualifier(); } >+ int getCols() const { return getType().getCols(); } >+ int getRows() const { return getType().getRows(); } >+ int getNominalSize() const { return getType().getNominalSize(); } >+ int getSecondarySize() const { return getType().getSecondarySize(); } > >- unsigned int getOutermostArraySize() const { return mType.getOutermostArraySize(); } >+ bool isInterfaceBlock() const { return getType().isInterfaceBlock(); } >+ bool isMatrix() const { return getType().isMatrix(); } >+ bool isArray() const { return getType().isArray(); } >+ bool isVector() const { return getType().isVector(); } >+ bool isScalar() const { return getType().isScalar(); } >+ bool isScalarInt() const { return getType().isScalarInt(); } >+ const char *getBasicString() const { return getType().getBasicString(); } > >- bool isConstructorWithOnlyConstantUnionParameters(); >+ unsigned int getOutermostArraySize() const { return getType().getOutermostArraySize(); } > > protected: >- TType mType; >- > TIntermTyped(const TIntermTyped &node); > }; > >@@ -207,7 +193,11 @@ class TIntermLoop : public TIntermNode > TIntermBlock *body); > > TIntermLoop *getAsLoopNode() override { return this; } >- void traverse(TIntermTraverser *it) override; >+ void traverse(TIntermTraverser *it) final; >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; > bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > > TLoopType getType() const { return mType; } >@@ -237,8 +227,11 @@ class TIntermBranch : public TIntermNode > public: > TIntermBranch(TOperator op, TIntermTyped *e) : mFlowOp(op), mExpression(e) {} > >- void traverse(TIntermTraverser *it) override; > TIntermBranch *getAsBranchNode() override { return this; } >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; > bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > > TOperator getFlowOp() { return mFlowOp; } >@@ -246,72 +239,60 @@ class TIntermBranch : public TIntermNode > > protected: > TOperator mFlowOp; >- TIntermTyped *mExpression; // non-zero except for "return exp;" statements >+ TIntermTyped *mExpression; // zero except for "return exp;" statements > }; > >-// >-// Nodes that correspond to symbols or constants in the source code. >-// >+// Nodes that correspond to variable symbols in the source code. These may be regular variables or >+// interface block instances. In declarations that only declare a struct type but no variables, a >+// TIntermSymbol node with an empty variable is used to store the type. > class TIntermSymbol : public TIntermTyped > { > public: >- // if symbol is initialized as symbol(sym), the memory comes from the poolallocator of sym. >- // If sym comes from per process globalpoolallocator, then it causes increased memory usage >- // per compile it is essential to use "symbol = sym" to assign to symbol >- TIntermSymbol(const TSymbolUniqueId &id, const TString &symbol, const TType &type) >- : TIntermTyped(type), mId(id), mSymbol(symbol) >- { >- } >+ TIntermSymbol(const TVariable *variable); > > TIntermTyped *deepCopy() const override { return new TIntermSymbol(*this); } > >+ bool hasConstantValue() const override; >+ const TConstantUnion *getConstantValue() const override; >+ > bool hasSideEffects() const override { return false; } > >- int getId() const { return mId.get(); } >- const TString &getSymbol() const { return mSymbol.getString(); } >- const TName &getName() const { return mSymbol; } >- TName &getName() { return mSymbol; } >+ const TType &getType() const override; > >- void setInternal(bool internal) { mSymbol.setInternal(internal); } >+ const TSymbolUniqueId &uniqueId() const; >+ ImmutableString getName() const; >+ const TVariable &variable() const { return *mVariable; } > >- void traverse(TIntermTraverser *it) override; > TIntermSymbol *getAsSymbolNode() override { return this; } >- bool replaceChildNode(TIntermNode *, TIntermNode *) override { return false; } >+ void traverse(TIntermTraverser *it) final; >+ bool visit(Visit visit, TIntermTraverser *it) final; > >- protected: >- const TSymbolUniqueId mId; >- TName mSymbol; >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; >+ bool replaceChildNode(TIntermNode *, TIntermNode *) override { return false; } > > private: > TIntermSymbol(const TIntermSymbol &) = default; // Note: not deleted, just private! >+ >+ const TVariable *const mVariable; // Guaranteed to be non-null > }; > >-// A Raw node stores raw code, that the translator will insert verbatim >-// into the output stream. Useful for transformation operations that make >-// complex code that might not fit naturally into the GLSL model. >-class TIntermRaw : public TIntermTyped >+// A typed expression that is not just representing a symbol table symbol. >+class TIntermExpression : public TIntermTyped > { > public: >- TIntermRaw(const TType &type, const TString &rawText) : TIntermTyped(type), mRawText(rawText) {} >- TIntermRaw(const TIntermRaw &) = delete; >+ TIntermExpression(const TType &t); > >- TIntermTyped *deepCopy() const override >- { >- UNREACHABLE(); >- return nullptr; >- } >+ const TType &getType() const override { return mType; } > >- bool hasSideEffects() const override { return false; } >- >- TString getRawText() const { return mRawText; } >- >- void traverse(TIntermTraverser *it) override; >+ protected: >+ TType *getTypePointer() { return &mType; } >+ void setType(const TType &t) { mType = t; } >+ void setTypePreservePrecision(const TType &t); > >- TIntermRaw *getAsRawNode() override { return this; } >- bool replaceChildNode(TIntermNode *, TIntermNode *) override { return false; } >+ TIntermExpression(const TIntermExpression &node) = default; > >- protected: >- TString mRawText; >+ TType mType; > }; > > // Constant folded node. >@@ -320,20 +301,21 @@ class TIntermRaw : public TIntermTyped > // "true ? 1.0 : non_constant" > // Other nodes than TIntermConstantUnion may also be constant expressions. > // >-class TIntermConstantUnion : public TIntermTyped >+class TIntermConstantUnion : public TIntermExpression > { > public: > TIntermConstantUnion(const TConstantUnion *unionPointer, const TType &type) >- : TIntermTyped(type), mUnionArrayPointer(unionPointer) >+ : TIntermExpression(type), mUnionArrayPointer(unionPointer) > { > ASSERT(unionPointer); > } > > TIntermTyped *deepCopy() const override { return new TIntermConstantUnion(*this); } > >- bool hasSideEffects() const override { return false; } >+ bool hasConstantValue() const override; >+ const TConstantUnion *getConstantValue() const override; > >- const TConstantUnion *getUnionArrayPointer() const { return mUnionArrayPointer; } >+ bool hasSideEffects() const override { return false; } > > int getIConst(size_t index) const > { >@@ -352,26 +334,28 @@ class TIntermConstantUnion : public TIntermTyped > return mUnionArrayPointer ? mUnionArrayPointer[index].getBConst() : false; > } > >- void replaceConstantUnion(const TConstantUnion *safeConstantUnion) >- { >- ASSERT(safeConstantUnion); >- // Previous union pointer freed on pool deallocation. >- mUnionArrayPointer = safeConstantUnion; >- } >- > TIntermConstantUnion *getAsConstantUnion() override { return this; } >- void traverse(TIntermTraverser *it) override; >+ void traverse(TIntermTraverser *it) final; >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; > bool replaceChildNode(TIntermNode *, TIntermNode *) override { return false; } > >- TConstantUnion *foldBinary(TOperator op, >- TIntermConstantUnion *rightNode, >- TDiagnostics *diagnostics, >- const TSourceLoc &line); >- const TConstantUnion *foldIndexing(int index); > TConstantUnion *foldUnaryNonComponentWise(TOperator op); > TConstantUnion *foldUnaryComponentWise(TOperator op, TDiagnostics *diagnostics); > >- static TConstantUnion *FoldAggregateConstructor(TIntermAggregate *aggregate); >+ static const TConstantUnion *FoldBinary(TOperator op, >+ const TConstantUnion *leftArray, >+ const TType &leftType, >+ const TConstantUnion *rightArray, >+ const TType &rightType, >+ TDiagnostics *diagnostics, >+ const TSourceLoc &line); >+ >+ static const TConstantUnion *FoldIndexing(const TType &type, >+ const TConstantUnion *constArray, >+ int index); > static TConstantUnion *FoldAggregateBuiltIn(TIntermAggregate *aggregate, > TDiagnostics *diagnostics); > >@@ -391,7 +375,7 @@ class TIntermConstantUnion : public TIntermTyped > // > // Intermediate class for node types that hold operators. > // >-class TIntermOperator : public TIntermTyped >+class TIntermOperator : public TIntermExpression > { > public: > TOperator getOp() const { return mOp; } >@@ -407,8 +391,8 @@ class TIntermOperator : public TIntermTyped > bool hasSideEffects() const override { return isAssignment(); } > > protected: >- TIntermOperator(TOperator op) : TIntermTyped(TType(EbtFloat, EbpUndefined)), mOp(op) {} >- TIntermOperator(TOperator op, const TType &type) : TIntermTyped(type), mOp(op) {} >+ TIntermOperator(TOperator op) : TIntermExpression(TType(EbtFloat, EbpUndefined)), mOp(op) {} >+ TIntermOperator(TOperator op, const TType &type) : TIntermExpression(type), mOp(op) {} > > TIntermOperator(const TIntermOperator &) = default; > >@@ -416,7 +400,7 @@ class TIntermOperator : public TIntermTyped > }; > > // Node for vector swizzles. >-class TIntermSwizzle : public TIntermTyped >+class TIntermSwizzle : public TIntermExpression > { > public: > // This constructor determines the type of the node based on the operand. >@@ -424,8 +408,11 @@ class TIntermSwizzle : public TIntermTyped > > TIntermTyped *deepCopy() const override { return new TIntermSwizzle(*this); } > >- TIntermSwizzle *getAsSwizzleNode() override { return this; }; >- void traverse(TIntermTraverser *it) override; >+ TIntermSwizzle *getAsSwizzleNode() override { return this; } >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; > bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > > bool hasSideEffects() const override { return mOperand->hasSideEffects(); } >@@ -433,14 +420,18 @@ class TIntermSwizzle : public TIntermTyped > TIntermTyped *getOperand() { return mOperand; } > void writeOffsetsAsXYZW(TInfoSinkBase *out) const; > >+ const TVector<int> &getSwizzleOffsets() { return mSwizzleOffsets; } >+ > bool hasDuplicateOffsets() const; >+ void setHasFoldedDuplicateOffsets(bool hasFoldedDuplicateOffsets); > bool offsetsMatch(int offset) const; > >- TIntermTyped *fold(); >+ TIntermTyped *fold(TDiagnostics *diagnostics) override; > > protected: > TIntermTyped *mOperand; > TVector<int> mSwizzleOffsets; >+ bool mHasFoldedDuplicateOffsets; > > private: > void promote(); >@@ -456,17 +447,23 @@ class TIntermBinary : public TIntermOperator > public: > // This constructor determines the type of the binary node based on the operands and op. > TIntermBinary(TOperator op, TIntermTyped *left, TIntermTyped *right); >+ // Comma qualifier depends on the shader version, so use this to create comma nodes: >+ static TIntermBinary *CreateComma(TIntermTyped *left, TIntermTyped *right, int shaderVersion); > > TIntermTyped *deepCopy() const override { return new TIntermBinary(*this); } > >+ bool hasConstantValue() const override; >+ const TConstantUnion *getConstantValue() const override; >+ > static TOperator GetMulOpBasedOnOperands(const TType &left, const TType &right); > static TOperator GetMulAssignOpBasedOnOperands(const TType &left, const TType &right); >- static TQualifier GetCommaQualifier(int shaderVersion, >- const TIntermTyped *left, >- const TIntermTyped *right); > >- TIntermBinary *getAsBinaryNode() override { return this; }; >- void traverse(TIntermTraverser *it) override; >+ TIntermBinary *getAsBinaryNode() override { return this; } >+ void traverse(TIntermTraverser *it) final; >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; > bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > > bool hasSideEffects() const override >@@ -476,10 +473,13 @@ class TIntermBinary : public TIntermOperator > > TIntermTyped *getLeft() const { return mLeft; } > TIntermTyped *getRight() const { return mRight; } >- TIntermTyped *fold(TDiagnostics *diagnostics); >+ TIntermTyped *fold(TDiagnostics *diagnostics) override; > > void setAddIndexClamp() { mAddIndexClamp = true; } >- bool getAddIndexClamp() { return mAddIndexClamp; } >+ bool getAddIndexClamp() const { return mAddIndexClamp; } >+ >+ // This method is only valid for EOpIndexDirectStruct. It returns the name of the field. >+ const ImmutableString &getIndexStructFieldName() const; > > protected: > TIntermTyped *mLeft; >@@ -491,6 +491,10 @@ class TIntermBinary : public TIntermOperator > private: > void promote(); > >+ static TQualifier GetCommaQualifier(int shaderVersion, >+ const TIntermTyped *left, >+ const TIntermTyped *right); >+ > TIntermBinary(const TIntermBinary &node); // Note: not deleted, just private! > }; > >@@ -500,18 +504,24 @@ class TIntermBinary : public TIntermOperator > class TIntermUnary : public TIntermOperator > { > public: >- TIntermUnary(TOperator op, TIntermTyped *operand); >+ TIntermUnary(TOperator op, TIntermTyped *operand, const TFunction *function); > > TIntermTyped *deepCopy() const override { return new TIntermUnary(*this); } > >- void traverse(TIntermTraverser *it) override; > TIntermUnary *getAsUnaryNode() override { return this; } >+ void traverse(TIntermTraverser *it) final; >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; > bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > > bool hasSideEffects() const override { return isAssignment() || mOperand->hasSideEffects(); } > > TIntermTyped *getOperand() { return mOperand; } >- TIntermTyped *fold(TDiagnostics *diagnostics); >+ TIntermTyped *fold(TDiagnostics *diagnostics) override; >+ >+ const TFunction *getFunction() const { return mFunction; } > > void setUseEmulatedFunction() { mUseEmulatedFunction = true; } > bool getUseEmulatedFunction() { return mUseEmulatedFunction; } >@@ -523,63 +533,17 @@ class TIntermUnary : public TIntermOperator > // to work around driver bugs. > bool mUseEmulatedFunction; > >+ const TFunction *const mFunction; >+ > private: > void promote(); > > TIntermUnary(const TIntermUnary &node); // note: not deleted, just private! > }; > >-class TFunctionSymbolInfo >-{ >- public: >- POOL_ALLOCATOR_NEW_DELETE(); >- TFunctionSymbolInfo(const TSymbolUniqueId &id); >- TFunctionSymbolInfo() : mId(nullptr), mKnownToNotHaveSideEffects(false) {} >- >- TFunctionSymbolInfo(const TFunctionSymbolInfo &info); >- TFunctionSymbolInfo &operator=(const TFunctionSymbolInfo &info); >- >- void setFromFunction(const TFunction &function); >- >- void setNameObj(const TName &name) { mName = name; } >- const TName &getNameObj() const { return mName; } >- >- const TString &getName() const { return mName.getString(); } >- void setName(const TString &name) { mName.setString(name); } >- bool isMain() const { return mName.getString() == "main"; } >- >- void setKnownToNotHaveSideEffects(bool knownToNotHaveSideEffects) >- { >- mKnownToNotHaveSideEffects = knownToNotHaveSideEffects; >- } >- bool isKnownToNotHaveSideEffects() const { return mKnownToNotHaveSideEffects; } >- >- void setId(const TSymbolUniqueId &functionId); >- const TSymbolUniqueId &getId() const; >- >- bool isImageFunction() const >- { >- return getName() == "imageSize" || getName() == "imageLoad" || getName() == "imageStore"; >- } >- >- private: >- TName mName; >- TSymbolUniqueId *mId; >- bool mKnownToNotHaveSideEffects; >-}; >- > typedef TVector<TIntermNode *> TIntermSequence; > typedef TVector<int> TQualifierList; > >-// >-// This is just to help yacc. >-// >-struct TIntermFunctionCallOrMethod >-{ >- TIntermSequence *arguments; >- TIntermNode *thisNode; >-}; >- > // Interface for node classes that have an arbitrarily sized set of children. > class TIntermAggregateBase > { >@@ -606,18 +570,13 @@ class TIntermAggregate : public TIntermOperator, public TIntermAggregateBase > public: > static TIntermAggregate *CreateFunctionCall(const TFunction &func, TIntermSequence *arguments); > >- // If using this, ensure that there's a consistent function definition with the same symbol id >- // added to the AST. >- static TIntermAggregate *CreateFunctionCall(const TType &type, >- const TSymbolUniqueId &id, >- const TName &name, >- TIntermSequence *arguments); >+ static TIntermAggregate *CreateRawFunctionCall(const TFunction &func, >+ TIntermSequence *arguments); > >+ // This covers all built-in function calls - whether they are associated with an op or not. > static TIntermAggregate *CreateBuiltInFunctionCall(const TFunction &func, > TIntermSequence *arguments); >- static TIntermAggregate *CreateConstructor(const TType &type, >- TIntermSequence *arguments); >- static TIntermAggregate *Create(const TType &type, TOperator op, TIntermSequence *arguments); >+ static TIntermAggregate *CreateConstructor(const TType &type, TIntermSequence *arguments); > ~TIntermAggregate() {} > > // Note: only supported for nodes that can be a part of an expression. >@@ -625,28 +584,34 @@ class TIntermAggregate : public TIntermOperator, public TIntermAggregateBase > > TIntermAggregate *shallowCopy() const; > >+ bool hasConstantValue() const override; >+ const TConstantUnion *getConstantValue() const override; >+ > TIntermAggregate *getAsAggregate() override { return this; } >- void traverse(TIntermTraverser *it) override; >+ void traverse(TIntermTraverser *it) final; >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; > bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > > bool hasSideEffects() const override; > >- static bool CanFoldAggregateBuiltInOp(TOperator op); >- TIntermTyped *fold(TDiagnostics *diagnostics); >+ TIntermTyped *fold(TDiagnostics *diagnostics) override; > > TIntermSequence *getSequence() override { return &mArguments; } > const TIntermSequence *getSequence() const override { return &mArguments; } > >- TString getSymbolTableMangledName() const; >- > void setUseEmulatedFunction() { mUseEmulatedFunction = true; } > bool getUseEmulatedFunction() { return mUseEmulatedFunction; } > > // Returns true if changing parameter precision may affect the return value. > bool gotPrecisionFromChildren() const { return mGotPrecisionFromChildren; } > >- TFunctionSymbolInfo *getFunctionSymbolInfo() { return &mFunctionInfo; } >- const TFunctionSymbolInfo *getFunctionSymbolInfo() const { return &mFunctionInfo; } >+ const TFunction *getFunction() const { return mFunction; } >+ >+ // Get the function name to display to the user in an error message. >+ const char *functionName() const; > > protected: > TIntermSequence mArguments; >@@ -657,14 +622,17 @@ class TIntermAggregate : public TIntermOperator, public TIntermAggregateBase > > bool mGotPrecisionFromChildren; > >- TFunctionSymbolInfo mFunctionInfo; >+ const TFunction *const mFunction; > > private: >- TIntermAggregate(const TType &type, TOperator op, TIntermSequence *arguments); >+ TIntermAggregate(const TFunction *func, >+ const TType &type, >+ TOperator op, >+ TIntermSequence *arguments); > > TIntermAggregate(const TIntermAggregate &node); // note: not deleted, just private! > >- void setTypePrecisionAndQualifier(const TType &type); >+ void setPrecisionAndQualifier(); > > bool areChildrenConstQualified(); > >@@ -689,11 +657,16 @@ class TIntermBlock : public TIntermNode, public TIntermAggregateBase > ~TIntermBlock() {} > > TIntermBlock *getAsBlock() override { return this; } >- void traverse(TIntermTraverser *it) override; >+ void traverse(TIntermTraverser *it) final; >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; > bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > > // Only intended for initially building the block. > void appendStatement(TIntermNode *statement); >+ void insertStatement(size_t insertPosition, TIntermNode *statement); > > TIntermSequence *getSequence() override { return &mStatements; } > const TIntermSequence *getSequence() const override { return &mStatements; } >@@ -704,21 +677,22 @@ class TIntermBlock : public TIntermNode, public TIntermAggregateBase > > // Function prototype. May be in the AST either as a function prototype declaration or as a part of > // a function definition. The type of the node is the function return type. >-class TIntermFunctionPrototype : public TIntermTyped, public TIntermAggregateBase >+class TIntermFunctionPrototype : public TIntermTyped > { > public: >- // TODO(oetuaho@nvidia.com): See if TFunctionSymbolInfo could be added to constructor >- // parameters. >- TIntermFunctionPrototype(const TType &type, const TSymbolUniqueId &id) >- : TIntermTyped(type), mFunctionInfo(id) >- { >- } >+ TIntermFunctionPrototype(const TFunction *function); > ~TIntermFunctionPrototype() {} > > TIntermFunctionPrototype *getAsFunctionPrototypeNode() override { return this; } >- void traverse(TIntermTraverser *it) override; >+ void traverse(TIntermTraverser *it) final; >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; > bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > >+ const TType &getType() const override; >+ > TIntermTyped *deepCopy() const override > { > UNREACHABLE(); >@@ -730,19 +704,10 @@ class TIntermFunctionPrototype : public TIntermTyped, public TIntermAggregateBas > return true; > } > >- // Only intended for initially building the declaration. >- void appendParameter(TIntermSymbol *parameter); >- >- TIntermSequence *getSequence() override { return &mParameters; } >- const TIntermSequence *getSequence() const override { return &mParameters; } >- >- TFunctionSymbolInfo *getFunctionSymbolInfo() { return &mFunctionInfo; } >- const TFunctionSymbolInfo *getFunctionSymbolInfo() const { return &mFunctionInfo; } >+ const TFunction *getFunction() const { return mFunction; } > > protected: >- TIntermSequence mParameters; >- >- TFunctionSymbolInfo mFunctionInfo; >+ const TFunction *const mFunction; > }; > > // Node for function definitions. The prototype child node stores the function header including >@@ -758,16 +723,17 @@ class TIntermFunctionDefinition : public TIntermNode > } > > TIntermFunctionDefinition *getAsFunctionDefinition() override { return this; } >- void traverse(TIntermTraverser *it) override; >+ void traverse(TIntermTraverser *it) final; >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; > bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > > TIntermFunctionPrototype *getFunctionPrototype() const { return mPrototype; } > TIntermBlock *getBody() const { return mBody; } > >- const TFunctionSymbolInfo *getFunctionSymbolInfo() const >- { >- return mPrototype->getFunctionSymbolInfo(); >- } >+ const TFunction *getFunction() const { return mPrototype->getFunction(); } > > private: > TIntermFunctionPrototype *mPrototype; >@@ -782,7 +748,10 @@ class TIntermDeclaration : public TIntermNode, public TIntermAggregateBase > ~TIntermDeclaration() {} > > TIntermDeclaration *getAsDeclarationNode() override { return this; } >- void traverse(TIntermTraverser *it) override; >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; > bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > > // Only intended for initially building the declaration. >@@ -792,6 +761,7 @@ class TIntermDeclaration : public TIntermNode, public TIntermAggregateBase > > TIntermSequence *getSequence() override { return &mDeclarators; } > const TIntermSequence *getSequence() const override { return &mDeclarators; } >+ > protected: > TIntermSequence mDeclarators; > }; >@@ -803,10 +773,12 @@ class TIntermInvariantDeclaration : public TIntermNode > TIntermInvariantDeclaration(TIntermSymbol *symbol, const TSourceLoc &line); > > virtual TIntermInvariantDeclaration *getAsInvariantDeclarationNode() override { return this; } >+ bool visit(Visit visit, TIntermTraverser *it) final; > > TIntermSymbol *getSymbol() { return mSymbol; } > >- void traverse(TIntermTraverser *it) override; >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; > bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > > private: >@@ -814,18 +786,21 @@ class TIntermInvariantDeclaration : public TIntermNode > }; > > // For ternary operators like a ? b : c. >-class TIntermTernary : public TIntermTyped >+class TIntermTernary : public TIntermExpression > { > public: > TIntermTernary(TIntermTyped *cond, TIntermTyped *trueExpression, TIntermTyped *falseExpression); > >- void traverse(TIntermTraverser *it) override; >+ TIntermTernary *getAsTernaryNode() override { return this; } >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; > bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > > TIntermTyped *getCondition() const { return mCondition; } > TIntermTyped *getTrueExpression() const { return mTrueExpression; } > TIntermTyped *getFalseExpression() const { return mFalseExpression; } >- TIntermTernary *getAsTernaryNode() override { return this; } > > TIntermTyped *deepCopy() const override { return new TIntermTernary(*this); } > >@@ -835,7 +810,7 @@ class TIntermTernary : public TIntermTyped > mFalseExpression->hasSideEffects(); > } > >- TIntermTyped *fold(); >+ TIntermTyped *fold(TDiagnostics *diagnostics) override; > > private: > TIntermTernary(const TIntermTernary &node); // Note: not deleted, just private! >@@ -854,13 +829,16 @@ class TIntermIfElse : public TIntermNode > public: > TIntermIfElse(TIntermTyped *cond, TIntermBlock *trueB, TIntermBlock *falseB); > >- void traverse(TIntermTraverser *it) override; >+ TIntermIfElse *getAsIfElseNode() override { return this; } >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; > bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > > TIntermTyped *getCondition() const { return mCondition; } > TIntermBlock *getTrueBlock() const { return mTrueBlock; } > TIntermBlock *getFalseBlock() const { return mFalseBlock; } >- TIntermIfElse *getAsIfElseNode() override { return this; } > > protected: > TIntermTyped *mCondition; >@@ -876,10 +854,12 @@ class TIntermSwitch : public TIntermNode > public: > TIntermSwitch(TIntermTyped *init, TIntermBlock *statementList); > >- void traverse(TIntermTraverser *it) override; >- bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; >- > TIntermSwitch *getAsSwitchNode() override { return this; } >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; >+ bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > > TIntermTyped *getInit() { return mInit; } > TIntermBlock *getStatementList() { return mStatementList; } >@@ -900,10 +880,12 @@ class TIntermCase : public TIntermNode > public: > TIntermCase(TIntermTyped *condition) : TIntermNode(), mCondition(condition) {} > >- void traverse(TIntermTraverser *it) override; >- bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; >- > TIntermCase *getAsCaseNode() override { return this; } >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; >+ bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; > > bool hasCondition() const { return mCondition != nullptr; } > TIntermTyped *getCondition() const { return mCondition; } >@@ -912,6 +894,42 @@ class TIntermCase : public TIntermNode > TIntermTyped *mCondition; > }; > >+// >+// Preprocessor Directive. >+// #ifdef, #define, #if, #endif, etc. >+// >+ >+enum class PreprocessorDirective >+{ >+ Define, >+ Ifdef, >+ If, >+ Endif, >+}; >+ >+class TIntermPreprocessorDirective : public TIntermNode >+{ >+ public: >+ // This could also take an ImmutbleString as an argument. >+ TIntermPreprocessorDirective(PreprocessorDirective directive, ImmutableString command); >+ ~TIntermPreprocessorDirective() final; >+ >+ void traverse(TIntermTraverser *it) final; >+ bool visit(Visit visit, TIntermTraverser *it) final; >+ bool replaceChildNode(TIntermNode *, TIntermNode *) final { return false; } >+ >+ TIntermPreprocessorDirective *getAsPreprocessorDirective() final { return this; } >+ size_t getChildCount() const final; >+ TIntermNode *getChildNode(size_t index) const final; >+ >+ PreprocessorDirective getDirective() const { return mDirective; } >+ const ImmutableString &getCommand() const { return mCommand; } >+ >+ private: >+ PreprocessorDirective mDirective; >+ ImmutableString mCommand; >+}; >+ > } // namespace sh > > #endif // COMPILER_TRANSLATOR_INTERMNODE_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNodePatternMatcher.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNodePatternMatcher.cpp >deleted file mode 100644 >index 567e8f74405..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNodePatternMatcher.cpp >+++ /dev/null >@@ -1,157 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >-// IntermNodePatternMatcher is a helper class for matching node trees to given patterns. >-// It can be used whenever the same checks for certain node structures are common to multiple AST >-// traversers. >-// >- >-#include "compiler/translator/IntermNodePatternMatcher.h" >- >-#include "compiler/translator/IntermNode.h" >- >-namespace sh >-{ >- >-IntermNodePatternMatcher::IntermNodePatternMatcher(const unsigned int mask) : mMask(mask) >-{ >-} >- >-// static >-bool IntermNodePatternMatcher::IsDynamicIndexingOfVectorOrMatrix(TIntermBinary *node) >-{ >- return node->getOp() == EOpIndexIndirect && !node->getLeft()->isArray() && >- node->getLeft()->getBasicType() != EbtStruct; >-} >- >-bool IntermNodePatternMatcher::matchInternal(TIntermBinary *node, TIntermNode *parentNode) >-{ >- if ((mMask & kExpressionReturningArray) != 0) >- { >- if (node->isArray() && node->getOp() == EOpAssign && parentNode != nullptr && >- !parentNode->getAsBlock()) >- { >- return true; >- } >- } >- >- if ((mMask & kUnfoldedShortCircuitExpression) != 0) >- { >- if (node->getRight()->hasSideEffects() && >- (node->getOp() == EOpLogicalOr || node->getOp() == EOpLogicalAnd)) >- { >- return true; >- } >- } >- return false; >-} >- >-bool IntermNodePatternMatcher::match(TIntermUnary *node) >-{ >- if ((mMask & kArrayLengthMethod) != 0) >- { >- if (node->getOp() == EOpArrayLength) >- { >- return true; >- } >- } >- return false; >-} >- >-bool IntermNodePatternMatcher::match(TIntermBinary *node, TIntermNode *parentNode) >-{ >- // L-value tracking information is needed to check for dynamic indexing in L-value. >- // Traversers that don't track l-values can still use this class and match binary nodes with >- // this variation of this method if they don't need to check for dynamic indexing in l-values. >- ASSERT((mMask & kDynamicIndexingOfVectorOrMatrixInLValue) == 0); >- return matchInternal(node, parentNode); >-} >- >-bool IntermNodePatternMatcher::match(TIntermBinary *node, >- TIntermNode *parentNode, >- bool isLValueRequiredHere) >-{ >- if (matchInternal(node, parentNode)) >- { >- return true; >- } >- if ((mMask & kDynamicIndexingOfVectorOrMatrixInLValue) != 0) >- { >- if (isLValueRequiredHere && IsDynamicIndexingOfVectorOrMatrix(node)) >- { >- return true; >- } >- } >- return false; >-} >- >-bool IntermNodePatternMatcher::match(TIntermAggregate *node, TIntermNode *parentNode) >-{ >- if ((mMask & kExpressionReturningArray) != 0) >- { >- if (parentNode != nullptr) >- { >- TIntermBinary *parentBinary = parentNode->getAsBinaryNode(); >- bool parentIsAssignment = >- (parentBinary != nullptr && >- (parentBinary->getOp() == EOpAssign || parentBinary->getOp() == EOpInitialize)); >- >- if (node->getType().isArray() && !parentIsAssignment && >- (node->isConstructor() || node->isFunctionCall()) && !parentNode->getAsBlock()) >- { >- return true; >- } >- } >- } >- return false; >-} >- >-bool IntermNodePatternMatcher::match(TIntermTernary *node) >-{ >- if ((mMask & kUnfoldedShortCircuitExpression) != 0) >- { >- return true; >- } >- return false; >-} >- >-bool IntermNodePatternMatcher::match(TIntermDeclaration *node) >-{ >- if ((mMask & kMultiDeclaration) != 0) >- { >- if (node->getSequence()->size() > 1) >- { >- return true; >- } >- } >- if ((mMask & kArrayDeclaration) != 0) >- { >- if (node->getSequence()->front()->getAsTyped()->getType().isStructureContainingArrays()) >- { >- return true; >- } >- // Need to check from all declarators whether they are arrays since that may vary between >- // declarators. >- for (TIntermNode *declarator : *node->getSequence()) >- { >- if (declarator->getAsTyped()->isArray()) >- { >- return true; >- } >- } >- } >- if ((mMask & kNamelessStructDeclaration) != 0) >- { >- TIntermTyped *declarator = node->getSequence()->front()->getAsTyped(); >- if (declarator->getBasicType() == EbtStruct && >- declarator->getType().getStruct()->name() == "") >- { >- return true; >- } >- } >- return false; >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNodePatternMatcher.h b/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNodePatternMatcher.h >deleted file mode 100644 >index 997fc2ef10d..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNodePatternMatcher.h >+++ /dev/null >@@ -1,75 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >-// IntermNodePatternMatcher is a helper class for matching node trees to given patterns. >-// It can be used whenever the same checks for certain node structures are common to multiple AST >-// traversers. >-// >- >-#ifndef COMPILER_TRANSLATOR_INTERMNODEPATTERNMATCHER_H_ >-#define COMPILER_TRANSLATOR_INTERMNODEPATTERNMATCHER_H_ >- >-namespace sh >-{ >- >-class TIntermAggregate; >-class TIntermBinary; >-class TIntermDeclaration; >-class TIntermNode; >-class TIntermTernary; >-class TIntermUnary; >- >-class IntermNodePatternMatcher >-{ >- public: >- static bool IsDynamicIndexingOfVectorOrMatrix(TIntermBinary *node); >- >- enum PatternType >- { >- // Matches expressions that are unfolded to if statements by UnfoldShortCircuitToIf >- kUnfoldedShortCircuitExpression = 0x0001, >- >- // Matches expressions that return arrays with the exception of simple statements where a >- // constructor or function call result is assigned. >- kExpressionReturningArray = 0x0001 << 1, >- >- // Matches dynamic indexing of vectors or matrices in l-values. >- kDynamicIndexingOfVectorOrMatrixInLValue = 0x0001 << 2, >- >- // Matches declarations with more than one declared variables. >- kMultiDeclaration = 0x0001 << 3, >- >- // Matches declarations of arrays. >- kArrayDeclaration = 0x0001 << 4, >- >- // Matches declarations of structs where the struct type does not have a name. >- kNamelessStructDeclaration = 0x0001 << 5, >- >- // Matches array length() method. >- kArrayLengthMethod = 0x0001 << 6 >- }; >- IntermNodePatternMatcher(const unsigned int mask); >- >- bool match(TIntermUnary *node); >- >- bool match(TIntermBinary *node, TIntermNode *parentNode); >- >- // Use this version for checking binary node matches in case you're using flag >- // kDynamicIndexingOfVectorOrMatrixInLValue. >- bool match(TIntermBinary *node, TIntermNode *parentNode, bool isLValueRequiredHere); >- >- bool match(TIntermAggregate *node, TIntermNode *parentNode); >- bool match(TIntermTernary *node); >- bool match(TIntermDeclaration *node); >- >- private: >- const unsigned int mMask; >- >- bool matchInternal(TIntermBinary *node, TIntermNode *parentNode); >-}; >- >-} // namespace sh >- >-#endif >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode_util.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode_util.cpp >deleted file mode 100644 >index 9f1f596c43b..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode_util.cpp >+++ /dev/null >@@ -1,254 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// IntermNode_util.cpp: High-level utilities for creating AST nodes and node hierarchies. Mostly >-// meant to be used in AST transforms. >- >-#include "compiler/translator/IntermNode_util.h" >- >-#include "compiler/translator/SymbolTable.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-TName GetInternalFunctionName(const char *name) >-{ >- TString nameStr(name); >- TName nameObj(nameStr); >- nameObj.setInternal(true); >- return nameObj; >-} >- >-const TFunction *LookUpBuiltInFunction(const TString &name, >- const TIntermSequence *arguments, >- const TSymbolTable &symbolTable, >- int shaderVersion) >-{ >- TString mangledName = TFunction::GetMangledNameFromCall(name, *arguments); >- TSymbol *symbol = symbolTable.findBuiltIn(mangledName, shaderVersion); >- if (symbol) >- { >- ASSERT(symbol->isFunction()); >- return static_cast<const TFunction *>(symbol); >- } >- return nullptr; >-} >- >-} // anonymous namespace >- >-TIntermFunctionPrototype *CreateInternalFunctionPrototypeNode(const TType &returnType, >- const char *name, >- const TSymbolUniqueId &functionId) >-{ >- TIntermFunctionPrototype *functionNode = new TIntermFunctionPrototype(returnType, functionId); >- functionNode->getFunctionSymbolInfo()->setNameObj(GetInternalFunctionName(name)); >- return functionNode; >-} >- >-TIntermFunctionDefinition *CreateInternalFunctionDefinitionNode(const TType &returnType, >- const char *name, >- TIntermBlock *functionBody, >- const TSymbolUniqueId &functionId) >-{ >- TIntermFunctionPrototype *prototypeNode = >- CreateInternalFunctionPrototypeNode(returnType, name, functionId); >- return new TIntermFunctionDefinition(prototypeNode, functionBody); >-} >- >-TIntermAggregate *CreateInternalFunctionCallNode(const TType &returnType, >- const char *name, >- const TSymbolUniqueId &functionId, >- TIntermSequence *arguments) >-{ >- TIntermAggregate *functionNode = TIntermAggregate::CreateFunctionCall( >- returnType, functionId, GetInternalFunctionName(name), arguments); >- return functionNode; >-} >- >-TIntermTyped *CreateZeroNode(const TType &type) >-{ >- TType constType(type); >- constType.setQualifier(EvqConst); >- >- if (!type.isArray() && type.getBasicType() != EbtStruct) >- { >- size_t size = constType.getObjectSize(); >- TConstantUnion *u = new TConstantUnion[size]; >- for (size_t i = 0; i < size; ++i) >- { >- switch (type.getBasicType()) >- { >- case EbtFloat: >- u[i].setFConst(0.0f); >- break; >- case EbtInt: >- u[i].setIConst(0); >- break; >- case EbtUInt: >- u[i].setUConst(0u); >- break; >- case EbtBool: >- u[i].setBConst(false); >- break; >- default: >- // CreateZeroNode is called by ParseContext that keeps parsing even when an >- // error occurs, so it is possible for CreateZeroNode to be called with >- // non-basic types. This happens only on error condition but CreateZeroNode >- // needs to return a value with the correct type to continue the typecheck. >- // That's why we handle non-basic type by setting whatever value, we just need >- // the type to be right. >- u[i].setIConst(42); >- break; >- } >- } >- >- TIntermConstantUnion *node = new TIntermConstantUnion(u, constType); >- return node; >- } >- >- if (type.getBasicType() == EbtVoid) >- { >- // Void array. This happens only on error condition, similarly to the case above. We don't >- // have a constructor operator for void, so this needs special handling. We'll end up with a >- // value without the array type, but that should not be a problem. >- while (constType.isArray()) >- { >- constType.toArrayElementType(); >- } >- return CreateZeroNode(constType); >- } >- >- TIntermSequence *arguments = new TIntermSequence(); >- >- if (type.isArray()) >- { >- TType elementType(type); >- elementType.toArrayElementType(); >- >- size_t arraySize = type.getOutermostArraySize(); >- for (size_t i = 0; i < arraySize; ++i) >- { >- arguments->push_back(CreateZeroNode(elementType)); >- } >- } >- else >- { >- ASSERT(type.getBasicType() == EbtStruct); >- >- const TStructure *structure = type.getStruct(); >- for (const auto &field : structure->fields()) >- { >- arguments->push_back(CreateZeroNode(*field->type())); >- } >- } >- >- return TIntermAggregate::CreateConstructor(constType, arguments); >-} >- >-TIntermConstantUnion *CreateIndexNode(int index) >-{ >- TConstantUnion *u = new TConstantUnion[1]; >- u[0].setIConst(index); >- >- TType type(EbtInt, EbpUndefined, EvqConst, 1); >- TIntermConstantUnion *node = new TIntermConstantUnion(u, type); >- return node; >-} >- >-TIntermConstantUnion *CreateBoolNode(bool value) >-{ >- TConstantUnion *u = new TConstantUnion[1]; >- u[0].setBConst(value); >- >- TType type(EbtBool, EbpUndefined, EvqConst, 1); >- TIntermConstantUnion *node = new TIntermConstantUnion(u, type); >- return node; >-} >- >-TIntermSymbol *CreateTempSymbolNode(const TSymbolUniqueId &id, >- const TType &type, >- TQualifier qualifier) >-{ >- TInfoSinkBase symbolNameOut; >- symbolNameOut << "s" << id.get(); >- TString symbolName = symbolNameOut.c_str(); >- >- TIntermSymbol *node = new TIntermSymbol(id, symbolName, type); >- node->setInternal(true); >- >- ASSERT(qualifier == EvqTemporary || qualifier == EvqConst || qualifier == EvqGlobal); >- node->getTypePointer()->setQualifier(qualifier); >- >- // TODO(oetuaho): Might be useful to sanitize layout qualifier etc. on the type of the created >- // symbol. This might need to be done in other places as well. >- return node; >-} >- >-TIntermDeclaration *CreateTempInitDeclarationNode(const TSymbolUniqueId &id, >- TIntermTyped *initializer, >- TQualifier qualifier) >-{ >- ASSERT(initializer != nullptr); >- TIntermSymbol *tempSymbol = CreateTempSymbolNode(id, initializer->getType(), qualifier); >- TIntermDeclaration *tempDeclaration = new TIntermDeclaration(); >- TIntermBinary *tempInit = new TIntermBinary(EOpInitialize, tempSymbol, initializer); >- tempDeclaration->appendDeclarator(tempInit); >- return tempDeclaration; >-} >- >-TIntermBlock *EnsureBlock(TIntermNode *node) >-{ >- if (node == nullptr) >- return nullptr; >- TIntermBlock *blockNode = node->getAsBlock(); >- if (blockNode != nullptr) >- return blockNode; >- >- blockNode = new TIntermBlock(); >- blockNode->setLine(node->getLine()); >- blockNode->appendStatement(node); >- return blockNode; >-} >- >-TIntermSymbol *ReferenceGlobalVariable(const TString &name, const TSymbolTable &symbolTable) >-{ >- TVariable *var = reinterpret_cast<TVariable *>(symbolTable.findGlobal(name)); >- ASSERT(var); >- return new TIntermSymbol(var->getUniqueId(), name, var->getType()); >-} >- >-TIntermSymbol *ReferenceBuiltInVariable(const TString &name, >- const TSymbolTable &symbolTable, >- int shaderVersion) >-{ >- const TVariable *var = >- reinterpret_cast<const TVariable *>(symbolTable.findBuiltIn(name, shaderVersion, true)); >- ASSERT(var); >- return new TIntermSymbol(var->getUniqueId(), name, var->getType()); >-} >- >-TIntermTyped *CreateBuiltInFunctionCallNode(const TString &name, >- TIntermSequence *arguments, >- const TSymbolTable &symbolTable, >- int shaderVersion) >-{ >- const TFunction *fn = LookUpBuiltInFunction(name, arguments, symbolTable, shaderVersion); >- ASSERT(fn); >- TOperator op = fn->getBuiltInOp(); >- if (op != EOpNull) >- { >- if (arguments->size() == 1) >- { >- return new TIntermUnary(op, arguments->at(0)->getAsTyped()); >- } >- return TIntermAggregate::Create(fn->getReturnType(), op, arguments); >- } >- return TIntermAggregate::CreateBuiltInFunctionCall(*fn, arguments); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode_util.h b/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode_util.h >deleted file mode 100644 >index 6f3b0674f03..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode_util.h >+++ /dev/null >@@ -1,60 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// IntermNode_util.h: High-level utilities for creating AST nodes and node hierarchies. Mostly meant >-// to be used in AST transforms. >- >-#ifndef COMPILER_TRANSLATOR_INTERMNODEUTIL_H_ >-#define COMPILER_TRANSLATOR_INTERMNODEUTIL_H_ >- >-#include "compiler/translator/IntermNode.h" >- >-namespace sh >-{ >- >-TIntermFunctionPrototype *CreateInternalFunctionPrototypeNode(const TType &returnType, >- const char *name, >- const TSymbolUniqueId &functionId); >-TIntermFunctionDefinition *CreateInternalFunctionDefinitionNode(const TType &returnType, >- const char *name, >- TIntermBlock *functionBody, >- const TSymbolUniqueId &functionId); >-TIntermAggregate *CreateInternalFunctionCallNode(const TType &returnType, >- const char *name, >- const TSymbolUniqueId &functionId, >- TIntermSequence *arguments); >- >-TIntermTyped *CreateZeroNode(const TType &type); >-TIntermConstantUnion *CreateIndexNode(int index); >-TIntermConstantUnion *CreateBoolNode(bool value); >- >-TIntermSymbol *CreateTempSymbolNode(const TSymbolUniqueId &id, >- const TType &type, >- TQualifier qualifier); >-TIntermDeclaration *CreateTempInitDeclarationNode(const TSymbolUniqueId &id, >- TIntermTyped *initializer, >- TQualifier qualifier); >- >-// If the input node is nullptr, return nullptr. >-// If the input node is a block node, return it. >-// If the input node is not a block node, put it inside a block node and return that. >-TIntermBlock *EnsureBlock(TIntermNode *node); >- >-// Should be called from inside Compiler::compileTreeImpl() where the global level is in scope. >-TIntermSymbol *ReferenceGlobalVariable(const TString &name, const TSymbolTable &symbolTable); >- >-// Note: this can access desktop GLSL built-ins that are hidden from the parser. >-TIntermSymbol *ReferenceBuiltInVariable(const TString &name, >- const TSymbolTable &symbolTable, >- int shaderVersion); >- >-TIntermTyped *CreateBuiltInFunctionCallNode(const TString &name, >- TIntermSequence *arguments, >- const TSymbolTable &symbolTable, >- int shaderVersion); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_INTERMNODEUTIL_H_ >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermTraverse.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/IntermTraverse.cpp >deleted file mode 100644 >index 6c25c6c35a5..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermTraverse.cpp >+++ /dev/null >@@ -1,983 +0,0 @@ >-// >-// Copyright (c) 2002-2010 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. >-// >- >-#include "compiler/translator/IntermTraverse.h" >- >-#include "compiler/translator/InfoSink.h" >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/SymbolTable.h" >- >-namespace sh >-{ >- >-void TIntermSymbol::traverse(TIntermTraverser *it) >-{ >- it->traverseSymbol(this); >-} >- >-void TIntermRaw::traverse(TIntermTraverser *it) >-{ >- it->traverseRaw(this); >-} >- >-void TIntermConstantUnion::traverse(TIntermTraverser *it) >-{ >- it->traverseConstantUnion(this); >-} >- >-void TIntermSwizzle::traverse(TIntermTraverser *it) >-{ >- it->traverseSwizzle(this); >-} >- >-void TIntermBinary::traverse(TIntermTraverser *it) >-{ >- it->traverseBinary(this); >-} >- >-void TIntermUnary::traverse(TIntermTraverser *it) >-{ >- it->traverseUnary(this); >-} >- >-void TIntermTernary::traverse(TIntermTraverser *it) >-{ >- it->traverseTernary(this); >-} >- >-void TIntermIfElse::traverse(TIntermTraverser *it) >-{ >- it->traverseIfElse(this); >-} >- >-void TIntermSwitch::traverse(TIntermTraverser *it) >-{ >- it->traverseSwitch(this); >-} >- >-void TIntermCase::traverse(TIntermTraverser *it) >-{ >- it->traverseCase(this); >-} >- >-void TIntermFunctionDefinition::traverse(TIntermTraverser *it) >-{ >- it->traverseFunctionDefinition(this); >-} >- >-void TIntermBlock::traverse(TIntermTraverser *it) >-{ >- it->traverseBlock(this); >-} >- >-void TIntermInvariantDeclaration::traverse(TIntermTraverser *it) >-{ >- it->traverseInvariantDeclaration(this); >-} >- >-void TIntermDeclaration::traverse(TIntermTraverser *it) >-{ >- it->traverseDeclaration(this); >-} >- >-void TIntermFunctionPrototype::traverse(TIntermTraverser *it) >-{ >- it->traverseFunctionPrototype(this); >-} >- >-void TIntermAggregate::traverse(TIntermTraverser *it) >-{ >- it->traverseAggregate(this); >-} >- >-void TIntermLoop::traverse(TIntermTraverser *it) >-{ >- it->traverseLoop(this); >-} >- >-void TIntermBranch::traverse(TIntermTraverser *it) >-{ >- it->traverseBranch(this); >-} >- >-TIntermTraverser::TIntermTraverser(bool preVisit, >- bool inVisit, >- bool postVisit, >- TSymbolTable *symbolTable) >- : preVisit(preVisit), >- inVisit(inVisit), >- postVisit(postVisit), >- mDepth(-1), >- mMaxDepth(0), >- mInGlobalScope(true), >- mSymbolTable(symbolTable), >- mTemporaryId(nullptr) >-{ >-} >- >-TIntermTraverser::~TIntermTraverser() >-{ >-} >- >-const TIntermBlock *TIntermTraverser::getParentBlock() const >-{ >- if (!mParentBlockStack.empty()) >- { >- return mParentBlockStack.back().node; >- } >- return nullptr; >-} >- >-void TIntermTraverser::pushParentBlock(TIntermBlock *node) >-{ >- mParentBlockStack.push_back(ParentBlock(node, 0)); >-} >- >-void TIntermTraverser::incrementParentBlockPos() >-{ >- ++mParentBlockStack.back().pos; >-} >- >-void TIntermTraverser::popParentBlock() >-{ >- ASSERT(!mParentBlockStack.empty()); >- mParentBlockStack.pop_back(); >-} >- >-void TIntermTraverser::insertStatementsInParentBlock(const TIntermSequence &insertions) >-{ >- TIntermSequence emptyInsertionsAfter; >- insertStatementsInParentBlock(insertions, emptyInsertionsAfter); >-} >- >-void TIntermTraverser::insertStatementsInParentBlock(const TIntermSequence &insertionsBefore, >- const TIntermSequence &insertionsAfter) >-{ >- ASSERT(!mParentBlockStack.empty()); >- ParentBlock &parentBlock = mParentBlockStack.back(); >- if (mPath.back() == parentBlock.node) >- { >- ASSERT(mParentBlockStack.size() >= 2u); >- // The current node is a block node, so the parent block is not the topmost one in the block >- // stack, but the one below that. >- parentBlock = mParentBlockStack.at(mParentBlockStack.size() - 2u); >- } >- NodeInsertMultipleEntry insert(parentBlock.node, parentBlock.pos, insertionsBefore, >- insertionsAfter); >- mInsertions.push_back(insert); >-} >- >-void TIntermTraverser::insertStatementInParentBlock(TIntermNode *statement) >-{ >- TIntermSequence insertions; >- insertions.push_back(statement); >- insertStatementsInParentBlock(insertions); >-} >- >-TIntermSymbol *TIntermTraverser::createTempSymbol(const TType &type, TQualifier qualifier) >-{ >- ASSERT(mTemporaryId != nullptr); >- // nextTemporaryId() needs to be called when the code wants to start using another temporary >- // symbol. >- return CreateTempSymbolNode(*mTemporaryId, type, qualifier); >-} >- >-TIntermSymbol *TIntermTraverser::createTempSymbol(const TType &type) >-{ >- return createTempSymbol(type, EvqTemporary); >-} >- >-TIntermDeclaration *TIntermTraverser::createTempDeclaration(const TType &type) >-{ >- ASSERT(mTemporaryId != nullptr); >- TIntermDeclaration *tempDeclaration = new TIntermDeclaration(); >- tempDeclaration->appendDeclarator(CreateTempSymbolNode(*mTemporaryId, type, EvqTemporary)); >- return tempDeclaration; >-} >- >-TIntermDeclaration *TIntermTraverser::createTempInitDeclaration(TIntermTyped *initializer, >- TQualifier qualifier) >-{ >- ASSERT(mTemporaryId != nullptr); >- return CreateTempInitDeclarationNode(*mTemporaryId, initializer, qualifier); >-} >- >-TIntermDeclaration *TIntermTraverser::createTempInitDeclaration(TIntermTyped *initializer) >-{ >- return createTempInitDeclaration(initializer, EvqTemporary); >-} >- >-TIntermBinary *TIntermTraverser::createTempAssignment(TIntermTyped *rightNode) >-{ >- ASSERT(rightNode != nullptr); >- TIntermSymbol *tempSymbol = createTempSymbol(rightNode->getType()); >- TIntermBinary *assignment = new TIntermBinary(EOpAssign, tempSymbol, rightNode); >- return assignment; >-} >- >-void TIntermTraverser::nextTemporaryId() >-{ >- ASSERT(mSymbolTable); >- if (!mTemporaryId) >- { >- mTemporaryId = new TSymbolUniqueId(mSymbolTable); >- return; >- } >- *mTemporaryId = TSymbolUniqueId(mSymbolTable); >-} >- >-void TLValueTrackingTraverser::addToFunctionMap(const TSymbolUniqueId &id, >- TIntermSequence *paramSequence) >-{ >- mFunctionMap[id.get()] = paramSequence; >-} >- >-bool TLValueTrackingTraverser::isInFunctionMap(const TIntermAggregate *callNode) const >-{ >- ASSERT(callNode->getOp() == EOpCallFunctionInAST); >- return (mFunctionMap.find(callNode->getFunctionSymbolInfo()->getId().get()) != >- mFunctionMap.end()); >-} >- >-TIntermSequence *TLValueTrackingTraverser::getFunctionParameters(const TIntermAggregate *callNode) >-{ >- ASSERT(isInFunctionMap(callNode)); >- return mFunctionMap[callNode->getFunctionSymbolInfo()->getId().get()]; >-} >- >-void TLValueTrackingTraverser::setInFunctionCallOutParameter(bool inOutParameter) >-{ >- mInFunctionCallOutParameter = inOutParameter; >-} >- >-bool TLValueTrackingTraverser::isInFunctionCallOutParameter() const >-{ >- return mInFunctionCallOutParameter; >-} >- >-// >-// Traverse the intermediate representation tree, and >-// call a node type specific function for each node. >-// Done recursively through the member function Traverse(). >-// Node types can be skipped if their function to call is 0, >-// but their subtree will still be traversed. >-// Nodes with children can have their whole subtree skipped >-// if preVisit is turned on and the type specific function >-// returns false. >-// >- >-// >-// Traversal functions for terminals are straighforward.... >-// >-void TIntermTraverser::traverseSymbol(TIntermSymbol *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- visitSymbol(node); >-} >- >-void TIntermTraverser::traverseConstantUnion(TIntermConstantUnion *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- visitConstantUnion(node); >-} >- >-void TIntermTraverser::traverseSwizzle(TIntermSwizzle *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- if (preVisit) >- visit = visitSwizzle(PreVisit, node); >- >- if (visit) >- { >- node->getOperand()->traverse(this); >- } >- >- if (visit && postVisit) >- visitSwizzle(PostVisit, node); >-} >- >-// >-// Traverse a binary node. >-// >-void TIntermTraverser::traverseBinary(TIntermBinary *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- // >- // visit the node before children if pre-visiting. >- // >- if (preVisit) >- visit = visitBinary(PreVisit, node); >- >- // >- // Visit the children, in the right order. >- // >- if (visit) >- { >- if (node->getLeft()) >- node->getLeft()->traverse(this); >- >- if (inVisit) >- visit = visitBinary(InVisit, node); >- >- if (visit && node->getRight()) >- node->getRight()->traverse(this); >- } >- >- // >- // Visit the node after the children, if requested and the traversal >- // hasn't been cancelled yet. >- // >- if (visit && postVisit) >- visitBinary(PostVisit, node); >-} >- >-void TLValueTrackingTraverser::traverseBinary(TIntermBinary *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- // >- // visit the node before children if pre-visiting. >- // >- if (preVisit) >- visit = visitBinary(PreVisit, node); >- >- // >- // Visit the children, in the right order. >- // >- if (visit) >- { >- // Some binary operations like indexing can be inside an expression which must be an >- // l-value. >- bool parentOperatorRequiresLValue = operatorRequiresLValue(); >- bool parentInFunctionCallOutParameter = isInFunctionCallOutParameter(); >- if (node->isAssignment()) >- { >- ASSERT(!isLValueRequiredHere()); >- setOperatorRequiresLValue(true); >- } >- >- if (node->getLeft()) >- node->getLeft()->traverse(this); >- >- if (inVisit) >- visit = visitBinary(InVisit, node); >- >- if (node->isAssignment()) >- setOperatorRequiresLValue(false); >- >- // Index is not required to be an l-value even when the surrounding expression is required >- // to be an l-value. >- TOperator op = node->getOp(); >- if (op == EOpIndexDirect || op == EOpIndexDirectInterfaceBlock || >- op == EOpIndexDirectStruct || op == EOpIndexIndirect) >- { >- setOperatorRequiresLValue(false); >- setInFunctionCallOutParameter(false); >- } >- >- if (visit && node->getRight()) >- node->getRight()->traverse(this); >- >- setOperatorRequiresLValue(parentOperatorRequiresLValue); >- setInFunctionCallOutParameter(parentInFunctionCallOutParameter); >- } >- >- // >- // Visit the node after the children, if requested and the traversal >- // hasn't been cancelled yet. >- // >- if (visit && postVisit) >- visitBinary(PostVisit, node); >-} >- >-// >-// Traverse a unary node. Same comments in binary node apply here. >-// >-void TIntermTraverser::traverseUnary(TIntermUnary *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- if (preVisit) >- visit = visitUnary(PreVisit, node); >- >- if (visit) >- { >- node->getOperand()->traverse(this); >- } >- >- if (visit && postVisit) >- visitUnary(PostVisit, node); >-} >- >-void TLValueTrackingTraverser::traverseUnary(TIntermUnary *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- if (preVisit) >- visit = visitUnary(PreVisit, node); >- >- if (visit) >- { >- ASSERT(!operatorRequiresLValue()); >- switch (node->getOp()) >- { >- case EOpPostIncrement: >- case EOpPostDecrement: >- case EOpPreIncrement: >- case EOpPreDecrement: >- setOperatorRequiresLValue(true); >- break; >- default: >- break; >- } >- >- node->getOperand()->traverse(this); >- >- setOperatorRequiresLValue(false); >- } >- >- if (visit && postVisit) >- visitUnary(PostVisit, node); >-} >- >-// Traverse a function definition node. >-void TIntermTraverser::traverseFunctionDefinition(TIntermFunctionDefinition *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- if (preVisit) >- visit = visitFunctionDefinition(PreVisit, node); >- >- if (visit) >- { >- mInGlobalScope = false; >- >- node->getFunctionPrototype()->traverse(this); >- if (inVisit) >- visit = visitFunctionDefinition(InVisit, node); >- node->getBody()->traverse(this); >- >- mInGlobalScope = true; >- } >- >- if (visit && postVisit) >- visitFunctionDefinition(PostVisit, node); >-} >- >-// Traverse a block node. >-void TIntermTraverser::traverseBlock(TIntermBlock *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- pushParentBlock(node); >- >- bool visit = true; >- >- TIntermSequence *sequence = node->getSequence(); >- >- if (preVisit) >- visit = visitBlock(PreVisit, node); >- >- if (visit) >- { >- for (auto *child : *sequence) >- { >- child->traverse(this); >- if (visit && inVisit) >- { >- if (child != sequence->back()) >- visit = visitBlock(InVisit, node); >- } >- >- incrementParentBlockPos(); >- } >- } >- >- if (visit && postVisit) >- visitBlock(PostVisit, node); >- >- popParentBlock(); >-} >- >-void TIntermTraverser::traverseInvariantDeclaration(TIntermInvariantDeclaration *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- if (preVisit) >- { >- visit = visitInvariantDeclaration(PreVisit, node); >- } >- >- if (visit) >- { >- node->getSymbol()->traverse(this); >- if (postVisit) >- { >- visitInvariantDeclaration(PostVisit, node); >- } >- } >-} >- >-// Traverse a declaration node. >-void TIntermTraverser::traverseDeclaration(TIntermDeclaration *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- TIntermSequence *sequence = node->getSequence(); >- >- if (preVisit) >- visit = visitDeclaration(PreVisit, node); >- >- if (visit) >- { >- for (auto *child : *sequence) >- { >- child->traverse(this); >- if (visit && inVisit) >- { >- if (child != sequence->back()) >- visit = visitDeclaration(InVisit, node); >- } >- } >- } >- >- if (visit && postVisit) >- visitDeclaration(PostVisit, node); >-} >- >-void TIntermTraverser::traverseFunctionPrototype(TIntermFunctionPrototype *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- TIntermSequence *sequence = node->getSequence(); >- >- if (preVisit) >- visit = visitFunctionPrototype(PreVisit, node); >- >- if (visit) >- { >- for (auto *child : *sequence) >- { >- child->traverse(this); >- if (visit && inVisit) >- { >- if (child != sequence->back()) >- visit = visitFunctionPrototype(InVisit, node); >- } >- } >- } >- >- if (visit && postVisit) >- visitFunctionPrototype(PostVisit, node); >-} >- >-// Traverse an aggregate node. Same comments in binary node apply here. >-void TIntermTraverser::traverseAggregate(TIntermAggregate *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- TIntermSequence *sequence = node->getSequence(); >- >- if (preVisit) >- visit = visitAggregate(PreVisit, node); >- >- if (visit) >- { >- for (auto *child : *sequence) >- { >- child->traverse(this); >- if (visit && inVisit) >- { >- if (child != sequence->back()) >- visit = visitAggregate(InVisit, node); >- } >- } >- } >- >- if (visit && postVisit) >- visitAggregate(PostVisit, node); >-} >- >-bool TIntermTraverser::CompareInsertion(const NodeInsertMultipleEntry &a, >- const NodeInsertMultipleEntry &b) >-{ >- if (a.parent != b.parent) >- { >- return a.parent > b.parent; >- } >- return a.position > b.position; >-} >- >-void TIntermTraverser::updateTree() >-{ >- // Sort the insertions so that insertion position is decreasing. This way multiple insertions to >- // the same parent node are handled correctly. >- std::sort(mInsertions.begin(), mInsertions.end(), CompareInsertion); >- for (size_t ii = 0; ii < mInsertions.size(); ++ii) >- { >- // We can't know here what the intended ordering of two insertions to the same position is, >- // so it is not supported. >- ASSERT(ii == 0 || mInsertions[ii].position != mInsertions[ii - 1].position || >- mInsertions[ii].parent != mInsertions[ii - 1].parent); >- const NodeInsertMultipleEntry &insertion = mInsertions[ii]; >- ASSERT(insertion.parent); >- if (!insertion.insertionsAfter.empty()) >- { >- bool inserted = insertion.parent->insertChildNodes(insertion.position + 1, >- insertion.insertionsAfter); >- ASSERT(inserted); >- } >- if (!insertion.insertionsBefore.empty()) >- { >- bool inserted = >- insertion.parent->insertChildNodes(insertion.position, insertion.insertionsBefore); >- ASSERT(inserted); >- } >- } >- for (size_t ii = 0; ii < mReplacements.size(); ++ii) >- { >- const NodeUpdateEntry &replacement = mReplacements[ii]; >- ASSERT(replacement.parent); >- bool replaced = >- replacement.parent->replaceChildNode(replacement.original, replacement.replacement); >- ASSERT(replaced); >- >- if (!replacement.originalBecomesChildOfReplacement) >- { >- // In AST traversing, a parent is visited before its children. >- // After we replace a node, if its immediate child is to >- // be replaced, we need to make sure we don't update the replaced >- // node; instead, we update the replacement node. >- for (size_t jj = ii + 1; jj < mReplacements.size(); ++jj) >- { >- NodeUpdateEntry &replacement2 = mReplacements[jj]; >- if (replacement2.parent == replacement.original) >- replacement2.parent = replacement.replacement; >- } >- } >- } >- for (size_t ii = 0; ii < mMultiReplacements.size(); ++ii) >- { >- const NodeReplaceWithMultipleEntry &replacement = mMultiReplacements[ii]; >- ASSERT(replacement.parent); >- bool replaced = replacement.parent->replaceChildNodeWithMultiple(replacement.original, >- replacement.replacements); >- ASSERT(replaced); >- } >- >- clearReplacementQueue(); >-} >- >-void TIntermTraverser::clearReplacementQueue() >-{ >- mReplacements.clear(); >- mMultiReplacements.clear(); >- mInsertions.clear(); >-} >- >-void TIntermTraverser::queueReplacement(TIntermNode *replacement, OriginalNode originalStatus) >-{ >- queueReplacementWithParent(getParentNode(), mPath.back(), replacement, originalStatus); >-} >- >-void TIntermTraverser::queueReplacementWithParent(TIntermNode *parent, >- TIntermNode *original, >- TIntermNode *replacement, >- OriginalNode originalStatus) >-{ >- bool originalBecomesChild = (originalStatus == OriginalNode::BECOMES_CHILD); >- mReplacements.push_back(NodeUpdateEntry(parent, original, replacement, originalBecomesChild)); >-} >- >-TLValueTrackingTraverser::TLValueTrackingTraverser(bool preVisit, >- bool inVisit, >- bool postVisit, >- TSymbolTable *symbolTable, >- int shaderVersion) >- : TIntermTraverser(preVisit, inVisit, postVisit, symbolTable), >- mOperatorRequiresLValue(false), >- mInFunctionCallOutParameter(false), >- mShaderVersion(shaderVersion) >-{ >- ASSERT(symbolTable); >-} >- >-void TLValueTrackingTraverser::traverseFunctionPrototype(TIntermFunctionPrototype *node) >-{ >- TIntermSequence *sequence = node->getSequence(); >- addToFunctionMap(node->getFunctionSymbolInfo()->getId(), sequence); >- >- TIntermTraverser::traverseFunctionPrototype(node); >-} >- >-void TLValueTrackingTraverser::traverseAggregate(TIntermAggregate *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- TIntermSequence *sequence = node->getSequence(); >- >- if (preVisit) >- visit = visitAggregate(PreVisit, node); >- >- if (visit) >- { >- if (node->getOp() == EOpCallFunctionInAST) >- { >- if (isInFunctionMap(node)) >- { >- TIntermSequence *params = getFunctionParameters(node); >- TIntermSequence::iterator paramIter = params->begin(); >- for (auto *child : *sequence) >- { >- ASSERT(paramIter != params->end()); >- TQualifier qualifier = (*paramIter)->getAsTyped()->getQualifier(); >- setInFunctionCallOutParameter(qualifier == EvqOut || qualifier == EvqInOut); >- >- child->traverse(this); >- if (visit && inVisit) >- { >- if (child != sequence->back()) >- visit = visitAggregate(InVisit, node); >- } >- >- ++paramIter; >- } >- } >- else >- { >- // The node might not be in the function map in case we're in the middle of >- // transforming the AST, and have inserted function call nodes without inserting the >- // function definitions yet. >- setInFunctionCallOutParameter(false); >- for (auto *child : *sequence) >- { >- child->traverse(this); >- if (visit && inVisit) >- { >- if (child != sequence->back()) >- visit = visitAggregate(InVisit, node); >- } >- } >- } >- >- setInFunctionCallOutParameter(false); >- } >- else >- { >- // Find the built-in function corresponding to this op so that we can determine the >- // in/out qualifiers of its parameters. >- TFunction *builtInFunc = nullptr; >- if (!node->isFunctionCall() && !node->isConstructor()) >- { >- builtInFunc = static_cast<TFunction *>( >- mSymbolTable->findBuiltIn(node->getSymbolTableMangledName(), mShaderVersion)); >- } >- >- size_t paramIndex = 0; >- >- for (auto *child : *sequence) >- { >- // This assumes that raw functions called with >- // EOpCallInternalRawFunction don't have out parameters. >- TQualifier qualifier = EvqIn; >- if (builtInFunc != nullptr) >- qualifier = builtInFunc->getParam(paramIndex).type->getQualifier(); >- setInFunctionCallOutParameter(qualifier == EvqOut || qualifier == EvqInOut); >- child->traverse(this); >- >- if (visit && inVisit) >- { >- if (child != sequence->back()) >- visit = visitAggregate(InVisit, node); >- } >- >- ++paramIndex; >- } >- >- setInFunctionCallOutParameter(false); >- } >- } >- >- if (visit && postVisit) >- visitAggregate(PostVisit, node); >-} >- >-// >-// Traverse a ternary node. Same comments in binary node apply here. >-// >-void TIntermTraverser::traverseTernary(TIntermTernary *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- if (preVisit) >- visit = visitTernary(PreVisit, node); >- >- if (visit) >- { >- node->getCondition()->traverse(this); >- if (node->getTrueExpression()) >- node->getTrueExpression()->traverse(this); >- if (node->getFalseExpression()) >- node->getFalseExpression()->traverse(this); >- } >- >- if (visit && postVisit) >- visitTernary(PostVisit, node); >-} >- >-// Traverse an if-else node. Same comments in binary node apply here. >-void TIntermTraverser::traverseIfElse(TIntermIfElse *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- if (preVisit) >- visit = visitIfElse(PreVisit, node); >- >- if (visit) >- { >- node->getCondition()->traverse(this); >- if (node->getTrueBlock()) >- node->getTrueBlock()->traverse(this); >- if (node->getFalseBlock()) >- node->getFalseBlock()->traverse(this); >- } >- >- if (visit && postVisit) >- visitIfElse(PostVisit, node); >-} >- >-// >-// Traverse a switch node. Same comments in binary node apply here. >-// >-void TIntermTraverser::traverseSwitch(TIntermSwitch *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- if (preVisit) >- visit = visitSwitch(PreVisit, node); >- >- if (visit) >- { >- node->getInit()->traverse(this); >- if (inVisit) >- visit = visitSwitch(InVisit, node); >- if (visit && node->getStatementList()) >- node->getStatementList()->traverse(this); >- } >- >- if (visit && postVisit) >- visitSwitch(PostVisit, node); >-} >- >-// >-// Traverse a case node. Same comments in binary node apply here. >-// >-void TIntermTraverser::traverseCase(TIntermCase *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- if (preVisit) >- visit = visitCase(PreVisit, node); >- >- if (visit && node->getCondition()) >- { >- node->getCondition()->traverse(this); >- } >- >- if (visit && postVisit) >- visitCase(PostVisit, node); >-} >- >-// >-// Traverse a loop node. Same comments in binary node apply here. >-// >-void TIntermTraverser::traverseLoop(TIntermLoop *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- if (preVisit) >- visit = visitLoop(PreVisit, node); >- >- if (visit) >- { >- if (node->getInit()) >- node->getInit()->traverse(this); >- >- if (node->getCondition()) >- node->getCondition()->traverse(this); >- >- if (node->getBody()) >- node->getBody()->traverse(this); >- >- if (node->getExpression()) >- node->getExpression()->traverse(this); >- } >- >- if (visit && postVisit) >- visitLoop(PostVisit, node); >-} >- >-// >-// Traverse a branch node. Same comments in binary node apply here. >-// >-void TIntermTraverser::traverseBranch(TIntermBranch *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- if (preVisit) >- visit = visitBranch(PreVisit, node); >- >- if (visit && node->getExpression()) >- { >- node->getExpression()->traverse(this); >- } >- >- if (visit && postVisit) >- visitBranch(PostVisit, node); >-} >- >-void TIntermTraverser::traverseRaw(TIntermRaw *node) >-{ >- ScopedNodeInTraversalPath addToPath(this, node); >- visitRaw(node); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermTraverse.h b/Source/ThirdParty/ANGLE/src/compiler/translator/IntermTraverse.h >deleted file mode 100644 >index f0300b586bd..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermTraverse.h >+++ /dev/null >@@ -1,355 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// IntermTraverse.h : base classes for AST traversers that walk the AST and >-// also have the ability to transform it by replacing nodes. >- >-#ifndef COMPILER_TRANSLATOR_INTERMTRAVERSE_H_ >-#define COMPILER_TRANSLATOR_INTERMTRAVERSE_H_ >- >-#include "compiler/translator/IntermNode.h" >- >-namespace sh >-{ >- >-class TSymbolTable; >-class TSymbolUniqueId; >- >-enum Visit >-{ >- PreVisit, >- InVisit, >- PostVisit >-}; >- >-// For traversing the tree. User should derive from this class overriding the visit functions, >-// and then pass an object of the subclass to a traverse method of a node. >-// >-// The traverse*() functions may also be overridden to do other bookkeeping on the tree to provide >-// contextual information to the visit functions, such as whether the node is the target of an >-// assignment. This is complex to maintain and so should only be done in special cases. >-// >-// When using this, just fill in the methods for nodes you want visited. >-// Return false from a pre-visit to skip visiting that node's subtree. >-class TIntermTraverser : angle::NonCopyable >-{ >- public: >- POOL_ALLOCATOR_NEW_DELETE(); >- TIntermTraverser(bool preVisit, >- bool inVisit, >- bool postVisit, >- TSymbolTable *symbolTable = nullptr); >- virtual ~TIntermTraverser(); >- >- virtual void visitSymbol(TIntermSymbol *node) {} >- virtual void visitRaw(TIntermRaw *node) {} >- virtual void visitConstantUnion(TIntermConstantUnion *node) {} >- virtual bool visitSwizzle(Visit visit, TIntermSwizzle *node) { return true; } >- virtual bool visitBinary(Visit visit, TIntermBinary *node) { return true; } >- virtual bool visitUnary(Visit visit, TIntermUnary *node) { return true; } >- virtual bool visitTernary(Visit visit, TIntermTernary *node) { return true; } >- virtual bool visitIfElse(Visit visit, TIntermIfElse *node) { return true; } >- virtual bool visitSwitch(Visit visit, TIntermSwitch *node) { return true; } >- virtual bool visitCase(Visit visit, TIntermCase *node) { return true; } >- virtual bool visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) >- { >- return true; >- } >- virtual bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) >- { >- return true; >- } >- virtual bool visitAggregate(Visit visit, TIntermAggregate *node) { return true; } >- virtual bool visitBlock(Visit visit, TIntermBlock *node) { return true; } >- virtual bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) >- { >- return true; >- } >- virtual bool visitDeclaration(Visit visit, TIntermDeclaration *node) { return true; } >- virtual bool visitLoop(Visit visit, TIntermLoop *node) { return true; } >- virtual bool visitBranch(Visit visit, TIntermBranch *node) { return true; } >- >- // The traverse functions contain logic for iterating over the children of the node >- // and calling the visit functions in the appropriate places. They also track some >- // context that may be used by the visit functions. >- virtual void traverseSymbol(TIntermSymbol *node); >- virtual void traverseRaw(TIntermRaw *node); >- virtual void traverseConstantUnion(TIntermConstantUnion *node); >- virtual void traverseSwizzle(TIntermSwizzle *node); >- virtual void traverseBinary(TIntermBinary *node); >- virtual void traverseUnary(TIntermUnary *node); >- virtual void traverseTernary(TIntermTernary *node); >- virtual void traverseIfElse(TIntermIfElse *node); >- virtual void traverseSwitch(TIntermSwitch *node); >- virtual void traverseCase(TIntermCase *node); >- virtual void traverseFunctionPrototype(TIntermFunctionPrototype *node); >- virtual void traverseFunctionDefinition(TIntermFunctionDefinition *node); >- virtual void traverseAggregate(TIntermAggregate *node); >- virtual void traverseBlock(TIntermBlock *node); >- virtual void traverseInvariantDeclaration(TIntermInvariantDeclaration *node); >- virtual void traverseDeclaration(TIntermDeclaration *node); >- virtual void traverseLoop(TIntermLoop *node); >- virtual void traverseBranch(TIntermBranch *node); >- >- int getMaxDepth() const { return mMaxDepth; } >- >- // If traversers need to replace nodes, they can add the replacements in >- // mReplacements/mMultiReplacements during traversal and the user of the traverser should call >- // this function after traversal to perform them. >- void updateTree(); >- >- protected: >- // Should only be called from traverse*() functions >- void incrementDepth(TIntermNode *current) >- { >- mDepth++; >- mMaxDepth = std::max(mMaxDepth, mDepth); >- mPath.push_back(current); >- } >- >- // Should only be called from traverse*() functions >- void decrementDepth() >- { >- mDepth--; >- mPath.pop_back(); >- } >- >- // RAII helper for incrementDepth/decrementDepth >- class ScopedNodeInTraversalPath >- { >- public: >- ScopedNodeInTraversalPath(TIntermTraverser *traverser, TIntermNode *current) >- : mTraverser(traverser) >- { >- mTraverser->incrementDepth(current); >- } >- ~ScopedNodeInTraversalPath() { mTraverser->decrementDepth(); } >- >- private: >- TIntermTraverser *mTraverser; >- }; >- >- TIntermNode *getParentNode() { return mPath.size() <= 1 ? nullptr : mPath[mPath.size() - 2u]; } >- >- // Return the nth ancestor of the node being traversed. getAncestorNode(0) == getParentNode() >- TIntermNode *getAncestorNode(unsigned int n) >- { >- if (mPath.size() > n + 1u) >- { >- return mPath[mPath.size() - n - 2u]; >- } >- return nullptr; >- } >- >- const TIntermBlock *getParentBlock() const; >- >- void pushParentBlock(TIntermBlock *node); >- void incrementParentBlockPos(); >- void popParentBlock(); >- >- // To replace a single node with multiple nodes in the parent aggregate. May be used with blocks >- // but also with other nodes like declarations. >- struct NodeReplaceWithMultipleEntry >- { >- NodeReplaceWithMultipleEntry(TIntermAggregateBase *_parent, >- TIntermNode *_original, >- TIntermSequence _replacements) >- : parent(_parent), original(_original), replacements(_replacements) >- { >- } >- >- TIntermAggregateBase *parent; >- TIntermNode *original; >- TIntermSequence replacements; >- }; >- >- // Helper to insert statements in the parent block of the node currently being traversed. >- // The statements will be inserted before the node being traversed once updateTree is called. >- // Should only be called during PreVisit or PostVisit if called from block nodes. >- // Note that two insertions to the same position in the same block are not supported. >- void insertStatementsInParentBlock(const TIntermSequence &insertions); >- >- // Same as above, but supports simultaneous insertion of statements before and after the node >- // currently being traversed. >- void insertStatementsInParentBlock(const TIntermSequence &insertionsBefore, >- const TIntermSequence &insertionsAfter); >- >- // Helper to insert a single statement. >- void insertStatementInParentBlock(TIntermNode *statement); >- >- // Helper to create a temporary symbol node with the given qualifier. >- TIntermSymbol *createTempSymbol(const TType &type, TQualifier qualifier); >- // Helper to create a temporary symbol node. >- TIntermSymbol *createTempSymbol(const TType &type); >- // Create a node that declares but doesn't initialize a temporary symbol. >- TIntermDeclaration *createTempDeclaration(const TType &type); >- // Create a node that initializes the current temporary symbol with initializer. The symbol will >- // have the given qualifier. >- TIntermDeclaration *createTempInitDeclaration(TIntermTyped *initializer, TQualifier qualifier); >- // Create a node that initializes the current temporary symbol with initializer. >- TIntermDeclaration *createTempInitDeclaration(TIntermTyped *initializer); >- // Create a node that assigns rightNode to the current temporary symbol. >- TIntermBinary *createTempAssignment(TIntermTyped *rightNode); >- // Increment temporary symbol index. >- void nextTemporaryId(); >- >- enum class OriginalNode >- { >- BECOMES_CHILD, >- IS_DROPPED >- }; >- >- void clearReplacementQueue(); >- >- // Replace the node currently being visited with replacement. >- void queueReplacement(TIntermNode *replacement, OriginalNode originalStatus); >- // Explicitly specify a node to replace with replacement. >- void queueReplacementWithParent(TIntermNode *parent, >- TIntermNode *original, >- TIntermNode *replacement, >- OriginalNode originalStatus); >- >- const bool preVisit; >- const bool inVisit; >- const bool postVisit; >- >- int mDepth; >- int mMaxDepth; >- >- bool mInGlobalScope; >- >- // During traversing, save all the changes that need to happen into >- // mReplacements/mMultiReplacements, then do them by calling updateTree(). >- // Multi replacements are processed after single replacements. >- std::vector<NodeReplaceWithMultipleEntry> mMultiReplacements; >- >- TSymbolTable *mSymbolTable; >- >- private: >- // To insert multiple nodes into the parent block. >- struct NodeInsertMultipleEntry >- { >- NodeInsertMultipleEntry(TIntermBlock *_parent, >- TIntermSequence::size_type _position, >- TIntermSequence _insertionsBefore, >- TIntermSequence _insertionsAfter) >- : parent(_parent), >- position(_position), >- insertionsBefore(_insertionsBefore), >- insertionsAfter(_insertionsAfter) >- { >- } >- >- TIntermBlock *parent; >- TIntermSequence::size_type position; >- TIntermSequence insertionsBefore; >- TIntermSequence insertionsAfter; >- }; >- >- static bool CompareInsertion(const NodeInsertMultipleEntry &a, >- const NodeInsertMultipleEntry &b); >- >- // To replace a single node with another on the parent node >- struct NodeUpdateEntry >- { >- NodeUpdateEntry(TIntermNode *_parent, >- TIntermNode *_original, >- TIntermNode *_replacement, >- bool _originalBecomesChildOfReplacement) >- : parent(_parent), >- original(_original), >- replacement(_replacement), >- originalBecomesChildOfReplacement(_originalBecomesChildOfReplacement) >- { >- } >- >- TIntermNode *parent; >- TIntermNode *original; >- TIntermNode *replacement; >- bool originalBecomesChildOfReplacement; >- }; >- >- struct ParentBlock >- { >- ParentBlock(TIntermBlock *nodeIn, TIntermSequence::size_type posIn) >- : node(nodeIn), pos(posIn) >- { >- } >- >- TIntermBlock *node; >- TIntermSequence::size_type pos; >- }; >- >- std::vector<NodeInsertMultipleEntry> mInsertions; >- std::vector<NodeUpdateEntry> mReplacements; >- >- // All the nodes from root to the current node during traversing. >- TVector<TIntermNode *> mPath; >- >- // All the code blocks from the root to the current node's parent during traversal. >- std::vector<ParentBlock> mParentBlockStack; >- >- TSymbolUniqueId *mTemporaryId; >-}; >- >-// Traverser parent class that tracks where a node is a destination of a write operation and so is >-// required to be an l-value. >-class TLValueTrackingTraverser : public TIntermTraverser >-{ >- public: >- TLValueTrackingTraverser(bool preVisit, >- bool inVisit, >- bool postVisit, >- TSymbolTable *symbolTable, >- int shaderVersion); >- virtual ~TLValueTrackingTraverser() {} >- >- void traverseBinary(TIntermBinary *node) final; >- void traverseUnary(TIntermUnary *node) final; >- void traverseFunctionPrototype(TIntermFunctionPrototype *node) final; >- void traverseAggregate(TIntermAggregate *node) final; >- >- protected: >- bool isLValueRequiredHere() const >- { >- return mOperatorRequiresLValue || mInFunctionCallOutParameter; >- } >- >- private: >- // Track whether an l-value is required in the node that is currently being traversed by the >- // surrounding operator. >- // Use isLValueRequiredHere to check all conditions which require an l-value. >- void setOperatorRequiresLValue(bool lValueRequired) >- { >- mOperatorRequiresLValue = lValueRequired; >- } >- bool operatorRequiresLValue() const { return mOperatorRequiresLValue; } >- >- // Add a function encountered during traversal to the function map. >- void addToFunctionMap(const TSymbolUniqueId &id, TIntermSequence *paramSequence); >- >- // Return true if the prototype or definition of the function being called has been encountered >- // during traversal. >- bool isInFunctionMap(const TIntermAggregate *callNode) const; >- >- // Return the parameters sequence from the function definition or prototype. >- TIntermSequence *getFunctionParameters(const TIntermAggregate *callNode); >- >- // Track whether an l-value is required inside a function call. >- void setInFunctionCallOutParameter(bool inOutParameter); >- bool isInFunctionCallOutParameter() const; >- >- bool mOperatorRequiresLValue; >- bool mInFunctionCallOutParameter; >- >- // Map from function symbol id values to their parameter sequences >- TMap<int, TIntermSequence *> mFunctionMap; >- >- const int mShaderVersion; >-}; >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_INTERMTRAVERSE_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/IsASTDepthBelowLimit.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/IsASTDepthBelowLimit.cpp >index aaad4f3c68f..73cb9d18331 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/IsASTDepthBelowLimit.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/IsASTDepthBelowLimit.cpp >@@ -6,7 +6,7 @@ > > #include "compiler/translator/IsASTDepthBelowLimit.h" > >-#include "compiler/translator/IntermTraverse.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > > namespace sh > { >@@ -18,24 +18,10 @@ namespace > class MaxDepthTraverser : public TIntermTraverser > { > public: >- MaxDepthTraverser(int depthLimit) : TIntermTraverser(true, true, false), mDepthLimit(depthLimit) >+ MaxDepthTraverser(int depthLimit) : TIntermTraverser(true, false, false, nullptr) > { >+ setMaxAllowedDepth(depthLimit); > } >- >- bool visitBinary(Visit, TIntermBinary *) override { return depthCheck(); } >- bool visitUnary(Visit, TIntermUnary *) override { return depthCheck(); } >- bool visitTernary(Visit, TIntermTernary *) override { return depthCheck(); } >- bool visitSwizzle(Visit, TIntermSwizzle *) override { return depthCheck(); } >- bool visitIfElse(Visit, TIntermIfElse *) override { return depthCheck(); } >- bool visitAggregate(Visit, TIntermAggregate *) override { return depthCheck(); } >- bool visitBlock(Visit, TIntermBlock *) override { return depthCheck(); } >- bool visitLoop(Visit, TIntermLoop *) override { return depthCheck(); } >- bool visitBranch(Visit, TIntermBranch *) override { return depthCheck(); } >- >- protected: >- bool depthCheck() const { return mMaxDepth < mDepthLimit; } >- >- int mDepthLimit; > }; > > } // anonymous namespace >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/NodeSearch.h b/Source/ThirdParty/ANGLE/src/compiler/translator/NodeSearch.h >deleted file mode 100644 >index af86b8bde46..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/NodeSearch.h >+++ /dev/null >@@ -1,56 +0,0 @@ >-// >-// Copyright (c) 2002-2013 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. >-// >-// NodeSearch.h: Utilities for searching translator node graphs >-// >- >-#ifndef COMPILER_TRANSLATOR_NODESEARCH_H_ >-#define COMPILER_TRANSLATOR_NODESEARCH_H_ >- >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-template <class Parent> >-class NodeSearchTraverser : public TIntermTraverser >-{ >- public: >- NodeSearchTraverser() : TIntermTraverser(true, false, false), mFound(false) {} >- >- bool found() const { return mFound; } >- >- static bool search(TIntermNode *node) >- { >- Parent searchTraverser; >- node->traverse(&searchTraverser); >- return searchTraverser.found(); >- } >- >- protected: >- bool mFound; >-}; >- >-class FindDiscard : public NodeSearchTraverser<FindDiscard> >-{ >- public: >- virtual bool visitBranch(Visit visit, TIntermBranch *node) >- { >- switch (node->getFlowOp()) >- { >- case EOpKill: >- mFound = true; >- break; >- >- default: >- break; >- } >- >- return !mFound; >- } >-}; >-} >- >-#endif // COMPILER_TRANSLATOR_NODESEARCH_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.cpp >index 7a2156611aa..090455c89c4 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.cpp >@@ -10,7 +10,7 @@ const char *GetOperatorString(TOperator op) > { > switch (op) > { >- // Note: EOpNull and EOpCall* can't be handled here. >+ // Note: EOpNull and EOpCall* can't be handled here. > > case EOpNegative: > return "-"; >@@ -151,7 +151,7 @@ const char *GetOperatorString(TOperator op) > return "log2"; > case EOpSqrt: > return "sqrt"; >- case EOpInverseSqrt: >+ case EOpInversesqrt: > return "inversesqrt"; > > case EOpAbs: >@@ -184,11 +184,11 @@ const char *GetOperatorString(TOperator op) > return "mix"; > case EOpStep: > return "step"; >- case EOpSmoothStep: >+ case EOpSmoothstep: > return "smoothstep"; >- case EOpIsNan: >+ case EOpIsnan: > return "isnan"; >- case EOpIsInf: >+ case EOpIsinf: > return "isinf"; > > case EOpFloatBitsToInt: >@@ -345,6 +345,23 @@ const char *GetOperatorString(TOperator op) > case EOpGroupMemoryBarrier: > return "groupMemoryBarrier"; > >+ case EOpAtomicAdd: >+ return "atomicAdd"; >+ case EOpAtomicMin: >+ return "atomicMin"; >+ case EOpAtomicMax: >+ return "atomicMax"; >+ case EOpAtomicAnd: >+ return "atomicAnd"; >+ case EOpAtomicOr: >+ return "atomicOr"; >+ case EOpAtomicXor: >+ return "atomicXor"; >+ case EOpAtomicExchange: >+ return "atomicExchange"; >+ case EOpAtomicCompSwap: >+ return "atomicCompSwap"; >+ > case EOpEmitVertex: > return "EmitVertex"; > case EOpEndPrimitive: >@@ -382,4 +399,22 @@ bool IsAssignment(TOperator op) > default: > return false; > } >-} >\ No newline at end of file >+} >+ >+bool IsAtomicFunction(TOperator op) >+{ >+ switch (op) >+ { >+ case EOpAtomicAdd: >+ case EOpAtomicMin: >+ case EOpAtomicMax: >+ case EOpAtomicAnd: >+ case EOpAtomicOr: >+ case EOpAtomicXor: >+ case EOpAtomicExchange: >+ case EOpAtomicCompSwap: >+ return true; >+ default: >+ return false; >+ } >+} >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.h b/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.h >index 72f3dbf3f62..e1540faa44f 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.h >@@ -119,7 +119,7 @@ enum TOperator > EOpExp2, > EOpLog2, > EOpSqrt, >- EOpInverseSqrt, >+ EOpInversesqrt, > > EOpAbs, > EOpSign, >@@ -136,9 +136,9 @@ enum TOperator > EOpClamp, > EOpMix, > EOpStep, >- EOpSmoothStep, >- EOpIsNan, >- EOpIsInf, >+ EOpSmoothstep, >+ EOpIsnan, >+ EOpIsinf, > > EOpFloatBitsToInt, > EOpFloatBitsToUint, >@@ -241,6 +241,16 @@ enum TOperator > EOpMemoryBarrierShared, > EOpGroupMemoryBarrier, > >+ // Atomic functions >+ EOpAtomicAdd, >+ EOpAtomicMin, >+ EOpAtomicMax, >+ EOpAtomicAnd, >+ EOpAtomicOr, >+ EOpAtomicXor, >+ EOpAtomicExchange, >+ EOpAtomicCompSwap, >+ > // Geometry only > EOpEmitVertex, > EOpEndPrimitive >@@ -252,4 +262,7 @@ const char *GetOperatorString(TOperator op); > // Say whether or not a binary or unary operation changes the value of a variable. > bool IsAssignment(TOperator op); > >+// Say whether or not an operator represents an atomic function. >+bool IsAtomicFunction(TOperator op); >+ > #endif // COMPILER_TRANSLATOR_OPERATOR_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputESSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputESSL.cpp >index 50626c91c08..8d57eeae840 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputESSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputESSL.cpp >@@ -28,8 +28,7 @@ TOutputESSL::TOutputESSL(TInfoSinkBase &objSink, > SH_ESSL_OUTPUT, > compileOptions), > mForceHighp(forceHighp) >-{ >-} >+{} > > bool TOutputESSL::writeVariablePrecision(TPrecision precision) > { >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.cpp >index 1bad05dab93..35989a0c665 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.cpp >@@ -29,8 +29,7 @@ TOutputGLSL::TOutputGLSL(TInfoSinkBase &objSink, > shaderVersion, > output, > compileOptions) >-{ >-} >+{} > > bool TOutputGLSL::writeVariablePrecision(TPrecision) > { >@@ -41,24 +40,32 @@ void TOutputGLSL::visitSymbol(TIntermSymbol *node) > { > TInfoSinkBase &out = objSink(); > >- const TString &symbol = node->getSymbol(); >- if (symbol == "gl_FragDepthEXT") >+ // All the special cases are built-ins, so if it's not a built-in we can return early. >+ if (node->variable().symbolType() != SymbolType::BuiltIn) >+ { >+ TOutputGLSLBase::visitSymbol(node); >+ return; >+ } >+ >+ // Some built-ins get a special translation. >+ const ImmutableString &name = node->getName(); >+ if (name == "gl_FragDepthEXT") > { > out << "gl_FragDepth"; > } >- else if (symbol == "gl_FragColor" && sh::IsGLSL130OrNewer(getShaderOutput())) >+ else if (name == "gl_FragColor" && sh::IsGLSL130OrNewer(getShaderOutput())) > { > out << "webgl_FragColor"; > } >- else if (symbol == "gl_FragData" && sh::IsGLSL130OrNewer(getShaderOutput())) >+ else if (name == "gl_FragData" && sh::IsGLSL130OrNewer(getShaderOutput())) > { > out << "webgl_FragData"; > } >- else if (symbol == "gl_SecondaryFragColorEXT") >+ else if (name == "gl_SecondaryFragColorEXT") > { > out << "angle_SecondaryFragColor"; > } >- else if (symbol == "gl_SecondaryFragDataEXT") >+ else if (name == "gl_SecondaryFragDataEXT") > { > out << "angle_SecondaryFragData"; > } >@@ -68,9 +75,9 @@ void TOutputGLSL::visitSymbol(TIntermSymbol *node) > } > } > >-TString TOutputGLSL::translateTextureFunction(const TString &name) >+ImmutableString TOutputGLSL::translateTextureFunction(const ImmutableString &name) > { >- static const char *simpleRename[] = {"texture2DLodEXT", >+ static const char *simpleRename[] = {"texture2DLodEXT", > "texture2DLod", > "texture2DProjLodEXT", > "texture2DProjLod", >@@ -86,8 +93,8 @@ TString TOutputGLSL::translateTextureFunction(const TString &name) > nullptr}; > static const char *legacyToCoreRename[] = { > "texture2D", "texture", "texture2DProj", "textureProj", "texture2DLod", "textureLod", >- "texture2DProjLod", "textureProjLod", "texture2DRect", "texture", "textureCube", "texture", >- "textureCubeLod", "textureLod", >+ "texture2DProjLod", "textureProjLod", "texture2DRect", "texture", "texture2DRectProj", >+ "textureProj", "textureCube", "texture", "textureCubeLod", "textureLod", > // Extensions > "texture2DLodEXT", "textureLod", "texture2DProjLodEXT", "textureProjLod", > "textureCubeLodEXT", "textureLod", "texture2DGradEXT", "textureGrad", >@@ -100,7 +107,7 @@ TString TOutputGLSL::translateTextureFunction(const TString &name) > { > if (name == mapping[i]) > { >- return mapping[i + 1]; >+ return ImmutableString(mapping[i + 1]); > } > } > >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.h >index c80abec1a66..b676a799326 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.h >@@ -28,7 +28,7 @@ class TOutputGLSL : public TOutputGLSLBase > protected: > bool writeVariablePrecision(TPrecision) override; > void visitSymbol(TIntermSymbol *node) override; >- TString translateTextureFunction(const TString &name) override; >+ ImmutableString translateTextureFunction(const ImmutableString &name) override; > }; > > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.cpp >index edaf2ebebf2..21396ea41f9 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.cpp >@@ -46,6 +46,10 @@ bool isSingleStatement(TIntermNode *node) > { > return false; > } >+ else if (node->getAsPreprocessorDirective()) >+ { >+ return false; >+ } > return true; > } > >@@ -53,6 +57,7 @@ class CommaSeparatedListItemPrefixGenerator > { > public: > CommaSeparatedListItemPrefixGenerator() : mFirst(true) {} >+ > private: > bool mFirst; > >@@ -94,8 +99,7 @@ TOutputGLSLBase::TOutputGLSLBase(TInfoSinkBase &objSink, > mShaderVersion(shaderVersion), > mOutput(output), > mCompileOptions(compileOptions) >-{ >-} >+{} > > void TOutputGLSLBase::writeInvariantQualifier(const TType &type) > { >@@ -165,6 +169,13 @@ void TOutputGLSLBase::writeLayoutQualifier(TIntermTyped *variable) > return; > } > >+ if (type.getBasicType() == EbtInterfaceBlock) >+ { >+ const TInterfaceBlock *interfaceBlock = type.getInterfaceBlock(); >+ declareInterfaceBlockLayout(interfaceBlock); >+ return; >+ } >+ > TInfoSinkBase &out = objSink(); > const TLayoutQualifier &layoutQualifier = type.getLayoutQualifier(); > out << "layout("; >@@ -178,6 +189,10 @@ void TOutputGLSLBase::writeLayoutQualifier(TIntermTyped *variable) > { > out << listItemPrefix << "location = " << layoutQualifier.location; > } >+ if (type.getQualifier() == EvqFragmentOut && layoutQualifier.index >= 0) >+ { >+ out << listItemPrefix << "index = " << layoutQualifier.index; >+ } > } > > if (type.getQualifier() == EvqFragmentOut) >@@ -214,6 +229,15 @@ void TOutputGLSLBase::writeLayoutQualifier(TIntermTyped *variable) > out << ") "; > } > >+void TOutputGLSLBase::writeQualifier(TQualifier qualifier, const TSymbol *symbol) >+{ >+ const char *result = mapQualifierToString(qualifier); >+ if (result && result[0] != '\0') >+ { >+ objSink() << result << " "; >+ } >+} >+ > const char *TOutputGLSLBase::mapQualifierToString(TQualifier qualifier) > { > if (sh::IsGLSL410OrOlder(mOutput) && mShaderVersion >= 300 && >@@ -250,7 +274,7 @@ const char *TOutputGLSLBase::mapQualifierToString(TQualifier qualifier) > return sh::getQualifierString(qualifier); > } > >-void TOutputGLSLBase::writeVariableType(const TType &type) >+void TOutputGLSLBase::writeVariableType(const TType &type, const TSymbol *symbol) > { > TQualifier qualifier = type.getQualifier(); > TInfoSinkBase &out = objSink(); >@@ -258,18 +282,9 @@ void TOutputGLSLBase::writeVariableType(const TType &type) > { > writeInvariantQualifier(type); > } >- if (type.getBasicType() == EbtInterfaceBlock) >- { >- TInterfaceBlock *interfaceBlock = type.getInterfaceBlock(); >- declareInterfaceBlockLayout(interfaceBlock); >- } > if (qualifier != EvqTemporary && qualifier != EvqGlobal) > { >- const char *qualifierString = mapQualifierToString(qualifier); >- if (qualifierString && qualifierString[0] != '\0') >- { >- out << qualifierString << " "; >- } >+ writeQualifier(qualifier, symbol); > } > > const TMemoryQualifier &memoryQualifier = type.getMemoryQualifier(); >@@ -309,15 +324,10 @@ void TOutputGLSLBase::writeVariableType(const TType &type) > const TStructure *structure = type.getStruct(); > > declareStruct(structure); >- >- if (!structure->name().empty()) >- { >- mDeclaredStructs.insert(structure->uniqueId()); >- } > } > else if (type.getBasicType() == EbtInterfaceBlock) > { >- TInterfaceBlock *interfaceBlock = type.getInterfaceBlock(); >+ const TInterfaceBlock *interfaceBlock = type.getInterfaceBlock(); > declareInterfaceBlock(interfaceBlock); > } > else >@@ -328,24 +338,23 @@ void TOutputGLSLBase::writeVariableType(const TType &type) > } > } > >-void TOutputGLSLBase::writeFunctionParameters(const TIntermSequence &args) >+void TOutputGLSLBase::writeFunctionParameters(const TFunction *func) > { > TInfoSinkBase &out = objSink(); >- for (TIntermSequence::const_iterator iter = args.begin(); iter != args.end(); ++iter) >+ size_t paramCount = func->getParamCount(); >+ for (size_t i = 0; i < paramCount; ++i) > { >- const TIntermSymbol *arg = (*iter)->getAsSymbolNode(); >- ASSERT(arg != nullptr); >- >- const TType &type = arg->getType(); >- writeVariableType(type); >+ const TVariable *param = func->getParam(i); >+ const TType &type = param->getType(); >+ writeVariableType(type, param); > >- if (!arg->getName().getString().empty()) >- out << " " << hashName(arg->getName()); >+ if (param->symbolType() != SymbolType::Empty) >+ out << " " << hashName(param); > if (type.isArray()) > out << ArrayString(type); > > // Put a comma if this is not the last argument. >- if (iter != args.end() - 1) >+ if (i != paramCount - 1) > out << ", "; > } > } >@@ -358,7 +367,7 @@ const TConstantUnion *TOutputGLSLBase::writeConstantUnion(const TType &type, > if (type.getBasicType() == EbtStruct) > { > const TStructure *structure = type.getStruct(); >- out << hashName(TName(structure->name())) << "("; >+ out << hashName(structure) << "("; > > const TFieldList &fields = structure->fields(); > for (size_t i = 0; i < fields.size(); ++i) >@@ -433,7 +442,7 @@ void TOutputGLSLBase::writeConstructorTriplet(Visit visit, const TType &type) > void TOutputGLSLBase::visitSymbol(TIntermSymbol *node) > { > TInfoSinkBase &out = objSink(); >- out << hashVariableName(node->getName()); >+ out << hashName(&node->variable()); > > if (mDeclaringVariable && node->getType().isArray()) > out << ArrayString(node->getType()); >@@ -441,7 +450,7 @@ void TOutputGLSLBase::visitSymbol(TIntermSymbol *node) > > void TOutputGLSLBase::visitConstantUnion(TIntermConstantUnion *node) > { >- writeConstantUnion(node->getType(), node->getUnionArrayPointer()); >+ writeConstantUnion(node->getType(), node->getConstantValue()); > } > > bool TOutputGLSLBase::visitSwizzle(Visit visit, TIntermSwizzle *node) >@@ -582,11 +591,7 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node) > const TIntermConstantUnion *index = node->getRight()->getAsConstantUnion(); > const TField *field = structure->fields()[index->getIConst(0)]; > >- TString fieldName = field->name(); >- if (!mSymbolTable->findBuiltIn(structure->name(), mShaderVersion)) >- fieldName = hashName(TName(fieldName)); >- >- out << fieldName; >+ out << hashFieldName(field); > visitChildren = false; > } > break; >@@ -598,18 +603,7 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node) > node->getLeft()->getType().getInterfaceBlock(); > const TIntermConstantUnion *index = node->getRight()->getAsConstantUnion(); > const TField *field = interfaceBlock->fields()[index->getIConst(0)]; >- >- TString fieldName = field->name(); >- if (!mSymbolTable->findBuiltIn(interfaceBlock->name(), mShaderVersion)) >- { >- fieldName = hashName(TName(fieldName)); >- } >- else >- { >- ASSERT(interfaceBlock->name() == "gl_PerVertex"); >- } >- >- out << fieldName; >+ out << hashFieldName(field); > visitChildren = false; > } > break; >@@ -691,8 +685,8 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node) > > bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node) > { >- TString preString; >- TString postString = ")"; >+ const char *preString = ""; >+ const char *postString = ")"; > > switch (node->getOp()) > { >@@ -747,7 +741,7 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node) > case EOpExp2: > case EOpLog2: > case EOpSqrt: >- case EOpInverseSqrt: >+ case EOpInversesqrt: > case EOpAbs: > case EOpSign: > case EOpFloor: >@@ -756,8 +750,8 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node) > case EOpRoundEven: > case EOpCeil: > case EOpFract: >- case EOpIsNan: >- case EOpIsInf: >+ case EOpIsnan: >+ case EOpIsinf: > case EOpFloatBitsToInt: > case EOpFloatBitsToUint: > case EOpIntBitsToFloat: >@@ -793,7 +787,7 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node) > UNREACHABLE(); > } > >- writeTriplet(visit, preString.c_str(), nullptr, postString.c_str()); >+ writeTriplet(visit, preString, nullptr, postString); > > return true; > } >@@ -860,7 +854,7 @@ bool TOutputGLSLBase::visitBlock(Visit visit, TIntermBlock *node) > { > TInfoSinkBase &out = objSink(); > // Scope the blocks except when at the global scope. >- if (mDepth > 0) >+ if (getCurrentTraversalDepth() > 0) > { > out << "{\n"; > } >@@ -877,7 +871,7 @@ bool TOutputGLSLBase::visitBlock(Visit visit, TIntermBlock *node) > } > > // Scope the blocks except when at the global scope. >- if (mDepth > 0) >+ if (getCurrentTraversalDepth() > 0) > { > out << "}\n"; > } >@@ -899,33 +893,30 @@ bool TOutputGLSLBase::visitInvariantDeclaration(Visit visit, TIntermInvariantDec > TInfoSinkBase &out = objSink(); > ASSERT(visit == PreVisit); > const TIntermSymbol *symbol = node->getSymbol(); >- out << "invariant " << hashVariableName(symbol->getName()); >+ out << "invariant " << hashName(&symbol->variable()); > return false; > } > >-bool TOutputGLSLBase::visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) >+void TOutputGLSLBase::visitFunctionPrototype(TIntermFunctionPrototype *node) > { > TInfoSinkBase &out = objSink(); >- ASSERT(visit == PreVisit); > > const TType &type = node->getType(); >- writeVariableType(type); >+ writeVariableType(type, node->getFunction()); > if (type.isArray()) > out << ArrayString(type); > >- out << " " << hashFunctionNameIfNeeded(*node->getFunctionSymbolInfo()); >+ out << " " << hashFunctionNameIfNeeded(node->getFunction()); > > out << "("; >- writeFunctionParameters(*(node->getSequence())); >+ writeFunctionParameters(node->getFunction()); > out << ")"; >- >- return false; > } > > bool TOutputGLSLBase::visitAggregate(Visit visit, TIntermAggregate *node) > { >- bool visitChildren = true; >- TInfoSinkBase &out = objSink(); >+ bool visitChildren = true; >+ TInfoSinkBase &out = objSink(); > switch (node->getOp()) > { > case EOpCallFunctionInAST: >@@ -936,11 +927,11 @@ bool TOutputGLSLBase::visitAggregate(Visit visit, TIntermAggregate *node) > { > if (node->getOp() == EOpCallBuiltInFunction) > { >- out << translateTextureFunction(node->getFunctionSymbolInfo()->getName()); >+ out << translateTextureFunction(node->getFunction()->name()); > } > else > { >- out << hashFunctionNameIfNeeded(*node->getFunctionSymbolInfo()); >+ out << hashFunctionNameIfNeeded(node->getFunction()); > } > out << "("; > } >@@ -968,7 +959,7 @@ bool TOutputGLSLBase::visitAggregate(Visit visit, TIntermAggregate *node) > case EOpClamp: > case EOpMix: > case EOpStep: >- case EOpSmoothStep: >+ case EOpSmoothstep: > case EOpFrexp: > case EOpLdexp: > case EOpDistance: >@@ -992,6 +983,14 @@ bool TOutputGLSLBase::visitAggregate(Visit visit, TIntermAggregate *node) > case EOpMemoryBarrierImage: > case EOpMemoryBarrierShared: > case EOpGroupMemoryBarrier: >+ case EOpAtomicAdd: >+ case EOpAtomicMin: >+ case EOpAtomicMax: >+ case EOpAtomicAnd: >+ case EOpAtomicOr: >+ case EOpAtomicXor: >+ case EOpAtomicExchange: >+ case EOpAtomicCompSwap: > case EOpEmitVertex: > case EOpEndPrimitive: > writeBuiltInFunctionTriplet(visit, node->getOp(), node->getUseEmulatedFunction()); >@@ -1012,9 +1011,10 @@ bool TOutputGLSLBase::visitDeclaration(Visit visit, TIntermDeclaration *node) > const TIntermSequence &sequence = *(node->getSequence()); > TIntermTyped *variable = sequence.front()->getAsTyped(); > writeLayoutQualifier(variable); >- writeVariableType(variable->getType()); >+ TIntermSymbol *symbolNode = variable->getAsSymbolNode(); >+ writeVariableType(variable->getType(), symbolNode ? &symbolNode->variable() : nullptr); > if (variable->getAsSymbolNode() == nullptr || >- !variable->getAsSymbolNode()->getSymbol().empty()) >+ variable->getAsSymbolNode()->variable().symbolType() != SymbolType::Empty) > { > out << " "; > } >@@ -1121,73 +1121,112 @@ void TOutputGLSLBase::visitCodeBlock(TIntermBlock *node) > } > } > >-TString TOutputGLSLBase::getTypeName(const TType &type) >+void TOutputGLSLBase::visitPreprocessorDirective(TIntermPreprocessorDirective *node) >+{ >+ TInfoSinkBase &out = objSink(); >+ >+ out << "\n"; >+ >+ switch (node->getDirective()) >+ { >+ case PreprocessorDirective::Define: >+ out << "#define"; >+ break; >+ case PreprocessorDirective::Endif: >+ out << "#endif"; >+ break; >+ case PreprocessorDirective::If: >+ out << "#if"; >+ break; >+ case PreprocessorDirective::Ifdef: >+ out << "#ifdef"; >+ break; >+ >+ default: >+ UNREACHABLE(); >+ break; >+ } >+ >+ if (!node->getCommand().empty()) >+ { >+ out << " " << node->getCommand(); >+ } >+ >+ out << "\n"; >+} >+ >+ImmutableString TOutputGLSLBase::getTypeName(const TType &type) > { > return GetTypeName(type, mHashFunction, &mNameMap); > } > >-TString TOutputGLSLBase::hashName(const TName &name) >+ImmutableString TOutputGLSLBase::hashName(const TSymbol *symbol) > { >- return HashName(name, mHashFunction, &mNameMap); >+ return HashName(symbol, mHashFunction, &mNameMap); > } > >-TString TOutputGLSLBase::hashVariableName(const TName &name) >+ImmutableString TOutputGLSLBase::hashFieldName(const TField *field) > { >- if (mSymbolTable->findBuiltIn(name.getString(), mShaderVersion) != nullptr || >- name.getString().substr(0, 3) == "gl_") >+ ASSERT(field->symbolType() != SymbolType::Empty); >+ if (field->symbolType() == SymbolType::UserDefined) > { >- if (mCompileOptions & SH_TRANSLATE_VIEWID_OVR_TO_UNIFORM && >- name.getString() == "gl_ViewID_OVR") >- { >- TName uniformName(TString("ViewID_OVR")); >- uniformName.setInternal(true); >- return hashName(uniformName); >- } >- return name.getString(); >+ return HashName(field->name(), mHashFunction, &mNameMap); > } >- return hashName(name); >+ >+ return field->name(); > } > >-TString TOutputGLSLBase::hashFunctionNameIfNeeded(const TFunctionSymbolInfo &info) >+ImmutableString TOutputGLSLBase::hashFunctionNameIfNeeded(const TFunction *func) > { >- if (info.isMain()) >+ if (func->isMain()) > { >- return info.getName(); >+ return func->name(); > } > else > { >- return hashName(info.getNameObj()); >+ return hashName(func); > } > } > > bool TOutputGLSLBase::structDeclared(const TStructure *structure) const > { > ASSERT(structure); >- if (structure->name().empty()) >+ if (structure->symbolType() == SymbolType::Empty) > { > return false; > } > >- return (mDeclaredStructs.count(structure->uniqueId()) > 0); >+ return (mDeclaredStructs.count(structure->uniqueId().get()) > 0); > } > > void TOutputGLSLBase::declareStruct(const TStructure *structure) > { > TInfoSinkBase &out = objSink(); > >- out << "struct " << hashName(TName(structure->name())) << "{\n"; >+ out << "struct "; >+ >+ if (structure->symbolType() != SymbolType::Empty) >+ { >+ out << hashName(structure) << " "; >+ } >+ out << "{\n"; > const TFieldList &fields = structure->fields(); > for (size_t i = 0; i < fields.size(); ++i) > { > const TField *field = fields[i]; > if (writeVariablePrecision(field->type()->getPrecision())) > out << " "; >- out << getTypeName(*field->type()) << " " << hashName(TName(field->name())); >+ out << getTypeName(*field->type()) << " " << hashFieldName(field); > if (field->type()->isArray()) > out << ArrayString(*field->type()); > out << ";\n"; > } > out << "}"; >+ >+ if (structure->symbolType() != SymbolType::Empty) >+ { >+ mDeclaredStructs.insert(structure->uniqueId().get()); >+ } > } > > void TOutputGLSLBase::declareInterfaceBlockLayout(const TInterfaceBlock *interfaceBlock) >@@ -1221,29 +1260,10 @@ void TOutputGLSLBase::declareInterfaceBlockLayout(const TInterfaceBlock *interfa > break; > } > >- out << ", "; >- >- if (interfaceBlock->blockBinding() > 0) >+ if (interfaceBlock->blockBinding() >= 0) > { >- out << "binding = " << interfaceBlock->blockBinding(); > out << ", "; >- } >- >- switch (interfaceBlock->matrixPacking()) >- { >- case EmpUnspecified: >- case EmpColumnMajor: >- // Default matrix packing is column major. >- out << "column_major"; >- break; >- >- case EmpRowMajor: >- out << "row_major"; >- break; >- >- default: >- UNREACHABLE(); >- break; >+ out << "binding = " << interfaceBlock->blockBinding(); > } > > out << ") "; >@@ -1253,14 +1273,35 @@ void TOutputGLSLBase::declareInterfaceBlock(const TInterfaceBlock *interfaceBloc > { > TInfoSinkBase &out = objSink(); > >- out << hashName(TName(interfaceBlock->name())) << "{\n"; >+ out << hashName(interfaceBlock) << "{\n"; > const TFieldList &fields = interfaceBlock->fields(); >- for (size_t i = 0; i < fields.size(); ++i) >+ for (const TField *field : fields) > { >- const TField *field = fields[i]; >+ if (field->type()->isMatrix() || field->type()->isStructureContainingMatrices()) >+ { >+ out << "layout("; >+ switch (field->type()->getLayoutQualifier().matrixPacking) >+ { >+ case EmpUnspecified: >+ case EmpColumnMajor: >+ // Default matrix packing is column major. >+ out << "column_major"; >+ break; >+ >+ case EmpRowMajor: >+ out << "row_major"; >+ break; >+ >+ default: >+ UNREACHABLE(); >+ break; >+ } >+ out << ") "; >+ } >+ > if (writeVariablePrecision(field->type()->getPrecision())) > out << " "; >- out << getTypeName(*field->type()) << " " << hashName(TName(field->name())); >+ out << getTypeName(*field->type()) << " " << hashFieldName(field); > if (field->type()->isArray()) > out << ArrayString(*field->type()); > out << ";\n"; >@@ -1325,7 +1366,7 @@ bool NeedsToWriteLayoutQualifier(const TType &type) > { > if (type.getBasicType() == EbtInterfaceBlock) > { >- return false; >+ return true; > } > > const TLayoutQualifier &layoutQualifier = type.getLayoutQualifier(); >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.h b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.h >index 592a310be47..96f767ebd73 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.h >@@ -11,7 +11,7 @@ > > #include "compiler/translator/HashNames.h" > #include "compiler/translator/InfoSink.h" >-#include "compiler/translator/IntermTraverse.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > > namespace sh > { >@@ -32,9 +32,9 @@ class TOutputGLSLBase : public TIntermTraverser > ShShaderOutput getShaderOutput() const { return mOutput; } > > // Return the original name if hash function pointer is NULL; >- // otherwise return the hashed name. Has special handling for internal names, which are not >- // hashed. >- TString hashName(const TName &name); >+ // otherwise return the hashed name. Has special handling for internal names and built-ins, >+ // which are not hashed. >+ ImmutableString hashName(const TSymbol *symbol); > > protected: > TInfoSinkBase &objSink() { return mObjSink; } >@@ -42,12 +42,12 @@ class TOutputGLSLBase : public TIntermTraverser > void writeTriplet(Visit visit, const char *preStr, const char *inStr, const char *postStr); > virtual void writeLayoutQualifier(TIntermTyped *variable); > void writeInvariantQualifier(const TType &type); >- void writeVariableType(const TType &type); >+ virtual void writeVariableType(const TType &type, const TSymbol *symbol); > virtual bool writeVariablePrecision(TPrecision precision) = 0; >- void writeFunctionParameters(const TIntermSequence &args); >+ void writeFunctionParameters(const TFunction *func); > const TConstantUnion *writeConstantUnion(const TType &type, const TConstantUnion *pConstUnion); > void writeConstructorTriplet(Visit visit, const TType &type); >- TString getTypeName(const TType &type); >+ ImmutableString getTypeName(const TType &type); > > void visitSymbol(TIntermSymbol *node) override; > void visitConstantUnion(TIntermConstantUnion *node) override; >@@ -58,7 +58,7 @@ class TOutputGLSLBase : public TIntermTraverser > bool visitIfElse(Visit visit, TIntermIfElse *node) override; > bool visitSwitch(Visit visit, TIntermSwitch *node) override; > bool visitCase(Visit visit, TIntermCase *node) override; >- bool visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) override; >+ void visitFunctionPrototype(TIntermFunctionPrototype *node) override; > bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override; > bool visitAggregate(Visit visit, TIntermAggregate *node) override; > bool visitBlock(Visit visit, TIntermBlock *node) override; >@@ -66,26 +66,27 @@ class TOutputGLSLBase : public TIntermTraverser > bool visitDeclaration(Visit visit, TIntermDeclaration *node) override; > bool visitLoop(Visit visit, TIntermLoop *node) override; > bool visitBranch(Visit visit, TIntermBranch *node) override; >+ void visitPreprocessorDirective(TIntermPreprocessorDirective *node) override; > > void visitCodeBlock(TIntermBlock *node); > >- // Same as hashName(), but without hashing built-in variables. >- TString hashVariableName(const TName &name); >- // Same as hashName(), but without hashing internal functions or "main". >- TString hashFunctionNameIfNeeded(const TFunctionSymbolInfo &info); >+ ImmutableString hashFieldName(const TField *field); >+ // Same as hashName(), but without hashing "main". >+ ImmutableString hashFunctionNameIfNeeded(const TFunction *func); > // Used to translate function names for differences between ESSL and GLSL >- virtual TString translateTextureFunction(const TString &name) { return name; } >+ virtual ImmutableString translateTextureFunction(const ImmutableString &name) { return name; } > >- private: >- bool structDeclared(const TStructure *structure) const; > void declareStruct(const TStructure *structure); >+ virtual void writeQualifier(TQualifier qualifier, const TSymbol *symbol); >+ bool structDeclared(const TStructure *structure) const; > >+ private: > void declareInterfaceBlockLayout(const TInterfaceBlock *interfaceBlock); > void declareInterfaceBlock(const TInterfaceBlock *interfaceBlock); > > void writeBuiltInFunctionTriplet(Visit visit, TOperator op, bool useEmulatedFunction); > >- const char *mapQualifierToString(TQualifier qialifier); >+ const char *mapQualifierToString(TQualifier qualifier); > > TInfoSinkBase &mObjSink; > bool mDeclaringVariable; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.cpp >index d5ff761430e..273f326eac8 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.cpp >@@ -6,26 +6,27 @@ > > #include "compiler/translator/OutputHLSL.h" > >+#include <stdio.h> > #include <algorithm> > #include <cfloat> >-#include <stdio.h> > > #include "common/angleutils.h" > #include "common/debug.h" > #include "common/utilities.h" >+#include "compiler/translator/AtomicCounterFunctionHLSL.h" > #include "compiler/translator/BuiltInFunctionEmulator.h" > #include "compiler/translator/BuiltInFunctionEmulatorHLSL.h" > #include "compiler/translator/ImageFunctionHLSL.h" > #include "compiler/translator/InfoSink.h" >-#include "compiler/translator/NodeSearch.h" >-#include "compiler/translator/RemoveSwitchFallThrough.h" >-#include "compiler/translator/SearchSymbol.h" >+#include "compiler/translator/ResourcesHLSL.h" > #include "compiler/translator/StructureHLSL.h" > #include "compiler/translator/TextureFunctionHLSL.h" > #include "compiler/translator/TranslatorHLSL.h" >-#include "compiler/translator/UniformHLSL.h" > #include "compiler/translator/UtilsHLSL.h" > #include "compiler/translator/blocklayout.h" >+#include "compiler/translator/tree_ops/RemoveSwitchFallThrough.h" >+#include "compiler/translator/tree_util/FindSymbolNode.h" >+#include "compiler/translator/tree_util/NodeSearch.h" > #include "compiler/translator/util.h" > > namespace sh >@@ -34,9 +35,11 @@ namespace sh > namespace > { > >+constexpr const char kImage2DFunctionString[] = "// @@ IMAGE2D DECLARATION FUNCTION STRING @@"; >+ > TString ArrayHelperFunctionName(const char *prefix, const TType &type) > { >- TStringStream fnName; >+ TStringStream fnName = sh::InitializeStream<TStringStream>(); > fnName << prefix << "_"; > if (type.isArray()) > { >@@ -56,32 +59,120 @@ bool IsDeclarationWrittenOut(TIntermDeclaration *node) > ASSERT(sequence->size() == 1); > ASSERT(variable); > return (variable->getQualifier() == EvqTemporary || variable->getQualifier() == EvqGlobal || >- variable->getQualifier() == EvqConst); >+ variable->getQualifier() == EvqConst || variable->getQualifier() == EvqShared); > } > >-bool IsInStd140InterfaceBlock(TIntermTyped *node) >+bool IsInStd140UniformBlock(TIntermTyped *node) > { > TIntermBinary *binaryNode = node->getAsBinaryNode(); > > if (binaryNode) > { >- return IsInStd140InterfaceBlock(binaryNode->getLeft()); >+ return IsInStd140UniformBlock(binaryNode->getLeft()); > } > > const TType &type = node->getType(); > >- // determine if we are in the standard layout >- const TInterfaceBlock *interfaceBlock = type.getInterfaceBlock(); >- if (interfaceBlock) >+ if (type.getQualifier() == EvqUniform) >+ { >+ // determine if we are in the standard layout >+ const TInterfaceBlock *interfaceBlock = type.getInterfaceBlock(); >+ if (interfaceBlock) >+ { >+ return (interfaceBlock->blockStorage() == EbsStd140); >+ } >+ } >+ >+ return false; >+} >+ >+const char *GetHLSLAtomicFunctionStringAndLeftParenthesis(TOperator op) >+{ >+ switch (op) >+ { >+ case EOpAtomicAdd: >+ return "InterlockedAdd("; >+ case EOpAtomicMin: >+ return "InterlockedMin("; >+ case EOpAtomicMax: >+ return "InterlockedMax("; >+ case EOpAtomicAnd: >+ return "InterlockedAnd("; >+ case EOpAtomicOr: >+ return "InterlockedOr("; >+ case EOpAtomicXor: >+ return "InterlockedXor("; >+ case EOpAtomicExchange: >+ return "InterlockedExchange("; >+ case EOpAtomicCompSwap: >+ return "InterlockedCompareExchange("; >+ default: >+ UNREACHABLE(); >+ return ""; >+ } >+} >+ >+bool IsAtomicFunctionForSharedVariableDirectAssign(const TIntermBinary &node) >+{ >+ TIntermAggregate *aggregateNode = node.getRight()->getAsAggregate(); >+ if (aggregateNode == nullptr) >+ { >+ return false; >+ } >+ >+ if (node.getOp() == EOpAssign && IsAtomicFunction(aggregateNode->getOp())) > { >- return (interfaceBlock->blockStorage() == EbsStd140); >+ return !IsInShaderStorageBlock((*aggregateNode->getSequence())[0]->getAsTyped()); > } > > return false; > } > >+const char *kZeros = "_ANGLE_ZEROS_"; >+constexpr int kZeroCount = 256; >+std::string DefineZeroArray() >+{ >+ std::stringstream ss = sh::InitializeStream<std::stringstream>(); >+ // For 'static', if the declaration does not include an initializer, the value is set to zero. >+ // https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx-graphics-hlsl-variable-syntax >+ ss << "static uint " << kZeros << "[" << kZeroCount << "];\n"; >+ return ss.str(); >+} >+ >+std::string GetZeroInitializer(size_t size) >+{ >+ std::stringstream ss = sh::InitializeStream<std::stringstream>(); >+ size_t quotient = size / kZeroCount; >+ size_t reminder = size % kZeroCount; >+ >+ for (size_t i = 0; i < quotient; ++i) >+ { >+ if (i != 0) >+ { >+ ss << ", "; >+ } >+ ss << kZeros; >+ } >+ >+ for (size_t i = 0; i < reminder; ++i) >+ { >+ if (quotient != 0 || i != 0) >+ { >+ ss << ", "; >+ } >+ ss << "0"; >+ } >+ >+ return ss.str(); >+} >+ > } // anonymous namespace > >+TReferencedBlock::TReferencedBlock(const TInterfaceBlock *aBlock, >+ const TVariable *aInstanceVariable) >+ : block(aBlock), instanceVariable(aInstanceVariable) >+{} >+ > void OutputHLSL::writeFloat(TInfoSinkBase &out, float f) > { > // This is known not to work for NaN on all drivers but make the best effort to output NaNs >@@ -144,8 +235,10 @@ OutputHLSL::OutputHLSL(sh::GLenum shaderType, > int numRenderTargets, > const std::vector<Uniform> &uniforms, > ShCompileOptions compileOptions, >+ sh::WorkGroupSize workGroupSize, > TSymbolTable *symbolTable, >- PerformanceDiagnostics *perfDiagnostics) >+ PerformanceDiagnostics *perfDiagnostics, >+ const std::vector<InterfaceBlock> &shaderStorageBlocks) > : TIntermTraverser(true, true, true, symbolTable), > mShaderType(shaderType), > mShaderVersion(shaderVersion), >@@ -153,22 +246,23 @@ OutputHLSL::OutputHLSL(sh::GLenum shaderType, > mSourcePath(sourcePath), > mOutputType(outputType), > mCompileOptions(compileOptions), >+ mInsideFunction(false), >+ mInsideMain(false), > mNumRenderTargets(numRenderTargets), > mCurrentFunctionMetadata(nullptr), >+ mWorkGroupSize(workGroupSize), > mPerfDiagnostics(perfDiagnostics) > { >- mInsideFunction = false; >- >- mUsesFragColor = false; >- mUsesFragData = false; >- mUsesDepthRange = false; >- mUsesFragCoord = false; >- mUsesPointCoord = false; >- mUsesFrontFacing = false; >- mUsesPointSize = false; >- mUsesInstanceID = false; >+ mUsesFragColor = false; >+ mUsesFragData = false; >+ mUsesDepthRange = false; >+ mUsesFragCoord = false; >+ mUsesPointCoord = false; >+ mUsesFrontFacing = false; >+ mUsesPointSize = false; >+ mUsesInstanceID = false; > mHasMultiviewExtensionEnabled = >- IsExtensionEnabled(mExtensionBehavior, TExtension::OVR_multiview); >+ IsExtensionEnabled(mExtensionBehavior, TExtension::OVR_multiview2); > mUsesViewID = false; > mUsesVertexID = false; > mUsesFragDepth = false; >@@ -181,6 +275,7 @@ OutputHLSL::OutputHLSL(sh::GLenum shaderType, > mUsesDiscardRewriting = false; > mUsesNestedBreak = false; > mRequiresIEEEStrictCompiling = false; >+ mUseZeroArray = false; > > mUniqueIndex = 0; > >@@ -191,9 +286,14 @@ OutputHLSL::OutputHLSL(sh::GLenum shaderType, > mExcessiveLoopIndex = nullptr; > > mStructureHLSL = new StructureHLSL; >- mUniformHLSL = new UniformHLSL(shaderType, mStructureHLSL, outputType, uniforms); > mTextureFunctionHLSL = new TextureFunctionHLSL; > mImageFunctionHLSL = new ImageFunctionHLSL; >+ mAtomicCounterFunctionHLSL = >+ new AtomicCounterFunctionHLSL((compileOptions & SH_FORCE_ATOMIC_VALUE_RESOLUTION) != 0); >+ >+ unsigned int firstUniformRegister = >+ ((compileOptions & SH_SKIP_D3D_CONSTANT_REGISTER_ZERO) != 0) ? 1u : 0u; >+ mResourcesHLSL = new ResourcesHLSL(mStructureHLSL, outputType, uniforms, firstUniformRegister); > > if (mOutputType == SH_HLSL_3_0_OUTPUT) > { >@@ -201,19 +301,24 @@ OutputHLSL::OutputHLSL(sh::GLenum shaderType, > // Vertex shaders need a slightly different set: dx_DepthRange, dx_ViewCoords and > // dx_ViewAdjust. > // In both cases total 3 uniform registers need to be reserved. >- mUniformHLSL->reserveUniformRegisters(3); >+ mResourcesHLSL->reserveUniformRegisters(3); > } > > // Reserve registers for the default uniform block and driver constants >- mUniformHLSL->reserveUniformBlockRegisters(2); >+ mResourcesHLSL->reserveUniformBlockRegisters(2); >+ >+ mSSBOOutputHLSL = >+ new ShaderStorageBlockOutputHLSL(this, symbolTable, mResourcesHLSL, shaderStorageBlocks); > } > > OutputHLSL::~OutputHLSL() > { >+ SafeDelete(mSSBOOutputHLSL); > SafeDelete(mStructureHLSL); >- SafeDelete(mUniformHLSL); >+ SafeDelete(mResourcesHLSL); > SafeDelete(mTextureFunctionHLSL); > SafeDelete(mImageFunctionHLSL); >+ SafeDelete(mAtomicCounterFunctionHLSL); > for (auto &eqFunction : mStructEqualityFunctions) > { > SafeDelete(eqFunction); >@@ -265,14 +370,34 @@ void OutputHLSL::output(TIntermNode *treeRoot, TInfoSinkBase &objSink) > builtInFunctionEmulator.cleanup(); > } > >+const std::map<std::string, unsigned int> &OutputHLSL::getShaderStorageBlockRegisterMap() const >+{ >+ return mResourcesHLSL->getShaderStorageBlockRegisterMap(); >+} >+ > const std::map<std::string, unsigned int> &OutputHLSL::getUniformBlockRegisterMap() const > { >- return mUniformHLSL->getUniformBlockRegisterMap(); >+ return mResourcesHLSL->getUniformBlockRegisterMap(); > } > > const std::map<std::string, unsigned int> &OutputHLSL::getUniformRegisterMap() const > { >- return mUniformHLSL->getUniformRegisterMap(); >+ return mResourcesHLSL->getUniformRegisterMap(); >+} >+ >+unsigned int OutputHLSL::getReadonlyImage2DRegisterIndex() const >+{ >+ return mResourcesHLSL->getReadonlyImage2DRegisterIndex(); >+} >+ >+unsigned int OutputHLSL::getImage2DRegisterIndex() const >+{ >+ return mResourcesHLSL->getImage2DRegisterIndex(); >+} >+ >+const std::set<std::string> &OutputHLSL::getUsedImage2DFunctionNames() const >+{ >+ return mImageFunctionHLSL->getUsedImage2DFunctionNames(); > } > > TString OutputHLSL::structInitializerString(int indent, >@@ -292,7 +417,7 @@ TString OutputHLSL::structInitializerString(int indent, > init += indentString + "{\n"; > for (unsigned int arrayIndex = 0u; arrayIndex < type.getOutermostArraySize(); ++arrayIndex) > { >- TStringStream indexedString; >+ TStringStream indexedString = sh::InitializeStream<TStringStream>(); > indexedString << name << "[" << arrayIndex << "]"; > TType elementType = type; > elementType.toArrayElementType(); >@@ -339,15 +464,22 @@ TString OutputHLSL::generateStructMapping(const std::vector<MappedStruct> &std14 > > for (auto &mappedStruct : std140Structs) > { >- TInterfaceBlock *interfaceBlock = >+ const TInterfaceBlock *interfaceBlock = > mappedStruct.blockDeclarator->getType().getInterfaceBlock(); >- const TString &interfaceBlockName = interfaceBlock->name(); >- const TName &instanceName = mappedStruct.blockDeclarator->getName(); >- if (mReferencedUniformBlocks.count(interfaceBlockName) == 0 && >- (instanceName.getString() == "" || >- mReferencedUniformBlocks.count(instanceName.getString()) == 0)) >+ TQualifier qualifier = mappedStruct.blockDeclarator->getType().getQualifier(); >+ switch (qualifier) > { >- continue; >+ case EvqUniform: >+ if (mReferencedUniformBlocks.count(interfaceBlock->uniqueId().get()) == 0) >+ { >+ continue; >+ } >+ break; >+ case EvqBuffer: >+ continue; >+ default: >+ UNREACHABLE(); >+ return mappedStructs; > } > > unsigned int instanceCount = 1u; >@@ -363,13 +495,15 @@ TString OutputHLSL::generateStructMapping(const std::vector<MappedStruct> &std14 > TString originalName; > TString mappedName("map"); > >- if (instanceName.getString() != "") >+ if (mappedStruct.blockDeclarator->variable().symbolType() != SymbolType::Empty) > { >+ const ImmutableString &instanceName = >+ mappedStruct.blockDeclarator->variable().name(); > unsigned int instanceStringArrayIndex = GL_INVALID_INDEX; > if (isInstanceArray) > instanceStringArrayIndex = instanceArrayIndex; >- TString instanceString = mUniformHLSL->uniformBlockInstanceString( >- *interfaceBlock, instanceStringArrayIndex); >+ TString instanceString = mResourcesHLSL->InterfaceBlockInstanceString( >+ instanceName, instanceStringArrayIndex); > originalName += instanceString; > mappedName += instanceString; > originalName += "."; >@@ -386,7 +520,7 @@ TString OutputHLSL::generateStructMapping(const std::vector<MappedStruct> &std14 > > if (structType->isArray()) > { >- mappedStructs += ArrayString(*mappedStruct.field->type()); >+ mappedStructs += ArrayString(*mappedStruct.field->type()).data(); > } > > mappedStructs += " =\n"; >@@ -397,39 +531,42 @@ TString OutputHLSL::generateStructMapping(const std::vector<MappedStruct> &std14 > return mappedStructs; > } > >-void OutputHLSL::header(TInfoSinkBase &out, >- const std::vector<MappedStruct> &std140Structs, >- const BuiltInFunctionEmulator *builtInFunctionEmulator) const >+void OutputHLSL::writeReferencedAttributes(TInfoSinkBase &out) const > { >- TString varyings; >- TString attributes; >- TString mappedStructs = generateStructMapping(std140Structs); >- >- for (ReferencedSymbols::const_iterator varying = mReferencedVaryings.begin(); >- varying != mReferencedVaryings.end(); varying++) >+ for (const auto &attribute : mReferencedAttributes) > { >- const TType &type = varying->second->getType(); >- const TString &name = varying->second->getSymbol(); >+ const TType &type = attribute.second->getType(); >+ const ImmutableString &name = attribute.second->name(); > >- // Program linking depends on this exact format >- varyings += "static " + InterpolationString(type.getQualifier()) + " " + TypeString(type) + >- " " + Decorate(name) + ArrayString(type) + " = " + initializer(type) + ";\n"; >+ out << "static " << TypeString(type) << " " << Decorate(name) << ArrayString(type) << " = " >+ << zeroInitializer(type) << ";\n"; > } >+} > >- for (ReferencedSymbols::const_iterator attribute = mReferencedAttributes.begin(); >- attribute != mReferencedAttributes.end(); attribute++) >+void OutputHLSL::writeReferencedVaryings(TInfoSinkBase &out) const >+{ >+ for (const auto &varying : mReferencedVaryings) > { >- const TType &type = attribute->second->getType(); >- const TString &name = attribute->second->getSymbol(); >+ const TType &type = varying.second->getType(); > >- attributes += "static " + TypeString(type) + " " + Decorate(name) + ArrayString(type) + >- " = " + initializer(type) + ";\n"; >+ // Program linking depends on this exact format >+ out << "static " << InterpolationString(type.getQualifier()) << " " << TypeString(type) >+ << " " << DecorateVariableIfNeeded(*varying.second) << ArrayString(type) << " = " >+ << zeroInitializer(type) << ";\n"; > } >+} >+ >+void OutputHLSL::header(TInfoSinkBase &out, >+ const std::vector<MappedStruct> &std140Structs, >+ const BuiltInFunctionEmulator *builtInFunctionEmulator) const >+{ >+ TString mappedStructs = generateStructMapping(std140Structs); > > out << mStructureHLSL->structsHeader(); > >- mUniformHLSL->uniformsHeader(out, mOutputType, mReferencedUniforms, mSymbolTable); >- out << mUniformHLSL->uniformBlocksHeader(mReferencedUniformBlocks); >+ mResourcesHLSL->uniformsHeader(out, mOutputType, mReferencedUniforms, mSymbolTable); >+ out << mResourcesHLSL->uniformBlocksHeader(mReferencedUniformBlocks); >+ mSSBOOutputHLSL->writeShaderStorageBlocksHeader(out); > > if (!mEqualityFunctions.empty()) > { >@@ -479,34 +616,43 @@ void OutputHLSL::header(TInfoSinkBase &out, > "#define FLATTEN\n" > "#endif\n"; > >+ // array stride for atomic counter buffers is always 4 per original extension >+ // ARB_shader_atomic_counters and discussion on >+ // https://github.com/KhronosGroup/OpenGL-API/issues/5 >+ out << "\n#define ATOMIC_COUNTER_ARRAY_STRIDE 4\n\n"; >+ >+ if (mUseZeroArray) >+ { >+ out << DefineZeroArray() << "\n"; >+ } >+ > if (mShaderType == GL_FRAGMENT_SHADER) > { > const bool usingMRTExtension = > IsExtensionEnabled(mExtensionBehavior, TExtension::EXT_draw_buffers); > > out << "// Varyings\n"; >- out << varyings; >+ writeReferencedVaryings(out); > out << "\n"; > > if (mShaderVersion >= 300) > { >- for (ReferencedSymbols::const_iterator outputVariableIt = >- mReferencedOutputVariables.begin(); >- outputVariableIt != mReferencedOutputVariables.end(); outputVariableIt++) >+ for (const auto &outputVariable : mReferencedOutputVariables) > { >- const TString &variableName = outputVariableIt->first; >- const TType &variableType = outputVariableIt->second->getType(); >+ const ImmutableString &variableName = outputVariable.second->name(); >+ const TType &variableType = outputVariable.second->getType(); > >- out << "static " + TypeString(variableType) + " out_" + variableName + >- ArrayString(variableType) + " = " + initializer(variableType) + ";\n"; >+ out << "static " << TypeString(variableType) << " out_" << variableName >+ << ArrayString(variableType) << " = " << zeroInitializer(variableType) << ";\n"; > } > } > else > { > const unsigned int numColorValues = usingMRTExtension ? mNumRenderTargets : 1; > >- out << "static float4 gl_Color[" << numColorValues << "] =\n" >- "{\n"; >+ out << "static float4 gl_Color[" << numColorValues >+ << "] =\n" >+ "{\n"; > for (unsigned int i = 0; i < numColorValues; i++) > { > out << " float4(0, 0, 0, 0)"; >@@ -589,7 +735,7 @@ void OutputHLSL::header(TInfoSinkBase &out, > > if (mOutputType == SH_HLSL_4_1_OUTPUT) > { >- mUniformHLSL->samplerMetadataUniforms(out, "c4"); >+ mResourcesHLSL->samplerMetadataUniforms(out, 4); > } > > out << "};\n"; >@@ -621,14 +767,6 @@ void OutputHLSL::header(TInfoSinkBase &out, > "\n"; > } > >- if (!mappedStructs.empty()) >- { >- out << "// Structures from std140 blocks with padding removed\n"; >- out << "\n"; >- out << mappedStructs; >- out << "\n"; >- } >- > if (usingMRTExtension && mNumRenderTargets > 1) > { > out << "#define GL_USES_MRT\n"; >@@ -647,7 +785,7 @@ void OutputHLSL::header(TInfoSinkBase &out, > else if (mShaderType == GL_VERTEX_SHADER) > { > out << "// Attributes\n"; >- out << attributes; >+ writeReferencedAttributes(out); > out << "\n" > "static float4 gl_Position = float4(0, 0, 0, 0);\n"; > >@@ -668,7 +806,7 @@ void OutputHLSL::header(TInfoSinkBase &out, > > out << "\n" > "// Varyings\n"; >- out << varyings; >+ writeReferencedVaryings(out); > out << "\n"; > > if (mUsesDepthRange) >@@ -709,7 +847,12 @@ void OutputHLSL::header(TInfoSinkBase &out, > > if (mOutputType == SH_HLSL_4_1_OUTPUT) > { >- mUniformHLSL->samplerMetadataUniforms(out, "c4"); >+ mResourcesHLSL->samplerMetadataUniforms(out, 4); >+ } >+ >+ if (mUsesVertexID) >+ { >+ out << " uint dx_VertexID : packoffset(c3.w);\n"; > } > > out << "};\n" >@@ -733,14 +876,6 @@ void OutputHLSL::header(TInfoSinkBase &out, > "dx_DepthRange.y, dx_DepthRange.z};\n" > "\n"; > } >- >- if (!mappedStructs.empty()) >- { >- out << "// Structures from std140 blocks with padding removed\n"; >- out << "\n"; >- out << mappedStructs; >- out << "\n"; >- } > } > else // Compute shader > { >@@ -753,37 +888,75 @@ void OutputHLSL::header(TInfoSinkBase &out, > out << " uint3 gl_NumWorkGroups : packoffset(c0);\n"; > } > ASSERT(mOutputType == SH_HLSL_4_1_OUTPUT); >- mUniformHLSL->samplerMetadataUniforms(out, "c1"); >+ unsigned int registerIndex = 1; >+ mResourcesHLSL->samplerMetadataUniforms(out, registerIndex); >+ // Sampler metadata struct must be two 4-vec, 32 bytes. >+ registerIndex += mResourcesHLSL->getSamplerCount() * 2; >+ mResourcesHLSL->imageMetadataUniforms(out, registerIndex); > out << "};\n"; > >- // Follow built-in variables would be initialized in >- // DynamicHLSL::generateComputeShaderLinkHLSL, if they >- // are used in compute shader. >+ out << kImage2DFunctionString << "\n"; >+ >+ std::ostringstream systemValueDeclaration = sh::InitializeStream<std::ostringstream>(); >+ std::ostringstream glBuiltinInitialization = sh::InitializeStream<std::ostringstream>(); >+ >+ systemValueDeclaration << "\nstruct CS_INPUT\n{\n"; >+ glBuiltinInitialization << "\nvoid initGLBuiltins(CS_INPUT input)\n" >+ << "{\n"; >+ > if (mUsesWorkGroupID) > { > out << "static uint3 gl_WorkGroupID = uint3(0, 0, 0);\n"; >+ systemValueDeclaration << " uint3 dx_WorkGroupID : " >+ << "SV_GroupID;\n"; >+ glBuiltinInitialization << " gl_WorkGroupID = input.dx_WorkGroupID;\n"; > } > > if (mUsesLocalInvocationID) > { > out << "static uint3 gl_LocalInvocationID = uint3(0, 0, 0);\n"; >+ systemValueDeclaration << " uint3 dx_LocalInvocationID : " >+ << "SV_GroupThreadID;\n"; >+ glBuiltinInitialization << " gl_LocalInvocationID = input.dx_LocalInvocationID;\n"; > } > > if (mUsesGlobalInvocationID) > { > out << "static uint3 gl_GlobalInvocationID = uint3(0, 0, 0);\n"; >+ systemValueDeclaration << " uint3 dx_GlobalInvocationID : " >+ << "SV_DispatchThreadID;\n"; >+ glBuiltinInitialization << " gl_GlobalInvocationID = input.dx_GlobalInvocationID;\n"; > } > > if (mUsesLocalInvocationIndex) > { > out << "static uint gl_LocalInvocationIndex = uint(0);\n"; >+ systemValueDeclaration << " uint dx_LocalInvocationIndex : " >+ << "SV_GroupIndex;\n"; >+ glBuiltinInitialization >+ << " gl_LocalInvocationIndex = input.dx_LocalInvocationIndex;\n"; > } >+ >+ systemValueDeclaration << "};\n\n"; >+ glBuiltinInitialization << "};\n\n"; >+ >+ out << systemValueDeclaration.str(); >+ out << glBuiltinInitialization.str(); >+ } >+ >+ if (!mappedStructs.empty()) >+ { >+ out << "// Structures from std140 blocks with padding removed\n"; >+ out << "\n"; >+ out << mappedStructs; >+ out << "\n"; > } > > bool getDimensionsIgnoresBaseLevel = > (mCompileOptions & SH_HLSL_GET_DIMENSIONS_IGNORES_BASE_LEVEL) != 0; > mTextureFunctionHLSL->textureFunctionHeader(out, mOutputType, getDimensionsIgnoresBaseLevel); > mImageFunctionHLSL->imageFunctionHeader(out); >+ mAtomicCounterFunctionHLSL->atomicCounterFunctionHeader(out); > > if (mUsesFragCoord) > { >@@ -810,6 +983,11 @@ void OutputHLSL::header(TInfoSinkBase &out, > out << "#define GL_ANGLE_MULTIVIEW_ENABLED\n"; > } > >+ if (mUsesVertexID) >+ { >+ out << "#define GL_USES_VERTEX_ID\n"; >+ } >+ > if (mUsesViewID) > { > out << "#define GL_USES_VIEW_ID\n"; >@@ -825,31 +1003,6 @@ void OutputHLSL::header(TInfoSinkBase &out, > out << "#define GL_USES_DEPTH_RANGE\n"; > } > >- if (mUsesNumWorkGroups) >- { >- out << "#define GL_USES_NUM_WORK_GROUPS\n"; >- } >- >- if (mUsesWorkGroupID) >- { >- out << "#define GL_USES_WORK_GROUP_ID\n"; >- } >- >- if (mUsesLocalInvocationID) >- { >- out << "#define GL_USES_LOCAL_INVOCATION_ID\n"; >- } >- >- if (mUsesGlobalInvocationID) >- { >- out << "#define GL_USES_GLOBAL_INVOCATION_ID\n"; >- } >- >- if (mUsesLocalInvocationIndex) >- { >- out << "#define GL_USES_LOCAL_INVOCATION_INDEX\n"; >- } >- > if (mUsesXor) > { > out << "bool xor(bool p, bool q)\n" >@@ -864,60 +1017,95 @@ void OutputHLSL::header(TInfoSinkBase &out, > > void OutputHLSL::visitSymbol(TIntermSymbol *node) > { >+ const TVariable &variable = node->variable(); >+ >+ // Empty symbols can only appear in declarations and function arguments, and in either of those >+ // cases the symbol nodes are not visited. >+ ASSERT(variable.symbolType() != SymbolType::Empty); >+ > TInfoSinkBase &out = getInfoSink(); > > // Handle accessing std140 structs by value >- if (IsInStd140InterfaceBlock(node) && node->getBasicType() == EbtStruct) >+ if (IsInStd140UniformBlock(node) && node->getBasicType() == EbtStruct) > { > out << "map"; > } > >- TString name = node->getSymbol(); >+ const ImmutableString &name = variable.name(); >+ const TSymbolUniqueId &uniqueId = variable.uniqueId(); > > if (name == "gl_DepthRange") > { > mUsesDepthRange = true; > out << name; > } >+ else if (IsAtomicCounter(variable.getType().getBasicType())) >+ { >+ const TType &variableType = variable.getType(); >+ if (variableType.getQualifier() == EvqUniform) >+ { >+ TLayoutQualifier layout = variableType.getLayoutQualifier(); >+ mReferencedUniforms[uniqueId.get()] = &variable; >+ out << getAtomicCounterNameForBinding(layout.binding) << ", " << layout.offset; >+ } >+ else >+ { >+ TString varName = DecorateVariableIfNeeded(variable); >+ out << varName << ", " << varName << "_offset"; >+ } >+ } > else > { >- const TType &nodeType = node->getType(); >- TQualifier qualifier = node->getQualifier(); >+ const TType &variableType = variable.getType(); >+ TQualifier qualifier = variable.getType().getQualifier(); > >- ensureStructDefined(nodeType); >+ ensureStructDefined(variableType); > > if (qualifier == EvqUniform) > { >- const TInterfaceBlock *interfaceBlock = nodeType.getInterfaceBlock(); >+ const TInterfaceBlock *interfaceBlock = variableType.getInterfaceBlock(); > > if (interfaceBlock) > { >- mReferencedUniformBlocks[interfaceBlock->name()] = node; >+ if (mReferencedUniformBlocks.count(interfaceBlock->uniqueId().get()) == 0) >+ { >+ const TVariable *instanceVariable = nullptr; >+ if (variableType.isInterfaceBlock()) >+ { >+ instanceVariable = &variable; >+ } >+ mReferencedUniformBlocks[interfaceBlock->uniqueId().get()] = >+ new TReferencedBlock(interfaceBlock, instanceVariable); >+ } > } > else > { >- mReferencedUniforms[name] = node; >+ mReferencedUniforms[uniqueId.get()] = &variable; > } > >- out << DecorateVariableIfNeeded(node->getName()); >+ out << DecorateVariableIfNeeded(variable); >+ } >+ else if (qualifier == EvqBuffer) >+ { >+ UNREACHABLE(); > } > else if (qualifier == EvqAttribute || qualifier == EvqVertexIn) > { >- mReferencedAttributes[name] = node; >+ mReferencedAttributes[uniqueId.get()] = &variable; > out << Decorate(name); > } > else if (IsVarying(qualifier)) > { >- mReferencedVaryings[name] = node; >- out << Decorate(name); >- if (name == "ViewID_OVR") >+ mReferencedVaryings[uniqueId.get()] = &variable; >+ out << DecorateVariableIfNeeded(variable); >+ if (variable.symbolType() == SymbolType::AngleInternal && name == "ViewID_OVR") > { > mUsesViewID = true; > } > } > else if (qualifier == EvqFragmentOut) > { >- mReferencedOutputVariables[name] = node; >+ mReferencedOutputVariables[uniqueId.get()] = &variable; > out << "out_" << name; > } > else if (qualifier == EvqFragColor) >@@ -992,16 +1180,11 @@ void OutputHLSL::visitSymbol(TIntermSymbol *node) > } > else > { >- out << DecorateVariableIfNeeded(node->getName()); >+ out << DecorateVariableIfNeeded(variable); > } > } > } > >-void OutputHLSL::visitRaw(TIntermRaw *node) >-{ >- getInfoSink() << node->getRawText(); >-} >- > void OutputHLSL::outputEqual(Visit visit, const TType &type, TOperator op, TInfoSinkBase &out) > { > if (type.isScalar() && !type.isArray()) >@@ -1130,6 +1313,50 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) > // function call is assigned. > ASSERT(rightAgg == nullptr); > } >+ // Assignment expressions with atomic functions should be transformed into atomic >+ // function calls in HLSL. >+ // e.g. original_value = atomicAdd(dest, value) should be translated into >+ // InterlockedAdd(dest, value, original_value); >+ else if (IsAtomicFunctionForSharedVariableDirectAssign(*node)) >+ { >+ TIntermAggregate *atomicFunctionNode = node->getRight()->getAsAggregate(); >+ TOperator atomicFunctionOp = atomicFunctionNode->getOp(); >+ out << GetHLSLAtomicFunctionStringAndLeftParenthesis(atomicFunctionOp); >+ TIntermSequence *argumentSeq = atomicFunctionNode->getSequence(); >+ ASSERT(argumentSeq->size() >= 2u); >+ for (auto &argument : *argumentSeq) >+ { >+ argument->traverse(this); >+ out << ", "; >+ } >+ node->getLeft()->traverse(this); >+ out << ")"; >+ return false; >+ } >+ else if (IsInShaderStorageBlock(node->getLeft())) >+ { >+ mSSBOOutputHLSL->outputStoreFunctionCallPrefix(node->getLeft()); >+ out << ", "; >+ if (IsInShaderStorageBlock(node->getRight())) >+ { >+ mSSBOOutputHLSL->outputLoadFunctionCall(node->getRight()); >+ } >+ else >+ { >+ node->getRight()->traverse(this); >+ } >+ >+ out << ")"; >+ return false; >+ } >+ else if (IsInShaderStorageBlock(node->getRight())) >+ { >+ node->getLeft()->traverse(this); >+ out << " = "; >+ mSSBOOutputHLSL->outputLoadFunctionCall(node->getRight()); >+ return false; >+ } >+ > outputAssign(visit, node->getType(), out); > break; > case EOpInitialize: >@@ -1137,23 +1364,22 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) > { > TIntermSymbol *symbolNode = node->getLeft()->getAsSymbolNode(); > ASSERT(symbolNode); >- TIntermTyped *expression = node->getRight(); >+ TIntermTyped *initializer = node->getRight(); > > // Global initializers must be constant at this point. >- ASSERT(symbolNode->getQualifier() != EvqGlobal || >- canWriteAsHLSLLiteral(expression)); >+ ASSERT(symbolNode->getQualifier() != EvqGlobal || initializer->hasConstantValue()); > > // GLSL allows to write things like "float x = x;" where a new variable x is defined > // and the value of an existing variable x is assigned. HLSL uses C semantics (the > // new variable is created before the assignment is evaluated), so we need to > // convert > // this to "float t = x, x = t;". >- if (writeSameSymbolInitializer(out, symbolNode, expression)) >+ if (writeSameSymbolInitializer(out, symbolNode, initializer)) > { > // Skip initializing the rest of the expression > return false; > } >- else if (writeConstantInitialization(out, symbolNode, expression)) >+ else if (writeConstantInitialization(out, symbolNode, initializer)) > { > return false; > } >@@ -1161,6 +1387,11 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) > else if (visit == InVisit) > { > out << " = "; >+ if (IsInShaderStorageBlock(node->getRight())) >+ { >+ mSSBOOutputHLSL->outputLoadFunctionCall(node->getRight()); >+ return false; >+ } > } > break; > case EOpAddAssign: >@@ -1238,11 +1469,18 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) > { > if (visit == PreVisit) > { >- TInterfaceBlock *interfaceBlock = leftType.getInterfaceBlock(); >+ TIntermSymbol *instanceArraySymbol = node->getLeft()->getAsSymbolNode(); >+ const TInterfaceBlock *interfaceBlock = leftType.getInterfaceBlock(); >+ >+ ASSERT(leftType.getQualifier() == EvqUniform); >+ if (mReferencedUniformBlocks.count(interfaceBlock->uniqueId().get()) == 0) >+ { >+ mReferencedUniformBlocks[interfaceBlock->uniqueId().get()] = >+ new TReferencedBlock(interfaceBlock, &instanceArraySymbol->variable()); >+ } > const int arrayIndex = node->getRight()->getAsConstantUnion()->getIConst(0); >- mReferencedUniformBlocks[interfaceBlock->instanceName()] = >- node->getLeft()->getAsSymbolNode(); >- out << mUniformHLSL->uniformBlockInstanceString(*interfaceBlock, arrayIndex); >+ out << mResourcesHLSL->InterfaceBlockInstanceString( >+ instanceArraySymbol->getName(), arrayIndex); > return false; > } > } >@@ -1252,6 +1490,10 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) > // separator to access the sampler variable that has been moved out of the struct. > outputTriplet(out, visit, "", "_", ""); > } >+ else if (IsAtomicCounter(leftType.getBasicType())) >+ { >+ outputTriplet(out, visit, "", " + (", ") * ATOMIC_COUNTER_ARRAY_STRIDE"); >+ } > else > { > outputTriplet(out, visit, "", "[", "]"); >@@ -1259,10 +1501,21 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) > } > break; > case EOpIndexIndirect: >+ { > // We do not currently support indirect references to interface blocks > ASSERT(node->getLeft()->getBasicType() != EbtInterfaceBlock); >- outputTriplet(out, visit, "", "[", "]"); >+ >+ const TType &leftType = node->getLeft()->getType(); >+ if (IsAtomicCounter(leftType.getBasicType())) >+ { >+ outputTriplet(out, visit, "", " + (", ") * ATOMIC_COUNTER_ARRAY_STRIDE"); >+ } >+ else >+ { >+ outputTriplet(out, visit, "", "[", "]"); >+ } > break; >+ } > case EOpIndexDirectStruct: > { > const TStructure *structure = node->getLeft()->getType().getStruct(); >@@ -1289,11 +1542,11 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) > { > if (indexingReturnsSampler) > { >- out << "_" + field->name(); >+ out << "_" << field->name(); > } > else > { >- out << "." + DecorateField(field->name(), *structure); >+ out << "." << DecorateField(field->name(), *structure); > } > > return false; >@@ -1302,9 +1555,10 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) > break; > case EOpIndexDirectInterfaceBlock: > { >- bool structInStd140Block = >- node->getBasicType() == EbtStruct && IsInStd140InterfaceBlock(node->getLeft()); >- if (visit == PreVisit && structInStd140Block) >+ ASSERT(!IsInShaderStorageBlock(node->getLeft())); >+ bool structInStd140UniformBlock = >+ node->getBasicType() == EbtStruct && IsInStd140UniformBlock(node->getLeft()); >+ if (visit == PreVisit && structInStd140UniformBlock) > { > out << "map"; > } >@@ -1314,7 +1568,7 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) > node->getLeft()->getType().getInterfaceBlock(); > const TIntermConstantUnion *index = node->getRight()->getAsConstantUnion(); > const TField *field = interfaceBlock->fields()[index->getIConst(0)]; >- if (structInStd140Block) >+ if (structInStd140UniformBlock) > { > out << "_"; > } >@@ -1473,8 +1727,6 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) > outputTriplet(out, visit, "cosh(", "", ")"); > break; > case EOpTanh: >- outputTriplet(out, visit, "tanh(", "", ")"); >- break; > case EOpAsinh: > case EOpAcosh: > case EOpAtanh: >@@ -1496,7 +1748,7 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) > case EOpSqrt: > outputTriplet(out, visit, "sqrt(", "", ")"); > break; >- case EOpInverseSqrt: >+ case EOpInversesqrt: > outputTriplet(out, visit, "rsqrt(", "", ")"); > break; > case EOpAbs: >@@ -1524,14 +1776,14 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) > case EOpFract: > outputTriplet(out, visit, "frac(", "", ")"); > break; >- case EOpIsNan: >+ case EOpIsnan: > if (node->getUseEmulatedFunction()) > writeEmulatedFunctionTriplet(out, visit, node->getOp()); > else > outputTriplet(out, visit, "isnan(", "", ")"); > mRequiresIEEEStrictCompiling = true; > break; >- case EOpIsInf: >+ case EOpIsinf: > outputTriplet(out, visit, "isinf(", "", ")"); > break; > case EOpFloatBitsToInt: >@@ -1631,6 +1883,13 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) > // tested in GLSLTest and results are consistent with GL. > outputTriplet(out, visit, "firstbithigh(", "", ")"); > break; >+ case EOpArrayLength: >+ { >+ TIntermTyped *operand = node->getOperand(); >+ ASSERT(IsInShaderStorageBlock(operand)); >+ mSSBOOutputHLSL->outputLengthFunctionCall(operand); >+ return false; >+ } > default: > UNREACHABLE(); > } >@@ -1638,11 +1897,12 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) > return true; > } > >-TString OutputHLSL::samplerNamePrefixFromStruct(TIntermTyped *node) >+ImmutableString OutputHLSL::samplerNamePrefixFromStruct(TIntermTyped *node) > { > if (node->getAsSymbolNode()) > { >- return node->getAsSymbolNode()->getSymbol(); >+ ASSERT(node->getAsSymbolNode()->variable().symbolType() != SymbolType::Empty); >+ return node->getAsSymbolNode()->getName(); > } > TIntermBinary *nodeBinary = node->getAsBinaryNode(); > switch (nodeBinary->getOp()) >@@ -1651,9 +1911,9 @@ TString OutputHLSL::samplerNamePrefixFromStruct(TIntermTyped *node) > { > int index = nodeBinary->getRight()->getAsConstantUnion()->getIConst(0); > >- TInfoSinkBase prefixSink; >+ std::stringstream prefixSink = sh::InitializeStream<std::stringstream>(); > prefixSink << samplerNamePrefixFromStruct(nodeBinary->getLeft()) << "_" << index; >- return TString(prefixSink.c_str()); >+ return ImmutableString(prefixSink.str()); > } > case EOpIndexDirectStruct: > { >@@ -1661,14 +1921,14 @@ TString OutputHLSL::samplerNamePrefixFromStruct(TIntermTyped *node) > int index = nodeBinary->getRight()->getAsConstantUnion()->getIConst(0); > const TField *field = s->fields()[index]; > >- TInfoSinkBase prefixSink; >+ std::stringstream prefixSink = sh::InitializeStream<std::stringstream>(); > prefixSink << samplerNamePrefixFromStruct(nodeBinary->getLeft()) << "_" > << field->name(); >- return TString(prefixSink.c_str()); >+ return ImmutableString(prefixSink.str()); > } > default: > UNREACHABLE(); >- return TString(""); >+ return kEmptyImmutableString; > } > } > >@@ -1676,10 +1936,23 @@ bool OutputHLSL::visitBlock(Visit visit, TIntermBlock *node) > { > TInfoSinkBase &out = getInfoSink(); > >+ bool isMainBlock = mInsideMain && getParentNode()->getAsFunctionDefinition(); >+ > if (mInsideFunction) > { > outputLineDirective(out, node->getLine().first_line); > out << "{\n"; >+ if (isMainBlock) >+ { >+ if (mShaderType == GL_COMPUTE_SHADER) >+ { >+ out << "initGLBuiltins(input);\n"; >+ } >+ else >+ { >+ out << "@@ MAIN PROLOGUE @@\n"; >+ } >+ } > } > > for (TIntermNode *statement : *node->getSequence()) >@@ -1714,6 +1987,19 @@ bool OutputHLSL::visitBlock(Visit visit, TIntermBlock *node) > if (mInsideFunction) > { > outputLineDirective(out, node->getLine().last_line); >+ if (isMainBlock && shaderNeedsGenerateOutput()) >+ { >+ // We could have an empty main, a main function without a branch at the end, or a main >+ // function with a discard statement at the end. In these cases we need to add a return >+ // statement. >+ bool needReturnStatement = >+ node->getSequence()->empty() || !node->getSequence()->back()->getAsBranchNode() || >+ node->getSequence()->back()->getAsBranchNode()->getFlowOp() != EOpReturn; >+ if (needReturnStatement) >+ { >+ out << "return " << generateOutputCall() << ";\n"; >+ } >+ } > out << "}\n"; > } > >@@ -1726,56 +2012,75 @@ bool OutputHLSL::visitFunctionDefinition(Visit visit, TIntermFunctionDefinition > > ASSERT(mCurrentFunctionMetadata == nullptr); > >- size_t index = mCallDag.findIndex(node->getFunctionSymbolInfo()); >+ size_t index = mCallDag.findIndex(node->getFunction()->uniqueId()); > ASSERT(index != CallDAG::InvalidIndex); > mCurrentFunctionMetadata = &mASTMetadataList[index]; > >- out << TypeString(node->getFunctionPrototype()->getType()) << " "; >+ const TFunction *func = node->getFunction(); > >- TIntermSequence *parameters = node->getFunctionPrototype()->getSequence(); >- >- if (node->getFunctionSymbolInfo()->isMain()) >+ if (func->isMain()) > { >- out << "gl_main("; >+ // The stub strings below are replaced when shader is dynamically defined by its layout: >+ switch (mShaderType) >+ { >+ case GL_VERTEX_SHADER: >+ out << "@@ VERTEX ATTRIBUTES @@\n\n" >+ << "@@ VERTEX OUTPUT @@\n\n" >+ << "VS_OUTPUT main(VS_INPUT input)"; >+ break; >+ case GL_FRAGMENT_SHADER: >+ out << "@@ PIXEL OUTPUT @@\n\n" >+ << "PS_OUTPUT main(@@ PIXEL MAIN PARAMETERS @@)"; >+ break; >+ case GL_COMPUTE_SHADER: >+ out << "[numthreads(" << mWorkGroupSize[0] << ", " << mWorkGroupSize[1] << ", " >+ << mWorkGroupSize[2] << ")]\n"; >+ out << "void main(CS_INPUT input)"; >+ break; >+ default: >+ UNREACHABLE(); >+ break; >+ } > } > else > { >- out << DecorateFunctionIfNeeded(node->getFunctionSymbolInfo()->getNameObj()) >- << DisambiguateFunctionName(parameters) << (mOutputLod0Function ? "Lod0(" : "("); >- } >+ out << TypeString(node->getFunctionPrototype()->getType()) << " "; >+ out << DecorateFunctionIfNeeded(func) << DisambiguateFunctionName(func) >+ << (mOutputLod0Function ? "Lod0(" : "("); > >- for (unsigned int i = 0; i < parameters->size(); i++) >- { >- TIntermSymbol *symbol = (*parameters)[i]->getAsSymbolNode(); >- >- if (symbol) >+ size_t paramCount = func->getParamCount(); >+ for (unsigned int i = 0; i < paramCount; i++) > { >- ensureStructDefined(symbol->getType()); >+ const TVariable *param = func->getParam(i); >+ ensureStructDefined(param->getType()); > >- out << argumentString(symbol); >+ writeParameter(param, out); > >- if (i < parameters->size() - 1) >+ if (i < paramCount - 1) > { > out << ", "; > } > } >- else >- UNREACHABLE(); >- } > >- out << ")\n"; >+ out << ")\n"; >+ } > > mInsideFunction = true; >+ if (func->isMain()) >+ { >+ mInsideMain = true; >+ } > // The function body node will output braces. > node->getBody()->traverse(this); > mInsideFunction = false; >+ mInsideMain = false; > > mCurrentFunctionMetadata = nullptr; > > bool needsLod0 = mASTMetadataList[index].mNeedsLod0; > if (needsLod0 && !mOutputLod0Function && mShaderType == GL_FRAGMENT_SHADER) > { >- ASSERT(!node->getFunctionSymbolInfo()->isMain()); >+ ASSERT(!node->getFunction()->isMain()); > mOutputLod0Function = true; > node->traverse(this); > mOutputLod0Function = false; >@@ -1789,55 +2094,64 @@ bool OutputHLSL::visitDeclaration(Visit visit, TIntermDeclaration *node) > if (visit == PreVisit) > { > TIntermSequence *sequence = node->getSequence(); >- TIntermTyped *variable = (*sequence)[0]->getAsTyped(); >+ TIntermTyped *declarator = (*sequence)[0]->getAsTyped(); > ASSERT(sequence->size() == 1); >- ASSERT(variable); >+ ASSERT(declarator); > > if (IsDeclarationWrittenOut(node)) > { > TInfoSinkBase &out = getInfoSink(); >- ensureStructDefined(variable->getType()); >+ ensureStructDefined(declarator->getType()); > >- if (!variable->getAsSymbolNode() || >- variable->getAsSymbolNode()->getSymbol() != "") // Variable declaration >+ if (!declarator->getAsSymbolNode() || >+ declarator->getAsSymbolNode()->variable().symbolType() != >+ SymbolType::Empty) // Variable declaration > { >- if (!mInsideFunction) >+ if (declarator->getQualifier() == EvqShared) >+ { >+ out << "groupshared "; >+ } >+ else if (!mInsideFunction) > { > out << "static "; > } > >- out << TypeString(variable->getType()) + " "; >+ out << TypeString(declarator->getType()) + " "; > >- TIntermSymbol *symbol = variable->getAsSymbolNode(); >+ TIntermSymbol *symbol = declarator->getAsSymbolNode(); > > if (symbol) > { > symbol->traverse(this); > out << ArrayString(symbol->getType()); >- out << " = " + initializer(symbol->getType()); >+ // Temporarily disable shadred memory initialization. It is very slow for D3D11 >+ // drivers to compile a compute shader if we add code to initialize a >+ // groupshared array variable with a large array size. And maybe produce >+ // incorrect result. See http://anglebug.com/3226. >+ if (declarator->getQualifier() != EvqShared) >+ { >+ out << " = " + zeroInitializer(symbol->getType()); >+ } > } > else > { >- variable->traverse(this); >+ declarator->traverse(this); > } > } >- else if (variable->getAsSymbolNode() && >- variable->getAsSymbolNode()->getSymbol() == "") // Type (struct) declaration >- { >- ASSERT(variable->getBasicType() == EbtStruct); >- // ensureStructDefined has already been called. >- } >- else >- UNREACHABLE(); > } >- else if (IsVaryingOut(variable->getQualifier())) >+ else if (IsVaryingOut(declarator->getQualifier())) > { >- TIntermSymbol *symbol = variable->getAsSymbolNode(); >+ TIntermSymbol *symbol = declarator->getAsSymbolNode(); > ASSERT(symbol); // Varying declarations can't have initializers. > >- // Vertex outputs which are declared but not written to should still be declared to >- // allow successful linking. >- mReferencedVaryings[symbol->getSymbol()] = symbol; >+ const TVariable &variable = symbol->variable(); >+ >+ if (variable.symbolType() != SymbolType::Empty) >+ { >+ // Vertex outputs which are declared but not written to should still be declared to >+ // allow successful linking. >+ mReferencedVaryings[symbol->uniqueId().get()] = &variable; >+ } > } > } > return false; >@@ -1849,32 +2163,29 @@ bool OutputHLSL::visitInvariantDeclaration(Visit visit, TIntermInvariantDeclarat > return false; > } > >-bool OutputHLSL::visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) >+void OutputHLSL::visitFunctionPrototype(TIntermFunctionPrototype *node) > { > TInfoSinkBase &out = getInfoSink(); > >- ASSERT(visit == PreVisit); >- size_t index = mCallDag.findIndex(node->getFunctionSymbolInfo()); >+ size_t index = mCallDag.findIndex(node->getFunction()->uniqueId()); > // Skip the prototype if it is not implemented (and thus not used) > if (index == CallDAG::InvalidIndex) > { >- return false; >+ return; > } > >- TIntermSequence *arguments = node->getSequence(); >+ const TFunction *func = node->getFunction(); > >- TString name = DecorateFunctionIfNeeded(node->getFunctionSymbolInfo()->getNameObj()); >- out << TypeString(node->getType()) << " " << name << DisambiguateFunctionName(arguments) >+ TString name = DecorateFunctionIfNeeded(func); >+ out << TypeString(node->getType()) << " " << name << DisambiguateFunctionName(func) > << (mOutputLod0Function ? "Lod0(" : "("); > >- for (unsigned int i = 0; i < arguments->size(); i++) >+ size_t paramCount = func->getParamCount(); >+ for (unsigned int i = 0; i < paramCount; i++) > { >- TIntermSymbol *symbol = (*arguments)[i]->getAsSymbolNode(); >- ASSERT(symbol != nullptr); >+ writeParameter(func->getParam(i), out); > >- out << argumentString(symbol); >- >- if (i < arguments->size() - 1) >+ if (i < paramCount - 1) > { > out << ", "; > } >@@ -1890,8 +2201,6 @@ bool OutputHLSL::visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *n > node->traverse(this); > mOutputLod0Function = false; > } >- >- return false; > } > > bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node) >@@ -1913,11 +2222,11 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node) > { > UNIMPLEMENTED(); > } >- size_t index = mCallDag.findIndex(node->getFunctionSymbolInfo()); >+ size_t index = mCallDag.findIndex(node->getFunction()->uniqueId()); > ASSERT(index != CallDAG::InvalidIndex); > lod0 &= mASTMetadataList[index].mNeedsLod0; > >- out << DecorateFunctionIfNeeded(node->getFunctionSymbolInfo()->getNameObj()); >+ out << DecorateFunctionIfNeeded(node->getFunction()); > out << DisambiguateFunctionName(node->getSequence()); > out << (lod0 ? "Lod0(" : "("); > } >@@ -1925,28 +2234,36 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node) > { > // This path is used for internal functions that don't have their definitions in the > // AST, such as precision emulation functions. >- out << DecorateFunctionIfNeeded(node->getFunctionSymbolInfo()->getNameObj()) << "("; >+ out << DecorateFunctionIfNeeded(node->getFunction()) << "("; > } >- else if (node->getFunctionSymbolInfo()->isImageFunction()) >+ else if (node->getFunction()->isImageFunction()) > { >- TString name = node->getFunctionSymbolInfo()->getName(); >- TType type = (*arguments)[0]->getAsTyped()->getType(); >- TString imageFunctionName = mImageFunctionHLSL->useImageFunction( >+ const ImmutableString &name = node->getFunction()->name(); >+ TType type = (*arguments)[0]->getAsTyped()->getType(); >+ const ImmutableString &imageFunctionName = mImageFunctionHLSL->useImageFunction( > name, type.getBasicType(), type.getLayoutQualifier().imageInternalFormat, > type.getMemoryQualifier().readonly); > out << imageFunctionName << "("; > } >+ else if (node->getFunction()->isAtomicCounterFunction()) >+ { >+ const ImmutableString &name = node->getFunction()->name(); >+ ImmutableString atomicFunctionName = >+ mAtomicCounterFunctionHLSL->useAtomicCounterFunction(name); >+ out << atomicFunctionName << "("; >+ } > else > { >- const TString &name = node->getFunctionSymbolInfo()->getName(); >+ const ImmutableString &name = node->getFunction()->name(); > TBasicType samplerType = (*arguments)[0]->getAsTyped()->getType().getBasicType(); > int coords = 0; // textureSize(gsampler2DMS) doesn't have a second argument. > if (arguments->size() > 1) > { > coords = (*arguments)[1]->getAsTyped()->getNominalSize(); > } >- TString textureFunctionName = mTextureFunctionHLSL->useTextureFunction( >- name, samplerType, coords, arguments->size(), lod0, mShaderType); >+ const ImmutableString &textureFunctionName = >+ mTextureFunctionHLSL->useTextureFunction(name, samplerType, coords, >+ arguments->size(), lod0, mShaderType); > out << textureFunctionName << "("; > } > >@@ -1965,22 +2282,24 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node) > if (typedArg->getType().isStructureContainingSamplers()) > { > const TType &argType = typedArg->getType(); >- TVector<TIntermSymbol *> samplerSymbols; >- TString structName = samplerNamePrefixFromStruct(typedArg); >- argType.createSamplerSymbols("angle_" + structName, "", &samplerSymbols, >+ TVector<const TVariable *> samplerSymbols; >+ ImmutableString structName = samplerNamePrefixFromStruct(typedArg); >+ std::string namePrefix = "angle_"; >+ namePrefix += structName.data(); >+ argType.createSamplerSymbols(ImmutableString(namePrefix), "", &samplerSymbols, > nullptr, mSymbolTable); >- for (const TIntermSymbol *sampler : samplerSymbols) >+ for (const TVariable *sampler : samplerSymbols) > { > if (mOutputType == SH_HLSL_4_0_FL9_3_OUTPUT) > { >- out << ", texture_" << sampler->getSymbol(); >- out << ", sampler_" << sampler->getSymbol(); >+ out << ", texture_" << sampler->name(); >+ out << ", sampler_" << sampler->name(); > } > else > { > // In case of HLSL 4.1+, this symbol is the sampler index, and in case > // of D3D9, it's the sampler variable. >- out << ", " + sampler->getSymbol(); >+ out << ", " << sampler->name(); > } > } > } >@@ -2060,7 +2379,7 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node) > case EOpStep: > outputTriplet(out, visit, "step(", ", ", ")"); > break; >- case EOpSmoothStep: >+ case EOpSmoothstep: > outputTriplet(out, visit, "smoothstep(", ", ", ")"); > break; > case EOpFrexp: >@@ -2103,6 +2422,87 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node) > ASSERT(node->getUseEmulatedFunction()); > writeEmulatedFunctionTriplet(out, visit, node->getOp()); > break; >+ case EOpBarrier: >+ // barrier() is translated to GroupMemoryBarrierWithGroupSync(), which is the >+ // cheapest *WithGroupSync() function, without any functionality loss, but >+ // with the potential for severe performance loss. >+ outputTriplet(out, visit, "GroupMemoryBarrierWithGroupSync(", "", ")"); >+ break; >+ case EOpMemoryBarrierShared: >+ outputTriplet(out, visit, "GroupMemoryBarrier(", "", ")"); >+ break; >+ case EOpMemoryBarrierAtomicCounter: >+ case EOpMemoryBarrierBuffer: >+ case EOpMemoryBarrierImage: >+ outputTriplet(out, visit, "DeviceMemoryBarrier(", "", ")"); >+ break; >+ case EOpGroupMemoryBarrier: >+ case EOpMemoryBarrier: >+ outputTriplet(out, visit, "AllMemoryBarrier(", "", ")"); >+ break; >+ >+ // Single atomic function calls without return value. >+ // e.g. atomicAdd(dest, value) should be translated into InterlockedAdd(dest, value). >+ case EOpAtomicAdd: >+ case EOpAtomicMin: >+ case EOpAtomicMax: >+ case EOpAtomicAnd: >+ case EOpAtomicOr: >+ case EOpAtomicXor: >+ // The parameter 'original_value' of InterlockedExchange(dest, value, original_value) >+ // and InterlockedCompareExchange(dest, compare_value, value, original_value) is not >+ // optional. >+ // https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/interlockedexchange >+ // https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/interlockedcompareexchange >+ // So all the call of atomicExchange(dest, value) and atomicCompSwap(dest, >+ // compare_value, value) should all be modified into the form of "int temp; temp = >+ // atomicExchange(dest, value);" and "int temp; temp = atomicCompSwap(dest, >+ // compare_value, value);" in the intermediate tree before traversing outputHLSL. >+ case EOpAtomicExchange: >+ case EOpAtomicCompSwap: >+ { >+ ASSERT(node->getChildCount() > 1); >+ TIntermTyped *memNode = (*node->getSequence())[0]->getAsTyped(); >+ if (IsInShaderStorageBlock(memNode)) >+ { >+ // Atomic memory functions for SSBO. >+ // "_ssbo_atomicXXX_TYPE(RWByteAddressBuffer buffer, uint loc" is written to |out|. >+ mSSBOOutputHLSL->outputAtomicMemoryFunctionCallPrefix(memNode, node->getOp()); >+ // Write the rest argument list to |out|. >+ for (size_t i = 1; i < node->getChildCount(); i++) >+ { >+ out << ", "; >+ TIntermTyped *argument = (*node->getSequence())[i]->getAsTyped(); >+ if (IsInShaderStorageBlock(argument)) >+ { >+ mSSBOOutputHLSL->outputLoadFunctionCall(argument); >+ } >+ else >+ { >+ argument->traverse(this); >+ } >+ } >+ >+ out << ")"; >+ return false; >+ } >+ else >+ { >+ // Atomic memory functions for shared variable. >+ if (node->getOp() != EOpAtomicExchange && node->getOp() != EOpAtomicCompSwap) >+ { >+ outputTriplet(out, visit, >+ GetHLSLAtomicFunctionStringAndLeftParenthesis(node->getOp()), ",", >+ ")"); >+ } >+ else >+ { >+ UNREACHABLE(); >+ } >+ } >+ >+ break; >+ } > default: > UNREACHABLE(); > } >@@ -2219,7 +2619,7 @@ bool OutputHLSL::visitCase(Visit visit, TIntermCase *node) > void OutputHLSL::visitConstantUnion(TIntermConstantUnion *node) > { > TInfoSinkBase &out = getInfoSink(); >- writeConstantUnion(out, node->getType(), node->getUnionArrayPointer()); >+ writeConstantUnion(out, node->getType(), node->getConstantValue()); > } > > bool OutputHLSL::visitLoop(Visit visit, TIntermLoop *node) >@@ -2344,11 +2744,19 @@ bool OutputHLSL::visitBranch(Visit visit, TIntermBranch *node) > case EOpReturn: > if (node->getExpression()) > { >+ ASSERT(!mInsideMain); > out << "return "; > } > else > { >- out << "return"; >+ if (mInsideMain && shaderNeedsGenerateOutput()) >+ { >+ out << "return " << generateOutputCall(); >+ } >+ else >+ { >+ out << "return"; >+ } > } > break; > default: >@@ -2411,7 +2819,7 @@ bool OutputHLSL::handleExcessiveLoop(TInfoSinkBase &out, TIntermLoop *node) > { > TIntermBinary *test = node->getCondition()->getAsBinaryNode(); > >- if (test && test->getLeft()->getAsSymbolNode()->getId() == index->getId()) >+ if (test && test->getLeft()->getAsSymbolNode()->uniqueId() == index->uniqueId()) > { > TIntermConstantUnion *constant = test->getRight()->getAsConstantUnion(); > >@@ -2617,21 +3025,13 @@ void OutputHLSL::outputLineDirective(TInfoSinkBase &out, int line) > } > } > >-TString OutputHLSL::argumentString(const TIntermSymbol *symbol) >+void OutputHLSL::writeParameter(const TVariable *param, TInfoSinkBase &out) > { >- TQualifier qualifier = symbol->getQualifier(); >- const TType &type = symbol->getType(); >- const TName &name = symbol->getName(); >- TString nameStr; >+ const TType &type = param->getType(); >+ TQualifier qualifier = type.getQualifier(); > >- if (name.getString().empty()) // HLSL demands named arguments, also for prototypes >- { >- nameStr = "x" + str(mUniqueIndex++); >- } >- else >- { >- nameStr = DecorateVariableIfNeeded(name); >- } >+ TString nameStr = DecorateVariableIfNeeded(*param); >+ ASSERT(nameStr != ""); // HLSL demands named arguments, also for prototypes > > if (IsSampler(type.getBasicType())) > { >@@ -2639,71 +3039,78 @@ TString OutputHLSL::argumentString(const TIntermSymbol *symbol) > { > // Samplers are passed as indices to the sampler array. > ASSERT(qualifier != EvqOut && qualifier != EvqInOut); >- return "const uint " + nameStr + ArrayString(type); >+ out << "const uint " << nameStr << ArrayString(type); >+ return; > } > if (mOutputType == SH_HLSL_4_0_FL9_3_OUTPUT) > { >- return QualifierString(qualifier) + " " + TextureString(type.getBasicType()) + >- " texture_" + nameStr + ArrayString(type) + ", " + QualifierString(qualifier) + >- " " + SamplerString(type.getBasicType()) + " sampler_" + nameStr + >- ArrayString(type); >+ out << QualifierString(qualifier) << " " << TextureString(type.getBasicType()) >+ << " texture_" << nameStr << ArrayString(type) << ", " << QualifierString(qualifier) >+ << " " << SamplerString(type.getBasicType()) << " sampler_" << nameStr >+ << ArrayString(type); >+ return; > } > } > >- TStringStream argString; >- argString << QualifierString(qualifier) << " " << TypeString(type) << " " << nameStr >- << ArrayString(type); >+ // If the parameter is an atomic counter, we need to add an extra parameter to keep track of the >+ // buffer offset. >+ if (IsAtomicCounter(type.getBasicType())) >+ { >+ out << QualifierString(qualifier) << " " << TypeString(type) << " " << nameStr << ", int " >+ << nameStr << "_offset"; >+ } >+ else >+ { >+ out << QualifierString(qualifier) << " " << TypeString(type) << " " << nameStr >+ << ArrayString(type); >+ } > > // If the structure parameter contains samplers, they need to be passed into the function as > // separate parameters. HLSL doesn't natively support samplers in structs. > if (type.isStructureContainingSamplers()) > { > ASSERT(qualifier != EvqOut && qualifier != EvqInOut); >- TVector<TIntermSymbol *> samplerSymbols; >- type.createSamplerSymbols("angle" + nameStr, "", &samplerSymbols, nullptr, mSymbolTable); >- for (const TIntermSymbol *sampler : samplerSymbols) >+ TVector<const TVariable *> samplerSymbols; >+ std::string namePrefix = "angle"; >+ namePrefix += nameStr.c_str(); >+ type.createSamplerSymbols(ImmutableString(namePrefix), "", &samplerSymbols, nullptr, >+ mSymbolTable); >+ for (const TVariable *sampler : samplerSymbols) > { > const TType &samplerType = sampler->getType(); > if (mOutputType == SH_HLSL_4_1_OUTPUT) > { >- argString << ", const uint " << sampler->getSymbol() << ArrayString(samplerType); >+ out << ", const uint " << sampler->name() << ArrayString(samplerType); > } > else if (mOutputType == SH_HLSL_4_0_FL9_3_OUTPUT) > { > ASSERT(IsSampler(samplerType.getBasicType())); >- argString << ", " << QualifierString(qualifier) << " " >- << TextureString(samplerType.getBasicType()) << " texture_" >- << sampler->getSymbol() << ArrayString(samplerType) << ", " >- << QualifierString(qualifier) << " " >- << SamplerString(samplerType.getBasicType()) << " sampler_" >- << sampler->getSymbol() << ArrayString(samplerType); >+ out << ", " << QualifierString(qualifier) << " " >+ << TextureString(samplerType.getBasicType()) << " texture_" << sampler->name() >+ << ArrayString(samplerType) << ", " << QualifierString(qualifier) << " " >+ << SamplerString(samplerType.getBasicType()) << " sampler_" << sampler->name() >+ << ArrayString(samplerType); > } > else > { > ASSERT(IsSampler(samplerType.getBasicType())); >- argString << ", " << QualifierString(qualifier) << " " << TypeString(samplerType) >- << " " << sampler->getSymbol() << ArrayString(samplerType); >+ out << ", " << QualifierString(qualifier) << " " << TypeString(samplerType) << " " >+ << sampler->name() << ArrayString(samplerType); > } > } > } >- >- return argString.str(); > } > >-TString OutputHLSL::initializer(const TType &type) >+TString OutputHLSL::zeroInitializer(const TType &type) const > { > TString string; > > size_t size = type.getObjectSize(); >- for (size_t component = 0; component < size; component++) >+ if (size >= kZeroCount) > { >- string += "0"; >- >- if (component + 1 < size) >- { >- string += ", "; >- } >+ mUseZeroArray = true; > } >+ string = GetZeroInitializer(size).c_str(); > > return "{" + string + "}"; > } >@@ -2741,6 +3148,8 @@ const TConstantUnion *OutputHLSL::writeConstantUnion(TInfoSinkBase &out, > const TType &type, > const TConstantUnion *const constUnion) > { >+ ASSERT(!type.isArray()); >+ > const TConstantUnion *constUnionIterated = constUnion; > > const TStructure *structure = type.getStruct(); >@@ -2800,10 +3209,10 @@ bool OutputHLSL::writeSameSymbolInitializer(TInfoSinkBase &out, > TIntermSymbol *symbolNode, > TIntermTyped *expression) > { >- sh::SearchSymbol searchSymbol(symbolNode->getSymbol()); >- expression->traverse(&searchSymbol); >+ ASSERT(symbolNode->variable().symbolType() != SymbolType::Empty); >+ const TIntermSymbol *symbolInInitializer = FindSymbolNode(expression, symbolNode->getName()); > >- if (searchSymbol.foundMatch()) >+ if (symbolInInitializer) > { > // Type already printed > out << "t" + str(mUniqueIndex) + " = "; >@@ -2819,50 +3228,17 @@ bool OutputHLSL::writeSameSymbolInitializer(TInfoSinkBase &out, > return false; > } > >-bool OutputHLSL::canWriteAsHLSLLiteral(TIntermTyped *expression) >-{ >- // We support writing constant unions and constructors that only take constant unions as >- // parameters as HLSL literals. >- return !expression->getType().isArrayOfArrays() && >- (expression->getAsConstantUnion() || >- expression->isConstructorWithOnlyConstantUnionParameters()); >-} >- > bool OutputHLSL::writeConstantInitialization(TInfoSinkBase &out, > TIntermSymbol *symbolNode, > TIntermTyped *initializer) > { >- if (canWriteAsHLSLLiteral(initializer)) >+ if (initializer->hasConstantValue()) > { > symbolNode->traverse(this); >- ASSERT(!symbolNode->getType().isArrayOfArrays()); >- if (symbolNode->getType().isArray()) >- { >- out << "[" << symbolNode->getType().getOutermostArraySize() << "]"; >- } >+ out << ArrayString(symbolNode->getType()); > out << " = {"; >- if (initializer->getAsConstantUnion()) >- { >- TIntermConstantUnion *nodeConst = initializer->getAsConstantUnion(); >- const TConstantUnion *constUnion = nodeConst->getUnionArrayPointer(); >- writeConstantUnionArray(out, constUnion, nodeConst->getType().getObjectSize()); >- } >- else >- { >- TIntermAggregate *constructor = initializer->getAsAggregate(); >- ASSERT(constructor != nullptr); >- for (TIntermNode *&node : *constructor->getSequence()) >- { >- TIntermConstantUnion *nodeConst = node->getAsConstantUnion(); >- ASSERT(nodeConst); >- const TConstantUnion *constUnion = nodeConst->getUnionArrayPointer(); >- writeConstantUnionArray(out, constUnion, nodeConst->getType().getObjectSize()); >- if (node != constructor->getSequence()->back()) >- { >- out << ", "; >- } >- } >- } >+ writeConstantUnionArray(out, initializer->getConstantValue(), >+ initializer->getType().getObjectSize()); > out << "}"; > return true; > } >@@ -3081,4 +3457,21 @@ void OutputHLSL::ensureStructDefined(const TType &type) > } > } > >+bool OutputHLSL::shaderNeedsGenerateOutput() const >+{ >+ return mShaderType == GL_VERTEX_SHADER || mShaderType == GL_FRAGMENT_SHADER; >+} >+ >+const char *OutputHLSL::generateOutputCall() const >+{ >+ if (mShaderType == GL_VERTEX_SHADER) >+ { >+ return "generateOutput(input)"; >+ } >+ else >+ { >+ return "generateOutput()"; >+ } >+} >+ > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.h >index 014f4f5002f..f43e157575a 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.h >@@ -15,20 +15,24 @@ > #include "compiler/translator/ASTMetadataHLSL.h" > #include "compiler/translator/Compiler.h" > #include "compiler/translator/FlagStd140Structs.h" >-#include "compiler/translator/IntermTraverse.h" >+#include "compiler/translator/ImmutableString.h" >+#include "compiler/translator/ShaderStorageBlockOutputHLSL.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > > class BuiltInFunctionEmulator; > > namespace sh > { >+class AtomicCounterFunctionHLSL; >+class ImageFunctionHLSL; >+class ResourcesHLSL; > class StructureHLSL; > class TextureFunctionHLSL; > class TSymbolTable; >-class ImageFunctionHLSL; >+class TVariable; > class UnfoldShortCircuit; >-class UniformHLSL; > >-typedef std::map<TString, TIntermSymbol *> ReferencedSymbols; >+using ReferencedVariables = std::map<int, const TVariable *>; > > class OutputHLSL : public TIntermTraverser > { >@@ -41,17 +45,21 @@ class OutputHLSL : public TIntermTraverser > int numRenderTargets, > const std::vector<Uniform> &uniforms, > ShCompileOptions compileOptions, >+ sh::WorkGroupSize workGroupSize, > TSymbolTable *symbolTable, >- PerformanceDiagnostics *perfDiagnostics); >+ PerformanceDiagnostics *perfDiagnostics, >+ const std::vector<InterfaceBlock> &shaderStorageBlocks); > > ~OutputHLSL(); > > void output(TIntermNode *treeRoot, TInfoSinkBase &objSink); > >+ const std::map<std::string, unsigned int> &getShaderStorageBlockRegisterMap() const; > const std::map<std::string, unsigned int> &getUniformBlockRegisterMap() const; > const std::map<std::string, unsigned int> &getUniformRegisterMap() const; >- >- static TString initializer(const TType &type); >+ unsigned int getReadonlyImage2DRegisterIndex() const; >+ unsigned int getImage2DRegisterIndex() const; >+ const std::set<std::string> &getUsedImage2DFunctionNames() const; > > TInfoSinkBase &getInfoSink() > { >@@ -59,9 +67,13 @@ class OutputHLSL : public TIntermTraverser > return *mInfoSinkStack.top(); > } > >- static bool canWriteAsHLSLLiteral(TIntermTyped *expression); >- > protected: >+ friend class ShaderStorageBlockOutputHLSL; >+ >+ TString zeroInitializer(const TType &type) const; >+ >+ void writeReferencedAttributes(TInfoSinkBase &out) const; >+ void writeReferencedVaryings(TInfoSinkBase &out) const; > void header(TInfoSinkBase &out, > const std::vector<MappedStruct> &std140Structs, > const BuiltInFunctionEmulator *builtInFunctionEmulator) const; >@@ -74,7 +86,6 @@ class OutputHLSL : public TIntermTraverser > > // Visit AST nodes and output their code to the body stream > void visitSymbol(TIntermSymbol *) override; >- void visitRaw(TIntermRaw *) override; > void visitConstantUnion(TIntermConstantUnion *) override; > bool visitSwizzle(Visit visit, TIntermSwizzle *node) override; > bool visitBinary(Visit visit, TIntermBinary *) override; >@@ -83,7 +94,7 @@ class OutputHLSL : public TIntermTraverser > bool visitIfElse(Visit visit, TIntermIfElse *) override; > bool visitSwitch(Visit visit, TIntermSwitch *) override; > bool visitCase(Visit visit, TIntermCase *) override; >- bool visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) override; >+ void visitFunctionPrototype(TIntermFunctionPrototype *node) override; > bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override; > bool visitAggregate(Visit visit, TIntermAggregate *) override; > bool visitBlock(Visit visit, TIntermBlock *node) override; >@@ -102,7 +113,7 @@ class OutputHLSL : public TIntermTraverser > const char *inString, > const char *postString); > void outputLineDirective(TInfoSinkBase &out, int line); >- TString argumentString(const TIntermSymbol *symbol); >+ void writeParameter(const TVariable *param, TInfoSinkBase &out); > > void outputConstructor(TInfoSinkBase &out, Visit visit, TIntermAggregate *node); > const TConstantUnion *writeConstantUnion(TInfoSinkBase &out, >@@ -135,6 +146,9 @@ class OutputHLSL : public TIntermTraverser > // Ensures if the type is a struct, the struct is defined > void ensureStructDefined(const TType &type); > >+ bool shaderNeedsGenerateOutput() const; >+ const char *generateOutputCall() const; >+ > sh::GLenum mShaderType; > int mShaderVersion; > const TExtensionBehavior &mExtensionBehavior; >@@ -143,6 +157,7 @@ class OutputHLSL : public TIntermTraverser > ShCompileOptions mCompileOptions; > > bool mInsideFunction; >+ bool mInsideMain; > > // Output streams > TInfoSinkBase mHeader; >@@ -154,16 +169,20 @@ class OutputHLSL : public TIntermTraverser > // TODO (jmadill): Just passing an InfoSink in function parameters would be simpler. > std::stack<TInfoSinkBase *> mInfoSinkStack; > >- ReferencedSymbols mReferencedUniforms; >- ReferencedSymbols mReferencedUniformBlocks; >- ReferencedSymbols mReferencedAttributes; >- ReferencedSymbols mReferencedVaryings; >- ReferencedSymbols mReferencedOutputVariables; >+ ReferencedVariables mReferencedUniforms; >+ >+ // Indexed by block id, not instance id. >+ ReferencedInterfaceBlocks mReferencedUniformBlocks; >+ >+ ReferencedVariables mReferencedAttributes; >+ ReferencedVariables mReferencedVaryings; >+ ReferencedVariables mReferencedOutputVariables; > > StructureHLSL *mStructureHLSL; >- UniformHLSL *mUniformHLSL; >+ ResourcesHLSL *mResourcesHLSL; > TextureFunctionHLSL *mTextureFunctionHLSL; > ImageFunctionHLSL *mImageFunctionHLSL; >+ AtomicCounterFunctionHLSL *mAtomicCounterFunctionHLSL; > > // Parameters determining what goes in the header output > bool mUsesFragColor; >@@ -187,6 +206,7 @@ class OutputHLSL : public TIntermTraverser > bool mUsesDiscardRewriting; > bool mUsesNestedBreak; > bool mRequiresIEEEStrictCompiling; >+ mutable bool mUseZeroArray; > > int mNumRenderTargets; > >@@ -236,13 +256,16 @@ class OutputHLSL : public TIntermTraverser > // arrays can't be return values in HLSL. > std::vector<ArrayHelperFunction> mArrayConstructIntoFunctions; > >+ sh::WorkGroupSize mWorkGroupSize; >+ > PerformanceDiagnostics *mPerfDiagnostics; > > private: > TString generateStructMapping(const std::vector<MappedStruct> &std140Structs) const; >- TString samplerNamePrefixFromStruct(TIntermTyped *node); >+ ImmutableString samplerNamePrefixFromStruct(TIntermTyped *node); > bool ancestorEvaluatesToSamplerInStruct(); >+ ShaderStorageBlockOutputHLSL *mSSBOOutputHLSL; > }; >-} >+} // namespace sh > > #endif // COMPILER_TRANSLATOR_OUTPUTHLSL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputTree.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputTree.cpp >index 25e8298af32..6de64a660a6 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputTree.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputTree.cpp >@@ -4,8 +4,8 @@ > // found in the LICENSE file. > // > >-#include "compiler/translator/IntermTraverse.h" > #include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > > namespace sh > { >@@ -13,11 +13,12 @@ namespace sh > namespace > { > >-void OutputFunction(TInfoSinkBase &out, const char *str, TFunctionSymbolInfo *info) >+void OutputFunction(TInfoSinkBase &out, const char *str, const TFunction *func) > { >- const char *internal = info->getNameObj().isInternal() ? " (internal function)" : ""; >- out << str << internal << ": " << info->getNameObj().getString() << " (symbol id " >- << info->getId().get() << ")"; >+ const char *internal = >+ (func->symbolType() == SymbolType::AngleInternal) ? " (internal function)" : ""; >+ out << str << internal << ": " << func->name() << " (symbol id " << func->uniqueId().get() >+ << ")"; > } > > // Two purposes: >@@ -30,7 +31,9 @@ void OutputFunction(TInfoSinkBase &out, const char *str, TFunctionSymbolInfo *in > class TOutputTraverser : public TIntermTraverser > { > public: >- TOutputTraverser(TInfoSinkBase &out) : TIntermTraverser(true, false, false), mOut(out) {} >+ TOutputTraverser(TInfoSinkBase &out) >+ : TIntermTraverser(true, false, false), mOut(out), mIndentDepth(0) >+ {} > > protected: > void visitSymbol(TIntermSymbol *) override; >@@ -42,7 +45,7 @@ class TOutputTraverser : public TIntermTraverser > bool visitIfElse(Visit visit, TIntermIfElse *node) override; > bool visitSwitch(Visit visit, TIntermSwitch *node) override; > bool visitCase(Visit visit, TIntermCase *node) override; >- bool visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) override; >+ void visitFunctionPrototype(TIntermFunctionPrototype *node) override; > bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override; > bool visitAggregate(Visit visit, TIntermAggregate *) override; > bool visitBlock(Visit visit, TIntermBlock *) override; >@@ -51,7 +54,10 @@ class TOutputTraverser : public TIntermTraverser > bool visitLoop(Visit visit, TIntermLoop *) override; > bool visitBranch(Visit visit, TIntermBranch *) override; > >+ int getCurrentIndentDepth() const { return mIndentDepth + getCurrentTraversalDepth(); } >+ > TInfoSinkBase &mOut; >+ int mIndentDepth; > }; > > // >@@ -78,29 +84,36 @@ void OutputTreeText(TInfoSinkBase &out, TIntermNode *node, const int depth) > > void TOutputTraverser::visitSymbol(TIntermSymbol *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > >- mOut << "'" << node->getSymbol() << "' "; >- mOut << "(symbol id " << node->getId() << ") "; >- mOut << "(" << node->getCompleteString() << ")"; >+ if (node->variable().symbolType() == SymbolType::Empty) >+ { >+ mOut << "''"; >+ } >+ else >+ { >+ mOut << "'" << node->getName() << "' "; >+ } >+ mOut << "(symbol id " << node->uniqueId().get() << ") "; >+ mOut << "(" << node->getType() << ")"; > mOut << "\n"; > } > > bool TOutputTraverser::visitSwizzle(Visit visit, TIntermSwizzle *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > mOut << "vector swizzle ("; > node->writeOffsetsAsXYZW(&mOut); > mOut << ")"; > >- mOut << " (" << node->getCompleteString() << ")"; >+ mOut << " (" << node->getType() << ")"; > mOut << "\n"; > return true; > } > > bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > > switch (node->getOp()) > { >@@ -248,7 +261,7 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary *node) > mOut << "<unknown op>"; > } > >- mOut << " (" << node->getCompleteString() << ")"; >+ mOut << " (" << node->getType() << ")"; > > mOut << "\n"; > >@@ -262,10 +275,10 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary *node) > TIntermConstantUnion *intermConstantUnion = node->getRight()->getAsConstantUnion(); > ASSERT(intermConstantUnion); > >- OutputTreeText(mOut, intermConstantUnion, mDepth + 1); >+ OutputTreeText(mOut, intermConstantUnion, getCurrentIndentDepth() + 1); > > // The following code finds the field name from the constant union >- const TConstantUnion *constantUnion = intermConstantUnion->getUnionArrayPointer(); >+ const TConstantUnion *constantUnion = intermConstantUnion->getConstantValue(); > const TStructure *structure = node->getLeft()->getType().getStruct(); > const TInterfaceBlock *interfaceBlock = node->getLeft()->getType().getInterfaceBlock(); > ASSERT(structure || interfaceBlock); >@@ -286,7 +299,7 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary *node) > > bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > > switch (node->getOp()) > { >@@ -331,7 +344,7 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node) > break; > } > >- mOut << " (" << node->getCompleteString() << ")"; >+ mOut << " (" << node->getType() << ")"; > > mOut << "\n"; > >@@ -340,32 +353,36 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node) > > bool TOutputTraverser::visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > mOut << "Function Definition:\n"; >- mOut << "\n"; > return true; > } > > bool TOutputTraverser::visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > mOut << "Invariant Declaration:\n"; > return true; > } > >-bool TOutputTraverser::visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) >+void TOutputTraverser::visitFunctionPrototype(TIntermFunctionPrototype *node) > { >- OutputTreeText(mOut, node, mDepth); >- OutputFunction(mOut, "Function Prototype", node->getFunctionSymbolInfo()); >- mOut << " (" << node->getCompleteString() << ")"; >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); >+ OutputFunction(mOut, "Function Prototype", node->getFunction()); >+ mOut << " (" << node->getType() << ")"; > mOut << "\n"; >- >- return true; >+ size_t paramCount = node->getFunction()->getParamCount(); >+ for (size_t i = 0; i < paramCount; ++i) >+ { >+ const TVariable *param = node->getFunction()->getParam(i); >+ OutputTreeText(mOut, node, getCurrentIndentDepth() + 1); >+ mOut << "parameter: " << param->name() << " (" << param->getType() << ")"; >+ } > } > > bool TOutputTraverser::visitAggregate(Visit visit, TIntermAggregate *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > > if (node->getOp() == EOpNull) > { >@@ -379,14 +396,14 @@ bool TOutputTraverser::visitAggregate(Visit visit, TIntermAggregate *node) > switch (node->getOp()) > { > case EOpCallFunctionInAST: >- OutputFunction(mOut, "Call an user-defined function", node->getFunctionSymbolInfo()); >+ OutputFunction(mOut, "Call an user-defined function", node->getFunction()); > break; > case EOpCallInternalRawFunction: > OutputFunction(mOut, "Call an internal function with raw implementation", >- node->getFunctionSymbolInfo()); >+ node->getFunction()); > break; > case EOpCallBuiltInFunction: >- OutputFunction(mOut, "Call a built-in function", node->getFunctionSymbolInfo()); >+ OutputFunction(mOut, "Call a built-in function", node->getFunction()); > break; > > case EOpConstruct: >@@ -428,7 +445,7 @@ bool TOutputTraverser::visitAggregate(Visit visit, TIntermAggregate *node) > break; > } > >- mOut << " (" << node->getCompleteString() << ")"; >+ mOut << " (" << node->getType() << ")"; > > mOut << "\n"; > >@@ -437,7 +454,7 @@ bool TOutputTraverser::visitAggregate(Visit visit, TIntermAggregate *node) > > bool TOutputTraverser::visitBlock(Visit visit, TIntermBlock *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > mOut << "Code block\n"; > > return true; >@@ -445,7 +462,7 @@ bool TOutputTraverser::visitBlock(Visit visit, TIntermBlock *node) > > bool TOutputTraverser::visitDeclaration(Visit visit, TIntermDeclaration *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > mOut << "Declaration\n"; > > return true; >@@ -453,18 +470,18 @@ bool TOutputTraverser::visitDeclaration(Visit visit, TIntermDeclaration *node) > > bool TOutputTraverser::visitTernary(Visit visit, TIntermTernary *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > > mOut << "Ternary selection"; >- mOut << " (" << node->getCompleteString() << ")\n"; >+ mOut << " (" << node->getType() << ")\n"; > >- ++mDepth; >+ ++mIndentDepth; > >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > mOut << "Condition\n"; > node->getCondition()->traverse(this); > >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > if (node->getTrueExpression()) > { > mOut << "true case\n"; >@@ -472,29 +489,29 @@ bool TOutputTraverser::visitTernary(Visit visit, TIntermTernary *node) > } > if (node->getFalseExpression()) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > mOut << "false case\n"; > node->getFalseExpression()->traverse(this); > } > >- --mDepth; >+ --mIndentDepth; > > return false; > } > > bool TOutputTraverser::visitIfElse(Visit visit, TIntermIfElse *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > > mOut << "If test\n"; > >- ++mDepth; >+ ++mIndentDepth; > >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > mOut << "Condition\n"; > node->getCondition()->traverse(this); > >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > if (node->getTrueBlock()) > { > mOut << "true case\n"; >@@ -507,19 +524,19 @@ bool TOutputTraverser::visitIfElse(Visit visit, TIntermIfElse *node) > > if (node->getFalseBlock()) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > mOut << "false case\n"; > node->getFalseBlock()->traverse(this); > } > >- --mDepth; >+ --mIndentDepth; > > return false; > } > > bool TOutputTraverser::visitSwitch(Visit visit, TIntermSwitch *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > > mOut << "Switch\n"; > >@@ -528,7 +545,7 @@ bool TOutputTraverser::visitSwitch(Visit visit, TIntermSwitch *node) > > bool TOutputTraverser::visitCase(Visit visit, TIntermCase *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > > if (node->getCondition() == nullptr) > { >@@ -548,11 +565,11 @@ void TOutputTraverser::visitConstantUnion(TIntermConstantUnion *node) > > for (size_t i = 0; i < size; i++) > { >- OutputTreeText(mOut, node, mDepth); >- switch (node->getUnionArrayPointer()[i].getType()) >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); >+ switch (node->getConstantValue()[i].getType()) > { > case EbtBool: >- if (node->getUnionArrayPointer()[i].getBConst()) >+ if (node->getConstantValue()[i].getBConst()) > mOut << "true"; > else > mOut << "false"; >@@ -563,20 +580,20 @@ void TOutputTraverser::visitConstantUnion(TIntermConstantUnion *node) > mOut << "\n"; > break; > case EbtFloat: >- mOut << node->getUnionArrayPointer()[i].getFConst(); >+ mOut << node->getConstantValue()[i].getFConst(); > mOut << " (const float)\n"; > break; > case EbtInt: >- mOut << node->getUnionArrayPointer()[i].getIConst(); >+ mOut << node->getConstantValue()[i].getIConst(); > mOut << " (const int)\n"; > break; > case EbtUInt: >- mOut << node->getUnionArrayPointer()[i].getUConst(); >+ mOut << node->getConstantValue()[i].getUConst(); > mOut << " (const uint)\n"; > break; > case EbtYuvCscStandardEXT: > mOut << getYuvCscStandardEXTString( >- node->getUnionArrayPointer()[i].getYuvCscStandardEXTConst()); >+ node->getConstantValue()[i].getYuvCscStandardEXTConst()); > mOut << " (const yuvCscStandardEXT)\n"; > break; > default: >@@ -589,16 +606,16 @@ void TOutputTraverser::visitConstantUnion(TIntermConstantUnion *node) > > bool TOutputTraverser::visitLoop(Visit visit, TIntermLoop *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > > mOut << "Loop with condition "; > if (node->getType() == ELoopDoWhile) > mOut << "not "; > mOut << "tested first\n"; > >- ++mDepth; >+ ++mIndentDepth; > >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > if (node->getCondition()) > { > mOut << "Loop Condition\n"; >@@ -609,7 +626,7 @@ bool TOutputTraverser::visitLoop(Visit visit, TIntermLoop *node) > mOut << "No loop condition\n"; > } > >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > if (node->getBody()) > { > mOut << "Loop Body\n"; >@@ -622,19 +639,19 @@ bool TOutputTraverser::visitLoop(Visit visit, TIntermLoop *node) > > if (node->getExpression()) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > mOut << "Loop Terminal Expression\n"; > node->getExpression()->traverse(this); > } > >- --mDepth; >+ --mIndentDepth; > > return false; > } > > bool TOutputTraverser::visitBranch(Visit visit, TIntermBranch *node) > { >- OutputTreeText(mOut, node, mDepth); >+ OutputTreeText(mOut, node, getCurrentIndentDepth()); > > switch (node->getFlowOp()) > { >@@ -658,9 +675,9 @@ bool TOutputTraverser::visitBranch(Visit visit, TIntermBranch *node) > if (node->getExpression()) > { > mOut << " with expression\n"; >- ++mDepth; >+ ++mIndentDepth; > node->getExpression()->traverse(this); >- --mDepth; >+ --mIndentDepth; > } > else > { >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputVulkanGLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputVulkanGLSL.cpp >index 6d11deb8988..d7b9fbb2364 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputVulkanGLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputVulkanGLSL.cpp >@@ -11,6 +11,8 @@ > > #include "compiler/translator/OutputVulkanGLSL.h" > >+#include "compiler/translator/BaseTypes.h" >+#include "compiler/translator/Symbol.h" > #include "compiler/translator/util.h" > > namespace sh >@@ -34,8 +36,7 @@ TOutputVulkanGLSL::TOutputVulkanGLSL(TInfoSinkBase &objSink, > shaderVersion, > output, > compileOptions) >-{ >-} >+{} > > // TODO(jmadill): This is not complete. > void TOutputVulkanGLSL::writeLayoutQualifier(TIntermTyped *variable) >@@ -45,7 +46,7 @@ void TOutputVulkanGLSL::writeLayoutQualifier(TIntermTyped *variable) > bool needsCustomLayout = > (type.getQualifier() == EvqAttribute || type.getQualifier() == EvqFragmentOut || > type.getQualifier() == EvqVertexIn || IsVarying(type.getQualifier()) || >- IsSampler(type.getBasicType())); >+ IsSampler(type.getBasicType()) || type.isInterfaceBlock()); > > if (!NeedsToWriteLayoutQualifier(type) && !needsCustomLayout) > { >@@ -54,18 +55,19 @@ void TOutputVulkanGLSL::writeLayoutQualifier(TIntermTyped *variable) > > TInfoSinkBase &out = objSink(); > const TLayoutQualifier &layoutQualifier = type.getLayoutQualifier(); >- out << "layout("; > > // This isn't super clean, but it gets the job done. > // See corresponding code in GlslangWrapper.cpp. >- // TODO(jmadill): Ensure declarations are separated. >- > TIntermSymbol *symbol = variable->getAsSymbolNode(); > ASSERT(symbol); > > if (needsCustomLayout) > { >- out << "@@ LAYOUT-" << symbol->getName().getString() << " @@"; >+ out << "@@ LAYOUT-" << symbol->getName() << " @@"; >+ } >+ else >+ { >+ out << "layout("; > } > > if (IsImage(type.getBasicType()) && layoutQualifier.imageInternalFormat != EiifUnspecified) >@@ -74,7 +76,49 @@ void TOutputVulkanGLSL::writeLayoutQualifier(TIntermTyped *variable) > out << getImageInternalFormatString(layoutQualifier.imageInternalFormat); > } > >- out << ") "; >+ if (!needsCustomLayout) >+ { >+ out << ") "; >+ } > } > >+void TOutputVulkanGLSL::writeQualifier(TQualifier qualifier, const TSymbol *symbol) >+{ >+ if (qualifier != EvqUniform && qualifier != EvqVaryingIn && qualifier != EvqVaryingOut && >+ qualifier != EvqAttribute) >+ { >+ TOutputGLSLBase::writeQualifier(qualifier, symbol); >+ return; >+ } >+ >+ if (symbol == nullptr) >+ { >+ return; >+ } >+ >+ TInfoSinkBase &out = objSink(); >+ out << "@@ QUALIFIER-" << symbol->name().data() << " @@ "; >+} >+ >+void TOutputVulkanGLSL::writeVariableType(const TType &type, const TSymbol *symbol) >+{ >+ TType overrideType(type); >+ >+ // External textures are treated as 2D textures in the vulkan back-end >+ if (type.getBasicType() == EbtSamplerExternalOES) >+ { >+ overrideType.setBasicType(EbtSampler2D); >+ } >+ >+ TOutputGLSL::writeVariableType(overrideType, symbol); >+} >+ >+void TOutputVulkanGLSL::writeStructType(const TStructure *structure) >+{ >+ if (!structDeclared(structure)) >+ { >+ declareStruct(structure); >+ objSink() << ";\n"; >+ } >+} > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputVulkanGLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputVulkanGLSL.h >index 6e5da8b53eb..ef49c97abea 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputVulkanGLSL.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputVulkanGLSL.h >@@ -27,8 +27,12 @@ class TOutputVulkanGLSL : public TOutputGLSL > ShShaderOutput output, > ShCompileOptions compileOptions); > >+ void writeStructType(const TStructure *structure); >+ > protected: > void writeLayoutQualifier(TIntermTyped *variable) override; >+ void writeQualifier(TQualifier qualifier, const TSymbol *symbol) override; >+ void writeVariableType(const TType &type, const TSymbol *symbol) override; > }; > > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ParamType.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ParamType.h >deleted file mode 100644 >index dddb4e9901f..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ParamType.h >+++ /dev/null >@@ -1,102 +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. >-// >-// ParamType: >-// Helper type for built-in function emulator tables. Defines types for parameters. >- >-#ifndef COMPILER_TRANSLATOR_PARAMTYPE_H_ >-#define COMPILER_TRANSLATOR_PARAMTYPE_H_ >- >-#include "common/angleutils.h" >-#include "compiler/translator/BaseTypes.h" >- >-namespace sh >-{ >- >-enum class ParamType : uint8_t >-{ >- Void, >- Bool1, >- Bool2, >- Bool3, >- Bool4, >- Float1, >- Float2, >- Float3, >- Float4, >- Int1, >- Int2, >- Int3, >- Int4, >- Mat2, >- Mat3, >- Mat4, >- Uint1, >- Uint2, >- Uint3, >- Uint4, >- Last, >-}; >- >-struct ParamTypeInfo >-{ >- ParamType self; >- TBasicType basicType; >- int primarySize; >- int secondarySize; >-}; >- >-constexpr ParamTypeInfo g_ParamTypeInfo[] = { >- {ParamType::Void, EbtVoid, 1, 1}, {ParamType::Bool1, EbtBool, 1, 1}, >- {ParamType::Bool2, EbtBool, 2, 1}, {ParamType::Bool3, EbtBool, 3, 1}, >- {ParamType::Bool4, EbtBool, 4, 1}, {ParamType::Float1, EbtFloat, 1, 1}, >- {ParamType::Float2, EbtFloat, 2, 1}, {ParamType::Float3, EbtFloat, 3, 1}, >- {ParamType::Float4, EbtFloat, 4, 1}, {ParamType::Int1, EbtInt, 1, 1}, >- {ParamType::Int2, EbtInt, 2, 1}, {ParamType::Int3, EbtInt, 3, 1}, >- {ParamType::Int4, EbtInt, 4, 1}, {ParamType::Mat2, EbtFloat, 2, 2}, >- {ParamType::Mat3, EbtFloat, 3, 3}, {ParamType::Mat4, EbtFloat, 4, 4}, >- {ParamType::Uint1, EbtUInt, 1, 1}, {ParamType::Uint2, EbtUInt, 2, 1}, >- {ParamType::Uint3, EbtUInt, 3, 1}, {ParamType::Uint4, EbtUInt, 4, 1}, >-}; >- >-constexpr size_t ParamTypeIndex(ParamType paramType) >-{ >- return static_cast<size_t>(paramType); >-} >- >-constexpr size_t NumParamTypes() >-{ >- return ParamTypeIndex(ParamType::Last); >-} >- >-static_assert(ArraySize(g_ParamTypeInfo) == NumParamTypes(), "Invalid array size"); >- >-constexpr TBasicType GetBasicType(ParamType paramType) >-{ >- return g_ParamTypeInfo[ParamTypeIndex(paramType)].basicType; >-} >- >-constexpr int GetPrimarySize(ParamType paramType) >-{ >- return g_ParamTypeInfo[ParamTypeIndex(paramType)].primarySize; >-} >- >-constexpr int GetSecondarySize(ParamType paramType) >-{ >- return g_ParamTypeInfo[ParamTypeIndex(paramType)].secondarySize; >-} >- >-constexpr bool SameParamType(ParamType paramType, >- TBasicType basicType, >- int primarySize, >- int secondarySize) >-{ >- return GetBasicType(paramType) == basicType && primarySize == GetPrimarySize(paramType) && >- secondarySize == GetSecondarySize(paramType); >-} >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_PARAMTYPE_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.cpp >index d0a4f6aeb28..17f241f1af9 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.cpp >@@ -11,11 +11,13 @@ > > #include "common/mathutil.h" > #include "compiler/preprocessor/SourceLocation.h" >-#include "compiler/translator/Cache.h" >-#include "compiler/translator/IntermNode_util.h" >+#include "compiler/translator/Declarator.h" >+#include "compiler/translator/ParseContext_autogen.h" >+#include "compiler/translator/StaticType.h" > #include "compiler/translator/ValidateGlobalInitializer.h" > #include "compiler/translator/ValidateSwitch.h" > #include "compiler/translator/glslang.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" > #include "compiler/translator/util.h" > > namespace sh >@@ -32,22 +34,6 @@ namespace > > const int kWebGLMaxStructNesting = 4; > >-const std::array<const char *, 8> kAtomicBuiltin = {{"atomicAdd", "atomicMin", "atomicMax", >- "atomicAnd", "atomicOr", "atomicXor", >- "atomicExchange", "atomicCompSwap"}}; >- >-bool IsAtomicBuiltin(const TString &name) >-{ >- for (size_t i = 0; i < kAtomicBuiltin.size(); ++i) >- { >- if (name.compare(kAtomicBuiltin[i]) == 0) >- { >- return true; >- } >- } >- return false; >-} >- > bool ContainsSampler(const TStructure *structType); > > bool ContainsSampler(const TType &type) >@@ -87,7 +73,7 @@ const char *GetImageArgumentToken(TIntermTyped *imageNode) > TIntermSymbol *imageSymbol = imageNode->getAsSymbolNode(); > if (imageSymbol) > { >- return imageSymbol->getSymbol().c_str(); >+ return imageSymbol->getName().data(); > } > return "image"; > } >@@ -208,11 +194,8 @@ TParseContext::TParseContext(TSymbolTable &symt, > mShaderVersion, > mShaderType, > resources.WEBGL_debug_shader_precision == 1), >- mPreprocessor(mDiagnostics, &mDirectiveHandler, pp::PreprocessorSettings()), >+ mPreprocessor(mDiagnostics, &mDirectiveHandler, angle::pp::PreprocessorSettings(spec)), > mScanner(nullptr), >- mUsesFragData(false), >- mUsesFragColor(false), >- mUsesSecondaryOutputs(false), > mMinProgramTexelOffset(resources.MinProgramTexelOffset), > mMaxProgramTexelOffset(resources.MaxProgramTexelOffset), > mMinProgramTextureGatherOffset(resources.MinProgramTextureGatherOffset), >@@ -233,25 +216,21 @@ TParseContext::TParseContext(TSymbolTable &symt, > mGeometryShaderInvocations(0), > mGeometryShaderMaxVertices(-1), > mMaxGeometryShaderInvocations(resources.MaxGeometryShaderInvocations), >- mMaxGeometryShaderMaxVertices(resources.MaxGeometryOutputVertices), >- mGeometryShaderInputArraySize(0u) >-{ >-} >+ mMaxGeometryShaderMaxVertices(resources.MaxGeometryOutputVertices) >+{} > >-TParseContext::~TParseContext() >-{ >-} >+TParseContext::~TParseContext() {} > > bool TParseContext::parseVectorFields(const TSourceLoc &line, >- const TString &compString, >+ const ImmutableString &compString, > int vecSize, > TVector<int> *fieldOffsets) > { > ASSERT(fieldOffsets); >- size_t fieldCount = compString.size(); >+ size_t fieldCount = compString.length(); > if (fieldCount > 4u) > { >- error(line, "illegal vector field selection", compString.c_str()); >+ error(line, "illegal vector field selection", compString); > return false; > } > fieldOffsets->resize(fieldCount); >@@ -269,55 +248,55 @@ bool TParseContext::parseVectorFields(const TSourceLoc &line, > { > case 'x': > (*fieldOffsets)[i] = 0; >- fieldSet[i] = exyzw; >+ fieldSet[i] = exyzw; > break; > case 'r': > (*fieldOffsets)[i] = 0; >- fieldSet[i] = ergba; >+ fieldSet[i] = ergba; > break; > case 's': > (*fieldOffsets)[i] = 0; >- fieldSet[i] = estpq; >+ fieldSet[i] = estpq; > break; > case 'y': > (*fieldOffsets)[i] = 1; >- fieldSet[i] = exyzw; >+ fieldSet[i] = exyzw; > break; > case 'g': > (*fieldOffsets)[i] = 1; >- fieldSet[i] = ergba; >+ fieldSet[i] = ergba; > break; > case 't': > (*fieldOffsets)[i] = 1; >- fieldSet[i] = estpq; >+ fieldSet[i] = estpq; > break; > case 'z': > (*fieldOffsets)[i] = 2; >- fieldSet[i] = exyzw; >+ fieldSet[i] = exyzw; > break; > case 'b': > (*fieldOffsets)[i] = 2; >- fieldSet[i] = ergba; >+ fieldSet[i] = ergba; > break; > case 'p': > (*fieldOffsets)[i] = 2; >- fieldSet[i] = estpq; >+ fieldSet[i] = estpq; > break; > > case 'w': > (*fieldOffsets)[i] = 3; >- fieldSet[i] = exyzw; >+ fieldSet[i] = exyzw; > break; > case 'a': > (*fieldOffsets)[i] = 3; >- fieldSet[i] = ergba; >+ fieldSet[i] = ergba; > break; > case 'q': > (*fieldOffsets)[i] = 3; >- fieldSet[i] = estpq; >+ fieldSet[i] = estpq; > break; > default: >- error(line, "illegal vector field selection", compString.c_str()); >+ error(line, "illegal vector field selection", compString); > return false; > } > } >@@ -326,7 +305,7 @@ bool TParseContext::parseVectorFields(const TSourceLoc &line, > { > if ((*fieldOffsets)[i] >= vecSize) > { >- error(line, "vector field selection out of range", compString.c_str()); >+ error(line, "vector field selection out of range", compString); > return false; > } > >@@ -334,8 +313,7 @@ bool TParseContext::parseVectorFields(const TSourceLoc &line, > { > if (fieldSet[i] != fieldSet[i - 1]) > { >- error(line, "illegal - vector component fields not from the same set", >- compString.c_str()); >+ error(line, "illegal - vector component fields not from the same set", compString); > return false; > } > } >@@ -358,6 +336,11 @@ void TParseContext::error(const TSourceLoc &loc, const char *reason, const char > mDiagnostics->error(loc, reason, token); > } > >+void TParseContext::error(const TSourceLoc &loc, const char *reason, const ImmutableString &token) >+{ >+ mDiagnostics->error(loc, reason, token.data()); >+} >+ > void TParseContext::warning(const TSourceLoc &loc, const char *reason, const char *token) > { > mDiagnostics->warning(loc, reason, token); >@@ -381,25 +364,26 @@ void TParseContext::outOfRangeError(bool isError, > // > // Same error message for all places assignments don't work. > // >-void TParseContext::assignError(const TSourceLoc &line, const char *op, TString left, TString right) >+void TParseContext::assignError(const TSourceLoc &line, >+ const char *op, >+ const TType &left, >+ const TType &right) > { >- std::stringstream reasonStream; >+ TInfoSinkBase reasonStream; > reasonStream << "cannot convert from '" << right << "' to '" << left << "'"; >- std::string reason = reasonStream.str(); >- error(line, reason.c_str(), op); >+ error(line, reasonStream.c_str(), op); > } > > // > // Same error message for all places unary operations don't work. > // >-void TParseContext::unaryOpError(const TSourceLoc &line, const char *op, TString operand) >+void TParseContext::unaryOpError(const TSourceLoc &line, const char *op, const TType &operand) > { >- std::stringstream reasonStream; >+ TInfoSinkBase reasonStream; > reasonStream << "wrong operand type - no operation '" << op > << "' exists that takes an operand of type " << operand > << " (or there is no acceptable conversion)"; >- std::string reason = reasonStream.str(); >- error(line, reason.c_str(), op); >+ error(line, reasonStream.c_str(), op); > } > > // >@@ -407,16 +391,15 @@ void TParseContext::unaryOpError(const TSourceLoc &line, const char *op, TString > // > void TParseContext::binaryOpError(const TSourceLoc &line, > const char *op, >- TString left, >- TString right) >+ const TType &left, >+ const TType &right) > { >- std::stringstream reasonStream; >+ TInfoSinkBase reasonStream; > reasonStream << "wrong operand types - no operation '" << op > << "' exists that takes a left-hand operand of type '" << left > << "' and a right operand of type '" << right > << "' (or there is no acceptable conversion)"; >- std::string reason = reasonStream.str(); >- error(line, reason.c_str(), op); >+ error(line, reasonStream.c_str(), op); > } > > void TParseContext::checkPrecisionSpecified(const TSourceLoc &line, >@@ -453,14 +436,41 @@ void TParseContext::checkPrecisionSpecified(const TSourceLoc &line, > } > } > >+void TParseContext::markStaticReadIfSymbol(TIntermNode *node) >+{ >+ TIntermSwizzle *swizzleNode = node->getAsSwizzleNode(); >+ if (swizzleNode) >+ { >+ markStaticReadIfSymbol(swizzleNode->getOperand()); >+ return; >+ } >+ TIntermBinary *binaryNode = node->getAsBinaryNode(); >+ if (binaryNode) >+ { >+ switch (binaryNode->getOp()) >+ { >+ case EOpIndexDirect: >+ case EOpIndexIndirect: >+ case EOpIndexDirectStruct: >+ case EOpIndexDirectInterfaceBlock: >+ markStaticReadIfSymbol(binaryNode->getLeft()); >+ return; >+ default: >+ return; >+ } >+ } >+ TIntermSymbol *symbolNode = node->getAsSymbolNode(); >+ if (symbolNode) >+ { >+ symbolTable.markStaticRead(symbolNode->variable()); >+ } >+} >+ > // Both test and if necessary, spit out an error, to see if the node is really > // an l-value that can be operated on this way. > bool TParseContext::checkCanBeLValue(const TSourceLoc &line, const char *op, TIntermTyped *node) > { >- TIntermSymbol *symNode = node->getAsSymbolNode(); >- TIntermBinary *binaryNode = node->getAsBinaryNode(); > TIntermSwizzle *swizzleNode = node->getAsSwizzleNode(); >- > if (swizzleNode) > { > bool ok = checkCanBeLValue(line, op, swizzleNode->getOperand()); >@@ -472,6 +482,7 @@ bool TParseContext::checkCanBeLValue(const TSourceLoc &line, const char *op, TIn > return ok; > } > >+ TIntermBinary *binaryNode = node->getAsBinaryNode(); > if (binaryNode) > { > switch (binaryNode->getOp()) >@@ -480,6 +491,11 @@ bool TParseContext::checkCanBeLValue(const TSourceLoc &line, const char *op, TIn > case EOpIndexIndirect: > case EOpIndexDirectStruct: > case EOpIndexDirectInterfaceBlock: >+ if (node->getMemoryQualifier().readonly) >+ { >+ error(line, "can't modify a readonly variable", op); >+ return false; >+ } > return checkCanBeLValue(line, op, binaryNode->getLeft()); > default: > break; >@@ -587,37 +603,32 @@ bool TParseContext::checkCanBeLValue(const TSourceLoc &line, const char *op, TIn > } > } > >- if (message.empty() && binaryNode == 0 && symNode == 0) >+ ASSERT(binaryNode == nullptr && swizzleNode == nullptr); >+ TIntermSymbol *symNode = node->getAsSymbolNode(); >+ if (message.empty() && symNode != nullptr) > { >- error(line, "l-value required", op); >- >- return false; >- } >- >- // >- // Everything else is okay, no error. >- // >- if (message.empty()) >+ symbolTable.markStaticWrite(symNode->variable()); > return true; >- >- // >- // If we get here, we have an error and a message. >- // >- if (symNode) >- { >- const char *symbol = symNode->getSymbol().c_str(); >- std::stringstream reasonStream; >- reasonStream << "l-value required (" << message << " \"" << symbol << "\")"; >- std::string reason = reasonStream.str(); >- error(line, reason.c_str(), op); > } >- else >+ >+ std::stringstream reasonStream = sh::InitializeStream<std::stringstream>(); >+ reasonStream << "l-value required"; >+ if (!message.empty()) > { >- std::stringstream reasonStream; >- reasonStream << "l-value required (" << message << ")"; >- std::string reason = reasonStream.str(); >- error(line, reason.c_str(), op); >+ if (symNode) >+ { >+ // Symbol inside an expression can't be nameless. >+ ASSERT(symNode->variable().symbolType() != SymbolType::Empty); >+ const ImmutableString &symbol = symNode->getName(); >+ reasonStream << " (" << message << " \"" << symbol << "\")"; >+ } >+ else >+ { >+ reasonStream << " (" << message << ")"; >+ } > } >+ std::string reason = reasonStream.str(); >+ error(line, reason.c_str(), op); > > return false; > } >@@ -657,33 +668,33 @@ bool TParseContext::checkIsAtGlobalLevel(const TSourceLoc &line, const char *tok > // ESSL 3.00.5 sections 3.8 and 3.9. > // If it starts "gl_" or contains two consecutive underscores, it's reserved. > // Also checks for "webgl_" and "_webgl_" reserved identifiers if parsing a webgl shader. >-bool TParseContext::checkIsNotReserved(const TSourceLoc &line, const TString &identifier) >+bool TParseContext::checkIsNotReserved(const TSourceLoc &line, const ImmutableString &identifier) > { > static const char *reservedErrMsg = "reserved built-in name"; >- if (identifier.compare(0, 3, "gl_") == 0) >+ if (identifier.beginsWith("gl_")) > { > error(line, reservedErrMsg, "gl_"); > return false; > } > if (sh::IsWebGLBasedSpec(mShaderSpec)) > { >- if (identifier.compare(0, 6, "webgl_") == 0) >+ if (identifier.beginsWith("webgl_")) > { > error(line, reservedErrMsg, "webgl_"); > return false; > } >- if (identifier.compare(0, 7, "_webgl_") == 0) >+ if (identifier.beginsWith("_webgl_")) > { > error(line, reservedErrMsg, "_webgl_"); > return false; > } > } >- if (identifier.find("__") != TString::npos) >+ if (identifier.contains("__")) > { > error(line, > "identifiers containing two consecutive underscores (__) are reserved as " > "possible future keywords", >- identifier.c_str()); >+ identifier); > return false; > } > return true; >@@ -691,17 +702,18 @@ bool TParseContext::checkIsNotReserved(const TSourceLoc &line, const TString &id > > // Make sure the argument types are correct for constructing a specific type. > bool TParseContext::checkConstructorArguments(const TSourceLoc &line, >- const TIntermSequence *arguments, >+ const TIntermSequence &arguments, > const TType &type) > { >- if (arguments->empty()) >+ if (arguments.empty()) > { > error(line, "constructor does not have any arguments", "constructor"); > return false; > } > >- for (TIntermNode *arg : *arguments) >+ for (TIntermNode *arg : arguments) > { >+ markStaticReadIfSymbol(arg); > const TIntermTyped *argTyped = arg->getAsTyped(); > ASSERT(argTyped != nullptr); > if (type.getBasicType() != EbtStruct && IsOpaqueType(argTyped->getBasicType())) >@@ -727,14 +739,14 @@ bool TParseContext::checkConstructorArguments(const TSourceLoc &line, > { > // The size of an unsized constructor should already have been determined. > ASSERT(!type.isUnsizedArray()); >- if (static_cast<size_t>(type.getOutermostArraySize()) != arguments->size()) >+ if (static_cast<size_t>(type.getOutermostArraySize()) != arguments.size()) > { > error(line, "array constructor needs one argument per array element", "constructor"); > return false; > } > // GLSL ES 3.00 section 5.4.4: Each argument must be the same type as the element type of > // the array. >- for (TIntermNode *const &argNode : *arguments) >+ for (TIntermNode *const &argNode : arguments) > { > const TType &argType = argNode->getAsTyped()->getType(); > if (mShaderVersion < 310 && argType.isArray()) >@@ -752,7 +764,7 @@ bool TParseContext::checkConstructorArguments(const TSourceLoc &line, > else if (type.getBasicType() == EbtStruct) > { > const TFieldList &fields = type.getStruct()->fields(); >- if (fields.size() != arguments->size()) >+ if (fields.size() != arguments.size()) > { > error(line, > "Number of constructor parameters does not match the number of structure fields", >@@ -762,8 +774,8 @@ bool TParseContext::checkConstructorArguments(const TSourceLoc &line, > > for (size_t i = 0; i < fields.size(); i++) > { >- if (i >= arguments->size() || >- (*arguments)[i]->getAsTyped()->getType() != *fields[i]->type()) >+ if (i >= arguments.size() || >+ arguments[i]->getAsTyped()->getType() != *fields[i]->type()) > { > error(line, "Structure constructor arguments do not match structure fields", > "constructor"); >@@ -783,7 +795,7 @@ bool TParseContext::checkConstructorArguments(const TSourceLoc &line, > bool full = false; > bool overFull = false; > bool matrixArg = false; >- for (TIntermNode *arg : *arguments) >+ for (TIntermNode *arg : arguments) > { > const TIntermTyped *argTyped = arg->getAsTyped(); > ASSERT(argTyped != nullptr); >@@ -817,7 +829,7 @@ bool TParseContext::checkConstructorArguments(const TSourceLoc &line, > > if (type.isMatrix() && matrixArg) > { >- if (arguments->size() != 1) >+ if (arguments.size() != 1) > { > error(line, "constructing matrix from matrix can only take one argument", > "constructor"); >@@ -848,12 +860,12 @@ bool TParseContext::checkConstructorArguments(const TSourceLoc &line, > // returns true in case of an error > // > bool TParseContext::checkIsNonVoid(const TSourceLoc &line, >- const TString &identifier, >+ const ImmutableString &identifier, > const TBasicType &type) > { > if (type == EbtVoid) > { >- error(line, "illegal use of type 'void'", identifier.c_str()); >+ error(line, "illegal use of type 'void'", identifier); > return false; > } > >@@ -890,7 +902,7 @@ bool TParseContext::checkIsNotOpaqueType(const TSourceLoc &line, > { > if (ContainsSampler(pType.userDef)) > { >- std::stringstream reasonStream; >+ std::stringstream reasonStream = sh::InitializeStream<std::stringstream>(); > reasonStream << reason << " (structure contains a sampler)"; > std::string reasonStr = reasonStream.str(); > error(line, reasonStr.c_str(), getBasicString(pType.type)); >@@ -960,9 +972,10 @@ unsigned int TParseContext::checkIsValidArraySize(const TSourceLoc &line, TInter > { > TIntermConstantUnion *constant = expr->getAsConstantUnion(); > >- // TODO(oetuaho@nvidia.com): Get rid of the constant == nullptr check here once all constant >- // expressions can be folded. Right now we don't allow constant expressions that ANGLE can't >- // fold as array size. >+ // ANGLE should be able to fold any EvqConst expressions resulting in an integer - but to be >+ // safe against corner cases we still check for constant folding. Some interpretations of the >+ // spec have allowed constant expressions with side effects - like array length() method on a >+ // non-constant array. > if (expr->getQualifier() != EvqConst || constant == nullptr || !constant->isScalarInt()) > { > error(line, "array size must be a constant integer expression", ""); >@@ -1030,8 +1043,9 @@ bool TParseContext::checkArrayElementIsNotArray(const TSourceLoc &line, > { > if (mShaderVersion < 310 && elementType.isArray()) > { >- error(line, "cannot declare arrays of arrays", >- TType(elementType).getCompleteString().c_str()); >+ TInfoSinkBase typeString; >+ typeString << TType(elementType); >+ error(line, "cannot declare arrays of arrays", typeString.c_str()); > return false; > } > return true; >@@ -1053,11 +1067,18 @@ bool TParseContext::checkIsValidTypeAndQualifierForArray(const TSourceLoc &index > // In ESSL1.00 shaders, structs cannot be varying (section 4.3.5). This is checked elsewhere. > // In ESSL3.00 shaders, struct inputs/outputs are allowed but not arrays of structs (section > // 4.3.4). >+ // Geometry shader requires each user-defined input be declared as arrays or inside input >+ // blocks declared as arrays (GL_EXT_geometry_shader section 11.1gs.4.3). For the purposes of >+ // interface matching, such variables and blocks are treated as though they were not declared >+ // as arrays (GL_EXT_geometry_shader section 7.4.1). > if (mShaderVersion >= 300 && elementType.getBasicType() == EbtStruct && >- sh::IsVarying(elementType.qualifier)) >+ sh::IsVarying(elementType.qualifier) && >+ !IsGeometryShaderInput(mShaderType, elementType.qualifier)) > { >+ TInfoSinkBase typeString; >+ typeString << TType(elementType); > error(indexLocation, "cannot declare arrays of structs of this qualifier", >- TType(elementType).getCompleteString().c_str()); >+ typeString.c_str()); > return false; > } > return checkIsValidQualifierForArray(indexLocation, elementType); >@@ -1065,7 +1086,7 @@ bool TParseContext::checkIsValidTypeAndQualifierForArray(const TSourceLoc &index > > // Enforce non-initializer type/qualifier rules. > void TParseContext::checkCanBeDeclaredWithoutInitializer(const TSourceLoc &line, >- const TString &identifier, >+ const ImmutableString &identifier, > TType *type) > { > ASSERT(type != nullptr); >@@ -1081,16 +1102,16 @@ void TParseContext::checkCanBeDeclaredWithoutInitializer(const TSourceLoc &line, > error(line, > "structures containing arrays may not be declared constant since they cannot be " > "initialized", >- identifier.c_str()); >+ identifier); > } > else > { >- error(line, "variables with qualifier 'const' must be initialized", identifier.c_str()); >+ error(line, "variables with qualifier 'const' must be initialized", identifier); > } > } > // This will make the type sized if it isn't sized yet. >- checkIsNotUnsizedArray(line, "implicitly sized arrays need to be initialized", >- identifier.c_str(), type); >+ checkIsNotUnsizedArray(line, "implicitly sized arrays need to be initialized", identifier, >+ type); > } > > // Do some simple checks that are shared between all variable declarations, >@@ -1099,39 +1120,59 @@ void TParseContext::checkCanBeDeclaredWithoutInitializer(const TSourceLoc &line, > // Returns true if declaring the variable succeeded. > // > bool TParseContext::declareVariable(const TSourceLoc &line, >- const TString &identifier, >- const TType &type, >+ const ImmutableString &identifier, >+ const TType *type, > TVariable **variable) > { > ASSERT((*variable) == nullptr); > >- checkBindingIsValid(line, type); >+ (*variable) = new TVariable(&symbolTable, identifier, type, SymbolType::UserDefined); >+ >+ ASSERT(type->getLayoutQualifier().index == -1 || >+ (isExtensionEnabled(TExtension::EXT_blend_func_extended) && >+ mShaderType == GL_FRAGMENT_SHADER && mShaderVersion >= 300)); >+ if (type->getQualifier() == EvqFragmentOut) >+ { >+ if (type->getLayoutQualifier().index != -1 && type->getLayoutQualifier().location == -1) >+ { >+ error(line, >+ "If index layout qualifier is specified for a fragment output, location must " >+ "also be specified.", >+ "index"); >+ return false; >+ } >+ } >+ else >+ { >+ checkIndexIsNotSpecified(line, type->getLayoutQualifier().index); >+ } >+ >+ checkBindingIsValid(line, *type); > > bool needsReservedCheck = true; > > // gl_LastFragData may be redeclared with a new precision qualifier >- if (type.isArray() && identifier.compare(0, 15, "gl_LastFragData") == 0) >+ if (type->isArray() && identifier.beginsWith("gl_LastFragData")) > { > const TVariable *maxDrawBuffers = static_cast<const TVariable *>( >- symbolTable.findBuiltIn("gl_MaxDrawBuffers", mShaderVersion)); >- if (type.isArrayOfArrays()) >+ symbolTable.findBuiltIn(ImmutableString("gl_MaxDrawBuffers"), mShaderVersion)); >+ if (type->isArrayOfArrays()) > { >- error(line, "redeclaration of gl_LastFragData as an array of arrays", >- identifier.c_str()); >+ error(line, "redeclaration of gl_LastFragData as an array of arrays", identifier); > return false; > } >- else if (static_cast<int>(type.getOutermostArraySize()) == >+ else if (static_cast<int>(type->getOutermostArraySize()) == > maxDrawBuffers->getConstPointer()->getIConst()) > { >- if (TSymbol *builtInSymbol = symbolTable.findBuiltIn(identifier, mShaderVersion)) >+ if (const TSymbol *builtInSymbol = symbolTable.findBuiltIn(identifier, mShaderVersion)) > { >- needsReservedCheck = !checkCanUseExtension(line, builtInSymbol->getExtension()); >+ needsReservedCheck = !checkCanUseExtension(line, builtInSymbol->extension()); > } > } > else > { > error(line, "redeclaration of gl_LastFragData with size != gl_MaxDrawBuffers", >- identifier.c_str()); >+ identifier); > return false; > } > } >@@ -1139,14 +1180,13 @@ bool TParseContext::declareVariable(const TSourceLoc &line, > if (needsReservedCheck && !checkIsNotReserved(line, identifier)) > return false; > >- (*variable) = symbolTable.declareVariable(&identifier, type); >- if (!(*variable)) >+ if (!symbolTable.declare(*variable)) > { >- error(line, "redefinition", identifier.c_str()); >+ error(line, "redefinition", identifier); > return false; > } > >- if (!checkIsNonVoid(line, identifier, type.getBasicType())) >+ if (!checkIsNonVoid(line, identifier, type->getBasicType())) > return false; > > return true; >@@ -1262,14 +1302,6 @@ template bool TParseContext::checkCanUseOneOfExtensions( > bool TParseContext::checkCanUseExtension(const TSourceLoc &line, TExtension extension) > { > ASSERT(extension != TExtension::UNDEFINED); >- ASSERT(extension != TExtension::EXT_geometry_shader); >- if (extension == TExtension::OES_geometry_shader) >- { >- // OES_geometry_shader and EXT_geometry_shader are always interchangeable. >- constexpr std::array<TExtension, 2u> extensions{ >- {TExtension::EXT_geometry_shader, TExtension::OES_geometry_shader}}; >- return checkCanUseOneOfExtensions(line, extensions); >- } > return checkCanUseOneOfExtensions(line, std::array<TExtension, 1u>{{extension}}); > } > >@@ -1315,7 +1347,7 @@ void TParseContext::declarationQualifierErrorCheck(const sh::TQualifier qualifie > > // If multiview extension is enabled, "in" qualifier is allowed in the vertex shader in previous > // parsing steps. So it needs to be checked here. >- if (isExtensionEnabled(TExtension::OVR_multiview) && mShaderVersion < 300 && >+ if (isExtensionEnabled(TExtension::OVR_multiview2) && mShaderVersion < 300 && > qualifier == EvqVertexIn) > { > error(location, "storage qualifier supported in GLSL ES 3.00 and above only", "in"); >@@ -1361,6 +1393,11 @@ void TParseContext::emptyDeclarationErrorCheck(const TType &type, const TSourceL > // error. It is assumed that this applies to empty declarations as well. > error(location, "empty array declaration needs to specify a size", ""); > } >+ >+ if (type.getQualifier() != EvqFragmentOut) >+ { >+ checkIndexIsNotSpecified(location, type.getLayoutQualifier().index); >+ } > } > > // These checks are done for all declarations that are non-empty. They're done for non-empty >@@ -1542,13 +1579,13 @@ void TParseContext::checkBindingIsValid(const TSourceLoc &identifierLocation, co > } > > void TParseContext::checkLayoutQualifierSupported(const TSourceLoc &location, >- const TString &layoutQualifierName, >+ const ImmutableString &layoutQualifierName, > int versionRequired) > { > > if (mShaderVersion < versionRequired) > { >- error(location, "invalid layout qualifier: not supported", layoutQualifierName.c_str()); >+ error(location, "invalid layout qualifier: not supported", layoutQualifierName); > } > } > >@@ -1581,6 +1618,17 @@ void TParseContext::checkInternalFormatIsNotSpecified(const TSourceLoc &location > } > } > >+void TParseContext::checkIndexIsNotSpecified(const TSourceLoc &location, int index) >+{ >+ if (index != -1) >+ { >+ error(location, >+ "invalid layout qualifier: only valid when used with a fragment shader output in " >+ "ESSL version >= 3.00 and EXT_blend_func_extended is enabled", >+ "index"); >+ } >+} >+ > void TParseContext::checkBindingIsNotSpecified(const TSourceLoc &location, int binding) > { > if (binding != -1) >@@ -1679,17 +1727,22 @@ void TParseContext::functionCallRValueLValueErrorCheck(const TFunction *fnCandid > { > for (size_t i = 0; i < fnCandidate->getParamCount(); ++i) > { >- TQualifier qual = fnCandidate->getParam(i).type->getQualifier(); >+ TQualifier qual = fnCandidate->getParam(i)->getType().getQualifier(); > TIntermTyped *argument = (*(fnCall->getSequence()))[i]->getAsTyped(); >- if (!IsImage(argument->getBasicType()) && (IsQualifierUnspecified(qual) || qual == EvqIn || >- qual == EvqInOut || qual == EvqConstReadOnly)) >+ bool argumentIsRead = (IsQualifierUnspecified(qual) || qual == EvqIn || qual == EvqInOut || >+ qual == EvqConstReadOnly); >+ if (argumentIsRead) > { >- if (argument->getMemoryQualifier().writeonly) >+ markStaticReadIfSymbol(argument); >+ if (!IsImage(argument->getBasicType())) > { >- error(argument->getLine(), >- "Writeonly value cannot be passed for 'in' or 'inout' parameters.", >- fnCall->getFunctionSymbolInfo()->getName().c_str()); >- return; >+ if (argument->getMemoryQualifier().writeonly) >+ { >+ error(argument->getLine(), >+ "Writeonly value cannot be passed for 'in' or 'inout' parameters.", >+ fnCall->functionName()); >+ return; >+ } > } > } > if (qual == EvqOut || qual == EvqInOut) >@@ -1698,7 +1751,7 @@ void TParseContext::functionCallRValueLValueErrorCheck(const TFunction *fnCandid > { > error(argument->getLine(), > "Constant value cannot be passed for 'out' or 'inout' parameters.", >- fnCall->getFunctionSymbolInfo()->getName().c_str()); >+ fnCall->functionName()); > return; > } > } >@@ -1738,7 +1791,7 @@ void TParseContext::handleExtensionDirective(const TSourceLoc &loc, > const char *extName, > const char *behavior) > { >- pp::SourceLocation srcLoc; >+ angle::pp::SourceLocation srcLoc; > srcLoc.file = loc.first_file; > srcLoc.line = loc.first_line; > mDirectiveHandler.handleExtension(srcLoc, extName, behavior); >@@ -1749,7 +1802,7 @@ void TParseContext::handlePragmaDirective(const TSourceLoc &loc, > const char *value, > bool stdgl) > { >- pp::SourceLocation srcLoc; >+ angle::pp::SourceLocation srcLoc; > srcLoc.file = loc.first_file; > srcLoc.line = loc.first_line; > mDirectiveHandler.handlePragma(srcLoc, name, value, stdgl); >@@ -1788,62 +1841,31 @@ TIntermConstantUnion *TParseContext::addScalarLiteral(const TConstantUnion *cons > ///////////////////////////////////////////////////////////////////////////////// > > const TVariable *TParseContext::getNamedVariable(const TSourceLoc &location, >- const TString *name, >+ const ImmutableString &name, > const TSymbol *symbol) > { > if (!symbol) > { >- error(location, "undeclared identifier", name->c_str()); >+ error(location, "undeclared identifier", name); > return nullptr; > } > > if (!symbol->isVariable()) > { >- error(location, "variable expected", name->c_str()); >+ error(location, "variable expected", name); > return nullptr; > } > > const TVariable *variable = static_cast<const TVariable *>(symbol); > >- if (variable->getExtension() != TExtension::UNDEFINED) >- { >- checkCanUseExtension(location, variable->getExtension()); >- } >- >- // Reject shaders using both gl_FragData and gl_FragColor >- TQualifier qualifier = variable->getType().getQualifier(); >- if (qualifier == EvqFragData || qualifier == EvqSecondaryFragDataEXT) >- { >- mUsesFragData = true; >- } >- else if (qualifier == EvqFragColor || qualifier == EvqSecondaryFragColorEXT) >- { >- mUsesFragColor = true; >- } >- if (qualifier == EvqSecondaryFragDataEXT || qualifier == EvqSecondaryFragColorEXT) >- { >- mUsesSecondaryOutputs = true; >- } >- >- // This validation is not quite correct - it's only an error to write to >- // both FragData and FragColor. For simplicity, and because users shouldn't >- // be rewarded for reading from undefined varaibles, return an error >- // if they are both referenced, rather than assigned. >- if (mUsesFragData && mUsesFragColor) >+ if (variable->extension() != TExtension::UNDEFINED) > { >- const char *errorMessage = "cannot use both gl_FragData and gl_FragColor"; >- if (mUsesSecondaryOutputs) >- { >- errorMessage = >- "cannot use both output variable sets (gl_FragData, gl_SecondaryFragDataEXT)" >- " and (gl_FragColor, gl_SecondaryFragColorEXT)"; >- } >- error(location, errorMessage, name->c_str()); >+ checkCanUseExtension(location, variable->extension()); > } > > // GLSL ES 3.1 Revision 4, 7.1.3 Compute Shader Special Variables > if (getShaderType() == GL_COMPUTE_SHADER && !mComputeShaderLocalSizeDeclared && >- qualifier == EvqWorkGroupSize) >+ variable->getType().getQualifier() == EvqWorkGroupSize) > { > error(location, > "It is an error to use gl_WorkGroupSize before declaring the local group size", >@@ -1853,7 +1875,7 @@ const TVariable *TParseContext::getNamedVariable(const TSourceLoc &location, > } > > TIntermTyped *TParseContext::parseVariableIdentifier(const TSourceLoc &location, >- const TString *name, >+ const ImmutableString &name, > const TSymbol *symbol) > { > const TVariable *variable = getNamedVariable(location, name, symbol); >@@ -1866,9 +1888,9 @@ TIntermTyped *TParseContext::parseVariableIdentifier(const TSourceLoc &location, > } > > const TType &variableType = variable->getType(); >- TIntermTyped *node = nullptr; >+ TIntermTyped *node = nullptr; > >- if (variable->getConstPointer()) >+ if (variable->getConstPointer() && variableType.canReplaceWithConstantUnion()) > { > const TConstantUnion *constArray = variable->getConstPointer(); > node = new TIntermConstantUnion(constArray, variableType); >@@ -1894,14 +1916,12 @@ TIntermTyped *TParseContext::parseVariableIdentifier(const TSourceLoc &location, > else if ((mGeometryShaderInputPrimitiveType != EptUndefined) && > (variableType.getQualifier() == EvqPerVertexIn)) > { >- ASSERT(mGeometryShaderInputArraySize > 0u); >- >- node = new TIntermSymbol(variable->getUniqueId(), variable->getName(), variableType); >- node->getTypePointer()->sizeOutermostUnsizedArray(mGeometryShaderInputArraySize); >+ ASSERT(symbolTable.getGlInVariableWithArraySize() != nullptr); >+ node = new TIntermSymbol(symbolTable.getGlInVariableWithArraySize()); > } > else > { >- node = new TIntermSymbol(variable->getUniqueId(), variable->getName(), variableType); >+ node = new TIntermSymbol(variable); > } > ASSERT(node != nullptr); > node->setLine(location); >@@ -1913,32 +1933,55 @@ TIntermTyped *TParseContext::parseVariableIdentifier(const TSourceLoc &location, > // > // Returns true on success. > bool TParseContext::executeInitializer(const TSourceLoc &line, >- const TString &identifier, >- TType type, >+ const ImmutableString &identifier, >+ TType *type, > TIntermTyped *initializer, > TIntermBinary **initNode) > { > ASSERT(initNode != nullptr); > ASSERT(*initNode == nullptr); > >- TVariable *variable = nullptr; >- if (type.isUnsizedArray()) >+ if (type->isUnsizedArray()) > { > // In case initializer is not an array or type has more dimensions than initializer, this > // will default to setting array sizes to 1. We have not checked yet whether the initializer > // actually is an array or not. Having a non-array initializer for an unsized array will > // result in an error later, so we don't generate an error message here. > auto *arraySizes = initializer->getType().getArraySizes(); >- type.sizeUnsizedArrays(arraySizes); >+ type->sizeUnsizedArrays(arraySizes); >+ } >+ >+ const TQualifier qualifier = type->getQualifier(); >+ >+ bool constError = false; >+ if (qualifier == EvqConst) >+ { >+ if (EvqConst != initializer->getType().getQualifier()) >+ { >+ TInfoSinkBase reasonStream; >+ reasonStream << "assigning non-constant to '" << *type << "'"; >+ error(line, reasonStream.c_str(), "="); >+ >+ // We're still going to declare the variable to avoid extra error messages. >+ type->setQualifier(EvqTemporary); >+ constError = true; >+ } > } >+ >+ TVariable *variable = nullptr; > if (!declareVariable(line, identifier, type, &variable)) > { > return false; > } > >+ if (constError) >+ { >+ return false; >+ } >+ > bool globalInitWarning = false; > if (symbolTable.atGlobalLevel() && >- !ValidateGlobalInitializer(initializer, this, &globalInitWarning)) >+ !ValidateGlobalInitializer(initializer, mShaderVersion, &globalInitWarning)) > { > // Error message does not completely match behavior with ESSL 1.00, but > // we want to steer developers towards only using constant expressions. >@@ -1954,88 +1997,52 @@ bool TParseContext::executeInitializer(const TSourceLoc &line, > "="); > } > >- // > // identifier must be of type constant, a global, or a temporary >- // >- TQualifier qualifier = variable->getType().getQualifier(); > if ((qualifier != EvqTemporary) && (qualifier != EvqGlobal) && (qualifier != EvqConst)) > { > error(line, " cannot initialize this type of qualifier ", > variable->getType().getQualifierString()); > return false; > } >- // >- // test for and propagate constant >- // > >- if (qualifier == EvqConst) >+ TIntermSymbol *intermSymbol = new TIntermSymbol(variable); >+ intermSymbol->setLine(line); >+ >+ if (!binaryOpCommonCheck(EOpInitialize, intermSymbol, initializer, line)) > { >- if (qualifier != initializer->getType().getQualifier()) >- { >- std::stringstream reasonStream; >- reasonStream << "assigning non-constant to '" << variable->getType().getCompleteString() >- << "'"; >- std::string reason = reasonStream.str(); >- error(line, reason.c_str(), "="); >- variable->getType().setQualifier(EvqTemporary); >- return false; >- } >- if (type != initializer->getType()) >- { >- error(line, " non-matching types for const initializer ", >- variable->getType().getQualifierString()); >- variable->getType().setQualifier(EvqTemporary); >- return false; >- } >+ assignError(line, "=", variable->getType(), initializer->getType()); >+ return false; >+ } > >- // Save the constant folded value to the variable if possible. For example array >- // initializers are not folded, since that way copying the array literal to multiple places >- // in the shader is avoided. >- // TODO(oetuaho@nvidia.com): Consider constant folding array initialization in cases where >- // it would be beneficial. >- if (initializer->getAsConstantUnion()) >- { >- variable->shareConstPointer(initializer->getAsConstantUnion()->getUnionArrayPointer()); >- ASSERT(*initNode == nullptr); >- return true; >- } >- else if (initializer->getAsSymbolNode()) >+ if (qualifier == EvqConst) >+ { >+ // Save the constant folded value to the variable if possible. >+ const TConstantUnion *constArray = initializer->getConstantValue(); >+ if (constArray) > { >- const TSymbol *symbol = >- symbolTable.find(initializer->getAsSymbolNode()->getSymbol(), 0); >- const TVariable *tVar = static_cast<const TVariable *>(symbol); >- >- const TConstantUnion *constArray = tVar->getConstPointer(); >- if (constArray) >+ variable->shareConstPointer(constArray); >+ if (initializer->getType().canReplaceWithConstantUnion()) > { >- variable->shareConstPointer(constArray); > ASSERT(*initNode == nullptr); > return true; > } > } > } > >- TIntermSymbol *intermSymbol = >- new TIntermSymbol(variable->getUniqueId(), variable->getName(), variable->getType()); >- intermSymbol->setLine(line); >- *initNode = createAssign(EOpInitialize, intermSymbol, initializer, line); >- if (*initNode == nullptr) >- { >- assignError(line, "=", intermSymbol->getCompleteString(), initializer->getCompleteString()); >- return false; >- } >- >+ *initNode = new TIntermBinary(EOpInitialize, intermSymbol, initializer); >+ markStaticReadIfSymbol(initializer); >+ (*initNode)->setLine(line); > return true; > } > > TIntermNode *TParseContext::addConditionInitializer(const TPublicType &pType, >- const TString &identifier, >+ const ImmutableString &identifier, > TIntermTyped *initializer, > const TSourceLoc &loc) > { > checkIsScalarBool(loc, pType); > TIntermBinary *initNode = nullptr; >- TType type(pType); >+ TType *type = new TType(pType); > if (executeInitializer(loc, identifier, type, initializer, &initNode)) > { > // The initializer is valid. The init condition needs to have a node - either the >@@ -2066,8 +2073,19 @@ TIntermNode *TParseContext::addLoop(TLoopType type, > TIntermTyped *typedCond = nullptr; > if (cond) > { >+ markStaticReadIfSymbol(cond); > typedCond = cond->getAsTyped(); > } >+ if (expr) >+ { >+ markStaticReadIfSymbol(expr); >+ } >+ // In case the loop body was not parsed as a block and contains a statement that simply refers >+ // to a variable, we need to mark it as statically used. >+ if (body) >+ { >+ markStaticReadIfSymbol(body); >+ } > if (cond == nullptr || typedCond) > { > if (type == ELoopDoWhile) >@@ -2114,6 +2132,16 @@ TIntermNode *TParseContext::addIfElse(TIntermTyped *cond, > const TSourceLoc &loc) > { > bool isScalarBool = checkIsScalarBool(loc, cond); >+ // In case the conditional statements were not parsed as blocks and contain a statement that >+ // simply refers to a variable, we need to mark them as statically used. >+ if (code.node1) >+ { >+ markStaticReadIfSymbol(code.node1); >+ } >+ if (code.node2) >+ { >+ markStaticReadIfSymbol(code.node2); >+ } > > // For compile time constant conditions, prune the code now. > if (isScalarBool && cond->getAsConstantUnion()) >@@ -2129,6 +2157,7 @@ TIntermNode *TParseContext::addIfElse(TIntermTyped *cond, > } > > TIntermIfElse *node = new TIntermIfElse(cond, EnsureBlock(code.node1), EnsureBlock(code.node2)); >+ markStaticReadIfSymbol(cond); > node->setLine(loc); > > return node; >@@ -2298,7 +2327,7 @@ void TParseContext::checkLocalVariableConstStorageQualifier(const TQualifierWrap > { > error(storageQualifier.getLine(), > "Local variables can only use the const storage qualifier.", >- storageQualifier.getQualifierString().c_str()); >+ storageQualifier.getQualifierString()); > } > } > } >@@ -2337,11 +2366,6 @@ void TParseContext::checkAtomicCounterOffsetDoesNotOverlap(bool forceAppend, > const TSourceLoc &loc, > TType *type) > { >- if (!IsAtomicCounter(type->getBasicType())) >- { >- return; >- } >- > const size_t size = type->isArray() ? kAtomicCounterArrayStride * type->getArraySizeProduct() > : kAtomicCounterSize; > TLayoutQualifier layoutQualifier = type->getLayoutQualifier(); >@@ -2364,8 +2388,19 @@ void TParseContext::checkAtomicCounterOffsetDoesNotOverlap(bool forceAppend, > type->setLayoutQualifier(layoutQualifier); > } > >+void TParseContext::checkAtomicCounterOffsetAlignment(const TSourceLoc &location, const TType &type) >+{ >+ TLayoutQualifier layoutQualifier = type.getLayoutQualifier(); >+ >+ // OpenGL ES 3.1 Table 6.5, Atomic counter offset must be a multiple of 4 >+ if (layoutQualifier.offset % 4 != 0) >+ { >+ error(location, "Offset must be multiple of 4", "atomic counter"); >+ } >+} >+ > void TParseContext::checkGeometryShaderInputAndSetArraySize(const TSourceLoc &location, >- const char *token, >+ const ImmutableString &token, > TType *type) > { > if (IsGeometryShaderInput(mShaderType, type->getQualifier())) >@@ -2376,8 +2411,9 @@ void TParseContext::checkGeometryShaderInputAndSetArraySize(const TSourceLoc &lo > // input primitive declaration. > if (mGeometryShaderInputPrimitiveType != EptUndefined) > { >- ASSERT(mGeometryShaderInputArraySize > 0u); >- type->sizeOutermostUnsizedArray(mGeometryShaderInputArraySize); >+ ASSERT(symbolTable.getGlInVariableWithArraySize() != nullptr); >+ type->sizeOutermostUnsizedArray( >+ symbolTable.getGlInVariableWithArraySize()->getType().getOutermostArraySize()); > } > else > { >@@ -2404,13 +2440,13 @@ void TParseContext::checkGeometryShaderInputAndSetArraySize(const TSourceLoc &lo > TIntermDeclaration *TParseContext::parseSingleDeclaration( > TPublicType &publicType, > const TSourceLoc &identifierOrTypeLocation, >- const TString &identifier) >+ const ImmutableString &identifier) > { >- TType type(publicType); >+ TType *type = new TType(publicType); > if ((mCompileOptions & SH_FLATTEN_PRAGMA_STDGL_INVARIANT_ALL) && > mDirectiveHandler.pragma().stdgl.invariantAll) > { >- TQualifier qualifier = type.getQualifier(); >+ TQualifier qualifier = type->getQualifier(); > > // The directive handler has already taken care of rejecting invalid uses of this pragma > // (for example, in ESSL 3.00 fragment shaders), so at this point, flatten it into all >@@ -2430,27 +2466,29 @@ TIntermDeclaration *TParseContext::parseSingleDeclaration( > // behavior of the #pragma when specified in ESSL 1.00 fragment shaders. > if (qualifier == EvqVaryingOut || qualifier == EvqVertexOut || qualifier == EvqVaryingIn) > { >- type.setInvariant(true); >+ type->setInvariant(true); > } > } > >- checkGeometryShaderInputAndSetArraySize(identifierOrTypeLocation, identifier.c_str(), &type); >+ checkGeometryShaderInputAndSetArraySize(identifierOrTypeLocation, identifier, type); > > declarationQualifierErrorCheck(publicType.qualifier, publicType.layoutQualifier, > identifierOrTypeLocation); > >- bool emptyDeclaration = (identifier == ""); >+ bool emptyDeclaration = (identifier == ""); > mDeferredNonEmptyDeclarationErrorCheck = emptyDeclaration; > > TIntermSymbol *symbol = nullptr; > if (emptyDeclaration) > { >- emptyDeclarationErrorCheck(type, identifierOrTypeLocation); >+ emptyDeclarationErrorCheck(*type, identifierOrTypeLocation); > // In most cases we don't need to create a symbol node for an empty declaration. > // But if the empty declaration is declaring a struct type, the symbol node will store that. >- if (type.getBasicType() == EbtStruct) >+ if (type->getBasicType() == EbtStruct) > { >- symbol = new TIntermSymbol(symbolTable.getEmptySymbolId(), "", type); >+ TVariable *emptyVariable = >+ new TVariable(&symbolTable, kEmptyImmutableString, type, SymbolType::Empty); >+ symbol = new TIntermSymbol(emptyVariable); > } > else if (IsAtomicCounter(publicType.getBasicType())) > { >@@ -2461,16 +2499,19 @@ TIntermDeclaration *TParseContext::parseSingleDeclaration( > { > nonEmptyDeclarationErrorCheck(publicType, identifierOrTypeLocation); > >- checkCanBeDeclaredWithoutInitializer(identifierOrTypeLocation, identifier, &type); >+ checkCanBeDeclaredWithoutInitializer(identifierOrTypeLocation, identifier, type); > >- checkAtomicCounterOffsetDoesNotOverlap(false, identifierOrTypeLocation, &type); >+ if (IsAtomicCounter(type->getBasicType())) >+ { >+ checkAtomicCounterOffsetDoesNotOverlap(false, identifierOrTypeLocation, type); > >- TVariable *variable = nullptr; >- declareVariable(identifierOrTypeLocation, identifier, type, &variable); >+ checkAtomicCounterOffsetAlignment(identifierOrTypeLocation, *type); >+ } > >- if (variable) >+ TVariable *variable = nullptr; >+ if (declareVariable(identifierOrTypeLocation, identifier, type, &variable)) > { >- symbol = new TIntermSymbol(variable->getUniqueId(), identifier, type); >+ symbol = new TIntermSymbol(variable); > } > } > >@@ -2487,7 +2528,7 @@ TIntermDeclaration *TParseContext::parseSingleDeclaration( > TIntermDeclaration *TParseContext::parseSingleArrayDeclaration( > TPublicType &elementType, > const TSourceLoc &identifierLocation, >- const TString &identifier, >+ const ImmutableString &identifier, > const TSourceLoc &indexLocation, > const TVector<unsigned int> &arraySizes) > { >@@ -2500,24 +2541,27 @@ TIntermDeclaration *TParseContext::parseSingleArrayDeclaration( > > checkIsValidTypeAndQualifierForArray(indexLocation, elementType); > >- TType arrayType(elementType); >- arrayType.makeArrays(arraySizes); >+ TType *arrayType = new TType(elementType); >+ arrayType->makeArrays(arraySizes); > >- checkGeometryShaderInputAndSetArraySize(indexLocation, identifier.c_str(), &arrayType); >+ checkGeometryShaderInputAndSetArraySize(indexLocation, identifier, arrayType); > >- checkCanBeDeclaredWithoutInitializer(identifierLocation, identifier, &arrayType); >+ checkCanBeDeclaredWithoutInitializer(identifierLocation, identifier, arrayType); > >- checkAtomicCounterOffsetDoesNotOverlap(false, identifierLocation, &arrayType); >+ if (IsAtomicCounter(arrayType->getBasicType())) >+ { >+ checkAtomicCounterOffsetDoesNotOverlap(false, identifierLocation, arrayType); > >- TVariable *variable = nullptr; >- declareVariable(identifierLocation, identifier, arrayType, &variable); >+ checkAtomicCounterOffsetAlignment(identifierLocation, *arrayType); >+ } > > TIntermDeclaration *declaration = new TIntermDeclaration(); > declaration->setLine(identifierLocation); > >- if (variable) >+ TVariable *variable = nullptr; >+ if (declareVariable(identifierLocation, identifier, arrayType, &variable)) > { >- TIntermSymbol *symbol = new TIntermSymbol(variable->getUniqueId(), identifier, arrayType); >+ TIntermSymbol *symbol = new TIntermSymbol(variable); > symbol->setLine(identifierLocation); > declaration->appendDeclarator(symbol); > } >@@ -2527,7 +2571,7 @@ TIntermDeclaration *TParseContext::parseSingleArrayDeclaration( > > TIntermDeclaration *TParseContext::parseSingleInitDeclaration(const TPublicType &publicType, > const TSourceLoc &identifierLocation, >- const TString &identifier, >+ const ImmutableString &identifier, > const TSourceLoc &initLocation, > TIntermTyped *initializer) > { >@@ -2542,7 +2586,7 @@ TIntermDeclaration *TParseContext::parseSingleInitDeclaration(const TPublicType > declaration->setLine(identifierLocation); > > TIntermBinary *initNode = nullptr; >- TType type(publicType); >+ TType *type = new TType(publicType); > if (executeInitializer(identifierLocation, identifier, type, initializer, &initNode)) > { > if (initNode) >@@ -2556,7 +2600,7 @@ TIntermDeclaration *TParseContext::parseSingleInitDeclaration(const TPublicType > TIntermDeclaration *TParseContext::parseSingleArrayInitDeclaration( > TPublicType &elementType, > const TSourceLoc &identifierLocation, >- const TString &identifier, >+ const ImmutableString &identifier, > const TSourceLoc &indexLocation, > const TVector<unsigned int> &arraySizes, > const TSourceLoc &initLocation, >@@ -2571,8 +2615,8 @@ TIntermDeclaration *TParseContext::parseSingleArrayInitDeclaration( > > checkIsValidTypeAndQualifierForArray(indexLocation, elementType); > >- TType arrayType(elementType); >- arrayType.makeArrays(arraySizes); >+ TType *arrayType = new TType(elementType); >+ arrayType->makeArrays(arraySizes); > > TIntermDeclaration *declaration = new TIntermDeclaration(); > declaration->setLine(identifierLocation); >@@ -2593,14 +2637,14 @@ TIntermDeclaration *TParseContext::parseSingleArrayInitDeclaration( > TIntermInvariantDeclaration *TParseContext::parseInvariantDeclaration( > const TTypeQualifierBuilder &typeQualifierBuilder, > const TSourceLoc &identifierLoc, >- const TString *identifier, >+ const ImmutableString &identifier, > const TSymbol *symbol) > { > TTypeQualifier typeQualifier = typeQualifierBuilder.getVariableTypeQualifier(mDiagnostics); > > if (!typeQualifier.invariant) > { >- error(identifierLoc, "Expected invariant", identifier->c_str()); >+ error(identifierLoc, "Expected invariant", identifier); > return nullptr; > } > if (!checkIsAtGlobalLevel(identifierLoc, "invariant varying")) >@@ -2609,7 +2653,7 @@ TIntermInvariantDeclaration *TParseContext::parseInvariantDeclaration( > } > if (!symbol) > { >- error(identifierLoc, "undeclared identifier declared as invariant", identifier->c_str()); >+ error(identifierLoc, "undeclared identifier declared as invariant", identifier); > return nullptr; > } > if (!IsQualifierUnspecified(typeQualifier.qualifier)) >@@ -2638,9 +2682,9 @@ TIntermInvariantDeclaration *TParseContext::parseInvariantDeclaration( > typeQualifier.line); > checkMemoryQualifierIsNotSpecified(typeQualifier.memoryQualifier, typeQualifier.line); > >- symbolTable.addInvariantVarying(std::string(identifier->c_str())); >+ symbolTable.addInvariantVarying(*variable); > >- TIntermSymbol *intermSymbol = new TIntermSymbol(variable->getUniqueId(), *identifier, type); >+ TIntermSymbol *intermSymbol = new TIntermSymbol(variable); > intermSymbol->setLine(identifierLoc); > > return new TIntermInvariantDeclaration(intermSymbol, identifierLoc); >@@ -2648,7 +2692,7 @@ TIntermInvariantDeclaration *TParseContext::parseInvariantDeclaration( > > void TParseContext::parseDeclarator(TPublicType &publicType, > const TSourceLoc &identifierLocation, >- const TString &identifier, >+ const ImmutableString &identifier, > TIntermDeclaration *declarationOut) > { > // If the declaration starting this declarator list was empty (example: int,), some checks were >@@ -2661,20 +2705,23 @@ void TParseContext::parseDeclarator(TPublicType &publicType, > > checkDeclaratorLocationIsNotSpecified(identifierLocation, publicType); > >- TVariable *variable = nullptr; >- TType type(publicType); >+ TType *type = new TType(publicType); > >- checkGeometryShaderInputAndSetArraySize(identifierLocation, identifier.c_str(), &type); >+ checkGeometryShaderInputAndSetArraySize(identifierLocation, identifier, type); > >- checkCanBeDeclaredWithoutInitializer(identifierLocation, identifier, &type); >+ checkCanBeDeclaredWithoutInitializer(identifierLocation, identifier, type); > >- checkAtomicCounterOffsetDoesNotOverlap(true, identifierLocation, &type); >+ if (IsAtomicCounter(type->getBasicType())) >+ { >+ checkAtomicCounterOffsetDoesNotOverlap(true, identifierLocation, type); > >- declareVariable(identifierLocation, identifier, type, &variable); >+ checkAtomicCounterOffsetAlignment(identifierLocation, *type); >+ } > >- if (variable) >+ TVariable *variable = nullptr; >+ if (declareVariable(identifierLocation, identifier, type, &variable)) > { >- TIntermSymbol *symbol = new TIntermSymbol(variable->getUniqueId(), identifier, type); >+ TIntermSymbol *symbol = new TIntermSymbol(variable); > symbol->setLine(identifierLocation); > declarationOut->appendDeclarator(symbol); > } >@@ -2682,7 +2729,7 @@ void TParseContext::parseDeclarator(TPublicType &publicType, > > void TParseContext::parseArrayDeclarator(TPublicType &elementType, > const TSourceLoc &identifierLocation, >- const TString &identifier, >+ const ImmutableString &identifier, > const TSourceLoc &arrayLocation, > const TVector<unsigned int> &arraySizes, > TIntermDeclaration *declarationOut) >@@ -2699,22 +2746,24 @@ void TParseContext::parseArrayDeclarator(TPublicType &elementType, > > if (checkIsValidTypeAndQualifierForArray(arrayLocation, elementType)) > { >- TType arrayType(elementType); >- arrayType.makeArrays(arraySizes); >+ TType *arrayType = new TType(elementType); >+ arrayType->makeArrays(arraySizes); > >- checkGeometryShaderInputAndSetArraySize(identifierLocation, identifier.c_str(), &arrayType); >+ checkGeometryShaderInputAndSetArraySize(identifierLocation, identifier, arrayType); > >- checkCanBeDeclaredWithoutInitializer(identifierLocation, identifier, &arrayType); >+ checkCanBeDeclaredWithoutInitializer(identifierLocation, identifier, arrayType); > >- checkAtomicCounterOffsetDoesNotOverlap(true, identifierLocation, &arrayType); >+ if (IsAtomicCounter(arrayType->getBasicType())) >+ { >+ checkAtomicCounterOffsetDoesNotOverlap(true, identifierLocation, arrayType); > >- TVariable *variable = nullptr; >- declareVariable(identifierLocation, identifier, arrayType, &variable); >+ checkAtomicCounterOffsetAlignment(identifierLocation, *arrayType); >+ } > >- if (variable) >+ TVariable *variable = nullptr; >+ if (declareVariable(identifierLocation, identifier, arrayType, &variable)) > { >- TIntermSymbol *symbol = >- new TIntermSymbol(variable->getUniqueId(), identifier, arrayType); >+ TIntermSymbol *symbol = new TIntermSymbol(variable); > symbol->setLine(identifierLocation); > declarationOut->appendDeclarator(symbol); > } >@@ -2723,7 +2772,7 @@ void TParseContext::parseArrayDeclarator(TPublicType &elementType, > > void TParseContext::parseInitDeclarator(const TPublicType &publicType, > const TSourceLoc &identifierLocation, >- const TString &identifier, >+ const ImmutableString &identifier, > const TSourceLoc &initLocation, > TIntermTyped *initializer, > TIntermDeclaration *declarationOut) >@@ -2739,7 +2788,7 @@ void TParseContext::parseInitDeclarator(const TPublicType &publicType, > checkDeclaratorLocationIsNotSpecified(identifierLocation, publicType); > > TIntermBinary *initNode = nullptr; >- TType type(publicType); >+ TType *type = new TType(publicType); > if (executeInitializer(identifierLocation, identifier, type, initializer, &initNode)) > { > // >@@ -2754,7 +2803,7 @@ void TParseContext::parseInitDeclarator(const TPublicType &publicType, > > void TParseContext::parseArrayInitDeclarator(const TPublicType &elementType, > const TSourceLoc &identifierLocation, >- const TString &identifier, >+ const ImmutableString &identifier, > const TSourceLoc &indexLocation, > const TVector<unsigned int> &arraySizes, > const TSourceLoc &initLocation, >@@ -2773,8 +2822,8 @@ void TParseContext::parseArrayInitDeclarator(const TPublicType &elementType, > > checkIsValidTypeAndQualifierForArray(indexLocation, elementType); > >- TType arrayType(elementType); >- arrayType.makeArrays(arraySizes); >+ TType *arrayType = new TType(elementType); >+ arrayType->makeArrays(arraySizes); > > // initNode will correspond to the whole of "b[n] = initializer". > TIntermBinary *initNode = nullptr; >@@ -2854,11 +2903,7 @@ bool TParseContext::checkPrimitiveTypeMatchesTypeQualifier(const TTypeQualifier > void TParseContext::setGeometryShaderInputArraySize(unsigned int inputArraySize, > const TSourceLoc &line) > { >- if (mGeometryShaderInputArraySize == 0u) >- { >- mGeometryShaderInputArraySize = inputArraySize; >- } >- else if (mGeometryShaderInputArraySize != inputArraySize) >+ if (!symbolTable.setGlInArraySize(inputArraySize)) > { > error(line, > "Array size or input primitive declaration doesn't match the size of earlier sized " >@@ -2995,6 +3040,8 @@ void TParseContext::parseGlobalLayoutQualifier(const TTypeQualifierBuilder &type > return; > } > >+ checkIndexIsNotSpecified(typeQualifier.line, layoutQualifier.index); >+ > checkBindingIsNotSpecified(typeQualifier.line, layoutQualifier.binding); > > checkMemoryQualifierIsNotSpecified(typeQualifier.memoryQualifier, typeQualifier.line); >@@ -3031,7 +3078,7 @@ void TParseContext::parseGlobalLayoutQualifier(const TTypeQualifierBuilder &type > } > > const TVariable *maxComputeWorkGroupSize = static_cast<const TVariable *>( >- symbolTable.findBuiltIn("gl_MaxComputeWorkGroupSize", mShaderVersion)); >+ symbolTable.findBuiltIn(ImmutableString("gl_MaxComputeWorkGroupSize"), mShaderVersion)); > > const TConstantUnion *maxComputeWorkGroupSizeData = > maxComputeWorkGroupSize->getConstPointer(); >@@ -3045,7 +3092,7 @@ void TParseContext::parseGlobalLayoutQualifier(const TTypeQualifierBuilder &type > if (mComputeShaderLocalSize[i] < 1 || > mComputeShaderLocalSize[i] > maxComputeWorkGroupSizeValue) > { >- std::stringstream reasonStream; >+ std::stringstream reasonStream = sh::InitializeStream<std::stringstream>(); > reasonStream << "invalid value: Value must be at least 1 and no greater than " > << maxComputeWorkGroupSizeValue; > const std::string &reason = reasonStream.str(); >@@ -3085,7 +3132,7 @@ void TParseContext::parseGlobalLayoutQualifier(const TTypeQualifierBuilder &type > return; > } > } >- else if (isExtensionEnabled(TExtension::OVR_multiview) && >+ else if (isExtensionEnabled(TExtension::OVR_multiview2) && > typeQualifier.qualifier == EvqVertexIn) > { > // This error is only specified in WebGL, but tightens unspecified behavior in the native >@@ -3166,59 +3213,38 @@ TIntermFunctionPrototype *TParseContext::createPrototypeNodeFromFunction( > const TSourceLoc &location, > bool insertParametersToSymbolTable) > { >- checkIsNotReserved(location, function.getName()); >+ checkIsNotReserved(location, function.name()); > >- TIntermFunctionPrototype *prototype = >- new TIntermFunctionPrototype(function.getReturnType(), TSymbolUniqueId(function)); >- // TODO(oetuaho@nvidia.com): Instead of converting the function information here, the node could >- // point to the data that already exists in the symbol table. >- prototype->getFunctionSymbolInfo()->setFromFunction(function); >+ TIntermFunctionPrototype *prototype = new TIntermFunctionPrototype(&function); > prototype->setLine(location); > > for (size_t i = 0; i < function.getParamCount(); i++) > { >- const TConstParameter ¶m = function.getParam(i); >- >- TIntermSymbol *symbol = nullptr; >+ const TVariable *param = function.getParam(i); > > // If the parameter has no name, it's not an error, just don't add it to symbol table (could > // be used for unused args). >- if (param.name != nullptr) >+ if (param->symbolType() != SymbolType::Empty) > { >- // Insert the parameter in the symbol table. > if (insertParametersToSymbolTable) > { >- TVariable *variable = symbolTable.declareVariable(param.name, *param.type); >- if (variable) >- { >- symbol = new TIntermSymbol(variable->getUniqueId(), variable->getName(), >- variable->getType()); >- } >- else >+ if (!symbolTable.declare(const_cast<TVariable *>(param))) > { >- error(location, "redefinition", param.name->c_str()); >+ error(location, "redefinition", param->name()); > } > } > // Unsized type of a named parameter should have already been checked and sanitized. >- ASSERT(!param.type->isUnsizedArray()); >+ ASSERT(!param->getType().isUnsizedArray()); > } > else > { >- if (param.type->isUnsizedArray()) >+ if (param->getType().isUnsizedArray()) > { > error(location, "function parameter array must be sized at compile time", "[]"); > // We don't need to size the arrays since the parameter is unnamed and hence > // inaccessible. > } > } >- if (!symbol) >- { >- // The parameter had no name or declaring the symbol failed - either way, add a nameless >- // symbol. >- symbol = new TIntermSymbol(symbolTable.getEmptySymbolId(), "", *param.type); >- } >- symbol->setLine(location); >- prototype->appendParameter(symbol); > } > return prototype; > } >@@ -3230,21 +3256,19 @@ TIntermFunctionPrototype *TParseContext::addFunctionPrototypeDeclaration( > // Note: function found from the symbol table could be the same as parsedFunction if this is the > // first declaration. Either way the instance in the symbol table is used to track whether the > // function is declared multiple times. >- TFunction *function = static_cast<TFunction *>( >- symbolTable.find(parsedFunction.getMangledName(), getShaderVersion())); >- if (function->hasPrototypeDeclaration() && mShaderVersion == 100) >+ bool hadPrototypeDeclaration = false; >+ const TFunction *function = symbolTable.markFunctionHasPrototypeDeclaration( >+ parsedFunction.getMangledName(), &hadPrototypeDeclaration); >+ >+ if (hadPrototypeDeclaration && mShaderVersion == 100) > { > // ESSL 1.00.17 section 4.2.7. > // Doesn't apply to ESSL 3.00.4: see section 4.2.3. > error(location, "duplicate function prototype declarations are not allowed", "function"); > } >- function->setHasPrototypeDeclaration(); > >- // WebKit note: We currently pass true instead of false for the last parameter >- // here because some compilers have an issue with nameless parameters in function >- // declarations. > TIntermFunctionPrototype *prototype = >- createPrototypeNodeFromFunction(*function, location, true); >+ createPrototypeNodeFromFunction(*function, location, false); > > symbolTable.pop(); > >@@ -3265,8 +3289,8 @@ TIntermFunctionDefinition *TParseContext::addFunctionDefinition( > // Check that non-void functions have at least one return statement. > if (mCurrentFunctionType->getBasicType() != EbtVoid && !mFunctionReturnsValue) > { >- error(location, "function does not return a value:", >- functionPrototype->getFunctionSymbolInfo()->getName().c_str()); >+ error(location, >+ "function does not return a value:", functionPrototype->getFunction()->name()); > } > > if (functionBody == nullptr) >@@ -3283,49 +3307,23 @@ TIntermFunctionDefinition *TParseContext::addFunctionDefinition( > } > > void TParseContext::parseFunctionDefinitionHeader(const TSourceLoc &location, >- TFunction **function, >+ const TFunction *function, > TIntermFunctionPrototype **prototypeOut) > { > ASSERT(function); >- ASSERT(*function); >- const TSymbol *builtIn = >- symbolTable.findBuiltIn((*function)->getMangledName(), getShaderVersion()); > >- if (builtIn) >- { >- error(location, "built-in functions cannot be redefined", (*function)->getName().c_str()); >- } >- else >+ bool wasDefined = false; >+ function = symbolTable.setFunctionParameterNamesFromDefinition(function, &wasDefined); >+ if (wasDefined) > { >- TFunction *prevDec = static_cast<TFunction *>( >- symbolTable.find((*function)->getMangledName(), getShaderVersion())); >- >- // Note: 'prevDec' could be 'function' if this is the first time we've seen function as it >- // would have just been put in the symbol table. Otherwise, we're looking up an earlier >- // occurance. >- if (*function != prevDec) >- { >- // Swap the parameters of the previous declaration to the parameters of the function >- // definition (parameter names may differ). >- prevDec->swapParameters(**function); >- >- // The function definition will share the same symbol as any previous declaration. >- *function = prevDec; >- } >- >- if ((*function)->isDefined()) >- { >- error(location, "function already has a body", (*function)->getName().c_str()); >- } >- >- (*function)->setDefined(); >+ error(location, "function already has a body", function->name()); > } > > // Remember the return type for later checking for return statements. >- mCurrentFunctionType = &((*function)->getReturnType()); >+ mCurrentFunctionType = &(function->getReturnType()); > mFunctionReturnsValue = false; > >- *prototypeOut = createPrototypeNodeFromFunction(**function, location, true); >+ *prototypeOut = createPrototypeNodeFromFunction(*function, location, true); > setLoopNestingLevel(0); > } > >@@ -3336,33 +3334,48 @@ TFunction *TParseContext::parseFunctionDeclarator(const TSourceLoc &location, TF > // The definition production code will check for redefinitions. > // In the case of ESSL 1.00 the prototype production code will also check for redeclarations. > // >- // Return types and parameter qualifiers must match in all redeclarations, so those are checked >- // here. >- // >- TFunction *prevDec = >- static_cast<TFunction *>(symbolTable.find(function->getMangledName(), getShaderVersion())); > > for (size_t i = 0u; i < function->getParamCount(); ++i) > { >- auto ¶m = function->getParam(i); >- if (param.type->isStructSpecifier()) >+ const TVariable *param = function->getParam(i); >+ if (param->getType().isStructSpecifier()) > { > // ESSL 3.00.6 section 12.10. > error(location, "Function parameter type cannot be a structure definition", >- function->getName().c_str()); >+ function->name()); > } > } > >- if (getShaderVersion() >= 300 && >- symbolTable.hasUnmangledBuiltInForShaderVersion(function->getName().c_str(), >- getShaderVersion())) >+ if (getShaderVersion() >= 300) >+ { >+ const UnmangledBuiltIn *builtIn = >+ symbolTable.getUnmangledBuiltInForShaderVersion(function->name(), getShaderVersion()); >+ if (builtIn && >+ (builtIn->extension == TExtension::UNDEFINED || isExtensionEnabled(builtIn->extension))) >+ { >+ // With ESSL 3.00 and above, names of built-in functions cannot be redeclared as >+ // functions. Therefore overloading or redefining builtin functions is an error. >+ error(location, "Name of a built-in function cannot be redeclared as function", >+ function->name()); >+ } >+ } >+ else > { >- // With ESSL 3.00 and above, names of built-in functions cannot be redeclared as functions. >- // Therefore overloading or redefining builtin functions is an error. >- error(location, "Name of a built-in function cannot be redeclared as function", >- function->getName().c_str()); >+ // ESSL 1.00.17 section 4.2.6: built-ins can be overloaded but not redefined. We assume that >+ // this applies to redeclarations as well. >+ const TSymbol *builtIn = >+ symbolTable.findBuiltIn(function->getMangledName(), getShaderVersion()); >+ if (builtIn) >+ { >+ error(location, "built-in functions cannot be redefined", function->name()); >+ } > } >- else if (prevDec) >+ >+ // Return types and parameter qualifiers must match in all redeclarations, so those are checked >+ // here. >+ const TFunction *prevDec = >+ static_cast<const TFunction *>(symbolTable.findGlobal(function->getMangledName())); >+ if (prevDec) > { > if (prevDec->getReturnType() != function->getReturnType()) > { >@@ -3371,39 +3384,34 @@ TFunction *TParseContext::parseFunctionDeclarator(const TSourceLoc &location, TF > } > for (size_t i = 0; i < prevDec->getParamCount(); ++i) > { >- if (prevDec->getParam(i).type->getQualifier() != >- function->getParam(i).type->getQualifier()) >+ if (prevDec->getParam(i)->getType().getQualifier() != >+ function->getParam(i)->getType().getQualifier()) > { > error(location, > "function must have the same parameter qualifiers in all of its declarations", >- function->getParam(i).type->getQualifierString()); >+ function->getParam(i)->getType().getQualifierString()); > } > } > } > >- // > // Check for previously declared variables using the same name. >- // >- TSymbol *prevSym = symbolTable.find(function->getName(), getShaderVersion()); >+ const TSymbol *prevSym = symbolTable.find(function->name(), getShaderVersion()); >+ bool insertUnmangledName = true; > if (prevSym) > { > if (!prevSym->isFunction()) > { >- error(location, "redefinition of a function", function->getName().c_str()); >+ error(location, "redefinition of a function", function->name()); > } >+ insertUnmangledName = false; > } >- else >- { >- // Insert the unmangled name to detect potential future redefinition as a variable. >- symbolTable.getOuterLevel()->insertUnmangled(function); >- } >- >- // We're at the inner scope level of the function's arguments and body statement. >- // Add the function prototype to the surrounding scope instead. >- symbolTable.getOuterLevel()->insert(function); >+ // Parsing is at the inner scope level of the function's arguments and body statement at this >+ // point, but declareUserDefinedFunction takes care of declaring the function at the global >+ // scope. >+ symbolTable.declareUserDefinedFunction(function, insertUnmangledName); > > // Raise error message if main function takes any parameters or return anything other than void >- if (function->getName() == "main") >+ if (function->isMain()) > { > if (function->getParamCount() > 0) > { >@@ -3425,7 +3433,7 @@ TFunction *TParseContext::parseFunctionDeclarator(const TSourceLoc &location, TF > } > > TFunction *TParseContext::parseFunctionHeader(const TPublicType &type, >- const TString *name, >+ const ImmutableString &name, > const TSourceLoc &location) > { > if (type.qualifier != EvqGlobal && type.qualifier != EvqTemporary) >@@ -3450,22 +3458,24 @@ TFunction *TParseContext::parseFunctionHeader(const TPublicType &type, > if (type.isStructureContainingArrays()) > { > // ESSL 1.00.17 section 6.1 Function Definitions >+ TInfoSinkBase typeString; >+ typeString << TType(type); > error(location, "structures containing arrays can't be function return values", >- TType(type).getCompleteString().c_str()); >+ typeString.c_str()); > } > } > > // Add the function as a prototype after parsing it (we do not support recursion) >- return new TFunction(&symbolTable, name, new TType(type)); >+ return new TFunction(&symbolTable, name, SymbolType::UserDefined, new TType(type), false); > } > >-TFunction *TParseContext::addNonConstructorFunc(const TString *name, const TSourceLoc &loc) >+TFunctionLookup *TParseContext::addNonConstructorFunc(const ImmutableString &name, >+ const TSymbol *symbol) > { >- const TType *returnType = TCache::getType(EbtVoid, EbpUndefined); >- return new TFunction(&symbolTable, name, returnType); >+ return TFunctionLookup::CreateFunctionCall(name, symbol); > } > >-TFunction *TParseContext::addConstructorFunc(const TPublicType &publicType) >+TFunctionLookup *TParseContext::addConstructorFunc(const TPublicType &publicType) > { > if (mShaderVersion < 300 && publicType.isArray()) > { >@@ -3485,13 +3495,12 @@ TFunction *TParseContext::addConstructorFunc(const TPublicType &publicType) > getBasicString(publicType.getBasicType())); > type->setBasicType(EbtFloat); > } >- >- return new TFunction(&symbolTable, nullptr, type, EOpConstruct); >+ return TFunctionLookup::CreateConstructor(type); > } > > void TParseContext::checkIsNotUnsizedArray(const TSourceLoc &line, > const char *errorMessage, >- const char *token, >+ const ImmutableString &token, > TType *arrayType) > { > if (arrayType->isUnsizedArray()) >@@ -3502,30 +3511,29 @@ void TParseContext::checkIsNotUnsizedArray(const TSourceLoc &line, > } > > TParameter TParseContext::parseParameterDeclarator(TType *type, >- const TString *name, >+ const ImmutableString &name, > const TSourceLoc &nameLoc) > { > ASSERT(type); >- checkIsNotUnsizedArray(nameLoc, "function parameter array must specify a size", name->c_str(), >- type); >+ checkIsNotUnsizedArray(nameLoc, "function parameter array must specify a size", name, type); > if (type->getBasicType() == EbtVoid) > { >- error(nameLoc, "illegal use of type 'void'", name->c_str()); >+ error(nameLoc, "illegal use of type 'void'", name); > } >- checkIsNotReserved(nameLoc, *name); >- TParameter param = {name, type}; >+ checkIsNotReserved(nameLoc, name); >+ TParameter param = {name.data(), type}; > return param; > } > > TParameter TParseContext::parseParameterDeclarator(const TPublicType &publicType, >- const TString *name, >+ const ImmutableString &name, > const TSourceLoc &nameLoc) > { > TType *type = new TType(publicType); > return parseParameterDeclarator(type, name, nameLoc); > } > >-TParameter TParseContext::parseParameterArrayDeclarator(const TString *name, >+TParameter TParseContext::parseParameterArrayDeclarator(const ImmutableString &name, > const TSourceLoc &nameLoc, > const TVector<unsigned int> &arraySizes, > const TSourceLoc &arrayLoc, >@@ -3537,18 +3545,19 @@ TParameter TParseContext::parseParameterArrayDeclarator(const TString *name, > return parseParameterDeclarator(arrayType, name, nameLoc); > } > >-bool TParseContext::checkUnsizedArrayConstructorArgumentDimensionality(TIntermSequence *arguments, >- TType type, >- const TSourceLoc &line) >+bool TParseContext::checkUnsizedArrayConstructorArgumentDimensionality( >+ const TIntermSequence &arguments, >+ TType type, >+ const TSourceLoc &line) > { >- if (arguments->empty()) >+ if (arguments.empty()) > { > error(line, "implicitly sized array constructor must have at least one argument", "[]"); > return false; > } >- for (TIntermNode *arg : *arguments) >+ for (TIntermNode *arg : arguments) > { >- TIntermTyped *element = arg->getAsTyped(); >+ const TIntermTyped *element = arg->getAsTyped(); > ASSERT(element); > size_t dimensionalityFromElement = element->getType().getNumArraySizes() + 1u; > if (dimensionalityFromElement > type.getNumArraySizes()) >@@ -3581,10 +3590,10 @@ bool TParseContext::checkUnsizedArrayConstructorArgumentDimensionality(TIntermSe > // > // Returns a node to add to the tree regardless of if an error was generated or not. > // >-TIntermTyped *TParseContext::addConstructor(TIntermSequence *arguments, >- TType type, >- const TSourceLoc &line) >+TIntermTyped *TParseContext::addConstructor(TFunctionLookup *fnCall, const TSourceLoc &line) > { >+ TType type = fnCall->constructorType(); >+ TIntermSequence &arguments = fnCall->arguments(); > if (type.isUnsizedArray()) > { > if (!checkUnsizedArrayConstructorArgumentDimensionality(arguments, type, line)) >@@ -3592,11 +3601,11 @@ TIntermTyped *TParseContext::addConstructor(TIntermSequence *arguments, > type.sizeUnsizedArrays(nullptr); > return CreateZeroNode(type); > } >- TIntermTyped *firstElement = arguments->at(0)->getAsTyped(); >+ TIntermTyped *firstElement = arguments.at(0)->getAsTyped(); > ASSERT(firstElement); > if (type.getOutermostArraySize() == 0u) > { >- type.sizeOutermostUnsizedArray(static_cast<unsigned int>(arguments->size())); >+ type.sizeOutermostUnsizedArray(static_cast<unsigned int>(arguments.size())); > } > for (size_t i = 0; i < firstElement->getType().getNumArraySizes(); ++i) > { >@@ -3613,27 +3622,22 @@ TIntermTyped *TParseContext::addConstructor(TIntermSequence *arguments, > return CreateZeroNode(type); > } > >- TIntermAggregate *constructorNode = TIntermAggregate::CreateConstructor(type, arguments); >+ TIntermAggregate *constructorNode = TIntermAggregate::CreateConstructor(type, &arguments); > constructorNode->setLine(line); > >- // TODO(oetuaho@nvidia.com): Add support for folding array constructors. >- if (!constructorNode->isArray()) >- { >- return constructorNode->fold(mDiagnostics); >- } >- return constructorNode; >+ return constructorNode->fold(mDiagnostics); > } > > // > // Interface/uniform blocks >-// TODO(jiawei.shao@intel.com): implement GL_OES_shader_io_blocks. >+// TODO(jiawei.shao@intel.com): implement GL_EXT_shader_io_blocks. > // > TIntermDeclaration *TParseContext::addInterfaceBlock( > const TTypeQualifierBuilder &typeQualifierBuilder, > const TSourceLoc &nameLine, >- const TString &blockName, >+ const ImmutableString &blockName, > TFieldList *fieldList, >- const TString *instanceName, >+ const ImmutableString &instanceName, > const TSourceLoc &instanceLine, > TIntermTyped *arrayIndex, > const TSourceLoc &arrayIndexLine) >@@ -3672,6 +3676,8 @@ TIntermDeclaration *TParseContext::addInterfaceBlock( > arraySize = checkIsValidArraySize(arrayIndexLine, arrayIndex); > } > >+ checkIndexIsNotSpecified(typeQualifier.line, typeQualifier.layoutQualifier.index); >+ > if (mShaderVersion < 310) > { > checkBindingIsNotSpecified(typeQualifier.line, typeQualifier.layoutQualifier.binding); >@@ -3717,11 +3723,6 @@ TIntermDeclaration *TParseContext::addInterfaceBlock( > > checkInternalFormatIsNotSpecified(nameLine, blockLayoutQualifier.imageInternalFormat); > >- if (!symbolTable.declareInterfaceBlockName(&blockName)) >- { >- error(nameLine, "redefinition of an interface block name", blockName.c_str()); >- } >- > // check for sampler types and apply layout qualifiers > for (size_t memberIndex = 0; memberIndex < fieldList->size(); ++memberIndex) > { >@@ -3768,6 +3769,7 @@ TIntermDeclaration *TParseContext::addInterfaceBlock( > // check layout qualifiers > TLayoutQualifier fieldLayoutQualifier = fieldType->getLayoutQualifier(); > checkLocationIsNotSpecified(field->line(), fieldLayoutQualifier); >+ checkIndexIsNotSpecified(field->line(), fieldLayoutQualifier.index); > checkBindingIsNotSpecified(field->line(), fieldLayoutQualifier.binding); > > if (fieldLayoutQualifier.blockStorage != EbsUnspecified) >@@ -3795,7 +3797,7 @@ TIntermDeclaration *TParseContext::addInterfaceBlock( > // ESSL 3.10 spec section 4.1.9 allows for runtime-sized arrays. > checkIsNotUnsizedArray(field->line(), > "array members of interface blocks must specify a size", >- field->name().c_str(), field->type()); >+ field->name(), field->type()); > } > > if (typeQualifier.qualifier == EvqBuffer) >@@ -3817,77 +3819,72 @@ TIntermDeclaration *TParseContext::addInterfaceBlock( > } > } > >- TInterfaceBlock *interfaceBlock = >- new TInterfaceBlock(&blockName, fieldList, instanceName, blockLayoutQualifier); >- TType interfaceBlockType(interfaceBlock, typeQualifier.qualifier, blockLayoutQualifier); >+ TInterfaceBlock *interfaceBlock = new TInterfaceBlock( >+ &symbolTable, blockName, fieldList, blockLayoutQualifier, SymbolType::UserDefined); >+ if (!symbolTable.declare(interfaceBlock)) >+ { >+ error(nameLine, "redefinition of an interface block name", blockName); >+ } >+ >+ TType *interfaceBlockType = >+ new TType(interfaceBlock, typeQualifier.qualifier, blockLayoutQualifier); > if (arrayIndex != nullptr) > { >- interfaceBlockType.makeArray(arraySize); >+ interfaceBlockType->makeArray(arraySize); > } > >- TString symbolName = ""; >- const TSymbolUniqueId *symbolId = nullptr; >+ // The instance variable gets created to refer to the interface block type from the AST >+ // regardless of if there's an instance name. It's created as an empty symbol if there is no >+ // instance name. >+ TVariable *instanceVariable = >+ new TVariable(&symbolTable, instanceName, interfaceBlockType, >+ instanceName.empty() ? SymbolType::Empty : SymbolType::UserDefined); > >- if (!instanceName) >+ if (instanceVariable->symbolType() == SymbolType::Empty) > { > // define symbols for the members of the interface block > for (size_t memberIndex = 0; memberIndex < fieldList->size(); ++memberIndex) > { > TField *field = (*fieldList)[memberIndex]; >- TType *fieldType = field->type(); >+ TType *fieldType = new TType(*field->type()); > > // set parent pointer of the field variable > fieldType->setInterfaceBlock(interfaceBlock); > >- TVariable *fieldVariable = symbolTable.declareVariable(&field->name(), *fieldType); >+ fieldType->setQualifier(typeQualifier.qualifier); > >- if (fieldVariable) >- { >- fieldVariable->setQualifier(typeQualifier.qualifier); >- } >- else >+ TVariable *fieldVariable = >+ new TVariable(&symbolTable, field->name(), fieldType, SymbolType::UserDefined); >+ if (!symbolTable.declare(fieldVariable)) > { > error(field->line(), "redefinition of an interface block member name", >- field->name().c_str()); >+ field->name()); > } > } >- symbolId = &symbolTable.getEmptySymbolId(); > } > else > { >- checkIsNotReserved(instanceLine, *instanceName); >+ checkIsNotReserved(instanceLine, instanceName); > > // add a symbol for this interface block >- TVariable *instanceTypeDef = symbolTable.declareVariable(instanceName, interfaceBlockType); >- if (instanceTypeDef) >- { >- instanceTypeDef->setQualifier(typeQualifier.qualifier); >- symbolId = &instanceTypeDef->getUniqueId(); >- } >- else >+ if (!symbolTable.declare(instanceVariable)) > { >- error(instanceLine, "redefinition of an interface block instance name", >- instanceName->c_str()); >+ error(instanceLine, "redefinition of an interface block instance name", instanceName); > } >- symbolName = *instanceName; > } > >- TIntermDeclaration *declaration = nullptr; >- >- if (symbolId) >- { >- TIntermSymbol *blockSymbol = new TIntermSymbol(*symbolId, symbolName, interfaceBlockType); >- blockSymbol->setLine(typeQualifier.line); >- declaration = new TIntermDeclaration(); >- declaration->appendDeclarator(blockSymbol); >- declaration->setLine(nameLine); >- } >+ TIntermSymbol *blockSymbol = new TIntermSymbol(instanceVariable); >+ blockSymbol->setLine(typeQualifier.line); >+ TIntermDeclaration *declaration = new TIntermDeclaration(); >+ declaration->appendDeclarator(blockSymbol); >+ declaration->setLine(nameLine); > > exitStructDeclaration(); > return declaration; > } > >-void TParseContext::enterStructDeclaration(const TSourceLoc &line, const TString &identifier) >+void TParseContext::enterStructDeclaration(const TSourceLoc &line, >+ const ImmutableString &identifier) > { > ++mStructNestingLevel; > >@@ -3920,11 +3917,20 @@ void TParseContext::checkIsBelowStructNestingLimit(const TSourceLoc &line, const > // one to the field's struct nesting. > if (1 + field.type()->getDeepestStructNesting() > kWebGLMaxStructNesting) > { >- std::stringstream reasonStream; >- reasonStream << "Reference of struct type " << field.type()->getStruct()->name().c_str() >- << " exceeds maximum allowed nesting level of " << kWebGLMaxStructNesting; >+ std::stringstream reasonStream = sh::InitializeStream<std::stringstream>(); >+ if (field.type()->getStruct()->symbolType() == SymbolType::Empty) >+ { >+ // This may happen in case there are nested struct definitions. While they are also >+ // invalid GLSL, they don't cause a syntax error. >+ reasonStream << "Struct nesting"; >+ } >+ else >+ { >+ reasonStream << "Reference of struct type " << field.type()->getStruct()->name(); >+ } >+ reasonStream << " exceeds maximum allowed nesting level of " << kWebGLMaxStructNesting; > std::string reason = reasonStream.str(); >- error(line, reason.c_str(), field.name().c_str()); >+ error(line, reason.c_str(), field.name()); > return; > } > } >@@ -3941,7 +3947,7 @@ TIntermTyped *TParseContext::addIndexExpression(TIntermTyped *baseExpression, > if (baseExpression->getAsSymbolNode()) > { > error(location, " left of '[' is not of type array, matrix, or vector ", >- baseExpression->getAsSymbolNode()->getSymbol().c_str()); >+ baseExpression->getAsSymbolNode()->getName()); > } > else > { >@@ -3953,7 +3959,7 @@ TIntermTyped *TParseContext::addIndexExpression(TIntermTyped *baseExpression, > > if (baseExpression->getQualifier() == EvqPerVertexIn) > { >- ASSERT(mShaderType == GL_GEOMETRY_SHADER_OES); >+ ASSERT(mShaderType == GL_GEOMETRY_SHADER_EXT); > if (mGeometryShaderInputPrimitiveType == EptUndefined) > { > error(location, "missing input primitive declaration before indexing gl_in.", "["); >@@ -3963,15 +3969,15 @@ TIntermTyped *TParseContext::addIndexExpression(TIntermTyped *baseExpression, > > TIntermConstantUnion *indexConstantUnion = indexExpression->getAsConstantUnion(); > >- // TODO(oetuaho@nvidia.com): Get rid of indexConstantUnion == nullptr below once ANGLE is able >- // to constant fold all constant expressions. Right now we don't allow indexing interface blocks >- // or fragment outputs with expressions that ANGLE is not able to constant fold, even if the >- // index is a constant expression. >+ // ANGLE should be able to fold any constant expressions resulting in an integer - but to be >+ // safe we don't treat "EvqConst" that's evaluated according to the spec as being sufficient >+ // for constness. Some interpretations of the spec have allowed constant expressions with side >+ // effects - like array length() method on a non-constant array. > if (indexExpression->getQualifier() != EvqConst || indexConstantUnion == nullptr) > { > if (baseExpression->isInterfaceBlock()) > { >- // TODO(jiawei.shao@intel.com): implement GL_OES_shader_io_blocks. >+ // TODO(jiawei.shao@intel.com): implement GL_EXT_shader_io_blocks. > switch (baseExpression->getQualifier()) > { > case EvqPerVertexIn: >@@ -4041,25 +4047,29 @@ TIntermTyped *TParseContext::addIndexExpression(TIntermTyped *baseExpression, > safeIndex = 0; > } > } >- // Only do generic out-of-range check if similar error hasn't already been reported. >- if (safeIndex < 0) >+ } >+ // Only do generic out-of-range check if similar error hasn't already been reported. >+ if (safeIndex < 0) >+ { >+ if (baseExpression->isArray()) > { > safeIndex = checkIndexLessThan(outOfRangeIndexIsError, location, index, > baseExpression->getOutermostArraySize(), > "array index out of range"); > } >- } >- else if (baseExpression->isMatrix()) >- { >- safeIndex = checkIndexLessThan(outOfRangeIndexIsError, location, index, >- baseExpression->getType().getCols(), >- "matrix field selection out of range"); >- } >- else if (baseExpression->isVector()) >- { >- safeIndex = checkIndexLessThan(outOfRangeIndexIsError, location, index, >- baseExpression->getType().getNominalSize(), >- "vector field selection out of range"); >+ else if (baseExpression->isMatrix()) >+ { >+ safeIndex = checkIndexLessThan(outOfRangeIndexIsError, location, index, >+ baseExpression->getType().getCols(), >+ "matrix field selection out of range"); >+ } >+ else >+ { >+ ASSERT(baseExpression->isVector()); >+ safeIndex = checkIndexLessThan(outOfRangeIndexIsError, location, index, >+ baseExpression->getType().getNominalSize(), >+ "vector field selection out of range"); >+ } > } > > ASSERT(safeIndex >= 0); >@@ -4070,17 +4080,19 @@ TIntermTyped *TParseContext::addIndexExpression(TIntermTyped *baseExpression, > { > TConstantUnion *safeConstantUnion = new TConstantUnion(); > safeConstantUnion->setIConst(safeIndex); >- indexConstantUnion->replaceConstantUnion(safeConstantUnion); >- indexConstantUnion->getTypePointer()->setBasicType(EbtInt); >+ indexExpression = new TIntermConstantUnion( >+ safeConstantUnion, TType(EbtInt, indexExpression->getPrecision(), >+ indexExpression->getQualifier())); > } > > TIntermBinary *node = > new TIntermBinary(EOpIndexDirect, baseExpression, indexExpression); > node->setLine(location); >- return node->fold(mDiagnostics); >+ return expressionOrFoldedResult(node); > } > } > >+ markStaticReadIfSymbol(indexExpression); > TIntermBinary *node = new TIntermBinary(EOpIndexIndirect, baseExpression, indexExpression); > node->setLine(location); > // Indirect indexing can never be constant folded. >@@ -4095,9 +4107,11 @@ int TParseContext::checkIndexLessThan(bool outOfRangeIndexIsError, > { > // Should not reach here with an unsized / runtime-sized array. > ASSERT(arraySize > 0); >+ // A negative index should already have been checked. >+ ASSERT(index >= 0); > if (index >= arraySize) > { >- std::stringstream reasonStream; >+ std::stringstream reasonStream = sh::InitializeStream<std::stringstream>(); > reasonStream << reason << " '" << index << "'"; > std::string token = reasonStream.str(); > outOfRangeError(outOfRangeIndexIsError, location, reason, "[]"); >@@ -4108,7 +4122,7 @@ int TParseContext::checkIndexLessThan(bool outOfRangeIndexIsError, > > TIntermTyped *TParseContext::addFieldSelectionExpression(TIntermTyped *baseExpression, > const TSourceLoc &dotLocation, >- const TString &fieldString, >+ const ImmutableString &fieldString, > const TSourceLoc &fieldLocation) > { > if (baseExpression->isArray()) >@@ -4129,7 +4143,7 @@ TIntermTyped *TParseContext::addFieldSelectionExpression(TIntermTyped *baseExpre > TIntermSwizzle *node = new TIntermSwizzle(baseExpression, fieldOffsets); > node->setLine(dotLocation); > >- return node->fold(); >+ return node->fold(mDiagnostics); > } > else if (baseExpression->getBasicType() == EbtStruct) > { >@@ -4158,11 +4172,11 @@ TIntermTyped *TParseContext::addFieldSelectionExpression(TIntermTyped *baseExpre > TIntermBinary *node = > new TIntermBinary(EOpIndexDirectStruct, baseExpression, index); > node->setLine(dotLocation); >- return node->fold(mDiagnostics); >+ return expressionOrFoldedResult(node); > } > else > { >- error(dotLocation, " no such field in structure", fieldString.c_str()); >+ error(dotLocation, " no such field in structure", fieldString); > return baseExpression; > } > } >@@ -4199,7 +4213,7 @@ TIntermTyped *TParseContext::addFieldSelectionExpression(TIntermTyped *baseExpre > } > else > { >- error(dotLocation, " no such field in interface block", fieldString.c_str()); >+ error(dotLocation, " no such field in interface block", fieldString); > return baseExpression; > } > } >@@ -4209,20 +4223,20 @@ TIntermTyped *TParseContext::addFieldSelectionExpression(TIntermTyped *baseExpre > if (mShaderVersion < 300) > { > error(dotLocation, " field selection requires structure or vector on left hand side", >- fieldString.c_str()); >+ fieldString); > } > else > { > error(dotLocation, > " field selection requires structure, vector, or interface block on left hand " > "side", >- fieldString.c_str()); >+ fieldString); > } > return baseExpression; > } > } > >-TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &qualifierType, >+TLayoutQualifier TParseContext::parseLayoutQualifier(const ImmutableString &qualifierType, > const TSourceLoc &qualifierTypeLine) > { > TLayoutQualifier qualifier = TLayoutQualifier::Create(); >@@ -4263,7 +4277,7 @@ TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &qualifierTyp > else if (qualifierType == "location") > { > error(qualifierTypeLine, "invalid layout qualifier: location requires an argument", >- qualifierType.c_str()); >+ qualifierType); > } > else if (qualifierType == "yuv" && mShaderType == GL_FRAGMENT_SHADER) > { >@@ -4337,44 +4351,44 @@ TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &qualifierTyp > checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310); > qualifier.imageInternalFormat = EiifR32UI; > } >- else if (qualifierType == "points" && mShaderType == GL_GEOMETRY_SHADER_OES && >- checkCanUseExtension(qualifierTypeLine, TExtension::OES_geometry_shader)) >+ else if (qualifierType == "points" && mShaderType == GL_GEOMETRY_SHADER_EXT && >+ checkCanUseExtension(qualifierTypeLine, TExtension::EXT_geometry_shader)) > { > checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310); > qualifier.primitiveType = EptPoints; > } >- else if (qualifierType == "lines" && mShaderType == GL_GEOMETRY_SHADER_OES && >- checkCanUseExtension(qualifierTypeLine, TExtension::OES_geometry_shader)) >+ else if (qualifierType == "lines" && mShaderType == GL_GEOMETRY_SHADER_EXT && >+ checkCanUseExtension(qualifierTypeLine, TExtension::EXT_geometry_shader)) > { > checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310); > qualifier.primitiveType = EptLines; > } >- else if (qualifierType == "lines_adjacency" && mShaderType == GL_GEOMETRY_SHADER_OES && >- checkCanUseExtension(qualifierTypeLine, TExtension::OES_geometry_shader)) >+ else if (qualifierType == "lines_adjacency" && mShaderType == GL_GEOMETRY_SHADER_EXT && >+ checkCanUseExtension(qualifierTypeLine, TExtension::EXT_geometry_shader)) > { > checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310); > qualifier.primitiveType = EptLinesAdjacency; > } >- else if (qualifierType == "triangles" && mShaderType == GL_GEOMETRY_SHADER_OES && >- checkCanUseExtension(qualifierTypeLine, TExtension::OES_geometry_shader)) >+ else if (qualifierType == "triangles" && mShaderType == GL_GEOMETRY_SHADER_EXT && >+ checkCanUseExtension(qualifierTypeLine, TExtension::EXT_geometry_shader)) > { > checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310); > qualifier.primitiveType = EptTriangles; > } >- else if (qualifierType == "triangles_adjacency" && mShaderType == GL_GEOMETRY_SHADER_OES && >- checkCanUseExtension(qualifierTypeLine, TExtension::OES_geometry_shader)) >+ else if (qualifierType == "triangles_adjacency" && mShaderType == GL_GEOMETRY_SHADER_EXT && >+ checkCanUseExtension(qualifierTypeLine, TExtension::EXT_geometry_shader)) > { > checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310); > qualifier.primitiveType = EptTrianglesAdjacency; > } >- else if (qualifierType == "line_strip" && mShaderType == GL_GEOMETRY_SHADER_OES && >- checkCanUseExtension(qualifierTypeLine, TExtension::OES_geometry_shader)) >+ else if (qualifierType == "line_strip" && mShaderType == GL_GEOMETRY_SHADER_EXT && >+ checkCanUseExtension(qualifierTypeLine, TExtension::EXT_geometry_shader)) > { > checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310); > qualifier.primitiveType = EptLineStrip; > } >- else if (qualifierType == "triangle_strip" && mShaderType == GL_GEOMETRY_SHADER_OES && >- checkCanUseExtension(qualifierTypeLine, TExtension::OES_geometry_shader)) >+ else if (qualifierType == "triangle_strip" && mShaderType == GL_GEOMETRY_SHADER_EXT && >+ checkCanUseExtension(qualifierTypeLine, TExtension::EXT_geometry_shader)) > { > checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310); > qualifier.primitiveType = EptTriangleStrip; >@@ -4382,13 +4396,13 @@ TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &qualifierTyp > > else > { >- error(qualifierTypeLine, "invalid layout qualifier", qualifierType.c_str()); >+ error(qualifierTypeLine, "invalid layout qualifier", qualifierType); > } > > return qualifier; > } > >-void TParseContext::parseLocalSize(const TString &qualifierType, >+void TParseContext::parseLocalSize(const ImmutableString &qualifierType, > const TSourceLoc &qualifierTypeLine, > int intValue, > const TSourceLoc &intValueLine, >@@ -4399,7 +4413,7 @@ void TParseContext::parseLocalSize(const TString &qualifierType, > checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310); > if (intValue < 1) > { >- std::stringstream reasonStream; >+ std::stringstream reasonStream = sh::InitializeStream<std::stringstream>(); > reasonStream << "out of range: " << getWorkGroupSizeString(index) << " must be positive"; > std::string reason = reasonStream.str(); > error(intValueLine, reason.c_str(), intValueString.c_str()); >@@ -4461,7 +4475,27 @@ void TParseContext::parseMaxVertices(int intValue, > } > } > >-TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &qualifierType, >+void TParseContext::parseIndexLayoutQualifier(int intValue, >+ const TSourceLoc &intValueLine, >+ const std::string &intValueString, >+ int *index) >+{ >+ // EXT_blend_func_extended specifies that most validation should happen at link time, but since >+ // we're validating output variable locations at compile time, it makes sense to validate that >+ // index is 0 or 1 also at compile time. Also since we use "-1" as a placeholder for unspecified >+ // index, we can't accept it here. >+ if (intValue < 0 || intValue > 1) >+ { >+ error(intValueLine, "out of range: index layout qualifier can only be 0 or 1", >+ intValueString.c_str()); >+ } >+ else >+ { >+ *index = intValue; >+ } >+} >+ >+TLayoutQualifier TParseContext::parseLayoutQualifier(const ImmutableString &qualifierType, > const TSourceLoc &qualifierTypeLine, > int intValue, > const TSourceLoc &intValueLine) >@@ -4527,25 +4561,29 @@ TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &qualifierTyp > } > else if (qualifierType == "num_views" && mShaderType == GL_VERTEX_SHADER) > { >- if (checkCanUseExtension(qualifierTypeLine, TExtension::OVR_multiview)) >+ if (checkCanUseExtension(qualifierTypeLine, TExtension::OVR_multiview2)) > { > parseNumViews(intValue, intValueLine, intValueString, &qualifier.numViews); > } > } >- else if (qualifierType == "invocations" && mShaderType == GL_GEOMETRY_SHADER_OES && >- checkCanUseExtension(qualifierTypeLine, TExtension::OES_geometry_shader)) >+ else if (qualifierType == "invocations" && mShaderType == GL_GEOMETRY_SHADER_EXT && >+ checkCanUseExtension(qualifierTypeLine, TExtension::EXT_geometry_shader)) > { > parseInvocations(intValue, intValueLine, intValueString, &qualifier.invocations); > } >- else if (qualifierType == "max_vertices" && mShaderType == GL_GEOMETRY_SHADER_OES && >- checkCanUseExtension(qualifierTypeLine, TExtension::OES_geometry_shader)) >+ else if (qualifierType == "max_vertices" && mShaderType == GL_GEOMETRY_SHADER_EXT && >+ checkCanUseExtension(qualifierTypeLine, TExtension::EXT_geometry_shader)) > { > parseMaxVertices(intValue, intValueLine, intValueString, &qualifier.maxVertices); > } >- >+ else if (qualifierType == "index" && mShaderType == GL_FRAGMENT_SHADER && >+ checkCanUseExtension(qualifierTypeLine, TExtension::EXT_blend_func_extended)) >+ { >+ parseIndexLayoutQualifier(intValue, intValueLine, intValueString, &qualifier.index); >+ } > else > { >- error(qualifierTypeLine, "invalid layout qualifier", qualifierType.c_str()); >+ error(qualifierTypeLine, "invalid layout qualifier", qualifierType); > } > > return qualifier; >@@ -4585,7 +4623,7 @@ TStorageQualifierWrapper *TParseContext::parseInQualifier(const TSourceLoc &loc) > { > case GL_VERTEX_SHADER: > { >- if (mShaderVersion < 300 && !isExtensionEnabled(TExtension::OVR_multiview)) >+ if (mShaderVersion < 300 && !isExtensionEnabled(TExtension::OVR_multiview2)) > { > error(loc, "storage qualifier supported in GLSL ES 3.00 and above only", "in"); > } >@@ -4603,7 +4641,7 @@ TStorageQualifierWrapper *TParseContext::parseInQualifier(const TSourceLoc &loc) > { > return new TStorageQualifierWrapper(EvqComputeIn, loc); > } >- case GL_GEOMETRY_SHADER_OES: >+ case GL_GEOMETRY_SHADER_EXT: > { > return new TStorageQualifierWrapper(EvqGeometryIn, loc); > } >@@ -4644,7 +4682,7 @@ TStorageQualifierWrapper *TParseContext::parseOutQualifier(const TSourceLoc &loc > error(loc, "storage qualifier isn't supported in compute shaders", "out"); > return new TStorageQualifierWrapper(EvqLast, loc); > } >- case GL_GEOMETRY_SHADER_OES: >+ case GL_GEOMETRY_SHADER_EXT: > { > return new TStorageQualifierWrapper(EvqGeometryOut, loc); > } >@@ -4673,36 +4711,31 @@ TLayoutQualifier TParseContext::joinLayoutQualifiers(TLayoutQualifier leftQualif > mDiagnostics); > } > >-TField *TParseContext::parseStructDeclarator(TString *identifier, const TSourceLoc &loc) >+TDeclarator *TParseContext::parseStructDeclarator(const ImmutableString &identifier, >+ const TSourceLoc &loc) > { >- checkIsNotReserved(loc, *identifier); >- TType *type = new TType(EbtVoid, EbpUndefined); >- return new TField(type, identifier, loc); >+ checkIsNotReserved(loc, identifier); >+ return new TDeclarator(identifier, loc); > } > >-TField *TParseContext::parseStructArrayDeclarator(TString *identifier, >- const TSourceLoc &loc, >- const TVector<unsigned int> &arraySizes, >- const TSourceLoc &arraySizeLoc) >+TDeclarator *TParseContext::parseStructArrayDeclarator(const ImmutableString &identifier, >+ const TSourceLoc &loc, >+ const TVector<unsigned int> *arraySizes) > { >- checkIsNotReserved(loc, *identifier); >- >- TType *type = new TType(EbtVoid, EbpUndefined); >- type->makeArrays(arraySizes); >- >- return new TField(type, identifier, loc); >+ checkIsNotReserved(loc, identifier); >+ return new TDeclarator(identifier, arraySizes, loc); > } > > void TParseContext::checkDoesNotHaveDuplicateFieldName(const TFieldList::const_iterator begin, > const TFieldList::const_iterator end, >- const TString &name, >+ const ImmutableString &name, > const TSourceLoc &location) > { > for (auto fieldIter = begin; fieldIter != end; ++fieldIter) > { > if ((*fieldIter)->name() == name) > { >- error(location, "duplicate field name in structure", name.c_str()); >+ error(location, "duplicate field name in structure", name); > } > } > } >@@ -4734,7 +4767,7 @@ TFieldList *TParseContext::combineStructFieldLists(TFieldList *processedFields, > TFieldList *TParseContext::addStructDeclaratorListWithQualifiers( > const TTypeQualifierBuilder &typeQualifierBuilder, > TPublicType *typeSpecifier, >- TFieldList *fieldList) >+ const TDeclaratorList *declaratorList) > { > TTypeQualifier typeQualifier = typeQualifierBuilder.getVariableTypeQualifier(mDiagnostics); > >@@ -4746,11 +4779,11 @@ TFieldList *TParseContext::addStructDeclaratorListWithQualifiers( > { > typeSpecifier->precision = typeQualifier.precision; > } >- return addStructDeclaratorList(*typeSpecifier, fieldList); >+ return addStructDeclaratorList(*typeSpecifier, declaratorList); > } > > TFieldList *TParseContext::addStructDeclaratorList(const TPublicType &typeSpecifier, >- TFieldList *declaratorList) >+ const TDeclaratorList *declaratorList) > { > checkPrecisionSpecified(typeSpecifier.getLine(), typeSpecifier.precision, > typeSpecifier.getBasicType()); >@@ -4760,49 +4793,49 @@ TFieldList *TParseContext::addStructDeclaratorList(const TPublicType &typeSpecif > > checkWorkGroupSizeIsNotSpecified(typeSpecifier.getLine(), typeSpecifier.layoutQualifier); > >- for (TField *declarator : *declaratorList) >+ TFieldList *fieldList = new TFieldList(); >+ >+ for (const TDeclarator *declarator : *declaratorList) > { >- // Don't allow arrays of arrays in ESSL < 3.10. >- if (declarator->type()->isArray()) >+ TType *type = new TType(typeSpecifier); >+ if (declarator->isArray()) > { >+ // Don't allow arrays of arrays in ESSL < 3.10. > checkArrayElementIsNotArray(typeSpecifier.getLine(), typeSpecifier); >+ type->makeArrays(*declarator->arraySizes()); > } > >- auto *declaratorArraySizes = declarator->type()->getArraySizes(); >- >- TType *type = declarator->type(); >- *type = TType(typeSpecifier); >- if (declaratorArraySizes != nullptr) >- { >- for (unsigned int arraySize : *declaratorArraySizes) >- { >- type->makeArray(arraySize); >- } >- } >- >- checkIsBelowStructNestingLimit(typeSpecifier.getLine(), *declarator); >+ TField *field = >+ new TField(type, declarator->name(), declarator->line(), SymbolType::UserDefined); >+ checkIsBelowStructNestingLimit(typeSpecifier.getLine(), *field); >+ fieldList->push_back(field); > } > >- return declaratorList; >+ return fieldList; > } > > TTypeSpecifierNonArray TParseContext::addStructure(const TSourceLoc &structLine, > const TSourceLoc &nameLine, >- const TString *structName, >+ const ImmutableString &structName, > TFieldList *fieldList) > { >- TStructure *structure = new TStructure(&symbolTable, structName, fieldList); >+ SymbolType structSymbolType = SymbolType::UserDefined; >+ if (structName.empty()) >+ { >+ structSymbolType = SymbolType::Empty; >+ } >+ TStructure *structure = new TStructure(&symbolTable, structName, fieldList, structSymbolType); > > // Store a bool in the struct if we're at global scope, to allow us to > // skip the local struct scoping workaround in HLSL. > structure->setAtGlobalScope(symbolTable.atGlobalLevel()); > >- if (!structName->empty()) >+ if (structSymbolType != SymbolType::Empty) > { >- checkIsNotReserved(nameLine, *structName); >- if (!symbolTable.declareStructType(structure)) >+ checkIsNotReserved(nameLine, structName); >+ if (!symbolTable.declare(structure)) > { >- error(nameLine, "redefinition of a struct", structName->c_str()); >+ error(nameLine, "redefinition of a struct", structName); > } > } > >@@ -4832,10 +4865,12 @@ TTypeSpecifierNonArray TParseContext::addStructure(const TSourceLoc &structLine, > } > > checkIsNotUnsizedArray(field.line(), "array members of structs must specify a size", >- field.name().c_str(), field.type()); >+ field.name(), field.type()); > > checkMemoryQualifierIsNotSpecified(field.type()->getMemoryQualifier(), field.line()); > >+ checkIndexIsNotSpecified(field.line(), field.type()->getLayoutQualifier().index); >+ > checkBindingIsNotSpecified(field.line(), field.type()->getLayoutQualifier().binding); > > checkLocationIsNotSpecified(field.line(), field.type()->getLayoutQualifier()); >@@ -4862,12 +4897,13 @@ TIntermSwitch *TParseContext::addSwitch(TIntermTyped *init, > } > > ASSERT(statementList); >- if (!ValidateSwitchStatementList(switchType, mShaderVersion, mDiagnostics, statementList, loc)) >+ if (!ValidateSwitchStatementList(switchType, mDiagnostics, statementList, loc)) > { > ASSERT(mDiagnostics->numErrors() > 0); > return nullptr; > } > >+ markStaticReadIfSymbol(init); > TIntermSwitch *node = new TIntermSwitch(init, statementList); > node->setLine(loc); > return node; >@@ -4891,9 +4927,10 @@ TIntermCase *TParseContext::addCase(TIntermTyped *condition, const TSourceLoc &l > error(condition->getLine(), "case label must be a scalar integer", "case"); > } > TIntermConstantUnion *conditionConst = condition->getAsConstantUnion(); >- // TODO(oetuaho@nvidia.com): Get rid of the conditionConst == nullptr check once all constant >- // expressions can be folded. Right now we don't allow constant expressions that ANGLE can't >- // fold in case labels. >+ // ANGLE should be able to fold any EvqConst expressions resulting in an integer - but to be >+ // safe against corner cases we still check for conditionConst. Some interpretations of the >+ // spec have allowed constant expressions with side effects - like array length() method on a >+ // non-constant array. > if (condition->getQualifier() != EvqConst || conditionConst == nullptr) > { > error(condition->getLine(), "case label must be constant", "case"); >@@ -4917,7 +4954,8 @@ TIntermCase *TParseContext::addDefault(const TSourceLoc &loc) > > TIntermTyped *TParseContext::createUnaryMath(TOperator op, > TIntermTyped *child, >- const TSourceLoc &loc) >+ const TSourceLoc &loc, >+ const TFunction *func) > { > ASSERT(child != nullptr); > >@@ -4927,7 +4965,7 @@ TIntermTyped *TParseContext::createUnaryMath(TOperator op, > if (child->getBasicType() != EbtBool || child->isMatrix() || child->isArray() || > child->isVector()) > { >- unaryOpError(loc, GetOperatorString(op), child->getCompleteString()); >+ unaryOpError(loc, GetOperatorString(op), child->getType()); > return nullptr; > } > break; >@@ -4935,7 +4973,7 @@ TIntermTyped *TParseContext::createUnaryMath(TOperator op, > if ((child->getBasicType() != EbtInt && child->getBasicType() != EbtUInt) || > child->isMatrix() || child->isArray()) > { >- unaryOpError(loc, GetOperatorString(op), child->getCompleteString()); >+ unaryOpError(loc, GetOperatorString(op), child->getType()); > return nullptr; > } > break; >@@ -4947,11 +4985,12 @@ TIntermTyped *TParseContext::createUnaryMath(TOperator op, > case EOpPositive: > if (child->getBasicType() == EbtStruct || child->isInterfaceBlock() || > child->getBasicType() == EbtBool || child->isArray() || >- IsOpaqueType(child->getBasicType())) >+ child->getBasicType() == EbtVoid || IsOpaqueType(child->getBasicType())) > { >- unaryOpError(loc, GetOperatorString(op), child->getCompleteString()); >+ unaryOpError(loc, GetOperatorString(op), child->getType()); > return nullptr; > } >+ break; > // Operators for built-ins are already type checked against their prototype. > default: > break; >@@ -4959,11 +4998,12 @@ TIntermTyped *TParseContext::createUnaryMath(TOperator op, > > if (child->getMemoryQualifier().writeonly) > { >- unaryOpError(loc, GetOperatorString(op), child->getCompleteString()); >+ unaryOpError(loc, GetOperatorString(op), child->getType()); > return nullptr; > } > >- TIntermUnary *node = new TIntermUnary(op, child); >+ markStaticReadIfSymbol(child); >+ TIntermUnary *node = new TIntermUnary(op, child, func); > node->setLine(loc); > > return node->fold(mDiagnostics); >@@ -4972,7 +5012,7 @@ TIntermTyped *TParseContext::createUnaryMath(TOperator op, > TIntermTyped *TParseContext::addUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &loc) > { > ASSERT(op != EOpNull); >- TIntermTyped *node = createUnaryMath(op, child, loc); >+ TIntermTyped *node = createUnaryMath(op, child, loc, nullptr); > if (node == nullptr) > { > return child; >@@ -4988,6 +5028,30 @@ TIntermTyped *TParseContext::addUnaryMathLValue(TOperator op, > return addUnaryMath(op, child, loc); > } > >+TIntermTyped *TParseContext::expressionOrFoldedResult(TIntermTyped *expression) >+{ >+ // If we can, we should return the folded version of the expression for subsequent parsing. This >+ // enables folding the containing expression during parsing as well, instead of the separate >+ // FoldExpressions() step where folding nested expressions requires multiple full AST >+ // traversals. >+ >+ // Even if folding fails the fold() functions return some node representing the expression, >+ // typically the original node. So "folded" can be assumed to be non-null. >+ TIntermTyped *folded = expression->fold(mDiagnostics); >+ ASSERT(folded != nullptr); >+ if (folded->getQualifier() == expression->getQualifier()) >+ { >+ // We need this expression to have the correct qualifier when validating the consuming >+ // expression. So we can only return the folded node from here in case it has the same >+ // qualifier as the original expression. In this kind of a cases the qualifier of the folded >+ // node is EvqConst, whereas the qualifier of the expression is EvqTemporary: >+ // 1. (true ? 1.0 : non_constant) >+ // 2. (non_constant, 1.0) >+ return folded; >+ } >+ return expression; >+} >+ > bool TParseContext::binaryOpCommonCheck(TOperator op, > TIntermTyped *left, > TIntermTyped *right, >@@ -5002,10 +5066,9 @@ bool TParseContext::binaryOpCommonCheck(TOperator op, > case EOpIndexDirect: > case EOpIndexIndirect: > break; >- case EOpIndexDirectStruct: >- UNREACHABLE(); > > default: >+ ASSERT(op != EOpIndexDirectStruct); > error(loc, "Invalid operation for variables with an opaque type", > GetOperatorString(op)); > return false; >@@ -5343,10 +5406,11 @@ TIntermTyped *TParseContext::addBinaryMathInternal(TOperator op, > } > > TIntermBinary *node = new TIntermBinary(op, left, right); >+ ASSERT(op != EOpAssign); >+ markStaticReadIfSymbol(left); >+ markStaticReadIfSymbol(right); > node->setLine(loc); >- >- // See if we can fold constants. >- return node->fold(mDiagnostics); >+ return expressionOrFoldedResult(node); > } > > TIntermTyped *TParseContext::addBinaryMath(TOperator op, >@@ -5357,8 +5421,7 @@ TIntermTyped *TParseContext::addBinaryMath(TOperator op, > TIntermTyped *node = addBinaryMathInternal(op, left, right, loc); > if (node == 0) > { >- binaryOpError(loc, GetOperatorString(op), left->getCompleteString(), >- right->getCompleteString()); >+ binaryOpError(loc, GetOperatorString(op), left->getType(), right->getType()); > return left; > } > return node; >@@ -5372,49 +5435,46 @@ TIntermTyped *TParseContext::addBinaryMathBooleanResult(TOperator op, > TIntermTyped *node = addBinaryMathInternal(op, left, right, loc); > if (node == nullptr) > { >- binaryOpError(loc, GetOperatorString(op), left->getCompleteString(), >- right->getCompleteString()); >+ binaryOpError(loc, GetOperatorString(op), left->getType(), right->getType()); > node = CreateBoolNode(false); > node->setLine(loc); > } > return node; > } > >-TIntermBinary *TParseContext::createAssign(TOperator op, >- TIntermTyped *left, >- TIntermTyped *right, >- const TSourceLoc &loc) >+TIntermTyped *TParseContext::addAssign(TOperator op, >+ TIntermTyped *left, >+ TIntermTyped *right, >+ const TSourceLoc &loc) > { >+ checkCanBeLValue(loc, "assign", left); >+ TIntermBinary *node = nullptr; > if (binaryOpCommonCheck(op, left, right, loc)) > { > if (op == EOpMulAssign) > { > op = TIntermBinary::GetMulAssignOpBasedOnOperands(left->getType(), right->getType()); >- if (!isMultiplicationTypeCombinationValid(op, left->getType(), right->getType())) >+ if (isMultiplicationTypeCombinationValid(op, left->getType(), right->getType())) > { >- return nullptr; >+ node = new TIntermBinary(op, left, right); > } > } >- TIntermBinary *node = new TIntermBinary(op, left, right); >- node->setLine(loc); >- >- return node; >+ else >+ { >+ node = new TIntermBinary(op, left, right); >+ } > } >- return nullptr; >-} >- >-TIntermTyped *TParseContext::addAssign(TOperator op, >- TIntermTyped *left, >- TIntermTyped *right, >- const TSourceLoc &loc) >-{ >- checkCanBeLValue(loc, "assign", left); >- TIntermTyped *node = createAssign(op, left, right, loc); > if (node == nullptr) > { >- assignError(loc, "assign", left->getCompleteString(), right->getCompleteString()); >+ assignError(loc, "assign", left->getType(), right->getType()); > return left; > } >+ if (op != EOpAssign) >+ { >+ markStaticReadIfSymbol(left); >+ } >+ markStaticReadIfSymbol(right); >+ node->setLine(loc); > return node; > } > >@@ -5434,10 +5494,12 @@ TIntermTyped *TParseContext::addComma(TIntermTyped *left, > ","); > } > >- TIntermBinary *commaNode = new TIntermBinary(EOpComma, left, right); >- TQualifier resultQualifier = TIntermBinary::GetCommaQualifier(mShaderVersion, left, right); >- commaNode->getTypePointer()->setQualifier(resultQualifier); >- return commaNode->fold(mDiagnostics); >+ TIntermBinary *commaNode = TIntermBinary::CreateComma(left, right, mShaderVersion); >+ markStaticReadIfSymbol(left); >+ markStaticReadIfSymbol(right); >+ commaNode->setLine(loc); >+ >+ return expressionOrFoldedResult(commaNode); > } > > TIntermBranch *TParseContext::addBranch(TOperator op, const TSourceLoc &loc) >@@ -5481,6 +5543,7 @@ TIntermBranch *TParseContext::addBranch(TOperator op, > { > if (expression != nullptr) > { >+ markStaticReadIfSymbol(expression); > ASSERT(op == EOpReturn); > mFunctionReturnsValue = true; > if (mCurrentFunctionType->getBasicType() == EbtVoid) >@@ -5497,14 +5560,22 @@ TIntermBranch *TParseContext::addBranch(TOperator op, > return node; > } > >+void TParseContext::appendStatement(TIntermBlock *block, TIntermNode *statement) >+{ >+ if (statement != nullptr) >+ { >+ markStaticReadIfSymbol(statement); >+ block->appendStatement(statement); >+ } >+} >+ > void TParseContext::checkTextureGather(TIntermAggregate *functionCall) > { > ASSERT(functionCall->getOp() == EOpCallBuiltInFunction); >- const TString &name = functionCall->getFunctionSymbolInfo()->getName(); >- bool isTextureGather = (name == "textureGather"); >- bool isTextureGatherOffset = (name == "textureGatherOffset"); >- if (isTextureGather || isTextureGatherOffset) >+ const TFunction *func = functionCall->getFunction(); >+ if (BuiltInGroup::isTextureGather(func)) > { >+ bool isTextureGatherOffset = BuiltInGroup::isTextureGatherOffset(func); > TIntermNode *componentNode = nullptr; > TIntermSequence *arguments = functionCall->getSequence(); > ASSERT(arguments->size() >= 2u && arguments->size() <= 4u); >@@ -5518,7 +5589,7 @@ void TParseContext::checkTextureGather(TIntermAggregate *functionCall) > case EbtSampler2DArray: > case EbtISampler2DArray: > case EbtUSampler2DArray: >- if ((isTextureGather && arguments->size() == 3u) || >+ if ((!isTextureGatherOffset && arguments->size() == 3u) || > (isTextureGatherOffset && arguments->size() == 4u)) > { > componentNode = arguments->back(); >@@ -5548,7 +5619,7 @@ void TParseContext::checkTextureGather(TIntermAggregate *functionCall) > if (componentNode->getAsTyped()->getQualifier() != EvqConst || !componentConstantUnion) > { > error(functionCall->getLine(), "Texture component must be a constant expression", >- name.c_str()); >+ func->name()); > } > else > { >@@ -5556,7 +5627,7 @@ void TParseContext::checkTextureGather(TIntermAggregate *functionCall) > if (component < 0 || component > 3) > { > error(functionCall->getLine(), "Component must be in the range [0;3]", >- name.c_str()); >+ func->name()); > } > } > } >@@ -5566,23 +5637,21 @@ void TParseContext::checkTextureGather(TIntermAggregate *functionCall) > void TParseContext::checkTextureOffsetConst(TIntermAggregate *functionCall) > { > ASSERT(functionCall->getOp() == EOpCallBuiltInFunction); >- const TString &name = functionCall->getFunctionSymbolInfo()->getName(); >- TIntermNode *offset = nullptr; >- TIntermSequence *arguments = functionCall->getSequence(); >+ const TFunction *func = functionCall->getFunction(); >+ TIntermNode *offset = nullptr; >+ TIntermSequence *arguments = functionCall->getSequence(); > bool useTextureGatherOffsetConstraints = false; >- if (name == "texelFetchOffset" || name == "textureLodOffset" || >- name == "textureProjLodOffset" || name == "textureGradOffset" || >- name == "textureProjGradOffset") >+ if (BuiltInGroup::isTextureOffsetNoBias(func)) > { > offset = arguments->back(); > } >- else if (name == "textureOffset" || name == "textureProjOffset") >+ else if (BuiltInGroup::isTextureOffsetBias(func)) > { >- // A bias parameter might follow the offset parameter. >+ // A bias parameter follows the offset parameter. > ASSERT(arguments->size() >= 3); > offset = (*arguments)[2]; > } >- else if (name == "textureGatherOffset") >+ else if (BuiltInGroup::isTextureGatherOffset(func)) > { > ASSERT(arguments->size() >= 3u); > const TIntermTyped *sampler = arguments->front()->getAsTyped(); >@@ -5613,13 +5682,13 @@ void TParseContext::checkTextureOffsetConst(TIntermAggregate *functionCall) > if (offset->getAsTyped()->getQualifier() != EvqConst || !offsetConstantUnion) > { > error(functionCall->getLine(), "Texture offset must be a constant expression", >- name.c_str()); >+ func->name()); > } > else > { > ASSERT(offsetConstantUnion->getBasicType() == EbtInt); > size_t size = offsetConstantUnion->getType().getObjectSize(); >- const TConstantUnion *values = offsetConstantUnion->getUnionArrayPointer(); >+ const TConstantUnion *values = offsetConstantUnion->getConstantValue(); > int minOffsetValue = useTextureGatherOffsetConstraints ? mMinProgramTextureGatherOffset > : mMinProgramTexelOffset; > int maxOffsetValue = useTextureGatherOffsetConstraints ? mMaxProgramTextureGatherOffset >@@ -5629,7 +5698,7 @@ void TParseContext::checkTextureOffsetConst(TIntermAggregate *functionCall) > int offsetValue = values[i].getIConst(); > if (offsetValue > maxOffsetValue || offsetValue < minOffsetValue) > { >- std::stringstream tokenStream; >+ std::stringstream tokenStream = sh::InitializeStream<std::stringstream>(); > tokenStream << offsetValue; > std::string token = tokenStream.str(); > error(offset->getLine(), "Texture offset value out of valid range", >@@ -5642,9 +5711,10 @@ void TParseContext::checkTextureOffsetConst(TIntermAggregate *functionCall) > > void TParseContext::checkAtomicMemoryBuiltinFunctions(TIntermAggregate *functionCall) > { >- const TString &name = functionCall->getFunctionSymbolInfo()->getName(); >- if (IsAtomicBuiltin(name)) >+ const TFunction *func = functionCall->getFunction(); >+ if (BuiltInGroup::isAtomicMemory(func)) > { >+ ASSERT(IsAtomicFunction(functionCall->getOp())); > TIntermSequence *arguments = functionCall->getSequence(); > TIntermTyped *memNode = (*arguments)[0]->getAsTyped(); > >@@ -5665,7 +5735,7 @@ void TParseContext::checkAtomicMemoryBuiltinFunctions(TIntermAggregate *function > error(memNode->getLine(), > "The value passed to the mem argument of an atomic memory function does not " > "correspond to a buffer or shared variable.", >- functionCall->getFunctionSymbolInfo()->getName().c_str()); >+ func->name()); > } > } > >@@ -5673,16 +5743,17 @@ void TParseContext::checkAtomicMemoryBuiltinFunctions(TIntermAggregate *function > void TParseContext::checkImageMemoryAccessForBuiltinFunctions(TIntermAggregate *functionCall) > { > ASSERT(functionCall->getOp() == EOpCallBuiltInFunction); >- const TString &name = functionCall->getFunctionSymbolInfo()->getName(); > >- if (name.compare(0, 5, "image") == 0) >+ const TFunction *func = functionCall->getFunction(); >+ >+ if (BuiltInGroup::isImage(func)) > { > TIntermSequence *arguments = functionCall->getSequence(); > TIntermTyped *imageNode = (*arguments)[0]->getAsTyped(); > > const TMemoryQualifier &memoryQualifier = imageNode->getMemoryQualifier(); > >- if (name.compare(5, 5, "Store") == 0) >+ if (BuiltInGroup::isImageStore(func)) > { > if (memoryQualifier.readonly) > { >@@ -5691,7 +5762,7 @@ void TParseContext::checkImageMemoryAccessForBuiltinFunctions(TIntermAggregate * > GetImageArgumentToken(imageNode)); > } > } >- else if (name.compare(5, 4, "Load") == 0) >+ else if (BuiltInGroup::isImageLoad(func)) > { > if (memoryQualifier.writeonly) > { >@@ -5718,7 +5789,7 @@ void TParseContext::checkImageMemoryAccessForUserDefinedFunctions( > { > TIntermTyped *typedArgument = arguments[i]->getAsTyped(); > const TType &functionArgumentType = typedArgument->getType(); >- const TType &functionParameterType = *functionDefinition->getParam(i).type; >+ const TType &functionParameterType = functionDefinition->getParam(i)->getType(); > ASSERT(functionArgumentType.getBasicType() == functionParameterType.getBasicType()); > > if (IsImage(functionArgumentType.getBasicType())) >@@ -5762,163 +5833,134 @@ void TParseContext::checkImageMemoryAccessForUserDefinedFunctions( > } > } > >-TIntermSequence *TParseContext::createEmptyArgumentsList() >-{ >- return new TIntermSequence(); >-} >- >-TIntermTyped *TParseContext::addFunctionCallOrMethod(TFunction *fnCall, >- TIntermSequence *arguments, >- TIntermNode *thisNode, >- const TSourceLoc &loc) >+TIntermTyped *TParseContext::addFunctionCallOrMethod(TFunctionLookup *fnCall, const TSourceLoc &loc) > { >- if (thisNode != nullptr) >- { >- return addMethod(fnCall, arguments, thisNode, loc); >- } >- >- TOperator op = fnCall->getBuiltInOp(); >- if (op == EOpConstruct) >+ if (fnCall->thisNode() != nullptr) > { >- return addConstructor(arguments, fnCall->getReturnType(), loc); >+ return addMethod(fnCall, loc); > } >- else >+ if (fnCall->isConstructor()) > { >- ASSERT(op == EOpNull); >- return addNonConstructorFunctionCall(fnCall, arguments, loc); >+ return addConstructor(fnCall, loc); > } >+ return addNonConstructorFunctionCall(fnCall, loc); > } > >-TIntermTyped *TParseContext::addMethod(TFunction *fnCall, >- TIntermSequence *arguments, >- TIntermNode *thisNode, >- const TSourceLoc &loc) >+TIntermTyped *TParseContext::addMethod(TFunctionLookup *fnCall, const TSourceLoc &loc) > { >- TIntermTyped *typedThis = thisNode->getAsTyped(); >+ TIntermTyped *thisNode = fnCall->thisNode(); > // It's possible for the name pointer in the TFunction to be null in case it gets parsed as > // a constructor. But such a TFunction can't reach here, since the lexer goes into FIELDS > // mode after a dot, which makes type identifiers to be parsed as FIELD_SELECTION instead. >- // So accessing fnCall->getName() below is safe. >- if (fnCall->getName() != "length") >+ // So accessing fnCall->name() below is safe. >+ if (fnCall->name() != "length") > { >- error(loc, "invalid method", fnCall->getName().c_str()); >+ error(loc, "invalid method", fnCall->name()); > } >- else if (!arguments->empty()) >+ else if (!fnCall->arguments().empty()) > { > error(loc, "method takes no parameters", "length"); > } >- else if (typedThis == nullptr || !typedThis->isArray()) >+ else if (!thisNode->isArray()) > { > error(loc, "length can only be called on arrays", "length"); > } >- else if (typedThis->getQualifier() == EvqPerVertexIn && >+ else if (thisNode->getQualifier() == EvqPerVertexIn && > mGeometryShaderInputPrimitiveType == EptUndefined) > { >- ASSERT(mShaderType == GL_GEOMETRY_SHADER_OES); >+ ASSERT(mShaderType == GL_GEOMETRY_SHADER_EXT); > error(loc, "missing input primitive declaration before calling length on gl_in", "length"); > } > else > { >- TIntermUnary *node = new TIntermUnary(EOpArrayLength, typedThis); >+ TIntermUnary *node = new TIntermUnary(EOpArrayLength, thisNode, nullptr); >+ markStaticReadIfSymbol(thisNode); > node->setLine(loc); > return node->fold(mDiagnostics); > } > return CreateZeroNode(TType(EbtInt, EbpUndefined, EvqConst)); > } > >-TIntermTyped *TParseContext::addNonConstructorFunctionCall(TFunction *fnCall, >- TIntermSequence *arguments, >+TIntermTyped *TParseContext::addNonConstructorFunctionCall(TFunctionLookup *fnCall, > const TSourceLoc &loc) > { >- // First find by unmangled name to check whether the function name has been >- // hidden by a variable name or struct typename. >- // If a function is found, check for one with a matching argument list. >- bool builtIn; >- const TSymbol *symbol = symbolTable.find(fnCall->getName(), mShaderVersion, &builtIn); >- if (symbol != nullptr && !symbol->isFunction()) >+ // First check whether the function has been hidden by a variable name or struct typename by >+ // using the symbol looked up in the lexical phase. If the function is not hidden, look for one >+ // with a matching argument list. >+ if (fnCall->symbol() != nullptr && !fnCall->symbol()->isFunction()) > { >- error(loc, "function name expected", fnCall->getName().c_str()); >+ error(loc, "function name expected", fnCall->name()); > } > else > { >- symbol = symbolTable.find(TFunction::GetMangledNameFromCall(fnCall->getName(), *arguments), >- mShaderVersion, &builtIn); >+ // There are no inner functions, so it's enough to look for user-defined functions in the >+ // global scope. >+ const TSymbol *symbol = symbolTable.findGlobal(fnCall->getMangledName()); >+ if (symbol != nullptr) >+ { >+ // A user-defined function - could be an overloaded built-in as well. >+ ASSERT(symbol->symbolType() == SymbolType::UserDefined); >+ const TFunction *fnCandidate = static_cast<const TFunction *>(symbol); >+ TIntermAggregate *callNode = >+ TIntermAggregate::CreateFunctionCall(*fnCandidate, &fnCall->arguments()); >+ callNode->setLine(loc); >+ checkImageMemoryAccessForUserDefinedFunctions(fnCandidate, callNode); >+ functionCallRValueLValueErrorCheck(fnCandidate, callNode); >+ return callNode; >+ } >+ >+ symbol = symbolTable.findBuiltIn(fnCall->getMangledName(), mShaderVersion); > if (symbol == nullptr) > { >- error(loc, "no matching overloaded function found", fnCall->getName().c_str()); >+ error(loc, "no matching overloaded function found", fnCall->name()); > } > else > { >+ // A built-in function. >+ ASSERT(symbol->symbolType() == SymbolType::BuiltIn); > const TFunction *fnCandidate = static_cast<const TFunction *>(symbol); >- // >- // A declared function. >- // >- if (builtIn && fnCandidate->getExtension() != TExtension::UNDEFINED) >+ >+ if (fnCandidate->extension() != TExtension::UNDEFINED) > { >- checkCanUseExtension(loc, fnCandidate->getExtension()); >+ checkCanUseExtension(loc, fnCandidate->extension()); > } > TOperator op = fnCandidate->getBuiltInOp(); >- if (builtIn && op != EOpNull) >+ if (op != EOpCallBuiltInFunction) > { > // A function call mapped to a built-in operation. > if (fnCandidate->getParamCount() == 1) > { > // Treat it like a built-in unary operator. >- TIntermNode *unaryParamNode = arguments->front(); >- TIntermTyped *callNode = createUnaryMath(op, unaryParamNode->getAsTyped(), loc); >+ TIntermNode *unaryParamNode = fnCall->arguments().front(); >+ TIntermTyped *callNode = >+ createUnaryMath(op, unaryParamNode->getAsTyped(), loc, fnCandidate); > ASSERT(callNode != nullptr); > return callNode; > } >- else >- { >- TIntermAggregate *callNode = >- TIntermAggregate::Create(fnCandidate->getReturnType(), op, arguments); >- callNode->setLine(loc); > >- // Some built-in functions have out parameters too. >- functionCallRValueLValueErrorCheck(fnCandidate, callNode); >+ TIntermAggregate *callNode = >+ TIntermAggregate::CreateBuiltInFunctionCall(*fnCandidate, &fnCall->arguments()); >+ callNode->setLine(loc); > >- if (TIntermAggregate::CanFoldAggregateBuiltInOp(callNode->getOp())) >- { >- // See if we can constant fold a built-in. Note that this may be possible >- // even if it is not const-qualified. >- return callNode->fold(mDiagnostics); >- } >- else >- { >- return callNode; >- } >- } >- } >- else >- { >- // This is a real function call >- TIntermAggregate *callNode = nullptr; >- >- // If builtIn == false, the function is user defined - could be an overloaded >- // built-in as well. >- // if builtIn == true, it's a builtIn function with no op associated with it. >- // This needs to happen after the function info including name is set. >- if (builtIn) >- { >- callNode = TIntermAggregate::CreateBuiltInFunctionCall(*fnCandidate, arguments); >- checkTextureOffsetConst(callNode); >- checkTextureGather(callNode); >- checkImageMemoryAccessForBuiltinFunctions(callNode); >- checkAtomicMemoryBuiltinFunctions(callNode); >- } >- else >- { >- callNode = TIntermAggregate::CreateFunctionCall(*fnCandidate, arguments); >- checkImageMemoryAccessForUserDefinedFunctions(fnCandidate, callNode); >- } >+ checkAtomicMemoryBuiltinFunctions(callNode); > >+ // Some built-in functions have out parameters too. > functionCallRValueLValueErrorCheck(fnCandidate, callNode); > >- callNode->setLine(loc); >- >- return callNode; >+ // See if we can constant fold a built-in. Note that this may be possible >+ // even if it is not const-qualified. >+ return callNode->fold(mDiagnostics); > } >+ >+ // This is a built-in function with no op associated with it. >+ TIntermAggregate *callNode = >+ TIntermAggregate::CreateBuiltInFunctionCall(*fnCandidate, &fnCall->arguments()); >+ callNode->setLine(loc); >+ checkTextureOffsetConst(callNode); >+ checkTextureGather(callNode); >+ checkImageMemoryAccessForBuiltinFunctions(callNode); >+ functionCallRValueLValueErrorCheck(fnCandidate, callNode); >+ return callNode; > } > } > >@@ -5938,12 +5980,10 @@ TIntermTyped *TParseContext::addTernarySelection(TIntermTyped *cond, > > if (trueExpression->getType() != falseExpression->getType()) > { >- std::stringstream reasonStream; >- reasonStream << "mismatching ternary operator operand types '" >- << trueExpression->getCompleteString() << " and '" >- << falseExpression->getCompleteString() << "'"; >- std::string reason = reasonStream.str(); >- error(loc, reason.c_str(), "?:"); >+ TInfoSinkBase reasonStream; >+ reasonStream << "mismatching ternary operator operand types '" << trueExpression->getType() >+ << " and '" << falseExpression->getType() << "'"; >+ error(loc, reasonStream.c_str(), "?:"); > return falseExpression; > } > if (IsOpaqueType(trueExpression->getBasicType())) >@@ -5989,12 +6029,12 @@ TIntermTyped *TParseContext::addTernarySelection(TIntermTyped *cond, > return falseExpression; > } > >- // Note that the node resulting from here can be a constant union without being qualified as >- // constant. > TIntermTernary *node = new TIntermTernary(cond, trueExpression, falseExpression); >+ markStaticReadIfSymbol(cond); >+ markStaticReadIfSymbol(trueExpression); >+ markStaticReadIfSymbol(falseExpression); > node->setLine(loc); >- >- return node->fold(); >+ return expressionOrFoldedResult(node); > } > > // >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.h >index 8bfdbd5e3f9..035e8c7788b 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.h >@@ -6,12 +6,14 @@ > #ifndef COMPILER_TRANSLATOR_PARSECONTEXT_H_ > #define COMPILER_TRANSLATOR_PARSECONTEXT_H_ > >+#include "compiler/preprocessor/Preprocessor.h" > #include "compiler/translator/Compiler.h" >+#include "compiler/translator/Declarator.h" > #include "compiler/translator/Diagnostics.h" > #include "compiler/translator/DirectiveHandler.h" >-#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/FunctionLookup.h" > #include "compiler/translator/QualifierTypes.h" >-#include "compiler/preprocessor/Preprocessor.h" >+#include "compiler/translator/SymbolTable.h" > > namespace sh > { >@@ -41,8 +43,8 @@ class TParseContext : angle::NonCopyable > const ShBuiltInResources &resources); > ~TParseContext(); > >- const pp::Preprocessor &getPreprocessor() const { return mPreprocessor; } >- pp::Preprocessor &getPreprocessor() { return mPreprocessor; } >+ const angle::pp::Preprocessor &getPreprocessor() const { return mPreprocessor; } >+ angle::pp::Preprocessor &getPreprocessor() { return mPreprocessor; } > void *getScanner() const { return mScanner; } > void setScanner(void *scanner) { mScanner = scanner; } > int getShaderVersion() const { return mShaderVersion; } >@@ -50,6 +52,7 @@ class TParseContext : angle::NonCopyable > ShShaderSpec getShaderSpec() const { return mShaderSpec; } > int numErrors() const { return mDiagnostics->numErrors(); } > void error(const TSourceLoc &loc, const char *reason, const char *token); >+ void error(const TSourceLoc &loc, const char *reason, const ImmutableString &token); > void warning(const TSourceLoc &loc, const char *reason, const char *token); > > // If isError is false, a warning will be reported instead. >@@ -94,39 +97,44 @@ class TParseContext : angle::NonCopyable > > // This method is guaranteed to succeed, even if no variable with 'name' exists. > const TVariable *getNamedVariable(const TSourceLoc &location, >- const TString *name, >+ const ImmutableString &name, > const TSymbol *symbol); > TIntermTyped *parseVariableIdentifier(const TSourceLoc &location, >- const TString *name, >+ const ImmutableString &name, > const TSymbol *symbol); > > // Look at a '.' field selector string and change it into offsets for a vector. > bool parseVectorFields(const TSourceLoc &line, >- const TString &compString, >+ const ImmutableString &compString, > int vecSize, > TVector<int> *fieldOffsets); > >- void assignError(const TSourceLoc &line, const char *op, TString left, TString right); >- void unaryOpError(const TSourceLoc &line, const char *op, TString operand); >- void binaryOpError(const TSourceLoc &line, const char *op, TString left, TString right); >+ void assignError(const TSourceLoc &line, const char *op, const TType &left, const TType &right); >+ void unaryOpError(const TSourceLoc &line, const char *op, const TType &operand); >+ void binaryOpError(const TSourceLoc &line, >+ const char *op, >+ const TType &left, >+ const TType &right); > > // Check functions - the ones that return bool return false if an error was generated. > >- bool checkIsNotReserved(const TSourceLoc &line, const TString &identifier); >+ bool checkIsNotReserved(const TSourceLoc &line, const ImmutableString &identifier); > void checkPrecisionSpecified(const TSourceLoc &line, TPrecision precision, TBasicType type); > bool checkCanBeLValue(const TSourceLoc &line, const char *op, TIntermTyped *node); > void checkIsConst(TIntermTyped *node); > void checkIsScalarInteger(TIntermTyped *node, const char *token); > bool checkIsAtGlobalLevel(const TSourceLoc &line, const char *token); > bool checkConstructorArguments(const TSourceLoc &line, >- const TIntermSequence *arguments, >+ const TIntermSequence &arguments, > const TType &type); > > // Returns a sanitized array size to use (the size is at least 1). > unsigned int checkIsValidArraySize(const TSourceLoc &line, TIntermTyped *expr); > bool checkIsValidQualifierForArray(const TSourceLoc &line, const TPublicType &elementQualifier); > bool checkArrayElementIsNotArray(const TSourceLoc &line, const TPublicType &elementType); >- bool checkIsNonVoid(const TSourceLoc &line, const TString &identifier, const TBasicType &type); >+ bool checkIsNonVoid(const TSourceLoc &line, >+ const ImmutableString &identifier, >+ const TBasicType &type); > bool checkIsScalarBool(const TSourceLoc &line, const TIntermTyped *type); > void checkIsScalarBool(const TSourceLoc &line, const TPublicType &pType); > bool checkIsNotOpaqueType(const TSourceLoc &line, >@@ -163,7 +171,7 @@ class TParseContext : angle::NonCopyable > void emptyDeclarationErrorCheck(const TType &type, const TSourceLoc &location); > > void checkLayoutQualifierSupported(const TSourceLoc &location, >- const TString &layoutQualifierName, >+ const ImmutableString &layoutQualifierName, > int versionRequired); > bool checkWorkGroupSizeIsNotSpecified(const TSourceLoc &location, > const TLayoutQualifier &layoutQualifier); >@@ -191,12 +199,12 @@ class TParseContext : angle::NonCopyable > // Returns true on success. *initNode may still be nullptr on success in case the initialization > // is not needed in the AST. > bool executeInitializer(const TSourceLoc &line, >- const TString &identifier, >- TType type, >+ const ImmutableString &identifier, >+ TType *type, > TIntermTyped *initializer, > TIntermBinary **initNode); > TIntermNode *addConditionInitializer(const TPublicType &pType, >- const TString &identifier, >+ const ImmutableString &identifier, > TIntermTyped *initializer, > const TSourceLoc &loc); > TIntermNode *addLoop(TLoopType type, >@@ -216,15 +224,15 @@ class TParseContext : angle::NonCopyable > > TIntermDeclaration *parseSingleDeclaration(TPublicType &publicType, > const TSourceLoc &identifierOrTypeLocation, >- const TString &identifier); >+ const ImmutableString &identifier); > TIntermDeclaration *parseSingleArrayDeclaration(TPublicType &elementType, > const TSourceLoc &identifierLocation, >- const TString &identifier, >+ const ImmutableString &identifier, > const TSourceLoc &indexLocation, > const TVector<unsigned int> &arraySizes); > TIntermDeclaration *parseSingleInitDeclaration(const TPublicType &publicType, > const TSourceLoc &identifierLocation, >- const TString &identifier, >+ const ImmutableString &identifier, > const TSourceLoc &initLocation, > TIntermTyped *initializer); > >@@ -232,7 +240,7 @@ class TParseContext : angle::NonCopyable > // Note that this does not apply to declarations like "type[n] a = initializer" > TIntermDeclaration *parseSingleArrayInitDeclaration(TPublicType &elementType, > const TSourceLoc &identifierLocation, >- const TString &identifier, >+ const ImmutableString &identifier, > const TSourceLoc &indexLocation, > const TVector<unsigned int> &arraySizes, > const TSourceLoc &initLocation, >@@ -241,22 +249,22 @@ class TParseContext : angle::NonCopyable > TIntermInvariantDeclaration *parseInvariantDeclaration( > const TTypeQualifierBuilder &typeQualifierBuilder, > const TSourceLoc &identifierLoc, >- const TString *identifier, >+ const ImmutableString &identifier, > const TSymbol *symbol); > > void parseDeclarator(TPublicType &publicType, > const TSourceLoc &identifierLocation, >- const TString &identifier, >+ const ImmutableString &identifier, > TIntermDeclaration *declarationOut); > void parseArrayDeclarator(TPublicType &elementType, > const TSourceLoc &identifierLocation, >- const TString &identifier, >+ const ImmutableString &identifier, > const TSourceLoc &arrayLocation, > const TVector<unsigned int> &arraySizes, > TIntermDeclaration *declarationOut); > void parseInitDeclarator(const TPublicType &publicType, > const TSourceLoc &identifierLocation, >- const TString &identifier, >+ const ImmutableString &identifier, > const TSourceLoc &initLocation, > TIntermTyped *initializer, > TIntermDeclaration *declarationOut); >@@ -264,7 +272,7 @@ class TParseContext : angle::NonCopyable > // Parse a declarator like "a[n] = initializer" > void parseArrayInitDeclarator(const TPublicType &elementType, > const TSourceLoc &identifierLocation, >- const TString &identifier, >+ const ImmutableString &identifier, > const TSourceLoc &indexLocation, > const TVector<unsigned int> &arraySizes, > const TSourceLoc &initLocation, >@@ -284,19 +292,21 @@ class TParseContext : angle::NonCopyable > TIntermBlock *functionBody, > const TSourceLoc &location); > void parseFunctionDefinitionHeader(const TSourceLoc &location, >- TFunction **function, >+ const TFunction *function, > TIntermFunctionPrototype **prototypeOut); > TFunction *parseFunctionDeclarator(const TSourceLoc &location, TFunction *function); > TFunction *parseFunctionHeader(const TPublicType &type, >- const TString *name, >+ const ImmutableString &name, > const TSourceLoc &location); >- TFunction *addNonConstructorFunc(const TString *name, const TSourceLoc &loc); >- TFunction *addConstructorFunc(const TPublicType &publicType); >+ >+ TFunctionLookup *addNonConstructorFunc(const ImmutableString &name, const TSymbol *symbol); >+ TFunctionLookup *addConstructorFunc(const TPublicType &publicType); >+ > TParameter parseParameterDeclarator(const TPublicType &publicType, >- const TString *name, >+ const ImmutableString &name, > const TSourceLoc &nameLoc); > >- TParameter parseParameterArrayDeclarator(const TString *name, >+ TParameter parseParameterArrayDeclarator(const ImmutableString &name, > const TSourceLoc &nameLoc, > const TVector<unsigned int> &arraySizes, > const TSourceLoc &arrayLoc, >@@ -307,19 +317,18 @@ class TParseContext : angle::NonCopyable > TIntermTyped *indexExpression); > TIntermTyped *addFieldSelectionExpression(TIntermTyped *baseExpression, > const TSourceLoc &dotLocation, >- const TString &fieldString, >+ const ImmutableString &fieldString, > const TSourceLoc &fieldLocation); > > // Parse declarator for a single field >- TField *parseStructDeclarator(TString *identifier, const TSourceLoc &loc); >- TField *parseStructArrayDeclarator(TString *identifier, >- const TSourceLoc &loc, >- const TVector<unsigned int> &arraySizes, >- const TSourceLoc &arraySizeLoc); >+ TDeclarator *parseStructDeclarator(const ImmutableString &identifier, const TSourceLoc &loc); >+ TDeclarator *parseStructArrayDeclarator(const ImmutableString &identifier, >+ const TSourceLoc &loc, >+ const TVector<unsigned int> *arraySizes); > > void checkDoesNotHaveDuplicateFieldName(const TFieldList::const_iterator begin, > const TFieldList::const_iterator end, >- const TString &name, >+ const ImmutableString &name, > const TSourceLoc &location); > TFieldList *addStructFieldList(TFieldList *fields, const TSourceLoc &location); > TFieldList *combineStructFieldLists(TFieldList *processedFields, >@@ -328,23 +337,24 @@ class TParseContext : angle::NonCopyable > TFieldList *addStructDeclaratorListWithQualifiers( > const TTypeQualifierBuilder &typeQualifierBuilder, > TPublicType *typeSpecifier, >- TFieldList *fieldList); >- TFieldList *addStructDeclaratorList(const TPublicType &typeSpecifier, TFieldList *fieldList); >+ const TDeclaratorList *declaratorList); >+ TFieldList *addStructDeclaratorList(const TPublicType &typeSpecifier, >+ const TDeclaratorList *declaratorList); > TTypeSpecifierNonArray addStructure(const TSourceLoc &structLine, > const TSourceLoc &nameLine, >- const TString *structName, >+ const ImmutableString &structName, > TFieldList *fieldList); > > TIntermDeclaration *addInterfaceBlock(const TTypeQualifierBuilder &typeQualifierBuilder, > const TSourceLoc &nameLine, >- const TString &blockName, >+ const ImmutableString &blockName, > TFieldList *fieldList, >- const TString *instanceName, >+ const ImmutableString &instanceName, > const TSourceLoc &instanceLine, > TIntermTyped *arrayIndex, > const TSourceLoc &arrayIndexLine); > >- void parseLocalSize(const TString &qualifierType, >+ void parseLocalSize(const ImmutableString &qualifierType, > const TSourceLoc &qualifierTypeLine, > int intValue, > const TSourceLoc &intValueLine, >@@ -363,9 +373,13 @@ class TParseContext : angle::NonCopyable > const TSourceLoc &intValueLine, > const std::string &intValueString, > int *numMaxVertices); >- TLayoutQualifier parseLayoutQualifier(const TString &qualifierType, >+ void parseIndexLayoutQualifier(int intValue, >+ const TSourceLoc &intValueLine, >+ const std::string &intValueString, >+ int *index); >+ TLayoutQualifier parseLayoutQualifier(const ImmutableString &qualifierType, > const TSourceLoc &qualifierTypeLine); >- TLayoutQualifier parseLayoutQualifier(const TString &qualifierType, >+ TLayoutQualifier parseLayoutQualifier(const ImmutableString &qualifierType, > const TSourceLoc &qualifierTypeLine, > int intValue, > const TSourceLoc &intValueLine); >@@ -381,7 +395,7 @@ class TParseContext : angle::NonCopyable > const TSourceLoc &rightQualifierLocation); > > // Performs an error check for embedded struct declarations. >- void enterStructDeclaration(const TSourceLoc &line, const TString &identifier); >+ void enterStructDeclaration(const TSourceLoc &line, const ImmutableString &identifier); > void exitStructDeclaration(); > > void checkIsBelowStructNestingLimit(const TSourceLoc &line, const TField &field); >@@ -412,20 +426,18 @@ class TParseContext : angle::NonCopyable > TIntermBranch *addBranch(TOperator op, const TSourceLoc &loc); > TIntermBranch *addBranch(TOperator op, TIntermTyped *expression, const TSourceLoc &loc); > >+ void appendStatement(TIntermBlock *block, TIntermNode *statement); >+ > void checkTextureGather(TIntermAggregate *functionCall); > void checkTextureOffsetConst(TIntermAggregate *functionCall); > void checkImageMemoryAccessForBuiltinFunctions(TIntermAggregate *functionCall); > void checkImageMemoryAccessForUserDefinedFunctions(const TFunction *functionDefinition, > const TIntermAggregate *functionCall); > void checkAtomicMemoryBuiltinFunctions(TIntermAggregate *functionCall); >- TIntermSequence *createEmptyArgumentsList(); > > // fnCall is only storing the built-in op, and function name or constructor type. arguments > // has the arguments. >- TIntermTyped *addFunctionCallOrMethod(TFunction *fnCall, >- TIntermSequence *arguments, >- TIntermNode *thisNode, >- const TSourceLoc &loc); >+ TIntermTyped *addFunctionCallOrMethod(TFunctionLookup *fnCall, const TSourceLoc &loc); > > TIntermTyped *addTernarySelection(TIntermTyped *cond, > TIntermTyped *trueExpression, >@@ -447,7 +459,7 @@ class TParseContext : angle::NonCopyable > } > > // TODO(jmadill): make this private >- TSymbolTable &symbolTable; // symbol table that goes with the language currently being parsed >+ TSymbolTable &symbolTable; // symbol table that goes with the language currently being parsed > > private: > class AtomicCounterBindingState; >@@ -461,6 +473,8 @@ class TParseContext : angle::NonCopyable > // Note that there may be tests in AtomicCounter_test that will need to be updated as well. > constexpr static size_t kAtomicCounterArrayStride = 4; > >+ void markStaticReadIfSymbol(TIntermNode *node); >+ > // Returns a clamped index. If it prints out an error message, the token is "[]". > int checkIndexLessThan(bool outOfRangeIndexIsError, > const TSourceLoc &location, >@@ -469,16 +483,16 @@ class TParseContext : angle::NonCopyable > const char *reason); > > bool declareVariable(const TSourceLoc &line, >- const TString &identifier, >- const TType &type, >+ const ImmutableString &identifier, >+ const TType *type, > TVariable **variable); > > void checkCanBeDeclaredWithoutInitializer(const TSourceLoc &line, >- const TString &identifier, >+ const ImmutableString &identifier, > TType *type); > > TParameter parseParameterDeclarator(TType *type, >- const TString *name, >+ const ImmutableString &name, > const TSourceLoc &nameLoc); > > bool checkIsValidTypeAndQualifierForArray(const TSourceLoc &indexLocation, >@@ -501,6 +515,9 @@ class TParseContext : angle::NonCopyable > void checkAtomicCounterOffsetDoesNotOverlap(bool forceAppend, > const TSourceLoc &loc, > TType *type); >+ void checkAtomicCounterOffsetAlignment(const TSourceLoc &location, const TType &type); >+ >+ void checkIndexIsNotSpecified(const TSourceLoc &location, int index); > void checkBindingIsValid(const TSourceLoc &identifierLocation, const TType &type); > void checkBindingIsNotSpecified(const TSourceLoc &location, int binding); > void checkOffsetIsNotSpecified(const TSourceLoc &location, int offset); >@@ -522,42 +539,38 @@ class TParseContext : angle::NonCopyable > > void checkYuvIsNotSpecified(const TSourceLoc &location, bool yuv); > >- bool checkUnsizedArrayConstructorArgumentDimensionality(TIntermSequence *arguments, >+ bool checkUnsizedArrayConstructorArgumentDimensionality(const TIntermSequence &arguments, > TType type, > const TSourceLoc &line); > > // Will set the size of the outermost array according to geometry shader input layout. > void checkGeometryShaderInputAndSetArraySize(const TSourceLoc &location, >- const char *token, >+ const ImmutableString &token, > TType *type); > > // Will size any unsized array type so unsized arrays won't need to be taken into account > // further along the line in parsing. > void checkIsNotUnsizedArray(const TSourceLoc &line, > const char *errorMessage, >- const char *token, >+ const ImmutableString &token, > TType *arrayType); > > TIntermTyped *addBinaryMathInternal(TOperator op, > TIntermTyped *left, > TIntermTyped *right, > const TSourceLoc &loc); >- TIntermBinary *createAssign(TOperator op, >- TIntermTyped *left, >- TIntermTyped *right, >- const TSourceLoc &loc); >- TIntermTyped *createUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &loc); >+ TIntermTyped *createUnaryMath(TOperator op, >+ TIntermTyped *child, >+ const TSourceLoc &loc, >+ const TFunction *func); > >- TIntermTyped *addMethod(TFunction *fnCall, >- TIntermSequence *arguments, >- TIntermNode *thisNode, >- const TSourceLoc &loc); >- TIntermTyped *addConstructor(TIntermSequence *arguments, >- TType type, >- const TSourceLoc &line); >- TIntermTyped *addNonConstructorFunctionCall(TFunction *fnCall, >- TIntermSequence *arguments, >- const TSourceLoc &loc); >+ TIntermTyped *addMethod(TFunctionLookup *fnCall, const TSourceLoc &loc); >+ TIntermTyped *addConstructor(TFunctionLookup *fnCall, const TSourceLoc &line); >+ TIntermTyped *addNonConstructorFunctionCall(TFunctionLookup *fnCall, const TSourceLoc &loc); >+ >+ // Return either the original expression or the folded version of the expression in case the >+ // folded node will validate the same way during subsequent parsing. >+ TIntermTyped *expressionOrFoldedResult(TIntermTyped *expression); > > // Return true if the checks pass > bool binaryOpCommonCheck(TOperator op, >@@ -604,12 +617,8 @@ class TParseContext : angle::NonCopyable > TString mHashErrMsg; > TDiagnostics *mDiagnostics; > TDirectiveHandler mDirectiveHandler; >- pp::Preprocessor mPreprocessor; >+ angle::pp::Preprocessor mPreprocessor; > void *mScanner; >- bool mUsesFragData; // track if we are using both gl_FragData and gl_FragColor >- bool mUsesFragColor; >- bool mUsesSecondaryOutputs; // Track if we are using either gl_SecondaryFragData or >- // gl_Secondary FragColor or both. > int mMinProgramTexelOffset; > int mMaxProgramTexelOffset; > >@@ -642,9 +651,6 @@ class TParseContext : angle::NonCopyable > int mGeometryShaderMaxVertices; > int mMaxGeometryShaderInvocations; > int mMaxGeometryShaderMaxVertices; >- >- // Track if all input array sizes are same and matches the latter input primitive declaration. >- unsigned int mGeometryShaderInputArraySize; > }; > > int PaParseStrings(size_t count, >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext_autogen.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext_autogen.h >new file mode 100644 >index 00000000000..f5eafd8cf67 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext_autogen.h >@@ -0,0 +1,66 @@ >+// GENERATED FILE - DO NOT EDIT. >+// Generated by gen_builtin_symbols.py using data from builtin_variables.json and >+// builtin_function_declarations.txt. >+// >+// 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. >+// >+// ParseContext_autogen.h: >+// Helpers for built-in related checks. >+ >+#ifndef COMPILER_TRANSLATOR_PARSECONTEXT_AUTOGEN_H_ >+#define COMPILER_TRANSLATOR_PARSECONTEXT_AUTOGEN_H_ >+ >+namespace sh >+{ >+ >+namespace BuiltInGroup >+{ >+ >+bool isTextureOffsetNoBias(const TFunction *func) >+{ >+ int id = func->uniqueId().get(); >+ return id >= 671 && id <= 740; >+} >+bool isTextureOffsetBias(const TFunction *func) >+{ >+ int id = func->uniqueId().get(); >+ return id >= 741 && id <= 760; >+} >+bool isTextureGatherOffset(const TFunction *func) >+{ >+ int id = func->uniqueId().get(); >+ return id >= 838 && id <= 851; >+} >+bool isTextureGather(const TFunction *func) >+{ >+ int id = func->uniqueId().get(); >+ return id >= 814 && id <= 851; >+} >+bool isAtomicMemory(const TFunction *func) >+{ >+ int id = func->uniqueId().get(); >+ return id >= 868 && id <= 885; >+} >+bool isImageLoad(const TFunction *func) >+{ >+ int id = func->uniqueId().get(); >+ return id >= 910 && id <= 921; >+} >+bool isImageStore(const TFunction *func) >+{ >+ int id = func->uniqueId().get(); >+ return id >= 922 && id <= 933; >+} >+bool isImage(const TFunction *func) >+{ >+ int id = func->uniqueId().get(); >+ return id >= 886 && id <= 933; >+} >+ >+} // namespace BuiltInGroup >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_PARSECONTEXT_AUTOGEN_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/PoolAlloc.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/PoolAlloc.cpp >index 0f1cd8b5c9d..7a95658e7bd 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/PoolAlloc.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/PoolAlloc.cpp >@@ -6,15 +6,8 @@ > > #include "compiler/translator/PoolAlloc.h" > >-#include <stdint.h> >-#include <stdio.h> > #include <assert.h> >- >-#include "common/angleutils.h" >-#include "common/debug.h" >-#include "common/platform.h" > #include "common/tls.h" >-#include "compiler/translator/InitializeGlobals.h" > > TLSIndex PoolIndex = TLS_INVALID_INDEX; > >@@ -34,327 +27,14 @@ void FreePoolIndex() > PoolIndex = TLS_INVALID_INDEX; > } > >-TPoolAllocator *GetGlobalPoolAllocator() >+angle::PoolAllocator *GetGlobalPoolAllocator() > { > assert(PoolIndex != TLS_INVALID_INDEX); >- return static_cast<TPoolAllocator *>(GetTLSValue(PoolIndex)); >+ return static_cast<angle::PoolAllocator *>(GetTLSValue(PoolIndex)); > } > >-void SetGlobalPoolAllocator(TPoolAllocator *poolAllocator) >+void SetGlobalPoolAllocator(angle::PoolAllocator *poolAllocator) > { > assert(PoolIndex != TLS_INVALID_INDEX); > SetTLSValue(PoolIndex, poolAllocator); > } >- >-// >-// Implement the functionality of the TPoolAllocator class, which >-// is documented in PoolAlloc.h. >-// >-TPoolAllocator::TPoolAllocator(int growthIncrement, int allocationAlignment) >- : alignment(allocationAlignment), >-#if !defined(ANGLE_TRANSLATOR_DISABLE_POOL_ALLOC) >- pageSize(growthIncrement), >- freeList(0), >- inUseList(0), >- numCalls(0), >- totalBytes(0), >-#endif >- mLocked(false) >-{ >- // >- // Adjust alignment to be at least pointer aligned and >- // power of 2. >- // >- size_t minAlign = sizeof(void *); >- alignment &= ~(minAlign - 1); >- if (alignment < minAlign) >- alignment = minAlign; >- size_t a = 1; >- while (a < alignment) >- a <<= 1; >- alignment = a; >- alignmentMask = a - 1; >- >-#if !defined(ANGLE_TRANSLATOR_DISABLE_POOL_ALLOC) >- // >- // Don't allow page sizes we know are smaller than all common >- // OS page sizes. >- // >- if (pageSize < 4 * 1024) >- pageSize = 4 * 1024; >- >- // >- // A large currentPageOffset indicates a new page needs to >- // be obtained to allocate memory. >- // >- currentPageOffset = pageSize; >- >- // >- // Align header skip >- // >- headerSkip = minAlign; >- if (headerSkip < sizeof(tHeader)) >- { >- headerSkip = (sizeof(tHeader) + alignmentMask) & ~alignmentMask; >- } >-#else // !defined(ANGLE_TRANSLATOR_DISABLE_POOL_ALLOC) >- mStack.push_back({}); >-#endif >-} >- >-TPoolAllocator::~TPoolAllocator() >-{ >-#if !defined(ANGLE_TRANSLATOR_DISABLE_POOL_ALLOC) >- while (inUseList) >- { >- tHeader *next = inUseList->nextPage; >- inUseList->~tHeader(); >- delete[] reinterpret_cast<char *>(inUseList); >- inUseList = next; >- } >- >- // We should not check the guard blocks >- // here, because we did it already when the block was >- // placed into the free list. >- // >- while (freeList) >- { >- tHeader *next = freeList->nextPage; >- delete[] reinterpret_cast<char *>(freeList); >- freeList = next; >- } >-#else // !defined(ANGLE_TRANSLATOR_DISABLE_POOL_ALLOC) >- for (auto &allocs : mStack) >- { >- for (auto alloc : allocs) >- { >- free(alloc); >- } >- } >- mStack.clear(); >-#endif >-} >- >-// Support MSVC++ 6.0 >-const unsigned char TAllocation::guardBlockBeginVal = 0xfb; >-const unsigned char TAllocation::guardBlockEndVal = 0xfe; >-const unsigned char TAllocation::userDataFill = 0xcd; >- >-#ifdef GUARD_BLOCKS >-const size_t TAllocation::guardBlockSize = 16; >-#else >-const size_t TAllocation::guardBlockSize = 0; >-#endif >- >-// >-// Check a single guard block for damage >-// >-void TAllocation::checkGuardBlock(unsigned char *blockMem, >- unsigned char val, >- const char *locText) const >-{ >-#ifdef GUARD_BLOCKS >- for (size_t x = 0; x < guardBlockSize; x++) >- { >- if (blockMem[x] != val) >- { >- char assertMsg[80]; >- >-// We don't print the assert message. It's here just to be helpful. >-#if defined(_MSC_VER) >- snprintf(assertMsg, sizeof(assertMsg), >- "PoolAlloc: Damage %s %Iu byte allocation at 0x%p\n", locText, size, data()); >-#else >- snprintf(assertMsg, sizeof(assertMsg), >- "PoolAlloc: Damage %s %zu byte allocation at 0x%p\n", locText, size, data()); >-#endif >- assert(0 && "PoolAlloc: Damage in guard block"); >- } >- } >-#endif >-} >- >-void TPoolAllocator::push() >-{ >-#if !defined(ANGLE_TRANSLATOR_DISABLE_POOL_ALLOC) >- tAllocState state = {currentPageOffset, inUseList}; >- >- mStack.push_back(state); >- >- // >- // Indicate there is no current page to allocate from. >- // >- currentPageOffset = pageSize; >-#else // !defined(ANGLE_TRANSLATOR_DISABLE_POOL_ALLOC) >- mStack.push_back({}); >-#endif >-} >- >-// >-// Do a mass-deallocation of all the individual allocations >-// that have occurred since the last push(), or since the >-// last pop(), or since the object's creation. >-// >-// The deallocated pages are saved for future allocations. >-// >-void TPoolAllocator::pop() >-{ >- if (mStack.size() < 1) >- return; >- >-#if !defined(ANGLE_TRANSLATOR_DISABLE_POOL_ALLOC) >- tHeader *page = mStack.back().page; >- currentPageOffset = mStack.back().offset; >- >- while (inUseList != page) >- { >- // invoke destructor to free allocation list >- inUseList->~tHeader(); >- >- tHeader *nextInUse = inUseList->nextPage; >- if (inUseList->pageCount > 1) >- delete[] reinterpret_cast<char *>(inUseList); >- else >- { >- inUseList->nextPage = freeList; >- freeList = inUseList; >- } >- inUseList = nextInUse; >- } >- >- mStack.pop_back(); >-#else // !defined(ANGLE_TRANSLATOR_DISABLE_POOL_ALLOC) >- for (auto &alloc : mStack.back()) >- { >- free(alloc); >- } >- mStack.pop_back(); >-#endif >-} >- >-// >-// Do a mass-deallocation of all the individual allocations >-// that have occurred. >-// >-void TPoolAllocator::popAll() >-{ >- while (mStack.size() > 0) >- pop(); >-} >- >-void *TPoolAllocator::allocate(size_t numBytes) >-{ >- ASSERT(!mLocked); >- >-#if !defined(ANGLE_TRANSLATOR_DISABLE_POOL_ALLOC) >- // >- // Just keep some interesting statistics. >- // >- ++numCalls; >- totalBytes += numBytes; >- >- // If we are using guard blocks, all allocations are bracketed by >- // them: [guardblock][allocation][guardblock]. numBytes is how >- // much memory the caller asked for. allocationSize is the total >- // size including guard blocks. In release build, >- // guardBlockSize=0 and this all gets optimized away. >- size_t allocationSize = TAllocation::allocationSize(numBytes); >- // Detect integer overflow. >- if (allocationSize < numBytes) >- return 0; >- >- // >- // Do the allocation, most likely case first, for efficiency. >- // This step could be moved to be inline sometime. >- // >- if (allocationSize <= pageSize - currentPageOffset) >- { >- // >- // Safe to allocate from currentPageOffset. >- // >- unsigned char *memory = reinterpret_cast<unsigned char *>(inUseList) + currentPageOffset; >- currentPageOffset += allocationSize; >- currentPageOffset = (currentPageOffset + alignmentMask) & ~alignmentMask; >- >- return initializeAllocation(inUseList, memory, numBytes); >- } >- >- if (allocationSize > pageSize - headerSkip) >- { >- // >- // Do a multi-page allocation. Don't mix these with the others. >- // The OS is efficient and allocating and free-ing multiple pages. >- // >- size_t numBytesToAlloc = allocationSize + headerSkip; >- // Detect integer overflow. >- if (numBytesToAlloc < allocationSize) >- return 0; >- >- tHeader *memory = reinterpret_cast<tHeader *>(::new char[numBytesToAlloc]); >- if (memory == 0) >- return 0; >- >- // Use placement-new to initialize header >- new (memory) tHeader(inUseList, (numBytesToAlloc + pageSize - 1) / pageSize); >- inUseList = memory; >- >- currentPageOffset = pageSize; // make next allocation come from a new page >- >- // No guard blocks for multi-page allocations (yet) >- return reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(memory) + headerSkip); >- } >- >- // >- // Need a simple page to allocate from. >- // >- tHeader *memory; >- if (freeList) >- { >- memory = freeList; >- freeList = freeList->nextPage; >- } >- else >- { >- memory = reinterpret_cast<tHeader *>(::new char[pageSize]); >- if (memory == 0) >- return 0; >- } >- >- // Use placement-new to initialize header >- new (memory) tHeader(inUseList, 1); >- inUseList = memory; >- >- unsigned char *ret = reinterpret_cast<unsigned char *>(inUseList) + headerSkip; >- currentPageOffset = (headerSkip + allocationSize + alignmentMask) & ~alignmentMask; >- >- return initializeAllocation(inUseList, ret, numBytes); >-#else // !defined(ANGLE_TRANSLATOR_DISABLE_POOL_ALLOC) >- void *alloc = malloc(numBytes + alignmentMask); >- mStack.back().push_back(alloc); >- >- intptr_t intAlloc = reinterpret_cast<intptr_t>(alloc); >- intAlloc = (intAlloc + alignmentMask) & ~alignmentMask; >- return reinterpret_cast<void *>(intAlloc); >-#endif >-} >- >-void TPoolAllocator::lock() >-{ >- ASSERT(!mLocked); >- mLocked = true; >-} >- >-void TPoolAllocator::unlock() >-{ >- ASSERT(mLocked); >- mLocked = false; >-} >- >-// >-// Check all allocations in a list for damage by calling check on each. >-// >-void TAllocation::checkAllocList() const >-{ >- for (const TAllocation *alloc = this; alloc != 0; alloc = alloc->prevAlloc) >- alloc->check(); >-} >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/PoolAlloc.h b/Source/ThirdParty/ANGLE/src/compiler/translator/PoolAlloc.h >index ad63bc4cd66..86980b43a12 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/PoolAlloc.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/PoolAlloc.h >@@ -7,243 +7,27 @@ > #ifndef COMPILER_TRANSLATOR_POOLALLOC_H_ > #define COMPILER_TRANSLATOR_POOLALLOC_H_ > >-#ifdef _DEBUG >-#define GUARD_BLOCKS // define to enable guard block sanity checking >-#endif >- >-// >-// This header defines an allocator that can be used to efficiently >-// allocate a large number of small requests for heap memory, with the >-// intention that they are not individually deallocated, but rather >-// collectively deallocated at one time. >-// >-// This simultaneously >-// >-// * Makes each individual allocation much more efficient; the >-// typical allocation is trivial. >-// * Completely avoids the cost of doing individual deallocation. >-// * Saves the trouble of tracking down and plugging a large class of leaks. > // >-// Individual classes can use this allocator by supplying their own >-// new and delete methods. >-// >-// STL containers can use this allocator by using the pool_allocator >+// This header defines the pool_allocator class that allows STL containers >+// to use the angle::PoolAllocator class by using the pool_allocator > // class as the allocator (second) template argument. > // >+// It also defines functions for managing the GlobalPoolAllocator used by the compiler. >+// > > #include <stddef.h> > #include <string.h> > #include <vector> > >-// If we are using guard blocks, we must track each indivual >-// allocation. If we aren't using guard blocks, these >-// never get instantiated, so won't have any impact. >-// >- >-class TAllocation >-{ >- public: >- TAllocation(size_t size, unsigned char *mem, TAllocation *prev = 0) >- : size(size), mem(mem), prevAlloc(prev) >- { >-// Allocations are bracketed: >-// [allocationHeader][initialGuardBlock][userData][finalGuardBlock] >-// This would be cleaner with if (guardBlockSize)..., but that >-// makes the compiler print warnings about 0 length memsets, >-// even with the if() protecting them. >-#ifdef GUARD_BLOCKS >- memset(preGuard(), guardBlockBeginVal, guardBlockSize); >- memset(data(), userDataFill, size); >- memset(postGuard(), guardBlockEndVal, guardBlockSize); >-#endif >- } >- >- void check() const >- { >- checkGuardBlock(preGuard(), guardBlockBeginVal, "before"); >- checkGuardBlock(postGuard(), guardBlockEndVal, "after"); >- } >- >- void checkAllocList() const; >- >- // Return total size needed to accomodate user buffer of 'size', >- // plus our tracking data. >- inline static size_t allocationSize(size_t size) >- { >- return size + 2 * guardBlockSize + headerSize(); >- } >- >- // Offset from surrounding buffer to get to user data buffer. >- inline static unsigned char *offsetAllocation(unsigned char *m) >- { >- return m + guardBlockSize + headerSize(); >- } >- >- private: >- void checkGuardBlock(unsigned char *blockMem, unsigned char val, const char *locText) const; >- >- // Find offsets to pre and post guard blocks, and user data buffer >- unsigned char *preGuard() const { return mem + headerSize(); } >- unsigned char *data() const { return preGuard() + guardBlockSize; } >- unsigned char *postGuard() const { return data() + size; } >- >- size_t size; // size of the user data area >- unsigned char *mem; // beginning of our allocation (pts to header) >- TAllocation *prevAlloc; // prior allocation in the chain >- >- // Support MSVC++ 6.0 >- const static unsigned char guardBlockBeginVal; >- const static unsigned char guardBlockEndVal; >- const static unsigned char userDataFill; >- >- const static size_t guardBlockSize; >-#ifdef GUARD_BLOCKS >- inline static size_t headerSize() { return sizeof(TAllocation); } >-#else >- inline static size_t headerSize() { return 0; } >-#endif >-}; >- >-// >-// There are several stacks. One is to track the pushing and popping >-// of the user, and not yet implemented. The others are simply a >-// repositories of free pages or used pages. >-// >-// Page stacks are linked together with a simple header at the beginning >-// of each allocation obtained from the underlying OS. Multi-page allocations >-// are returned to the OS. Individual page allocations are kept for future >-// re-use. >-// >-// The "page size" used is not, nor must it match, the underlying OS >-// page size. But, having it be about that size or equal to a set of >-// pages is likely most optimal. >-// >-class TPoolAllocator >-{ >- public: >- TPoolAllocator(int growthIncrement = 8 * 1024, int allocationAlignment = 16); >- >- // >- // Don't call the destructor just to free up the memory, call pop() >- // >- ~TPoolAllocator(); >- >- // >- // Call push() to establish a new place to pop memory too. Does not >- // have to be called to get things started. >- // >- void push(); >- >- // >- // Call pop() to free all memory allocated since the last call to push(), >- // or if no last call to push, frees all memory since first allocation. >- // >- void pop(); >- >- // >- // Call popAll() to free all memory allocated. >- // >- void popAll(); >- >- // >- // Call allocate() to actually acquire memory. Returns 0 if no memory >- // available, otherwise a properly aligned pointer to 'numBytes' of memory. >- // >- void *allocate(size_t numBytes); >- >- // >- // There is no deallocate. The point of this class is that >- // deallocation can be skipped by the user of it, as the model >- // of use is to simultaneously deallocate everything at once >- // by calling pop(), and to not have to solve memory leak problems. >- // >- >- // Catch unwanted allocations. >- // TODO(jmadill): Remove this when we remove the global allocator. >- void lock(); >- void unlock(); >- >- private: >- size_t alignment; // all returned allocations will be aligned at >- // this granularity, which will be a power of 2 >- size_t alignmentMask; >- >-#if !defined(ANGLE_TRANSLATOR_DISABLE_POOL_ALLOC) >- friend struct tHeader; >- >- struct tHeader >- { >- tHeader(tHeader *nextPage, size_t pageCount) >- : nextPage(nextPage), >- pageCount(pageCount) >-#ifdef GUARD_BLOCKS >- , >- lastAllocation(0) >-#endif >- { >- } >- >- ~tHeader() >- { >-#ifdef GUARD_BLOCKS >- if (lastAllocation) >- lastAllocation->checkAllocList(); >-#endif >- } >- >- tHeader *nextPage; >- size_t pageCount; >-#ifdef GUARD_BLOCKS >- TAllocation *lastAllocation; >-#endif >- }; >- >- struct tAllocState >- { >- size_t offset; >- tHeader *page; >- }; >- typedef std::vector<tAllocState> tAllocStack; >- >- // Track allocations if and only if we're using guard blocks >- void *initializeAllocation(tHeader *block, unsigned char *memory, size_t numBytes) >- { >-#ifdef GUARD_BLOCKS >- new (memory) TAllocation(numBytes, memory, block->lastAllocation); >- block->lastAllocation = reinterpret_cast<TAllocation *>(memory); >-#endif >- // This is optimized entirely away if GUARD_BLOCKS is not defined. >- return TAllocation::offsetAllocation(memory); >- } >- >- size_t pageSize; // granularity of allocation from the OS >- size_t headerSkip; // amount of memory to skip to make room for the >- // header (basically, size of header, rounded >- // up to make it aligned >- size_t currentPageOffset; // next offset in top of inUseList to allocate from >- tHeader *freeList; // list of popped memory >- tHeader *inUseList; // list of all memory currently being used >- tAllocStack mStack; // stack of where to allocate from, to partition pool >- >- int numCalls; // just an interesting statistic >- size_t totalBytes; // just an interesting statistic >- >-#else // !defined(ANGLE_TRANSLATOR_DISABLE_POOL_ALLOC) >- std::vector<std::vector<void *>> mStack; >-#endif >- >- TPoolAllocator &operator=(const TPoolAllocator &); // dont allow assignment operator >- TPoolAllocator(const TPoolAllocator &); // dont allow default copy constructor >- bool mLocked; >-}; >+#include "common/PoolAlloc.h" > > // > // There could potentially be many pools with pops happening at > // different times. But a simple use is to have a global pop > // with everyone using the same global allocator. > // >-extern TPoolAllocator *GetGlobalPoolAllocator(); >-extern void SetGlobalPoolAllocator(TPoolAllocator *poolAllocator); >+extern angle::PoolAllocator *GetGlobalPoolAllocator(); >+extern void SetGlobalPoolAllocator(angle::PoolAllocator *poolAllocator); > > // > // This STL compatible allocator is intended to be used as the allocator >@@ -276,8 +60,7 @@ class pool_allocator > > template <class Other> > pool_allocator(const pool_allocator<Other> &p) >- { >- } >+ {} > > template <class Other> > pool_allocator<T> &operator=(const pool_allocator<Other> &p) >@@ -295,11 +78,11 @@ class pool_allocator > #else > pointer allocate(size_type n) > { >- return reinterpret_cast<pointer>(getAllocator().allocate(n * sizeof(T))); >+ return static_cast<pointer>(getAllocator().allocate(n * sizeof(T))); > } > pointer allocate(size_type n, const void *) > { >- return reinterpret_cast<pointer>(getAllocator().allocate(n * sizeof(T))); >+ return static_cast<pointer>(getAllocator().allocate(n * sizeof(T))); > } > void deallocate(pointer, size_type) {} > #endif // _RWSTD_ALLOCATOR >@@ -313,7 +96,7 @@ class pool_allocator > size_type max_size() const { return static_cast<size_type>(-1) / sizeof(T); } > size_type max_size(int size) const { return static_cast<size_type>(-1) / size; } > >- TPoolAllocator &getAllocator() const { return *GetGlobalPoolAllocator(); } >+ angle::PoolAllocator &getAllocator() const { return *GetGlobalPoolAllocator(); } > }; > > #endif // COMPILER_TRANSLATOR_POOLALLOC_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/PruneNoOps.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/PruneNoOps.cpp >deleted file mode 100644 >index 6c9a02cd1cd..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/PruneNoOps.cpp >+++ /dev/null >@@ -1,156 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// PruneNoOps.cpp: The PruneNoOps function prunes: >-// 1. Empty declarations "int;". Empty declarators will be pruned as well, so for example: >-// int , a; >-// is turned into >-// int a; >-// 2. Literal statements: "1.0;". The ESSL output doesn't define a default precision for float, >-// so float literal statements would end up with no precision which is invalid ESSL. >- >-#include "compiler/translator/PruneNoOps.h" >- >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-bool IsNoOp(TIntermNode *node) >-{ >- if (node->getAsConstantUnion() != nullptr) >- { >- return true; >- } >- bool isEmptyDeclaration = node->getAsDeclarationNode() != nullptr && >- node->getAsDeclarationNode()->getSequence()->empty(); >- if (isEmptyDeclaration) >- { >- return true; >- } >- return false; >-} >- >-class PruneNoOpsTraverser : private TIntermTraverser >-{ >- public: >- static void apply(TIntermBlock *root); >- >- private: >- PruneNoOpsTraverser(); >- bool visitDeclaration(Visit, TIntermDeclaration *node) override; >- bool visitBlock(Visit visit, TIntermBlock *node) override; >- bool visitLoop(Visit visit, TIntermLoop *loop) override; >-}; >- >-void PruneNoOpsTraverser::apply(TIntermBlock *root) >-{ >- PruneNoOpsTraverser prune; >- root->traverse(&prune); >- prune.updateTree(); >-} >- >-PruneNoOpsTraverser::PruneNoOpsTraverser() : TIntermTraverser(true, false, false) >-{ >-} >- >-bool PruneNoOpsTraverser::visitDeclaration(Visit, TIntermDeclaration *node) >-{ >- TIntermSequence *sequence = node->getSequence(); >- if (sequence->size() >= 1) >- { >- TIntermSymbol *sym = sequence->front()->getAsSymbolNode(); >- // Prune declarations without a variable name, unless it's an interface block declaration. >- if (sym != nullptr && sym->getSymbol() == "" && !sym->isInterfaceBlock()) >- { >- if (sequence->size() > 1) >- { >- // Generate a replacement that will remove the empty declarator in the beginning of >- // a declarator list. Example of a declaration that will be changed: >- // float, a; >- // will be changed to >- // float a; >- // This applies also to struct declarations. >- TIntermSequence emptyReplacement; >- mMultiReplacements.push_back( >- NodeReplaceWithMultipleEntry(node, sym, emptyReplacement)); >- } >- else if (sym->getBasicType() != EbtStruct) >- { >- // If there are entirely empty non-struct declarations, they result in >- // TIntermDeclaration nodes without any children in the parsing stage. These are >- // handled in visitBlock and visitLoop. >- UNREACHABLE(); >- } >- else if (sym->getType().getQualifier() != EvqGlobal && >- sym->getType().getQualifier() != EvqTemporary) >- { >- // Single struct declarations may just declare the struct type and no variables, so >- // they should not be pruned. Here we handle an empty struct declaration with a >- // qualifier, for example like this: >- // const struct a { int i; }; >- // NVIDIA GL driver version 367.27 doesn't accept this kind of declarations, so we >- // convert the declaration to a regular struct declaration. This is okay, since ESSL >- // 1.00 spec section 4.1.8 says about structs that "The optional qualifiers only >- // apply to any declarators, and are not part of the type being defined for name." >- >- if (mInGlobalScope) >- { >- sym->getTypePointer()->setQualifier(EvqGlobal); >- } >- else >- { >- sym->getTypePointer()->setQualifier(EvqTemporary); >- } >- } >- } >- } >- return false; >-} >- >-bool PruneNoOpsTraverser::visitBlock(Visit visit, TIntermBlock *node) >-{ >- TIntermSequence *statements = node->getSequence(); >- >- for (TIntermNode *statement : *statements) >- { >- if (IsNoOp(statement)) >- { >- TIntermSequence emptyReplacement; >- mMultiReplacements.push_back( >- NodeReplaceWithMultipleEntry(node, statement, emptyReplacement)); >- } >- } >- >- return true; >-} >- >-bool PruneNoOpsTraverser::visitLoop(Visit visit, TIntermLoop *loop) >-{ >- TIntermTyped *expr = loop->getExpression(); >- if (expr != nullptr && IsNoOp(expr)) >- { >- loop->setExpression(nullptr); >- } >- TIntermNode *init = loop->getInit(); >- if (init != nullptr && IsNoOp(init)) >- { >- loop->setInit(nullptr); >- } >- >- return true; >-} >- >-} // namespace >- >-void PruneNoOps(TIntermBlock *root) >-{ >- PruneNoOpsTraverser::apply(root); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/PruneNoOps.h b/Source/ThirdParty/ANGLE/src/compiler/translator/PruneNoOps.h >deleted file mode 100644 >index c421cecca45..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/PruneNoOps.h >+++ /dev/null >@@ -1,24 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// PruneNoOps.h: The PruneNoOps function prunes: >-// 1. Empty declarations "int;". Empty declarators will be pruned as well, so for example: >-// int , a; >-// is turned into >-// int a; >-// 2. Literal statements: "1.0;". The ESSL output doesn't define a default precision for float, >-// so float literal statements would end up with no precision which is invalid ESSL. >- >-#ifndef COMPILER_TRANSLATOR_PRUNENOOPS_H_ >-#define COMPILER_TRANSLATOR_PRUNENOOPS_H_ >- >-namespace sh >-{ >-class TIntermBlock; >- >-void PruneNoOps(TIntermBlock *root); >-} >- >-#endif // COMPILER_TRANSLATOR_PRUNENOOPS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/QualifierTypes.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/QualifierTypes.cpp >index f7481759579..f9b4474b508 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/QualifierTypes.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/QualifierTypes.cpp >@@ -7,6 +7,7 @@ > #include "compiler/translator/QualifierTypes.h" > > #include "compiler/translator/Diagnostics.h" >+#include "compiler/translator/ImmutableStringBuilder.h" > > #include <algorithm> > >@@ -16,6 +17,35 @@ namespace sh > namespace > { > >+constexpr const ImmutableString kSpecifiedMultipleTimes(" specified multiple times"); >+constexpr const ImmutableString kInvariantMultipleTimes( >+ "The invariant qualifier specified multiple times."); >+constexpr const ImmutableString kPrecisionMultipleTimes( >+ "The precision qualifier specified multiple times."); >+constexpr const ImmutableString kLayoutMultipleTimes( >+ "The layout qualifier specified multiple times."); >+constexpr const ImmutableString kLayoutAndInvariantDisallowed( >+ "The layout qualifier and invariant qualifier cannot coexist in the same " >+ "declaration according to the grammar."); >+constexpr const ImmutableString kInterpolationMultipleTimes( >+ "The interpolation qualifier specified multiple times."); >+constexpr const ImmutableString kOutputLayoutMultipleTimes( >+ "Output layout location specified multiple times."); >+constexpr const ImmutableString kInvariantQualifierFirst( >+ "The invariant qualifier has to be first in the expression."); >+constexpr const ImmutableString kStorageAfterInterpolation( >+ "Storage qualifiers have to be after interpolation qualifiers."); >+constexpr const ImmutableString kPrecisionAfterInterpolation( >+ "Precision qualifiers have to be after interpolation qualifiers."); >+constexpr const ImmutableString kStorageAfterLayout( >+ "Storage qualifiers have to be after layout qualifiers."); >+constexpr const ImmutableString kPrecisionAfterLayout( >+ "Precision qualifiers have to be after layout qualifiers."); >+constexpr const ImmutableString kPrecisionAfterStorage( >+ "Precision qualifiers have to be after storage qualifiers."); >+constexpr const ImmutableString kPrecisionAfterMemory( >+ "Precision qualifiers have to be after memory qualifiers."); >+ > // GLSL ES 3.10 does not impose a strict order on type qualifiers and allows multiple layout > // declarations. > // GLSL ES 3.10 Revision 4, 4.10 Order of Qualification >@@ -47,11 +77,18 @@ bool IsInvariantCorrect(const TTypeQualifierBuilder::QualifierSequence &qualifie > return qualifiers.size() >= 1 && IsScopeQualifierWrapper(qualifiers[0]); > } > >+ImmutableString QualifierSpecifiedMultipleTimesErrorMessage(const ImmutableString &qualifierString) >+{ >+ ImmutableStringBuilder errorMsg(qualifierString.length() + kSpecifiedMultipleTimes.length()); >+ errorMsg << qualifierString << kSpecifiedMultipleTimes; >+ return errorMsg; >+} >+ > // Returns true if there are qualifiers which have been specified multiple times > // If areQualifierChecksRelaxed is set to true, then layout qualifier repetition is allowed. > bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qualifiers, > bool areQualifierChecksRelaxed, >- std::string *errorMessage) >+ ImmutableString *errorMessage) > { > bool invariantFound = false; > bool precisionFound = false; >@@ -71,7 +108,7 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual > { > if (invariantFound) > { >- *errorMessage = "The invariant qualifier specified multiple times."; >+ *errorMessage = kInvariantMultipleTimes; > return true; > } > invariantFound = true; >@@ -81,7 +118,7 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual > { > if (precisionFound) > { >- *errorMessage = "The precision qualifier specified multiple times."; >+ *errorMessage = kPrecisionMultipleTimes; > return true; > } > precisionFound = true; >@@ -91,7 +128,7 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual > { > if (layoutFound && !areQualifierChecksRelaxed) > { >- *errorMessage = "The layout qualifier specified multiple times."; >+ *errorMessage = kLayoutMultipleTimes; > return true; > } > if (invariantFound && !areQualifierChecksRelaxed) >@@ -99,9 +136,7 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual > // This combination is not correct according to the syntax specified in the > // formal grammar in the ESSL 3.00 spec. In ESSL 3.10 the grammar does not have > // a similar restriction. >- *errorMessage = >- "The layout qualifier and invariant qualifier cannot coexist in the same " >- "declaration according to the grammar."; >+ *errorMessage = kLayoutAndInvariantDisallowed; > return true; > } > layoutFound = true; >@@ -117,7 +152,7 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual > // 'smooth centroid' will be squashed to 'centroid' > if (interpolationFound) > { >- *errorMessage = "The interpolation qualifier specified multiple times."; >+ *errorMessage = kInterpolationMultipleTimes; > return true; > } > interpolationFound = true; >@@ -142,8 +177,8 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual > TQualifier previousQualifier = previousQualifierWrapper->getQualifier(); > if (currentQualifier == previousQualifier) > { >- *errorMessage = previousQualifierWrapper->getQualifierString().c_str(); >- *errorMessage += " specified multiple times"; >+ *errorMessage = QualifierSpecifiedMultipleTimesErrorMessage( >+ previousQualifierWrapper->getQualifierString()); > return true; > } > } >@@ -167,8 +202,8 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual > TQualifier previousQualifier = previousQualifierWrapper->getQualifier(); > if (currentQualifier == previousQualifier) > { >- *errorMessage = previousQualifierWrapper->getQualifierString().c_str(); >- *errorMessage += " specified multiple times"; >+ *errorMessage = QualifierSpecifiedMultipleTimesErrorMessage( >+ previousQualifierWrapper->getQualifierString()); > return true; > } > } >@@ -185,7 +220,7 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual > // GLSL ES 3.00.6 section 4.3.8.2 Output Layout Qualifiers > // GLSL ES 3.10 section 4.4.2 Output Layout Qualifiers > // "The qualifier may appear at most once within a declaration." >- *errorMessage = "Output layout location specified multiple times."; >+ *errorMessage = kOutputLayoutMultipleTimes; > return true; > } > >@@ -197,7 +232,7 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual > // invariant-qualifier interpolation-qualifier storage-qualifier precision-qualifier > // layout-qualifier has to be before storage-qualifier. > bool AreQualifiersInOrder(const TTypeQualifierBuilder::QualifierSequence &qualifiers, >- std::string *errorMessage) >+ ImmutableString *errorMessage) > { > bool foundInterpolation = false; > bool foundStorage = false; >@@ -209,20 +244,19 @@ bool AreQualifiersInOrder(const TTypeQualifierBuilder::QualifierSequence &qualif > case QtInvariant: > if (foundInterpolation || foundStorage || foundPrecision) > { >- *errorMessage = "The invariant qualifier has to be first in the expression."; >+ *errorMessage = kInvariantQualifierFirst; > return false; > } > break; > case QtInterpolation: > if (foundStorage) > { >- *errorMessage = "Storage qualifiers have to be after interpolation qualifiers."; >+ *errorMessage = kStorageAfterInterpolation; > return false; > } > else if (foundPrecision) > { >- *errorMessage = >- "Precision qualifiers have to be after interpolation qualifiers."; >+ *errorMessage = kPrecisionAfterInterpolation; > return false; > } > foundInterpolation = true; >@@ -230,19 +264,19 @@ bool AreQualifiersInOrder(const TTypeQualifierBuilder::QualifierSequence &qualif > case QtLayout: > if (foundStorage) > { >- *errorMessage = "Storage qualifiers have to be after layout qualifiers."; >+ *errorMessage = kStorageAfterLayout; > return false; > } > else if (foundPrecision) > { >- *errorMessage = "Precision qualifiers have to be after layout qualifiers."; >+ *errorMessage = kPrecisionAfterLayout; > return false; > } > break; > case QtStorage: > if (foundPrecision) > { >- *errorMessage = "Precision qualifiers have to be after storage qualifiers."; >+ *errorMessage = kPrecisionAfterStorage; > return false; > } > foundStorage = true; >@@ -250,7 +284,7 @@ bool AreQualifiersInOrder(const TTypeQualifierBuilder::QualifierSequence &qualif > case QtMemory: > if (foundPrecision) > { >- *errorMessage = "Precision qualifiers have to be after memory qualifiers."; >+ *errorMessage = kPrecisionAfterMemory; > return false; > } > break; >@@ -480,9 +514,9 @@ TTypeQualifier GetVariableTypeQualifierFromSortedSequence( > } > if (!isQualifierValid) > { >- const TString &qualifierString = qualifier->getQualifierString(); >+ const ImmutableString &qualifierString = qualifier->getQualifierString(); > diagnostics->error(qualifier->getLine(), "invalid qualifier combination", >- qualifierString.c_str()); >+ qualifierString.data()); > break; > } > } >@@ -525,9 +559,9 @@ TTypeQualifier GetParameterTypeQualifierFromSortedSequence( > } > if (!isQualifierValid) > { >- const TString &qualifierString = qualifier->getQualifierString(); >+ const ImmutableString &qualifierString = qualifier->getQualifierString(); > diagnostics->error(qualifier->getLine(), "invalid parameter qualifier", >- qualifierString.c_str()); >+ qualifierString.data()); > break; > } > } >@@ -648,6 +682,17 @@ TLayoutQualifier JoinLayoutQualifiers(TLayoutQualifier leftQualifier, > joinedQualifier.maxVertices = rightQualifier.maxVertices; > } > >+ if (rightQualifier.index != -1) >+ { >+ if (joinedQualifier.index != -1) >+ { >+ // EXT_blend_func_extended spec: "Each of these qualifiers may appear at most once" >+ diagnostics->error(rightQualifierLocation, "Cannot have multiple index specifiers", >+ "index"); >+ } >+ joinedQualifier.index = rightQualifier.index; >+ } >+ > return joinedQualifier; > } > >@@ -717,16 +762,16 @@ void TTypeQualifierBuilder::appendQualifier(const TQualifierWrapperBase *qualifi > bool TTypeQualifierBuilder::checkSequenceIsValid(TDiagnostics *diagnostics) const > { > bool areQualifierChecksRelaxed = AreTypeQualifierChecksRelaxed(mShaderVersion); >- std::string errorMessage; >+ ImmutableString errorMessage(""); > if (HasRepeatingQualifiers(mQualifiers, areQualifierChecksRelaxed, &errorMessage)) > { >- diagnostics->error(mQualifiers[0]->getLine(), errorMessage.c_str(), "qualifier sequence"); >+ diagnostics->error(mQualifiers[0]->getLine(), errorMessage.data(), "qualifier sequence"); > return false; > } > > if (!areQualifierChecksRelaxed && !AreQualifiersInOrder(mQualifiers, &errorMessage)) > { >- diagnostics->error(mQualifiers[0]->getLine(), errorMessage.c_str(), "qualifier sequence"); >+ diagnostics->error(mQualifiers[0]->getLine(), errorMessage.data(), "qualifier sequence"); > return false; > } > >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/QualifierTypes.h b/Source/ThirdParty/ANGLE/src/compiler/translator/QualifierTypes.h >index 10bdeed89db..950ba5f93ed 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/QualifierTypes.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/QualifierTypes.h >@@ -9,6 +9,7 @@ > > #include "common/angleutils.h" > #include "compiler/translator/BaseTypes.h" >+#include "compiler/translator/ImmutableString.h" > #include "compiler/translator/Types.h" > > namespace sh >@@ -33,13 +34,14 @@ enum TQualifierType > class TQualifierWrapperBase : angle::NonCopyable > { > public: >- POOL_ALLOCATOR_NEW_DELETE(); >+ POOL_ALLOCATOR_NEW_DELETE > TQualifierWrapperBase(const TSourceLoc &line) : mLine(line) {} >- virtual ~TQualifierWrapperBase(){}; >- virtual TQualifierType getType() const = 0; >- virtual TString getQualifierString() const = 0; >- virtual unsigned int getRank() const = 0; >+ virtual ~TQualifierWrapperBase() {} >+ virtual TQualifierType getType() const = 0; >+ virtual ImmutableString getQualifierString() const = 0; >+ virtual unsigned int getRank() const = 0; > const TSourceLoc &getLine() const { return mLine; } >+ > private: > TSourceLoc mLine; > }; >@@ -50,9 +52,9 @@ class TInvariantQualifierWrapper final : public TQualifierWrapperBase > TInvariantQualifierWrapper(const TSourceLoc &line) : TQualifierWrapperBase(line) {} > ~TInvariantQualifierWrapper() {} > >- TQualifierType getType() const { return QtInvariant; } >- TString getQualifierString() const { return "invariant"; } >- unsigned int getRank() const; >+ TQualifierType getType() const override { return QtInvariant; } >+ ImmutableString getQualifierString() const override { return ImmutableString("invariant"); } >+ unsigned int getRank() const override; > }; > > class TInterpolationQualifierWrapper final : public TQualifierWrapperBase >@@ -60,14 +62,16 @@ class TInterpolationQualifierWrapper final : public TQualifierWrapperBase > public: > TInterpolationQualifierWrapper(TQualifier interpolationQualifier, const TSourceLoc &line) > : TQualifierWrapperBase(line), mInterpolationQualifier(interpolationQualifier) >- { >- } >+ {} > ~TInterpolationQualifierWrapper() {} > >- TQualifierType getType() const { return QtInterpolation; } >- TString getQualifierString() const { return sh::getQualifierString(mInterpolationQualifier); } >+ TQualifierType getType() const override { return QtInterpolation; } >+ ImmutableString getQualifierString() const override >+ { >+ return ImmutableString(sh::getQualifierString(mInterpolationQualifier)); >+ } > TQualifier getQualifier() const { return mInterpolationQualifier; } >- unsigned int getRank() const; >+ unsigned int getRank() const override; > > private: > TQualifier mInterpolationQualifier; >@@ -78,14 +82,13 @@ class TLayoutQualifierWrapper final : public TQualifierWrapperBase > public: > TLayoutQualifierWrapper(TLayoutQualifier layoutQualifier, const TSourceLoc &line) > : TQualifierWrapperBase(line), mLayoutQualifier(layoutQualifier) >- { >- } >+ {} > ~TLayoutQualifierWrapper() {} > >- TQualifierType getType() const { return QtLayout; } >- TString getQualifierString() const { return "layout"; } >+ TQualifierType getType() const override { return QtLayout; } >+ ImmutableString getQualifierString() const override { return ImmutableString("layout"); } > const TLayoutQualifier &getQualifier() const { return mLayoutQualifier; } >- unsigned int getRank() const; >+ unsigned int getRank() const override; > > private: > TLayoutQualifier mLayoutQualifier; >@@ -96,14 +99,16 @@ class TStorageQualifierWrapper final : public TQualifierWrapperBase > public: > TStorageQualifierWrapper(TQualifier storageQualifier, const TSourceLoc &line) > : TQualifierWrapperBase(line), mStorageQualifier(storageQualifier) >- { >- } >+ {} > ~TStorageQualifierWrapper() {} > >- TQualifierType getType() const { return QtStorage; } >- TString getQualifierString() const { return sh::getQualifierString(mStorageQualifier); } >+ TQualifierType getType() const override { return QtStorage; } >+ ImmutableString getQualifierString() const override >+ { >+ return ImmutableString(sh::getQualifierString(mStorageQualifier)); >+ } > TQualifier getQualifier() const { return mStorageQualifier; } >- unsigned int getRank() const; >+ unsigned int getRank() const override; > > private: > TQualifier mStorageQualifier; >@@ -114,14 +119,16 @@ class TPrecisionQualifierWrapper final : public TQualifierWrapperBase > public: > TPrecisionQualifierWrapper(TPrecision precisionQualifier, const TSourceLoc &line) > : TQualifierWrapperBase(line), mPrecisionQualifier(precisionQualifier) >- { >- } >+ {} > ~TPrecisionQualifierWrapper() {} > >- TQualifierType getType() const { return QtPrecision; } >- TString getQualifierString() const { return sh::getPrecisionString(mPrecisionQualifier); } >+ TQualifierType getType() const override { return QtPrecision; } >+ ImmutableString getQualifierString() const override >+ { >+ return ImmutableString(sh::getPrecisionString(mPrecisionQualifier)); >+ } > TPrecision getQualifier() const { return mPrecisionQualifier; } >- unsigned int getRank() const; >+ unsigned int getRank() const override; > > private: > TPrecision mPrecisionQualifier; >@@ -132,14 +139,16 @@ class TMemoryQualifierWrapper final : public TQualifierWrapperBase > public: > TMemoryQualifierWrapper(TQualifier memoryQualifier, const TSourceLoc &line) > : TQualifierWrapperBase(line), mMemoryQualifier(memoryQualifier) >- { >- } >+ {} > ~TMemoryQualifierWrapper() {} > >- TQualifierType getType() const { return QtMemory; } >- TString getQualifierString() const { return sh::getQualifierString(mMemoryQualifier); } >+ TQualifierType getType() const override { return QtMemory; } >+ ImmutableString getQualifierString() const override >+ { >+ return ImmutableString(sh::getQualifierString(mMemoryQualifier)); >+ } > TQualifier getQualifier() const { return mMemoryQualifier; } >- unsigned int getRank() const; >+ unsigned int getRank() const override; > > private: > TQualifier mMemoryQualifier; >@@ -167,7 +176,7 @@ class TTypeQualifierBuilder : angle::NonCopyable > using QualifierSequence = TVector<const TQualifierWrapperBase *>; > > public: >- POOL_ALLOCATOR_NEW_DELETE(); >+ POOL_ALLOCATOR_NEW_DELETE > TTypeQualifierBuilder(const TStorageQualifierWrapper *scope, int shaderVersion); > // Adds the passed qualifier to the end of the sequence. > void appendQualifier(const TQualifierWrapperBase *qualifier); >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RecordConstantPrecision.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RecordConstantPrecision.cpp >deleted file mode 100644 >index 5233a29f195..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RecordConstantPrecision.cpp >+++ /dev/null >@@ -1,167 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// During parsing, all constant expressions are folded to constant union nodes. The expressions that >-// have been folded may have had precision qualifiers, which should affect the precision of the >-// consuming operation. If the folded constant union nodes are written to output as such they won't >-// have any precision qualifiers, and their effect on the precision of the consuming operation is >-// lost. >-// >-// RecordConstantPrecision is an AST traverser that inspects the precision qualifiers of constants >-// and hoists the constants outside the containing expression as precision qualified named variables >-// in case that is required for correct precision propagation. >-// >- >-#include "compiler/translator/RecordConstantPrecision.h" >- >-#include "compiler/translator/InfoSink.h" >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class RecordConstantPrecisionTraverser : public TIntermTraverser >-{ >- public: >- RecordConstantPrecisionTraverser(TSymbolTable *symbolTable); >- >- void visitConstantUnion(TIntermConstantUnion *node) override; >- >- void nextIteration(); >- >- bool foundHigherPrecisionConstant() const { return mFoundHigherPrecisionConstant; } >- protected: >- bool operandAffectsParentOperationPrecision(TIntermTyped *operand); >- >- bool mFoundHigherPrecisionConstant; >-}; >- >-RecordConstantPrecisionTraverser::RecordConstantPrecisionTraverser(TSymbolTable *symbolTable) >- : TIntermTraverser(true, false, true, symbolTable), mFoundHigherPrecisionConstant(false) >-{ >-} >- >-bool RecordConstantPrecisionTraverser::operandAffectsParentOperationPrecision(TIntermTyped *operand) >-{ >- if (getParentNode()->getAsCaseNode() || getParentNode()->getAsBlock()) >- { >- return false; >- } >- >- const TIntermBinary *parentAsBinary = getParentNode()->getAsBinaryNode(); >- if (parentAsBinary != nullptr) >- { >- // If the constant is assigned or is used to initialize a variable, or if it's an index, >- // its precision has no effect. >- switch (parentAsBinary->getOp()) >- { >- case EOpInitialize: >- case EOpAssign: >- case EOpIndexDirect: >- case EOpIndexDirectStruct: >- case EOpIndexDirectInterfaceBlock: >- case EOpIndexIndirect: >- return false; >- default: >- break; >- } >- >- TIntermTyped *otherOperand = parentAsBinary->getRight(); >- if (otherOperand == operand) >- { >- otherOperand = parentAsBinary->getLeft(); >- } >- // If the precision of the other child is at least as high as the precision of the constant, >- // the precision of the constant has no effect. >- if (otherOperand->getAsConstantUnion() == nullptr && >- otherOperand->getPrecision() >= operand->getPrecision()) >- { >- return false; >- } >- } >- >- TIntermAggregate *parentAsAggregate = getParentNode()->getAsAggregate(); >- if (parentAsAggregate != nullptr) >- { >- if (!parentAsAggregate->gotPrecisionFromChildren()) >- { >- // This can be either: >- // * a call to an user-defined function >- // * a call to a texture function >- // * some other kind of aggregate >- // In any of these cases the constant precision has no effect. >- return false; >- } >- if (parentAsAggregate->isConstructor() && parentAsAggregate->getBasicType() == EbtBool) >- { >- return false; >- } >- // If the precision of operands does affect the result, but the precision of any of the >- // other children has a precision that's at least as high as the precision of the constant, >- // the precision of the constant has no effect. >- TIntermSequence *parameters = parentAsAggregate->getSequence(); >- for (TIntermNode *parameter : *parameters) >- { >- const TIntermTyped *typedParameter = parameter->getAsTyped(); >- if (parameter != operand && typedParameter != nullptr && >- parameter->getAsConstantUnion() == nullptr && >- typedParameter->getPrecision() >= operand->getPrecision()) >- { >- return false; >- } >- } >- } >- return true; >-} >- >-void RecordConstantPrecisionTraverser::visitConstantUnion(TIntermConstantUnion *node) >-{ >- if (mFoundHigherPrecisionConstant) >- return; >- >- // If the constant has lowp or undefined precision, it can't increase the precision of consuming >- // operations. >- if (node->getPrecision() < EbpMedium) >- return; >- >- // It's possible the node has no effect on the precision of the consuming expression, depending >- // on the consuming expression, and the precision of the other parameters of the expression. >- if (!operandAffectsParentOperationPrecision(node)) >- return; >- >- // Make the constant a precision-qualified named variable to make sure it affects the precision >- // of the consuming expression. >- TIntermSequence insertions; >- insertions.push_back(createTempInitDeclaration(node, EvqConst)); >- insertStatementsInParentBlock(insertions); >- queueReplacement(createTempSymbol(node->getType()), OriginalNode::IS_DROPPED); >- mFoundHigherPrecisionConstant = true; >-} >- >-void RecordConstantPrecisionTraverser::nextIteration() >-{ >- nextTemporaryId(); >- mFoundHigherPrecisionConstant = false; >-} >- >-} // namespace >- >-void RecordConstantPrecision(TIntermNode *root, TSymbolTable *symbolTable) >-{ >- RecordConstantPrecisionTraverser traverser(symbolTable); >- // Iterate as necessary, and reset the traverser between iterations. >- do >- { >- traverser.nextIteration(); >- root->traverse(&traverser); >- if (traverser.foundHigherPrecisionConstant()) >- traverser.updateTree(); >- } while (traverser.foundHigherPrecisionConstant()); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RecordConstantPrecision.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RecordConstantPrecision.h >deleted file mode 100644 >index f86c2a86939..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RecordConstantPrecision.h >+++ /dev/null >@@ -1,28 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// During parsing, all constant expressions are folded to constant union nodes. The expressions that >-// have been folded may have had precision qualifiers, which should affect the precision of the >-// consuming operation. If the folded constant union nodes are written to output as such they won't >-// have any precision qualifiers, and their effect on the precision of the consuming operation is >-// lost. >-// >-// RecordConstantPrecision is an AST traverser that inspects the precision qualifiers of constants >-// and hoists the constants outside the containing expression as precision qualified named variables >-// in case that is required for correct precision propagation. >-// >- >-#ifndef COMPILER_TRANSLATOR_RECORDCONSTANTPRECISION_H_ >-#define COMPILER_TRANSLATOR_RECORDCONSTANTPRECISION_H_ >- >-namespace sh >-{ >-class TIntermNode; >-class TSymbolTable; >- >-void RecordConstantPrecision(TIntermNode *root, TSymbolTable *symbolTable); >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_RECORDCONSTANTPRECISION_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RegenerateStructNames.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RegenerateStructNames.cpp >deleted file mode 100644 >index 55fb124a42a..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RegenerateStructNames.cpp >+++ /dev/null >@@ -1,76 +0,0 @@ >-// >-// Copyright (c) 2002-2014 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. >-// >- >-#include "common/debug.h" >-#include "compiler/translator/RegenerateStructNames.h" >- >-namespace sh >-{ >- >-void RegenerateStructNames::visitSymbol(TIntermSymbol *symbol) >-{ >- ASSERT(symbol); >- TType *type = symbol->getTypePointer(); >- ASSERT(type); >- TStructure *userType = type->getStruct(); >- if (!userType) >- return; >- >- if (mSymbolTable->findBuiltIn(userType->name(), mShaderVersion)) >- { >- // Built-in struct, do not touch it. >- return; >- } >- >- int uniqueId = userType->uniqueId(); >- >- ASSERT(mScopeDepth > 0); >- if (mScopeDepth == 1) >- { >- // If a struct is defined at global scope, we don't map its name. >- // This is because at global level, the struct might be used to >- // declare a uniform, so the same name needs to stay the same for >- // vertex/fragment shaders. However, our mapping uses internal ID, >- // which will be different for the same struct in vertex/fragment >- // shaders. >- // This is OK because names for any structs defined in other scopes >- // will begin with "_webgl", which is reserved. So there will be >- // no conflicts among unmapped struct names from global scope and >- // mapped struct names from other scopes. >- // However, we need to keep track of these global structs, so if a >- // variable is used in a local scope, we don't try to modify the >- // struct name through that variable. >- mDeclaredGlobalStructs.insert(uniqueId); >- return; >- } >- if (mDeclaredGlobalStructs.count(uniqueId) > 0) >- return; >- // Map {name} to _webgl_struct_{uniqueId}_{name}. >- const char kPrefix[] = "_webgl_struct_"; >- if (userType->name().find(kPrefix) == 0) >- { >- // The name has already been regenerated. >- return; >- } >- std::string id = Str(uniqueId); >- TString tmp = kPrefix + TString(id.c_str()); >- tmp += "_" + userType->name(); >- userType->setName(tmp); >-} >- >-bool RegenerateStructNames::visitBlock(Visit, TIntermBlock *block) >-{ >- ++mScopeDepth; >- TIntermSequence &sequence = *(block->getSequence()); >- for (TIntermNode *node : sequence) >- { >- node->traverse(this); >- } >- --mScopeDepth; >- return false; >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RegenerateStructNames.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RegenerateStructNames.h >deleted file mode 100644 >index 293720b6a44..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RegenerateStructNames.h >+++ /dev/null >@@ -1,45 +0,0 @@ >-// >-// Copyright (c) 2002-2014 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. >-// >- >-#ifndef COMPILER_TRANSLATOR_REGENERATESTRUCTNAMES_H_ >-#define COMPILER_TRANSLATOR_REGENERATESTRUCTNAMES_H_ >- >-#include "compiler/translator/IntermTraverse.h" >-#include "compiler/translator/SymbolTable.h" >- >-#include <set> >- >-namespace sh >-{ >- >-class RegenerateStructNames : public TIntermTraverser >-{ >- public: >- RegenerateStructNames(TSymbolTable *symbolTable, int shaderVersion) >- : TIntermTraverser(true, false, false, symbolTable), >- mShaderVersion(shaderVersion), >- mScopeDepth(0) >- { >- } >- >- protected: >- void visitSymbol(TIntermSymbol *) override; >- bool visitBlock(Visit, TIntermBlock *block) override; >- >- private: >- int mShaderVersion; >- >- // Indicating the depth of the current scope. >- // The global scope is 1. >- int mScopeDepth; >- >- // If a struct's declared globally, push its ID in this set. >- std::set<int> mDeclaredGlobalStructs; >-}; >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_REGENERATESTRUCTNAMES_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveArrayLengthMethod.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveArrayLengthMethod.cpp >deleted file mode 100644 >index e9e6a170131..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveArrayLengthMethod.cpp >+++ /dev/null >@@ -1,83 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// RemoveArrayLengthMethod.cpp: >-// Fold array length expressions, including cases where the "this" node has side effects. >-// Example: >-// int i = (a = b).length(); >-// int j = (func()).length(); >-// becomes: >-// (a = b); >-// int i = <constant array length>; >-// func(); >-// int j = <constant array length>; >-// >-// Must be run after SplitSequenceOperator, SimplifyLoopConditions and SeparateDeclarations steps >-// have been done to expressions containing calls of the array length method. >-// >-// Does nothing to length method calls done on runtime-sized arrays. >- >-#include "compiler/translator/RemoveArrayLengthMethod.h" >- >-#include "compiler/translator/IntermNode.h" >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class RemoveArrayLengthTraverser : public TIntermTraverser >-{ >- public: >- RemoveArrayLengthTraverser() : TIntermTraverser(true, false, false), mFoundArrayLength(false) {} >- >- bool visitUnary(Visit visit, TIntermUnary *node) override; >- >- void nextIteration() { mFoundArrayLength = false; } >- >- bool foundArrayLength() const { return mFoundArrayLength; } >- >- private: >- bool mFoundArrayLength; >-}; >- >-bool RemoveArrayLengthTraverser::visitUnary(Visit visit, TIntermUnary *node) >-{ >- // The only case where we leave array length() in place is for runtime-sized arrays. >- if (node->getOp() == EOpArrayLength && !node->getOperand()->getType().isUnsizedArray()) >- { >- mFoundArrayLength = true; >- if (!node->getOperand()->hasSideEffects()) >- { >- queueReplacement(node->fold(nullptr), OriginalNode::IS_DROPPED); >- return false; >- } >- insertStatementInParentBlock(node->getOperand()->deepCopy()); >- TConstantUnion *constArray = new TConstantUnion[1]; >- constArray->setIConst(node->getOperand()->getOutermostArraySize()); >- queueReplacement(new TIntermConstantUnion(constArray, node->getType()), >- OriginalNode::IS_DROPPED); >- return false; >- } >- return true; >-} >- >-} // anonymous namespace >- >-void RemoveArrayLengthMethod(TIntermBlock *root) >-{ >- RemoveArrayLengthTraverser traverser; >- do >- { >- traverser.nextIteration(); >- root->traverse(&traverser); >- if (traverser.foundArrayLength()) >- traverser.updateTree(); >- } while (traverser.foundArrayLength()); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveArrayLengthMethod.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveArrayLengthMethod.h >deleted file mode 100644 >index 3b2c6df8242..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveArrayLengthMethod.h >+++ /dev/null >@@ -1,29 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// RemoveArrayLengthMethod.h: >-// Fold array length expressions, including cases where the "this" node has side effects. >-// Example: >-// int i = (a = b).length(); >-// int j = (func()).length(); >-// becomes: >-// (a = b); >-// int i = <constant array length>; >-// func(); >-// int j = <constant array length>; >-// >-// Must be run after SplitSequenceOperator, SimplifyLoopConditions and SeparateDeclarations steps >-// have been done to expressions containing calls of the array length method. >-// >-// Does nothing to length method calls done on runtime-sized arrays. >- >-namespace sh >-{ >- >-class TIntermBlock; >- >-void RemoveArrayLengthMethod(TIntermBlock *root); >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveDynamicIndexing.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveDynamicIndexing.cpp >deleted file mode 100644 >index 7766c1abc63..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveDynamicIndexing.cpp >+++ /dev/null >@@ -1,550 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// RemoveDynamicIndexing is an AST traverser to remove dynamic indexing of vectors and matrices, >-// replacing them with calls to functions that choose which component to return or write. >-// >- >-#include "compiler/translator/RemoveDynamicIndexing.h" >- >-#include "compiler/translator/Diagnostics.h" >-#include "compiler/translator/InfoSink.h" >-#include "compiler/translator/IntermNodePatternMatcher.h" >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/IntermTraverse.h" >-#include "compiler/translator/SymbolTable.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-std::string GetIndexFunctionName(const TType &type, bool write) >-{ >- TInfoSinkBase nameSink; >- nameSink << "dyn_index_"; >- if (write) >- { >- nameSink << "write_"; >- } >- if (type.isMatrix()) >- { >- nameSink << "mat" << type.getCols() << "x" << type.getRows(); >- } >- else >- { >- switch (type.getBasicType()) >- { >- case EbtInt: >- nameSink << "ivec"; >- break; >- case EbtBool: >- nameSink << "bvec"; >- break; >- case EbtUInt: >- nameSink << "uvec"; >- break; >- case EbtFloat: >- nameSink << "vec"; >- break; >- default: >- UNREACHABLE(); >- } >- nameSink << type.getNominalSize(); >- } >- return nameSink.str(); >-} >- >-TIntermSymbol *CreateBaseSymbol(const TType &type, TQualifier qualifier, TSymbolTable *symbolTable) >-{ >- TIntermSymbol *symbol = new TIntermSymbol(symbolTable->nextUniqueId(), "base", type); >- symbol->setInternal(true); >- symbol->getTypePointer()->setQualifier(qualifier); >- return symbol; >-} >- >-TIntermSymbol *CreateIndexSymbol(TSymbolTable *symbolTable) >-{ >- TIntermSymbol *symbol = >- new TIntermSymbol(symbolTable->nextUniqueId(), "index", TType(EbtInt, EbpHigh)); >- symbol->setInternal(true); >- symbol->getTypePointer()->setQualifier(EvqIn); >- return symbol; >-} >- >-TIntermSymbol *CreateValueSymbol(const TType &type, TSymbolTable *symbolTable) >-{ >- TIntermSymbol *symbol = new TIntermSymbol(symbolTable->nextUniqueId(), "value", type); >- symbol->setInternal(true); >- symbol->getTypePointer()->setQualifier(EvqIn); >- return symbol; >-} >- >-TIntermConstantUnion *CreateIntConstantNode(int i) >-{ >- TConstantUnion *constant = new TConstantUnion(); >- constant->setIConst(i); >- return new TIntermConstantUnion(constant, TType(EbtInt, EbpHigh)); >-} >- >-TIntermTyped *EnsureSignedInt(TIntermTyped *node) >-{ >- if (node->getBasicType() == EbtInt) >- return node; >- >- TIntermSequence *arguments = new TIntermSequence(); >- arguments->push_back(node); >- return TIntermAggregate::CreateConstructor(TType(EbtInt), arguments); >-} >- >-TType GetFieldType(const TType &indexedType) >-{ >- if (indexedType.isMatrix()) >- { >- TType fieldType = TType(indexedType.getBasicType(), indexedType.getPrecision()); >- fieldType.setPrimarySize(static_cast<unsigned char>(indexedType.getRows())); >- return fieldType; >- } >- else >- { >- return TType(indexedType.getBasicType(), indexedType.getPrecision()); >- } >-} >- >-// Generate a read or write function for one field in a vector/matrix. >-// Out-of-range indices are clamped. This is consistent with how ANGLE handles out-of-range >-// indices in other places. >-// Note that indices can be either int or uint. We create only int versions of the functions, >-// and convert uint indices to int at the call site. >-// read function example: >-// float dyn_index_vec2(in vec2 base, in int index) >-// { >-// switch(index) >-// { >-// case (0): >-// return base[0]; >-// case (1): >-// return base[1]; >-// default: >-// break; >-// } >-// if (index < 0) >-// return base[0]; >-// return base[1]; >-// } >-// write function example: >-// void dyn_index_write_vec2(inout vec2 base, in int index, in float value) >-// { >-// switch(index) >-// { >-// case (0): >-// base[0] = value; >-// return; >-// case (1): >-// base[1] = value; >-// return; >-// default: >-// break; >-// } >-// if (index < 0) >-// { >-// base[0] = value; >-// return; >-// } >-// base[1] = value; >-// } >-// Note that else is not used in above functions to avoid the RewriteElseBlocks transformation. >-TIntermFunctionDefinition *GetIndexFunctionDefinition(TType type, >- bool write, >- const TSymbolUniqueId &functionId, >- TSymbolTable *symbolTable) >-{ >- ASSERT(!type.isArray()); >- // Conservatively use highp here, even if the indexed type is not highp. That way the code can't >- // end up using mediump version of an indexing function for a highp value, if both mediump and >- // highp values are being indexed in the shader. For HLSL precision doesn't matter, but in >- // principle this code could be used with multiple backends. >- type.setPrecision(EbpHigh); >- >- TType fieldType = GetFieldType(type); >- int numCases = 0; >- if (type.isMatrix()) >- { >- numCases = type.getCols(); >- } >- else >- { >- numCases = type.getNominalSize(); >- } >- >- TType returnType(EbtVoid); >- if (!write) >- { >- returnType = fieldType; >- } >- >- std::string functionName = GetIndexFunctionName(type, write); >- TIntermFunctionPrototype *prototypeNode = >- CreateInternalFunctionPrototypeNode(returnType, functionName.c_str(), functionId); >- >- TQualifier baseQualifier = EvqInOut; >- if (!write) >- baseQualifier = EvqIn; >- TIntermSymbol *baseParam = CreateBaseSymbol(type, baseQualifier, symbolTable); >- prototypeNode->getSequence()->push_back(baseParam); >- TIntermSymbol *indexParam = CreateIndexSymbol(symbolTable); >- prototypeNode->getSequence()->push_back(indexParam); >- TIntermSymbol *valueParam = nullptr; >- if (write) >- { >- valueParam = CreateValueSymbol(fieldType, symbolTable); >- prototypeNode->getSequence()->push_back(valueParam); >- } >- >- TIntermBlock *statementList = new TIntermBlock(); >- for (int i = 0; i < numCases; ++i) >- { >- TIntermCase *caseNode = new TIntermCase(CreateIntConstantNode(i)); >- statementList->getSequence()->push_back(caseNode); >- >- TIntermBinary *indexNode = >- new TIntermBinary(EOpIndexDirect, baseParam->deepCopy(), CreateIndexNode(i)); >- if (write) >- { >- TIntermBinary *assignNode = >- new TIntermBinary(EOpAssign, indexNode, valueParam->deepCopy()); >- statementList->getSequence()->push_back(assignNode); >- TIntermBranch *returnNode = new TIntermBranch(EOpReturn, nullptr); >- statementList->getSequence()->push_back(returnNode); >- } >- else >- { >- TIntermBranch *returnNode = new TIntermBranch(EOpReturn, indexNode); >- statementList->getSequence()->push_back(returnNode); >- } >- } >- >- // Default case >- TIntermCase *defaultNode = new TIntermCase(nullptr); >- statementList->getSequence()->push_back(defaultNode); >- TIntermBranch *breakNode = new TIntermBranch(EOpBreak, nullptr); >- statementList->getSequence()->push_back(breakNode); >- >- TIntermSwitch *switchNode = new TIntermSwitch(indexParam->deepCopy(), statementList); >- >- TIntermBlock *bodyNode = new TIntermBlock(); >- bodyNode->getSequence()->push_back(switchNode); >- >- TIntermBinary *cond = >- new TIntermBinary(EOpLessThan, indexParam->deepCopy(), CreateIntConstantNode(0)); >- cond->setType(TType(EbtBool, EbpUndefined)); >- >- // Two blocks: one accesses (either reads or writes) the first element and returns, >- // the other accesses the last element. >- TIntermBlock *useFirstBlock = new TIntermBlock(); >- TIntermBlock *useLastBlock = new TIntermBlock(); >- TIntermBinary *indexFirstNode = >- new TIntermBinary(EOpIndexDirect, baseParam->deepCopy(), CreateIndexNode(0)); >- TIntermBinary *indexLastNode = >- new TIntermBinary(EOpIndexDirect, baseParam->deepCopy(), CreateIndexNode(numCases - 1)); >- if (write) >- { >- TIntermBinary *assignFirstNode = >- new TIntermBinary(EOpAssign, indexFirstNode, valueParam->deepCopy()); >- useFirstBlock->getSequence()->push_back(assignFirstNode); >- TIntermBranch *returnNode = new TIntermBranch(EOpReturn, nullptr); >- useFirstBlock->getSequence()->push_back(returnNode); >- >- TIntermBinary *assignLastNode = >- new TIntermBinary(EOpAssign, indexLastNode, valueParam->deepCopy()); >- useLastBlock->getSequence()->push_back(assignLastNode); >- } >- else >- { >- TIntermBranch *returnFirstNode = new TIntermBranch(EOpReturn, indexFirstNode); >- useFirstBlock->getSequence()->push_back(returnFirstNode); >- >- TIntermBranch *returnLastNode = new TIntermBranch(EOpReturn, indexLastNode); >- useLastBlock->getSequence()->push_back(returnLastNode); >- } >- TIntermIfElse *ifNode = new TIntermIfElse(cond, useFirstBlock, nullptr); >- bodyNode->getSequence()->push_back(ifNode); >- bodyNode->getSequence()->push_back(useLastBlock); >- >- TIntermFunctionDefinition *indexingFunction = >- new TIntermFunctionDefinition(prototypeNode, bodyNode); >- return indexingFunction; >-} >- >-class RemoveDynamicIndexingTraverser : public TLValueTrackingTraverser >-{ >- public: >- RemoveDynamicIndexingTraverser(TSymbolTable *symbolTable, >- int shaderVersion, >- PerformanceDiagnostics *perfDiagnostics); >- >- bool visitBinary(Visit visit, TIntermBinary *node) override; >- >- void insertHelperDefinitions(TIntermNode *root); >- >- void nextIteration(); >- >- bool usedTreeInsertion() const { return mUsedTreeInsertion; } >- >- protected: >- // Maps of types that are indexed to the indexing function ids used for them. Note that these >- // can not store multiple variants of the same type with different precisions - only one >- // precision gets stored. >- std::map<TType, TSymbolUniqueId *> mIndexedVecAndMatrixTypes; >- std::map<TType, TSymbolUniqueId *> mWrittenVecAndMatrixTypes; >- >- bool mUsedTreeInsertion; >- >- // When true, the traverser will remove side effects from any indexing expression. >- // This is done so that in code like >- // V[j++][i]++. >- // where V is an array of vectors, j++ will only be evaluated once. >- bool mRemoveIndexSideEffectsInSubtree; >- >- PerformanceDiagnostics *mPerfDiagnostics; >-}; >- >-RemoveDynamicIndexingTraverser::RemoveDynamicIndexingTraverser( >- TSymbolTable *symbolTable, >- int shaderVersion, >- PerformanceDiagnostics *perfDiagnostics) >- : TLValueTrackingTraverser(true, false, false, symbolTable, shaderVersion), >- mUsedTreeInsertion(false), >- mRemoveIndexSideEffectsInSubtree(false), >- mPerfDiagnostics(perfDiagnostics) >-{ >-} >- >-void RemoveDynamicIndexingTraverser::insertHelperDefinitions(TIntermNode *root) >-{ >- TIntermBlock *rootBlock = root->getAsBlock(); >- ASSERT(rootBlock != nullptr); >- TIntermSequence insertions; >- for (auto &type : mIndexedVecAndMatrixTypes) >- { >- insertions.push_back( >- GetIndexFunctionDefinition(type.first, false, *type.second, mSymbolTable)); >- } >- for (auto &type : mWrittenVecAndMatrixTypes) >- { >- insertions.push_back( >- GetIndexFunctionDefinition(type.first, true, *type.second, mSymbolTable)); >- } >- rootBlock->insertChildNodes(0, insertions); >-} >- >-// Create a call to dyn_index_*() based on an indirect indexing op node >-TIntermAggregate *CreateIndexFunctionCall(TIntermBinary *node, >- TIntermTyped *index, >- const TSymbolUniqueId &functionId) >-{ >- ASSERT(node->getOp() == EOpIndexIndirect); >- TIntermSequence *arguments = new TIntermSequence(); >- arguments->push_back(node->getLeft()); >- arguments->push_back(index); >- >- TType fieldType = GetFieldType(node->getLeft()->getType()); >- std::string functionName = GetIndexFunctionName(node->getLeft()->getType(), false); >- TIntermAggregate *indexingCall = >- CreateInternalFunctionCallNode(fieldType, functionName.c_str(), functionId, arguments); >- indexingCall->setLine(node->getLine()); >- indexingCall->getFunctionSymbolInfo()->setKnownToNotHaveSideEffects(true); >- return indexingCall; >-} >- >-TIntermAggregate *CreateIndexedWriteFunctionCall(TIntermBinary *node, >- TIntermTyped *index, >- TIntermTyped *writtenValue, >- const TSymbolUniqueId &functionId) >-{ >- ASSERT(node->getOp() == EOpIndexIndirect); >- TIntermSequence *arguments = new TIntermSequence(); >- // Deep copy the child nodes so that two pointers to the same node don't end up in the tree. >- arguments->push_back(node->getLeft()->deepCopy()); >- arguments->push_back(index->deepCopy()); >- arguments->push_back(writtenValue); >- >- std::string functionName = GetIndexFunctionName(node->getLeft()->getType(), true); >- TIntermAggregate *indexedWriteCall = >- CreateInternalFunctionCallNode(TType(EbtVoid), functionName.c_str(), functionId, arguments); >- indexedWriteCall->setLine(node->getLine()); >- return indexedWriteCall; >-} >- >-bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *node) >-{ >- if (mUsedTreeInsertion) >- return false; >- >- if (node->getOp() == EOpIndexIndirect) >- { >- if (mRemoveIndexSideEffectsInSubtree) >- { >- ASSERT(node->getRight()->hasSideEffects()); >- // In case we're just removing index side effects, convert >- // v_expr[index_expr] >- // to this: >- // int s0 = index_expr; v_expr[s0]; >- // Now v_expr[s0] can be safely executed several times without unintended side effects. >- >- // Init the temp variable holding the index >- TIntermDeclaration *initIndex = createTempInitDeclaration(node->getRight()); >- insertStatementInParentBlock(initIndex); >- mUsedTreeInsertion = true; >- >- // Replace the index with the temp variable >- TIntermSymbol *tempIndex = createTempSymbol(node->getRight()->getType()); >- queueReplacementWithParent(node, node->getRight(), tempIndex, OriginalNode::IS_DROPPED); >- } >- else if (IntermNodePatternMatcher::IsDynamicIndexingOfVectorOrMatrix(node)) >- { >- mPerfDiagnostics->warning(node->getLine(), >- "Performance: dynamic indexing of vectors and " >- "matrices is emulated and can be slow.", >- "[]"); >- bool write = isLValueRequiredHere(); >- >-#if defined(ANGLE_ENABLE_ASSERTS) >- // Make sure that IntermNodePatternMatcher is consistent with the slightly differently >- // implemented checks in this traverser. >- IntermNodePatternMatcher matcher( >- IntermNodePatternMatcher::kDynamicIndexingOfVectorOrMatrixInLValue); >- ASSERT(matcher.match(node, getParentNode(), isLValueRequiredHere()) == write); >-#endif >- >- const TType &type = node->getLeft()->getType(); >- TSymbolUniqueId *indexingFunctionId = new TSymbolUniqueId(mSymbolTable); >- if (mIndexedVecAndMatrixTypes.find(type) == mIndexedVecAndMatrixTypes.end()) >- { >- mIndexedVecAndMatrixTypes[type] = indexingFunctionId; >- } >- else >- { >- indexingFunctionId = mIndexedVecAndMatrixTypes[type]; >- } >- >- if (write) >- { >- // Convert: >- // v_expr[index_expr]++; >- // to this: >- // int s0 = index_expr; float s1 = dyn_index(v_expr, s0); s1++; >- // dyn_index_write(v_expr, s0, s1); >- // This works even if index_expr has some side effects. >- if (node->getLeft()->hasSideEffects()) >- { >- // If v_expr has side effects, those need to be removed before proceeding. >- // Otherwise the side effects of v_expr would be evaluated twice. >- // The only case where an l-value can have side effects is when it is >- // indexing. For example, it can be V[j++] where V is an array of vectors. >- mRemoveIndexSideEffectsInSubtree = true; >- return true; >- } >- >- TIntermBinary *leftBinary = node->getLeft()->getAsBinaryNode(); >- if (leftBinary != nullptr && >- IntermNodePatternMatcher::IsDynamicIndexingOfVectorOrMatrix(leftBinary)) >- { >- // This is a case like: >- // mat2 m; >- // m[a][b]++; >- // Process the child node m[a] first. >- return true; >- } >- >- // TODO(oetuaho@nvidia.com): This is not optimal if the expression using the value >- // only writes it and doesn't need the previous value. http://anglebug.com/1116 >- >- TSymbolUniqueId *indexedWriteFunctionId = new TSymbolUniqueId(mSymbolTable); >- if (mWrittenVecAndMatrixTypes.find(type) == mWrittenVecAndMatrixTypes.end()) >- { >- mWrittenVecAndMatrixTypes[type] = indexedWriteFunctionId; >- } >- else >- { >- indexedWriteFunctionId = mWrittenVecAndMatrixTypes[type]; >- } >- TType fieldType = GetFieldType(type); >- >- TIntermSequence insertionsBefore; >- TIntermSequence insertionsAfter; >- >- // Store the index in a temporary signed int variable. >- TIntermTyped *indexInitializer = EnsureSignedInt(node->getRight()); >- TIntermDeclaration *initIndex = createTempInitDeclaration(indexInitializer); >- initIndex->setLine(node->getLine()); >- insertionsBefore.push_back(initIndex); >- >- // Create a node for referring to the index after the nextTemporaryId() call >- // below. >- TIntermSymbol *tempIndex = createTempSymbol(indexInitializer->getType()); >- >- TIntermAggregate *indexingCall = >- CreateIndexFunctionCall(node, tempIndex, *indexingFunctionId); >- >- nextTemporaryId(); // From now on, creating temporary symbols that refer to the >- // field value. >- insertionsBefore.push_back(createTempInitDeclaration(indexingCall)); >- >- TIntermAggregate *indexedWriteCall = CreateIndexedWriteFunctionCall( >- node, tempIndex, createTempSymbol(fieldType), *indexedWriteFunctionId); >- insertionsAfter.push_back(indexedWriteCall); >- insertStatementsInParentBlock(insertionsBefore, insertionsAfter); >- queueReplacement(createTempSymbol(fieldType), OriginalNode::IS_DROPPED); >- mUsedTreeInsertion = true; >- } >- else >- { >- // The indexed value is not being written, so we can simply convert >- // v_expr[index_expr] >- // into >- // dyn_index(v_expr, index_expr) >- // If the index_expr is unsigned, we'll convert it to signed. >- ASSERT(!mRemoveIndexSideEffectsInSubtree); >- TIntermAggregate *indexingCall = CreateIndexFunctionCall( >- node, EnsureSignedInt(node->getRight()), *indexingFunctionId); >- queueReplacement(indexingCall, OriginalNode::IS_DROPPED); >- } >- } >- } >- return !mUsedTreeInsertion; >-} >- >-void RemoveDynamicIndexingTraverser::nextIteration() >-{ >- mUsedTreeInsertion = false; >- mRemoveIndexSideEffectsInSubtree = false; >- nextTemporaryId(); >-} >- >-} // namespace >- >-void RemoveDynamicIndexing(TIntermNode *root, >- TSymbolTable *symbolTable, >- int shaderVersion, >- PerformanceDiagnostics *perfDiagnostics) >-{ >- RemoveDynamicIndexingTraverser traverser(symbolTable, shaderVersion, perfDiagnostics); >- do >- { >- traverser.nextIteration(); >- root->traverse(&traverser); >- traverser.updateTree(); >- } while (traverser.usedTreeInsertion()); >- // TODO(oetuaho@nvidia.com): It might be nicer to add the helper definitions also in the middle >- // of traversal. Now the tree ends up in an inconsistent state in the middle, since there are >- // function call nodes with no corresponding definition nodes. This needs special handling in >- // TIntermLValueTrackingTraverser, and creates intricacies that are not easily apparent from a >- // superficial reading of the code. >- traverser.insertHelperDefinitions(root); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveDynamicIndexing.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveDynamicIndexing.h >deleted file mode 100644 >index 543cf569a61..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveDynamicIndexing.h >+++ /dev/null >@@ -1,27 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// RemoveDynamicIndexing is an AST traverser to remove dynamic indexing of vectors and matrices, >-// replacing them with calls to functions that choose which component to return or write. >-// >- >-#ifndef COMPILER_TRANSLATOR_REMOVEDYNAMICINDEXING_H_ >-#define COMPILER_TRANSLATOR_REMOVEDYNAMICINDEXING_H_ >- >-namespace sh >-{ >- >-class TIntermNode; >-class TSymbolTable; >-class PerformanceDiagnostics; >- >-void RemoveDynamicIndexing(TIntermNode *root, >- TSymbolTable *symbolTable, >- int shaderVersion, >- PerformanceDiagnostics *perfDiagnostics); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_REMOVEDYNAMICINDEXING_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveEmptySwitchStatements.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveEmptySwitchStatements.cpp >deleted file mode 100644 >index b39c912e9ca..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveEmptySwitchStatements.cpp >+++ /dev/null >@@ -1,56 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// RemoveEmptySwitchStatements.cpp: Remove switch statements that have an empty statement list. >- >-#include "compiler/translator/RemoveEmptySwitchStatements.h" >- >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class RemoveEmptySwitchStatementsTraverser : public TIntermTraverser >-{ >- public: >- RemoveEmptySwitchStatementsTraverser() : TIntermTraverser(true, false, false) {} >- >- bool visitSwitch(Visit visit, TIntermSwitch *node); >-}; >- >-bool RemoveEmptySwitchStatementsTraverser::visitSwitch(Visit visit, TIntermSwitch *node) >-{ >- if (node->getStatementList()->getSequence()->empty()) >- { >- // Just output the init statement. >- if (node->getInit()->hasSideEffects()) >- { >- queueReplacement(node->getInit(), OriginalNode::IS_DROPPED); >- } >- else >- { >- TIntermSequence emptyReplacement; >- ASSERT(getParentNode()->getAsBlock()); >- mMultiReplacements.push_back(NodeReplaceWithMultipleEntry(getParentNode()->getAsBlock(), >- node, emptyReplacement)); >- } >- return false; // Nothing inside the child nodes to traverse. >- } >- return true; >-} >- >-} // anonymous namespace >- >-void RemoveEmptySwitchStatements(TIntermBlock *root) >-{ >- RemoveEmptySwitchStatementsTraverser traverser; >- root->traverse(&traverser); >- traverser.updateTree(); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveEmptySwitchStatements.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveEmptySwitchStatements.h >deleted file mode 100644 >index 1018a50d822..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveEmptySwitchStatements.h >+++ /dev/null >@@ -1,18 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// RemoveEmptySwitchStatements.h: Remove switch statements that have an empty statement list. >- >-#ifndef COMPILER_TRANSLATOR_REMOVEEMPTYSWITCHSTATEMENTS_H_ >-#define COMPILER_TRANSLATOR_REMOVEEMPTYSWITCHSTATEMENTS_H_ >- >-namespace sh >-{ >-class TIntermBlock; >- >-void RemoveEmptySwitchStatements(TIntermBlock *root); >-} >- >-#endif // COMPILER_TRANSLATOR_REMOVEEMPTYSWITCHSTATEMENTS_H_ >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveInvariantDeclaration.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveInvariantDeclaration.cpp >deleted file mode 100644 >index 4b533dc7b56..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveInvariantDeclaration.cpp >+++ /dev/null >@@ -1,43 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >- >-#include "compiler/translator/RemoveInvariantDeclaration.h" >- >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-// An AST traverser that removes invariant declaration for input in fragment shader >-// when GLSL >= 4.20 and for output in vertex shader when GLSL < 4.2. >-class RemoveInvariantDeclarationTraverser : public TIntermTraverser >-{ >- public: >- RemoveInvariantDeclarationTraverser() : TIntermTraverser(true, false, false) {} >- >- private: >- bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) override >- { >- TIntermSequence emptyReplacement; >- mMultiReplacements.push_back( >- NodeReplaceWithMultipleEntry(getParentNode()->getAsBlock(), node, emptyReplacement)); >- return false; >- } >-}; >- >-} // anonymous namespace >- >-void RemoveInvariantDeclaration(TIntermNode *root) >-{ >- RemoveInvariantDeclarationTraverser traverser; >- root->traverse(&traverser); >- traverser.updateTree(); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveInvariantDeclaration.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveInvariantDeclaration.h >deleted file mode 100644 >index cf9d4aa4c27..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveInvariantDeclaration.h >+++ /dev/null >@@ -1,18 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >- >-#ifndef COMPILER_TRANSLATOR_REMOVEINVARIANTDECLARATION_H_ >-#define COMPILER_TRANSLATOR_REMOVEINVARIANTDECLARATION_H_ >- >-class TIntermNode; >-namespace sh >-{ >- >-void RemoveInvariantDeclaration(TIntermNode *root); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_REMOVEINVARIANTDECLARATION_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveNoOpCasesFromEndOfSwitchStatements.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveNoOpCasesFromEndOfSwitchStatements.cpp >deleted file mode 100644 >index b86d64d7a38..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveNoOpCasesFromEndOfSwitchStatements.cpp >+++ /dev/null >@@ -1,116 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// RemoveNoOpCasesFromEndOfSwitchStatements.cpp: Clean up cases from the end of a switch statement >-// that only contain no-ops. >- >-#include "compiler/translator/RemoveNoOpCasesFromEndOfSwitchStatements.h" >- >-#include "compiler/translator/IntermNode.h" >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/IntermTraverse.h" >-#include "compiler/translator/SymbolTable.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-bool AreEmptyBlocks(TIntermSequence *statements, size_t i); >- >-bool IsEmptyBlock(TIntermNode *node) >-{ >- TIntermBlock *asBlock = node->getAsBlock(); >- if (asBlock) >- { >- if (asBlock->getSequence()->empty()) >- { >- return true; >- } >- return AreEmptyBlocks(asBlock->getSequence(), 0u); >- } >- // Empty declarations should have already been pruned, otherwise they would need to be handled >- // here. Note that declarations for struct types do contain a nameless child node. >- ASSERT(node->getAsDeclarationNode() == nullptr || >- !node->getAsDeclarationNode()->getSequence()->empty()); >- // Pure literal statements should also already be pruned. >- ASSERT(node->getAsConstantUnion() == nullptr); >- return false; >-} >- >-// Return true if all statements in "statements" starting from index i consist only of empty blocks >-// and no-op statements. Returns true also if there are no statements. >-bool AreEmptyBlocks(TIntermSequence *statements, size_t i) >-{ >- for (; i < statements->size(); ++i) >- { >- if (!IsEmptyBlock(statements->at(i))) >- { >- return false; >- } >- } >- return true; >-} >- >-void RemoveNoOpCasesFromEndOfStatementList(TIntermBlock *statementList, TSymbolTable *symbolTable) >-{ >- TIntermSequence *statements = statementList->getSequence(); >- >- bool foundDeadCase = false; >- do >- { >- if (statements->empty()) >- { >- return; >- } >- >- // Find the last case label. >- size_t i = statements->size(); >- while (i > 0u && !(*statements)[i - 1]->getAsCaseNode()) >- { >- --i; >- } >- // Now i is the index of the first statement following the last label inside the switch >- // statement. >- ASSERT(i > 0u); >- >- foundDeadCase = AreEmptyBlocks(statements, i); >- if (foundDeadCase) >- { >- statements->erase(statements->begin() + (i - 1u), statements->end()); >- } >- } while (foundDeadCase); >-} >- >-class RemoveNoOpCasesFromEndOfSwitchTraverser : public TIntermTraverser >-{ >- public: >- RemoveNoOpCasesFromEndOfSwitchTraverser(TSymbolTable *symbolTable) >- : TIntermTraverser(true, false, false, symbolTable) >- { >- } >- >- bool visitSwitch(Visit visit, TIntermSwitch *node) override; >-}; >- >-bool RemoveNoOpCasesFromEndOfSwitchTraverser::visitSwitch(Visit visit, TIntermSwitch *node) >-{ >- // Here we may mutate the statement list, but it's safe since traversal has not yet reached >- // there. >- RemoveNoOpCasesFromEndOfStatementList(node->getStatementList(), mSymbolTable); >- // Handle also nested switch statements. >- return true; >-} >- >-} // anonymous namespace >- >-void RemoveNoOpCasesFromEndOfSwitchStatements(TIntermBlock *root, TSymbolTable *symbolTable) >-{ >- RemoveNoOpCasesFromEndOfSwitchTraverser traverser(symbolTable); >- root->traverse(&traverser); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveNoOpCasesFromEndOfSwitchStatements.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveNoOpCasesFromEndOfSwitchStatements.h >deleted file mode 100644 >index ebd75eb7749..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveNoOpCasesFromEndOfSwitchStatements.h >+++ /dev/null >@@ -1,21 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// RemoveNoOpCasesFromEndOfSwitchStatements.h: Clean up cases from the end of a switch statement >-// that only contain no-ops. >- >-#ifndef COMPILER_TRANSLATOR_REMOVENOOPCASESFROMENDOFSWITCHSTATEMENTS_H_ >-#define COMPILER_TRANSLATOR_REMOVENOOPCASESFROMENDOFSWITCHSTATEMENTS_H_ >- >-namespace sh >-{ >-class TIntermBlock; >-class TSymbolTable; >- >-void RemoveNoOpCasesFromEndOfSwitchStatements(TIntermBlock *root, TSymbolTable *symbolTable); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_REMOVENOOPCASESFROMENDOFSWITCHSTATEMENTS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemovePow.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RemovePow.cpp >deleted file mode 100644 >index b2cdac55f00..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemovePow.cpp >+++ /dev/null >@@ -1,97 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// RemovePow is an AST traverser to convert pow(x, y) built-in calls where y is a >-// constant to exp2(y * log2(x)). This works around an issue in NVIDIA 311 series >-// OpenGL drivers. >-// >- >-#include "compiler/translator/RemovePow.h" >- >-#include "compiler/translator/InfoSink.h" >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-bool IsProblematicPow(TIntermTyped *node) >-{ >- TIntermAggregate *agg = node->getAsAggregate(); >- if (agg != nullptr && agg->getOp() == EOpPow) >- { >- ASSERT(agg->getSequence()->size() == 2); >- return agg->getSequence()->at(1)->getAsConstantUnion() != nullptr; >- } >- return false; >-} >- >-// Traverser that converts all pow operations simultaneously. >-class RemovePowTraverser : public TIntermTraverser >-{ >- public: >- RemovePowTraverser(); >- >- bool visitAggregate(Visit visit, TIntermAggregate *node) override; >- >- void nextIteration() { mNeedAnotherIteration = false; } >- bool needAnotherIteration() const { return mNeedAnotherIteration; } >- >- protected: >- bool mNeedAnotherIteration; >-}; >- >-RemovePowTraverser::RemovePowTraverser() >- : TIntermTraverser(true, false, false), mNeedAnotherIteration(false) >-{ >-} >- >-bool RemovePowTraverser::visitAggregate(Visit visit, TIntermAggregate *node) >-{ >- if (IsProblematicPow(node)) >- { >- TIntermTyped *x = node->getSequence()->at(0)->getAsTyped(); >- TIntermTyped *y = node->getSequence()->at(1)->getAsTyped(); >- >- TIntermUnary *log = new TIntermUnary(EOpLog2, x); >- log->setLine(node->getLine()); >- >- TOperator op = TIntermBinary::GetMulOpBasedOnOperands(y->getType(), log->getType()); >- TIntermBinary *mul = new TIntermBinary(op, y, log); >- mul->setLine(node->getLine()); >- >- TIntermUnary *exp = new TIntermUnary(EOpExp2, mul); >- exp->setLine(node->getLine()); >- >- queueReplacement(exp, OriginalNode::IS_DROPPED); >- >- // If the x parameter also needs to be replaced, we need to do that in another traversal, >- // since it's parent node will change in a way that's not handled correctly by updateTree(). >- if (IsProblematicPow(x)) >- { >- mNeedAnotherIteration = true; >- return false; >- } >- } >- return true; >-} >- >-} // namespace >- >-void RemovePow(TIntermNode *root) >-{ >- RemovePowTraverser traverser; >- // Iterate as necessary, and reset the traverser between iterations. >- do >- { >- traverser.nextIteration(); >- root->traverse(&traverser); >- traverser.updateTree(); >- } while (traverser.needAnotherIteration()); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemovePow.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RemovePow.h >deleted file mode 100644 >index 3cd84988a99..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemovePow.h >+++ /dev/null >@@ -1,21 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// RemovePow is an AST traverser to convert pow(x, y) built-in calls where y is a >-// constant to exp2(y * log2(x)). This works around an issue in NVIDIA 311 series >-// OpenGL drivers. >-// >- >-#ifndef COMPILER_TRANSLATOR_REMOVEPOW_H_ >-#define COMPILER_TRANSLATOR_REMOVEPOW_H_ >- >-namespace sh >-{ >-class TIntermNode; >- >-void RemovePow(TIntermNode *root); >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_REMOVEPOW_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveSwitchFallThrough.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveSwitchFallThrough.cpp >deleted file mode 100644 >index dea949f4484..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveSwitchFallThrough.cpp >+++ /dev/null >@@ -1,270 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// RemoveSwitchFallThrough.cpp: Remove fall-through from switch statements. >-// Note that it is unsafe to do further AST transformations on the AST generated >-// by this function. It leaves duplicate nodes in the AST making replacements >-// unreliable. >- >-#include "compiler/translator/RemoveSwitchFallThrough.h" >- >-#include "compiler/translator/Diagnostics.h" >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class RemoveSwitchFallThroughTraverser : public TIntermTraverser >-{ >- public: >- static TIntermBlock *removeFallThrough(TIntermBlock *statementList, >- PerformanceDiagnostics *perfDiagnostics); >- >- private: >- RemoveSwitchFallThroughTraverser(TIntermBlock *statementList, >- PerformanceDiagnostics *perfDiagnostics); >- >- void visitSymbol(TIntermSymbol *node) override; >- void visitConstantUnion(TIntermConstantUnion *node) override; >- bool visitDeclaration(Visit, TIntermDeclaration *node) override; >- bool visitBinary(Visit, TIntermBinary *node) override; >- bool visitUnary(Visit, TIntermUnary *node) override; >- bool visitTernary(Visit visit, TIntermTernary *node) override; >- bool visitSwizzle(Visit, TIntermSwizzle *node) override; >- bool visitIfElse(Visit visit, TIntermIfElse *node) override; >- bool visitSwitch(Visit, TIntermSwitch *node) override; >- bool visitCase(Visit, TIntermCase *node) override; >- bool visitAggregate(Visit, TIntermAggregate *node) override; >- bool visitBlock(Visit, TIntermBlock *node) override; >- bool visitLoop(Visit, TIntermLoop *node) override; >- bool visitBranch(Visit, TIntermBranch *node) override; >- >- void outputSequence(TIntermSequence *sequence, size_t startIndex); >- void handlePreviousCase(); >- >- TIntermBlock *mStatementList; >- TIntermBlock *mStatementListOut; >- bool mLastStatementWasBreak; >- TIntermBlock *mPreviousCase; >- std::vector<TIntermBlock *> mCasesSharingBreak; >- PerformanceDiagnostics *mPerfDiagnostics; >-}; >- >-TIntermBlock *RemoveSwitchFallThroughTraverser::removeFallThrough( >- TIntermBlock *statementList, >- PerformanceDiagnostics *perfDiagnostics) >-{ >- RemoveSwitchFallThroughTraverser rm(statementList, perfDiagnostics); >- ASSERT(statementList); >- statementList->traverse(&rm); >- ASSERT(rm.mPreviousCase || statementList->getSequence()->empty()); >- if (!rm.mLastStatementWasBreak && rm.mPreviousCase) >- { >- // Make sure that there's a branch at the end of the final case inside the switch statement. >- // This also ensures that any cases that fall through to the final case will get the break. >- TIntermBranch *finalBreak = new TIntermBranch(EOpBreak, nullptr); >- rm.mPreviousCase->getSequence()->push_back(finalBreak); >- rm.mLastStatementWasBreak = true; >- } >- rm.handlePreviousCase(); >- return rm.mStatementListOut; >-} >- >-RemoveSwitchFallThroughTraverser::RemoveSwitchFallThroughTraverser( >- TIntermBlock *statementList, >- PerformanceDiagnostics *perfDiagnostics) >- : TIntermTraverser(true, false, false), >- mStatementList(statementList), >- mLastStatementWasBreak(false), >- mPreviousCase(nullptr), >- mPerfDiagnostics(perfDiagnostics) >-{ >- mStatementListOut = new TIntermBlock(); >-} >- >-void RemoveSwitchFallThroughTraverser::visitSymbol(TIntermSymbol *node) >-{ >- // Note that this assumes that switch statements which don't begin by a case statement >- // have already been weeded out in validation. >- mPreviousCase->getSequence()->push_back(node); >- mLastStatementWasBreak = false; >-} >- >-void RemoveSwitchFallThroughTraverser::visitConstantUnion(TIntermConstantUnion *node) >-{ >- // Conditions of case labels are not traversed, so this is a constant statement like "0;". >- // These are no-ops so there's no need to add them back to the statement list. Should have >- // already been pruned out of the AST, in fact. >- UNREACHABLE(); >-} >- >-bool RemoveSwitchFallThroughTraverser::visitDeclaration(Visit, TIntermDeclaration *node) >-{ >- mPreviousCase->getSequence()->push_back(node); >- mLastStatementWasBreak = false; >- return false; >-} >- >-bool RemoveSwitchFallThroughTraverser::visitBinary(Visit, TIntermBinary *node) >-{ >- mPreviousCase->getSequence()->push_back(node); >- mLastStatementWasBreak = false; >- return false; >-} >- >-bool RemoveSwitchFallThroughTraverser::visitUnary(Visit, TIntermUnary *node) >-{ >- mPreviousCase->getSequence()->push_back(node); >- mLastStatementWasBreak = false; >- return false; >-} >- >-bool RemoveSwitchFallThroughTraverser::visitTernary(Visit, TIntermTernary *node) >-{ >- mPreviousCase->getSequence()->push_back(node); >- mLastStatementWasBreak = false; >- return false; >-} >- >-bool RemoveSwitchFallThroughTraverser::visitSwizzle(Visit, TIntermSwizzle *node) >-{ >- mPreviousCase->getSequence()->push_back(node); >- mLastStatementWasBreak = false; >- return false; >-} >- >-bool RemoveSwitchFallThroughTraverser::visitIfElse(Visit, TIntermIfElse *node) >-{ >- mPreviousCase->getSequence()->push_back(node); >- mLastStatementWasBreak = false; >- return false; >-} >- >-bool RemoveSwitchFallThroughTraverser::visitSwitch(Visit, TIntermSwitch *node) >-{ >- mPreviousCase->getSequence()->push_back(node); >- mLastStatementWasBreak = false; >- // Don't go into nested switch statements >- return false; >-} >- >-void RemoveSwitchFallThroughTraverser::outputSequence(TIntermSequence *sequence, size_t startIndex) >-{ >- for (size_t i = startIndex; i < sequence->size(); ++i) >- { >- mStatementListOut->getSequence()->push_back(sequence->at(i)); >- } >-} >- >-void RemoveSwitchFallThroughTraverser::handlePreviousCase() >-{ >- if (mPreviousCase) >- mCasesSharingBreak.push_back(mPreviousCase); >- if (mLastStatementWasBreak) >- { >- for (size_t i = 0; i < mCasesSharingBreak.size(); ++i) >- { >- ASSERT(!mCasesSharingBreak.at(i)->getSequence()->empty()); >- if (mCasesSharingBreak.at(i)->getSequence()->size() == 1) >- { >- // Fall-through is allowed in case the label has no statements. >- outputSequence(mCasesSharingBreak.at(i)->getSequence(), 0); >- } >- else >- { >- // Include all the statements that this case can fall through under the same label. >- if (mCasesSharingBreak.size() > i + 1u) >- { >- mPerfDiagnostics->warning(mCasesSharingBreak.at(i)->getLine(), >- "Performance: non-empty fall-through cases in " >- "switch statements generate extra code.", >- "switch"); >- } >- for (size_t j = i; j < mCasesSharingBreak.size(); ++j) >- { >- size_t startIndex = >- j > i ? 1 : 0; // Add the label only from the first sequence. >- outputSequence(mCasesSharingBreak.at(j)->getSequence(), startIndex); >- } >- } >- } >- mCasesSharingBreak.clear(); >- } >- mLastStatementWasBreak = false; >- mPreviousCase = nullptr; >-} >- >-bool RemoveSwitchFallThroughTraverser::visitCase(Visit, TIntermCase *node) >-{ >- handlePreviousCase(); >- mPreviousCase = new TIntermBlock(); >- mPreviousCase->getSequence()->push_back(node); >- mPreviousCase->setLine(node->getLine()); >- // Don't traverse the condition of the case statement >- return false; >-} >- >-bool RemoveSwitchFallThroughTraverser::visitAggregate(Visit, TIntermAggregate *node) >-{ >- mPreviousCase->getSequence()->push_back(node); >- mLastStatementWasBreak = false; >- return false; >-} >- >-bool DoesBlockAlwaysBreak(TIntermBlock *node) >-{ >- if (node->getSequence()->empty()) >- { >- return false; >- } >- >- TIntermBlock *lastStatementAsBlock = node->getSequence()->back()->getAsBlock(); >- if (lastStatementAsBlock) >- { >- return DoesBlockAlwaysBreak(lastStatementAsBlock); >- } >- >- TIntermBranch *lastStatementAsBranch = node->getSequence()->back()->getAsBranchNode(); >- return lastStatementAsBranch != nullptr; >-} >- >-bool RemoveSwitchFallThroughTraverser::visitBlock(Visit, TIntermBlock *node) >-{ >- if (node != mStatementList) >- { >- mPreviousCase->getSequence()->push_back(node); >- mLastStatementWasBreak = DoesBlockAlwaysBreak(node); >- return false; >- } >- return true; >-} >- >-bool RemoveSwitchFallThroughTraverser::visitLoop(Visit, TIntermLoop *node) >-{ >- mPreviousCase->getSequence()->push_back(node); >- mLastStatementWasBreak = false; >- return false; >-} >- >-bool RemoveSwitchFallThroughTraverser::visitBranch(Visit, TIntermBranch *node) >-{ >- mPreviousCase->getSequence()->push_back(node); >- // TODO: Verify that accepting return or continue statements here doesn't cause problems. >- mLastStatementWasBreak = true; >- return false; >-} >- >-} // anonymous namespace >- >-TIntermBlock *RemoveSwitchFallThrough(TIntermBlock *statementList, >- PerformanceDiagnostics *perfDiagnostics) >-{ >- return RemoveSwitchFallThroughTraverser::removeFallThrough(statementList, perfDiagnostics); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveSwitchFallThrough.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveSwitchFallThrough.h >deleted file mode 100644 >index 7a3b1963f25..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveSwitchFallThrough.h >+++ /dev/null >@@ -1,27 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// RemoveSwitchFallThrough.h: Remove fall-through from switch statements. >-// Note that it is unsafe to do further AST transformations on the AST generated >-// by this function. It leaves duplicate nodes in the AST making replacements >-// unreliable. >- >-#ifndef COMPILER_TRANSLATOR_REMOVESWITCHFALLTHROUGH_H_ >-#define COMPILER_TRANSLATOR_REMOVESWITCHFALLTHROUGH_H_ >- >-namespace sh >-{ >- >-class TIntermBlock; >-class PerformanceDiagnostics; >- >-// When given a statementList from a switch AST node, return an updated >-// statementList that has fall-through removed. >-TIntermBlock *RemoveSwitchFallThrough(TIntermBlock *statementList, >- PerformanceDiagnostics *perfDiagnostics); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_REMOVESWITCHFALLTHROUGH_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveUnreferencedVariables.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveUnreferencedVariables.cpp >deleted file mode 100644 >index 74b5e73f719..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveUnreferencedVariables.cpp >+++ /dev/null >@@ -1,358 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// RemoveUnreferencedVariables.cpp: >-// Drop variables that are declared but never referenced in the AST. This avoids adding unnecessary >-// initialization code for them. Also removes unreferenced struct types. >-// >- >-#include "compiler/translator/RemoveUnreferencedVariables.h" >- >-#include "compiler/translator/IntermTraverse.h" >-#include "compiler/translator/SymbolTable.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class CollectVariableRefCountsTraverser : public TIntermTraverser >-{ >- public: >- CollectVariableRefCountsTraverser(); >- >- using RefCountMap = std::unordered_map<int, unsigned int>; >- RefCountMap &getSymbolIdRefCounts() { return mSymbolIdRefCounts; } >- RefCountMap &getStructIdRefCounts() { return mStructIdRefCounts; } >- >- void visitSymbol(TIntermSymbol *node) override; >- bool visitAggregate(Visit visit, TIntermAggregate *node) override; >- bool visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) override; >- >- private: >- void incrementStructTypeRefCount(const TType &type); >- >- RefCountMap mSymbolIdRefCounts; >- >- // Structure reference counts are counted from symbols, constructors, function calls, function >- // return values and from interface block and structure fields. We need to track both function >- // calls and function return values since there's a compiler option not to prune unused >- // functions. The type of a constant union may also be a struct, but statements that are just a >- // constant union are always pruned, and if the constant union is used somehow it will get >- // counted by something else. >- RefCountMap mStructIdRefCounts; >-}; >- >-CollectVariableRefCountsTraverser::CollectVariableRefCountsTraverser() >- : TIntermTraverser(true, false, false) >-{ >-} >- >-void CollectVariableRefCountsTraverser::incrementStructTypeRefCount(const TType &type) >-{ >- if (type.isInterfaceBlock()) >- { >- const auto *block = type.getInterfaceBlock(); >- ASSERT(block); >- >- // We can end up incrementing ref counts of struct types referenced from an interface block >- // multiple times for the same block. This doesn't matter, because interface blocks can't be >- // pruned so we'll never do the reverse operation. >- for (const auto &field : block->fields()) >- { >- ASSERT(!field->type()->isInterfaceBlock()); >- incrementStructTypeRefCount(*field->type()); >- } >- return; >- } >- >- const auto *structure = type.getStruct(); >- if (structure != nullptr) >- { >- auto structIter = mStructIdRefCounts.find(structure->uniqueId()); >- if (structIter == mStructIdRefCounts.end()) >- { >- mStructIdRefCounts[structure->uniqueId()] = 1u; >- >- for (const auto &field : structure->fields()) >- { >- incrementStructTypeRefCount(*field->type()); >- } >- >- return; >- } >- ++(structIter->second); >- } >-} >- >-void CollectVariableRefCountsTraverser::visitSymbol(TIntermSymbol *node) >-{ >- incrementStructTypeRefCount(node->getType()); >- >- auto iter = mSymbolIdRefCounts.find(node->getId()); >- if (iter == mSymbolIdRefCounts.end()) >- { >- mSymbolIdRefCounts[node->getId()] = 1u; >- return; >- } >- ++(iter->second); >-} >- >-bool CollectVariableRefCountsTraverser::visitAggregate(Visit visit, TIntermAggregate *node) >-{ >- // This tracks struct references in both function calls and constructors. >- incrementStructTypeRefCount(node->getType()); >- return true; >-} >- >-bool CollectVariableRefCountsTraverser::visitFunctionPrototype(Visit visit, >- TIntermFunctionPrototype *node) >-{ >- incrementStructTypeRefCount(node->getType()); >- return true; >-} >- >-// Traverser that removes all unreferenced variables on one traversal. >-class RemoveUnreferencedVariablesTraverser : public TIntermTraverser >-{ >- public: >- RemoveUnreferencedVariablesTraverser( >- CollectVariableRefCountsTraverser::RefCountMap *symbolIdRefCounts, >- CollectVariableRefCountsTraverser::RefCountMap *structIdRefCounts, >- TSymbolTable *symbolTable); >- >- bool visitDeclaration(Visit visit, TIntermDeclaration *node) override; >- void visitSymbol(TIntermSymbol *node) override; >- bool visitAggregate(Visit visit, TIntermAggregate *node) override; >- >- // Traverse loop and block nodes in reverse order. Note that this traverser does not track >- // parent block positions, so insertStatementInParentBlock is unusable! >- void traverseBlock(TIntermBlock *block) override; >- void traverseLoop(TIntermLoop *loop) override; >- >- private: >- void removeVariableDeclaration(TIntermDeclaration *node, TIntermTyped *declarator); >- void decrementStructTypeRefCount(const TType &type); >- >- CollectVariableRefCountsTraverser::RefCountMap *mSymbolIdRefCounts; >- CollectVariableRefCountsTraverser::RefCountMap *mStructIdRefCounts; >- bool mRemoveReferences; >-}; >- >-RemoveUnreferencedVariablesTraverser::RemoveUnreferencedVariablesTraverser( >- CollectVariableRefCountsTraverser::RefCountMap *symbolIdRefCounts, >- CollectVariableRefCountsTraverser::RefCountMap *structIdRefCounts, >- TSymbolTable *symbolTable) >- : TIntermTraverser(true, false, true, symbolTable), >- mSymbolIdRefCounts(symbolIdRefCounts), >- mStructIdRefCounts(structIdRefCounts), >- mRemoveReferences(false) >-{ >-} >- >-void RemoveUnreferencedVariablesTraverser::decrementStructTypeRefCount(const TType &type) >-{ >- auto *structure = type.getStruct(); >- if (structure != nullptr) >- { >- ASSERT(mStructIdRefCounts->find(structure->uniqueId()) != mStructIdRefCounts->end()); >- unsigned int structRefCount = --(*mStructIdRefCounts)[structure->uniqueId()]; >- >- if (structRefCount == 0) >- { >- for (const auto &field : structure->fields()) >- { >- decrementStructTypeRefCount(*field->type()); >- } >- } >- } >-} >- >-void RemoveUnreferencedVariablesTraverser::removeVariableDeclaration(TIntermDeclaration *node, >- TIntermTyped *declarator) >-{ >- if (declarator->getType().isStructSpecifier() && !declarator->getType().isNamelessStruct()) >- { >- unsigned int structId = declarator->getType().getStruct()->uniqueId(); >- if ((*mStructIdRefCounts)[structId] > 1u) >- { >- // If this declaration declares a named struct type that is used elsewhere, we need to >- // keep it. We can still change the declarator though so that it doesn't declare an >- // unreferenced variable. >- >- // Note that since we're not removing the entire declaration, the struct's reference >- // count will end up being one less than the correct refcount. But since the struct >- // declaration is kept, the incorrect refcount can't cause any other problems. >- >- if (declarator->getAsSymbolNode() && declarator->getAsSymbolNode()->getSymbol().empty()) >- { >- // Already an empty declaration - nothing to do. >- return; >- } >- queueReplacementWithParent(node, declarator, >- new TIntermSymbol(mSymbolTable->getEmptySymbolId(), >- TString(""), declarator->getType()), >- OriginalNode::IS_DROPPED); >- return; >- } >- } >- >- if (getParentNode()->getAsBlock()) >- { >- TIntermSequence emptyReplacement; >- mMultiReplacements.push_back( >- NodeReplaceWithMultipleEntry(getParentNode()->getAsBlock(), node, emptyReplacement)); >- } >- else >- { >- ASSERT(getParentNode()->getAsLoopNode()); >- queueReplacement(nullptr, OriginalNode::IS_DROPPED); >- } >-} >- >-bool RemoveUnreferencedVariablesTraverser::visitDeclaration(Visit visit, TIntermDeclaration *node) >-{ >- if (visit == PreVisit) >- { >- // SeparateDeclarations should have already been run. >- ASSERT(node->getSequence()->size() == 1u); >- >- TIntermTyped *declarator = node->getSequence()->back()->getAsTyped(); >- ASSERT(declarator); >- >- // We can only remove variables that are not a part of the shader interface. >- TQualifier qualifier = declarator->getQualifier(); >- if (qualifier != EvqTemporary && qualifier != EvqGlobal) >- { >- return true; >- } >- >- bool canRemoveVariable = false; >- TIntermSymbol *symbolNode = declarator->getAsSymbolNode(); >- if (symbolNode != nullptr) >- { >- canRemoveVariable = >- (*mSymbolIdRefCounts)[symbolNode->getId()] == 1u || symbolNode->getSymbol().empty(); >- } >- TIntermBinary *initNode = declarator->getAsBinaryNode(); >- if (initNode != nullptr) >- { >- ASSERT(initNode->getLeft()->getAsSymbolNode()); >- int symbolId = initNode->getLeft()->getAsSymbolNode()->getId(); >- canRemoveVariable = >- (*mSymbolIdRefCounts)[symbolId] == 1u && !initNode->getRight()->hasSideEffects(); >- } >- >- if (canRemoveVariable) >- { >- removeVariableDeclaration(node, declarator); >- mRemoveReferences = true; >- } >- return true; >- } >- ASSERT(visit == PostVisit); >- mRemoveReferences = false; >- return true; >-} >- >-void RemoveUnreferencedVariablesTraverser::visitSymbol(TIntermSymbol *node) >-{ >- if (mRemoveReferences) >- { >- ASSERT(mSymbolIdRefCounts->find(node->getId()) != mSymbolIdRefCounts->end()); >- --(*mSymbolIdRefCounts)[node->getId()]; >- >- decrementStructTypeRefCount(node->getType()); >- } >-} >- >-bool RemoveUnreferencedVariablesTraverser::visitAggregate(Visit visit, TIntermAggregate *node) >-{ >- if (mRemoveReferences) >- { >- decrementStructTypeRefCount(node->getType()); >- } >- return true; >-} >- >-void RemoveUnreferencedVariablesTraverser::traverseBlock(TIntermBlock *node) >-{ >- // We traverse blocks in reverse order. This way reference counts can be decremented when >- // removing initializers, and variables that become unused when initializers are removed can be >- // removed on the same traversal. >- >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- TIntermSequence *sequence = node->getSequence(); >- >- if (preVisit) >- visit = visitBlock(PreVisit, node); >- >- if (visit) >- { >- for (auto iter = sequence->rbegin(); iter != sequence->rend(); ++iter) >- { >- (*iter)->traverse(this); >- if (visit && inVisit) >- { >- if ((iter + 1) != sequence->rend()) >- visit = visitBlock(InVisit, node); >- } >- } >- } >- >- if (visit && postVisit) >- visitBlock(PostVisit, node); >-} >- >-void RemoveUnreferencedVariablesTraverser::traverseLoop(TIntermLoop *node) >-{ >- // We traverse loops in reverse order as well. The loop body gets traversed before the init >- // node. >- >- ScopedNodeInTraversalPath addToPath(this, node); >- >- bool visit = true; >- >- if (preVisit) >- visit = visitLoop(PreVisit, node); >- >- if (visit) >- { >- // We don't need to traverse loop expressions or conditions since they can't be declarations >- // in the AST (loops which have a declaration in their condition get transformed in the >- // parsing stage). >- ASSERT(node->getExpression() == nullptr || >- node->getExpression()->getAsDeclarationNode() == nullptr); >- ASSERT(node->getCondition() == nullptr || >- node->getCondition()->getAsDeclarationNode() == nullptr); >- >- if (node->getBody()) >- node->getBody()->traverse(this); >- >- if (node->getInit()) >- node->getInit()->traverse(this); >- } >- >- if (visit && postVisit) >- visitLoop(PostVisit, node); >-} >- >-} // namespace >- >-void RemoveUnreferencedVariables(TIntermBlock *root, TSymbolTable *symbolTable) >-{ >- CollectVariableRefCountsTraverser collector; >- root->traverse(&collector); >- RemoveUnreferencedVariablesTraverser traverser(&collector.getSymbolIdRefCounts(), >- &collector.getStructIdRefCounts(), symbolTable); >- root->traverse(&traverser); >- traverser.updateTree(); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveUnreferencedVariables.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveUnreferencedVariables.h >deleted file mode 100644 >index 39c8327776e..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveUnreferencedVariables.h >+++ /dev/null >@@ -1,24 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// RemoveUnreferencedVariables.h: >-// Drop variables that are declared but never referenced in the AST. This avoids adding unnecessary >-// initialization code for them. Also removes unreferenced struct types. >-// >- >-#ifndef COMPILER_TRANSLATOR_REMOVEUNREFERENCEDVARIABLES_H_ >-#define COMPILER_TRANSLATOR_REMOVEUNREFERENCEDVARIABLES_H_ >- >-namespace sh >-{ >- >-class TIntermBlock; >-class TSymbolTable; >- >-void RemoveUnreferencedVariables(TIntermBlock *root, TSymbolTable *symbolTable); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_REMOVEUNREFERENCEDVARIABLES_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ResourcesHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ResourcesHLSL.cpp >new file mode 100644 >index 00000000000..95e98deb122 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ResourcesHLSL.cpp >@@ -0,0 +1,789 @@ >+// >+// Copyright (c) 2014 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. >+// >+// ResourcesHLSL.cpp: >+// Methods for GLSL to HLSL translation for uniforms and interface blocks. >+// >+ >+#include "compiler/translator/ResourcesHLSL.h" >+ >+#include "common/utilities.h" >+#include "compiler/translator/AtomicCounterFunctionHLSL.h" >+#include "compiler/translator/ImmutableStringBuilder.h" >+#include "compiler/translator/StructureHLSL.h" >+#include "compiler/translator/UtilsHLSL.h" >+#include "compiler/translator/blocklayoutHLSL.h" >+#include "compiler/translator/util.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+constexpr const ImmutableString kAngleDecorString("angle_"); >+ >+static const char *UniformRegisterPrefix(const TType &type) >+{ >+ if (IsSampler(type.getBasicType())) >+ { >+ return "s"; >+ } >+ else >+ { >+ return "c"; >+ } >+} >+ >+static TString InterfaceBlockFieldTypeString(const TField &field, TLayoutBlockStorage blockStorage) >+{ >+ const TType &fieldType = *field.type(); >+ const TLayoutMatrixPacking matrixPacking = fieldType.getLayoutQualifier().matrixPacking; >+ ASSERT(matrixPacking != EmpUnspecified); >+ const TStructure *structure = fieldType.getStruct(); >+ >+ if (fieldType.isMatrix()) >+ { >+ // Use HLSL row-major packing for GLSL column-major matrices >+ const TString &matrixPackString = >+ (matrixPacking == EmpRowMajor ? "column_major" : "row_major"); >+ return matrixPackString + " " + TypeString(fieldType); >+ } >+ else if (structure) >+ { >+ // Use HLSL row-major packing for GLSL column-major matrices >+ return QualifiedStructNameString(*structure, matrixPacking == EmpColumnMajor, >+ blockStorage == EbsStd140); >+ } >+ else >+ { >+ return TypeString(fieldType); >+ } >+} >+ >+static TString InterfaceBlockStructName(const TInterfaceBlock &interfaceBlock) >+{ >+ return DecoratePrivate(interfaceBlock.name()) + "_type"; >+} >+ >+void OutputUniformIndexArrayInitializer(TInfoSinkBase &out, >+ const TType &type, >+ unsigned int startIndex) >+{ >+ out << "{"; >+ TType elementType(type); >+ elementType.toArrayElementType(); >+ for (unsigned int i = 0u; i < type.getOutermostArraySize(); ++i) >+ { >+ if (i > 0u) >+ { >+ out << ", "; >+ } >+ if (elementType.isArray()) >+ { >+ OutputUniformIndexArrayInitializer(out, elementType, >+ startIndex + i * elementType.getArraySizeProduct()); >+ } >+ else >+ { >+ out << (startIndex + i); >+ } >+ } >+ out << "}"; >+} >+ >+} // anonymous namespace >+ >+ResourcesHLSL::ResourcesHLSL(StructureHLSL *structureHLSL, >+ ShShaderOutput outputType, >+ const std::vector<Uniform> &uniforms, >+ unsigned int firstUniformRegister) >+ : mUniformRegister(firstUniformRegister), >+ mUniformBlockRegister(0), >+ mTextureRegister(0), >+ mUAVRegister(0), >+ mSamplerCount(0), >+ mStructureHLSL(structureHLSL), >+ mOutputType(outputType), >+ mUniforms(uniforms) >+{} >+ >+void ResourcesHLSL::reserveUniformRegisters(unsigned int registerCount) >+{ >+ mUniformRegister = registerCount; >+} >+ >+void ResourcesHLSL::reserveUniformBlockRegisters(unsigned int registerCount) >+{ >+ mUniformBlockRegister = registerCount; >+} >+ >+const Uniform *ResourcesHLSL::findUniformByName(const ImmutableString &name) const >+{ >+ for (size_t uniformIndex = 0; uniformIndex < mUniforms.size(); ++uniformIndex) >+ { >+ if (name == mUniforms[uniformIndex].name) >+ { >+ return &mUniforms[uniformIndex]; >+ } >+ } >+ >+ return nullptr; >+} >+ >+unsigned int ResourcesHLSL::assignUniformRegister(const TType &type, >+ const ImmutableString &name, >+ unsigned int *outRegisterCount) >+{ >+ unsigned int registerIndex; >+ const Uniform *uniform = findUniformByName(name); >+ ASSERT(uniform); >+ >+ if (IsSampler(type.getBasicType()) || >+ (IsImage(type.getBasicType()) && type.getMemoryQualifier().readonly)) >+ { >+ registerIndex = mTextureRegister; >+ } >+ else if (IsImage(type.getBasicType())) >+ { >+ registerIndex = mUAVRegister; >+ } >+ else >+ { >+ registerIndex = mUniformRegister; >+ } >+ >+ if (uniform->name == "angle_DrawID" && uniform->mappedName == "angle_DrawID") >+ { >+ mUniformRegisterMap["gl_DrawID"] = registerIndex; >+ } >+ else >+ { >+ mUniformRegisterMap[uniform->name] = registerIndex; >+ } >+ >+ unsigned int registerCount = HLSLVariableRegisterCount(*uniform, mOutputType); >+ >+ if (IsSampler(type.getBasicType()) || >+ (IsImage(type.getBasicType()) && type.getMemoryQualifier().readonly)) >+ { >+ mTextureRegister += registerCount; >+ } >+ else if (IsImage(type.getBasicType())) >+ { >+ mUAVRegister += registerCount; >+ } >+ else >+ { >+ mUniformRegister += registerCount; >+ } >+ if (outRegisterCount) >+ { >+ *outRegisterCount = registerCount; >+ } >+ return registerIndex; >+} >+ >+unsigned int ResourcesHLSL::assignSamplerInStructUniformRegister(const TType &type, >+ const TString &name, >+ unsigned int *outRegisterCount) >+{ >+ // Sampler that is a field of a uniform structure. >+ ASSERT(IsSampler(type.getBasicType())); >+ unsigned int registerIndex = mTextureRegister; >+ mUniformRegisterMap[std::string(name.c_str())] = registerIndex; >+ unsigned int registerCount = type.isArray() ? type.getArraySizeProduct() : 1u; >+ mTextureRegister += registerCount; >+ if (outRegisterCount) >+ { >+ *outRegisterCount = registerCount; >+ } >+ return registerIndex; >+} >+ >+void ResourcesHLSL::outputHLSLSamplerUniformGroup( >+ TInfoSinkBase &out, >+ const HLSLTextureGroup textureGroup, >+ const TVector<const TVariable *> &group, >+ const TMap<const TVariable *, TString> &samplerInStructSymbolsToAPINames, >+ unsigned int *groupTextureRegisterIndex) >+{ >+ if (group.empty()) >+ { >+ return; >+ } >+ unsigned int groupRegisterCount = 0; >+ for (const TVariable *uniform : group) >+ { >+ const TType &type = uniform->getType(); >+ const ImmutableString &name = uniform->name(); >+ unsigned int registerCount; >+ >+ // The uniform might be just a regular sampler or one extracted from a struct. >+ unsigned int samplerArrayIndex = 0u; >+ const Uniform *uniformByName = findUniformByName(name); >+ if (uniformByName) >+ { >+ samplerArrayIndex = assignUniformRegister(type, name, ®isterCount); >+ } >+ else >+ { >+ ASSERT(samplerInStructSymbolsToAPINames.find(uniform) != >+ samplerInStructSymbolsToAPINames.end()); >+ samplerArrayIndex = assignSamplerInStructUniformRegister( >+ type, samplerInStructSymbolsToAPINames.at(uniform), ®isterCount); >+ } >+ groupRegisterCount += registerCount; >+ >+ if (type.isArray()) >+ { >+ out << "static const uint " << DecorateVariableIfNeeded(*uniform) << ArrayString(type) >+ << " = "; >+ OutputUniformIndexArrayInitializer(out, type, samplerArrayIndex); >+ out << ";\n"; >+ } >+ else >+ { >+ out << "static const uint " << DecorateVariableIfNeeded(*uniform) << " = " >+ << samplerArrayIndex << ";\n"; >+ } >+ } >+ TString suffix = TextureGroupSuffix(textureGroup); >+ // Since HLSL_TEXTURE_2D is the first group, it has a fixed offset of zero. >+ if (textureGroup != HLSL_TEXTURE_2D) >+ { >+ out << "static const uint textureIndexOffset" << suffix << " = " >+ << (*groupTextureRegisterIndex) << ";\n"; >+ out << "static const uint samplerIndexOffset" << suffix << " = " >+ << (*groupTextureRegisterIndex) << ";\n"; >+ } >+ out << "uniform " << TextureString(textureGroup) << " textures" << suffix << "[" >+ << groupRegisterCount << "]" >+ << " : register(t" << (*groupTextureRegisterIndex) << ");\n"; >+ out << "uniform " << SamplerString(textureGroup) << " samplers" << suffix << "[" >+ << groupRegisterCount << "]" >+ << " : register(s" << (*groupTextureRegisterIndex) << ");\n"; >+ *groupTextureRegisterIndex += groupRegisterCount; >+} >+ >+void ResourcesHLSL::outputHLSLImageUniformIndices(TInfoSinkBase &out, >+ const TVector<const TVariable *> &group, >+ unsigned int imageArrayIndex, >+ unsigned int *groupRegisterCount) >+{ >+ for (const TVariable *uniform : group) >+ { >+ const TType &type = uniform->getType(); >+ const ImmutableString &name = uniform->name(); >+ unsigned int registerCount = 0; >+ >+ assignUniformRegister(type, name, ®isterCount); >+ *groupRegisterCount += registerCount; >+ >+ if (type.isArray()) >+ { >+ out << "static const uint " << DecorateVariableIfNeeded(*uniform) << ArrayString(type) >+ << " = "; >+ OutputUniformIndexArrayInitializer(out, type, imageArrayIndex); >+ out << ";\n"; >+ } >+ else >+ { >+ out << "static const uint " << DecorateVariableIfNeeded(*uniform) << " = " >+ << imageArrayIndex << ";\n"; >+ } >+ >+ imageArrayIndex += registerCount; >+ } >+} >+ >+void ResourcesHLSL::outputHLSLReadonlyImageUniformGroup(TInfoSinkBase &out, >+ const HLSLTextureGroup textureGroup, >+ const TVector<const TVariable *> &group, >+ unsigned int *groupTextureRegisterIndex) >+{ >+ if (group.empty()) >+ { >+ return; >+ } >+ >+ unsigned int groupRegisterCount = 0; >+ outputHLSLImageUniformIndices(out, group, *groupTextureRegisterIndex, &groupRegisterCount); >+ >+ TString suffix = TextureGroupSuffix(textureGroup); >+ out << "static const uint readonlyImageIndexOffset" << suffix << " = " >+ << (*groupTextureRegisterIndex) << ";\n"; >+ out << "uniform " << TextureString(textureGroup) << " readonlyImages" << suffix << "[" >+ << groupRegisterCount << "]" >+ << " : register(t" << (*groupTextureRegisterIndex) << ");\n"; >+ *groupTextureRegisterIndex += groupRegisterCount; >+} >+ >+void ResourcesHLSL::outputHLSLImageUniformGroup(TInfoSinkBase &out, >+ const HLSLRWTextureGroup textureGroup, >+ const TVector<const TVariable *> &group, >+ unsigned int *groupTextureRegisterIndex) >+{ >+ if (group.empty()) >+ { >+ return; >+ } >+ >+ unsigned int groupRegisterCount = 0; >+ outputHLSLImageUniformIndices(out, group, *groupTextureRegisterIndex, &groupRegisterCount); >+ >+ TString suffix = RWTextureGroupSuffix(textureGroup); >+ out << "static const uint imageIndexOffset" << suffix << " = " << (*groupTextureRegisterIndex) >+ << ";\n"; >+ out << "uniform " << RWTextureString(textureGroup) << " images" << suffix << "[" >+ << groupRegisterCount << "]" >+ << " : register(u" << (*groupTextureRegisterIndex) << ");\n"; >+ *groupTextureRegisterIndex += groupRegisterCount; >+} >+ >+void ResourcesHLSL::outputHLSL4_0_FL9_3Sampler(TInfoSinkBase &out, >+ const TType &type, >+ const TVariable &variable, >+ const unsigned int registerIndex) >+{ >+ out << "uniform " << SamplerString(type.getBasicType()) << " sampler_" >+ << DecorateVariableIfNeeded(variable) << ArrayString(type) << " : register(s" >+ << str(registerIndex) << ");\n"; >+ out << "uniform " << TextureString(type.getBasicType()) << " texture_" >+ << DecorateVariableIfNeeded(variable) << ArrayString(type) << " : register(t" >+ << str(registerIndex) << ");\n"; >+} >+ >+void ResourcesHLSL::outputUniform(TInfoSinkBase &out, >+ const TType &type, >+ const TVariable &variable, >+ const unsigned int registerIndex) >+{ >+ const TStructure *structure = type.getStruct(); >+ // If this is a nameless struct, we need to use its full definition, rather than its (empty) >+ // name. >+ // TypeString() will invoke defineNameless in this case; qualifier prefixes are unnecessary for >+ // nameless structs in ES, as nameless structs cannot be used anywhere that layout qualifiers >+ // are permitted. >+ const TString &typeName = ((structure && structure->symbolType() != SymbolType::Empty) >+ ? QualifiedStructNameString(*structure, false, false) >+ : TypeString(type)); >+ >+ const TString ®isterString = >+ TString("register(") + UniformRegisterPrefix(type) + str(registerIndex) + ")"; >+ >+ out << "uniform " << typeName << " "; >+ >+ out << DecorateVariableIfNeeded(variable); >+ >+ out << ArrayString(type) << " : " << registerString << ";\n"; >+} >+ >+void ResourcesHLSL::outputAtomicCounterBuffer(TInfoSinkBase &out, >+ const int binding, >+ const unsigned int registerIndex) >+{ >+ // Atomic counter memory access is not incoherent >+ out << "uniform globallycoherent RWByteAddressBuffer " >+ << getAtomicCounterNameForBinding(binding) << " : register(u" << registerIndex << ");\n"; >+} >+ >+void ResourcesHLSL::uniformsHeader(TInfoSinkBase &out, >+ ShShaderOutput outputType, >+ const ReferencedVariables &referencedUniforms, >+ TSymbolTable *symbolTable) >+{ >+ if (!referencedUniforms.empty()) >+ { >+ out << "// Uniforms\n\n"; >+ } >+ // In the case of HLSL 4, sampler uniforms need to be grouped by type before the code is >+ // written. They are grouped based on the combination of the HLSL texture type and >+ // HLSL sampler type, enumerated in HLSLTextureSamplerGroup. >+ TVector<TVector<const TVariable *>> groupedSamplerUniforms(HLSL_TEXTURE_MAX + 1); >+ TMap<const TVariable *, TString> samplerInStructSymbolsToAPINames; >+ TVector<TVector<const TVariable *>> groupedReadonlyImageUniforms(HLSL_TEXTURE_MAX + 1); >+ TVector<TVector<const TVariable *>> groupedImageUniforms(HLSL_RWTEXTURE_MAX + 1); >+ >+ TUnorderedMap<int, unsigned int> assignedAtomicCounterBindings; >+ unsigned int reservedReadonlyImageRegisterCount = 0, reservedImageRegisterCount = 0; >+ for (auto &uniformIt : referencedUniforms) >+ { >+ // Output regular uniforms. Group sampler uniforms by type. >+ const TVariable &variable = *uniformIt.second; >+ const TType &type = variable.getType(); >+ >+ if (outputType == SH_HLSL_4_1_OUTPUT && IsSampler(type.getBasicType())) >+ { >+ HLSLTextureGroup group = TextureGroup(type.getBasicType()); >+ groupedSamplerUniforms[group].push_back(&variable); >+ } >+ else if (outputType == SH_HLSL_4_0_FL9_3_OUTPUT && IsSampler(type.getBasicType())) >+ { >+ unsigned int registerIndex = assignUniformRegister(type, variable.name(), nullptr); >+ outputHLSL4_0_FL9_3Sampler(out, type, variable, registerIndex); >+ } >+ else if (outputType == SH_HLSL_4_1_OUTPUT && IsImage(type.getBasicType())) >+ { >+ if (IsImage2D(type.getBasicType())) >+ { >+ const Uniform *uniform = findUniformByName(variable.name()); >+ if (type.getMemoryQualifier().readonly) >+ { >+ reservedReadonlyImageRegisterCount += >+ HLSLVariableRegisterCount(*uniform, mOutputType); >+ } >+ else >+ { >+ reservedImageRegisterCount += HLSLVariableRegisterCount(*uniform, mOutputType); >+ } >+ continue; >+ } >+ if (type.getMemoryQualifier().readonly) >+ { >+ HLSLTextureGroup group = TextureGroup( >+ type.getBasicType(), type.getLayoutQualifier().imageInternalFormat); >+ groupedReadonlyImageUniforms[group].push_back(&variable); >+ } >+ else >+ { >+ HLSLRWTextureGroup group = RWTextureGroup( >+ type.getBasicType(), type.getLayoutQualifier().imageInternalFormat); >+ groupedImageUniforms[group].push_back(&variable); >+ } >+ } >+ else if (outputType == SH_HLSL_4_1_OUTPUT && IsAtomicCounter(type.getBasicType())) >+ { >+ TLayoutQualifier layout = type.getLayoutQualifier(); >+ int binding = layout.binding; >+ unsigned int registerIndex; >+ if (assignedAtomicCounterBindings.find(binding) == assignedAtomicCounterBindings.end()) >+ { >+ registerIndex = mUAVRegister++; >+ assignedAtomicCounterBindings[binding] = registerIndex; >+ outputAtomicCounterBuffer(out, binding, registerIndex); >+ } >+ else >+ { >+ registerIndex = assignedAtomicCounterBindings[binding]; >+ } >+ const Uniform *uniform = findUniformByName(variable.name()); >+ mUniformRegisterMap[uniform->name] = registerIndex; >+ } >+ else >+ { >+ if (type.isStructureContainingSamplers()) >+ { >+ TVector<const TVariable *> samplerSymbols; >+ TMap<const TVariable *, TString> symbolsToAPINames; >+ ImmutableStringBuilder namePrefix(kAngleDecorString.length() + >+ variable.name().length()); >+ namePrefix << kAngleDecorString; >+ namePrefix << variable.name(); >+ type.createSamplerSymbols(namePrefix, TString(variable.name().data()), >+ &samplerSymbols, &symbolsToAPINames, symbolTable); >+ for (const TVariable *sampler : samplerSymbols) >+ { >+ const TType &samplerType = sampler->getType(); >+ >+ if (outputType == SH_HLSL_4_1_OUTPUT) >+ { >+ HLSLTextureGroup group = TextureGroup(samplerType.getBasicType()); >+ groupedSamplerUniforms[group].push_back(sampler); >+ samplerInStructSymbolsToAPINames[sampler] = symbolsToAPINames[sampler]; >+ } >+ else if (outputType == SH_HLSL_4_0_FL9_3_OUTPUT) >+ { >+ unsigned int registerIndex = assignSamplerInStructUniformRegister( >+ samplerType, symbolsToAPINames[sampler], nullptr); >+ outputHLSL4_0_FL9_3Sampler(out, samplerType, *sampler, registerIndex); >+ } >+ else >+ { >+ ASSERT(outputType == SH_HLSL_3_0_OUTPUT); >+ unsigned int registerIndex = assignSamplerInStructUniformRegister( >+ samplerType, symbolsToAPINames[sampler], nullptr); >+ outputUniform(out, samplerType, *sampler, registerIndex); >+ } >+ } >+ } >+ unsigned int registerIndex = assignUniformRegister(type, variable.name(), nullptr); >+ outputUniform(out, type, variable, registerIndex); >+ } >+ } >+ >+ if (outputType == SH_HLSL_4_1_OUTPUT) >+ { >+ unsigned int groupTextureRegisterIndex = 0; >+ // Atomic counters and RW texture share the same resources. Therefore, RW texture need to >+ // start counting after the last atomic counter. >+ unsigned int groupRWTextureRegisterIndex = mUAVRegister; >+ // TEXTURE_2D is special, index offset is assumed to be 0 and omitted in that case. >+ ASSERT(HLSL_TEXTURE_MIN == HLSL_TEXTURE_2D); >+ for (int groupId = HLSL_TEXTURE_MIN; groupId < HLSL_TEXTURE_MAX; ++groupId) >+ { >+ outputHLSLSamplerUniformGroup( >+ out, HLSLTextureGroup(groupId), groupedSamplerUniforms[groupId], >+ samplerInStructSymbolsToAPINames, &groupTextureRegisterIndex); >+ } >+ mSamplerCount = groupTextureRegisterIndex; >+ >+ // Reserve t type register for readonly image2D variables. >+ mReadonlyImage2DRegisterIndex = mTextureRegister; >+ groupTextureRegisterIndex += reservedReadonlyImageRegisterCount; >+ mTextureRegister += reservedReadonlyImageRegisterCount; >+ >+ for (int groupId = HLSL_TEXTURE_MIN; groupId < HLSL_TEXTURE_MAX; ++groupId) >+ { >+ outputHLSLReadonlyImageUniformGroup(out, HLSLTextureGroup(groupId), >+ groupedReadonlyImageUniforms[groupId], >+ &groupTextureRegisterIndex); >+ } >+ mReadonlyImageCount = groupTextureRegisterIndex - mReadonlyImage2DRegisterIndex; >+ if (mReadonlyImageCount) >+ { >+ out << "static const uint readonlyImageIndexStart = " << mReadonlyImage2DRegisterIndex >+ << ";\n"; >+ } >+ >+ // Reserve u type register for writable image2D variables. >+ mImage2DRegisterIndex = mUAVRegister; >+ groupRWTextureRegisterIndex += reservedImageRegisterCount; >+ mUAVRegister += reservedImageRegisterCount; >+ >+ for (int groupId = HLSL_RWTEXTURE_MIN; groupId < HLSL_RWTEXTURE_MAX; ++groupId) >+ { >+ outputHLSLImageUniformGroup(out, HLSLRWTextureGroup(groupId), >+ groupedImageUniforms[groupId], >+ &groupRWTextureRegisterIndex); >+ } >+ mImageCount = groupRWTextureRegisterIndex - mImage2DRegisterIndex; >+ if (mImageCount) >+ { >+ out << "static const uint imageIndexStart = " << mImage2DRegisterIndex << ";\n"; >+ } >+ } >+} >+ >+void ResourcesHLSL::samplerMetadataUniforms(TInfoSinkBase &out, unsigned int regIndex) >+{ >+ // If mSamplerCount is 0 the shader doesn't use any textures for samplers. >+ if (mSamplerCount > 0) >+ { >+ out << " struct SamplerMetadata\n" >+ " {\n" >+ " int baseLevel;\n" >+ " int internalFormatBits;\n" >+ " int wrapModes;\n" >+ " int padding;\n" >+ " int4 intBorderColor;\n" >+ " };\n" >+ " SamplerMetadata samplerMetadata[" >+ << mSamplerCount << "] : packoffset(c" << regIndex << ");\n"; >+ } >+} >+ >+void ResourcesHLSL::imageMetadataUniforms(TInfoSinkBase &out, unsigned int regIndex) >+{ >+ if (mReadonlyImageCount > 0 || mImageCount > 0) >+ { >+ out << " struct ImageMetadata\n" >+ " {\n" >+ " int layer;\n" >+ " int3 padding;\n" >+ " };\n"; >+ >+ if (mReadonlyImageCount > 0) >+ { >+ out << " ImageMetadata readonlyImageMetadata[" << mReadonlyImageCount >+ << "] : packoffset(c" << regIndex << ");\n"; >+ } >+ >+ if (mImageCount > 0) >+ { >+ out << " ImageMetadata imageMetadata[" << mImageCount << "] : packoffset(c" >+ << regIndex + mReadonlyImageCount << ");\n"; >+ } >+ } >+} >+ >+TString ResourcesHLSL::uniformBlocksHeader( >+ const ReferencedInterfaceBlocks &referencedInterfaceBlocks) >+{ >+ TString interfaceBlocks; >+ >+ for (const auto &blockReference : referencedInterfaceBlocks) >+ { >+ const TInterfaceBlock &interfaceBlock = *blockReference.second->block; >+ const TVariable *instanceVariable = blockReference.second->instanceVariable; >+ if (instanceVariable != nullptr) >+ { >+ interfaceBlocks += uniformBlockStructString(interfaceBlock); >+ } >+ >+ unsigned int activeRegister = mUniformBlockRegister; >+ mUniformBlockRegisterMap[interfaceBlock.name().data()] = activeRegister; >+ >+ if (instanceVariable != nullptr && instanceVariable->getType().isArray()) >+ { >+ unsigned int instanceArraySize = instanceVariable->getType().getOutermostArraySize(); >+ for (unsigned int arrayIndex = 0; arrayIndex < instanceArraySize; arrayIndex++) >+ { >+ interfaceBlocks += uniformBlockString(interfaceBlock, instanceVariable, >+ activeRegister + arrayIndex, arrayIndex); >+ } >+ mUniformBlockRegister += instanceArraySize; >+ } >+ else >+ { >+ interfaceBlocks += uniformBlockString(interfaceBlock, instanceVariable, activeRegister, >+ GL_INVALID_INDEX); >+ mUniformBlockRegister += 1u; >+ } >+ } >+ >+ return (interfaceBlocks.empty() ? "" : ("// Uniform Blocks\n\n" + interfaceBlocks)); >+} >+ >+TString ResourcesHLSL::shaderStorageBlocksHeader( >+ const ReferencedInterfaceBlocks &referencedInterfaceBlocks) >+{ >+ TString interfaceBlocks; >+ >+ for (const auto &interfaceBlockReference : referencedInterfaceBlocks) >+ { >+ const TInterfaceBlock &interfaceBlock = *interfaceBlockReference.second->block; >+ const TVariable *instanceVariable = interfaceBlockReference.second->instanceVariable; >+ >+ unsigned int activeRegister = mUAVRegister; >+ mShaderStorageBlockRegisterMap[interfaceBlock.name().data()] = activeRegister; >+ >+ if (instanceVariable != nullptr && instanceVariable->getType().isArray()) >+ { >+ unsigned int instanceArraySize = instanceVariable->getType().getOutermostArraySize(); >+ for (unsigned int arrayIndex = 0; arrayIndex < instanceArraySize; arrayIndex++) >+ { >+ interfaceBlocks += shaderStorageBlockString( >+ interfaceBlock, instanceVariable, activeRegister + arrayIndex, arrayIndex); >+ } >+ mUAVRegister += instanceArraySize; >+ } >+ else >+ { >+ interfaceBlocks += shaderStorageBlockString(interfaceBlock, instanceVariable, >+ activeRegister, GL_INVALID_INDEX); >+ mUAVRegister += 1u; >+ } >+ } >+ >+ return (interfaceBlocks.empty() ? "" : ("// Shader Storage Blocks\n\n" + interfaceBlocks)); >+} >+ >+TString ResourcesHLSL::uniformBlockString(const TInterfaceBlock &interfaceBlock, >+ const TVariable *instanceVariable, >+ unsigned int registerIndex, >+ unsigned int arrayIndex) >+{ >+ const TString &arrayIndexString = (arrayIndex != GL_INVALID_INDEX ? str(arrayIndex) : ""); >+ const TString &blockName = TString(interfaceBlock.name().data()) + arrayIndexString; >+ TString hlsl; >+ >+ hlsl += "cbuffer " + blockName + " : register(b" + str(registerIndex) + >+ ")\n" >+ "{\n"; >+ >+ if (instanceVariable != nullptr) >+ { >+ hlsl += " " + InterfaceBlockStructName(interfaceBlock) + " " + >+ InterfaceBlockInstanceString(instanceVariable->name(), arrayIndex) + ";\n"; >+ } >+ else >+ { >+ const TLayoutBlockStorage blockStorage = interfaceBlock.blockStorage(); >+ hlsl += uniformBlockMembersString(interfaceBlock, blockStorage); >+ } >+ >+ hlsl += "};\n\n"; >+ >+ return hlsl; >+} >+ >+TString ResourcesHLSL::shaderStorageBlockString(const TInterfaceBlock &interfaceBlock, >+ const TVariable *instanceVariable, >+ unsigned int registerIndex, >+ unsigned int arrayIndex) >+{ >+ TString hlsl; >+ if (instanceVariable != nullptr) >+ { >+ hlsl += "RWByteAddressBuffer " + >+ InterfaceBlockInstanceString(instanceVariable->name(), arrayIndex) + >+ ": register(u" + str(registerIndex) + ");\n"; >+ } >+ else >+ { >+ hlsl += "RWByteAddressBuffer " + Decorate(interfaceBlock.name()) + ": register(u" + >+ str(registerIndex) + ");\n"; >+ } >+ return hlsl; >+} >+ >+TString ResourcesHLSL::InterfaceBlockInstanceString(const ImmutableString &instanceName, >+ unsigned int arrayIndex) >+{ >+ if (arrayIndex != GL_INVALID_INDEX) >+ { >+ return DecoratePrivate(instanceName) + "_" + str(arrayIndex); >+ } >+ else >+ { >+ return Decorate(instanceName); >+ } >+} >+ >+TString ResourcesHLSL::uniformBlockMembersString(const TInterfaceBlock &interfaceBlock, >+ TLayoutBlockStorage blockStorage) >+{ >+ TString hlsl; >+ >+ Std140PaddingHelper padHelper = mStructureHLSL->getPaddingHelper(); >+ >+ for (unsigned int typeIndex = 0; typeIndex < interfaceBlock.fields().size(); typeIndex++) >+ { >+ const TField &field = *interfaceBlock.fields()[typeIndex]; >+ const TType &fieldType = *field.type(); >+ >+ if (blockStorage == EbsStd140) >+ { >+ // 2 and 3 component vector types in some cases need pre-padding >+ hlsl += padHelper.prePaddingString(fieldType); >+ } >+ >+ hlsl += " " + InterfaceBlockFieldTypeString(field, blockStorage) + " " + >+ Decorate(field.name()) + ArrayString(fieldType).data() + ";\n"; >+ >+ // must pad out after matrices and arrays, where HLSL usually allows itself room to pack >+ // stuff >+ if (blockStorage == EbsStd140) >+ { >+ const bool useHLSLRowMajorPacking = >+ (fieldType.getLayoutQualifier().matrixPacking == EmpColumnMajor); >+ hlsl += padHelper.postPaddingString(fieldType, useHLSLRowMajorPacking); >+ } >+ } >+ >+ return hlsl; >+} >+ >+TString ResourcesHLSL::uniformBlockStructString(const TInterfaceBlock &interfaceBlock) >+{ >+ const TLayoutBlockStorage blockStorage = interfaceBlock.blockStorage(); >+ >+ return "struct " + InterfaceBlockStructName(interfaceBlock) + >+ "\n" >+ "{\n" + >+ uniformBlockMembersString(interfaceBlock, blockStorage) + "};\n\n"; >+} >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ResourcesHLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ResourcesHLSL.h >new file mode 100644 >index 00000000000..0c028224b00 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ResourcesHLSL.h >@@ -0,0 +1,139 @@ >+// >+// Copyright (c) 2014 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. >+// >+// ResourcesHLSL.h: >+// Methods for GLSL to HLSL translation for uniforms and interface blocks. >+// >+ >+#ifndef COMPILER_TRANSLATOR_RESOURCESHLSL_H_ >+#define COMPILER_TRANSLATOR_RESOURCESHLSL_H_ >+ >+#include "compiler/translator/OutputHLSL.h" >+#include "compiler/translator/UtilsHLSL.h" >+ >+namespace sh >+{ >+class ImmutableString; >+class StructureHLSL; >+class TSymbolTable; >+ >+class ResourcesHLSL : angle::NonCopyable >+{ >+ public: >+ ResourcesHLSL(StructureHLSL *structureHLSL, >+ ShShaderOutput outputType, >+ const std::vector<Uniform> &uniforms, >+ unsigned int firstUniformRegister); >+ >+ void reserveUniformRegisters(unsigned int registerCount); >+ void reserveUniformBlockRegisters(unsigned int registerCount); >+ void uniformsHeader(TInfoSinkBase &out, >+ ShShaderOutput outputType, >+ const ReferencedVariables &referencedUniforms, >+ TSymbolTable *symbolTable); >+ >+ // Must be called after uniformsHeader >+ void samplerMetadataUniforms(TInfoSinkBase &out, unsigned int regIndex); >+ unsigned int getSamplerCount() const { return mSamplerCount; } >+ void imageMetadataUniforms(TInfoSinkBase &out, unsigned int regIndex); >+ TString uniformBlocksHeader(const ReferencedInterfaceBlocks &referencedInterfaceBlocks); >+ TString shaderStorageBlocksHeader(const ReferencedInterfaceBlocks &referencedInterfaceBlocks); >+ >+ // Used for direct index references >+ static TString InterfaceBlockInstanceString(const ImmutableString &instanceName, >+ unsigned int arrayIndex); >+ >+ const std::map<std::string, unsigned int> &getShaderStorageBlockRegisterMap() const >+ { >+ return mShaderStorageBlockRegisterMap; >+ } >+ >+ const std::map<std::string, unsigned int> &getUniformBlockRegisterMap() const >+ { >+ return mUniformBlockRegisterMap; >+ } >+ const std::map<std::string, unsigned int> &getUniformRegisterMap() const >+ { >+ return mUniformRegisterMap; >+ } >+ >+ unsigned int getReadonlyImage2DRegisterIndex() const { return mReadonlyImage2DRegisterIndex; } >+ unsigned int getImage2DRegisterIndex() const { return mImage2DRegisterIndex; } >+ >+ private: >+ TString uniformBlockString(const TInterfaceBlock &interfaceBlock, >+ const TVariable *instanceVariable, >+ unsigned int registerIndex, >+ unsigned int arrayIndex); >+ >+ TString shaderStorageBlockString(const TInterfaceBlock &interfaceBlock, >+ const TVariable *instanceVariable, >+ unsigned int registerIndex, >+ unsigned int arrayIndex); >+ TString uniformBlockMembersString(const TInterfaceBlock &interfaceBlock, >+ TLayoutBlockStorage blockStorage); >+ TString uniformBlockStructString(const TInterfaceBlock &interfaceBlock); >+ const Uniform *findUniformByName(const ImmutableString &name) const; >+ >+ void outputHLSL4_0_FL9_3Sampler(TInfoSinkBase &out, >+ const TType &type, >+ const TVariable &variable, >+ const unsigned int registerIndex); >+ void outputUniform(TInfoSinkBase &out, >+ const TType &type, >+ const TVariable &variable, >+ const unsigned int registerIndex); >+ void outputAtomicCounterBuffer(TInfoSinkBase &out, >+ const int binding, >+ const unsigned int registerIndex); >+ >+ // Returns the uniform's register index >+ unsigned int assignUniformRegister(const TType &type, >+ const ImmutableString &name, >+ unsigned int *outRegisterCount); >+ unsigned int assignSamplerInStructUniformRegister(const TType &type, >+ const TString &name, >+ unsigned int *outRegisterCount); >+ >+ void outputHLSLSamplerUniformGroup( >+ TInfoSinkBase &out, >+ const HLSLTextureGroup textureGroup, >+ const TVector<const TVariable *> &group, >+ const TMap<const TVariable *, TString> &samplerInStructSymbolsToAPINames, >+ unsigned int *groupTextureRegisterIndex); >+ >+ void outputHLSLImageUniformIndices(TInfoSinkBase &out, >+ const TVector<const TVariable *> &group, >+ unsigned int imageArrayIndex, >+ unsigned int *groupRegisterCount); >+ void outputHLSLReadonlyImageUniformGroup(TInfoSinkBase &out, >+ const HLSLTextureGroup textureGroup, >+ const TVector<const TVariable *> &group, >+ unsigned int *groupTextureRegisterIndex); >+ void outputHLSLImageUniformGroup(TInfoSinkBase &out, >+ const HLSLRWTextureGroup textureGroup, >+ const TVector<const TVariable *> &group, >+ unsigned int *groupTextureRegisterIndex); >+ >+ unsigned int mUniformRegister; >+ unsigned int mUniformBlockRegister; >+ unsigned int mTextureRegister; >+ unsigned int mUAVRegister; >+ unsigned int mSamplerCount; >+ unsigned int mReadonlyImageCount; >+ unsigned int mImageCount; >+ StructureHLSL *mStructureHLSL; >+ ShShaderOutput mOutputType; >+ >+ const std::vector<Uniform> &mUniforms; >+ std::map<std::string, unsigned int> mUniformBlockRegisterMap; >+ std::map<std::string, unsigned int> mShaderStorageBlockRegisterMap; >+ std::map<std::string, unsigned int> mUniformRegisterMap; >+ unsigned int mReadonlyImage2DRegisterIndex; >+ unsigned int mImage2DRegisterIndex; >+}; >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_RESOURCESHLSL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteDoWhile.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteDoWhile.cpp >deleted file mode 100644 >index dc3fb7a74eb..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteDoWhile.cpp >+++ /dev/null >@@ -1,159 +0,0 @@ >-// >-// Copyright (c) 2015 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. >-// >- >-// RewriteDoWhile.cpp: rewrites do-while loops using another equivalent >-// construct. >- >-#include "compiler/translator/RewriteDoWhile.h" >- >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-// An AST traverser that rewrites loops of the form >-// do { >-// CODE; >-// } while (CONDITION) >-// >-// to loops of the form >-// bool temp = false; >-// while (true) { >-// if (temp) { >-// if (!CONDITION) { >-// break; >-// } >-// } >-// temp = true; >-// CODE; >-// } >-// >-// The reason we don't use a simpler form, with for example just (temp && !CONDITION) in the >-// while condition, is that short-circuit is often badly supported by driver shader compiler. >-// The double if has the same effect, but forces shader compilers to behave. >-// >-// TODO(cwallez) when UnfoldShortCircuitIntoIf handles loops correctly, revisit this as we might >-// be able to use while (temp || CONDITION) with temp initially set to true then run >-// UnfoldShortCircuitIntoIf >-class DoWhileRewriter : public TIntermTraverser >-{ >- public: >- DoWhileRewriter(TSymbolTable *symbolTable) : TIntermTraverser(true, false, false, symbolTable) >- { >- } >- >- bool visitBlock(Visit, TIntermBlock *node) override >- { >- // A well-formed AST can only have do-while inside TIntermBlock. By doing a prefix traversal >- // we are able to replace the do-while in the sequence directly as the content of the >- // do-while will be traversed later. >- >- TIntermSequence *statements = node->getSequence(); >- >- // The statements vector will have new statements inserted when we encounter a do-while, >- // which prevents us from using a range-based for loop. Using the usual i++ works, as >- // the (two) new statements inserted replace the statement at the current position. >- for (size_t i = 0; i < statements->size(); i++) >- { >- TIntermNode *statement = (*statements)[i]; >- TIntermLoop *loop = statement->getAsLoopNode(); >- >- if (loop == nullptr || loop->getType() != ELoopDoWhile) >- { >- continue; >- } >- >- // Found a loop to change. >- nextTemporaryId(); >- >- TType boolType = TType(EbtBool); >- >- // bool temp = false; >- TIntermDeclaration *tempDeclaration = nullptr; >- { >- TConstantUnion *falseConstant = new TConstantUnion(); >- falseConstant->setBConst(false); >- TIntermTyped *falseValue = new TIntermConstantUnion(falseConstant, boolType); >- >- tempDeclaration = createTempInitDeclaration(falseValue); >- } >- >- // temp = true; >- TIntermBinary *assignTrue = nullptr; >- { >- TConstantUnion *trueConstant = new TConstantUnion(); >- trueConstant->setBConst(true); >- TIntermTyped *trueValue = new TIntermConstantUnion(trueConstant, boolType); >- >- assignTrue = createTempAssignment(trueValue); >- } >- >- // if (temp) { >- // if (!CONDITION) { >- // break; >- // } >- // } >- TIntermIfElse *breakIf = nullptr; >- { >- TIntermBranch *breakStatement = new TIntermBranch(EOpBreak, nullptr); >- >- TIntermBlock *breakBlock = new TIntermBlock(); >- breakBlock->getSequence()->push_back(breakStatement); >- >- TIntermUnary *negatedCondition = >- new TIntermUnary(EOpLogicalNot, loop->getCondition()); >- >- TIntermIfElse *innerIf = new TIntermIfElse(negatedCondition, breakBlock, nullptr); >- >- TIntermBlock *innerIfBlock = new TIntermBlock(); >- innerIfBlock->getSequence()->push_back(innerIf); >- >- breakIf = new TIntermIfElse(createTempSymbol(boolType), innerIfBlock, nullptr); >- } >- >- // Assemble the replacement loops, reusing the do-while loop's body and inserting our >- // statements at the front. >- TIntermLoop *newLoop = nullptr; >- { >- TConstantUnion *trueConstant = new TConstantUnion(); >- trueConstant->setBConst(true); >- TIntermTyped *trueValue = new TIntermConstantUnion(trueConstant, boolType); >- >- TIntermBlock *body = loop->getBody(); >- if (body == nullptr) >- { >- body = new TIntermBlock(); >- } >- auto sequence = body->getSequence(); >- sequence->insert(sequence->begin(), assignTrue); >- sequence->insert(sequence->begin(), breakIf); >- >- newLoop = new TIntermLoop(ELoopWhile, nullptr, trueValue, nullptr, body); >- } >- >- TIntermSequence replacement; >- replacement.push_back(tempDeclaration); >- replacement.push_back(newLoop); >- >- node->replaceChildNodeWithMultiple(loop, replacement); >- } >- return true; >- } >-}; >- >-} // anonymous namespace >- >-void RewriteDoWhile(TIntermNode *root, TSymbolTable *symbolTable) >-{ >- DoWhileRewriter rewriter(symbolTable); >- >- root->traverse(&rewriter); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteDoWhile.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteDoWhile.h >deleted file mode 100644 >index e83bfc4b568..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteDoWhile.h >+++ /dev/null >@@ -1,23 +0,0 @@ >-// >-// Copyright (c) 2015 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. >-// >- >-// RewriteDoWhile.h: rewrite do-while loops as while loops to work around >-// driver bugs >- >-#ifndef COMPILER_TRANSLATOR_REWRITEDOWHILE_H_ >-#define COMPILER_TRANSLATOR_REWRITEDOWHILE_H_ >- >-namespace sh >-{ >- >-class TIntermNode; >-class TSymbolTable; >- >-void RewriteDoWhile(TIntermNode *root, TSymbolTable *symbolTable); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_REWRITEDOWHILE_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteElseBlocks.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteElseBlocks.cpp >deleted file mode 100644 >index ed1bfad8a83..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteElseBlocks.cpp >+++ /dev/null >@@ -1,120 +0,0 @@ >-// >-// Copyright (c) 2014 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. >-// >-// RewriteElseBlocks.cpp: Implementation for tree transform to change >-// all if-else blocks to if-if blocks. >-// >- >-#include "compiler/translator/RewriteElseBlocks.h" >- >-#include "compiler/translator/IntermNode.h" >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/NodeSearch.h" >-#include "compiler/translator/SymbolTable.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class ElseBlockRewriter : public TIntermTraverser >-{ >- public: >- ElseBlockRewriter(TSymbolTable *symbolTable); >- >- protected: >- bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *aggregate) override; >- bool visitBlock(Visit visit, TIntermBlock *block) override; >- >- private: >- TIntermNode *rewriteIfElse(TIntermIfElse *ifElse); >- >- const TType *mFunctionType; >-}; >- >-ElseBlockRewriter::ElseBlockRewriter(TSymbolTable *symbolTable) >- : TIntermTraverser(true, false, true, symbolTable), mFunctionType(nullptr) >-{ >-} >- >-bool ElseBlockRewriter::visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) >-{ >- // Store the current function context (see comment below) >- mFunctionType = ((visit == PreVisit) ? &node->getFunctionPrototype()->getType() : nullptr); >- return true; >-} >- >-bool ElseBlockRewriter::visitBlock(Visit visit, TIntermBlock *node) >-{ >- if (visit == PostVisit) >- { >- for (size_t statementIndex = 0; statementIndex != node->getSequence()->size(); >- statementIndex++) >- { >- TIntermNode *statement = (*node->getSequence())[statementIndex]; >- TIntermIfElse *ifElse = statement->getAsIfElseNode(); >- if (ifElse && ifElse->getFalseBlock() != nullptr) >- { >- (*node->getSequence())[statementIndex] = rewriteIfElse(ifElse); >- } >- } >- } >- return true; >-} >- >-TIntermNode *ElseBlockRewriter::rewriteIfElse(TIntermIfElse *ifElse) >-{ >- ASSERT(ifElse != nullptr); >- >- nextTemporaryId(); >- >- TIntermDeclaration *storeCondition = createTempInitDeclaration(ifElse->getCondition()); >- >- TIntermBlock *falseBlock = nullptr; >- >- TType boolType(EbtBool, EbpUndefined, EvqTemporary); >- >- if (ifElse->getFalseBlock()) >- { >- TIntermBlock *negatedElse = nullptr; >- // crbug.com/346463 >- // D3D generates error messages claiming a function has no return value, when rewriting >- // an if-else clause that returns something non-void in a function. By appending dummy >- // returns (that are unreachable) we can silence this compile error. >- if (mFunctionType && mFunctionType->getBasicType() != EbtVoid) >- { >- TIntermNode *returnNode = new TIntermBranch(EOpReturn, CreateZeroNode(*mFunctionType)); >- negatedElse = new TIntermBlock(); >- negatedElse->appendStatement(returnNode); >- } >- >- TIntermSymbol *conditionSymbolElse = createTempSymbol(boolType); >- TIntermUnary *negatedCondition = new TIntermUnary(EOpLogicalNot, conditionSymbolElse); >- TIntermIfElse *falseIfElse = >- new TIntermIfElse(negatedCondition, ifElse->getFalseBlock(), negatedElse); >- falseBlock = EnsureBlock(falseIfElse); >- } >- >- TIntermSymbol *conditionSymbolSel = createTempSymbol(boolType); >- TIntermIfElse *newIfElse = >- new TIntermIfElse(conditionSymbolSel, ifElse->getTrueBlock(), falseBlock); >- >- TIntermBlock *block = new TIntermBlock(); >- block->getSequence()->push_back(storeCondition); >- block->getSequence()->push_back(newIfElse); >- >- return block; >-} >- >-} // anonymous namespace >- >-void RewriteElseBlocks(TIntermNode *node, TSymbolTable *symbolTable) >-{ >- ElseBlockRewriter rewriter(symbolTable); >- node->traverse(&rewriter); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteElseBlocks.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteElseBlocks.h >deleted file mode 100644 >index 2586b5405c4..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteElseBlocks.h >+++ /dev/null >@@ -1,22 +0,0 @@ >-// >-// Copyright (c) 2014 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. >-// >-// RewriteElseBlocks.h: Prototype for tree transform to change >-// all if-else blocks to if-if blocks. >-// >- >-#ifndef COMPILER_TRANSLATOR_REWRITEELSEBLOCKS_H_ >-#define COMPILER_TRANSLATOR_REWRITEELSEBLOCKS_H_ >- >-namespace sh >-{ >- >-class TIntermNode; >-class TSymbolTable; >- >-void RewriteElseBlocks(TIntermNode *node, TSymbolTable *symbolTable); >-} >- >-#endif // COMPILER_TRANSLATOR_REWRITEELSEBLOCKS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteTexelFetchOffset.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteTexelFetchOffset.cpp >deleted file mode 100644 >index b602e0c9230..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteTexelFetchOffset.cpp >+++ /dev/null >@@ -1,154 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >-// Implementation of texelFetchOffset translation issue workaround. >-// See header for more info. >- >-#include "compiler/translator/RewriteTexelFetchOffset.h" >- >-#include "common/angleutils.h" >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/IntermTraverse.h" >-#include "compiler/translator/SymbolTable.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class Traverser : public TIntermTraverser >-{ >- public: >- static void Apply(TIntermNode *root, const TSymbolTable &symbolTable, int shaderVersion); >- >- private: >- Traverser(const TSymbolTable &symbolTable, int shaderVersion); >- bool visitAggregate(Visit visit, TIntermAggregate *node) override; >- void nextIteration(); >- >- const TSymbolTable *symbolTable; >- const int shaderVersion; >- bool mFound = false; >-}; >- >-Traverser::Traverser(const TSymbolTable &symbolTable, int shaderVersion) >- : TIntermTraverser(true, false, false), symbolTable(&symbolTable), shaderVersion(shaderVersion) >-{ >-} >- >-// static >-void Traverser::Apply(TIntermNode *root, const TSymbolTable &symbolTable, int shaderVersion) >-{ >- Traverser traverser(symbolTable, shaderVersion); >- do >- { >- traverser.nextIteration(); >- root->traverse(&traverser); >- if (traverser.mFound) >- { >- traverser.updateTree(); >- } >- } while (traverser.mFound); >-} >- >-void Traverser::nextIteration() >-{ >- mFound = false; >-} >- >-bool Traverser::visitAggregate(Visit visit, TIntermAggregate *node) >-{ >- if (mFound) >- { >- return false; >- } >- >- // Decide if the node represents the call of texelFetchOffset. >- if (node->getOp() != EOpCallBuiltInFunction) >- { >- return true; >- } >- >- if (node->getFunctionSymbolInfo()->getName() != "texelFetchOffset") >- { >- return true; >- } >- >- // Potential problem case detected, apply workaround. >- const TIntermSequence *sequence = node->getSequence(); >- ASSERT(sequence->size() == 4u); >- >- // Decide if the sampler is a 2DArray sampler. In that case position is ivec3 and offset is >- // ivec2. >- bool is2DArray = sequence->at(1)->getAsTyped()->getNominalSize() == 3 && >- sequence->at(3)->getAsTyped()->getNominalSize() == 2; >- >- // Create new node that represents the call of function texelFetch. >- // Its argument list will be: texelFetch(sampler, Position+offset, lod). >- >- TIntermSequence *texelFetchArguments = new TIntermSequence(); >- >- // sampler >- texelFetchArguments->push_back(sequence->at(0)); >- >- // Position >- TIntermTyped *texCoordNode = sequence->at(1)->getAsTyped(); >- ASSERT(texCoordNode); >- >- // offset >- TIntermTyped *offsetNode = nullptr; >- ASSERT(sequence->at(3)->getAsTyped()); >- if (is2DArray) >- { >- // For 2DArray samplers, Position is ivec3 and offset is ivec2; >- // So offset must be converted into an ivec3 before being added to Position. >- TIntermSequence *constructOffsetIvecArguments = new TIntermSequence(); >- constructOffsetIvecArguments->push_back(sequence->at(3)->getAsTyped()); >- >- TIntermTyped *zeroNode = CreateZeroNode(TType(EbtInt)); >- constructOffsetIvecArguments->push_back(zeroNode); >- >- offsetNode = TIntermAggregate::CreateConstructor(texCoordNode->getType(), >- constructOffsetIvecArguments); >- offsetNode->setLine(texCoordNode->getLine()); >- } >- else >- { >- offsetNode = sequence->at(3)->getAsTyped(); >- } >- >- // Position+offset >- TIntermBinary *add = new TIntermBinary(EOpAdd, texCoordNode, offsetNode); >- add->setLine(texCoordNode->getLine()); >- texelFetchArguments->push_back(add); >- >- // lod >- texelFetchArguments->push_back(sequence->at(2)); >- >- ASSERT(texelFetchArguments->size() == 3u); >- >- TIntermTyped *texelFetchNode = CreateBuiltInFunctionCallNode("texelFetch", texelFetchArguments, >- *symbolTable, shaderVersion); >- texelFetchNode->setLine(node->getLine()); >- >- // Replace the old node by this new node. >- queueReplacement(texelFetchNode, OriginalNode::IS_DROPPED); >- mFound = true; >- return false; >-} >- >-} // anonymous namespace >- >-void RewriteTexelFetchOffset(TIntermNode *root, const TSymbolTable &symbolTable, int shaderVersion) >-{ >- // texelFetchOffset is only valid in GLSL 3.0 and later. >- if (shaderVersion < 300) >- return; >- >- Traverser::Apply(root, symbolTable, shaderVersion); >-} >- >-} // namespace sh >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteTexelFetchOffset.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteTexelFetchOffset.h >deleted file mode 100644 >index 694d709f8e6..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteTexelFetchOffset.h >+++ /dev/null >@@ -1,28 +0,0 @@ >-// >-// Copyright (c) 2016 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 mutating tree traversal works around an issue on the translation >-// from texelFetchOffset into HLSL function Load on INTEL drivers. It >-// works by translating texelFetchOffset into texelFetch: >-// >-// - From: texelFetchOffset(sampler, Position, lod, offset) >-// - To: texelFetch(sampler, Position+offset, lod) >-// >-// See http://anglebug.com/1469 >- >-#ifndef COMPILER_TRANSLATOR_REWRITE_TEXELFETCHOFFSET_H_ >-#define COMPILER_TRANSLATOR_REWRITE_TEXELFETCHOFFSET_H_ >- >-class TIntermNode; >-class TSymbolTable; >- >-namespace sh >-{ >- >-void RewriteTexelFetchOffset(TIntermNode *root, const TSymbolTable &symbolTable, int shaderVersion); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_REWRITE_TEXELFETCHOFFSET_H_ >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteUnaryMinusOperatorFloat.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteUnaryMinusOperatorFloat.cpp >deleted file mode 100644 >index 696a49536c1..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteUnaryMinusOperatorFloat.cpp >+++ /dev/null >@@ -1,94 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >- >-#include "compiler/translator/RewriteUnaryMinusOperatorFloat.h" >- >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class Traverser : public TIntermTraverser >-{ >- public: >- static void Apply(TIntermNode *root); >- >- private: >- Traverser(); >- bool visitUnary(Visit visit, TIntermUnary *node) override; >- void nextIteration(); >- >- bool mFound = false; >-}; >- >-// static >-void Traverser::Apply(TIntermNode *root) >-{ >- Traverser traverser; >- do >- { >- traverser.nextIteration(); >- root->traverse(&traverser); >- if (traverser.mFound) >- { >- traverser.updateTree(); >- } >- } while (traverser.mFound); >-} >- >-Traverser::Traverser() : TIntermTraverser(true, false, false) >-{ >-} >- >-void Traverser::nextIteration() >-{ >- mFound = false; >-} >- >-bool Traverser::visitUnary(Visit visit, TIntermUnary *node) >-{ >- if (mFound) >- { >- return false; >- } >- >- // Detect if the current operator is unary minus operator. >- if (node->getOp() != EOpNegative) >- { >- return true; >- } >- >- // Detect if the current operand is a float variable. >- TIntermTyped *fValue = node->getOperand(); >- if (!fValue->getType().isScalarFloat()) >- { >- return true; >- } >- >- // 0.0 - float >- TIntermTyped *zero = CreateZeroNode(fValue->getType()); >- zero->setLine(fValue->getLine()); >- TIntermBinary *sub = new TIntermBinary(EOpSub, zero, fValue); >- sub->setLine(fValue->getLine()); >- >- queueReplacement(sub, OriginalNode::IS_DROPPED); >- >- mFound = true; >- return false; >-} >- >-} // anonymous namespace >- >-void RewriteUnaryMinusOperatorFloat(TIntermNode *root) >-{ >- Traverser::Apply(root); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteUnaryMinusOperatorFloat.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteUnaryMinusOperatorFloat.h >deleted file mode 100644 >index ccbfbcbd9e5..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteUnaryMinusOperatorFloat.h >+++ /dev/null >@@ -1,19 +0,0 @@ >-// Copyright (c) 2016 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. >-// >-// Rewrite "-float" to "0.0 - float" to work around unary minus operator on float issue on Intel Mac >-// OSX 10.11. >- >-#ifndef COMPILER_TRANSLATOR_REWRITEUNARYMINUSOPERATORFLOAT_H_ >-#define COMPILER_TRANSLATOR_REWRITEUNARYMINUSOPERATORFLOAT_H_ >- >-class TIntermNode; >-namespace sh >-{ >- >-void RewriteUnaryMinusOperatorFloat(TIntermNode *root); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_REWRITEUNARYMINUSOPERATORFLOAT_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteUnaryMinusOperatorInt.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteUnaryMinusOperatorInt.cpp >deleted file mode 100644 >index fe2ef948b45..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteUnaryMinusOperatorInt.cpp >+++ /dev/null >@@ -1,112 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >-// Implementation of evaluating unary integer variable bug workaround. >-// See header for more info. >- >-#include "compiler/translator/RewriteUnaryMinusOperatorInt.h" >- >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class Traverser : public TIntermTraverser >-{ >- public: >- static void Apply(TIntermNode *root); >- >- private: >- Traverser(); >- bool visitUnary(Visit visit, TIntermUnary *node) override; >- void nextIteration(); >- >- bool mFound = false; >-}; >- >-// static >-void Traverser::Apply(TIntermNode *root) >-{ >- Traverser traverser; >- do >- { >- traverser.nextIteration(); >- root->traverse(&traverser); >- if (traverser.mFound) >- { >- traverser.updateTree(); >- } >- } while (traverser.mFound); >-} >- >-Traverser::Traverser() : TIntermTraverser(true, false, false) >-{ >-} >- >-void Traverser::nextIteration() >-{ >- mFound = false; >-} >- >-bool Traverser::visitUnary(Visit visit, TIntermUnary *node) >-{ >- if (mFound) >- { >- return false; >- } >- >- // Decide if the current unary operator is unary minus. >- if (node->getOp() != EOpNegative) >- { >- return true; >- } >- >- // Decide if the current operand is an integer variable. >- TIntermTyped *opr = node->getOperand(); >- if (!opr->getType().isScalarInt()) >- { >- return true; >- } >- >- // Potential problem case detected, apply workaround: -(int) -> ~(int) + 1. >- // ~(int) >- TIntermUnary *bitwiseNot = new TIntermUnary(EOpBitwiseNot, opr); >- bitwiseNot->setLine(opr->getLine()); >- >- // Constant 1 (or 1u) >- TConstantUnion *one = new TConstantUnion(); >- if (opr->getType().getBasicType() == EbtInt) >- { >- one->setIConst(1); >- } >- else >- { >- one->setUConst(1u); >- } >- TIntermConstantUnion *oneNode = new TIntermConstantUnion(one, opr->getType()); >- oneNode->getTypePointer()->setQualifier(EvqConst); >- oneNode->setLine(opr->getLine()); >- >- // ~(int) + 1 >- TIntermBinary *add = new TIntermBinary(EOpAdd, bitwiseNot, oneNode); >- add->setLine(opr->getLine()); >- >- queueReplacement(add, OriginalNode::IS_DROPPED); >- >- mFound = true; >- return false; >-} >- >-} // anonymous namespace >- >-void RewriteUnaryMinusOperatorInt(TIntermNode *root) >-{ >- Traverser::Apply(root); >-} >- >-} // namespace sh >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteUnaryMinusOperatorInt.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteUnaryMinusOperatorInt.h >deleted file mode 100644 >index 50f0c442a73..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteUnaryMinusOperatorInt.h >+++ /dev/null >@@ -1,20 +0,0 @@ >-// Copyright (c) 2016 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 mutating tree traversal works around a bug on evaluating unary >-// integer variable on Intel D3D driver. It works by rewriting -(int) to >-// ~(int) + 1 when evaluating unary integer variables. >- >-#ifndef COMPILER_TRANSLATOR_REWRITEUNARYMINUSOPERATORINT_H_ >-#define COMPILER_TRANSLATOR_REWRITEUNARYMINUSOPERATORINT_H_ >- >-class TIntermNode; >-namespace sh >-{ >- >-void RewriteUnaryMinusOperatorInt(TIntermNode *root); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_REWRITEUNARYMINUSOPERATORINT_H_ >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RunAtTheEndOfShader.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/RunAtTheEndOfShader.cpp >deleted file mode 100644 >index 3c4209c539d..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RunAtTheEndOfShader.cpp >+++ /dev/null >@@ -1,112 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// RunAtTheEndOfShader.cpp: Add code to be run at the end of the shader. In case main() contains a >-// return statement, this is done by replacing the main() function with another function that calls >-// the old main, like this: >-// >-// void main() { body } >-// => >-// void main0() { body } >-// void main() >-// { >-// main0(); >-// codeToRun >-// } >-// >-// This way the code will get run even if the return statement inside main is executed. >-// >- >-#include "compiler/translator/RunAtTheEndOfShader.h" >- >-#include "compiler/translator/FindMain.h" >-#include "compiler/translator/IntermNode.h" >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/IntermTraverse.h" >-#include "compiler/translator/SymbolTable.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class ContainsReturnTraverser : public TIntermTraverser >-{ >- public: >- ContainsReturnTraverser() : TIntermTraverser(true, false, false), mContainsReturn(false) {} >- >- bool visitBranch(Visit visit, TIntermBranch *node) override >- { >- if (node->getFlowOp() == EOpReturn) >- { >- mContainsReturn = true; >- } >- return false; >- } >- >- bool containsReturn() { return mContainsReturn; } >- >- private: >- bool mContainsReturn; >-}; >- >-bool ContainsReturn(TIntermNode *node) >-{ >- ContainsReturnTraverser traverser; >- node->traverse(&traverser); >- return traverser.containsReturn(); >-} >- >-void WrapMainAndAppend(TIntermBlock *root, >- TIntermFunctionDefinition *main, >- TIntermNode *codeToRun, >- TSymbolTable *symbolTable) >-{ >- // Replace main() with main0() with the same body. >- TSymbolUniqueId oldMainId(symbolTable); >- std::stringstream oldMainName; >- oldMainName << "main" << oldMainId.get(); >- TIntermFunctionDefinition *oldMain = CreateInternalFunctionDefinitionNode( >- TType(EbtVoid), oldMainName.str().c_str(), main->getBody(), oldMainId); >- >- bool replaced = root->replaceChildNode(main, oldMain); >- ASSERT(replaced); >- >- // void main() >- TIntermFunctionPrototype *newMainProto = new TIntermFunctionPrototype( >- TType(EbtVoid), main->getFunctionPrototype()->getFunctionSymbolInfo()->getId()); >- newMainProto->getFunctionSymbolInfo()->setName("main"); >- >- // { >- // main0(); >- // codeToRun >- // } >- TIntermBlock *newMainBody = new TIntermBlock(); >- TIntermAggregate *oldMainCall = CreateInternalFunctionCallNode( >- TType(EbtVoid), oldMainName.str().c_str(), oldMainId, new TIntermSequence()); >- newMainBody->appendStatement(oldMainCall); >- newMainBody->appendStatement(codeToRun); >- >- // Add the new main() to the root node. >- TIntermFunctionDefinition *newMain = new TIntermFunctionDefinition(newMainProto, newMainBody); >- root->appendStatement(newMain); >-} >- >-} // anonymous namespace >- >-void RunAtTheEndOfShader(TIntermBlock *root, TIntermNode *codeToRun, TSymbolTable *symbolTable) >-{ >- TIntermFunctionDefinition *main = FindMain(root); >- if (!ContainsReturn(main)) >- { >- main->getBody()->appendStatement(codeToRun); >- return; >- } >- >- WrapMainAndAppend(root, main, codeToRun, symbolTable); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/RunAtTheEndOfShader.h b/Source/ThirdParty/ANGLE/src/compiler/translator/RunAtTheEndOfShader.h >deleted file mode 100644 >index ed94c28daec..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/RunAtTheEndOfShader.h >+++ /dev/null >@@ -1,23 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// RunAtTheEndOfShader.h: Add code to be run at the end of the shader. >-// >- >-#ifndef COMPILER_TRANSLATOR_RUNATTHEENDOFSHADER_H_ >-#define COMPILER_TRANSLATOR_RUNATTHEENDOFSHADER_H_ >- >-namespace sh >-{ >- >-class TIntermBlock; >-class TIntermNode; >-class TSymbolTable; >- >-void RunAtTheEndOfShader(TIntermBlock *root, TIntermNode *codeToRun, TSymbolTable *symbolTable); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_RUNATTHEENDOFSHADER_H_ >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.cpp >deleted file mode 100644 >index 746c16e2e66..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.cpp >+++ /dev/null >@@ -1,238 +0,0 @@ >-// >-// Copyright (c) 2002-2014 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. >-// >-// Scalarize vector and matrix constructor args, so that vectors built from components don't have >-// matrix arguments, and matrices built from components don't have vector arguments. This avoids >-// driver bugs around vector and matrix constructors. >-// >- >-#include "common/debug.h" >-#include "compiler/translator/ScalarizeVecAndMatConstructorArgs.h" >- >-#include <algorithm> >- >-#include "angle_gl.h" >-#include "common/angleutils.h" >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-bool ContainsMatrixNode(const TIntermSequence &sequence) >-{ >- for (size_t ii = 0; ii < sequence.size(); ++ii) >- { >- TIntermTyped *node = sequence[ii]->getAsTyped(); >- if (node && node->isMatrix()) >- return true; >- } >- return false; >-} >- >-bool ContainsVectorNode(const TIntermSequence &sequence) >-{ >- for (size_t ii = 0; ii < sequence.size(); ++ii) >- { >- TIntermTyped *node = sequence[ii]->getAsTyped(); >- if (node && node->isVector()) >- return true; >- } >- return false; >-} >- >-TIntermBinary *ConstructVectorIndexBinaryNode(TIntermSymbol *symbolNode, int index) >-{ >- return new TIntermBinary(EOpIndexDirect, symbolNode, CreateIndexNode(index)); >-} >- >-TIntermBinary *ConstructMatrixIndexBinaryNode(TIntermSymbol *symbolNode, int colIndex, int rowIndex) >-{ >- TIntermBinary *colVectorNode = ConstructVectorIndexBinaryNode(symbolNode, colIndex); >- >- return new TIntermBinary(EOpIndexDirect, colVectorNode, CreateIndexNode(rowIndex)); >-} >- >-class ScalarizeArgsTraverser : public TIntermTraverser >-{ >- public: >- ScalarizeArgsTraverser(sh::GLenum shaderType, >- bool fragmentPrecisionHigh, >- TSymbolTable *symbolTable) >- : TIntermTraverser(true, false, false, symbolTable), >- mShaderType(shaderType), >- mFragmentPrecisionHigh(fragmentPrecisionHigh) >- { >- } >- >- protected: >- bool visitAggregate(Visit visit, TIntermAggregate *node) override; >- bool visitBlock(Visit visit, TIntermBlock *node) override; >- >- private: >- void scalarizeArgs(TIntermAggregate *aggregate, bool scalarizeVector, bool scalarizeMatrix); >- >- // If we have the following code: >- // mat4 m(0); >- // vec4 v(1, m); >- // We will rewrite to: >- // mat4 m(0); >- // mat4 s0 = m; >- // vec4 v(1, s0[0][0], s0[0][1], s0[0][2]); >- // This function is to create nodes for "mat4 s0 = m;" and insert it to the code sequence. This >- // way the possible side effects of the constructor argument will only be evaluated once. >- void createTempVariable(TIntermTyped *original); >- >- std::vector<TIntermSequence> mBlockStack; >- >- sh::GLenum mShaderType; >- bool mFragmentPrecisionHigh; >-}; >- >-bool ScalarizeArgsTraverser::visitAggregate(Visit visit, TIntermAggregate *node) >-{ >- if (visit == PreVisit && node->getOp() == EOpConstruct) >- { >- if (node->getType().isVector() && ContainsMatrixNode(*(node->getSequence()))) >- scalarizeArgs(node, false, true); >- else if (node->getType().isMatrix() && ContainsVectorNode(*(node->getSequence()))) >- scalarizeArgs(node, true, false); >- } >- return true; >-} >- >-bool ScalarizeArgsTraverser::visitBlock(Visit visit, TIntermBlock *node) >-{ >- mBlockStack.push_back(TIntermSequence()); >- { >- for (TIntermNode *child : *node->getSequence()) >- { >- ASSERT(child != nullptr); >- child->traverse(this); >- mBlockStack.back().push_back(child); >- } >- } >- if (mBlockStack.back().size() > node->getSequence()->size()) >- { >- node->getSequence()->clear(); >- *(node->getSequence()) = mBlockStack.back(); >- } >- mBlockStack.pop_back(); >- return false; >-} >- >-void ScalarizeArgsTraverser::scalarizeArgs(TIntermAggregate *aggregate, >- bool scalarizeVector, >- bool scalarizeMatrix) >-{ >- ASSERT(aggregate); >- ASSERT(!aggregate->isArray()); >- int size = static_cast<int>(aggregate->getType().getObjectSize()); >- TIntermSequence *sequence = aggregate->getSequence(); >- TIntermSequence original(*sequence); >- sequence->clear(); >- for (size_t ii = 0; ii < original.size(); ++ii) >- { >- ASSERT(size > 0); >- TIntermTyped *node = original[ii]->getAsTyped(); >- ASSERT(node); >- createTempVariable(node); >- if (node->isScalar()) >- { >- sequence->push_back(createTempSymbol(node->getType())); >- size--; >- } >- else if (node->isVector()) >- { >- if (scalarizeVector) >- { >- int repeat = std::min(size, node->getNominalSize()); >- size -= repeat; >- for (int index = 0; index < repeat; ++index) >- { >- TIntermSymbol *symbolNode = createTempSymbol(node->getType()); >- TIntermBinary *newNode = ConstructVectorIndexBinaryNode(symbolNode, index); >- sequence->push_back(newNode); >- } >- } >- else >- { >- TIntermSymbol *symbolNode = createTempSymbol(node->getType()); >- sequence->push_back(symbolNode); >- size -= node->getNominalSize(); >- } >- } >- else >- { >- ASSERT(node->isMatrix()); >- if (scalarizeMatrix) >- { >- int colIndex = 0, rowIndex = 0; >- int repeat = std::min(size, node->getCols() * node->getRows()); >- size -= repeat; >- while (repeat > 0) >- { >- TIntermSymbol *symbolNode = createTempSymbol(node->getType()); >- TIntermBinary *newNode = >- ConstructMatrixIndexBinaryNode(symbolNode, colIndex, rowIndex); >- sequence->push_back(newNode); >- rowIndex++; >- if (rowIndex >= node->getRows()) >- { >- rowIndex = 0; >- colIndex++; >- } >- repeat--; >- } >- } >- else >- { >- TIntermSymbol *symbolNode = createTempSymbol(node->getType()); >- sequence->push_back(symbolNode); >- size -= node->getCols() * node->getRows(); >- } >- } >- } >-} >- >-void ScalarizeArgsTraverser::createTempVariable(TIntermTyped *original) >-{ >- ASSERT(original); >- nextTemporaryId(); >- TIntermDeclaration *decl = createTempInitDeclaration(original); >- >- TType type = original->getType(); >- if (mShaderType == GL_FRAGMENT_SHADER && type.getBasicType() == EbtFloat && >- type.getPrecision() == EbpUndefined) >- { >- // We use the highest available precision for the temporary variable >- // to avoid computing the actual precision using the rules defined >- // in GLSL ES 1.0 Section 4.5.2. >- TIntermBinary *init = decl->getSequence()->at(0)->getAsBinaryNode(); >- init->getTypePointer()->setPrecision(mFragmentPrecisionHigh ? EbpHigh : EbpMedium); >- init->getLeft()->getTypePointer()->setPrecision(mFragmentPrecisionHigh ? EbpHigh >- : EbpMedium); >- } >- >- ASSERT(mBlockStack.size() > 0); >- TIntermSequence &sequence = mBlockStack.back(); >- sequence.push_back(decl); >-} >- >-} // namespace anonymous >- >-void ScalarizeVecAndMatConstructorArgs(TIntermBlock *root, >- sh::GLenum shaderType, >- bool fragmentPrecisionHigh, >- TSymbolTable *symbolTable) >-{ >- ScalarizeArgsTraverser scalarizer(shaderType, fragmentPrecisionHigh, symbolTable); >- root->traverse(&scalarizer); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.h >deleted file mode 100644 >index b8f782d1eca..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.h >+++ /dev/null >@@ -1,27 +0,0 @@ >-// >-// Copyright (c) 2002-2014 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. >-// >-// Scalarize vector and matrix constructor args, so that vectors built from components don't have >-// matrix arguments, and matrices built from components don't have vector arguments. This avoids >-// driver bugs around vector and matrix constructors. >-// >- >-#ifndef COMPILER_TRANSLATOR_SCALARIZEVECANDMATCONSTRUCTORARGS_H_ >-#define COMPILER_TRANSLATOR_SCALARIZEVECANDMATCONSTRUCTORARGS_H_ >- >-#include "GLSLANG/ShaderLang.h" >- >-namespace sh >-{ >-class TIntermBlock; >-class TSymbolTable; >- >-void ScalarizeVecAndMatConstructorArgs(TIntermBlock *root, >- sh::GLenum shaderType, >- bool fragmentPrecisionHigh, >- TSymbolTable *symbolTable); >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_SCALARIZEVECANDMATCONSTRUCTORARGS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SearchSymbol.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/SearchSymbol.cpp >deleted file mode 100644 >index 34c644d0284..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SearchSymbol.cpp >+++ /dev/null >@@ -1,38 +0,0 @@ >-// >-// Copyright (c) 2002-2010 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. >-// >-// SearchSymbol is an AST traverser to detect the use of a given symbol name >-// >- >-#include "compiler/translator/SearchSymbol.h" >- >-#include "compiler/translator/InfoSink.h" >- >-namespace sh >-{ >-SearchSymbol::SearchSymbol(const TString &symbol) >- : TIntermTraverser(true, false, false), mSymbol(symbol) >-{ >- match = false; >-} >- >-void SearchSymbol::traverse(TIntermNode *node) >-{ >- node->traverse(this); >-} >- >-void SearchSymbol::visitSymbol(TIntermSymbol *symbolNode) >-{ >- if (symbolNode->getSymbol() == mSymbol) >- { >- match = true; >- } >-} >- >-bool SearchSymbol::foundMatch() const >-{ >- return match; >-} >-} >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SearchSymbol.h b/Source/ThirdParty/ANGLE/src/compiler/translator/SearchSymbol.h >deleted file mode 100644 >index b8379e041ff..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SearchSymbol.h >+++ /dev/null >@@ -1,33 +0,0 @@ >-// >-// Copyright (c) 2002-2010 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. >-// >-// SearchSymbol is an AST traverser to detect the use of a given symbol name >-// >- >-#ifndef COMPILER_TRANSLATOR_SEARCHSYMBOL_H_ >-#define COMPILER_TRANSLATOR_SEARCHSYMBOL_H_ >- >-#include "compiler/translator/IntermTraverse.h" >-#include "compiler/translator/ParseContext.h" >- >-namespace sh >-{ >-class SearchSymbol : public TIntermTraverser >-{ >- public: >- SearchSymbol(const TString &symbol); >- >- void traverse(TIntermNode *node); >- void visitSymbol(TIntermSymbol *symbolNode) override; >- >- bool foundMatch() const; >- >- protected: >- const TString &mSymbol; >- bool match; >-}; >-} >- >-#endif // COMPILER_TRANSLATOR_SEARCHSYMBOL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateArrayInitialization.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateArrayInitialization.cpp >deleted file mode 100644 >index fe25823e38a..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateArrayInitialization.cpp >+++ /dev/null >@@ -1,92 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// The SeparateArrayInitialization function splits each array initialization into a declaration and >-// an assignment. >-// Example: >-// type[n] a = initializer; >-// will effectively become >-// type[n] a; >-// a = initializer; >-// >-// Note that if the array is declared as const, the initialization may still be split, making the >-// AST technically invalid. Because of that this transformation should only be used when subsequent >-// stages don't care about const qualifiers. However, the initialization will not be split if the >-// initializer can be written as a HLSL literal. >- >-#include "compiler/translator/SeparateArrayInitialization.h" >- >-#include "compiler/translator/IntermNode.h" >-#include "compiler/translator/OutputHLSL.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class SeparateArrayInitTraverser : private TIntermTraverser >-{ >- public: >- static void apply(TIntermNode *root); >- >- private: >- SeparateArrayInitTraverser(); >- bool visitDeclaration(Visit, TIntermDeclaration *node) override; >-}; >- >-void SeparateArrayInitTraverser::apply(TIntermNode *root) >-{ >- SeparateArrayInitTraverser separateInit; >- root->traverse(&separateInit); >- separateInit.updateTree(); >-} >- >-SeparateArrayInitTraverser::SeparateArrayInitTraverser() : TIntermTraverser(true, false, false) >-{ >-} >- >-bool SeparateArrayInitTraverser::visitDeclaration(Visit, TIntermDeclaration *node) >-{ >- TIntermSequence *sequence = node->getSequence(); >- TIntermBinary *initNode = sequence->back()->getAsBinaryNode(); >- if (initNode != nullptr && initNode->getOp() == EOpInitialize) >- { >- TIntermTyped *initializer = initNode->getRight(); >- if (initializer->isArray() && !sh::OutputHLSL::canWriteAsHLSLLiteral(initializer)) >- { >- // We rely on that array declarations have been isolated to single declarations. >- ASSERT(sequence->size() == 1); >- TIntermTyped *symbol = initNode->getLeft(); >- TIntermBlock *parentBlock = getParentNode()->getAsBlock(); >- ASSERT(parentBlock != nullptr); >- >- TIntermSequence replacements; >- >- TIntermDeclaration *replacementDeclaration = new TIntermDeclaration(); >- replacementDeclaration->appendDeclarator(symbol); >- replacementDeclaration->setLine(symbol->getLine()); >- replacements.push_back(replacementDeclaration); >- >- TIntermBinary *replacementAssignment = >- new TIntermBinary(EOpAssign, symbol, initializer); >- replacementAssignment->setLine(symbol->getLine()); >- replacements.push_back(replacementAssignment); >- >- mMultiReplacements.push_back( >- NodeReplaceWithMultipleEntry(parentBlock, node, replacements)); >- } >- } >- return false; >-} >- >-} // namespace >- >-void SeparateArrayInitialization(TIntermNode *root) >-{ >- SeparateArrayInitTraverser::apply(root); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateArrayInitialization.h b/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateArrayInitialization.h >deleted file mode 100644 >index 3a9bb55dd12..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateArrayInitialization.h >+++ /dev/null >@@ -1,29 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// The SeparateArrayInitialization function splits each array initialization into a declaration and >-// an assignment. >-// Example: >-// type[n] a = initializer; >-// will effectively become >-// type[n] a; >-// a = initializer; >-// >-// Note that if the array is declared as const, the initialization may still be split, making the >-// AST technically invalid. Because of that this transformation should only be used when subsequent >-// stages don't care about const qualifiers. However, the initialization will not be split if the >-// initializer can be written as a HLSL literal. >- >-#ifndef COMPILER_TRANSLATOR_SEPARATEARRAYINITIALIZATION_H_ >-#define COMPILER_TRANSLATOR_SEPARATEARRAYINITIALIZATION_H_ >- >-namespace sh >-{ >-class TIntermNode; >- >-void SeparateArrayInitialization(TIntermNode *root); >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_SEPARATEARRAYINITIALIZATION_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateDeclarations.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateDeclarations.cpp >deleted file mode 100644 >index 9a066075c04..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateDeclarations.cpp >+++ /dev/null >@@ -1,79 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// The SeparateDeclarations function processes declarations, so that in the end each declaration >-// contains only one declarator. >-// This is useful as an intermediate step when initialization needs to be separated from >-// declaration, or when things need to be unfolded out of the initializer. >-// Example: >-// int a[1] = int[1](1), b[1] = int[1](2); >-// gets transformed when run through this class into the AST equivalent of: >-// int a[1] = int[1](1); >-// int b[1] = int[1](2); >- >-#include "compiler/translator/SeparateDeclarations.h" >- >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class SeparateDeclarationsTraverser : private TIntermTraverser >-{ >- public: >- static void apply(TIntermNode *root); >- >- private: >- SeparateDeclarationsTraverser(); >- bool visitDeclaration(Visit, TIntermDeclaration *node) override; >-}; >- >-void SeparateDeclarationsTraverser::apply(TIntermNode *root) >-{ >- SeparateDeclarationsTraverser separateDecl; >- root->traverse(&separateDecl); >- separateDecl.updateTree(); >-} >- >-SeparateDeclarationsTraverser::SeparateDeclarationsTraverser() >- : TIntermTraverser(true, false, false) >-{ >-} >- >-bool SeparateDeclarationsTraverser::visitDeclaration(Visit, TIntermDeclaration *node) >-{ >- TIntermSequence *sequence = node->getSequence(); >- if (sequence->size() > 1) >- { >- TIntermBlock *parentBlock = getParentNode()->getAsBlock(); >- ASSERT(parentBlock != nullptr); >- >- TIntermSequence replacementDeclarations; >- for (size_t ii = 0; ii < sequence->size(); ++ii) >- { >- TIntermDeclaration *replacementDeclaration = new TIntermDeclaration(); >- >- replacementDeclaration->appendDeclarator(sequence->at(ii)->getAsTyped()); >- replacementDeclaration->setLine(sequence->at(ii)->getLine()); >- replacementDeclarations.push_back(replacementDeclaration); >- } >- >- mMultiReplacements.push_back( >- NodeReplaceWithMultipleEntry(parentBlock, node, replacementDeclarations)); >- } >- return false; >-} >- >-} // namespace >- >-void SeparateDeclarations(TIntermNode *root) >-{ >- SeparateDeclarationsTraverser::apply(root); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateDeclarations.h b/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateDeclarations.h >deleted file mode 100644 >index 8142faea1cc..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateDeclarations.h >+++ /dev/null >@@ -1,26 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// The SeparateDeclarations function processes declarations, so that in the end each declaration >-// contains only one declarator. >-// This is useful as an intermediate step when initialization needs to be separated from >-// declaration, or when things need to be unfolded out of the initializer. >-// Example: >-// int a[1] = int[1](1), b[1] = int[1](2); >-// gets transformed when run through this class into the AST equivalent of: >-// int a[1] = int[1](1); >-// int b[1] = int[1](2); >- >-#ifndef COMPILER_TRANSLATOR_SEPARATEDECLARATIONS_H_ >-#define COMPILER_TRANSLATOR_SEPARATEDECLARATIONS_H_ >- >-namespace sh >-{ >-class TIntermNode; >- >-void SeparateDeclarations(TIntermNode *root); >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_SEPARATEDECLARATIONS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateExpressionsReturningArrays.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateExpressionsReturningArrays.cpp >deleted file mode 100644 >index 01d627937cd..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateExpressionsReturningArrays.cpp >+++ /dev/null >@@ -1,126 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// SeparateExpressionsReturningArrays splits array-returning expressions that are not array names >-// from more complex expressions, assigning them to a temporary variable a#. >-// Examples where a, b and c are all arrays: >-// (a = b) == (a = c) is split into a = b; type[n] a1 = a; a = c; type[n] a2 = a; a1 == a2; >-// type d = type[n](...)[i]; is split into type[n] a1 = type[n](...); type d = a1[i]; >- >-#include "compiler/translator/SeparateExpressionsReturningArrays.h" >- >-#include "compiler/translator/IntermNodePatternMatcher.h" >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-// Traverser that separates one array expression into a statement at a time. >-class SeparateExpressionsTraverser : public TIntermTraverser >-{ >- public: >- SeparateExpressionsTraverser(TSymbolTable *symbolTable); >- >- bool visitBinary(Visit visit, TIntermBinary *node) override; >- bool visitAggregate(Visit visit, TIntermAggregate *node) override; >- >- void nextIteration(); >- bool foundArrayExpression() const { return mFoundArrayExpression; } >- >- protected: >- // Marked to true once an operation that needs to be hoisted out of the expression has been >- // found. After that, no more AST updates are performed on that traversal. >- bool mFoundArrayExpression; >- >- IntermNodePatternMatcher mPatternToSeparateMatcher; >-}; >- >-SeparateExpressionsTraverser::SeparateExpressionsTraverser(TSymbolTable *symbolTable) >- : TIntermTraverser(true, false, false, symbolTable), >- mFoundArrayExpression(false), >- mPatternToSeparateMatcher(IntermNodePatternMatcher::kExpressionReturningArray) >-{ >-} >- >-// Performs a shallow copy of an assignment node. >-// These shallow copies are useful when a node gets inserted into an aggregate node >-// and also needs to be replaced in its original location by a different node. >-TIntermBinary *CopyAssignmentNode(TIntermBinary *node) >-{ >- return new TIntermBinary(node->getOp(), node->getLeft(), node->getRight()); >-} >- >-bool SeparateExpressionsTraverser::visitBinary(Visit visit, TIntermBinary *node) >-{ >- if (mFoundArrayExpression) >- return false; >- >- // Return if the expression is not an array or if we're not inside a complex expression. >- if (!mPatternToSeparateMatcher.match(node, getParentNode())) >- return true; >- >- ASSERT(node->getOp() == EOpAssign); >- >- mFoundArrayExpression = true; >- >- TIntermSequence insertions; >- insertions.push_back(CopyAssignmentNode(node)); >- // TODO(oetuaho): In some cases it would be more optimal to not add the temporary node, but just >- // use the original target of the assignment. Care must be taken so that this doesn't happen >- // when the same array symbol is a target of assignment more than once in one expression. >- insertions.push_back(createTempInitDeclaration(node->getLeft())); >- insertStatementsInParentBlock(insertions); >- >- queueReplacement(createTempSymbol(node->getType()), OriginalNode::IS_DROPPED); >- >- return false; >-} >- >-bool SeparateExpressionsTraverser::visitAggregate(Visit visit, TIntermAggregate *node) >-{ >- if (mFoundArrayExpression) >- return false; // No need to traverse further >- >- if (!mPatternToSeparateMatcher.match(node, getParentNode())) >- return true; >- >- ASSERT(node->isConstructor() || node->getOp() == EOpCallFunctionInAST); >- >- mFoundArrayExpression = true; >- >- TIntermSequence insertions; >- insertions.push_back(createTempInitDeclaration(node->shallowCopy())); >- insertStatementsInParentBlock(insertions); >- >- queueReplacement(createTempSymbol(node->getType()), OriginalNode::IS_DROPPED); >- >- return false; >-} >- >-void SeparateExpressionsTraverser::nextIteration() >-{ >- mFoundArrayExpression = false; >- nextTemporaryId(); >-} >- >-} // namespace >- >-void SeparateExpressionsReturningArrays(TIntermNode *root, TSymbolTable *symbolTable) >-{ >- SeparateExpressionsTraverser traverser(symbolTable); >- // Separate one expression at a time, and reset the traverser between iterations. >- do >- { >- traverser.nextIteration(); >- root->traverse(&traverser); >- if (traverser.foundArrayExpression()) >- traverser.updateTree(); >- } while (traverser.foundArrayExpression()); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateExpressionsReturningArrays.h b/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateExpressionsReturningArrays.h >deleted file mode 100644 >index f8eb4387488..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateExpressionsReturningArrays.h >+++ /dev/null >@@ -1,23 +0,0 @@ >-// >-// Copyright (c) 2002-2015 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. >-// >-// SeparateExpressionsReturningArrays splits array-returning expressions that are not array names >-// from more complex expressions, assigning them to a temporary variable a#. >-// Examples where a, b and c are all arrays: >-// (a = b) == (a = c) is split into a = b; type[n] a1 = a; a = c; type[n] a2 = a; a1 == a2; >-// type d = type[n](...)[i]; is split into type[n] a1 = type[n](...); type d = a1[i]; >- >-#ifndef COMPILER_TRANSLATOR_SEPARATEEXPRESSIONSRETURNINGARRAYS_H_ >-#define COMPILER_TRANSLATOR_SEPARATEEXPRESSIONSRETURNINGARRAYS_H_ >- >-namespace sh >-{ >-class TIntermNode; >-class TSymbolTable; >- >-void SeparateExpressionsReturningArrays(TIntermNode *root, TSymbolTable *symbolTable); >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_SEPARATEEXPRESSIONSRETURNINGARRAYS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderLang.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderLang.cpp >index eeb13f2ec01..a79c506ec3c 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderLang.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderLang.cpp >@@ -15,10 +15,10 @@ > #include "compiler/translator/InitializeDll.h" > #include "compiler/translator/length_limits.h" > #ifdef ANGLE_ENABLE_HLSL >-#include "compiler/translator/TranslatorHLSL.h" >+# include "compiler/translator/TranslatorHLSL.h" > #endif // ANGLE_ENABLE_HLSL >-#include "compiler/translator/VariablePacker.h" > #include "angle_gl.h" >+#include "compiler/translator/VariablePacker.h" > > namespace sh > { >@@ -133,8 +133,6 @@ GLenum GetGeometryShaderPrimitiveTypeEnum(sh::TLayoutPrimitiveType primitiveType > return GL_TRIANGLE_STRIP; > > case EptUndefined: >- return GL_INVALID_VALUE; >- > default: > UNREACHABLE(); > return GL_INVALID_VALUE; >@@ -188,22 +186,25 @@ void InitBuiltInResources(ShBuiltInResources *resources) > resources->MaxDrawBuffers = 1; > > // Extensions. >- resources->OES_standard_derivatives = 0; >- resources->OES_EGL_image_external = 0; >- resources->OES_EGL_image_external_essl3 = 0; >- resources->NV_EGL_stream_consumer_external = 0; >- resources->ARB_texture_rectangle = 0; >- resources->EXT_blend_func_extended = 0; >- resources->EXT_draw_buffers = 0; >- resources->EXT_frag_depth = 0; >- resources->EXT_shader_texture_lod = 0; >- resources->WEBGL_debug_shader_precision = 0; >- resources->EXT_shader_framebuffer_fetch = 0; >- resources->NV_shader_framebuffer_fetch = 0; >- resources->ARM_shader_framebuffer_fetch = 0; >- resources->OVR_multiview = 0; >- resources->EXT_YUV_target = 0; >- resources->OES_geometry_shader = 0; >+ resources->OES_standard_derivatives = 0; >+ resources->OES_EGL_image_external = 0; >+ resources->OES_EGL_image_external_essl3 = 0; >+ resources->NV_EGL_stream_consumer_external = 0; >+ resources->ARB_texture_rectangle = 0; >+ resources->EXT_blend_func_extended = 0; >+ resources->EXT_draw_buffers = 0; >+ resources->EXT_frag_depth = 0; >+ resources->EXT_shader_texture_lod = 0; >+ resources->WEBGL_debug_shader_precision = 0; >+ resources->EXT_shader_framebuffer_fetch = 0; >+ resources->NV_shader_framebuffer_fetch = 0; >+ resources->ARM_shader_framebuffer_fetch = 0; >+ resources->OVR_multiview2 = 0; >+ resources->EXT_YUV_target = 0; >+ resources->EXT_geometry_shader = 0; >+ resources->OES_texture_storage_multisample_2d_array = 0; >+ resources->ANGLE_texture_multisample = 0; >+ resources->ANGLE_multi_draw = 0; > > resources->NV_draw_buffers = 0; > >@@ -271,7 +272,7 @@ void InitBuiltInResources(ShBuiltInResources *resources) > resources->MaxCombinedAtomicCounterBuffers = 1; > resources->MaxAtomicCounterBufferSize = 32; > >- resources->MaxUniformBufferBindings = 32; >+ resources->MaxUniformBufferBindings = 32; > resources->MaxShaderStorageBufferBindings = 4; > > resources->MaxGeometryUniformComponents = 1024; >@@ -315,7 +316,7 @@ ShHandle ConstructCompiler(sh::GLenum type, > return 0; > } > >- return reinterpret_cast<void *>(base); >+ return base; > } > > void Destruct(ShHandle handle) >@@ -497,6 +498,28 @@ bool CheckVariablesWithinPackingLimits(int maxVectors, const std::vector<ShaderV > return CheckVariablesInPackingLimits(maxVectors, variables); > } > >+bool GetShaderStorageBlockRegister(const ShHandle handle, >+ const std::string &shaderStorageBlockName, >+ unsigned int *indexOut) >+{ >+#ifdef ANGLE_ENABLE_HLSL >+ ASSERT(indexOut); >+ >+ TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle); >+ ASSERT(translator); >+ >+ if (!translator->hasShaderStorageBlock(shaderStorageBlockName)) >+ { >+ return false; >+ } >+ >+ *indexOut = translator->getShaderStorageBlockRegister(shaderStorageBlockName); >+ return true; >+#else >+ return false; >+#endif // ANGLE_ENABLE_HLSL >+} >+ > bool GetUniformBlockRegister(const ShHandle handle, > const std::string &uniformBlockName, > unsigned int *indexOut) >@@ -531,6 +554,75 @@ const std::map<std::string, unsigned int> *GetUniformRegisterMap(const ShHandle > #endif // ANGLE_ENABLE_HLSL > } > >+unsigned int GetReadonlyImage2DRegisterIndex(const ShHandle handle) >+{ >+#ifdef ANGLE_ENABLE_HLSL >+ TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle); >+ ASSERT(translator); >+ >+ return translator->getReadonlyImage2DRegisterIndex(); >+#else >+ return 0; >+#endif // ANGLE_ENABLE_HLSL >+} >+ >+unsigned int GetImage2DRegisterIndex(const ShHandle handle) >+{ >+#ifdef ANGLE_ENABLE_HLSL >+ TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle); >+ ASSERT(translator); >+ >+ return translator->getImage2DRegisterIndex(); >+#else >+ return 0; >+#endif // ANGLE_ENABLE_HLSL >+} >+ >+const std::set<std::string> *GetUsedImage2DFunctionNames(const ShHandle handle) >+{ >+#ifdef ANGLE_ENABLE_HLSL >+ TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle); >+ ASSERT(translator); >+ >+ return translator->getUsedImage2DFunctionNames(); >+#else >+ return nullptr; >+#endif // ANGLE_ENABLE_HLSL >+} >+ >+bool HasValidGeometryShaderInputPrimitiveType(const ShHandle handle) >+{ >+ ASSERT(handle); >+ >+ TShHandleBase *base = static_cast<TShHandleBase *>(handle); >+ TCompiler *compiler = base->getAsCompiler(); >+ ASSERT(compiler); >+ >+ return compiler->getGeometryShaderInputPrimitiveType() != EptUndefined; >+} >+ >+bool HasValidGeometryShaderOutputPrimitiveType(const ShHandle handle) >+{ >+ ASSERT(handle); >+ >+ TShHandleBase *base = static_cast<TShHandleBase *>(handle); >+ TCompiler *compiler = base->getAsCompiler(); >+ ASSERT(compiler); >+ >+ return compiler->getGeometryShaderOutputPrimitiveType() != EptUndefined; >+} >+ >+bool HasValidGeometryShaderMaxVertices(const ShHandle handle) >+{ >+ ASSERT(handle); >+ >+ TShHandleBase *base = static_cast<TShHandleBase *>(handle); >+ TCompiler *compiler = base->getAsCompiler(); >+ ASSERT(compiler); >+ >+ return compiler->getGeometryShaderMaxVertices() >= 0; >+} >+ > GLenum GetGeometryShaderInputPrimitiveType(const ShHandle handle) > { > ASSERT(handle); >@@ -572,7 +664,9 @@ int GetGeometryShaderMaxVertices(const ShHandle handle) > TCompiler *compiler = base->getAsCompiler(); > ASSERT(compiler); > >- return compiler->getGeometryShaderMaxVertices(); >+ int maxVertices = compiler->getGeometryShaderMaxVertices(); >+ ASSERT(maxVertices >= 0); >+ return maxVertices; > } > > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockFunctionHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockFunctionHLSL.cpp >new file mode 100644 >index 00000000000..01b246d1d75 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockFunctionHLSL.cpp >@@ -0,0 +1,435 @@ >+// >+// 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. >+// >+// ShaderStorageBlockFunctionHLSL: Wrapper functions for RWByteAddressBuffer Load/Store functions. >+// >+ >+#include "compiler/translator/ShaderStorageBlockFunctionHLSL.h" >+ >+#include "common/utilities.h" >+#include "compiler/translator/UtilsHLSL.h" >+#include "compiler/translator/blocklayout.h" >+#include "compiler/translator/blocklayoutHLSL.h" >+#include "compiler/translator/util.h" >+ >+namespace sh >+{ >+ >+// static >+void ShaderStorageBlockFunctionHLSL::OutputSSBOLoadFunctionBody( >+ TInfoSinkBase &out, >+ const ShaderStorageBlockFunction &ssboFunction) >+{ >+ const char *convertString; >+ switch (ssboFunction.type.getBasicType()) >+ { >+ case EbtFloat: >+ convertString = "asfloat("; >+ break; >+ case EbtInt: >+ convertString = "asint("; >+ break; >+ case EbtUInt: >+ convertString = "asuint("; >+ break; >+ case EbtBool: >+ convertString = "asint("; >+ break; >+ default: >+ UNREACHABLE(); >+ return; >+ } >+ >+ size_t bytesPerComponent = >+ gl::VariableComponentSize(gl::VariableComponentType(GLVariableType(ssboFunction.type))); >+ out << " " << ssboFunction.typeString << " result"; >+ if (ssboFunction.type.isScalar()) >+ { >+ size_t offset = ssboFunction.swizzleOffsets[0] * bytesPerComponent; >+ out << " = " << convertString << "buffer.Load(loc + " << offset << "));\n "; >+ } >+ else if (ssboFunction.type.isVector()) >+ { >+ if (ssboFunction.rowMajor || !ssboFunction.isDefaultSwizzle) >+ { >+ size_t componentStride = bytesPerComponent; >+ if (ssboFunction.rowMajor) >+ { >+ componentStride = ssboFunction.matrixStride; >+ } >+ >+ out << " = {"; >+ for (const int offset : ssboFunction.swizzleOffsets) >+ { >+ size_t offsetInBytes = offset * componentStride; >+ out << convertString << "buffer.Load(loc + " << offsetInBytes << ")),"; >+ } >+ out << "};\n"; >+ } >+ else >+ { >+ out << " = " << convertString << "buffer.Load" << ssboFunction.type.getNominalSize() >+ << "(loc));\n"; >+ } >+ } >+ else if (ssboFunction.type.isMatrix()) >+ { >+ if (ssboFunction.rowMajor) >+ { >+ out << ";"; >+ out << " float" << ssboFunction.type.getRows() << "x" << ssboFunction.type.getCols() >+ << " tmp_ = {"; >+ for (int rowIndex = 0; rowIndex < ssboFunction.type.getRows(); rowIndex++) >+ { >+ out << "asfloat(buffer.Load" << ssboFunction.type.getCols() << "(loc + " >+ << rowIndex * ssboFunction.matrixStride << ")), "; >+ } >+ out << "};\n"; >+ out << " result = transpose(tmp_);\n"; >+ } >+ else >+ { >+ out << " = {"; >+ for (int columnIndex = 0; columnIndex < ssboFunction.type.getCols(); columnIndex++) >+ { >+ out << "asfloat(buffer.Load" << ssboFunction.type.getRows() << "(loc + " >+ << columnIndex * ssboFunction.matrixStride << ")), "; >+ } >+ out << "};\n"; >+ } >+ } >+ else >+ { >+ // TODO(jiajia.qin@intel.com): Process all possible return types. http://anglebug.com/1951 >+ out << ";\n"; >+ } >+ >+ out << " return result;\n"; >+ return; >+} >+ >+// static >+void ShaderStorageBlockFunctionHLSL::OutputSSBOStoreFunctionBody( >+ TInfoSinkBase &out, >+ const ShaderStorageBlockFunction &ssboFunction) >+{ >+ size_t bytesPerComponent = >+ gl::VariableComponentSize(gl::VariableComponentType(GLVariableType(ssboFunction.type))); >+ if (ssboFunction.type.isScalar()) >+ { >+ size_t offset = ssboFunction.swizzleOffsets[0] * bytesPerComponent; >+ if (ssboFunction.type.getBasicType() == EbtBool) >+ { >+ out << " buffer.Store(loc + " << offset << ", uint(value));\n"; >+ } >+ else >+ { >+ out << " buffer.Store(loc + " << offset << ", asuint(value));\n"; >+ } >+ } >+ else if (ssboFunction.type.isVector()) >+ { >+ out << " uint" << ssboFunction.type.getNominalSize() << " _value;\n"; >+ if (ssboFunction.type.getBasicType() == EbtBool) >+ { >+ out << " _value = uint" << ssboFunction.type.getNominalSize() << "(value);\n"; >+ } >+ else >+ { >+ out << " _value = asuint(value);\n"; >+ } >+ >+ if (ssboFunction.rowMajor || !ssboFunction.isDefaultSwizzle) >+ { >+ size_t componentStride = bytesPerComponent; >+ if (ssboFunction.rowMajor) >+ { >+ componentStride = ssboFunction.matrixStride; >+ } >+ const TVector<int> &swizzleOffsets = ssboFunction.swizzleOffsets; >+ for (int index = 0; index < static_cast<int>(swizzleOffsets.size()); index++) >+ { >+ size_t offsetInBytes = swizzleOffsets[index] * componentStride; >+ out << "buffer.Store(loc + " << offsetInBytes << ", _value[" << index << "]);\n"; >+ } >+ } >+ else >+ { >+ out << " buffer.Store" << ssboFunction.type.getNominalSize() << "(loc, _value);\n"; >+ } >+ } >+ else if (ssboFunction.type.isMatrix()) >+ { >+ if (ssboFunction.rowMajor) >+ { >+ out << " float" << ssboFunction.type.getRows() << "x" << ssboFunction.type.getCols() >+ << " tmp_ = transpose(value);\n"; >+ for (int rowIndex = 0; rowIndex < ssboFunction.type.getRows(); rowIndex++) >+ { >+ out << " buffer.Store" << ssboFunction.type.getCols() << "(loc + " >+ << rowIndex * ssboFunction.matrixStride << ", asuint(tmp_[" << rowIndex >+ << "]));\n"; >+ } >+ } >+ else >+ { >+ for (int columnIndex = 0; columnIndex < ssboFunction.type.getCols(); columnIndex++) >+ { >+ out << " buffer.Store" << ssboFunction.type.getRows() << "(loc + " >+ << columnIndex * ssboFunction.matrixStride << ", asuint(value[" << columnIndex >+ << "]));\n"; >+ } >+ } >+ } >+ else >+ { >+ // TODO(jiajia.qin@intel.com): Process all possible return types. http://anglebug.com/1951 >+ } >+} >+ >+// static >+void ShaderStorageBlockFunctionHLSL::OutputSSBOLengthFunctionBody(TInfoSinkBase &out, >+ int unsizedArrayStride) >+{ >+ out << " uint dim = 0;\n"; >+ out << " buffer.GetDimensions(dim);\n"; >+ out << " return int((dim - loc)/uint(" << unsizedArrayStride << "));\n"; >+} >+ >+// static >+void ShaderStorageBlockFunctionHLSL::OutputSSBOAtomicMemoryFunctionBody( >+ TInfoSinkBase &out, >+ const ShaderStorageBlockFunction &ssboFunction) >+{ >+ out << " " << ssboFunction.typeString << " original_value;\n"; >+ switch (ssboFunction.method) >+ { >+ case SSBOMethod::ATOMIC_ADD: >+ out << " buffer.InterlockedAdd(loc, value, original_value);\n"; >+ break; >+ case SSBOMethod::ATOMIC_MIN: >+ out << " buffer.InterlockedMin(loc, value, original_value);\n"; >+ break; >+ case SSBOMethod::ATOMIC_MAX: >+ out << " buffer.InterlockedMax(loc, value, original_value);\n"; >+ break; >+ case SSBOMethod::ATOMIC_AND: >+ out << " buffer.InterlockedAnd(loc, value, original_value);\n"; >+ break; >+ case SSBOMethod::ATOMIC_OR: >+ out << " buffer.InterlockedOr(loc, value, original_value);\n"; >+ break; >+ case SSBOMethod::ATOMIC_XOR: >+ out << " buffer.InterlockedXor(loc, value, original_value);\n"; >+ break; >+ case SSBOMethod::ATOMIC_EXCHANGE: >+ out << " buffer.InterlockedExchange(loc, value, original_value);\n"; >+ break; >+ case SSBOMethod::ATOMIC_COMPSWAP: >+ out << " buffer.InterlockedCompareExchange(loc, compare_value, value, " >+ "original_value);\n"; >+ break; >+ default: >+ UNREACHABLE(); >+ } >+ out << " return original_value;\n"; >+} >+ >+bool ShaderStorageBlockFunctionHLSL::ShaderStorageBlockFunction::operator<( >+ const ShaderStorageBlockFunction &rhs) const >+{ >+ return functionName < rhs.functionName; >+} >+ >+TString ShaderStorageBlockFunctionHLSL::registerShaderStorageBlockFunction( >+ const TType &type, >+ SSBOMethod method, >+ TLayoutBlockStorage storage, >+ bool rowMajor, >+ int matrixStride, >+ int unsizedArrayStride, >+ TIntermSwizzle *swizzleNode) >+{ >+ ShaderStorageBlockFunction ssboFunction; >+ ssboFunction.typeString = TypeString(type); >+ ssboFunction.method = method; >+ switch (method) >+ { >+ case SSBOMethod::LOAD: >+ ssboFunction.functionName = "_Load_"; >+ break; >+ case SSBOMethod::STORE: >+ ssboFunction.functionName = "_Store_"; >+ break; >+ case SSBOMethod::LENGTH: >+ ssboFunction.unsizedArrayStride = unsizedArrayStride; >+ ssboFunction.functionName = "_Length_" + str(unsizedArrayStride); >+ mRegisteredShaderStorageBlockFunctions.insert(ssboFunction); >+ return ssboFunction.functionName; >+ case SSBOMethod::ATOMIC_ADD: >+ ssboFunction.functionName = "_ssbo_atomicAdd_" + ssboFunction.typeString; >+ mRegisteredShaderStorageBlockFunctions.insert(ssboFunction); >+ return ssboFunction.functionName; >+ case SSBOMethod::ATOMIC_MIN: >+ ssboFunction.functionName = "_ssbo_atomicMin_" + ssboFunction.typeString; >+ mRegisteredShaderStorageBlockFunctions.insert(ssboFunction); >+ return ssboFunction.functionName; >+ case SSBOMethod::ATOMIC_MAX: >+ ssboFunction.functionName = "_ssbo_atomicMax_" + ssboFunction.typeString; >+ mRegisteredShaderStorageBlockFunctions.insert(ssboFunction); >+ return ssboFunction.functionName; >+ case SSBOMethod::ATOMIC_AND: >+ ssboFunction.functionName = "_ssbo_atomicAnd_" + ssboFunction.typeString; >+ mRegisteredShaderStorageBlockFunctions.insert(ssboFunction); >+ return ssboFunction.functionName; >+ case SSBOMethod::ATOMIC_OR: >+ ssboFunction.functionName = "_ssbo_atomicOr_" + ssboFunction.typeString; >+ mRegisteredShaderStorageBlockFunctions.insert(ssboFunction); >+ return ssboFunction.functionName; >+ case SSBOMethod::ATOMIC_XOR: >+ ssboFunction.functionName = "_ssbo_atomicXor_" + ssboFunction.typeString; >+ mRegisteredShaderStorageBlockFunctions.insert(ssboFunction); >+ return ssboFunction.functionName; >+ case SSBOMethod::ATOMIC_EXCHANGE: >+ ssboFunction.functionName = "_ssbo_atomicExchange_" + ssboFunction.typeString; >+ mRegisteredShaderStorageBlockFunctions.insert(ssboFunction); >+ return ssboFunction.functionName; >+ case SSBOMethod::ATOMIC_COMPSWAP: >+ ssboFunction.functionName = "_ssbo_atomicCompSwap_" + ssboFunction.typeString; >+ mRegisteredShaderStorageBlockFunctions.insert(ssboFunction); >+ return ssboFunction.functionName; >+ default: >+ UNREACHABLE(); >+ } >+ >+ ssboFunction.functionName += ssboFunction.typeString; >+ ssboFunction.type = type; >+ if (swizzleNode != nullptr) >+ { >+ ssboFunction.swizzleOffsets = swizzleNode->getSwizzleOffsets(); >+ ssboFunction.isDefaultSwizzle = false; >+ } >+ else >+ { >+ if (ssboFunction.type.getNominalSize() > 1) >+ { >+ for (int index = 0; index < ssboFunction.type.getNominalSize(); index++) >+ { >+ ssboFunction.swizzleOffsets.push_back(index); >+ } >+ } >+ else >+ { >+ ssboFunction.swizzleOffsets.push_back(0); >+ } >+ >+ ssboFunction.isDefaultSwizzle = true; >+ } >+ ssboFunction.rowMajor = rowMajor; >+ ssboFunction.matrixStride = matrixStride; >+ ssboFunction.functionName += "_" + TString(getBlockStorageString(storage)); >+ >+ if (rowMajor) >+ { >+ ssboFunction.functionName += "_rm_"; >+ } >+ else >+ { >+ ssboFunction.functionName += "_cm_"; >+ } >+ >+ for (const int offset : ssboFunction.swizzleOffsets) >+ { >+ switch (offset) >+ { >+ case 0: >+ ssboFunction.functionName += "x"; >+ break; >+ case 1: >+ ssboFunction.functionName += "y"; >+ break; >+ case 2: >+ ssboFunction.functionName += "z"; >+ break; >+ case 3: >+ ssboFunction.functionName += "w"; >+ break; >+ default: >+ UNREACHABLE(); >+ } >+ } >+ >+ mRegisteredShaderStorageBlockFunctions.insert(ssboFunction); >+ return ssboFunction.functionName; >+} >+ >+void ShaderStorageBlockFunctionHLSL::shaderStorageBlockFunctionHeader(TInfoSinkBase &out) >+{ >+ for (const ShaderStorageBlockFunction &ssboFunction : mRegisteredShaderStorageBlockFunctions) >+ { >+ switch (ssboFunction.method) >+ { >+ case SSBOMethod::LOAD: >+ { >+ // Function header >+ out << ssboFunction.typeString << " " << ssboFunction.functionName >+ << "(RWByteAddressBuffer buffer, uint loc)\n"; >+ out << "{\n"; >+ OutputSSBOLoadFunctionBody(out, ssboFunction); >+ break; >+ } >+ case SSBOMethod::STORE: >+ { >+ // Function header >+ out << "void " << ssboFunction.functionName >+ << "(RWByteAddressBuffer buffer, uint loc, " << ssboFunction.typeString >+ << " value)\n"; >+ out << "{\n"; >+ OutputSSBOStoreFunctionBody(out, ssboFunction); >+ break; >+ } >+ case SSBOMethod::LENGTH: >+ { >+ out << "int " << ssboFunction.functionName >+ << "(RWByteAddressBuffer buffer, uint loc)\n"; >+ out << "{\n"; >+ OutputSSBOLengthFunctionBody(out, ssboFunction.unsizedArrayStride); >+ break; >+ } >+ case SSBOMethod::ATOMIC_ADD: >+ case SSBOMethod::ATOMIC_MIN: >+ case SSBOMethod::ATOMIC_MAX: >+ case SSBOMethod::ATOMIC_AND: >+ case SSBOMethod::ATOMIC_OR: >+ case SSBOMethod::ATOMIC_XOR: >+ case SSBOMethod::ATOMIC_EXCHANGE: >+ { >+ out << ssboFunction.typeString << " " << ssboFunction.functionName >+ << "(RWByteAddressBuffer buffer, uint loc, " << ssboFunction.typeString >+ << " value)\n"; >+ out << "{\n"; >+ >+ OutputSSBOAtomicMemoryFunctionBody(out, ssboFunction); >+ break; >+ } >+ case SSBOMethod::ATOMIC_COMPSWAP: >+ { >+ out << ssboFunction.typeString << " " << ssboFunction.functionName >+ << "(RWByteAddressBuffer buffer, uint loc, " << ssboFunction.typeString >+ << " compare_value, " << ssboFunction.typeString << " value)\n"; >+ out << "{\n"; >+ OutputSSBOAtomicMemoryFunctionBody(out, ssboFunction); >+ break; >+ } >+ default: >+ UNREACHABLE(); >+ } >+ >+ out << "}\n" >+ "\n"; >+ } >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockFunctionHLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockFunctionHLSL.h >new file mode 100644 >index 00000000000..0d3cd0291ba >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockFunctionHLSL.h >@@ -0,0 +1,94 @@ >+// >+// 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. >+// >+// ShaderStorageBlockOutputHLSL: A traverser to translate a ssbo_access_chain to an offset of >+// RWByteAddressBuffer. >+// //EOpIndexDirectInterfaceBlock >+// ssbo_variable := >+// | the name of the SSBO >+// | the name of a variable in an SSBO backed interface block >+ >+// // EOpIndexInDirect >+// // EOpIndexDirect >+// ssbo_array_indexing := ssbo_access_chain[expr_no_ssbo] >+ >+// // EOpIndexDirectStruct >+// ssbo_structure_access := ssbo_access_chain.identifier >+ >+// ssbo_access_chain := >+// | ssbo_variable >+// | ssbo_array_indexing >+// | ssbo_structure_access >+// >+ >+#ifndef COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKFUNCTIONHLSL_H_ >+#define COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKFUNCTIONHLSL_H_ >+ >+#include <set> >+ >+#include "compiler/translator/InfoSink.h" >+#include "compiler/translator/Types.h" >+ >+namespace sh >+{ >+ >+class TIntermSwizzle; >+enum class SSBOMethod >+{ >+ LOAD, >+ STORE, >+ LENGTH, >+ ATOMIC_ADD, >+ ATOMIC_MIN, >+ ATOMIC_MAX, >+ ATOMIC_AND, >+ ATOMIC_OR, >+ ATOMIC_XOR, >+ ATOMIC_EXCHANGE, >+ ATOMIC_COMPSWAP >+}; >+ >+class ShaderStorageBlockFunctionHLSL final : angle::NonCopyable >+{ >+ public: >+ TString registerShaderStorageBlockFunction(const TType &type, >+ SSBOMethod method, >+ TLayoutBlockStorage storage, >+ bool rowMajor, >+ int matrixStride, >+ int unsizedArrayStride, >+ TIntermSwizzle *node); >+ >+ void shaderStorageBlockFunctionHeader(TInfoSinkBase &out); >+ >+ private: >+ struct ShaderStorageBlockFunction >+ { >+ bool operator<(const ShaderStorageBlockFunction &rhs) const; >+ TString functionName; >+ TString typeString; >+ SSBOMethod method; >+ TType type; >+ bool rowMajor; >+ int matrixStride; >+ int unsizedArrayStride; >+ TVector<int> swizzleOffsets; >+ bool isDefaultSwizzle; >+ }; >+ >+ static void OutputSSBOLoadFunctionBody(TInfoSinkBase &out, >+ const ShaderStorageBlockFunction &ssboFunction); >+ static void OutputSSBOStoreFunctionBody(TInfoSinkBase &out, >+ const ShaderStorageBlockFunction &ssboFunction); >+ static void OutputSSBOLengthFunctionBody(TInfoSinkBase &out, int unsizedArrayStride); >+ static void OutputSSBOAtomicMemoryFunctionBody(TInfoSinkBase &out, >+ const ShaderStorageBlockFunction &ssboFunction); >+ using ShaderStorageBlockFunctionSet = std::set<ShaderStorageBlockFunction>; >+ ShaderStorageBlockFunctionSet mRegisteredShaderStorageBlockFunctions; >+}; >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKFUNCTIONHLSL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockOutputHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockOutputHLSL.cpp >new file mode 100644 >index 00000000000..bef88db386f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockOutputHLSL.cpp >@@ -0,0 +1,762 @@ >+// >+// 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. >+// >+// ShaderStorageBlockOutputHLSL: A traverser to translate a ssbo_access_chain to an offset of >+// RWByteAddressBuffer. >+// //EOpIndexDirectInterfaceBlock >+// ssbo_variable := >+// | the name of the SSBO >+// | the name of a variable in an SSBO backed interface block >+ >+// // EOpIndexInDirect >+// // EOpIndexDirect >+// ssbo_array_indexing := ssbo_access_chain[expr_no_ssbo] >+ >+// // EOpIndexDirectStruct >+// ssbo_structure_access := ssbo_access_chain.identifier >+ >+// ssbo_access_chain := >+// | ssbo_variable >+// | ssbo_array_indexing >+// | ssbo_structure_access >+// >+ >+#include "compiler/translator/ShaderStorageBlockOutputHLSL.h" >+ >+#include "compiler/translator/ResourcesHLSL.h" >+#include "compiler/translator/blocklayoutHLSL.h" >+#include "compiler/translator/util.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+void GetBlockLayoutInfo(TIntermTyped *node, >+ bool rowMajorAlreadyAssigned, >+ TLayoutBlockStorage *storage, >+ bool *rowMajor) >+{ >+ TIntermSwizzle *swizzleNode = node->getAsSwizzleNode(); >+ if (swizzleNode) >+ { >+ return GetBlockLayoutInfo(swizzleNode->getOperand(), rowMajorAlreadyAssigned, storage, >+ rowMajor); >+ } >+ >+ TIntermBinary *binaryNode = node->getAsBinaryNode(); >+ if (binaryNode) >+ { >+ switch (binaryNode->getOp()) >+ { >+ case EOpIndexDirectInterfaceBlock: >+ { >+ // The column_major/row_major qualifier of a field member overrides the interface >+ // block's row_major/column_major. So we can assign rowMajor here and don't need to >+ // assign it again. But we still need to call recursively to get the storage's >+ // value. >+ const TType &type = node->getType(); >+ *rowMajor = type.getLayoutQualifier().matrixPacking == EmpRowMajor; >+ return GetBlockLayoutInfo(binaryNode->getLeft(), true, storage, rowMajor); >+ } >+ case EOpIndexIndirect: >+ case EOpIndexDirect: >+ case EOpIndexDirectStruct: >+ return GetBlockLayoutInfo(binaryNode->getLeft(), rowMajorAlreadyAssigned, storage, >+ rowMajor); >+ default: >+ UNREACHABLE(); >+ return; >+ } >+ } >+ >+ const TType &type = node->getType(); >+ ASSERT(type.getQualifier() == EvqBuffer); >+ const TInterfaceBlock *interfaceBlock = type.getInterfaceBlock(); >+ ASSERT(interfaceBlock); >+ *storage = interfaceBlock->blockStorage(); >+ // If the block doesn't have an instance name, rowMajorAlreadyAssigned will be false. In >+ // this situation, we still need to set rowMajor's value. >+ if (!rowMajorAlreadyAssigned) >+ { >+ *rowMajor = type.getLayoutQualifier().matrixPacking == EmpRowMajor; >+ } >+} >+ >+// It's possible that the current type has lost the original layout information. So we should pass >+// the right layout information to GetBlockMemberInfoByType. >+const BlockMemberInfo GetBlockMemberInfoByType(const TType &type, >+ TLayoutBlockStorage storage, >+ bool rowMajor) >+{ >+ sh::Std140BlockEncoder std140Encoder; >+ sh::Std430BlockEncoder std430Encoder; >+ sh::HLSLBlockEncoder hlslEncoder(sh::HLSLBlockEncoder::ENCODE_PACKED, false); >+ sh::BlockLayoutEncoder *encoder = nullptr; >+ >+ if (storage == EbsStd140) >+ { >+ encoder = &std140Encoder; >+ } >+ else if (storage == EbsStd430) >+ { >+ encoder = &std430Encoder; >+ } >+ else >+ { >+ encoder = &hlslEncoder; >+ } >+ >+ std::vector<unsigned int> arraySizes; >+ auto *typeArraySizes = type.getArraySizes(); >+ if (typeArraySizes != nullptr) >+ { >+ arraySizes.assign(typeArraySizes->begin(), typeArraySizes->end()); >+ } >+ return encoder->encodeType(GLVariableType(type), arraySizes, rowMajor); >+} >+ >+const TField *GetFieldMemberInShaderStorageBlock(const TInterfaceBlock *interfaceBlock, >+ const ImmutableString &variableName) >+{ >+ for (const TField *field : interfaceBlock->fields()) >+ { >+ if (field->name() == variableName) >+ { >+ return field; >+ } >+ } >+ return nullptr; >+} >+ >+const InterfaceBlock *FindInterfaceBlock(const TInterfaceBlock *needle, >+ const std::vector<InterfaceBlock> &haystack) >+{ >+ for (const InterfaceBlock &block : haystack) >+ { >+ if (strcmp(block.name.c_str(), needle->name().data()) == 0) >+ { >+ ASSERT(block.fields.size() == needle->fields().size()); >+ return █ >+ } >+ } >+ >+ UNREACHABLE(); >+ return nullptr; >+} >+ >+std::string StripArrayIndices(const std::string &nameIn) >+{ >+ std::string name = nameIn; >+ size_t pos = name.find('['); >+ while (pos != std::string::npos) >+ { >+ size_t closePos = name.find(']', pos); >+ ASSERT(closePos != std::string::npos); >+ name.erase(pos, closePos - pos + 1); >+ pos = name.find('[', pos); >+ } >+ ASSERT(name.find(']') == std::string::npos); >+ return name; >+} >+ >+// Does not include any array indices. >+void MapVariableToField(const ShaderVariable &variable, >+ const TField *field, >+ std::string currentName, >+ ShaderVarToFieldMap *shaderVarToFieldMap) >+{ >+ ASSERT((field->type()->getStruct() == nullptr) == variable.fields.empty()); >+ (*shaderVarToFieldMap)[currentName] = field; >+ >+ if (!variable.fields.empty()) >+ { >+ const TStructure *subStruct = field->type()->getStruct(); >+ ASSERT(variable.fields.size() == subStruct->fields().size()); >+ >+ for (size_t index = 0; index < variable.fields.size(); ++index) >+ { >+ const TField *subField = subStruct->fields()[index]; >+ const ShaderVariable &subVariable = variable.fields[index]; >+ std::string subName = currentName + "." + subVariable.name; >+ MapVariableToField(subVariable, subField, subName, shaderVarToFieldMap); >+ } >+ } >+} >+ >+class BlockInfoVisitor final : public BlockEncoderVisitor >+{ >+ public: >+ BlockInfoVisitor(const std::string &prefix, >+ TLayoutBlockStorage storage, >+ const ShaderVarToFieldMap &shaderVarToFieldMap, >+ BlockMemberInfoMap *blockInfoOut) >+ : BlockEncoderVisitor(prefix, "", getEncoder(storage)), >+ mShaderVarToFieldMap(shaderVarToFieldMap), >+ mBlockInfoOut(blockInfoOut), >+ mHLSLEncoder(HLSLBlockEncoder::ENCODE_PACKED, false), >+ mStorage(storage) >+ {} >+ >+ BlockLayoutEncoder *getEncoder(TLayoutBlockStorage storage) >+ { >+ switch (storage) >+ { >+ case EbsStd140: >+ return &mStd140Encoder; >+ case EbsStd430: >+ return &mStd430Encoder; >+ default: >+ return &mHLSLEncoder; >+ } >+ } >+ >+ void enterStructAccess(const ShaderVariable &structVar, bool isRowMajor) override >+ { >+ BlockEncoderVisitor::enterStructAccess(structVar, isRowMajor); >+ >+ std::string variableName = StripArrayIndices(collapseNameStack()); >+ >+ // Remove the trailing "." >+ variableName.pop_back(); >+ >+ BlockInfoVisitor childVisitor(variableName, mStorage, mShaderVarToFieldMap, mBlockInfoOut); >+ childVisitor.getEncoder(mStorage)->enterAggregateType(structVar); >+ TraverseShaderVariables(structVar.fields, isRowMajor, &childVisitor); >+ childVisitor.getEncoder(mStorage)->exitAggregateType(structVar); >+ >+ int offset = getEncoder(mStorage)->getCurrentOffset(); >+ int arrayStride = childVisitor.getEncoder(mStorage)->getCurrentOffset(); >+ >+ auto iter = mShaderVarToFieldMap.find(variableName); >+ if (iter == mShaderVarToFieldMap.end()) >+ return; >+ >+ const TField *structField = iter->second; >+ if (mBlockInfoOut->count(structField) == 0) >+ { >+ mBlockInfoOut->emplace(structField, BlockMemberInfo(offset, arrayStride, -1, false)); >+ } >+ } >+ >+ void encodeVariable(const ShaderVariable &variable, >+ const BlockMemberInfo &variableInfo, >+ const std::string &name, >+ const std::string &mappedName) override >+ { >+ auto iter = mShaderVarToFieldMap.find(StripArrayIndices(name)); >+ if (iter == mShaderVarToFieldMap.end()) >+ return; >+ >+ const TField *field = iter->second; >+ if (mBlockInfoOut->count(field) == 0) >+ { >+ mBlockInfoOut->emplace(field, variableInfo); >+ } >+ } >+ >+ private: >+ const ShaderVarToFieldMap &mShaderVarToFieldMap; >+ BlockMemberInfoMap *mBlockInfoOut; >+ Std140BlockEncoder mStd140Encoder; >+ Std430BlockEncoder mStd430Encoder; >+ HLSLBlockEncoder mHLSLEncoder; >+ TLayoutBlockStorage mStorage; >+}; >+ >+void GetShaderStorageBlockMembersInfo(const TInterfaceBlock *interfaceBlock, >+ const std::vector<InterfaceBlock> &shaderStorageBlocks, >+ BlockMemberInfoMap *blockInfoOut) >+{ >+ // Find the sh::InterfaceBlock. >+ const InterfaceBlock *block = FindInterfaceBlock(interfaceBlock, shaderStorageBlocks); >+ ASSERT(block); >+ >+ // Map ShaderVariable to TField. >+ ShaderVarToFieldMap shaderVarToFieldMap; >+ for (size_t index = 0; index < block->fields.size(); ++index) >+ { >+ const TField *field = interfaceBlock->fields()[index]; >+ const ShaderVariable &variable = block->fields[index]; >+ MapVariableToField(variable, field, variable.name, &shaderVarToFieldMap); >+ } >+ >+ BlockInfoVisitor visitor("", interfaceBlock->blockStorage(), shaderVarToFieldMap, blockInfoOut); >+ TraverseShaderVariables(block->fields, false, &visitor); >+} >+ >+bool IsInArrayOfArraysChain(TIntermTyped *node) >+{ >+ if (node->getType().isArrayOfArrays()) >+ return true; >+ TIntermBinary *binaryNode = node->getAsBinaryNode(); >+ if (binaryNode) >+ { >+ if (binaryNode->getLeft()->getType().isArrayOfArrays()) >+ return true; >+ } >+ >+ return false; >+} >+} // anonymous namespace >+ >+ShaderStorageBlockOutputHLSL::ShaderStorageBlockOutputHLSL( >+ OutputHLSL *outputHLSL, >+ TSymbolTable *symbolTable, >+ ResourcesHLSL *resourcesHLSL, >+ const std::vector<InterfaceBlock> &shaderStorageBlocks) >+ : TIntermTraverser(true, true, true, symbolTable), >+ mMatrixStride(0), >+ mRowMajor(false), >+ mLocationAsTheLastArgument(false), >+ mOutputHLSL(outputHLSL), >+ mResourcesHLSL(resourcesHLSL), >+ mShaderStorageBlocks(shaderStorageBlocks) >+{ >+ mSSBOFunctionHLSL = new ShaderStorageBlockFunctionHLSL; >+} >+ >+ShaderStorageBlockOutputHLSL::~ShaderStorageBlockOutputHLSL() >+{ >+ SafeDelete(mSSBOFunctionHLSL); >+} >+ >+void ShaderStorageBlockOutputHLSL::outputStoreFunctionCallPrefix(TIntermTyped *node) >+{ >+ mLocationAsTheLastArgument = false; >+ traverseSSBOAccess(node, SSBOMethod::STORE); >+} >+ >+void ShaderStorageBlockOutputHLSL::outputLoadFunctionCall(TIntermTyped *node) >+{ >+ mLocationAsTheLastArgument = true; >+ traverseSSBOAccess(node, SSBOMethod::LOAD); >+} >+ >+void ShaderStorageBlockOutputHLSL::outputLengthFunctionCall(TIntermTyped *node) >+{ >+ mLocationAsTheLastArgument = true; >+ traverseSSBOAccess(node, SSBOMethod::LENGTH); >+} >+ >+void ShaderStorageBlockOutputHLSL::outputAtomicMemoryFunctionCallPrefix(TIntermTyped *node, >+ TOperator op) >+{ >+ mLocationAsTheLastArgument = false; >+ >+ switch (op) >+ { >+ case EOpAtomicAdd: >+ traverseSSBOAccess(node, SSBOMethod::ATOMIC_ADD); >+ break; >+ case EOpAtomicMin: >+ traverseSSBOAccess(node, SSBOMethod::ATOMIC_MIN); >+ break; >+ case EOpAtomicMax: >+ traverseSSBOAccess(node, SSBOMethod::ATOMIC_MAX); >+ break; >+ case EOpAtomicAnd: >+ traverseSSBOAccess(node, SSBOMethod::ATOMIC_AND); >+ break; >+ case EOpAtomicOr: >+ traverseSSBOAccess(node, SSBOMethod::ATOMIC_OR); >+ break; >+ case EOpAtomicXor: >+ traverseSSBOAccess(node, SSBOMethod::ATOMIC_XOR); >+ break; >+ case EOpAtomicExchange: >+ traverseSSBOAccess(node, SSBOMethod::ATOMIC_EXCHANGE); >+ break; >+ case EOpAtomicCompSwap: >+ traverseSSBOAccess(node, SSBOMethod::ATOMIC_COMPSWAP); >+ break; >+ default: >+ UNREACHABLE(); >+ break; >+ } >+} >+ >+// Note that we must calculate the matrix stride here instead of ShaderStorageBlockFunctionHLSL. >+// It's because that if the current node's type is a vector which comes from a matrix, we will >+// lose the matrix type info once we enter ShaderStorageBlockFunctionHLSL. >+void ShaderStorageBlockOutputHLSL::setMatrixStride(TIntermTyped *node, >+ TLayoutBlockStorage storage, >+ bool rowMajor) >+{ >+ if (node->getType().isMatrix()) >+ { >+ mMatrixStride = GetBlockMemberInfoByType(node->getType(), storage, rowMajor).matrixStride; >+ mRowMajor = rowMajor; >+ return; >+ } >+ >+ if (node->getType().isVector()) >+ { >+ TIntermBinary *binaryNode = node->getAsBinaryNode(); >+ if (binaryNode) >+ { >+ return setMatrixStride(binaryNode->getLeft(), storage, rowMajor); >+ } >+ else >+ { >+ TIntermSwizzle *swizzleNode = node->getAsSwizzleNode(); >+ if (swizzleNode) >+ { >+ return setMatrixStride(swizzleNode->getOperand(), storage, rowMajor); >+ } >+ } >+ } >+} >+ >+void ShaderStorageBlockOutputHLSL::traverseSSBOAccess(TIntermTyped *node, SSBOMethod method) >+{ >+ mMatrixStride = 0; >+ mRowMajor = false; >+ >+ // Note that we don't have correct BlockMemberInfo from mBlockMemberInfoMap at the current >+ // point. But we must use those information to generate the right function name. So here we have >+ // to calculate them again. >+ TLayoutBlockStorage storage; >+ bool rowMajor; >+ GetBlockLayoutInfo(node, false, &storage, &rowMajor); >+ int unsizedArrayStride = 0; >+ if (node->getType().isUnsizedArray()) >+ { >+ unsizedArrayStride = >+ GetBlockMemberInfoByType(node->getType(), storage, rowMajor).arrayStride; >+ } >+ setMatrixStride(node, storage, rowMajor); >+ >+ const TString &functionName = mSSBOFunctionHLSL->registerShaderStorageBlockFunction( >+ node->getType(), method, storage, mRowMajor, mMatrixStride, unsizedArrayStride, >+ node->getAsSwizzleNode()); >+ TInfoSinkBase &out = mOutputHLSL->getInfoSink(); >+ out << functionName; >+ out << "("; >+ node->traverse(this); >+} >+ >+void ShaderStorageBlockOutputHLSL::writeShaderStorageBlocksHeader(TInfoSinkBase &out) const >+{ >+ out << mResourcesHLSL->shaderStorageBlocksHeader(mReferencedShaderStorageBlocks); >+ mSSBOFunctionHLSL->shaderStorageBlockFunctionHeader(out); >+} >+ >+// Check if the current node is the end of the SSBO access chain. If true, we should output ')' for >+// Load method. >+bool ShaderStorageBlockOutputHLSL::isEndOfSSBOAccessChain() >+{ >+ TIntermNode *parent = getParentNode(); >+ if (parent) >+ { >+ TIntermBinary *parentBinary = parent->getAsBinaryNode(); >+ if (parentBinary != nullptr) >+ { >+ switch (parentBinary->getOp()) >+ { >+ case EOpIndexDirectStruct: >+ case EOpIndexDirect: >+ case EOpIndexIndirect: >+ { >+ return false; >+ } >+ default: >+ return true; >+ } >+ } >+ >+ const TIntermSwizzle *parentSwizzle = parent->getAsSwizzleNode(); >+ if (parentSwizzle) >+ { >+ return false; >+ } >+ } >+ return true; >+} >+ >+void ShaderStorageBlockOutputHLSL::visitSymbol(TIntermSymbol *node) >+{ >+ TInfoSinkBase &out = mOutputHLSL->getInfoSink(); >+ const TVariable &variable = node->variable(); >+ TQualifier qualifier = variable.getType().getQualifier(); >+ >+ if (qualifier == EvqBuffer) >+ { >+ const TType &variableType = variable.getType(); >+ const TInterfaceBlock *interfaceBlock = variableType.getInterfaceBlock(); >+ ASSERT(interfaceBlock); >+ if (mReferencedShaderStorageBlocks.count(interfaceBlock->uniqueId().get()) == 0) >+ { >+ const TVariable *instanceVariable = nullptr; >+ if (variableType.isInterfaceBlock()) >+ { >+ instanceVariable = &variable; >+ } >+ mReferencedShaderStorageBlocks[interfaceBlock->uniqueId().get()] = >+ new TReferencedBlock(interfaceBlock, instanceVariable); >+ GetShaderStorageBlockMembersInfo(interfaceBlock, mShaderStorageBlocks, >+ &mBlockMemberInfoMap); >+ } >+ if (variableType.isInterfaceBlock()) >+ { >+ out << DecorateVariableIfNeeded(variable); >+ } >+ else >+ { >+ out << Decorate(interfaceBlock->name()); >+ out << ", "; >+ >+ const TField *field = >+ GetFieldMemberInShaderStorageBlock(interfaceBlock, variable.name()); >+ writeDotOperatorOutput(out, field); >+ } >+ } >+ else >+ { >+ return mOutputHLSL->visitSymbol(node); >+ } >+} >+ >+void ShaderStorageBlockOutputHLSL::visitConstantUnion(TIntermConstantUnion *node) >+{ >+ mOutputHLSL->visitConstantUnion(node); >+} >+ >+bool ShaderStorageBlockOutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node) >+{ >+ return mOutputHLSL->visitAggregate(visit, node); >+} >+ >+bool ShaderStorageBlockOutputHLSL::visitTernary(Visit visit, TIntermTernary *node) >+{ >+ return mOutputHLSL->visitTernary(visit, node); >+} >+ >+bool ShaderStorageBlockOutputHLSL::visitUnary(Visit visit, TIntermUnary *node) >+{ >+ return mOutputHLSL->visitUnary(visit, node); >+} >+ >+bool ShaderStorageBlockOutputHLSL::visitSwizzle(Visit visit, TIntermSwizzle *node) >+{ >+ if (visit == PostVisit) >+ { >+ if (!IsInShaderStorageBlock(node)) >+ { >+ return mOutputHLSL->visitSwizzle(visit, node); >+ } >+ >+ TInfoSinkBase &out = mOutputHLSL->getInfoSink(); >+ // TODO(jiajia.qin@intel.com): add swizzle process if the swizzle node is not the last node >+ // of ssbo access chain. Such as, data.xy[0] >+ if (mLocationAsTheLastArgument && isEndOfSSBOAccessChain()) >+ { >+ out << ")"; >+ } >+ } >+ return true; >+} >+ >+bool ShaderStorageBlockOutputHLSL::visitBinary(Visit visit, TIntermBinary *node) >+{ >+ TInfoSinkBase &out = mOutputHLSL->getInfoSink(); >+ >+ switch (node->getOp()) >+ { >+ case EOpIndexDirect: >+ { >+ if (!IsInShaderStorageBlock(node->getLeft())) >+ { >+ return mOutputHLSL->visitBinary(visit, node); >+ } >+ >+ const TType &leftType = node->getLeft()->getType(); >+ if (leftType.isInterfaceBlock()) >+ { >+ if (visit == PreVisit) >+ { >+ ASSERT(leftType.getQualifier() == EvqBuffer); >+ TIntermSymbol *instanceArraySymbol = node->getLeft()->getAsSymbolNode(); >+ const TInterfaceBlock *interfaceBlock = leftType.getInterfaceBlock(); >+ >+ if (mReferencedShaderStorageBlocks.count(interfaceBlock->uniqueId().get()) == 0) >+ { >+ mReferencedShaderStorageBlocks[interfaceBlock->uniqueId().get()] = >+ new TReferencedBlock(interfaceBlock, &instanceArraySymbol->variable()); >+ GetShaderStorageBlockMembersInfo(interfaceBlock, mShaderStorageBlocks, >+ &mBlockMemberInfoMap); >+ } >+ >+ const int arrayIndex = node->getRight()->getAsConstantUnion()->getIConst(0); >+ out << mResourcesHLSL->InterfaceBlockInstanceString( >+ instanceArraySymbol->getName(), arrayIndex); >+ return false; >+ } >+ } >+ else >+ { >+ writeEOpIndexDirectOrIndirectOutput(out, visit, node); >+ } >+ break; >+ } >+ case EOpIndexIndirect: >+ { >+ if (!IsInShaderStorageBlock(node->getLeft())) >+ { >+ return mOutputHLSL->visitBinary(visit, node); >+ } >+ >+ // We do not currently support indirect references to interface blocks >+ ASSERT(node->getLeft()->getBasicType() != EbtInterfaceBlock); >+ writeEOpIndexDirectOrIndirectOutput(out, visit, node); >+ break; >+ } >+ case EOpIndexDirectStruct: >+ { >+ if (!IsInShaderStorageBlock(node->getLeft())) >+ { >+ return mOutputHLSL->visitBinary(visit, node); >+ } >+ >+ if (visit == InVisit) >+ { >+ ASSERT(IsInShaderStorageBlock(node->getLeft())); >+ const TStructure *structure = node->getLeft()->getType().getStruct(); >+ const TIntermConstantUnion *index = node->getRight()->getAsConstantUnion(); >+ const TField *field = structure->fields()[index->getIConst(0)]; >+ out << " + "; >+ writeDotOperatorOutput(out, field); >+ return false; >+ } >+ break; >+ } >+ case EOpIndexDirectInterfaceBlock: >+ if (!IsInShaderStorageBlock(node->getLeft())) >+ { >+ return mOutputHLSL->visitBinary(visit, node); >+ } >+ >+ if (visit == InVisit) >+ { >+ ASSERT(IsInShaderStorageBlock(node->getLeft())); >+ out << ", "; >+ const TInterfaceBlock *interfaceBlock = >+ node->getLeft()->getType().getInterfaceBlock(); >+ const TIntermConstantUnion *index = node->getRight()->getAsConstantUnion(); >+ const TField *field = interfaceBlock->fields()[index->getIConst(0)]; >+ writeDotOperatorOutput(out, field); >+ return false; >+ } >+ break; >+ default: >+ // It may have other operators in EOpIndexIndirect. Such as buffer.attribs[(y * gridSize >+ // + x) * 6u + 0u] >+ return mOutputHLSL->visitBinary(visit, node); >+ } >+ >+ return true; >+} >+ >+void ShaderStorageBlockOutputHLSL::writeEOpIndexDirectOrIndirectOutput(TInfoSinkBase &out, >+ Visit visit, >+ TIntermBinary *node) >+{ >+ ASSERT(IsInShaderStorageBlock(node->getLeft())); >+ if (visit == InVisit) >+ { >+ const TType &type = node->getLeft()->getType(); >+ // For array of arrays, we calculate the offset using the formula below: >+ // elementStride * (a3 * a2 * a1 * i0 + a3 * a2 * i1 + a3 * i2 + i3) >+ // Note: assume that there are 4 dimensions. >+ // a0, a1, a2, a3 is the size of the array in each dimension. (S s[a0][a1][a2][a3]) >+ // i0, i1, i2, i3 is the index of the array in each dimension. (s[i0][i1][i2][i3]) >+ if (IsInArrayOfArraysChain(node->getLeft())) >+ { >+ if (type.isArrayOfArrays()) >+ { >+ const TVector<unsigned int> &arraySizes = *type.getArraySizes(); >+ // Don't need to concern the tail comma which will be used to multiply the index. >+ for (unsigned int i = 0; i < (arraySizes.size() - 1); i++) >+ { >+ out << arraySizes[i]; >+ out << " * "; >+ } >+ } >+ } >+ else >+ { >+ if (node->getType().isVector() && type.isMatrix()) >+ { >+ if (mRowMajor) >+ { >+ out << " + " << str(BlockLayoutEncoder::kBytesPerComponent); >+ } >+ else >+ { >+ out << " + " << str(mMatrixStride); >+ } >+ } >+ else if (node->getType().isScalar() && !type.isArray()) >+ { >+ if (mRowMajor) >+ { >+ out << " + " << str(mMatrixStride); >+ } >+ else >+ { >+ out << " + " << str(BlockLayoutEncoder::kBytesPerComponent); >+ } >+ } >+ >+ out << " * "; >+ } >+ } >+ else if (visit == PostVisit) >+ { >+ // This is used to output the '+' in the array of arrays formula in above. >+ if (node->getType().isArray() && !isEndOfSSBOAccessChain()) >+ { >+ out << " + "; >+ } >+ // This corresponds to '(' in writeDotOperatorOutput when fieldType.isArrayOfArrays() is >+ // true. >+ if (IsInArrayOfArraysChain(node->getLeft()) && !node->getType().isArray()) >+ { >+ out << ")"; >+ } >+ if (mLocationAsTheLastArgument && isEndOfSSBOAccessChain()) >+ { >+ out << ")"; >+ } >+ } >+} >+ >+void ShaderStorageBlockOutputHLSL::writeDotOperatorOutput(TInfoSinkBase &out, const TField *field) >+{ >+ auto fieldInfoIter = mBlockMemberInfoMap.find(field); >+ ASSERT(fieldInfoIter != mBlockMemberInfoMap.end()); >+ const BlockMemberInfo &memberInfo = fieldInfoIter->second; >+ mMatrixStride = memberInfo.matrixStride; >+ mRowMajor = memberInfo.isRowMajorMatrix; >+ out << memberInfo.offset; >+ >+ const TType &fieldType = *field->type(); >+ if (fieldType.isArray() && !isEndOfSSBOAccessChain()) >+ { >+ out << " + "; >+ out << memberInfo.arrayStride; >+ if (fieldType.isArrayOfArrays()) >+ { >+ out << " * ("; >+ } >+ } >+ if (mLocationAsTheLastArgument && isEndOfSSBOAccessChain()) >+ { >+ out << ")"; >+ } >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockOutputHLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockOutputHLSL.h >new file mode 100644 >index 00000000000..2ef23641290 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockOutputHLSL.h >@@ -0,0 +1,92 @@ >+// >+// 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. >+// >+// ShaderStorageBlockOutputHLSL: A traverser to translate a buffer variable of shader storage block >+// to an offset of RWByteAddressBuffer. >+// >+ >+#ifndef COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKOUTPUTHLSL_H_ >+#define COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKOUTPUTHLSL_H_ >+ >+#include "compiler/translator/ShaderStorageBlockFunctionHLSL.h" >+#include "compiler/translator/blocklayout.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+class ResourcesHLSL; >+class OutputHLSL; >+class TSymbolTable; >+ >+struct TReferencedBlock : angle::NonCopyable >+{ >+ POOL_ALLOCATOR_NEW_DELETE >+ TReferencedBlock(const TInterfaceBlock *block, const TVariable *instanceVariable); >+ const TInterfaceBlock *block; >+ const TVariable *instanceVariable; // May be nullptr if the block is not instanced. >+}; >+ >+// Maps from uniqueId to a variable. >+using ReferencedInterfaceBlocks = std::map<int, const TReferencedBlock *>; >+ >+// Used to save shader storage block field member information. >+using BlockMemberInfoMap = std::map<const TField *, BlockMemberInfo>; >+ >+using ShaderVarToFieldMap = std::map<std::string, const TField *>; >+ >+class ShaderStorageBlockOutputHLSL : public TIntermTraverser >+{ >+ public: >+ ShaderStorageBlockOutputHLSL(OutputHLSL *outputHLSL, >+ TSymbolTable *symbolTable, >+ ResourcesHLSL *resourcesHLSL, >+ const std::vector<InterfaceBlock> &shaderStorageBlocks); >+ >+ ~ShaderStorageBlockOutputHLSL(); >+ >+ // This writes part of the function call to store a value to a SSBO to the output stream. After >+ // calling this, ", <stored value>)" should be written to the output stream to complete the >+ // function call. >+ void outputStoreFunctionCallPrefix(TIntermTyped *node); >+ // This writes the function call to load a SSBO value to the output stream. >+ void outputLoadFunctionCall(TIntermTyped *node); >+ // This writes the function call to get the lengh of unsized array member of SSBO. >+ void outputLengthFunctionCall(TIntermTyped *node); >+ // Writes the atomic memory function calls for SSBO. >+ void outputAtomicMemoryFunctionCallPrefix(TIntermTyped *node, TOperator op); >+ >+ void writeShaderStorageBlocksHeader(TInfoSinkBase &out) const; >+ >+ protected: >+ void visitSymbol(TIntermSymbol *) override; >+ void visitConstantUnion(TIntermConstantUnion *) override; >+ bool visitSwizzle(Visit visit, TIntermSwizzle *node) override; >+ bool visitBinary(Visit visit, TIntermBinary *) override; >+ bool visitAggregate(Visit visit, TIntermAggregate *node) override; >+ bool visitTernary(Visit visit, TIntermTernary *) override; >+ bool visitUnary(Visit visit, TIntermUnary *) override; >+ >+ private: >+ void traverseSSBOAccess(TIntermTyped *node, SSBOMethod method); >+ void setMatrixStride(TIntermTyped *node, TLayoutBlockStorage storage, bool rowMajor); >+ bool isEndOfSSBOAccessChain(); >+ void writeEOpIndexDirectOrIndirectOutput(TInfoSinkBase &out, Visit visit, TIntermBinary *node); >+ // Common part in dot operations. >+ void writeDotOperatorOutput(TInfoSinkBase &out, const TField *field); >+ >+ int mMatrixStride; >+ bool mRowMajor; >+ bool mLocationAsTheLastArgument; >+ OutputHLSL *mOutputHLSL; >+ ShaderStorageBlockFunctionHLSL *mSSBOFunctionHLSL; >+ ResourcesHLSL *mResourcesHLSL; >+ ReferencedInterfaceBlocks mReferencedShaderStorageBlocks; >+ >+ BlockMemberInfoMap mBlockMemberInfoMap; >+ const std::vector<InterfaceBlock> &mShaderStorageBlocks; >+}; >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKOUTPUTHLSL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderVars.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderVars.cpp >index 4ab574e9351..202ed21119d 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderVars.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderVars.cpp >@@ -22,7 +22,7 @@ InterpolationType GetNonAuxiliaryInterpolationType(InterpolationType interpolati > { > return (interpolation == INTERPOLATION_CENTROID ? INTERPOLATION_SMOOTH : interpolation); > } >-} >+} // namespace > // The ES 3.0 spec is not clear on this point, but the ES 3.1 spec, and discussion > // on Khronos.org, clarifies that a smooth/flat mismatch produces a link error, > // but auxiliary qualifier mismatch (centroid) does not. >@@ -31,26 +31,24 @@ bool InterpolationTypesMatch(InterpolationType a, InterpolationType b) > return (GetNonAuxiliaryInterpolationType(a) == GetNonAuxiliaryInterpolationType(b)); > } > >-ShaderVariable::ShaderVariable() >- : type(0), precision(0), flattenedOffsetInParentArrays(0), staticUse(false) >-{ >-} >+ShaderVariable::ShaderVariable() : ShaderVariable(GL_NONE) {} > > ShaderVariable::ShaderVariable(GLenum typeIn) >- : type(typeIn), precision(0), flattenedOffsetInParentArrays(0), staticUse(false) >-{ >-} >+ : type(typeIn), >+ precision(0), >+ staticUse(false), >+ active(false), >+ isRowMajorLayout(false), >+ flattenedOffsetInParentArrays(-1) >+{} > >-ShaderVariable::ShaderVariable(GLenum typeIn, unsigned int arraySizeIn) >- : type(typeIn), precision(0), flattenedOffsetInParentArrays(0), staticUse(false) >+ShaderVariable::ShaderVariable(GLenum typeIn, unsigned int arraySizeIn) : ShaderVariable(typeIn) > { > ASSERT(arraySizeIn != 0); > arraySizes.push_back(arraySizeIn); > } > >-ShaderVariable::~ShaderVariable() >-{ >-} >+ShaderVariable::~ShaderVariable() {} > > ShaderVariable::ShaderVariable(const ShaderVariable &other) > : type(other.type), >@@ -58,24 +56,27 @@ ShaderVariable::ShaderVariable(const ShaderVariable &other) > name(other.name), > mappedName(other.mappedName), > arraySizes(other.arraySizes), >- flattenedOffsetInParentArrays(other.flattenedOffsetInParentArrays), > staticUse(other.staticUse), >+ active(other.active), > fields(other.fields), >- structName(other.structName) >-{ >-} >+ structName(other.structName), >+ isRowMajorLayout(other.isRowMajorLayout), >+ flattenedOffsetInParentArrays(other.flattenedOffsetInParentArrays) >+{} > > ShaderVariable &ShaderVariable::operator=(const ShaderVariable &other) > { >- type = other.type; >- precision = other.precision; >- name = other.name; >- mappedName = other.mappedName; >+ type = other.type; >+ precision = other.precision; >+ name = other.name; >+ mappedName = other.mappedName; > arraySizes = other.arraySizes; >- staticUse = other.staticUse; >+ staticUse = other.staticUse; >+ active = other.active; >+ fields = other.fields; >+ structName = other.structName; >+ isRowMajorLayout = other.isRowMajorLayout; > flattenedOffsetInParentArrays = other.flattenedOffsetInParentArrays; >- fields = other.fields; >- structName = other.structName; > return *this; > } > >@@ -83,8 +84,9 @@ bool ShaderVariable::operator==(const ShaderVariable &other) const > { > if (type != other.type || precision != other.precision || name != other.name || > mappedName != other.mappedName || arraySizes != other.arraySizes || >- staticUse != other.staticUse || fields.size() != other.fields.size() || >- structName != other.structName) >+ staticUse != other.staticUse || active != other.active || >+ fields.size() != other.fields.size() || structName != other.structName || >+ isRowMajorLayout != other.isRowMajorLayout) > { > return false; > } >@@ -105,6 +107,16 @@ void ShaderVariable::setArraySize(unsigned int size) > } > } > >+unsigned int ShaderVariable::getInnerArraySizeProduct() const >+{ >+ unsigned int arraySizeProduct = 1u; >+ for (size_t index = 1; index < arraySizes.size(); ++index) >+ { >+ arraySizeProduct *= getNestedArraySize(index); >+ } >+ return arraySizeProduct; >+} >+ > unsigned int ShaderVariable::getArraySizeProduct() const > { > return gl::ArraySizeProduct(arraySizes); >@@ -113,8 +125,7 @@ unsigned int ShaderVariable::getArraySizeProduct() const > void ShaderVariable::indexIntoArray(unsigned int arrayIndex) > { > ASSERT(isArray()); >- flattenedOffsetInParentArrays = >- arrayIndex + getOutermostArraySize() * flattenedOffsetInParentArrays; >+ flattenedOffsetInParentArrays = arrayIndex + getOutermostArraySize() * parentArrayIndex(); > arraySizes.pop_back(); > } > >@@ -214,6 +225,11 @@ bool ShaderVariable::isBuiltIn() const > return (name.size() >= 4 && name[0] == 'g' && name[1] == 'l' && name[2] == '_'); > } > >+bool ShaderVariable::isEmulatedBuiltIn() const >+{ >+ return isBuiltIn() && name != mappedName; >+} >+ > bool ShaderVariable::isSameVariableAtLinkTime(const ShaderVariable &other, > bool matchPrecision, > bool matchName) const >@@ -227,6 +243,8 @@ bool ShaderVariable::isSameVariableAtLinkTime(const ShaderVariable &other, > ASSERT(!matchName || mappedName == other.mappedName); > if (arraySizes != other.arraySizes) > return false; >+ if (isRowMajorLayout != other.isRowMajorLayout) >+ return false; > if (fields.size() != other.fields.size()) > return false; > >@@ -245,31 +263,37 @@ bool ShaderVariable::isSameVariableAtLinkTime(const ShaderVariable &other, > return true; > } > >-Uniform::Uniform() : binding(-1), offset(-1) >-{ >-} >+Uniform::Uniform() >+ : binding(-1), imageUnitFormat(GL_NONE), offset(-1), readonly(false), writeonly(false) >+{} > >-Uniform::~Uniform() >-{ >-} >+Uniform::~Uniform() {} > > Uniform::Uniform(const Uniform &other) >- : VariableWithLocation(other), binding(other.binding), offset(other.offset) >-{ >-} >+ : VariableWithLocation(other), >+ binding(other.binding), >+ imageUnitFormat(other.imageUnitFormat), >+ offset(other.offset), >+ readonly(other.readonly), >+ writeonly(other.writeonly) >+{} > > Uniform &Uniform::operator=(const Uniform &other) > { > VariableWithLocation::operator=(other); >- binding = other.binding; >+ binding = other.binding; >+ imageUnitFormat = other.imageUnitFormat; > offset = other.offset; >+ readonly = other.readonly; >+ writeonly = other.writeonly; > return *this; > } > > bool Uniform::operator==(const Uniform &other) const > { > return VariableWithLocation::operator==(other) && binding == other.binding && >- offset == other.offset; >+ imageUnitFormat == other.imageUnitFormat && offset == other.offset && >+ readonly == other.readonly && writeonly == other.writeonly; > } > > bool Uniform::isSameUniformAtLinkTime(const Uniform &other) const >@@ -280,6 +304,10 @@ bool Uniform::isSameUniformAtLinkTime(const Uniform &other) const > { > return false; > } >+ if (imageUnitFormat != other.imageUnitFormat) >+ { >+ return false; >+ } > if (location != -1 && other.location != -1 && location != other.location) > { > return false; >@@ -288,21 +316,20 @@ bool Uniform::isSameUniformAtLinkTime(const Uniform &other) const > { > return false; > } >+ if (readonly != other.readonly || writeonly != other.writeonly) >+ { >+ return false; >+ } > return VariableWithLocation::isSameVariableAtLinkTime(other, true, true); > } > >-VariableWithLocation::VariableWithLocation() : location(-1) >-{ >-} >+VariableWithLocation::VariableWithLocation() : location(-1) {} > >-VariableWithLocation::~VariableWithLocation() >-{ >-} >+VariableWithLocation::~VariableWithLocation() {} > > VariableWithLocation::VariableWithLocation(const VariableWithLocation &other) > : ShaderVariable(other), location(other.location) >-{ >-} >+{} > > VariableWithLocation &VariableWithLocation::operator=(const VariableWithLocation &other) > { >@@ -316,17 +343,11 @@ bool VariableWithLocation::operator==(const VariableWithLocation &other) const > return (ShaderVariable::operator==(other) && location == other.location); > } > >-Attribute::Attribute() >-{ >-} >+Attribute::Attribute() {} > >-Attribute::~Attribute() >-{ >-} >+Attribute::~Attribute() {} > >-Attribute::Attribute(const Attribute &other) : VariableWithLocation(other) >-{ >-} >+Attribute::Attribute(const Attribute &other) : VariableWithLocation(other) {} > > Attribute &Attribute::operator=(const Attribute &other) > { >@@ -339,81 +360,57 @@ bool Attribute::operator==(const Attribute &other) const > return VariableWithLocation::operator==(other); > } > >-OutputVariable::OutputVariable() >-{ >-} >+OutputVariable::OutputVariable() : index(-1) {} > >-OutputVariable::~OutputVariable() >-{ >-} >- >-OutputVariable::OutputVariable(const OutputVariable &other) : VariableWithLocation(other) >-{ >-} >+OutputVariable::~OutputVariable() {} > >-OutputVariable &OutputVariable::operator=(const OutputVariable &other) >-{ >- VariableWithLocation::operator=(other); >- return *this; >-} >+OutputVariable::OutputVariable(const OutputVariable &other) = default; >+OutputVariable &OutputVariable::operator=(const OutputVariable &other) = default; > > bool OutputVariable::operator==(const OutputVariable &other) const > { >- return VariableWithLocation::operator==(other); >+ return VariableWithLocation::operator==(other) && index == other.index; > } > >-InterfaceBlockField::InterfaceBlockField() : isRowMajorLayout(false) >-{ >-} >+InterfaceBlockField::InterfaceBlockField() {} > >-InterfaceBlockField::~InterfaceBlockField() >-{ >-} >+InterfaceBlockField::~InterfaceBlockField() {} > >-InterfaceBlockField::InterfaceBlockField(const InterfaceBlockField &other) >- : ShaderVariable(other), isRowMajorLayout(other.isRowMajorLayout) >-{ >-} >+InterfaceBlockField::InterfaceBlockField(const InterfaceBlockField &other) : ShaderVariable(other) >+{} > > InterfaceBlockField &InterfaceBlockField::operator=(const InterfaceBlockField &other) > { > ShaderVariable::operator=(other); >- isRowMajorLayout = other.isRowMajorLayout; > return *this; > } > > bool InterfaceBlockField::operator==(const InterfaceBlockField &other) const > { >- return (ShaderVariable::operator==(other) && isRowMajorLayout == other.isRowMajorLayout); >+ return ShaderVariable::operator==(other); > } > > bool InterfaceBlockField::isSameInterfaceBlockFieldAtLinkTime( > const InterfaceBlockField &other) const > { >- return (ShaderVariable::isSameVariableAtLinkTime(other, true, true) && >- isRowMajorLayout == other.isRowMajorLayout); >+ return (ShaderVariable::isSameVariableAtLinkTime(other, true, true)); > } > >-Varying::Varying() : interpolation(INTERPOLATION_SMOOTH), isInvariant(false) >-{ >-} >+Varying::Varying() : interpolation(INTERPOLATION_SMOOTH), isInvariant(false) {} > >-Varying::~Varying() >-{ >-} >+Varying::~Varying() {} > > Varying::Varying(const Varying &other) > : VariableWithLocation(other), > interpolation(other.interpolation), > isInvariant(other.isInvariant) >-{ >-} >+{} > > Varying &Varying::operator=(const Varying &other) > { > VariableWithLocation::operator=(other); >- interpolation = other.interpolation; >- isInvariant = other.isInvariant; >+ interpolation = other.interpolation; >+ isInvariant = other.isInvariant; > return *this; > } > >@@ -443,13 +440,11 @@ InterfaceBlock::InterfaceBlock() > isRowMajorLayout(false), > binding(-1), > staticUse(false), >+ active(false), > blockType(BlockType::BLOCK_UNIFORM) >-{ >-} >+{} > >-InterfaceBlock::~InterfaceBlock() >-{ >-} >+InterfaceBlock::~InterfaceBlock() {} > > InterfaceBlock::InterfaceBlock(const InterfaceBlock &other) > : name(other.name), >@@ -460,10 +455,10 @@ InterfaceBlock::InterfaceBlock(const InterfaceBlock &other) > isRowMajorLayout(other.isRowMajorLayout), > binding(other.binding), > staticUse(other.staticUse), >+ active(other.active), > blockType(other.blockType), > fields(other.fields) >-{ >-} >+{} > > InterfaceBlock &InterfaceBlock::operator=(const InterfaceBlock &other) > { >@@ -475,6 +470,7 @@ InterfaceBlock &InterfaceBlock::operator=(const InterfaceBlock &other) > isRowMajorLayout = other.isRowMajorLayout; > binding = other.binding; > staticUse = other.staticUse; >+ active = other.active; > blockType = other.blockType; > fields = other.fields; > return *this; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SimplifyLoopConditions.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/SimplifyLoopConditions.cpp >deleted file mode 100644 >index 97040468396..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SimplifyLoopConditions.cpp >+++ /dev/null >@@ -1,300 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >-// SimplifyLoopConditions is an AST traverser that converts loop conditions and loop expressions >-// to regular statements inside the loop. This way further transformations that generate statements >-// from loop conditions and loop expressions work correctly. >-// >- >-#include "compiler/translator/SimplifyLoopConditions.h" >- >-#include "compiler/translator/IntermNodePatternMatcher.h" >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class SimplifyLoopConditionsTraverser : public TLValueTrackingTraverser >-{ >- public: >- SimplifyLoopConditionsTraverser(unsigned int conditionsToSimplifyMask, >- TSymbolTable *symbolTable, >- int shaderVersion); >- >- void traverseLoop(TIntermLoop *node) override; >- >- bool visitUnary(Visit visit, TIntermUnary *node) override; >- bool visitBinary(Visit visit, TIntermBinary *node) override; >- bool visitAggregate(Visit visit, TIntermAggregate *node) override; >- bool visitTernary(Visit visit, TIntermTernary *node) override; >- bool visitDeclaration(Visit visit, TIntermDeclaration *node) override; >- >- bool foundLoopToChange() const { return mFoundLoopToChange; } >- >- protected: >- // Marked to true once an operation that needs to be hoisted out of a loop expression has been >- // found. >- bool mFoundLoopToChange; >- bool mInsideLoopInitConditionOrExpression; >- IntermNodePatternMatcher mConditionsToSimplify; >-}; >- >-SimplifyLoopConditionsTraverser::SimplifyLoopConditionsTraverser( >- unsigned int conditionsToSimplifyMask, >- TSymbolTable *symbolTable, >- int shaderVersion) >- : TLValueTrackingTraverser(true, false, false, symbolTable, shaderVersion), >- mFoundLoopToChange(false), >- mInsideLoopInitConditionOrExpression(false), >- mConditionsToSimplify(conditionsToSimplifyMask) >-{ >-} >- >-// If we're inside a loop initialization, condition, or expression, we check for expressions that >-// should be moved out of the loop condition or expression. If one is found, the loop is >-// transformed. >-// If we're not inside loop initialization, condition, or expression, we only need to traverse nodes >-// that may contain loops. >- >-bool SimplifyLoopConditionsTraverser::visitUnary(Visit visit, TIntermUnary *node) >-{ >- if (!mInsideLoopInitConditionOrExpression) >- return false; >- >- if (mFoundLoopToChange) >- return false; // Already decided to change this loop. >- >- mFoundLoopToChange = mConditionsToSimplify.match(node); >- return !mFoundLoopToChange; >-} >- >-bool SimplifyLoopConditionsTraverser::visitBinary(Visit visit, TIntermBinary *node) >-{ >- if (!mInsideLoopInitConditionOrExpression) >- return false; >- >- if (mFoundLoopToChange) >- return false; // Already decided to change this loop. >- >- mFoundLoopToChange = mConditionsToSimplify.match(node, getParentNode(), isLValueRequiredHere()); >- return !mFoundLoopToChange; >-} >- >-bool SimplifyLoopConditionsTraverser::visitAggregate(Visit visit, TIntermAggregate *node) >-{ >- if (!mInsideLoopInitConditionOrExpression) >- return false; >- >- if (mFoundLoopToChange) >- return false; // Already decided to change this loop. >- >- mFoundLoopToChange = mConditionsToSimplify.match(node, getParentNode()); >- return !mFoundLoopToChange; >-} >- >-bool SimplifyLoopConditionsTraverser::visitTernary(Visit visit, TIntermTernary *node) >-{ >- if (!mInsideLoopInitConditionOrExpression) >- return false; >- >- if (mFoundLoopToChange) >- return false; // Already decided to change this loop. >- >- mFoundLoopToChange = mConditionsToSimplify.match(node); >- return !mFoundLoopToChange; >-} >- >-bool SimplifyLoopConditionsTraverser::visitDeclaration(Visit visit, TIntermDeclaration *node) >-{ >- if (!mInsideLoopInitConditionOrExpression) >- return false; >- >- if (mFoundLoopToChange) >- return false; // Already decided to change this loop. >- >- mFoundLoopToChange = mConditionsToSimplify.match(node); >- return !mFoundLoopToChange; >-} >- >-void SimplifyLoopConditionsTraverser::traverseLoop(TIntermLoop *node) >-{ >- // Mark that we're inside a loop condition or expression, and determine if the loop needs to be >- // transformed. >- >- ScopedNodeInTraversalPath addToPath(this, node); >- >- mInsideLoopInitConditionOrExpression = true; >- mFoundLoopToChange = false; >- >- if (!mFoundLoopToChange && node->getInit()) >- { >- node->getInit()->traverse(this); >- } >- >- if (!mFoundLoopToChange && node->getCondition()) >- { >- node->getCondition()->traverse(this); >- } >- >- if (!mFoundLoopToChange && node->getExpression()) >- { >- node->getExpression()->traverse(this); >- } >- >- mInsideLoopInitConditionOrExpression = false; >- >- if (mFoundLoopToChange) >- { >- nextTemporaryId(); >- >- // Replace the loop condition with a boolean variable that's updated on each iteration. >- TLoopType loopType = node->getType(); >- if (loopType == ELoopWhile) >- { >- // Transform: >- // while (expr) { body; } >- // into >- // bool s0 = expr; >- // while (s0) { { body; } s0 = expr; } >- TIntermSequence tempInitSeq; >- tempInitSeq.push_back(createTempInitDeclaration(node->getCondition()->deepCopy())); >- insertStatementsInParentBlock(tempInitSeq); >- >- TIntermBlock *newBody = new TIntermBlock(); >- if (node->getBody()) >- { >- newBody->getSequence()->push_back(node->getBody()); >- } >- newBody->getSequence()->push_back( >- createTempAssignment(node->getCondition()->deepCopy())); >- >- // Can't use queueReplacement to replace old body, since it may have been nullptr. >- // It's safe to do the replacements in place here - the new body will still be >- // traversed, but that won't create any problems. >- node->setBody(newBody); >- node->setCondition(createTempSymbol(node->getCondition()->getType())); >- } >- else if (loopType == ELoopDoWhile) >- { >- // Transform: >- // do { >- // body; >- // } while (expr); >- // into >- // bool s0 = true; >- // do { >- // { body; } >- // s0 = expr; >- // } while (s0); >- TIntermSequence tempInitSeq; >- tempInitSeq.push_back(createTempInitDeclaration(CreateBoolNode(true))); >- insertStatementsInParentBlock(tempInitSeq); >- >- TIntermBlock *newBody = new TIntermBlock(); >- if (node->getBody()) >- { >- newBody->getSequence()->push_back(node->getBody()); >- } >- newBody->getSequence()->push_back( >- createTempAssignment(node->getCondition()->deepCopy())); >- >- // Can't use queueReplacement to replace old body, since it may have been nullptr. >- // It's safe to do the replacements in place here - the new body will still be >- // traversed, but that won't create any problems. >- node->setBody(newBody); >- node->setCondition(createTempSymbol(node->getCondition()->getType())); >- } >- else if (loopType == ELoopFor) >- { >- // Move the loop condition inside the loop. >- // Transform: >- // for (init; expr; exprB) { body; } >- // into >- // { >- // init; >- // bool s0 = expr; >- // while (s0) { >- // { body; } >- // exprB; >- // s0 = expr; >- // } >- // } >- TIntermBlock *loopScope = new TIntermBlock(); >- TIntermSequence *loopScopeSequence = loopScope->getSequence(); >- >- // Insert "init;" >- if (node->getInit()) >- { >- loopScopeSequence->push_back(node->getInit()); >- } >- >- // Insert "bool s0 = expr;" if applicable, "bool s0 = true;" otherwise >- TIntermTyped *conditionInitializer = nullptr; >- if (node->getCondition()) >- { >- conditionInitializer = node->getCondition()->deepCopy(); >- } >- else >- { >- conditionInitializer = CreateBoolNode(true); >- } >- loopScopeSequence->push_back(createTempInitDeclaration(conditionInitializer)); >- >- // Insert "{ body; }" in the while loop >- TIntermBlock *whileLoopBody = new TIntermBlock(); >- if (node->getBody()) >- { >- whileLoopBody->getSequence()->push_back(node->getBody()); >- } >- // Insert "exprB;" in the while loop >- if (node->getExpression()) >- { >- whileLoopBody->getSequence()->push_back(node->getExpression()); >- } >- // Insert "s0 = expr;" in the while loop >- if (node->getCondition()) >- { >- whileLoopBody->getSequence()->push_back( >- createTempAssignment(node->getCondition()->deepCopy())); >- } >- >- // Create "while(s0) { whileLoopBody }" >- TIntermLoop *whileLoop = new TIntermLoop( >- ELoopWhile, nullptr, createTempSymbol(conditionInitializer->getType()), nullptr, >- whileLoopBody); >- loopScope->getSequence()->push_back(whileLoop); >- queueReplacement(loopScope, OriginalNode::IS_DROPPED); >- >- // After this the old body node will be traversed and loops inside it may be >- // transformed. This is fine, since the old body node will still be in the AST after the >- // transformation that's queued here, and transforming loops inside it doesn't need to >- // know the exact post-transform path to it. >- } >- } >- >- mFoundLoopToChange = false; >- >- // We traverse the body of the loop even if the loop is transformed. >- if (node->getBody()) >- node->getBody()->traverse(this); >-} >- >-} // namespace >- >-void SimplifyLoopConditions(TIntermNode *root, >- unsigned int conditionsToSimplifyMask, >- TSymbolTable *symbolTable, >- int shaderVersion) >-{ >- SimplifyLoopConditionsTraverser traverser(conditionsToSimplifyMask, symbolTable, shaderVersion); >- root->traverse(&traverser); >- traverser.updateTree(); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SimplifyLoopConditions.h b/Source/ThirdParty/ANGLE/src/compiler/translator/SimplifyLoopConditions.h >deleted file mode 100644 >index d8f95cd2c8a..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SimplifyLoopConditions.h >+++ /dev/null >@@ -1,25 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >-// SimplifyLoopConditions is an AST traverser that converts loop conditions and loop expressions >-// to regular statements inside the loop. This way further transformations that generate statements >-// from loop conditions and loop expressions work correctly. >-// >- >-#ifndef COMPILER_TRANSLATOR_SIMPLIFYLOOPCONDITIONS_H_ >-#define COMPILER_TRANSLATOR_SIMPLIFYLOOPCONDITIONS_H_ >- >-namespace sh >-{ >-class TIntermNode; >-class TSymbolTable; >- >-void SimplifyLoopConditions(TIntermNode *root, >- unsigned int conditionsToSimplify, >- TSymbolTable *symbolTable, >- int shaderVersion); >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_SIMPLIFYLOOPCONDITIONS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SplitSequenceOperator.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/SplitSequenceOperator.cpp >deleted file mode 100644 >index 5df3154560c..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SplitSequenceOperator.cpp >+++ /dev/null >@@ -1,171 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >-// SplitSequenceOperator is an AST traverser that detects sequence operator expressions that >-// go through further AST transformations that generate statements, and splits them so that >-// possible side effects of earlier parts of the sequence operator expression are guaranteed to be >-// evaluated before the latter parts of the sequence operator expression are evaluated. >-// >- >-#include "compiler/translator/SplitSequenceOperator.h" >- >-#include "compiler/translator/IntermNodePatternMatcher.h" >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class SplitSequenceOperatorTraverser : public TLValueTrackingTraverser >-{ >- public: >- SplitSequenceOperatorTraverser(unsigned int patternsToSplitMask, >- TSymbolTable *symbolTable, >- int shaderVersion); >- >- bool visitUnary(Visit visit, TIntermUnary *node) override; >- bool visitBinary(Visit visit, TIntermBinary *node) override; >- bool visitAggregate(Visit visit, TIntermAggregate *node) override; >- bool visitTernary(Visit visit, TIntermTernary *node) override; >- >- void nextIteration(); >- bool foundExpressionToSplit() const { return mFoundExpressionToSplit; } >- >- protected: >- // Marked to true once an operation that needs to be hoisted out of the expression has been >- // found. After that, no more AST updates are performed on that traversal. >- bool mFoundExpressionToSplit; >- int mInsideSequenceOperator; >- >- IntermNodePatternMatcher mPatternToSplitMatcher; >-}; >- >-SplitSequenceOperatorTraverser::SplitSequenceOperatorTraverser(unsigned int patternsToSplitMask, >- TSymbolTable *symbolTable, >- int shaderVersion) >- : TLValueTrackingTraverser(true, false, true, symbolTable, shaderVersion), >- mFoundExpressionToSplit(false), >- mInsideSequenceOperator(0), >- mPatternToSplitMatcher(patternsToSplitMask) >-{ >-} >- >-void SplitSequenceOperatorTraverser::nextIteration() >-{ >- mFoundExpressionToSplit = false; >- mInsideSequenceOperator = 0; >- nextTemporaryId(); >-} >- >-bool SplitSequenceOperatorTraverser::visitAggregate(Visit visit, TIntermAggregate *node) >-{ >- if (mFoundExpressionToSplit) >- return false; >- >- if (mInsideSequenceOperator > 0 && visit == PreVisit) >- { >- // Detect expressions that need to be simplified >- mFoundExpressionToSplit = mPatternToSplitMatcher.match(node, getParentNode()); >- return !mFoundExpressionToSplit; >- } >- >- return true; >-} >- >-bool SplitSequenceOperatorTraverser::visitUnary(Visit visit, TIntermUnary *node) >-{ >- if (mFoundExpressionToSplit) >- return false; >- >- if (mInsideSequenceOperator > 0 && visit == PreVisit) >- { >- // Detect expressions that need to be simplified >- mFoundExpressionToSplit = mPatternToSplitMatcher.match(node); >- return !mFoundExpressionToSplit; >- } >- >- return true; >-} >- >-bool SplitSequenceOperatorTraverser::visitBinary(Visit visit, TIntermBinary *node) >-{ >- if (node->getOp() == EOpComma) >- { >- if (visit == PreVisit) >- { >- if (mFoundExpressionToSplit) >- { >- return false; >- } >- mInsideSequenceOperator++; >- } >- else if (visit == PostVisit) >- { >- // Split sequence operators starting from the outermost one to preserve correct >- // execution order. >- if (mFoundExpressionToSplit && mInsideSequenceOperator == 1) >- { >- // Move the left side operand into a separate statement in the parent block. >- TIntermSequence insertions; >- insertions.push_back(node->getLeft()); >- insertStatementsInParentBlock(insertions); >- // Replace the comma node with its right side operand. >- queueReplacement(node->getRight(), OriginalNode::IS_DROPPED); >- } >- mInsideSequenceOperator--; >- } >- return true; >- } >- >- if (mFoundExpressionToSplit) >- return false; >- >- if (mInsideSequenceOperator > 0 && visit == PreVisit) >- { >- // Detect expressions that need to be simplified >- mFoundExpressionToSplit = >- mPatternToSplitMatcher.match(node, getParentNode(), isLValueRequiredHere()); >- return !mFoundExpressionToSplit; >- } >- >- return true; >-} >- >-bool SplitSequenceOperatorTraverser::visitTernary(Visit visit, TIntermTernary *node) >-{ >- if (mFoundExpressionToSplit) >- return false; >- >- if (mInsideSequenceOperator > 0 && visit == PreVisit) >- { >- // Detect expressions that need to be simplified >- mFoundExpressionToSplit = mPatternToSplitMatcher.match(node); >- return !mFoundExpressionToSplit; >- } >- >- return true; >-} >- >-} // namespace >- >-void SplitSequenceOperator(TIntermNode *root, >- int patternsToSplitMask, >- TSymbolTable *symbolTable, >- int shaderVersion) >-{ >- SplitSequenceOperatorTraverser traverser(patternsToSplitMask, symbolTable, shaderVersion); >- // Separate one expression at a time, and reset the traverser between iterations. >- do >- { >- traverser.nextIteration(); >- root->traverse(&traverser); >- if (traverser.foundExpressionToSplit()) >- traverser.updateTree(); >- } while (traverser.foundExpressionToSplit()); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SplitSequenceOperator.h b/Source/ThirdParty/ANGLE/src/compiler/translator/SplitSequenceOperator.h >deleted file mode 100644 >index 8f1a766775e..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SplitSequenceOperator.h >+++ /dev/null >@@ -1,28 +0,0 @@ >-// >-// Copyright (c) 2016 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. >-// >-// SplitSequenceOperator is an AST traverser that detects sequence operator expressions that >-// go through further AST transformations that generate statements, and splits them so that >-// possible side effects of earlier parts of the sequence operator expression are guaranteed to be >-// evaluated before the latter parts of the sequence operator expression are evaluated. >-// >- >-#ifndef COMPILER_TRANSLATOR_SPLITSEQUENCEOPERATOR_H_ >-#define COMPILER_TRANSLATOR_SPLITSEQUENCEOPERATOR_H_ >- >-namespace sh >-{ >- >-class TIntermNode; >-class TSymbolTable; >- >-void SplitSequenceOperator(TIntermNode *root, >- int patternsToSplitMask, >- TSymbolTable *symbolTable, >- int shaderVersion); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_SPLITSEQUENCEOPERATOR_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/StaticType.h b/Source/ThirdParty/ANGLE/src/compiler/translator/StaticType.h >new file mode 100644 >index 00000000000..7587e85b42f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/StaticType.h >@@ -0,0 +1,198 @@ >+// >+// Copyright (c) 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. >+// >+// Compile-time instances of many common TType values. These are looked up >+// (statically or dynamically) through the methods defined in the namespace. >+// >+ >+#ifndef COMPILER_TRANSLATOR_STATIC_TYPE_H_ >+#define COMPILER_TRANSLATOR_STATIC_TYPE_H_ >+ >+#include "compiler/translator/Types.h" >+ >+namespace sh >+{ >+ >+namespace StaticType >+{ >+ >+namespace Helpers >+{ >+ >+// >+// Generation and static allocation of type mangled name values. >+// >+ >+// Size of the constexpr-generated mangled name. >+// If this value is too small, the compiler will produce errors. >+static constexpr size_t kStaticMangledNameLength = 2; >+ >+// Type which holds the mangled names for constexpr-generated TTypes. >+// This simple struct is needed so that a char array can be returned by value. >+struct StaticMangledName >+{ >+ // If this array is too small, the compiler will produce errors. >+ char name[kStaticMangledNameLength + 1] = {}; >+}; >+ >+// Generates a mangled name for a TType given its parameters. >+constexpr StaticMangledName BuildStaticMangledName(TBasicType basicType, >+ TPrecision precision, >+ TQualifier qualifier, >+ unsigned char primarySize, >+ unsigned char secondarySize) >+{ >+ StaticMangledName name = {}; >+ name.name[0] = TType::GetSizeMangledName(primarySize, secondarySize); >+ name.name[1] = GetBasicMangledName(basicType); >+ name.name[2] = '\0'; >+ return name; >+} >+ >+// This "variable" contains the mangled names for every constexpr-generated TType. >+// If kMangledNameInstance<B, P, Q, PS, SS> is used anywhere (specifally >+// in kInstance, below), this is where the appropriate type will be stored. >+template <TBasicType basicType, >+ TPrecision precision, >+ TQualifier qualifier, >+ unsigned char primarySize, >+ unsigned char secondarySize> >+static constexpr StaticMangledName kMangledNameInstance = >+ BuildStaticMangledName(basicType, precision, qualifier, primarySize, secondarySize); >+ >+// >+// Generation and static allocation of TType values. >+// >+ >+// This "variable" contains every constexpr-generated TType. >+// If kInstance<B, P, Q, PS, SS> is used anywhere (specifally >+// in Get, below), this is where the appropriate type will be stored. >+template <TBasicType basicType, >+ TPrecision precision, >+ TQualifier qualifier, >+ unsigned char primarySize, >+ unsigned char secondarySize> >+static constexpr TType kInstance = >+ TType(basicType, >+ precision, >+ qualifier, >+ primarySize, >+ secondarySize, >+ kMangledNameInstance<basicType, precision, qualifier, primarySize, secondarySize>.name); >+ >+} // namespace Helpers >+ >+// >+// Fully-qualified type lookup. >+// >+ >+template <TBasicType basicType, >+ TPrecision precision, >+ TQualifier qualifier, >+ unsigned char primarySize, >+ unsigned char secondarySize> >+constexpr const TType *Get() >+{ >+ static_assert(1 <= primarySize && primarySize <= 4, "primarySize out of bounds"); >+ static_assert(1 <= secondarySize && secondarySize <= 4, "secondarySize out of bounds"); >+ return &Helpers::kInstance<basicType, precision, qualifier, primarySize, secondarySize>; >+} >+ >+// >+// Overloads >+// >+ >+template <TBasicType basicType, unsigned char primarySize = 1, unsigned char secondarySize = 1> >+constexpr const TType *GetBasic() >+{ >+ return Get<basicType, EbpUndefined, EvqGlobal, primarySize, secondarySize>(); >+} >+ >+template <TBasicType basicType, >+ TQualifier qualifier, >+ unsigned char primarySize = 1, >+ unsigned char secondarySize = 1> >+const TType *GetQualified() >+{ >+ return Get<basicType, EbpUndefined, qualifier, primarySize, secondarySize>(); >+} >+ >+// Dynamic lookup methods (convert runtime values to template args) >+ >+namespace Helpers >+{ >+ >+// Helper which takes secondarySize statically but primarySize dynamically. >+template <TBasicType basicType, >+ TPrecision precision, >+ TQualifier qualifier, >+ unsigned char secondarySize> >+constexpr const TType *GetForVecMatHelper(unsigned char primarySize) >+{ >+ static_assert(basicType == EbtFloat || basicType == EbtInt || basicType == EbtUInt || >+ basicType == EbtBool, >+ "unsupported basicType"); >+ switch (primarySize) >+ { >+ case 1: >+ return Get<basicType, precision, qualifier, 1, secondarySize>(); >+ case 2: >+ return Get<basicType, precision, qualifier, 2, secondarySize>(); >+ case 3: >+ return Get<basicType, precision, qualifier, 3, secondarySize>(); >+ case 4: >+ return Get<basicType, precision, qualifier, 4, secondarySize>(); >+ default: >+ UNREACHABLE(); >+ return GetBasic<EbtVoid>(); >+ } >+} >+ >+} // namespace Helpers >+ >+template <TBasicType basicType, >+ TPrecision precision = EbpUndefined, >+ TQualifier qualifier = EvqGlobal> >+constexpr const TType *GetForVecMat(unsigned char primarySize, unsigned char secondarySize = 1) >+{ >+ static_assert(basicType == EbtFloat || basicType == EbtInt || basicType == EbtUInt || >+ basicType == EbtBool, >+ "unsupported basicType"); >+ switch (secondarySize) >+ { >+ case 1: >+ return Helpers::GetForVecMatHelper<basicType, precision, qualifier, 1>(primarySize); >+ case 2: >+ return Helpers::GetForVecMatHelper<basicType, precision, qualifier, 2>(primarySize); >+ case 3: >+ return Helpers::GetForVecMatHelper<basicType, precision, qualifier, 3>(primarySize); >+ case 4: >+ return Helpers::GetForVecMatHelper<basicType, precision, qualifier, 4>(primarySize); >+ default: >+ UNREACHABLE(); >+ return GetBasic<EbtVoid>(); >+ } >+} >+ >+template <TBasicType basicType, TPrecision precision = EbpUndefined> >+constexpr const TType *GetForVec(TQualifier qualifier, unsigned char size) >+{ >+ switch (qualifier) >+ { >+ case EvqGlobal: >+ return Helpers::GetForVecMatHelper<basicType, precision, EvqGlobal, 1>(size); >+ case EvqOut: >+ return Helpers::GetForVecMatHelper<basicType, precision, EvqOut, 1>(size); >+ default: >+ UNREACHABLE(); >+ return GetBasic<EbtVoid>(); >+ } >+} >+ >+} // namespace StaticType >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_STATIC_TYPE_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.cpp >index 61a9431cebb..172ca07fc06 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.cpp >@@ -11,8 +11,8 @@ > #include "common/utilities.h" > #include "compiler/translator/OutputHLSL.h" > #include "compiler/translator/Types.h" >-#include "compiler/translator/util.h" > #include "compiler/translator/UtilsHLSL.h" >+#include "compiler/translator/util.h" > > namespace sh > { >@@ -26,7 +26,7 @@ TString Define(const TStructure &structure, > Std140PaddingHelper *padHelper) > { > const TFieldList &fields = structure.fields(); >- const bool isNameless = (structure.name() == ""); >+ const bool isNameless = (structure.symbolType() == SymbolType::Empty); > const TString &structName = > QualifiedStructNameString(structure, useHLSLRowMajorPacking, useStd140Packing); > const TString declareString = (isNameless ? "struct" : "struct " + structName); >@@ -53,7 +53,7 @@ TString Define(const TStructure &structure, > } > > string += " " + fieldTypeString + " " + DecorateField(field->name(), structure) + >- ArrayString(fieldType) + ";\n"; >+ ArrayString(fieldType).data() + ";\n"; > > if (padHelper) > { >@@ -76,7 +76,8 @@ TString WriteParameterList(const std::vector<TType> ¶meters) > { > const TType ¶mType = parameters[parameter]; > >- parameterList += TypeString(paramType) + " x" + str(parameter) + ArrayString(paramType); >+ parameterList += >+ TypeString(paramType) + " x" + str(parameter) + ArrayString(paramType).data(); > > if (parameter < parameters.size() - 1u) > { >@@ -91,15 +92,13 @@ TString WriteParameterList(const std::vector<TType> ¶meters) > Std140PaddingHelper::Std140PaddingHelper(const std::map<TString, int> &structElementIndexes, > unsigned *uniqueCounter) > : mPaddingCounter(uniqueCounter), mElementIndex(0), mStructElementIndexes(&structElementIndexes) >-{ >-} >+{} > > Std140PaddingHelper::Std140PaddingHelper(const Std140PaddingHelper &other) > : mPaddingCounter(other.mPaddingCounter), > mElementIndex(other.mElementIndex), > mStructElementIndexes(other.mStructElementIndexes) >-{ >-} >+{} > > Std140PaddingHelper &Std140PaddingHelper::operator=(const Std140PaddingHelper &other) > { >@@ -173,7 +172,7 @@ TString Std140PaddingHelper::postPaddingString(const TType &type, bool useHLSLRo > return ""; > } > >- int numComponents = 0; >+ int numComponents = 0; > const TStructure *structure = type.getStruct(); > > if (type.isMatrix()) >@@ -214,9 +213,7 @@ TString Std140PaddingHelper::postPaddingString(const TType &type, bool useHLSLRo > return padding; > } > >-StructureHLSL::StructureHLSL() : mUniquePaddingCounter(0) >-{ >-} >+StructureHLSL::StructureHLSL() : mUniquePaddingCounter(0) {} > > Std140PaddingHelper StructureHLSL::getPaddingHelper() > { >@@ -441,7 +438,7 @@ TString StructureHLSL::addBuiltInConstructor(const TType &type, const TIntermSeq > else > { > size_t remainingComponents = ctorType.getObjectSize(); >- size_t parameterIndex = 0; >+ size_t parameterIndex = 0; > > while (remainingComponents > 0) > { >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.h >index daced8f8d1f..ba4a8d11bce 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.h >@@ -67,7 +67,7 @@ class StructureHLSL : angle::NonCopyable > > struct TStructProperties : public angle::NonCopyable > { >- POOL_ALLOCATOR_NEW_DELETE(); >+ POOL_ALLOCATOR_NEW_DELETE > > TStructProperties() {} > >@@ -93,6 +93,6 @@ class StructureHLSL : angle::NonCopyable > bool useStd140Packing); > DefinedStructs::iterator defineVariants(const TStructure &structure, const TString &name); > }; >-} >+} // namespace sh > > #endif // COMPILER_TRANSLATOR_STRUCTUREHLSL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Symbol.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/Symbol.cpp >new file mode 100644 >index 00000000000..52ad4f319d1 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Symbol.cpp >@@ -0,0 +1,238 @@ >+// >+// Copyright (c) 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. >+// >+// Symbol.cpp: Symbols representing variables, functions, structures and interface blocks. >+// >+ >+#if defined(_MSC_VER) >+# pragma warning(disable : 4718) >+#endif >+ >+#include "compiler/translator/Symbol.h" >+ >+#include "compiler/translator/ImmutableStringBuilder.h" >+#include "compiler/translator/SymbolTable.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+constexpr const ImmutableString kMainName("main"); >+constexpr const ImmutableString kImageLoadName("imageLoad"); >+constexpr const ImmutableString kImageStoreName("imageStore"); >+constexpr const ImmutableString kImageSizeName("imageSize"); >+constexpr const ImmutableString kAtomicCounterName("atomicCounter"); >+ >+static const char kFunctionMangledNameSeparator = '('; >+ >+} // anonymous namespace >+ >+TSymbol::TSymbol(TSymbolTable *symbolTable, >+ const ImmutableString &name, >+ SymbolType symbolType, >+ SymbolClass symbolClass, >+ TExtension extension) >+ : mName(name), >+ mUniqueId(symbolTable->nextUniqueId()), >+ mSymbolType(symbolType), >+ mExtension(extension), >+ mSymbolClass(symbolClass) >+{ >+ ASSERT(mSymbolType == SymbolType::BuiltIn || mExtension == TExtension::UNDEFINED); >+ ASSERT(mName != "" || mSymbolType == SymbolType::AngleInternal || >+ mSymbolType == SymbolType::Empty); >+} >+ >+ImmutableString TSymbol::name() const >+{ >+ if (!mName.empty()) >+ { >+ return mName; >+ } >+ // This can be called for nameless function parameters in HLSL. >+ ASSERT(mSymbolType == SymbolType::AngleInternal || >+ (mSymbolType == SymbolType::Empty && isVariable())); >+ int uniqueId = mUniqueId.get(); >+ ImmutableStringBuilder symbolNameOut(sizeof(uniqueId) * 2u + 1u); >+ symbolNameOut << 's'; >+ symbolNameOut.appendHex(mUniqueId.get()); >+ return symbolNameOut; >+} >+ >+ImmutableString TSymbol::getMangledName() const >+{ >+ if (mSymbolClass == SymbolClass::Function) >+ { >+ // We do this instead of using proper virtual functions so that we can better support >+ // constexpr symbols. >+ return static_cast<const TFunction *>(this)->getFunctionMangledName(); >+ } >+ ASSERT(mSymbolType != SymbolType::Empty); >+ return name(); >+} >+ >+TVariable::TVariable(TSymbolTable *symbolTable, >+ const ImmutableString &name, >+ const TType *type, >+ SymbolType symbolType, >+ TExtension extension) >+ : TSymbol(symbolTable, name, symbolType, SymbolClass::Variable, extension), >+ mType(type), >+ unionArray(nullptr) >+{ >+ ASSERT(mType); >+ ASSERT(name.empty() || symbolType != SymbolType::Empty); >+} >+ >+TStructure::TStructure(TSymbolTable *symbolTable, >+ const ImmutableString &name, >+ const TFieldList *fields, >+ SymbolType symbolType) >+ : TSymbol(symbolTable, name, symbolType, SymbolClass::Struct), TFieldListCollection(fields) >+{} >+ >+TStructure::TStructure(const TSymbolUniqueId &id, >+ const ImmutableString &name, >+ TExtension extension, >+ const TFieldList *fields) >+ : TSymbol(id, name, SymbolType::BuiltIn, extension, SymbolClass::Struct), >+ TFieldListCollection(fields) >+{} >+ >+void TStructure::createSamplerSymbols(const char *namePrefix, >+ const TString &apiNamePrefix, >+ TVector<const TVariable *> *outputSymbols, >+ TMap<const TVariable *, TString> *outputSymbolsToAPINames, >+ TSymbolTable *symbolTable) const >+{ >+ ASSERT(containsSamplers()); >+ for (const auto *field : *mFields) >+ { >+ const TType *fieldType = field->type(); >+ if (IsSampler(fieldType->getBasicType()) || fieldType->isStructureContainingSamplers()) >+ { >+ std::stringstream fieldName = sh::InitializeStream<std::stringstream>(); >+ fieldName << namePrefix << "_" << field->name(); >+ TString fieldApiName = apiNamePrefix + "."; >+ fieldApiName += field->name().data(); >+ fieldType->createSamplerSymbols(ImmutableString(fieldName.str()), fieldApiName, >+ outputSymbols, outputSymbolsToAPINames, symbolTable); >+ } >+ } >+} >+ >+void TStructure::setName(const ImmutableString &name) >+{ >+ ImmutableString *mutableName = const_cast<ImmutableString *>(&mName); >+ *mutableName = name; >+} >+ >+TInterfaceBlock::TInterfaceBlock(TSymbolTable *symbolTable, >+ const ImmutableString &name, >+ const TFieldList *fields, >+ const TLayoutQualifier &layoutQualifier, >+ SymbolType symbolType, >+ TExtension extension) >+ : TSymbol(symbolTable, name, symbolType, SymbolClass::InterfaceBlock, extension), >+ TFieldListCollection(fields), >+ mBlockStorage(layoutQualifier.blockStorage), >+ mBinding(layoutQualifier.binding) >+{ >+ ASSERT(name != nullptr); >+} >+ >+TInterfaceBlock::TInterfaceBlock(const TSymbolUniqueId &id, >+ const ImmutableString &name, >+ TExtension extension, >+ const TFieldList *fields) >+ : TSymbol(id, name, SymbolType::BuiltIn, extension, SymbolClass::InterfaceBlock), >+ TFieldListCollection(fields), >+ mBlockStorage(EbsUnspecified), >+ mBinding(0) >+{} >+ >+TFunction::TFunction(TSymbolTable *symbolTable, >+ const ImmutableString &name, >+ SymbolType symbolType, >+ const TType *retType, >+ bool knownToNotHaveSideEffects) >+ : TSymbol(symbolTable, name, symbolType, SymbolClass::Function, TExtension::UNDEFINED), >+ mParametersVector(new TParamVector()), >+ mParameters(nullptr), >+ mParamCount(0u), >+ returnType(retType), >+ mMangledName(""), >+ mOp(EOpNull), >+ defined(false), >+ mHasPrototypeDeclaration(false), >+ mKnownToNotHaveSideEffects(knownToNotHaveSideEffects) >+{ >+ // Functions with an empty name are not allowed. >+ ASSERT(symbolType != SymbolType::Empty); >+ ASSERT(name != nullptr || symbolType == SymbolType::AngleInternal); >+} >+ >+void TFunction::addParameter(const TVariable *p) >+{ >+ ASSERT(mParametersVector); >+ mParametersVector->push_back(p); >+ mParameters = mParametersVector->data(); >+ mParamCount = mParametersVector->size(); >+ mMangledName = kEmptyImmutableString; >+} >+ >+void TFunction::shareParameters(const TFunction ¶metersSource) >+{ >+ mParametersVector = nullptr; >+ mParameters = parametersSource.mParameters; >+ mParamCount = parametersSource.mParamCount; >+ ASSERT(parametersSource.name() == name()); >+ mMangledName = parametersSource.mMangledName; >+} >+ >+ImmutableString TFunction::buildMangledName() const >+{ >+ std::string newName(name().data(), name().length()); >+ newName += kFunctionMangledNameSeparator; >+ >+ for (size_t i = 0u; i < mParamCount; ++i) >+ { >+ newName += mParameters[i]->getType().getMangledName(); >+ } >+ return ImmutableString(newName); >+} >+ >+bool TFunction::isMain() const >+{ >+ return symbolType() == SymbolType::UserDefined && name() == kMainName; >+} >+ >+bool TFunction::isImageFunction() const >+{ >+ return symbolType() == SymbolType::BuiltIn && >+ (name() == kImageSizeName || name() == kImageLoadName || name() == kImageStoreName); >+} >+ >+bool TFunction::isAtomicCounterFunction() const >+{ >+ return SymbolType() == SymbolType::BuiltIn && name().beginsWith(kAtomicCounterName); >+} >+ >+bool TFunction::hasSamplerInStructParams() const >+{ >+ for (size_t paramIndex = 0; paramIndex < mParamCount; ++paramIndex) >+ { >+ const TVariable *param = getParam(paramIndex); >+ if (param->getType().isStructureContainingSamplers()) >+ { >+ return true; >+ } >+ } >+ >+ return false; >+} >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Symbol.h b/Source/ThirdParty/ANGLE/src/compiler/translator/Symbol.h >new file mode 100644 >index 00000000000..3b74a0baa4f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Symbol.h >@@ -0,0 +1,277 @@ >+// >+// Copyright (c) 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. >+// >+// Symbol.h: Symbols representing variables, functions, structures and interface blocks. >+// >+ >+#ifndef COMPILER_TRANSLATOR_SYMBOL_H_ >+#define COMPILER_TRANSLATOR_SYMBOL_H_ >+ >+#include "common/angleutils.h" >+#include "compiler/translator/ExtensionBehavior.h" >+#include "compiler/translator/ImmutableString.h" >+#include "compiler/translator/IntermNode.h" >+#include "compiler/translator/SymbolUniqueId.h" >+ >+namespace sh >+{ >+ >+class TSymbolTable; >+ >+// Symbol base class. (Can build functions or variables out of these...) >+class TSymbol : angle::NonCopyable >+{ >+ public: >+ POOL_ALLOCATOR_NEW_DELETE >+ TSymbol(TSymbolTable *symbolTable, >+ const ImmutableString &name, >+ SymbolType symbolType, >+ SymbolClass symbolClass, >+ TExtension extension = TExtension::UNDEFINED); >+ >+ // Note that we can't have a virtual destructor in order to support constexpr symbols. Data is >+ // either statically allocated or pool allocated. >+ ~TSymbol() = default; >+ >+ // Calling name() for empty symbols (symbolType == SymbolType::Empty) generates a similar name >+ // as for internal variables. >+ ImmutableString name() const; >+ // Don't call getMangledName() for empty symbols (symbolType == SymbolType::Empty). >+ ImmutableString getMangledName() const; >+ >+ bool isFunction() const { return mSymbolClass == SymbolClass::Function; } >+ bool isVariable() const { return mSymbolClass == SymbolClass::Variable; } >+ bool isStruct() const { return mSymbolClass == SymbolClass::Struct; } >+ bool isInterfaceBlock() const { return mSymbolClass == SymbolClass::InterfaceBlock; } >+ >+ const TSymbolUniqueId &uniqueId() const { return mUniqueId; } >+ SymbolType symbolType() const { return mSymbolType; } >+ TExtension extension() const { return mExtension; } >+ >+ protected: >+ constexpr TSymbol(const TSymbolUniqueId &id, >+ const ImmutableString &name, >+ SymbolType symbolType, >+ TExtension extension, >+ SymbolClass symbolClass) >+ : mName(name), >+ mUniqueId(id), >+ mSymbolType(symbolType), >+ mExtension(extension), >+ mSymbolClass(symbolClass) >+ {} >+ >+ const ImmutableString mName; >+ >+ private: >+ const TSymbolUniqueId mUniqueId; >+ const SymbolType mSymbolType; >+ const TExtension mExtension; >+ >+ // We use this instead of having virtual functions for querying the class in order to support >+ // constexpr symbols. >+ const SymbolClass mSymbolClass; >+}; >+ >+// Variable. >+// May store the value of a constant variable of any type (float, int, bool or struct). >+class TVariable : public TSymbol >+{ >+ public: >+ TVariable(TSymbolTable *symbolTable, >+ const ImmutableString &name, >+ const TType *type, >+ SymbolType symbolType, >+ TExtension ext = TExtension::UNDEFINED); >+ >+ const TType &getType() const { return *mType; } >+ >+ const TConstantUnion *getConstPointer() const { return unionArray; } >+ >+ void shareConstPointer(const TConstantUnion *constArray) { unionArray = constArray; } >+ >+ // Note: only to be used for built-in variables with autogenerated ids! >+ constexpr TVariable(const TSymbolUniqueId &id, >+ const ImmutableString &name, >+ SymbolType symbolType, >+ TExtension extension, >+ const TType *type) >+ : TSymbol(id, name, symbolType, extension, SymbolClass::Variable), >+ mType(type), >+ unionArray(nullptr) >+ {} >+ >+ private: >+ const TType *mType; >+ const TConstantUnion *unionArray; >+}; >+ >+// Struct type. >+class TStructure : public TSymbol, public TFieldListCollection >+{ >+ public: >+ TStructure(TSymbolTable *symbolTable, >+ const ImmutableString &name, >+ const TFieldList *fields, >+ SymbolType symbolType); >+ >+ // The char arrays passed in must be pool allocated or static. >+ void createSamplerSymbols(const char *namePrefix, >+ const TString &apiNamePrefix, >+ TVector<const TVariable *> *outputSymbols, >+ TMap<const TVariable *, TString> *outputSymbolsToAPINames, >+ TSymbolTable *symbolTable) const; >+ >+ void setAtGlobalScope(bool atGlobalScope) { mAtGlobalScope = atGlobalScope; } >+ bool atGlobalScope() const { return mAtGlobalScope; } >+ >+ private: >+ friend class TSymbolTable; >+ // For creating built-in structs. >+ TStructure(const TSymbolUniqueId &id, >+ const ImmutableString &name, >+ TExtension extension, >+ const TFieldList *fields); >+ >+ // TODO(zmo): Find a way to get rid of the const_cast in function >+ // setName(). At the moment keep this function private so only >+ // friend class RegenerateStructNames may call it. >+ friend class RegenerateStructNames; >+ void setName(const ImmutableString &name); >+ >+ bool mAtGlobalScope; >+}; >+ >+// Interface block. Note that this contains the block name, not the instance name. Interface block >+// instances are stored as TVariable. >+class TInterfaceBlock : public TSymbol, public TFieldListCollection >+{ >+ public: >+ TInterfaceBlock(TSymbolTable *symbolTable, >+ const ImmutableString &name, >+ const TFieldList *fields, >+ const TLayoutQualifier &layoutQualifier, >+ SymbolType symbolType, >+ TExtension extension = TExtension::UNDEFINED); >+ >+ TLayoutBlockStorage blockStorage() const { return mBlockStorage; } >+ int blockBinding() const { return mBinding; } >+ >+ private: >+ friend class TSymbolTable; >+ // For creating built-in interface blocks. >+ TInterfaceBlock(const TSymbolUniqueId &id, >+ const ImmutableString &name, >+ TExtension extension, >+ const TFieldList *fields); >+ >+ TLayoutBlockStorage mBlockStorage; >+ int mBinding; >+ >+ // Note that we only record matrix packing on a per-field granularity. >+}; >+ >+// Parameter class used for parsing user-defined function parameters. >+struct TParameter >+{ >+ // Destructively converts to TVariable. >+ // This method resets name and type to nullptrs to make sure >+ // their content cannot be modified after the call. >+ const TVariable *createVariable(TSymbolTable *symbolTable) >+ { >+ const ImmutableString constName(name); >+ const TType *constType = type; >+ name = nullptr; >+ type = nullptr; >+ return new TVariable(symbolTable, constName, constType, >+ constName.empty() ? SymbolType::Empty : SymbolType::UserDefined); >+ } >+ >+ const char *name; // either pool allocated or static. >+ TType *type; >+}; >+ >+// The function sub-class of a symbol. >+class TFunction : public TSymbol >+{ >+ public: >+ // User-defined function >+ TFunction(TSymbolTable *symbolTable, >+ const ImmutableString &name, >+ SymbolType symbolType, >+ const TType *retType, >+ bool knownToNotHaveSideEffects); >+ >+ void addParameter(const TVariable *p); >+ void shareParameters(const TFunction ¶metersSource); >+ >+ ImmutableString getFunctionMangledName() const >+ { >+ ASSERT(symbolType() != SymbolType::BuiltIn); >+ if (mMangledName.empty()) >+ { >+ mMangledName = buildMangledName(); >+ } >+ return mMangledName; >+ } >+ >+ const TType &getReturnType() const { return *returnType; } >+ >+ TOperator getBuiltInOp() const { return mOp; } >+ >+ void setDefined() { defined = true; } >+ bool isDefined() { return defined; } >+ void setHasPrototypeDeclaration() { mHasPrototypeDeclaration = true; } >+ bool hasPrototypeDeclaration() const { return mHasPrototypeDeclaration; } >+ >+ size_t getParamCount() const { return mParamCount; } >+ const TVariable *getParam(size_t i) const { return mParameters[i]; } >+ >+ bool isKnownToNotHaveSideEffects() const { return mKnownToNotHaveSideEffects; } >+ >+ bool isMain() const; >+ bool isImageFunction() const; >+ bool isAtomicCounterFunction() const; >+ bool hasSamplerInStructParams() const; >+ >+ // Note: Only to be used for static built-in functions! >+ constexpr TFunction(const TSymbolUniqueId &id, >+ const ImmutableString &name, >+ TExtension extension, >+ const TVariable *const *parameters, >+ size_t paramCount, >+ const TType *retType, >+ TOperator op, >+ bool knownToNotHaveSideEffects) >+ : TSymbol(id, name, SymbolType::BuiltIn, extension, SymbolClass::Function), >+ mParametersVector(nullptr), >+ mParameters(parameters), >+ mParamCount(paramCount), >+ returnType(retType), >+ mMangledName(nullptr), >+ mOp(op), >+ defined(false), >+ mHasPrototypeDeclaration(false), >+ mKnownToNotHaveSideEffects(knownToNotHaveSideEffects) >+ {} >+ >+ private: >+ ImmutableString buildMangledName() const; >+ >+ typedef TVector<const TVariable *> TParamVector; >+ TParamVector *mParametersVector; >+ const TVariable *const *mParameters; >+ size_t mParamCount; >+ const TType *const returnType; >+ mutable ImmutableString mMangledName; >+ const TOperator mOp; // Only set for built-ins >+ bool defined; >+ bool mHasPrototypeDeclaration; >+ bool mKnownToNotHaveSideEffects; >+}; >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_SYMBOL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.cpp >index 6c384614698..73e40d88c41 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.cpp >@@ -8,551 +8,281 @@ > // > > #if defined(_MSC_VER) >-#pragma warning(disable : 4718) >+# pragma warning(disable : 4718) > #endif > > #include "compiler/translator/SymbolTable.h" > >-#include "compiler/translator/Cache.h" >+#include "angle_gl.h" >+#include "compiler/translator/ImmutableString.h" > #include "compiler/translator/IntermNode.h" >- >-#include <stdio.h> >-#include <algorithm> >+#include "compiler/translator/StaticType.h" > > namespace sh > { > >-namespace >+class TSymbolTable::TSymbolTableLevel > { >+ public: >+ TSymbolTableLevel() = default; > >-static const char kFunctionMangledNameSeparator = '('; >+ bool insert(TSymbol *symbol); > >-} // anonymous namespace >+ // Insert a function using its unmangled name as the key. >+ void insertUnmangled(TFunction *function); > >-TSymbol::TSymbol(TSymbolTable *symbolTable, const TString *n) >- : uniqueId(symbolTable->nextUniqueId()), name(n), extension(TExtension::UNDEFINED) >-{ >-} >+ TSymbol *find(const ImmutableString &name) const; > >-// >-// Functions have buried pointers to delete. >-// >-TFunction::~TFunction() >-{ >- clearParameters(); >-} >+ private: >+ using tLevel = TUnorderedMap<ImmutableString, >+ TSymbol *, >+ ImmutableString::FowlerNollVoHash<sizeof(size_t)>>; >+ using tLevelPair = const tLevel::value_type; >+ using tInsertResult = std::pair<tLevel::iterator, bool>; > >-void TFunction::clearParameters() >-{ >- for (TParamList::iterator i = parameters.begin(); i != parameters.end(); ++i) >- delete (*i).type; >- parameters.clear(); >- mangledName = nullptr; >-} >+ tLevel level; >+}; > >-void TFunction::swapParameters(const TFunction ¶metersSource) >-{ >- clearParameters(); >- for (auto parameter : parametersSource.parameters) >- { >- addParameter(parameter); >- } >-} >- >-const TString *TFunction::buildMangledName() const >-{ >- std::string newName = getName().c_str(); >- newName += kFunctionMangledNameSeparator; >- >- for (const auto &p : parameters) >- { >- newName += p.type->getMangledName(); >- } >- return NewPoolTString(newName.c_str()); >-} >- >-const TString &TFunction::GetMangledNameFromCall(const TString &functionName, >- const TIntermSequence &arguments) >-{ >- std::string newName = functionName.c_str(); >- newName += kFunctionMangledNameSeparator; >- >- for (TIntermNode *argument : arguments) >- { >- newName += argument->getAsTyped()->getType().getMangledName(); >- } >- return *NewPoolTString(newName.c_str()); >-} >- >-// >-// Symbol table levels are a map of pointers to symbols that have to be deleted. >-// >-TSymbolTableLevel::~TSymbolTableLevel() >-{ >- for (tLevel::iterator it = level.begin(); it != level.end(); ++it) >- delete (*it).second; >-} >- >-bool TSymbolTableLevel::insert(TSymbol *symbol) >+bool TSymbolTable::TSymbolTableLevel::insert(TSymbol *symbol) > { > // returning true means symbol was added to the table > tInsertResult result = level.insert(tLevelPair(symbol->getMangledName(), symbol)); >- > return result.second; > } > >-bool TSymbolTableLevel::insertUnmangled(TFunction *function) >+void TSymbolTable::TSymbolTableLevel::insertUnmangled(TFunction *function) > { >- // returning true means symbol was added to the table >- tInsertResult result = level.insert(tLevelPair(function->getName(), function)); >- >- return result.second; >+ level.insert(tLevelPair(function->name(), function)); > } > >-TSymbol *TSymbolTableLevel::find(const TString &name) const >+TSymbol *TSymbolTable::TSymbolTableLevel::find(const ImmutableString &name) const > { > tLevel::const_iterator it = level.find(name); > if (it == level.end()) >- return 0; >+ return nullptr; > else > return (*it).second; > } > >-TSymbol *TSymbolTable::find(const TString &name, >- int shaderVersion, >- bool *builtIn, >- bool *sameScope) const >-{ >- int level = currentLevel(); >- TSymbol *symbol; >+TSymbolTable::TSymbolTable() >+ : mGlobalInvariant(false), >+ mUniqueIdCounter(0), >+ mShaderType(GL_FRAGMENT_SHADER), >+ mGlInVariableWithArraySize(nullptr) >+{} > >- do >- { >- if (level == GLSL_BUILTINS) >- level--; >- if (level == ESSL3_1_BUILTINS && shaderVersion != 310) >- level--; >- if (level == ESSL3_BUILTINS && shaderVersion < 300) >- level--; >- if (level == ESSL1_BUILTINS && shaderVersion != 100) >- level--; >- >- symbol = table[level]->find(name); >- } while (symbol == 0 && --level >= 0); >- >- if (builtIn) >- *builtIn = (level <= LAST_BUILTIN_LEVEL); >- if (sameScope) >- *sameScope = (level == currentLevel()); >+TSymbolTable::~TSymbolTable() = default; > >- return symbol; >+bool TSymbolTable::isEmpty() const >+{ >+ return mTable.empty(); > } > >-TSymbol *TSymbolTable::findGlobal(const TString &name) const >+bool TSymbolTable::atGlobalLevel() const > { >- ASSERT(table.size() > GLOBAL_LEVEL); >- return table[GLOBAL_LEVEL]->find(name); >+ return mTable.size() == 1u; > } > >-TSymbol *TSymbolTable::findBuiltIn(const TString &name, int shaderVersion) const >+void TSymbolTable::push() > { >- return findBuiltIn(name, shaderVersion, false); >+ mTable.emplace_back(new TSymbolTableLevel); >+ mPrecisionStack.emplace_back(new PrecisionStackLevel); > } > >-TSymbol *TSymbolTable::findBuiltIn(const TString &name, >- int shaderVersion, >- bool includeGLSLBuiltins) const >+void TSymbolTable::pop() > { >- for (int level = LAST_BUILTIN_LEVEL; level >= 0; level--) >- { >- if (level == GLSL_BUILTINS && !includeGLSLBuiltins) >- level--; >- if (level == ESSL3_1_BUILTINS && shaderVersion != 310) >- level--; >- if (level == ESSL3_BUILTINS && shaderVersion < 300) >- level--; >- if (level == ESSL1_BUILTINS && shaderVersion != 100) >- level--; >- >- TSymbol *symbol = table[level]->find(name); >- >- if (symbol) >- return symbol; >- } >- >- return nullptr; >+ mTable.pop_back(); >+ mPrecisionStack.pop_back(); > } > >-TSymbolTable::~TSymbolTable() >+const TFunction *TSymbolTable::markFunctionHasPrototypeDeclaration( >+ const ImmutableString &mangledName, >+ bool *hadPrototypeDeclarationOut) const > { >- while (table.size() > 0) >- pop(); >+ TFunction *function = findUserDefinedFunction(mangledName); >+ *hadPrototypeDeclarationOut = function->hasPrototypeDeclaration(); >+ function->setHasPrototypeDeclaration(); >+ return function; > } > >-bool IsGenType(const TType *type) >+const TFunction *TSymbolTable::setFunctionParameterNamesFromDefinition(const TFunction *function, >+ bool *wasDefinedOut) const > { >- if (type) >+ TFunction *firstDeclaration = findUserDefinedFunction(function->getMangledName()); >+ ASSERT(firstDeclaration); >+ // Note: 'firstDeclaration' could be 'function' if this is the first time we've seen function as >+ // it would have just been put in the symbol table. Otherwise, we're looking up an earlier >+ // occurance. >+ if (function != firstDeclaration) > { >- TBasicType basicType = type->getBasicType(); >- return basicType == EbtGenType || basicType == EbtGenIType || basicType == EbtGenUType || >- basicType == EbtGenBType; >+ // The previous declaration should have the same parameters as the function definition >+ // (parameter names may differ). >+ firstDeclaration->shareParameters(*function); > } > >- return false; >+ *wasDefinedOut = firstDeclaration->isDefined(); >+ firstDeclaration->setDefined(); >+ return firstDeclaration; > } > >-bool IsVecType(const TType *type) >+bool TSymbolTable::setGlInArraySize(unsigned int inputArraySize) > { >- if (type) >+ if (mGlInVariableWithArraySize) > { >- TBasicType basicType = type->getBasicType(); >- return basicType == EbtVec || basicType == EbtIVec || basicType == EbtUVec || >- basicType == EbtBVec; >+ return mGlInVariableWithArraySize->getType().getOutermostArraySize() == inputArraySize; > } >- >- return false; >+ const TInterfaceBlock *glPerVertex = mVar_gl_PerVertex; >+ TType *glInType = new TType(glPerVertex, EvqPerVertexIn, TLayoutQualifier::Create()); >+ glInType->makeArray(inputArraySize); >+ mGlInVariableWithArraySize = >+ new TVariable(this, ImmutableString("gl_in"), glInType, SymbolType::BuiltIn, >+ TExtension::EXT_geometry_shader); >+ return true; > } > >-const TType *SpecificType(const TType *type, int size) >+TVariable *TSymbolTable::getGlInVariableWithArraySize() const > { >- ASSERT(size >= 1 && size <= 4); >- >- if (!type) >- { >- return nullptr; >- } >- >- ASSERT(!IsVecType(type)); >+ return mGlInVariableWithArraySize; >+} > >- switch (type->getBasicType()) >- { >- case EbtGenType: >- return TCache::getType(EbtFloat, type->getQualifier(), >- static_cast<unsigned char>(size)); >- case EbtGenIType: >- return TCache::getType(EbtInt, type->getQualifier(), static_cast<unsigned char>(size)); >- case EbtGenUType: >- return TCache::getType(EbtUInt, type->getQualifier(), static_cast<unsigned char>(size)); >- case EbtGenBType: >- return TCache::getType(EbtBool, type->getQualifier(), static_cast<unsigned char>(size)); >- default: >- return type; >- } >+const TVariable *TSymbolTable::gl_FragData() const >+{ >+ return mVar_gl_FragData; > } > >-const TType *VectorType(const TType *type, int size) >+const TVariable *TSymbolTable::gl_SecondaryFragDataEXT() const > { >- ASSERT(size >= 2 && size <= 4); >+ return mVar_gl_SecondaryFragDataEXT; >+} > >- if (!type) >+TSymbolTable::VariableMetadata *TSymbolTable::getOrCreateVariableMetadata(const TVariable &variable) >+{ >+ int id = variable.uniqueId().get(); >+ auto iter = mVariableMetadata.find(id); >+ if (iter == mVariableMetadata.end()) > { >- return nullptr; >+ iter = mVariableMetadata.insert(std::make_pair(id, VariableMetadata())).first; > } >+ return &iter->second; >+} > >- ASSERT(!IsGenType(type)); >- >- switch (type->getBasicType()) >- { >- case EbtVec: >- return TCache::getType(EbtFloat, static_cast<unsigned char>(size)); >- case EbtIVec: >- return TCache::getType(EbtInt, static_cast<unsigned char>(size)); >- case EbtUVec: >- return TCache::getType(EbtUInt, static_cast<unsigned char>(size)); >- case EbtBVec: >- return TCache::getType(EbtBool, static_cast<unsigned char>(size)); >- default: >- return type; >- } >+void TSymbolTable::markStaticWrite(const TVariable &variable) >+{ >+ auto metadata = getOrCreateVariableMetadata(variable); >+ metadata->staticWrite = true; > } > >-TVariable *TSymbolTable::declareVariable(const TString *name, const TType &type) >+void TSymbolTable::markStaticRead(const TVariable &variable) > { >- return insertVariable(currentLevel(), name, type); >+ auto metadata = getOrCreateVariableMetadata(variable); >+ metadata->staticRead = true; > } > >-TVariable *TSymbolTable::declareStructType(TStructure *str) >+bool TSymbolTable::isStaticallyUsed(const TVariable &variable) const > { >- return insertStructType(currentLevel(), str); >+ ASSERT(!variable.getConstPointer()); >+ int id = variable.uniqueId().get(); >+ auto iter = mVariableMetadata.find(id); >+ return iter != mVariableMetadata.end() && (iter->second.staticRead || iter->second.staticWrite); > } > >-TInterfaceBlockName *TSymbolTable::declareInterfaceBlockName(const TString *name) >+void TSymbolTable::addInvariantVarying(const TVariable &variable) > { >- TInterfaceBlockName *blockNameSymbol = new TInterfaceBlockName(this, name); >- if (insert(currentLevel(), blockNameSymbol)) >- { >- return blockNameSymbol; >- } >- return nullptr; >+ ASSERT(atGlobalLevel()); >+ auto metadata = getOrCreateVariableMetadata(variable); >+ metadata->invariant = true; > } > >-TInterfaceBlockName *TSymbolTable::insertInterfaceBlockNameExt(ESymbolLevel level, >- TExtension ext, >- const TString *name) >+bool TSymbolTable::isVaryingInvariant(const TVariable &variable) const > { >- TInterfaceBlockName *blockNameSymbol = new TInterfaceBlockName(this, name); >- if (insert(level, ext, blockNameSymbol)) >+ ASSERT(atGlobalLevel()); >+ if (mGlobalInvariant) > { >- return blockNameSymbol; >+ return true; > } >- return nullptr; >+ int id = variable.uniqueId().get(); >+ auto iter = mVariableMetadata.find(id); >+ return iter != mVariableMetadata.end() && iter->second.invariant; > } > >-TVariable *TSymbolTable::insertVariable(ESymbolLevel level, const char *name, const TType &type) >+void TSymbolTable::setGlobalInvariant(bool invariant) > { >- return insertVariable(level, NewPoolTString(name), type); >+ ASSERT(atGlobalLevel()); >+ mGlobalInvariant = invariant; > } > >-TVariable *TSymbolTable::insertVariable(ESymbolLevel level, const TString *name, const TType &type) >+const TSymbol *TSymbolTable::find(const ImmutableString &name, int shaderVersion) const > { >- TVariable *var = new TVariable(this, name, type); >- if (insert(level, var)) >+ const TSymbol *userSymbol = findUserDefined(name); >+ if (userSymbol) > { >- // Do lazy initialization for struct types, so we allocate to the current scope. >- if (var->getType().getBasicType() == EbtStruct) >- { >- var->getType().realize(); >- } >- return var; >+ return userSymbol; > } >- return nullptr; >+ >+ return findBuiltIn(name, shaderVersion); > } > >-TVariable *TSymbolTable::insertVariableExt(ESymbolLevel level, >- TExtension ext, >- const char *name, >- const TType &type) >+const TSymbol *TSymbolTable::findUserDefined(const ImmutableString &name) const > { >- TVariable *var = new TVariable(this, NewPoolTString(name), type); >- if (insert(level, ext, var)) >+ int userDefinedLevel = static_cast<int>(mTable.size()) - 1; >+ while (userDefinedLevel >= 0) > { >- if (var->getType().getBasicType() == EbtStruct) >+ const TSymbol *symbol = mTable[userDefinedLevel]->find(name); >+ if (symbol) > { >- var->getType().realize(); >+ return symbol; > } >- return var; >+ userDefinedLevel--; > } >+ > return nullptr; > } > >-TVariable *TSymbolTable::insertStructType(ESymbolLevel level, TStructure *str) >+TFunction *TSymbolTable::findUserDefinedFunction(const ImmutableString &name) const > { >- TVariable *var = new TVariable(this, &str->name(), TType(str), true); >- if (insert(level, var)) >- { >- var->getType().realize(); >- return var; >- } >- return nullptr; >+ // User-defined functions are always declared at the global level. >+ ASSERT(!mTable.empty()); >+ return static_cast<TFunction *>(mTable[0]->find(name)); > } > >-void TSymbolTable::insertBuiltIn(ESymbolLevel level, >- TOperator op, >- TExtension ext, >- const TType *rvalue, >- const char *name, >- const TType *ptype1, >- const TType *ptype2, >- const TType *ptype3, >- const TType *ptype4, >- const TType *ptype5) >+const TSymbol *TSymbolTable::findGlobal(const ImmutableString &name) const > { >- if (ptype1->getBasicType() == EbtGSampler2D) >- { >- insertUnmangledBuiltInName(name, level); >- bool gvec4 = (rvalue->getBasicType() == EbtGVec4); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name, >- TCache::getType(EbtSampler2D), ptype2, ptype3, ptype4, ptype5); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name, >- TCache::getType(EbtISampler2D), ptype2, ptype3, ptype4, ptype5); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name, >- TCache::getType(EbtUSampler2D), ptype2, ptype3, ptype4, ptype5); >- } >- else if (ptype1->getBasicType() == EbtGSampler3D) >- { >- insertUnmangledBuiltInName(name, level); >- bool gvec4 = (rvalue->getBasicType() == EbtGVec4); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name, >- TCache::getType(EbtSampler3D), ptype2, ptype3, ptype4, ptype5); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name, >- TCache::getType(EbtISampler3D), ptype2, ptype3, ptype4, ptype5); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name, >- TCache::getType(EbtUSampler3D), ptype2, ptype3, ptype4, ptype5); >- } >- else if (ptype1->getBasicType() == EbtGSamplerCube) >- { >- insertUnmangledBuiltInName(name, level); >- bool gvec4 = (rvalue->getBasicType() == EbtGVec4); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name, >- TCache::getType(EbtSamplerCube), ptype2, ptype3, ptype4, ptype5); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name, >- TCache::getType(EbtISamplerCube), ptype2, ptype3, ptype4, ptype5); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name, >- TCache::getType(EbtUSamplerCube), ptype2, ptype3, ptype4, ptype5); >- } >- else if (ptype1->getBasicType() == EbtGSampler2DArray) >- { >- insertUnmangledBuiltInName(name, level); >- bool gvec4 = (rvalue->getBasicType() == EbtGVec4); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name, >- TCache::getType(EbtSampler2DArray), ptype2, ptype3, ptype4, ptype5); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name, >- TCache::getType(EbtISampler2DArray), ptype2, ptype3, ptype4, ptype5); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name, >- TCache::getType(EbtUSampler2DArray), ptype2, ptype3, ptype4, ptype5); >- } >- else if (ptype1->getBasicType() == EbtGSampler2DMS) >- { >- insertUnmangledBuiltInName(name, level); >- bool gvec4 = (rvalue->getBasicType() == EbtGVec4); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name, >- TCache::getType(EbtSampler2DMS), ptype2, ptype3, ptype4, ptype5); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name, >- TCache::getType(EbtISampler2DMS), ptype2, ptype3, ptype4, ptype5); >- insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name, >- TCache::getType(EbtUSampler2DMS), ptype2, ptype3, ptype4, ptype5); >- } >- else if (IsGImage(ptype1->getBasicType())) >- { >- insertUnmangledBuiltInName(name, level); >- >- const TType *floatType = TCache::getType(EbtFloat, 4); >- const TType *intType = TCache::getType(EbtInt, 4); >- const TType *unsignedType = TCache::getType(EbtUInt, 4); >- >- const TType *floatImage = >- TCache::getType(convertGImageToFloatImage(ptype1->getBasicType())); >- const TType *intImage = TCache::getType(convertGImageToIntImage(ptype1->getBasicType())); >- const TType *unsignedImage = >- TCache::getType(convertGImageToUnsignedImage(ptype1->getBasicType())); >- >- // GLSL ES 3.10, Revision 4, 8.12 Image Functions >- if (rvalue->getBasicType() == EbtGVec4) >- { >- // imageLoad >- insertBuiltIn(level, floatType, name, floatImage, ptype2, ptype3, ptype4, ptype5); >- insertBuiltIn(level, intType, name, intImage, ptype2, ptype3, ptype4, ptype5); >- insertBuiltIn(level, unsignedType, name, unsignedImage, ptype2, ptype3, ptype4, ptype5); >- } >- else if (rvalue->getBasicType() == EbtVoid) >- { >- // imageStore >- insertBuiltIn(level, rvalue, name, floatImage, ptype2, floatType, ptype4, ptype5); >- insertBuiltIn(level, rvalue, name, intImage, ptype2, intType, ptype4, ptype5); >- insertBuiltIn(level, rvalue, name, unsignedImage, ptype2, unsignedType, ptype4, ptype5); >- } >- else >- { >- // imageSize >- insertBuiltIn(level, rvalue, name, floatImage, ptype2, ptype3, ptype4, ptype5); >- insertBuiltIn(level, rvalue, name, intImage, ptype2, ptype3, ptype4, ptype5); >- insertBuiltIn(level, rvalue, name, unsignedImage, ptype2, ptype3, ptype4, ptype5); >- } >- } >- else if (IsGenType(rvalue) || IsGenType(ptype1) || IsGenType(ptype2) || IsGenType(ptype3) || >- IsGenType(ptype4)) >- { >- ASSERT(!ptype5); >- insertUnmangledBuiltInName(name, level); >- insertBuiltIn(level, op, ext, SpecificType(rvalue, 1), name, SpecificType(ptype1, 1), >- SpecificType(ptype2, 1), SpecificType(ptype3, 1), SpecificType(ptype4, 1)); >- insertBuiltIn(level, op, ext, SpecificType(rvalue, 2), name, SpecificType(ptype1, 2), >- SpecificType(ptype2, 2), SpecificType(ptype3, 2), SpecificType(ptype4, 2)); >- insertBuiltIn(level, op, ext, SpecificType(rvalue, 3), name, SpecificType(ptype1, 3), >- SpecificType(ptype2, 3), SpecificType(ptype3, 3), SpecificType(ptype4, 3)); >- insertBuiltIn(level, op, ext, SpecificType(rvalue, 4), name, SpecificType(ptype1, 4), >- SpecificType(ptype2, 4), SpecificType(ptype3, 4), SpecificType(ptype4, 4)); >- } >- else if (IsVecType(rvalue) || IsVecType(ptype1) || IsVecType(ptype2) || IsVecType(ptype3)) >- { >- ASSERT(!ptype4 && !ptype5); >- insertUnmangledBuiltInName(name, level); >- insertBuiltIn(level, op, ext, VectorType(rvalue, 2), name, VectorType(ptype1, 2), >- VectorType(ptype2, 2), VectorType(ptype3, 2)); >- insertBuiltIn(level, op, ext, VectorType(rvalue, 3), name, VectorType(ptype1, 3), >- VectorType(ptype2, 3), VectorType(ptype3, 3)); >- insertBuiltIn(level, op, ext, VectorType(rvalue, 4), name, VectorType(ptype1, 4), >- VectorType(ptype2, 4), VectorType(ptype3, 4)); >- } >- else >- { >- TFunction *function = new TFunction(this, NewPoolTString(name), rvalue, op, ext); >- >- function->addParameter(TConstParameter(ptype1)); >- >- if (ptype2) >- { >- function->addParameter(TConstParameter(ptype2)); >- } >- >- if (ptype3) >- { >- function->addParameter(TConstParameter(ptype3)); >- } >- >- if (ptype4) >- { >- function->addParameter(TConstParameter(ptype4)); >- } >- >- if (ptype5) >- { >- function->addParameter(TConstParameter(ptype5)); >- } >- >- ASSERT(hasUnmangledBuiltInAtLevel(name, level)); >- insert(level, function); >- } >+ ASSERT(!mTable.empty()); >+ return mTable[0]->find(name); > } > >-void TSymbolTable::insertBuiltInOp(ESymbolLevel level, >- TOperator op, >- const TType *rvalue, >- const TType *ptype1, >- const TType *ptype2, >- const TType *ptype3, >- const TType *ptype4, >- const TType *ptype5) >+bool TSymbolTable::declare(TSymbol *symbol) > { >- const char *name = GetOperatorString(op); >- ASSERT(strlen(name) > 0); >- insertUnmangledBuiltInName(name, level); >- insertBuiltIn(level, op, TExtension::UNDEFINED, rvalue, name, ptype1, ptype2, ptype3, ptype4, >- ptype5); >+ ASSERT(!mTable.empty()); >+ ASSERT(symbol->symbolType() == SymbolType::UserDefined); >+ ASSERT(!symbol->isFunction()); >+ return mTable.back()->insert(symbol); > } > >-void TSymbolTable::insertBuiltInOp(ESymbolLevel level, >- TOperator op, >- TExtension ext, >- const TType *rvalue, >- const TType *ptype1, >- const TType *ptype2, >- const TType *ptype3, >- const TType *ptype4, >- const TType *ptype5) >+bool TSymbolTable::declareInternal(TSymbol *symbol) > { >- const char *name = GetOperatorString(op); >- insertUnmangledBuiltInName(name, level); >- insertBuiltIn(level, op, ext, rvalue, name, ptype1, ptype2, ptype3, ptype4, ptype5); >+ ASSERT(!mTable.empty()); >+ ASSERT(symbol->symbolType() == SymbolType::AngleInternal); >+ ASSERT(!symbol->isFunction()); >+ return mTable.back()->insert(symbol); > } > >-void TSymbolTable::insertBuiltInFunctionNoParameters(ESymbolLevel level, >- TOperator op, >- const TType *rvalue, >- const char *name) >+void TSymbolTable::declareUserDefinedFunction(TFunction *function, bool insertUnmangledName) > { >- insertUnmangledBuiltInName(name, level); >- insert(level, new TFunction(this, NewPoolTString(name), rvalue, op)); >+ ASSERT(!mTable.empty()); >+ if (insertUnmangledName) >+ { >+ // Insert the unmangled name to detect potential future redefinition as a variable. >+ mTable[0]->insertUnmangled(function); >+ } >+ mTable[0]->insert(function); > } > >-void TSymbolTable::insertBuiltInFunctionNoParametersExt(ESymbolLevel level, >- TExtension ext, >- TOperator op, >- const TType *rvalue, >- const char *name) >+void TSymbolTable::setDefaultPrecision(TBasicType type, TPrecision prec) > { >- insertUnmangledBuiltInName(name, level); >- insert(level, new TFunction(this, NewPoolTString(name), rvalue, op, ext)); >+ int indexOfLastElement = static_cast<int>(mPrecisionStack.size()) - 1; >+ // Uses map operator [], overwrites the current value >+ (*mPrecisionStack[indexOfLastElement])[type] = prec; > } > > TPrecision TSymbolTable::getDefaultPrecision(TBasicType type) const >@@ -563,14 +293,14 @@ TPrecision TSymbolTable::getDefaultPrecision(TBasicType type) const > // unsigned integers use the same precision as signed > TBasicType baseType = (type == EbtUInt) ? EbtInt : type; > >- int level = static_cast<int>(precisionStack.size()) - 1; >- assert(level >= 0); // Just to be safe. Should not happen. >+ int level = static_cast<int>(mPrecisionStack.size()) - 1; >+ ASSERT(level >= 0); // Just to be safe. Should not happen. > // If we dont find anything we return this. Some types don't have predefined default precision. > TPrecision prec = EbpUndefined; > while (level >= 0) > { >- PrecisionStackLevel::iterator it = precisionStack[level]->find(baseType); >- if (it != precisionStack[level]->end()) >+ PrecisionStackLevel::iterator it = mPrecisionStack[level]->find(baseType); >+ if (it != mPrecisionStack[level]->end()) > { > prec = (*it).second; > break; >@@ -580,43 +310,72 @@ TPrecision TSymbolTable::getDefaultPrecision(TBasicType type) const > return prec; > } > >-void TSymbolTable::insertUnmangledBuiltInName(const char *name, ESymbolLevel level) >+void TSymbolTable::clearCompilationResults() > { >- ASSERT(level >= 0 && level < static_cast<ESymbolLevel>(table.size())); >- table[level]->insertUnmangledBuiltInName(std::string(name)); >+ mGlobalInvariant = false; >+ mUniqueIdCounter = kLastBuiltInId + 1; >+ mVariableMetadata.clear(); >+ mGlInVariableWithArraySize = nullptr; >+ >+ // User-defined scopes should have already been cleared when the compilation finished. >+ ASSERT(mTable.empty()); > } > >-bool TSymbolTable::hasUnmangledBuiltInAtLevel(const char *name, ESymbolLevel level) >+int TSymbolTable::nextUniqueIdValue() > { >- ASSERT(level >= 0 && level < static_cast<ESymbolLevel>(table.size())); >- return table[level]->hasUnmangledBuiltIn(std::string(name)); >+ ASSERT(mUniqueIdCounter < std::numeric_limits<int>::max()); >+ return ++mUniqueIdCounter; > } > >-bool TSymbolTable::hasUnmangledBuiltInForShaderVersion(const char *name, int shaderVersion) >+void TSymbolTable::initializeBuiltIns(sh::GLenum type, >+ ShShaderSpec spec, >+ const ShBuiltInResources &resources) > { >- ASSERT(static_cast<ESymbolLevel>(table.size()) > LAST_BUILTIN_LEVEL); >+ mShaderType = type; >+ mResources = resources; > >- for (int level = LAST_BUILTIN_LEVEL; level >= 0; --level) >- { >- if (level == ESSL3_1_BUILTINS && shaderVersion != 310) >- { >- --level; >- } >- if (level == ESSL3_BUILTINS && shaderVersion < 300) >- { >- --level; >- } >- if (level == ESSL1_BUILTINS && shaderVersion != 100) >- { >- --level; >- } >+ // We need just one precision stack level for predefined precisions. >+ mPrecisionStack.emplace_back(new PrecisionStackLevel); > >- if (table[level]->hasUnmangledBuiltIn(name)) >- { >- return true; >- } >+ switch (type) >+ { >+ case GL_FRAGMENT_SHADER: >+ setDefaultPrecision(EbtInt, EbpMedium); >+ break; >+ case GL_VERTEX_SHADER: >+ case GL_COMPUTE_SHADER: >+ case GL_GEOMETRY_SHADER_EXT: >+ setDefaultPrecision(EbtInt, EbpHigh); >+ setDefaultPrecision(EbtFloat, EbpHigh); >+ break; >+ default: >+ UNREACHABLE(); > } >- return false; >+ // Set defaults for sampler types that have default precision, even those that are >+ // only available if an extension exists. >+ // New sampler types in ESSL3 don't have default precision. ESSL1 types do. >+ initSamplerDefaultPrecision(EbtSampler2D); >+ initSamplerDefaultPrecision(EbtSamplerCube); >+ // SamplerExternalOES is specified in the extension to have default precision. >+ initSamplerDefaultPrecision(EbtSamplerExternalOES); >+ // SamplerExternal2DY2YEXT is specified in the extension to have default precision. >+ initSamplerDefaultPrecision(EbtSamplerExternal2DY2YEXT); >+ // It isn't specified whether Sampler2DRect has default precision. >+ initSamplerDefaultPrecision(EbtSampler2DRect); >+ >+ setDefaultPrecision(EbtAtomicCounter, EbpHigh); >+ >+ initializeBuiltInVariables(type, spec, resources); >+ mUniqueIdCounter = kLastBuiltInId + 1; >+} >+ >+void TSymbolTable::initSamplerDefaultPrecision(TBasicType samplerType) >+{ >+ ASSERT(samplerType >= EbtGuardSamplerBegin && samplerType <= EbtGuardSamplerEnd); >+ setDefaultPrecision(samplerType, EbpLow); > } > >+TSymbolTable::VariableMetadata::VariableMetadata() >+ : staticRead(false), staticWrite(false), invariant(false) >+{} > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.h b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.h >index 5d792ec188b..f984b9e694e 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.h >@@ -30,514 +30,167 @@ > // are tracked in the intermediate representation, not the symbol table. > // > >-#include <array> >-#include <assert.h> >+#include <memory> > #include <set> > > #include "common/angleutils.h" > #include "compiler/translator/ExtensionBehavior.h" >+#include "compiler/translator/ImmutableString.h" > #include "compiler/translator/InfoSink.h" > #include "compiler/translator/IntermNode.h" >-#include "compiler/translator/SymbolUniqueId.h" >+#include "compiler/translator/Symbol.h" >+#include "compiler/translator/SymbolTable_autogen.h" > > namespace sh > { > >-// Symbol base class. (Can build functions or variables out of these...) >-class TSymbol : angle::NonCopyable >-{ >- public: >- POOL_ALLOCATOR_NEW_DELETE(); >- TSymbol(TSymbolTable *symbolTable, const TString *n); >- >- virtual ~TSymbol() >- { >- // don't delete name, it's from the pool >- } >- >- const TString &getName() const { return *name; } >- virtual const TString &getMangledName() const { return getName(); } >- virtual bool isFunction() const { return false; } >- virtual bool isVariable() const { return false; } >- const TSymbolUniqueId &getUniqueId() const { return uniqueId; } >- void relateToExtension(TExtension ext) { extension = ext; } >- TExtension getExtension() const { return extension; } >- >- private: >- const TSymbolUniqueId uniqueId; >- const TString *name; >- TExtension extension; >-}; >- >-// Variable, meaning a symbol that's not a function. >-// >-// May store the value of a constant variable of any type (float, int, bool or struct). >-class TVariable : public TSymbol >-{ >- public: >- ~TVariable() override {} >- bool isVariable() const override { return true; } >- TType &getType() { return type; } >- const TType &getType() const { return type; } >- bool isUserType() const { return userType; } >- void setQualifier(TQualifier qualifier) { type.setQualifier(qualifier); } >- >- const TConstantUnion *getConstPointer() const { return unionArray; } >- >- void shareConstPointer(const TConstantUnion *constArray) { unionArray = constArray; } >- >- private: >- friend class TSymbolTable; >- >- TVariable(TSymbolTable *symbolTable, >- const TString *name, >- const TType &t, >- bool isUserTypeDefinition = false) >- : TSymbol(symbolTable, name), type(t), userType(isUserTypeDefinition), unionArray(0) >- { >- } >- >- TType type; >- >- // Set to true if this represents a struct type, as opposed to a variable. >- bool userType; >- >- // we are assuming that Pool Allocator will free the memory >- // allocated to unionArray when this object is destroyed. >- const TConstantUnion *unionArray; >-}; >- >-// Immutable version of TParameter. >-struct TConstParameter >-{ >- TConstParameter() : name(nullptr), type(nullptr) {} >- explicit TConstParameter(const TString *n) : name(n), type(nullptr) {} >- explicit TConstParameter(const TType *t) : name(nullptr), type(t) {} >- TConstParameter(const TString *n, const TType *t) : name(n), type(t) {} >- >- // Both constructor arguments must be const. >- TConstParameter(TString *n, TType *t) = delete; >- TConstParameter(const TString *n, TType *t) = delete; >- TConstParameter(TString *n, const TType *t) = delete; >- >- const TString *const name; >- const TType *const type; >-}; >- >-// The function sub-class of symbols and the parser will need to >-// share this definition of a function parameter. >-struct TParameter >-{ >- // Destructively converts to TConstParameter. >- // This method resets name and type to nullptrs to make sure >- // their content cannot be modified after the call. >- TConstParameter turnToConst() >- { >- const TString *constName = name; >- const TType *constType = type; >- name = nullptr; >- type = nullptr; >- return TConstParameter(constName, constType); >- } >- >- const TString *name; >- TType *type; >-}; >- >-// The function sub-class of a symbol. >-class TFunction : public TSymbol >-{ >- public: >- TFunction(TSymbolTable *symbolTable, >- const TString *name, >- const TType *retType, >- TOperator tOp = EOpNull, >- TExtension ext = TExtension::UNDEFINED) >- : TSymbol(symbolTable, name), >- returnType(retType), >- mangledName(nullptr), >- op(tOp), >- defined(false), >- mHasPrototypeDeclaration(false) >- { >- relateToExtension(ext); >- } >- ~TFunction() override; >- bool isFunction() const override { return true; } >- >- void addParameter(const TConstParameter &p) >- { >- parameters.push_back(p); >- mangledName = nullptr; >- } >- >- void swapParameters(const TFunction ¶metersSource); >- >- const TString &getMangledName() const override >- { >- if (mangledName == nullptr) >- { >- mangledName = buildMangledName(); >- } >- return *mangledName; >- } >- >- static const TString &GetMangledNameFromCall(const TString &functionName, >- const TIntermSequence &arguments); >- >- const TType &getReturnType() const { return *returnType; } >- >- TOperator getBuiltInOp() const { return op; } >- >- void setDefined() { defined = true; } >- bool isDefined() { return defined; } >- void setHasPrototypeDeclaration() { mHasPrototypeDeclaration = true; } >- bool hasPrototypeDeclaration() const { return mHasPrototypeDeclaration; } >- >- size_t getParamCount() const { return parameters.size(); } >- const TConstParameter &getParam(size_t i) const { return parameters[i]; } >- >- private: >- void clearParameters(); >- >- const TString *buildMangledName() const; >- >- typedef TVector<TConstParameter> TParamList; >- TParamList parameters; >- const TType *returnType; >- mutable const TString *mangledName; >- TOperator op; >- bool defined; >- bool mHasPrototypeDeclaration; >-}; >+// Define ESymbolLevel as int rather than an enum so that we can do arithmetic on it. >+typedef int ESymbolLevel; >+const int COMMON_BUILTINS = 0; >+const int ESSL1_BUILTINS = 1; >+const int ESSL3_BUILTINS = 2; >+const int ESSL3_1_BUILTINS = 3; >+// GLSL_BUILTINS are desktop GLSL builtins that don't exist in ESSL but are used to implement >+// features in ANGLE's GLSL backend. They're not visible to the parser. >+const int GLSL_BUILTINS = 4; >+const int LAST_BUILTIN_LEVEL = GLSL_BUILTINS; > >-// Interface block name sub-symbol >-class TInterfaceBlockName : public TSymbol >+struct UnmangledBuiltIn > { >- public: >- virtual ~TInterfaceBlockName() {} >+ constexpr UnmangledBuiltIn(TExtension extension) : extension(extension) {} > >- private: >- friend class TSymbolTable; >- TInterfaceBlockName(TSymbolTable *symbolTable, const TString *name) : TSymbol(symbolTable, name) >- { >- } >+ TExtension extension; > }; > >-class TSymbolTableLevel >+class TSymbolTable : angle::NonCopyable, TSymbolTableBase > { > public: >- typedef TUnorderedMap<TString, TSymbol *> tLevel; >- typedef tLevel::const_iterator const_iterator; >- typedef const tLevel::value_type tLevelPair; >- typedef std::pair<tLevel::iterator, bool> tInsertResult; >+ TSymbolTable(); >+ // To start using the symbol table after construction: >+ // * initializeBuiltIns() needs to be called. >+ // * push() needs to be called to push the global level. > >- TSymbolTableLevel() : mGlobalInvariant(false) {} >- ~TSymbolTableLevel(); >+ ~TSymbolTable(); > >- bool insert(TSymbol *symbol); >+ bool isEmpty() const; >+ bool atGlobalLevel() const; > >- // Insert a function using its unmangled name as the key. >- bool insertUnmangled(TFunction *function); >+ void push(); >+ void pop(); > >- TSymbol *find(const TString &name) const; >+ // Declare a non-function symbol at the current scope. Return true in case the declaration was >+ // successful, and false if the declaration failed due to redefinition. >+ bool declare(TSymbol *symbol); > >- void addInvariantVarying(const std::string &name) { mInvariantVaryings.insert(name); } >+ // Only used to declare internal variables. >+ bool declareInternal(TSymbol *symbol); > >- bool isVaryingInvariant(const std::string &name) >- { >- return (mGlobalInvariant || mInvariantVaryings.count(name) > 0); >- } >+ // Functions are always declared at global scope. >+ void declareUserDefinedFunction(TFunction *function, bool insertUnmangledName); > >- void setGlobalInvariant(bool invariant) { mGlobalInvariant = invariant; } >+ // These return the TFunction pointer to keep using to refer to this function. >+ const TFunction *markFunctionHasPrototypeDeclaration(const ImmutableString &mangledName, >+ bool *hadPrototypeDeclarationOut) const; >+ const TFunction *setFunctionParameterNamesFromDefinition(const TFunction *function, >+ bool *wasDefinedOut) const; > >- void insertUnmangledBuiltInName(const std::string &name) >- { >- mUnmangledBuiltInNames.insert(name); >- } >+ // Return false if the gl_in array size has already been initialized with a mismatching value. >+ bool setGlInArraySize(unsigned int inputArraySize); >+ TVariable *getGlInVariableWithArraySize() const; > >- bool hasUnmangledBuiltIn(const std::string &name) >- { >- return mUnmangledBuiltInNames.count(name) > 0; >- } >+ const TVariable *gl_FragData() const; >+ const TVariable *gl_SecondaryFragDataEXT() const; > >- protected: >- tLevel level; >- std::set<std::string> mInvariantVaryings; >- bool mGlobalInvariant; >+ void markStaticRead(const TVariable &variable); >+ void markStaticWrite(const TVariable &variable); > >- private: >- std::set<std::string> mUnmangledBuiltInNames; >-}; >+ // Note: Should not call this for constant variables. >+ bool isStaticallyUsed(const TVariable &variable) const; > >-// Define ESymbolLevel as int rather than an enum since level can go >-// above GLOBAL_LEVEL and cause atBuiltInLevel() to fail if the >-// compiler optimizes the >= of the last element to ==. >-typedef int ESymbolLevel; >-const int COMMON_BUILTINS = 0; >-const int ESSL1_BUILTINS = 1; >-const int ESSL3_BUILTINS = 2; >-const int ESSL3_1_BUILTINS = 3; >-// GLSL_BUILTINS are desktop GLSL builtins that don't exist in ESSL but are used to implement >-// features in ANGLE's GLSL backend. They're not visible to the parser. >-const int GLSL_BUILTINS = 4; >-const int LAST_BUILTIN_LEVEL = GLSL_BUILTINS; >-const int GLOBAL_LEVEL = 5; >+ // find() is guaranteed not to retain a reference to the ImmutableString, so an ImmutableString >+ // with a reference to a short-lived char * is fine to pass here. >+ const TSymbol *find(const ImmutableString &name, int shaderVersion) const; > >-class TSymbolTable : angle::NonCopyable >-{ >- public: >- TSymbolTable() : mUniqueIdCounter(0), mEmptySymbolId(this) >- { >- // The symbol table cannot be used until push() is called, but >- // the lack of an initial call to push() can be used to detect >- // that the symbol table has not been preloaded with built-ins. >- } >+ const TSymbol *findUserDefined(const ImmutableString &name) const; > >- ~TSymbolTable(); >+ TFunction *findUserDefinedFunction(const ImmutableString &name) const; > >- // When the symbol table is initialized with the built-ins, there should >- // 'push' calls, so that built-ins are at level 0 and the shader >- // globals are at level 1. >- bool isEmpty() const { return table.empty(); } >- bool atBuiltInLevel() const { return currentLevel() <= LAST_BUILTIN_LEVEL; } >- bool atGlobalLevel() const { return currentLevel() == GLOBAL_LEVEL; } >- void push() >- { >- table.push_back(new TSymbolTableLevel); >- precisionStack.push_back(new PrecisionStackLevel); >- } >+ const TSymbol *findGlobal(const ImmutableString &name) const; > >- void pop() >- { >- delete table.back(); >- table.pop_back(); >- >- delete precisionStack.back(); >- precisionStack.pop_back(); >- } >- >- // The declare* entry points are used when parsing and declare symbols at the current scope. >- // They return the created symbol in case the declaration was successful, and nullptr if the >- // declaration failed due to redefinition. >- TVariable *declareVariable(const TString *name, const TType &type); >- TVariable *declareStructType(TStructure *str); >- TInterfaceBlockName *declareInterfaceBlockName(const TString *name); >- >- // The insert* entry points are used when initializing the symbol table with built-ins. >- // They return the created symbol in case the declaration was successful, and nullptr if the >- // declaration failed due to redefinition. >- TVariable *insertVariable(ESymbolLevel level, const char *name, const TType &type); >- TVariable *insertVariableExt(ESymbolLevel level, >- TExtension ext, >- const char *name, >- const TType &type); >- TVariable *insertStructType(ESymbolLevel level, TStructure *str); >- TInterfaceBlockName *insertInterfaceBlockNameExt(ESymbolLevel level, >- TExtension ext, >- const TString *name); >- >- bool insertConstInt(ESymbolLevel level, const char *name, int value, TPrecision precision) >- { >- TVariable *constant = >- new TVariable(this, NewPoolTString(name), TType(EbtInt, precision, EvqConst, 1)); >- TConstantUnion *unionArray = new TConstantUnion[1]; >- unionArray[0].setIConst(value); >- constant->shareConstPointer(unionArray); >- return insert(level, constant); >- } >- >- bool insertConstIntExt(ESymbolLevel level, >- TExtension ext, >- const char *name, >- int value, >- TPrecision precision) >- { >- TVariable *constant = >- new TVariable(this, NewPoolTString(name), TType(EbtInt, precision, EvqConst, 1)); >- TConstantUnion *unionArray = new TConstantUnion[1]; >- unionArray[0].setIConst(value); >- constant->shareConstPointer(unionArray); >- return insert(level, ext, constant); >- } >- >- bool insertConstIvec3(ESymbolLevel level, >- const char *name, >- const std::array<int, 3> &values, >- TPrecision precision) >- { >- TVariable *constantIvec3 = >- new TVariable(this, NewPoolTString(name), TType(EbtInt, precision, EvqConst, 3)); >- >- TConstantUnion *unionArray = new TConstantUnion[3]; >- for (size_t index = 0u; index < 3u; ++index) >- { >- unionArray[index].setIConst(values[index]); >- } >- constantIvec3->shareConstPointer(unionArray); >- >- return insert(level, constantIvec3); >- } >- >- void insertBuiltIn(ESymbolLevel level, >- TOperator op, >- TExtension ext, >- const TType *rvalue, >- const char *name, >- const TType *ptype1, >- const TType *ptype2 = 0, >- const TType *ptype3 = 0, >- const TType *ptype4 = 0, >- const TType *ptype5 = 0); >- >- void insertBuiltIn(ESymbolLevel level, >- const TType *rvalue, >- const char *name, >- const TType *ptype1, >- const TType *ptype2 = 0, >- const TType *ptype3 = 0, >- const TType *ptype4 = 0, >- const TType *ptype5 = 0) >- { >- insertUnmangledBuiltInName(name, level); >- insertBuiltIn(level, EOpNull, TExtension::UNDEFINED, rvalue, name, ptype1, ptype2, ptype3, >- ptype4, ptype5); >- } >- >- void insertBuiltIn(ESymbolLevel level, >- TExtension ext, >- const TType *rvalue, >- const char *name, >- const TType *ptype1, >- const TType *ptype2 = 0, >- const TType *ptype3 = 0, >- const TType *ptype4 = 0, >- const TType *ptype5 = 0) >- { >- insertUnmangledBuiltInName(name, level); >- insertBuiltIn(level, EOpNull, ext, rvalue, name, ptype1, ptype2, ptype3, ptype4, ptype5); >- } >- >- void insertBuiltInOp(ESymbolLevel level, >- TOperator op, >- const TType *rvalue, >- const TType *ptype1, >- const TType *ptype2 = 0, >- const TType *ptype3 = 0, >- const TType *ptype4 = 0, >- const TType *ptype5 = 0); >- >- void insertBuiltInOp(ESymbolLevel level, >- TOperator op, >- TExtension ext, >- const TType *rvalue, >- const TType *ptype1, >- const TType *ptype2 = 0, >- const TType *ptype3 = 0, >- const TType *ptype4 = 0, >- const TType *ptype5 = 0); >- >- void insertBuiltInFunctionNoParameters(ESymbolLevel level, >- TOperator op, >- const TType *rvalue, >- const char *name); >- >- void insertBuiltInFunctionNoParametersExt(ESymbolLevel level, >- TExtension ext, >- TOperator op, >- const TType *rvalue, >- const char *name); >- >- TSymbol *find(const TString &name, >- int shaderVersion, >- bool *builtIn = nullptr, >- bool *sameScope = nullptr) const; >- >- TSymbol *findGlobal(const TString &name) const; >- >- TSymbol *findBuiltIn(const TString &name, int shaderVersion) const; >- >- TSymbol *findBuiltIn(const TString &name, int shaderVersion, bool includeGLSLBuiltins) const; >- >- TSymbolTableLevel *getOuterLevel() >- { >- assert(currentLevel() >= 1); >- return table[currentLevel() - 1]; >- } >+ const TSymbol *findBuiltIn(const ImmutableString &name, int shaderVersion) const; > >- void setDefaultPrecision(TBasicType type, TPrecision prec) >- { >- int indexOfLastElement = static_cast<int>(precisionStack.size()) - 1; >- // Uses map operator [], overwrites the current value >- (*precisionStack[indexOfLastElement])[type] = prec; >- } >+ void setDefaultPrecision(TBasicType type, TPrecision prec); > > // Searches down the precisionStack for a precision qualifier > // for the specified TBasicType > TPrecision getDefaultPrecision(TBasicType type) const; > >- // This records invariant varyings declared through >- // "invariant varying_name;". >- void addInvariantVarying(const std::string &originalName) >- { >- ASSERT(atGlobalLevel()); >- table[currentLevel()]->addInvariantVarying(originalName); >- } >- // If this returns false, the varying could still be invariant >- // if it is set as invariant during the varying variable >- // declaration - this piece of information is stored in the >- // variable's type, not here. >- bool isVaryingInvariant(const std::string &originalName) const >- { >- ASSERT(atGlobalLevel()); >- return table[currentLevel()]->isVaryingInvariant(originalName); >- } >+ // This records invariant varyings declared through "invariant varying_name;". >+ void addInvariantVarying(const TVariable &variable); > >- void setGlobalInvariant(bool invariant) >- { >- ASSERT(atGlobalLevel()); >- table[currentLevel()]->setGlobalInvariant(invariant); >- } >+ // If this returns false, the varying could still be invariant if it is set as invariant during >+ // the varying variable declaration - this piece of information is stored in the variable's >+ // type, not here. >+ bool isVaryingInvariant(const TVariable &variable) const; >+ >+ void setGlobalInvariant(bool invariant); > > const TSymbolUniqueId nextUniqueId() { return TSymbolUniqueId(this); } > >- // The empty symbol id is shared between all empty string ("") symbols. They are used in the >- // AST for unused function parameters and struct type declarations that don't declare a >- // variable, for example. >- const TSymbolUniqueId &getEmptySymbolId() { return mEmptySymbolId; } >+ // Gets the built-in accessible by a shader with the specified version, if any. >+ const UnmangledBuiltIn *getUnmangledBuiltInForShaderVersion(const ImmutableString &name, >+ int shaderVersion); > >- // Checks whether there is a built-in accessible by a shader with the specified version. >- bool hasUnmangledBuiltInForShaderVersion(const char *name, int shaderVersion); >+ void initializeBuiltIns(sh::GLenum type, >+ ShShaderSpec spec, >+ const ShBuiltInResources &resources); >+ void clearCompilationResults(); > > private: > friend class TSymbolUniqueId; >- int nextUniqueIdValue() { return ++mUniqueIdCounter; } > >- ESymbolLevel currentLevel() const { return static_cast<ESymbolLevel>(table.size() - 1); } >+ struct VariableMetadata >+ { >+ VariableMetadata(); >+ bool staticRead; >+ bool staticWrite; >+ bool invariant; >+ }; > >- TVariable *insertVariable(ESymbolLevel level, const TString *name, const TType &type); >+ int nextUniqueIdValue(); > >- bool insert(ESymbolLevel level, TSymbol *symbol) { return table[level]->insert(symbol); } >+ class TSymbolTableLevel; > >- bool insert(ESymbolLevel level, TExtension ext, TSymbol *symbol) >- { >- symbol->relateToExtension(ext); >- return table[level]->insert(symbol); >- } >+ void initSamplerDefaultPrecision(TBasicType samplerType); >+ >+ void initializeBuiltInVariables(sh::GLenum shaderType, >+ ShShaderSpec spec, >+ const ShBuiltInResources &resources); > >- // Used to insert unmangled functions to check redeclaration of built-ins in ESSL 3.00 and >- // above. >- void insertUnmangledBuiltInName(const char *name, ESymbolLevel level); >+ VariableMetadata *getOrCreateVariableMetadata(const TVariable &variable); > >- bool hasUnmangledBuiltInAtLevel(const char *name, ESymbolLevel level); >+ std::vector<std::unique_ptr<TSymbolTableLevel>> mTable; > >- std::vector<TSymbolTableLevel *> table; >+ // There's one precision stack level for predefined precisions and then one level for each scope >+ // in table. > typedef TMap<TBasicType, TPrecision> PrecisionStackLevel; >- std::vector<PrecisionStackLevel *> precisionStack; >+ std::vector<std::unique_ptr<PrecisionStackLevel>> mPrecisionStack; >+ >+ bool mGlobalInvariant; > > int mUniqueIdCounter; > >- const TSymbolUniqueId mEmptySymbolId; >+ static const int kLastBuiltInId; >+ >+ sh::GLenum mShaderType; >+ ShBuiltInResources mResources; >+ >+ // Indexed by unique id. Map instead of vector since the variables are fairly sparse. >+ std::map<int, VariableMetadata> mVariableMetadata; >+ >+ // Store gl_in variable with its array size once the array size can be determined. The array >+ // size can also be checked against latter input primitive type declaration. >+ TVariable *mGlInVariableWithArraySize; > }; > > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable_autogen.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable_autogen.cpp >new file mode 100644 >index 00000000000..da9696232b3 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable_autogen.cpp >@@ -0,0 +1,20758 @@ >+// GENERATED FILE - DO NOT EDIT. >+// Generated by gen_builtin_symbols.py using data from builtin_variables.json and >+// builtin_function_declarations.txt. >+// >+// 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. >+// >+// SymbolTable_autogen.cpp: >+// Compile-time initialized built-ins. >+ >+#include "compiler/translator/SymbolTable.h" >+ >+#include "angle_gl.h" >+#include "compiler/translator/ImmutableString.h" >+#include "compiler/translator/StaticType.h" >+#include "compiler/translator/Symbol.h" >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/BuiltIn_autogen.h" >+ >+namespace sh >+{ >+ >+// Since some of the BuiltInId declarations are used outside of constexpr expressions, we need to >+// have these definitions without an initializer. C++17 should eventually remove the need for this. >+constexpr const TSymbolUniqueId BuiltInId::radians_Float1; >+constexpr const TSymbolUniqueId BuiltInId::radians_Float2; >+constexpr const TSymbolUniqueId BuiltInId::radians_Float3; >+constexpr const TSymbolUniqueId BuiltInId::radians_Float4; >+constexpr const TSymbolUniqueId BuiltInId::degrees_Float1; >+constexpr const TSymbolUniqueId BuiltInId::degrees_Float2; >+constexpr const TSymbolUniqueId BuiltInId::degrees_Float3; >+constexpr const TSymbolUniqueId BuiltInId::degrees_Float4; >+constexpr const TSymbolUniqueId BuiltInId::sin_Float1; >+constexpr const TSymbolUniqueId BuiltInId::sin_Float2; >+constexpr const TSymbolUniqueId BuiltInId::sin_Float3; >+constexpr const TSymbolUniqueId BuiltInId::sin_Float4; >+constexpr const TSymbolUniqueId BuiltInId::cos_Float1; >+constexpr const TSymbolUniqueId BuiltInId::cos_Float2; >+constexpr const TSymbolUniqueId BuiltInId::cos_Float3; >+constexpr const TSymbolUniqueId BuiltInId::cos_Float4; >+constexpr const TSymbolUniqueId BuiltInId::tan_Float1; >+constexpr const TSymbolUniqueId BuiltInId::tan_Float2; >+constexpr const TSymbolUniqueId BuiltInId::tan_Float3; >+constexpr const TSymbolUniqueId BuiltInId::tan_Float4; >+constexpr const TSymbolUniqueId BuiltInId::asin_Float1; >+constexpr const TSymbolUniqueId BuiltInId::asin_Float2; >+constexpr const TSymbolUniqueId BuiltInId::asin_Float3; >+constexpr const TSymbolUniqueId BuiltInId::asin_Float4; >+constexpr const TSymbolUniqueId BuiltInId::acos_Float1; >+constexpr const TSymbolUniqueId BuiltInId::acos_Float2; >+constexpr const TSymbolUniqueId BuiltInId::acos_Float3; >+constexpr const TSymbolUniqueId BuiltInId::acos_Float4; >+constexpr const TSymbolUniqueId BuiltInId::atan_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::atan_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::atan_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::atan_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::atan_Float1; >+constexpr const TSymbolUniqueId BuiltInId::atan_Float2; >+constexpr const TSymbolUniqueId BuiltInId::atan_Float3; >+constexpr const TSymbolUniqueId BuiltInId::atan_Float4; >+constexpr const TSymbolUniqueId BuiltInId::sinh_Float1; >+constexpr const TSymbolUniqueId BuiltInId::sinh_Float2; >+constexpr const TSymbolUniqueId BuiltInId::sinh_Float3; >+constexpr const TSymbolUniqueId BuiltInId::sinh_Float4; >+constexpr const TSymbolUniqueId BuiltInId::cosh_Float1; >+constexpr const TSymbolUniqueId BuiltInId::cosh_Float2; >+constexpr const TSymbolUniqueId BuiltInId::cosh_Float3; >+constexpr const TSymbolUniqueId BuiltInId::cosh_Float4; >+constexpr const TSymbolUniqueId BuiltInId::tanh_Float1; >+constexpr const TSymbolUniqueId BuiltInId::tanh_Float2; >+constexpr const TSymbolUniqueId BuiltInId::tanh_Float3; >+constexpr const TSymbolUniqueId BuiltInId::tanh_Float4; >+constexpr const TSymbolUniqueId BuiltInId::asinh_Float1; >+constexpr const TSymbolUniqueId BuiltInId::asinh_Float2; >+constexpr const TSymbolUniqueId BuiltInId::asinh_Float3; >+constexpr const TSymbolUniqueId BuiltInId::asinh_Float4; >+constexpr const TSymbolUniqueId BuiltInId::acosh_Float1; >+constexpr const TSymbolUniqueId BuiltInId::acosh_Float2; >+constexpr const TSymbolUniqueId BuiltInId::acosh_Float3; >+constexpr const TSymbolUniqueId BuiltInId::acosh_Float4; >+constexpr const TSymbolUniqueId BuiltInId::atanh_Float1; >+constexpr const TSymbolUniqueId BuiltInId::atanh_Float2; >+constexpr const TSymbolUniqueId BuiltInId::atanh_Float3; >+constexpr const TSymbolUniqueId BuiltInId::atanh_Float4; >+constexpr const TSymbolUniqueId BuiltInId::pow_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::pow_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::pow_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::pow_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::exp_Float1; >+constexpr const TSymbolUniqueId BuiltInId::exp_Float2; >+constexpr const TSymbolUniqueId BuiltInId::exp_Float3; >+constexpr const TSymbolUniqueId BuiltInId::exp_Float4; >+constexpr const TSymbolUniqueId BuiltInId::log_Float1; >+constexpr const TSymbolUniqueId BuiltInId::log_Float2; >+constexpr const TSymbolUniqueId BuiltInId::log_Float3; >+constexpr const TSymbolUniqueId BuiltInId::log_Float4; >+constexpr const TSymbolUniqueId BuiltInId::exp2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::exp2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::exp2_Float3; >+constexpr const TSymbolUniqueId BuiltInId::exp2_Float4; >+constexpr const TSymbolUniqueId BuiltInId::log2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::log2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::log2_Float3; >+constexpr const TSymbolUniqueId BuiltInId::log2_Float4; >+constexpr const TSymbolUniqueId BuiltInId::sqrt_Float1; >+constexpr const TSymbolUniqueId BuiltInId::sqrt_Float2; >+constexpr const TSymbolUniqueId BuiltInId::sqrt_Float3; >+constexpr const TSymbolUniqueId BuiltInId::sqrt_Float4; >+constexpr const TSymbolUniqueId BuiltInId::inversesqrt_Float1; >+constexpr const TSymbolUniqueId BuiltInId::inversesqrt_Float2; >+constexpr const TSymbolUniqueId BuiltInId::inversesqrt_Float3; >+constexpr const TSymbolUniqueId BuiltInId::inversesqrt_Float4; >+constexpr const TSymbolUniqueId BuiltInId::abs_Float1; >+constexpr const TSymbolUniqueId BuiltInId::abs_Float2; >+constexpr const TSymbolUniqueId BuiltInId::abs_Float3; >+constexpr const TSymbolUniqueId BuiltInId::abs_Float4; >+constexpr const TSymbolUniqueId BuiltInId::abs_Int1; >+constexpr const TSymbolUniqueId BuiltInId::abs_Int2; >+constexpr const TSymbolUniqueId BuiltInId::abs_Int3; >+constexpr const TSymbolUniqueId BuiltInId::abs_Int4; >+constexpr const TSymbolUniqueId BuiltInId::sign_Float1; >+constexpr const TSymbolUniqueId BuiltInId::sign_Float2; >+constexpr const TSymbolUniqueId BuiltInId::sign_Float3; >+constexpr const TSymbolUniqueId BuiltInId::sign_Float4; >+constexpr const TSymbolUniqueId BuiltInId::sign_Int1; >+constexpr const TSymbolUniqueId BuiltInId::sign_Int2; >+constexpr const TSymbolUniqueId BuiltInId::sign_Int3; >+constexpr const TSymbolUniqueId BuiltInId::sign_Int4; >+constexpr const TSymbolUniqueId BuiltInId::floor_Float1; >+constexpr const TSymbolUniqueId BuiltInId::floor_Float2; >+constexpr const TSymbolUniqueId BuiltInId::floor_Float3; >+constexpr const TSymbolUniqueId BuiltInId::floor_Float4; >+constexpr const TSymbolUniqueId BuiltInId::trunc_Float1; >+constexpr const TSymbolUniqueId BuiltInId::trunc_Float2; >+constexpr const TSymbolUniqueId BuiltInId::trunc_Float3; >+constexpr const TSymbolUniqueId BuiltInId::trunc_Float4; >+constexpr const TSymbolUniqueId BuiltInId::round_Float1; >+constexpr const TSymbolUniqueId BuiltInId::round_Float2; >+constexpr const TSymbolUniqueId BuiltInId::round_Float3; >+constexpr const TSymbolUniqueId BuiltInId::round_Float4; >+constexpr const TSymbolUniqueId BuiltInId::roundEven_Float1; >+constexpr const TSymbolUniqueId BuiltInId::roundEven_Float2; >+constexpr const TSymbolUniqueId BuiltInId::roundEven_Float3; >+constexpr const TSymbolUniqueId BuiltInId::roundEven_Float4; >+constexpr const TSymbolUniqueId BuiltInId::ceil_Float1; >+constexpr const TSymbolUniqueId BuiltInId::ceil_Float2; >+constexpr const TSymbolUniqueId BuiltInId::ceil_Float3; >+constexpr const TSymbolUniqueId BuiltInId::ceil_Float4; >+constexpr const TSymbolUniqueId BuiltInId::fract_Float1; >+constexpr const TSymbolUniqueId BuiltInId::fract_Float2; >+constexpr const TSymbolUniqueId BuiltInId::fract_Float3; >+constexpr const TSymbolUniqueId BuiltInId::fract_Float4; >+constexpr const TSymbolUniqueId BuiltInId::mod_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::mod_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::mod_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::mod_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::mod_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::mod_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::mod_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::min_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::min_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::min_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::min_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::min_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::min_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::min_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::min_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::min_Int2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::min_Int3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::min_Int4_Int4; >+constexpr const TSymbolUniqueId BuiltInId::min_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::min_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::min_Int4_Int1; >+constexpr const TSymbolUniqueId BuiltInId::min_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::min_UInt2_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::min_UInt3_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::min_UInt4_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::min_UInt2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::min_UInt3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::min_UInt4_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::max_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::max_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::max_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::max_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::max_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::max_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::max_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::max_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::max_Int2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::max_Int3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::max_Int4_Int4; >+constexpr const TSymbolUniqueId BuiltInId::max_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::max_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::max_Int4_Int1; >+constexpr const TSymbolUniqueId BuiltInId::max_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::max_UInt2_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::max_UInt3_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::max_UInt4_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::max_UInt2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::max_UInt3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::max_UInt4_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::clamp_Float1_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::clamp_Float2_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::clamp_Float3_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::clamp_Float4_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::clamp_Float2_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::clamp_Float3_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::clamp_Float4_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::clamp_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::clamp_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::clamp_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::clamp_Int4_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::clamp_Int2_Int2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::clamp_Int3_Int3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::clamp_Int4_Int4_Int4; >+constexpr const TSymbolUniqueId BuiltInId::clamp_UInt1_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::clamp_UInt2_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::clamp_UInt3_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::clamp_UInt4_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::clamp_UInt2_UInt2_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::clamp_UInt3_UInt3_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::clamp_UInt4_UInt4_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::mix_Float1_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::mix_Float2_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::mix_Float3_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::mix_Float4_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::mix_Float2_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::mix_Float3_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::mix_Float4_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::mix_Float1_Float1_Bool1; >+constexpr const TSymbolUniqueId BuiltInId::mix_Float2_Float2_Bool2; >+constexpr const TSymbolUniqueId BuiltInId::mix_Float3_Float3_Bool3; >+constexpr const TSymbolUniqueId BuiltInId::mix_Float4_Float4_Bool4; >+constexpr const TSymbolUniqueId BuiltInId::step_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::step_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::step_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::step_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::step_Float1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::step_Float1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::step_Float1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::smoothstep_Float1_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::smoothstep_Float2_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::smoothstep_Float3_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::smoothstep_Float4_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::smoothstep_Float1_Float1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::smoothstep_Float1_Float1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::smoothstep_Float1_Float1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::modf_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::modf_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::modf_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::modf_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::isnan_Float1; >+constexpr const TSymbolUniqueId BuiltInId::isnan_Float2; >+constexpr const TSymbolUniqueId BuiltInId::isnan_Float3; >+constexpr const TSymbolUniqueId BuiltInId::isnan_Float4; >+constexpr const TSymbolUniqueId BuiltInId::isinf_Float1; >+constexpr const TSymbolUniqueId BuiltInId::isinf_Float2; >+constexpr const TSymbolUniqueId BuiltInId::isinf_Float3; >+constexpr const TSymbolUniqueId BuiltInId::isinf_Float4; >+constexpr const TSymbolUniqueId BuiltInId::floatBitsToInt_Float1; >+constexpr const TSymbolUniqueId BuiltInId::floatBitsToInt_Float2; >+constexpr const TSymbolUniqueId BuiltInId::floatBitsToInt_Float3; >+constexpr const TSymbolUniqueId BuiltInId::floatBitsToInt_Float4; >+constexpr const TSymbolUniqueId BuiltInId::floatBitsToUint_Float1; >+constexpr const TSymbolUniqueId BuiltInId::floatBitsToUint_Float2; >+constexpr const TSymbolUniqueId BuiltInId::floatBitsToUint_Float3; >+constexpr const TSymbolUniqueId BuiltInId::floatBitsToUint_Float4; >+constexpr const TSymbolUniqueId BuiltInId::intBitsToFloat_Int1; >+constexpr const TSymbolUniqueId BuiltInId::intBitsToFloat_Int2; >+constexpr const TSymbolUniqueId BuiltInId::intBitsToFloat_Int3; >+constexpr const TSymbolUniqueId BuiltInId::intBitsToFloat_Int4; >+constexpr const TSymbolUniqueId BuiltInId::uintBitsToFloat_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::uintBitsToFloat_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::uintBitsToFloat_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::uintBitsToFloat_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::frexp_Float1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::frexp_Float2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::frexp_Float3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::frexp_Float4_Int4; >+constexpr const TSymbolUniqueId BuiltInId::ldexp_Float1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::ldexp_Float2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::ldexp_Float3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::ldexp_Float4_Int4; >+constexpr const TSymbolUniqueId BuiltInId::packSnorm2x16_Float2; >+constexpr const TSymbolUniqueId BuiltInId::packUnorm2x16_Float2; >+constexpr const TSymbolUniqueId BuiltInId::packHalf2x16_Float2; >+constexpr const TSymbolUniqueId BuiltInId::unpackSnorm2x16_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::unpackUnorm2x16_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::unpackHalf2x16_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::packUnorm4x8_Float4; >+constexpr const TSymbolUniqueId BuiltInId::packSnorm4x8_Float4; >+constexpr const TSymbolUniqueId BuiltInId::unpackUnorm4x8_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::unpackSnorm4x8_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::length_Float1; >+constexpr const TSymbolUniqueId BuiltInId::length_Float2; >+constexpr const TSymbolUniqueId BuiltInId::length_Float3; >+constexpr const TSymbolUniqueId BuiltInId::length_Float4; >+constexpr const TSymbolUniqueId BuiltInId::distance_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::distance_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::distance_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::distance_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::dot_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::dot_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::dot_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::dot_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::cross_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::normalize_Float1; >+constexpr const TSymbolUniqueId BuiltInId::normalize_Float2; >+constexpr const TSymbolUniqueId BuiltInId::normalize_Float3; >+constexpr const TSymbolUniqueId BuiltInId::normalize_Float4; >+constexpr const TSymbolUniqueId BuiltInId::faceforward_Float1_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::faceforward_Float2_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::faceforward_Float3_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::faceforward_Float4_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::reflect_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::reflect_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::reflect_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::reflect_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::refract_Float1_Float1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::refract_Float2_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::refract_Float3_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::refract_Float4_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::matrixCompMult_Float2x2_Float2x2; >+constexpr const TSymbolUniqueId BuiltInId::matrixCompMult_Float3x3_Float3x3; >+constexpr const TSymbolUniqueId BuiltInId::matrixCompMult_Float4x4_Float4x4; >+constexpr const TSymbolUniqueId BuiltInId::matrixCompMult_Float2x3_Float2x3; >+constexpr const TSymbolUniqueId BuiltInId::matrixCompMult_Float3x2_Float3x2; >+constexpr const TSymbolUniqueId BuiltInId::matrixCompMult_Float2x4_Float2x4; >+constexpr const TSymbolUniqueId BuiltInId::matrixCompMult_Float4x2_Float4x2; >+constexpr const TSymbolUniqueId BuiltInId::matrixCompMult_Float3x4_Float3x4; >+constexpr const TSymbolUniqueId BuiltInId::matrixCompMult_Float4x3_Float4x3; >+constexpr const TSymbolUniqueId BuiltInId::outerProduct_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::outerProduct_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::outerProduct_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::outerProduct_Float3_Float2; >+constexpr const TSymbolUniqueId BuiltInId::outerProduct_Float2_Float3; >+constexpr const TSymbolUniqueId BuiltInId::outerProduct_Float4_Float2; >+constexpr const TSymbolUniqueId BuiltInId::outerProduct_Float2_Float4; >+constexpr const TSymbolUniqueId BuiltInId::outerProduct_Float4_Float3; >+constexpr const TSymbolUniqueId BuiltInId::outerProduct_Float3_Float4; >+constexpr const TSymbolUniqueId BuiltInId::transpose_Float2x2; >+constexpr const TSymbolUniqueId BuiltInId::transpose_Float3x3; >+constexpr const TSymbolUniqueId BuiltInId::transpose_Float4x4; >+constexpr const TSymbolUniqueId BuiltInId::transpose_Float3x2; >+constexpr const TSymbolUniqueId BuiltInId::transpose_Float2x3; >+constexpr const TSymbolUniqueId BuiltInId::transpose_Float4x2; >+constexpr const TSymbolUniqueId BuiltInId::transpose_Float2x4; >+constexpr const TSymbolUniqueId BuiltInId::transpose_Float4x3; >+constexpr const TSymbolUniqueId BuiltInId::transpose_Float3x4; >+constexpr const TSymbolUniqueId BuiltInId::determinant_Float2x2; >+constexpr const TSymbolUniqueId BuiltInId::determinant_Float3x3; >+constexpr const TSymbolUniqueId BuiltInId::determinant_Float4x4; >+constexpr const TSymbolUniqueId BuiltInId::inverse_Float2x2; >+constexpr const TSymbolUniqueId BuiltInId::inverse_Float3x3; >+constexpr const TSymbolUniqueId BuiltInId::inverse_Float4x4; >+constexpr const TSymbolUniqueId BuiltInId::lessThan_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::lessThan_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::lessThan_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::lessThan_Int2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::lessThan_Int3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::lessThan_Int4_Int4; >+constexpr const TSymbolUniqueId BuiltInId::lessThan_UInt2_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::lessThan_UInt3_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::lessThan_UInt4_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::lessThanEqual_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::lessThanEqual_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::lessThanEqual_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::lessThanEqual_Int2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::lessThanEqual_Int3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::lessThanEqual_Int4_Int4; >+constexpr const TSymbolUniqueId BuiltInId::lessThanEqual_UInt2_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::lessThanEqual_UInt3_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::lessThanEqual_UInt4_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::greaterThan_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::greaterThan_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::greaterThan_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::greaterThan_Int2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::greaterThan_Int3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::greaterThan_Int4_Int4; >+constexpr const TSymbolUniqueId BuiltInId::greaterThan_UInt2_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::greaterThan_UInt3_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::greaterThan_UInt4_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::greaterThanEqual_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::greaterThanEqual_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::greaterThanEqual_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::greaterThanEqual_Int2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::greaterThanEqual_Int3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::greaterThanEqual_Int4_Int4; >+constexpr const TSymbolUniqueId BuiltInId::greaterThanEqual_UInt2_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::greaterThanEqual_UInt3_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::greaterThanEqual_UInt4_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::equal_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::equal_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::equal_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::equal_Int2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::equal_Int3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::equal_Int4_Int4; >+constexpr const TSymbolUniqueId BuiltInId::equal_UInt2_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::equal_UInt3_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::equal_UInt4_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::equal_Bool2_Bool2; >+constexpr const TSymbolUniqueId BuiltInId::equal_Bool3_Bool3; >+constexpr const TSymbolUniqueId BuiltInId::equal_Bool4_Bool4; >+constexpr const TSymbolUniqueId BuiltInId::notEqual_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::notEqual_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::notEqual_Float4_Float4; >+constexpr const TSymbolUniqueId BuiltInId::notEqual_Int2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::notEqual_Int3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::notEqual_Int4_Int4; >+constexpr const TSymbolUniqueId BuiltInId::notEqual_UInt2_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::notEqual_UInt3_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::notEqual_UInt4_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::notEqual_Bool2_Bool2; >+constexpr const TSymbolUniqueId BuiltInId::notEqual_Bool3_Bool3; >+constexpr const TSymbolUniqueId BuiltInId::notEqual_Bool4_Bool4; >+constexpr const TSymbolUniqueId BuiltInId::any_Bool2; >+constexpr const TSymbolUniqueId BuiltInId::any_Bool3; >+constexpr const TSymbolUniqueId BuiltInId::any_Bool4; >+constexpr const TSymbolUniqueId BuiltInId::all_Bool2; >+constexpr const TSymbolUniqueId BuiltInId::all_Bool3; >+constexpr const TSymbolUniqueId BuiltInId::all_Bool4; >+constexpr const TSymbolUniqueId BuiltInId::notFunc_Bool2; >+constexpr const TSymbolUniqueId BuiltInId::notFunc_Bool3; >+constexpr const TSymbolUniqueId BuiltInId::notFunc_Bool4; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldExtract_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldExtract_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldExtract_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldExtract_Int4_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldExtract_UInt1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldExtract_UInt2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldExtract_UInt3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldExtract_UInt4_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldInsert_Int1_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldInsert_Int2_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldInsert_Int3_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldInsert_Int4_Int4_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldInsert_UInt1_UInt1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldInsert_UInt2_UInt2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldInsert_UInt3_UInt3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldInsert_UInt4_UInt4_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldReverse_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldReverse_Int2; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldReverse_Int3; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldReverse_Int4; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldReverse_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldReverse_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldReverse_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::bitfieldReverse_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::bitCount_Int1; >+constexpr const TSymbolUniqueId BuiltInId::bitCount_Int2; >+constexpr const TSymbolUniqueId BuiltInId::bitCount_Int3; >+constexpr const TSymbolUniqueId BuiltInId::bitCount_Int4; >+constexpr const TSymbolUniqueId BuiltInId::bitCount_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::bitCount_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::bitCount_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::bitCount_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::findLSB_Int1; >+constexpr const TSymbolUniqueId BuiltInId::findLSB_Int2; >+constexpr const TSymbolUniqueId BuiltInId::findLSB_Int3; >+constexpr const TSymbolUniqueId BuiltInId::findLSB_Int4; >+constexpr const TSymbolUniqueId BuiltInId::findLSB_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::findLSB_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::findLSB_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::findLSB_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::findMSB_Int1; >+constexpr const TSymbolUniqueId BuiltInId::findMSB_Int2; >+constexpr const TSymbolUniqueId BuiltInId::findMSB_Int3; >+constexpr const TSymbolUniqueId BuiltInId::findMSB_Int4; >+constexpr const TSymbolUniqueId BuiltInId::findMSB_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::findMSB_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::findMSB_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::findMSB_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::uaddCarry_UInt1_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::uaddCarry_UInt2_UInt2_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::uaddCarry_UInt3_UInt3_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::uaddCarry_UInt4_UInt4_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::usubBorrow_UInt1_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::usubBorrow_UInt2_UInt2_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::usubBorrow_UInt3_UInt3_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::usubBorrow_UInt4_UInt4_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::umulExtended_UInt1_UInt1_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::umulExtended_UInt2_UInt2_UInt2_UInt2; >+constexpr const TSymbolUniqueId BuiltInId::umulExtended_UInt3_UInt3_UInt3_UInt3; >+constexpr const TSymbolUniqueId BuiltInId::umulExtended_UInt4_UInt4_UInt4_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::imulExtended_Int1_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imulExtended_Int2_Int2_Int2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::imulExtended_Int3_Int3_Int3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::imulExtended_Int4_Int4_Int4_Int4; >+constexpr const TSymbolUniqueId BuiltInId::texture2D_Sampler2D1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::texture2DProj_Sampler2D1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::texture2DProj_Sampler2D1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::textureCube_SamplerCube1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::texture2D_SamplerExternalOES1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::texture2DProj_SamplerExternalOES1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::texture2DProj_SamplerExternalOES1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::texture2DRect_Sampler2DRect1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::texture2DRectProj_Sampler2DRect1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::texture2DRectProj_Sampler2DRect1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::texture_Sampler2DRect1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_Sampler2DRect1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_Sampler2DRect1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::texture2DGradEXT_Sampler2D1_Float2_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::texture2DProjGradEXT_Sampler2D1_Float3_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::texture2DProjGradEXT_Sampler2D1_Float4_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureCubeGradEXT_SamplerCube1_Float3_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::texture2D_Sampler2D1_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture2DProj_Sampler2D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture2DProj_Sampler2D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureCube_SamplerCube1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::dFdxExt_Float1; >+constexpr const TSymbolUniqueId BuiltInId::dFdxExt_Float2; >+constexpr const TSymbolUniqueId BuiltInId::dFdxExt_Float3; >+constexpr const TSymbolUniqueId BuiltInId::dFdxExt_Float4; >+constexpr const TSymbolUniqueId BuiltInId::dFdyExt_Float1; >+constexpr const TSymbolUniqueId BuiltInId::dFdyExt_Float2; >+constexpr const TSymbolUniqueId BuiltInId::dFdyExt_Float3; >+constexpr const TSymbolUniqueId BuiltInId::dFdyExt_Float4; >+constexpr const TSymbolUniqueId BuiltInId::fwidthExt_Float1; >+constexpr const TSymbolUniqueId BuiltInId::fwidthExt_Float2; >+constexpr const TSymbolUniqueId BuiltInId::fwidthExt_Float3; >+constexpr const TSymbolUniqueId BuiltInId::fwidthExt_Float4; >+constexpr const TSymbolUniqueId BuiltInId::texture2DLodEXT_Sampler2D1_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture2DProjLodEXT_Sampler2D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture2DProjLodEXT_Sampler2D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureCubeLodEXT_SamplerCube1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture2DLod_Sampler2D1_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture2DProjLod_Sampler2D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture2DProjLod_Sampler2D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureCubeLod_SamplerCube1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_Sampler2D1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::texture_ISampler2D1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::texture_USampler2D1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::texture_Sampler3D1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::texture_ISampler3D1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::texture_USampler3D1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::texture_SamplerCube1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::texture_ISamplerCube1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::texture_USamplerCube1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::texture_Sampler2DArray1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::texture_ISampler2DArray1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::texture_USampler2DArray1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_Sampler2D1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_ISampler2D1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_USampler2D1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_Sampler2D1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_ISampler2D1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_USampler2D1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_Sampler3D1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_ISampler3D1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_USampler3D1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::textureLod_Sampler2D1_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureLod_ISampler2D1_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureLod_USampler2D1_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureLod_Sampler3D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureLod_ISampler3D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureLod_USampler3D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureLod_SamplerCube1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureLod_ISamplerCube1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureLod_USamplerCube1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureLod_Sampler2DArray1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureLod_ISampler2DArray1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureLod_USampler2DArray1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_Sampler2DShadow1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::texture_SamplerCubeShadow1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::texture_Sampler2DArrayShadow1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_Sampler2DShadow1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::textureLod_Sampler2DShadow1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_Sampler2D1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_ISampler2D1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_USampler2D1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_Sampler3D1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_ISampler3D1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_USampler3D1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_SamplerCube1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_ISamplerCube1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_USamplerCube1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_Sampler2DArray1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_ISampler2DArray1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_USampler2DArray1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_Sampler2DShadow1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_SamplerCubeShadow1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_Sampler2DArrayShadow1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLod_Sampler2D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLod_ISampler2D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLod_USampler2D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLod_Sampler2D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLod_ISampler2D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLod_USampler2D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLod_Sampler3D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLod_ISampler3D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLod_USampler3D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLod_Sampler2DShadow1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_Sampler2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_ISampler2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_USampler2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_Sampler3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_ISampler3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_USampler3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_Sampler2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_ISampler2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_USampler2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_Sampler2D1_Float2_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_ISampler2D1_Float2_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_USampler2D1_Float2_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_Sampler3D1_Float3_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_ISampler3D1_Float3_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_USampler3D1_Float3_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_SamplerCube1_Float3_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_ISamplerCube1_Float3_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_USamplerCube1_Float3_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_Sampler2DShadow1_Float3_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_SamplerCubeShadow1_Float4_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_Sampler2DArray1_Float3_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_ISampler2DArray1_Float3_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_USampler2DArray1_Float3_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureGrad_Sampler2DArrayShadow1_Float4_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjGrad_Sampler2D1_Float3_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjGrad_ISampler2D1_Float3_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjGrad_USampler2D1_Float3_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjGrad_Sampler2D1_Float4_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjGrad_ISampler2D1_Float4_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjGrad_USampler2D1_Float4_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjGrad_Sampler3D1_Float4_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureProjGrad_ISampler3D1_Float4_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureProjGrad_USampler3D1_Float4_Float3_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureProjGrad_Sampler2DShadow1_Float4_Float2_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_Sampler2DMS1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_ISampler2DMS1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_USampler2DMS1; >+constexpr const TSymbolUniqueId BuiltInId::textureSizeExt_Sampler2DMS1; >+constexpr const TSymbolUniqueId BuiltInId::textureSizeExt_ISampler2DMS1; >+constexpr const TSymbolUniqueId BuiltInId::textureSizeExt_USampler2DMS1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_Sampler2DMSArray1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_ISampler2DMSArray1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_USampler2DMSArray1; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_Sampler2D1_Float2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_ISampler2D1_Float2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_USampler2D1_Float2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_Sampler3D1_Float3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_ISampler3D1_Float3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_USampler3D1_Float3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_Sampler2DShadow1_Float3_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_Sampler2DArray1_Float3_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_ISampler2DArray1_Float3_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_USampler2DArray1_Float3_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_Sampler2D1_Float3_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_ISampler2D1_Float3_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_USampler2D1_Float3_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_Sampler2D1_Float4_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_ISampler2D1_Float4_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_USampler2D1_Float4_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_Sampler3D1_Float4_Int3; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_ISampler3D1_Float4_Int3; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_USampler3D1_Float4_Int3; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_Sampler2DShadow1_Float4_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureLodOffset_Sampler2D1_Float2_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureLodOffset_ISampler2D1_Float2_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureLodOffset_USampler2D1_Float2_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureLodOffset_Sampler3D1_Float3_Float1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::textureLodOffset_ISampler3D1_Float3_Float1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::textureLodOffset_USampler3D1_Float3_Float1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::textureLodOffset_Sampler2DShadow1_Float3_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureLodOffset_Sampler2DArray1_Float3_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureLodOffset_ISampler2DArray1_Float3_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureLodOffset_USampler2DArray1_Float3_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLodOffset_Sampler2D1_Float3_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLodOffset_ISampler2D1_Float3_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLodOffset_USampler2D1_Float3_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLodOffset_Sampler2D1_Float4_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLodOffset_ISampler2D1_Float4_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLodOffset_USampler2D1_Float4_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLodOffset_Sampler3D1_Float4_Float1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLodOffset_ISampler3D1_Float4_Float1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLodOffset_USampler3D1_Float4_Float1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::textureProjLodOffset_Sampler2DShadow1_Float4_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::texelFetchOffset_Sampler2D1_Int2_Int1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::texelFetchOffset_ISampler2D1_Int2_Int1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::texelFetchOffset_USampler2D1_Int2_Int1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::texelFetchOffset_Sampler3D1_Int3_Int1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::texelFetchOffset_ISampler3D1_Int3_Int1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::texelFetchOffset_USampler3D1_Int3_Int1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::texelFetchOffset_Sampler2DArray1_Int3_Int1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::texelFetchOffset_ISampler2DArray1_Int3_Int1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::texelFetchOffset_USampler2DArray1_Int3_Int1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureGradOffset_Sampler2D1_Float2_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureGradOffset_ISampler2D1_Float2_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureGradOffset_USampler2D1_Float2_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureGradOffset_Sampler3D1_Float3_Float3_Float3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::textureGradOffset_ISampler3D1_Float3_Float3_Float3_Int3; >+constexpr const TSymbolUniqueId BuiltInId::textureGradOffset_USampler3D1_Float3_Float3_Float3_Int3; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureGradOffset_Sampler2DShadow1_Float3_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureGradOffset_Sampler2DArray1_Float3_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureGradOffset_ISampler2DArray1_Float3_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureGradOffset_USampler2DArray1_Float3_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureGradOffset_Sampler2DArrayShadow1_Float4_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureProjGradOffset_Sampler2D1_Float3_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureProjGradOffset_ISampler2D1_Float3_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureProjGradOffset_USampler2D1_Float3_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureProjGradOffset_Sampler2D1_Float4_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureProjGradOffset_ISampler2D1_Float4_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureProjGradOffset_USampler2D1_Float4_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureProjGradOffset_Sampler3D1_Float4_Float3_Float3_Int3; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureProjGradOffset_ISampler3D1_Float4_Float3_Float3_Int3; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureProjGradOffset_USampler3D1_Float4_Float3_Float3_Int3; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureProjGradOffset_Sampler2DShadow1_Float4_Float2_Float2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_Sampler2D1_Float2_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_ISampler2D1_Float2_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_USampler2D1_Float2_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_Sampler3D1_Float3_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_ISampler3D1_Float3_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_USampler3D1_Float3_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_Sampler2DShadow1_Float3_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_Sampler2DArray1_Float3_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_ISampler2DArray1_Float3_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureOffset_USampler2DArray1_Float3_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_Sampler2D1_Float3_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_ISampler2D1_Float3_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_USampler2D1_Float3_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_Sampler2D1_Float4_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_ISampler2D1_Float4_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_USampler2D1_Float4_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_Sampler3D1_Float4_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_ISampler3D1_Float4_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_USampler3D1_Float4_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProjOffset_Sampler2DShadow1_Float4_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_SamplerExternalOES1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_SamplerExternalOES1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_SamplerExternalOES1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_SamplerExternalOES1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_SamplerExternalOES1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texture_SamplerExternal2DY2YEXT1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_SamplerExternal2DY2YEXT1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_SamplerExternal2DY2YEXT1_Float4; >+constexpr const TSymbolUniqueId BuiltInId::rgb_2_yuv_Float3_YuvCscStandardEXT1; >+constexpr const TSymbolUniqueId BuiltInId::yuv_2_rgb_Float3_YuvCscStandardEXT1; >+constexpr const TSymbolUniqueId BuiltInId::textureSize_SamplerExternal2DY2YEXT1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_SamplerExternal2DY2YEXT1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texture_Sampler2D1_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_ISampler2D1_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_USampler2D1_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_Sampler3D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_ISampler3D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_USampler3D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_SamplerCube1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_ISamplerCube1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_USamplerCube1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_Sampler2DArray1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_ISampler2DArray1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_USampler2DArray1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_Sampler2D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_ISampler2D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_USampler2D1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_Sampler2D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_ISampler2D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_USampler2D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_Sampler3D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_ISampler3D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_USampler3D1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_Sampler2DShadow1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_SamplerCubeShadow1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_Sampler2DShadow1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_SamplerExternalOES1_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_SamplerExternalOES1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_SamplerExternalOES1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texture_SamplerExternal2DY2YEXT1_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_SamplerExternal2DY2YEXT1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureProj_SamplerExternal2DY2YEXT1_Float4_Float1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_Sampler2DMS1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_ISampler2DMS1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_USampler2DMS1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetchExt_Sampler2DMS1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetchExt_ISampler2DMS1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetchExt_USampler2DMS1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_Sampler2DMSArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_ISampler2DMSArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::texelFetch_USampler2DMSArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_Sampler2D1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_ISampler2D1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_USampler2D1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_Sampler2D1_Float2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_ISampler2D1_Float2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_USampler2D1_Float2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_Sampler2DArray1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_ISampler2DArray1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_USampler2DArray1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_Sampler2DArray1_Float3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_ISampler2DArray1_Float3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_USampler2DArray1_Float3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_SamplerCube1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_ISamplerCube1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_USamplerCube1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_SamplerCube1_Float3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_ISamplerCube1_Float3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_USamplerCube1_Float3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_Sampler2DShadow1_Float2; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_Sampler2DShadow1_Float2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_Sampler2DArrayShadow1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_Sampler2DArrayShadow1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_SamplerCubeShadow1_Float3; >+constexpr const TSymbolUniqueId BuiltInId::textureGather_SamplerCubeShadow1_Float3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::textureGatherOffset_Sampler2D1_Float2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureGatherOffset_ISampler2D1_Float2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureGatherOffset_USampler2D1_Float2_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureGatherOffset_Sampler2D1_Float2_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGatherOffset_ISampler2D1_Float2_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGatherOffset_USampler2D1_Float2_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGatherOffset_Sampler2DArray1_Float3_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureGatherOffset_ISampler2DArray1_Float3_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureGatherOffset_USampler2DArray1_Float3_Int2; >+constexpr const TSymbolUniqueId BuiltInId::textureGatherOffset_Sampler2DArray1_Float3_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGatherOffset_ISampler2DArray1_Float3_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGatherOffset_USampler2DArray1_Float3_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::textureGatherOffset_Sampler2DShadow1_Float2_Float1_Int2; >+constexpr const TSymbolUniqueId >+ BuiltInId::textureGatherOffset_Sampler2DArrayShadow1_Float3_Float1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::dFdx_Float1; >+constexpr const TSymbolUniqueId BuiltInId::dFdx_Float2; >+constexpr const TSymbolUniqueId BuiltInId::dFdx_Float3; >+constexpr const TSymbolUniqueId BuiltInId::dFdx_Float4; >+constexpr const TSymbolUniqueId BuiltInId::dFdy_Float1; >+constexpr const TSymbolUniqueId BuiltInId::dFdy_Float2; >+constexpr const TSymbolUniqueId BuiltInId::dFdy_Float3; >+constexpr const TSymbolUniqueId BuiltInId::dFdy_Float4; >+constexpr const TSymbolUniqueId BuiltInId::fwidth_Float1; >+constexpr const TSymbolUniqueId BuiltInId::fwidth_Float2; >+constexpr const TSymbolUniqueId BuiltInId::fwidth_Float3; >+constexpr const TSymbolUniqueId BuiltInId::fwidth_Float4; >+constexpr const TSymbolUniqueId BuiltInId::atomicCounter_AtomicCounter1; >+constexpr const TSymbolUniqueId BuiltInId::atomicCounterIncrement_AtomicCounter1; >+constexpr const TSymbolUniqueId BuiltInId::atomicCounterDecrement_AtomicCounter1; >+constexpr const TSymbolUniqueId BuiltInId::atomicAdd_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::atomicAdd_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::atomicMin_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::atomicMin_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::atomicMax_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::atomicMax_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::atomicAnd_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::atomicAnd_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::atomicOr_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::atomicOr_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::atomicXor_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::atomicXor_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::atomicExchange_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::atomicExchange_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::atomicCompSwap_UInt1_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::atomicCompSwap_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageSize_Image2D1; >+constexpr const TSymbolUniqueId BuiltInId::imageSize_IImage2D1; >+constexpr const TSymbolUniqueId BuiltInId::imageSize_UImage2D1; >+constexpr const TSymbolUniqueId BuiltInId::imageSize_Image3D1; >+constexpr const TSymbolUniqueId BuiltInId::imageSize_IImage3D1; >+constexpr const TSymbolUniqueId BuiltInId::imageSize_UImage3D1; >+constexpr const TSymbolUniqueId BuiltInId::imageSize_Image2DArray1; >+constexpr const TSymbolUniqueId BuiltInId::imageSize_IImage2DArray1; >+constexpr const TSymbolUniqueId BuiltInId::imageSize_UImage2DArray1; >+constexpr const TSymbolUniqueId BuiltInId::imageSize_ImageCube1; >+constexpr const TSymbolUniqueId BuiltInId::imageSize_IImageCube1; >+constexpr const TSymbolUniqueId BuiltInId::imageSize_UImageCube1; >+constexpr const TSymbolUniqueId BuiltInId::imageLoad_Image2D1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::imageLoad_IImage2D1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::imageLoad_UImage2D1_Int2; >+constexpr const TSymbolUniqueId BuiltInId::imageLoad_Image3D1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::imageLoad_IImage3D1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::imageLoad_UImage3D1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::imageLoad_Image2DArray1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::imageLoad_IImage2DArray1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::imageLoad_UImage2DArray1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::imageLoad_ImageCube1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::imageLoad_IImageCube1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::imageLoad_UImageCube1_Int3; >+constexpr const TSymbolUniqueId BuiltInId::imageStore_Image2D1_Int2_Float4; >+constexpr const TSymbolUniqueId BuiltInId::imageStore_IImage2D1_Int2_Int4; >+constexpr const TSymbolUniqueId BuiltInId::imageStore_UImage2D1_Int2_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::imageStore_Image3D1_Int3_Float4; >+constexpr const TSymbolUniqueId BuiltInId::imageStore_IImage3D1_Int3_Int4; >+constexpr const TSymbolUniqueId BuiltInId::imageStore_UImage3D1_Int3_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::imageStore_Image2DArray1_Int3_Float4; >+constexpr const TSymbolUniqueId BuiltInId::imageStore_IImage2DArray1_Int3_Int4; >+constexpr const TSymbolUniqueId BuiltInId::imageStore_UImage2DArray1_Int3_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::imageStore_ImageCube1_Int3_Float4; >+constexpr const TSymbolUniqueId BuiltInId::imageStore_IImageCube1_Int3_Int4; >+constexpr const TSymbolUniqueId BuiltInId::imageStore_UImageCube1_Int3_UInt4; >+constexpr const TSymbolUniqueId BuiltInId::memoryBarrier; >+constexpr const TSymbolUniqueId BuiltInId::memoryBarrierAtomicCounter; >+constexpr const TSymbolUniqueId BuiltInId::memoryBarrierBuffer; >+constexpr const TSymbolUniqueId BuiltInId::memoryBarrierImage; >+constexpr const TSymbolUniqueId BuiltInId::barrier; >+constexpr const TSymbolUniqueId BuiltInId::memoryBarrierShared; >+constexpr const TSymbolUniqueId BuiltInId::groupMemoryBarrier; >+constexpr const TSymbolUniqueId BuiltInId::EmitVertex; >+constexpr const TSymbolUniqueId BuiltInId::EndPrimitive; >+constexpr const TSymbolUniqueId BuiltInId::gl_DepthRangeParameters; >+constexpr const TSymbolUniqueId BuiltInId::gl_DepthRange; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxVertexAttribs; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxVertexUniformVectors; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxVertexTextureImageUnits; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxCombinedTextureImageUnits; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxTextureImageUnits; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxFragmentUniformVectors; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxVaryingVectors; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxDrawBuffers; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxDualSourceDrawBuffersEXT; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxVertexOutputVectors; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxFragmentInputVectors; >+constexpr const TSymbolUniqueId BuiltInId::gl_MinProgramTexelOffset; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxProgramTexelOffset; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxImageUnits; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxVertexImageUniforms; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxFragmentImageUniforms; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxComputeImageUniforms; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxCombinedImageUniforms; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxCombinedShaderOutputResources; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxComputeWorkGroupCount; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxComputeWorkGroupSize; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxComputeUniformComponents; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxComputeTextureImageUnits; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxComputeAtomicCounters; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxComputeAtomicCounterBuffers; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxVertexAtomicCounters; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxFragmentAtomicCounters; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxCombinedAtomicCounters; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxAtomicCounterBindings; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxVertexAtomicCounterBuffers; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxFragmentAtomicCounterBuffers; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxCombinedAtomicCounterBuffers; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxAtomicCounterBufferSize; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxGeometryInputComponents; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxGeometryOutputComponents; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxGeometryImageUniforms; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxGeometryTextureImageUnits; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxGeometryOutputVertices; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxGeometryTotalOutputComponents; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxGeometryUniformComponents; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxGeometryAtomicCounters; >+constexpr const TSymbolUniqueId BuiltInId::gl_MaxGeometryAtomicCounterBuffers; >+constexpr const TSymbolUniqueId BuiltInId::gl_FragCoord; >+constexpr const TSymbolUniqueId BuiltInId::gl_FrontFacing; >+constexpr const TSymbolUniqueId BuiltInId::gl_PointCoord; >+constexpr const TSymbolUniqueId BuiltInId::gl_FragColor; >+constexpr const TSymbolUniqueId BuiltInId::gl_FragData; >+constexpr const TSymbolUniqueId BuiltInId::gl_FragDepth; >+constexpr const TSymbolUniqueId BuiltInId::gl_SecondaryFragColorEXT; >+constexpr const TSymbolUniqueId BuiltInId::gl_SecondaryFragDataEXT; >+constexpr const TSymbolUniqueId BuiltInId::gl_FragDepthEXT; >+constexpr const TSymbolUniqueId BuiltInId::gl_LastFragData; >+constexpr const TSymbolUniqueId BuiltInId::gl_LastFragColor; >+constexpr const TSymbolUniqueId BuiltInId::gl_LastFragDataNV; >+constexpr const TSymbolUniqueId BuiltInId::gl_LastFragColorARM; >+constexpr const TSymbolUniqueId BuiltInId::gl_PrimitiveID; >+constexpr const TSymbolUniqueId BuiltInId::gl_Layer; >+constexpr const TSymbolUniqueId BuiltInId::gl_Position; >+constexpr const TSymbolUniqueId BuiltInId::gl_PointSize; >+constexpr const TSymbolUniqueId BuiltInId::gl_InstanceID; >+constexpr const TSymbolUniqueId BuiltInId::gl_VertexID; >+constexpr const TSymbolUniqueId BuiltInId::gl_ViewportIndex; >+constexpr const TSymbolUniqueId BuiltInId::gl_LayerVS; >+constexpr const TSymbolUniqueId BuiltInId::gl_DrawID; >+constexpr const TSymbolUniqueId BuiltInId::gl_DrawIDESSL1; >+constexpr const TSymbolUniqueId BuiltInId::gl_NumWorkGroups; >+constexpr const TSymbolUniqueId BuiltInId::gl_WorkGroupSize; >+constexpr const TSymbolUniqueId BuiltInId::gl_WorkGroupID; >+constexpr const TSymbolUniqueId BuiltInId::gl_LocalInvocationID; >+constexpr const TSymbolUniqueId BuiltInId::gl_GlobalInvocationID; >+constexpr const TSymbolUniqueId BuiltInId::gl_LocalInvocationIndex; >+constexpr const TSymbolUniqueId BuiltInId::gl_PrimitiveIDIn; >+constexpr const TSymbolUniqueId BuiltInId::gl_InvocationID; >+constexpr const TSymbolUniqueId BuiltInId::gl_PrimitiveIDGS; >+constexpr const TSymbolUniqueId BuiltInId::gl_LayerGS; >+constexpr const TSymbolUniqueId BuiltInId::gl_PerVertex; >+constexpr const TSymbolUniqueId BuiltInId::gl_in; >+constexpr const TSymbolUniqueId BuiltInId::gl_PerVertexOutBlock; >+constexpr const TSymbolUniqueId BuiltInId::gl_PositionGS; >+constexpr const TSymbolUniqueId BuiltInId::gl_ViewID_OVR; >+constexpr const TSymbolUniqueId BuiltInId::gl_ViewID_OVRESSL1; >+ >+const int TSymbolTable::kLastBuiltInId = 1025; >+ >+namespace BuiltInName >+{ >+ >+constexpr const ImmutableString _empty(""); >+constexpr const ImmutableString EmitVertex("EmitVertex"); >+constexpr const ImmutableString EndPrimitive("EndPrimitive"); >+constexpr const ImmutableString abs("abs"); >+constexpr const ImmutableString acos("acos"); >+constexpr const ImmutableString acosh("acosh"); >+constexpr const ImmutableString all("all"); >+constexpr const ImmutableString any("any"); >+constexpr const ImmutableString asin("asin"); >+constexpr const ImmutableString asinh("asinh"); >+constexpr const ImmutableString atan("atan"); >+constexpr const ImmutableString atanh("atanh"); >+constexpr const ImmutableString atomicAdd("atomicAdd"); >+constexpr const ImmutableString atomicAnd("atomicAnd"); >+constexpr const ImmutableString atomicCompSwap("atomicCompSwap"); >+constexpr const ImmutableString atomicCompSwap_0D0D0D("atomicCompSwap(0D0D0D"); >+constexpr const ImmutableString atomicCounter("atomicCounter"); >+constexpr const ImmutableString atomicCounterDecrement("atomicCounterDecrement"); >+constexpr const ImmutableString atomicCounterIncrement("atomicCounterIncrement"); >+constexpr const ImmutableString atomicExchange("atomicExchange"); >+constexpr const ImmutableString atomicMax("atomicMax"); >+constexpr const ImmutableString atomicMin("atomicMin"); >+constexpr const ImmutableString atomicOr("atomicOr"); >+constexpr const ImmutableString atomicXor("atomicXor"); >+constexpr const ImmutableString barrier("barrier"); >+constexpr const ImmutableString bitCount("bitCount"); >+constexpr const ImmutableString bitfieldExtract("bitfieldExtract"); >+constexpr const ImmutableString bitfieldExtract_0D0C0C("bitfieldExtract(0D0C0C"); >+constexpr const ImmutableString bitfieldExtract_1C0C0C("bitfieldExtract(1C0C0C"); >+constexpr const ImmutableString bitfieldExtract_3C0C0C("bitfieldExtract(3C0C0C"); >+constexpr const ImmutableString bitfieldInsert("bitfieldInsert"); >+constexpr const ImmutableString bitfieldInsert_0C0C0C0C("bitfieldInsert(0C0C0C0C"); >+constexpr const ImmutableString bitfieldInsert_0D0D0C0C("bitfieldInsert(0D0D0C0C"); >+constexpr const ImmutableString bitfieldInsert_1C1C0C0C("bitfieldInsert(1C1C0C0C"); >+constexpr const ImmutableString bitfieldInsert_1D1D0C0C("bitfieldInsert(1D1D0C0C"); >+constexpr const ImmutableString bitfieldInsert_2C2C0C0C("bitfieldInsert(2C2C0C0C"); >+constexpr const ImmutableString bitfieldInsert_2D2D0C0C("bitfieldInsert(2D2D0C0C"); >+constexpr const ImmutableString bitfieldInsert_3C3C0C0C("bitfieldInsert(3C3C0C0C"); >+constexpr const ImmutableString bitfieldInsert_3D3D0C0C("bitfieldInsert(3D3D0C0C"); >+constexpr const ImmutableString bitfieldReverse("bitfieldReverse"); >+constexpr const ImmutableString ceil("ceil"); >+constexpr const ImmutableString clamp("clamp"); >+constexpr const ImmutableString clamp_0D0D0D("clamp(0D0D0D"); >+constexpr const ImmutableString clamp_1B0B0B("clamp(1B0B0B"); >+constexpr const ImmutableString clamp_1B1B1B("clamp(1B1B1B"); >+constexpr const ImmutableString clamp_1C0C0C("clamp(1C0C0C"); >+constexpr const ImmutableString clamp_1C1C1C("clamp(1C1C1C"); >+constexpr const ImmutableString clamp_1D1D1D("clamp(1D1D1D"); >+constexpr const ImmutableString clamp_2C2C2C("clamp(2C2C2C"); >+constexpr const ImmutableString clamp_3B0B0B("clamp(3B0B0B"); >+constexpr const ImmutableString clamp_3C0C0C("clamp(3C0C0C"); >+constexpr const ImmutableString clamp_3D0D0D("clamp(3D0D0D"); >+constexpr const ImmutableString cos("cos"); >+constexpr const ImmutableString cosh("cosh"); >+constexpr const ImmutableString cross("cross"); >+constexpr const ImmutableString dFdx("dFdx"); >+constexpr const ImmutableString dFdxExt("dFdx"); >+constexpr const ImmutableString dFdy("dFdy"); >+constexpr const ImmutableString dFdyExt("dFdy"); >+constexpr const ImmutableString degrees("degrees"); >+constexpr const ImmutableString determinant("determinant"); >+constexpr const ImmutableString diff("diff"); >+constexpr const ImmutableString distance("distance"); >+constexpr const ImmutableString dot("dot"); >+constexpr const ImmutableString equal("equal"); >+constexpr const ImmutableString exp("exp"); >+constexpr const ImmutableString exp2("exp2"); >+constexpr const ImmutableString faceforward("faceforward"); >+constexpr const ImmutableString faceforward_1B1B1B("faceforward(1B1B1B"); >+constexpr const ImmutableString faceforward_2B2B2B("faceforward(2B2B2B"); >+constexpr const ImmutableString faceforward_3B3B3B("faceforward(3B3B3B"); >+constexpr const ImmutableString far("far"); >+constexpr const ImmutableString findLSB("findLSB"); >+constexpr const ImmutableString findMSB("findMSB"); >+constexpr const ImmutableString floatBitsToInt("floatBitsToInt"); >+constexpr const ImmutableString floatBitsToUint("floatBitsToUint"); >+constexpr const ImmutableString floor("floor"); >+constexpr const ImmutableString fract("fract"); >+constexpr const ImmutableString frexp("frexp"); >+constexpr const ImmutableString frexp_3B3C("frexp(3B3C"); >+constexpr const ImmutableString fwidth("fwidth"); >+constexpr const ImmutableString fwidthExt("fwidth"); >+constexpr const ImmutableString gl_DepthRange("gl_DepthRange"); >+constexpr const ImmutableString gl_DepthRangeParameters("gl_DepthRangeParameters"); >+constexpr const ImmutableString gl_DrawID("gl_DrawID"); >+constexpr const ImmutableString gl_FragColor("gl_FragColor"); >+constexpr const ImmutableString gl_FragCoord("gl_FragCoord"); >+constexpr const ImmutableString gl_FragData("gl_FragData"); >+constexpr const ImmutableString gl_FragDepth("gl_FragDepth"); >+constexpr const ImmutableString gl_FragDepthEXT("gl_FragDepthEXT"); >+constexpr const ImmutableString gl_FrontFacing("gl_FrontFacing"); >+constexpr const ImmutableString gl_GlobalInvocationID("gl_GlobalInvocationID"); >+constexpr const ImmutableString gl_InstanceID("gl_InstanceID"); >+constexpr const ImmutableString gl_InvocationID("gl_InvocationID"); >+constexpr const ImmutableString gl_LastFragColor("gl_LastFragColor"); >+constexpr const ImmutableString gl_LastFragColorARM("gl_LastFragColorARM"); >+constexpr const ImmutableString gl_LastFragData("gl_LastFragData"); >+constexpr const ImmutableString gl_Layer("gl_Layer"); >+constexpr const ImmutableString gl_LocalInvocationID("gl_LocalInvocationID"); >+constexpr const ImmutableString gl_LocalInvocationIndex("gl_LocalInvocationIndex"); >+constexpr const ImmutableString gl_MaxAtomicCounterBindings("gl_MaxAtomicCounterBindings"); >+constexpr const ImmutableString gl_MaxAtomicCounterBufferSize("gl_MaxAtomicCounterBufferSize"); >+constexpr const ImmutableString gl_MaxCombinedAtomicCounterBuffers( >+ "gl_MaxCombinedAtomicCounterBuffers"); >+constexpr const ImmutableString gl_MaxCombinedAtomicCounters("gl_MaxCombinedAtomicCounters"); >+constexpr const ImmutableString gl_MaxCombinedImageUniforms("gl_MaxCombinedImageUniforms"); >+constexpr const ImmutableString gl_MaxCombinedShaderOutputResources( >+ "gl_MaxCombinedShaderOutputResources"); >+constexpr const ImmutableString gl_MaxCombinedTextureImageUnits("gl_MaxCombinedTextureImageUnits"); >+constexpr const ImmutableString gl_MaxComputeAtomicCounterBuffers( >+ "gl_MaxComputeAtomicCounterBuffers"); >+constexpr const ImmutableString gl_MaxComputeAtomicCounters("gl_MaxComputeAtomicCounters"); >+constexpr const ImmutableString gl_MaxComputeImageUniforms("gl_MaxComputeImageUniforms"); >+constexpr const ImmutableString gl_MaxComputeTextureImageUnits("gl_MaxComputeTextureImageUnits"); >+constexpr const ImmutableString gl_MaxComputeUniformComponents("gl_MaxComputeUniformComponents"); >+constexpr const ImmutableString gl_MaxComputeWorkGroupCount("gl_MaxComputeWorkGroupCount"); >+constexpr const ImmutableString gl_MaxComputeWorkGroupSize("gl_MaxComputeWorkGroupSize"); >+constexpr const ImmutableString gl_MaxDrawBuffers("gl_MaxDrawBuffers"); >+constexpr const ImmutableString gl_MaxDualSourceDrawBuffersEXT("gl_MaxDualSourceDrawBuffersEXT"); >+constexpr const ImmutableString gl_MaxFragmentAtomicCounterBuffers( >+ "gl_MaxFragmentAtomicCounterBuffers"); >+constexpr const ImmutableString gl_MaxFragmentAtomicCounters("gl_MaxFragmentAtomicCounters"); >+constexpr const ImmutableString gl_MaxFragmentImageUniforms("gl_MaxFragmentImageUniforms"); >+constexpr const ImmutableString gl_MaxFragmentInputVectors("gl_MaxFragmentInputVectors"); >+constexpr const ImmutableString gl_MaxFragmentUniformVectors("gl_MaxFragmentUniformVectors"); >+constexpr const ImmutableString gl_MaxGeometryAtomicCounterBuffers( >+ "gl_MaxGeometryAtomicCounterBuffers"); >+constexpr const ImmutableString gl_MaxGeometryAtomicCounters("gl_MaxGeometryAtomicCounters"); >+constexpr const ImmutableString gl_MaxGeometryImageUniforms("gl_MaxGeometryImageUniforms"); >+constexpr const ImmutableString gl_MaxGeometryInputComponents("gl_MaxGeometryInputComponents"); >+constexpr const ImmutableString gl_MaxGeometryOutputComponents("gl_MaxGeometryOutputComponents"); >+constexpr const ImmutableString gl_MaxGeometryOutputVertices("gl_MaxGeometryOutputVertices"); >+constexpr const ImmutableString gl_MaxGeometryTextureImageUnits("gl_MaxGeometryTextureImageUnits"); >+constexpr const ImmutableString gl_MaxGeometryTotalOutputComponents( >+ "gl_MaxGeometryTotalOutputComponents"); >+constexpr const ImmutableString gl_MaxGeometryUniformComponents("gl_MaxGeometryUniformComponents"); >+constexpr const ImmutableString gl_MaxImageUnits("gl_MaxImageUnits"); >+constexpr const ImmutableString gl_MaxProgramTexelOffset("gl_MaxProgramTexelOffset"); >+constexpr const ImmutableString gl_MaxTextureImageUnits("gl_MaxTextureImageUnits"); >+constexpr const ImmutableString gl_MaxVaryingVectors("gl_MaxVaryingVectors"); >+constexpr const ImmutableString gl_MaxVertexAtomicCounterBuffers( >+ "gl_MaxVertexAtomicCounterBuffers"); >+constexpr const ImmutableString gl_MaxVertexAtomicCounters("gl_MaxVertexAtomicCounters"); >+constexpr const ImmutableString gl_MaxVertexAttribs("gl_MaxVertexAttribs"); >+constexpr const ImmutableString gl_MaxVertexImageUniforms("gl_MaxVertexImageUniforms"); >+constexpr const ImmutableString gl_MaxVertexOutputVectors("gl_MaxVertexOutputVectors"); >+constexpr const ImmutableString gl_MaxVertexTextureImageUnits("gl_MaxVertexTextureImageUnits"); >+constexpr const ImmutableString gl_MaxVertexUniformVectors("gl_MaxVertexUniformVectors"); >+constexpr const ImmutableString gl_MinProgramTexelOffset("gl_MinProgramTexelOffset"); >+constexpr const ImmutableString gl_NumWorkGroups("gl_NumWorkGroups"); >+constexpr const ImmutableString gl_PerVertex("gl_PerVertex"); >+constexpr const ImmutableString gl_PointCoord("gl_PointCoord"); >+constexpr const ImmutableString gl_PointSize("gl_PointSize"); >+constexpr const ImmutableString gl_Position("gl_Position"); >+constexpr const ImmutableString gl_PrimitiveID("gl_PrimitiveID"); >+constexpr const ImmutableString gl_PrimitiveIDIn("gl_PrimitiveIDIn"); >+constexpr const ImmutableString gl_SecondaryFragColorEXT("gl_SecondaryFragColorEXT"); >+constexpr const ImmutableString gl_SecondaryFragDataEXT("gl_SecondaryFragDataEXT"); >+constexpr const ImmutableString gl_VertexID("gl_VertexID"); >+constexpr const ImmutableString gl_ViewID_OVR("gl_ViewID_OVR"); >+constexpr const ImmutableString gl_ViewportIndex("gl_ViewportIndex"); >+constexpr const ImmutableString gl_WorkGroupID("gl_WorkGroupID"); >+constexpr const ImmutableString gl_WorkGroupSize("gl_WorkGroupSize"); >+constexpr const ImmutableString gl_in("gl_in"); >+constexpr const ImmutableString greaterThan("greaterThan"); >+constexpr const ImmutableString greaterThanEqual("greaterThanEqual"); >+constexpr const ImmutableString groupMemoryBarrier("groupMemoryBarrier"); >+constexpr const ImmutableString imageLoad("imageLoad"); >+constexpr const ImmutableString imageSize("imageSize"); >+constexpr const ImmutableString imageStore("imageStore"); >+constexpr const ImmutableString imageStore_0h1C3D("imageStore(0h1C3D"); >+constexpr const ImmutableString imageStore_0j2C3C("imageStore(0j2C3C"); >+constexpr const ImmutableString imageStore_0l2C3B("imageStore(0l2C3B"); >+constexpr const ImmutableString imageStore_0n2C3D("imageStore(0n2C3D"); >+constexpr const ImmutableString imageStore_0p2C3C("imageStore(0p2C3C"); >+constexpr const ImmutableString imulExtended("imulExtended"); >+constexpr const ImmutableString imulExtended_0C0C0C0C("imulExtended(0C0C0C0C"); >+constexpr const ImmutableString imulExtended_1C1C1C1C("imulExtended(1C1C1C1C"); >+constexpr const ImmutableString imulExtended_2C2C2C2C("imulExtended(2C2C2C2C"); >+constexpr const ImmutableString imulExtended_3C3C3C3C("imulExtended(3C3C3C3C"); >+constexpr const ImmutableString intBitsToFloat("intBitsToFloat"); >+constexpr const ImmutableString inverse("inverse"); >+constexpr const ImmutableString inversesqrt("inversesqrt"); >+constexpr const ImmutableString isinf("isinf"); >+constexpr const ImmutableString isnan("isnan"); >+constexpr const ImmutableString ldexp("ldexp"); >+constexpr const ImmutableString length("length"); >+constexpr const ImmutableString lessThan("lessThan"); >+constexpr const ImmutableString lessThanEqual("lessThanEqual"); >+constexpr const ImmutableString log("log"); >+constexpr const ImmutableString log2("log2"); >+constexpr const ImmutableString matrixCompMult("matrixCompMult"); >+constexpr const ImmutableString max("max"); >+constexpr const ImmutableString memoryBarrier("memoryBarrier"); >+constexpr const ImmutableString memoryBarrierAtomicCounter("memoryBarrierAtomicCounter"); >+constexpr const ImmutableString memoryBarrierBuffer("memoryBarrierBuffer"); >+constexpr const ImmutableString memoryBarrierImage("memoryBarrierImage"); >+constexpr const ImmutableString memoryBarrierShared("memoryBarrierShared"); >+constexpr const ImmutableString min("min"); >+constexpr const ImmutableString mix("mix"); >+constexpr const ImmutableString mix_0B0B0E("mix(0B0B0E"); >+constexpr const ImmutableString mix_1B1B1B("mix(1B1B1B"); >+constexpr const ImmutableString mix_1B1B1E("mix(1B1B1E"); >+constexpr const ImmutableString mix_3B3B0B("mix(3B3B0B"); >+constexpr const ImmutableString mix_3B3B3B("mix(3B3B3B"); >+constexpr const ImmutableString mod("mod"); >+constexpr const ImmutableString modf("modf"); >+constexpr const ImmutableString near("near"); >+constexpr const ImmutableString normalize("normalize"); >+constexpr const ImmutableString notEqual("notEqual"); >+constexpr const ImmutableString notFunc("not"); >+constexpr const ImmutableString outerProduct("outerProduct"); >+constexpr const ImmutableString packHalf2x16("packHalf2x16"); >+constexpr const ImmutableString packSnorm2x16("packSnorm2x16"); >+constexpr const ImmutableString packSnorm4x8("packSnorm4x8"); >+constexpr const ImmutableString packUnorm2x16("packUnorm2x16"); >+constexpr const ImmutableString packUnorm4x8("packUnorm4x8"); >+constexpr const ImmutableString pow("pow"); >+constexpr const ImmutableString radians("radians"); >+constexpr const ImmutableString reflect("reflect"); >+constexpr const ImmutableString refract("refract"); >+constexpr const ImmutableString refract_3B3B0B("refract(3B3B0B"); >+constexpr const ImmutableString rgb_2_yuv("rgb_2_yuv"); >+constexpr const ImmutableString round("round"); >+constexpr const ImmutableString roundEven("roundEven"); >+constexpr const ImmutableString sign("sign"); >+constexpr const ImmutableString sin("sin"); >+constexpr const ImmutableString sinh("sinh"); >+constexpr const ImmutableString smoothstep("smoothstep"); >+constexpr const ImmutableString smoothstep_0B0B3B("smoothstep(0B0B3B"); >+constexpr const ImmutableString smoothstep_1B1B1B("smoothstep(1B1B1B"); >+constexpr const ImmutableString smoothstep_3B3B3B("smoothstep(3B3B3B"); >+constexpr const ImmutableString sqrt("sqrt"); >+constexpr const ImmutableString step("step"); >+constexpr const ImmutableString tan("tan"); >+constexpr const ImmutableString tanh("tanh"); >+constexpr const ImmutableString texelFetch("texelFetch"); >+constexpr const ImmutableString texelFetchExt("texelFetch"); >+constexpr const ImmutableString texelFetchExt_0O1C0C("texelFetch(0O1C0C"); >+constexpr const ImmutableString texelFetchOffset("texelFetchOffset"); >+constexpr const ImmutableString texelFetchOffset_0H1C0C1C("texelFetchOffset(0H1C0C1C"); >+constexpr const ImmutableString texelFetchOffset_0I2C0C2C("texelFetchOffset(0I2C0C2C"); >+constexpr const ImmutableString texelFetchOffset_0K2C0C1C("texelFetchOffset(0K2C0C1C"); >+constexpr const ImmutableString texelFetchOffset_0Q1C0C1C("texelFetchOffset(0Q1C0C1C"); >+constexpr const ImmutableString texelFetchOffset_0R2C0C2C("texelFetchOffset(0R2C0C2C"); >+constexpr const ImmutableString texelFetchOffset_0T2C0C1C("texelFetchOffset(0T2C0C1C"); >+constexpr const ImmutableString texelFetchOffset_0W1C0C1C("texelFetchOffset(0W1C0C1C"); >+constexpr const ImmutableString texelFetchOffset_0X2C0C2C("texelFetchOffset(0X2C0C2C"); >+constexpr const ImmutableString texelFetchOffset_0Z2C0C1C("texelFetchOffset(0Z2C0C1C"); >+constexpr const ImmutableString texelFetch_0H1C0C("texelFetch(0H1C0C"); >+constexpr const ImmutableString texelFetch_0I2C0C("texelFetch(0I2C0C"); >+constexpr const ImmutableString texelFetch_0K2C0C("texelFetch(0K2C0C"); >+constexpr const ImmutableString texelFetch_0L1C0C("texelFetch(0L1C0C"); >+constexpr const ImmutableString texelFetch_0O1C0C("texelFetch(0O1C0C"); >+constexpr const ImmutableString texelFetch_0P2C0C("texelFetch(0P2C0C"); >+constexpr const ImmutableString texelFetch_0Q1C0C("texelFetch(0Q1C0C"); >+constexpr const ImmutableString texelFetch_0T2C0C("texelFetch(0T2C0C"); >+constexpr const ImmutableString texelFetch_0V2C0C("texelFetch(0V2C0C"); >+constexpr const ImmutableString texelFetch_0X2C0C("texelFetch(0X2C0C"); >+constexpr const ImmutableString texelFetch_0Z2C0C("texelFetch(0Z2C0C"); >+constexpr const ImmutableString texture("texture"); >+constexpr const ImmutableString texture2D("texture2D"); >+constexpr const ImmutableString texture2DGradEXT("texture2DGradEXT"); >+constexpr const ImmutableString texture2DGradEXT_0H1B1B1B("texture2DGradEXT(0H1B1B1B"); >+constexpr const ImmutableString texture2DLod("texture2DLod"); >+constexpr const ImmutableString texture2DLodEXT("texture2DLodEXT"); >+constexpr const ImmutableString texture2DLodEXT_0H1B0B("texture2DLodEXT(0H1B0B"); >+constexpr const ImmutableString texture2DLod_0H1B0B("texture2DLod(0H1B0B"); >+constexpr const ImmutableString texture2DProj("texture2DProj"); >+constexpr const ImmutableString texture2DProjGradEXT("texture2DProjGradEXT"); >+constexpr const ImmutableString texture2DProjGradEXT_0H2B1B1B("texture2DProjGradEXT(0H2B1B1B"); >+constexpr const ImmutableString texture2DProjGradEXT_0H3B1B1B("texture2DProjGradEXT(0H3B1B1B"); >+constexpr const ImmutableString texture2DProjLod("texture2DProjLod"); >+constexpr const ImmutableString texture2DProjLodEXT("texture2DProjLodEXT"); >+constexpr const ImmutableString texture2DProjLodEXT_0H2B0B("texture2DProjLodEXT(0H2B0B"); >+constexpr const ImmutableString texture2DProjLod_0H2B0B("texture2DProjLod(0H2B0B"); >+constexpr const ImmutableString texture2DProj_0H2B0B("texture2DProj(0H2B0B"); >+constexpr const ImmutableString texture2DRect("texture2DRect"); >+constexpr const ImmutableString texture2DRectProj("texture2DRectProj"); >+constexpr const ImmutableString textureCube("textureCube"); >+constexpr const ImmutableString textureCubeGradEXT("textureCubeGradEXT"); >+constexpr const ImmutableString textureCubeGradEXT_0J2B2B2B("textureCubeGradEXT(0J2B2B2B"); >+constexpr const ImmutableString textureCubeLod("textureCubeLod"); >+constexpr const ImmutableString textureCubeLodEXT("textureCubeLodEXT"); >+constexpr const ImmutableString textureGather("textureGather"); >+constexpr const ImmutableString textureGatherOffset("textureGatherOffset"); >+constexpr const ImmutableString textureGatherOffset_0H1B1C0C("textureGatherOffset(0H1B1C0C"); >+constexpr const ImmutableString textureGatherOffset_0K2B1C0C("textureGatherOffset(0K2B1C0C"); >+constexpr const ImmutableString textureGatherOffset_0Q1B1C0C("textureGatherOffset(0Q1B1C0C"); >+constexpr const ImmutableString textureGatherOffset_0T2B1C("textureGatherOffset(0T2B1C"); >+constexpr const ImmutableString textureGatherOffset_0T2B1C0C("textureGatherOffset(0T2B1C0C"); >+constexpr const ImmutableString textureGatherOffset_0W1B1C("textureGatherOffset(0W1B1C"); >+constexpr const ImmutableString textureGatherOffset_0W1B1C0C("textureGatherOffset(0W1B1C0C"); >+constexpr const ImmutableString textureGatherOffset_0Z2B1C0C("textureGatherOffset(0Z2B1C0C"); >+constexpr const ImmutableString textureGatherOffset_0c1B0B1C("textureGatherOffset(0c1B0B1C"); >+constexpr const ImmutableString textureGatherOffset_0e2B0B1C("textureGatherOffset(0e2B0B1C"); >+constexpr const ImmutableString textureGather_0J2B0C("textureGather(0J2B0C"); >+constexpr const ImmutableString textureGather_0S2B0C("textureGather(0S2B0C"); >+constexpr const ImmutableString textureGather_0T2B0C("textureGather(0T2B0C"); >+constexpr const ImmutableString textureGather_0Z2B0C("textureGather(0Z2B0C"); >+constexpr const ImmutableString textureGrad("textureGrad"); >+constexpr const ImmutableString textureGradOffset("textureGradOffset"); >+constexpr const ImmutableString textureGradOffset_0H1B1B1B1C("textureGradOffset(0H1B1B1B1C"); >+constexpr const ImmutableString textureGradOffset_0I2B2B2B2C("textureGradOffset(0I2B2B2B2C"); >+constexpr const ImmutableString textureGradOffset_0K2B1B1B1C("textureGradOffset(0K2B1B1B1C"); >+constexpr const ImmutableString textureGradOffset_0Q1B1B1B1C("textureGradOffset(0Q1B1B1B1C"); >+constexpr const ImmutableString textureGradOffset_0R2B2B2B2C("textureGradOffset(0R2B2B2B2C"); >+constexpr const ImmutableString textureGradOffset_0T2B1B1B1C("textureGradOffset(0T2B1B1B1C"); >+constexpr const ImmutableString textureGradOffset_0W1B1B1B1C("textureGradOffset(0W1B1B1B1C"); >+constexpr const ImmutableString textureGradOffset_0X2B2B2B2C("textureGradOffset(0X2B2B2B2C"); >+constexpr const ImmutableString textureGradOffset_0Z2B1B1B1C("textureGradOffset(0Z2B1B1B1C"); >+constexpr const ImmutableString textureGradOffset_0c2B1B1B1C("textureGradOffset(0c2B1B1B1C"); >+constexpr const ImmutableString textureGradOffset_0e3B1B1B1C("textureGradOffset(0e3B1B1B1C"); >+constexpr const ImmutableString textureGrad_0H1B1B1B("textureGrad(0H1B1B1B"); >+constexpr const ImmutableString textureGrad_0I2B2B2B("textureGrad(0I2B2B2B"); >+constexpr const ImmutableString textureGrad_0J2B2B2B("textureGrad(0J2B2B2B"); >+constexpr const ImmutableString textureGrad_0K2B1B1B("textureGrad(0K2B1B1B"); >+constexpr const ImmutableString textureGrad_0Q1B1B1B("textureGrad(0Q1B1B1B"); >+constexpr const ImmutableString textureGrad_0R2B2B2B("textureGrad(0R2B2B2B"); >+constexpr const ImmutableString textureGrad_0S2B2B2B("textureGrad(0S2B2B2B"); >+constexpr const ImmutableString textureGrad_0T2B1B1B("textureGrad(0T2B1B1B"); >+constexpr const ImmutableString textureGrad_0W1B1B1B("textureGrad(0W1B1B1B"); >+constexpr const ImmutableString textureGrad_0X2B2B2B("textureGrad(0X2B2B2B"); >+constexpr const ImmutableString textureGrad_0Y2B2B2B("textureGrad(0Y2B2B2B"); >+constexpr const ImmutableString textureGrad_0Z2B1B1B("textureGrad(0Z2B1B1B"); >+constexpr const ImmutableString textureGrad_0c2B1B1B("textureGrad(0c2B1B1B"); >+constexpr const ImmutableString textureGrad_0d3B2B2B("textureGrad(0d3B2B2B"); >+constexpr const ImmutableString textureGrad_0e3B1B1B("textureGrad(0e3B1B1B"); >+constexpr const ImmutableString textureLod("textureLod"); >+constexpr const ImmutableString textureLodOffset("textureLodOffset"); >+constexpr const ImmutableString textureLodOffset_0H1B0B1C("textureLodOffset(0H1B0B1C"); >+constexpr const ImmutableString textureLodOffset_0I2B0B2C("textureLodOffset(0I2B0B2C"); >+constexpr const ImmutableString textureLodOffset_0K2B0B1C("textureLodOffset(0K2B0B1C"); >+constexpr const ImmutableString textureLodOffset_0Q1B0B1C("textureLodOffset(0Q1B0B1C"); >+constexpr const ImmutableString textureLodOffset_0R2B0B2C("textureLodOffset(0R2B0B2C"); >+constexpr const ImmutableString textureLodOffset_0T2B0B1C("textureLodOffset(0T2B0B1C"); >+constexpr const ImmutableString textureLodOffset_0W1B0B1C("textureLodOffset(0W1B0B1C"); >+constexpr const ImmutableString textureLodOffset_0X2B0B2C("textureLodOffset(0X2B0B2C"); >+constexpr const ImmutableString textureLodOffset_0Z2B0B1C("textureLodOffset(0Z2B0B1C"); >+constexpr const ImmutableString textureLodOffset_0c2B0B1C("textureLodOffset(0c2B0B1C"); >+constexpr const ImmutableString textureLod_0J2B0B("textureLod(0J2B0B"); >+constexpr const ImmutableString textureLod_0Q1B0B("textureLod(0Q1B0B"); >+constexpr const ImmutableString textureLod_0S2B0B("textureLod(0S2B0B"); >+constexpr const ImmutableString textureLod_0W1B0B("textureLod(0W1B0B"); >+constexpr const ImmutableString textureLod_0Y2B0B("textureLod(0Y2B0B"); >+constexpr const ImmutableString textureLod_0Z2B0B("textureLod(0Z2B0B"); >+constexpr const ImmutableString textureOffset("textureOffset"); >+constexpr const ImmutableString textureOffset_0H1B1C0B("textureOffset(0H1B1C0B"); >+constexpr const ImmutableString textureOffset_0I2B2C0B("textureOffset(0I2B2C0B"); >+constexpr const ImmutableString textureOffset_0K2B1C0B("textureOffset(0K2B1C0B"); >+constexpr const ImmutableString textureOffset_0Q1B1C0B("textureOffset(0Q1B1C0B"); >+constexpr const ImmutableString textureOffset_0R2B2C0B("textureOffset(0R2B2C0B"); >+constexpr const ImmutableString textureOffset_0T2B1C0B("textureOffset(0T2B1C0B"); >+constexpr const ImmutableString textureOffset_0W1B1C0B("textureOffset(0W1B1C0B"); >+constexpr const ImmutableString textureOffset_0X2B2C("textureOffset(0X2B2C"); >+constexpr const ImmutableString textureOffset_0X2B2C0B("textureOffset(0X2B2C0B"); >+constexpr const ImmutableString textureOffset_0Z2B1C0B("textureOffset(0Z2B1C0B"); >+constexpr const ImmutableString textureOffset_0c2B1C0B("textureOffset(0c2B1C0B"); >+constexpr const ImmutableString textureProj("textureProj"); >+constexpr const ImmutableString textureProjGrad("textureProjGrad"); >+constexpr const ImmutableString textureProjGradOffset("textureProjGradOffset"); >+constexpr const ImmutableString textureProjGradOffset_0H2B1B1B1C( >+ "textureProjGradOffset(0H2B1B1B1C"); >+constexpr const ImmutableString textureProjGradOffset_0H3B1B1B1C( >+ "textureProjGradOffset(0H3B1B1B1C"); >+constexpr const ImmutableString textureProjGradOffset_0I3B2B2B2C( >+ "textureProjGradOffset(0I3B2B2B2C"); >+constexpr const ImmutableString textureProjGradOffset_0Q2B1B1B1C( >+ "textureProjGradOffset(0Q2B1B1B1C"); >+constexpr const ImmutableString textureProjGradOffset_0Q3B1B1B1C( >+ "textureProjGradOffset(0Q3B1B1B1C"); >+constexpr const ImmutableString textureProjGradOffset_0R3B2B2B2C( >+ "textureProjGradOffset(0R3B2B2B2C"); >+constexpr const ImmutableString textureProjGradOffset_0W2B1B1B1C( >+ "textureProjGradOffset(0W2B1B1B1C"); >+constexpr const ImmutableString textureProjGradOffset_0W3B1B1B1C( >+ "textureProjGradOffset(0W3B1B1B1C"); >+constexpr const ImmutableString textureProjGradOffset_0X3B2B2B2C( >+ "textureProjGradOffset(0X3B2B2B2C"); >+constexpr const ImmutableString textureProjGradOffset_0c3B1B1B1C( >+ "textureProjGradOffset(0c3B1B1B1C"); >+constexpr const ImmutableString textureProjGrad_0H2B1B1B("textureProjGrad(0H2B1B1B"); >+constexpr const ImmutableString textureProjGrad_0H3B1B1B("textureProjGrad(0H3B1B1B"); >+constexpr const ImmutableString textureProjGrad_0I3B2B2B("textureProjGrad(0I3B2B2B"); >+constexpr const ImmutableString textureProjGrad_0Q2B1B1B("textureProjGrad(0Q2B1B1B"); >+constexpr const ImmutableString textureProjGrad_0Q3B1B1B("textureProjGrad(0Q3B1B1B"); >+constexpr const ImmutableString textureProjGrad_0R3B2B2B("textureProjGrad(0R3B2B2B"); >+constexpr const ImmutableString textureProjGrad_0W2B1B1B("textureProjGrad(0W2B1B1B"); >+constexpr const ImmutableString textureProjGrad_0W3B1B1B("textureProjGrad(0W3B1B1B"); >+constexpr const ImmutableString textureProjGrad_0X3B2B2B("textureProjGrad(0X3B2B2B"); >+constexpr const ImmutableString textureProjGrad_0c3B1B1B("textureProjGrad(0c3B1B1B"); >+constexpr const ImmutableString textureProjLod("textureProjLod"); >+constexpr const ImmutableString textureProjLodOffset("textureProjLodOffset"); >+constexpr const ImmutableString textureProjLodOffset_0H2B0B1C("textureProjLodOffset(0H2B0B1C"); >+constexpr const ImmutableString textureProjLodOffset_0H3B0B1C("textureProjLodOffset(0H3B0B1C"); >+constexpr const ImmutableString textureProjLodOffset_0I3B0B2C("textureProjLodOffset(0I3B0B2C"); >+constexpr const ImmutableString textureProjLodOffset_0Q2B0B1C("textureProjLodOffset(0Q2B0B1C"); >+constexpr const ImmutableString textureProjLodOffset_0Q3B0B1C("textureProjLodOffset(0Q3B0B1C"); >+constexpr const ImmutableString textureProjLodOffset_0R3B0B2C("textureProjLodOffset(0R3B0B2C"); >+constexpr const ImmutableString textureProjLodOffset_0W2B0B1C("textureProjLodOffset(0W2B0B1C"); >+constexpr const ImmutableString textureProjLodOffset_0W3B0B1C("textureProjLodOffset(0W3B0B1C"); >+constexpr const ImmutableString textureProjLodOffset_0X3B0B2C("textureProjLodOffset(0X3B0B2C"); >+constexpr const ImmutableString textureProjLodOffset_0c3B0B1C("textureProjLodOffset(0c3B0B1C"); >+constexpr const ImmutableString textureProjLod_0H3B0B("textureProjLod(0H3B0B"); >+constexpr const ImmutableString textureProjLod_0I3B0B("textureProjLod(0I3B0B"); >+constexpr const ImmutableString textureProjLod_0Q2B0B("textureProjLod(0Q2B0B"); >+constexpr const ImmutableString textureProjLod_0Q3B0B("textureProjLod(0Q3B0B"); >+constexpr const ImmutableString textureProjOffset("textureProjOffset"); >+constexpr const ImmutableString textureProjOffset_0H2B1C("textureProjOffset(0H2B1C"); >+constexpr const ImmutableString textureProjOffset_0H2B1C0B("textureProjOffset(0H2B1C0B"); >+constexpr const ImmutableString textureProjOffset_0H3B1C("textureProjOffset(0H3B1C"); >+constexpr const ImmutableString textureProjOffset_0H3B1C0B("textureProjOffset(0H3B1C0B"); >+constexpr const ImmutableString textureProjOffset_0I3B2C0B("textureProjOffset(0I3B2C0B"); >+constexpr const ImmutableString textureProjOffset_0Q2B1C("textureProjOffset(0Q2B1C"); >+constexpr const ImmutableString textureProjOffset_0Q2B1C0B("textureProjOffset(0Q2B1C0B"); >+constexpr const ImmutableString textureProjOffset_0Q3B1C("textureProjOffset(0Q3B1C"); >+constexpr const ImmutableString textureProjOffset_0Q3B1C0B("textureProjOffset(0Q3B1C0B"); >+constexpr const ImmutableString textureProjOffset_0R3B2C0B("textureProjOffset(0R3B2C0B"); >+constexpr const ImmutableString textureProjOffset_0W2B1C0B("textureProjOffset(0W2B1C0B"); >+constexpr const ImmutableString textureProjOffset_0W3B1C("textureProjOffset(0W3B1C"); >+constexpr const ImmutableString textureProjOffset_0W3B1C0B("textureProjOffset(0W3B1C0B"); >+constexpr const ImmutableString textureProjOffset_0X3B2C("textureProjOffset(0X3B2C"); >+constexpr const ImmutableString textureProjOffset_0X3B2C0B("textureProjOffset(0X3B2C0B"); >+constexpr const ImmutableString textureProjOffset_0c3B1C0B("textureProjOffset(0c3B1C0B"); >+constexpr const ImmutableString textureProj_0Q2B0B("textureProj(0Q2B0B"); >+constexpr const ImmutableString textureProj_0R3B0B("textureProj(0R3B0B"); >+constexpr const ImmutableString textureProj_0X3B0B("textureProj(0X3B0B"); >+constexpr const ImmutableString textureSize("textureSize"); >+constexpr const ImmutableString textureSizeExt("textureSize"); >+constexpr const ImmutableString texture_0Q1B0B("texture(0Q1B0B"); >+constexpr const ImmutableString texture_0c2B0B("texture(0c2B0B"); >+constexpr const ImmutableString texture_0d3B0B("texture(0d3B0B"); >+constexpr const ImmutableString transpose("transpose"); >+constexpr const ImmutableString trunc("trunc"); >+constexpr const ImmutableString uaddCarry("uaddCarry"); >+constexpr const ImmutableString uaddCarry_2D2D2D("uaddCarry(2D2D2D"); >+constexpr const ImmutableString uaddCarry_3D3D3D("uaddCarry(3D3D3D"); >+constexpr const ImmutableString uintBitsToFloat("uintBitsToFloat"); >+constexpr const ImmutableString umulExtended("umulExtended"); >+constexpr const ImmutableString umulExtended_0D0D0D0D("umulExtended(0D0D0D0D"); >+constexpr const ImmutableString umulExtended_1D1D1D1D("umulExtended(1D1D1D1D"); >+constexpr const ImmutableString umulExtended_2D2D2D2D("umulExtended(2D2D2D2D"); >+constexpr const ImmutableString umulExtended_3D3D3D3D("umulExtended(3D3D3D3D"); >+constexpr const ImmutableString unpackHalf2x16("unpackHalf2x16"); >+constexpr const ImmutableString unpackSnorm2x16("unpackSnorm2x16"); >+constexpr const ImmutableString unpackSnorm4x8("unpackSnorm4x8"); >+constexpr const ImmutableString unpackUnorm2x16("unpackUnorm2x16"); >+constexpr const ImmutableString unpackUnorm4x8("unpackUnorm4x8"); >+constexpr const ImmutableString usubBorrow("usubBorrow"); >+constexpr const ImmutableString usubBorrow_0D0D0D("usubBorrow(0D0D0D"); >+constexpr const ImmutableString usubBorrow_1D1D1D("usubBorrow(1D1D1D"); >+constexpr const ImmutableString usubBorrow_3D3D3D("usubBorrow(3D3D3D"); >+constexpr const ImmutableString yuv_2_rgb("yuv_2_rgb"); >+ >+} // namespace BuiltInName >+ >+// TODO(oetuaho): Would be nice to make this a class instead of a namespace so that we could friend >+// this from TVariable. Now symbol constructors taking an id have to be public even though they're >+// not supposed to be accessible from outside of here. http://anglebug.com/2390 >+namespace BuiltInVariable >+{ >+ >+constexpr const TVariable kVar_gl_DrawID(BuiltInId::gl_DrawID, >+ BuiltInName::gl_DrawID, >+ SymbolType::BuiltIn, >+ TExtension::ANGLE_multi_draw, >+ StaticType::Get<EbtInt, EbpHigh, EvqDrawID, 1, 1>()); >+constexpr const TVariable kVar_gl_DrawIDESSL1(BuiltInId::gl_DrawIDESSL1, >+ BuiltInName::gl_DrawID, >+ SymbolType::BuiltIn, >+ TExtension::ANGLE_multi_draw, >+ StaticType::Get<EbtInt, EbpHigh, EvqDrawID, 1, 1>()); >+constexpr const TVariable kVar_gl_FragColor( >+ BuiltInId::gl_FragColor, >+ BuiltInName::gl_FragColor, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpMedium, EvqFragColor, 4, 1>()); >+constexpr const TVariable kVar_gl_FragCoord( >+ BuiltInId::gl_FragCoord, >+ BuiltInName::gl_FragCoord, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpMedium, EvqFragCoord, 4, 1>()); >+constexpr const TVariable kVar_gl_FragDepth( >+ BuiltInId::gl_FragDepth, >+ BuiltInName::gl_FragDepth, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpHigh, EvqFragDepth, 1, 1>()); >+constexpr const TVariable kVar_gl_FrontFacing( >+ BuiltInId::gl_FrontFacing, >+ BuiltInName::gl_FrontFacing, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtBool, EbpUndefined, EvqFrontFacing, 1, 1>()); >+constexpr const TVariable kVar_gl_GlobalInvocationID( >+ BuiltInId::gl_GlobalInvocationID, >+ BuiltInName::gl_GlobalInvocationID, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobalInvocationID, 3, 1>()); >+constexpr const TVariable kVar_gl_InstanceID( >+ BuiltInId::gl_InstanceID, >+ BuiltInName::gl_InstanceID, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpHigh, EvqInstanceID, 1, 1>()); >+constexpr const TVariable kVar_gl_InvocationID( >+ BuiltInId::gl_InvocationID, >+ BuiltInName::gl_InvocationID, >+ SymbolType::BuiltIn, >+ TExtension::EXT_geometry_shader, >+ StaticType::Get<EbtInt, EbpHigh, EvqInvocationID, 1, 1>()); >+constexpr const TVariable kVar_gl_LastFragColor( >+ BuiltInId::gl_LastFragColor, >+ BuiltInName::gl_LastFragColor, >+ SymbolType::BuiltIn, >+ TExtension::NV_shader_framebuffer_fetch, >+ StaticType::Get<EbtFloat, EbpMedium, EvqLastFragColor, 4, 1>()); >+constexpr const TVariable kVar_gl_LastFragColorARM( >+ BuiltInId::gl_LastFragColorARM, >+ BuiltInName::gl_LastFragColorARM, >+ SymbolType::BuiltIn, >+ TExtension::ARM_shader_framebuffer_fetch, >+ StaticType::Get<EbtFloat, EbpMedium, EvqLastFragColor, 4, 1>()); >+constexpr const TVariable kVar_gl_Layer(BuiltInId::gl_Layer, >+ BuiltInName::gl_Layer, >+ SymbolType::BuiltIn, >+ TExtension::EXT_geometry_shader, >+ StaticType::Get<EbtInt, EbpHigh, EvqLayer, 1, 1>()); >+constexpr const TVariable kVar_gl_LayerGS(BuiltInId::gl_LayerGS, >+ BuiltInName::gl_Layer, >+ SymbolType::BuiltIn, >+ TExtension::EXT_geometry_shader, >+ StaticType::Get<EbtInt, EbpHigh, EvqLayer, 1, 1>()); >+constexpr const TVariable kVar_gl_LayerVS(BuiltInId::gl_LayerVS, >+ BuiltInName::gl_Layer, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpHigh, EvqLayer, 1, 1>()); >+constexpr const TVariable kVar_gl_LocalInvocationID( >+ BuiltInId::gl_LocalInvocationID, >+ BuiltInName::gl_LocalInvocationID, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqLocalInvocationID, 3, 1>()); >+constexpr const TVariable kVar_gl_LocalInvocationIndex( >+ BuiltInId::gl_LocalInvocationIndex, >+ BuiltInName::gl_LocalInvocationIndex, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqLocalInvocationIndex, 1, 1>()); >+constexpr const TVariable kVar_gl_NumWorkGroups( >+ BuiltInId::gl_NumWorkGroups, >+ BuiltInName::gl_NumWorkGroups, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqNumWorkGroups, 3, 1>()); >+constexpr const TVariable kVar_gl_PointCoord( >+ BuiltInId::gl_PointCoord, >+ BuiltInName::gl_PointCoord, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpMedium, EvqPointCoord, 2, 1>()); >+constexpr const TVariable kVar_gl_PointSize( >+ BuiltInId::gl_PointSize, >+ BuiltInName::gl_PointSize, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpMedium, EvqPointSize, 1, 1>()); >+constexpr const TVariable kVar_gl_Position(BuiltInId::gl_Position, >+ BuiltInName::gl_Position, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpHigh, EvqPosition, 4, 1>()); >+constexpr const TVariable kVar_gl_PrimitiveID( >+ BuiltInId::gl_PrimitiveID, >+ BuiltInName::gl_PrimitiveID, >+ SymbolType::BuiltIn, >+ TExtension::EXT_geometry_shader, >+ StaticType::Get<EbtInt, EbpHigh, EvqPrimitiveID, 1, 1>()); >+constexpr const TVariable kVar_gl_PrimitiveIDGS( >+ BuiltInId::gl_PrimitiveIDGS, >+ BuiltInName::gl_PrimitiveID, >+ SymbolType::BuiltIn, >+ TExtension::EXT_geometry_shader, >+ StaticType::Get<EbtInt, EbpHigh, EvqPrimitiveID, 1, 1>()); >+constexpr const TVariable kVar_gl_PrimitiveIDIn( >+ BuiltInId::gl_PrimitiveIDIn, >+ BuiltInName::gl_PrimitiveIDIn, >+ SymbolType::BuiltIn, >+ TExtension::EXT_geometry_shader, >+ StaticType::Get<EbtInt, EbpHigh, EvqPrimitiveIDIn, 1, 1>()); >+constexpr const TVariable kVar_gl_SecondaryFragColorEXT( >+ BuiltInId::gl_SecondaryFragColorEXT, >+ BuiltInName::gl_SecondaryFragColorEXT, >+ SymbolType::BuiltIn, >+ TExtension::EXT_blend_func_extended, >+ StaticType::Get<EbtFloat, EbpMedium, EvqSecondaryFragColorEXT, 4, 1>()); >+constexpr const TVariable kVar_gl_VertexID(BuiltInId::gl_VertexID, >+ BuiltInName::gl_VertexID, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpHigh, EvqVertexID, 1, 1>()); >+constexpr const TVariable kVar_gl_ViewID_OVR( >+ BuiltInId::gl_ViewID_OVR, >+ BuiltInName::gl_ViewID_OVR, >+ SymbolType::BuiltIn, >+ TExtension::OVR_multiview2, >+ StaticType::Get<EbtUInt, EbpHigh, EvqViewIDOVR, 1, 1>()); >+constexpr const TVariable kVar_gl_ViewID_OVRESSL1( >+ BuiltInId::gl_ViewID_OVRESSL1, >+ BuiltInName::gl_ViewID_OVR, >+ SymbolType::BuiltIn, >+ TExtension::OVR_multiview2, >+ StaticType::Get<EbtInt, EbpHigh, EvqViewIDOVR, 1, 1>()); >+constexpr const TVariable kVar_gl_ViewportIndex( >+ BuiltInId::gl_ViewportIndex, >+ BuiltInName::gl_ViewportIndex, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpHigh, EvqViewportIndex, 1, 1>()); >+constexpr const TVariable kVar_gl_WorkGroupID( >+ BuiltInId::gl_WorkGroupID, >+ BuiltInName::gl_WorkGroupID, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqWorkGroupID, 3, 1>()); >+constexpr const TVariable kVar_gl_WorkGroupSize( >+ BuiltInId::gl_WorkGroupSize, >+ BuiltInName::gl_WorkGroupSize, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqWorkGroupSize, 3, 1>()); >+constexpr const TVariable kVar_pt0B(BuiltInId::pt0B, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0C(BuiltInId::pt0C, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0D(BuiltInId::pt0D, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0E(BuiltInId::pt0E, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0F( >+ BuiltInId::pt0F, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtAtomicCounter, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0G( >+ BuiltInId::pt0G, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtYuvCscStandardEXT, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0H(BuiltInId::pt0H, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtSampler2D, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0I(BuiltInId::pt0I, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtSampler3D, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0J( >+ BuiltInId::pt0J, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtSamplerCube, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0K( >+ BuiltInId::pt0K, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtSampler2DArray, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0L( >+ BuiltInId::pt0L, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtSamplerExternalOES, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0M( >+ BuiltInId::pt0M, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtSamplerExternal2DY2YEXT, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0N( >+ BuiltInId::pt0N, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtSampler2DRect, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0O( >+ BuiltInId::pt0O, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtSampler2DMS, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0P( >+ BuiltInId::pt0P, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtSampler2DMSArray, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0Q( >+ BuiltInId::pt0Q, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtISampler2D, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0R( >+ BuiltInId::pt0R, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtISampler3D, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0S( >+ BuiltInId::pt0S, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtISamplerCube, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0T( >+ BuiltInId::pt0T, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtISampler2DArray, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0U( >+ BuiltInId::pt0U, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtISampler2DMS, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0V( >+ BuiltInId::pt0V, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtISampler2DMSArray, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0W( >+ BuiltInId::pt0W, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUSampler2D, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0X( >+ BuiltInId::pt0X, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUSampler3D, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0Y( >+ BuiltInId::pt0Y, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUSamplerCube, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0Z( >+ BuiltInId::pt0Z, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUSampler2DArray, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0a( >+ BuiltInId::pt0a, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUSampler2DMS, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0b( >+ BuiltInId::pt0b, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUSampler2DMSArray, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0c( >+ BuiltInId::pt0c, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtSampler2DShadow, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0d( >+ BuiltInId::pt0d, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtSamplerCubeShadow, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0e( >+ BuiltInId::pt0e, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtSampler2DArrayShadow, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0f(BuiltInId::pt0f, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtImage2D, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0g(BuiltInId::pt0g, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtIImage2D, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0h(BuiltInId::pt0h, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUImage2D, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0i(BuiltInId::pt0i, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtImage3D, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0j(BuiltInId::pt0j, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtIImage3D, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0k(BuiltInId::pt0k, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUImage3D, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0l( >+ BuiltInId::pt0l, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtImage2DArray, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0m( >+ BuiltInId::pt0m, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtIImage2DArray, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0n( >+ BuiltInId::pt0n, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUImage2DArray, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0o(BuiltInId::pt0o, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtImageCube, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0p( >+ BuiltInId::pt0p, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtIImageCube, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt0q( >+ BuiltInId::pt0q, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUImageCube, EbpUndefined, EvqGlobal, 1, 1>()); >+constexpr const TVariable kVar_pt1B(BuiltInId::pt1B, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>()); >+constexpr const TVariable kVar_pt1C(BuiltInId::pt1C, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>()); >+constexpr const TVariable kVar_pt1D(BuiltInId::pt1D, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>()); >+constexpr const TVariable kVar_pt1E(BuiltInId::pt1E, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>()); >+constexpr const TVariable kVar_pt2B(BuiltInId::pt2B, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>()); >+constexpr const TVariable kVar_pt2C(BuiltInId::pt2C, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>()); >+constexpr const TVariable kVar_pt2D(BuiltInId::pt2D, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>()); >+constexpr const TVariable kVar_pt2E(BuiltInId::pt2E, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>()); >+constexpr const TVariable kVar_pt3B(BuiltInId::pt3B, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>()); >+constexpr const TVariable kVar_pt3C(BuiltInId::pt3C, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>()); >+constexpr const TVariable kVar_pt3D(BuiltInId::pt3D, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>()); >+constexpr const TVariable kVar_pt3E(BuiltInId::pt3E, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>()); >+constexpr const TVariable kVar_pt5B(BuiltInId::pt5B, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 2>()); >+constexpr const TVariable kVar_pt6B(BuiltInId::pt6B, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 2>()); >+constexpr const TVariable kVar_pt7B(BuiltInId::pt7B, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 2>()); >+constexpr const TVariable kVar_pt9B(BuiltInId::pt9B, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 3>()); >+constexpr const TVariable kVar_ptAB(BuiltInId::ptAB, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 3>()); >+constexpr const TVariable kVar_ptBB(BuiltInId::ptBB, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 3>()); >+constexpr const TVariable kVar_ptDB(BuiltInId::ptDB, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 4>()); >+constexpr const TVariable kVar_ptEB(BuiltInId::ptEB, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 4>()); >+constexpr const TVariable kVar_ptFB(BuiltInId::ptFB, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 4>()); >+constexpr const TVariable kVar_pt_io_0C(BuiltInId::pt_io_0C, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpUndefined, EvqInOut, 1, 1>()); >+constexpr const TVariable kVar_pt_io_0D(BuiltInId::pt_io_0D, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqInOut, 1, 1>()); >+constexpr const TVariable kVar_pt_o_0B(BuiltInId::pt_o_0B, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqOut, 1, 1>()); >+constexpr const TVariable kVar_pt_o_0C(BuiltInId::pt_o_0C, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpUndefined, EvqOut, 1, 1>()); >+constexpr const TVariable kVar_pt_o_0D(BuiltInId::pt_o_0D, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqOut, 1, 1>()); >+constexpr const TVariable kVar_pt_o_1B(BuiltInId::pt_o_1B, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqOut, 2, 1>()); >+constexpr const TVariable kVar_pt_o_1C(BuiltInId::pt_o_1C, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpUndefined, EvqOut, 2, 1>()); >+constexpr const TVariable kVar_pt_o_1D(BuiltInId::pt_o_1D, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqOut, 2, 1>()); >+constexpr const TVariable kVar_pt_o_2B(BuiltInId::pt_o_2B, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqOut, 3, 1>()); >+constexpr const TVariable kVar_pt_o_2C(BuiltInId::pt_o_2C, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpUndefined, EvqOut, 3, 1>()); >+constexpr const TVariable kVar_pt_o_2D(BuiltInId::pt_o_2D, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqOut, 3, 1>()); >+constexpr const TVariable kVar_pt_o_3B(BuiltInId::pt_o_3B, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqOut, 4, 1>()); >+constexpr const TVariable kVar_pt_o_3C(BuiltInId::pt_o_3C, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpUndefined, EvqOut, 4, 1>()); >+constexpr const TVariable kVar_pt_o_3D(BuiltInId::pt_o_3D, >+ BuiltInName::_empty, >+ SymbolType::BuiltIn, >+ TExtension::UNDEFINED, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqOut, 4, 1>()); >+ >+const TVariable *gl_DrawID() >+{ >+ return &kVar_gl_DrawID; >+} >+ >+const TVariable *gl_DrawIDESSL1() >+{ >+ return &kVar_gl_DrawIDESSL1; >+} >+ >+const TVariable *gl_FragColor() >+{ >+ return &kVar_gl_FragColor; >+} >+ >+const TVariable *gl_FragCoord() >+{ >+ return &kVar_gl_FragCoord; >+} >+ >+const TVariable *gl_FragDepth() >+{ >+ return &kVar_gl_FragDepth; >+} >+ >+const TVariable *gl_FrontFacing() >+{ >+ return &kVar_gl_FrontFacing; >+} >+ >+const TVariable *gl_GlobalInvocationID() >+{ >+ return &kVar_gl_GlobalInvocationID; >+} >+ >+const TVariable *gl_InstanceID() >+{ >+ return &kVar_gl_InstanceID; >+} >+ >+const TVariable *gl_InvocationID() >+{ >+ return &kVar_gl_InvocationID; >+} >+ >+const TVariable *gl_LastFragColor() >+{ >+ return &kVar_gl_LastFragColor; >+} >+ >+const TVariable *gl_LastFragColorARM() >+{ >+ return &kVar_gl_LastFragColorARM; >+} >+ >+const TVariable *gl_Layer() >+{ >+ return &kVar_gl_Layer; >+} >+ >+const TVariable *gl_LayerGS() >+{ >+ return &kVar_gl_LayerGS; >+} >+ >+const TVariable *gl_LayerVS() >+{ >+ return &kVar_gl_LayerVS; >+} >+ >+const TVariable *gl_LocalInvocationID() >+{ >+ return &kVar_gl_LocalInvocationID; >+} >+ >+const TVariable *gl_LocalInvocationIndex() >+{ >+ return &kVar_gl_LocalInvocationIndex; >+} >+ >+const TVariable *gl_NumWorkGroups() >+{ >+ return &kVar_gl_NumWorkGroups; >+} >+ >+const TVariable *gl_PointCoord() >+{ >+ return &kVar_gl_PointCoord; >+} >+ >+const TVariable *gl_PointSize() >+{ >+ return &kVar_gl_PointSize; >+} >+ >+const TVariable *gl_Position() >+{ >+ return &kVar_gl_Position; >+} >+ >+const TVariable *gl_PrimitiveID() >+{ >+ return &kVar_gl_PrimitiveID; >+} >+ >+const TVariable *gl_PrimitiveIDGS() >+{ >+ return &kVar_gl_PrimitiveIDGS; >+} >+ >+const TVariable *gl_PrimitiveIDIn() >+{ >+ return &kVar_gl_PrimitiveIDIn; >+} >+ >+const TVariable *gl_SecondaryFragColorEXT() >+{ >+ return &kVar_gl_SecondaryFragColorEXT; >+} >+ >+const TVariable *gl_VertexID() >+{ >+ return &kVar_gl_VertexID; >+} >+ >+const TVariable *gl_ViewID_OVR() >+{ >+ return &kVar_gl_ViewID_OVR; >+} >+ >+const TVariable *gl_ViewID_OVRESSL1() >+{ >+ return &kVar_gl_ViewID_OVRESSL1; >+} >+ >+const TVariable *gl_ViewportIndex() >+{ >+ return &kVar_gl_ViewportIndex; >+} >+ >+const TVariable *gl_WorkGroupID() >+{ >+ return &kVar_gl_WorkGroupID; >+} >+ >+const TVariable *gl_WorkGroupSize() >+{ >+ return &kVar_gl_WorkGroupSize; >+} >+ >+} // namespace BuiltInVariable >+ >+namespace BuiltInParameters >+{ >+ >+constexpr const TVariable **empty = nullptr; >+constexpr const TVariable *p0B0B0B[3] = {&BuiltInVariable::kVar_pt0B, &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0B0B0E[3] = {&BuiltInVariable::kVar_pt0B, &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt0E}; >+constexpr const TVariable *p0B0B1B[3] = {&BuiltInVariable::kVar_pt0B, &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1B}; >+constexpr const TVariable *p0B0B2B[3] = {&BuiltInVariable::kVar_pt0B, &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt2B}; >+constexpr const TVariable *p0B0B3B[3] = {&BuiltInVariable::kVar_pt0B, &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt3B}; >+constexpr const TVariable *p0B0C[2] = {&BuiltInVariable::kVar_pt0B, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0B1B[2] = {&BuiltInVariable::kVar_pt0B, &BuiltInVariable::kVar_pt1B}; >+constexpr const TVariable *p0B2B[2] = {&BuiltInVariable::kVar_pt0B, &BuiltInVariable::kVar_pt2B}; >+constexpr const TVariable *p0B3B[2] = {&BuiltInVariable::kVar_pt0B, &BuiltInVariable::kVar_pt3B}; >+constexpr const TVariable *p0B_o_0B[2] = {&BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt_o_0B}; >+constexpr const TVariable *p0B_o_0C[2] = {&BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt_o_0C}; >+constexpr const TVariable *p0C0C0C0C[4] = {&BuiltInVariable::kVar_pt0C, &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0C0C_o_0C_o_0C[4] = { >+ &BuiltInVariable::kVar_pt0C, &BuiltInVariable::kVar_pt0C, &BuiltInVariable::kVar_pt_o_0C, >+ &BuiltInVariable::kVar_pt_o_0C}; >+constexpr const TVariable *p0D0C0C[3] = {&BuiltInVariable::kVar_pt0D, &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0D0D0C0C[4] = {&BuiltInVariable::kVar_pt0D, &BuiltInVariable::kVar_pt0D, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0D0D0D[3] = {&BuiltInVariable::kVar_pt0D, &BuiltInVariable::kVar_pt0D, >+ &BuiltInVariable::kVar_pt0D}; >+constexpr const TVariable *p0D0D_o_0D_o_0D[4] = { >+ &BuiltInVariable::kVar_pt0D, &BuiltInVariable::kVar_pt0D, &BuiltInVariable::kVar_pt_o_0D, >+ &BuiltInVariable::kVar_pt_o_0D}; >+constexpr const TVariable *p0F[1] = {&BuiltInVariable::kVar_pt0F}; >+constexpr const TVariable *p0H0C[2] = {&BuiltInVariable::kVar_pt0H, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0H1B0B1C[4] = {&BuiltInVariable::kVar_pt0H, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0H1B0C[3] = {&BuiltInVariable::kVar_pt0H, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0H1B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0H, &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0H1B1C0B[4] = {&BuiltInVariable::kVar_pt0H, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0H1B1C0C[4] = {&BuiltInVariable::kVar_pt0H, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0H1C0C1C[4] = {&BuiltInVariable::kVar_pt0H, &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0H2B0B1C[4] = {&BuiltInVariable::kVar_pt0H, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0H2B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0H, &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0H2B1C0B[4] = {&BuiltInVariable::kVar_pt0H, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0H3B0B1C[4] = {&BuiltInVariable::kVar_pt0H, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0H3B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0H, &BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0H3B1C0B[4] = {&BuiltInVariable::kVar_pt0H, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0I0C[2] = {&BuiltInVariable::kVar_pt0I, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0I2B0B2C[4] = {&BuiltInVariable::kVar_pt0I, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0I2B2B2B2C[5] = { >+ &BuiltInVariable::kVar_pt0I, &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0I2B2C0B[4] = {&BuiltInVariable::kVar_pt0I, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0I2C0C2C[4] = {&BuiltInVariable::kVar_pt0I, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0I3B0B2C[4] = {&BuiltInVariable::kVar_pt0I, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0I3B2B2B2C[5] = { >+ &BuiltInVariable::kVar_pt0I, &BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0I3B2C0B[4] = {&BuiltInVariable::kVar_pt0I, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0J0C[2] = {&BuiltInVariable::kVar_pt0J, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0J2B0B[3] = {&BuiltInVariable::kVar_pt0J, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0J2B0C[3] = {&BuiltInVariable::kVar_pt0J, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0J2B2B2B[4] = {&BuiltInVariable::kVar_pt0J, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2B}; >+constexpr const TVariable *p0K0C[2] = {&BuiltInVariable::kVar_pt0K, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0K2B0B1C[4] = {&BuiltInVariable::kVar_pt0K, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0K2B0C[3] = {&BuiltInVariable::kVar_pt0K, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0K2B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0K, &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0K2B1C0B[4] = {&BuiltInVariable::kVar_pt0K, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0K2B1C0C[4] = {&BuiltInVariable::kVar_pt0K, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0K2C0C1C[4] = {&BuiltInVariable::kVar_pt0K, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0L0C[2] = {&BuiltInVariable::kVar_pt0L, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0L1B0B[3] = {&BuiltInVariable::kVar_pt0L, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0L1C0C[3] = {&BuiltInVariable::kVar_pt0L, &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0L2B0B[3] = {&BuiltInVariable::kVar_pt0L, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0L3B0B[3] = {&BuiltInVariable::kVar_pt0L, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0M0C[2] = {&BuiltInVariable::kVar_pt0M, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0M1B0B[3] = {&BuiltInVariable::kVar_pt0M, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0M1C0C[3] = {&BuiltInVariable::kVar_pt0M, &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0M2B0B[3] = {&BuiltInVariable::kVar_pt0M, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0M3B0B[3] = {&BuiltInVariable::kVar_pt0M, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0N1B[2] = {&BuiltInVariable::kVar_pt0N, &BuiltInVariable::kVar_pt1B}; >+constexpr const TVariable *p0N2B[2] = {&BuiltInVariable::kVar_pt0N, &BuiltInVariable::kVar_pt2B}; >+constexpr const TVariable *p0N3B[2] = {&BuiltInVariable::kVar_pt0N, &BuiltInVariable::kVar_pt3B}; >+constexpr const TVariable *p0O1C0C[3] = {&BuiltInVariable::kVar_pt0O, &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0P2C0C[3] = {&BuiltInVariable::kVar_pt0P, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0Q0C[2] = {&BuiltInVariable::kVar_pt0Q, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0Q1B0B1C[4] = {&BuiltInVariable::kVar_pt0Q, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0Q1B0C[3] = {&BuiltInVariable::kVar_pt0Q, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0Q1B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0Q, &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0Q1B1C0B[4] = {&BuiltInVariable::kVar_pt0Q, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0Q1B1C0C[4] = {&BuiltInVariable::kVar_pt0Q, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0Q1C0C1C[4] = {&BuiltInVariable::kVar_pt0Q, &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0Q2B0B1C[4] = {&BuiltInVariable::kVar_pt0Q, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0Q2B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0Q, &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0Q2B1C0B[4] = {&BuiltInVariable::kVar_pt0Q, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0Q3B0B1C[4] = {&BuiltInVariable::kVar_pt0Q, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0Q3B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0Q, &BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0Q3B1C0B[4] = {&BuiltInVariable::kVar_pt0Q, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0R0C[2] = {&BuiltInVariable::kVar_pt0R, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0R2B0B2C[4] = {&BuiltInVariable::kVar_pt0R, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0R2B2B2B2C[5] = { >+ &BuiltInVariable::kVar_pt0R, &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0R2B2C0B[4] = {&BuiltInVariable::kVar_pt0R, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0R2C0C2C[4] = {&BuiltInVariable::kVar_pt0R, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0R3B0B2C[4] = {&BuiltInVariable::kVar_pt0R, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0R3B2B2B2C[5] = { >+ &BuiltInVariable::kVar_pt0R, &BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0R3B2C0B[4] = {&BuiltInVariable::kVar_pt0R, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0S0C[2] = {&BuiltInVariable::kVar_pt0S, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0S2B0B[3] = {&BuiltInVariable::kVar_pt0S, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0S2B0C[3] = {&BuiltInVariable::kVar_pt0S, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0S2B2B2B[4] = {&BuiltInVariable::kVar_pt0S, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2B}; >+constexpr const TVariable *p0T0C[2] = {&BuiltInVariable::kVar_pt0T, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0T2B0B1C[4] = {&BuiltInVariable::kVar_pt0T, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0T2B0C[3] = {&BuiltInVariable::kVar_pt0T, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0T2B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0T, &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0T2B1C0B[4] = {&BuiltInVariable::kVar_pt0T, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0T2B1C0C[4] = {&BuiltInVariable::kVar_pt0T, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0T2C0C1C[4] = {&BuiltInVariable::kVar_pt0T, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0U1C0C[3] = {&BuiltInVariable::kVar_pt0U, &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0V2C0C[3] = {&BuiltInVariable::kVar_pt0V, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0W0C[2] = {&BuiltInVariable::kVar_pt0W, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0W1B0B1C[4] = {&BuiltInVariable::kVar_pt0W, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0W1B0C[3] = {&BuiltInVariable::kVar_pt0W, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0W1B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0W, &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0W1B1C0B[4] = {&BuiltInVariable::kVar_pt0W, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0W1B1C0C[4] = {&BuiltInVariable::kVar_pt0W, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0W1C0C1C[4] = {&BuiltInVariable::kVar_pt0W, &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0W2B0B1C[4] = {&BuiltInVariable::kVar_pt0W, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0W2B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0W, &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0W2B1C0B[4] = {&BuiltInVariable::kVar_pt0W, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0W3B0B1C[4] = {&BuiltInVariable::kVar_pt0W, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0W3B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0W, &BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0W3B1C0B[4] = {&BuiltInVariable::kVar_pt0W, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0X0C[2] = {&BuiltInVariable::kVar_pt0X, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0X2B0B2C[4] = {&BuiltInVariable::kVar_pt0X, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0X2B2B2B2C[5] = { >+ &BuiltInVariable::kVar_pt0X, &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0X2B2C0B[4] = {&BuiltInVariable::kVar_pt0X, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0X2C0C2C[4] = {&BuiltInVariable::kVar_pt0X, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0X3B0B2C[4] = {&BuiltInVariable::kVar_pt0X, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0X3B2B2B2C[5] = { >+ &BuiltInVariable::kVar_pt0X, &BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p0X3B2C0B[4] = {&BuiltInVariable::kVar_pt0X, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0Y0C[2] = {&BuiltInVariable::kVar_pt0Y, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0Y2B0B[3] = {&BuiltInVariable::kVar_pt0Y, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0Y2B0C[3] = {&BuiltInVariable::kVar_pt0Y, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0Y2B2B2B[4] = {&BuiltInVariable::kVar_pt0Y, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2B}; >+constexpr const TVariable *p0Z0C[2] = {&BuiltInVariable::kVar_pt0Z, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0Z2B0B1C[4] = {&BuiltInVariable::kVar_pt0Z, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0Z2B0C[3] = {&BuiltInVariable::kVar_pt0Z, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0Z2B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0Z, &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0Z2B1C0B[4] = {&BuiltInVariable::kVar_pt0Z, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0Z2B1C0C[4] = {&BuiltInVariable::kVar_pt0Z, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0Z2C0C1C[4] = {&BuiltInVariable::kVar_pt0Z, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0a1C0C[3] = {&BuiltInVariable::kVar_pt0a, &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0b2C0C[3] = {&BuiltInVariable::kVar_pt0b, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0c0C[2] = {&BuiltInVariable::kVar_pt0c, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0c1B0B1C[4] = {&BuiltInVariable::kVar_pt0c, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0c2B0B1C[4] = {&BuiltInVariable::kVar_pt0c, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0c2B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0c, &BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0c2B1C0B[4] = {&BuiltInVariable::kVar_pt0c, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0c3B0B1C[4] = {&BuiltInVariable::kVar_pt0c, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0c3B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0c, &BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0c3B1C0B[4] = {&BuiltInVariable::kVar_pt0c, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0d0C[2] = {&BuiltInVariable::kVar_pt0d, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0d2B0B[3] = {&BuiltInVariable::kVar_pt0d, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0d3B0B[3] = {&BuiltInVariable::kVar_pt0d, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p0d3B2B2B[4] = {&BuiltInVariable::kVar_pt0d, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2B}; >+constexpr const TVariable *p0e0C[2] = {&BuiltInVariable::kVar_pt0e, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p0e2B0B1C[4] = {&BuiltInVariable::kVar_pt0e, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0e3B1B1B1C[5] = { >+ &BuiltInVariable::kVar_pt0e, &BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p0f1C3B[3] = {&BuiltInVariable::kVar_pt0f, &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt3B}; >+constexpr const TVariable *p0g1C3C[3] = {&BuiltInVariable::kVar_pt0g, &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt3C}; >+constexpr const TVariable *p0h1C3D[3] = {&BuiltInVariable::kVar_pt0h, &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt3D}; >+constexpr const TVariable *p0i2C3B[3] = {&BuiltInVariable::kVar_pt0i, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt3B}; >+constexpr const TVariable *p0j2C3C[3] = {&BuiltInVariable::kVar_pt0j, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt3C}; >+constexpr const TVariable *p0k2C3D[3] = {&BuiltInVariable::kVar_pt0k, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt3D}; >+constexpr const TVariable *p0l2C3B[3] = {&BuiltInVariable::kVar_pt0l, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt3B}; >+constexpr const TVariable *p0m2C3C[3] = {&BuiltInVariable::kVar_pt0m, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt3C}; >+constexpr const TVariable *p0n2C3D[3] = {&BuiltInVariable::kVar_pt0n, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt3D}; >+constexpr const TVariable *p0o2C3B[3] = {&BuiltInVariable::kVar_pt0o, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt3B}; >+constexpr const TVariable *p0p2C3C[3] = {&BuiltInVariable::kVar_pt0p, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt3C}; >+constexpr const TVariable *p0q2C3D[3] = {&BuiltInVariable::kVar_pt0q, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt3D}; >+constexpr const TVariable *p1B0B0B[3] = {&BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p1B1B0B[3] = {&BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p1B1B1B[3] = {&BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1B}; >+constexpr const TVariable *p1B1B1E[3] = {&BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt1E}; >+constexpr const TVariable *p1B1C[2] = {&BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p1B2B[2] = {&BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt2B}; >+constexpr const TVariable *p1B3B[2] = {&BuiltInVariable::kVar_pt1B, &BuiltInVariable::kVar_pt3B}; >+constexpr const TVariable *p1B_o_1B[2] = {&BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt_o_1B}; >+constexpr const TVariable *p1B_o_1C[2] = {&BuiltInVariable::kVar_pt1B, >+ &BuiltInVariable::kVar_pt_o_1C}; >+constexpr const TVariable *p1C0C0C[3] = {&BuiltInVariable::kVar_pt1C, &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p1C1C0C0C[4] = {&BuiltInVariable::kVar_pt1C, &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p1C1C1C[3] = {&BuiltInVariable::kVar_pt1C, &BuiltInVariable::kVar_pt1C, >+ &BuiltInVariable::kVar_pt1C}; >+constexpr const TVariable *p1C1C_o_1C_o_1C[4] = { >+ &BuiltInVariable::kVar_pt1C, &BuiltInVariable::kVar_pt1C, &BuiltInVariable::kVar_pt_o_1C, >+ &BuiltInVariable::kVar_pt_o_1C}; >+constexpr const TVariable *p1D0C0C[3] = {&BuiltInVariable::kVar_pt1D, &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p1D0D0D[3] = {&BuiltInVariable::kVar_pt1D, &BuiltInVariable::kVar_pt0D, >+ &BuiltInVariable::kVar_pt0D}; >+constexpr const TVariable *p1D1D0C0C[4] = {&BuiltInVariable::kVar_pt1D, &BuiltInVariable::kVar_pt1D, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p1D1D1D[3] = {&BuiltInVariable::kVar_pt1D, &BuiltInVariable::kVar_pt1D, >+ &BuiltInVariable::kVar_pt1D}; >+constexpr const TVariable *p1D1D_o_1D_o_1D[4] = { >+ &BuiltInVariable::kVar_pt1D, &BuiltInVariable::kVar_pt1D, &BuiltInVariable::kVar_pt_o_1D, >+ &BuiltInVariable::kVar_pt_o_1D}; >+constexpr const TVariable *p1E1E[2] = {&BuiltInVariable::kVar_pt1E, &BuiltInVariable::kVar_pt1E}; >+constexpr const TVariable *p2B0B0B[3] = {&BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p2B0G[2] = {&BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt0G}; >+constexpr const TVariable *p2B1B[2] = {&BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt1B}; >+constexpr const TVariable *p2B2B0B[3] = {&BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p2B2B2B[3] = {&BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2B}; >+constexpr const TVariable *p2B2B2E[3] = {&BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt2E}; >+constexpr const TVariable *p2B2C[2] = {&BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p2B3B[2] = {&BuiltInVariable::kVar_pt2B, &BuiltInVariable::kVar_pt3B}; >+constexpr const TVariable *p2B_o_2B[2] = {&BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt_o_2B}; >+constexpr const TVariable *p2B_o_2C[2] = {&BuiltInVariable::kVar_pt2B, >+ &BuiltInVariable::kVar_pt_o_2C}; >+constexpr const TVariable *p2C0C0C[3] = {&BuiltInVariable::kVar_pt2C, &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p2C2C0C0C[4] = {&BuiltInVariable::kVar_pt2C, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p2C2C2C[3] = {&BuiltInVariable::kVar_pt2C, &BuiltInVariable::kVar_pt2C, >+ &BuiltInVariable::kVar_pt2C}; >+constexpr const TVariable *p2C2C_o_2C_o_2C[4] = { >+ &BuiltInVariable::kVar_pt2C, &BuiltInVariable::kVar_pt2C, &BuiltInVariable::kVar_pt_o_2C, >+ &BuiltInVariable::kVar_pt_o_2C}; >+constexpr const TVariable *p2D0C0C[3] = {&BuiltInVariable::kVar_pt2D, &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p2D0D0D[3] = {&BuiltInVariable::kVar_pt2D, &BuiltInVariable::kVar_pt0D, >+ &BuiltInVariable::kVar_pt0D}; >+constexpr const TVariable *p2D2D0C0C[4] = {&BuiltInVariable::kVar_pt2D, &BuiltInVariable::kVar_pt2D, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p2D2D2D[3] = {&BuiltInVariable::kVar_pt2D, &BuiltInVariable::kVar_pt2D, >+ &BuiltInVariable::kVar_pt2D}; >+constexpr const TVariable *p2D2D_o_2D_o_2D[4] = { >+ &BuiltInVariable::kVar_pt2D, &BuiltInVariable::kVar_pt2D, &BuiltInVariable::kVar_pt_o_2D, >+ &BuiltInVariable::kVar_pt_o_2D}; >+constexpr const TVariable *p2E2E[2] = {&BuiltInVariable::kVar_pt2E, &BuiltInVariable::kVar_pt2E}; >+constexpr const TVariable *p3B0B0B[3] = {&BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt0B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p3B1B[2] = {&BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt1B}; >+constexpr const TVariable *p3B2B[2] = {&BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt2B}; >+constexpr const TVariable *p3B3B0B[3] = {&BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt0B}; >+constexpr const TVariable *p3B3B3B[3] = {&BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt3B}; >+constexpr const TVariable *p3B3B3E[3] = {&BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt3E}; >+constexpr const TVariable *p3B3C[2] = {&BuiltInVariable::kVar_pt3B, &BuiltInVariable::kVar_pt3C}; >+constexpr const TVariable *p3B_o_3B[2] = {&BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt_o_3B}; >+constexpr const TVariable *p3B_o_3C[2] = {&BuiltInVariable::kVar_pt3B, >+ &BuiltInVariable::kVar_pt_o_3C}; >+constexpr const TVariable *p3C0C0C[3] = {&BuiltInVariable::kVar_pt3C, &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p3C3C0C0C[4] = {&BuiltInVariable::kVar_pt3C, &BuiltInVariable::kVar_pt3C, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p3C3C3C[3] = {&BuiltInVariable::kVar_pt3C, &BuiltInVariable::kVar_pt3C, >+ &BuiltInVariable::kVar_pt3C}; >+constexpr const TVariable *p3C3C_o_3C_o_3C[4] = { >+ &BuiltInVariable::kVar_pt3C, &BuiltInVariable::kVar_pt3C, &BuiltInVariable::kVar_pt_o_3C, >+ &BuiltInVariable::kVar_pt_o_3C}; >+constexpr const TVariable *p3D0C0C[3] = {&BuiltInVariable::kVar_pt3D, &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p3D0D0D[3] = {&BuiltInVariable::kVar_pt3D, &BuiltInVariable::kVar_pt0D, >+ &BuiltInVariable::kVar_pt0D}; >+constexpr const TVariable *p3D3D0C0C[4] = {&BuiltInVariable::kVar_pt3D, &BuiltInVariable::kVar_pt3D, >+ &BuiltInVariable::kVar_pt0C, >+ &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p3D3D3D[3] = {&BuiltInVariable::kVar_pt3D, &BuiltInVariable::kVar_pt3D, >+ &BuiltInVariable::kVar_pt3D}; >+constexpr const TVariable *p3D3D_o_3D_o_3D[4] = { >+ &BuiltInVariable::kVar_pt3D, &BuiltInVariable::kVar_pt3D, &BuiltInVariable::kVar_pt_o_3D, >+ &BuiltInVariable::kVar_pt_o_3D}; >+constexpr const TVariable *p3E3E[2] = {&BuiltInVariable::kVar_pt3E, &BuiltInVariable::kVar_pt3E}; >+constexpr const TVariable *p5B5B[2] = {&BuiltInVariable::kVar_pt5B, &BuiltInVariable::kVar_pt5B}; >+constexpr const TVariable *p6B6B[2] = {&BuiltInVariable::kVar_pt6B, &BuiltInVariable::kVar_pt6B}; >+constexpr const TVariable *p7B7B[2] = {&BuiltInVariable::kVar_pt7B, &BuiltInVariable::kVar_pt7B}; >+constexpr const TVariable *p9B9B[2] = {&BuiltInVariable::kVar_pt9B, &BuiltInVariable::kVar_pt9B}; >+constexpr const TVariable *pABAB[2] = {&BuiltInVariable::kVar_ptAB, &BuiltInVariable::kVar_ptAB}; >+constexpr const TVariable *pBBBB[2] = {&BuiltInVariable::kVar_ptBB, &BuiltInVariable::kVar_ptBB}; >+constexpr const TVariable *pDBDB[2] = {&BuiltInVariable::kVar_ptDB, &BuiltInVariable::kVar_ptDB}; >+constexpr const TVariable *pEBEB[2] = {&BuiltInVariable::kVar_ptEB, &BuiltInVariable::kVar_ptEB}; >+constexpr const TVariable *pFBFB[2] = {&BuiltInVariable::kVar_ptFB, &BuiltInVariable::kVar_ptFB}; >+constexpr const TVariable *p_io_0C0C0C[3] = { >+ &BuiltInVariable::kVar_pt_io_0C, &BuiltInVariable::kVar_pt0C, &BuiltInVariable::kVar_pt0C}; >+constexpr const TVariable *p_io_0D0D0D[3] = { >+ &BuiltInVariable::kVar_pt_io_0D, &BuiltInVariable::kVar_pt0D, &BuiltInVariable::kVar_pt0D}; >+ >+} // namespace BuiltInParameters >+ >+namespace UnmangledBuiltIns >+{ >+ >+constexpr const UnmangledBuiltIn ARB_texture_rectangle(TExtension::ARB_texture_rectangle); >+constexpr const UnmangledBuiltIn EXT_YUV_target(TExtension::EXT_YUV_target); >+constexpr const UnmangledBuiltIn EXT_geometry_shader(TExtension::EXT_geometry_shader); >+constexpr const UnmangledBuiltIn EXT_shader_texture_lod(TExtension::EXT_shader_texture_lod); >+constexpr const UnmangledBuiltIn OES_standard_derivatives(TExtension::OES_standard_derivatives); >+constexpr const UnmangledBuiltIn UNDEFINED(TExtension::UNDEFINED); >+ >+} // namespace UnmangledBuiltIns >+ >+// TODO(oetuaho): Would be nice to make this a class instead of a namespace so that we could friend >+// this from TFunction. Now symbol constructors taking an id have to be public even though they're >+// not supposed to be accessible from outside of here. http://anglebug.com/2390 >+namespace BuiltInFunction >+{ >+ >+constexpr const TFunction kFunction_radians_0B( >+ BuiltInId::radians_Float1, >+ BuiltInName::radians, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpRadians, >+ true); >+constexpr const TFunction kFunction_radians_1B( >+ BuiltInId::radians_Float2, >+ BuiltInName::radians, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpRadians, >+ true); >+constexpr const TFunction kFunction_radians_2B( >+ BuiltInId::radians_Float3, >+ BuiltInName::radians, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpRadians, >+ true); >+constexpr const TFunction kFunction_radians_3B( >+ BuiltInId::radians_Float4, >+ BuiltInName::radians, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpRadians, >+ true); >+constexpr const TFunction kFunction_degrees_0B( >+ BuiltInId::degrees_Float1, >+ BuiltInName::degrees, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDegrees, >+ true); >+constexpr const TFunction kFunction_degrees_1B( >+ BuiltInId::degrees_Float2, >+ BuiltInName::degrees, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpDegrees, >+ true); >+constexpr const TFunction kFunction_degrees_2B( >+ BuiltInId::degrees_Float3, >+ BuiltInName::degrees, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpDegrees, >+ true); >+constexpr const TFunction kFunction_degrees_3B( >+ BuiltInId::degrees_Float4, >+ BuiltInName::degrees, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpDegrees, >+ true); >+constexpr const TFunction kFunction_sin_0B( >+ BuiltInId::sin_Float1, >+ BuiltInName::sin, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpSin, >+ true); >+constexpr const TFunction kFunction_sin_1B( >+ BuiltInId::sin_Float2, >+ BuiltInName::sin, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpSin, >+ true); >+constexpr const TFunction kFunction_sin_2B( >+ BuiltInId::sin_Float3, >+ BuiltInName::sin, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpSin, >+ true); >+constexpr const TFunction kFunction_sin_3B( >+ BuiltInId::sin_Float4, >+ BuiltInName::sin, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpSin, >+ true); >+constexpr const TFunction kFunction_cos_0B( >+ BuiltInId::cos_Float1, >+ BuiltInName::cos, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCos, >+ true); >+constexpr const TFunction kFunction_cos_1B( >+ BuiltInId::cos_Float2, >+ BuiltInName::cos, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCos, >+ true); >+constexpr const TFunction kFunction_cos_2B( >+ BuiltInId::cos_Float3, >+ BuiltInName::cos, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCos, >+ true); >+constexpr const TFunction kFunction_cos_3B( >+ BuiltInId::cos_Float4, >+ BuiltInName::cos, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCos, >+ true); >+constexpr const TFunction kFunction_tan_0B( >+ BuiltInId::tan_Float1, >+ BuiltInName::tan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpTan, >+ true); >+constexpr const TFunction kFunction_tan_1B( >+ BuiltInId::tan_Float2, >+ BuiltInName::tan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpTan, >+ true); >+constexpr const TFunction kFunction_tan_2B( >+ BuiltInId::tan_Float3, >+ BuiltInName::tan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpTan, >+ true); >+constexpr const TFunction kFunction_tan_3B( >+ BuiltInId::tan_Float4, >+ BuiltInName::tan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpTan, >+ true); >+constexpr const TFunction kFunction_asin_0B( >+ BuiltInId::asin_Float1, >+ BuiltInName::asin, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAsin, >+ true); >+constexpr const TFunction kFunction_asin_1B( >+ BuiltInId::asin_Float2, >+ BuiltInName::asin, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpAsin, >+ true); >+constexpr const TFunction kFunction_asin_2B( >+ BuiltInId::asin_Float3, >+ BuiltInName::asin, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpAsin, >+ true); >+constexpr const TFunction kFunction_asin_3B( >+ BuiltInId::asin_Float4, >+ BuiltInName::asin, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpAsin, >+ true); >+constexpr const TFunction kFunction_acos_0B( >+ BuiltInId::acos_Float1, >+ BuiltInName::acos, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAcos, >+ true); >+constexpr const TFunction kFunction_acos_1B( >+ BuiltInId::acos_Float2, >+ BuiltInName::acos, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpAcos, >+ true); >+constexpr const TFunction kFunction_acos_2B( >+ BuiltInId::acos_Float3, >+ BuiltInName::acos, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpAcos, >+ true); >+constexpr const TFunction kFunction_acos_3B( >+ BuiltInId::acos_Float4, >+ BuiltInName::acos, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpAcos, >+ true); >+constexpr const TFunction kFunction_atan_0B0B( >+ BuiltInId::atan_Float1_Float1, >+ BuiltInName::atan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtan, >+ true); >+constexpr const TFunction kFunction_atan_1B1B( >+ BuiltInId::atan_Float2_Float2, >+ BuiltInName::atan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpAtan, >+ true); >+constexpr const TFunction kFunction_atan_2B2B( >+ BuiltInId::atan_Float3_Float3, >+ BuiltInName::atan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpAtan, >+ true); >+constexpr const TFunction kFunction_atan_3B3B( >+ BuiltInId::atan_Float4_Float4, >+ BuiltInName::atan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpAtan, >+ true); >+constexpr const TFunction kFunction_atan_0B( >+ BuiltInId::atan_Float1, >+ BuiltInName::atan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtan, >+ true); >+constexpr const TFunction kFunction_atan_1B( >+ BuiltInId::atan_Float2, >+ BuiltInName::atan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpAtan, >+ true); >+constexpr const TFunction kFunction_atan_2B( >+ BuiltInId::atan_Float3, >+ BuiltInName::atan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpAtan, >+ true); >+constexpr const TFunction kFunction_atan_3B( >+ BuiltInId::atan_Float4, >+ BuiltInName::atan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpAtan, >+ true); >+constexpr const TFunction kFunction_sinh_0B( >+ BuiltInId::sinh_Float1, >+ BuiltInName::sinh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpSinh, >+ true); >+constexpr const TFunction kFunction_sinh_1B( >+ BuiltInId::sinh_Float2, >+ BuiltInName::sinh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpSinh, >+ true); >+constexpr const TFunction kFunction_sinh_2B( >+ BuiltInId::sinh_Float3, >+ BuiltInName::sinh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpSinh, >+ true); >+constexpr const TFunction kFunction_sinh_3B( >+ BuiltInId::sinh_Float4, >+ BuiltInName::sinh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpSinh, >+ true); >+constexpr const TFunction kFunction_cosh_0B( >+ BuiltInId::cosh_Float1, >+ BuiltInName::cosh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCosh, >+ true); >+constexpr const TFunction kFunction_cosh_1B( >+ BuiltInId::cosh_Float2, >+ BuiltInName::cosh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCosh, >+ true); >+constexpr const TFunction kFunction_cosh_2B( >+ BuiltInId::cosh_Float3, >+ BuiltInName::cosh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCosh, >+ true); >+constexpr const TFunction kFunction_cosh_3B( >+ BuiltInId::cosh_Float4, >+ BuiltInName::cosh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCosh, >+ true); >+constexpr const TFunction kFunction_tanh_0B( >+ BuiltInId::tanh_Float1, >+ BuiltInName::tanh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpTanh, >+ true); >+constexpr const TFunction kFunction_tanh_1B( >+ BuiltInId::tanh_Float2, >+ BuiltInName::tanh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpTanh, >+ true); >+constexpr const TFunction kFunction_tanh_2B( >+ BuiltInId::tanh_Float3, >+ BuiltInName::tanh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpTanh, >+ true); >+constexpr const TFunction kFunction_tanh_3B( >+ BuiltInId::tanh_Float4, >+ BuiltInName::tanh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpTanh, >+ true); >+constexpr const TFunction kFunction_asinh_0B( >+ BuiltInId::asinh_Float1, >+ BuiltInName::asinh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAsinh, >+ true); >+constexpr const TFunction kFunction_asinh_1B( >+ BuiltInId::asinh_Float2, >+ BuiltInName::asinh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpAsinh, >+ true); >+constexpr const TFunction kFunction_asinh_2B( >+ BuiltInId::asinh_Float3, >+ BuiltInName::asinh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpAsinh, >+ true); >+constexpr const TFunction kFunction_asinh_3B( >+ BuiltInId::asinh_Float4, >+ BuiltInName::asinh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpAsinh, >+ true); >+constexpr const TFunction kFunction_acosh_0B( >+ BuiltInId::acosh_Float1, >+ BuiltInName::acosh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAcosh, >+ true); >+constexpr const TFunction kFunction_acosh_1B( >+ BuiltInId::acosh_Float2, >+ BuiltInName::acosh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpAcosh, >+ true); >+constexpr const TFunction kFunction_acosh_2B( >+ BuiltInId::acosh_Float3, >+ BuiltInName::acosh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpAcosh, >+ true); >+constexpr const TFunction kFunction_acosh_3B( >+ BuiltInId::acosh_Float4, >+ BuiltInName::acosh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpAcosh, >+ true); >+constexpr const TFunction kFunction_atanh_0B( >+ BuiltInId::atanh_Float1, >+ BuiltInName::atanh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtanh, >+ true); >+constexpr const TFunction kFunction_atanh_1B( >+ BuiltInId::atanh_Float2, >+ BuiltInName::atanh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpAtanh, >+ true); >+constexpr const TFunction kFunction_atanh_2B( >+ BuiltInId::atanh_Float3, >+ BuiltInName::atanh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpAtanh, >+ true); >+constexpr const TFunction kFunction_atanh_3B( >+ BuiltInId::atanh_Float4, >+ BuiltInName::atanh, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpAtanh, >+ true); >+constexpr const TFunction kFunction_pow_0B0B( >+ BuiltInId::pow_Float1_Float1, >+ BuiltInName::pow, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpPow, >+ true); >+constexpr const TFunction kFunction_pow_1B1B( >+ BuiltInId::pow_Float2_Float2, >+ BuiltInName::pow, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpPow, >+ true); >+constexpr const TFunction kFunction_pow_2B2B( >+ BuiltInId::pow_Float3_Float3, >+ BuiltInName::pow, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpPow, >+ true); >+constexpr const TFunction kFunction_pow_3B3B( >+ BuiltInId::pow_Float4_Float4, >+ BuiltInName::pow, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpPow, >+ true); >+constexpr const TFunction kFunction_exp_0B( >+ BuiltInId::exp_Float1, >+ BuiltInName::exp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpExp, >+ true); >+constexpr const TFunction kFunction_exp_1B( >+ BuiltInId::exp_Float2, >+ BuiltInName::exp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpExp, >+ true); >+constexpr const TFunction kFunction_exp_2B( >+ BuiltInId::exp_Float3, >+ BuiltInName::exp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpExp, >+ true); >+constexpr const TFunction kFunction_exp_3B( >+ BuiltInId::exp_Float4, >+ BuiltInName::exp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpExp, >+ true); >+constexpr const TFunction kFunction_log_0B( >+ BuiltInId::log_Float1, >+ BuiltInName::log, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpLog, >+ true); >+constexpr const TFunction kFunction_log_1B( >+ BuiltInId::log_Float2, >+ BuiltInName::log, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpLog, >+ true); >+constexpr const TFunction kFunction_log_2B( >+ BuiltInId::log_Float3, >+ BuiltInName::log, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpLog, >+ true); >+constexpr const TFunction kFunction_log_3B( >+ BuiltInId::log_Float4, >+ BuiltInName::log, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpLog, >+ true); >+constexpr const TFunction kFunction_exp2_0B( >+ BuiltInId::exp2_Float1, >+ BuiltInName::exp2, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpExp2, >+ true); >+constexpr const TFunction kFunction_exp2_1B( >+ BuiltInId::exp2_Float2, >+ BuiltInName::exp2, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpExp2, >+ true); >+constexpr const TFunction kFunction_exp2_2B( >+ BuiltInId::exp2_Float3, >+ BuiltInName::exp2, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpExp2, >+ true); >+constexpr const TFunction kFunction_exp2_3B( >+ BuiltInId::exp2_Float4, >+ BuiltInName::exp2, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpExp2, >+ true); >+constexpr const TFunction kFunction_log2_0B( >+ BuiltInId::log2_Float1, >+ BuiltInName::log2, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpLog2, >+ true); >+constexpr const TFunction kFunction_log2_1B( >+ BuiltInId::log2_Float2, >+ BuiltInName::log2, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpLog2, >+ true); >+constexpr const TFunction kFunction_log2_2B( >+ BuiltInId::log2_Float3, >+ BuiltInName::log2, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpLog2, >+ true); >+constexpr const TFunction kFunction_log2_3B( >+ BuiltInId::log2_Float4, >+ BuiltInName::log2, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpLog2, >+ true); >+constexpr const TFunction kFunction_sqrt_0B( >+ BuiltInId::sqrt_Float1, >+ BuiltInName::sqrt, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpSqrt, >+ true); >+constexpr const TFunction kFunction_sqrt_1B( >+ BuiltInId::sqrt_Float2, >+ BuiltInName::sqrt, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpSqrt, >+ true); >+constexpr const TFunction kFunction_sqrt_2B( >+ BuiltInId::sqrt_Float3, >+ BuiltInName::sqrt, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpSqrt, >+ true); >+constexpr const TFunction kFunction_sqrt_3B( >+ BuiltInId::sqrt_Float4, >+ BuiltInName::sqrt, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpSqrt, >+ true); >+constexpr const TFunction kFunction_inversesqrt_0B( >+ BuiltInId::inversesqrt_Float1, >+ BuiltInName::inversesqrt, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpInversesqrt, >+ true); >+constexpr const TFunction kFunction_inversesqrt_1B( >+ BuiltInId::inversesqrt_Float2, >+ BuiltInName::inversesqrt, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpInversesqrt, >+ true); >+constexpr const TFunction kFunction_inversesqrt_2B( >+ BuiltInId::inversesqrt_Float3, >+ BuiltInName::inversesqrt, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpInversesqrt, >+ true); >+constexpr const TFunction kFunction_inversesqrt_3B( >+ BuiltInId::inversesqrt_Float4, >+ BuiltInName::inversesqrt, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpInversesqrt, >+ true); >+constexpr const TFunction kFunction_abs_0B( >+ BuiltInId::abs_Float1, >+ BuiltInName::abs, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAbs, >+ true); >+constexpr const TFunction kFunction_abs_1B( >+ BuiltInId::abs_Float2, >+ BuiltInName::abs, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpAbs, >+ true); >+constexpr const TFunction kFunction_abs_2B( >+ BuiltInId::abs_Float3, >+ BuiltInName::abs, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpAbs, >+ true); >+constexpr const TFunction kFunction_abs_3B( >+ BuiltInId::abs_Float4, >+ BuiltInName::abs, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpAbs, >+ true); >+constexpr const TFunction kFunction_abs_0C(BuiltInId::abs_Int1, >+ BuiltInName::abs, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0C0C_o_0C_o_0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAbs, >+ true); >+constexpr const TFunction kFunction_abs_1C(BuiltInId::abs_Int2, >+ BuiltInName::abs, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpAbs, >+ true); >+constexpr const TFunction kFunction_abs_2C(BuiltInId::abs_Int3, >+ BuiltInName::abs, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpAbs, >+ true); >+constexpr const TFunction kFunction_abs_3C(BuiltInId::abs_Int4, >+ BuiltInName::abs, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpAbs, >+ true); >+constexpr const TFunction kFunction_sign_0B( >+ BuiltInId::sign_Float1, >+ BuiltInName::sign, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpSign, >+ true); >+constexpr const TFunction kFunction_sign_1B( >+ BuiltInId::sign_Float2, >+ BuiltInName::sign, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpSign, >+ true); >+constexpr const TFunction kFunction_sign_2B( >+ BuiltInId::sign_Float3, >+ BuiltInName::sign, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpSign, >+ true); >+constexpr const TFunction kFunction_sign_3B( >+ BuiltInId::sign_Float4, >+ BuiltInName::sign, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpSign, >+ true); >+constexpr const TFunction kFunction_sign_0C( >+ BuiltInId::sign_Int1, >+ BuiltInName::sign, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0C0C_o_0C_o_0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpSign, >+ true); >+constexpr const TFunction kFunction_sign_1C( >+ BuiltInId::sign_Int2, >+ BuiltInName::sign, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpSign, >+ true); >+constexpr const TFunction kFunction_sign_2C( >+ BuiltInId::sign_Int3, >+ BuiltInName::sign, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpSign, >+ true); >+constexpr const TFunction kFunction_sign_3C( >+ BuiltInId::sign_Int4, >+ BuiltInName::sign, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpSign, >+ true); >+constexpr const TFunction kFunction_floor_0B( >+ BuiltInId::floor_Float1, >+ BuiltInName::floor, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpFloor, >+ true); >+constexpr const TFunction kFunction_floor_1B( >+ BuiltInId::floor_Float2, >+ BuiltInName::floor, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpFloor, >+ true); >+constexpr const TFunction kFunction_floor_2B( >+ BuiltInId::floor_Float3, >+ BuiltInName::floor, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpFloor, >+ true); >+constexpr const TFunction kFunction_floor_3B( >+ BuiltInId::floor_Float4, >+ BuiltInName::floor, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpFloor, >+ true); >+constexpr const TFunction kFunction_trunc_0B( >+ BuiltInId::trunc_Float1, >+ BuiltInName::trunc, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpTrunc, >+ true); >+constexpr const TFunction kFunction_trunc_1B( >+ BuiltInId::trunc_Float2, >+ BuiltInName::trunc, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpTrunc, >+ true); >+constexpr const TFunction kFunction_trunc_2B( >+ BuiltInId::trunc_Float3, >+ BuiltInName::trunc, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpTrunc, >+ true); >+constexpr const TFunction kFunction_trunc_3B( >+ BuiltInId::trunc_Float4, >+ BuiltInName::trunc, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpTrunc, >+ true); >+constexpr const TFunction kFunction_round_0B( >+ BuiltInId::round_Float1, >+ BuiltInName::round, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpRound, >+ true); >+constexpr const TFunction kFunction_round_1B( >+ BuiltInId::round_Float2, >+ BuiltInName::round, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpRound, >+ true); >+constexpr const TFunction kFunction_round_2B( >+ BuiltInId::round_Float3, >+ BuiltInName::round, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpRound, >+ true); >+constexpr const TFunction kFunction_round_3B( >+ BuiltInId::round_Float4, >+ BuiltInName::round, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpRound, >+ true); >+constexpr const TFunction kFunction_roundEven_0B( >+ BuiltInId::roundEven_Float1, >+ BuiltInName::roundEven, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpRoundEven, >+ true); >+constexpr const TFunction kFunction_roundEven_1B( >+ BuiltInId::roundEven_Float2, >+ BuiltInName::roundEven, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpRoundEven, >+ true); >+constexpr const TFunction kFunction_roundEven_2B( >+ BuiltInId::roundEven_Float3, >+ BuiltInName::roundEven, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpRoundEven, >+ true); >+constexpr const TFunction kFunction_roundEven_3B( >+ BuiltInId::roundEven_Float4, >+ BuiltInName::roundEven, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpRoundEven, >+ true); >+constexpr const TFunction kFunction_ceil_0B( >+ BuiltInId::ceil_Float1, >+ BuiltInName::ceil, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCeil, >+ true); >+constexpr const TFunction kFunction_ceil_1B( >+ BuiltInId::ceil_Float2, >+ BuiltInName::ceil, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCeil, >+ true); >+constexpr const TFunction kFunction_ceil_2B( >+ BuiltInId::ceil_Float3, >+ BuiltInName::ceil, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCeil, >+ true); >+constexpr const TFunction kFunction_ceil_3B( >+ BuiltInId::ceil_Float4, >+ BuiltInName::ceil, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCeil, >+ true); >+constexpr const TFunction kFunction_fract_0B( >+ BuiltInId::fract_Float1, >+ BuiltInName::fract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpFract, >+ true); >+constexpr const TFunction kFunction_fract_1B( >+ BuiltInId::fract_Float2, >+ BuiltInName::fract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpFract, >+ true); >+constexpr const TFunction kFunction_fract_2B( >+ BuiltInId::fract_Float3, >+ BuiltInName::fract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpFract, >+ true); >+constexpr const TFunction kFunction_fract_3B( >+ BuiltInId::fract_Float4, >+ BuiltInName::fract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpFract, >+ true); >+constexpr const TFunction kFunction_mod_0B0B( >+ BuiltInId::mod_Float1_Float1, >+ BuiltInName::mod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpMod, >+ true); >+constexpr const TFunction kFunction_mod_1B0B( >+ BuiltInId::mod_Float2_Float1, >+ BuiltInName::mod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B0B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMod, >+ true); >+constexpr const TFunction kFunction_mod_2B0B( >+ BuiltInId::mod_Float3_Float1, >+ BuiltInName::mod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B0B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMod, >+ true); >+constexpr const TFunction kFunction_mod_3B0B( >+ BuiltInId::mod_Float4_Float1, >+ BuiltInName::mod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMod, >+ true); >+constexpr const TFunction kFunction_mod_1B1B( >+ BuiltInId::mod_Float2_Float2, >+ BuiltInName::mod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMod, >+ true); >+constexpr const TFunction kFunction_mod_2B2B( >+ BuiltInId::mod_Float3_Float3, >+ BuiltInName::mod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMod, >+ true); >+constexpr const TFunction kFunction_mod_3B3B( >+ BuiltInId::mod_Float4_Float4, >+ BuiltInName::mod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMod, >+ true); >+constexpr const TFunction kFunction_min_0B0B( >+ BuiltInId::min_Float1_Float1, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_1B0B( >+ BuiltInId::min_Float2_Float1, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B0B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_2B0B( >+ BuiltInId::min_Float3_Float1, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B0B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_3B0B( >+ BuiltInId::min_Float4_Float1, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_1B1B( >+ BuiltInId::min_Float2_Float2, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_2B2B( >+ BuiltInId::min_Float3_Float3, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_3B3B( >+ BuiltInId::min_Float4_Float4, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_0C0C( >+ BuiltInId::min_Int1_Int1, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0C0C_o_0C_o_0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_1C1C( >+ BuiltInId::min_Int2_Int2, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_2C2C( >+ BuiltInId::min_Int3_Int3, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_3C3C( >+ BuiltInId::min_Int4_Int4, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C3C3C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_1C0C( >+ BuiltInId::min_Int2_Int1, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_2C0C( >+ BuiltInId::min_Int3_Int1, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_3C0C( >+ BuiltInId::min_Int4_Int1, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_0D0D( >+ BuiltInId::min_UInt1_UInt1, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0D0C0C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_1D1D( >+ BuiltInId::min_UInt2_UInt2, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D1D0C0C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_2D2D( >+ BuiltInId::min_UInt3_UInt3, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D0C0C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_3D3D( >+ BuiltInId::min_UInt4_UInt4, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D3D0C0C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_1D0D( >+ BuiltInId::min_UInt2_UInt1, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D0D0D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_2D0D( >+ BuiltInId::min_UInt3_UInt1, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D0D0D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_min_3D0D( >+ BuiltInId::min_UInt4_UInt1, >+ BuiltInName::min, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D0D0D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMin, >+ true); >+constexpr const TFunction kFunction_max_0B0B( >+ BuiltInId::max_Float1_Float1, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_1B0B( >+ BuiltInId::max_Float2_Float1, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B0B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_2B0B( >+ BuiltInId::max_Float3_Float1, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B0B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_3B0B( >+ BuiltInId::max_Float4_Float1, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_1B1B( >+ BuiltInId::max_Float2_Float2, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_2B2B( >+ BuiltInId::max_Float3_Float3, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_3B3B( >+ BuiltInId::max_Float4_Float4, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_0C0C( >+ BuiltInId::max_Int1_Int1, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0C0C_o_0C_o_0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_1C1C( >+ BuiltInId::max_Int2_Int2, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_2C2C( >+ BuiltInId::max_Int3_Int3, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_3C3C( >+ BuiltInId::max_Int4_Int4, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C3C3C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_1C0C( >+ BuiltInId::max_Int2_Int1, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_2C0C( >+ BuiltInId::max_Int3_Int1, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_3C0C( >+ BuiltInId::max_Int4_Int1, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_0D0D( >+ BuiltInId::max_UInt1_UInt1, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0D0C0C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_1D1D( >+ BuiltInId::max_UInt2_UInt2, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D1D0C0C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_2D2D( >+ BuiltInId::max_UInt3_UInt3, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D0C0C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_3D3D( >+ BuiltInId::max_UInt4_UInt4, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D3D0C0C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_1D0D( >+ BuiltInId::max_UInt2_UInt1, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D0D0D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_2D0D( >+ BuiltInId::max_UInt3_UInt1, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D0D0D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_max_3D0D( >+ BuiltInId::max_UInt4_UInt1, >+ BuiltInName::max, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D0D0D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMax, >+ true); >+constexpr const TFunction kFunction_clamp_0B0B0B( >+ BuiltInId::clamp_Float1_Float1_Float1, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_1B0B0B( >+ BuiltInId::clamp_Float2_Float1_Float1, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B0B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_2B0B0B( >+ BuiltInId::clamp_Float3_Float1_Float1, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B0B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_3B0B0B( >+ BuiltInId::clamp_Float4_Float1_Float1, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_1B1B1B( >+ BuiltInId::clamp_Float2_Float2_Float2, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B1B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_2B2B2B( >+ BuiltInId::clamp_Float3_Float3_Float3, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B2B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_3B3B3B( >+ BuiltInId::clamp_Float4_Float4_Float4, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B3B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_0C0C0C( >+ BuiltInId::clamp_Int1_Int1_Int1, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0C0C0C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_1C0C0C( >+ BuiltInId::clamp_Int2_Int1_Int1, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C0C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_2C0C0C( >+ BuiltInId::clamp_Int3_Int1_Int1, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C0C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_3C0C0C( >+ BuiltInId::clamp_Int4_Int1_Int1, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C0C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_1C1C1C( >+ BuiltInId::clamp_Int2_Int2_Int2, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C1C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_2C2C2C( >+ BuiltInId::clamp_Int3_Int3_Int3, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C2C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_3C3C3C( >+ BuiltInId::clamp_Int4_Int4_Int4, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C3C3C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_0D0D0D( >+ BuiltInId::clamp_UInt1_UInt1_UInt1, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0D0D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_1D0D0D( >+ BuiltInId::clamp_UInt2_UInt1_UInt1, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D0D0D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_2D0D0D( >+ BuiltInId::clamp_UInt3_UInt1_UInt1, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D0D0D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_3D0D0D( >+ BuiltInId::clamp_UInt4_UInt1_UInt1, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D0D0D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_1D1D1D( >+ BuiltInId::clamp_UInt2_UInt2_UInt2, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D1D1D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_2D2D2D( >+ BuiltInId::clamp_UInt3_UInt3_UInt3, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D2D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_clamp_3D3D3D( >+ BuiltInId::clamp_UInt4_UInt4_UInt4, >+ BuiltInName::clamp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D3D3D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpClamp, >+ true); >+constexpr const TFunction kFunction_mix_0B0B0B( >+ BuiltInId::mix_Float1_Float1_Float1, >+ BuiltInName::mix, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpMix, >+ true); >+constexpr const TFunction kFunction_mix_1B1B0B( >+ BuiltInId::mix_Float2_Float2_Float1, >+ BuiltInName::mix, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMix, >+ true); >+constexpr const TFunction kFunction_mix_2B2B0B( >+ BuiltInId::mix_Float3_Float3_Float1, >+ BuiltInName::mix, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMix, >+ true); >+constexpr const TFunction kFunction_mix_3B3B0B( >+ BuiltInId::mix_Float4_Float4_Float1, >+ BuiltInName::mix, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMix, >+ true); >+constexpr const TFunction kFunction_mix_1B1B1B( >+ BuiltInId::mix_Float2_Float2_Float2, >+ BuiltInName::mix, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B1B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMix, >+ true); >+constexpr const TFunction kFunction_mix_2B2B2B( >+ BuiltInId::mix_Float3_Float3_Float3, >+ BuiltInName::mix, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B2B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMix, >+ true); >+constexpr const TFunction kFunction_mix_3B3B3B( >+ BuiltInId::mix_Float4_Float4_Float4, >+ BuiltInName::mix, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B3B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMix, >+ true); >+constexpr const TFunction kFunction_mix_0B0B0E( >+ BuiltInId::mix_Float1_Float1_Bool1, >+ BuiltInName::mix, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B0E, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpMix, >+ true); >+constexpr const TFunction kFunction_mix_1B1B1E( >+ BuiltInId::mix_Float2_Float2_Bool2, >+ BuiltInName::mix, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B1E, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpMix, >+ true); >+constexpr const TFunction kFunction_mix_2B2B2E( >+ BuiltInId::mix_Float3_Float3_Bool3, >+ BuiltInName::mix, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B2E, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpMix, >+ true); >+constexpr const TFunction kFunction_mix_3B3B3E( >+ BuiltInId::mix_Float4_Float4_Bool4, >+ BuiltInName::mix, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B3E, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpMix, >+ true); >+constexpr const TFunction kFunction_step_0B0B( >+ BuiltInId::step_Float1_Float1, >+ BuiltInName::step, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpStep, >+ true); >+constexpr const TFunction kFunction_step_1B1B( >+ BuiltInId::step_Float2_Float2, >+ BuiltInName::step, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpStep, >+ true); >+constexpr const TFunction kFunction_step_2B2B( >+ BuiltInId::step_Float3_Float3, >+ BuiltInName::step, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpStep, >+ true); >+constexpr const TFunction kFunction_step_3B3B( >+ BuiltInId::step_Float4_Float4, >+ BuiltInName::step, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpStep, >+ true); >+constexpr const TFunction kFunction_step_0B1B( >+ BuiltInId::step_Float1_Float2, >+ BuiltInName::step, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpStep, >+ true); >+constexpr const TFunction kFunction_step_0B2B( >+ BuiltInId::step_Float1_Float3, >+ BuiltInName::step, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B2B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpStep, >+ true); >+constexpr const TFunction kFunction_step_0B3B( >+ BuiltInId::step_Float1_Float4, >+ BuiltInName::step, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B3B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpStep, >+ true); >+constexpr const TFunction kFunction_smoothstep_0B0B0B( >+ BuiltInId::smoothstep_Float1_Float1_Float1, >+ BuiltInName::smoothstep, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpSmoothstep, >+ true); >+constexpr const TFunction kFunction_smoothstep_1B1B1B( >+ BuiltInId::smoothstep_Float2_Float2_Float2, >+ BuiltInName::smoothstep, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B1B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpSmoothstep, >+ true); >+constexpr const TFunction kFunction_smoothstep_2B2B2B( >+ BuiltInId::smoothstep_Float3_Float3_Float3, >+ BuiltInName::smoothstep, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B2B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpSmoothstep, >+ true); >+constexpr const TFunction kFunction_smoothstep_3B3B3B( >+ BuiltInId::smoothstep_Float4_Float4_Float4, >+ BuiltInName::smoothstep, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B3B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpSmoothstep, >+ true); >+constexpr const TFunction kFunction_smoothstep_0B0B1B( >+ BuiltInId::smoothstep_Float1_Float1_Float2, >+ BuiltInName::smoothstep, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B1B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpSmoothstep, >+ true); >+constexpr const TFunction kFunction_smoothstep_0B0B2B( >+ BuiltInId::smoothstep_Float1_Float1_Float3, >+ BuiltInName::smoothstep, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B2B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpSmoothstep, >+ true); >+constexpr const TFunction kFunction_smoothstep_0B0B3B( >+ BuiltInId::smoothstep_Float1_Float1_Float4, >+ BuiltInName::smoothstep, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B3B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpSmoothstep, >+ true); >+constexpr const TFunction kFunction_modf_0B0B( >+ BuiltInId::modf_Float1_Float1, >+ BuiltInName::modf, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B_o_0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpModf, >+ false); >+constexpr const TFunction kFunction_modf_1B1B( >+ BuiltInId::modf_Float2_Float2, >+ BuiltInName::modf, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B_o_1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpModf, >+ false); >+constexpr const TFunction kFunction_modf_2B2B( >+ BuiltInId::modf_Float3_Float3, >+ BuiltInName::modf, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpModf, >+ false); >+constexpr const TFunction kFunction_modf_3B3B( >+ BuiltInId::modf_Float4_Float4, >+ BuiltInName::modf, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B_o_3B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpModf, >+ false); >+constexpr const TFunction kFunction_isnan_0B( >+ BuiltInId::isnan_Float1, >+ BuiltInName::isnan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpIsnan, >+ true); >+constexpr const TFunction kFunction_isnan_1B( >+ BuiltInId::isnan_Float2, >+ BuiltInName::isnan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpIsnan, >+ true); >+constexpr const TFunction kFunction_isnan_2B( >+ BuiltInId::isnan_Float3, >+ BuiltInName::isnan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpIsnan, >+ true); >+constexpr const TFunction kFunction_isnan_3B( >+ BuiltInId::isnan_Float4, >+ BuiltInName::isnan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpIsnan, >+ true); >+constexpr const TFunction kFunction_isinf_0B( >+ BuiltInId::isinf_Float1, >+ BuiltInName::isinf, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpIsinf, >+ true); >+constexpr const TFunction kFunction_isinf_1B( >+ BuiltInId::isinf_Float2, >+ BuiltInName::isinf, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpIsinf, >+ true); >+constexpr const TFunction kFunction_isinf_2B( >+ BuiltInId::isinf_Float3, >+ BuiltInName::isinf, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpIsinf, >+ true); >+constexpr const TFunction kFunction_isinf_3B( >+ BuiltInId::isinf_Float4, >+ BuiltInName::isinf, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpIsinf, >+ true); >+constexpr const TFunction kFunction_floatBitsToInt_0B( >+ BuiltInId::floatBitsToInt_Float1, >+ BuiltInName::floatBitsToInt, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpFloatBitsToInt, >+ true); >+constexpr const TFunction kFunction_floatBitsToInt_1B( >+ BuiltInId::floatBitsToInt_Float2, >+ BuiltInName::floatBitsToInt, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpFloatBitsToInt, >+ true); >+constexpr const TFunction kFunction_floatBitsToInt_2B( >+ BuiltInId::floatBitsToInt_Float3, >+ BuiltInName::floatBitsToInt, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpFloatBitsToInt, >+ true); >+constexpr const TFunction kFunction_floatBitsToInt_3B( >+ BuiltInId::floatBitsToInt_Float4, >+ BuiltInName::floatBitsToInt, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpFloatBitsToInt, >+ true); >+constexpr const TFunction kFunction_floatBitsToUint_0B( >+ BuiltInId::floatBitsToUint_Float1, >+ BuiltInName::floatBitsToUint, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpFloatBitsToUint, >+ true); >+constexpr const TFunction kFunction_floatBitsToUint_1B( >+ BuiltInId::floatBitsToUint_Float2, >+ BuiltInName::floatBitsToUint, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpFloatBitsToUint, >+ true); >+constexpr const TFunction kFunction_floatBitsToUint_2B( >+ BuiltInId::floatBitsToUint_Float3, >+ BuiltInName::floatBitsToUint, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpFloatBitsToUint, >+ true); >+constexpr const TFunction kFunction_floatBitsToUint_3B( >+ BuiltInId::floatBitsToUint_Float4, >+ BuiltInName::floatBitsToUint, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpFloatBitsToUint, >+ true); >+constexpr const TFunction kFunction_intBitsToFloat_0C( >+ BuiltInId::intBitsToFloat_Int1, >+ BuiltInName::intBitsToFloat, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0C0C_o_0C_o_0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpIntBitsToFloat, >+ true); >+constexpr const TFunction kFunction_intBitsToFloat_1C( >+ BuiltInId::intBitsToFloat_Int2, >+ BuiltInName::intBitsToFloat, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpIntBitsToFloat, >+ true); >+constexpr const TFunction kFunction_intBitsToFloat_2C( >+ BuiltInId::intBitsToFloat_Int3, >+ BuiltInName::intBitsToFloat, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpIntBitsToFloat, >+ true); >+constexpr const TFunction kFunction_intBitsToFloat_3C( >+ BuiltInId::intBitsToFloat_Int4, >+ BuiltInName::intBitsToFloat, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C0C0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpIntBitsToFloat, >+ true); >+constexpr const TFunction kFunction_uintBitsToFloat_0D( >+ BuiltInId::uintBitsToFloat_UInt1, >+ BuiltInName::uintBitsToFloat, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0C0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpUintBitsToFloat, >+ true); >+constexpr const TFunction kFunction_uintBitsToFloat_1D( >+ BuiltInId::uintBitsToFloat_UInt2, >+ BuiltInName::uintBitsToFloat, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D0C0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpUintBitsToFloat, >+ true); >+constexpr const TFunction kFunction_uintBitsToFloat_2D( >+ BuiltInId::uintBitsToFloat_UInt3, >+ BuiltInName::uintBitsToFloat, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D0C0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpUintBitsToFloat, >+ true); >+constexpr const TFunction kFunction_uintBitsToFloat_3D( >+ BuiltInId::uintBitsToFloat_UInt4, >+ BuiltInName::uintBitsToFloat, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D0C0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpUintBitsToFloat, >+ true); >+constexpr const TFunction kFunction_frexp_0B0C( >+ BuiltInId::frexp_Float1_Int1, >+ BuiltInName::frexp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B_o_0C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpFrexp, >+ false); >+constexpr const TFunction kFunction_frexp_1B1C( >+ BuiltInId::frexp_Float2_Int2, >+ BuiltInName::frexp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B_o_1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpFrexp, >+ false); >+constexpr const TFunction kFunction_frexp_2B2C( >+ BuiltInId::frexp_Float3_Int3, >+ BuiltInName::frexp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpFrexp, >+ false); >+constexpr const TFunction kFunction_frexp_3B3C( >+ BuiltInId::frexp_Float4_Int4, >+ BuiltInName::frexp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B_o_3C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpFrexp, >+ false); >+constexpr const TFunction kFunction_ldexp_0B0C( >+ BuiltInId::ldexp_Float1_Int1, >+ BuiltInName::ldexp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpLdexp, >+ true); >+constexpr const TFunction kFunction_ldexp_1B1C( >+ BuiltInId::ldexp_Float2_Int2, >+ BuiltInName::ldexp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpLdexp, >+ true); >+constexpr const TFunction kFunction_ldexp_2B2C( >+ BuiltInId::ldexp_Float3_Int3, >+ BuiltInName::ldexp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpLdexp, >+ true); >+constexpr const TFunction kFunction_ldexp_3B3C( >+ BuiltInId::ldexp_Float4_Int4, >+ BuiltInName::ldexp, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpLdexp, >+ true); >+constexpr const TFunction kFunction_packSnorm2x16_1B( >+ BuiltInId::packSnorm2x16_Float2, >+ BuiltInName::packSnorm2x16, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpPackSnorm2x16, >+ true); >+constexpr const TFunction kFunction_packUnorm2x16_1B( >+ BuiltInId::packUnorm2x16_Float2, >+ BuiltInName::packUnorm2x16, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpPackUnorm2x16, >+ true); >+constexpr const TFunction kFunction_packHalf2x16_1B( >+ BuiltInId::packHalf2x16_Float2, >+ BuiltInName::packHalf2x16, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpPackHalf2x16, >+ true); >+constexpr const TFunction kFunction_unpackSnorm2x16_0D( >+ BuiltInId::unpackSnorm2x16_UInt1, >+ BuiltInName::unpackSnorm2x16, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0C0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpUnpackSnorm2x16, >+ true); >+constexpr const TFunction kFunction_unpackUnorm2x16_0D( >+ BuiltInId::unpackUnorm2x16_UInt1, >+ BuiltInName::unpackUnorm2x16, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0C0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpUnpackUnorm2x16, >+ true); >+constexpr const TFunction kFunction_unpackHalf2x16_0D( >+ BuiltInId::unpackHalf2x16_UInt1, >+ BuiltInName::unpackHalf2x16, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0C0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpUnpackHalf2x16, >+ true); >+constexpr const TFunction kFunction_packUnorm4x8_3B( >+ BuiltInId::packUnorm4x8_Float4, >+ BuiltInName::packUnorm4x8, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpPackUnorm4x8, >+ true); >+constexpr const TFunction kFunction_packSnorm4x8_3B( >+ BuiltInId::packSnorm4x8_Float4, >+ BuiltInName::packSnorm4x8, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpPackSnorm4x8, >+ true); >+constexpr const TFunction kFunction_unpackUnorm4x8_0D( >+ BuiltInId::unpackUnorm4x8_UInt1, >+ BuiltInName::unpackUnorm4x8, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0C0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpUnpackUnorm4x8, >+ true); >+constexpr const TFunction kFunction_unpackSnorm4x8_0D( >+ BuiltInId::unpackSnorm4x8_UInt1, >+ BuiltInName::unpackSnorm4x8, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0C0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpUnpackSnorm4x8, >+ true); >+constexpr const TFunction kFunction_length_0B( >+ BuiltInId::length_Float1, >+ BuiltInName::length, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpLength, >+ true); >+constexpr const TFunction kFunction_length_1B( >+ BuiltInId::length_Float2, >+ BuiltInName::length, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpLength, >+ true); >+constexpr const TFunction kFunction_length_2B( >+ BuiltInId::length_Float3, >+ BuiltInName::length, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpLength, >+ true); >+constexpr const TFunction kFunction_length_3B( >+ BuiltInId::length_Float4, >+ BuiltInName::length, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpLength, >+ true); >+constexpr const TFunction kFunction_distance_0B0B( >+ BuiltInId::distance_Float1_Float1, >+ BuiltInName::distance, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDistance, >+ true); >+constexpr const TFunction kFunction_distance_1B1B( >+ BuiltInId::distance_Float2_Float2, >+ BuiltInName::distance, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDistance, >+ true); >+constexpr const TFunction kFunction_distance_2B2B( >+ BuiltInId::distance_Float3_Float3, >+ BuiltInName::distance, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDistance, >+ true); >+constexpr const TFunction kFunction_distance_3B3B( >+ BuiltInId::distance_Float4_Float4, >+ BuiltInName::distance, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDistance, >+ true); >+constexpr const TFunction kFunction_dot_0B0B( >+ BuiltInId::dot_Float1_Float1, >+ BuiltInName::dot, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDot, >+ true); >+constexpr const TFunction kFunction_dot_1B1B( >+ BuiltInId::dot_Float2_Float2, >+ BuiltInName::dot, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDot, >+ true); >+constexpr const TFunction kFunction_dot_2B2B( >+ BuiltInId::dot_Float3_Float3, >+ BuiltInName::dot, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDot, >+ true); >+constexpr const TFunction kFunction_dot_3B3B( >+ BuiltInId::dot_Float4_Float4, >+ BuiltInName::dot, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDot, >+ true); >+constexpr const TFunction kFunction_cross_2B2B( >+ BuiltInId::cross_Float3_Float3, >+ BuiltInName::cross, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCross, >+ true); >+constexpr const TFunction kFunction_normalize_0B( >+ BuiltInId::normalize_Float1, >+ BuiltInName::normalize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpNormalize, >+ true); >+constexpr const TFunction kFunction_normalize_1B( >+ BuiltInId::normalize_Float2, >+ BuiltInName::normalize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpNormalize, >+ true); >+constexpr const TFunction kFunction_normalize_2B( >+ BuiltInId::normalize_Float3, >+ BuiltInName::normalize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpNormalize, >+ true); >+constexpr const TFunction kFunction_normalize_3B( >+ BuiltInId::normalize_Float4, >+ BuiltInName::normalize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpNormalize, >+ true); >+constexpr const TFunction kFunction_faceforward_0B0B0B( >+ BuiltInId::faceforward_Float1_Float1_Float1, >+ BuiltInName::faceforward, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpFaceforward, >+ true); >+constexpr const TFunction kFunction_faceforward_1B1B1B( >+ BuiltInId::faceforward_Float2_Float2_Float2, >+ BuiltInName::faceforward, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B1B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpFaceforward, >+ true); >+constexpr const TFunction kFunction_faceforward_2B2B2B( >+ BuiltInId::faceforward_Float3_Float3_Float3, >+ BuiltInName::faceforward, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B2B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpFaceforward, >+ true); >+constexpr const TFunction kFunction_faceforward_3B3B3B( >+ BuiltInId::faceforward_Float4_Float4_Float4, >+ BuiltInName::faceforward, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B3B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpFaceforward, >+ true); >+constexpr const TFunction kFunction_reflect_0B0B( >+ BuiltInId::reflect_Float1_Float1, >+ BuiltInName::reflect, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpReflect, >+ true); >+constexpr const TFunction kFunction_reflect_1B1B( >+ BuiltInId::reflect_Float2_Float2, >+ BuiltInName::reflect, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpReflect, >+ true); >+constexpr const TFunction kFunction_reflect_2B2B( >+ BuiltInId::reflect_Float3_Float3, >+ BuiltInName::reflect, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpReflect, >+ true); >+constexpr const TFunction kFunction_reflect_3B3B( >+ BuiltInId::reflect_Float4_Float4, >+ BuiltInName::reflect, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpReflect, >+ true); >+constexpr const TFunction kFunction_refract_0B0B0B( >+ BuiltInId::refract_Float1_Float1_Float1, >+ BuiltInName::refract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpRefract, >+ true); >+constexpr const TFunction kFunction_refract_1B1B0B( >+ BuiltInId::refract_Float2_Float2_Float1, >+ BuiltInName::refract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpRefract, >+ true); >+constexpr const TFunction kFunction_refract_2B2B0B( >+ BuiltInId::refract_Float3_Float3_Float1, >+ BuiltInName::refract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpRefract, >+ true); >+constexpr const TFunction kFunction_refract_3B3B0B( >+ BuiltInId::refract_Float4_Float4_Float1, >+ BuiltInName::refract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpRefract, >+ true); >+constexpr const TFunction kFunction_matrixCompMult_5B5B( >+ BuiltInId::matrixCompMult_Float2x2_Float2x2, >+ BuiltInName::matrixCompMult, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p5B5B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 2>(), >+ EOpMulMatrixComponentWise, >+ true); >+constexpr const TFunction kFunction_matrixCompMult_ABAB( >+ BuiltInId::matrixCompMult_Float3x3_Float3x3, >+ BuiltInName::matrixCompMult, >+ TExtension::UNDEFINED, >+ BuiltInParameters::pABAB, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 3>(), >+ EOpMulMatrixComponentWise, >+ true); >+constexpr const TFunction kFunction_matrixCompMult_FBFB( >+ BuiltInId::matrixCompMult_Float4x4_Float4x4, >+ BuiltInName::matrixCompMult, >+ TExtension::UNDEFINED, >+ BuiltInParameters::pFBFB, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 4>(), >+ EOpMulMatrixComponentWise, >+ true); >+constexpr const TFunction kFunction_matrixCompMult_9B9B( >+ BuiltInId::matrixCompMult_Float2x3_Float2x3, >+ BuiltInName::matrixCompMult, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p9B9B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 3>(), >+ EOpMulMatrixComponentWise, >+ true); >+constexpr const TFunction kFunction_matrixCompMult_6B6B( >+ BuiltInId::matrixCompMult_Float3x2_Float3x2, >+ BuiltInName::matrixCompMult, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p6B6B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 2>(), >+ EOpMulMatrixComponentWise, >+ true); >+constexpr const TFunction kFunction_matrixCompMult_DBDB( >+ BuiltInId::matrixCompMult_Float2x4_Float2x4, >+ BuiltInName::matrixCompMult, >+ TExtension::UNDEFINED, >+ BuiltInParameters::pDBDB, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 4>(), >+ EOpMulMatrixComponentWise, >+ true); >+constexpr const TFunction kFunction_matrixCompMult_7B7B( >+ BuiltInId::matrixCompMult_Float4x2_Float4x2, >+ BuiltInName::matrixCompMult, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p7B7B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 2>(), >+ EOpMulMatrixComponentWise, >+ true); >+constexpr const TFunction kFunction_matrixCompMult_EBEB( >+ BuiltInId::matrixCompMult_Float3x4_Float3x4, >+ BuiltInName::matrixCompMult, >+ TExtension::UNDEFINED, >+ BuiltInParameters::pEBEB, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 4>(), >+ EOpMulMatrixComponentWise, >+ true); >+constexpr const TFunction kFunction_matrixCompMult_BBBB( >+ BuiltInId::matrixCompMult_Float4x3_Float4x3, >+ BuiltInName::matrixCompMult, >+ TExtension::UNDEFINED, >+ BuiltInParameters::pBBBB, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 3>(), >+ EOpMulMatrixComponentWise, >+ true); >+constexpr const TFunction kFunction_outerProduct_1B1B( >+ BuiltInId::outerProduct_Float2_Float2, >+ BuiltInName::outerProduct, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 2>(), >+ EOpOuterProduct, >+ true); >+constexpr const TFunction kFunction_outerProduct_2B2B( >+ BuiltInId::outerProduct_Float3_Float3, >+ BuiltInName::outerProduct, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 3>(), >+ EOpOuterProduct, >+ true); >+constexpr const TFunction kFunction_outerProduct_3B3B( >+ BuiltInId::outerProduct_Float4_Float4, >+ BuiltInName::outerProduct, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 4>(), >+ EOpOuterProduct, >+ true); >+constexpr const TFunction kFunction_outerProduct_2B1B( >+ BuiltInId::outerProduct_Float3_Float2, >+ BuiltInName::outerProduct, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 3>(), >+ EOpOuterProduct, >+ true); >+constexpr const TFunction kFunction_outerProduct_1B2B( >+ BuiltInId::outerProduct_Float2_Float3, >+ BuiltInName::outerProduct, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B2B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 2>(), >+ EOpOuterProduct, >+ true); >+constexpr const TFunction kFunction_outerProduct_3B1B( >+ BuiltInId::outerProduct_Float4_Float2, >+ BuiltInName::outerProduct, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 4>(), >+ EOpOuterProduct, >+ true); >+constexpr const TFunction kFunction_outerProduct_1B3B( >+ BuiltInId::outerProduct_Float2_Float4, >+ BuiltInName::outerProduct, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B3B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 2>(), >+ EOpOuterProduct, >+ true); >+constexpr const TFunction kFunction_outerProduct_3B2B( >+ BuiltInId::outerProduct_Float4_Float3, >+ BuiltInName::outerProduct, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B2B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 4>(), >+ EOpOuterProduct, >+ true); >+constexpr const TFunction kFunction_outerProduct_2B3B( >+ BuiltInId::outerProduct_Float3_Float4, >+ BuiltInName::outerProduct, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B3B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 3>(), >+ EOpOuterProduct, >+ true); >+constexpr const TFunction kFunction_transpose_5B( >+ BuiltInId::transpose_Float2x2, >+ BuiltInName::transpose, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p5B5B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 2>(), >+ EOpTranspose, >+ true); >+constexpr const TFunction kFunction_transpose_AB( >+ BuiltInId::transpose_Float3x3, >+ BuiltInName::transpose, >+ TExtension::UNDEFINED, >+ BuiltInParameters::pABAB, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 3>(), >+ EOpTranspose, >+ true); >+constexpr const TFunction kFunction_transpose_FB( >+ BuiltInId::transpose_Float4x4, >+ BuiltInName::transpose, >+ TExtension::UNDEFINED, >+ BuiltInParameters::pFBFB, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 4>(), >+ EOpTranspose, >+ true); >+constexpr const TFunction kFunction_transpose_6B( >+ BuiltInId::transpose_Float3x2, >+ BuiltInName::transpose, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p6B6B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 3>(), >+ EOpTranspose, >+ true); >+constexpr const TFunction kFunction_transpose_9B( >+ BuiltInId::transpose_Float2x3, >+ BuiltInName::transpose, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p9B9B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 2>(), >+ EOpTranspose, >+ true); >+constexpr const TFunction kFunction_transpose_7B( >+ BuiltInId::transpose_Float4x2, >+ BuiltInName::transpose, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p7B7B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 4>(), >+ EOpTranspose, >+ true); >+constexpr const TFunction kFunction_transpose_DB( >+ BuiltInId::transpose_Float2x4, >+ BuiltInName::transpose, >+ TExtension::UNDEFINED, >+ BuiltInParameters::pDBDB, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 2>(), >+ EOpTranspose, >+ true); >+constexpr const TFunction kFunction_transpose_BB( >+ BuiltInId::transpose_Float4x3, >+ BuiltInName::transpose, >+ TExtension::UNDEFINED, >+ BuiltInParameters::pBBBB, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 4>(), >+ EOpTranspose, >+ true); >+constexpr const TFunction kFunction_transpose_EB( >+ BuiltInId::transpose_Float3x4, >+ BuiltInName::transpose, >+ TExtension::UNDEFINED, >+ BuiltInParameters::pEBEB, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 3>(), >+ EOpTranspose, >+ true); >+constexpr const TFunction kFunction_determinant_5B( >+ BuiltInId::determinant_Float2x2, >+ BuiltInName::determinant, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p5B5B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDeterminant, >+ true); >+constexpr const TFunction kFunction_determinant_AB( >+ BuiltInId::determinant_Float3x3, >+ BuiltInName::determinant, >+ TExtension::UNDEFINED, >+ BuiltInParameters::pABAB, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDeterminant, >+ true); >+constexpr const TFunction kFunction_determinant_FB( >+ BuiltInId::determinant_Float4x4, >+ BuiltInName::determinant, >+ TExtension::UNDEFINED, >+ BuiltInParameters::pFBFB, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDeterminant, >+ true); >+constexpr const TFunction kFunction_inverse_5B( >+ BuiltInId::inverse_Float2x2, >+ BuiltInName::inverse, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p5B5B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 2>(), >+ EOpInverse, >+ true); >+constexpr const TFunction kFunction_inverse_AB( >+ BuiltInId::inverse_Float3x3, >+ BuiltInName::inverse, >+ TExtension::UNDEFINED, >+ BuiltInParameters::pABAB, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 3>(), >+ EOpInverse, >+ true); >+constexpr const TFunction kFunction_inverse_FB( >+ BuiltInId::inverse_Float4x4, >+ BuiltInName::inverse, >+ TExtension::UNDEFINED, >+ BuiltInParameters::pFBFB, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 4>(), >+ EOpInverse, >+ true); >+constexpr const TFunction kFunction_lessThan_1B1B( >+ BuiltInId::lessThan_Float2_Float2, >+ BuiltInName::lessThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpLessThanComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThan_2B2B( >+ BuiltInId::lessThan_Float3_Float3, >+ BuiltInName::lessThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpLessThanComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThan_3B3B( >+ BuiltInId::lessThan_Float4_Float4, >+ BuiltInName::lessThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpLessThanComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThan_1C1C( >+ BuiltInId::lessThan_Int2_Int2, >+ BuiltInName::lessThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpLessThanComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThan_2C2C( >+ BuiltInId::lessThan_Int3_Int3, >+ BuiltInName::lessThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpLessThanComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThan_3C3C( >+ BuiltInId::lessThan_Int4_Int4, >+ BuiltInName::lessThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C3C3C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpLessThanComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThan_1D1D( >+ BuiltInId::lessThan_UInt2_UInt2, >+ BuiltInName::lessThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D1D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpLessThanComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThan_2D2D( >+ BuiltInId::lessThan_UInt3_UInt3, >+ BuiltInName::lessThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpLessThanComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThan_3D3D( >+ BuiltInId::lessThan_UInt4_UInt4, >+ BuiltInName::lessThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D3D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpLessThanComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThanEqual_1B1B( >+ BuiltInId::lessThanEqual_Float2_Float2, >+ BuiltInName::lessThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpLessThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThanEqual_2B2B( >+ BuiltInId::lessThanEqual_Float3_Float3, >+ BuiltInName::lessThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpLessThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThanEqual_3B3B( >+ BuiltInId::lessThanEqual_Float4_Float4, >+ BuiltInName::lessThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpLessThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThanEqual_1C1C( >+ BuiltInId::lessThanEqual_Int2_Int2, >+ BuiltInName::lessThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpLessThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThanEqual_2C2C( >+ BuiltInId::lessThanEqual_Int3_Int3, >+ BuiltInName::lessThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpLessThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThanEqual_3C3C( >+ BuiltInId::lessThanEqual_Int4_Int4, >+ BuiltInName::lessThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C3C3C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpLessThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThanEqual_1D1D( >+ BuiltInId::lessThanEqual_UInt2_UInt2, >+ BuiltInName::lessThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D1D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpLessThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThanEqual_2D2D( >+ BuiltInId::lessThanEqual_UInt3_UInt3, >+ BuiltInName::lessThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpLessThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_lessThanEqual_3D3D( >+ BuiltInId::lessThanEqual_UInt4_UInt4, >+ BuiltInName::lessThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D3D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpLessThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThan_1B1B( >+ BuiltInId::greaterThan_Float2_Float2, >+ BuiltInName::greaterThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpGreaterThanComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThan_2B2B( >+ BuiltInId::greaterThan_Float3_Float3, >+ BuiltInName::greaterThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpGreaterThanComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThan_3B3B( >+ BuiltInId::greaterThan_Float4_Float4, >+ BuiltInName::greaterThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpGreaterThanComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThan_1C1C( >+ BuiltInId::greaterThan_Int2_Int2, >+ BuiltInName::greaterThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpGreaterThanComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThan_2C2C( >+ BuiltInId::greaterThan_Int3_Int3, >+ BuiltInName::greaterThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpGreaterThanComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThan_3C3C( >+ BuiltInId::greaterThan_Int4_Int4, >+ BuiltInName::greaterThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C3C3C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpGreaterThanComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThan_1D1D( >+ BuiltInId::greaterThan_UInt2_UInt2, >+ BuiltInName::greaterThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D1D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpGreaterThanComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThan_2D2D( >+ BuiltInId::greaterThan_UInt3_UInt3, >+ BuiltInName::greaterThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpGreaterThanComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThan_3D3D( >+ BuiltInId::greaterThan_UInt4_UInt4, >+ BuiltInName::greaterThan, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D3D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpGreaterThanComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThanEqual_1B1B( >+ BuiltInId::greaterThanEqual_Float2_Float2, >+ BuiltInName::greaterThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpGreaterThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThanEqual_2B2B( >+ BuiltInId::greaterThanEqual_Float3_Float3, >+ BuiltInName::greaterThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpGreaterThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThanEqual_3B3B( >+ BuiltInId::greaterThanEqual_Float4_Float4, >+ BuiltInName::greaterThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpGreaterThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThanEqual_1C1C( >+ BuiltInId::greaterThanEqual_Int2_Int2, >+ BuiltInName::greaterThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpGreaterThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThanEqual_2C2C( >+ BuiltInId::greaterThanEqual_Int3_Int3, >+ BuiltInName::greaterThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpGreaterThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThanEqual_3C3C( >+ BuiltInId::greaterThanEqual_Int4_Int4, >+ BuiltInName::greaterThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C3C3C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpGreaterThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThanEqual_1D1D( >+ BuiltInId::greaterThanEqual_UInt2_UInt2, >+ BuiltInName::greaterThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D1D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpGreaterThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThanEqual_2D2D( >+ BuiltInId::greaterThanEqual_UInt3_UInt3, >+ BuiltInName::greaterThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpGreaterThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_greaterThanEqual_3D3D( >+ BuiltInId::greaterThanEqual_UInt4_UInt4, >+ BuiltInName::greaterThanEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D3D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpGreaterThanEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_equal_1B1B( >+ BuiltInId::equal_Float2_Float2, >+ BuiltInName::equal, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_equal_2B2B( >+ BuiltInId::equal_Float3_Float3, >+ BuiltInName::equal, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_equal_3B3B( >+ BuiltInId::equal_Float4_Float4, >+ BuiltInName::equal, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_equal_1C1C( >+ BuiltInId::equal_Int2_Int2, >+ BuiltInName::equal, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_equal_2C2C( >+ BuiltInId::equal_Int3_Int3, >+ BuiltInName::equal, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_equal_3C3C( >+ BuiltInId::equal_Int4_Int4, >+ BuiltInName::equal, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C3C3C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_equal_1D1D( >+ BuiltInId::equal_UInt2_UInt2, >+ BuiltInName::equal, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D1D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_equal_2D2D( >+ BuiltInId::equal_UInt3_UInt3, >+ BuiltInName::equal, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_equal_3D3D( >+ BuiltInId::equal_UInt4_UInt4, >+ BuiltInName::equal, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D3D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_equal_1E1E( >+ BuiltInId::equal_Bool2_Bool2, >+ BuiltInName::equal, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1E1E, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_equal_2E2E( >+ BuiltInId::equal_Bool3_Bool3, >+ BuiltInName::equal, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2E2E, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_equal_3E3E( >+ BuiltInId::equal_Bool4_Bool4, >+ BuiltInName::equal, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3E3E, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_notEqual_1B1B( >+ BuiltInId::notEqual_Float2_Float2, >+ BuiltInName::notEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpNotEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_notEqual_2B2B( >+ BuiltInId::notEqual_Float3_Float3, >+ BuiltInName::notEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B2B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpNotEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_notEqual_3B3B( >+ BuiltInId::notEqual_Float4_Float4, >+ BuiltInName::notEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B3B0B, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpNotEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_notEqual_1C1C( >+ BuiltInId::notEqual_Int2_Int2, >+ BuiltInName::notEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpNotEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_notEqual_2C2C( >+ BuiltInId::notEqual_Int3_Int3, >+ BuiltInName::notEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpNotEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_notEqual_3C3C( >+ BuiltInId::notEqual_Int4_Int4, >+ BuiltInName::notEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C3C3C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpNotEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_notEqual_1D1D( >+ BuiltInId::notEqual_UInt2_UInt2, >+ BuiltInName::notEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D1D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpNotEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_notEqual_2D2D( >+ BuiltInId::notEqual_UInt3_UInt3, >+ BuiltInName::notEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpNotEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_notEqual_3D3D( >+ BuiltInId::notEqual_UInt4_UInt4, >+ BuiltInName::notEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D3D0C0C, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpNotEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_notEqual_1E1E( >+ BuiltInId::notEqual_Bool2_Bool2, >+ BuiltInName::notEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1E1E, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpNotEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_notEqual_2E2E( >+ BuiltInId::notEqual_Bool3_Bool3, >+ BuiltInName::notEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2E2E, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpNotEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_notEqual_3E3E( >+ BuiltInId::notEqual_Bool4_Bool4, >+ BuiltInName::notEqual, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3E3E, >+ 2, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpNotEqualComponentWise, >+ true); >+constexpr const TFunction kFunction_any_1E( >+ BuiltInId::any_Bool2, >+ BuiltInName::any, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1E1E, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAny, >+ true); >+constexpr const TFunction kFunction_any_2E( >+ BuiltInId::any_Bool3, >+ BuiltInName::any, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2E2E, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAny, >+ true); >+constexpr const TFunction kFunction_any_3E( >+ BuiltInId::any_Bool4, >+ BuiltInName::any, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3E3E, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAny, >+ true); >+constexpr const TFunction kFunction_all_1E( >+ BuiltInId::all_Bool2, >+ BuiltInName::all, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1E1E, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAll, >+ true); >+constexpr const TFunction kFunction_all_2E( >+ BuiltInId::all_Bool3, >+ BuiltInName::all, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2E2E, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAll, >+ true); >+constexpr const TFunction kFunction_all_3E( >+ BuiltInId::all_Bool4, >+ BuiltInName::all, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3E3E, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAll, >+ true); >+constexpr const TFunction kFunction_notFunc_1E( >+ BuiltInId::notFunc_Bool2, >+ BuiltInName::notFunc, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1E1E, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpLogicalNotComponentWise, >+ true); >+constexpr const TFunction kFunction_notFunc_2E( >+ BuiltInId::notFunc_Bool3, >+ BuiltInName::notFunc, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2E2E, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpLogicalNotComponentWise, >+ true); >+constexpr const TFunction kFunction_notFunc_3E( >+ BuiltInId::notFunc_Bool4, >+ BuiltInName::notFunc, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3E3E, >+ 1, >+ StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpLogicalNotComponentWise, >+ true); >+constexpr const TFunction kFunction_bitfieldExtract_0C0C0C( >+ BuiltInId::bitfieldExtract_Int1_Int1_Int1, >+ BuiltInName::bitfieldExtract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0C0C0C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpBitfieldExtract, >+ true); >+constexpr const TFunction kFunction_bitfieldExtract_1C0C0C( >+ BuiltInId::bitfieldExtract_Int2_Int1_Int1, >+ BuiltInName::bitfieldExtract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C0C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpBitfieldExtract, >+ true); >+constexpr const TFunction kFunction_bitfieldExtract_2C0C0C( >+ BuiltInId::bitfieldExtract_Int3_Int1_Int1, >+ BuiltInName::bitfieldExtract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C0C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpBitfieldExtract, >+ true); >+constexpr const TFunction kFunction_bitfieldExtract_3C0C0C( >+ BuiltInId::bitfieldExtract_Int4_Int1_Int1, >+ BuiltInName::bitfieldExtract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C0C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpBitfieldExtract, >+ true); >+constexpr const TFunction kFunction_bitfieldExtract_0D0C0C( >+ BuiltInId::bitfieldExtract_UInt1_Int1_Int1, >+ BuiltInName::bitfieldExtract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0C0C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpBitfieldExtract, >+ true); >+constexpr const TFunction kFunction_bitfieldExtract_1D0C0C( >+ BuiltInId::bitfieldExtract_UInt2_Int1_Int1, >+ BuiltInName::bitfieldExtract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D0C0C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpBitfieldExtract, >+ true); >+constexpr const TFunction kFunction_bitfieldExtract_2D0C0C( >+ BuiltInId::bitfieldExtract_UInt3_Int1_Int1, >+ BuiltInName::bitfieldExtract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D0C0C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpBitfieldExtract, >+ true); >+constexpr const TFunction kFunction_bitfieldExtract_3D0C0C( >+ BuiltInId::bitfieldExtract_UInt4_Int1_Int1, >+ BuiltInName::bitfieldExtract, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D0C0C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpBitfieldExtract, >+ true); >+constexpr const TFunction kFunction_bitfieldInsert_0C0C0C0C( >+ BuiltInId::bitfieldInsert_Int1_Int1_Int1_Int1, >+ BuiltInName::bitfieldInsert, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0C0C0C0C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpBitfieldInsert, >+ true); >+constexpr const TFunction kFunction_bitfieldInsert_1C1C0C0C( >+ BuiltInId::bitfieldInsert_Int2_Int2_Int1_Int1, >+ BuiltInName::bitfieldInsert, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C0C0C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpBitfieldInsert, >+ true); >+constexpr const TFunction kFunction_bitfieldInsert_2C2C0C0C( >+ BuiltInId::bitfieldInsert_Int3_Int3_Int1_Int1, >+ BuiltInName::bitfieldInsert, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpBitfieldInsert, >+ true); >+constexpr const TFunction kFunction_bitfieldInsert_3C3C0C0C( >+ BuiltInId::bitfieldInsert_Int4_Int4_Int1_Int1, >+ BuiltInName::bitfieldInsert, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C3C0C0C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpBitfieldInsert, >+ true); >+constexpr const TFunction kFunction_bitfieldInsert_0D0D0C0C( >+ BuiltInId::bitfieldInsert_UInt1_UInt1_Int1_Int1, >+ BuiltInName::bitfieldInsert, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0D0C0C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpBitfieldInsert, >+ true); >+constexpr const TFunction kFunction_bitfieldInsert_1D1D0C0C( >+ BuiltInId::bitfieldInsert_UInt2_UInt2_Int1_Int1, >+ BuiltInName::bitfieldInsert, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D1D0C0C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpBitfieldInsert, >+ true); >+constexpr const TFunction kFunction_bitfieldInsert_2D2D0C0C( >+ BuiltInId::bitfieldInsert_UInt3_UInt3_Int1_Int1, >+ BuiltInName::bitfieldInsert, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D0C0C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpBitfieldInsert, >+ true); >+constexpr const TFunction kFunction_bitfieldInsert_3D3D0C0C( >+ BuiltInId::bitfieldInsert_UInt4_UInt4_Int1_Int1, >+ BuiltInName::bitfieldInsert, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D3D0C0C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpBitfieldInsert, >+ true); >+constexpr const TFunction kFunction_bitfieldReverse_0C( >+ BuiltInId::bitfieldReverse_Int1, >+ BuiltInName::bitfieldReverse, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0C0C_o_0C_o_0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpBitfieldReverse, >+ true); >+constexpr const TFunction kFunction_bitfieldReverse_1C( >+ BuiltInId::bitfieldReverse_Int2, >+ BuiltInName::bitfieldReverse, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpBitfieldReverse, >+ true); >+constexpr const TFunction kFunction_bitfieldReverse_2C( >+ BuiltInId::bitfieldReverse_Int3, >+ BuiltInName::bitfieldReverse, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpBitfieldReverse, >+ true); >+constexpr const TFunction kFunction_bitfieldReverse_3C( >+ BuiltInId::bitfieldReverse_Int4, >+ BuiltInName::bitfieldReverse, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpBitfieldReverse, >+ true); >+constexpr const TFunction kFunction_bitfieldReverse_0D( >+ BuiltInId::bitfieldReverse_UInt1, >+ BuiltInName::bitfieldReverse, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0C0C, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpBitfieldReverse, >+ true); >+constexpr const TFunction kFunction_bitfieldReverse_1D( >+ BuiltInId::bitfieldReverse_UInt2, >+ BuiltInName::bitfieldReverse, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D0C0C, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpBitfieldReverse, >+ true); >+constexpr const TFunction kFunction_bitfieldReverse_2D( >+ BuiltInId::bitfieldReverse_UInt3, >+ BuiltInName::bitfieldReverse, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D0C0C, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpBitfieldReverse, >+ true); >+constexpr const TFunction kFunction_bitfieldReverse_3D( >+ BuiltInId::bitfieldReverse_UInt4, >+ BuiltInName::bitfieldReverse, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D0C0C, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpBitfieldReverse, >+ true); >+constexpr const TFunction kFunction_bitCount_0C( >+ BuiltInId::bitCount_Int1, >+ BuiltInName::bitCount, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0C0C_o_0C_o_0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpBitCount, >+ true); >+constexpr const TFunction kFunction_bitCount_1C( >+ BuiltInId::bitCount_Int2, >+ BuiltInName::bitCount, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpBitCount, >+ true); >+constexpr const TFunction kFunction_bitCount_2C( >+ BuiltInId::bitCount_Int3, >+ BuiltInName::bitCount, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpBitCount, >+ true); >+constexpr const TFunction kFunction_bitCount_3C( >+ BuiltInId::bitCount_Int4, >+ BuiltInName::bitCount, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpBitCount, >+ true); >+constexpr const TFunction kFunction_bitCount_0D( >+ BuiltInId::bitCount_UInt1, >+ BuiltInName::bitCount, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpBitCount, >+ true); >+constexpr const TFunction kFunction_bitCount_1D( >+ BuiltInId::bitCount_UInt2, >+ BuiltInName::bitCount, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpBitCount, >+ true); >+constexpr const TFunction kFunction_bitCount_2D( >+ BuiltInId::bitCount_UInt3, >+ BuiltInName::bitCount, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpBitCount, >+ true); >+constexpr const TFunction kFunction_bitCount_3D( >+ BuiltInId::bitCount_UInt4, >+ BuiltInName::bitCount, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpBitCount, >+ true); >+constexpr const TFunction kFunction_findLSB_0C( >+ BuiltInId::findLSB_Int1, >+ BuiltInName::findLSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0C0C_o_0C_o_0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpFindLSB, >+ true); >+constexpr const TFunction kFunction_findLSB_1C( >+ BuiltInId::findLSB_Int2, >+ BuiltInName::findLSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpFindLSB, >+ true); >+constexpr const TFunction kFunction_findLSB_2C( >+ BuiltInId::findLSB_Int3, >+ BuiltInName::findLSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpFindLSB, >+ true); >+constexpr const TFunction kFunction_findLSB_3C( >+ BuiltInId::findLSB_Int4, >+ BuiltInName::findLSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpFindLSB, >+ true); >+constexpr const TFunction kFunction_findLSB_0D( >+ BuiltInId::findLSB_UInt1, >+ BuiltInName::findLSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpFindLSB, >+ true); >+constexpr const TFunction kFunction_findLSB_1D( >+ BuiltInId::findLSB_UInt2, >+ BuiltInName::findLSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpFindLSB, >+ true); >+constexpr const TFunction kFunction_findLSB_2D( >+ BuiltInId::findLSB_UInt3, >+ BuiltInName::findLSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpFindLSB, >+ true); >+constexpr const TFunction kFunction_findLSB_3D( >+ BuiltInId::findLSB_UInt4, >+ BuiltInName::findLSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpFindLSB, >+ true); >+constexpr const TFunction kFunction_findMSB_0C( >+ BuiltInId::findMSB_Int1, >+ BuiltInName::findMSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0C0C_o_0C_o_0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpFindMSB, >+ true); >+constexpr const TFunction kFunction_findMSB_1C( >+ BuiltInId::findMSB_Int2, >+ BuiltInName::findMSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpFindMSB, >+ true); >+constexpr const TFunction kFunction_findMSB_2C( >+ BuiltInId::findMSB_Int3, >+ BuiltInName::findMSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpFindMSB, >+ true); >+constexpr const TFunction kFunction_findMSB_3C( >+ BuiltInId::findMSB_Int4, >+ BuiltInName::findMSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpFindMSB, >+ true); >+constexpr const TFunction kFunction_findMSB_0D( >+ BuiltInId::findMSB_UInt1, >+ BuiltInName::findMSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpFindMSB, >+ true); >+constexpr const TFunction kFunction_findMSB_1D( >+ BuiltInId::findMSB_UInt2, >+ BuiltInName::findMSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpFindMSB, >+ true); >+constexpr const TFunction kFunction_findMSB_2D( >+ BuiltInId::findMSB_UInt3, >+ BuiltInName::findMSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpFindMSB, >+ true); >+constexpr const TFunction kFunction_findMSB_3D( >+ BuiltInId::findMSB_UInt4, >+ BuiltInName::findMSB, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D0C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpFindMSB, >+ true); >+constexpr const TFunction kFunction_uaddCarry_0D0D0D( >+ BuiltInId::uaddCarry_UInt1_UInt1_UInt1, >+ BuiltInName::uaddCarry, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0D_o_0D_o_0D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpUaddCarry, >+ false); >+constexpr const TFunction kFunction_uaddCarry_1D1D1D( >+ BuiltInId::uaddCarry_UInt2_UInt2_UInt2, >+ BuiltInName::uaddCarry, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D1D_o_1D_o_1D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpUaddCarry, >+ false); >+constexpr const TFunction kFunction_uaddCarry_2D2D2D( >+ BuiltInId::uaddCarry_UInt3_UInt3_UInt3, >+ BuiltInName::uaddCarry, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D_o_2D_o_2D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpUaddCarry, >+ false); >+constexpr const TFunction kFunction_uaddCarry_3D3D3D( >+ BuiltInId::uaddCarry_UInt4_UInt4_UInt4, >+ BuiltInName::uaddCarry, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D3D_o_3D_o_3D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpUaddCarry, >+ false); >+constexpr const TFunction kFunction_usubBorrow_0D0D0D( >+ BuiltInId::usubBorrow_UInt1_UInt1_UInt1, >+ BuiltInName::usubBorrow, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0D_o_0D_o_0D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpUsubBorrow, >+ false); >+constexpr const TFunction kFunction_usubBorrow_1D1D1D( >+ BuiltInId::usubBorrow_UInt2_UInt2_UInt2, >+ BuiltInName::usubBorrow, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D1D_o_1D_o_1D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpUsubBorrow, >+ false); >+constexpr const TFunction kFunction_usubBorrow_2D2D2D( >+ BuiltInId::usubBorrow_UInt3_UInt3_UInt3, >+ BuiltInName::usubBorrow, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D_o_2D_o_2D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpUsubBorrow, >+ false); >+constexpr const TFunction kFunction_usubBorrow_3D3D3D( >+ BuiltInId::usubBorrow_UInt4_UInt4_UInt4, >+ BuiltInName::usubBorrow, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D3D_o_3D_o_3D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpUsubBorrow, >+ false); >+constexpr const TFunction kFunction_umulExtended_0D0D0D0D( >+ BuiltInId::umulExtended_UInt1_UInt1_UInt1_UInt1, >+ BuiltInName::umulExtended, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0D0D_o_0D_o_0D, >+ 4, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpUmulExtended, >+ false); >+constexpr const TFunction kFunction_umulExtended_1D1D1D1D( >+ BuiltInId::umulExtended_UInt2_UInt2_UInt2_UInt2, >+ BuiltInName::umulExtended, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1D1D_o_1D_o_1D, >+ 4, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpUmulExtended, >+ false); >+constexpr const TFunction kFunction_umulExtended_2D2D2D2D( >+ BuiltInId::umulExtended_UInt3_UInt3_UInt3_UInt3, >+ BuiltInName::umulExtended, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2D2D_o_2D_o_2D, >+ 4, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpUmulExtended, >+ false); >+constexpr const TFunction kFunction_umulExtended_3D3D3D3D( >+ BuiltInId::umulExtended_UInt4_UInt4_UInt4_UInt4, >+ BuiltInName::umulExtended, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3D3D_o_3D_o_3D, >+ 4, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpUmulExtended, >+ false); >+constexpr const TFunction kFunction_imulExtended_0C0C0C0C( >+ BuiltInId::imulExtended_Int1_Int1_Int1_Int1, >+ BuiltInName::imulExtended, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0C0C_o_0C_o_0C, >+ 4, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImulExtended, >+ false); >+constexpr const TFunction kFunction_imulExtended_1C1C1C1C( >+ BuiltInId::imulExtended_Int2_Int2_Int2_Int2, >+ BuiltInName::imulExtended, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1C1C_o_1C_o_1C, >+ 4, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImulExtended, >+ false); >+constexpr const TFunction kFunction_imulExtended_2C2C2C2C( >+ BuiltInId::imulExtended_Int3_Int3_Int3_Int3, >+ BuiltInName::imulExtended, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2C2C_o_2C_o_2C, >+ 4, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImulExtended, >+ false); >+constexpr const TFunction kFunction_imulExtended_3C3C3C3C( >+ BuiltInId::imulExtended_Int4_Int4_Int4_Int4, >+ BuiltInName::imulExtended, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3C3C_o_3C_o_3C, >+ 4, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImulExtended, >+ false); >+constexpr const TFunction kFunction_texture2D_0H1B( >+ BuiltInId::texture2D_Sampler2D1_Float2, >+ BuiltInName::texture2D, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B1B1B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DProj_0H2B( >+ BuiltInId::texture2DProj_Sampler2D1_Float3, >+ BuiltInName::texture2DProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H2B0B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DProj_0H3B( >+ BuiltInId::texture2DProj_Sampler2D1_Float4, >+ BuiltInName::texture2DProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H3B0B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureCube_0J2B( >+ BuiltInId::textureCube_SamplerCube1_Float3, >+ BuiltInName::textureCube, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0J2B2B2B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2D_0L1B( >+ BuiltInId::texture2D_SamplerExternalOES1_Float2, >+ BuiltInName::texture2D, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0L1B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DProj_0L2B( >+ BuiltInId::texture2DProj_SamplerExternalOES1_Float3, >+ BuiltInName::texture2DProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0L2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DProj_0L3B( >+ BuiltInId::texture2DProj_SamplerExternalOES1_Float4, >+ BuiltInName::texture2DProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0L3B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DRect_0N1B( >+ BuiltInId::texture2DRect_Sampler2DRect1_Float2, >+ BuiltInName::texture2DRect, >+ TExtension::ARB_texture_rectangle, >+ BuiltInParameters::p0N1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DRectProj_0N2B( >+ BuiltInId::texture2DRectProj_Sampler2DRect1_Float3, >+ BuiltInName::texture2DRectProj, >+ TExtension::ARB_texture_rectangle, >+ BuiltInParameters::p0N2B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DRectProj_0N3B( >+ BuiltInId::texture2DRectProj_Sampler2DRect1_Float4, >+ BuiltInName::texture2DRectProj, >+ TExtension::ARB_texture_rectangle, >+ BuiltInParameters::p0N3B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0N1B( >+ BuiltInId::texture_Sampler2DRect1_Float2, >+ BuiltInName::texture, >+ TExtension::ARB_texture_rectangle, >+ BuiltInParameters::p0N1B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0N2B( >+ BuiltInId::textureProj_Sampler2DRect1_Float3, >+ BuiltInName::textureProj, >+ TExtension::ARB_texture_rectangle, >+ BuiltInParameters::p0N2B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0N3B( >+ BuiltInId::textureProj_Sampler2DRect1_Float4, >+ BuiltInName::textureProj, >+ TExtension::ARB_texture_rectangle, >+ BuiltInParameters::p0N3B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DGradEXT_0H1B1B1B( >+ BuiltInId::texture2DGradEXT_Sampler2D1_Float2_Float2_Float2, >+ BuiltInName::texture2DGradEXT, >+ TExtension::EXT_shader_texture_lod, >+ BuiltInParameters::p0H1B1B1B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DProjGradEXT_0H2B1B1B( >+ BuiltInId::texture2DProjGradEXT_Sampler2D1_Float3_Float2_Float2, >+ BuiltInName::texture2DProjGradEXT, >+ TExtension::EXT_shader_texture_lod, >+ BuiltInParameters::p0H2B1B1B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DProjGradEXT_0H3B1B1B( >+ BuiltInId::texture2DProjGradEXT_Sampler2D1_Float4_Float2_Float2, >+ BuiltInName::texture2DProjGradEXT, >+ TExtension::EXT_shader_texture_lod, >+ BuiltInParameters::p0H3B1B1B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureCubeGradEXT_0J2B2B2B( >+ BuiltInId::textureCubeGradEXT_SamplerCube1_Float3_Float3_Float3, >+ BuiltInName::textureCubeGradEXT, >+ TExtension::EXT_shader_texture_lod, >+ BuiltInParameters::p0J2B2B2B, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2D_0H1B0B( >+ BuiltInId::texture2D_Sampler2D1_Float2_Float1, >+ BuiltInName::texture2D, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DProj_0H2B0B( >+ BuiltInId::texture2DProj_Sampler2D1_Float3_Float1, >+ BuiltInName::texture2DProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H2B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DProj_0H3B0B( >+ BuiltInId::texture2DProj_Sampler2D1_Float4_Float1, >+ BuiltInName::texture2DProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H3B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureCube_0J2B0B( >+ BuiltInId::textureCube_SamplerCube1_Float3_Float1, >+ BuiltInName::textureCube, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0J2B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_dFdxExt_0B( >+ BuiltInId::dFdxExt_Float1, >+ BuiltInName::dFdxExt, >+ TExtension::OES_standard_derivatives, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDFdx, >+ false); >+constexpr const TFunction kFunction_dFdxExt_1B( >+ BuiltInId::dFdxExt_Float2, >+ BuiltInName::dFdxExt, >+ TExtension::OES_standard_derivatives, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpDFdx, >+ false); >+constexpr const TFunction kFunction_dFdxExt_2B( >+ BuiltInId::dFdxExt_Float3, >+ BuiltInName::dFdxExt, >+ TExtension::OES_standard_derivatives, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpDFdx, >+ false); >+constexpr const TFunction kFunction_dFdxExt_3B( >+ BuiltInId::dFdxExt_Float4, >+ BuiltInName::dFdxExt, >+ TExtension::OES_standard_derivatives, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpDFdx, >+ false); >+constexpr const TFunction kFunction_dFdyExt_0B( >+ BuiltInId::dFdyExt_Float1, >+ BuiltInName::dFdyExt, >+ TExtension::OES_standard_derivatives, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDFdy, >+ false); >+constexpr const TFunction kFunction_dFdyExt_1B( >+ BuiltInId::dFdyExt_Float2, >+ BuiltInName::dFdyExt, >+ TExtension::OES_standard_derivatives, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpDFdy, >+ false); >+constexpr const TFunction kFunction_dFdyExt_2B( >+ BuiltInId::dFdyExt_Float3, >+ BuiltInName::dFdyExt, >+ TExtension::OES_standard_derivatives, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpDFdy, >+ false); >+constexpr const TFunction kFunction_dFdyExt_3B( >+ BuiltInId::dFdyExt_Float4, >+ BuiltInName::dFdyExt, >+ TExtension::OES_standard_derivatives, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpDFdy, >+ false); >+constexpr const TFunction kFunction_fwidthExt_0B( >+ BuiltInId::fwidthExt_Float1, >+ BuiltInName::fwidthExt, >+ TExtension::OES_standard_derivatives, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpFwidth, >+ false); >+constexpr const TFunction kFunction_fwidthExt_1B( >+ BuiltInId::fwidthExt_Float2, >+ BuiltInName::fwidthExt, >+ TExtension::OES_standard_derivatives, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpFwidth, >+ false); >+constexpr const TFunction kFunction_fwidthExt_2B( >+ BuiltInId::fwidthExt_Float3, >+ BuiltInName::fwidthExt, >+ TExtension::OES_standard_derivatives, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpFwidth, >+ false); >+constexpr const TFunction kFunction_fwidthExt_3B( >+ BuiltInId::fwidthExt_Float4, >+ BuiltInName::fwidthExt, >+ TExtension::OES_standard_derivatives, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpFwidth, >+ false); >+constexpr const TFunction kFunction_texture2DLodEXT_0H1B0B( >+ BuiltInId::texture2DLodEXT_Sampler2D1_Float2_Float1, >+ BuiltInName::texture2DLodEXT, >+ TExtension::EXT_shader_texture_lod, >+ BuiltInParameters::p0H1B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DProjLodEXT_0H2B0B( >+ BuiltInId::texture2DProjLodEXT_Sampler2D1_Float3_Float1, >+ BuiltInName::texture2DProjLodEXT, >+ TExtension::EXT_shader_texture_lod, >+ BuiltInParameters::p0H2B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DProjLodEXT_0H3B0B( >+ BuiltInId::texture2DProjLodEXT_Sampler2D1_Float4_Float1, >+ BuiltInName::texture2DProjLodEXT, >+ TExtension::EXT_shader_texture_lod, >+ BuiltInParameters::p0H3B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureCubeLodEXT_0J2B0B( >+ BuiltInId::textureCubeLodEXT_SamplerCube1_Float3_Float1, >+ BuiltInName::textureCubeLodEXT, >+ TExtension::EXT_shader_texture_lod, >+ BuiltInParameters::p0J2B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DLod_0H1B0B( >+ BuiltInId::texture2DLod_Sampler2D1_Float2_Float1, >+ BuiltInName::texture2DLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DProjLod_0H2B0B( >+ BuiltInId::texture2DProjLod_Sampler2D1_Float3_Float1, >+ BuiltInName::texture2DProjLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H2B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture2DProjLod_0H3B0B( >+ BuiltInId::texture2DProjLod_Sampler2D1_Float4_Float1, >+ BuiltInName::texture2DProjLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H3B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureCubeLod_0J2B0B( >+ BuiltInId::textureCubeLod_SamplerCube1_Float3_Float1, >+ BuiltInName::textureCubeLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0J2B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0H1B( >+ BuiltInId::texture_Sampler2D1_Float2, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B1B1B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0Q1B( >+ BuiltInId::texture_ISampler2D1_Float2, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q1B1B1B1C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0W1B( >+ BuiltInId::texture_USampler2D1_Float2, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W1B1C0C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0I2B( >+ BuiltInId::texture_Sampler3D1_Float3, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I2B0B2C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0R2B( >+ BuiltInId::texture_ISampler3D1_Float3, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R2B0B2C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0X2B( >+ BuiltInId::texture_USampler3D1_Float3, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X2B0B2C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0J2B( >+ BuiltInId::texture_SamplerCube1_Float3, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0J2B2B2B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0S2B( >+ BuiltInId::texture_ISamplerCube1_Float3, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0S2B0B, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0Y2B( >+ BuiltInId::texture_USamplerCube1_Float3, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Y2B0B, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0K2B( >+ BuiltInId::texture_Sampler2DArray1_Float3, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K2B0B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0T2B( >+ BuiltInId::texture_ISampler2DArray1_Float3, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T2B1B1B1C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0Z2B( >+ BuiltInId::texture_USampler2DArray1_Float3, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z2B1B1B1C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0H2B( >+ BuiltInId::textureProj_Sampler2D1_Float3, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H2B0B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0Q2B( >+ BuiltInId::textureProj_ISampler2D1_Float3, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q2B1B1B1C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0W2B( >+ BuiltInId::textureProj_USampler2D1_Float3, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W2B1C0B, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0H3B( >+ BuiltInId::textureProj_Sampler2D1_Float4, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H3B0B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0Q3B( >+ BuiltInId::textureProj_ISampler2D1_Float4, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q3B1B1B1C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0W3B( >+ BuiltInId::textureProj_USampler2D1_Float4, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W3B1B1B1C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0I3B( >+ BuiltInId::textureProj_Sampler3D1_Float4, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I3B2C0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0R3B( >+ BuiltInId::textureProj_ISampler3D1_Float4, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R3B0B2C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0X3B( >+ BuiltInId::textureProj_USampler3D1_Float4, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X3B2B2B2C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLod_0H1B0B( >+ BuiltInId::textureLod_Sampler2D1_Float2_Float1, >+ BuiltInName::textureLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLod_0Q1B0B( >+ BuiltInId::textureLod_ISampler2D1_Float2_Float1, >+ BuiltInName::textureLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q1B0B1C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLod_0W1B0B( >+ BuiltInId::textureLod_USampler2D1_Float2_Float1, >+ BuiltInName::textureLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W1B0B1C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLod_0I2B0B( >+ BuiltInId::textureLod_Sampler3D1_Float3_Float1, >+ BuiltInName::textureLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I2B0B2C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLod_0R2B0B( >+ BuiltInId::textureLod_ISampler3D1_Float3_Float1, >+ BuiltInName::textureLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R2B0B2C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLod_0X2B0B( >+ BuiltInId::textureLod_USampler3D1_Float3_Float1, >+ BuiltInName::textureLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X2B0B2C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLod_0J2B0B( >+ BuiltInId::textureLod_SamplerCube1_Float3_Float1, >+ BuiltInName::textureLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0J2B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLod_0S2B0B( >+ BuiltInId::textureLod_ISamplerCube1_Float3_Float1, >+ BuiltInName::textureLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0S2B0B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLod_0Y2B0B( >+ BuiltInId::textureLod_USamplerCube1_Float3_Float1, >+ BuiltInName::textureLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Y2B0B, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLod_0K2B0B( >+ BuiltInId::textureLod_Sampler2DArray1_Float3_Float1, >+ BuiltInName::textureLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K2B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLod_0T2B0B( >+ BuiltInId::textureLod_ISampler2DArray1_Float3_Float1, >+ BuiltInName::textureLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T2B0B1C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLod_0Z2B0B( >+ BuiltInId::textureLod_USampler2DArray1_Float3_Float1, >+ BuiltInName::textureLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z2B0B1C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0c2B( >+ BuiltInId::texture_Sampler2DShadow1_Float3, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c2B1B1B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0d3B( >+ BuiltInId::texture_SamplerCubeShadow1_Float4, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0d3B2B2B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0e3B( >+ BuiltInId::texture_Sampler2DArrayShadow1_Float4, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0e3B1B1B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0c3B( >+ BuiltInId::textureProj_Sampler2DShadow1_Float4, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c3B0B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLod_0c2B0B( >+ BuiltInId::textureLod_Sampler2DShadow1_Float3_Float1, >+ BuiltInName::textureLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c2B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0H0C( >+ BuiltInId::textureSize_Sampler2D1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0Q0C( >+ BuiltInId::textureSize_ISampler2D1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0W0C( >+ BuiltInId::textureSize_USampler2D1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0I0C( >+ BuiltInId::textureSize_Sampler3D1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0R0C( >+ BuiltInId::textureSize_ISampler3D1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0X0C( >+ BuiltInId::textureSize_USampler3D1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0J0C( >+ BuiltInId::textureSize_SamplerCube1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0J0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0S0C( >+ BuiltInId::textureSize_ISamplerCube1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0S0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0Y0C( >+ BuiltInId::textureSize_USamplerCube1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Y0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0K0C( >+ BuiltInId::textureSize_Sampler2DArray1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0T0C( >+ BuiltInId::textureSize_ISampler2DArray1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0Z0C( >+ BuiltInId::textureSize_USampler2DArray1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0c0C( >+ BuiltInId::textureSize_Sampler2DShadow1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0d0C( >+ BuiltInId::textureSize_SamplerCubeShadow1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0d0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0e0C( >+ BuiltInId::textureSize_Sampler2DArrayShadow1_Int1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0e0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLod_0H2B0B( >+ BuiltInId::textureProjLod_Sampler2D1_Float3_Float1, >+ BuiltInName::textureProjLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H2B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLod_0Q2B0B( >+ BuiltInId::textureProjLod_ISampler2D1_Float3_Float1, >+ BuiltInName::textureProjLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q2B0B1C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLod_0W2B0B( >+ BuiltInId::textureProjLod_USampler2D1_Float3_Float1, >+ BuiltInName::textureProjLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W2B0B1C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLod_0H3B0B( >+ BuiltInId::textureProjLod_Sampler2D1_Float4_Float1, >+ BuiltInName::textureProjLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H3B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLod_0Q3B0B( >+ BuiltInId::textureProjLod_ISampler2D1_Float4_Float1, >+ BuiltInName::textureProjLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q3B0B1C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLod_0W3B0B( >+ BuiltInId::textureProjLod_USampler2D1_Float4_Float1, >+ BuiltInName::textureProjLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W3B0B1C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLod_0I3B0B( >+ BuiltInId::textureProjLod_Sampler3D1_Float4_Float1, >+ BuiltInName::textureProjLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I3B0B2C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLod_0R3B0B( >+ BuiltInId::textureProjLod_ISampler3D1_Float4_Float1, >+ BuiltInName::textureProjLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R3B0B2C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLod_0X3B0B( >+ BuiltInId::textureProjLod_USampler3D1_Float4_Float1, >+ BuiltInName::textureProjLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X3B0B2C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLod_0c3B0B( >+ BuiltInId::textureProjLod_Sampler2DShadow1_Float4_Float1, >+ BuiltInName::textureProjLod, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c3B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0H1C0C( >+ BuiltInId::texelFetch_Sampler2D1_Int2_Int1, >+ BuiltInName::texelFetch, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1C0C1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0Q1C0C( >+ BuiltInId::texelFetch_ISampler2D1_Int2_Int1, >+ BuiltInName::texelFetch, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q1C0C1C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0W1C0C( >+ BuiltInId::texelFetch_USampler2D1_Int2_Int1, >+ BuiltInName::texelFetch, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W1C0C1C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0I2C0C( >+ BuiltInId::texelFetch_Sampler3D1_Int3_Int1, >+ BuiltInName::texelFetch, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I2C0C2C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0R2C0C( >+ BuiltInId::texelFetch_ISampler3D1_Int3_Int1, >+ BuiltInName::texelFetch, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R2C0C2C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0X2C0C( >+ BuiltInId::texelFetch_USampler3D1_Int3_Int1, >+ BuiltInName::texelFetch, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X2C0C2C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0K2C0C( >+ BuiltInId::texelFetch_Sampler2DArray1_Int3_Int1, >+ BuiltInName::texelFetch, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K2C0C1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0T2C0C( >+ BuiltInId::texelFetch_ISampler2DArray1_Int3_Int1, >+ BuiltInName::texelFetch, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T2C0C1C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0Z2C0C( >+ BuiltInId::texelFetch_USampler2DArray1_Int3_Int1, >+ BuiltInName::texelFetch, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z2C0C1C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0H1B1B1B( >+ BuiltInId::textureGrad_Sampler2D1_Float2_Float2_Float2, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B1B1B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0Q1B1B1B( >+ BuiltInId::textureGrad_ISampler2D1_Float2_Float2_Float2, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q1B1B1B1C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0W1B1B1B( >+ BuiltInId::textureGrad_USampler2D1_Float2_Float2_Float2, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W1B1B1B1C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0I2B2B2B( >+ BuiltInId::textureGrad_Sampler3D1_Float3_Float3_Float3, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I2B2B2B2C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0R2B2B2B( >+ BuiltInId::textureGrad_ISampler3D1_Float3_Float3_Float3, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R2B2B2B2C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0X2B2B2B( >+ BuiltInId::textureGrad_USampler3D1_Float3_Float3_Float3, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X2B2B2B2C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0J2B2B2B( >+ BuiltInId::textureGrad_SamplerCube1_Float3_Float3_Float3, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0J2B2B2B, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0S2B2B2B( >+ BuiltInId::textureGrad_ISamplerCube1_Float3_Float3_Float3, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0S2B2B2B, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0Y2B2B2B( >+ BuiltInId::textureGrad_USamplerCube1_Float3_Float3_Float3, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Y2B2B2B, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0c2B1B1B( >+ BuiltInId::textureGrad_Sampler2DShadow1_Float3_Float2_Float2, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c2B1B1B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0d3B2B2B( >+ BuiltInId::textureGrad_SamplerCubeShadow1_Float4_Float3_Float3, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0d3B2B2B, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0K2B1B1B( >+ BuiltInId::textureGrad_Sampler2DArray1_Float3_Float2_Float2, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K2B1B1B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0T2B1B1B( >+ BuiltInId::textureGrad_ISampler2DArray1_Float3_Float2_Float2, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T2B1B1B1C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0Z2B1B1B( >+ BuiltInId::textureGrad_USampler2DArray1_Float3_Float2_Float2, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z2B1B1B1C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGrad_0e3B1B1B( >+ BuiltInId::textureGrad_Sampler2DArrayShadow1_Float4_Float2_Float2, >+ BuiltInName::textureGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0e3B1B1B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGrad_0H2B1B1B( >+ BuiltInId::textureProjGrad_Sampler2D1_Float3_Float2_Float2, >+ BuiltInName::textureProjGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H2B1B1B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGrad_0Q2B1B1B( >+ BuiltInId::textureProjGrad_ISampler2D1_Float3_Float2_Float2, >+ BuiltInName::textureProjGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q2B1B1B1C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGrad_0W2B1B1B( >+ BuiltInId::textureProjGrad_USampler2D1_Float3_Float2_Float2, >+ BuiltInName::textureProjGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W2B1B1B1C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGrad_0H3B1B1B( >+ BuiltInId::textureProjGrad_Sampler2D1_Float4_Float2_Float2, >+ BuiltInName::textureProjGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H3B1B1B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGrad_0Q3B1B1B( >+ BuiltInId::textureProjGrad_ISampler2D1_Float4_Float2_Float2, >+ BuiltInName::textureProjGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q3B1B1B1C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGrad_0W3B1B1B( >+ BuiltInId::textureProjGrad_USampler2D1_Float4_Float2_Float2, >+ BuiltInName::textureProjGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W3B1B1B1C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGrad_0I3B2B2B( >+ BuiltInId::textureProjGrad_Sampler3D1_Float4_Float3_Float3, >+ BuiltInName::textureProjGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I3B2B2B2C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGrad_0R3B2B2B( >+ BuiltInId::textureProjGrad_ISampler3D1_Float4_Float3_Float3, >+ BuiltInName::textureProjGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R3B2B2B2C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGrad_0X3B2B2B( >+ BuiltInId::textureProjGrad_USampler3D1_Float4_Float3_Float3, >+ BuiltInName::textureProjGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X3B2B2B2C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGrad_0c3B1B1B( >+ BuiltInId::textureProjGrad_Sampler2DShadow1_Float4_Float2_Float2, >+ BuiltInName::textureProjGrad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c3B1B1B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0O( >+ BuiltInId::textureSize_Sampler2DMS1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0O1C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0U( >+ BuiltInId::textureSize_ISampler2DMS1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0U1C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0a( >+ BuiltInId::textureSize_USampler2DMS1, >+ BuiltInName::textureSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0a1C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSizeExt_0O( >+ BuiltInId::textureSizeExt_Sampler2DMS1, >+ BuiltInName::textureSizeExt, >+ TExtension::ANGLE_texture_multisample, >+ BuiltInParameters::p0O1C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSizeExt_0U( >+ BuiltInId::textureSizeExt_ISampler2DMS1, >+ BuiltInName::textureSizeExt, >+ TExtension::ANGLE_texture_multisample, >+ BuiltInParameters::p0U1C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSizeExt_0a( >+ BuiltInId::textureSizeExt_USampler2DMS1, >+ BuiltInName::textureSizeExt, >+ TExtension::ANGLE_texture_multisample, >+ BuiltInParameters::p0a1C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0P( >+ BuiltInId::textureSize_Sampler2DMSArray1, >+ BuiltInName::textureSize, >+ TExtension::OES_texture_storage_multisample_2d_array, >+ BuiltInParameters::p0P2C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0V( >+ BuiltInId::textureSize_ISampler2DMSArray1, >+ BuiltInName::textureSize, >+ TExtension::OES_texture_storage_multisample_2d_array, >+ BuiltInParameters::p0V2C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0b( >+ BuiltInId::textureSize_USampler2DMSArray1, >+ BuiltInName::textureSize, >+ TExtension::OES_texture_storage_multisample_2d_array, >+ BuiltInParameters::p0b2C0C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0H1B1C( >+ BuiltInId::textureOffset_Sampler2D1_Float2_Int2, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B1C0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0Q1B1C( >+ BuiltInId::textureOffset_ISampler2D1_Float2_Int2, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q1B1C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0W1B1C( >+ BuiltInId::textureOffset_USampler2D1_Float2_Int2, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W1B1C0C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0I2B2C( >+ BuiltInId::textureOffset_Sampler3D1_Float3_Int3, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I2B2C0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0R2B2C( >+ BuiltInId::textureOffset_ISampler3D1_Float3_Int3, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R2B2C0B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0X2B2C( >+ BuiltInId::textureOffset_USampler3D1_Float3_Int3, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X2B2C0B, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0c2B1C( >+ BuiltInId::textureOffset_Sampler2DShadow1_Float3_Int2, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c2B1C0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0K2B1C( >+ BuiltInId::textureOffset_Sampler2DArray1_Float3_Int2, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K2B1C0C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0T2B1C( >+ BuiltInId::textureOffset_ISampler2DArray1_Float3_Int2, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T2B1C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0Z2B1C( >+ BuiltInId::textureOffset_USampler2DArray1_Float3_Int2, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z2B1C0C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0H2B1C( >+ BuiltInId::textureProjOffset_Sampler2D1_Float3_Int2, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H2B1C0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0Q2B1C( >+ BuiltInId::textureProjOffset_ISampler2D1_Float3_Int2, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q2B1C0B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0W2B1C( >+ BuiltInId::textureProjOffset_USampler2D1_Float3_Int2, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W2B1C0B, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0H3B1C( >+ BuiltInId::textureProjOffset_Sampler2D1_Float4_Int2, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H3B1C0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0Q3B1C( >+ BuiltInId::textureProjOffset_ISampler2D1_Float4_Int2, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q3B1C0B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0W3B1C( >+ BuiltInId::textureProjOffset_USampler2D1_Float4_Int2, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W3B1C0B, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0I3B2C( >+ BuiltInId::textureProjOffset_Sampler3D1_Float4_Int3, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I3B2C0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0R3B2C( >+ BuiltInId::textureProjOffset_ISampler3D1_Float4_Int3, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R3B2C0B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0X3B2C( >+ BuiltInId::textureProjOffset_USampler3D1_Float4_Int3, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X3B2C0B, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0c3B1C( >+ BuiltInId::textureProjOffset_Sampler2DShadow1_Float4_Int2, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c3B1C0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLodOffset_0H1B0B1C( >+ BuiltInId::textureLodOffset_Sampler2D1_Float2_Float1_Int2, >+ BuiltInName::textureLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B0B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLodOffset_0Q1B0B1C( >+ BuiltInId::textureLodOffset_ISampler2D1_Float2_Float1_Int2, >+ BuiltInName::textureLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q1B0B1C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLodOffset_0W1B0B1C( >+ BuiltInId::textureLodOffset_USampler2D1_Float2_Float1_Int2, >+ BuiltInName::textureLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W1B0B1C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLodOffset_0I2B0B2C( >+ BuiltInId::textureLodOffset_Sampler3D1_Float3_Float1_Int3, >+ BuiltInName::textureLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I2B0B2C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLodOffset_0R2B0B2C( >+ BuiltInId::textureLodOffset_ISampler3D1_Float3_Float1_Int3, >+ BuiltInName::textureLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R2B0B2C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLodOffset_0X2B0B2C( >+ BuiltInId::textureLodOffset_USampler3D1_Float3_Float1_Int3, >+ BuiltInName::textureLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X2B0B2C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLodOffset_0c2B0B1C( >+ BuiltInId::textureLodOffset_Sampler2DShadow1_Float3_Float1_Int2, >+ BuiltInName::textureLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c2B0B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLodOffset_0K2B0B1C( >+ BuiltInId::textureLodOffset_Sampler2DArray1_Float3_Float1_Int2, >+ BuiltInName::textureLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K2B0B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLodOffset_0T2B0B1C( >+ BuiltInId::textureLodOffset_ISampler2DArray1_Float3_Float1_Int2, >+ BuiltInName::textureLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T2B0B1C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureLodOffset_0Z2B0B1C( >+ BuiltInId::textureLodOffset_USampler2DArray1_Float3_Float1_Int2, >+ BuiltInName::textureLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z2B0B1C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLodOffset_0H2B0B1C( >+ BuiltInId::textureProjLodOffset_Sampler2D1_Float3_Float1_Int2, >+ BuiltInName::textureProjLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H2B0B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLodOffset_0Q2B0B1C( >+ BuiltInId::textureProjLodOffset_ISampler2D1_Float3_Float1_Int2, >+ BuiltInName::textureProjLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q2B0B1C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLodOffset_0W2B0B1C( >+ BuiltInId::textureProjLodOffset_USampler2D1_Float3_Float1_Int2, >+ BuiltInName::textureProjLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W2B0B1C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLodOffset_0H3B0B1C( >+ BuiltInId::textureProjLodOffset_Sampler2D1_Float4_Float1_Int2, >+ BuiltInName::textureProjLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H3B0B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLodOffset_0Q3B0B1C( >+ BuiltInId::textureProjLodOffset_ISampler2D1_Float4_Float1_Int2, >+ BuiltInName::textureProjLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q3B0B1C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLodOffset_0W3B0B1C( >+ BuiltInId::textureProjLodOffset_USampler2D1_Float4_Float1_Int2, >+ BuiltInName::textureProjLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W3B0B1C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLodOffset_0I3B0B2C( >+ BuiltInId::textureProjLodOffset_Sampler3D1_Float4_Float1_Int3, >+ BuiltInName::textureProjLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I3B0B2C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLodOffset_0R3B0B2C( >+ BuiltInId::textureProjLodOffset_ISampler3D1_Float4_Float1_Int3, >+ BuiltInName::textureProjLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R3B0B2C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLodOffset_0X3B0B2C( >+ BuiltInId::textureProjLodOffset_USampler3D1_Float4_Float1_Int3, >+ BuiltInName::textureProjLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X3B0B2C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjLodOffset_0c3B0B1C( >+ BuiltInId::textureProjLodOffset_Sampler2DShadow1_Float4_Float1_Int2, >+ BuiltInName::textureProjLodOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c3B0B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetchOffset_0H1C0C1C( >+ BuiltInId::texelFetchOffset_Sampler2D1_Int2_Int1_Int2, >+ BuiltInName::texelFetchOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1C0C1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetchOffset_0Q1C0C1C( >+ BuiltInId::texelFetchOffset_ISampler2D1_Int2_Int1_Int2, >+ BuiltInName::texelFetchOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q1C0C1C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetchOffset_0W1C0C1C( >+ BuiltInId::texelFetchOffset_USampler2D1_Int2_Int1_Int2, >+ BuiltInName::texelFetchOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W1C0C1C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetchOffset_0I2C0C2C( >+ BuiltInId::texelFetchOffset_Sampler3D1_Int3_Int1_Int3, >+ BuiltInName::texelFetchOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I2C0C2C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetchOffset_0R2C0C2C( >+ BuiltInId::texelFetchOffset_ISampler3D1_Int3_Int1_Int3, >+ BuiltInName::texelFetchOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R2C0C2C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetchOffset_0X2C0C2C( >+ BuiltInId::texelFetchOffset_USampler3D1_Int3_Int1_Int3, >+ BuiltInName::texelFetchOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X2C0C2C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetchOffset_0K2C0C1C( >+ BuiltInId::texelFetchOffset_Sampler2DArray1_Int3_Int1_Int2, >+ BuiltInName::texelFetchOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K2C0C1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetchOffset_0T2C0C1C( >+ BuiltInId::texelFetchOffset_ISampler2DArray1_Int3_Int1_Int2, >+ BuiltInName::texelFetchOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T2C0C1C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetchOffset_0Z2C0C1C( >+ BuiltInId::texelFetchOffset_USampler2DArray1_Int3_Int1_Int2, >+ BuiltInName::texelFetchOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z2C0C1C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGradOffset_0H1B1B1B1C( >+ BuiltInId::textureGradOffset_Sampler2D1_Float2_Float2_Float2_Int2, >+ BuiltInName::textureGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B1B1B1C, >+ 5, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGradOffset_0Q1B1B1B1C( >+ BuiltInId::textureGradOffset_ISampler2D1_Float2_Float2_Float2_Int2, >+ BuiltInName::textureGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q1B1B1B1C, >+ 5, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGradOffset_0W1B1B1B1C( >+ BuiltInId::textureGradOffset_USampler2D1_Float2_Float2_Float2_Int2, >+ BuiltInName::textureGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W1B1B1B1C, >+ 5, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGradOffset_0I2B2B2B2C( >+ BuiltInId::textureGradOffset_Sampler3D1_Float3_Float3_Float3_Int3, >+ BuiltInName::textureGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I2B2B2B2C, >+ 5, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGradOffset_0R2B2B2B2C( >+ BuiltInId::textureGradOffset_ISampler3D1_Float3_Float3_Float3_Int3, >+ BuiltInName::textureGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R2B2B2B2C, >+ 5, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGradOffset_0X2B2B2B2C( >+ BuiltInId::textureGradOffset_USampler3D1_Float3_Float3_Float3_Int3, >+ BuiltInName::textureGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X2B2B2B2C, >+ 5, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGradOffset_0c2B1B1B1C( >+ BuiltInId::textureGradOffset_Sampler2DShadow1_Float3_Float2_Float2_Int2, >+ BuiltInName::textureGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c2B1B1B1C, >+ 5, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGradOffset_0K2B1B1B1C( >+ BuiltInId::textureGradOffset_Sampler2DArray1_Float3_Float2_Float2_Int2, >+ BuiltInName::textureGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K2B1B1B1C, >+ 5, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGradOffset_0T2B1B1B1C( >+ BuiltInId::textureGradOffset_ISampler2DArray1_Float3_Float2_Float2_Int2, >+ BuiltInName::textureGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T2B1B1B1C, >+ 5, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGradOffset_0Z2B1B1B1C( >+ BuiltInId::textureGradOffset_USampler2DArray1_Float3_Float2_Float2_Int2, >+ BuiltInName::textureGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z2B1B1B1C, >+ 5, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGradOffset_0e3B1B1B1C( >+ BuiltInId::textureGradOffset_Sampler2DArrayShadow1_Float4_Float2_Float2_Int2, >+ BuiltInName::textureGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0e3B1B1B1C, >+ 5, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGradOffset_0H2B1B1B1C( >+ BuiltInId::textureProjGradOffset_Sampler2D1_Float3_Float2_Float2_Int2, >+ BuiltInName::textureProjGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H2B1B1B1C, >+ 5, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGradOffset_0Q2B1B1B1C( >+ BuiltInId::textureProjGradOffset_ISampler2D1_Float3_Float2_Float2_Int2, >+ BuiltInName::textureProjGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q2B1B1B1C, >+ 5, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGradOffset_0W2B1B1B1C( >+ BuiltInId::textureProjGradOffset_USampler2D1_Float3_Float2_Float2_Int2, >+ BuiltInName::textureProjGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W2B1B1B1C, >+ 5, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGradOffset_0H3B1B1B1C( >+ BuiltInId::textureProjGradOffset_Sampler2D1_Float4_Float2_Float2_Int2, >+ BuiltInName::textureProjGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H3B1B1B1C, >+ 5, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGradOffset_0Q3B1B1B1C( >+ BuiltInId::textureProjGradOffset_ISampler2D1_Float4_Float2_Float2_Int2, >+ BuiltInName::textureProjGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q3B1B1B1C, >+ 5, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGradOffset_0W3B1B1B1C( >+ BuiltInId::textureProjGradOffset_USampler2D1_Float4_Float2_Float2_Int2, >+ BuiltInName::textureProjGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W3B1B1B1C, >+ 5, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGradOffset_0I3B2B2B2C( >+ BuiltInId::textureProjGradOffset_Sampler3D1_Float4_Float3_Float3_Int3, >+ BuiltInName::textureProjGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I3B2B2B2C, >+ 5, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGradOffset_0R3B2B2B2C( >+ BuiltInId::textureProjGradOffset_ISampler3D1_Float4_Float3_Float3_Int3, >+ BuiltInName::textureProjGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R3B2B2B2C, >+ 5, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGradOffset_0X3B2B2B2C( >+ BuiltInId::textureProjGradOffset_USampler3D1_Float4_Float3_Float3_Int3, >+ BuiltInName::textureProjGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X3B2B2B2C, >+ 5, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjGradOffset_0c3B1B1B1C( >+ BuiltInId::textureProjGradOffset_Sampler2DShadow1_Float4_Float2_Float2_Int2, >+ BuiltInName::textureProjGradOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c3B1B1B1C, >+ 5, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0H1B1C0B( >+ BuiltInId::textureOffset_Sampler2D1_Float2_Int2_Float1, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B1C0B, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0Q1B1C0B( >+ BuiltInId::textureOffset_ISampler2D1_Float2_Int2_Float1, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q1B1C0B, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0W1B1C0B( >+ BuiltInId::textureOffset_USampler2D1_Float2_Int2_Float1, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W1B1C0B, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0I2B2C0B( >+ BuiltInId::textureOffset_Sampler3D1_Float3_Int3_Float1, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I2B2C0B, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0R2B2C0B( >+ BuiltInId::textureOffset_ISampler3D1_Float3_Int3_Float1, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R2B2C0B, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0X2B2C0B( >+ BuiltInId::textureOffset_USampler3D1_Float3_Int3_Float1, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X2B2C0B, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0c2B1C0B( >+ BuiltInId::textureOffset_Sampler2DShadow1_Float3_Int2_Float1, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c2B1C0B, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0K2B1C0B( >+ BuiltInId::textureOffset_Sampler2DArray1_Float3_Int2_Float1, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K2B1C0B, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0T2B1C0B( >+ BuiltInId::textureOffset_ISampler2DArray1_Float3_Int2_Float1, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T2B1C0B, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureOffset_0Z2B1C0B( >+ BuiltInId::textureOffset_USampler2DArray1_Float3_Int2_Float1, >+ BuiltInName::textureOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z2B1C0B, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0H2B1C0B( >+ BuiltInId::textureProjOffset_Sampler2D1_Float3_Int2_Float1, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H2B1C0B, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0Q2B1C0B( >+ BuiltInId::textureProjOffset_ISampler2D1_Float3_Int2_Float1, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q2B1C0B, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0W2B1C0B( >+ BuiltInId::textureProjOffset_USampler2D1_Float3_Int2_Float1, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W2B1C0B, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0H3B1C0B( >+ BuiltInId::textureProjOffset_Sampler2D1_Float4_Int2_Float1, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H3B1C0B, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0Q3B1C0B( >+ BuiltInId::textureProjOffset_ISampler2D1_Float4_Int2_Float1, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q3B1C0B, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0W3B1C0B( >+ BuiltInId::textureProjOffset_USampler2D1_Float4_Int2_Float1, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W3B1C0B, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0I3B2C0B( >+ BuiltInId::textureProjOffset_Sampler3D1_Float4_Int3_Float1, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I3B2C0B, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0R3B2C0B( >+ BuiltInId::textureProjOffset_ISampler3D1_Float4_Int3_Float1, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R3B2C0B, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0X3B2C0B( >+ BuiltInId::textureProjOffset_USampler3D1_Float4_Int3_Float1, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X3B2C0B, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProjOffset_0c3B1C0B( >+ BuiltInId::textureProjOffset_Sampler2DShadow1_Float4_Int2_Float1, >+ BuiltInName::textureProjOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c3B1C0B, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0L1B( >+ BuiltInId::texture_SamplerExternalOES1_Float2, >+ BuiltInName::texture, >+ TExtension::OES_EGL_image_external_essl3, >+ BuiltInParameters::p0L1B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0L2B( >+ BuiltInId::textureProj_SamplerExternalOES1_Float3, >+ BuiltInName::textureProj, >+ TExtension::OES_EGL_image_external_essl3, >+ BuiltInParameters::p0L2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0L3B( >+ BuiltInId::textureProj_SamplerExternalOES1_Float4, >+ BuiltInName::textureProj, >+ TExtension::OES_EGL_image_external_essl3, >+ BuiltInParameters::p0L3B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0L0C( >+ BuiltInId::textureSize_SamplerExternalOES1_Int1, >+ BuiltInName::textureSize, >+ TExtension::OES_EGL_image_external_essl3, >+ BuiltInParameters::p0L0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0L1C0C( >+ BuiltInId::texelFetch_SamplerExternalOES1_Int2_Int1, >+ BuiltInName::texelFetch, >+ TExtension::OES_EGL_image_external_essl3, >+ BuiltInParameters::p0L1C0C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0M1B( >+ BuiltInId::texture_SamplerExternal2DY2YEXT1_Float2, >+ BuiltInName::texture, >+ TExtension::EXT_YUV_target, >+ BuiltInParameters::p0M1B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0M2B( >+ BuiltInId::textureProj_SamplerExternal2DY2YEXT1_Float3, >+ BuiltInName::textureProj, >+ TExtension::EXT_YUV_target, >+ BuiltInParameters::p0M2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0M3B( >+ BuiltInId::textureProj_SamplerExternal2DY2YEXT1_Float4, >+ BuiltInName::textureProj, >+ TExtension::EXT_YUV_target, >+ BuiltInParameters::p0M3B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_rgb_2_yuv_2B0G( >+ BuiltInId::rgb_2_yuv_Float3_YuvCscStandardEXT1, >+ BuiltInName::rgb_2_yuv, >+ TExtension::EXT_YUV_target, >+ BuiltInParameters::p2B0G, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_yuv_2_rgb_2B0G( >+ BuiltInId::yuv_2_rgb_Float3_YuvCscStandardEXT1, >+ BuiltInName::yuv_2_rgb, >+ TExtension::EXT_YUV_target, >+ BuiltInParameters::p2B0G, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureSize_0M0C( >+ BuiltInId::textureSize_SamplerExternal2DY2YEXT1_Int1, >+ BuiltInName::textureSize, >+ TExtension::EXT_YUV_target, >+ BuiltInParameters::p0M0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0M1C0C( >+ BuiltInId::texelFetch_SamplerExternal2DY2YEXT1_Int2_Int1, >+ BuiltInName::texelFetch, >+ TExtension::EXT_YUV_target, >+ BuiltInParameters::p0M1C0C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0H1B0B( >+ BuiltInId::texture_Sampler2D1_Float2_Float1, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0Q1B0B( >+ BuiltInId::texture_ISampler2D1_Float2_Float1, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q1B0B1C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0W1B0B( >+ BuiltInId::texture_USampler2D1_Float2_Float1, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W1B0B1C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0I2B0B( >+ BuiltInId::texture_Sampler3D1_Float3_Float1, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I2B0B2C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0R2B0B( >+ BuiltInId::texture_ISampler3D1_Float3_Float1, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R2B0B2C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0X2B0B( >+ BuiltInId::texture_USampler3D1_Float3_Float1, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X2B0B2C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0J2B0B( >+ BuiltInId::texture_SamplerCube1_Float3_Float1, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0J2B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0S2B0B( >+ BuiltInId::texture_ISamplerCube1_Float3_Float1, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0S2B0B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0Y2B0B( >+ BuiltInId::texture_USamplerCube1_Float3_Float1, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Y2B0B, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0K2B0B( >+ BuiltInId::texture_Sampler2DArray1_Float3_Float1, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K2B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0T2B0B( >+ BuiltInId::texture_ISampler2DArray1_Float3_Float1, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T2B0B1C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0Z2B0B( >+ BuiltInId::texture_USampler2DArray1_Float3_Float1, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z2B0B1C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0H2B0B( >+ BuiltInId::textureProj_Sampler2D1_Float3_Float1, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H2B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0Q2B0B( >+ BuiltInId::textureProj_ISampler2D1_Float3_Float1, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q2B0B1C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0W2B0B( >+ BuiltInId::textureProj_USampler2D1_Float3_Float1, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W2B0B1C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0H3B0B( >+ BuiltInId::textureProj_Sampler2D1_Float4_Float1, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H3B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0Q3B0B( >+ BuiltInId::textureProj_ISampler2D1_Float4_Float1, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q3B0B1C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0W3B0B( >+ BuiltInId::textureProj_USampler2D1_Float4_Float1, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W3B0B1C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0I3B0B( >+ BuiltInId::textureProj_Sampler3D1_Float4_Float1, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0I3B0B2C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0R3B0B( >+ BuiltInId::textureProj_ISampler3D1_Float4_Float1, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0R3B0B2C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0X3B0B( >+ BuiltInId::textureProj_USampler3D1_Float4_Float1, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0X3B0B2C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0c2B0B( >+ BuiltInId::texture_Sampler2DShadow1_Float3_Float1, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c2B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0d3B0B( >+ BuiltInId::texture_SamplerCubeShadow1_Float4_Float1, >+ BuiltInName::texture, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0d3B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0c3B0B( >+ BuiltInId::textureProj_Sampler2DShadow1_Float4_Float1, >+ BuiltInName::textureProj, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c3B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0L1B0B( >+ BuiltInId::texture_SamplerExternalOES1_Float2_Float1, >+ BuiltInName::texture, >+ TExtension::OES_EGL_image_external_essl3, >+ BuiltInParameters::p0L1B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0L2B0B( >+ BuiltInId::textureProj_SamplerExternalOES1_Float3_Float1, >+ BuiltInName::textureProj, >+ TExtension::OES_EGL_image_external_essl3, >+ BuiltInParameters::p0L2B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0L3B0B( >+ BuiltInId::textureProj_SamplerExternalOES1_Float4_Float1, >+ BuiltInName::textureProj, >+ TExtension::OES_EGL_image_external_essl3, >+ BuiltInParameters::p0L3B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texture_0M1B0B( >+ BuiltInId::texture_SamplerExternal2DY2YEXT1_Float2_Float1, >+ BuiltInName::texture, >+ TExtension::EXT_YUV_target, >+ BuiltInParameters::p0M1B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0M2B0B( >+ BuiltInId::textureProj_SamplerExternal2DY2YEXT1_Float3_Float1, >+ BuiltInName::textureProj, >+ TExtension::EXT_YUV_target, >+ BuiltInParameters::p0M2B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureProj_0M3B0B( >+ BuiltInId::textureProj_SamplerExternal2DY2YEXT1_Float4_Float1, >+ BuiltInName::textureProj, >+ TExtension::EXT_YUV_target, >+ BuiltInParameters::p0M3B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0O1C0C( >+ BuiltInId::texelFetch_Sampler2DMS1_Int2_Int1, >+ BuiltInName::texelFetch, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0O1C0C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0U1C0C( >+ BuiltInId::texelFetch_ISampler2DMS1_Int2_Int1, >+ BuiltInName::texelFetch, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0U1C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0a1C0C( >+ BuiltInId::texelFetch_USampler2DMS1_Int2_Int1, >+ BuiltInName::texelFetch, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0a1C0C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetchExt_0O1C0C( >+ BuiltInId::texelFetchExt_Sampler2DMS1_Int2_Int1, >+ BuiltInName::texelFetchExt, >+ TExtension::ANGLE_texture_multisample, >+ BuiltInParameters::p0O1C0C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetchExt_0U1C0C( >+ BuiltInId::texelFetchExt_ISampler2DMS1_Int2_Int1, >+ BuiltInName::texelFetchExt, >+ TExtension::ANGLE_texture_multisample, >+ BuiltInParameters::p0U1C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetchExt_0a1C0C( >+ BuiltInId::texelFetchExt_USampler2DMS1_Int2_Int1, >+ BuiltInName::texelFetchExt, >+ TExtension::ANGLE_texture_multisample, >+ BuiltInParameters::p0a1C0C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0P2C0C( >+ BuiltInId::texelFetch_Sampler2DMSArray1_Int3_Int1, >+ BuiltInName::texelFetch, >+ TExtension::OES_texture_storage_multisample_2d_array, >+ BuiltInParameters::p0P2C0C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0V2C0C( >+ BuiltInId::texelFetch_ISampler2DMSArray1_Int3_Int1, >+ BuiltInName::texelFetch, >+ TExtension::OES_texture_storage_multisample_2d_array, >+ BuiltInParameters::p0V2C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_texelFetch_0b2C0C( >+ BuiltInId::texelFetch_USampler2DMSArray1_Int3_Int1, >+ BuiltInName::texelFetch, >+ TExtension::OES_texture_storage_multisample_2d_array, >+ BuiltInParameters::p0b2C0C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0H1B( >+ BuiltInId::textureGather_Sampler2D1_Float2, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B1B1B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0Q1B( >+ BuiltInId::textureGather_ISampler2D1_Float2, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q1B1B1B1C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0W1B( >+ BuiltInId::textureGather_USampler2D1_Float2, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W1B1C0C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0H1B0C( >+ BuiltInId::textureGather_Sampler2D1_Float2_Int1, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B0C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0Q1B0C( >+ BuiltInId::textureGather_ISampler2D1_Float2_Int1, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q1B0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0W1B0C( >+ BuiltInId::textureGather_USampler2D1_Float2_Int1, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W1B0C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0K2B( >+ BuiltInId::textureGather_Sampler2DArray1_Float3, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K2B0B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0T2B( >+ BuiltInId::textureGather_ISampler2DArray1_Float3, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T2B1B1B1C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0Z2B( >+ BuiltInId::textureGather_USampler2DArray1_Float3, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z2B1B1B1C, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0K2B0C( >+ BuiltInId::textureGather_Sampler2DArray1_Float3_Int1, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K2B0C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0T2B0C( >+ BuiltInId::textureGather_ISampler2DArray1_Float3_Int1, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T2B0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0Z2B0C( >+ BuiltInId::textureGather_USampler2DArray1_Float3_Int1, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z2B0C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0J2B( >+ BuiltInId::textureGather_SamplerCube1_Float3, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0J2B2B2B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0S2B( >+ BuiltInId::textureGather_ISamplerCube1_Float3, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0S2B0B, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0Y2B( >+ BuiltInId::textureGather_USamplerCube1_Float3, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Y2B0B, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0J2B0C( >+ BuiltInId::textureGather_SamplerCube1_Float3_Int1, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0J2B0C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0S2B0C( >+ BuiltInId::textureGather_ISamplerCube1_Float3_Int1, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0S2B0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0Y2B0C( >+ BuiltInId::textureGather_USamplerCube1_Float3_Int1, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Y2B0C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0c1B( >+ BuiltInId::textureGather_Sampler2DShadow1_Float2, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c1B0B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0c1B0B( >+ BuiltInId::textureGather_Sampler2DShadow1_Float2_Float1, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c1B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0e2B( >+ BuiltInId::textureGather_Sampler2DArrayShadow1_Float3, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0e2B0B1C, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0e2B0B( >+ BuiltInId::textureGather_Sampler2DArrayShadow1_Float3_Float1, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0e2B0B1C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0d2B( >+ BuiltInId::textureGather_SamplerCubeShadow1_Float3, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0d2B0B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGather_0d2B0B( >+ BuiltInId::textureGather_SamplerCubeShadow1_Float3_Float1, >+ BuiltInName::textureGather, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0d2B0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGatherOffset_0H1B1C( >+ BuiltInId::textureGatherOffset_Sampler2D1_Float2_Int2, >+ BuiltInName::textureGatherOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B1C0B, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGatherOffset_0Q1B1C( >+ BuiltInId::textureGatherOffset_ISampler2D1_Float2_Int2, >+ BuiltInName::textureGatherOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q1B1C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGatherOffset_0W1B1C( >+ BuiltInId::textureGatherOffset_USampler2D1_Float2_Int2, >+ BuiltInName::textureGatherOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W1B1C0C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGatherOffset_0H1B1C0C( >+ BuiltInId::textureGatherOffset_Sampler2D1_Float2_Int2_Int1, >+ BuiltInName::textureGatherOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0H1B1C0C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGatherOffset_0Q1B1C0C( >+ BuiltInId::textureGatherOffset_ISampler2D1_Float2_Int2_Int1, >+ BuiltInName::textureGatherOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Q1B1C0C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGatherOffset_0W1B1C0C( >+ BuiltInId::textureGatherOffset_USampler2D1_Float2_Int2_Int1, >+ BuiltInName::textureGatherOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0W1B1C0C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGatherOffset_0K2B1C( >+ BuiltInId::textureGatherOffset_Sampler2DArray1_Float3_Int2, >+ BuiltInName::textureGatherOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K2B1C0C, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGatherOffset_0T2B1C( >+ BuiltInId::textureGatherOffset_ISampler2DArray1_Float3_Int2, >+ BuiltInName::textureGatherOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T2B1C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGatherOffset_0Z2B1C( >+ BuiltInId::textureGatherOffset_USampler2DArray1_Float3_Int2, >+ BuiltInName::textureGatherOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z2B1C0C, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGatherOffset_0K2B1C0C( >+ BuiltInId::textureGatherOffset_Sampler2DArray1_Float3_Int2_Int1, >+ BuiltInName::textureGatherOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0K2B1C0C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGatherOffset_0T2B1C0C( >+ BuiltInId::textureGatherOffset_ISampler2DArray1_Float3_Int2_Int1, >+ BuiltInName::textureGatherOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0T2B1C0C, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGatherOffset_0Z2B1C0C( >+ BuiltInId::textureGatherOffset_USampler2DArray1_Float3_Int2_Int1, >+ BuiltInName::textureGatherOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0Z2B1C0C, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGatherOffset_0c1B0B1C( >+ BuiltInId::textureGatherOffset_Sampler2DShadow1_Float2_Float1_Int2, >+ BuiltInName::textureGatherOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0c1B0B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_textureGatherOffset_0e2B0B1C( >+ BuiltInId::textureGatherOffset_Sampler2DArrayShadow1_Float3_Float1_Int2, >+ BuiltInName::textureGatherOffset, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0e2B0B1C, >+ 4, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_dFdx_0B( >+ BuiltInId::dFdx_Float1, >+ BuiltInName::dFdx, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDFdx, >+ false); >+constexpr const TFunction kFunction_dFdx_1B( >+ BuiltInId::dFdx_Float2, >+ BuiltInName::dFdx, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpDFdx, >+ false); >+constexpr const TFunction kFunction_dFdx_2B( >+ BuiltInId::dFdx_Float3, >+ BuiltInName::dFdx, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpDFdx, >+ false); >+constexpr const TFunction kFunction_dFdx_3B( >+ BuiltInId::dFdx_Float4, >+ BuiltInName::dFdx, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpDFdx, >+ false); >+constexpr const TFunction kFunction_dFdy_0B( >+ BuiltInId::dFdy_Float1, >+ BuiltInName::dFdy, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpDFdy, >+ false); >+constexpr const TFunction kFunction_dFdy_1B( >+ BuiltInId::dFdy_Float2, >+ BuiltInName::dFdy, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpDFdy, >+ false); >+constexpr const TFunction kFunction_dFdy_2B( >+ BuiltInId::dFdy_Float3, >+ BuiltInName::dFdy, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpDFdy, >+ false); >+constexpr const TFunction kFunction_dFdy_3B( >+ BuiltInId::dFdy_Float4, >+ BuiltInName::dFdy, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpDFdy, >+ false); >+constexpr const TFunction kFunction_fwidth_0B( >+ BuiltInId::fwidth_Float1, >+ BuiltInName::fwidth, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0B0C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpFwidth, >+ false); >+constexpr const TFunction kFunction_fwidth_1B( >+ BuiltInId::fwidth_Float2, >+ BuiltInName::fwidth, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p1B1B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpFwidth, >+ false); >+constexpr const TFunction kFunction_fwidth_2B( >+ BuiltInId::fwidth_Float3, >+ BuiltInName::fwidth, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p2B_o_2C, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpFwidth, >+ false); >+constexpr const TFunction kFunction_fwidth_3B( >+ BuiltInId::fwidth_Float4, >+ BuiltInName::fwidth, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p3B0B0B, >+ 1, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpFwidth, >+ false); >+constexpr const TFunction kFunction_atomicCounter_0F( >+ BuiltInId::atomicCounter_AtomicCounter1, >+ BuiltInName::atomicCounter, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0F, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_atomicCounterIncrement_0F( >+ BuiltInId::atomicCounterIncrement_AtomicCounter1, >+ BuiltInName::atomicCounterIncrement, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0F, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_atomicCounterDecrement_0F( >+ BuiltInId::atomicCounterDecrement_AtomicCounter1, >+ BuiltInName::atomicCounterDecrement, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0F, >+ 1, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_atomicAdd_0D0D( >+ BuiltInId::atomicAdd_UInt1_UInt1, >+ BuiltInName::atomicAdd, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0D0D0D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicAdd, >+ false); >+constexpr const TFunction kFunction_atomicAdd_0C0C( >+ BuiltInId::atomicAdd_Int1_Int1, >+ BuiltInName::atomicAdd, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicAdd, >+ false); >+constexpr const TFunction kFunction_atomicMin_0D0D( >+ BuiltInId::atomicMin_UInt1_UInt1, >+ BuiltInName::atomicMin, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0D0D0D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicMin, >+ false); >+constexpr const TFunction kFunction_atomicMin_0C0C( >+ BuiltInId::atomicMin_Int1_Int1, >+ BuiltInName::atomicMin, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicMin, >+ false); >+constexpr const TFunction kFunction_atomicMax_0D0D( >+ BuiltInId::atomicMax_UInt1_UInt1, >+ BuiltInName::atomicMax, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0D0D0D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicMax, >+ false); >+constexpr const TFunction kFunction_atomicMax_0C0C( >+ BuiltInId::atomicMax_Int1_Int1, >+ BuiltInName::atomicMax, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicMax, >+ false); >+constexpr const TFunction kFunction_atomicAnd_0D0D( >+ BuiltInId::atomicAnd_UInt1_UInt1, >+ BuiltInName::atomicAnd, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0D0D0D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicAnd, >+ false); >+constexpr const TFunction kFunction_atomicAnd_0C0C( >+ BuiltInId::atomicAnd_Int1_Int1, >+ BuiltInName::atomicAnd, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicAnd, >+ false); >+constexpr const TFunction kFunction_atomicOr_0D0D( >+ BuiltInId::atomicOr_UInt1_UInt1, >+ BuiltInName::atomicOr, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0D0D0D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicOr, >+ false); >+constexpr const TFunction kFunction_atomicOr_0C0C( >+ BuiltInId::atomicOr_Int1_Int1, >+ BuiltInName::atomicOr, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicOr, >+ false); >+constexpr const TFunction kFunction_atomicXor_0D0D( >+ BuiltInId::atomicXor_UInt1_UInt1, >+ BuiltInName::atomicXor, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0D0D0D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicXor, >+ false); >+constexpr const TFunction kFunction_atomicXor_0C0C( >+ BuiltInId::atomicXor_Int1_Int1, >+ BuiltInName::atomicXor, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicXor, >+ false); >+constexpr const TFunction kFunction_atomicExchange_0D0D( >+ BuiltInId::atomicExchange_UInt1_UInt1, >+ BuiltInName::atomicExchange, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0D0D0D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicExchange, >+ false); >+constexpr const TFunction kFunction_atomicExchange_0C0C( >+ BuiltInId::atomicExchange_Int1_Int1, >+ BuiltInName::atomicExchange, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0C0C0C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicExchange, >+ false); >+constexpr const TFunction kFunction_atomicCompSwap_0D0D0D( >+ BuiltInId::atomicCompSwap_UInt1_UInt1_UInt1, >+ BuiltInName::atomicCompSwap, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0D0D0D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicCompSwap, >+ false); >+constexpr const TFunction kFunction_atomicCompSwap_0C0C0C( >+ BuiltInId::atomicCompSwap_Int1_Int1_Int1, >+ BuiltInName::atomicCompSwap, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p_io_0C0C0C, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpAtomicCompSwap, >+ false); >+constexpr const TFunction kFunction_imageSize_0f( >+ BuiltInId::imageSize_Image2D1, >+ BuiltInName::imageSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0f1C3B, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageSize_0g( >+ BuiltInId::imageSize_IImage2D1, >+ BuiltInName::imageSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0g1C3C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageSize_0h( >+ BuiltInId::imageSize_UImage2D1, >+ BuiltInName::imageSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0h1C3D, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageSize_0i( >+ BuiltInId::imageSize_Image3D1, >+ BuiltInName::imageSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0i2C3B, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageSize_0j( >+ BuiltInId::imageSize_IImage3D1, >+ BuiltInName::imageSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0j2C3C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageSize_0k( >+ BuiltInId::imageSize_UImage3D1, >+ BuiltInName::imageSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0k2C3D, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageSize_0l( >+ BuiltInId::imageSize_Image2DArray1, >+ BuiltInName::imageSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0l2C3B, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageSize_0m( >+ BuiltInId::imageSize_IImage2DArray1, >+ BuiltInName::imageSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0m2C3C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageSize_0n( >+ BuiltInId::imageSize_UImage2DArray1, >+ BuiltInName::imageSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0n2C3D, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageSize_0o( >+ BuiltInId::imageSize_ImageCube1, >+ BuiltInName::imageSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0o2C3B, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageSize_0p( >+ BuiltInId::imageSize_IImageCube1, >+ BuiltInName::imageSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0p2C3C, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageSize_0q( >+ BuiltInId::imageSize_UImageCube1, >+ BuiltInName::imageSize, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0q2C3D, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageLoad_0f1C( >+ BuiltInId::imageLoad_Image2D1_Int2, >+ BuiltInName::imageLoad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0f1C3B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageLoad_0g1C( >+ BuiltInId::imageLoad_IImage2D1_Int2, >+ BuiltInName::imageLoad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0g1C3C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageLoad_0h1C( >+ BuiltInId::imageLoad_UImage2D1_Int2, >+ BuiltInName::imageLoad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0h1C3D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageLoad_0i2C( >+ BuiltInId::imageLoad_Image3D1_Int3, >+ BuiltInName::imageLoad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0i2C3B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageLoad_0j2C( >+ BuiltInId::imageLoad_IImage3D1_Int3, >+ BuiltInName::imageLoad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0j2C3C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageLoad_0k2C( >+ BuiltInId::imageLoad_UImage3D1_Int3, >+ BuiltInName::imageLoad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0k2C3D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageLoad_0l2C( >+ BuiltInId::imageLoad_Image2DArray1_Int3, >+ BuiltInName::imageLoad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0l2C3B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageLoad_0m2C( >+ BuiltInId::imageLoad_IImage2DArray1_Int3, >+ BuiltInName::imageLoad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0m2C3C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageLoad_0n2C( >+ BuiltInId::imageLoad_UImage2DArray1_Int3, >+ BuiltInName::imageLoad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0n2C3D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageLoad_0o2C( >+ BuiltInId::imageLoad_ImageCube1_Int3, >+ BuiltInName::imageLoad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0o2C3B, >+ 2, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageLoad_0p2C( >+ BuiltInId::imageLoad_IImageCube1_Int3, >+ BuiltInName::imageLoad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0p2C3C, >+ 2, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageLoad_0q2C( >+ BuiltInId::imageLoad_UImageCube1_Int3, >+ BuiltInName::imageLoad, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0q2C3D, >+ 2, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageStore_0f1C3B( >+ BuiltInId::imageStore_Image2D1_Int2_Float4, >+ BuiltInName::imageStore, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0f1C3B, >+ 3, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageStore_0g1C3C( >+ BuiltInId::imageStore_IImage2D1_Int2_Int4, >+ BuiltInName::imageStore, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0g1C3C, >+ 3, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageStore_0h1C3D( >+ BuiltInId::imageStore_UImage2D1_Int2_UInt4, >+ BuiltInName::imageStore, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0h1C3D, >+ 3, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageStore_0i2C3B( >+ BuiltInId::imageStore_Image3D1_Int3_Float4, >+ BuiltInName::imageStore, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0i2C3B, >+ 3, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageStore_0j2C3C( >+ BuiltInId::imageStore_IImage3D1_Int3_Int4, >+ BuiltInName::imageStore, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0j2C3C, >+ 3, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageStore_0k2C3D( >+ BuiltInId::imageStore_UImage3D1_Int3_UInt4, >+ BuiltInName::imageStore, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0k2C3D, >+ 3, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageStore_0l2C3B( >+ BuiltInId::imageStore_Image2DArray1_Int3_Float4, >+ BuiltInName::imageStore, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0l2C3B, >+ 3, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageStore_0m2C3C( >+ BuiltInId::imageStore_IImage2DArray1_Int3_Int4, >+ BuiltInName::imageStore, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0m2C3C, >+ 3, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageStore_0n2C3D( >+ BuiltInId::imageStore_UImage2DArray1_Int3_UInt4, >+ BuiltInName::imageStore, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0n2C3D, >+ 3, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageStore_0o2C3B( >+ BuiltInId::imageStore_ImageCube1_Int3_Float4, >+ BuiltInName::imageStore, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0o2C3B, >+ 3, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageStore_0p2C3C( >+ BuiltInId::imageStore_IImageCube1_Int3_Int4, >+ BuiltInName::imageStore, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0p2C3C, >+ 3, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_imageStore_0q2C3D( >+ BuiltInId::imageStore_UImageCube1_Int3_UInt4, >+ BuiltInName::imageStore, >+ TExtension::UNDEFINED, >+ BuiltInParameters::p0q2C3D, >+ 3, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpCallBuiltInFunction, >+ false); >+constexpr const TFunction kFunction_memoryBarrier_( >+ BuiltInId::memoryBarrier, >+ BuiltInName::memoryBarrier, >+ TExtension::UNDEFINED, >+ BuiltInParameters::empty, >+ 0, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpMemoryBarrier, >+ false); >+constexpr const TFunction kFunction_memoryBarrierAtomicCounter_( >+ BuiltInId::memoryBarrierAtomicCounter, >+ BuiltInName::memoryBarrierAtomicCounter, >+ TExtension::UNDEFINED, >+ BuiltInParameters::empty, >+ 0, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpMemoryBarrierAtomicCounter, >+ false); >+constexpr const TFunction kFunction_memoryBarrierBuffer_( >+ BuiltInId::memoryBarrierBuffer, >+ BuiltInName::memoryBarrierBuffer, >+ TExtension::UNDEFINED, >+ BuiltInParameters::empty, >+ 0, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpMemoryBarrierBuffer, >+ false); >+constexpr const TFunction kFunction_memoryBarrierImage_( >+ BuiltInId::memoryBarrierImage, >+ BuiltInName::memoryBarrierImage, >+ TExtension::UNDEFINED, >+ BuiltInParameters::empty, >+ 0, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpMemoryBarrierImage, >+ false); >+constexpr const TFunction kFunction_barrier_( >+ BuiltInId::barrier, >+ BuiltInName::barrier, >+ TExtension::UNDEFINED, >+ BuiltInParameters::empty, >+ 0, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpBarrier, >+ false); >+constexpr const TFunction kFunction_memoryBarrierShared_( >+ BuiltInId::memoryBarrierShared, >+ BuiltInName::memoryBarrierShared, >+ TExtension::UNDEFINED, >+ BuiltInParameters::empty, >+ 0, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpMemoryBarrierShared, >+ false); >+constexpr const TFunction kFunction_groupMemoryBarrier_( >+ BuiltInId::groupMemoryBarrier, >+ BuiltInName::groupMemoryBarrier, >+ TExtension::UNDEFINED, >+ BuiltInParameters::empty, >+ 0, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpGroupMemoryBarrier, >+ false); >+constexpr const TFunction kFunction_EmitVertex_( >+ BuiltInId::EmitVertex, >+ BuiltInName::EmitVertex, >+ TExtension::EXT_geometry_shader, >+ BuiltInParameters::empty, >+ 0, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpEmitVertex, >+ false); >+constexpr const TFunction kFunction_EndPrimitive_( >+ BuiltInId::EndPrimitive, >+ BuiltInName::EndPrimitive, >+ TExtension::EXT_geometry_shader, >+ BuiltInParameters::empty, >+ 0, >+ StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpEndPrimitive, >+ false); >+ >+} // namespace BuiltInFunction >+ >+void TSymbolTable::initializeBuiltInVariables(sh::GLenum shaderType, >+ ShShaderSpec spec, >+ const ShBuiltInResources &resources) >+{ >+ const TSourceLoc zeroSourceLoc = {0, 0, 0, 0}; >+ TFieldList *fields_gl_DepthRangeParameters = new TFieldList(); >+ fields_gl_DepthRangeParameters->push_back( >+ new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1, 1), BuiltInName::near, zeroSourceLoc, >+ SymbolType::BuiltIn)); >+ fields_gl_DepthRangeParameters->push_back( >+ new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1, 1), BuiltInName::far, zeroSourceLoc, >+ SymbolType::BuiltIn)); >+ fields_gl_DepthRangeParameters->push_back( >+ new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1, 1), BuiltInName::diff, zeroSourceLoc, >+ SymbolType::BuiltIn)); >+ TStructure *gl_DepthRangeParameters = >+ new TStructure(BuiltInId::gl_DepthRangeParameters, BuiltInName::gl_DepthRangeParameters, >+ TExtension::UNDEFINED, fields_gl_DepthRangeParameters); >+ mVar_gl_DepthRangeParameters = gl_DepthRangeParameters; >+ TType *type_gl_DepthRange = new TType(gl_DepthRangeParameters, false); >+ type_gl_DepthRange->setQualifier(EvqUniform); >+ type_gl_DepthRange->realize(); >+ mVar_gl_DepthRange = >+ new TVariable(BuiltInId::gl_DepthRange, BuiltInName::gl_DepthRange, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, type_gl_DepthRange); >+ mVar_gl_MaxVertexAttribs = new TVariable( >+ BuiltInId::gl_MaxVertexAttribs, BuiltInName::gl_MaxVertexAttribs, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxVertexAttribs); >+ mVar_gl_MaxVertexAttribs->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxVertexUniformVectors = >+ new TVariable(BuiltInId::gl_MaxVertexUniformVectors, >+ BuiltInName::gl_MaxVertexUniformVectors, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxVertexUniformVectors); >+ mVar_gl_MaxVertexUniformVectors->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxVertexTextureImageUnits = >+ new TVariable(BuiltInId::gl_MaxVertexTextureImageUnits, >+ BuiltInName::gl_MaxVertexTextureImageUnits, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxVertexTextureImageUnits); >+ mVar_gl_MaxVertexTextureImageUnits->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxCombinedTextureImageUnits = >+ new TVariable(BuiltInId::gl_MaxCombinedTextureImageUnits, >+ BuiltInName::gl_MaxCombinedTextureImageUnits, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxCombinedTextureImageUnits); >+ mVar_gl_MaxCombinedTextureImageUnits->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxTextureImageUnits = >+ new TVariable(BuiltInId::gl_MaxTextureImageUnits, BuiltInName::gl_MaxTextureImageUnits, >+ SymbolType::BuiltIn, TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxTextureImageUnits); >+ mVar_gl_MaxTextureImageUnits->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxFragmentUniformVectors = >+ new TVariable(BuiltInId::gl_MaxFragmentUniformVectors, >+ BuiltInName::gl_MaxFragmentUniformVectors, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxFragmentUniformVectors); >+ mVar_gl_MaxFragmentUniformVectors->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxVaryingVectors = new TVariable( >+ BuiltInId::gl_MaxVaryingVectors, BuiltInName::gl_MaxVaryingVectors, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxVaryingVectors); >+ mVar_gl_MaxVaryingVectors->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxDrawBuffers = new TVariable( >+ BuiltInId::gl_MaxDrawBuffers, BuiltInName::gl_MaxDrawBuffers, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxDrawBuffers); >+ mVar_gl_MaxDrawBuffers->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxDualSourceDrawBuffersEXT = new TVariable( >+ BuiltInId::gl_MaxDualSourceDrawBuffersEXT, BuiltInName::gl_MaxDualSourceDrawBuffersEXT, >+ SymbolType::BuiltIn, TExtension::EXT_blend_func_extended, >+ StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxDualSourceDrawBuffers); >+ mVar_gl_MaxDualSourceDrawBuffersEXT->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxVertexOutputVectors = >+ new TVariable(BuiltInId::gl_MaxVertexOutputVectors, BuiltInName::gl_MaxVertexOutputVectors, >+ SymbolType::BuiltIn, TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxVertexOutputVectors); >+ mVar_gl_MaxVertexOutputVectors->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxFragmentInputVectors = >+ new TVariable(BuiltInId::gl_MaxFragmentInputVectors, >+ BuiltInName::gl_MaxFragmentInputVectors, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxFragmentInputVectors); >+ mVar_gl_MaxFragmentInputVectors->shareConstPointer(unionArray); >+ } >+ mVar_gl_MinProgramTexelOffset = >+ new TVariable(BuiltInId::gl_MinProgramTexelOffset, BuiltInName::gl_MinProgramTexelOffset, >+ SymbolType::BuiltIn, TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MinProgramTexelOffset); >+ mVar_gl_MinProgramTexelOffset->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxProgramTexelOffset = >+ new TVariable(BuiltInId::gl_MaxProgramTexelOffset, BuiltInName::gl_MaxProgramTexelOffset, >+ SymbolType::BuiltIn, TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxProgramTexelOffset); >+ mVar_gl_MaxProgramTexelOffset->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxImageUnits = new TVariable( >+ BuiltInId::gl_MaxImageUnits, BuiltInName::gl_MaxImageUnits, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxImageUnits); >+ mVar_gl_MaxImageUnits->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxVertexImageUniforms = >+ new TVariable(BuiltInId::gl_MaxVertexImageUniforms, BuiltInName::gl_MaxVertexImageUniforms, >+ SymbolType::BuiltIn, TExtension::UNDEFINED, >+ StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxVertexImageUniforms); >+ mVar_gl_MaxVertexImageUniforms->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxFragmentImageUniforms = >+ new TVariable(BuiltInId::gl_MaxFragmentImageUniforms, >+ BuiltInName::gl_MaxFragmentImageUniforms, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxFragmentImageUniforms); >+ mVar_gl_MaxFragmentImageUniforms->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxComputeImageUniforms = >+ new TVariable(BuiltInId::gl_MaxComputeImageUniforms, >+ BuiltInName::gl_MaxComputeImageUniforms, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxComputeImageUniforms); >+ mVar_gl_MaxComputeImageUniforms->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxCombinedImageUniforms = >+ new TVariable(BuiltInId::gl_MaxCombinedImageUniforms, >+ BuiltInName::gl_MaxCombinedImageUniforms, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxCombinedImageUniforms); >+ mVar_gl_MaxCombinedImageUniforms->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxCombinedShaderOutputResources = >+ new TVariable(BuiltInId::gl_MaxCombinedShaderOutputResources, >+ BuiltInName::gl_MaxCombinedShaderOutputResources, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxCombinedShaderOutputResources); >+ mVar_gl_MaxCombinedShaderOutputResources->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxComputeWorkGroupCount = >+ new TVariable(BuiltInId::gl_MaxComputeWorkGroupCount, >+ BuiltInName::gl_MaxComputeWorkGroupCount, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpHigh, EvqConst, 3, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[3]; >+ for (size_t index = 0u; index < 3; ++index) >+ { >+ unionArray[index].setIConst(resources.MaxComputeWorkGroupCount[index]); >+ } >+ mVar_gl_MaxComputeWorkGroupCount->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxComputeWorkGroupSize = >+ new TVariable(BuiltInId::gl_MaxComputeWorkGroupSize, >+ BuiltInName::gl_MaxComputeWorkGroupSize, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpHigh, EvqConst, 3, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[3]; >+ for (size_t index = 0u; index < 3; ++index) >+ { >+ unionArray[index].setIConst(resources.MaxComputeWorkGroupSize[index]); >+ } >+ mVar_gl_MaxComputeWorkGroupSize->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxComputeUniformComponents = >+ new TVariable(BuiltInId::gl_MaxComputeUniformComponents, >+ BuiltInName::gl_MaxComputeUniformComponents, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxComputeUniformComponents); >+ mVar_gl_MaxComputeUniformComponents->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxComputeTextureImageUnits = >+ new TVariable(BuiltInId::gl_MaxComputeTextureImageUnits, >+ BuiltInName::gl_MaxComputeTextureImageUnits, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxComputeTextureImageUnits); >+ mVar_gl_MaxComputeTextureImageUnits->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxComputeAtomicCounters = >+ new TVariable(BuiltInId::gl_MaxComputeAtomicCounters, >+ BuiltInName::gl_MaxComputeAtomicCounters, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxComputeAtomicCounters); >+ mVar_gl_MaxComputeAtomicCounters->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxComputeAtomicCounterBuffers = >+ new TVariable(BuiltInId::gl_MaxComputeAtomicCounterBuffers, >+ BuiltInName::gl_MaxComputeAtomicCounterBuffers, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxComputeAtomicCounterBuffers); >+ mVar_gl_MaxComputeAtomicCounterBuffers->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxVertexAtomicCounters = >+ new TVariable(BuiltInId::gl_MaxVertexAtomicCounters, >+ BuiltInName::gl_MaxVertexAtomicCounters, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxVertexAtomicCounters); >+ mVar_gl_MaxVertexAtomicCounters->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxFragmentAtomicCounters = >+ new TVariable(BuiltInId::gl_MaxFragmentAtomicCounters, >+ BuiltInName::gl_MaxFragmentAtomicCounters, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxFragmentAtomicCounters); >+ mVar_gl_MaxFragmentAtomicCounters->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxCombinedAtomicCounters = >+ new TVariable(BuiltInId::gl_MaxCombinedAtomicCounters, >+ BuiltInName::gl_MaxCombinedAtomicCounters, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxCombinedAtomicCounters); >+ mVar_gl_MaxCombinedAtomicCounters->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxAtomicCounterBindings = >+ new TVariable(BuiltInId::gl_MaxAtomicCounterBindings, >+ BuiltInName::gl_MaxAtomicCounterBindings, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxAtomicCounterBindings); >+ mVar_gl_MaxAtomicCounterBindings->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxVertexAtomicCounterBuffers = >+ new TVariable(BuiltInId::gl_MaxVertexAtomicCounterBuffers, >+ BuiltInName::gl_MaxVertexAtomicCounterBuffers, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxVertexAtomicCounterBuffers); >+ mVar_gl_MaxVertexAtomicCounterBuffers->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxFragmentAtomicCounterBuffers = >+ new TVariable(BuiltInId::gl_MaxFragmentAtomicCounterBuffers, >+ BuiltInName::gl_MaxFragmentAtomicCounterBuffers, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxFragmentAtomicCounterBuffers); >+ mVar_gl_MaxFragmentAtomicCounterBuffers->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxCombinedAtomicCounterBuffers = >+ new TVariable(BuiltInId::gl_MaxCombinedAtomicCounterBuffers, >+ BuiltInName::gl_MaxCombinedAtomicCounterBuffers, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxCombinedAtomicCounterBuffers); >+ mVar_gl_MaxCombinedAtomicCounterBuffers->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxAtomicCounterBufferSize = >+ new TVariable(BuiltInId::gl_MaxAtomicCounterBufferSize, >+ BuiltInName::gl_MaxAtomicCounterBufferSize, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxAtomicCounterBufferSize); >+ mVar_gl_MaxAtomicCounterBufferSize->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxGeometryInputComponents = new TVariable( >+ BuiltInId::gl_MaxGeometryInputComponents, BuiltInName::gl_MaxGeometryInputComponents, >+ SymbolType::BuiltIn, TExtension::EXT_geometry_shader, >+ StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxGeometryInputComponents); >+ mVar_gl_MaxGeometryInputComponents->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxGeometryOutputComponents = new TVariable( >+ BuiltInId::gl_MaxGeometryOutputComponents, BuiltInName::gl_MaxGeometryOutputComponents, >+ SymbolType::BuiltIn, TExtension::EXT_geometry_shader, >+ StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxGeometryOutputComponents); >+ mVar_gl_MaxGeometryOutputComponents->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxGeometryImageUniforms = new TVariable( >+ BuiltInId::gl_MaxGeometryImageUniforms, BuiltInName::gl_MaxGeometryImageUniforms, >+ SymbolType::BuiltIn, TExtension::EXT_geometry_shader, >+ StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxGeometryImageUniforms); >+ mVar_gl_MaxGeometryImageUniforms->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxGeometryTextureImageUnits = new TVariable( >+ BuiltInId::gl_MaxGeometryTextureImageUnits, BuiltInName::gl_MaxGeometryTextureImageUnits, >+ SymbolType::BuiltIn, TExtension::EXT_geometry_shader, >+ StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxGeometryTextureImageUnits); >+ mVar_gl_MaxGeometryTextureImageUnits->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxGeometryOutputVertices = new TVariable( >+ BuiltInId::gl_MaxGeometryOutputVertices, BuiltInName::gl_MaxGeometryOutputVertices, >+ SymbolType::BuiltIn, TExtension::EXT_geometry_shader, >+ StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxGeometryOutputVertices); >+ mVar_gl_MaxGeometryOutputVertices->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxGeometryTotalOutputComponents = new TVariable( >+ BuiltInId::gl_MaxGeometryTotalOutputComponents, >+ BuiltInName::gl_MaxGeometryTotalOutputComponents, SymbolType::BuiltIn, >+ TExtension::EXT_geometry_shader, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxGeometryTotalOutputComponents); >+ mVar_gl_MaxGeometryTotalOutputComponents->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxGeometryUniformComponents = new TVariable( >+ BuiltInId::gl_MaxGeometryUniformComponents, BuiltInName::gl_MaxGeometryUniformComponents, >+ SymbolType::BuiltIn, TExtension::EXT_geometry_shader, >+ StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxGeometryUniformComponents); >+ mVar_gl_MaxGeometryUniformComponents->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxGeometryAtomicCounters = new TVariable( >+ BuiltInId::gl_MaxGeometryAtomicCounters, BuiltInName::gl_MaxGeometryAtomicCounters, >+ SymbolType::BuiltIn, TExtension::EXT_geometry_shader, >+ StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxGeometryAtomicCounters); >+ mVar_gl_MaxGeometryAtomicCounters->shareConstPointer(unionArray); >+ } >+ mVar_gl_MaxGeometryAtomicCounterBuffers = new TVariable( >+ BuiltInId::gl_MaxGeometryAtomicCounterBuffers, >+ BuiltInName::gl_MaxGeometryAtomicCounterBuffers, SymbolType::BuiltIn, >+ TExtension::EXT_geometry_shader, StaticType::Get<EbtInt, EbpMedium, EvqConst, 1, 1>()); >+ { >+ TConstantUnion *unionArray = new TConstantUnion[1]; >+ unionArray[0].setIConst(resources.MaxGeometryAtomicCounterBuffers); >+ mVar_gl_MaxGeometryAtomicCounterBuffers->shareConstPointer(unionArray); >+ } >+ if (shaderType == GL_FRAGMENT_SHADER) >+ { >+ TType *type_gl_FragData = new TType(EbtFloat, EbpMedium, EvqFragData, 4); >+ if (spec != SH_WEBGL2_SPEC && spec != SH_WEBGL3_SPEC) >+ { >+ type_gl_FragData->makeArray(resources.MaxDrawBuffers); >+ } >+ else >+ { >+ type_gl_FragData->makeArray(1u); >+ } >+ type_gl_FragData->realize(); >+ mVar_gl_FragData = >+ new TVariable(BuiltInId::gl_FragData, BuiltInName::gl_FragData, SymbolType::BuiltIn, >+ TExtension::UNDEFINED, type_gl_FragData); >+ } >+ if ((shaderType == GL_FRAGMENT_SHADER) && (mResources.EXT_blend_func_extended)) >+ { >+ TType *type_gl_SecondaryFragDataEXT = >+ new TType(EbtFloat, EbpMedium, EvqSecondaryFragDataEXT, 4, 1); >+ type_gl_SecondaryFragDataEXT->makeArray(resources.MaxDualSourceDrawBuffers); >+ type_gl_SecondaryFragDataEXT->realize(); >+ mVar_gl_SecondaryFragDataEXT = new TVariable( >+ BuiltInId::gl_SecondaryFragDataEXT, BuiltInName::gl_SecondaryFragDataEXT, >+ SymbolType::BuiltIn, TExtension::EXT_blend_func_extended, type_gl_SecondaryFragDataEXT); >+ } >+ if ((shaderType == GL_FRAGMENT_SHADER) && (mResources.EXT_frag_depth)) >+ { >+ TType *type_gl_FragDepthEXT = new TType( >+ EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium, EvqFragDepthEXT, 1); >+ type_gl_FragDepthEXT->realize(); >+ mVar_gl_FragDepthEXT = >+ new TVariable(BuiltInId::gl_FragDepthEXT, BuiltInName::gl_FragDepthEXT, >+ SymbolType::BuiltIn, TExtension::EXT_frag_depth, type_gl_FragDepthEXT); >+ } >+ TType *type_gl_LastFragData = new TType(EbtFloat, EbpMedium, EvqLastFragData, 4, 1); >+ type_gl_LastFragData->makeArray(resources.MaxDrawBuffers); >+ type_gl_LastFragData->realize(); >+ mVar_gl_LastFragData = >+ new TVariable(BuiltInId::gl_LastFragData, BuiltInName::gl_LastFragData, SymbolType::BuiltIn, >+ TExtension::EXT_shader_framebuffer_fetch, type_gl_LastFragData); >+ TType *type_gl_LastFragDataNV = new TType(EbtFloat, EbpMedium, EvqLastFragData, 4, 1); >+ type_gl_LastFragDataNV->makeArray(resources.MaxDrawBuffers); >+ type_gl_LastFragDataNV->realize(); >+ mVar_gl_LastFragDataNV = new TVariable( >+ BuiltInId::gl_LastFragDataNV, BuiltInName::gl_LastFragData, SymbolType::BuiltIn, >+ TExtension::NV_shader_framebuffer_fetch, type_gl_LastFragDataNV); >+ TFieldList *fields_gl_PerVertex = new TFieldList(); >+ fields_gl_PerVertex->push_back(new TField(new TType(EbtFloat, EbpHigh, EvqPosition, 4, 1), >+ BuiltInName::gl_Position, zeroSourceLoc, >+ SymbolType::BuiltIn)); >+ TInterfaceBlock *gl_PerVertex = >+ new TInterfaceBlock(BuiltInId::gl_PerVertex, BuiltInName::gl_PerVertex, >+ TExtension::EXT_geometry_shader, fields_gl_PerVertex); >+ mVar_gl_PerVertex = gl_PerVertex; >+ if (shaderType == GL_GEOMETRY_SHADER_EXT) >+ { >+ TType *type_gl_in = new TType(gl_PerVertex, EvqPerVertexIn, TLayoutQualifier::Create()); >+ type_gl_in->makeArray(0u); >+ type_gl_in->realize(); >+ mVar_gl_in = new TVariable(BuiltInId::gl_in, BuiltInName::gl_in, SymbolType::BuiltIn, >+ TExtension::EXT_geometry_shader, type_gl_in); >+ } >+ TFieldList *fields_gl_PerVertexOutBlock = new TFieldList(); >+ fields_gl_PerVertexOutBlock->push_back( >+ new TField(new TType(EbtFloat, EbpHigh, EvqPosition, 4, 1), BuiltInName::gl_Position, >+ zeroSourceLoc, SymbolType::BuiltIn)); >+ TInterfaceBlock *gl_PerVertexOutBlock = >+ new TInterfaceBlock(BuiltInId::gl_PerVertexOutBlock, BuiltInName::gl_PerVertex, >+ TExtension::EXT_geometry_shader, fields_gl_PerVertexOutBlock); >+ TType *type_gl_PositionGS = new TType(EbtFloat, EbpHigh, EvqPosition, 4); >+ type_gl_PositionGS->setInterfaceBlock(gl_PerVertexOutBlock); >+ type_gl_PositionGS->realize(); >+ mVar_gl_PositionGS = >+ new TVariable(BuiltInId::gl_PositionGS, BuiltInName::gl_Position, SymbolType::BuiltIn, >+ TExtension::EXT_geometry_shader, type_gl_PositionGS); >+} >+ >+const TSymbol *TSymbolTable::findBuiltIn(const ImmutableString &name, int shaderVersion) const >+{ >+ if (name.length() > 35) >+ { >+ return nullptr; >+ } >+ uint32_t nameHash = name.mangledNameHash(); >+ if ((nameHash >> 31) != 0) >+ { >+ // The name contains [ or {. >+ return nullptr; >+ } >+ if (shaderVersion >= 310) >+ { >+ switch (nameHash) >+ { >+ case 0x0a50832eu: >+ { >+ if (name.beginsWith(BuiltInName::ldexp)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_ldexp_1B1C; >+ } >+ break; >+ } >+ case 0x0a50a6eeu: >+ { >+ if (name.beginsWith(BuiltInName::frexp)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_frexp_2B2C; >+ } >+ break; >+ } >+ case 0x0a52bed1u: >+ { >+ if (name.beginsWith(BuiltInName::ldexp)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_ldexp_0B0C; >+ } >+ break; >+ } >+ case 0x0a53e9c4u: >+ { >+ if (name == BuiltInName::frexp_3B3C) >+ { >+ return &BuiltInFunction::kFunction_frexp_3B3C; >+ } >+ break; >+ } >+ case 0x0a54aa52u: >+ { >+ if (name.beginsWith(BuiltInName::ldexp)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_ldexp_2B2C; >+ } >+ break; >+ } >+ case 0x0a55008fu: >+ { >+ if (name.beginsWith(BuiltInName::frexp)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_frexp_1B1C; >+ } >+ break; >+ } >+ case 0x0a5799e7u: >+ { >+ if (name.beginsWith(BuiltInName::frexp)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_frexp_0B0C; >+ } >+ break; >+ } >+ case 0x0a57c201u: >+ { >+ if (name.beginsWith(BuiltInName::ldexp)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_ldexp_3B3C; >+ } >+ break; >+ } >+ case 0x0e500330u: >+ { >+ if (name.beginsWith(BuiltInName::findMSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findMSB_3C; >+ } >+ break; >+ } >+ case 0x0e503089u: >+ { >+ if (name.beginsWith(BuiltInName::findMSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findMSB_3D; >+ } >+ break; >+ } >+ case 0x0e508070u: >+ { >+ if (name.beginsWith(BuiltInName::findMSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findMSB_0C; >+ } >+ break; >+ } >+ case 0x0e508a05u: >+ { >+ if (name.beginsWith(BuiltInName::findMSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findMSB_0D; >+ } >+ break; >+ } >+ case 0x0e51917du: >+ { >+ if (name.beginsWith(BuiltInName::findMSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findMSB_1C; >+ } >+ break; >+ } >+ case 0x0e51dc78u: >+ { >+ if (name.beginsWith(BuiltInName::findMSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findMSB_1D; >+ } >+ break; >+ } >+ case 0x0e54832eu: >+ { >+ if (name.beginsWith(BuiltInName::findLSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findLSB_2C; >+ } >+ break; >+ } >+ case 0x0e54b667u: >+ { >+ if (name.beginsWith(BuiltInName::findLSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findLSB_2D; >+ } >+ break; >+ } >+ case 0x0e550f72u: >+ { >+ if (name.beginsWith(BuiltInName::findLSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findLSB_1D; >+ } >+ break; >+ } >+ case 0x0e5514e7u: >+ { >+ if (name.beginsWith(BuiltInName::findLSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findLSB_1C; >+ } >+ break; >+ } >+ case 0x0e5607c2u: >+ { >+ if (name.beginsWith(BuiltInName::findLSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findLSB_0C; >+ } >+ break; >+ } >+ case 0x0e5650c7u: >+ { >+ if (name.beginsWith(BuiltInName::findLSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findLSB_0D; >+ } >+ break; >+ } >+ case 0x0e56a99cu: >+ { >+ if (name.beginsWith(BuiltInName::findMSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findMSB_2D; >+ } >+ break; >+ } >+ case 0x0e56cd55u: >+ { >+ if (name.beginsWith(BuiltInName::findMSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findMSB_2C; >+ } >+ break; >+ } >+ case 0x0e573680u: >+ { >+ if (name.beginsWith(BuiltInName::findLSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findLSB_3D; >+ } >+ break; >+ } >+ case 0x0e574a59u: >+ { >+ if (name.beginsWith(BuiltInName::findLSB)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_findLSB_3C; >+ } >+ break; >+ } >+ case 0x10581cccu: >+ { >+ if (name.beginsWith(BuiltInName::bitCount)) >+ { >+ ASSERT(name.length() == 11); >+ return &BuiltInFunction::kFunction_bitCount_2D; >+ } >+ break; >+ } >+ case 0x10584c2du: >+ { >+ if (name.beginsWith(BuiltInName::bitCount)) >+ { >+ ASSERT(name.length() == 11); >+ return &BuiltInFunction::kFunction_bitCount_2C; >+ } >+ break; >+ } >+ case 0x105896f1u: >+ { >+ if (name.beginsWith(BuiltInName::bitCount)) >+ { >+ ASSERT(name.length() == 11); >+ return &BuiltInFunction::kFunction_bitCount_1D; >+ } >+ break; >+ } >+ case 0x1058cbf7u: >+ { >+ if (name.beginsWith(BuiltInName::bitCount)) >+ { >+ ASSERT(name.length() == 11); >+ return &BuiltInFunction::kFunction_bitCount_1C; >+ } >+ break; >+ } >+ case 0x1059a37cu: >+ { >+ if (name.beginsWith(BuiltInName::bitCount)) >+ { >+ ASSERT(name.length() == 11); >+ return &BuiltInFunction::kFunction_bitCount_0D; >+ } >+ break; >+ } >+ case 0x1059dae9u: >+ { >+ if (name.beginsWith(BuiltInName::bitCount)) >+ { >+ ASSERT(name.length() == 11); >+ return &BuiltInFunction::kFunction_bitCount_0C; >+ } >+ break; >+ } >+ case 0x105b1832u: >+ { >+ if (name.beginsWith(BuiltInName::bitCount)) >+ { >+ ASSERT(name.length() == 11); >+ return &BuiltInFunction::kFunction_bitCount_3C; >+ } >+ break; >+ } >+ case 0x105b2810u: >+ { >+ if (name.beginsWith(BuiltInName::bitCount)) >+ { >+ ASSERT(name.length() == 11); >+ return &BuiltInFunction::kFunction_bitCount_3D; >+ } >+ break; >+ } >+ case 0x106a2daeu: >+ { >+ if (name.beginsWith(BuiltInName::atomicOr)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_atomicOr_0D0D; >+ } >+ break; >+ } >+ case 0x106bd5b6u: >+ { >+ if (name.beginsWith(BuiltInName::atomicOr)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_atomicOr_0C0C; >+ } >+ break; >+ } >+ case 0x126520f8u: >+ { >+ if (name.beginsWith(BuiltInName::imageSize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_imageSize_0p; >+ } >+ break; >+ } >+ case 0x12653967u: >+ { >+ if (name.beginsWith(BuiltInName::imageSize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_imageSize_0q; >+ } >+ break; >+ } >+ case 0x1265b53eu: >+ { >+ if (name.beginsWith(BuiltInName::imageSize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_imageSize_0g; >+ } >+ break; >+ } >+ case 0x1265cbcau: >+ { >+ if (name.beginsWith(BuiltInName::imageSize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_imageSize_0k; >+ } >+ break; >+ } >+ case 0x1265cc8du: >+ { >+ if (name.beginsWith(BuiltInName::imageSize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_imageSize_0f; >+ } >+ break; >+ } >+ case 0x1265e196u: >+ { >+ if (name.beginsWith(BuiltInName::imageSize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_imageSize_0o; >+ } >+ break; >+ } >+ case 0x1265e603u: >+ { >+ if (name.beginsWith(BuiltInName::imageSize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_imageSize_0h; >+ } >+ break; >+ } >+ case 0x1265f559u: >+ { >+ if (name.beginsWith(BuiltInName::imageSize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_imageSize_0j; >+ } >+ break; >+ } >+ case 0x1265fcacu: >+ { >+ if (name.beginsWith(BuiltInName::imageSize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_imageSize_0i; >+ } >+ break; >+ } >+ case 0x12660ccfu: >+ { >+ if (name.beginsWith(BuiltInName::imageSize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_imageSize_0l; >+ } >+ break; >+ } >+ case 0x12661578u: >+ { >+ if (name.beginsWith(BuiltInName::imageSize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_imageSize_0m; >+ } >+ break; >+ } >+ case 0x12661be5u: >+ { >+ if (name.beginsWith(BuiltInName::imageSize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_imageSize_0n; >+ } >+ break; >+ } >+ case 0x12700109u: >+ { >+ if (name.beginsWith(BuiltInName::imageLoad)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_imageLoad_0h1C; >+ } >+ break; >+ } >+ case 0x1270b3f8u: >+ { >+ if (name.beginsWith(BuiltInName::atomicAdd)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_atomicAdd_0C0C; >+ } >+ break; >+ } >+ case 0x1270b766u: >+ { >+ if (name.beginsWith(BuiltInName::atomicXor)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_atomicXor_0C0C; >+ } >+ break; >+ } >+ case 0x12712664u: >+ { >+ if (name.beginsWith(BuiltInName::imageLoad)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_imageLoad_0n2C; >+ } >+ break; >+ } >+ case 0x12715f47u: >+ { >+ if (name.beginsWith(BuiltInName::imageLoad)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_imageLoad_0j2C; >+ } >+ break; >+ } >+ case 0x12717c89u: >+ { >+ if (name.beginsWith(BuiltInName::atomicMin)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_atomicMin_0C0C; >+ } >+ break; >+ } >+ case 0x127258f0u: >+ { >+ if (name.beginsWith(BuiltInName::atomicAdd)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_atomicAdd_0D0D; >+ } >+ break; >+ } >+ case 0x12731984u: >+ { >+ if (name.beginsWith(BuiltInName::imageLoad)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_imageLoad_0m2C; >+ } >+ break; >+ } >+ case 0x12737ed6u: >+ { >+ if (name.beginsWith(BuiltInName::imageLoad)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_imageLoad_0q2C; >+ } >+ break; >+ } >+ case 0x12739c87u: >+ { >+ if (name.beginsWith(BuiltInName::imageLoad)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_imageLoad_0f1C; >+ } >+ break; >+ } >+ case 0x1273d1adu: >+ { >+ if (name.beginsWith(BuiltInName::atomicMax)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_atomicMax_0D0D; >+ } >+ break; >+ } >+ case 0x1273e62au: >+ { >+ if (name.beginsWith(BuiltInName::atomicMin)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_atomicMin_0D0D; >+ } >+ break; >+ } >+ case 0x12744c0du: >+ { >+ if (name.beginsWith(BuiltInName::imageLoad)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_imageLoad_0o2C; >+ } >+ break; >+ } >+ case 0x127474cau: >+ { >+ if (name.beginsWith(BuiltInName::imageLoad)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_imageLoad_0k2C; >+ } >+ break; >+ } >+ case 0x127478d9u: >+ { >+ if (name.beginsWith(BuiltInName::atomicAnd)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_atomicAnd_0C0C; >+ } >+ break; >+ } >+ case 0x1274d54bu: >+ { >+ if (name.beginsWith(BuiltInName::imageLoad)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_imageLoad_0p2C; >+ } >+ break; >+ } >+ case 0x127539b2u: >+ { >+ if (name.beginsWith(BuiltInName::imageLoad)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_imageLoad_0i2C; >+ } >+ break; >+ } >+ case 0x12755603u: >+ { >+ if (name.beginsWith(BuiltInName::imageLoad)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_imageLoad_0g1C; >+ } >+ break; >+ } >+ case 0x127648cau: >+ { >+ if (name.beginsWith(BuiltInName::atomicAnd)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_atomicAnd_0D0D; >+ } >+ break; >+ } >+ case 0x1276656cu: >+ { >+ if (name.beginsWith(BuiltInName::imageLoad)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_imageLoad_0l2C; >+ } >+ break; >+ } >+ case 0x12771119u: >+ { >+ if (name.beginsWith(BuiltInName::atomicXor)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_atomicXor_0D0D; >+ } >+ break; >+ } >+ case 0x1277882au: >+ { >+ if (name.beginsWith(BuiltInName::atomicMax)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_atomicMax_0C0C; >+ } >+ break; >+ } >+ case 0x1283ba95u: >+ { >+ if (name.beginsWith(BuiltInName::uaddCarry)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_uaddCarry_0D0D0D; >+ } >+ break; >+ } >+ case 0x12840dfbu: >+ { >+ if (name == BuiltInName::uaddCarry_2D2D2D) >+ { >+ return &BuiltInFunction::kFunction_uaddCarry_2D2D2D; >+ } >+ break; >+ } >+ case 0x12842566u: >+ { >+ if (name == BuiltInName::uaddCarry_3D3D3D) >+ { >+ return &BuiltInFunction::kFunction_uaddCarry_3D3D3D; >+ } >+ break; >+ } >+ case 0x12843bc0u: >+ { >+ if (name.beginsWith(BuiltInName::uaddCarry)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_uaddCarry_1D1D1D; >+ } >+ break; >+ } >+ case 0x1488078cu: >+ { >+ if (name.beginsWith(BuiltInName::imageStore)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_imageStore_0k2C3D; >+ } >+ break; >+ } >+ case 0x14880e11u: >+ { >+ if (name == BuiltInName::texelFetch_0V2C0C) >+ { >+ return &BuiltInFunction::kFunction_texelFetch_0V2C0C; >+ } >+ break; >+ } >+ case 0x1488ffa7u: >+ { >+ if (name == BuiltInName::usubBorrow_3D3D3D) >+ { >+ return &BuiltInFunction::kFunction_usubBorrow_3D3D3D; >+ } >+ break; >+ } >+ case 0x1489244fu: >+ { >+ if (name.beginsWith(BuiltInName::texelFetch)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_texelFetch_0b2C0C; >+ } >+ break; >+ } >+ case 0x14896692u: >+ { >+ if (name.beginsWith(BuiltInName::usubBorrow)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_usubBorrow_2D2D2D; >+ } >+ break; >+ } >+ case 0x14896e41u: >+ { >+ if (name == BuiltInName::texelFetch_0O1C0C) >+ { >+ return &BuiltInFunction::kFunction_texelFetch_0O1C0C; >+ } >+ break; >+ } >+ case 0x148a0cecu: >+ { >+ if (name == BuiltInName::imageStore_0p2C3C) >+ { >+ return &BuiltInFunction::kFunction_imageStore_0p2C3C; >+ } >+ break; >+ } >+ case 0x148ab5f1u: >+ { >+ if (name == BuiltInName::usubBorrow_1D1D1D) >+ { >+ return &BuiltInFunction::kFunction_usubBorrow_1D1D1D; >+ } >+ break; >+ } >+ case 0x148bb1bdu: >+ { >+ if (name.beginsWith(BuiltInName::imageStore)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_imageStore_0g1C3C; >+ } >+ break; >+ } >+ case 0x148c1e41u: >+ { >+ if (name.beginsWith(BuiltInName::imageStore)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_imageStore_0q2C3D; >+ } >+ break; >+ } >+ case 0x148d86dcu: >+ { >+ if (name.beginsWith(BuiltInName::imageStore)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_imageStore_0f1C3B; >+ } >+ break; >+ } >+ case 0x148dcfd5u: >+ { >+ if (name == BuiltInName::imageStore_0l2C3B) >+ { >+ return &BuiltInFunction::kFunction_imageStore_0l2C3B; >+ } >+ break; >+ } >+ case 0x148ddb10u: >+ { >+ if (name.beginsWith(BuiltInName::texelFetch)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_texelFetch_0a1C0C; >+ } >+ break; >+ } >+ case 0x148e37b8u: >+ { >+ if (name.beginsWith(BuiltInName::imageStore)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_imageStore_0m2C3C; >+ } >+ break; >+ } >+ case 0x148e668au: >+ { >+ if (name == BuiltInName::imageStore_0j2C3C) >+ { >+ return &BuiltInFunction::kFunction_imageStore_0j2C3C; >+ } >+ break; >+ } >+ case 0x148e872bu: >+ { >+ if (name == BuiltInName::texelFetch_0P2C0C) >+ { >+ return &BuiltInFunction::kFunction_texelFetch_0P2C0C; >+ } >+ break; >+ } >+ case 0x148ed16fu: >+ { >+ if (name.beginsWith(BuiltInName::texelFetch)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_texelFetch_0U1C0C; >+ } >+ break; >+ } >+ case 0x148ed534u: >+ { >+ if (name == BuiltInName::imageStore_0n2C3D) >+ { >+ return &BuiltInFunction::kFunction_imageStore_0n2C3D; >+ } >+ break; >+ } >+ case 0x148f6fe1u: >+ { >+ if (name == BuiltInName::usubBorrow_0D0D0D) >+ { >+ return &BuiltInFunction::kFunction_usubBorrow_0D0D0D; >+ } >+ break; >+ } >+ case 0x148f7a82u: >+ { >+ if (name.beginsWith(BuiltInName::imageStore)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_imageStore_0o2C3B; >+ } >+ break; >+ } >+ case 0x148fd5f1u: >+ { >+ if (name.beginsWith(BuiltInName::imageStore)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_imageStore_0i2C3B; >+ } >+ break; >+ } >+ case 0x148ffee8u: >+ { >+ if (name == BuiltInName::imageStore_0h1C3D) >+ { >+ return &BuiltInFunction::kFunction_imageStore_0h1C3D; >+ } >+ break; >+ } >+ case 0x167394d8u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_textureSize_0U; >+ } >+ break; >+ } >+ case 0x1673a791u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_textureSize_0V; >+ } >+ break; >+ } >+ case 0x1673b4b7u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_textureSize_0P; >+ } >+ break; >+ } >+ case 0x1673f496u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_textureSize_0O; >+ } >+ break; >+ } >+ case 0x16752ab6u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_textureSize_0a; >+ } >+ break; >+ } >+ case 0x1675566fu: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_textureSize_0b; >+ } >+ break; >+ } >+ case 0x187b7b7cu: >+ { >+ if (name.beginsWith(BuiltInName::packSnorm4x8)) >+ { >+ ASSERT(name.length() == 15); >+ return &BuiltInFunction::kFunction_packSnorm4x8_3B; >+ } >+ break; >+ } >+ case 0x187c1f3fu: >+ { >+ if (name.beginsWith(BuiltInName::packUnorm4x8)) >+ { >+ ASSERT(name.length() == 15); >+ return &BuiltInFunction::kFunction_packUnorm4x8_3B; >+ } >+ break; >+ } >+ case 0x18a851efu: >+ { >+ if (name == BuiltInName::imulExtended_2C2C2C2C) >+ { >+ return &BuiltInFunction::kFunction_imulExtended_2C2C2C2C; >+ } >+ break; >+ } >+ case 0x18a93bdcu: >+ { >+ if (name == BuiltInName::umulExtended_0D0D0D0D) >+ { >+ return &BuiltInFunction::kFunction_umulExtended_0D0D0D0D; >+ } >+ break; >+ } >+ case 0x18a94b63u: >+ { >+ if (name == BuiltInName::umulExtended_3D3D3D3D) >+ { >+ return &BuiltInFunction::kFunction_umulExtended_3D3D3D3D; >+ } >+ break; >+ } >+ case 0x18aa71ceu: >+ { >+ if (name == BuiltInName::umulExtended_2D2D2D2D) >+ { >+ return &BuiltInFunction::kFunction_umulExtended_2D2D2D2D; >+ } >+ break; >+ } >+ case 0x18ab4baeu: >+ { >+ if (name == BuiltInName::umulExtended_1D1D1D1D) >+ { >+ return &BuiltInFunction::kFunction_umulExtended_1D1D1D1D; >+ } >+ break; >+ } >+ case 0x18ac1df0u: >+ { >+ if (name == BuiltInName::imulExtended_3C3C3C3C) >+ { >+ return &BuiltInFunction::kFunction_imulExtended_3C3C3C3C; >+ } >+ break; >+ } >+ case 0x18ac377fu: >+ { >+ if (name == BuiltInName::imulExtended_0C0C0C0C) >+ { >+ return &BuiltInFunction::kFunction_imulExtended_0C0C0C0C; >+ } >+ break; >+ } >+ case 0x18ae7b8cu: >+ { >+ if (name == BuiltInName::imulExtended_1C1C1C1C) >+ { >+ return &BuiltInFunction::kFunction_imulExtended_1C1C1C1C; >+ } >+ break; >+ } >+ case 0x1a7538dfu: >+ { >+ if (name.beginsWith(BuiltInName::memoryBarrier)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_memoryBarrier_; >+ } >+ break; >+ } >+ case 0x1a805162u: >+ { >+ if (name.beginsWith(BuiltInName::atomicCounter)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_atomicCounter_0F; >+ } >+ break; >+ } >+ case 0x1a910beau: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureGather_0Y2B; >+ } >+ break; >+ } >+ case 0x1a91963cu: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureGather_0d2B; >+ } >+ break; >+ } >+ case 0x1a926b0du: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureGather_0c1B; >+ } >+ break; >+ } >+ case 0x1a92a168u: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureGather_0W1B; >+ } >+ break; >+ } >+ case 0x1a92a1ceu: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureGather_0H1B; >+ } >+ break; >+ } >+ case 0x1a92c882u: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureGather_0Q1B; >+ } >+ break; >+ } >+ case 0x1a9418e8u: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureGather_0S2B; >+ } >+ break; >+ } >+ case 0x1a94543du: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureGather_0K2B; >+ } >+ break; >+ } >+ case 0x1a94d27du: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureGather_0e2B; >+ } >+ break; >+ } >+ case 0x1a94eb48u: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureGather_0Z2B; >+ } >+ break; >+ } >+ case 0x1a95f707u: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureGather_0T2B; >+ } >+ break; >+ } >+ case 0x1a979ae3u: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureGather_0J2B; >+ } >+ break; >+ } >+ case 0x1aa039c7u: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureGather_0e2B0B; >+ } >+ break; >+ } >+ case 0x1aa133bcu: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureGather_0Q1B0C; >+ } >+ break; >+ } >+ case 0x1aa17115u: >+ { >+ if (name == BuiltInName::textureGather_0Z2B0C) >+ { >+ return &BuiltInFunction::kFunction_textureGather_0Z2B0C; >+ } >+ break; >+ } >+ case 0x1aa182eeu: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureGather_0c1B0B; >+ } >+ break; >+ } >+ case 0x1aa220b0u: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureGather_0W1B0C; >+ } >+ break; >+ } >+ case 0x1aa2aafeu: >+ { >+ if (name == BuiltInName::textureGather_0T2B0C) >+ { >+ return &BuiltInFunction::kFunction_textureGather_0T2B0C; >+ } >+ break; >+ } >+ case 0x1aa353f8u: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureGather_0d2B0B; >+ } >+ break; >+ } >+ case 0x1aa3ef46u: >+ { >+ if (name == BuiltInName::textureGather_0S2B0C) >+ { >+ return &BuiltInFunction::kFunction_textureGather_0S2B0C; >+ } >+ break; >+ } >+ case 0x1aa4986bu: >+ { >+ if (name == BuiltInName::textureGather_0J2B0C) >+ { >+ return &BuiltInFunction::kFunction_textureGather_0J2B0C; >+ } >+ break; >+ } >+ case 0x1aa4c59du: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureGather_0H1B0C; >+ } >+ break; >+ } >+ case 0x1aa78b86u: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureGather_0K2B0C; >+ } >+ break; >+ } >+ case 0x1aa7fa48u: >+ { >+ if (name.beginsWith(BuiltInName::textureGather)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureGather_0Y2B0C; >+ } >+ break; >+ } >+ case 0x1c894fb3u: >+ { >+ if (name.beginsWith(BuiltInName::unpackSnorm4x8)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_unpackSnorm4x8_0D; >+ } >+ break; >+ } >+ case 0x1c8be3bau: >+ { >+ if (name.beginsWith(BuiltInName::unpackUnorm4x8)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_unpackUnorm4x8_0D; >+ } >+ break; >+ } >+ case 0x1c9986beu: >+ { >+ if (name.beginsWith(BuiltInName::atomicExchange)) >+ { >+ ASSERT(name.length() == 19); >+ return &BuiltInFunction::kFunction_atomicExchange_0D0D; >+ } >+ break; >+ } >+ case 0x1c9b5eecu: >+ { >+ if (name.beginsWith(BuiltInName::atomicExchange)) >+ { >+ ASSERT(name.length() == 19); >+ return &BuiltInFunction::kFunction_atomicExchange_0C0C; >+ } >+ break; >+ } >+ case 0x1ca86085u: >+ { >+ if (name.beginsWith(BuiltInName::atomicCompSwap)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_atomicCompSwap_0C0C0C; >+ } >+ break; >+ } >+ case 0x1caa900cu: >+ { >+ if (name == BuiltInName::atomicCompSwap_0D0D0D) >+ { >+ return &BuiltInFunction::kFunction_atomicCompSwap_0D0D0D; >+ } >+ break; >+ } >+ case 0x1cb84b0cu: >+ { >+ if (name == BuiltInName::bitfieldInsert_3D3D0C0C) >+ { >+ return &BuiltInFunction::kFunction_bitfieldInsert_3D3D0C0C; >+ } >+ break; >+ } >+ case 0x1cb880bfu: >+ { >+ if (name == BuiltInName::bitfieldInsert_3C3C0C0C) >+ { >+ return &BuiltInFunction::kFunction_bitfieldInsert_3C3C0C0C; >+ } >+ break; >+ } >+ case 0x1cb90fd0u: >+ { >+ if (name == BuiltInName::bitfieldInsert_1C1C0C0C) >+ { >+ return &BuiltInFunction::kFunction_bitfieldInsert_1C1C0C0C; >+ } >+ break; >+ } >+ case 0x1cb9fb13u: >+ { >+ if (name == BuiltInName::bitfieldInsert_1D1D0C0C) >+ { >+ return &BuiltInFunction::kFunction_bitfieldInsert_1D1D0C0C; >+ } >+ break; >+ } >+ case 0x1cbb43f5u: >+ { >+ if (name == BuiltInName::bitfieldInsert_0D0D0C0C) >+ { >+ return &BuiltInFunction::kFunction_bitfieldInsert_0D0D0C0C; >+ } >+ break; >+ } >+ case 0x1cbb9db3u: >+ { >+ if (name == BuiltInName::bitfieldInsert_2D2D0C0C) >+ { >+ return &BuiltInFunction::kFunction_bitfieldInsert_2D2D0C0C; >+ } >+ break; >+ } >+ case 0x1cbdf898u: >+ { >+ if (name == BuiltInName::bitfieldInsert_0C0C0C0C) >+ { >+ return &BuiltInFunction::kFunction_bitfieldInsert_0C0C0C0C; >+ } >+ break; >+ } >+ case 0x1cbfaf73u: >+ { >+ if (name == BuiltInName::bitfieldInsert_2C2C0C0C) >+ { >+ return &BuiltInFunction::kFunction_bitfieldInsert_2C2C0C0C; >+ } >+ break; >+ } >+ case 0x1e907f62u: >+ { >+ if (name.beginsWith(BuiltInName::bitfieldReverse)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_bitfieldReverse_3D; >+ } >+ break; >+ } >+ case 0x1e9088f7u: >+ { >+ if (name.beginsWith(BuiltInName::bitfieldReverse)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_bitfieldReverse_3C; >+ } >+ break; >+ } >+ case 0x1e91c654u: >+ { >+ if (name.beginsWith(BuiltInName::bitfieldReverse)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_bitfieldReverse_0C; >+ } >+ break; >+ } >+ case 0x1e91e675u: >+ { >+ if (name.beginsWith(BuiltInName::bitfieldReverse)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_bitfieldReverse_0D; >+ } >+ break; >+ } >+ case 0x1e96ddc2u: >+ { >+ if (name.beginsWith(BuiltInName::bitfieldReverse)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_bitfieldReverse_1D; >+ } >+ break; >+ } >+ case 0x1e970da3u: >+ { >+ if (name.beginsWith(BuiltInName::bitfieldReverse)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_bitfieldReverse_1C; >+ } >+ break; >+ } >+ case 0x1e9744d7u: >+ { >+ if (name.beginsWith(BuiltInName::bitfieldReverse)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_bitfieldReverse_2D; >+ } >+ break; >+ } >+ case 0x1e9797d2u: >+ { >+ if (name.beginsWith(BuiltInName::bitfieldReverse)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_bitfieldReverse_2C; >+ } >+ break; >+ } >+ case 0x1eb0c64fu: >+ { >+ if (name.beginsWith(BuiltInName::bitfieldExtract)) >+ { >+ ASSERT(name.length() == 22); >+ return &BuiltInFunction::kFunction_bitfieldExtract_2C0C0C; >+ } >+ break; >+ } >+ case 0x1eb0f9fau: >+ { >+ if (name == BuiltInName::bitfieldExtract_0D0C0C) >+ { >+ return &BuiltInFunction::kFunction_bitfieldExtract_0D0C0C; >+ } >+ break; >+ } >+ case 0x1eb12f29u: >+ { >+ if (name.beginsWith(BuiltInName::bitfieldExtract)) >+ { >+ ASSERT(name.length() == 22); >+ return &BuiltInFunction::kFunction_bitfieldExtract_3D0C0C; >+ } >+ break; >+ } >+ case 0x1eb17d11u: >+ { >+ if (name == BuiltInName::bitfieldExtract_3C0C0C) >+ { >+ return &BuiltInFunction::kFunction_bitfieldExtract_3C0C0C; >+ } >+ break; >+ } >+ case 0x1eb17f7du: >+ { >+ if (name.beginsWith(BuiltInName::bitfieldExtract)) >+ { >+ ASSERT(name.length() == 22); >+ return &BuiltInFunction::kFunction_bitfieldExtract_0C0C0C; >+ } >+ break; >+ } >+ case 0x1eb19a50u: >+ { >+ if (name == BuiltInName::bitfieldExtract_1C0C0C) >+ { >+ return &BuiltInFunction::kFunction_bitfieldExtract_1C0C0C; >+ } >+ break; >+ } >+ case 0x1eb28b55u: >+ { >+ if (name.beginsWith(BuiltInName::bitfieldExtract)) >+ { >+ ASSERT(name.length() == 22); >+ return &BuiltInFunction::kFunction_bitfieldExtract_2D0C0C; >+ } >+ break; >+ } >+ case 0x1eb5f0c8u: >+ { >+ if (name.beginsWith(BuiltInName::bitfieldExtract)) >+ { >+ ASSERT(name.length() == 22); >+ return &BuiltInFunction::kFunction_bitfieldExtract_1D0C0C; >+ } >+ break; >+ } >+ case 0x249e7359u: >+ { >+ if (name.beginsWith(BuiltInName::memoryBarrierImage)) >+ { >+ ASSERT(name.length() == 19); >+ return &BuiltInFunction::kFunction_memoryBarrierImage_; >+ } >+ break; >+ } >+ case 0x26a7e24bu: >+ { >+ if (name.beginsWith(BuiltInName::memoryBarrierBuffer)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_memoryBarrierBuffer_; >+ } >+ break; >+ } >+ case 0x26d00e91u: >+ { >+ if (name == BuiltInName::textureGatherOffset_0W1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureGatherOffset_0W1B1C; >+ } >+ break; >+ } >+ case 0x26d0b451u: >+ { >+ if (name.beginsWith(BuiltInName::textureGatherOffset)) >+ { >+ ASSERT(name.length() == 26); >+ return &BuiltInFunction::kFunction_textureGatherOffset_0Q1B1C; >+ } >+ break; >+ } >+ case 0x26d0db41u: >+ { >+ if (name.beginsWith(BuiltInName::textureGatherOffset)) >+ { >+ ASSERT(name.length() == 26); >+ return &BuiltInFunction::kFunction_textureGatherOffset_0Z2B1C; >+ } >+ break; >+ } >+ case 0x26d1f440u: >+ { >+ if (name.beginsWith(BuiltInName::textureGatherOffset)) >+ { >+ ASSERT(name.length() == 26); >+ return &BuiltInFunction::kFunction_textureGatherOffset_0K2B1C; >+ } >+ break; >+ } >+ case 0x26d2d875u: >+ { >+ if (name == BuiltInName::textureGatherOffset_0T2B1C) >+ { >+ return &BuiltInFunction::kFunction_textureGatherOffset_0T2B1C; >+ } >+ break; >+ } >+ case 0x26d71952u: >+ { >+ if (name.beginsWith(BuiltInName::textureGatherOffset)) >+ { >+ ASSERT(name.length() == 26); >+ return &BuiltInFunction::kFunction_textureGatherOffset_0H1B1C; >+ } >+ break; >+ } >+ case 0x26e1982cu: >+ { >+ if (name == BuiltInName::textureGatherOffset_0T2B1C0C) >+ { >+ return &BuiltInFunction::kFunction_textureGatherOffset_0T2B1C0C; >+ } >+ break; >+ } >+ case 0x26e459f8u: >+ { >+ if (name == BuiltInName::textureGatherOffset_0K2B1C0C) >+ { >+ return &BuiltInFunction::kFunction_textureGatherOffset_0K2B1C0C; >+ } >+ break; >+ } >+ case 0x26e476d0u: >+ { >+ if (name == BuiltInName::textureGatherOffset_0H1B1C0C) >+ { >+ return &BuiltInFunction::kFunction_textureGatherOffset_0H1B1C0C; >+ } >+ break; >+ } >+ case 0x26e47c82u: >+ { >+ if (name == BuiltInName::textureGatherOffset_0Z2B1C0C) >+ { >+ return &BuiltInFunction::kFunction_textureGatherOffset_0Z2B1C0C; >+ } >+ break; >+ } >+ case 0x26e53ca1u: >+ { >+ if (name == BuiltInName::textureGatherOffset_0e2B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureGatherOffset_0e2B0B1C; >+ } >+ break; >+ } >+ case 0x26e567feu: >+ { >+ if (name == BuiltInName::textureGatherOffset_0Q1B1C0C) >+ { >+ return &BuiltInFunction::kFunction_textureGatherOffset_0Q1B1C0C; >+ } >+ break; >+ } >+ case 0x26e580eau: >+ { >+ if (name == BuiltInName::textureGatherOffset_0c1B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureGatherOffset_0c1B0B1C; >+ } >+ break; >+ } >+ case 0x26e737a0u: >+ { >+ if (name == BuiltInName::textureGatherOffset_0W1B1C0C) >+ { >+ return &BuiltInFunction::kFunction_textureGatherOffset_0W1B1C0C; >+ } >+ break; >+ } >+ case 0x2ccf8f34u: >+ { >+ if (name.beginsWith(BuiltInName::atomicCounterIncrement)) >+ { >+ ASSERT(name.length() == 25); >+ return &BuiltInFunction::kFunction_atomicCounterIncrement_0F; >+ } >+ break; >+ } >+ case 0x2ccfbbbeu: >+ { >+ if (name.beginsWith(BuiltInName::atomicCounterDecrement)) >+ { >+ ASSERT(name.length() == 25); >+ return &BuiltInFunction::kFunction_atomicCounterDecrement_0F; >+ } >+ break; >+ } >+ case 0x34ded18du: >+ { >+ if (name.beginsWith(BuiltInName::memoryBarrierAtomicCounter)) >+ { >+ ASSERT(name.length() == 27); >+ return &BuiltInFunction::kFunction_memoryBarrierAtomicCounter_; >+ } >+ break; >+ } >+ case 0x7e2bef7au: >+ { >+ if (name == BuiltInName::gl_in) >+ { >+ // Only initialized if shaderType == GL_GEOMETRY_SHADER_EXT >+ return mVar_gl_in; >+ } >+ break; >+ } >+ case 0x7e8166efu: >+ { >+ if (name == BuiltInName::gl_MaxImageUnits) >+ { >+ return mVar_gl_MaxImageUnits; >+ } >+ break; >+ } >+ case 0x7ecf4a1bu: >+ { >+ if (name == BuiltInName::gl_MaxVertexImageUniforms) >+ { >+ return mVar_gl_MaxVertexImageUniforms; >+ } >+ break; >+ } >+ case 0x7ed27574u: >+ { >+ if (name == BuiltInName::gl_MaxVertexAtomicCounters) >+ { >+ return mVar_gl_MaxVertexAtomicCounters; >+ } >+ break; >+ } >+ case 0x7ed2bd5cu: >+ { >+ if (name == BuiltInName::gl_MaxComputeImageUniforms) >+ { >+ return mVar_gl_MaxComputeImageUniforms; >+ } >+ break; >+ } >+ case 0x7ed77973u: >+ { >+ if (name == BuiltInName::gl_MaxComputeWorkGroupSize) >+ { >+ return mVar_gl_MaxComputeWorkGroupSize; >+ } >+ break; >+ } >+ case 0x7ed9ae57u: >+ { >+ if (name == BuiltInName::gl_MaxCombinedImageUniforms) >+ { >+ return mVar_gl_MaxCombinedImageUniforms; >+ } >+ break; >+ } >+ case 0x7ed9f437u: >+ { >+ if (name == BuiltInName::gl_MaxGeometryImageUniforms) >+ { >+ return mVar_gl_MaxGeometryImageUniforms; >+ } >+ break; >+ } >+ case 0x7edacc17u: >+ { >+ if (name == BuiltInName::gl_MaxAtomicCounterBindings) >+ { >+ return mVar_gl_MaxAtomicCounterBindings; >+ } >+ break; >+ } >+ case 0x7ede0db3u: >+ { >+ if (name == BuiltInName::gl_MaxComputeAtomicCounters) >+ { >+ return mVar_gl_MaxComputeAtomicCounters; >+ } >+ break; >+ } >+ case 0x7edeadeeu: >+ { >+ if (name == BuiltInName::gl_MaxComputeWorkGroupCount) >+ { >+ return mVar_gl_MaxComputeWorkGroupCount; >+ } >+ break; >+ } >+ case 0x7edf534au: >+ { >+ if (name == BuiltInName::gl_MaxFragmentImageUniforms) >+ { >+ return mVar_gl_MaxFragmentImageUniforms; >+ } >+ break; >+ } >+ case 0x7ee1b439u: >+ { >+ if (name == BuiltInName::gl_MaxGeometryOutputVertices) >+ { >+ return mVar_gl_MaxGeometryOutputVertices; >+ } >+ break; >+ } >+ case 0x7ee23dcau: >+ { >+ if (name == BuiltInName::gl_MaxFragmentAtomicCounters) >+ { >+ return mVar_gl_MaxFragmentAtomicCounters; >+ } >+ break; >+ } >+ case 0x7ee400c5u: >+ { >+ if (name == BuiltInName::gl_MaxCombinedAtomicCounters) >+ { >+ return mVar_gl_MaxCombinedAtomicCounters; >+ } >+ break; >+ } >+ case 0x7ee6d3cfu: >+ { >+ if (name == BuiltInName::gl_MaxGeometryAtomicCounters) >+ { >+ return mVar_gl_MaxGeometryAtomicCounters; >+ } >+ break; >+ } >+ case 0x7eec3ae1u: >+ { >+ if (name == BuiltInName::gl_MaxGeometryInputComponents) >+ { >+ return mVar_gl_MaxGeometryInputComponents; >+ } >+ break; >+ } >+ case 0x7eecdfadu: >+ { >+ if (name == BuiltInName::gl_MaxAtomicCounterBufferSize) >+ { >+ return mVar_gl_MaxAtomicCounterBufferSize; >+ } >+ break; >+ } >+ case 0x7ef00fc2u: >+ { >+ if (name == BuiltInName::gl_MaxComputeTextureImageUnits) >+ { >+ return mVar_gl_MaxComputeTextureImageUnits; >+ } >+ break; >+ } >+ case 0x7ef3740bu: >+ { >+ if (name == BuiltInName::gl_MaxComputeUniformComponents) >+ { >+ return mVar_gl_MaxComputeUniformComponents; >+ } >+ break; >+ } >+ case 0x7ef69ab4u: >+ { >+ if (name == BuiltInName::gl_MaxGeometryOutputComponents) >+ { >+ return mVar_gl_MaxGeometryOutputComponents; >+ } >+ break; >+ } >+ case 0x7ef9b17du: >+ { >+ if (name == BuiltInName::gl_MaxGeometryTextureImageUnits) >+ { >+ return mVar_gl_MaxGeometryTextureImageUnits; >+ } >+ break; >+ } >+ case 0x7efe1865u: >+ { >+ if (name == BuiltInName::gl_MaxGeometryUniformComponents) >+ { >+ return mVar_gl_MaxGeometryUniformComponents; >+ } >+ break; >+ } >+ case 0x7f008375u: >+ { >+ if (name == BuiltInName::gl_MaxVertexAtomicCounterBuffers) >+ { >+ return mVar_gl_MaxVertexAtomicCounterBuffers; >+ } >+ break; >+ } >+ case 0x7f0d626fu: >+ { >+ if (name == BuiltInName::gl_MaxComputeAtomicCounterBuffers) >+ { >+ return mVar_gl_MaxComputeAtomicCounterBuffers; >+ } >+ break; >+ } >+ case 0x7f11e359u: >+ { >+ if (name == BuiltInName::gl_MaxCombinedAtomicCounterBuffers) >+ { >+ return mVar_gl_MaxCombinedAtomicCounterBuffers; >+ } >+ break; >+ } >+ case 0x7f170f84u: >+ { >+ if (name == BuiltInName::gl_MaxGeometryAtomicCounterBuffers) >+ { >+ return mVar_gl_MaxGeometryAtomicCounterBuffers; >+ } >+ break; >+ } >+ case 0x7f17bd18u: >+ { >+ if (name == BuiltInName::gl_MaxFragmentAtomicCounterBuffers) >+ { >+ return mVar_gl_MaxFragmentAtomicCounterBuffers; >+ } >+ break; >+ } >+ case 0x7f1c60f8u: >+ { >+ if (name == BuiltInName::gl_MaxCombinedShaderOutputResources) >+ { >+ return mVar_gl_MaxCombinedShaderOutputResources; >+ } >+ break; >+ } >+ case 0x7f1cd073u: >+ { >+ if (name == BuiltInName::gl_MaxGeometryTotalOutputComponents) >+ { >+ return mVar_gl_MaxGeometryTotalOutputComponents; >+ } >+ break; >+ } >+ } >+ if (mShaderType == GL_COMPUTE_SHADER) >+ { >+ switch (nameHash) >+ { >+ case 0x0e41a660u: >+ { >+ if (name.beginsWith(BuiltInName::barrier)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_barrier_; >+ } >+ break; >+ } >+ case 0x249ee97cu: >+ { >+ if (name.beginsWith(BuiltInName::groupMemoryBarrier)) >+ { >+ ASSERT(name.length() == 19); >+ return &BuiltInFunction::kFunction_groupMemoryBarrier_; >+ } >+ break; >+ } >+ case 0x26a4d8e6u: >+ { >+ if (name.beginsWith(BuiltInName::memoryBarrierShared)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_memoryBarrierShared_; >+ } >+ break; >+ } >+ case 0x7e736b62u: >+ { >+ if (name == BuiltInName::gl_WorkGroupID) >+ { >+ return &BuiltInVariable::kVar_gl_WorkGroupID; >+ } >+ break; >+ } >+ case 0x7e808e8fu: >+ { >+ if (name == BuiltInName::gl_WorkGroupSize) >+ { >+ return &BuiltInVariable::kVar_gl_WorkGroupSize; >+ } >+ break; >+ } >+ case 0x7e82b146u: >+ { >+ if (name == BuiltInName::gl_NumWorkGroups) >+ { >+ return &BuiltInVariable::kVar_gl_NumWorkGroups; >+ } >+ break; >+ } >+ case 0x7ea251edu: >+ { >+ if (name == BuiltInName::gl_LocalInvocationID) >+ { >+ return &BuiltInVariable::kVar_gl_LocalInvocationID; >+ } >+ break; >+ } >+ case 0x7ead13a8u: >+ { >+ if (name == BuiltInName::gl_GlobalInvocationID) >+ { >+ return &BuiltInVariable::kVar_gl_GlobalInvocationID; >+ } >+ break; >+ } >+ case 0x7ebcd395u: >+ { >+ if (name == BuiltInName::gl_LocalInvocationIndex) >+ { >+ return &BuiltInVariable::kVar_gl_LocalInvocationIndex; >+ } >+ break; >+ } >+ } >+ } >+ if (mShaderType == GL_GEOMETRY_SHADER_EXT) >+ { >+ switch (nameHash) >+ { >+ case 0x145d55c9u: >+ { >+ if (name.beginsWith(BuiltInName::EmitVertex)) >+ { >+ ASSERT(name.length() == 11); >+ return &BuiltInFunction::kFunction_EmitVertex_; >+ } >+ break; >+ } >+ case 0x186fcde2u: >+ { >+ if (name.beginsWith(BuiltInName::EndPrimitive)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_EndPrimitive_; >+ } >+ break; >+ } >+ case 0x7e400f84u: >+ { >+ if (name == BuiltInName::gl_Layer) >+ { >+ return &BuiltInVariable::kVar_gl_LayerGS; >+ } >+ break; >+ } >+ case 0x7e580bc5u: >+ { >+ if (name == BuiltInName::gl_Position) >+ { >+ return mVar_gl_PositionGS; >+ } >+ break; >+ } >+ case 0x7e67167au: >+ { >+ if (name == BuiltInName::gl_PerVertex) >+ { >+ return mVar_gl_PerVertex; >+ } >+ break; >+ } >+ case 0x7e742076u: >+ { >+ if (name == BuiltInName::gl_PrimitiveID) >+ { >+ return &BuiltInVariable::kVar_gl_PrimitiveIDGS; >+ } >+ break; >+ } >+ case 0x7e7fe684u: >+ { >+ if (name == BuiltInName::gl_InvocationID) >+ { >+ return &BuiltInVariable::kVar_gl_InvocationID; >+ } >+ break; >+ } >+ case 0x7e865240u: >+ { >+ if (name == BuiltInName::gl_PrimitiveIDIn) >+ { >+ return &BuiltInVariable::kVar_gl_PrimitiveIDIn; >+ } >+ break; >+ } >+ } >+ } >+ if ((mShaderType == GL_FRAGMENT_SHADER) && (mResources.EXT_geometry_shader)) >+ { >+ switch (nameHash) >+ { >+ case 0x7e400f84u: >+ { >+ if (name == BuiltInName::gl_Layer) >+ { >+ return &BuiltInVariable::kVar_gl_Layer; >+ } >+ break; >+ } >+ case 0x7e742076u: >+ { >+ if (name == BuiltInName::gl_PrimitiveID) >+ { >+ return &BuiltInVariable::kVar_gl_PrimitiveID; >+ } >+ break; >+ } >+ } >+ } >+ } >+ if (shaderVersion >= 300) >+ { >+ switch (nameHash) >+ { >+ case 0x06309dbcu: >+ { >+ if (name.beginsWith(BuiltInName::abs)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_abs_0C; >+ } >+ break; >+ } >+ case 0x0631d85fu: >+ { >+ if (name.beginsWith(BuiltInName::abs)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_abs_3C; >+ } >+ break; >+ } >+ case 0x06370c70u: >+ { >+ if (name.beginsWith(BuiltInName::abs)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_abs_2C; >+ } >+ break; >+ } >+ case 0x06378eb0u: >+ { >+ if (name.beginsWith(BuiltInName::abs)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_abs_1C; >+ } >+ break; >+ } >+ case 0x06408ba2u: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_2D0D; >+ } >+ break; >+ } >+ case 0x0640f128u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_1C0C; >+ } >+ break; >+ } >+ case 0x06420bb0u: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_0D0D; >+ } >+ break; >+ } >+ case 0x064236d1u: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_2D2D; >+ } >+ break; >+ } >+ case 0x06425522u: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_3C0C; >+ } >+ break; >+ } >+ case 0x06425db3u: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_2C0C; >+ } >+ break; >+ } >+ case 0x06429550u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_2D2D; >+ } >+ break; >+ } >+ case 0x06429e9cu: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_2C0C; >+ } >+ break; >+ } >+ case 0x0642c869u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_3D3D; >+ } >+ break; >+ } >+ case 0x0642dbfeu: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_3C3C; >+ } >+ break; >+ } >+ case 0x064305b5u: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_3D3D; >+ } >+ break; >+ } >+ case 0x06436c9au: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_1D0D; >+ } >+ break; >+ } >+ case 0x0643ebd5u: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_3D0D; >+ } >+ break; >+ } >+ case 0x06441467u: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_2C2C; >+ } >+ break; >+ } >+ case 0x0644176eu: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_1C1C; >+ } >+ break; >+ } >+ case 0x06443b94u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_2D0D; >+ } >+ break; >+ } >+ case 0x06448798u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_3C3C; >+ } >+ break; >+ } >+ case 0x0644a6dfu: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_1D1D; >+ } >+ break; >+ } >+ case 0x0644cd73u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_2C2C; >+ } >+ break; >+ } >+ case 0x06450593u: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_1C0C; >+ } >+ break; >+ } >+ case 0x06452105u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_1D0D; >+ } >+ break; >+ } >+ case 0x06454045u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_0C0C; >+ } >+ break; >+ } >+ case 0x0645e25du: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_0C0C; >+ } >+ break; >+ } >+ case 0x06460349u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_1D1D; >+ } >+ break; >+ } >+ case 0x06472b16u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_3D0D; >+ } >+ break; >+ } >+ case 0x06473146u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_0D0D; >+ } >+ break; >+ } >+ case 0x06475b89u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_3C0C; >+ } >+ break; >+ } >+ case 0x0647bc75u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_1C1C; >+ } >+ break; >+ } >+ case 0x0654b2f8u: >+ { >+ if (name.beginsWith(BuiltInName::mix)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_mix_2B2B2E; >+ } >+ break; >+ } >+ case 0x0655a7e2u: >+ { >+ if (name == BuiltInName::mix_0B0B0E) >+ { >+ return &BuiltInFunction::kFunction_mix_0B0B0E; >+ } >+ break; >+ } >+ case 0x06567d08u: >+ { >+ if (name.beginsWith(BuiltInName::mix)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_mix_3B3B3E; >+ } >+ break; >+ } >+ case 0x0657f3adu: >+ { >+ if (name == BuiltInName::mix_1B1B1E) >+ { >+ return &BuiltInFunction::kFunction_mix_1B1B1E; >+ } >+ break; >+ } >+ case 0x0838025eu: >+ { >+ if (name.beginsWith(BuiltInName::tanh)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_tanh_3B; >+ } >+ break; >+ } >+ case 0x0838944cu: >+ { >+ if (name.beginsWith(BuiltInName::tanh)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_tanh_0B; >+ } >+ break; >+ } >+ case 0x08392747u: >+ { >+ if (name.beginsWith(BuiltInName::sinh)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sinh_2B; >+ } >+ break; >+ } >+ case 0x08398f4au: >+ { >+ if (name.beginsWith(BuiltInName::sinh)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sinh_1B; >+ } >+ break; >+ } >+ case 0x083991ddu: >+ { >+ if (name.beginsWith(BuiltInName::tanh)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_tanh_1B; >+ } >+ break; >+ } >+ case 0x083aa373u: >+ { >+ if (name.beginsWith(BuiltInName::sinh)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sinh_0B; >+ } >+ break; >+ } >+ case 0x083acb5eu: >+ { >+ if (name.beginsWith(BuiltInName::tanh)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_tanh_2B; >+ } >+ break; >+ } >+ case 0x083acbf5u: >+ { >+ if (name.beginsWith(BuiltInName::sign)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sign_1C; >+ } >+ break; >+ } >+ case 0x083b5c45u: >+ { >+ if (name.beginsWith(BuiltInName::cosh)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_cosh_0B; >+ } >+ break; >+ } >+ case 0x083bd9f8u: >+ { >+ if (name.beginsWith(BuiltInName::sinh)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sinh_3B; >+ } >+ break; >+ } >+ case 0x083c1656u: >+ { >+ if (name.beginsWith(BuiltInName::sign)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sign_2C; >+ } >+ break; >+ } >+ case 0x083c57c4u: >+ { >+ if (name.beginsWith(BuiltInName::cosh)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_cosh_1B; >+ } >+ break; >+ } >+ case 0x083d503bu: >+ { >+ if (name.beginsWith(BuiltInName::sign)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sign_3C; >+ } >+ break; >+ } >+ case 0x083d8227u: >+ { >+ if (name.beginsWith(BuiltInName::cosh)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_cosh_2B; >+ } >+ break; >+ } >+ case 0x083dd369u: >+ { >+ if (name.beginsWith(BuiltInName::sign)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sign_0C; >+ } >+ break; >+ } >+ case 0x083ed2deu: >+ { >+ if (name.beginsWith(BuiltInName::cosh)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_cosh_3B; >+ } >+ break; >+ } >+ case 0x084807e9u: >+ { >+ if (name.beginsWith(BuiltInName::modf)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_modf_3B3B; >+ } >+ break; >+ } >+ case 0x084a908au: >+ { >+ if (name.beginsWith(BuiltInName::modf)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_modf_1B1B; >+ } >+ break; >+ } >+ case 0x084bf445u: >+ { >+ if (name.beginsWith(BuiltInName::modf)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_modf_0B0B; >+ } >+ break; >+ } >+ case 0x084fa835u: >+ { >+ if (name.beginsWith(BuiltInName::modf)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_modf_2B2B; >+ } >+ break; >+ } >+ case 0x0a400148u: >+ { >+ if (name.beginsWith(BuiltInName::asinh)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_asinh_2B; >+ } >+ break; >+ } >+ case 0x0a406460u: >+ { >+ if (name.beginsWith(BuiltInName::isnan)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_isnan_2B; >+ } >+ break; >+ } >+ case 0x0a407c52u: >+ { >+ if (name.beginsWith(BuiltInName::round)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_round_0B; >+ } >+ break; >+ } >+ case 0x0a412446u: >+ { >+ if (name.beginsWith(BuiltInName::trunc)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_trunc_0B; >+ } >+ break; >+ } >+ case 0x0a4125d1u: >+ { >+ if (name.beginsWith(BuiltInName::asinh)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_asinh_3B; >+ } >+ break; >+ } >+ case 0x0a4189d9u: >+ { >+ if (name.beginsWith(BuiltInName::round)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_round_3B; >+ } >+ break; >+ } >+ case 0x0a41bc4bu: >+ { >+ if (name.beginsWith(BuiltInName::trunc)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_trunc_3B; >+ } >+ break; >+ } >+ case 0x0a4262ceu: >+ { >+ if (name.beginsWith(BuiltInName::isinf)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_isinf_2B; >+ } >+ break; >+ } >+ case 0x0a42b872u: >+ { >+ if (name.beginsWith(BuiltInName::trunc)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_trunc_2B; >+ } >+ break; >+ } >+ case 0x0a430643u: >+ { >+ if (name.beginsWith(BuiltInName::atanh)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_atanh_2B; >+ } >+ break; >+ } >+ case 0x0a43b397u: >+ { >+ if (name.beginsWith(BuiltInName::isinf)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_isinf_3B; >+ } >+ break; >+ } >+ case 0x0a43edf9u: >+ { >+ if (name.beginsWith(BuiltInName::trunc)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_trunc_1B; >+ } >+ break; >+ } >+ case 0x0a4431a8u: >+ { >+ if (name.beginsWith(BuiltInName::atanh)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_atanh_1B; >+ } >+ break; >+ } >+ case 0x0a443a26u: >+ { >+ if (name.beginsWith(BuiltInName::isinf)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_isinf_0B; >+ } >+ break; >+ } >+ case 0x0a44ad91u: >+ { >+ if (name.beginsWith(BuiltInName::acosh)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_acosh_1B; >+ } >+ break; >+ } >+ case 0x0a452617u: >+ { >+ if (name.beginsWith(BuiltInName::isinf)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_isinf_1B; >+ } >+ break; >+ } >+ case 0x0a4561b0u: >+ { >+ if (name.beginsWith(BuiltInName::isnan)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_isnan_3B; >+ } >+ break; >+ } >+ case 0x0a4582c9u: >+ { >+ if (name.beginsWith(BuiltInName::atanh)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_atanh_0B; >+ } >+ break; >+ } >+ case 0x0a45fcfdu: >+ { >+ if (name.beginsWith(BuiltInName::atanh)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_atanh_3B; >+ } >+ break; >+ } >+ case 0x0a461d10u: >+ { >+ if (name.beginsWith(BuiltInName::acosh)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_acosh_0B; >+ } >+ break; >+ } >+ case 0x0a464ad3u: >+ { >+ if (name.beginsWith(BuiltInName::asinh)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_asinh_0B; >+ } >+ break; >+ } >+ case 0x0a46778au: >+ { >+ if (name.beginsWith(BuiltInName::acosh)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_acosh_3B; >+ } >+ break; >+ } >+ case 0x0a46ab3bu: >+ { >+ if (name.beginsWith(BuiltInName::isnan)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_isnan_0B; >+ } >+ break; >+ } >+ case 0x0a46f2d2u: >+ { >+ if (name.beginsWith(BuiltInName::round)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_round_2B; >+ } >+ break; >+ } >+ case 0x0a4758c8u: >+ { >+ if (name.beginsWith(BuiltInName::round)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_round_1B; >+ } >+ break; >+ } >+ case 0x0a478c93u: >+ { >+ if (name.beginsWith(BuiltInName::acosh)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_acosh_2B; >+ } >+ break; >+ } >+ case 0x0a47bb52u: >+ { >+ if (name.beginsWith(BuiltInName::asinh)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_asinh_1B; >+ } >+ break; >+ } >+ case 0x0a47fa7au: >+ { >+ if (name.beginsWith(BuiltInName::isnan)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_isnan_1B; >+ } >+ break; >+ } >+ case 0x0a524bc4u: >+ { >+ if (name.beginsWith(BuiltInName::equal)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_equal_2D2D; >+ } >+ break; >+ } >+ case 0x0a5613e7u: >+ { >+ if (name.beginsWith(BuiltInName::equal)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_equal_1D1D; >+ } >+ break; >+ } >+ case 0x0a56ba24u: >+ { >+ if (name.beginsWith(BuiltInName::equal)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_equal_3D3D; >+ } >+ break; >+ } >+ case 0x0a601dd8u: >+ { >+ if (name == BuiltInName::clamp_2C2C2C) >+ { >+ return &BuiltInFunction::kFunction_clamp_2C2C2C; >+ } >+ break; >+ } >+ case 0x0a60570du: >+ { >+ if (name.beginsWith(BuiltInName::clamp)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_clamp_1D0D0D; >+ } >+ break; >+ } >+ case 0x0a60d0c5u: >+ { >+ if (name == BuiltInName::clamp_1C0C0C) >+ { >+ return &BuiltInFunction::kFunction_clamp_1C0C0C; >+ } >+ break; >+ } >+ case 0x0a621a2bu: >+ { >+ if (name.beginsWith(BuiltInName::clamp)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_clamp_0C0C0C; >+ } >+ break; >+ } >+ case 0x0a623042u: >+ { >+ if (name.beginsWith(BuiltInName::clamp)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_clamp_2D0D0D; >+ } >+ break; >+ } >+ case 0x0a624f01u: >+ { >+ if (name == BuiltInName::clamp_3C0C0C) >+ { >+ return &BuiltInFunction::kFunction_clamp_3C0C0C; >+ } >+ break; >+ } >+ case 0x0a62ab50u: >+ { >+ if (name == BuiltInName::clamp_1C1C1C) >+ { >+ return &BuiltInFunction::kFunction_clamp_1C1C1C; >+ } >+ break; >+ } >+ case 0x0a631d0bu: >+ { >+ if (name == BuiltInName::clamp_1D1D1D) >+ { >+ return &BuiltInFunction::kFunction_clamp_1D1D1D; >+ } >+ break; >+ } >+ case 0x0a64f567u: >+ { >+ if (name.beginsWith(BuiltInName::clamp)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_clamp_2D2D2D; >+ } >+ break; >+ } >+ case 0x0a656274u: >+ { >+ if (name.beginsWith(BuiltInName::clamp)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_clamp_3C3C3C; >+ } >+ break; >+ } >+ case 0x0a65a625u: >+ { >+ if (name == BuiltInName::clamp_3D0D0D) >+ { >+ return &BuiltInFunction::kFunction_clamp_3D0D0D; >+ } >+ break; >+ } >+ case 0x0a660047u: >+ { >+ if (name.beginsWith(BuiltInName::clamp)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_clamp_2C0C0C; >+ } >+ break; >+ } >+ case 0x0a660f60u: >+ { >+ if (name == BuiltInName::clamp_0D0D0D) >+ { >+ return &BuiltInFunction::kFunction_clamp_0D0D0D; >+ } >+ break; >+ } >+ case 0x0a674065u: >+ { >+ if (name.beginsWith(BuiltInName::clamp)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_clamp_3D3D3D; >+ } >+ break; >+ } >+ case 0x0e503084u: >+ { >+ if (name.beginsWith(BuiltInName::inverse)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_inverse_5B; >+ } >+ break; >+ } >+ case 0x0e507cbdu: >+ { >+ if (name.beginsWith(BuiltInName::inverse)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_inverse_AB; >+ } >+ break; >+ } >+ case 0x0e50cc43u: >+ { >+ if (name.beginsWith(BuiltInName::inverse)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_inverse_FB; >+ } >+ break; >+ } >+ case 0x0e600d82u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0c2B; >+ } >+ break; >+ } >+ case 0x0e60445cu: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0S2B; >+ } >+ break; >+ } >+ case 0x0e6044aeu: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0e3B; >+ } >+ break; >+ } >+ case 0x0e60bb56u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0Q1B; >+ } >+ break; >+ } >+ case 0x0e61222eu: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0K2B; >+ } >+ break; >+ } >+ case 0x0e61e49du: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0Z2B; >+ } >+ break; >+ } >+ case 0x0e625169u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0I2B; >+ } >+ break; >+ } >+ case 0x0e62790eu: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0T2B; >+ } >+ break; >+ } >+ case 0x0e63b9efu: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0M1B; >+ } >+ break; >+ } >+ case 0x0e6470f1u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0J2B; >+ } >+ break; >+ } >+ case 0x0e64854cu: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0X2B; >+ } >+ break; >+ } >+ case 0x0e64ec86u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0W1B; >+ } >+ break; >+ } >+ case 0x0e65ea73u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0H1B; >+ } >+ break; >+ } >+ case 0x0e661665u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0L1B; >+ } >+ break; >+ } >+ case 0x0e663be3u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0N1B; >+ } >+ break; >+ } >+ case 0x0e67665bu: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0d3B; >+ } >+ break; >+ } >+ case 0x0e67a979u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0R2B; >+ } >+ break; >+ } >+ case 0x0e67dce5u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_texture_0Y2B; >+ } >+ break; >+ } >+ case 0x106843efu: >+ { >+ if (name.beginsWith(BuiltInName::lessThan)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_lessThan_3D3D; >+ } >+ break; >+ } >+ case 0x10697de8u: >+ { >+ if (name.beginsWith(BuiltInName::lessThan)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_lessThan_2D2D; >+ } >+ break; >+ } >+ case 0x106ad530u: >+ { >+ if (name.beginsWith(BuiltInName::notEqual)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_notEqual_1D1D; >+ } >+ break; >+ } >+ case 0x106d7bd6u: >+ { >+ if (name.beginsWith(BuiltInName::lessThan)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_lessThan_1D1D; >+ } >+ break; >+ } >+ case 0x106e2903u: >+ { >+ if (name.beginsWith(BuiltInName::notEqual)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_notEqual_3D3D; >+ } >+ break; >+ } >+ case 0x106e7a45u: >+ { >+ if (name.beginsWith(BuiltInName::notEqual)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_notEqual_2D2D; >+ } >+ break; >+ } >+ case 0x12601c9du: >+ { >+ if (name.beginsWith(BuiltInName::roundEven)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_roundEven_3B; >+ } >+ break; >+ } >+ case 0x12602fd7u: >+ { >+ if (name.beginsWith(BuiltInName::transpose)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_transpose_AB; >+ } >+ break; >+ } >+ case 0x12614fd4u: >+ { >+ if (name.beginsWith(BuiltInName::roundEven)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_roundEven_2B; >+ } >+ break; >+ } >+ case 0x1264f5e4u: >+ { >+ if (name.beginsWith(BuiltInName::transpose)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_transpose_EB; >+ } >+ break; >+ } >+ case 0x12650771u: >+ { >+ if (name.beginsWith(BuiltInName::transpose)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_transpose_6B; >+ } >+ break; >+ } >+ case 0x12655b22u: >+ { >+ if (name.beginsWith(BuiltInName::transpose)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_transpose_BB; >+ } >+ break; >+ } >+ case 0x12658f24u: >+ { >+ if (name.beginsWith(BuiltInName::transpose)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_transpose_9B; >+ } >+ break; >+ } >+ case 0x1265cf4cu: >+ { >+ if (name.beginsWith(BuiltInName::roundEven)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_roundEven_1B; >+ } >+ break; >+ } >+ case 0x12661b07u: >+ { >+ if (name.beginsWith(BuiltInName::transpose)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_transpose_FB; >+ } >+ break; >+ } >+ case 0x12665430u: >+ { >+ if (name.beginsWith(BuiltInName::transpose)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_transpose_7B; >+ } >+ break; >+ } >+ case 0x1266c2deu: >+ { >+ if (name.beginsWith(BuiltInName::roundEven)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_roundEven_0B; >+ } >+ break; >+ } >+ case 0x1267db60u: >+ { >+ if (name.beginsWith(BuiltInName::transpose)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_transpose_5B; >+ } >+ break; >+ } >+ case 0x1267de6cu: >+ { >+ if (name.beginsWith(BuiltInName::transpose)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_transpose_DB; >+ } >+ break; >+ } >+ case 0x1273f9dbu: >+ { >+ if (name.beginsWith(BuiltInName::yuv_2_rgb)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_yuv_2_rgb_2B0G; >+ } >+ break; >+ } >+ case 0x127589a7u: >+ { >+ if (name.beginsWith(BuiltInName::rgb_2_yuv)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_rgb_2_yuv_2B0G; >+ } >+ break; >+ } >+ case 0x14882ba7u: >+ { >+ if (name.beginsWith(BuiltInName::textureLod)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_textureLod_0X2B0B; >+ } >+ break; >+ } >+ case 0x14885983u: >+ { >+ if (name.beginsWith(BuiltInName::texelFetch)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_texelFetch_0R2C0C; >+ } >+ break; >+ } >+ case 0x14885e67u: >+ { >+ if (name == BuiltInName::texelFetch_0Z2C0C) >+ { >+ return &BuiltInFunction::kFunction_texelFetch_0Z2C0C; >+ } >+ break; >+ } >+ case 0x1488a5bfu: >+ { >+ if (name == BuiltInName::textureLod_0W1B0B) >+ { >+ return &BuiltInFunction::kFunction_textureLod_0W1B0B; >+ } >+ break; >+ } >+ case 0x14896e41u: >+ { >+ if (name == BuiltInName::texelFetchExt_0O1C0C) >+ { >+ return &BuiltInFunction::kFunction_texelFetchExt_0O1C0C; >+ } >+ break; >+ } >+ case 0x1489e510u: >+ { >+ if (name.beginsWith(BuiltInName::textureLod)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_textureLod_0T2B0B; >+ } >+ break; >+ } >+ case 0x148a14a7u: >+ { >+ if (name.beginsWith(BuiltInName::texelFetch)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_texelFetch_0M1C0C; >+ } >+ break; >+ } >+ case 0x148a66beu: >+ { >+ if (name == BuiltInName::textureLod_0S2B0B) >+ { >+ return &BuiltInFunction::kFunction_textureLod_0S2B0B; >+ } >+ break; >+ } >+ case 0x148a95e7u: >+ { >+ if (name.beginsWith(BuiltInName::textureLod)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_textureLod_0c2B0B; >+ } >+ break; >+ } >+ case 0x148b00dbu: >+ { >+ if (name == BuiltInName::textureLod_0J2B0B) >+ { >+ return &BuiltInFunction::kFunction_textureLod_0J2B0B; >+ } >+ break; >+ } >+ case 0x148b33b6u: >+ { >+ if (name.beginsWith(BuiltInName::textureLod)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_textureLod_0H1B0B; >+ } >+ break; >+ } >+ case 0x148bab65u: >+ { >+ if (name == BuiltInName::texelFetch_0I2C0C) >+ { >+ return &BuiltInFunction::kFunction_texelFetch_0I2C0C; >+ } >+ break; >+ } >+ case 0x148cccafu: >+ { >+ if (name.beginsWith(BuiltInName::textureLod)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_textureLod_0R2B0B; >+ } >+ break; >+ } >+ case 0x148d0a7bu: >+ { >+ if (name == BuiltInName::texelFetch_0K2C0C) >+ { >+ return &BuiltInFunction::kFunction_texelFetch_0K2C0C; >+ } >+ break; >+ } >+ case 0x148d335cu: >+ { >+ if (name.beginsWith(BuiltInName::textureLod)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_textureLod_0I2B0B; >+ } >+ break; >+ } >+ case 0x148ddb10u: >+ { >+ if (name.beginsWith(BuiltInName::texelFetchExt)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_texelFetchExt_0a1C0C; >+ } >+ break; >+ } >+ case 0x148e100eu: >+ { >+ if (name == BuiltInName::texelFetch_0X2C0C) >+ { >+ return &BuiltInFunction::kFunction_texelFetch_0X2C0C; >+ } >+ break; >+ } >+ case 0x148e44d3u: >+ { >+ if (name == BuiltInName::textureLod_0Y2B0B) >+ { >+ return &BuiltInFunction::kFunction_textureLod_0Y2B0B; >+ } >+ break; >+ } >+ case 0x148e5d86u: >+ { >+ if (name == BuiltInName::texelFetch_0Q1C0C) >+ { >+ return &BuiltInFunction::kFunction_texelFetch_0Q1C0C; >+ } >+ break; >+ } >+ case 0x148e6d96u: >+ { >+ if (name.beginsWith(BuiltInName::texelFetch)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_texelFetch_0W1C0C; >+ } >+ break; >+ } >+ case 0x148ed16fu: >+ { >+ if (name.beginsWith(BuiltInName::texelFetchExt)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_texelFetchExt_0U1C0C; >+ } >+ break; >+ } >+ case 0x148ed87fu: >+ { >+ if (name.beginsWith(BuiltInName::textureLod)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_textureLod_0K2B0B; >+ } >+ break; >+ } >+ case 0x148eff58u: >+ { >+ if (name == BuiltInName::texelFetch_0L1C0C) >+ { >+ return &BuiltInFunction::kFunction_texelFetch_0L1C0C; >+ } >+ break; >+ } >+ case 0x148fa8bbu: >+ { >+ if (name == BuiltInName::textureLod_0Q1B0B) >+ { >+ return &BuiltInFunction::kFunction_textureLod_0Q1B0B; >+ } >+ break; >+ } >+ case 0x148fb13cu: >+ { >+ if (name == BuiltInName::texelFetch_0T2C0C) >+ { >+ return &BuiltInFunction::kFunction_texelFetch_0T2C0C; >+ } >+ break; >+ } >+ case 0x148fd5b6u: >+ { >+ if (name == BuiltInName::texelFetch_0H1C0C) >+ { >+ return &BuiltInFunction::kFunction_texelFetch_0H1C0C; >+ } >+ break; >+ } >+ case 0x148fe911u: >+ { >+ if (name == BuiltInName::textureLod_0Z2B0B) >+ { >+ return &BuiltInFunction::kFunction_textureLod_0Z2B0B; >+ } >+ break; >+ } >+ case 0x167394d8u: >+ { >+ if (name.beginsWith(BuiltInName::textureSizeExt)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_textureSizeExt_0U; >+ } >+ break; >+ } >+ case 0x1673f496u: >+ { >+ if (name.beginsWith(BuiltInName::textureSizeExt)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_textureSizeExt_0O; >+ } >+ break; >+ } >+ case 0x1674ed12u: >+ { >+ if (name.beginsWith(BuiltInName::determinant)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_determinant_FB; >+ } >+ break; >+ } >+ case 0x16752ab6u: >+ { >+ if (name.beginsWith(BuiltInName::textureSizeExt)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_textureSizeExt_0a; >+ } >+ break; >+ } >+ case 0x1676ad75u: >+ { >+ if (name.beginsWith(BuiltInName::determinant)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_determinant_5B; >+ } >+ break; >+ } >+ case 0x167719ccu: >+ { >+ if (name.beginsWith(BuiltInName::determinant)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_determinant_AB; >+ } >+ break; >+ } >+ case 0x16803d05u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0I0C; >+ } >+ break; >+ } >+ case 0x168046b0u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0M0C; >+ } >+ break; >+ } >+ case 0x168093aau: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0T0C; >+ } >+ break; >+ } >+ case 0x168115fbu: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0e0C; >+ } >+ break; >+ } >+ case 0x16812c54u: >+ { >+ if (name.beginsWith(BuiltInName::greaterThan)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_greaterThan_3D3D; >+ } >+ break; >+ } >+ case 0x16812eeeu: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0W3B; >+ } >+ break; >+ } >+ case 0x168174f7u: >+ { >+ if (name.beginsWith(BuiltInName::greaterThan)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_greaterThan_1D1D; >+ } >+ break; >+ } >+ case 0x168178c7u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0H2B; >+ } >+ break; >+ } >+ case 0x1681d6b4u: >+ { >+ if (name.beginsWith(BuiltInName::greaterThan)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_greaterThan_2D2D; >+ } >+ break; >+ } >+ case 0x1681f153u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0J0C; >+ } >+ break; >+ } >+ case 0x168245a4u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0S0C; >+ } >+ break; >+ } >+ case 0x1682b6c4u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0X3B; >+ } >+ break; >+ } >+ case 0x1682d0c8u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0M2B; >+ } >+ break; >+ } >+ case 0x1682d660u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0Y0C; >+ } >+ break; >+ } >+ case 0x16838d15u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0L2B; >+ } >+ break; >+ } >+ case 0x1683ecb1u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0M3B; >+ } >+ break; >+ } >+ case 0x16840064u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0H3B; >+ } >+ break; >+ } >+ case 0x168434eeu: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0H0C; >+ } >+ break; >+ } >+ case 0x16845c90u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0L0C; >+ } >+ break; >+ } >+ case 0x16846c6cu: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0W0C; >+ } >+ break; >+ } >+ case 0x16849618u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0Z0C; >+ } >+ break; >+ } >+ case 0x1684f1b3u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0d0C; >+ } >+ break; >+ } >+ case 0x1685011eu: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0Q2B; >+ } >+ break; >+ } >+ case 0x1685b785u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0N3B; >+ } >+ break; >+ } >+ case 0x1685ca01u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0I3B; >+ } >+ break; >+ } >+ case 0x16860d28u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0Q3B; >+ } >+ break; >+ } >+ case 0x16861104u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0K0C; >+ } >+ break; >+ } >+ case 0x16863c73u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0R0C; >+ } >+ break; >+ } >+ case 0x16865716u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0L3B; >+ } >+ break; >+ } >+ case 0x16869d00u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0Q0C; >+ } >+ break; >+ } >+ case 0x1686a82au: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0X0C; >+ } >+ break; >+ } >+ case 0x1686aa87u: >+ { >+ if (name.beginsWith(BuiltInName::textureSize)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureSize_0c0C; >+ } >+ break; >+ } >+ case 0x1686cb94u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0N2B; >+ } >+ break; >+ } >+ case 0x16875a59u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0c3B; >+ } >+ break; >+ } >+ case 0x1687c54du: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0R3B; >+ } >+ break; >+ } >+ case 0x1687d107u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureProj_0W2B; >+ } >+ break; >+ } >+ case 0x16a00e04u: >+ { >+ if (name == BuiltInName::textureGrad_0I2B2B2B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0I2B2B2B; >+ } >+ break; >+ } >+ case 0x16a04ad9u: >+ { >+ if (name == BuiltInName::textureGrad_0X2B2B2B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0X2B2B2B; >+ } >+ break; >+ } >+ case 0x16a1478fu: >+ { >+ if (name == BuiltInName::textureGrad_0e3B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0e3B1B1B; >+ } >+ break; >+ } >+ case 0x16a19c8du: >+ { >+ if (name == BuiltInName::textureGrad_0H1B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0H1B1B1B; >+ } >+ break; >+ } >+ case 0x16a1ec87u: >+ { >+ if (name == BuiltInName::textureGrad_0J2B2B2B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0J2B2B2B; >+ } >+ break; >+ } >+ case 0x16a2ff3du: >+ { >+ if (name == BuiltInName::textureGrad_0Q1B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0Q1B1B1B; >+ } >+ break; >+ } >+ case 0x16a34692u: >+ { >+ if (name == BuiltInName::textureGrad_0R2B2B2B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0R2B2B2B; >+ } >+ break; >+ } >+ case 0x16a3a842u: >+ { >+ if (name == BuiltInName::textureGrad_0c2B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0c2B1B1B; >+ } >+ break; >+ } >+ case 0x16a3b8f6u: >+ { >+ if (name == BuiltInName::textureGrad_0Y2B2B2B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0Y2B2B2B; >+ } >+ break; >+ } >+ case 0x16a4a66cu: >+ { >+ if (name == BuiltInName::textureGrad_0W1B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0W1B1B1B; >+ } >+ break; >+ } >+ case 0x16a4e27cu: >+ { >+ if (name == BuiltInName::textureGrad_0d3B2B2B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0d3B2B2B; >+ } >+ break; >+ } >+ case 0x16a66883u: >+ { >+ if (name == BuiltInName::textureGrad_0T2B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0T2B1B1B; >+ } >+ break; >+ } >+ case 0x16a68a81u: >+ { >+ if (name == BuiltInName::textureGrad_0S2B2B2B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0S2B2B2B; >+ } >+ break; >+ } >+ case 0x16a6a742u: >+ { >+ if (name == BuiltInName::textureGrad_0Z2B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0Z2B1B1B; >+ } >+ break; >+ } >+ case 0x16a71104u: >+ { >+ if (name == BuiltInName::textureGrad_0K2B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureGrad_0K2B1B1B; >+ } >+ break; >+ } >+ case 0x187df788u: >+ { >+ if (name.beginsWith(BuiltInName::packHalf2x16)) >+ { >+ ASSERT(name.length() == 15); >+ return &BuiltInFunction::kFunction_packHalf2x16_1B; >+ } >+ break; >+ } >+ case 0x18887331u: >+ { >+ if (name.beginsWith(BuiltInName::outerProduct)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_outerProduct_2B3B; >+ } >+ break; >+ } >+ case 0x188880cbu: >+ { >+ if (name.beginsWith(BuiltInName::outerProduct)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_outerProduct_1B1B; >+ } >+ break; >+ } >+ case 0x1888c44du: >+ { >+ if (name.beginsWith(BuiltInName::outerProduct)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_outerProduct_3B2B; >+ } >+ break; >+ } >+ case 0x188916c3u: >+ { >+ if (name.beginsWith(BuiltInName::outerProduct)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_outerProduct_1B2B; >+ } >+ break; >+ } >+ case 0x188a12cau: >+ { >+ if (name.beginsWith(BuiltInName::outerProduct)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_outerProduct_1B3B; >+ } >+ break; >+ } >+ case 0x188db87au: >+ { >+ if (name.beginsWith(BuiltInName::outerProduct)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_outerProduct_2B2B; >+ } >+ break; >+ } >+ case 0x188e0232u: >+ { >+ if (name.beginsWith(BuiltInName::outerProduct)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_outerProduct_3B3B; >+ } >+ break; >+ } >+ case 0x188e2270u: >+ { >+ if (name.beginsWith(BuiltInName::outerProduct)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_outerProduct_2B1B; >+ } >+ break; >+ } >+ case 0x188f8feeu: >+ { >+ if (name.beginsWith(BuiltInName::outerProduct)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_outerProduct_3B1B; >+ } >+ break; >+ } >+ case 0x1a84fa77u: >+ { >+ if (name.beginsWith(BuiltInName::packSnorm2x16)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_packSnorm2x16_1B; >+ } >+ break; >+ } >+ case 0x1a873678u: >+ { >+ if (name.beginsWith(BuiltInName::packUnorm2x16)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_packUnorm2x16_1B; >+ } >+ break; >+ } >+ case 0x1a92589du: >+ { >+ if (name.beginsWith(BuiltInName::lessThanEqual)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_lessThanEqual_2D2D; >+ } >+ break; >+ } >+ case 0x1a95efdcu: >+ { >+ if (name.beginsWith(BuiltInName::lessThanEqual)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_lessThanEqual_1D1D; >+ } >+ break; >+ } >+ case 0x1a96ec62u: >+ { >+ if (name.beginsWith(BuiltInName::lessThanEqual)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_lessThanEqual_3D3D; >+ } >+ break; >+ } >+ case 0x1aa01270u: >+ { >+ if (name.beginsWith(BuiltInName::textureOffset)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureOffset_0Q1B1C; >+ } >+ break; >+ } >+ case 0x1aa05156u: >+ { >+ if (name.beginsWith(BuiltInName::textureOffset)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureOffset_0c2B1C; >+ } >+ break; >+ } >+ case 0x1aa11785u: >+ { >+ if (name.beginsWith(BuiltInName::textureOffset)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureOffset_0H1B1C; >+ } >+ break; >+ } >+ case 0x1aa26095u: >+ { >+ if (name.beginsWith(BuiltInName::textureOffset)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureOffset_0T2B1C; >+ } >+ break; >+ } >+ case 0x1aa31637u: >+ { >+ if (name == BuiltInName::textureOffset_0X2B2C) >+ { >+ return &BuiltInFunction::kFunction_textureOffset_0X2B2C; >+ } >+ break; >+ } >+ case 0x1aa385c2u: >+ { >+ if (name.beginsWith(BuiltInName::textureOffset)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureOffset_0Z2B1C; >+ } >+ break; >+ } >+ case 0x1aa41f4au: >+ { >+ if (name.beginsWith(BuiltInName::textureOffset)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureOffset_0K2B1C; >+ } >+ break; >+ } >+ case 0x1aa541b7u: >+ { >+ if (name.beginsWith(BuiltInName::textureOffset)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureOffset_0W1B1C; >+ } >+ break; >+ } >+ case 0x1aa64995u: >+ { >+ if (name.beginsWith(BuiltInName::textureOffset)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureOffset_0I2B2C; >+ } >+ break; >+ } >+ case 0x1aa7a781u: >+ { >+ if (name.beginsWith(BuiltInName::textureOffset)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_textureOffset_0R2B2C; >+ } >+ break; >+ } >+ case 0x1c887424u: >+ { >+ if (name.beginsWith(BuiltInName::intBitsToFloat)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_intBitsToFloat_2C; >+ } >+ break; >+ } >+ case 0x1c887f5eu: >+ { >+ if (name.beginsWith(BuiltInName::floatBitsToInt)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_floatBitsToInt_2B; >+ } >+ break; >+ } >+ case 0x1c88f18cu: >+ { >+ if (name.beginsWith(BuiltInName::intBitsToFloat)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_intBitsToFloat_1C; >+ } >+ break; >+ } >+ case 0x1c89b11cu: >+ { >+ if (name.beginsWith(BuiltInName::floatBitsToInt)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_floatBitsToInt_1B; >+ } >+ break; >+ } >+ case 0x1c89e261u: >+ { >+ if (name.beginsWith(BuiltInName::intBitsToFloat)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_intBitsToFloat_0C; >+ } >+ break; >+ } >+ case 0x1c8ae0a5u: >+ { >+ if (name.beginsWith(BuiltInName::floatBitsToInt)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_floatBitsToInt_0B; >+ } >+ break; >+ } >+ case 0x1c8b20dau: >+ { >+ if (name.beginsWith(BuiltInName::intBitsToFloat)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_intBitsToFloat_3C; >+ } >+ break; >+ } >+ case 0x1c8dd4e6u: >+ { >+ if (name.beginsWith(BuiltInName::unpackHalf2x16)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_unpackHalf2x16_0D; >+ } >+ break; >+ } >+ case 0x1c8f60afu: >+ { >+ if (name.beginsWith(BuiltInName::floatBitsToInt)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_floatBitsToInt_3B; >+ } >+ break; >+ } >+ case 0x1c9876e4u: >+ { >+ if (name.beginsWith(BuiltInName::matrixCompMult)) >+ { >+ ASSERT(name.length() == 19); >+ return &BuiltInFunction::kFunction_matrixCompMult_9B9B; >+ } >+ break; >+ } >+ case 0x1c99affcu: >+ { >+ if (name.beginsWith(BuiltInName::matrixCompMult)) >+ { >+ ASSERT(name.length() == 19); >+ return &BuiltInFunction::kFunction_matrixCompMult_7B7B; >+ } >+ break; >+ } >+ case 0x1c9c8697u: >+ { >+ if (name.beginsWith(BuiltInName::matrixCompMult)) >+ { >+ ASSERT(name.length() == 19); >+ return &BuiltInFunction::kFunction_matrixCompMult_6B6B; >+ } >+ break; >+ } >+ case 0x1c9ccd5au: >+ { >+ if (name.beginsWith(BuiltInName::matrixCompMult)) >+ { >+ ASSERT(name.length() == 19); >+ return &BuiltInFunction::kFunction_matrixCompMult_BBBB; >+ } >+ break; >+ } >+ case 0x1c9ea241u: >+ { >+ if (name.beginsWith(BuiltInName::matrixCompMult)) >+ { >+ ASSERT(name.length() == 19); >+ return &BuiltInFunction::kFunction_matrixCompMult_DBDB; >+ } >+ break; >+ } >+ case 0x1c9fa571u: >+ { >+ if (name.beginsWith(BuiltInName::matrixCompMult)) >+ { >+ ASSERT(name.length() == 19); >+ return &BuiltInFunction::kFunction_matrixCompMult_EBEB; >+ } >+ break; >+ } >+ case 0x1ca81af6u: >+ { >+ if (name.beginsWith(BuiltInName::textureProjLod)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_textureProjLod_0c3B0B; >+ } >+ break; >+ } >+ case 0x1ca85d55u: >+ { >+ if (name == BuiltInName::textureProjLod_0Q3B0B) >+ { >+ return &BuiltInFunction::kFunction_textureProjLod_0Q3B0B; >+ } >+ break; >+ } >+ case 0x1ca8c89au: >+ { >+ if (name == BuiltInName::textureProjLod_0H3B0B) >+ { >+ return &BuiltInFunction::kFunction_textureProjLod_0H3B0B; >+ } >+ break; >+ } >+ case 0x1ca9ff27u: >+ { >+ if (name.beginsWith(BuiltInName::textureProjLod)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_textureProjLod_0W2B0B; >+ } >+ break; >+ } >+ case 0x1caa108bu: >+ { >+ if (name.beginsWith(BuiltInName::textureProjLod)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_textureProjLod_0H2B0B; >+ } >+ break; >+ } >+ case 0x1caa957cu: >+ { >+ if (name == BuiltInName::textureProjLod_0Q2B0B) >+ { >+ return &BuiltInFunction::kFunction_textureProjLod_0Q2B0B; >+ } >+ break; >+ } >+ case 0x1cab3a35u: >+ { >+ if (name.beginsWith(BuiltInName::textureProjLod)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_textureProjLod_0W3B0B; >+ } >+ break; >+ } >+ case 0x1cadb5feu: >+ { >+ if (name.beginsWith(BuiltInName::textureProjLod)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_textureProjLod_0X3B0B; >+ } >+ break; >+ } >+ case 0x1cae6ef8u: >+ { >+ if (name.beginsWith(BuiltInName::textureProjLod)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_textureProjLod_0R3B0B; >+ } >+ break; >+ } >+ case 0x1caf96afu: >+ { >+ if (name == BuiltInName::textureProjLod_0I3B0B) >+ { >+ return &BuiltInFunction::kFunction_textureProjLod_0I3B0B; >+ } >+ break; >+ } >+ case 0x1e903284u: >+ { >+ if (name.beginsWith(BuiltInName::floatBitsToUint)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_floatBitsToUint_0B; >+ } >+ break; >+ } >+ case 0x1e92e353u: >+ { >+ if (name.beginsWith(BuiltInName::uintBitsToFloat)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_uintBitsToFloat_3D; >+ } >+ break; >+ } >+ case 0x1e93c13fu: >+ { >+ if (name.beginsWith(BuiltInName::uintBitsToFloat)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_uintBitsToFloat_0D; >+ } >+ break; >+ } >+ case 0x1e95201fu: >+ { >+ if (name.beginsWith(BuiltInName::floatBitsToUint)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_floatBitsToUint_1B; >+ } >+ break; >+ } >+ case 0x1e95511bu: >+ { >+ if (name.beginsWith(BuiltInName::unpackSnorm2x16)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_unpackSnorm2x16_0D; >+ } >+ break; >+ } >+ case 0x1e95582au: >+ { >+ if (name.beginsWith(BuiltInName::uintBitsToFloat)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_uintBitsToFloat_1D; >+ } >+ break; >+ } >+ case 0x1e95b0a7u: >+ { >+ if (name.beginsWith(BuiltInName::uintBitsToFloat)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_uintBitsToFloat_2D; >+ } >+ break; >+ } >+ case 0x1e966adcu: >+ { >+ if (name.beginsWith(BuiltInName::floatBitsToUint)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_floatBitsToUint_2B; >+ } >+ break; >+ } >+ case 0x1e9718ffu: >+ { >+ if (name.beginsWith(BuiltInName::unpackUnorm2x16)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_unpackUnorm2x16_0D; >+ } >+ break; >+ } >+ case 0x1e97a505u: >+ { >+ if (name.beginsWith(BuiltInName::floatBitsToUint)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_floatBitsToUint_3B; >+ } >+ break; >+ } >+ case 0x1ec1a98bu: >+ { >+ if (name == BuiltInName::textureProjGrad_0Q2B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureProjGrad_0Q2B1B1B; >+ } >+ break; >+ } >+ case 0x1ec2304bu: >+ { >+ if (name == BuiltInName::textureProjGrad_0X3B2B2B) >+ { >+ return &BuiltInFunction::kFunction_textureProjGrad_0X3B2B2B; >+ } >+ break; >+ } >+ case 0x1ec25826u: >+ { >+ if (name == BuiltInName::textureProjGrad_0W2B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureProjGrad_0W2B1B1B; >+ } >+ break; >+ } >+ case 0x1ec323fdu: >+ { >+ if (name == BuiltInName::textureProjGrad_0H3B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureProjGrad_0H3B1B1B; >+ } >+ break; >+ } >+ case 0x1ec3ee61u: >+ { >+ if (name == BuiltInName::textureProjGrad_0I3B2B2B) >+ { >+ return &BuiltInFunction::kFunction_textureProjGrad_0I3B2B2B; >+ } >+ break; >+ } >+ case 0x1ec578cfu: >+ { >+ if (name == BuiltInName::textureProjGrad_0R3B2B2B) >+ { >+ return &BuiltInFunction::kFunction_textureProjGrad_0R3B2B2B; >+ } >+ break; >+ } >+ case 0x1ec5ab9du: >+ { >+ if (name == BuiltInName::textureProjGrad_0H2B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureProjGrad_0H2B1B1B; >+ } >+ break; >+ } >+ case 0x1ec5fc9fu: >+ { >+ if (name == BuiltInName::textureProjGrad_0Q3B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureProjGrad_0Q3B1B1B; >+ } >+ break; >+ } >+ case 0x1ec67b05u: >+ { >+ if (name == BuiltInName::textureProjGrad_0W3B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureProjGrad_0W3B1B1B; >+ } >+ break; >+ } >+ case 0x1ec719d1u: >+ { >+ if (name == BuiltInName::textureProjGrad_0c3B1B1B) >+ { >+ return &BuiltInFunction::kFunction_textureProjGrad_0c3B1B1B; >+ } >+ break; >+ } >+ case 0x20a92dc6u: >+ { >+ if (name.beginsWith(BuiltInName::greaterThanEqual)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_greaterThanEqual_2D2D; >+ } >+ break; >+ } >+ case 0x20ae96edu: >+ { >+ if (name.beginsWith(BuiltInName::greaterThanEqual)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_greaterThanEqual_3D3D; >+ } >+ break; >+ } >+ case 0x20aedbacu: >+ { >+ if (name.beginsWith(BuiltInName::greaterThanEqual)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_greaterThanEqual_1D1D; >+ } >+ break; >+ } >+ case 0x20c8fa96u: >+ { >+ if (name == BuiltInName::texelFetchOffset_0I2C0C2C) >+ { >+ return &BuiltInFunction::kFunction_texelFetchOffset_0I2C0C2C; >+ } >+ break; >+ } >+ case 0x20c9733bu: >+ { >+ if (name == BuiltInName::textureLodOffset_0c2B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureLodOffset_0c2B0B1C; >+ } >+ break; >+ } >+ case 0x20c9a178u: >+ { >+ if (name == BuiltInName::texelFetchOffset_0X2C0C2C) >+ { >+ return &BuiltInFunction::kFunction_texelFetchOffset_0X2C0C2C; >+ } >+ break; >+ } >+ case 0x20ca4914u: >+ { >+ if (name == BuiltInName::textureLodOffset_0Z2B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureLodOffset_0Z2B0B1C; >+ } >+ break; >+ } >+ case 0x20cac068u: >+ { >+ if (name == BuiltInName::texelFetchOffset_0K2C0C1C) >+ { >+ return &BuiltInFunction::kFunction_texelFetchOffset_0K2C0C1C; >+ } >+ break; >+ } >+ case 0x20cb3102u: >+ { >+ if (name == BuiltInName::texelFetchOffset_0H1C0C1C) >+ { >+ return &BuiltInFunction::kFunction_texelFetchOffset_0H1C0C1C; >+ } >+ break; >+ } >+ case 0x20cb952du: >+ { >+ if (name == BuiltInName::texelFetchOffset_0Z2C0C1C) >+ { >+ return &BuiltInFunction::kFunction_texelFetchOffset_0Z2C0C1C; >+ } >+ break; >+ } >+ case 0x20cbf8d9u: >+ { >+ if (name == BuiltInName::texelFetchOffset_0W1C0C1C) >+ { >+ return &BuiltInFunction::kFunction_texelFetchOffset_0W1C0C1C; >+ } >+ break; >+ } >+ case 0x20cbfefau: >+ { >+ if (name == BuiltInName::texelFetchOffset_0R2C0C2C) >+ { >+ return &BuiltInFunction::kFunction_texelFetchOffset_0R2C0C2C; >+ } >+ break; >+ } >+ case 0x20cc1a52u: >+ { >+ if (name == BuiltInName::texelFetchOffset_0Q1C0C1C) >+ { >+ return &BuiltInFunction::kFunction_texelFetchOffset_0Q1C0C1C; >+ } >+ break; >+ } >+ case 0x20cc9477u: >+ { >+ if (name == BuiltInName::textureLodOffset_0H1B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureLodOffset_0H1B0B1C; >+ } >+ break; >+ } >+ case 0x20ccf3edu: >+ { >+ if (name == BuiltInName::textureLodOffset_0Q1B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureLodOffset_0Q1B0B1C; >+ } >+ break; >+ } >+ case 0x20cd0de3u: >+ { >+ if (name == BuiltInName::textureLodOffset_0K2B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureLodOffset_0K2B0B1C; >+ } >+ break; >+ } >+ case 0x20cd8d8du: >+ { >+ if (name == BuiltInName::textureLodOffset_0T2B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureLodOffset_0T2B0B1C; >+ } >+ break; >+ } >+ case 0x20cdc61au: >+ { >+ if (name == BuiltInName::textureLodOffset_0W1B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureLodOffset_0W1B0B1C; >+ } >+ break; >+ } >+ case 0x20cde370u: >+ { >+ if (name == BuiltInName::textureLodOffset_0X2B0B2C) >+ { >+ return &BuiltInFunction::kFunction_textureLodOffset_0X2B0B2C; >+ } >+ break; >+ } >+ case 0x20cde748u: >+ { >+ if (name == BuiltInName::textureLodOffset_0I2B0B2C) >+ { >+ return &BuiltInFunction::kFunction_textureLodOffset_0I2B0B2C; >+ } >+ break; >+ } >+ case 0x20ceb3dau: >+ { >+ if (name == BuiltInName::textureLodOffset_0R2B0B2C) >+ { >+ return &BuiltInFunction::kFunction_textureLodOffset_0R2B0B2C; >+ } >+ break; >+ } >+ case 0x20cfe609u: >+ { >+ if (name == BuiltInName::texelFetchOffset_0T2C0C1C) >+ { >+ return &BuiltInFunction::kFunction_texelFetchOffset_0T2C0C1C; >+ } >+ break; >+ } >+ case 0x22c03489u: >+ { >+ if (name.beginsWith(BuiltInName::textureProjOffset)) >+ { >+ ASSERT(name.length() == 24); >+ return &BuiltInFunction::kFunction_textureProjOffset_0W2B1C; >+ } >+ break; >+ } >+ case 0x22c0a359u: >+ { >+ if (name == BuiltInName::textureProjOffset_0H2B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0H2B1C; >+ } >+ break; >+ } >+ case 0x22c19992u: >+ { >+ if (name.beginsWith(BuiltInName::textureProjOffset)) >+ { >+ ASSERT(name.length() == 24); >+ return &BuiltInFunction::kFunction_textureProjOffset_0c3B1C; >+ } >+ break; >+ } >+ case 0x22c246a2u: >+ { >+ if (name == BuiltInName::textureProjOffset_0Q3B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0Q3B1C; >+ } >+ break; >+ } >+ case 0x22c29005u: >+ { >+ if (name == BuiltInName::textureProjOffset_0Q2B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0Q2B1C; >+ } >+ break; >+ } >+ case 0x22c2da46u: >+ { >+ if (name == BuiltInName::textureProjOffset_0H3B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0H3B1C; >+ } >+ break; >+ } >+ case 0x22c3e359u: >+ { >+ if (name == BuiltInName::textureProjOffset_0W3B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0W3B1C; >+ } >+ break; >+ } >+ case 0x22c43880u: >+ { >+ if (name.beginsWith(BuiltInName::textureProjOffset)) >+ { >+ ASSERT(name.length() == 24); >+ return &BuiltInFunction::kFunction_textureProjOffset_0R3B2C; >+ } >+ break; >+ } >+ case 0x22c458dcu: >+ { >+ if (name.beginsWith(BuiltInName::textureProjOffset)) >+ { >+ ASSERT(name.length() == 24); >+ return &BuiltInFunction::kFunction_textureProjOffset_0I3B2C; >+ } >+ break; >+ } >+ case 0x22c47909u: >+ { >+ if (name == BuiltInName::textureProjOffset_0X3B2C) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0X3B2C; >+ } >+ break; >+ } >+ case 0x22e0fe8cu: >+ { >+ if (name == BuiltInName::textureGradOffset_0W1B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureGradOffset_0W1B1B1B1C; >+ } >+ break; >+ } >+ case 0x22e165b8u: >+ { >+ if (name == BuiltInName::textureGradOffset_0K2B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureGradOffset_0K2B1B1B1C; >+ } >+ break; >+ } >+ case 0x22e28d80u: >+ { >+ if (name == BuiltInName::textureGradOffset_0T2B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureGradOffset_0T2B1B1B1C; >+ } >+ break; >+ } >+ case 0x22e3ab1cu: >+ { >+ if (name == BuiltInName::textureGradOffset_0e3B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureGradOffset_0e3B1B1B1C; >+ } >+ break; >+ } >+ case 0x22e3e9eau: >+ { >+ if (name == BuiltInName::textureGradOffset_0I2B2B2B2C) >+ { >+ return &BuiltInFunction::kFunction_textureGradOffset_0I2B2B2B2C; >+ } >+ break; >+ } >+ case 0x22e5bb38u: >+ { >+ if (name == BuiltInName::textureGradOffset_0R2B2B2B2C) >+ { >+ return &BuiltInFunction::kFunction_textureGradOffset_0R2B2B2B2C; >+ } >+ break; >+ } >+ case 0x22e5c876u: >+ { >+ if (name == BuiltInName::textureGradOffset_0Q1B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureGradOffset_0Q1B1B1B1C; >+ } >+ break; >+ } >+ case 0x22e61729u: >+ { >+ if (name == BuiltInName::textureGradOffset_0X2B2B2B2C) >+ { >+ return &BuiltInFunction::kFunction_textureGradOffset_0X2B2B2B2C; >+ } >+ break; >+ } >+ case 0x22e68293u: >+ { >+ if (name == BuiltInName::textureGradOffset_0Z2B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureGradOffset_0Z2B1B1B1C; >+ } >+ break; >+ } >+ case 0x22e71012u: >+ { >+ if (name == BuiltInName::textureGradOffset_0H1B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureGradOffset_0H1B1B1B1C; >+ } >+ break; >+ } >+ case 0x22e7429eu: >+ { >+ if (name == BuiltInName::textureGradOffset_0c2B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureGradOffset_0c2B1B1B1C; >+ } >+ break; >+ } >+ case 0x28e8b7d0u: >+ { >+ if (name == BuiltInName::textureProjLodOffset_0W3B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjLodOffset_0W3B0B1C; >+ } >+ break; >+ } >+ case 0x28e91d51u: >+ { >+ if (name == BuiltInName::textureProjLodOffset_0R3B0B2C) >+ { >+ return &BuiltInFunction::kFunction_textureProjLodOffset_0R3B0B2C; >+ } >+ break; >+ } >+ case 0x28e9a246u: >+ { >+ if (name == BuiltInName::textureProjLodOffset_0W2B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjLodOffset_0W2B0B1C; >+ } >+ break; >+ } >+ case 0x28eab462u: >+ { >+ if (name == BuiltInName::textureProjLodOffset_0H2B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjLodOffset_0H2B0B1C; >+ } >+ break; >+ } >+ case 0x28eb8605u: >+ { >+ if (name == BuiltInName::textureProjLodOffset_0I3B0B2C) >+ { >+ return &BuiltInFunction::kFunction_textureProjLodOffset_0I3B0B2C; >+ } >+ break; >+ } >+ case 0x28ebf99eu: >+ { >+ if (name == BuiltInName::textureProjLodOffset_0H3B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjLodOffset_0H3B0B1C; >+ } >+ break; >+ } >+ case 0x28ec29a7u: >+ { >+ if (name == BuiltInName::textureProjLodOffset_0Q3B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjLodOffset_0Q3B0B1C; >+ } >+ break; >+ } >+ case 0x28eecd92u: >+ { >+ if (name == BuiltInName::textureProjLodOffset_0X3B0B2C) >+ { >+ return &BuiltInFunction::kFunction_textureProjLodOffset_0X3B0B2C; >+ } >+ break; >+ } >+ case 0x28ef956cu: >+ { >+ if (name == BuiltInName::textureProjLodOffset_0Q2B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjLodOffset_0Q2B0B1C; >+ } >+ break; >+ } >+ case 0x28efb13bu: >+ { >+ if (name == BuiltInName::textureProjLodOffset_0c3B0B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjLodOffset_0c3B0B1C; >+ } >+ break; >+ } >+ case 0x2b00aacdu: >+ { >+ if (name == BuiltInName::textureProjGradOffset_0c3B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjGradOffset_0c3B1B1B1C; >+ } >+ break; >+ } >+ case 0x2b022418u: >+ { >+ if (name == BuiltInName::textureProjGradOffset_0H3B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjGradOffset_0H3B1B1B1C; >+ } >+ break; >+ } >+ case 0x2b0252ccu: >+ { >+ if (name == BuiltInName::textureProjGradOffset_0X3B2B2B2C) >+ { >+ return &BuiltInFunction::kFunction_textureProjGradOffset_0X3B2B2B2C; >+ } >+ break; >+ } >+ case 0x2b02af8fu: >+ { >+ if (name == BuiltInName::textureProjGradOffset_0I3B2B2B2C) >+ { >+ return &BuiltInFunction::kFunction_textureProjGradOffset_0I3B2B2B2C; >+ } >+ break; >+ } >+ case 0x2b03ccf9u: >+ { >+ if (name == BuiltInName::textureProjGradOffset_0Q2B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjGradOffset_0Q2B1B1B1C; >+ } >+ break; >+ } >+ case 0x2b03db51u: >+ { >+ if (name == BuiltInName::textureProjGradOffset_0W2B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjGradOffset_0W2B1B1B1C; >+ } >+ break; >+ } >+ case 0x2b047dfau: >+ { >+ if (name == BuiltInName::textureProjGradOffset_0R3B2B2B2C) >+ { >+ return &BuiltInFunction::kFunction_textureProjGradOffset_0R3B2B2B2C; >+ } >+ break; >+ } >+ case 0x2b06f874u: >+ { >+ if (name == BuiltInName::textureProjGradOffset_0Q3B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjGradOffset_0Q3B1B1B1C; >+ } >+ break; >+ } >+ case 0x2b077535u: >+ { >+ if (name == BuiltInName::textureProjGradOffset_0H2B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjGradOffset_0H2B1B1B1C; >+ } >+ break; >+ } >+ case 0x2b07f768u: >+ { >+ if (name == BuiltInName::textureProjGradOffset_0W3B1B1B1C) >+ { >+ return &BuiltInFunction::kFunction_textureProjGradOffset_0W3B1B1B1C; >+ } >+ break; >+ } >+ case 0x7ec10648u: >+ { >+ if (name == BuiltInName::gl_MaxProgramTexelOffset) >+ { >+ return mVar_gl_MaxProgramTexelOffset; >+ } >+ break; >+ } >+ case 0x7ec3c4d1u: >+ { >+ if (name == BuiltInName::gl_MinProgramTexelOffset) >+ { >+ return mVar_gl_MinProgramTexelOffset; >+ } >+ break; >+ } >+ case 0x7ec8d677u: >+ { >+ if (name == BuiltInName::gl_MaxVertexOutputVectors) >+ { >+ return mVar_gl_MaxVertexOutputVectors; >+ } >+ break; >+ } >+ case 0x7ed1aaebu: >+ { >+ if (name == BuiltInName::gl_MaxFragmentInputVectors) >+ { >+ return mVar_gl_MaxFragmentInputVectors; >+ } >+ break; >+ } >+ } >+ if (mShaderType == GL_FRAGMENT_SHADER) >+ { >+ switch (nameHash) >+ { >+ case 0x08394c88u: >+ { >+ if (name.beginsWith(BuiltInName::dFdy)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdy_0B; >+ } >+ break; >+ } >+ case 0x08398819u: >+ { >+ if (name.beginsWith(BuiltInName::dFdx)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdx_0B; >+ } >+ break; >+ } >+ case 0x083a7081u: >+ { >+ if (name.beginsWith(BuiltInName::dFdy)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdy_1B; >+ } >+ break; >+ } >+ case 0x083abe52u: >+ { >+ if (name.beginsWith(BuiltInName::dFdx)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdx_3B; >+ } >+ break; >+ } >+ case 0x083b9d7au: >+ { >+ if (name.beginsWith(BuiltInName::dFdy)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdy_2B; >+ } >+ break; >+ } >+ case 0x083c0d13u: >+ { >+ if (name.beginsWith(BuiltInName::dFdx)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdx_2B; >+ } >+ break; >+ } >+ case 0x083c6796u: >+ { >+ if (name.beginsWith(BuiltInName::dFdx)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdx_1B; >+ } >+ break; >+ } >+ case 0x083ced8bu: >+ { >+ if (name.beginsWith(BuiltInName::dFdy)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdy_3B; >+ } >+ break; >+ } >+ case 0x0c483e39u: >+ { >+ if (name.beginsWith(BuiltInName::fwidth)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_fwidth_1B; >+ } >+ break; >+ } >+ case 0x0c4d354eu: >+ { >+ if (name.beginsWith(BuiltInName::fwidth)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_fwidth_0B; >+ } >+ break; >+ } >+ case 0x0c4e7b0cu: >+ { >+ if (name.beginsWith(BuiltInName::fwidth)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_fwidth_3B; >+ } >+ break; >+ } >+ case 0x0c4fa8b5u: >+ { >+ if (name.beginsWith(BuiltInName::fwidth)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_fwidth_2B; >+ } >+ break; >+ } >+ case 0x0e7013d9u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture_0T2B0B; >+ } >+ break; >+ } >+ case 0x0e70d11du: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture_0W1B0B; >+ } >+ break; >+ } >+ case 0x0e70eff9u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture_0X2B0B; >+ } >+ break; >+ } >+ case 0x0e716d8fu: >+ { >+ if (name == BuiltInName::texture_0c2B0B) >+ { >+ return &BuiltInFunction::kFunction_texture_0c2B0B; >+ } >+ break; >+ } >+ case 0x0e71856cu: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture_0M1B0B; >+ } >+ break; >+ } >+ case 0x0e723219u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture_0L1B0B; >+ } >+ break; >+ } >+ case 0x0e734ff8u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture_0Z2B0B; >+ } >+ break; >+ } >+ case 0x0e7386b0u: >+ { >+ if (name == BuiltInName::texture_0Q1B0B) >+ { >+ return &BuiltInFunction::kFunction_texture_0Q1B0B; >+ } >+ break; >+ } >+ case 0x0e740087u: >+ { >+ if (name == BuiltInName::texture_0d3B0B) >+ { >+ return &BuiltInFunction::kFunction_texture_0d3B0B; >+ } >+ break; >+ } >+ case 0x0e742a66u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture_0K2B0B; >+ } >+ break; >+ } >+ case 0x0e75399eu: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture_0S2B0B; >+ } >+ break; >+ } >+ case 0x0e755c73u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture_0Y2B0B; >+ } >+ break; >+ } >+ case 0x0e75d15fu: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture_0J2B0B; >+ } >+ break; >+ } >+ case 0x0e76e7c1u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture_0H1B0B; >+ } >+ break; >+ } >+ case 0x0e7720c0u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture_0R2B0B; >+ } >+ break; >+ } >+ case 0x0e77d1c8u: >+ { >+ if (name.beginsWith(BuiltInName::texture)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture_0I2B0B; >+ } >+ break; >+ } >+ case 0x16900558u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureProj_0L3B0B; >+ } >+ break; >+ } >+ case 0x1690a3cfu: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureProj_0W3B0B; >+ } >+ break; >+ } >+ case 0x1690ae9fu: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureProj_0M3B0B; >+ } >+ break; >+ } >+ case 0x1691c2edu: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureProj_0M2B0B; >+ } >+ break; >+ } >+ case 0x16925badu: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureProj_0Q3B0B; >+ } >+ break; >+ } >+ case 0x1692d089u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureProj_0c3B0B; >+ } >+ break; >+ } >+ case 0x169350d8u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureProj_0I3B0B; >+ } >+ break; >+ } >+ case 0x16939955u: >+ { >+ if (name == BuiltInName::textureProj_0Q2B0B) >+ { >+ return &BuiltInFunction::kFunction_textureProj_0Q2B0B; >+ } >+ break; >+ } >+ case 0x1694622au: >+ { >+ if (name == BuiltInName::textureProj_0R3B0B) >+ { >+ return &BuiltInFunction::kFunction_textureProj_0R3B0B; >+ } >+ break; >+ } >+ case 0x169465e2u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureProj_0W2B0B; >+ } >+ break; >+ } >+ case 0x1695f573u: >+ { >+ if (name == BuiltInName::textureProj_0X3B0B) >+ { >+ return &BuiltInFunction::kFunction_textureProj_0X3B0B; >+ } >+ break; >+ } >+ case 0x16965fd9u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureProj_0H3B0B; >+ } >+ break; >+ } >+ case 0x1696f029u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureProj_0H2B0B; >+ } >+ break; >+ } >+ case 0x1697e9b9u: >+ { >+ if (name.beginsWith(BuiltInName::textureProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureProj_0L2B0B; >+ } >+ break; >+ } >+ case 0x1ab0a952u: >+ { >+ if (name == BuiltInName::textureOffset_0X2B2C0B) >+ { >+ return &BuiltInFunction::kFunction_textureOffset_0X2B2C0B; >+ } >+ break; >+ } >+ case 0x1ab29724u: >+ { >+ if (name == BuiltInName::textureOffset_0Z2B1C0B) >+ { >+ return &BuiltInFunction::kFunction_textureOffset_0Z2B1C0B; >+ } >+ break; >+ } >+ case 0x1ab55c9du: >+ { >+ if (name == BuiltInName::textureOffset_0Q1B1C0B) >+ { >+ return &BuiltInFunction::kFunction_textureOffset_0Q1B1C0B; >+ } >+ break; >+ } >+ case 0x1ab5753fu: >+ { >+ if (name == BuiltInName::textureOffset_0T2B1C0B) >+ { >+ return &BuiltInFunction::kFunction_textureOffset_0T2B1C0B; >+ } >+ break; >+ } >+ case 0x1ab57bbcu: >+ { >+ if (name == BuiltInName::textureOffset_0H1B1C0B) >+ { >+ return &BuiltInFunction::kFunction_textureOffset_0H1B1C0B; >+ } >+ break; >+ } >+ case 0x1ab59b6cu: >+ { >+ if (name == BuiltInName::textureOffset_0I2B2C0B) >+ { >+ return &BuiltInFunction::kFunction_textureOffset_0I2B2C0B; >+ } >+ break; >+ } >+ case 0x1ab5d795u: >+ { >+ if (name == BuiltInName::textureOffset_0W1B1C0B) >+ { >+ return &BuiltInFunction::kFunction_textureOffset_0W1B1C0B; >+ } >+ break; >+ } >+ case 0x1ab63ddau: >+ { >+ if (name == BuiltInName::textureOffset_0K2B1C0B) >+ { >+ return &BuiltInFunction::kFunction_textureOffset_0K2B1C0B; >+ } >+ break; >+ } >+ case 0x1ab63f72u: >+ { >+ if (name == BuiltInName::textureOffset_0R2B2C0B) >+ { >+ return &BuiltInFunction::kFunction_textureOffset_0R2B2C0B; >+ } >+ break; >+ } >+ case 0x1ab7e533u: >+ { >+ if (name == BuiltInName::textureOffset_0c2B1C0B) >+ { >+ return &BuiltInFunction::kFunction_textureOffset_0c2B1C0B; >+ } >+ break; >+ } >+ case 0x22d11d67u: >+ { >+ if (name == BuiltInName::textureProjOffset_0Q3B1C0B) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0Q3B1C0B; >+ } >+ break; >+ } >+ case 0x22d1425bu: >+ { >+ if (name == BuiltInName::textureProjOffset_0W2B1C0B) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0W2B1C0B; >+ } >+ break; >+ } >+ case 0x22d17100u: >+ { >+ if (name == BuiltInName::textureProjOffset_0W3B1C0B) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0W3B1C0B; >+ } >+ break; >+ } >+ case 0x22d1ca54u: >+ { >+ if (name == BuiltInName::textureProjOffset_0c3B1C0B) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0c3B1C0B; >+ } >+ break; >+ } >+ case 0x22d6074cu: >+ { >+ if (name == BuiltInName::textureProjOffset_0R3B2C0B) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0R3B2C0B; >+ } >+ break; >+ } >+ case 0x22d60cd3u: >+ { >+ if (name == BuiltInName::textureProjOffset_0X3B2C0B) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0X3B2C0B; >+ } >+ break; >+ } >+ case 0x22d60e91u: >+ { >+ if (name == BuiltInName::textureProjOffset_0Q2B1C0B) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0Q2B1C0B; >+ } >+ break; >+ } >+ case 0x22d62e81u: >+ { >+ if (name == BuiltInName::textureProjOffset_0H3B1C0B) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0H3B1C0B; >+ } >+ break; >+ } >+ case 0x22d6b2e8u: >+ { >+ if (name == BuiltInName::textureProjOffset_0I3B2C0B) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0I3B2C0B; >+ } >+ break; >+ } >+ case 0x22d6ee53u: >+ { >+ if (name == BuiltInName::textureProjOffset_0H2B1C0B) >+ { >+ return &BuiltInFunction::kFunction_textureProjOffset_0H2B1C0B; >+ } >+ break; >+ } >+ case 0x7e645c89u: >+ { >+ if (name == BuiltInName::gl_FragDepth) >+ { >+ return &BuiltInVariable::kVar_gl_FragDepth; >+ } >+ break; >+ } >+ } >+ } >+ if (mShaderType == GL_VERTEX_SHADER) >+ { >+ switch (nameHash) >+ { >+ case 0x7e5f8987u: >+ { >+ if (name == BuiltInName::gl_VertexID) >+ { >+ return &BuiltInVariable::kVar_gl_VertexID; >+ } >+ break; >+ } >+ case 0x7e6be47fu: >+ { >+ if (name == BuiltInName::gl_InstanceID) >+ { >+ return &BuiltInVariable::kVar_gl_InstanceID; >+ } >+ break; >+ } >+ } >+ } >+ if ((mShaderType == GL_VERTEX_SHADER) && (mResources.ANGLE_multi_draw)) >+ { >+ switch (nameHash) >+ { >+ case 0x7e4c3c42u: >+ { >+ if (name == BuiltInName::gl_DrawID) >+ { >+ return &BuiltInVariable::kVar_gl_DrawID; >+ } >+ break; >+ } >+ } >+ } >+ if (mResources.OVR_multiview2 && mShaderType != GL_COMPUTE_SHADER) >+ { >+ switch (nameHash) >+ { >+ case 0x7e6f6de9u: >+ { >+ if (name == BuiltInName::gl_ViewID_OVR) >+ { >+ return &BuiltInVariable::kVar_gl_ViewID_OVR; >+ } >+ break; >+ } >+ } >+ } >+ } >+ if (shaderVersion == 100) >+ { >+ switch (nameHash) >+ { >+ case 0x1271689cu: >+ { >+ if (name.beginsWith(BuiltInName::texture2D)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture2D_0H1B; >+ } >+ break; >+ } >+ case 0x127728cau: >+ { >+ if (name.beginsWith(BuiltInName::texture2D)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_texture2D_0L1B; >+ } >+ break; >+ } >+ case 0x1680927du: >+ { >+ if (name.beginsWith(BuiltInName::textureCube)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_textureCube_0J2B; >+ } >+ break; >+ } >+ case 0x1a902408u: >+ { >+ if (name.beginsWith(BuiltInName::texture2DRect)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_texture2DRect_0N1B; >+ } >+ break; >+ } >+ case 0x1a92969du: >+ { >+ if (name.beginsWith(BuiltInName::texture2DProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_texture2DProj_0L2B; >+ } >+ break; >+ } >+ case 0x1a9584eau: >+ { >+ if (name.beginsWith(BuiltInName::texture2DProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_texture2DProj_0L3B; >+ } >+ break; >+ } >+ case 0x1a95bcc7u: >+ { >+ if (name.beginsWith(BuiltInName::texture2DProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_texture2DProj_0H3B; >+ } >+ break; >+ } >+ case 0x1a96b8d6u: >+ { >+ if (name.beginsWith(BuiltInName::texture2DProj)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_texture2DProj_0H2B; >+ } >+ break; >+ } >+ case 0x20cb8d71u: >+ { >+ if (name == BuiltInName::texture2DGradEXT_0H1B1B1B) >+ { >+ return &BuiltInFunction::kFunction_texture2DGradEXT_0H1B1B1B; >+ } >+ break; >+ } >+ case 0x22b53a05u: >+ { >+ if (name.beginsWith(BuiltInName::texture2DRectProj)) >+ { >+ ASSERT(name.length() == 22); >+ return &BuiltInFunction::kFunction_texture2DRectProj_0N3B; >+ } >+ break; >+ } >+ case 0x22b65e05u: >+ { >+ if (name.beginsWith(BuiltInName::texture2DRectProj)) >+ { >+ ASSERT(name.length() == 22); >+ return &BuiltInFunction::kFunction_texture2DRectProj_0N2B; >+ } >+ break; >+ } >+ case 0x24dbd51eu: >+ { >+ if (name == BuiltInName::textureCubeGradEXT_0J2B2B2B) >+ { >+ return &BuiltInFunction::kFunction_textureCubeGradEXT_0J2B2B2B; >+ } >+ break; >+ } >+ case 0x28e995cbu: >+ { >+ if (name == BuiltInName::texture2DProjGradEXT_0H3B1B1B) >+ { >+ return &BuiltInFunction::kFunction_texture2DProjGradEXT_0H3B1B1B; >+ } >+ break; >+ } >+ case 0x28ed5178u: >+ { >+ if (name == BuiltInName::texture2DProjGradEXT_0H2B1B1B) >+ { >+ return &BuiltInFunction::kFunction_texture2DProjGradEXT_0H2B1B1B; >+ } >+ break; >+ } >+ case 0x7e5a0c08u: >+ { >+ if (name == BuiltInName::gl_FragData) >+ { >+ // Only initialized if shaderType == GL_FRAGMENT_SHADER >+ return mVar_gl_FragData; >+ } >+ break; >+ } >+ case 0x7e7c38efu: >+ { >+ if (name == BuiltInName::gl_FragDepthEXT) >+ { >+ // Only initialized if (shaderType == GL_FRAGMENT_SHADER) && >+ // (mResources.EXT_frag_depth) >+ return mVar_gl_FragDepthEXT; >+ } >+ break; >+ } >+ case 0x7ea6cdf6u: >+ { >+ if (name == BuiltInName::gl_MaxVaryingVectors) >+ { >+ return mVar_gl_MaxVaryingVectors; >+ } >+ break; >+ } >+ case 0x7ebce486u: >+ { >+ if (name == BuiltInName::gl_SecondaryFragDataEXT) >+ { >+ // Only initialized if (shaderType == GL_FRAGMENT_SHADER) && >+ // (mResources.EXT_blend_func_extended) >+ return mVar_gl_SecondaryFragDataEXT; >+ } >+ break; >+ } >+ } >+ if (mShaderType == GL_FRAGMENT_SHADER) >+ { >+ switch (nameHash) >+ { >+ case 0x08394c88u: >+ { >+ if (name.beginsWith(BuiltInName::dFdyExt)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdyExt_0B; >+ } >+ break; >+ } >+ case 0x08398819u: >+ { >+ if (name.beginsWith(BuiltInName::dFdxExt)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdxExt_0B; >+ } >+ break; >+ } >+ case 0x083a7081u: >+ { >+ if (name.beginsWith(BuiltInName::dFdyExt)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdyExt_1B; >+ } >+ break; >+ } >+ case 0x083abe52u: >+ { >+ if (name.beginsWith(BuiltInName::dFdxExt)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdxExt_3B; >+ } >+ break; >+ } >+ case 0x083b9d7au: >+ { >+ if (name.beginsWith(BuiltInName::dFdyExt)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdyExt_2B; >+ } >+ break; >+ } >+ case 0x083c0d13u: >+ { >+ if (name.beginsWith(BuiltInName::dFdxExt)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdxExt_2B; >+ } >+ break; >+ } >+ case 0x083c6796u: >+ { >+ if (name.beginsWith(BuiltInName::dFdxExt)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdxExt_1B; >+ } >+ break; >+ } >+ case 0x083ced8bu: >+ { >+ if (name.beginsWith(BuiltInName::dFdyExt)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_dFdyExt_3B; >+ } >+ break; >+ } >+ case 0x0c483e39u: >+ { >+ if (name.beginsWith(BuiltInName::fwidthExt)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_fwidthExt_1B; >+ } >+ break; >+ } >+ case 0x0c4d354eu: >+ { >+ if (name.beginsWith(BuiltInName::fwidthExt)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_fwidthExt_0B; >+ } >+ break; >+ } >+ case 0x0c4e7b0cu: >+ { >+ if (name.beginsWith(BuiltInName::fwidthExt)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_fwidthExt_3B; >+ } >+ break; >+ } >+ case 0x0c4fa8b5u: >+ { >+ if (name.beginsWith(BuiltInName::fwidthExt)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_fwidthExt_2B; >+ } >+ break; >+ } >+ case 0x12846ba6u: >+ { >+ if (name.beginsWith(BuiltInName::texture2D)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_texture2D_0H1B0B; >+ } >+ break; >+ } >+ case 0x1696a314u: >+ { >+ if (name.beginsWith(BuiltInName::textureCube)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_textureCube_0J2B0B; >+ } >+ break; >+ } >+ case 0x1aa197a7u: >+ { >+ if (name.beginsWith(BuiltInName::texture2DProj)) >+ { >+ ASSERT(name.length() == 20); >+ return &BuiltInFunction::kFunction_texture2DProj_0H3B0B; >+ } >+ break; >+ } >+ case 0x1aa44389u: >+ { >+ if (name == BuiltInName::texture2DProj_0H2B0B) >+ { >+ return &BuiltInFunction::kFunction_texture2DProj_0H2B0B; >+ } >+ break; >+ } >+ case 0x1eb43b6cu: >+ { >+ if (name == BuiltInName::texture2DLodEXT_0H1B0B) >+ { >+ return &BuiltInFunction::kFunction_texture2DLodEXT_0H1B0B; >+ } >+ break; >+ } >+ case 0x22c206a5u: >+ { >+ if (name.beginsWith(BuiltInName::textureCubeLodEXT)) >+ { >+ ASSERT(name.length() == 24); >+ return &BuiltInFunction::kFunction_textureCubeLodEXT_0J2B0B; >+ } >+ break; >+ } >+ case 0x26d1d3beu: >+ { >+ if (name.beginsWith(BuiltInName::texture2DProjLodEXT)) >+ { >+ ASSERT(name.length() == 26); >+ return &BuiltInFunction::kFunction_texture2DProjLodEXT_0H3B0B; >+ } >+ break; >+ } >+ case 0x26d60d82u: >+ { >+ if (name == BuiltInName::texture2DProjLodEXT_0H2B0B) >+ { >+ return &BuiltInFunction::kFunction_texture2DProjLodEXT_0H2B0B; >+ } >+ break; >+ } >+ case 0x7e60c438u: >+ { >+ if (name == BuiltInName::gl_FragColor) >+ { >+ return &BuiltInVariable::kVar_gl_FragColor; >+ } >+ break; >+ } >+ } >+ } >+ if (mShaderType == GL_VERTEX_SHADER) >+ { >+ switch (nameHash) >+ { >+ case 0x18986fc2u: >+ { >+ if (name == BuiltInName::texture2DLod_0H1B0B) >+ { >+ return &BuiltInFunction::kFunction_texture2DLod_0H1B0B; >+ } >+ break; >+ } >+ case 0x1cac1f4du: >+ { >+ if (name.beginsWith(BuiltInName::textureCubeLod)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_textureCubeLod_0J2B0B; >+ } >+ break; >+ } >+ case 0x20b8a0c3u: >+ { >+ if (name.beginsWith(BuiltInName::texture2DProjLod)) >+ { >+ ASSERT(name.length() == 23); >+ return &BuiltInFunction::kFunction_texture2DProjLod_0H3B0B; >+ } >+ break; >+ } >+ case 0x20bc6337u: >+ { >+ if (name == BuiltInName::texture2DProjLod_0H2B0B) >+ { >+ return &BuiltInFunction::kFunction_texture2DProjLod_0H2B0B; >+ } >+ break; >+ } >+ } >+ } >+ if ((mShaderType == GL_FRAGMENT_SHADER) && (mResources.EXT_blend_func_extended)) >+ { >+ switch (nameHash) >+ { >+ case 0x7ec56cbeu: >+ { >+ if (name == BuiltInName::gl_SecondaryFragColorEXT) >+ { >+ return &BuiltInVariable::kVar_gl_SecondaryFragColorEXT; >+ } >+ break; >+ } >+ } >+ } >+ if ((mShaderType == GL_FRAGMENT_SHADER) && (mResources.EXT_shader_framebuffer_fetch)) >+ { >+ switch (nameHash) >+ { >+ case 0x7e7970c2u: >+ { >+ if (name == BuiltInName::gl_LastFragData) >+ { >+ return mVar_gl_LastFragData; >+ } >+ break; >+ } >+ } >+ } >+ if ((mShaderType == GL_FRAGMENT_SHADER) && (mResources.NV_shader_framebuffer_fetch)) >+ { >+ switch (nameHash) >+ { >+ case 0x7e7970c2u: >+ { >+ if (name == BuiltInName::gl_LastFragData) >+ { >+ return mVar_gl_LastFragDataNV; >+ } >+ break; >+ } >+ case 0x7e802016u: >+ { >+ if (name == BuiltInName::gl_LastFragColor) >+ { >+ return &BuiltInVariable::kVar_gl_LastFragColor; >+ } >+ break; >+ } >+ } >+ } >+ if ((mShaderType == GL_FRAGMENT_SHADER) && >+ (!mResources.EXT_shader_framebuffer_fetch && !mResources.NV_shader_framebuffer_fetch && >+ mResources.ARM_shader_framebuffer_fetch)) >+ { >+ switch (nameHash) >+ { >+ case 0x7e9f0a88u: >+ { >+ if (name == BuiltInName::gl_LastFragColorARM) >+ { >+ return &BuiltInVariable::kVar_gl_LastFragColorARM; >+ } >+ break; >+ } >+ } >+ } >+ if ((mShaderType == GL_VERTEX_SHADER) && (mResources.ANGLE_multi_draw)) >+ { >+ switch (nameHash) >+ { >+ case 0x7e4c3c42u: >+ { >+ if (name == BuiltInName::gl_DrawID) >+ { >+ return &BuiltInVariable::kVar_gl_DrawIDESSL1; >+ } >+ break; >+ } >+ } >+ } >+ if (mResources.OVR_multiview2 && mShaderType != GL_COMPUTE_SHADER) >+ { >+ switch (nameHash) >+ { >+ case 0x7e6f6de9u: >+ { >+ if (name == BuiltInName::gl_ViewID_OVR) >+ { >+ return &BuiltInVariable::kVar_gl_ViewID_OVRESSL1; >+ } >+ break; >+ } >+ } >+ } >+ } >+ switch (nameHash) >+ { >+ case 0x063055e6u: >+ { >+ if (name.beginsWith(BuiltInName::log)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_log_0B; >+ } >+ break; >+ } >+ case 0x06307fbcu: >+ { >+ if (name.beginsWith(BuiltInName::all)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_all_1E; >+ } >+ break; >+ } >+ case 0x0630826fu: >+ { >+ if (name.beginsWith(BuiltInName::notFunc)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_notFunc_3E; >+ } >+ break; >+ } >+ case 0x0630942fu: >+ { >+ if (name.beginsWith(BuiltInName::abs)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_abs_0B; >+ } >+ break; >+ } >+ case 0x06309ccau: >+ { >+ if (name.beginsWith(BuiltInName::tan)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_tan_1B; >+ } >+ break; >+ } >+ case 0x0630bc6au: >+ { >+ if (name.beginsWith(BuiltInName::cos)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_cos_2B; >+ } >+ break; >+ } >+ case 0x0630dce3u: >+ { >+ if (name.beginsWith(BuiltInName::log)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_log_3B; >+ } >+ break; >+ } >+ case 0x063194bfu: >+ { >+ if (name.beginsWith(BuiltInName::any)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_any_1E; >+ } >+ break; >+ } >+ case 0x0631a1ccu: >+ { >+ if (name.beginsWith(BuiltInName::abs)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_abs_3B; >+ } >+ break; >+ } >+ case 0x0631d12au: >+ { >+ if (name.beginsWith(BuiltInName::log)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_log_2B; >+ } >+ break; >+ } >+ case 0x06320b8bu: >+ { >+ if (name.beginsWith(BuiltInName::cos)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_cos_3B; >+ } >+ break; >+ } >+ case 0x0632fcb3u: >+ { >+ if (name.beginsWith(BuiltInName::any)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_any_3E; >+ } >+ break; >+ } >+ case 0x06330b41u: >+ { >+ if (name.beginsWith(BuiltInName::log)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_log_1B; >+ } >+ break; >+ } >+ case 0x063314b1u: >+ { >+ if (name.beginsWith(BuiltInName::sin)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_sin_1B; >+ } >+ break; >+ } >+ case 0x063415e2u: >+ { >+ if (name.beginsWith(BuiltInName::any)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_any_2E; >+ } >+ break; >+ } >+ case 0x06344570u: >+ { >+ if (name.beginsWith(BuiltInName::sin)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_sin_0B; >+ } >+ break; >+ } >+ case 0x0634cf9au: >+ { >+ if (name.beginsWith(BuiltInName::sin)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_sin_3B; >+ } >+ break; >+ } >+ case 0x06352335u: >+ { >+ if (name.beginsWith(BuiltInName::exp)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_exp_3B; >+ } >+ break; >+ } >+ case 0x063595b9u: >+ { >+ if (name.beginsWith(BuiltInName::exp)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_exp_0B; >+ } >+ break; >+ } >+ case 0x0635a80fu: >+ { >+ if (name.beginsWith(BuiltInName::tan)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_tan_2B; >+ } >+ break; >+ } >+ case 0x0635d3b3u: >+ { >+ if (name.beginsWith(BuiltInName::sin)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_sin_2B; >+ } >+ break; >+ } >+ case 0x0635eb79u: >+ { >+ if (name.beginsWith(BuiltInName::all)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_all_2E; >+ } >+ break; >+ } >+ case 0x06366a98u: >+ { >+ if (name.beginsWith(BuiltInName::cos)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_cos_0B; >+ } >+ break; >+ } >+ case 0x0636b1f1u: >+ { >+ if (name.beginsWith(BuiltInName::exp)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_exp_1B; >+ } >+ break; >+ } >+ case 0x0636dda0u: >+ { >+ if (name.beginsWith(BuiltInName::all)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_all_3E; >+ } >+ break; >+ } >+ case 0x0636e0efu: >+ { >+ if (name.beginsWith(BuiltInName::notFunc)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_notFunc_1E; >+ } >+ break; >+ } >+ case 0x063719d6u: >+ { >+ if (name.beginsWith(BuiltInName::tan)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_tan_3B; >+ } >+ break; >+ } >+ case 0x06371aefu: >+ { >+ if (name.beginsWith(BuiltInName::abs)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_abs_2B; >+ } >+ break; >+ } >+ case 0x06376a86u: >+ { >+ if (name.beginsWith(BuiltInName::notFunc)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_notFunc_2E; >+ } >+ break; >+ } >+ case 0x063770d0u: >+ { >+ if (name.beginsWith(BuiltInName::tan)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_tan_0B; >+ } >+ break; >+ } >+ case 0x063770dfu: >+ { >+ if (name.beginsWith(BuiltInName::abs)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_abs_1B; >+ } >+ break; >+ } >+ case 0x063786f1u: >+ { >+ if (name.beginsWith(BuiltInName::cos)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_cos_1B; >+ } >+ break; >+ } >+ case 0x0637ca4au: >+ { >+ if (name.beginsWith(BuiltInName::exp)) >+ { >+ ASSERT(name.length() == 6); >+ return &BuiltInFunction::kFunction_exp_2B; >+ } >+ break; >+ } >+ case 0x06400261u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_2B2B; >+ } >+ break; >+ } >+ case 0x06403847u: >+ { >+ if (name.beginsWith(BuiltInName::mod)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_mod_2B0B; >+ } >+ break; >+ } >+ case 0x064082ceu: >+ { >+ if (name.beginsWith(BuiltInName::mod)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_mod_1B0B; >+ } >+ break; >+ } >+ case 0x0640a98au: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_2B2B; >+ } >+ break; >+ } >+ case 0x064107b7u: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_1B0B; >+ } >+ break; >+ } >+ case 0x06415ae6u: >+ { >+ if (name.beginsWith(BuiltInName::dot)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_dot_3B3B; >+ } >+ break; >+ } >+ case 0x06418e42u: >+ { >+ if (name.beginsWith(BuiltInName::pow)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_pow_3B3B; >+ } >+ break; >+ } >+ case 0x0641ceeeu: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_0B0B; >+ } >+ break; >+ } >+ case 0x0641f1d7u: >+ { >+ if (name.beginsWith(BuiltInName::mod)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_mod_1B1B; >+ } >+ break; >+ } >+ case 0x06421555u: >+ { >+ if (name.beginsWith(BuiltInName::dot)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_dot_1B1B; >+ } >+ break; >+ } >+ case 0x064225ceu: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_3B3B; >+ } >+ break; >+ } >+ case 0x064274eeu: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_1B1B; >+ } >+ break; >+ } >+ case 0x0642b54du: >+ { >+ if (name.beginsWith(BuiltInName::mod)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_mod_2B2B; >+ } >+ break; >+ } >+ case 0x064318fcu: >+ { >+ if (name.beginsWith(BuiltInName::pow)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_pow_2B2B; >+ } >+ break; >+ } >+ case 0x0643486cu: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_3B0B; >+ } >+ break; >+ } >+ case 0x06439435u: >+ { >+ if (name.beginsWith(BuiltInName::pow)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_pow_1B1B; >+ } >+ break; >+ } >+ case 0x06450933u: >+ { >+ if (name.beginsWith(BuiltInName::dot)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_dot_0B0B; >+ } >+ break; >+ } >+ case 0x0645114fu: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_1B0B; >+ } >+ break; >+ } >+ case 0x06457883u: >+ { >+ if (name.beginsWith(BuiltInName::mod)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_mod_3B3B; >+ } >+ break; >+ } >+ case 0x0645f03eu: >+ { >+ if (name.beginsWith(BuiltInName::mod)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_mod_3B0B; >+ } >+ break; >+ } >+ case 0x0645fd82u: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_3B3B; >+ } >+ break; >+ } >+ case 0x0646155eu: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_1B1B; >+ } >+ break; >+ } >+ case 0x06462cf0u: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_2B0B; >+ } >+ break; >+ } >+ case 0x06463219u: >+ { >+ if (name.beginsWith(BuiltInName::dot)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_dot_2B2B; >+ } >+ break; >+ } >+ case 0x06467507u: >+ { >+ if (name.beginsWith(BuiltInName::min)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_min_3B0B; >+ } >+ break; >+ } >+ case 0x06468fb1u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_2B0B; >+ } >+ break; >+ } >+ case 0x0646b392u: >+ { >+ if (name.beginsWith(BuiltInName::pow)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_pow_0B0B; >+ } >+ break; >+ } >+ case 0x06472996u: >+ { >+ if (name.beginsWith(BuiltInName::max)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_max_0B0B; >+ } >+ break; >+ } >+ case 0x064778feu: >+ { >+ if (name.beginsWith(BuiltInName::mod)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_mod_0B0B; >+ } >+ break; >+ } >+ case 0x0650f1c9u: >+ { >+ if (name.beginsWith(BuiltInName::mix)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_mix_1B1B0B; >+ } >+ break; >+ } >+ case 0x0653049du: >+ { >+ if (name.beginsWith(BuiltInName::mix)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_mix_2B2B0B; >+ } >+ break; >+ } >+ case 0x06549219u: >+ { >+ if (name.beginsWith(BuiltInName::mix)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_mix_2B2B2B; >+ } >+ break; >+ } >+ case 0x0655be57u: >+ { >+ if (name.beginsWith(BuiltInName::mix)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_mix_0B0B0B; >+ } >+ break; >+ } >+ case 0x06561bdcu: >+ { >+ if (name == BuiltInName::mix_3B3B0B) >+ { >+ return &BuiltInFunction::kFunction_mix_3B3B0B; >+ } >+ break; >+ } >+ case 0x06568deeu: >+ { >+ if (name == BuiltInName::mix_3B3B3B) >+ { >+ return &BuiltInFunction::kFunction_mix_3B3B3B; >+ } >+ break; >+ } >+ case 0x0657a0a8u: >+ { >+ if (name == BuiltInName::mix_1B1B1B) >+ { >+ return &BuiltInFunction::kFunction_mix_1B1B1B; >+ } >+ break; >+ } >+ case 0x08383aacu: >+ { >+ if (name.beginsWith(BuiltInName::acos)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_acos_3B; >+ } >+ break; >+ } >+ case 0x0838a17eu: >+ { >+ if (name.beginsWith(BuiltInName::ceil)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_ceil_2B; >+ } >+ break; >+ } >+ case 0x0838ac89u: >+ { >+ if (name.beginsWith(BuiltInName::exp2)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_exp2_3B; >+ } >+ break; >+ } >+ case 0x0838dc31u: >+ { >+ if (name.beginsWith(BuiltInName::sqrt)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sqrt_0B; >+ } >+ break; >+ } >+ case 0x08396a55u: >+ { >+ if (name.beginsWith(BuiltInName::acos)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_acos_2B; >+ } >+ break; >+ } >+ case 0x0839daf2u: >+ { >+ if (name.beginsWith(BuiltInName::exp2)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_exp2_0B; >+ } >+ break; >+ } >+ case 0x0839e751u: >+ { >+ if (name.beginsWith(BuiltInName::acos)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_acos_1B; >+ } >+ break; >+ } >+ case 0x0839f1a7u: >+ { >+ if (name.beginsWith(BuiltInName::ceil)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_ceil_3B; >+ } >+ break; >+ } >+ case 0x083a07bau: >+ { >+ if (name.beginsWith(BuiltInName::sqrt)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sqrt_3B; >+ } >+ break; >+ } >+ case 0x083a7922u: >+ { >+ if (name.beginsWith(BuiltInName::ceil)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_ceil_0B; >+ } >+ break; >+ } >+ case 0x083aea5fu: >+ { >+ if (name.beginsWith(BuiltInName::atan)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_atan_2B; >+ } >+ break; >+ } >+ case 0x083af266u: >+ { >+ if (name.beginsWith(BuiltInName::sign)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sign_1B; >+ } >+ break; >+ } >+ case 0x083afbc8u: >+ { >+ if (name.beginsWith(BuiltInName::acos)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_acos_0B; >+ } >+ break; >+ } >+ case 0x083b2b93u: >+ { >+ if (name.beginsWith(BuiltInName::exp2)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_exp2_1B; >+ } >+ break; >+ } >+ case 0x083b577bu: >+ { >+ if (name.beginsWith(BuiltInName::sqrt)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sqrt_2B; >+ } >+ break; >+ } >+ case 0x083b7e52u: >+ { >+ if (name.beginsWith(BuiltInName::atan)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_atan_1B; >+ } >+ break; >+ } >+ case 0x083bcf76u: >+ { >+ if (name.beginsWith(BuiltInName::sqrt)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sqrt_1B; >+ } >+ break; >+ } >+ case 0x083c1fc5u: >+ { >+ if (name.beginsWith(BuiltInName::sign)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sign_2B; >+ } >+ break; >+ } >+ case 0x083c624bu: >+ { >+ if (name.beginsWith(BuiltInName::atan)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_atan_0B; >+ } >+ break; >+ } >+ case 0x083ca453u: >+ { >+ if (name.beginsWith(BuiltInName::asin)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_asin_0B; >+ } >+ break; >+ } >+ case 0x083cc6e1u: >+ { >+ if (name.beginsWith(BuiltInName::log2)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_log2_2B; >+ } >+ break; >+ } >+ case 0x083d6eacu: >+ { >+ if (name.beginsWith(BuiltInName::sign)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sign_3B; >+ } >+ break; >+ } >+ case 0x083dac10u: >+ { >+ if (name.beginsWith(BuiltInName::atan)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_atan_3B; >+ } >+ break; >+ } >+ case 0x083dd4deu: >+ { >+ if (name.beginsWith(BuiltInName::sign)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_sign_0B; >+ } >+ break; >+ } >+ case 0x083df752u: >+ { >+ if (name.beginsWith(BuiltInName::asin)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_asin_1B; >+ } >+ break; >+ } >+ case 0x083e1b7au: >+ { >+ if (name.beginsWith(BuiltInName::log2)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_log2_1B; >+ } >+ break; >+ } >+ case 0x083e6948u: >+ { >+ if (name.beginsWith(BuiltInName::asin)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_asin_2B; >+ } >+ break; >+ } >+ case 0x083f4babu: >+ { >+ if (name.beginsWith(BuiltInName::log2)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_log2_0B; >+ } >+ break; >+ } >+ case 0x083f6552u: >+ { >+ if (name.beginsWith(BuiltInName::asin)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_asin_3B; >+ } >+ break; >+ } >+ case 0x083f6afdu: >+ { >+ if (name.beginsWith(BuiltInName::ceil)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_ceil_1B; >+ } >+ break; >+ } >+ case 0x083f8b90u: >+ { >+ if (name.beginsWith(BuiltInName::exp2)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_exp2_2B; >+ } >+ break; >+ } >+ case 0x083fd32eu: >+ { >+ if (name.beginsWith(BuiltInName::log2)) >+ { >+ ASSERT(name.length() == 7); >+ return &BuiltInFunction::kFunction_log2_3B; >+ } >+ break; >+ } >+ case 0x08482806u: >+ { >+ if (name.beginsWith(BuiltInName::atan)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_atan_3B3B; >+ } >+ break; >+ } >+ case 0x08491304u: >+ { >+ if (name.beginsWith(BuiltInName::step)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_step_0B1B; >+ } >+ break; >+ } >+ case 0x0849bcfdu: >+ { >+ if (name.beginsWith(BuiltInName::step)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_step_2B2B; >+ } >+ break; >+ } >+ case 0x084aa6bfu: >+ { >+ if (name.beginsWith(BuiltInName::atan)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_atan_1B1B; >+ } >+ break; >+ } >+ case 0x084c10fau: >+ { >+ if (name.beginsWith(BuiltInName::atan)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_atan_0B0B; >+ } >+ break; >+ } >+ case 0x084c9765u: >+ { >+ if (name.beginsWith(BuiltInName::step)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_step_1B1B; >+ } >+ break; >+ } >+ case 0x084e7af1u: >+ { >+ if (name.beginsWith(BuiltInName::step)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_step_3B3B; >+ } >+ break; >+ } >+ case 0x084e7be4u: >+ { >+ if (name.beginsWith(BuiltInName::step)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_step_0B0B; >+ } >+ break; >+ } >+ case 0x084ec1e6u: >+ { >+ if (name.beginsWith(BuiltInName::step)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_step_0B3B; >+ } >+ break; >+ } >+ case 0x084ee899u: >+ { >+ if (name.beginsWith(BuiltInName::atan)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_atan_2B2B; >+ } >+ break; >+ } >+ case 0x084feda7u: >+ { >+ if (name.beginsWith(BuiltInName::step)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_step_0B2B; >+ } >+ break; >+ } >+ case 0x0a402a9cu: >+ { >+ if (name.beginsWith(BuiltInName::fract)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_fract_0B; >+ } >+ break; >+ } >+ case 0x0a41745fu: >+ { >+ if (name.beginsWith(BuiltInName::fract)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_fract_3B; >+ } >+ break; >+ } >+ case 0x0a42a596u: >+ { >+ if (name.beginsWith(BuiltInName::fract)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_fract_2B; >+ } >+ break; >+ } >+ case 0x0a43465eu: >+ { >+ if (name.beginsWith(BuiltInName::floor)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_floor_0B; >+ } >+ break; >+ } >+ case 0x0a43be63u: >+ { >+ if (name.beginsWith(BuiltInName::floor)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_floor_3B; >+ } >+ break; >+ } >+ case 0x0a44da6bu: >+ { >+ if (name.beginsWith(BuiltInName::floor)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_floor_2B; >+ } >+ break; >+ } >+ case 0x0a45ecc0u: >+ { >+ if (name.beginsWith(BuiltInName::floor)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_floor_1B; >+ } >+ break; >+ } >+ case 0x0a4726f2u: >+ { >+ if (name.beginsWith(BuiltInName::fract)) >+ { >+ ASSERT(name.length() == 8); >+ return &BuiltInFunction::kFunction_fract_1B; >+ } >+ break; >+ } >+ case 0x0a513a26u: >+ { >+ if (name.beginsWith(BuiltInName::equal)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_equal_3E3E; >+ } >+ break; >+ } >+ case 0x0a51bddcu: >+ { >+ if (name.beginsWith(BuiltInName::equal)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_equal_3B3B; >+ } >+ break; >+ } >+ case 0x0a527d10u: >+ { >+ if (name.beginsWith(BuiltInName::cross)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_cross_2B2B; >+ } >+ break; >+ } >+ case 0x0a542036u: >+ { >+ if (name.beginsWith(BuiltInName::equal)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_equal_2C2C; >+ } >+ break; >+ } >+ case 0x0a54c30cu: >+ { >+ if (name.beginsWith(BuiltInName::equal)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_equal_2B2B; >+ } >+ break; >+ } >+ case 0x0a554046u: >+ { >+ if (name.beginsWith(BuiltInName::equal)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_equal_1C1C; >+ } >+ break; >+ } >+ case 0x0a56874bu: >+ { >+ if (name.beginsWith(BuiltInName::equal)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_equal_3C3C; >+ } >+ break; >+ } >+ case 0x0a56fc88u: >+ { >+ if (name.beginsWith(BuiltInName::equal)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_equal_2E2E; >+ } >+ break; >+ } >+ case 0x0a5744dcu: >+ { >+ if (name.beginsWith(BuiltInName::equal)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_equal_1E1E; >+ } >+ break; >+ } >+ case 0x0a57a8f5u: >+ { >+ if (name.beginsWith(BuiltInName::equal)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_equal_1B1B; >+ } >+ break; >+ } >+ case 0x0a619e65u: >+ { >+ if (name.beginsWith(BuiltInName::clamp)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_clamp_3B3B3B; >+ } >+ break; >+ } >+ case 0x0a62e0c3u: >+ { >+ if (name == BuiltInName::clamp_1B0B0B) >+ { >+ return &BuiltInFunction::kFunction_clamp_1B0B0B; >+ } >+ break; >+ } >+ case 0x0a635d1au: >+ { >+ if (name == BuiltInName::clamp_1B1B1B) >+ { >+ return &BuiltInFunction::kFunction_clamp_1B1B1B; >+ } >+ break; >+ } >+ case 0x0a658fc9u: >+ { >+ if (name == BuiltInName::clamp_3B0B0B) >+ { >+ return &BuiltInFunction::kFunction_clamp_3B0B0B; >+ } >+ break; >+ } >+ case 0x0a65f6b4u: >+ { >+ if (name.beginsWith(BuiltInName::clamp)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_clamp_0B0B0B; >+ } >+ break; >+ } >+ case 0x0a6670deu: >+ { >+ if (name.beginsWith(BuiltInName::clamp)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_clamp_2B0B0B; >+ } >+ break; >+ } >+ case 0x0a679af4u: >+ { >+ if (name.beginsWith(BuiltInName::clamp)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_clamp_2B2B2B; >+ } >+ break; >+ } >+ case 0x0c48bffau: >+ { >+ if (name.beginsWith(BuiltInName::length)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_length_0B; >+ } >+ break; >+ } >+ case 0x0c4924f7u: >+ { >+ if (name.beginsWith(BuiltInName::length)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_length_3B; >+ } >+ break; >+ } >+ case 0x0c4a38b6u: >+ { >+ if (name.beginsWith(BuiltInName::length)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_length_2B; >+ } >+ break; >+ } >+ case 0x0c4f6cbbu: >+ { >+ if (name.beginsWith(BuiltInName::length)) >+ { >+ ASSERT(name.length() == 9); >+ return &BuiltInFunction::kFunction_length_1B; >+ } >+ break; >+ } >+ case 0x0e507f22u: >+ { >+ if (name.beginsWith(BuiltInName::degrees)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_degrees_2B; >+ } >+ break; >+ } >+ case 0x0e519bd4u: >+ { >+ if (name.beginsWith(BuiltInName::degrees)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_degrees_3B; >+ } >+ break; >+ } >+ case 0x0e52b187u: >+ { >+ if (name.beginsWith(BuiltInName::degrees)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_degrees_0B; >+ } >+ break; >+ } >+ case 0x0e52e500u: >+ { >+ if (name.beginsWith(BuiltInName::radians)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_radians_0B; >+ } >+ break; >+ } >+ case 0x0e537b7au: >+ { >+ if (name.beginsWith(BuiltInName::radians)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_radians_3B; >+ } >+ break; >+ } >+ case 0x0e541edeu: >+ { >+ if (name.beginsWith(BuiltInName::degrees)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_degrees_1B; >+ } >+ break; >+ } >+ case 0x0e547683u: >+ { >+ if (name.beginsWith(BuiltInName::radians)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_radians_2B; >+ } >+ break; >+ } >+ case 0x0e55ac28u: >+ { >+ if (name.beginsWith(BuiltInName::radians)) >+ { >+ ASSERT(name.length() == 10); >+ return &BuiltInFunction::kFunction_radians_1B; >+ } >+ break; >+ } >+ case 0x0e620f44u: >+ { >+ if (name.beginsWith(BuiltInName::reflect)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_reflect_2B2B; >+ } >+ break; >+ } >+ case 0x0e631c50u: >+ { >+ if (name.beginsWith(BuiltInName::reflect)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_reflect_3B3B; >+ } >+ break; >+ } >+ case 0x0e63358eu: >+ { >+ if (name.beginsWith(BuiltInName::reflect)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_reflect_0B0B; >+ } >+ break; >+ } >+ case 0x0e665b7bu: >+ { >+ if (name.beginsWith(BuiltInName::reflect)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_reflect_1B1B; >+ } >+ break; >+ } >+ case 0x0e706684u: >+ { >+ if (name.beginsWith(BuiltInName::refract)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_refract_1B1B0B; >+ } >+ break; >+ } >+ case 0x0e71a4fcu: >+ { >+ if (name.beginsWith(BuiltInName::refract)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_refract_2B2B0B; >+ } >+ break; >+ } >+ case 0x0e71b28du: >+ { >+ if (name == BuiltInName::refract_3B3B0B) >+ { >+ return &BuiltInFunction::kFunction_refract_3B3B0B; >+ } >+ break; >+ } >+ case 0x0e73b594u: >+ { >+ if (name.beginsWith(BuiltInName::refract)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_refract_0B0B0B; >+ } >+ break; >+ } >+ case 0x1068425fu: >+ { >+ if (name.beginsWith(BuiltInName::distance)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_distance_3B3B; >+ } >+ break; >+ } >+ case 0x1068c0bfu: >+ { >+ if (name.beginsWith(BuiltInName::distance)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_distance_2B2B; >+ } >+ break; >+ } >+ case 0x1068f060u: >+ { >+ if (name.beginsWith(BuiltInName::notEqual)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_notEqual_1E1E; >+ } >+ break; >+ } >+ case 0x10695fe7u: >+ { >+ if (name.beginsWith(BuiltInName::notEqual)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_notEqual_2E2E; >+ } >+ break; >+ } >+ case 0x1069b2c0u: >+ { >+ if (name.beginsWith(BuiltInName::lessThan)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_lessThan_1B1B; >+ } >+ break; >+ } >+ case 0x106a110cu: >+ { >+ if (name.beginsWith(BuiltInName::lessThan)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_lessThan_3C3C; >+ } >+ break; >+ } >+ case 0x106a63f2u: >+ { >+ if (name.beginsWith(BuiltInName::notEqual)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_notEqual_2C2C; >+ } >+ break; >+ } >+ case 0x106a713eu: >+ { >+ if (name.beginsWith(BuiltInName::lessThan)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_lessThan_2B2B; >+ } >+ break; >+ } >+ case 0x106ade94u: >+ { >+ if (name.beginsWith(BuiltInName::notEqual)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_notEqual_1B1B; >+ } >+ break; >+ } >+ case 0x106b25c9u: >+ { >+ if (name.beginsWith(BuiltInName::notEqual)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_notEqual_1C1C; >+ } >+ break; >+ } >+ case 0x106b4468u: >+ { >+ if (name.beginsWith(BuiltInName::lessThan)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_lessThan_1C1C; >+ } >+ break; >+ } >+ case 0x106b8219u: >+ { >+ if (name.beginsWith(BuiltInName::notEqual)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_notEqual_3B3B; >+ } >+ break; >+ } >+ case 0x106bc4fcu: >+ { >+ if (name.beginsWith(BuiltInName::notEqual)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_notEqual_3E3E; >+ } >+ break; >+ } >+ case 0x106caf4fu: >+ { >+ if (name.beginsWith(BuiltInName::distance)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_distance_0B0B; >+ } >+ break; >+ } >+ case 0x106d2c39u: >+ { >+ if (name.beginsWith(BuiltInName::lessThan)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_lessThan_3B3B; >+ } >+ break; >+ } >+ case 0x106dabccu: >+ { >+ if (name.beginsWith(BuiltInName::notEqual)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_notEqual_2B2B; >+ } >+ break; >+ } >+ case 0x106eaf65u: >+ { >+ if (name.beginsWith(BuiltInName::notEqual)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_notEqual_3C3C; >+ } >+ break; >+ } >+ case 0x106faaeau: >+ { >+ if (name.beginsWith(BuiltInName::lessThan)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_lessThan_2C2C; >+ } >+ break; >+ } >+ case 0x106ff564u: >+ { >+ if (name.beginsWith(BuiltInName::distance)) >+ { >+ ASSERT(name.length() == 13); >+ return &BuiltInFunction::kFunction_distance_1B1B; >+ } >+ break; >+ } >+ case 0x126235c4u: >+ { >+ if (name.beginsWith(BuiltInName::normalize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_normalize_1B; >+ } >+ break; >+ } >+ case 0x12635a67u: >+ { >+ if (name.beginsWith(BuiltInName::normalize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_normalize_2B; >+ } >+ break; >+ } >+ case 0x1264aa3eu: >+ { >+ if (name.beginsWith(BuiltInName::normalize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_normalize_3B; >+ } >+ break; >+ } >+ case 0x12650243u: >+ { >+ if (name.beginsWith(BuiltInName::normalize)) >+ { >+ ASSERT(name.length() == 12); >+ return &BuiltInFunction::kFunction_normalize_0B; >+ } >+ break; >+ } >+ case 0x14888e72u: >+ { >+ if (name.beginsWith(BuiltInName::smoothstep)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_smoothstep_0B0B1B; >+ } >+ break; >+ } >+ case 0x1489436du: >+ { >+ if (name == BuiltInName::smoothstep_1B1B1B) >+ { >+ return &BuiltInFunction::kFunction_smoothstep_1B1B1B; >+ } >+ break; >+ } >+ case 0x1489bfb6u: >+ { >+ if (name == BuiltInName::smoothstep_3B3B3B) >+ { >+ return &BuiltInFunction::kFunction_smoothstep_3B3B3B; >+ } >+ break; >+ } >+ case 0x148a33b9u: >+ { >+ if (name.beginsWith(BuiltInName::smoothstep)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_smoothstep_2B2B2B; >+ } >+ break; >+ } >+ case 0x148de9b5u: >+ { >+ if (name.beginsWith(BuiltInName::smoothstep)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_smoothstep_0B0B0B; >+ } >+ break; >+ } >+ case 0x148e5c11u: >+ { >+ if (name == BuiltInName::smoothstep_0B0B3B) >+ { >+ return &BuiltInFunction::kFunction_smoothstep_0B0B3B; >+ } >+ break; >+ } >+ case 0x148f7bf9u: >+ { >+ if (name.beginsWith(BuiltInName::smoothstep)) >+ { >+ ASSERT(name.length() == 17); >+ return &BuiltInFunction::kFunction_smoothstep_0B0B2B; >+ } >+ break; >+ } >+ case 0x1670b92du: >+ { >+ if (name.beginsWith(BuiltInName::inversesqrt)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_inversesqrt_2B; >+ } >+ break; >+ } >+ case 0x1671d38eu: >+ { >+ if (name.beginsWith(BuiltInName::inversesqrt)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_inversesqrt_1B; >+ } >+ break; >+ } >+ case 0x16772b69u: >+ { >+ if (name.beginsWith(BuiltInName::inversesqrt)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_inversesqrt_0B; >+ } >+ break; >+ } >+ case 0x1677857cu: >+ { >+ if (name.beginsWith(BuiltInName::inversesqrt)) >+ { >+ ASSERT(name.length() == 14); >+ return &BuiltInFunction::kFunction_inversesqrt_3B; >+ } >+ break; >+ } >+ case 0x16817df9u: >+ { >+ if (name.beginsWith(BuiltInName::greaterThan)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_greaterThan_1B1B; >+ } >+ break; >+ } >+ case 0x1681b963u: >+ { >+ if (name.beginsWith(BuiltInName::greaterThan)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_greaterThan_3C3C; >+ } >+ break; >+ } >+ case 0x16829d5du: >+ { >+ if (name.beginsWith(BuiltInName::greaterThan)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_greaterThan_3B3B; >+ } >+ break; >+ } >+ case 0x16853112u: >+ { >+ if (name.beginsWith(BuiltInName::greaterThan)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_greaterThan_2B2B; >+ } >+ break; >+ } >+ case 0x1685d025u: >+ { >+ if (name.beginsWith(BuiltInName::greaterThan)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_greaterThan_2C2C; >+ } >+ break; >+ } >+ case 0x1685db46u: >+ { >+ if (name.beginsWith(BuiltInName::greaterThan)) >+ { >+ ASSERT(name.length() == 16); >+ return &BuiltInFunction::kFunction_greaterThan_1C1C; >+ } >+ break; >+ } >+ case 0x1690b84du: >+ { >+ if (name == BuiltInName::faceforward_3B3B3B) >+ { >+ return &BuiltInFunction::kFunction_faceforward_3B3B3B; >+ } >+ break; >+ } >+ case 0x1691c40bu: >+ { >+ if (name == BuiltInName::faceforward_1B1B1B) >+ { >+ return &BuiltInFunction::kFunction_faceforward_1B1B1B; >+ } >+ break; >+ } >+ case 0x1696babeu: >+ { >+ if (name == BuiltInName::faceforward_2B2B2B) >+ { >+ return &BuiltInFunction::kFunction_faceforward_2B2B2B; >+ } >+ break; >+ } >+ case 0x1697cde8u: >+ { >+ if (name.beginsWith(BuiltInName::faceforward)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_faceforward_0B0B0B; >+ } >+ break; >+ } >+ case 0x1a9481a8u: >+ { >+ if (name.beginsWith(BuiltInName::lessThanEqual)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_lessThanEqual_2C2C; >+ } >+ break; >+ } >+ case 0x1a94a164u: >+ { >+ if (name.beginsWith(BuiltInName::lessThanEqual)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_lessThanEqual_3C3C; >+ } >+ break; >+ } >+ case 0x1a95c72au: >+ { >+ if (name.beginsWith(BuiltInName::lessThanEqual)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_lessThanEqual_1B1B; >+ } >+ break; >+ } >+ case 0x1a9642f7u: >+ { >+ if (name.beginsWith(BuiltInName::lessThanEqual)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_lessThanEqual_3B3B; >+ } >+ break; >+ } >+ case 0x1a977782u: >+ { >+ if (name.beginsWith(BuiltInName::lessThanEqual)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_lessThanEqual_1C1C; >+ } >+ break; >+ } >+ case 0x1a97d055u: >+ { >+ if (name.beginsWith(BuiltInName::lessThanEqual)) >+ { >+ ASSERT(name.length() == 18); >+ return &BuiltInFunction::kFunction_lessThanEqual_2B2B; >+ } >+ break; >+ } >+ case 0x1c993bdfu: >+ { >+ if (name.beginsWith(BuiltInName::matrixCompMult)) >+ { >+ ASSERT(name.length() == 19); >+ return &BuiltInFunction::kFunction_matrixCompMult_5B5B; >+ } >+ break; >+ } >+ case 0x1c9b357cu: >+ { >+ if (name.beginsWith(BuiltInName::matrixCompMult)) >+ { >+ ASSERT(name.length() == 19); >+ return &BuiltInFunction::kFunction_matrixCompMult_FBFB; >+ } >+ break; >+ } >+ case 0x1c9e72dbu: >+ { >+ if (name.beginsWith(BuiltInName::matrixCompMult)) >+ { >+ ASSERT(name.length() == 19); >+ return &BuiltInFunction::kFunction_matrixCompMult_ABAB; >+ } >+ break; >+ } >+ case 0x20ab1dc0u: >+ { >+ if (name.beginsWith(BuiltInName::greaterThanEqual)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_greaterThanEqual_2C2C; >+ } >+ break; >+ } >+ case 0x20acdd3au: >+ { >+ if (name.beginsWith(BuiltInName::greaterThanEqual)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_greaterThanEqual_1B1B; >+ } >+ break; >+ } >+ case 0x20ad192cu: >+ { >+ if (name.beginsWith(BuiltInName::greaterThanEqual)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_greaterThanEqual_3C3C; >+ } >+ break; >+ } >+ case 0x20adfc96u: >+ { >+ if (name.beginsWith(BuiltInName::greaterThanEqual)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_greaterThanEqual_3B3B; >+ } >+ break; >+ } >+ case 0x20ae6ffbu: >+ { >+ if (name.beginsWith(BuiltInName::greaterThanEqual)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_greaterThanEqual_2B2B; >+ } >+ break; >+ } >+ case 0x20af1dd4u: >+ { >+ if (name.beginsWith(BuiltInName::greaterThanEqual)) >+ { >+ ASSERT(name.length() == 21); >+ return &BuiltInFunction::kFunction_greaterThanEqual_1C1C; >+ } >+ break; >+ } >+ case 0x7e6af03cu: >+ { >+ if (name == BuiltInName::gl_DepthRange) >+ { >+ return mVar_gl_DepthRange; >+ } >+ break; >+ } >+ case 0x7e8ab02eu: >+ { >+ if (name == BuiltInName::gl_MaxDrawBuffers) >+ { >+ return mVar_gl_MaxDrawBuffers; >+ } >+ break; >+ } >+ case 0x7e9ad799u: >+ { >+ if (name == BuiltInName::gl_MaxVertexAttribs) >+ { >+ return mVar_gl_MaxVertexAttribs; >+ } >+ break; >+ } >+ case 0x7ebaa8e5u: >+ { >+ if (name == BuiltInName::gl_MaxTextureImageUnits) >+ { >+ return mVar_gl_MaxTextureImageUnits; >+ } >+ break; >+ } >+ case 0x7ebeff64u: >+ { >+ if (name == BuiltInName::gl_DepthRangeParameters) >+ { >+ return mVar_gl_DepthRangeParameters; >+ } >+ break; >+ } >+ case 0x7ed35151u: >+ { >+ if (name == BuiltInName::gl_MaxVertexUniformVectors) >+ { >+ return mVar_gl_MaxVertexUniformVectors; >+ } >+ break; >+ } >+ case 0x7ee45ba1u: >+ { >+ if (name == BuiltInName::gl_MaxFragmentUniformVectors) >+ { >+ return mVar_gl_MaxFragmentUniformVectors; >+ } >+ break; >+ } >+ case 0x7eea039au: >+ { >+ if (name == BuiltInName::gl_MaxVertexTextureImageUnits) >+ { >+ return mVar_gl_MaxVertexTextureImageUnits; >+ } >+ break; >+ } >+ case 0x7ef1e608u: >+ { >+ if (name == BuiltInName::gl_MaxDualSourceDrawBuffersEXT) >+ { >+ return mVar_gl_MaxDualSourceDrawBuffersEXT; >+ } >+ break; >+ } >+ case 0x7ef84293u: >+ { >+ if (name == BuiltInName::gl_MaxCombinedTextureImageUnits) >+ { >+ return mVar_gl_MaxCombinedTextureImageUnits; >+ } >+ break; >+ } >+ } >+ if (mShaderType == GL_FRAGMENT_SHADER) >+ { >+ switch (nameHash) >+ { >+ case 0x7e64c010u: >+ { >+ if (name == BuiltInName::gl_FragCoord) >+ { >+ return &BuiltInVariable::kVar_gl_FragCoord; >+ } >+ break; >+ } >+ case 0x7e6c2088u: >+ { >+ if (name == BuiltInName::gl_PointCoord) >+ { >+ return &BuiltInVariable::kVar_gl_PointCoord; >+ } >+ break; >+ } >+ case 0x7e73011eu: >+ { >+ if (name == BuiltInName::gl_FrontFacing) >+ { >+ return &BuiltInVariable::kVar_gl_FrontFacing; >+ } >+ break; >+ } >+ } >+ } >+ if (mShaderType == GL_VERTEX_SHADER) >+ { >+ switch (nameHash) >+ { >+ case 0x7e580bc5u: >+ { >+ if (name == BuiltInName::gl_Position) >+ { >+ return &BuiltInVariable::kVar_gl_Position; >+ } >+ break; >+ } >+ case 0x7e63931cu: >+ { >+ if (name == BuiltInName::gl_PointSize) >+ { >+ return &BuiltInVariable::kVar_gl_PointSize; >+ } >+ break; >+ } >+ } >+ } >+ return nullptr; >+} >+ >+const UnmangledBuiltIn *TSymbolTable::getUnmangledBuiltInForShaderVersion( >+ const ImmutableString &name, >+ int shaderVersion) >+{ >+ if (name.length() > 26) >+ { >+ return nullptr; >+ } >+ uint32_t nameHash = name.mangledNameHash(); >+ if (shaderVersion >= 310) >+ { >+ switch (nameHash) >+ { >+ case 0x7e2c727fu: >+ { >+ if (name == BuiltInName::ldexp) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e2d0692u: >+ { >+ if (name == BuiltInName::frexp) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e399596u: >+ { >+ if (name == BuiltInName::findLSB) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e3bdf3fu: >+ { >+ if (name == BuiltInName::findMSB) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e41283bu: >+ { >+ if (name == BuiltInName::bitCount) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e4690b3u: >+ { >+ if (name == BuiltInName::atomicOr) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e4800e3u: >+ { >+ if (name == BuiltInName::atomicAdd) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e4893a8u: >+ { >+ if (name == BuiltInName::atomicMax) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e49061fu: >+ { >+ if (name == BuiltInName::atomicMin) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e4a45b6u: >+ { >+ if (name == BuiltInName::imageLoad) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e4b6656u: >+ { >+ if (name == BuiltInName::imageSize) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e4dea77u: >+ { >+ if (name == BuiltInName::atomicXor) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e4e5094u: >+ { >+ if (name == BuiltInName::uaddCarry) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e4f21aeu: >+ { >+ if (name == BuiltInName::atomicAnd) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e5237e1u: >+ { >+ if (name == BuiltInName::texelFetch) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e5276efu: >+ { >+ if (name == BuiltInName::imageStore) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e55de86u: >+ { >+ if (name == BuiltInName::usubBorrow) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e5e217eu: >+ { >+ if (name == BuiltInName::textureSize) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e6273e5u: >+ { >+ if (name == BuiltInName::packSnorm4x8) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e62a9a0u: >+ { >+ if (name == BuiltInName::imulExtended) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e657e29u: >+ { >+ if (name == BuiltInName::packUnorm4x8) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e6746f4u: >+ { >+ if (name == BuiltInName::umulExtended) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e69d0dbu: >+ { >+ if (name == BuiltInName::memoryBarrier) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e6d0f32u: >+ { >+ if (name == BuiltInName::textureGather) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e6e00a5u: >+ { >+ if (name == BuiltInName::atomicCounter) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e71963eu: >+ { >+ if (name == BuiltInName::unpackUnorm4x8) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e73f1d1u: >+ { >+ if (name == BuiltInName::unpackSnorm4x8) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e75cfb1u: >+ { >+ if (name == BuiltInName::atomicExchange) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e778ffcu: >+ { >+ if (name == BuiltInName::atomicCompSwap) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e77c121u: >+ { >+ if (name == BuiltInName::bitfieldInsert) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e7f2cb2u: >+ { >+ if (name == BuiltInName::bitfieldReverse) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e7fa0c1u: >+ { >+ if (name == BuiltInName::bitfieldExtract) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e9269d7u: >+ { >+ if (name == BuiltInName::memoryBarrierImage) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e9b7f32u: >+ { >+ if (name == BuiltInName::memoryBarrierBuffer) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e9d8ad9u: >+ { >+ if (name == BuiltInName::textureGatherOffset) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7eb323ddu: >+ { >+ if (name == BuiltInName::atomicCounterIncrement) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7eb6aed0u: >+ { >+ if (name == BuiltInName::atomicCounterDecrement) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7ed5b06bu: >+ { >+ if (name == BuiltInName::memoryBarrierAtomicCounter) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ } >+ if (mShaderType == GL_COMPUTE_SHADER) >+ { >+ switch (nameHash) >+ { >+ case 0x7e39f4e9u: >+ { >+ if (name == BuiltInName::barrier) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e93c6b9u: >+ { >+ if (name == BuiltInName::groupMemoryBarrier) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e9f4b19u: >+ { >+ if (name == BuiltInName::memoryBarrierShared) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ } >+ } >+ if (mShaderType == GL_GEOMETRY_SHADER_EXT) >+ { >+ switch (nameHash) >+ { >+ case 0x7e55adc2u: >+ { >+ if (name == BuiltInName::EmitVertex) >+ { >+ return &UnmangledBuiltIns::EXT_geometry_shader; >+ } >+ break; >+ } >+ case 0x7e65b2cau: >+ { >+ if (name == BuiltInName::EndPrimitive) >+ { >+ return &UnmangledBuiltIns::EXT_geometry_shader; >+ } >+ break; >+ } >+ } >+ } >+ } >+ if (shaderVersion >= 300) >+ { >+ switch (nameHash) >+ { >+ case 0x7e19507bu: >+ { >+ if (name == BuiltInName::abs) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e1e492du: >+ { >+ if (name == BuiltInName::min) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e1ea71bu: >+ { >+ if (name == BuiltInName::mix) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e1ebe0eu: >+ { >+ if (name == BuiltInName::max) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e205c92u: >+ { >+ if (name == BuiltInName::tanh) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e206e40u: >+ { >+ if (name == BuiltInName::sign) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e209eadu: >+ { >+ if (name == BuiltInName::sinh) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e274509u: >+ { >+ if (name == BuiltInName::modf) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e27a4feu: >+ { >+ if (name == BuiltInName::cosh) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e28294fu: >+ { >+ if (name == BuiltInName::atanh) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e2924b8u: >+ { >+ if (name == BuiltInName::isinf) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e297347u: >+ { >+ if (name == BuiltInName::equal) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e2a7a64u: >+ { >+ if (name == BuiltInName::round) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e2d5dcbu: >+ { >+ if (name == BuiltInName::clamp) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e2d8df4u: >+ { >+ if (name == BuiltInName::isnan) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e2dcbc6u: >+ { >+ if (name == BuiltInName::asinh) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e2eab16u: >+ { >+ if (name == BuiltInName::trunc) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e2f67c3u: >+ { >+ if (name == BuiltInName::acosh) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e39ebd7u: >+ { >+ if (name == BuiltInName::texture) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e3d828cu: >+ { >+ if (name == BuiltInName::inverse) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e403a20u: >+ { >+ if (name == BuiltInName::lessThan) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e413f93u: >+ { >+ if (name == BuiltInName::notEqual) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e4d27c2u: >+ { >+ if (name == BuiltInName::rgb_2_yuv) >+ { >+ return &UnmangledBuiltIns::EXT_YUV_target; >+ } >+ break; >+ } >+ case 0x7e4d323bu: >+ { >+ if (name == BuiltInName::roundEven) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e4e024cu: >+ { >+ if (name == BuiltInName::transpose) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e4e33aeu: >+ { >+ if (name == BuiltInName::yuv_2_rgb) >+ { >+ return &UnmangledBuiltIns::EXT_YUV_target; >+ } >+ break; >+ } >+ case 0x7e501e0cu: >+ { >+ if (name == BuiltInName::textureLod) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e5237e1u: >+ { >+ if (name == BuiltInName::texelFetch) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e582ffcu: >+ { >+ if (name == BuiltInName::greaterThan) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e599347u: >+ { >+ if (name == BuiltInName::textureGrad) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e5ba531u: >+ { >+ if (name == BuiltInName::determinant) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e5caafbu: >+ { >+ if (name == BuiltInName::textureProj) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e5e217eu: >+ { >+ if (name == BuiltInName::textureSize) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e62daa3u: >+ { >+ if (name == BuiltInName::packHalf2x16) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e646b9bu: >+ { >+ if (name == BuiltInName::outerProduct) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e683586u: >+ { >+ if (name == BuiltInName::lessThanEqual) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e6a013du: >+ { >+ if (name == BuiltInName::packSnorm2x16) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e6b72b8u: >+ { >+ if (name == BuiltInName::packUnorm2x16) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e6c5187u: >+ { >+ if (name == BuiltInName::textureOffset) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e715db5u: >+ { >+ if (name == BuiltInName::unpackHalf2x16) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e759618u: >+ { >+ if (name == BuiltInName::floatBitsToInt) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e75ae2fu: >+ { >+ if (name == BuiltInName::textureProjLod) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e76bea7u: >+ { >+ if (name == BuiltInName::matrixCompMult) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e77fc97u: >+ { >+ if (name == BuiltInName::intBitsToFloat) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e792d39u: >+ { >+ if (name == BuiltInName::unpackUnorm2x16) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e7b6a0eu: >+ { >+ if (name == BuiltInName::unpackSnorm2x16) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e7bc1fdu: >+ { >+ if (name == BuiltInName::textureProjGrad) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e7e0e81u: >+ { >+ if (name == BuiltInName::uintBitsToFloat) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e7e5132u: >+ { >+ if (name == BuiltInName::floatBitsToUint) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e80919du: >+ { >+ if (name == BuiltInName::texelFetchOffset) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e81c71au: >+ { >+ if (name == BuiltInName::textureLodOffset) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e876cccu: >+ { >+ if (name == BuiltInName::greaterThanEqual) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e8b5832u: >+ { >+ if (name == BuiltInName::textureGradOffset) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e8d2d2du: >+ { >+ if (name == BuiltInName::textureProjOffset) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7ea0be08u: >+ { >+ if (name == BuiltInName::textureProjLodOffset) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7eac5717u: >+ { >+ if (name == BuiltInName::textureProjGradOffset) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ } >+ if (mShaderType == GL_FRAGMENT_SHADER) >+ { >+ switch (nameHash) >+ { >+ case 0x7e2624d4u: >+ { >+ if (name == BuiltInName::dFdy) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e265ea7u: >+ { >+ if (name == BuiltInName::dFdx) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e324ea1u: >+ { >+ if (name == BuiltInName::fwidth) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ } >+ } >+ } >+ if (shaderVersion == 100) >+ { >+ switch (nameHash) >+ { >+ case 0x7e48c50cu: >+ { >+ if (name == BuiltInName::texture2D) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e5ffc48u: >+ { >+ if (name == BuiltInName::textureCube) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e69f545u: >+ { >+ if (name == BuiltInName::texture2DRect) >+ { >+ return &UnmangledBuiltIns::ARB_texture_rectangle; >+ } >+ break; >+ } >+ case 0x7e6e3735u: >+ { >+ if (name == BuiltInName::texture2DProj) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e868a22u: >+ { >+ if (name == BuiltInName::texture2DGradEXT) >+ { >+ return &UnmangledBuiltIns::EXT_shader_texture_lod; >+ } >+ break; >+ } >+ case 0x7e8b66e4u: >+ { >+ if (name == BuiltInName::texture2DRectProj) >+ { >+ return &UnmangledBuiltIns::ARB_texture_rectangle; >+ } >+ break; >+ } >+ case 0x7e90fa5bu: >+ { >+ if (name == BuiltInName::textureCubeGradEXT) >+ { >+ return &UnmangledBuiltIns::EXT_shader_texture_lod; >+ } >+ break; >+ } >+ case 0x7ea20b8fu: >+ { >+ if (name == BuiltInName::texture2DProjGradEXT) >+ { >+ return &UnmangledBuiltIns::EXT_shader_texture_lod; >+ } >+ break; >+ } >+ } >+ if (mShaderType == GL_FRAGMENT_SHADER) >+ { >+ switch (nameHash) >+ { >+ case 0x7e2624d4u: >+ { >+ if (name == BuiltInName::dFdyExt) >+ { >+ return &UnmangledBuiltIns::OES_standard_derivatives; >+ } >+ break; >+ } >+ case 0x7e265ea7u: >+ { >+ if (name == BuiltInName::dFdxExt) >+ { >+ return &UnmangledBuiltIns::OES_standard_derivatives; >+ } >+ break; >+ } >+ case 0x7e324ea1u: >+ { >+ if (name == BuiltInName::fwidthExt) >+ { >+ return &UnmangledBuiltIns::OES_standard_derivatives; >+ } >+ break; >+ } >+ case 0x7e7b843eu: >+ { >+ if (name == BuiltInName::texture2DLodEXT) >+ { >+ return &UnmangledBuiltIns::EXT_shader_texture_lod; >+ } >+ break; >+ } >+ case 0x7e8b81cau: >+ { >+ if (name == BuiltInName::textureCubeLodEXT) >+ { >+ return &UnmangledBuiltIns::EXT_shader_texture_lod; >+ } >+ break; >+ } >+ case 0x7e9ddba0u: >+ { >+ if (name == BuiltInName::texture2DProjLodEXT) >+ { >+ return &UnmangledBuiltIns::EXT_shader_texture_lod; >+ } >+ break; >+ } >+ } >+ } >+ if (mShaderType == GL_VERTEX_SHADER) >+ { >+ switch (nameHash) >+ { >+ case 0x7e67c7ceu: >+ { >+ if (name == BuiltInName::texture2DLod) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e758eddu: >+ { >+ if (name == BuiltInName::textureCubeLod) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e819b90u: >+ { >+ if (name == BuiltInName::texture2DProjLod) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ } >+ } >+ } >+ switch (nameHash) >+ { >+ case 0x7e1892eeu: >+ { >+ if (name == BuiltInName::all) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e19507bu: >+ { >+ if (name == BuiltInName::abs) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e195106u: >+ { >+ if (name == BuiltInName::notFunc) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e197102u: >+ { >+ if (name == BuiltInName::any) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e19ebdbu: >+ { >+ if (name == BuiltInName::log) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e1acb4eu: >+ { >+ if (name == BuiltInName::pow) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e1b921cu: >+ { >+ if (name == BuiltInName::exp) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e1cf321u: >+ { >+ if (name == BuiltInName::tan) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e1e492du: >+ { >+ if (name == BuiltInName::min) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e1e8464u: >+ { >+ if (name == BuiltInName::dot) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e1ea71bu: >+ { >+ if (name == BuiltInName::mix) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e1ebe0eu: >+ { >+ if (name == BuiltInName::max) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e1eee70u: >+ { >+ if (name == BuiltInName::mod) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e1f0bccu: >+ { >+ if (name == BuiltInName::sin) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e1fdef3u: >+ { >+ if (name == BuiltInName::cos) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e203979u: >+ { >+ if (name == BuiltInName::atan) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e206e40u: >+ { >+ if (name == BuiltInName::sign) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e209ec1u: >+ { >+ if (name == BuiltInName::log2) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e21ff11u: >+ { >+ if (name == BuiltInName::acos) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e23152fu: >+ { >+ if (name == BuiltInName::ceil) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e23f4beu: >+ { >+ if (name == BuiltInName::sqrt) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e24bcdbu: >+ { >+ if (name == BuiltInName::exp2) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e26202fu: >+ { >+ if (name == BuiltInName::step) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e27ebd5u: >+ { >+ if (name == BuiltInName::asin) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e295733u: >+ { >+ if (name == BuiltInName::cross) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e297347u: >+ { >+ if (name == BuiltInName::equal) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e2d5dcbu: >+ { >+ if (name == BuiltInName::clamp) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e2dcb25u: >+ { >+ if (name == BuiltInName::floor) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e2f6df3u: >+ { >+ if (name == BuiltInName::fract) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e340894u: >+ { >+ if (name == BuiltInName::length) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e38233fu: >+ { >+ if (name == BuiltInName::refract) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e3c3cb3u: >+ { >+ if (name == BuiltInName::radians) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e3c8e91u: >+ { >+ if (name == BuiltInName::reflect) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e3d784cu: >+ { >+ if (name == BuiltInName::degrees) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e403a20u: >+ { >+ if (name == BuiltInName::lessThan) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e413f93u: >+ { >+ if (name == BuiltInName::notEqual) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e4161fau: >+ { >+ if (name == BuiltInName::distance) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e4e7aa5u: >+ { >+ if (name == BuiltInName::normalize) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e54a2cfu: >+ { >+ if (name == BuiltInName::smoothstep) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e582ffcu: >+ { >+ if (name == BuiltInName::greaterThan) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e5ae14bu: >+ { >+ if (name == BuiltInName::faceforward) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e5f4d0fu: >+ { >+ if (name == BuiltInName::inversesqrt) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e683586u: >+ { >+ if (name == BuiltInName::lessThanEqual) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e76bea7u: >+ { >+ if (name == BuiltInName::matrixCompMult) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ case 0x7e876cccu: >+ { >+ if (name == BuiltInName::greaterThanEqual) >+ { >+ return &UnmangledBuiltIns::UNDEFINED; >+ } >+ break; >+ } >+ } >+ return nullptr; >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable_autogen.h b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable_autogen.h >new file mode 100644 >index 00000000000..2168743e299 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable_autogen.h >@@ -0,0 +1,78 @@ >+// GENERATED FILE - DO NOT EDIT. >+// Generated by gen_builtin_symbols.py using data from builtin_variables.json and >+// builtin_function_declarations.txt. >+// >+// 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. >+// >+// SymbolTable_autogen.h: >+// Autogenerated member variables of TSymbolTable. >+ >+#ifndef COMPILER_TRANSLATOR_SYMBOLTABLE_AUTOGEN_H_ >+#define COMPILER_TRANSLATOR_SYMBOLTABLE_AUTOGEN_H_ >+ >+namespace sh >+{ >+ >+class TSymbolTableBase >+{ >+ protected: >+ TSymbolTableBase() = default; >+ TStructure *mVar_gl_DepthRangeParameters = nullptr; >+ TVariable *mVar_gl_DepthRange = nullptr; >+ TVariable *mVar_gl_MaxVertexAttribs = nullptr; >+ TVariable *mVar_gl_MaxVertexUniformVectors = nullptr; >+ TVariable *mVar_gl_MaxVertexTextureImageUnits = nullptr; >+ TVariable *mVar_gl_MaxCombinedTextureImageUnits = nullptr; >+ TVariable *mVar_gl_MaxTextureImageUnits = nullptr; >+ TVariable *mVar_gl_MaxFragmentUniformVectors = nullptr; >+ TVariable *mVar_gl_MaxVaryingVectors = nullptr; >+ TVariable *mVar_gl_MaxDrawBuffers = nullptr; >+ TVariable *mVar_gl_MaxDualSourceDrawBuffersEXT = nullptr; >+ TVariable *mVar_gl_MaxVertexOutputVectors = nullptr; >+ TVariable *mVar_gl_MaxFragmentInputVectors = nullptr; >+ TVariable *mVar_gl_MinProgramTexelOffset = nullptr; >+ TVariable *mVar_gl_MaxProgramTexelOffset = nullptr; >+ TVariable *mVar_gl_MaxImageUnits = nullptr; >+ TVariable *mVar_gl_MaxVertexImageUniforms = nullptr; >+ TVariable *mVar_gl_MaxFragmentImageUniforms = nullptr; >+ TVariable *mVar_gl_MaxComputeImageUniforms = nullptr; >+ TVariable *mVar_gl_MaxCombinedImageUniforms = nullptr; >+ TVariable *mVar_gl_MaxCombinedShaderOutputResources = nullptr; >+ TVariable *mVar_gl_MaxComputeWorkGroupCount = nullptr; >+ TVariable *mVar_gl_MaxComputeWorkGroupSize = nullptr; >+ TVariable *mVar_gl_MaxComputeUniformComponents = nullptr; >+ TVariable *mVar_gl_MaxComputeTextureImageUnits = nullptr; >+ TVariable *mVar_gl_MaxComputeAtomicCounters = nullptr; >+ TVariable *mVar_gl_MaxComputeAtomicCounterBuffers = nullptr; >+ TVariable *mVar_gl_MaxVertexAtomicCounters = nullptr; >+ TVariable *mVar_gl_MaxFragmentAtomicCounters = nullptr; >+ TVariable *mVar_gl_MaxCombinedAtomicCounters = nullptr; >+ TVariable *mVar_gl_MaxAtomicCounterBindings = nullptr; >+ TVariable *mVar_gl_MaxVertexAtomicCounterBuffers = nullptr; >+ TVariable *mVar_gl_MaxFragmentAtomicCounterBuffers = nullptr; >+ TVariable *mVar_gl_MaxCombinedAtomicCounterBuffers = nullptr; >+ TVariable *mVar_gl_MaxAtomicCounterBufferSize = nullptr; >+ TVariable *mVar_gl_MaxGeometryInputComponents = nullptr; >+ TVariable *mVar_gl_MaxGeometryOutputComponents = nullptr; >+ TVariable *mVar_gl_MaxGeometryImageUniforms = nullptr; >+ TVariable *mVar_gl_MaxGeometryTextureImageUnits = nullptr; >+ TVariable *mVar_gl_MaxGeometryOutputVertices = nullptr; >+ TVariable *mVar_gl_MaxGeometryTotalOutputComponents = nullptr; >+ TVariable *mVar_gl_MaxGeometryUniformComponents = nullptr; >+ TVariable *mVar_gl_MaxGeometryAtomicCounters = nullptr; >+ TVariable *mVar_gl_MaxGeometryAtomicCounterBuffers = nullptr; >+ TVariable *mVar_gl_FragData = nullptr; >+ TVariable *mVar_gl_SecondaryFragDataEXT = nullptr; >+ TVariable *mVar_gl_FragDepthEXT = nullptr; >+ TVariable *mVar_gl_LastFragData = nullptr; >+ TVariable *mVar_gl_LastFragDataNV = nullptr; >+ TInterfaceBlock *mVar_gl_PerVertex = nullptr; >+ TVariable *mVar_gl_in = nullptr; >+ TVariable *mVar_gl_PositionGS = nullptr; >+}; >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_SYMBOLTABLE_AUTOGEN_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolUniqueId.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolUniqueId.cpp >index 2a68ae3e70c..3aeb80b708a 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolUniqueId.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolUniqueId.cpp >@@ -13,16 +13,15 @@ namespace sh > { > > TSymbolUniqueId::TSymbolUniqueId(TSymbolTable *symbolTable) : mId(symbolTable->nextUniqueIdValue()) >-{ >-} >+{} > >-TSymbolUniqueId::TSymbolUniqueId(const TSymbol &symbol) : mId(symbol.getUniqueId().get()) >-{ >-} >+TSymbolUniqueId::TSymbolUniqueId(const TSymbol &symbol) : mId(symbol.uniqueId().get()) {} >+ >+TSymbolUniqueId &TSymbolUniqueId::operator=(const TSymbolUniqueId &) = default; > >-int TSymbolUniqueId::get() const >+bool TSymbolUniqueId::operator==(const TSymbolUniqueId &other) const > { >- return mId; >+ return mId == other.mId; > } > > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolUniqueId.h b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolUniqueId.h >index 4bd5604246c..7d0979e2666 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolUniqueId.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolUniqueId.h >@@ -19,18 +19,40 @@ class TSymbol; > class TSymbolUniqueId > { > public: >- POOL_ALLOCATOR_NEW_DELETE(); >- explicit TSymbolUniqueId(TSymbolTable *symbolTable); >+ POOL_ALLOCATOR_NEW_DELETE > explicit TSymbolUniqueId(const TSymbol &symbol); >- TSymbolUniqueId(const TSymbolUniqueId &) = default; >- TSymbolUniqueId &operator=(const TSymbolUniqueId &) = default; >+ constexpr TSymbolUniqueId(const TSymbolUniqueId &) = default; >+ TSymbolUniqueId &operator =(const TSymbolUniqueId &); >+ bool operator==(const TSymbolUniqueId &) const; > >- int get() const; >+ constexpr int get() const { return mId; } > > private: >+ friend class TSymbolTable; >+ explicit TSymbolUniqueId(TSymbolTable *symbolTable); >+ >+ friend class BuiltInId; >+ constexpr TSymbolUniqueId(int staticId) : mId(staticId) {} >+ > int mId; > }; > >+enum class SymbolType >+{ >+ BuiltIn, >+ UserDefined, >+ AngleInternal, >+ Empty // Meaning symbol without a name. >+}; >+ >+enum class SymbolClass >+{ >+ Function, >+ Variable, >+ Struct, >+ InterfaceBlock >+}; >+ > } // namespace sh > > #endif // COMPILER_TRANSLATOR_SYMBOLUNIQUEID_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TextureFunctionHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TextureFunctionHLSL.cpp >index d2b65a6c568..28208bcae82 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TextureFunctionHLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TextureFunctionHLSL.cpp >@@ -11,6 +11,7 @@ > > #include "compiler/translator/TextureFunctionHLSL.h" > >+#include "compiler/translator/ImmutableStringBuilder.h" > #include "compiler/translator/UtilsHLSL.h" > > namespace sh >@@ -22,8 +23,8 @@ namespace > void OutputIntTexCoordWrap(TInfoSinkBase &out, > const char *wrapMode, > const char *size, >- const TString &texCoord, >- const TString &texCoordOffset, >+ const ImmutableString &texCoord, >+ const char *texCoordOffset, > const char *texCoordOutName) > { > // GLES 3.0.4 table 3.22 specifies how the wrap modes work. We don't use the formulas verbatim >@@ -31,17 +32,27 @@ void OutputIntTexCoordWrap(TInfoSinkBase &out, > out << "int " << texCoordOutName << ";\n"; > out << "float " << texCoordOutName << "Offset = " << texCoord << " + float(" << texCoordOffset > << ") / " << size << ";\n"; >+ out << "bool " << texCoordOutName << "UseBorderColor = false;\n"; > > // CLAMP_TO_EDGE >- out << "if (" << wrapMode << " == 1)\n"; >+ out << "if (" << wrapMode << " == 0)\n"; > out << "{\n"; > out << " " << texCoordOutName << " = clamp(int(floor(" << size << " * " << texCoordOutName > << "Offset)), 0, int(" << size << ") - 1);\n"; > out << "}\n"; > >- // MIRRORED_REPEAT >+ // CLAMP_TO_BORDER > out << "else if (" << wrapMode << " == 3)\n"; > out << "{\n"; >+ out << " int texCoordInt = int(floor(" << size << " * " << texCoordOutName << "Offset));\n"; >+ out << " " << texCoordOutName << " = clamp(texCoordInt, 0, int(" << size << ") - 1);\n"; >+ out << " " << texCoordOutName << "UseBorderColor = (texCoordInt != " << texCoordOutName >+ << ");\n"; >+ out << "}\n"; >+ >+ // MIRRORED_REPEAT >+ out << "else if (" << wrapMode << " == 2)\n"; >+ out << "{\n"; > out << " float coordWrapped = 1.0 - abs(frac(abs(" << texCoordOutName > << "Offset) * 0.5) * 2.0 - 1.0);\n"; > out << " " << texCoordOutName << " = int(floor(" << size << " * coordWrapped));\n"; >@@ -57,9 +68,9 @@ void OutputIntTexCoordWrap(TInfoSinkBase &out, > > void OutputIntTexCoordWraps(TInfoSinkBase &out, > const TextureFunctionHLSL::TextureFunction &textureFunction, >- TString *texCoordX, >- TString *texCoordY, >- TString *texCoordZ) >+ ImmutableString *texCoordX, >+ ImmutableString *texCoordY, >+ ImmutableString *texCoordZ) > { > // Convert from normalized floating-point to integer > out << "int wrapS = samplerMetadata[samplerIndex].wrapModes & 0x3;\n"; >@@ -71,7 +82,7 @@ void OutputIntTexCoordWraps(TInfoSinkBase &out, > { > OutputIntTexCoordWrap(out, "wrapS", "width", *texCoordX, "0", "tix"); > } >- *texCoordX = "tix"; >+ *texCoordX = ImmutableString("tix"); > out << "int wrapT = (samplerMetadata[samplerIndex].wrapModes >> 2) & 0x3;\n"; > if (textureFunction.offset) > { >@@ -81,11 +92,13 @@ void OutputIntTexCoordWraps(TInfoSinkBase &out, > { > OutputIntTexCoordWrap(out, "wrapT", "height", *texCoordY, "0", "tiy"); > } >- *texCoordY = "tiy"; >+ *texCoordY = ImmutableString("tiy"); >+ >+ bool tizAvailable = false; > > if (IsSamplerArray(textureFunction.sampler)) > { >- *texCoordZ = "int(max(0, min(layers - 1, floor(0.5 + t.z))))"; >+ *texCoordZ = ImmutableString("int(max(0, min(layers - 1, floor(0.5 + t.z))))"); > } > else if (!IsSamplerCube(textureFunction.sampler) && !IsSampler2D(textureFunction.sampler)) > { >@@ -98,14 +111,18 @@ void OutputIntTexCoordWraps(TInfoSinkBase &out, > { > OutputIntTexCoordWrap(out, "wrapR", "depth", *texCoordZ, "0", "tiz"); > } >- *texCoordZ = "tiz"; >+ *texCoordZ = ImmutableString("tiz"); >+ tizAvailable = true; > } >+ >+ out << "bool useBorderColor = tixUseBorderColor || tiyUseBorderColor" >+ << (tizAvailable ? " || tizUseBorderColor" : "") << ";\n"; > } > > void OutputHLSL4SampleFunctionPrefix(TInfoSinkBase &out, > const TextureFunctionHLSL::TextureFunction &textureFunction, >- const TString &textureReference, >- const TString &samplerReference) >+ const ImmutableString &textureReference, >+ const ImmutableString &samplerReference) > { > out << textureReference; > if (IsIntegerSampler(textureFunction.sampler) || >@@ -162,20 +179,33 @@ const char *GetSamplerCoordinateTypeString( > const TextureFunctionHLSL::TextureFunction &textureFunction, > int hlslCoords) > { >- if (IsIntegerSampler(textureFunction.sampler) || >+ // Gather[Red|Green|Blue|Alpha] accepts float texture coordinates on textures in integer or >+ // unsigned integer formats. >+ // https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx-graphics-hlsl-to-gather >+ if ((IsIntegerSampler(textureFunction.sampler) && >+ textureFunction.method != TextureFunctionHLSL::TextureFunction::GATHER) || > textureFunction.method == TextureFunctionHLSL::TextureFunction::FETCH) > { > switch (hlslCoords) > { > case 2: >- if (textureFunction.sampler == EbtSampler2DMS || >- textureFunction.sampler == EbtISampler2DMS || >- textureFunction.sampler == EbtUSampler2DMS) >+ if (IsSampler2DMS(textureFunction.sampler)) >+ { > return "int2"; >+ } > else >+ { > return "int3"; >+ } > case 3: >- return "int4"; >+ if (IsSampler2DMSArray(textureFunction.sampler)) >+ { >+ return "int3"; >+ } >+ else >+ { >+ return "int4"; >+ } > default: > UNREACHABLE(); > } >@@ -233,49 +263,13 @@ int GetHLSLCoordCount(const TextureFunctionHLSL::TextureFunction &textureFunctio > } > else > { >- switch (textureFunction.sampler) >+ if (IsSampler3D(textureFunction.sampler) || IsSamplerArray(textureFunction.sampler) || >+ IsSamplerCube(textureFunction.sampler)) > { >- case EbtSampler2D: >- return 2; >- case EbtSampler2DMS: >- return 2; >- case EbtSampler3D: >- return 3; >- case EbtSamplerCube: >- return 3; >- case EbtSampler2DArray: >- return 3; >- case EbtSamplerExternalOES: >- return 2; >- case EbtISampler2D: >- return 2; >- case EbtISampler2DMS: >- return 2; >- case EbtISampler3D: >- return 3; >- case EbtISamplerCube: >- return 3; >- case EbtISampler2DArray: >- return 3; >- case EbtUSampler2D: >- return 2; >- case EbtUSampler2DMS: >- return 2; >- case EbtUSampler3D: >- return 3; >- case EbtUSamplerCube: >- return 3; >- case EbtUSampler2DArray: >- return 3; >- case EbtSampler2DShadow: >- return 2; >- case EbtSamplerCubeShadow: >- return 3; >- case EbtSampler2DArrayShadow: >- return 3; >- default: >- UNREACHABLE(); >+ return 3; > } >+ ASSERT(IsSampler2D(textureFunction.sampler)); >+ return 2; > } > return 0; > } >@@ -399,19 +393,26 @@ void OutputTextureFunctionArgumentList(TInfoSinkBase &out, > case TextureFunctionHLSL::TextureFunction::SIZE: > break; > case TextureFunctionHLSL::TextureFunction::FETCH: >- if (textureFunction.sampler == EbtSampler2DMS || >- textureFunction.sampler == EbtISampler2DMS || >- textureFunction.sampler == EbtUSampler2DMS) >+ if (IsSampler2DMS(textureFunction.sampler) || >+ IsSampler2DMSArray(textureFunction.sampler)) > out << ", int index"; > else > out << ", int mip"; > break; > case TextureFunctionHLSL::TextureFunction::GRAD: > break; >+ case TextureFunctionHLSL::TextureFunction::GATHER: >+ break; > default: > UNREACHABLE(); > } > >+ if (textureFunction.method == TextureFunctionHLSL::TextureFunction::GATHER && >+ IsShadowSampler(textureFunction.sampler)) >+ { >+ out << ", float refZ"; >+ } >+ > if (textureFunction.offset) > { > switch (textureFunction.sampler) >@@ -429,13 +430,11 @@ void OutputTextureFunctionArgumentList(TInfoSinkBase &out, > case EbtUSampler2DArray: > case EbtSampler2DShadow: > case EbtSampler2DArrayShadow: >- case EbtSampler2DMS: >- case EbtISampler2DMS: >- case EbtUSampler2DMS: > case EbtSamplerExternalOES: > out << ", int2 offset"; > break; > default: >+ // Offset is not supported for multisampled textures. > UNREACHABLE(); > } > } >@@ -445,42 +444,66 @@ void OutputTextureFunctionArgumentList(TInfoSinkBase &out, > { > out << ", float bias"; > } >+ else if (textureFunction.method == TextureFunctionHLSL::TextureFunction::GATHER && >+ !IsShadowSampler(textureFunction.sampler)) >+ { >+ out << ", int comp = 0"; >+ } > } > > void GetTextureReference(TInfoSinkBase &out, > const TextureFunctionHLSL::TextureFunction &textureFunction, > const ShShaderOutput outputType, >- TString *textureReference, >- TString *samplerReference) >+ ImmutableString *textureReference, >+ ImmutableString *samplerReference) > { > if (outputType == SH_HLSL_4_1_OUTPUT) > { >- TString suffix = TextureGroupSuffix(textureFunction.sampler); >+ static const ImmutableString kTexturesStr("textures"); >+ static const ImmutableString kSamplersStr("samplers"); >+ static const ImmutableString kSamplerIndexStr("[samplerIndex]"); >+ static const ImmutableString kTextureIndexStr("[textureIndex]"); >+ static const ImmutableString kSamplerArrayIndexStr("[samplerArrayIndex]"); >+ ImmutableString suffix(TextureGroupSuffix(textureFunction.sampler)); >+ > if (TextureGroup(textureFunction.sampler) == HLSL_TEXTURE_2D) > { >- *textureReference = TString("textures") + suffix + "[samplerIndex]"; >- *samplerReference = TString("samplers") + suffix + "[samplerIndex]"; >+ ImmutableStringBuilder textureRefBuilder(kTexturesStr.length() + suffix.length() + >+ kSamplerIndexStr.length()); >+ textureRefBuilder << kTexturesStr << suffix << kSamplerIndexStr; >+ *textureReference = textureRefBuilder; >+ ImmutableStringBuilder samplerRefBuilder(kSamplersStr.length() + suffix.length() + >+ kSamplerIndexStr.length()); >+ samplerRefBuilder << kSamplersStr << suffix << kSamplerIndexStr; >+ *samplerReference = samplerRefBuilder; > } > else > { >- out << " const uint textureIndex = samplerIndex - textureIndexOffset" << suffix >- << ";\n"; >- *textureReference = TString("textures") + suffix + "[textureIndex]"; >- out << " const uint samplerArrayIndex = samplerIndex - samplerIndexOffset" << suffix >- << ";\n"; >- *samplerReference = TString("samplers") + suffix + "[samplerArrayIndex]"; >+ out << " const uint textureIndex = samplerIndex - textureIndexOffset" >+ << suffix.data() << ";\n"; >+ ImmutableStringBuilder textureRefBuilder(kTexturesStr.length() + suffix.length() + >+ kTextureIndexStr.length()); >+ textureRefBuilder << kTexturesStr << suffix << kTextureIndexStr; >+ *textureReference = textureRefBuilder; >+ >+ out << " const uint samplerArrayIndex = samplerIndex - samplerIndexOffset" >+ << suffix.data() << ";\n"; >+ ImmutableStringBuilder samplerRefBuilder(kSamplersStr.length() + suffix.length() + >+ kSamplerArrayIndexStr.length()); >+ samplerRefBuilder << kSamplersStr << suffix << kSamplerArrayIndexStr; >+ *samplerReference = samplerRefBuilder; > } > } > else > { >- *textureReference = "x"; >- *samplerReference = "s"; >+ *textureReference = ImmutableString("x"); >+ *samplerReference = ImmutableString("s"); > } > } > > void OutputTextureSizeFunctionBody(TInfoSinkBase &out, > const TextureFunctionHLSL::TextureFunction &textureFunction, >- const TString &textureReference, >+ const ImmutableString &textureReference, > bool getDimensionsIgnoresBaseLevel) > { > if (IsSampler2DMS(textureFunction.sampler)) >@@ -488,6 +511,11 @@ void OutputTextureSizeFunctionBody(TInfoSinkBase &out, > out << " uint width; uint height; uint samples;\n" > << " " << textureReference << ".GetDimensions(width, height, samples);\n"; > } >+ else if (IsSampler2DMSArray(textureFunction.sampler)) >+ { >+ out << " uint width; uint height; uint depth; uint samples;\n" >+ << " " << textureReference << ".GetDimensions(width, height, depth, samples);\n"; >+ } > else > { > if (getDimensionsIgnoresBaseLevel) >@@ -537,27 +565,33 @@ void OutputTextureSizeFunctionBody(TInfoSinkBase &out, > } > > void ProjectTextureCoordinates(const TextureFunctionHLSL::TextureFunction &textureFunction, >- TString *texCoordX, >- TString *texCoordY, >- TString *texCoordZ) >+ ImmutableString *texCoordX, >+ ImmutableString *texCoordY, >+ ImmutableString *texCoordZ) > { > if (textureFunction.proj) > { >- TString proj(""); >+ ImmutableString proj(""); > switch (textureFunction.coords) > { > case 3: >- proj = " / t.z"; >+ proj = ImmutableString(" / t.z"); > break; > case 4: >- proj = " / t.w"; >+ proj = ImmutableString(" / t.w"); > break; > default: > UNREACHABLE(); > } >- *texCoordX = "(" + *texCoordX + proj + ")"; >- *texCoordY = "(" + *texCoordY + proj + ")"; >- *texCoordZ = "(" + *texCoordZ + proj + ")"; >+ ImmutableStringBuilder texCoordXBuilder(texCoordX->length() + proj.length() + 2u); >+ texCoordXBuilder << '(' << *texCoordX << proj << ')'; >+ *texCoordX = texCoordXBuilder; >+ ImmutableStringBuilder texCoordYBuilder(texCoordY->length() + proj.length() + 2u); >+ texCoordYBuilder << '(' << *texCoordY << proj << ')'; >+ *texCoordY = texCoordYBuilder; >+ ImmutableStringBuilder texCoordZBuilder(texCoordZ->length() + proj.length() + 2u); >+ texCoordZBuilder << '(' << *texCoordZ << proj << ')'; >+ *texCoordZ = texCoordZBuilder; > } > } > >@@ -565,10 +599,10 @@ void OutputIntegerTextureSampleFunctionComputations( > TInfoSinkBase &out, > const TextureFunctionHLSL::TextureFunction &textureFunction, > const ShShaderOutput outputType, >- const TString &textureReference, >- TString *texCoordX, >- TString *texCoordY, >- TString *texCoordZ) >+ const ImmutableString &textureReference, >+ ImmutableString *texCoordX, >+ ImmutableString *texCoordY, >+ ImmutableString *texCoordZ) > { > if (!IsIntegerSampler(textureFunction.sampler)) > { >@@ -656,104 +690,108 @@ void OutputIntegerTextureSampleFunctionComputations( > } > > // Convert from normalized floating-point to integer >- *texCoordX = "int(floor(width * frac(" + *texCoordX + ")))"; >- *texCoordY = "int(floor(height * frac(" + *texCoordY + ")))"; >- *texCoordZ = "face"; >+ static const ImmutableString kXPrefix("int(floor(width * frac("); >+ static const ImmutableString kYPrefix("int(floor(height * frac("); >+ static const ImmutableString kSuffix(")))"); >+ ImmutableStringBuilder texCoordXBuilder(kXPrefix.length() + texCoordX->length() + >+ kSuffix.length()); >+ texCoordXBuilder << kXPrefix << *texCoordX << kSuffix; >+ *texCoordX = texCoordXBuilder; >+ ImmutableStringBuilder texCoordYBuilder(kYPrefix.length() + texCoordX->length() + >+ kSuffix.length()); >+ texCoordYBuilder << kYPrefix << *texCoordY << kSuffix; >+ *texCoordY = texCoordYBuilder; >+ *texCoordZ = ImmutableString("face"); > } > else if (textureFunction.method != TextureFunctionHLSL::TextureFunction::FETCH) > { >- if (IsSampler2D(textureFunction.sampler)) >+ if (IsSamplerArray(textureFunction.sampler)) > { >- if (IsSamplerArray(textureFunction.sampler)) >+ out << " float width; float height; float layers; float levels;\n"; >+ >+ if (textureFunction.method == TextureFunctionHLSL::TextureFunction::LOD0) >+ { >+ out << " uint mip = 0;\n"; >+ } >+ else if (textureFunction.method == TextureFunctionHLSL::TextureFunction::LOD0BIAS) >+ { >+ out << " uint mip = bias;\n"; >+ } >+ else > { >- out << " float width; float height; float layers; float levels;\n"; > >- if (textureFunction.method == TextureFunctionHLSL::TextureFunction::LOD0) >+ out << " " << textureReference >+ << ".GetDimensions(0, width, height, layers, levels);\n"; >+ if (textureFunction.method == TextureFunctionHLSL::TextureFunction::IMPLICIT || >+ textureFunction.method == TextureFunctionHLSL::TextureFunction::BIAS) > { >- out << " uint mip = 0;\n"; >+ out << " float2 tSized = float2(t.x * width, t.y * height);\n" >+ " float dx = length(ddx(tSized));\n" >+ " float dy = length(ddy(tSized));\n" >+ " float lod = log2(max(dx, dy));\n"; >+ >+ if (textureFunction.method == TextureFunctionHLSL::TextureFunction::BIAS) >+ { >+ out << " lod += bias;\n"; >+ } > } >- else if (textureFunction.method == TextureFunctionHLSL::TextureFunction::LOD0BIAS) >+ else if (textureFunction.method == TextureFunctionHLSL::TextureFunction::GRAD) > { >- out << " uint mip = bias;\n"; >+ out << " float2 sizeVec = float2(width, height);\n" >+ " float2 sizeDdx = ddx * sizeVec;\n" >+ " float2 sizeDdy = ddy * sizeVec;\n" >+ " float lod = log2(max(dot(sizeDdx, sizeDdx), " >+ "dot(sizeDdy, sizeDdy))) * 0.5f;\n"; > } >- else >- { > >- out << " " << textureReference >- << ".GetDimensions(0, width, height, layers, levels);\n"; >- if (textureFunction.method == TextureFunctionHLSL::TextureFunction::IMPLICIT || >- textureFunction.method == TextureFunctionHLSL::TextureFunction::BIAS) >- { >- out << " float2 tSized = float2(t.x * width, t.y * height);\n" >- " float dx = length(ddx(tSized));\n" >- " float dy = length(ddy(tSized));\n" >- " float lod = log2(max(dx, dy));\n"; >- >- if (textureFunction.method == TextureFunctionHLSL::TextureFunction::BIAS) >- { >- out << " lod += bias;\n"; >- } >- } >- else if (textureFunction.method == TextureFunctionHLSL::TextureFunction::GRAD) >- { >- out << " float2 sizeVec = float2(width, height);\n" >- " float2 sizeDdx = ddx * sizeVec;\n" >- " float2 sizeDdy = ddy * sizeVec;\n" >- " float lod = log2(max(dot(sizeDdx, sizeDdx), " >- "dot(sizeDdy, sizeDdy))) * 0.5f;\n"; >- } >+ out << " uint mip = uint(min(max(round(lod), 0), levels - 1));\n"; >+ } > >- out << " uint mip = uint(min(max(round(lod), 0), levels - 1));\n"; >- } >+ out << " " << textureReference >+ << ".GetDimensions(mip, width, height, layers, levels);\n"; >+ } >+ else if (IsSampler2D(textureFunction.sampler)) >+ { >+ out << " float width; float height; float levels;\n"; > >- out << " " << textureReference >- << ".GetDimensions(mip, width, height, layers, levels);\n"; >+ if (textureFunction.method == TextureFunctionHLSL::TextureFunction::LOD0) >+ { >+ out << " uint mip = 0;\n"; >+ } >+ else if (textureFunction.method == TextureFunctionHLSL::TextureFunction::LOD0BIAS) >+ { >+ out << " uint mip = bias;\n"; > } > else > { >- out << " float width; float height; float levels;\n"; >+ out << " " << textureReference << ".GetDimensions(0, width, height, levels);\n"; > >- if (textureFunction.method == TextureFunctionHLSL::TextureFunction::LOD0) >- { >- out << " uint mip = 0;\n"; >- } >- else if (textureFunction.method == TextureFunctionHLSL::TextureFunction::LOD0BIAS) >- { >- out << " uint mip = bias;\n"; >- } >- else >+ if (textureFunction.method == TextureFunctionHLSL::TextureFunction::IMPLICIT || >+ textureFunction.method == TextureFunctionHLSL::TextureFunction::BIAS) > { >- out << " " << textureReference >- << ".GetDimensions(0, width, height, levels);\n"; >+ out << " float2 tSized = float2(t.x * width, t.y * height);\n" >+ " float dx = length(ddx(tSized));\n" >+ " float dy = length(ddy(tSized));\n" >+ " float lod = log2(max(dx, dy));\n"; > >- if (textureFunction.method == TextureFunctionHLSL::TextureFunction::IMPLICIT || >- textureFunction.method == TextureFunctionHLSL::TextureFunction::BIAS) >- { >- out << " float2 tSized = float2(t.x * width, t.y * height);\n" >- " float dx = length(ddx(tSized));\n" >- " float dy = length(ddy(tSized));\n" >- " float lod = log2(max(dx, dy));\n"; >- >- if (textureFunction.method == TextureFunctionHLSL::TextureFunction::BIAS) >- { >- out << " lod += bias;\n"; >- } >- } >- else if (textureFunction.method == TextureFunctionHLSL::TextureFunction::GRAD) >+ if (textureFunction.method == TextureFunctionHLSL::TextureFunction::BIAS) > { >- out << " float2 sizeVec = float2(width, height);\n" >- " float2 sizeDdx = ddx * sizeVec;\n" >- " float2 sizeDdy = ddy * sizeVec;\n" >- " float lod = log2(max(dot(sizeDdx, sizeDdx), " >- "dot(sizeDdy, sizeDdy))) * 0.5f;\n"; >+ out << " lod += bias;\n"; > } >- >- out << " uint mip = uint(min(max(round(lod), 0), levels - 1));\n"; >+ } >+ else if (textureFunction.method == TextureFunctionHLSL::TextureFunction::GRAD) >+ { >+ out << " float2 sizeVec = float2(width, height);\n" >+ " float2 sizeDdx = ddx * sizeVec;\n" >+ " float2 sizeDdy = ddy * sizeVec;\n" >+ " float lod = log2(max(dot(sizeDdx, sizeDdx), " >+ "dot(sizeDdy, sizeDdy))) * 0.5f;\n"; > } > >- out << " " << textureReference >- << ".GetDimensions(mip, width, height, levels);\n"; >+ out << " uint mip = uint(min(max(round(lod), 0), levels - 1));\n"; > } >+ >+ out << " " << textureReference << ".GetDimensions(mip, width, height, levels);\n"; > } > else if (IsSampler3D(textureFunction.sampler)) > { >@@ -807,18 +845,95 @@ void OutputIntegerTextureSampleFunctionComputations( > } > } > >+void OutputTextureGatherFunctionBody(TInfoSinkBase &out, >+ const TextureFunctionHLSL::TextureFunction &textureFunction, >+ ShShaderOutput outputType, >+ const ImmutableString &textureReference, >+ const ImmutableString &samplerReference, >+ const ImmutableString &texCoordX, >+ const ImmutableString &texCoordY, >+ const ImmutableString &texCoordZ) >+{ >+ const int hlslCoords = GetHLSLCoordCount(textureFunction, outputType); >+ ImmutableString samplerCoordTypeString( >+ GetSamplerCoordinateTypeString(textureFunction, hlslCoords)); >+ ImmutableStringBuilder samplerCoordBuilder( >+ samplerCoordTypeString.length() + strlen("(") + texCoordX.length() + strlen(", ") + >+ texCoordY.length() + strlen(", ") + texCoordZ.length() + strlen(")")); >+ >+ samplerCoordBuilder << samplerCoordTypeString << "(" << texCoordX << ", " << texCoordY; >+ if (hlslCoords >= 3) >+ { >+ if (textureFunction.coords < 3) >+ { >+ samplerCoordBuilder << ", 0"; >+ } >+ else >+ { >+ samplerCoordBuilder << ", " << texCoordZ; >+ } >+ } >+ samplerCoordBuilder << ")"; >+ >+ ImmutableString samplerCoordString(samplerCoordBuilder); >+ >+ if (IsShadowSampler(textureFunction.sampler)) >+ { >+ out << "return " << textureReference << ".GatherCmp(" << samplerReference << ", " >+ << samplerCoordString << ", refZ"; >+ if (textureFunction.offset) >+ { >+ out << ", offset"; >+ } >+ out << ");\n"; >+ return; >+ } >+ >+ constexpr std::array<const char *, 4> kHLSLGatherFunctions = { >+ {"GatherRed", "GatherGreen", "GatherBlue", "GatherAlpha"}}; >+ >+ out << " switch(comp)\n" >+ " {\n"; >+ for (size_t component = 0; component < kHLSLGatherFunctions.size(); ++component) >+ { >+ out << " case " << component << ":\n" >+ << " return " << textureReference << "." << kHLSLGatherFunctions[component] >+ << "(" << samplerReference << ", " << samplerCoordString; >+ if (textureFunction.offset) >+ { >+ out << ", offset"; >+ } >+ out << ");\n"; >+ } >+ >+ out << " default:\n" >+ " return float4(0.0, 0.0, 0.0, 1.0);\n" >+ " }\n"; >+} >+ > void OutputTextureSampleFunctionReturnStatement( > TInfoSinkBase &out, > const TextureFunctionHLSL::TextureFunction &textureFunction, > const ShShaderOutput outputType, >- const TString &textureReference, >- const TString &samplerReference, >- const TString &texCoordX, >- const TString &texCoordY, >- const TString &texCoordZ) >+ const ImmutableString &textureReference, >+ const ImmutableString &samplerReference, >+ const ImmutableString &texCoordX, >+ const ImmutableString &texCoordY, >+ const ImmutableString &texCoordZ) > { > out << " return "; > >+ if (IsIntegerSampler(textureFunction.sampler) && !IsSamplerCube(textureFunction.sampler) && >+ textureFunction.method != TextureFunctionHLSL::TextureFunction::FETCH) >+ { >+ out << " useBorderColor ? "; >+ if (IsIntegerSamplerUnsigned(textureFunction.sampler)) >+ { >+ out << "asuint"; >+ } >+ out << "(samplerMetadata[samplerIndex].intBorderColor) : "; >+ } >+ > // HLSL intrinsic > if (outputType == SH_HLSL_3_0_OUTPUT) > { >@@ -956,9 +1071,8 @@ void OutputTextureSampleFunctionReturnStatement( > else if (IsIntegerSampler(textureFunction.sampler) || > textureFunction.method == TextureFunctionHLSL::TextureFunction::FETCH) > { >- if (textureFunction.sampler == EbtSampler2DMS || >- textureFunction.sampler == EbtISampler2DMS || >- textureFunction.sampler == EbtUSampler2DMS) >+ if (IsSampler2DMS(textureFunction.sampler) || >+ IsSampler2DMSArray(textureFunction.sampler)) > out << "), index"; > else > out << ", mip)"; >@@ -1026,22 +1140,28 @@ void OutputTextureSampleFunctionReturnStatement( > > } // Anonymous namespace > >-TString TextureFunctionHLSL::TextureFunction::name() const >+ImmutableString TextureFunctionHLSL::TextureFunction::name() const > { >- TString name = "gl_texture"; >+ static const ImmutableString kGlTextureName("gl_texture"); >+ >+ ImmutableString suffix(TextureTypeSuffix(this->sampler)); >+ >+ ImmutableStringBuilder name(kGlTextureName.length() + suffix.length() + 4u + 6u + 5u); >+ >+ name << kGlTextureName; > > // We need to include full the sampler type in the function name to make the signature unique > // on D3D11, where samplers are passed to texture functions as indices. >- name += TextureTypeSuffix(this->sampler); >+ name << suffix; > > if (proj) > { >- name += "Proj"; >+ name << "Proj"; > } > > if (offset) > { >- name += "Offset"; >+ name << "Offset"; > } > > switch (method) >@@ -1051,22 +1171,25 @@ TString TextureFunctionHLSL::TextureFunction::name() const > case BIAS: > break; // Extra parameter makes the signature unique > case LOD: >- name += "Lod"; >+ name << "Lod"; > break; > case LOD0: >- name += "Lod0"; >+ name << "Lod0"; > break; > case LOD0BIAS: >- name += "Lod0"; >+ name << "Lod0"; > break; // Extra parameter makes the signature unique > case SIZE: >- name += "Size"; >+ name << "Size"; > break; > case FETCH: >- name += "Fetch"; >+ name << "Fetch"; > break; > case GRAD: >- name += "Grad"; >+ name << "Grad"; >+ break; >+ case GATHER: >+ name << "Gather"; > break; > default: > UNREACHABLE(); >@@ -1100,6 +1223,9 @@ const char *TextureFunctionHLSL::TextureFunction::getReturnType() const > case EbtSampler2DArray: > case EbtISampler2DArray: > case EbtUSampler2DArray: >+ case EbtSampler2DMSArray: >+ case EbtISampler2DMSArray: >+ case EbtUSampler2DMSArray: > case EbtSampler2DArrayShadow: > return "int3"; > default: >@@ -1112,6 +1238,7 @@ const char *TextureFunctionHLSL::TextureFunction::getReturnType() const > { > case EbtSampler2D: > case EbtSampler2DMS: >+ case EbtSampler2DMSArray: > case EbtSampler3D: > case EbtSamplerCube: > case EbtSampler2DArray: >@@ -1119,12 +1246,14 @@ const char *TextureFunctionHLSL::TextureFunction::getReturnType() const > return "float4"; > case EbtISampler2D: > case EbtISampler2DMS: >+ case EbtISampler2DMSArray: > case EbtISampler3D: > case EbtISamplerCube: > case EbtISampler2DArray: > return "int4"; > case EbtUSampler2D: > case EbtUSampler2DMS: >+ case EbtUSampler2DMSArray: > case EbtUSampler3D: > case EbtUSamplerCube: > case EbtUSampler2DArray: >@@ -1132,7 +1261,14 @@ const char *TextureFunctionHLSL::TextureFunction::getReturnType() const > case EbtSampler2DShadow: > case EbtSamplerCubeShadow: > case EbtSampler2DArrayShadow: >- return "float"; >+ if (method == TextureFunctionHLSL::TextureFunction::GATHER) >+ { >+ return "float4"; >+ } >+ else >+ { >+ return "float"; >+ } > default: > UNREACHABLE(); > } >@@ -1146,12 +1282,12 @@ bool TextureFunctionHLSL::TextureFunction::operator<(const TextureFunction &rhs) > std::tie(rhs.sampler, rhs.coords, rhs.proj, rhs.offset, rhs.method); > } > >-TString TextureFunctionHLSL::useTextureFunction(const TString &name, >- TBasicType samplerType, >- int coords, >- size_t argumentCount, >- bool lod0, >- sh::GLenum shaderType) >+ImmutableString TextureFunctionHLSL::useTextureFunction(const ImmutableString &name, >+ TBasicType samplerType, >+ int coords, >+ size_t argumentCount, >+ bool lod0, >+ sh::GLenum shaderType) > { > TextureFunction textureFunction; > textureFunction.sampler = samplerType; >@@ -1236,6 +1372,15 @@ TString TextureFunctionHLSL::useTextureFunction(const TString &name, > textureFunction.proj = true; > textureFunction.offset = true; > } >+ else if (name == "textureGather") >+ { >+ textureFunction.method = TextureFunction::GATHER; >+ } >+ else if (name == "textureGatherOffset") >+ { >+ textureFunction.method = TextureFunction::GATHER; >+ textureFunction.offset = true; >+ } > else > UNREACHABLE(); > >@@ -1251,7 +1396,7 @@ TString TextureFunctionHLSL::useTextureFunction(const TString &name, > > bool bias = (argumentCount > mandatoryArgumentCount); // Bias argument is optional > >- if (lod0 || shaderType == GL_VERTEX_SHADER) >+ if (lod0 || shaderType == GL_VERTEX_SHADER || shaderType == GL_COMPUTE_SHADER) > { > if (bias) > { >@@ -1291,8 +1436,8 @@ void TextureFunctionHLSL::textureFunctionHeader(TInfoSinkBase &out, > // sampling we need to call the function directly on references to the texture and sampler > // arrays. The bug was found using dEQP-GLES3.functional.shaders.discard*loop_texture* > // tests. >- TString textureReference; >- TString samplerReference; >+ ImmutableString textureReference(""); >+ ImmutableString samplerReference(""); > GetTextureReference(out, textureFunction, outputType, &textureReference, &samplerReference); > > if (textureFunction.method == TextureFunction::SIZE) >@@ -1302,16 +1447,24 @@ void TextureFunctionHLSL::textureFunctionHeader(TInfoSinkBase &out, > } > else > { >- TString texCoordX("t.x"); >- TString texCoordY("t.y"); >- TString texCoordZ("t.z"); >- ProjectTextureCoordinates(textureFunction, &texCoordX, &texCoordY, &texCoordZ); >- OutputIntegerTextureSampleFunctionComputations(out, textureFunction, outputType, >- textureReference, &texCoordX, &texCoordY, >- &texCoordZ); >- OutputTextureSampleFunctionReturnStatement(out, textureFunction, outputType, >- textureReference, samplerReference, >- texCoordX, texCoordY, texCoordZ); >+ ImmutableString texCoordX("t.x"); >+ ImmutableString texCoordY("t.y"); >+ ImmutableString texCoordZ("t.z"); >+ if (textureFunction.method == TextureFunction::GATHER) >+ { >+ OutputTextureGatherFunctionBody(out, textureFunction, outputType, textureReference, >+ samplerReference, texCoordX, texCoordY, texCoordZ); >+ } >+ else >+ { >+ ProjectTextureCoordinates(textureFunction, &texCoordX, &texCoordY, &texCoordZ); >+ OutputIntegerTextureSampleFunctionComputations(out, textureFunction, outputType, >+ textureReference, &texCoordX, >+ &texCoordY, &texCoordZ); >+ OutputTextureSampleFunctionReturnStatement(out, textureFunction, outputType, >+ textureReference, samplerReference, >+ texCoordX, texCoordY, texCoordZ); >+ } > } > > out << "}\n" >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TextureFunctionHLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/TextureFunctionHLSL.h >index 68bf8c0898c..98de98fff57 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TextureFunctionHLSL.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TextureFunctionHLSL.h >@@ -14,10 +14,10 @@ > > #include <set> > >+#include "GLSLANG/ShaderLang.h" > #include "compiler/translator/BaseTypes.h" > #include "compiler/translator/Common.h" > #include "compiler/translator/InfoSink.h" >-#include "GLSLANG/ShaderLang.h" > > namespace sh > { >@@ -37,10 +37,11 @@ class TextureFunctionHLSL final : angle::NonCopyable > LOD0BIAS, > SIZE, // textureSize() > FETCH, >- GRAD >+ GRAD, >+ GATHER > }; > >- TString name() const; >+ ImmutableString name() const; > > bool operator<(const TextureFunction &rhs) const; > >@@ -55,12 +56,12 @@ class TextureFunctionHLSL final : angle::NonCopyable > > // Returns the name of the texture function implementation to call. > // The name that's passed in is the name of the GLSL texture function that it should implement. >- TString useTextureFunction(const TString &name, >- TBasicType samplerType, >- int coords, >- size_t argumentCount, >- bool lod0, >- sh::GLenum shaderType); >+ ImmutableString useTextureFunction(const ImmutableString &name, >+ TBasicType samplerType, >+ int coords, >+ size_t argumentCount, >+ bool lod0, >+ sh::GLenum shaderType); > > void textureFunctionHeader(TInfoSinkBase &out, > const ShShaderOutput outputType, >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorESSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorESSL.cpp >index 23c967f9444..786a291e2c2 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorESSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorESSL.cpp >@@ -6,19 +6,18 @@ > > #include "compiler/translator/TranslatorESSL.h" > >+#include "angle_gl.h" > #include "compiler/translator/BuiltInFunctionEmulatorGLSL.h" >-#include "compiler/translator/EmulatePrecision.h" >-#include "compiler/translator/RecordConstantPrecision.h" > #include "compiler/translator/OutputESSL.h" >-#include "angle_gl.h" >+#include "compiler/translator/tree_ops/EmulatePrecision.h" >+#include "compiler/translator/tree_ops/RecordConstantPrecision.h" > > namespace sh > { > > TranslatorESSL::TranslatorESSL(sh::GLenum type, ShShaderSpec spec) > : TCompiler(type, spec, SH_ESSL_OUTPUT) >-{ >-} >+{} > > void TranslatorESSL::initBuiltInFunctionEmulator(BuiltInFunctionEmulator *emu, > ShCompileOptions compileOptions) >@@ -53,7 +52,7 @@ void TranslatorESSL::translate(TIntermBlock *root, > > if (precisionEmulation) > { >- EmulatePrecision emulatePrecision(&getSymbolTable(), shaderVer); >+ EmulatePrecision emulatePrecision(&getSymbolTable()); > root->traverse(&emulatePrecision); > emulatePrecision.updateTree(); > emulatePrecision.writeEmulationHelpers(sink, shaderVer, SH_ESSL_OUTPUT); >@@ -92,7 +91,7 @@ void TranslatorESSL::translate(TIntermBlock *root, > << ", local_size_z=" << localSize[2] << ") in;\n"; > } > >- if (getShaderType() == GL_GEOMETRY_SHADER_OES) >+ if (getShaderType() == GL_GEOMETRY_SHADER_EXT) > { > WriteGeometryShaderLayoutQualifiers( > sink, getGeometryShaderInputPrimitiveType(), getGeometryShaderInvocations(), >@@ -104,20 +103,21 @@ void TranslatorESSL::translate(TIntermBlock *root, > &getSymbolTable(), getShaderType(), shaderVer, precisionEmulation, > compileOptions); > >- if (compileOptions & SH_TRANSLATE_VIEWID_OVR_TO_UNIFORM) >- { >- TName uniformName(TString("ViewID_OVR")); >- uniformName.setInternal(true); >- sink << "highp uniform int " << outputESSL.hashName(uniformName) << ";\n"; >- } >- > root->traverse(&outputESSL); > } > > bool TranslatorESSL::shouldFlattenPragmaStdglInvariantAll() > { >- // Not necessary when translating to ESSL. >- return false; >+ // If following the spec to the letter, we should not flatten this pragma. >+ // However, the spec's wording means that the pragma applies only to outputs. >+ // This contradicts the spirit of using the pragma, >+ // because if the pragma is used in a vertex shader, >+ // the only way to be able to link it to a fragment shader >+ // is to manually qualify each of fragment shader's inputs as invariant. >+ // Which defeats the purpose of this pragma - temporarily make all varyings >+ // invariant for debugging. >+ // Thus, we should be non-conformant to spec's letter here and flatten. >+ return true; > } > > void TranslatorESSL::writeExtensionBehavior(ShCompileOptions compileOptions) >@@ -125,15 +125,14 @@ void TranslatorESSL::writeExtensionBehavior(ShCompileOptions compileOptions) > TInfoSinkBase &sink = getInfoSink().obj; > const TExtensionBehavior &extBehavior = getExtensionBehavior(); > const bool isMultiviewExtEmulated = >- (compileOptions & >- (SH_TRANSLATE_VIEWID_OVR_TO_UNIFORM | SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW | >- SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER)) != 0u; >+ (compileOptions & (SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW | >+ SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER)) != 0u; > for (TExtensionBehavior::const_iterator iter = extBehavior.begin(); iter != extBehavior.end(); > ++iter) > { > if (iter->second != EBhUndefined) > { >- const bool isMultiview = (iter->first == TExtension::OVR_multiview); >+ const bool isMultiview = (iter->first == TExtension::OVR_multiview2); > if (getResources().NV_shader_framebuffer_fetch && > iter->first == TExtension::EXT_shader_framebuffer_fetch) > { >@@ -152,17 +151,17 @@ void TranslatorESSL::writeExtensionBehavior(ShCompileOptions compileOptions) > { > // Emit the NV_viewport_array2 extension in a vertex shader if the > // SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER option is set and the >- // OVR_multiview(2) extension is requested. >+ // OVR_multiview2 extension is requested. > sink << "#extension GL_NV_viewport_array2 : require\n"; > } > } >- else if (iter->first == TExtension::OES_geometry_shader) >+ else if (iter->first == TExtension::EXT_geometry_shader) > { >- sink << "#ifdef GL_OES_geometry_shader\n" >- << "#extension GL_OES_geometry_shader : " << GetBehaviorString(iter->second) >- << "\n" >- << "#elif defined GL_EXT_geometry_shader\n" >+ sink << "#ifdef GL_EXT_geometry_shader\n" > << "#extension GL_EXT_geometry_shader : " << GetBehaviorString(iter->second) >+ << "\n" >+ << "#elif defined GL_OES_geometry_shader\n" >+ << "#extension GL_OES_geometry_shader : " << GetBehaviorString(iter->second) > << "\n"; > if (iter->second == EBhRequire) > { >@@ -172,6 +171,12 @@ void TranslatorESSL::writeExtensionBehavior(ShCompileOptions compileOptions) > } > sink << "#endif\n"; > } >+ else if (iter->first == TExtension::ANGLE_multi_draw) >+ { >+ // Don't emit anything. This extension is emulated >+ ASSERT((compileOptions & SH_EMULATE_GL_DRAW_ID) != 0); >+ continue; >+ } > else > { > sink << "#extension " << GetExtensionNameString(iter->first) << " : " >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorGLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorGLSL.cpp >index a14e69e5d5e..4bd8f548db6 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorGLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorGLSL.cpp >@@ -8,20 +8,19 @@ > > #include "angle_gl.h" > #include "compiler/translator/BuiltInFunctionEmulatorGLSL.h" >-#include "compiler/translator/EmulatePrecision.h" > #include "compiler/translator/ExtensionGLSL.h" > #include "compiler/translator/OutputGLSL.h" >-#include "compiler/translator/RewriteTexelFetchOffset.h" >-#include "compiler/translator/RewriteUnaryMinusOperatorFloat.h" > #include "compiler/translator/VersionGLSL.h" >+#include "compiler/translator/tree_ops/EmulatePrecision.h" >+#include "compiler/translator/tree_ops/RewriteTexelFetchOffset.h" >+#include "compiler/translator/tree_ops/RewriteUnaryMinusOperatorFloat.h" > > namespace sh > { > > TranslatorGLSL::TranslatorGLSL(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output) > : TCompiler(type, spec, output) >-{ >-} >+{} > > void TranslatorGLSL::initBuiltInFunctionEmulator(BuiltInFunctionEmulator *emu, > ShCompileOptions compileOptions) >@@ -109,7 +108,7 @@ void TranslatorGLSL::translate(TIntermBlock *root, > > if (precisionEmulation) > { >- EmulatePrecision emulatePrecision(&getSymbolTable(), getShaderVersion()); >+ EmulatePrecision emulatePrecision(&getSymbolTable()); > root->traverse(&emulatePrecision); > emulatePrecision.updateTree(); > emulatePrecision.writeEmulationHelpers(sink, getShaderVersion(), getOutputType()); >@@ -141,7 +140,7 @@ void TranslatorGLSL::translate(TIntermBlock *root, > bool hasGLSecondaryFragColor = false; > bool hasGLSecondaryFragData = false; > >- for (const auto &outputVar : outputVariables) >+ for (const auto &outputVar : mOutputVariables) > { > if (declareGLFragmentOutputs) > { >@@ -202,7 +201,7 @@ void TranslatorGLSL::translate(TIntermBlock *root, > << ", local_size_z=" << localSize[2] << ") in;\n"; > } > >- if (getShaderType() == GL_GEOMETRY_SHADER_OES) >+ if (getShaderType() == GL_GEOMETRY_SHADER_EXT) > { > WriteGeometryShaderLayoutQualifiers( > sink, getGeometryShaderInputPrimitiveType(), getGeometryShaderInvocations(), >@@ -214,13 +213,6 @@ void TranslatorGLSL::translate(TIntermBlock *root, > &getSymbolTable(), getShaderType(), getShaderVersion(), getOutputType(), > compileOptions); > >- if (compileOptions & SH_TRANSLATE_VIEWID_OVR_TO_UNIFORM) >- { >- TName uniformName(TString("ViewID_OVR")); >- uniformName.setInternal(true); >- sink << "uniform int " << outputGLSL.hashName(uniformName) << ";\n"; >- } >- > root->traverse(&outputGLSL); > } > >@@ -278,22 +270,30 @@ void TranslatorGLSL::writeExtensionBehavior(TIntermNode *root, ShCompileOptions > << "\n"; > } > >- if (iter.first == TExtension::OES_geometry_shader) >+ if (iter.first == TExtension::EXT_geometry_shader) > { > sink << "#extension GL_ARB_geometry_shader4 : " << GetBehaviorString(iter.second) > << "\n"; > } > } > >- const bool isMultiview = (iter.first == TExtension::OVR_multiview); >+ const bool isMultiview = (iter.first == TExtension::OVR_multiview2); > if (isMultiview && getShaderType() == GL_VERTEX_SHADER && > (compileOptions & SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER) != 0u) > { > // Emit the NV_viewport_array2 extension in a vertex shader if the >- // SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER option is set and the OVR_multiview(2) >+ // SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER option is set and the OVR_multiview2(2) > // extension is requested. > sink << "#extension GL_NV_viewport_array2 : require\n"; > } >+ >+ // Support ANGLE_texture_multisample extension on GLSL300 >+ if (getShaderVersion() >= 300 && iter.first == TExtension::ANGLE_texture_multisample && >+ getOutputType() < SH_GLSL_330_CORE_OUTPUT) >+ { >+ sink << "#extension GL_ARB_texture_multisample : " << GetBehaviorString(iter.second) >+ << "\n"; >+ } > } > > // GLSL ES 3 explicit location qualifiers need to use an extension before GLSL 330 >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.cpp >index 091a649cfcb..630188b5d7c 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.cpp >@@ -6,33 +6,35 @@ > > #include "compiler/translator/TranslatorHLSL.h" > >-#include "compiler/translator/AddDefaultReturnStatements.h" >-#include "compiler/translator/ArrayReturnValueToOutParameter.h" >-#include "compiler/translator/BreakVariableAliasingInInnerLoops.h" >-#include "compiler/translator/EmulatePrecision.h" >-#include "compiler/translator/ExpandIntegerPowExpressions.h" >-#include "compiler/translator/IntermNodePatternMatcher.h" > #include "compiler/translator/OutputHLSL.h" >-#include "compiler/translator/RemoveDynamicIndexing.h" >-#include "compiler/translator/RemoveNoOpCasesFromEndOfSwitchStatements.h" >-#include "compiler/translator/RewriteElseBlocks.h" >-#include "compiler/translator/RewriteTexelFetchOffset.h" >-#include "compiler/translator/RewriteUnaryMinusOperatorInt.h" >-#include "compiler/translator/SeparateArrayInitialization.h" >-#include "compiler/translator/SeparateDeclarations.h" >-#include "compiler/translator/SeparateExpressionsReturningArrays.h" >-#include "compiler/translator/SimplifyLoopConditions.h" >-#include "compiler/translator/SplitSequenceOperator.h" >-#include "compiler/translator/UnfoldShortCircuitToIf.h" >-#include "compiler/translator/WrapSwitchStatementsInBlocks.h" >+#include "compiler/translator/tree_ops/AddDefaultReturnStatements.h" >+#include "compiler/translator/tree_ops/ArrayReturnValueToOutParameter.h" >+#include "compiler/translator/tree_ops/BreakVariableAliasingInInnerLoops.h" >+#include "compiler/translator/tree_ops/EmulatePrecision.h" >+#include "compiler/translator/tree_ops/ExpandIntegerPowExpressions.h" >+#include "compiler/translator/tree_ops/PruneEmptyCases.h" >+#include "compiler/translator/tree_ops/RemoveDynamicIndexing.h" >+#include "compiler/translator/tree_ops/RewriteAtomicFunctionExpressions.h" >+#include "compiler/translator/tree_ops/RewriteElseBlocks.h" >+#include "compiler/translator/tree_ops/RewriteExpressionsWithShaderStorageBlock.h" >+#include "compiler/translator/tree_ops/RewriteTexelFetchOffset.h" >+#include "compiler/translator/tree_ops/RewriteUnaryMinusOperatorInt.h" >+#include "compiler/translator/tree_ops/SeparateArrayConstructorStatements.h" >+#include "compiler/translator/tree_ops/SeparateArrayInitialization.h" >+#include "compiler/translator/tree_ops/SeparateDeclarations.h" >+#include "compiler/translator/tree_ops/SeparateExpressionsReturningArrays.h" >+#include "compiler/translator/tree_ops/SimplifyLoopConditions.h" >+#include "compiler/translator/tree_ops/SplitSequenceOperator.h" >+#include "compiler/translator/tree_ops/UnfoldShortCircuitToIf.h" >+#include "compiler/translator/tree_ops/WrapSwitchStatementsInBlocks.h" >+#include "compiler/translator/tree_util/IntermNodePatternMatcher.h" > > namespace sh > { > > TranslatorHLSL::TranslatorHLSL(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output) > : TCompiler(type, spec, output) >-{ >-} >+{} > > void TranslatorHLSL::translate(TIntermBlock *root, > ShCompileOptions compileOptions, >@@ -50,17 +52,19 @@ void TranslatorHLSL::translate(TIntermBlock *root, > IntermNodePatternMatcher::kExpressionReturningArray | > IntermNodePatternMatcher::kUnfoldedShortCircuitExpression | > IntermNodePatternMatcher::kDynamicIndexingOfVectorOrMatrixInLValue, >- &getSymbolTable(), getShaderVersion()); >+ &getSymbolTable()); > > SplitSequenceOperator(root, > IntermNodePatternMatcher::kExpressionReturningArray | > IntermNodePatternMatcher::kUnfoldedShortCircuitExpression | > IntermNodePatternMatcher::kDynamicIndexingOfVectorOrMatrixInLValue, >- &getSymbolTable(), getShaderVersion()); >+ &getSymbolTable()); > > // Note that SeparateDeclarations needs to be run before UnfoldShortCircuitToIf. > UnfoldShortCircuitToIf(root, &getSymbolTable()); > >+ SeparateArrayConstructorStatements(root); >+ > SeparateExpressionsReturningArrays(root, &getSymbolTable()); > > // Note that SeparateDeclarations needs to be run before SeparateArrayInitialization. >@@ -73,7 +77,7 @@ void TranslatorHLSL::translate(TIntermBlock *root, > if (!shouldRunLoopAndIndexingValidation(compileOptions)) > { > // HLSL doesn't support dynamic indexing of vectors and matrices. >- RemoveDynamicIndexing(root, &getSymbolTable(), getShaderVersion(), perfDiagnostics); >+ RemoveDynamicIndexing(root, &getSymbolTable(), perfDiagnostics); > } > > // Work around D3D9 bug that would manifest in vertex shaders with selection blocks which >@@ -90,20 +94,17 @@ void TranslatorHLSL::translate(TIntermBlock *root, > sh::BreakVariableAliasingInInnerLoops(root); > > // WrapSwitchStatementsInBlocks should be called after any AST transformations that might >- // introduce variable declarations inside the main scope of any switch statement. >- if (WrapSwitchStatementsInBlocks(root)) >- { >- // The WrapSwitchStatementsInBlocks step might introduce new no-op cases to the end of >- // switch statements, so make sure to clean up the AST. >- RemoveNoOpCasesFromEndOfSwitchStatements(root, &getSymbolTable()); >- } >+ // introduce variable declarations inside the main scope of any switch statement. It cannot >+ // result in no-op cases at the end of switch statements, because unreferenced variables >+ // have already been pruned. >+ WrapSwitchStatementsInBlocks(root); > > bool precisionEmulation = > getResources().WEBGL_debug_shader_precision && getPragma().debugShaderPrecision; > > if (precisionEmulation) > { >- EmulatePrecision emulatePrecision(&getSymbolTable(), getShaderVersion()); >+ EmulatePrecision emulatePrecision(&getSymbolTable()); > root->traverse(&emulatePrecision); > emulatePrecision.updateTree(); > emulatePrecision.writeEmulationHelpers(getInfoSink().obj, getShaderVersion(), >@@ -126,14 +127,27 @@ void TranslatorHLSL::translate(TIntermBlock *root, > sh::RewriteUnaryMinusOperatorInt(root); > } > >+ if (getShaderVersion() >= 310) >+ { >+ // Due to ssbo also can be used as the argument of atomic memory functions, we should put >+ // RewriteExpressionsWithShaderStorageBlock before RewriteAtomicFunctionExpressions. >+ sh::RewriteExpressionsWithShaderStorageBlock(root, &getSymbolTable()); >+ sh::RewriteAtomicFunctionExpressions(root, &getSymbolTable(), getShaderVersion()); >+ } >+ > sh::OutputHLSL outputHLSL(getShaderType(), getShaderVersion(), getExtensionBehavior(), > getSourcePath(), getOutputType(), numRenderTargets, getUniforms(), >- compileOptions, &getSymbolTable(), perfDiagnostics); >+ compileOptions, getComputeShaderLocalSize(), &getSymbolTable(), >+ perfDiagnostics, mShaderStorageBlocks); > > outputHLSL.output(root, getInfoSink().obj); > >- mUniformBlockRegisterMap = outputHLSL.getUniformBlockRegisterMap(); >- mUniformRegisterMap = outputHLSL.getUniformRegisterMap(); >+ mShaderStorageBlockRegisterMap = outputHLSL.getShaderStorageBlockRegisterMap(); >+ mUniformBlockRegisterMap = outputHLSL.getUniformBlockRegisterMap(); >+ mUniformRegisterMap = outputHLSL.getUniformRegisterMap(); >+ mReadonlyImage2DRegisterIndex = outputHLSL.getReadonlyImage2DRegisterIndex(); >+ mImage2DRegisterIndex = outputHLSL.getImage2DRegisterIndex(); >+ mUsedImage2DFunctionNames = outputHLSL.getUsedImage2DFunctionNames(); > } > > bool TranslatorHLSL::shouldFlattenPragmaStdglInvariantAll() >@@ -142,6 +156,18 @@ bool TranslatorHLSL::shouldFlattenPragmaStdglInvariantAll() > return false; > } > >+bool TranslatorHLSL::hasShaderStorageBlock(const std::string &uniformBlockName) const >+{ >+ return (mShaderStorageBlockRegisterMap.count(uniformBlockName) > 0); >+} >+ >+unsigned int TranslatorHLSL::getShaderStorageBlockRegister( >+ const std::string &shaderStorageBlockName) const >+{ >+ ASSERT(hasShaderStorageBlock(shaderStorageBlockName)); >+ return mShaderStorageBlockRegisterMap.find(shaderStorageBlockName)->second; >+} >+ > bool TranslatorHLSL::hasUniformBlock(const std::string &uniformBlockName) const > { > return (mUniformBlockRegisterMap.count(uniformBlockName) > 0); >@@ -158,4 +184,19 @@ const std::map<std::string, unsigned int> *TranslatorHLSL::getUniformRegisterMap > return &mUniformRegisterMap; > } > >+unsigned int TranslatorHLSL::getReadonlyImage2DRegisterIndex() const >+{ >+ return mReadonlyImage2DRegisterIndex; >+} >+ >+unsigned int TranslatorHLSL::getImage2DRegisterIndex() const >+{ >+ return mImage2DRegisterIndex; >+} >+ >+const std::set<std::string> *TranslatorHLSL::getUsedImage2DFunctionNames() const >+{ >+ return &mUsedImage2DFunctionNames; >+} >+ > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.h >index e8436e98e3e..bb8b7f28554 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.h >@@ -16,12 +16,18 @@ class TranslatorHLSL : public TCompiler > { > public: > TranslatorHLSL(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output); >- TranslatorHLSL *getAsTranslatorHLSL() { return this; } >+ TranslatorHLSL *getAsTranslatorHLSL() override { return this; } >+ >+ bool hasShaderStorageBlock(const std::string &interfaceBlockName) const; >+ unsigned int getShaderStorageBlockRegister(const std::string &interfaceBlockName) const; > > bool hasUniformBlock(const std::string &interfaceBlockName) const; > unsigned int getUniformBlockRegister(const std::string &interfaceBlockName) const; > > const std::map<std::string, unsigned int> *getUniformRegisterMap() const; >+ unsigned int getReadonlyImage2DRegisterIndex() const; >+ unsigned int getImage2DRegisterIndex() const; >+ const std::set<std::string> *getUsedImage2DFunctionNames() const; > > protected: > void translate(TIntermBlock *root, >@@ -32,8 +38,12 @@ class TranslatorHLSL : public TCompiler > // collectVariables needs to be run always so registers can be assigned. > bool shouldCollectVariables(ShCompileOptions compileOptions) override { return true; } > >+ std::map<std::string, unsigned int> mShaderStorageBlockRegisterMap; > std::map<std::string, unsigned int> mUniformBlockRegisterMap; > std::map<std::string, unsigned int> mUniformRegisterMap; >+ unsigned int mReadonlyImage2DRegisterIndex; >+ unsigned int mImage2DRegisterIndex; >+ std::set<std::string> mUsedImage2DFunctionNames; > }; > > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorVulkan.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorVulkan.cpp >index 0fe2a21f90e..19b6847e472 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorVulkan.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorVulkan.cpp >@@ -13,12 +13,70 @@ > > #include "angle_gl.h" > #include "common/utilities.h" >+#include "compiler/translator/ImmutableStringBuilder.h" > #include "compiler/translator/OutputVulkanGLSL.h" >+#include "compiler/translator/StaticType.h" >+#include "compiler/translator/tree_ops/NameEmbeddedUniformStructs.h" >+#include "compiler/translator/tree_ops/RewriteStructSamplers.h" >+#include "compiler/translator/tree_util/BuiltIn_autogen.h" >+#include "compiler/translator/tree_util/FindMain.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/ReplaceVariable.h" >+#include "compiler/translator/tree_util/RunAtTheEndOfShader.h" > #include "compiler/translator/util.h" > > namespace sh > { > >+namespace >+{ >+// This traverses nodes, find the struct ones and add their declarations to the sink. It also >+// removes the nodes from the tree as it processes them. >+class DeclareStructTypesTraverser : public TIntermTraverser >+{ >+ public: >+ explicit DeclareStructTypesTraverser(TOutputVulkanGLSL *outputVulkanGLSL) >+ : TIntermTraverser(true, false, false), mOutputVulkanGLSL(outputVulkanGLSL) >+ {} >+ >+ bool visitDeclaration(Visit visit, TIntermDeclaration *node) override >+ { >+ ASSERT(visit == PreVisit); >+ >+ if (!mInGlobalScope) >+ { >+ return false; >+ } >+ >+ const TIntermSequence &sequence = *(node->getSequence()); >+ TIntermTyped *declarator = sequence.front()->getAsTyped(); >+ const TType &type = declarator->getType(); >+ >+ if (type.isStructSpecifier()) >+ { >+ const TStructure *structure = type.getStruct(); >+ >+ // Embedded structs should be parsed away by now. >+ ASSERT(structure->symbolType() != SymbolType::Empty); >+ mOutputVulkanGLSL->writeStructType(structure); >+ >+ TIntermSymbol *symbolNode = declarator->getAsSymbolNode(); >+ if (symbolNode && symbolNode->variable().symbolType() == SymbolType::Empty) >+ { >+ // Remove the struct specifier declaration from the tree so it isn't parsed again. >+ TIntermSequence emptyReplacement; >+ mMultiReplacements.emplace_back(getParentNode()->getAsBlock(), node, >+ emptyReplacement); >+ } >+ } >+ >+ return false; >+ } >+ >+ private: >+ TOutputVulkanGLSL *mOutputVulkanGLSL; >+}; >+ > class DeclareDefaultUniformsTraverser : public TIntermTraverser > { > public: >@@ -30,8 +88,7 @@ class DeclareDefaultUniformsTraverser : public TIntermTraverser > mHashFunction(hashFunction), > mNameMap(nameMap), > mInDefaultUniform(false) >- { >- } >+ {} > > bool visitDeclaration(Visit visit, TIntermDeclaration *node) override > { >@@ -64,8 +121,8 @@ class DeclareDefaultUniformsTraverser : public TIntermTraverser > > // Remove the uniform declaration from the tree so it isn't parsed again. > TIntermSequence emptyReplacement; >- mMultiReplacements.push_back(NodeReplaceWithMultipleEntry( >- getParentNode()->getAsBlock(), node, emptyReplacement)); >+ mMultiReplacements.emplace_back(getParentNode()->getAsBlock(), node, >+ emptyReplacement); > } > > mInDefaultUniform = false; >@@ -77,9 +134,10 @@ class DeclareDefaultUniformsTraverser : public TIntermTraverser > { > if (mInDefaultUniform) > { >- const TName &name = symbol->getName(); >- ASSERT(name.getString().substr(0, 3) != "gl_"); >- (*mSink) << HashName(name, mHashFunction, mNameMap); >+ const ImmutableString &name = symbol->variable().name(); >+ ASSERT(!name.beginsWith("gl_")); >+ (*mSink) << HashName(&symbol->variable(), mHashFunction, mNameMap) >+ << ArrayString(symbol->getType()); > } > } > >@@ -90,27 +148,521 @@ class DeclareDefaultUniformsTraverser : public TIntermTraverser > bool mInDefaultUniform; > }; > >-TranslatorVulkan::TranslatorVulkan(sh::GLenum type, ShShaderSpec spec) >- : TCompiler(type, spec, SH_GLSL_450_CORE_OUTPUT) >+constexpr ImmutableString kFlippedPointCoordName = ImmutableString("flippedPointCoord"); >+constexpr ImmutableString kFlippedFragCoordName = ImmutableString("flippedFragCoord"); >+constexpr ImmutableString kEmulatedDepthRangeParams = ImmutableString("ANGLEDepthRangeParams"); >+ >+constexpr const char kViewport[] = "viewport"; >+constexpr const char kHalfRenderAreaHeight[] = "halfRenderAreaHeight"; >+constexpr const char kViewportYScale[] = "viewportYScale"; >+constexpr const char kNegViewportYScale[] = "negViewportYScale"; >+constexpr const char kDepthRange[] = "depthRange"; >+ >+constexpr size_t kNumDriverUniforms = 6; >+constexpr std::array<const char *, kNumDriverUniforms> kDriverUniformNames = { >+ {kViewport, kHalfRenderAreaHeight, kViewportYScale, kNegViewportYScale, "padding", >+ kDepthRange}}; >+ >+template <TBasicType BasicType = EbtFloat, unsigned char PrimarySize = 1> >+TIntermConstantUnion *CreateBasicConstant(float value) >+{ >+ const TType *constantType = StaticType::GetBasic<BasicType, PrimarySize>(); >+ TConstantUnion *constantValue = new TConstantUnion[PrimarySize]; >+ for (unsigned char sizeIndex = 0; sizeIndex < PrimarySize; ++sizeIndex) >+ { >+ constantValue[sizeIndex].setFConst(value); >+ } >+ return new TIntermConstantUnion(constantValue, *constantType); >+} >+ >+size_t FindFieldIndex(const TFieldList &fieldList, const char *fieldName) > { >+ for (size_t fieldIndex = 0; fieldIndex < fieldList.size(); ++fieldIndex) >+ { >+ if (strcmp(fieldList[fieldIndex]->name().data(), fieldName) == 0) >+ { >+ return fieldIndex; >+ } >+ } >+ UNREACHABLE(); >+ return 0; >+} >+ >+TIntermBinary *CreateDriverUniformRef(const TVariable *driverUniforms, const char *fieldName) >+{ >+ size_t fieldIndex = >+ FindFieldIndex(driverUniforms->getType().getInterfaceBlock()->fields(), fieldName); >+ >+ TIntermSymbol *angleUniformsRef = new TIntermSymbol(driverUniforms); >+ TConstantUnion *uniformIndex = new TConstantUnion; >+ uniformIndex->setIConst(fieldIndex); >+ TIntermConstantUnion *indexRef = >+ new TIntermConstantUnion(uniformIndex, *StaticType::GetBasic<EbtInt>()); >+ return new TIntermBinary(EOpIndexDirectInterfaceBlock, angleUniformsRef, indexRef); > } > >+// Replaces a builtin variable with a version that corrects the Y coordinate. >+void FlipBuiltinVariable(TIntermBlock *root, >+ TIntermSequence *insertSequence, >+ TIntermTyped *viewportYScale, >+ TSymbolTable *symbolTable, >+ const TVariable *builtin, >+ const ImmutableString &flippedVariableName, >+ TIntermTyped *pivot) >+{ >+ // Create a symbol reference to 'builtin'. >+ TIntermSymbol *builtinRef = new TIntermSymbol(builtin); >+ >+ // Create a swizzle to "builtin.y" >+ TVector<int> swizzleOffsetY; >+ swizzleOffsetY.push_back(1); >+ TIntermSwizzle *builtinY = new TIntermSwizzle(builtinRef, swizzleOffsetY); >+ >+ // Create a symbol reference to our new variable that will hold the modified builtin. >+ const TType *type = StaticType::GetForVec<EbtFloat>( >+ EvqGlobal, static_cast<unsigned char>(builtin->getType().getNominalSize())); >+ TVariable *replacementVar = >+ new TVariable(symbolTable, flippedVariableName, type, SymbolType::AngleInternal); >+ DeclareGlobalVariable(root, replacementVar); >+ TIntermSymbol *flippedBuiltinRef = new TIntermSymbol(replacementVar); >+ >+ // Use this new variable instead of 'builtin' everywhere. >+ ReplaceVariable(root, builtin, replacementVar); >+ >+ // Create the expression "(builtin.y - pivot) * viewportYScale + pivot >+ TIntermBinary *removePivot = new TIntermBinary(EOpSub, builtinY, pivot); >+ TIntermBinary *inverseY = new TIntermBinary(EOpMul, removePivot, viewportYScale); >+ TIntermBinary *plusPivot = new TIntermBinary(EOpAdd, inverseY, pivot->deepCopy()); >+ >+ // Create the corrected variable and copy the value of the original builtin. >+ TIntermSequence *sequence = new TIntermSequence(); >+ sequence->push_back(builtinRef); >+ TIntermAggregate *aggregate = TIntermAggregate::CreateConstructor(builtin->getType(), sequence); >+ TIntermBinary *assignment = new TIntermBinary(EOpInitialize, flippedBuiltinRef, aggregate); >+ >+ // Create an assignment to the replaced variable's y. >+ TIntermSwizzle *correctedY = new TIntermSwizzle(flippedBuiltinRef, swizzleOffsetY); >+ TIntermBinary *assignToY = new TIntermBinary(EOpAssign, correctedY, plusPivot); >+ >+ // Add this assigment at the beginning of the main function >+ insertSequence->insert(insertSequence->begin(), assignToY); >+ insertSequence->insert(insertSequence->begin(), assignment); >+} >+ >+TIntermSequence *GetMainSequence(TIntermBlock *root) >+{ >+ TIntermFunctionDefinition *main = FindMain(root); >+ return main->getBody()->getSequence(); >+} >+ >+// Declares a new variable to replace gl_DepthRange, its values are fed from a driver uniform. >+void ReplaceGLDepthRangeWithDriverUniform(TIntermBlock *root, >+ const TVariable *driverUniforms, >+ TSymbolTable *symbolTable) >+{ >+ // Create a symbol reference to "gl_DepthRange" >+ const TVariable *depthRangeVar = static_cast<const TVariable *>( >+ symbolTable->findBuiltIn(ImmutableString("gl_DepthRange"), 0)); >+ >+ // ANGLEUniforms.depthRange >+ TIntermBinary *angleEmulatedDepthRangeRef = CreateDriverUniformRef(driverUniforms, kDepthRange); >+ >+ // Use this variable instead of gl_DepthRange everywhere. >+ ReplaceVariableWithTyped(root, depthRangeVar, angleEmulatedDepthRangeRef); >+} >+ >+// This operation performs the viewport depth translation needed by Vulkan. In GL the viewport >+// transformation is slightly different - see the GL 2.0 spec section "2.12.1 Controlling the >+// Viewport". In Vulkan the corresponding spec section is currently "23.4. Coordinate >+// Transformations". >+// The equations reduce to an expression: >+// >+// z_vk = 0.5 * (w_gl + z_gl) >+// >+// where z_vk is the depth output of a Vulkan vertex shader and z_gl is the same for GL. >+void AppendVertexShaderDepthCorrectionToMain(TIntermBlock *root, TSymbolTable *symbolTable) >+{ >+ // Create a symbol reference to "gl_Position" >+ const TVariable *position = BuiltInVariable::gl_Position(); >+ TIntermSymbol *positionRef = new TIntermSymbol(position); >+ >+ // Create a swizzle to "gl_Position.z" >+ TVector<int> swizzleOffsetZ; >+ swizzleOffsetZ.push_back(2); >+ TIntermSwizzle *positionZ = new TIntermSwizzle(positionRef, swizzleOffsetZ); >+ >+ // Create a constant "0.5" >+ TIntermConstantUnion *oneHalf = CreateBasicConstant(0.5f); >+ >+ // Create a swizzle to "gl_Position.w" >+ TVector<int> swizzleOffsetW; >+ swizzleOffsetW.push_back(3); >+ TIntermSwizzle *positionW = new TIntermSwizzle(positionRef->deepCopy(), swizzleOffsetW); >+ >+ // Create the expression "(gl_Position.z + gl_Position.w) * 0.5". >+ TIntermBinary *zPlusW = new TIntermBinary(EOpAdd, positionZ->deepCopy(), positionW->deepCopy()); >+ TIntermBinary *halfZPlusW = new TIntermBinary(EOpMul, zPlusW, oneHalf->deepCopy()); >+ >+ // Create the assignment "gl_Position.z = (gl_Position.z + gl_Position.w) * 0.5" >+ TIntermTyped *positionZLHS = positionZ->deepCopy(); >+ TIntermBinary *assignment = new TIntermBinary(TOperator::EOpAssign, positionZLHS, halfZPlusW); >+ >+ // Append the assignment as a statement at the end of the shader. >+ RunAtTheEndOfShader(root, assignment, symbolTable); >+} >+ >+// The AddDriverUniformsToShader operation adds an internal uniform block to a shader. The driver >+// block is used to implement Vulkan-specific features and workarounds. Returns the driver uniforms >+// variable. >+const TVariable *AddDriverUniformsToShader(TIntermBlock *root, TSymbolTable *symbolTable) >+{ >+ // Init the depth range type. >+ TFieldList *depthRangeParamsFields = new TFieldList(); >+ depthRangeParamsFields->push_back(new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1, 1), >+ ImmutableString("near"), TSourceLoc(), >+ SymbolType::AngleInternal)); >+ depthRangeParamsFields->push_back(new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1, 1), >+ ImmutableString("far"), TSourceLoc(), >+ SymbolType::AngleInternal)); >+ depthRangeParamsFields->push_back(new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1, 1), >+ ImmutableString("diff"), TSourceLoc(), >+ SymbolType::AngleInternal)); >+ depthRangeParamsFields->push_back(new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1, 1), >+ ImmutableString("dummyPacker"), TSourceLoc(), >+ SymbolType::AngleInternal)); >+ TStructure *emulatedDepthRangeParams = new TStructure( >+ symbolTable, kEmulatedDepthRangeParams, depthRangeParamsFields, SymbolType::AngleInternal); >+ TType *emulatedDepthRangeType = new TType(emulatedDepthRangeParams, false); >+ >+ // Declare a global depth range variable. >+ TVariable *depthRangeVar = >+ new TVariable(symbolTable->nextUniqueId(), kEmptyImmutableString, SymbolType::Empty, >+ TExtension::UNDEFINED, emulatedDepthRangeType); >+ >+ DeclareGlobalVariable(root, depthRangeVar); >+ >+ // This field list mirrors the structure of ContextVk::DriverUniforms. >+ TFieldList *driverFieldList = new TFieldList; >+ >+ const std::array<TType *, kNumDriverUniforms> kDriverUniformTypes = {{ >+ new TType(EbtFloat, 4), >+ new TType(EbtFloat), >+ new TType(EbtFloat), >+ new TType(EbtFloat), >+ new TType(EbtFloat), >+ emulatedDepthRangeType, >+ }}; >+ >+ for (size_t uniformIndex = 0; uniformIndex < kNumDriverUniforms; ++uniformIndex) >+ { >+ TField *driverUniformField = new TField(kDriverUniformTypes[uniformIndex], >+ ImmutableString(kDriverUniformNames[uniformIndex]), >+ TSourceLoc(), SymbolType::AngleInternal); >+ driverFieldList->push_back(driverUniformField); >+ } >+ >+ // Define a driver uniform block "ANGLEUniformBlock". >+ TLayoutQualifier driverLayoutQualifier = TLayoutQualifier::Create(); >+ TInterfaceBlock *interfaceBlock = >+ new TInterfaceBlock(symbolTable, ImmutableString("ANGLEUniformBlock"), driverFieldList, >+ driverLayoutQualifier, SymbolType::AngleInternal); >+ >+ // Make the inteface block into a declaration. Use instance name "ANGLEUniforms". >+ TType *interfaceBlockType = new TType(interfaceBlock, EvqUniform, driverLayoutQualifier); >+ TIntermDeclaration *driverUniformsDecl = new TIntermDeclaration; >+ TVariable *driverUniformsVar = new TVariable(symbolTable, ImmutableString("ANGLEUniforms"), >+ interfaceBlockType, SymbolType::AngleInternal); >+ TIntermSymbol *driverUniformsDeclarator = new TIntermSymbol(driverUniformsVar); >+ driverUniformsDecl->appendDeclarator(driverUniformsDeclarator); >+ >+ // Insert the declarations before Main. >+ TIntermSequence *insertSequence = new TIntermSequence; >+ insertSequence->push_back(driverUniformsDecl); >+ >+ size_t mainIndex = FindMainIndex(root); >+ root->insertChildNodes(mainIndex, *insertSequence); >+ >+ return driverUniformsVar; >+} >+ >+TIntermPreprocessorDirective *GenerateLineRasterIfDef() >+{ >+ return new TIntermPreprocessorDirective( >+ PreprocessorDirective::Ifdef, ImmutableString("ANGLE_ENABLE_LINE_SEGMENT_RASTERIZATION")); >+} >+ >+TIntermPreprocessorDirective *GenerateEndIf() >+{ >+ return new TIntermPreprocessorDirective(PreprocessorDirective::Endif, kEmptyImmutableString); >+} >+ >+TVariable *AddANGLEPositionVaryingDeclaration(TIntermBlock *root, >+ TSymbolTable *symbolTable, >+ TQualifier qualifier) >+{ >+ TIntermSequence *insertSequence = new TIntermSequence; >+ >+ insertSequence->push_back(GenerateLineRasterIfDef()); >+ >+ // Define a driver varying vec2 "ANGLEPosition". >+ TType *varyingType = new TType(EbtFloat, EbpMedium, qualifier, 4); >+ TVariable *varyingVar = new TVariable(symbolTable, ImmutableString("ANGLEPosition"), >+ varyingType, SymbolType::AngleInternal); >+ TIntermSymbol *varyingDeclarator = new TIntermSymbol(varyingVar); >+ TIntermDeclaration *varyingDecl = new TIntermDeclaration; >+ varyingDecl->appendDeclarator(varyingDeclarator); >+ insertSequence->push_back(varyingDecl); >+ >+ insertSequence->push_back(GenerateEndIf()); >+ >+ // Insert the declarations before Main. >+ size_t mainIndex = FindMainIndex(root); >+ root->insertChildNodes(mainIndex, *insertSequence); >+ >+ return varyingVar; >+} >+ >+void AddANGLEPositionVarying(TIntermBlock *root, TSymbolTable *symbolTable) >+{ >+ TVariable *anglePosition = AddANGLEPositionVaryingDeclaration(root, symbolTable, EvqVaryingOut); >+ >+ // Create an assignment "ANGLEPosition = gl_Position". >+ const TVariable *position = BuiltInVariable::gl_Position(); >+ TIntermSymbol *varyingRef = new TIntermSymbol(anglePosition); >+ TIntermBinary *assignment = >+ new TIntermBinary(EOpAssign, varyingRef, new TIntermSymbol(position)); >+ >+ // Ensure the assignment runs at the end of the main() function. >+ TIntermFunctionDefinition *main = FindMain(root); >+ TIntermBlock *mainBody = main->getBody(); >+ mainBody->appendStatement(GenerateLineRasterIfDef()); >+ mainBody->appendStatement(assignment); >+ mainBody->appendStatement(GenerateEndIf()); >+} >+ >+void InsertFragCoordCorrection(TIntermBlock *root, >+ TIntermSequence *insertSequence, >+ TSymbolTable *symbolTable, >+ const TVariable *driverUniforms) >+{ >+ TIntermBinary *viewportYScale = CreateDriverUniformRef(driverUniforms, kViewportYScale); >+ TIntermBinary *pivot = CreateDriverUniformRef(driverUniforms, kHalfRenderAreaHeight); >+ FlipBuiltinVariable(root, insertSequence, viewportYScale, symbolTable, >+ BuiltInVariable::gl_FragCoord(), kFlippedFragCoordName, pivot); >+} >+ >+// This block adds OpenGL line segment rasterization emulation behind #ifdef guards. >+// OpenGL's simple rasterization algorithm is a strict subset of the pixels generated by the Vulkan >+// algorithm. Thus we can implement a shader patch that rejects pixels if they would not be >+// generated by the OpenGL algorithm. OpenGL's algorithm is similar to Bresenham's line algorithm. >+// It is implemented for each pixel by testing if the line segment crosses a small diamond inside >+// the pixel. See the OpenGL ES 2.0 spec section "3.4.1 Basic Line Segment Rasterization". Also >+// see the Vulkan spec section "24.6.1. Basic Line Segment Rasterization": >+// https://khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#primsrast-lines-basic >+// >+// Using trigonometric math and the fact that we know the size of the diamond we can derive a >+// formula to test if the line segment crosses the pixel center. gl_FragCoord is used along with an >+// internal position varying to determine the inputs to the formula. >+// >+// The implementation of the test code is similar to the following pseudocode: >+// >+// void main() >+// { >+// vec2 b = (((position.xy / position.w) * 0.5) + 0.5) * gl_Viewport.zw + gl_Viewport.xy; >+// vec2 ba = abs(b - gl_FragCoord.xy); >+// vec2 ba2 = 2.0 * (ba * ba); >+// vec2 bp = ba2 + ba2.yx - ba; >+// if (bp.x > epsilon && bp.y > epsilon) >+// discard; >+// <otherwise run fragment shader main> >+// } >+void AddLineSegmentRasterizationEmulation(TInfoSinkBase &sink, >+ TIntermBlock *root, >+ TSymbolTable *symbolTable, >+ const TVariable *driverUniforms, >+ bool usesFragCoord) >+{ >+ TVariable *anglePosition = AddANGLEPositionVaryingDeclaration(root, symbolTable, EvqVaryingIn); >+ >+ const TType *vec2Type = StaticType::GetBasic<EbtFloat, 2>(); >+ >+ // Create a swizzle to "ANGLEUniforms.viewport.xy". >+ TIntermBinary *viewportRef = CreateDriverUniformRef(driverUniforms, kViewport); >+ TVector<int> swizzleOffsetXY; >+ swizzleOffsetXY.push_back(0); >+ swizzleOffsetXY.push_back(1); >+ TIntermSwizzle *viewportXY = new TIntermSwizzle(viewportRef->deepCopy(), swizzleOffsetXY); >+ >+ // Create a swizzle to "ANGLEUniforms.viewport.zw". >+ TVector<int> swizzleOffsetZW; >+ swizzleOffsetZW.push_back(2); >+ swizzleOffsetZW.push_back(3); >+ TIntermSwizzle *viewportZW = new TIntermSwizzle(viewportRef, swizzleOffsetZW); >+ >+ // ANGLEPosition.xy / ANGLEPosition.w >+ TIntermSymbol *position = new TIntermSymbol(anglePosition); >+ TIntermSwizzle *positionXY = new TIntermSwizzle(position, swizzleOffsetXY); >+ TVector<int> swizzleOffsetW; >+ swizzleOffsetW.push_back(3); >+ TIntermSwizzle *positionW = new TIntermSwizzle(position->deepCopy(), swizzleOffsetW); >+ TIntermBinary *positionNDC = new TIntermBinary(EOpDiv, positionXY, positionW); >+ >+ // ANGLEPosition * 0.5 >+ TIntermConstantUnion *oneHalf = CreateBasicConstant(0.5f); >+ TIntermBinary *halfPosition = new TIntermBinary(EOpVectorTimesScalar, positionNDC, oneHalf); >+ >+ // (ANGLEPosition * 0.5) + 0.5 >+ TIntermBinary *offsetHalfPosition = >+ new TIntermBinary(EOpAdd, halfPosition, oneHalf->deepCopy()); >+ >+ // ((ANGLEPosition * 0.5) + 0.5) * ANGLEUniforms.viewport.zw >+ TIntermBinary *scaledPosition = new TIntermBinary(EOpMul, offsetHalfPosition, viewportZW); >+ >+ // ((ANGLEPosition * 0.5) + 0.5) * ANGLEUniforms.viewport + ANGLEUniforms.viewport.xy >+ TIntermBinary *windowPosition = new TIntermBinary(EOpAdd, scaledPosition, viewportXY); >+ >+ // Assign to a temporary "b". >+ TVariable *bTemp = CreateTempVariable(symbolTable, vec2Type); >+ TIntermDeclaration *bDecl = CreateTempInitDeclarationNode(bTemp, windowPosition); >+ >+ // gl_FragCoord.xy >+ const TVariable *fragCoord = BuiltInVariable::gl_FragCoord(); >+ TIntermSymbol *fragCoordRef = new TIntermSymbol(fragCoord); >+ TIntermSwizzle *fragCoordXY = new TIntermSwizzle(fragCoordRef, swizzleOffsetXY); >+ >+ // b - gl_FragCoord.xy >+ TIntermSymbol *bRef = CreateTempSymbolNode(bTemp); >+ TIntermBinary *differenceExpr = new TIntermBinary(EOpSub, bRef, fragCoordXY); >+ >+ // abs(b - gl_FragCoord.xy) >+ TIntermUnary *baAbs = new TIntermUnary(EOpAbs, differenceExpr, nullptr); >+ >+ // Assign to a temporary "ba". >+ TVariable *baTemp = CreateTempVariable(symbolTable, vec2Type); >+ TIntermDeclaration *baDecl = CreateTempInitDeclarationNode(baTemp, baAbs); >+ TIntermSymbol *ba = CreateTempSymbolNode(baTemp); >+ >+ // ba * ba >+ TIntermBinary *baSq = new TIntermBinary(EOpMul, ba, ba->deepCopy()); >+ >+ // 2.0 * ba * ba >+ TIntermTyped *two = CreateBasicConstant(2.0f); >+ TIntermBinary *twoBaSq = new TIntermBinary(EOpVectorTimesScalar, baSq, two); >+ >+ // Assign to a temporary "ba2". >+ TVariable *ba2Temp = CreateTempVariable(symbolTable, vec2Type); >+ TIntermDeclaration *ba2Decl = CreateTempInitDeclarationNode(ba2Temp, twoBaSq); >+ >+ // Create a swizzle to "ba2.yx". >+ TVector<int> swizzleOffsetYX; >+ swizzleOffsetYX.push_back(1); >+ swizzleOffsetYX.push_back(0); >+ TIntermSymbol *ba2 = CreateTempSymbolNode(ba2Temp); >+ TIntermSwizzle *ba2YX = new TIntermSwizzle(ba2, swizzleOffsetYX); >+ >+ // ba2 + ba2.yx - ba >+ TIntermBinary *ba2PlusBaYX2 = new TIntermBinary(EOpAdd, ba2->deepCopy(), ba2YX); >+ TIntermBinary *bpInit = new TIntermBinary(EOpSub, ba2PlusBaYX2, ba->deepCopy()); >+ >+ // Assign to a temporary "bp". >+ TVariable *bpTemp = CreateTempVariable(symbolTable, vec2Type); >+ TIntermDeclaration *bpDecl = CreateTempInitDeclarationNode(bpTemp, bpInit); >+ TIntermSymbol *bp = CreateTempSymbolNode(bpTemp); >+ >+ // Create a swizzle to "bp.x". >+ TVector<int> swizzleOffsetX; >+ swizzleOffsetX.push_back(0); >+ TIntermSwizzle *bpX = new TIntermSwizzle(bp, swizzleOffsetX); >+ >+ // Using a small epsilon value ensures that we don't suffer from numerical instability when >+ // lines are exactly vertical or horizontal. >+ static constexpr float kEpisilon = 0.00001f; >+ TIntermConstantUnion *epsilon = CreateBasicConstant(kEpisilon); >+ >+ // bp.x > epsilon >+ TIntermBinary *checkX = new TIntermBinary(EOpGreaterThan, bpX, epsilon); >+ >+ // Create a swizzle to "bp.y". >+ TVector<int> swizzleOffsetY; >+ swizzleOffsetY.push_back(1); >+ TIntermSwizzle *bpY = new TIntermSwizzle(bp->deepCopy(), swizzleOffsetY); >+ >+ // bp.y > epsilon >+ TIntermBinary *checkY = new TIntermBinary(EOpGreaterThan, bpY, epsilon->deepCopy()); >+ >+ // (bp.x > epsilon) && (bp.y > epsilon) >+ TIntermBinary *checkXY = new TIntermBinary(EOpLogicalAnd, checkX, checkY); >+ >+ // discard >+ TIntermBranch *discard = new TIntermBranch(EOpKill, nullptr); >+ TIntermBlock *discardBlock = new TIntermBlock; >+ discardBlock->appendStatement(discard); >+ >+ // if ((bp.x > epsilon) && (bp.y > epsilon)) discard; >+ TIntermIfElse *ifStatement = new TIntermIfElse(checkXY, discardBlock, nullptr); >+ >+ // Ensure the line raster code runs at the beginning of main(). >+ TIntermFunctionDefinition *main = FindMain(root); >+ TIntermSequence *mainSequence = main->getBody()->getSequence(); >+ ASSERT(mainSequence); >+ >+ std::array<TIntermNode *, 6> nodes = { >+ {bDecl, baDecl, ba2Decl, bpDecl, ifStatement, GenerateEndIf()}}; >+ mainSequence->insert(mainSequence->begin(), nodes.begin(), nodes.end()); >+ >+ // If the shader does not use frag coord, we should insert it inside the ifdef. >+ if (!usesFragCoord) >+ { >+ InsertFragCoordCorrection(root, mainSequence, symbolTable, driverUniforms); >+ } >+ >+ mainSequence->insert(mainSequence->begin(), GenerateLineRasterIfDef()); >+} >+} // anonymous namespace >+ >+TranslatorVulkan::TranslatorVulkan(sh::GLenum type, ShShaderSpec spec) >+ : TCompiler(type, spec, SH_GLSL_450_CORE_OUTPUT) >+{} >+ > void TranslatorVulkan::translate(TIntermBlock *root, > ShCompileOptions compileOptions, > PerformanceDiagnostics * /*perfDiagnostics*/) > { > TInfoSinkBase &sink = getInfoSink().obj; >+ TOutputVulkanGLSL outputGLSL(sink, getArrayIndexClampingStrategy(), getHashFunction(), >+ getNameMap(), &getSymbolTable(), getShaderType(), >+ getShaderVersion(), getOutputType(), compileOptions); > > sink << "#version 450 core\n"; > > // Write out default uniforms into a uniform block assigned to a specific set/binding. >- int defaultUniformCount = 0; >+ int defaultUniformCount = 0; >+ int structTypesUsedForUniforms = 0; > for (const auto &uniform : getUniforms()) > { > if (!uniform.isBuiltIn() && uniform.staticUse && !gl::IsOpaqueType(uniform.type)) > { > ++defaultUniformCount; > } >+ >+ if (uniform.isStruct()) >+ { >+ ++structTypesUsedForUniforms; >+ } >+ } >+ >+ // TODO(lucferron): Refactor this function to do less tree traversals. >+ // http://anglebug.com/2461 >+ if (structTypesUsedForUniforms > 0) >+ { >+ NameEmbeddedStructUniforms(root, &getSymbolTable()); >+ >+ defaultUniformCount -= RewriteStructSamplers(root, &getSymbolTable()); >+ >+ // We must declare the struct types before using them. >+ DeclareStructTypesTraverser structTypesTraverser(&outputGLSL); >+ root->traverse(&structTypesTraverser); >+ structTypesTraverser.updateTree(); > } > > if (defaultUniformCount > 0) >@@ -124,14 +676,45 @@ void TranslatorVulkan::translate(TIntermBlock *root, > sink << "};\n"; > } > >+ const TVariable *driverUniforms = AddDriverUniformsToShader(root, &getSymbolTable()); >+ >+ ReplaceGLDepthRangeWithDriverUniform(root, driverUniforms, &getSymbolTable()); >+ > // Declare gl_FragColor and glFragData as webgl_FragColor and webgl_FragData > // if it's core profile shaders and they are used. > if (getShaderType() == GL_FRAGMENT_SHADER) > { >+ bool usesPointCoord = false; >+ bool usesFragCoord = false; >+ >+ // Search for the gl_PointCoord usage, if its used, we need to flip the y coordinate. >+ for (const Varying &inputVarying : mInputVaryings) >+ { >+ if (!inputVarying.isBuiltIn()) >+ { >+ continue; >+ } >+ >+ if (inputVarying.name == "gl_PointCoord") >+ { >+ usesPointCoord = true; >+ break; >+ } >+ >+ if (inputVarying.name == "gl_FragCoord") >+ { >+ usesFragCoord = true; >+ break; >+ } >+ } >+ >+ AddLineSegmentRasterizationEmulation(sink, root, &getSymbolTable(), driverUniforms, >+ usesFragCoord); >+ > bool hasGLFragColor = false; > bool hasGLFragData = false; > >- for (const auto &outputVar : outputVariables) >+ for (const OutputVariable &outputVar : mOutputVariables) > { > if (outputVar.name == "gl_FragColor") > { >@@ -155,12 +738,33 @@ void TranslatorVulkan::translate(TIntermBlock *root, > { > sink << "layout(location = 0) out vec4 webgl_FragData[gl_MaxDrawBuffers];\n"; > } >+ >+ if (usesPointCoord) >+ { >+ TIntermBinary *viewportYScale = >+ CreateDriverUniformRef(driverUniforms, kNegViewportYScale); >+ TIntermConstantUnion *pivot = CreateBasicConstant(0.5f); >+ FlipBuiltinVariable(root, GetMainSequence(root), viewportYScale, &getSymbolTable(), >+ BuiltInVariable::gl_PointCoord(), kFlippedPointCoordName, pivot); >+ } >+ >+ if (usesFragCoord) >+ { >+ InsertFragCoordCorrection(root, GetMainSequence(root), &getSymbolTable(), >+ driverUniforms); >+ } >+ } >+ else >+ { >+ ASSERT(getShaderType() == GL_VERTEX_SHADER); >+ >+ AddANGLEPositionVarying(root, &getSymbolTable()); >+ >+ // Append depth range translation to main. >+ AppendVertexShaderDepthCorrectionToMain(root, &getSymbolTable()); > } > > // Write translated shader. >- TOutputVulkanGLSL outputGLSL(sink, getArrayIndexClampingStrategy(), getHashFunction(), >- getNameMap(), &getSymbolTable(), getShaderType(), >- getShaderVersion(), getOutputType(), compileOptions); > root->traverse(&outputGLSL); > } > >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Types.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/Types.cpp >index 530ffe3aeb5..9d0374b170f 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Types.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Types.cpp >@@ -5,10 +5,11 @@ > // > > #if defined(_MSC_VER) >-#pragma warning(disable : 4718) >+# pragma warning(disable : 4718) > #endif > > #include "compiler/translator/Types.h" >+#include "compiler/translator/ImmutableString.h" > #include "compiler/translator/InfoSink.h" > #include "compiler/translator/IntermNode.h" > #include "compiler/translator/SymbolTable.h" >@@ -51,6 +52,8 @@ const char *getBasicString(TBasicType t) > return "sampler2DArray"; > case EbtSampler2DMS: > return "sampler2DMS"; >+ case EbtSampler2DMSArray: >+ return "sampler2DMSArray"; > case EbtISampler2D: > return "isampler2D"; > case EbtISampler3D: >@@ -61,6 +64,8 @@ const char *getBasicString(TBasicType t) > return "isampler2DArray"; > case EbtISampler2DMS: > return "isampler2DMS"; >+ case EbtISampler2DMSArray: >+ return "isampler2DMSArray"; > case EbtUSampler2D: > return "usampler2D"; > case EbtUSampler3D: >@@ -71,6 +76,8 @@ const char *getBasicString(TBasicType t) > return "usampler2DArray"; > case EbtUSampler2DMS: > return "usampler2DMS"; >+ case EbtUSampler2DMSArray: >+ return "usampler2DMSArray"; > case EbtSampler2DShadow: > return "sampler2DShadow"; > case EbtSamplerCubeShadow: >@@ -128,8 +135,7 @@ TType::TType() > mStructure(nullptr), > mIsStructSpecifier(false), > mMangledName(nullptr) >-{ >-} >+{} > > TType::TType(TBasicType t, unsigned char ps, unsigned char ss) > : type(t), >@@ -145,8 +151,7 @@ TType::TType(TBasicType t, unsigned char ps, unsigned char ss) > mStructure(nullptr), > mIsStructSpecifier(false), > mMangledName(nullptr) >-{ >-} >+{} > > TType::TType(TBasicType t, TPrecision p, TQualifier q, unsigned char ps, unsigned char ss) > : type(t), >@@ -162,8 +167,7 @@ TType::TType(TBasicType t, TPrecision p, TQualifier q, unsigned char ps, unsigne > mStructure(nullptr), > mIsStructSpecifier(false), > mMangledName(nullptr) >-{ >-} >+{} > > TType::TType(const TPublicType &p) > : type(p.getBasicType()), >@@ -193,7 +197,7 @@ TType::TType(const TPublicType &p) > } > } > >-TType::TType(TStructure *userDef) >+TType::TType(const TStructure *userDef, bool isStructSpecifier) > : type(EbtStruct), > precision(EbpUndefined), > qualifier(EvqTemporary), >@@ -205,12 +209,11 @@ TType::TType(TStructure *userDef) > mArraySizes(nullptr), > mInterfaceBlock(nullptr), > mStructure(userDef), >- mIsStructSpecifier(false), >+ mIsStructSpecifier(isStructSpecifier), > mMangledName(nullptr) >-{ >-} >+{} > >-TType::TType(TInterfaceBlock *interfaceBlockIn, >+TType::TType(const TInterfaceBlock *interfaceBlockIn, > TQualifier qualifierIn, > TLayoutQualifier layoutQualifierIn) > : type(EbtInterfaceBlock), >@@ -226,8 +229,7 @@ TType::TType(TInterfaceBlock *interfaceBlockIn, > mStructure(0), > mIsStructSpecifier(false), > mMangledName(nullptr) >-{ >-} >+{} > > TType::TType(const TType &t) > : type(t.type), >@@ -243,8 +245,7 @@ TType::TType(const TType &t) > mStructure(t.mStructure), > mIsStructSpecifier(t.mIsStructSpecifier), > mMangledName(t.mMangledName) >-{ >-} >+{} > > TType &TType::operator=(const TType &t) > { >@@ -395,31 +396,55 @@ const char *TType::getBuiltInTypeNameString() const > return getBasicString(); > } > >-TString TType::getCompleteString() const >+int TType::getDeepestStructNesting() const > { >- TStringStream stream; >- >- if (invariant) >- stream << "invariant "; >- if (qualifier != EvqTemporary && qualifier != EvqGlobal) >- stream << getQualifierString() << " "; >- if (precision != EbpUndefined) >- stream << getPrecisionString() << " "; >- if (mArraySizes) >+ return mStructure ? mStructure->deepestNesting() : 0; >+} >+ >+bool TType::isNamelessStruct() const >+{ >+ return mStructure && mStructure->symbolType() == SymbolType::Empty; >+} >+ >+bool TType::isStructureContainingArrays() const >+{ >+ return mStructure ? mStructure->containsArrays() : false; >+} >+ >+bool TType::isStructureContainingMatrices() const >+{ >+ return mStructure ? mStructure->containsMatrices() : false; >+} >+ >+bool TType::isStructureContainingType(TBasicType t) const >+{ >+ return mStructure ? mStructure->containsType(t) : false; >+} >+ >+bool TType::isStructureContainingSamplers() const >+{ >+ return mStructure ? mStructure->containsSamplers() : false; >+} >+ >+bool TType::canReplaceWithConstantUnion() const >+{ >+ if (isArray()) > { >- for (auto arraySizeIter = mArraySizes->rbegin(); arraySizeIter != mArraySizes->rend(); >- ++arraySizeIter) >- { >- stream << "array[" << (*arraySizeIter) << "] of "; >- } >+ return false; > } >- if (isMatrix()) >- stream << getCols() << "X" << getRows() << " matrix of "; >- else if (isVector()) >- stream << getNominalSize() << "-component vector of "; >- >- stream << getBasicString(); >- return stream.str(); >+ if (!mStructure) >+ { >+ return true; >+ } >+ if (isStructureContainingArrays()) >+ { >+ return false; >+ } >+ if (getObjectSize() > 16) >+ { >+ return false; >+ } >+ return true; > } > > // >@@ -427,151 +452,37 @@ TString TType::getCompleteString() const > // > const char *TType::buildMangledName() const > { >- TString mangledName; >- if (isMatrix()) >- mangledName += 'm'; >- else if (isVector()) >- mangledName += 'v'; >- >- switch (type) >- { >- case EbtFloat: >- mangledName += 'f'; >- break; >- case EbtInt: >- mangledName += 'i'; >- break; >- case EbtUInt: >- mangledName += 'u'; >- break; >- case EbtBool: >- mangledName += 'b'; >- break; >- case EbtYuvCscStandardEXT: >- mangledName += "ycs"; >- break; >- case EbtSampler2D: >- mangledName += "s2"; >- break; >- case EbtSampler3D: >- mangledName += "s3"; >- break; >- case EbtSamplerCube: >- mangledName += "sC"; >- break; >- case EbtSampler2DArray: >- mangledName += "s2a"; >- break; >- case EbtSamplerExternalOES: >- mangledName += "sext"; >- break; >- case EbtSamplerExternal2DY2YEXT: >- mangledName += "sext2y2y"; >- break; >- case EbtSampler2DRect: >- mangledName += "s2r"; >- break; >- case EbtSampler2DMS: >- mangledName += "s2ms"; >- break; >- case EbtISampler2D: >- mangledName += "is2"; >- break; >- case EbtISampler3D: >- mangledName += "is3"; >- break; >- case EbtISamplerCube: >- mangledName += "isC"; >- break; >- case EbtISampler2DArray: >- mangledName += "is2a"; >- break; >- case EbtISampler2DMS: >- mangledName += "is2ms"; >- break; >- case EbtUSampler2D: >- mangledName += "us2"; >- break; >- case EbtUSampler3D: >- mangledName += "us3"; >- break; >- case EbtUSamplerCube: >- mangledName += "usC"; >- break; >- case EbtUSampler2DArray: >- mangledName += "us2a"; >- break; >- case EbtUSampler2DMS: >- mangledName += "us2ms"; >- break; >- case EbtSampler2DShadow: >- mangledName += "s2s"; >- break; >- case EbtSamplerCubeShadow: >- mangledName += "sCs"; >- break; >- case EbtSampler2DArrayShadow: >- mangledName += "s2as"; >- break; >- case EbtImage2D: >- mangledName += "im2"; >- break; >- case EbtIImage2D: >- mangledName += "iim2"; >- break; >- case EbtUImage2D: >- mangledName += "uim2"; >- break; >- case EbtImage3D: >- mangledName += "im3"; >- break; >- case EbtIImage3D: >- mangledName += "iim3"; >- break; >- case EbtUImage3D: >- mangledName += "uim3"; >- break; >- case EbtImage2DArray: >- mangledName += "im2a"; >- break; >- case EbtIImage2DArray: >- mangledName += "iim2a"; >- break; >- case EbtUImage2DArray: >- mangledName += "uim2a"; >- break; >- case EbtImageCube: >- mangledName += "imc"; >- break; >- case EbtIImageCube: >- mangledName += "iimc"; >- break; >- case EbtUImageCube: >- mangledName += "uimc"; >- break; >- case EbtAtomicCounter: >- mangledName += "ac"; >- break; >- case EbtStruct: >- mangledName += mStructure->mangledName(); >- break; >- case EbtInterfaceBlock: >- mangledName += mInterfaceBlock->mangledName(); >- break; >- default: >- // EbtVoid, EbtAddress and non types >- break; >- } >+ TString mangledName(1, GetSizeMangledName(primarySize, secondarySize)); > >- if (isMatrix()) >+ char basicMangledName = GetBasicMangledName(type); >+ if (basicMangledName != '{') > { >- mangledName += static_cast<char>('0' + getCols()); >- mangledName += static_cast<char>('x'); >- mangledName += static_cast<char>('0' + getRows()); >+ mangledName += basicMangledName; > } > else > { >- mangledName += static_cast<char>('0' + getNominalSize()); >+ ASSERT(type == EbtStruct || type == EbtInterfaceBlock); >+ switch (type) >+ { >+ case EbtStruct: >+ mangledName += "{s"; >+ if (mStructure->symbolType() != SymbolType::Empty) >+ { >+ mangledName += mStructure->name().data(); >+ } >+ mangledName += mStructure->mangledFieldList(); >+ mangledName += '}'; >+ break; >+ case EbtInterfaceBlock: >+ mangledName += "{i"; >+ mangledName += mInterfaceBlock->name().data(); >+ mangledName += mInterfaceBlock->mangledFieldList(); >+ mangledName += '}'; >+ break; >+ default: >+ UNREACHABLE(); >+ break; >+ } > } > > if (mArraySizes) >@@ -586,13 +497,8 @@ const char *TType::buildMangledName() const > } > } > >- mangledName += ';'; >- > // Copy string contents into a pool-allocated buffer, so we never need to call delete. >- size_t requiredSize = mangledName.size() + 1; >- char *buffer = reinterpret_cast<char *>(GetGlobalPoolAllocator()->allocate(requiredSize)); >- memcpy(buffer, mangledName.c_str(), requiredSize); >- return buffer; >+ return AllocatePoolCharArray(mangledName.c_str(), mangledName.size()); > } > > size_t TType::getObjectSize() const >@@ -807,7 +713,7 @@ void TType::toArrayElementType() > } > } > >-void TType::setInterfaceBlock(TInterfaceBlock *interfaceBlockIn) >+void TType::setInterfaceBlock(const TInterfaceBlock *interfaceBlockIn) > { > if (mInterfaceBlock != interfaceBlockIn) > { >@@ -816,15 +722,6 @@ void TType::setInterfaceBlock(TInterfaceBlock *interfaceBlockIn) > } > } > >-void TType::setStruct(TStructure *s) >-{ >- if (mStructure != s) >- { >- mStructure = s; >- invalidateMangledName(); >- } >-} >- > const char *TType::getMangledName() const > { > if (mMangledName == nullptr) >@@ -845,57 +742,10 @@ void TType::invalidateMangledName() > mMangledName = nullptr; > } > >-// TStructure implementation. >-TStructure::TStructure(TSymbolTable *symbolTable, const TString *name, TFieldList *fields) >- : TFieldListCollection(name, fields), >- mDeepestNesting(0), >- mUniqueId(symbolTable->nextUniqueId()), >- mAtGlobalScope(false) >-{ >-} >- >-bool TStructure::equals(const TStructure &other) const >-{ >- return (uniqueId() == other.uniqueId()); >-} >- >-bool TStructure::containsArrays() const >-{ >- for (size_t i = 0; i < mFields->size(); ++i) >- { >- const TType *fieldType = (*mFields)[i]->type(); >- if (fieldType->isArray() || fieldType->isStructureContainingArrays()) >- return true; >- } >- return false; >-} >- >-bool TStructure::containsType(TBasicType type) const >-{ >- for (size_t i = 0; i < mFields->size(); ++i) >- { >- const TType *fieldType = (*mFields)[i]->type(); >- if (fieldType->getBasicType() == type || fieldType->isStructureContainingType(type)) >- return true; >- } >- return false; >-} >- >-bool TStructure::containsSamplers() const >-{ >- for (size_t i = 0; i < mFields->size(); ++i) >- { >- const TType *fieldType = (*mFields)[i]->type(); >- if (IsSampler(fieldType->getBasicType()) || fieldType->isStructureContainingSamplers()) >- return true; >- } >- return false; >-} >- >-void TType::createSamplerSymbols(const TString &namePrefix, >+void TType::createSamplerSymbols(const ImmutableString &namePrefix, > const TString &apiNamePrefix, >- TVector<TIntermSymbol *> *outputSymbols, >- TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames, >+ TVector<const TVariable *> *outputSymbols, >+ TMap<const TVariable *, TString> *outputSymbolsToAPINames, > TSymbolTable *symbolTable) const > { > if (isStructureContainingSamplers()) >@@ -906,60 +756,87 @@ void TType::createSamplerSymbols(const TString &namePrefix, > elementType.toArrayElementType(); > for (unsigned int arrayIndex = 0u; arrayIndex < getOutermostArraySize(); ++arrayIndex) > { >- TStringStream elementName; >+ std::stringstream elementName = sh::InitializeStream<std::stringstream>(); > elementName << namePrefix << "_" << arrayIndex; > TStringStream elementApiName; > elementApiName << apiNamePrefix << "[" << arrayIndex << "]"; >- elementType.createSamplerSymbols(elementName.str(), elementApiName.str(), >- outputSymbols, outputSymbolsToAPINames, >- symbolTable); >+ elementType.createSamplerSymbols(ImmutableString(elementName.str()), >+ elementApiName.str(), outputSymbols, >+ outputSymbolsToAPINames, symbolTable); > } > } > else > { >- mStructure->createSamplerSymbols(namePrefix, apiNamePrefix, outputSymbols, >+ mStructure->createSamplerSymbols(namePrefix.data(), apiNamePrefix, outputSymbols, > outputSymbolsToAPINames, symbolTable); > } > return; > } > > ASSERT(IsSampler(type)); >- TIntermSymbol *symbol = new TIntermSymbol(symbolTable->nextUniqueId(), namePrefix, *this); >- outputSymbols->push_back(symbol); >+ TVariable *variable = >+ new TVariable(symbolTable, namePrefix, new TType(*this), SymbolType::AngleInternal); >+ outputSymbols->push_back(variable); > if (outputSymbolsToAPINames) > { >- (*outputSymbolsToAPINames)[symbol] = apiNamePrefix; >+ (*outputSymbolsToAPINames)[variable] = apiNamePrefix; >+ } >+} >+ >+TFieldListCollection::TFieldListCollection(const TFieldList *fields) >+ : mFields(fields), mObjectSize(0), mDeepestNesting(0) >+{} >+ >+bool TFieldListCollection::containsArrays() const >+{ >+ for (const auto *field : *mFields) >+ { >+ const TType *fieldType = field->type(); >+ if (fieldType->isArray() || fieldType->isStructureContainingArrays()) >+ return true; >+ } >+ return false; >+} >+ >+bool TFieldListCollection::containsMatrices() const >+{ >+ for (const auto *field : *mFields) >+ { >+ const TType *fieldType = field->type(); >+ if (fieldType->isMatrix() || fieldType->isStructureContainingMatrices()) >+ return true; >+ } >+ return false; >+} >+ >+bool TFieldListCollection::containsType(TBasicType type) const >+{ >+ for (const auto *field : *mFields) >+ { >+ const TType *fieldType = field->type(); >+ if (fieldType->getBasicType() == type || fieldType->isStructureContainingType(type)) >+ return true; > } >+ return false; > } > >-void TStructure::createSamplerSymbols(const TString &namePrefix, >- const TString &apiNamePrefix, >- TVector<TIntermSymbol *> *outputSymbols, >- TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames, >- TSymbolTable *symbolTable) const >+bool TFieldListCollection::containsSamplers() const > { >- ASSERT(containsSamplers()); >- for (auto &field : *mFields) >+ for (const auto *field : *mFields) > { > const TType *fieldType = field->type(); > if (IsSampler(fieldType->getBasicType()) || fieldType->isStructureContainingSamplers()) >- { >- TString fieldName = namePrefix + "_" + field->name(); >- TString fieldApiName = apiNamePrefix + "." + field->name(); >- fieldType->createSamplerSymbols(fieldName, fieldApiName, outputSymbols, >- outputSymbolsToAPINames, symbolTable); >- } >+ return true; > } >+ return false; > } > >-TString TFieldListCollection::buildMangledName(const TString &mangledNamePrefix) const >+TString TFieldListCollection::buildMangledFieldList() const > { >- TString mangledName(mangledNamePrefix); >- mangledName += *mName; >- for (size_t i = 0; i < mFields->size(); ++i) >+ TString mangledName; >+ for (const auto *field : *mFields) > { >- mangledName += '-'; >- mangledName += (*mFields)[i]->type()->getMangledName(); >+ mangledName += field->type()->getMangledName(); > } > return mangledName; > } >@@ -978,6 +855,13 @@ size_t TFieldListCollection::calculateObjectSize() const > return size; > } > >+size_t TFieldListCollection::objectSize() const >+{ >+ if (mObjectSize == 0) >+ mObjectSize = calculateObjectSize(); >+ return mObjectSize; >+} >+ > int TFieldListCollection::getLocationCount() const > { > int count = 0; >@@ -996,7 +880,21 @@ int TFieldListCollection::getLocationCount() const > return count; > } > >-int TStructure::calculateDeepestNesting() const >+int TFieldListCollection::deepestNesting() const >+{ >+ if (mDeepestNesting == 0) >+ mDeepestNesting = calculateDeepestNesting(); >+ return mDeepestNesting; >+} >+ >+const TString &TFieldListCollection::mangledFieldList() const >+{ >+ if (mMangledFieldList.empty()) >+ mMangledFieldList = buildMangledFieldList(); >+ return mMangledFieldList; >+} >+ >+int TFieldListCollection::calculateDeepestNesting() const > { > int maxNesting = 0; > for (size_t i = 0; i < mFields->size(); ++i) >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Types.h b/Source/ThirdParty/ANGLE/src/compiler/translator/Types.h >index 7dc84c5b1c3..e6bfd1cdbae 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Types.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Types.h >@@ -12,6 +12,7 @@ > > #include "compiler/translator/BaseTypes.h" > #include "compiler/translator/Common.h" >+#include "compiler/translator/ImmutableString.h" > #include "compiler/translator/SymbolUniqueId.h" > > namespace sh >@@ -19,160 +20,69 @@ namespace sh > > struct TPublicType; > class TType; >+class TInterfaceBlock; >+class TStructure; > class TSymbol; >+class TVariable; > class TIntermSymbol; > class TSymbolTable; > > class TField : angle::NonCopyable > { > public: >- POOL_ALLOCATOR_NEW_DELETE(); >- TField(TType *type, TString *name, const TSourceLoc &line) >- : mType(type), mName(name), mLine(line) >+ POOL_ALLOCATOR_NEW_DELETE >+ TField(TType *type, const ImmutableString &name, const TSourceLoc &line, SymbolType symbolType) >+ : mType(type), mName(name), mLine(line), mSymbolType(symbolType) > { >+ ASSERT(mSymbolType != SymbolType::Empty); > } > > // TODO(alokp): We should only return const type. > // Fix it by tweaking grammar. > TType *type() { return mType; } > const TType *type() const { return mType; } >- >- const TString &name() const { return *mName; } >+ const ImmutableString &name() const { return mName; } > const TSourceLoc &line() const { return mLine; } >+ SymbolType symbolType() const { return mSymbolType; } > > private: > TType *mType; >- TString *mName; >- TSourceLoc mLine; >+ const ImmutableString mName; >+ const TSourceLoc mLine; >+ const SymbolType mSymbolType; > }; > > typedef TVector<TField *> TFieldList; >-inline TFieldList *NewPoolTFieldList() >-{ >- void *memory = GetGlobalPoolAllocator()->allocate(sizeof(TFieldList)); >- return new (memory) TFieldList; >-} > > class TFieldListCollection : angle::NonCopyable > { > public: >- const TString &name() const { return *mName; } > const TFieldList &fields() const { return *mFields; } > >- size_t objectSize() const >- { >- if (mObjectSize == 0) >- mObjectSize = calculateObjectSize(); >- return mObjectSize; >- } >- >- // How many locations the field list consumes as a uniform. >- int getLocationCount() const; >- >- protected: >- TFieldListCollection(const TString *name, TFieldList *fields) >- : mName(name), mFields(fields), mObjectSize(0) >- { >- } >- TString buildMangledName(const TString &mangledNamePrefix) const; >- size_t calculateObjectSize() const; >- >- const TString *mName; >- TFieldList *mFields; >- >- mutable TString mMangledName; >- mutable size_t mObjectSize; >-}; >- >-// May also represent interface blocks >-class TStructure : public TFieldListCollection >-{ >- public: >- POOL_ALLOCATOR_NEW_DELETE(); >- TStructure(TSymbolTable *symbolTable, const TString *name, TFieldList *fields); >- >- int deepestNesting() const >- { >- if (mDeepestNesting == 0) >- mDeepestNesting = calculateDeepestNesting(); >- return mDeepestNesting; >- } > bool containsArrays() const; >+ bool containsMatrices() const; > bool containsType(TBasicType t) const; > bool containsSamplers() const; > >- void createSamplerSymbols(const TString &namePrefix, >- const TString &apiNamePrefix, >- TVector<TIntermSymbol *> *outputSymbols, >- TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames, >- TSymbolTable *symbolTable) const; >- >- bool equals(const TStructure &other) const; >- >- int uniqueId() const { return mUniqueId.get(); } >- >- void setAtGlobalScope(bool atGlobalScope) { mAtGlobalScope = atGlobalScope; } >+ size_t objectSize() const; >+ // How many locations the field list consumes as a uniform. >+ int getLocationCount() const; >+ int deepestNesting() const; >+ const TString &mangledFieldList() const; > >- bool atGlobalScope() const { return mAtGlobalScope; } >+ protected: >+ TFieldListCollection(const TFieldList *fields); > >- const TString &mangledName() const >- { >- if (mMangledName.empty()) >- mMangledName = buildMangledName("struct-"); >- return mMangledName; >- } >+ const TFieldList *mFields; > > private: >- // TODO(zmo): Find a way to get rid of the const_cast in function >- // setName(). At the moment keep this function private so only >- // friend class RegenerateStructNames may call it. >- friend class RegenerateStructNames; >- void setName(const TString &name) >- { >- TString *mutableName = const_cast<TString *>(mName); >- *mutableName = name; >- } >- >+ size_t calculateObjectSize() const; > int calculateDeepestNesting() const; >+ TString buildMangledFieldList() const; > >+ mutable size_t mObjectSize; > mutable int mDeepestNesting; >- const TSymbolUniqueId mUniqueId; >- bool mAtGlobalScope; >-}; >- >-class TInterfaceBlock : public TFieldListCollection >-{ >- public: >- POOL_ALLOCATOR_NEW_DELETE(); >- TInterfaceBlock(const TString *name, >- TFieldList *fields, >- const TString *instanceName, >- const TLayoutQualifier &layoutQualifier) >- : TFieldListCollection(name, fields), >- mInstanceName(instanceName), >- mBlockStorage(layoutQualifier.blockStorage), >- mMatrixPacking(layoutQualifier.matrixPacking), >- mBinding(layoutQualifier.binding) >- { >- } >- >- const TString &instanceName() const { return *mInstanceName; } >- bool hasInstanceName() const { return mInstanceName != nullptr; } >- TLayoutBlockStorage blockStorage() const { return mBlockStorage; } >- TLayoutMatrixPacking matrixPacking() const { return mMatrixPacking; } >- int blockBinding() const { return mBinding; } >- const TString &mangledName() const >- { >- if (mMangledName.empty()) >- mMangledName = buildMangledName("iblock-"); >- return mMangledName; >- } >- >- private: >- const TString *mInstanceName; // for interface block instance names >- TLayoutBlockStorage mBlockStorage; >- TLayoutMatrixPacking mMatrixPacking; >- int mBinding; >+ mutable TString mMangledFieldList; > }; > > // >@@ -181,7 +91,7 @@ class TInterfaceBlock : public TFieldListCollection > class TType > { > public: >- POOL_ALLOCATOR_NEW_DELETE(); >+ POOL_ALLOCATOR_NEW_DELETE > TType(); > explicit TType(TBasicType t, unsigned char ps = 1, unsigned char ss = 1); > TType(TBasicType t, >@@ -190,20 +100,57 @@ class TType > unsigned char ps = 1, > unsigned char ss = 1); > explicit TType(const TPublicType &p); >- explicit TType(TStructure *userDef); >- TType(TInterfaceBlock *interfaceBlockIn, >+ TType(const TStructure *userDef, bool isStructSpecifier); >+ TType(const TInterfaceBlock *interfaceBlockIn, > TQualifier qualifierIn, > TLayoutQualifier layoutQualifierIn); > TType(const TType &t); > TType &operator=(const TType &t); > >- TBasicType getBasicType() const { return type; } >+ constexpr TType(TBasicType t, >+ TPrecision p, >+ TQualifier q, >+ unsigned char ps, >+ unsigned char ss, >+ const char *mangledName) >+ : type(t), >+ precision(p), >+ qualifier(q), >+ invariant(false), >+ memoryQualifier(TMemoryQualifier::Create()), >+ layoutQualifier(TLayoutQualifier::Create()), >+ primarySize(ps), >+ secondarySize(ss), >+ mArraySizes(nullptr), >+ mInterfaceBlock(nullptr), >+ mStructure(nullptr), >+ mIsStructSpecifier(false), >+ mMangledName(mangledName) >+ {} >+ >+ constexpr TType(TType &&t) >+ : type(t.type), >+ precision(t.precision), >+ qualifier(t.qualifier), >+ invariant(t.invariant), >+ memoryQualifier(t.memoryQualifier), >+ layoutQualifier(t.layoutQualifier), >+ primarySize(t.primarySize), >+ secondarySize(t.secondarySize), >+ mArraySizes(t.mArraySizes), >+ mInterfaceBlock(t.mInterfaceBlock), >+ mStructure(t.mStructure), >+ mIsStructSpecifier(t.mIsStructSpecifier), >+ mMangledName(t.mMangledName) >+ {} >+ >+ constexpr TBasicType getBasicType() const { return type; } > void setBasicType(TBasicType t); > > TPrecision getPrecision() const { return precision; } > void setPrecision(TPrecision p) { precision = p; } > >- TQualifier getQualifier() const { return qualifier; } >+ constexpr TQualifier getQualifier() const { return qualifier; } > void setQualifier(TQualifier q) { qualifier = q; } > > bool isInvariant() const { return invariant; } >@@ -245,9 +192,10 @@ class TType > const TVector<unsigned int> *getArraySizes() const { return mArraySizes; } > unsigned int getArraySizeProduct() const; > bool isUnsizedArray() const; >- unsigned int getOutermostArraySize() const { >- ASSERT(isArray()); >- return mArraySizes->back(); >+ unsigned int getOutermostArraySize() const >+ { >+ ASSERT(isArray()); >+ return mArraySizes->back(); > } > void makeArray(unsigned int s); > >@@ -267,8 +215,8 @@ class TType > // Note that the array element type might still be an array type in GLSL ES version >= 3.10. > void toArrayElementType(); > >- TInterfaceBlock *getInterfaceBlock() const { return mInterfaceBlock; } >- void setInterfaceBlock(TInterfaceBlock *interfaceBlockIn); >+ const TInterfaceBlock *getInterfaceBlock() const { return mInterfaceBlock; } >+ void setInterfaceBlock(const TInterfaceBlock *interfaceBlockIn); > bool isInterfaceBlock() const { return type == EbtInterfaceBlock; } > > bool isVector() const { return primarySize > 1 && secondarySize == 1; } >@@ -281,10 +229,17 @@ class TType > > bool canBeConstructed() const; > >- TStructure *getStruct() { return mStructure; } > const TStructure *getStruct() const { return mStructure; } >- void setStruct(TStructure *s); > >+ static constexpr char GetSizeMangledName(unsigned char primarySize, unsigned char secondarySize) >+ { >+ unsigned int sizeKey = (secondarySize - 1u) * 4u + primarySize - 1u; >+ if (sizeKey < 10u) >+ { >+ return static_cast<char>('0' + sizeKey); >+ } >+ return static_cast<char>('A' + sizeKey - 10); >+ } > const char *getMangledName() const; > > bool sameNonArrayType(const TType &right) const; >@@ -334,8 +289,6 @@ class TType > > const char *getBuiltInTypeNameString() const; > >- TString getCompleteString() const; >- > // If this type is a struct, returns the deepest struct nesting of > // any field in the struct. For example: > // struct nesting1 { >@@ -348,36 +301,35 @@ class TType > // For type "nesting2", this method would return 2 -- the number > // of structures through which indirection must occur to reach the > // deepest field (nesting2.field1.position). >- int getDeepestStructNesting() const { return mStructure ? mStructure->deepestNesting() : 0; } >- >- bool isNamelessStruct() const { return mStructure && mStructure->name() == ""; } >- >- bool isStructureContainingArrays() const >- { >- return mStructure ? mStructure->containsArrays() : false; >- } >+ int getDeepestStructNesting() const; > >- bool isStructureContainingType(TBasicType t) const >- { >- return mStructure ? mStructure->containsType(t) : false; >- } >+ bool isNamelessStruct() const; > >- bool isStructureContainingSamplers() const >- { >- return mStructure ? mStructure->containsSamplers() : false; >- } >+ bool isStructureContainingArrays() const; >+ bool isStructureContainingMatrices() const; >+ bool isStructureContainingType(TBasicType t) const; >+ bool isStructureContainingSamplers() const; > > bool isStructSpecifier() const { return mIsStructSpecifier; } > >- void createSamplerSymbols(const TString &namePrefix, >+ // Return true if variables of this type should be replaced with an inline constant value if >+ // such is available. False will be returned in cases where output doesn't support >+ // TIntermConstantUnion nodes of the type, or if the type contains a lot of fields and creating >+ // several copies of it in the output code is undesirable for performance. >+ bool canReplaceWithConstantUnion() const; >+ >+ // The char arrays passed in must be pool allocated or static. >+ void createSamplerSymbols(const ImmutableString &namePrefix, > const TString &apiNamePrefix, >- TVector<TIntermSymbol *> *outputSymbols, >- TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames, >+ TVector<const TVariable *> *outputSymbols, >+ TMap<const TVariable *, TString> *outputSymbolsToAPINames, > TSymbolTable *symbolTable) const; > > // Initializes all lazily-initialized members. > void realize(); > >+ bool isSampler() const { return IsSampler(type); } >+ > private: > void invalidateMangledName(); > const char *buildMangledName() const; >@@ -399,10 +351,10 @@ class TType > // 1) Represents an interface block. > // 2) Represents the member variable of an unnamed interface block. > // It's nullptr also for members of named interface blocks. >- TInterfaceBlock *mInterfaceBlock; >+ const TInterfaceBlock *mInterfaceBlock; > >- // 0 unless this is a struct >- TStructure *mStructure; >+ // nullptr unless this is a struct >+ const TStructure *mStructure; > bool mIsStructSpecifier; > > mutable const char *mMangledName; >@@ -415,7 +367,7 @@ struct TTypeSpecifierNonArray > TBasicType type; > unsigned char primarySize; // size of vector or cols of matrix > unsigned char secondarySize; // rows of matrix >- TStructure *userDef; >+ const TStructure *userDef; > TSourceLoc line; > > // true if the type was defined by a struct specifier rather than a reference to a type name. >@@ -432,7 +384,9 @@ struct TTypeSpecifierNonArray > isStructSpecifier = false; > } > >- void initializeStruct(TStructure *aUserDef, bool aIsStructSpecifier, const TSourceLoc &aLine) >+ void initializeStruct(const TStructure *aUserDef, >+ bool aIsStructSpecifier, >+ const TSourceLoc &aLine) > { > type = EbtStruct; > primarySize = 1; >@@ -479,7 +433,7 @@ struct TPublicType > unsigned char getPrimarySize() const { return typeSpecifierNonArray.primarySize; } > unsigned char getSecondarySize() const { return typeSpecifierNonArray.secondarySize; } > >- TStructure *getUserDef() const { return typeSpecifierNonArray.userDef; } >+ const TStructure *getUserDef() const { return typeSpecifierNonArray.userDef; } > const TSourceLoc &getLine() const { return typeSpecifierNonArray.line; } > > bool isStructSpecifier() const { return typeSpecifierNonArray.isStructSpecifier; } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitAST.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitAST.cpp >deleted file mode 100644 >index 4e4653bbe5b..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitAST.cpp >+++ /dev/null >@@ -1,59 +0,0 @@ >-// >-// Copyright (c) 2002-2013 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. >-// >- >-#include "compiler/translator/UnfoldShortCircuitAST.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-// "x || y" is equivalent to "x ? true : y". >-TIntermTernary *UnfoldOR(TIntermTyped *x, TIntermTyped *y) >-{ >- TConstantUnion *u = new TConstantUnion; >- u->setBConst(true); >- TIntermConstantUnion *trueNode = >- new TIntermConstantUnion(u, TType(EbtBool, EbpUndefined, EvqConst, 1)); >- return new TIntermTernary(x, trueNode, y); >-} >- >-// "x && y" is equivalent to "x ? y : false". >-TIntermTernary *UnfoldAND(TIntermTyped *x, TIntermTyped *y) >-{ >- TConstantUnion *u = new TConstantUnion; >- u->setBConst(false); >- TIntermConstantUnion *falseNode = >- new TIntermConstantUnion(u, TType(EbtBool, EbpUndefined, EvqConst, 1)); >- return new TIntermTernary(x, y, falseNode); >-} >- >-} // namespace anonymous >- >-bool UnfoldShortCircuitAST::visitBinary(Visit visit, TIntermBinary *node) >-{ >- TIntermTernary *replacement = nullptr; >- >- switch (node->getOp()) >- { >- case EOpLogicalOr: >- replacement = UnfoldOR(node->getLeft(), node->getRight()); >- break; >- case EOpLogicalAnd: >- replacement = UnfoldAND(node->getLeft(), node->getRight()); >- break; >- default: >- break; >- } >- if (replacement) >- { >- queueReplacement(replacement, OriginalNode::IS_DROPPED); >- } >- return true; >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitAST.h b/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitAST.h >deleted file mode 100644 >index 7f377e6f152..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitAST.h >+++ /dev/null >@@ -1,33 +0,0 @@ >-// >-// Copyright (c) 2002-2013 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. >-// >-// UnfoldShortCircuitAST is an AST traverser to replace short-circuiting >-// operations with ternary operations. >-// >- >-#ifndef COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUITAST_H_ >-#define COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUITAST_H_ >- >-#include "common/angleutils.h" >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-// This traverser identifies all the short circuit binary nodes that need to >-// be replaced, and creates the corresponding replacement nodes. However, >-// the actual replacements happen after the traverse through updateTree(). >- >-class UnfoldShortCircuitAST : public TIntermTraverser >-{ >- public: >- UnfoldShortCircuitAST() : TIntermTraverser(true, false, false) {} >- >- bool visitBinary(Visit visit, TIntermBinary *) override; >-}; >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUITAST_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitToIf.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitToIf.cpp >deleted file mode 100644 >index 774f1fc704b..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitToIf.cpp >+++ /dev/null >@@ -1,186 +0,0 @@ >-// >-// Copyright (c) 2002-2013 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. >-// >-// UnfoldShortCircuitToIf is an AST traverser to convert short-circuiting operators to if-else >-// statements. >-// The results are assigned to s# temporaries, which are used by the main translator instead of >-// the original expression. >-// >- >-#include "compiler/translator/UnfoldShortCircuitToIf.h" >- >-#include "compiler/translator/IntermNodePatternMatcher.h" >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-// Traverser that unfolds one short-circuiting operation at a time. >-class UnfoldShortCircuitTraverser : public TIntermTraverser >-{ >- public: >- UnfoldShortCircuitTraverser(TSymbolTable *symbolTable); >- >- bool visitBinary(Visit visit, TIntermBinary *node) override; >- bool visitTernary(Visit visit, TIntermTernary *node) override; >- >- void nextIteration(); >- bool foundShortCircuit() const { return mFoundShortCircuit; } >- >- protected: >- // Marked to true once an operation that needs to be unfolded has been found. >- // After that, no more unfolding is performed on that traversal. >- bool mFoundShortCircuit; >- >- IntermNodePatternMatcher mPatternToUnfoldMatcher; >-}; >- >-UnfoldShortCircuitTraverser::UnfoldShortCircuitTraverser(TSymbolTable *symbolTable) >- : TIntermTraverser(true, false, true, symbolTable), >- mFoundShortCircuit(false), >- mPatternToUnfoldMatcher(IntermNodePatternMatcher::kUnfoldedShortCircuitExpression) >-{ >-} >- >-bool UnfoldShortCircuitTraverser::visitBinary(Visit visit, TIntermBinary *node) >-{ >- if (mFoundShortCircuit) >- return false; >- >- if (visit != PreVisit) >- return true; >- >- if (!mPatternToUnfoldMatcher.match(node, getParentNode())) >- return true; >- >- // If our right node doesn't have side effects, we know we don't need to unfold this >- // expression: there will be no short-circuiting side effects to avoid >- // (note: unfolding doesn't depend on the left node -- it will always be evaluated) >- ASSERT(node->getRight()->hasSideEffects()); >- >- mFoundShortCircuit = true; >- >- switch (node->getOp()) >- { >- case EOpLogicalOr: >- { >- // "x || y" is equivalent to "x ? true : y", which unfolds to "bool s; if(x) s = true; >- // else s = y;", >- // and then further simplifies down to "bool s = x; if(!s) s = y;". >- >- TIntermSequence insertions; >- TType boolType(EbtBool, EbpUndefined, EvqTemporary); >- >- ASSERT(node->getLeft()->getType() == boolType); >- insertions.push_back(createTempInitDeclaration(node->getLeft())); >- >- TIntermBlock *assignRightBlock = new TIntermBlock(); >- ASSERT(node->getRight()->getType() == boolType); >- assignRightBlock->getSequence()->push_back(createTempAssignment(node->getRight())); >- >- TIntermUnary *notTempSymbol = >- new TIntermUnary(EOpLogicalNot, createTempSymbol(boolType)); >- TIntermIfElse *ifNode = new TIntermIfElse(notTempSymbol, assignRightBlock, nullptr); >- insertions.push_back(ifNode); >- >- insertStatementsInParentBlock(insertions); >- >- queueReplacement(createTempSymbol(boolType), OriginalNode::IS_DROPPED); >- return false; >- } >- case EOpLogicalAnd: >- { >- // "x && y" is equivalent to "x ? y : false", which unfolds to "bool s; if(x) s = y; >- // else s = false;", >- // and then further simplifies down to "bool s = x; if(s) s = y;". >- TIntermSequence insertions; >- TType boolType(EbtBool, EbpUndefined, EvqTemporary); >- >- ASSERT(node->getLeft()->getType() == boolType); >- insertions.push_back(createTempInitDeclaration(node->getLeft())); >- >- TIntermBlock *assignRightBlock = new TIntermBlock(); >- ASSERT(node->getRight()->getType() == boolType); >- assignRightBlock->getSequence()->push_back(createTempAssignment(node->getRight())); >- >- TIntermIfElse *ifNode = >- new TIntermIfElse(createTempSymbol(boolType), assignRightBlock, nullptr); >- insertions.push_back(ifNode); >- >- insertStatementsInParentBlock(insertions); >- >- queueReplacement(createTempSymbol(boolType), OriginalNode::IS_DROPPED); >- return false; >- } >- default: >- UNREACHABLE(); >- return true; >- } >-} >- >-bool UnfoldShortCircuitTraverser::visitTernary(Visit visit, TIntermTernary *node) >-{ >- if (mFoundShortCircuit) >- return false; >- >- if (visit != PreVisit) >- return true; >- >- if (!mPatternToUnfoldMatcher.match(node)) >- return true; >- >- mFoundShortCircuit = true; >- >- // Unfold "b ? x : y" into "type s; if(b) s = x; else s = y;" >- TIntermSequence insertions; >- >- TIntermDeclaration *tempDeclaration = createTempDeclaration(node->getType()); >- insertions.push_back(tempDeclaration); >- >- TIntermBlock *trueBlock = new TIntermBlock(); >- TIntermBinary *trueAssignment = createTempAssignment(node->getTrueExpression()); >- trueBlock->getSequence()->push_back(trueAssignment); >- >- TIntermBlock *falseBlock = new TIntermBlock(); >- TIntermBinary *falseAssignment = createTempAssignment(node->getFalseExpression()); >- falseBlock->getSequence()->push_back(falseAssignment); >- >- TIntermIfElse *ifNode = >- new TIntermIfElse(node->getCondition()->getAsTyped(), trueBlock, falseBlock); >- insertions.push_back(ifNode); >- >- insertStatementsInParentBlock(insertions); >- >- TIntermSymbol *ternaryResult = createTempSymbol(node->getType()); >- queueReplacement(ternaryResult, OriginalNode::IS_DROPPED); >- >- return false; >-} >- >-void UnfoldShortCircuitTraverser::nextIteration() >-{ >- mFoundShortCircuit = false; >- nextTemporaryId(); >-} >- >-} // namespace >- >-void UnfoldShortCircuitToIf(TIntermNode *root, TSymbolTable *symbolTable) >-{ >- UnfoldShortCircuitTraverser traverser(symbolTable); >- // Unfold one operator at a time, and reset the traverser between iterations. >- do >- { >- traverser.nextIteration(); >- root->traverse(&traverser); >- if (traverser.foundShortCircuit()) >- traverser.updateTree(); >- } while (traverser.foundShortCircuit()); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitToIf.h b/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitToIf.h >deleted file mode 100644 >index 37dd83a8cfa..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitToIf.h >+++ /dev/null >@@ -1,25 +0,0 @@ >-// >-// Copyright (c) 2002-2012 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. >-// >-// UnfoldShortCircuitToIf is an AST traverser to convert short-circuiting operators to if-else >-// statements. >-// The results are assigned to s# temporaries, which are used by the main translator instead of >-// the original expression. >-// >- >-#ifndef COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUIT_H_ >-#define COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUIT_H_ >- >-namespace sh >-{ >- >-class TIntermNode; >-class TSymbolTable; >- >-void UnfoldShortCircuitToIf(TIntermNode *root, TSymbolTable *symbolTable); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUIT_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/UniformHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/UniformHLSL.cpp >deleted file mode 100644 >index 9f18509438e..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/UniformHLSL.cpp >+++ /dev/null >@@ -1,600 +0,0 @@ >-// >-// Copyright (c) 2014 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. >-// >-// UniformHLSL.cpp: >-// Methods for GLSL to HLSL translation for uniforms and uniform blocks. >-// >- >-#include "compiler/translator/UniformHLSL.h" >- >-#include "common/utilities.h" >-#include "compiler/translator/StructureHLSL.h" >-#include "compiler/translator/UtilsHLSL.h" >-#include "compiler/translator/blocklayoutHLSL.h" >-#include "compiler/translator/util.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-static const char *UniformRegisterPrefix(const TType &type) >-{ >- if (IsSampler(type.getBasicType())) >- { >- return "s"; >- } >- else >- { >- return "c"; >- } >-} >- >-static TString InterfaceBlockFieldTypeString(const TField &field, TLayoutBlockStorage blockStorage) >-{ >- const TType &fieldType = *field.type(); >- const TLayoutMatrixPacking matrixPacking = fieldType.getLayoutQualifier().matrixPacking; >- ASSERT(matrixPacking != EmpUnspecified); >- const TStructure *structure = fieldType.getStruct(); >- >- if (fieldType.isMatrix()) >- { >- // Use HLSL row-major packing for GLSL column-major matrices >- const TString &matrixPackString = >- (matrixPacking == EmpRowMajor ? "column_major" : "row_major"); >- return matrixPackString + " " + TypeString(fieldType); >- } >- else if (structure) >- { >- // Use HLSL row-major packing for GLSL column-major matrices >- return QualifiedStructNameString(*structure, matrixPacking == EmpColumnMajor, >- blockStorage == EbsStd140); >- } >- else >- { >- return TypeString(fieldType); >- } >-} >- >-static TString InterfaceBlockStructName(const TInterfaceBlock &interfaceBlock) >-{ >- return DecoratePrivate(interfaceBlock.name()) + "_type"; >-} >- >-void OutputSamplerIndexArrayInitializer(TInfoSinkBase &out, >- const TType &type, >- unsigned int startIndex) >-{ >- out << "{"; >- TType elementType(type); >- elementType.toArrayElementType(); >- for (unsigned int i = 0u; i < type.getOutermostArraySize(); ++i) >- { >- if (i > 0u) >- { >- out << ", "; >- } >- if (elementType.isArray()) >- { >- OutputSamplerIndexArrayInitializer(out, elementType, >- startIndex + i * elementType.getArraySizeProduct()); >- } >- else >- { >- out << (startIndex + i); >- } >- } >- out << "}"; >-} >- >-} // anonymous namespace >- >-UniformHLSL::UniformHLSL(sh::GLenum shaderType, >- StructureHLSL *structureHLSL, >- ShShaderOutput outputType, >- const std::vector<Uniform> &uniforms) >- : mUniformRegister(0), >- mUniformBlockRegister(0), >- mTextureRegister(0), >- mRWTextureRegister(0), >- mSamplerCount(0), >- mShaderType(shaderType), >- mStructureHLSL(structureHLSL), >- mOutputType(outputType), >- mUniforms(uniforms) >-{ >-} >- >-void UniformHLSL::reserveUniformRegisters(unsigned int registerCount) >-{ >- mUniformRegister = registerCount; >-} >- >-void UniformHLSL::reserveUniformBlockRegisters(unsigned int registerCount) >-{ >- mUniformBlockRegister = registerCount; >-} >- >-const Uniform *UniformHLSL::findUniformByName(const TString &name) const >-{ >- for (size_t uniformIndex = 0; uniformIndex < mUniforms.size(); ++uniformIndex) >- { >- if (mUniforms[uniformIndex].name == name.c_str()) >- { >- return &mUniforms[uniformIndex]; >- } >- } >- >- return nullptr; >-} >- >-unsigned int UniformHLSL::assignUniformRegister(const TType &type, >- const TString &name, >- unsigned int *outRegisterCount) >-{ >- unsigned int registerIndex; >- const Uniform *uniform = findUniformByName(name); >- ASSERT(uniform); >- >- if (IsSampler(type.getBasicType()) || >- (IsImage(type.getBasicType()) && type.getMemoryQualifier().readonly)) >- { >- registerIndex = mTextureRegister; >- } >- else if (IsImage(type.getBasicType())) >- { >- registerIndex = mRWTextureRegister; >- } >- else >- { >- registerIndex = mUniformRegister; >- } >- >- mUniformRegisterMap[uniform->name] = registerIndex; >- >- unsigned int registerCount = HLSLVariableRegisterCount(*uniform, mOutputType); >- >- if (IsSampler(type.getBasicType()) || >- (IsImage(type.getBasicType()) && type.getMemoryQualifier().readonly)) >- { >- mTextureRegister += registerCount; >- } >- else if (IsImage(type.getBasicType())) >- { >- mRWTextureRegister += registerCount; >- } >- else >- { >- mUniformRegister += registerCount; >- } >- if (outRegisterCount) >- { >- *outRegisterCount = registerCount; >- } >- return registerIndex; >-} >- >-unsigned int UniformHLSL::assignSamplerInStructUniformRegister(const TType &type, >- const TString &name, >- unsigned int *outRegisterCount) >-{ >- // Sampler that is a field of a uniform structure. >- ASSERT(IsSampler(type.getBasicType())); >- unsigned int registerIndex = mTextureRegister; >- mUniformRegisterMap[std::string(name.c_str())] = registerIndex; >- unsigned int registerCount = type.isArray() ? type.getArraySizeProduct() : 1u; >- mTextureRegister += registerCount; >- if (outRegisterCount) >- { >- *outRegisterCount = registerCount; >- } >- return registerIndex; >-} >- >-void UniformHLSL::outputHLSLSamplerUniformGroup( >- TInfoSinkBase &out, >- const HLSLTextureGroup textureGroup, >- const TVector<const TIntermSymbol *> &group, >- const TMap<const TIntermSymbol *, TString> &samplerInStructSymbolsToAPINames, >- unsigned int *groupTextureRegisterIndex) >-{ >- if (group.empty()) >- { >- return; >- } >- unsigned int groupRegisterCount = 0; >- for (const TIntermSymbol *uniform : group) >- { >- const TType &type = uniform->getType(); >- const TString &name = uniform->getSymbol(); >- unsigned int registerCount; >- >- // The uniform might be just a regular sampler or one extracted from a struct. >- unsigned int samplerArrayIndex = 0u; >- const Uniform *uniformByName = findUniformByName(name); >- if (uniformByName) >- { >- samplerArrayIndex = assignUniformRegister(type, name, ®isterCount); >- } >- else >- { >- ASSERT(samplerInStructSymbolsToAPINames.find(uniform) != >- samplerInStructSymbolsToAPINames.end()); >- samplerArrayIndex = assignSamplerInStructUniformRegister( >- type, samplerInStructSymbolsToAPINames.at(uniform), ®isterCount); >- } >- groupRegisterCount += registerCount; >- >- if (type.isArray()) >- { >- out << "static const uint " << DecorateVariableIfNeeded(uniform->getName()) >- << ArrayString(type) << " = "; >- OutputSamplerIndexArrayInitializer(out, type, samplerArrayIndex); >- out << ";\n"; >- } >- else >- { >- out << "static const uint " << DecorateVariableIfNeeded(uniform->getName()) << " = " >- << samplerArrayIndex << ";\n"; >- } >- } >- TString suffix = TextureGroupSuffix(textureGroup); >- // Since HLSL_TEXTURE_2D is the first group, it has a fixed offset of zero. >- if (textureGroup != HLSL_TEXTURE_2D) >- { >- out << "static const uint textureIndexOffset" << suffix << " = " >- << (*groupTextureRegisterIndex) << ";\n"; >- out << "static const uint samplerIndexOffset" << suffix << " = " >- << (*groupTextureRegisterIndex) << ";\n"; >- } >- out << "uniform " << TextureString(textureGroup) << " textures" << suffix << "[" >- << groupRegisterCount << "]" >- << " : register(t" << (*groupTextureRegisterIndex) << ");\n"; >- out << "uniform " << SamplerString(textureGroup) << " samplers" << suffix << "[" >- << groupRegisterCount << "]" >- << " : register(s" << (*groupTextureRegisterIndex) << ");\n"; >- *groupTextureRegisterIndex += groupRegisterCount; >-} >- >-void UniformHLSL::outputHLSL4_0_FL9_3Sampler(TInfoSinkBase &out, >- const TType &type, >- const TName &name, >- const unsigned int registerIndex) >-{ >- out << "uniform " << SamplerString(type.getBasicType()) << " sampler_" >- << DecorateVariableIfNeeded(name) << ArrayString(type) << " : register(s" >- << str(registerIndex) << ");\n"; >- out << "uniform " << TextureString(type.getBasicType()) << " texture_" >- << DecorateVariableIfNeeded(name) << ArrayString(type) << " : register(t" >- << str(registerIndex) << ");\n"; >-} >- >-void UniformHLSL::outputHLSL4_1_FL11Texture(TInfoSinkBase &out, >- const TType &type, >- const TName &name, >- const unsigned int registerIndex) >-{ >- // TODO(xinghua.cao@intel.com): if image2D variable is bound on one layer of Texture3D or >- // Texture2DArray. Translate this variable to HLSL Texture3D object or HLSL Texture2DArray >- // object, or create a temporary Texture2D to save content of the layer and bind the >- // temporary Texture2D to image2D variable. >- out << "uniform " >- << TextureString(type.getBasicType(), type.getLayoutQualifier().imageInternalFormat) << " " >- << DecorateVariableIfNeeded(name) << ArrayString(type) << " : register(t" >- << str(registerIndex) << ");\n"; >- return; >-} >- >-void UniformHLSL::outputHLSL4_1_FL11RWTexture(TInfoSinkBase &out, >- const TType &type, >- const TName &name, >- const unsigned int registerIndex) >-{ >- // TODO(xinghua.cao@intel.com): if image2D variable is bound on one layer of Texture3D or >- // Texture2DArray. Translate this variable to HLSL RWTexture3D object or HLSL RWTexture2DArray >- // object, or create a temporary Texture2D to save content of the layer and bind the >- // temporary Texture2D to image2D variable. >- if (mShaderType == GL_COMPUTE_SHADER) >- { >- out << "uniform " >- << RWTextureString(type.getBasicType(), type.getLayoutQualifier().imageInternalFormat) >- << " " << DecorateVariableIfNeeded(name) << ArrayString(type) << " : register(u" >- << str(registerIndex) << ");\n"; >- } >- else >- { >- // TODO(xinghua.cao@intel.com): Support images in vertex shader and fragment shader, >- // which are needed to sync binding value when linking program. >- } >- return; >-} >- >-void UniformHLSL::outputUniform(TInfoSinkBase &out, >- const TType &type, >- const TName &name, >- const unsigned int registerIndex) >-{ >- const TStructure *structure = type.getStruct(); >- // If this is a nameless struct, we need to use its full definition, rather than its (empty) >- // name. >- // TypeString() will invoke defineNameless in this case; qualifier prefixes are unnecessary for >- // nameless structs in ES, as nameless structs cannot be used anywhere that layout qualifiers >- // are permitted. >- const TString &typeName = ((structure && !structure->name().empty()) >- ? QualifiedStructNameString(*structure, false, false) >- : TypeString(type)); >- >- const TString ®isterString = >- TString("register(") + UniformRegisterPrefix(type) + str(registerIndex) + ")"; >- >- out << "uniform " << typeName << " "; >- >- out << DecorateVariableIfNeeded(name); >- >- out << ArrayString(type) << " : " << registerString << ";\n"; >-} >- >-void UniformHLSL::uniformsHeader(TInfoSinkBase &out, >- ShShaderOutput outputType, >- const ReferencedSymbols &referencedUniforms, >- TSymbolTable *symbolTable) >-{ >- if (!referencedUniforms.empty()) >- { >- out << "// Uniforms\n\n"; >- } >- // In the case of HLSL 4, sampler uniforms need to be grouped by type before the code is >- // written. They are grouped based on the combination of the HLSL texture type and >- // HLSL sampler type, enumerated in HLSLTextureSamplerGroup. >- TVector<TVector<const TIntermSymbol *>> groupedSamplerUniforms(HLSL_TEXTURE_MAX + 1); >- TMap<const TIntermSymbol *, TString> samplerInStructSymbolsToAPINames; >- TVector<const TIntermSymbol *> imageUniformsHLSL41Output; >- for (auto &uniformIt : referencedUniforms) >- { >- // Output regular uniforms. Group sampler uniforms by type. >- const TIntermSymbol &uniform = *uniformIt.second; >- const TType &type = uniform.getType(); >- const TName &name = uniform.getName(); >- >- if (outputType == SH_HLSL_4_1_OUTPUT && IsSampler(type.getBasicType())) >- { >- HLSLTextureGroup group = TextureGroup(type.getBasicType()); >- groupedSamplerUniforms[group].push_back(&uniform); >- } >- else if (outputType == SH_HLSL_4_0_FL9_3_OUTPUT && IsSampler(type.getBasicType())) >- { >- unsigned int registerIndex = assignUniformRegister(type, name.getString(), nullptr); >- outputHLSL4_0_FL9_3Sampler(out, type, name, registerIndex); >- } >- else if (outputType == SH_HLSL_4_1_OUTPUT && IsImage(type.getBasicType())) >- { >- imageUniformsHLSL41Output.push_back(&uniform); >- } >- else >- { >- if (type.isStructureContainingSamplers()) >- { >- TVector<TIntermSymbol *> samplerSymbols; >- TMap<TIntermSymbol *, TString> symbolsToAPINames; >- type.createSamplerSymbols("angle_" + name.getString(), name.getString(), >- &samplerSymbols, &symbolsToAPINames, symbolTable); >- for (TIntermSymbol *sampler : samplerSymbols) >- { >- const TType &samplerType = sampler->getType(); >- >- // Will use angle_ prefix instead of regular prefix. >- sampler->setInternal(true); >- const TName &samplerName = sampler->getName(); >- >- if (outputType == SH_HLSL_4_1_OUTPUT) >- { >- HLSLTextureGroup group = TextureGroup(samplerType.getBasicType()); >- groupedSamplerUniforms[group].push_back(sampler); >- samplerInStructSymbolsToAPINames[sampler] = symbolsToAPINames[sampler]; >- } >- else if (outputType == SH_HLSL_4_0_FL9_3_OUTPUT) >- { >- unsigned int registerIndex = assignSamplerInStructUniformRegister( >- samplerType, symbolsToAPINames[sampler], nullptr); >- outputHLSL4_0_FL9_3Sampler(out, samplerType, samplerName, registerIndex); >- } >- else >- { >- ASSERT(outputType == SH_HLSL_3_0_OUTPUT); >- unsigned int registerIndex = assignSamplerInStructUniformRegister( >- samplerType, symbolsToAPINames[sampler], nullptr); >- outputUniform(out, samplerType, samplerName, registerIndex); >- } >- } >- } >- unsigned int registerIndex = assignUniformRegister(type, name.getString(), nullptr); >- outputUniform(out, type, name, registerIndex); >- } >- } >- >- if (outputType == SH_HLSL_4_1_OUTPUT) >- { >- unsigned int groupTextureRegisterIndex = 0; >- // TEXTURE_2D is special, index offset is assumed to be 0 and omitted in that case. >- ASSERT(HLSL_TEXTURE_MIN == HLSL_TEXTURE_2D); >- for (int groupId = HLSL_TEXTURE_MIN; groupId < HLSL_TEXTURE_MAX; ++groupId) >- { >- outputHLSLSamplerUniformGroup( >- out, HLSLTextureGroup(groupId), groupedSamplerUniforms[groupId], >- samplerInStructSymbolsToAPINames, &groupTextureRegisterIndex); >- } >- mSamplerCount = groupTextureRegisterIndex; >- >- for (const TIntermSymbol *image : imageUniformsHLSL41Output) >- { >- const TType &type = image->getType(); >- const TName &name = image->getName(); >- unsigned int registerIndex = assignUniformRegister(type, name.getString(), nullptr); >- if (type.getMemoryQualifier().readonly) >- { >- outputHLSL4_1_FL11Texture(out, type, name, registerIndex); >- } >- else >- { >- outputHLSL4_1_FL11RWTexture(out, type, name, registerIndex); >- } >- } >- } >-} >- >-void UniformHLSL::samplerMetadataUniforms(TInfoSinkBase &out, const char *reg) >-{ >- // If mSamplerCount is 0 the shader doesn't use any textures for samplers. >- if (mSamplerCount > 0) >- { >- out << " struct SamplerMetadata\n" >- " {\n" >- " int baseLevel;\n" >- " int internalFormatBits;\n" >- " int wrapModes;\n" >- " int padding;\n" >- " };\n" >- " SamplerMetadata samplerMetadata[" >- << mSamplerCount << "] : packoffset(" << reg << ");\n"; >- } >-} >- >-TString UniformHLSL::uniformBlocksHeader(const ReferencedSymbols &referencedInterfaceBlocks) >-{ >- TString interfaceBlocks; >- >- for (ReferencedSymbols::const_iterator interfaceBlockIt = referencedInterfaceBlocks.begin(); >- interfaceBlockIt != referencedInterfaceBlocks.end(); interfaceBlockIt++) >- { >- const TType &nodeType = interfaceBlockIt->second->getType(); >- const TInterfaceBlock &interfaceBlock = *nodeType.getInterfaceBlock(); >- >- // nodeType.isInterfaceBlock() == false means the node is a field of a uniform block which >- // doesn't have instance name, so this block cannot be an array. >- unsigned int interfaceBlockArraySize = 0u; >- if (nodeType.isInterfaceBlock() && nodeType.isArray()) >- { >- interfaceBlockArraySize = nodeType.getOutermostArraySize(); >- } >- unsigned int activeRegister = mUniformBlockRegister; >- >- mUniformBlockRegisterMap[interfaceBlock.name().c_str()] = activeRegister; >- mUniformBlockRegister += std::max(1u, interfaceBlockArraySize); >- >- // FIXME: interface block field names >- >- if (interfaceBlock.hasInstanceName()) >- { >- interfaceBlocks += uniformBlockStructString(interfaceBlock); >- } >- >- if (interfaceBlockArraySize > 0) >- { >- for (unsigned int arrayIndex = 0; arrayIndex < interfaceBlockArraySize; arrayIndex++) >- { >- interfaceBlocks += >- uniformBlockString(interfaceBlock, activeRegister + arrayIndex, arrayIndex); >- } >- } >- else >- { >- interfaceBlocks += uniformBlockString(interfaceBlock, activeRegister, GL_INVALID_INDEX); >- } >- } >- >- return (interfaceBlocks.empty() ? "" : ("// Uniform Blocks\n\n" + interfaceBlocks)); >-} >- >-TString UniformHLSL::uniformBlockString(const TInterfaceBlock &interfaceBlock, >- unsigned int registerIndex, >- unsigned int arrayIndex) >-{ >- const TString &arrayIndexString = >- (arrayIndex != GL_INVALID_INDEX ? Decorate(str(arrayIndex)) : ""); >- const TString &blockName = interfaceBlock.name() + arrayIndexString; >- TString hlsl; >- >- hlsl += "cbuffer " + blockName + " : register(b" + str(registerIndex) + >- ")\n" >- "{\n"; >- >- if (interfaceBlock.hasInstanceName()) >- { >- hlsl += " " + InterfaceBlockStructName(interfaceBlock) + " " + >- uniformBlockInstanceString(interfaceBlock, arrayIndex) + ";\n"; >- } >- else >- { >- const TLayoutBlockStorage blockStorage = interfaceBlock.blockStorage(); >- hlsl += uniformBlockMembersString(interfaceBlock, blockStorage); >- } >- >- hlsl += "};\n\n"; >- >- return hlsl; >-} >- >-TString UniformHLSL::uniformBlockInstanceString(const TInterfaceBlock &interfaceBlock, >- unsigned int arrayIndex) >-{ >- if (!interfaceBlock.hasInstanceName()) >- { >- return ""; >- } >- else if (arrayIndex != GL_INVALID_INDEX) >- { >- return DecoratePrivate(interfaceBlock.instanceName()) + "_" + str(arrayIndex); >- } >- else >- { >- return Decorate(interfaceBlock.instanceName()); >- } >-} >- >-TString UniformHLSL::uniformBlockMembersString(const TInterfaceBlock &interfaceBlock, >- TLayoutBlockStorage blockStorage) >-{ >- TString hlsl; >- >- Std140PaddingHelper padHelper = mStructureHLSL->getPaddingHelper(); >- >- for (unsigned int typeIndex = 0; typeIndex < interfaceBlock.fields().size(); typeIndex++) >- { >- const TField &field = *interfaceBlock.fields()[typeIndex]; >- const TType &fieldType = *field.type(); >- >- if (blockStorage == EbsStd140) >- { >- // 2 and 3 component vector types in some cases need pre-padding >- hlsl += padHelper.prePaddingString(fieldType); >- } >- >- hlsl += " " + InterfaceBlockFieldTypeString(field, blockStorage) + " " + >- Decorate(field.name()) + ArrayString(fieldType) + ";\n"; >- >- // must pad out after matrices and arrays, where HLSL usually allows itself room to pack >- // stuff >- if (blockStorage == EbsStd140) >- { >- const bool useHLSLRowMajorPacking = >- (fieldType.getLayoutQualifier().matrixPacking == EmpColumnMajor); >- hlsl += padHelper.postPaddingString(fieldType, useHLSLRowMajorPacking); >- } >- } >- >- return hlsl; >-} >- >-TString UniformHLSL::uniformBlockStructString(const TInterfaceBlock &interfaceBlock) >-{ >- const TLayoutBlockStorage blockStorage = interfaceBlock.blockStorage(); >- >- return "struct " + InterfaceBlockStructName(interfaceBlock) + >- "\n" >- "{\n" + >- uniformBlockMembersString(interfaceBlock, blockStorage) + "};\n\n"; >-} >-} >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/UniformHLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/UniformHLSL.h >deleted file mode 100644 >index 8784e505330..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/UniformHLSL.h >+++ /dev/null >@@ -1,110 +0,0 @@ >-// >-// Copyright (c) 2014 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. >-// >-// UniformHLSL.h: >-// Methods for GLSL to HLSL translation for uniforms and uniform blocks. >-// >- >-#ifndef COMPILER_TRANSLATOR_UNIFORMHLSL_H_ >-#define COMPILER_TRANSLATOR_UNIFORMHLSL_H_ >- >-#include "compiler/translator/OutputHLSL.h" >-#include "compiler/translator/UtilsHLSL.h" >- >-namespace sh >-{ >-class StructureHLSL; >-class TSymbolTable; >- >-class UniformHLSL : angle::NonCopyable >-{ >- public: >- UniformHLSL(sh::GLenum shaderType, >- StructureHLSL *structureHLSL, >- ShShaderOutput outputType, >- const std::vector<Uniform> &uniforms); >- >- void reserveUniformRegisters(unsigned int registerCount); >- void reserveUniformBlockRegisters(unsigned int registerCount); >- void uniformsHeader(TInfoSinkBase &out, >- ShShaderOutput outputType, >- const ReferencedSymbols &referencedUniforms, >- TSymbolTable *symbolTable); >- >- // Must be called after uniformsHeader >- void samplerMetadataUniforms(TInfoSinkBase &out, const char *reg); >- >- TString uniformBlocksHeader(const ReferencedSymbols &referencedInterfaceBlocks); >- >- // Used for direct index references >- static TString uniformBlockInstanceString(const TInterfaceBlock &interfaceBlock, >- unsigned int arrayIndex); >- >- const std::map<std::string, unsigned int> &getUniformBlockRegisterMap() const >- { >- return mUniformBlockRegisterMap; >- } >- const std::map<std::string, unsigned int> &getUniformRegisterMap() const >- { >- return mUniformRegisterMap; >- } >- >- private: >- TString uniformBlockString(const TInterfaceBlock &interfaceBlock, >- unsigned int registerIndex, >- unsigned int arrayIndex); >- TString uniformBlockMembersString(const TInterfaceBlock &interfaceBlock, >- TLayoutBlockStorage blockStorage); >- TString uniformBlockStructString(const TInterfaceBlock &interfaceBlock); >- const Uniform *findUniformByName(const TString &name) const; >- >- void outputHLSL4_0_FL9_3Sampler(TInfoSinkBase &out, >- const TType &type, >- const TName &name, >- const unsigned int registerIndex); >- void outputHLSL4_1_FL11Texture(TInfoSinkBase &out, >- const TType &type, >- const TName &name, >- const unsigned int registerIndex); >- void outputHLSL4_1_FL11RWTexture(TInfoSinkBase &out, >- const TType &type, >- const TName &name, >- const unsigned int registerIndex); >- void outputUniform(TInfoSinkBase &out, >- const TType &type, >- const TName &name, >- const unsigned int registerIndex); >- >- // Returns the uniform's register index >- unsigned int assignUniformRegister(const TType &type, >- const TString &name, >- unsigned int *outRegisterCount); >- unsigned int assignSamplerInStructUniformRegister(const TType &type, >- const TString &name, >- unsigned int *outRegisterCount); >- >- void outputHLSLSamplerUniformGroup( >- TInfoSinkBase &out, >- const HLSLTextureGroup textureGroup, >- const TVector<const TIntermSymbol *> &group, >- const TMap<const TIntermSymbol *, TString> &samplerInStructSymbolsToAPINames, >- unsigned int *groupTextureRegisterIndex); >- >- unsigned int mUniformRegister; >- unsigned int mUniformBlockRegister; >- unsigned int mTextureRegister; >- unsigned int mRWTextureRegister; >- unsigned int mSamplerCount; >- sh::GLenum mShaderType; >- StructureHLSL *mStructureHLSL; >- ShShaderOutput mOutputType; >- >- const std::vector<Uniform> &mUniforms; >- std::map<std::string, unsigned int> mUniformBlockRegisterMap; >- std::map<std::string, unsigned int> mUniformRegisterMap; >-}; >-} >- >-#endif // COMPILER_TRANSLATOR_UNIFORMHLSL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/UseInterfaceBlockFields.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/UseInterfaceBlockFields.cpp >deleted file mode 100644 >index 40bd42afad8..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/UseInterfaceBlockFields.cpp >+++ /dev/null >@@ -1,105 +0,0 @@ >-// >-// Copyright 2016 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. >-// >- >-// UseInterfaceBlockFields.cpp: insert statements to reference all members in InterfaceBlock list at >-// the beginning of main. This is to work around a Mac driver that treats unused standard/shared >-// uniform blocks as inactive. >- >-#include "compiler/translator/UseInterfaceBlockFields.h" >- >-#include "compiler/translator/FindMain.h" >-#include "compiler/translator/IntermNode.h" >-#include "compiler/translator/IntermNode_util.h" >-#include "compiler/translator/SymbolTable.h" >-#include "compiler/translator/util.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-void AddNodeUseStatements(TIntermTyped *node, TIntermSequence *sequence) >-{ >- if (node->isArray()) >- { >- for (unsigned int i = 0u; i < node->getOutermostArraySize(); ++i) >- { >- TIntermBinary *element = >- new TIntermBinary(EOpIndexDirect, node->deepCopy(), CreateIndexNode(i)); >- AddNodeUseStatements(element, sequence); >- } >- } >- else >- { >- sequence->insert(sequence->begin(), node); >- } >-} >- >-void AddFieldUseStatements(const ShaderVariable &var, >- TIntermSequence *sequence, >- const TSymbolTable &symbolTable) >-{ >- TString name = TString(var.name.c_str()); >- ASSERT(name.find_last_of('[') == TString::npos); >- TIntermSymbol *symbol = ReferenceGlobalVariable(name, symbolTable); >- AddNodeUseStatements(symbol, sequence); >-} >- >-void InsertUseCode(const InterfaceBlock &block, TIntermTyped *blockNode, TIntermSequence *sequence) >-{ >- for (unsigned int i = 0; i < block.fields.size(); ++i) >- { >- TIntermBinary *element = new TIntermBinary(EOpIndexDirectInterfaceBlock, >- blockNode->deepCopy(), CreateIndexNode(i)); >- sequence->insert(sequence->begin(), element); >- } >-} >- >-void InsertUseCode(TIntermSequence *sequence, >- const InterfaceBlockList &blocks, >- const TSymbolTable &symbolTable) >-{ >- for (const auto &block : blocks) >- { >- if (block.instanceName.empty()) >- { >- for (const auto &var : block.fields) >- { >- AddFieldUseStatements(var, sequence, symbolTable); >- } >- } >- else if (block.arraySize > 0u) >- { >- TString name(block.instanceName.c_str()); >- TIntermSymbol *arraySymbol = ReferenceGlobalVariable(name, symbolTable); >- for (unsigned int i = 0u; i < block.arraySize; ++i) >- { >- TIntermBinary *elementSymbol = >- new TIntermBinary(EOpIndexDirect, arraySymbol->deepCopy(), CreateIndexNode(i)); >- InsertUseCode(block, elementSymbol, sequence); >- } >- } >- else >- { >- TString name(block.instanceName.c_str()); >- TIntermSymbol *blockSymbol = ReferenceGlobalVariable(name, symbolTable); >- InsertUseCode(block, blockSymbol, sequence); >- } >- } >-} >- >-} // namespace anonymous >- >-void UseInterfaceBlockFields(TIntermBlock *root, >- const InterfaceBlockList &blocks, >- const TSymbolTable &symbolTable) >-{ >- TIntermBlock *mainBody = FindMainBody(root); >- InsertUseCode(mainBody->getSequence(), blocks, symbolTable); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/UseInterfaceBlockFields.h b/Source/ThirdParty/ANGLE/src/compiler/translator/UseInterfaceBlockFields.h >deleted file mode 100644 >index 3e2a4815d49..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/UseInterfaceBlockFields.h >+++ /dev/null >@@ -1,30 +0,0 @@ >-// >-// Copyright 2016 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. >-// >- >-// UseInterfaceBlockFields.h: insert statements to reference all members in InterfaceBlock list at >-// the beginning of main. This is to work around a Mac driver that treats unused standard/shared >-// uniform blocks as inactive. >- >-#ifndef COMPILER_TRANSLATOR_USEINTERFACEBLOCKFIELDS_H_ >-#define COMPILER_TRANSLATOR_USEINTERFACEBLOCKFIELDS_H_ >- >-#include <GLSLANG/ShaderLang.h> >- >-namespace sh >-{ >- >-class TIntermBlock; >-class TSymbolTable; >- >-using InterfaceBlockList = std::vector<sh::InterfaceBlock>; >- >-void UseInterfaceBlockFields(TIntermBlock *root, >- const InterfaceBlockList &blocks, >- const TSymbolTable &symbolTable); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_USEINTERFACEBLOCKFIELDS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.cpp >index 8a77f0049a6..11e337dabd0 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.cpp >@@ -11,11 +11,39 @@ > #include "compiler/translator/IntermNode.h" > #include "compiler/translator/StructureHLSL.h" > #include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/util.h" > > namespace sh > { > >-TString SamplerString(const TBasicType type) >+namespace >+{ >+ >+void DisambiguateFunctionNameForParameterType(const TType ¶mType, >+ TString *disambiguatingStringOut) >+{ >+ // Parameter types are only added to function names if they are ambiguous according to the >+ // native HLSL compiler. Other parameter types are not added to function names to avoid >+ // making function names longer. >+ if (paramType.getObjectSize() == 4 && paramType.getBasicType() == EbtFloat) >+ { >+ // Disambiguation is needed for float2x2 and float4 parameters. These are the only >+ // built-in types that HLSL thinks are identical. float2x3 and float3x2 are different >+ // types, for example. >+ *disambiguatingStringOut += "_" + TypeString(paramType); >+ } >+ else if (paramType.getBasicType() == EbtStruct) >+ { >+ // Disambiguation is needed for struct parameters, since HLSL thinks that structs with >+ // the same fields but a different name are identical. >+ ASSERT(paramType.getStruct()->symbolType() != SymbolType::Empty); >+ *disambiguatingStringOut += "_" + TypeString(paramType); >+ } >+} >+ >+} // anonymous namespace >+ >+const char *SamplerString(const TBasicType type) > { > if (IsShadowSampler(type)) > { >@@ -27,7 +55,7 @@ TString SamplerString(const TBasicType type) > } > } > >-TString SamplerString(HLSLTextureGroup type) >+const char *SamplerString(HLSLTextureGroup type) > { > if (type >= HLSL_COMPARISON_SAMPLER_GROUP_BEGIN && type <= HLSL_COMPARISON_SAMPLER_GROUP_END) > { >@@ -56,6 +84,8 @@ HLSLTextureGroup TextureGroup(const TBasicType type, TLayoutImageInternalFormat > return HLSL_TEXTURE_3D; > case EbtSampler2DMS: > return HLSL_TEXTURE_2D_MS; >+ case EbtSampler2DMSArray: >+ return HLSL_TEXTURE_2D_MS_ARRAY; > case EbtISampler2D: > return HLSL_TEXTURE_2D_INT4; > case EbtISampler3D: >@@ -66,6 +96,8 @@ HLSLTextureGroup TextureGroup(const TBasicType type, TLayoutImageInternalFormat > return HLSL_TEXTURE_2D_ARRAY_INT4; > case EbtISampler2DMS: > return HLSL_TEXTURE_2D_MS_INT4; >+ case EbtISampler2DMSArray: >+ return HLSL_TEXTURE_2D_MS_ARRAY_INT4; > case EbtUSampler2D: > return HLSL_TEXTURE_2D_UINT4; > case EbtUSampler3D: >@@ -76,6 +108,8 @@ HLSLTextureGroup TextureGroup(const TBasicType type, TLayoutImageInternalFormat > return HLSL_TEXTURE_2D_ARRAY_UINT4; > case EbtUSampler2DMS: > return HLSL_TEXTURE_2D_MS_UINT4; >+ case EbtUSampler2DMSArray: >+ return HLSL_TEXTURE_2D_MS_ARRAY_UINT4; > case EbtSampler2DShadow: > return HLSL_TEXTURE_2D_COMPARISON; > case EbtSamplerCubeShadow: >@@ -96,6 +130,9 @@ HLSLTextureGroup TextureGroup(const TBasicType type, TLayoutImageInternalFormat > return HLSL_TEXTURE_2D_SNORM; > default: > UNREACHABLE(); >+#if !UNREACHABLE_IS_NORETURN >+ return HLSL_TEXTURE_UNKNOWN; >+#endif > } > } > case EbtIImage2D: >@@ -109,6 +146,9 @@ HLSLTextureGroup TextureGroup(const TBasicType type, TLayoutImageInternalFormat > return HLSL_TEXTURE_2D_INT4; > default: > UNREACHABLE(); >+#if !UNREACHABLE_IS_NORETURN >+ return HLSL_TEXTURE_UNKNOWN; >+#endif > } > } > case EbtUImage2D: >@@ -123,6 +163,9 @@ HLSLTextureGroup TextureGroup(const TBasicType type, TLayoutImageInternalFormat > return HLSL_TEXTURE_2D_UINT4; > default: > UNREACHABLE(); >+#if !UNREACHABLE_IS_NORETURN >+ return HLSL_TEXTURE_UNKNOWN; >+#endif > } > } > case EbtImage3D: >@@ -139,6 +182,9 @@ HLSLTextureGroup TextureGroup(const TBasicType type, TLayoutImageInternalFormat > return HLSL_TEXTURE_3D_SNORM; > default: > UNREACHABLE(); >+#if !UNREACHABLE_IS_NORETURN >+ return HLSL_TEXTURE_UNKNOWN; >+#endif > } > } > case EbtIImage3D: >@@ -152,6 +198,9 @@ HLSLTextureGroup TextureGroup(const TBasicType type, TLayoutImageInternalFormat > return HLSL_TEXTURE_3D_INT4; > default: > UNREACHABLE(); >+#if !UNREACHABLE_IS_NORETURN >+ return HLSL_TEXTURE_UNKNOWN; >+#endif > } > } > case EbtUImage3D: >@@ -165,6 +214,9 @@ HLSLTextureGroup TextureGroup(const TBasicType type, TLayoutImageInternalFormat > return HLSL_TEXTURE_3D_UINT4; > default: > UNREACHABLE(); >+#if !UNREACHABLE_IS_NORETURN >+ return HLSL_TEXTURE_UNKNOWN; >+#endif > } > } > case EbtImage2DArray: >@@ -182,6 +234,9 @@ HLSLTextureGroup TextureGroup(const TBasicType type, TLayoutImageInternalFormat > return HLSL_TEXTURE_2D_ARRAY_SNORM; > default: > UNREACHABLE(); >+#if !UNREACHABLE_IS_NORETURN >+ return HLSL_TEXTURE_UNKNOWN; >+#endif > } > } > case EbtIImage2DArray: >@@ -196,6 +251,9 @@ HLSLTextureGroup TextureGroup(const TBasicType type, TLayoutImageInternalFormat > return HLSL_TEXTURE_2D_ARRAY_INT4; > default: > UNREACHABLE(); >+#if !UNREACHABLE_IS_NORETURN >+ return HLSL_TEXTURE_UNKNOWN; >+#endif > } > } > case EbtUImage2DArray: >@@ -210,15 +268,20 @@ HLSLTextureGroup TextureGroup(const TBasicType type, TLayoutImageInternalFormat > return HLSL_TEXTURE_2D_ARRAY_UINT4; > default: > UNREACHABLE(); >+#if !UNREACHABLE_IS_NORETURN >+ return HLSL_TEXTURE_UNKNOWN; >+#endif > } > } > default: > UNREACHABLE(); >+#if !UNREACHABLE_IS_NORETURN >+ return HLSL_TEXTURE_UNKNOWN; >+#endif > } >- return HLSL_TEXTURE_UNKNOWN; > } > >-TString TextureString(const HLSLTextureGroup textureGroup) >+const char *TextureString(const HLSLTextureGroup textureGroup) > { > switch (textureGroup) > { >@@ -248,6 +311,8 @@ TString TextureString(const HLSLTextureGroup textureGroup) > return "Texture3D<snorm float4>"; > case HLSL_TEXTURE_2D_MS: > return "Texture2DMS<float4>"; >+ case HLSL_TEXTURE_2D_MS_ARRAY: >+ return "Texture2DMSArray<float4>"; > case HLSL_TEXTURE_2D_INT4: > return "Texture2D<int4>"; > case HLSL_TEXTURE_3D_INT4: >@@ -256,6 +321,8 @@ TString TextureString(const HLSLTextureGroup textureGroup) > return "Texture2DArray<int4>"; > case HLSL_TEXTURE_2D_MS_INT4: > return "Texture2DMS<int4>"; >+ case HLSL_TEXTURE_2D_MS_ARRAY_INT4: >+ return "Texture2DMSArray<int4>"; > case HLSL_TEXTURE_2D_UINT4: > return "Texture2D<uint4>"; > case HLSL_TEXTURE_3D_UINT4: >@@ -264,6 +331,8 @@ TString TextureString(const HLSLTextureGroup textureGroup) > return "Texture2DArray<uint4>"; > case HLSL_TEXTURE_2D_MS_UINT4: > return "Texture2DMS<uint4>"; >+ case HLSL_TEXTURE_2D_MS_ARRAY_UINT4: >+ return "Texture2DMSArray<uint4>"; > case HLSL_TEXTURE_2D_COMPARISON: > return "Texture2D"; > case HLSL_TEXTURE_CUBE_COMPARISON: >@@ -277,12 +346,12 @@ TString TextureString(const HLSLTextureGroup textureGroup) > return "<unknown read texture type>"; > } > >-TString TextureString(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat) >+const char *TextureString(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat) > { > return TextureString(TextureGroup(type, imageInternalFormat)); > } > >-TString TextureGroupSuffix(const HLSLTextureGroup type) >+const char *TextureGroupSuffix(const HLSLTextureGroup type) > { > switch (type) > { >@@ -312,6 +381,8 @@ TString TextureGroupSuffix(const HLSLTextureGroup type) > return "3D_snorm_float4_"; > case HLSL_TEXTURE_2D_MS: > return "2DMS"; >+ case HLSL_TEXTURE_2D_MS_ARRAY: >+ return "2DMSArray"; > case HLSL_TEXTURE_2D_INT4: > return "2D_int4_"; > case HLSL_TEXTURE_3D_INT4: >@@ -320,6 +391,8 @@ TString TextureGroupSuffix(const HLSLTextureGroup type) > return "2DArray_int4_"; > case HLSL_TEXTURE_2D_MS_INT4: > return "2DMS_int4_"; >+ case HLSL_TEXTURE_2D_MS_ARRAY_INT4: >+ return "2DMSArray_int4_"; > case HLSL_TEXTURE_2D_UINT4: > return "2D_uint4_"; > case HLSL_TEXTURE_3D_UINT4: >@@ -328,6 +401,8 @@ TString TextureGroupSuffix(const HLSLTextureGroup type) > return "2DArray_uint4_"; > case HLSL_TEXTURE_2D_MS_UINT4: > return "2DMS_uint4_"; >+ case HLSL_TEXTURE_2D_MS_ARRAY_UINT4: >+ return "2DMSArray_uint4_"; > case HLSL_TEXTURE_2D_COMPARISON: > return "2D_comparison"; > case HLSL_TEXTURE_CUBE_COMPARISON: >@@ -341,12 +416,13 @@ TString TextureGroupSuffix(const HLSLTextureGroup type) > return "<unknown texture type>"; > } > >-TString TextureGroupSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat) >+const char *TextureGroupSuffix(const TBasicType type, >+ TLayoutImageInternalFormat imageInternalFormat) > { > return TextureGroupSuffix(TextureGroup(type, imageInternalFormat)); > } > >-TString TextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat) >+const char *TextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat) > { > switch (type) > { >@@ -371,6 +447,9 @@ TString TextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat imag > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > case EbtIImageCube: > { >@@ -384,6 +463,9 @@ TString TextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat imag > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > case EbtUImageCube: > { >@@ -397,11 +479,18 @@ TString TextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat imag > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > default: > // All other types are identified by their group suffix > return TextureGroupSuffix(type, imageInternalFormat); > } >+#if !UNREACHABLE_IS_NORETURN >+ UNREACHABLE(); >+ return "_TTS_invalid_"; >+#endif > } > > HLSLRWTextureGroup RWTextureGroup(const TBasicType type, >@@ -425,6 +514,9 @@ HLSLRWTextureGroup RWTextureGroup(const TBasicType type, > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > case EbtIImage2D: > { >@@ -438,6 +530,9 @@ HLSLRWTextureGroup RWTextureGroup(const TBasicType type, > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > case EbtUImage2D: > { >@@ -452,6 +547,9 @@ HLSLRWTextureGroup RWTextureGroup(const TBasicType type, > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > case EbtImage3D: > { >@@ -468,6 +566,9 @@ HLSLRWTextureGroup RWTextureGroup(const TBasicType type, > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > case EbtIImage3D: > { >@@ -481,6 +582,9 @@ HLSLRWTextureGroup RWTextureGroup(const TBasicType type, > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > case EbtUImage3D: > { >@@ -494,6 +598,9 @@ HLSLRWTextureGroup RWTextureGroup(const TBasicType type, > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > case EbtImage2DArray: > case EbtImageCube: >@@ -511,6 +618,9 @@ HLSLRWTextureGroup RWTextureGroup(const TBasicType type, > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > case EbtIImage2DArray: > case EbtIImageCube: >@@ -525,6 +635,9 @@ HLSLRWTextureGroup RWTextureGroup(const TBasicType type, > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > case EbtUImage2DArray: > case EbtUImageCube: >@@ -539,6 +652,9 @@ HLSLRWTextureGroup RWTextureGroup(const TBasicType type, > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > default: > UNREACHABLE(); >@@ -546,7 +662,7 @@ HLSLRWTextureGroup RWTextureGroup(const TBasicType type, > return HLSL_RWTEXTURE_UNKNOWN; > } > >-TString RWTextureString(const HLSLRWTextureGroup RWTextureGroup) >+const char *RWTextureString(const HLSLRWTextureGroup RWTextureGroup) > { > switch (RWTextureGroup) > { >@@ -587,12 +703,12 @@ TString RWTextureString(const HLSLRWTextureGroup RWTextureGroup) > return "<unknown read and write texture type>"; > } > >-TString RWTextureString(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat) >+const char *RWTextureString(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat) > { > return RWTextureString(RWTextureGroup(type, imageInternalFormat)); > } > >-TString RWTextureGroupSuffix(const HLSLRWTextureGroup type) >+const char *RWTextureGroupSuffix(const HLSLRWTextureGroup type) > { > switch (type) > { >@@ -633,12 +749,14 @@ TString RWTextureGroupSuffix(const HLSLRWTextureGroup type) > return "<unknown read and write resource>"; > } > >-TString RWTextureGroupSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat) >+const char *RWTextureGroupSuffix(const TBasicType type, >+ TLayoutImageInternalFormat imageInternalFormat) > { > return RWTextureGroupSuffix(RWTextureGroup(type, imageInternalFormat)); > } > >-TString RWTextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat) >+const char *RWTextureTypeSuffix(const TBasicType type, >+ TLayoutImageInternalFormat imageInternalFormat) > { > switch (type) > { >@@ -657,6 +775,9 @@ TString RWTextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat im > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > case EbtIImageCube: > { >@@ -670,6 +791,9 @@ TString RWTextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat im > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > case EbtUImageCube: > { >@@ -683,67 +807,84 @@ TString RWTextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat im > default: > UNREACHABLE(); > } >+#if !UNREACHABLE_IS_NORETURN >+ break; >+#endif > } > default: > // All other types are identified by their group suffix >- return TextureGroupSuffix(type, imageInternalFormat); >+ return RWTextureGroupSuffix(type, imageInternalFormat); > } >+#if !UNREACHABLE_IS_NORETURN >+ UNREACHABLE(); >+ return "_RWTS_invalid_"; >+#endif > } > >-TString DecorateField(const TString &string, const TStructure &structure) >+TString DecorateField(const ImmutableString &string, const TStructure &structure) > { >- if (structure.name().compare(0, 3, "gl_") != 0) >+ if (structure.symbolType() != SymbolType::BuiltIn) > { > return Decorate(string); > } > >- return string; >+ return TString(string.data()); > } > >-TString DecoratePrivate(const TString &privateText) >+TString DecoratePrivate(const ImmutableString &privateText) > { >- return "dx_" + privateText; >+ return "dx_" + TString(privateText.data()); > } > >-TString Decorate(const TString &string) >+TString Decorate(const ImmutableString &string) > { >- if (string.compare(0, 3, "gl_") != 0) >+ if (!string.beginsWith("gl_")) > { >- return "_" + string; >+ return "_" + TString(string.data()); > } > >- return string; >+ return TString(string.data()); > } > >-TString DecorateVariableIfNeeded(const TName &name) >+TString DecorateVariableIfNeeded(const TVariable &variable) > { >- if (name.isInternal()) >+ if (variable.symbolType() == SymbolType::AngleInternal || >+ variable.symbolType() == SymbolType::Empty) > { >+ // Besides handling internal variables, we generate names for nameless parameters here. >+ const ImmutableString &name = variable.name(); > // The name should not have a prefix reserved for user-defined variables or functions. >- ASSERT(name.getString().compare(0, 2, "f_") != 0); >- ASSERT(name.getString().compare(0, 1, "_") != 0); >- return name.getString(); >+ ASSERT(!name.beginsWith("f_")); >+ ASSERT(!name.beginsWith("_")); >+ return TString(name.data()); >+ } >+ // For user defined variables, combine variable name with unique id >+ // so variables of the same name in different scopes do not get overwritten. >+ else if (variable.symbolType() == SymbolType::UserDefined && >+ variable.getType().getQualifier() == EvqTemporary) >+ { >+ return Decorate(variable.name()) + str(variable.uniqueId().get()); > } > else > { >- return Decorate(name.getString()); >+ return Decorate(variable.name()); > } > } > >-TString DecorateFunctionIfNeeded(const TName &name) >+TString DecorateFunctionIfNeeded(const TFunction *func) > { >- if (name.isInternal()) >+ if (func->symbolType() == SymbolType::AngleInternal) > { > // The name should not have a prefix reserved for user-defined variables or functions. >- ASSERT(name.getString().compare(0, 2, "f_") != 0); >- ASSERT(name.getString().compare(0, 1, "_") != 0); >- return name.getString(); >+ ASSERT(!func->name().beginsWith("f_")); >+ ASSERT(!func->name().beginsWith("_")); >+ return TString(func->name().data()); > } >- ASSERT(name.getString().compare(0, 3, "gl_") != 0); >+ ASSERT(!func->name().beginsWith("gl_")); > // Add an additional f prefix to functions so that they're always disambiguated from variables. > // This is necessary in the corner case where a variable declaration hides a function that it > // uses in its initializer. >- return "f_" + name.getString(); >+ return "f_" + TString(func->name().data()); > } > > TString TypeString(const TType &type) >@@ -751,8 +892,7 @@ TString TypeString(const TType &type) > const TStructure *structure = type.getStruct(); > if (structure) > { >- const TString &typeName = structure->name(); >- if (typeName != "") >+ if (structure->symbolType() != SymbolType::Empty) > { > return StructNameString(*structure); > } >@@ -835,7 +975,8 @@ TString TypeString(const TType &type) > case EbtSamplerExternalOES: > return "sampler2D"; > case EbtAtomicCounter: >- return "atomic_uint"; >+ // Multiple atomic_uints will be implemented as a single RWByteAddressBuffer >+ return "RWByteAddressBuffer"; > default: > break; > } >@@ -847,7 +988,7 @@ TString TypeString(const TType &type) > > TString StructNameString(const TStructure &structure) > { >- if (structure.name().empty()) >+ if (structure.symbolType() == SymbolType::Empty) > { > return ""; > } >@@ -859,14 +1000,14 @@ TString StructNameString(const TStructure &structure) > return Decorate(structure.name()); > } > >- return "ss" + str(structure.uniqueId()) + "_" + structure.name(); >+ return "ss" + str(structure.uniqueId().get()) + "_" + TString(structure.name().data()); > } > > TString QualifiedStructNameString(const TStructure &structure, > bool useHLSLRowMajorPacking, > bool useStd140Packing) > { >- if (structure.name() == "") >+ if (structure.symbolType() == SymbolType::Empty) > { > return ""; > } >@@ -889,7 +1030,7 @@ TString QualifiedStructNameString(const TStructure &structure, > return prefix + StructNameString(structure); > } > >-TString InterpolationString(TQualifier qualifier) >+const char *InterpolationString(TQualifier qualifier) > { > switch (qualifier) > { >@@ -920,7 +1061,7 @@ TString InterpolationString(TQualifier qualifier) > return ""; > } > >-TString QualifierString(TQualifier qualifier) >+const char *QualifierString(TQualifier qualifier) > { > switch (qualifier) > { >@@ -940,29 +1081,26 @@ TString QualifierString(TQualifier qualifier) > return ""; > } > >-TString DisambiguateFunctionName(const TIntermSequence *parameters) >+TString DisambiguateFunctionName(const TFunction *func) > { > TString disambiguatingString; >- for (auto parameter : *parameters) >+ size_t paramCount = func->getParamCount(); >+ for (size_t i = 0; i < paramCount; ++i) > { >- const TType ¶mType = parameter->getAsTyped()->getType(); >- // Parameter types are only added to function names if they are ambiguous according to the >- // native HLSL compiler. Other parameter types are not added to function names to avoid >- // making function names longer. >- if (paramType.getObjectSize() == 4 && paramType.getBasicType() == EbtFloat) >- { >- // Disambiguation is needed for float2x2 and float4 parameters. These are the only >- // built-in types that HLSL thinks are identical. float2x3 and float3x2 are different >- // types, for example. >- disambiguatingString += "_" + TypeString(paramType); >- } >- else if (paramType.getBasicType() == EbtStruct) >- { >- // Disambiguation is needed for struct parameters, since HLSL thinks that structs with >- // the same fields but a different name are identical. >- ASSERT(paramType.getStruct()->name() != ""); >- disambiguatingString += "_" + TypeString(paramType); >- } >+ DisambiguateFunctionNameForParameterType(func->getParam(i)->getType(), >+ &disambiguatingString); >+ } >+ return disambiguatingString; >+} >+ >+TString DisambiguateFunctionName(const TIntermSequence *args) >+{ >+ TString disambiguatingString; >+ for (TIntermNode *arg : *args) >+ { >+ ASSERT(arg->getAsTyped()); >+ DisambiguateFunctionNameForParameterType(arg->getAsTyped()->getType(), >+ &disambiguatingString); > } > return disambiguatingString; > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.h >index daeec8de41a..ebd7ab3dc0c 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.h >@@ -16,11 +16,11 @@ > > #include "angle_gl.h" > >-class TName; >- > namespace sh > { > >+class TFunction; >+ > // HLSL Texture type for GLSL sampler type and readonly image type. > enum HLSLTextureGroup > { >@@ -40,14 +40,17 @@ enum HLSLTextureGroup > HLSL_TEXTURE_2D_ARRAY_SNORM, > HLSL_TEXTURE_3D_SNORM, > HLSL_TEXTURE_2D_MS, >+ HLSL_TEXTURE_2D_MS_ARRAY, > HLSL_TEXTURE_2D_INT4, > HLSL_TEXTURE_3D_INT4, > HLSL_TEXTURE_2D_ARRAY_INT4, > HLSL_TEXTURE_2D_MS_INT4, >+ HLSL_TEXTURE_2D_MS_ARRAY_INT4, > HLSL_TEXTURE_2D_UINT4, > HLSL_TEXTURE_3D_UINT4, > HLSL_TEXTURE_2D_ARRAY_UINT4, > HLSL_TEXTURE_2D_MS_UINT4, >+ HLSL_TEXTURE_2D_MS_ARRAY_UINT4, > > // Comparison samplers > >@@ -89,41 +92,44 @@ enum HLSLRWTextureGroup > > HLSLTextureGroup TextureGroup(const TBasicType type, > TLayoutImageInternalFormat imageInternalFormat = EiifUnspecified); >-TString TextureString(const HLSLTextureGroup textureGroup); >-TString TextureString(const TBasicType type, >- TLayoutImageInternalFormat imageInternalFormat = EiifUnspecified); >-TString TextureGroupSuffix(const HLSLTextureGroup type); >-TString TextureGroupSuffix(const TBasicType type, >- TLayoutImageInternalFormat imageInternalFormat = EiifUnspecified); >-TString TextureTypeSuffix(const TBasicType type, >+const char *TextureString(const HLSLTextureGroup textureGroup); >+const char *TextureString(const TBasicType type, > TLayoutImageInternalFormat imageInternalFormat = EiifUnspecified); >+const char *TextureGroupSuffix(const HLSLTextureGroup type); >+const char *TextureGroupSuffix(const TBasicType type, >+ TLayoutImageInternalFormat imageInternalFormat = EiifUnspecified); >+const char *TextureTypeSuffix(const TBasicType type, >+ TLayoutImageInternalFormat imageInternalFormat = EiifUnspecified); > HLSLRWTextureGroup RWTextureGroup(const TBasicType type, > TLayoutImageInternalFormat imageInternalFormat); >-TString RWTextureString(const HLSLRWTextureGroup textureGroup); >-TString RWTextureString(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat); >-TString RWTextureGroupSuffix(const HLSLRWTextureGroup type); >-TString RWTextureGroupSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat); >-TString RWTextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat); >+const char *RWTextureString(const HLSLRWTextureGroup textureGroup); >+const char *RWTextureString(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat); >+const char *RWTextureGroupSuffix(const HLSLRWTextureGroup type); >+const char *RWTextureGroupSuffix(const TBasicType type, >+ TLayoutImageInternalFormat imageInternalFormat); >+const char *RWTextureTypeSuffix(const TBasicType type, >+ TLayoutImageInternalFormat imageInternalFormat); > >-TString SamplerString(const TBasicType type); >-TString SamplerString(HLSLTextureGroup type); >+const char *SamplerString(const TBasicType type); >+const char *SamplerString(HLSLTextureGroup type); > > // Adds a prefix to user-defined names to avoid naming clashes. >-TString Decorate(const TString &string); >-TString DecorateVariableIfNeeded(const TName &name); >-TString DecorateFunctionIfNeeded(const TName &name); >-TString DecorateField(const TString &string, const TStructure &structure); >-TString DecoratePrivate(const TString &privateText); >+TString Decorate(const ImmutableString &string); >+TString DecorateVariableIfNeeded(const TVariable &variable); >+TString DecorateFunctionIfNeeded(const TFunction *func); >+TString DecorateField(const ImmutableString &string, const TStructure &structure); >+TString DecoratePrivate(const ImmutableString &privateText); > TString TypeString(const TType &type); > TString StructNameString(const TStructure &structure); > TString QualifiedStructNameString(const TStructure &structure, > bool useHLSLRowMajorPacking, > bool useStd140Packing); >-TString InterpolationString(TQualifier qualifier); >-TString QualifierString(TQualifier qualifier); >+const char *InterpolationString(TQualifier qualifier); >+const char *QualifierString(TQualifier qualifier); > // Parameters may need to be included in function names to disambiguate between overloaded > // functions. >-TString DisambiguateFunctionName(const TIntermSequence *parameters); >-} >+TString DisambiguateFunctionName(const TFunction *func); >+TString DisambiguateFunctionName(const TIntermSequence *args); >+} // namespace sh > > #endif // COMPILER_TRANSLATOR_UTILSHLSL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateAST.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateAST.cpp >new file mode 100644 >index 00000000000..c0ec114741b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateAST.cpp >@@ -0,0 +1,251 @@ >+// >+// 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. >+// >+ >+#include "compiler/translator/ValidateAST.h" >+ >+#include "compiler/translator/Diagnostics.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+class ValidateAST : public TIntermTraverser >+{ >+ public: >+ static bool validate(TIntermNode *root, >+ TDiagnostics *diagnostics, >+ const ValidateASTOptions &options); >+ >+ void visitSymbol(TIntermSymbol *node) override; >+ void visitConstantUnion(TIntermConstantUnion *node) override; >+ bool visitSwizzle(Visit visit, TIntermSwizzle *node) override; >+ bool visitBinary(Visit visit, TIntermBinary *node) override; >+ bool visitUnary(Visit visit, TIntermUnary *node) override; >+ bool visitTernary(Visit visit, TIntermTernary *node) override; >+ bool visitIfElse(Visit visit, TIntermIfElse *node) override; >+ bool visitSwitch(Visit visit, TIntermSwitch *node) override; >+ bool visitCase(Visit visit, TIntermCase *node) override; >+ void visitFunctionPrototype(TIntermFunctionPrototype *node) override; >+ bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override; >+ bool visitAggregate(Visit visit, TIntermAggregate *node) override; >+ bool visitBlock(Visit visit, TIntermBlock *node) override; >+ bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) override; >+ bool visitDeclaration(Visit visit, TIntermDeclaration *node) override; >+ bool visitLoop(Visit visit, TIntermLoop *node) override; >+ bool visitBranch(Visit visit, TIntermBranch *node) override; >+ void visitPreprocessorDirective(TIntermPreprocessorDirective *node) override; >+ >+ private: >+ ValidateAST(TIntermNode *root, TDiagnostics *diagnostics, const ValidateASTOptions &options); >+ >+ // Visit as a generic node >+ void visitNode(Visit visit, TIntermNode *node); >+ >+ void expectNonNullChildren(Visit visit, TIntermNode *node, size_t least_count); >+ >+ bool validateInternal(); >+ >+ ValidateASTOptions mOptions; >+ TDiagnostics *mDiagnostics; >+ >+ // For validateSingleParent: >+ std::map<TIntermNode *, TIntermNode *> mParent; >+ bool mSingleParentFailed = false; >+ >+ // For validateNullNodes >+ bool mNullNodesFailed = false; >+}; >+ >+bool ValidateAST::validate(TIntermNode *root, >+ TDiagnostics *diagnostics, >+ const ValidateASTOptions &options) >+{ >+ ValidateAST validate(root, diagnostics, options); >+ root->traverse(&validate); >+ return validate.validateInternal(); >+} >+ >+ValidateAST::ValidateAST(TIntermNode *root, >+ TDiagnostics *diagnostics, >+ const ValidateASTOptions &options) >+ : TIntermTraverser(true, false, true, nullptr), mOptions(options), mDiagnostics(diagnostics) >+{ >+ if (mOptions.validateSingleParent) >+ { >+ mParent[root] = nullptr; >+ } >+} >+ >+void ValidateAST::visitNode(Visit visit, TIntermNode *node) >+{ >+ if (visit == PreVisit && mOptions.validateSingleParent) >+ { >+ size_t childCount = node->getChildCount(); >+ for (size_t i = 0; i < childCount; ++i) >+ { >+ TIntermNode *child = node->getChildNode(i); >+ if (mParent.find(child) != mParent.end()) >+ { >+ // If child is visited twice but through the same parent, the problem is in one of >+ // the ancestors. >+ if (mParent[child] != node) >+ { >+ mDiagnostics->error(node->getLine(), "Found child with two parents", >+ "<validateSingleParent>"); >+ mSingleParentFailed = true; >+ } >+ } >+ >+ mParent[child] = node; >+ } >+ } >+} >+ >+void ValidateAST::expectNonNullChildren(Visit visit, TIntermNode *node, size_t least_count) >+{ >+ if (visit == PreVisit && mOptions.validateNullNodes) >+ { >+ size_t childCount = node->getChildCount(); >+ if (childCount < least_count) >+ { >+ mDiagnostics->error(node->getLine(), "Too few children", "<validateNullNodes>"); >+ mNullNodesFailed = true; >+ } >+ >+ for (size_t i = 0; i < childCount; ++i) >+ { >+ if (node->getChildNode(i) == nullptr) >+ { >+ mDiagnostics->error(node->getLine(), "Found nullptr child", "<validateNullNodes>"); >+ mNullNodesFailed = true; >+ } >+ } >+ } >+} >+ >+void ValidateAST::visitSymbol(TIntermSymbol *node) >+{ >+ visitNode(PreVisit, node); >+} >+ >+void ValidateAST::visitConstantUnion(TIntermConstantUnion *node) >+{ >+ visitNode(PreVisit, node); >+} >+ >+bool ValidateAST::visitSwizzle(Visit visit, TIntermSwizzle *node) >+{ >+ visitNode(visit, node); >+ return true; >+} >+ >+bool ValidateAST::visitBinary(Visit visit, TIntermBinary *node) >+{ >+ visitNode(visit, node); >+ return true; >+} >+ >+bool ValidateAST::visitUnary(Visit visit, TIntermUnary *node) >+{ >+ visitNode(visit, node); >+ return true; >+} >+ >+bool ValidateAST::visitTernary(Visit visit, TIntermTernary *node) >+{ >+ visitNode(visit, node); >+ return true; >+} >+ >+bool ValidateAST::visitIfElse(Visit visit, TIntermIfElse *node) >+{ >+ visitNode(visit, node); >+ return true; >+} >+ >+bool ValidateAST::visitSwitch(Visit visit, TIntermSwitch *node) >+{ >+ visitNode(visit, node); >+ return true; >+} >+ >+bool ValidateAST::visitCase(Visit visit, TIntermCase *node) >+{ >+ visitNode(visit, node); >+ return true; >+} >+ >+void ValidateAST::visitFunctionPrototype(TIntermFunctionPrototype *node) >+{ >+ visitNode(PreVisit, node); >+} >+ >+bool ValidateAST::visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) >+{ >+ visitNode(visit, node); >+ return true; >+} >+ >+bool ValidateAST::visitAggregate(Visit visit, TIntermAggregate *node) >+{ >+ visitNode(visit, node); >+ expectNonNullChildren(visit, node, 0); >+ return true; >+} >+ >+bool ValidateAST::visitBlock(Visit visit, TIntermBlock *node) >+{ >+ visitNode(visit, node); >+ expectNonNullChildren(visit, node, 0); >+ return true; >+} >+ >+bool ValidateAST::visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) >+{ >+ visitNode(visit, node); >+ return true; >+} >+ >+bool ValidateAST::visitDeclaration(Visit visit, TIntermDeclaration *node) >+{ >+ visitNode(visit, node); >+ expectNonNullChildren(visit, node, 0); >+ return true; >+} >+ >+bool ValidateAST::visitLoop(Visit visit, TIntermLoop *node) >+{ >+ visitNode(visit, node); >+ return true; >+} >+ >+bool ValidateAST::visitBranch(Visit visit, TIntermBranch *node) >+{ >+ visitNode(visit, node); >+ return true; >+} >+ >+void ValidateAST::visitPreprocessorDirective(TIntermPreprocessorDirective *node) >+{ >+ visitNode(PreVisit, node); >+} >+ >+bool ValidateAST::validateInternal() >+{ >+ return !mSingleParentFailed && !mNullNodesFailed; >+} >+ >+} // anonymous namespace >+ >+bool ValidateAST(TIntermNode *root, TDiagnostics *diagnostics, const ValidateASTOptions &options) >+{ >+ return ValidateAST::validate(root, diagnostics, options); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateAST.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateAST.h >new file mode 100644 >index 00000000000..7314f6e6531 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateAST.h >@@ -0,0 +1,58 @@ >+// >+// 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. >+// >+ >+#ifndef COMPILER_TRANSLATOR_VALIDATEAST_H_ >+#define COMPILER_TRANSLATOR_VALIDATEAST_H_ >+ >+#include "compiler/translator/BaseTypes.h" >+#include "compiler/translator/Common.h" >+ >+namespace sh >+{ >+class TDiagnostics; >+class TIntermNode; >+ >+// The following options (stored in Compiler) tell the validator what to validate. Some validations >+// are conditional to certain passes. >+struct ValidateASTOptions >+{ >+ // TODO: add support for the flags marked with TODO. http://anglebug.com/2733 >+ >+ // Check that every node always has only one parent, >+ bool validateSingleParent = true; >+ // Check that all EOpCallFunctionInAST have their corresponding function definitions in the AST, >+ // with matching symbol ids. There should also be at least a prototype declaration before the >+ // function is called. >+ bool validateFunctionCall = true; // TODO >+ // Check that there are no null nodes where they are not allowed, for example as children of >+ // TIntermDeclaration or TIntermBlock. >+ bool validateNullNodes = true; >+ // Check that symbols that reference variables have consistent qualifiers and symbol ids with >+ // the variable declaration. For example, references to function out parameters should be >+ // EvqOut. >+ bool validateQualifiers = true; // TODO >+ // Check that variable declarations that can't have initializers don't have initializers >+ // (varyings, uniforms for example). >+ bool validateInitializers = true; // TODO >+ // Check that there is only one TFunction with each function name referenced in the nodes (no >+ // two TFunctions with the same name, taking internal/non-internal namespaces into account). >+ bool validateUniqueFunctions = true; // TODO >+ // Check that references to user-defined structs are matched with the corresponding struct >+ // declaration. >+ bool validateStructUsage = true; // TODO >+ // Check that expression nodes have the correct type considering their operand(s). >+ bool validateExpressionTypes = true; // TODO >+ // If SeparateDeclarations has been run, check for the absence of multi declarations as well. >+ bool validateMultiDeclarations = false; // TODO >+}; >+ >+// Check for errors and output error messages on the context. >+// Returns true if there are no errors. >+bool ValidateAST(TIntermNode *root, TDiagnostics *diagnostics, const ValidateASTOptions &options); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_VALIDATESWITCH_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.cpp >index 492972b60db..4ffb832d99b 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.cpp >@@ -6,8 +6,7 @@ > > #include "compiler/translator/ValidateGlobalInitializer.h" > >-#include "compiler/translator/IntermTraverse.h" >-#include "compiler/translator/ParseContext.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > > namespace sh > { >@@ -15,56 +14,76 @@ namespace sh > namespace > { > >+const int kMaxAllowedTraversalDepth = 256; >+ > class ValidateGlobalInitializerTraverser : public TIntermTraverser > { > public: >- ValidateGlobalInitializerTraverser(const TParseContext *context); >+ ValidateGlobalInitializerTraverser(int shaderVersion); > > void visitSymbol(TIntermSymbol *node) override; >+ void visitConstantUnion(TIntermConstantUnion *node) override; > bool visitAggregate(Visit visit, TIntermAggregate *node) override; > bool visitBinary(Visit visit, TIntermBinary *node) override; > bool visitUnary(Visit visit, TIntermUnary *node) override; > >- bool isValid() const { return mIsValid; } >+ bool isValid() const { return mIsValid && mMaxDepth < mMaxAllowedDepth; } > bool issueWarning() const { return mIssueWarning; } > > private: >- const TParseContext *mContext; >+ int mShaderVersion; > bool mIsValid; > bool mIssueWarning; > }; > > void ValidateGlobalInitializerTraverser::visitSymbol(TIntermSymbol *node) > { >- const TSymbol *sym = >- mContext->symbolTable.find(node->getSymbol(), mContext->getShaderVersion()); >- if (sym->isVariable()) >+ // ESSL 1.00 section 4.3 (or ESSL 3.00 section 4.3): >+ // Global initializers must be constant expressions. >+ switch (node->getType().getQualifier()) >+ { >+ case EvqConst: >+ break; >+ case EvqGlobal: >+ case EvqTemporary: >+ case EvqUniform: >+ // We allow these cases to be compatible with legacy ESSL 1.00 content. >+ // Implement stricter rules for ESSL 3.00 since there's no legacy content to deal >+ // with. >+ if (mShaderVersion >= 300) >+ { >+ mIsValid = false; >+ } >+ else >+ { >+ mIssueWarning = true; >+ } >+ break; >+ default: >+ mIsValid = false; >+ } >+} >+ >+void ValidateGlobalInitializerTraverser::visitConstantUnion(TIntermConstantUnion *node) >+{ >+ // Constant unions that are not constant expressions may result from folding a ternary >+ // expression. >+ switch (node->getType().getQualifier()) > { >- // ESSL 1.00 section 4.3 (or ESSL 3.00 section 4.3): >- // Global initializers must be constant expressions. >- const TVariable *var = static_cast<const TVariable *>(sym); >- switch (var->getType().getQualifier()) >- { >- case EvqConst: >- break; >- case EvqGlobal: >- case EvqTemporary: >- case EvqUniform: >- // We allow these cases to be compatible with legacy ESSL 1.00 content. >- // Implement stricter rules for ESSL 3.00 since there's no legacy content to deal >- // with. >- if (mContext->getShaderVersion() >= 300) >- { >- mIsValid = false; >- } >- else >- { >- mIssueWarning = true; >- } >- break; >- default: >+ case EvqConst: >+ break; >+ case EvqTemporary: >+ if (mShaderVersion >= 300) >+ { > mIsValid = false; >- } >+ } >+ else >+ { >+ mIssueWarning = true; >+ } >+ break; >+ default: >+ UNREACHABLE(); > } > } > >@@ -99,18 +118,20 @@ bool ValidateGlobalInitializerTraverser::visitUnary(Visit visit, TIntermUnary *n > return true; > } > >-ValidateGlobalInitializerTraverser::ValidateGlobalInitializerTraverser(const TParseContext *context) >- : TIntermTraverser(true, false, false), mContext(context), mIsValid(true), mIssueWarning(false) >+ValidateGlobalInitializerTraverser::ValidateGlobalInitializerTraverser(int shaderVersion) >+ : TIntermTraverser(true, false, false, nullptr), >+ mShaderVersion(shaderVersion), >+ mIsValid(true), >+ mIssueWarning(false) > { >+ setMaxAllowedDepth(kMaxAllowedTraversalDepth); > } > > } // namespace > >-bool ValidateGlobalInitializer(TIntermTyped *initializer, >- const TParseContext *context, >- bool *warning) >+bool ValidateGlobalInitializer(TIntermTyped *initializer, int shaderVersion, bool *warning) > { >- ValidateGlobalInitializerTraverser validate(context); >+ ValidateGlobalInitializerTraverser validate(shaderVersion); > initializer->traverse(&validate); > ASSERT(warning != nullptr); > *warning = validate.issueWarning(); >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.h >index 2e7570667a4..b830760ca49 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.h >@@ -11,12 +11,9 @@ namespace sh > { > > class TIntermTyped; >-class TParseContext; > > // Returns true if the initializer is valid. >-bool ValidateGlobalInitializer(TIntermTyped *initializer, >- const TParseContext *context, >- bool *warning); >+bool ValidateGlobalInitializer(TIntermTyped *initializer, int shaderVersion, bool *warning); > > } // namespace sh > >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.cpp >index 941f79ae513..ac8d5c14ed4 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.cpp >@@ -8,8 +8,8 @@ > > #include "angle_gl.h" > #include "compiler/translator/Diagnostics.h" >-#include "compiler/translator/IntermTraverse.h" > #include "compiler/translator/ParseContext.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > > namespace sh > { >@@ -25,7 +25,7 @@ int GetLoopSymbolId(TIntermLoop *loop) > TIntermBinary *declInit = (*declSeq)[0]->getAsBinaryNode(); > TIntermSymbol *symbol = declInit->getLeft()->getAsSymbolNode(); > >- return symbol->getId(); >+ return symbol->uniqueId().get(); > } > > // Traverses a node to check if it represents a constant index expression. >@@ -42,8 +42,7 @@ class ValidateConstIndexExpr : public TIntermTraverser > public: > ValidateConstIndexExpr(const std::vector<int> &loopSymbols) > : TIntermTraverser(true, false, false), mValid(true), mLoopSymbolIds(loopSymbols) >- { >- } >+ {} > > // Returns true if the parsed node represents a constant index expression. > bool isValid() const { return mValid; } >@@ -55,8 +54,8 @@ class ValidateConstIndexExpr : public TIntermTraverser > if (mValid) > { > bool isLoopSymbol = std::find(mLoopSymbolIds.begin(), mLoopSymbolIds.end(), >- symbol->getId()) != mLoopSymbolIds.end(); >- mValid = (symbol->getQualifier() == EvqConst) || isLoopSymbol; >+ symbol->uniqueId().get()) != mLoopSymbolIds.end(); >+ mValid = (symbol->getQualifier() == EvqConst) || isLoopSymbol; > } > } > >@@ -72,7 +71,6 @@ class ValidateLimitationsTraverser : public TLValueTrackingTraverser > public: > ValidateLimitationsTraverser(sh::GLenum shaderType, > TSymbolTable *symbolTable, >- int shaderVersion, > TDiagnostics *diagnostics); > > void visitSymbol(TIntermSymbol *node) override; >@@ -81,8 +79,8 @@ class ValidateLimitationsTraverser : public TLValueTrackingTraverser > > private: > void error(TSourceLoc loc, const char *reason, const char *token); >+ void error(TSourceLoc loc, const char *reason, const ImmutableString &token); > >- bool withinLoopBody() const; > bool isLoopIndex(TIntermSymbol *symbol); > bool validateLoopType(TIntermLoop *node); > >@@ -105,9 +103,8 @@ class ValidateLimitationsTraverser : public TLValueTrackingTraverser > > ValidateLimitationsTraverser::ValidateLimitationsTraverser(sh::GLenum shaderType, > TSymbolTable *symbolTable, >- int shaderVersion, > TDiagnostics *diagnostics) >- : TLValueTrackingTraverser(true, false, false, symbolTable, shaderVersion), >+ : TLValueTrackingTraverser(true, false, false, symbolTable), > mShaderType(shaderType), > mDiagnostics(diagnostics) > { >@@ -120,7 +117,7 @@ void ValidateLimitationsTraverser::visitSymbol(TIntermSymbol *node) > { > error(node->getLine(), > "Loop index cannot be statically assigned to within the body of the loop", >- node->getSymbol().c_str()); >+ node->getName()); > } > } > >@@ -164,14 +161,16 @@ void ValidateLimitationsTraverser::error(TSourceLoc loc, const char *reason, con > mDiagnostics->error(loc, reason, token); > } > >-bool ValidateLimitationsTraverser::withinLoopBody() const >+void ValidateLimitationsTraverser::error(TSourceLoc loc, >+ const char *reason, >+ const ImmutableString &token) > { >- return !mLoopSymbolIds.empty(); >+ error(loc, reason, token.data()); > } > > bool ValidateLimitationsTraverser::isLoopIndex(TIntermSymbol *symbol) > { >- return std::find(mLoopSymbolIds.begin(), mLoopSymbolIds.end(), symbol->getId()) != >+ return std::find(mLoopSymbolIds.begin(), mLoopSymbolIds.end(), symbol->uniqueId().get()) != > mLoopSymbolIds.end(); > } > >@@ -254,11 +253,11 @@ int ValidateLimitationsTraverser::validateForLoopInit(TIntermLoop *node) > if (!isConstExpr(declInit->getRight())) > { > error(declInit->getLine(), "Loop index cannot be initialized with non-constant expression", >- symbol->getSymbol().c_str()); >+ symbol->getName()); > return -1; > } > >- return symbol->getId(); >+ return symbol->uniqueId().get(); > } > > bool ValidateLimitationsTraverser::validateForLoopCond(TIntermLoop *node, int indexSymbolId) >@@ -286,9 +285,9 @@ bool ValidateLimitationsTraverser::validateForLoopCond(TIntermLoop *node, int in > error(binOp->getLine(), "Invalid condition", "for"); > return false; > } >- if (symbol->getId() != indexSymbolId) >+ if (symbol->uniqueId().get() != indexSymbolId) > { >- error(symbol->getLine(), "Expected loop index", symbol->getSymbol().c_str()); >+ error(symbol->getLine(), "Expected loop index", symbol->getName()); > return false; > } > // Relational operator is one of: > >= < <= == or !=. >@@ -310,7 +309,7 @@ bool ValidateLimitationsTraverser::validateForLoopCond(TIntermLoop *node, int in > if (!isConstExpr(binOp->getRight())) > { > error(binOp->getLine(), "Loop index cannot be compared with non-constant expression", >- symbol->getSymbol().c_str()); >+ symbol->getName()); > return false; > } > >@@ -357,9 +356,9 @@ bool ValidateLimitationsTraverser::validateForLoopExpr(TIntermLoop *node, int in > error(expr->getLine(), "Invalid expression", "for"); > return false; > } >- if (symbol->getId() != indexSymbolId) >+ if (symbol->uniqueId().get() != indexSymbolId) > { >- error(symbol->getLine(), "Expected loop index", symbol->getSymbol().c_str()); >+ error(symbol->getLine(), "Expected loop index", symbol->getName()); > return false; > } > >@@ -387,7 +386,7 @@ bool ValidateLimitationsTraverser::validateForLoopExpr(TIntermLoop *node, int in > if (!isConstExpr(binOp->getRight())) > { > error(binOp->getLine(), "Loop index cannot be modified by non-constant expression", >- symbol->getSymbol().c_str()); >+ symbol->getName()); > return false; > } > } >@@ -428,15 +427,14 @@ bool ValidateLimitationsTraverser::validateIndexing(TIntermBinary *node) > return valid; > } > >-} // namespace anonymous >+} // namespace > > bool ValidateLimitations(TIntermNode *root, > GLenum shaderType, > TSymbolTable *symbolTable, >- int shaderVersion, > TDiagnostics *diagnostics) > { >- ValidateLimitationsTraverser validate(shaderType, symbolTable, shaderVersion, diagnostics); >+ ValidateLimitationsTraverser validate(shaderType, symbolTable, diagnostics); > root->traverse(&validate); > return diagnostics->numErrors() == 0; > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.h >index 9149b8c216f..d219ed680a8 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.h >@@ -19,7 +19,6 @@ class TDiagnostics; > bool ValidateLimitations(TIntermNode *root, > GLenum shaderType, > TSymbolTable *symbolTable, >- int shaderVersion, > TDiagnostics *diagnostics); > > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateMaxParameters.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateMaxParameters.cpp >index 9dccbf413f6..a06babd3bd5 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateMaxParameters.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateMaxParameters.cpp >@@ -8,6 +8,7 @@ > #include "compiler/translator/ValidateMaxParameters.h" > > #include "compiler/translator/IntermNode.h" >+#include "compiler/translator/Symbol.h" > > namespace sh > { >@@ -18,7 +19,7 @@ bool ValidateMaxParameters(TIntermBlock *root, unsigned int maxParameters) > { > TIntermFunctionDefinition *definition = node->getAsFunctionDefinition(); > if (definition != nullptr && >- definition->getFunctionPrototype()->getSequence()->size() > maxParameters) >+ definition->getFunctionPrototype()->getFunction()->getParamCount() > maxParameters) > { > return false; > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateOutputs.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateOutputs.cpp >index 26f0e81ba77..98802554d6c 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateOutputs.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateOutputs.cpp >@@ -12,17 +12,18 @@ > #include <set> > > #include "compiler/translator/InfoSink.h" >-#include "compiler/translator/IntermTraverse.h" > #include "compiler/translator/ParseContext.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > > namespace sh > { > > namespace > { >+ > void error(const TIntermSymbol &symbol, const char *reason, TDiagnostics *diagnostics) > { >- diagnostics->error(symbol.getLine(), reason, symbol.getSymbol().c_str()); >+ diagnostics->error(symbol.getLine(), reason, symbol.getName().data()); > } > > class ValidateOutputsTraverser : public TIntermTraverser >@@ -43,7 +44,7 @@ class ValidateOutputsTraverser : public TIntermTraverser > OutputVector mOutputs; > OutputVector mUnspecifiedLocationOutputs; > OutputVector mYuvOutputs; >- std::set<std::string> mVisitedSymbols; >+ std::set<int> mVisitedSymbols; // Visited symbol ids. > }; > > ValidateOutputsTraverser::ValidateOutputsTraverser(const TExtensionBehavior &extBehavior, >@@ -53,19 +54,19 @@ ValidateOutputsTraverser::ValidateOutputsTraverser(const TExtensionBehavior &ext > mAllowUnspecifiedOutputLocationResolution( > IsExtensionEnabled(extBehavior, TExtension::EXT_blend_func_extended)), > mUsesFragDepth(false) >-{ >-} >+{} > > void ValidateOutputsTraverser::visitSymbol(TIntermSymbol *symbol) > { >- TString name = symbol->getSymbol(); >- TQualifier qualifier = symbol->getQualifier(); >+ if (symbol->variable().symbolType() == SymbolType::Empty) >+ return; > >- if (mVisitedSymbols.count(name.c_str()) == 1) >+ if (mVisitedSymbols.count(symbol->uniqueId().get()) == 1) > return; > >- mVisitedSymbols.insert(name.c_str()); >+ mVisitedSymbols.insert(symbol->uniqueId().get()); > >+ TQualifier qualifier = symbol->getQualifier(); > if (qualifier == EvqFragmentOut) > { > if (symbol->getType().getLayoutQualifier().location != -1) >@@ -90,33 +91,42 @@ void ValidateOutputsTraverser::visitSymbol(TIntermSymbol *symbol) > void ValidateOutputsTraverser::validate(TDiagnostics *diagnostics) const > { > ASSERT(diagnostics); >- OutputVector validOutputs(mMaxDrawBuffers); >+ OutputVector validOutputs(mMaxDrawBuffers, nullptr); >+ OutputVector validSecondaryOutputs(mMaxDrawBuffers, nullptr); > > for (const auto &symbol : mOutputs) > { >- const TType &type = symbol->getType(); >+ const TType &type = symbol->getType(); > ASSERT(!type.isArrayOfArrays()); // Disallowed in GLSL ES 3.10 section 4.3.6. > const size_t elementCount = > static_cast<size_t>(type.isArray() ? type.getOutermostArraySize() : 1u); >- const size_t location = static_cast<size_t>(type.getLayoutQualifier().location); >+ const size_t location = static_cast<size_t>(type.getLayoutQualifier().location); > > ASSERT(type.getLayoutQualifier().location != -1); > >- if (location + elementCount <= validOutputs.size()) >+ OutputVector *validOutputsToUse = &validOutputs; >+ // The default index is 0, so we only assign the output to secondary outputs in case the >+ // index is explicitly set to 1. >+ if (type.getLayoutQualifier().index == 1) >+ { >+ validOutputsToUse = &validSecondaryOutputs; >+ } >+ >+ if (location + elementCount <= validOutputsToUse->size()) > { > for (size_t elementIndex = 0; elementIndex < elementCount; elementIndex++) > { > const size_t offsetLocation = location + elementIndex; >- if (validOutputs[offsetLocation]) >+ if ((*validOutputsToUse)[offsetLocation]) > { >- std::stringstream strstr; >+ std::stringstream strstr = sh::InitializeStream<std::stringstream>(); > strstr << "conflicting output locations with previously defined output '" >- << validOutputs[offsetLocation]->getSymbol() << "'"; >+ << (*validOutputsToUse)[offsetLocation]->getName() << "'"; > error(*symbol, strstr.str().c_str(), diagnostics); > } > else > { >- validOutputs[offsetLocation] = symbol; >+ (*validOutputsToUse)[offsetLocation] = symbol; > } > } > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateSwitch.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateSwitch.cpp >index 9f7a264e582..37c33a867c0 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateSwitch.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateSwitch.cpp >@@ -7,7 +7,7 @@ > #include "compiler/translator/ValidateSwitch.h" > > #include "compiler/translator/Diagnostics.h" >-#include "compiler/translator/IntermTraverse.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > > namespace sh > { >@@ -15,11 +15,12 @@ namespace sh > namespace > { > >+const int kMaxAllowedTraversalDepth = 256; >+ > class ValidateSwitch : public TIntermTraverser > { > public: > static bool validate(TBasicType switchType, >- int shaderVersion, > TDiagnostics *diagnostics, > TIntermBlock *statementList, > const TSourceLoc &loc); >@@ -27,7 +28,7 @@ class ValidateSwitch : public TIntermTraverser > void visitSymbol(TIntermSymbol *) override; > void visitConstantUnion(TIntermConstantUnion *) override; > bool visitDeclaration(Visit, TIntermDeclaration *) override; >- bool visitBlock(Visit, TIntermBlock *) override; >+ bool visitBlock(Visit visit, TIntermBlock *) override; > bool visitBinary(Visit, TIntermBinary *) override; > bool visitUnary(Visit, TIntermUnary *) override; > bool visitTernary(Visit, TIntermTernary *) override; >@@ -40,12 +41,11 @@ class ValidateSwitch : public TIntermTraverser > bool visitBranch(Visit, TIntermBranch *) override; > > private: >- ValidateSwitch(TBasicType switchType, int shaderVersion, TDiagnostics *context); >+ ValidateSwitch(TBasicType switchType, TDiagnostics *context); > > bool validateInternal(const TSourceLoc &loc); > > TBasicType mSwitchType; >- int mShaderVersion; > TDiagnostics *mDiagnostics; > bool mCaseTypeMismatch; > bool mFirstCaseFound; >@@ -60,21 +60,19 @@ class ValidateSwitch : public TIntermTraverser > }; > > bool ValidateSwitch::validate(TBasicType switchType, >- int shaderVersion, > TDiagnostics *diagnostics, > TIntermBlock *statementList, > const TSourceLoc &loc) > { >- ValidateSwitch validate(switchType, shaderVersion, diagnostics); >+ ValidateSwitch validate(switchType, diagnostics); > ASSERT(statementList); > statementList->traverse(&validate); > return validate.validateInternal(loc); > } > >-ValidateSwitch::ValidateSwitch(TBasicType switchType, int shaderVersion, TDiagnostics *diagnostics) >- : TIntermTraverser(true, false, true), >+ValidateSwitch::ValidateSwitch(TBasicType switchType, TDiagnostics *diagnostics) >+ : TIntermTraverser(true, false, true, nullptr), > mSwitchType(switchType), >- mShaderVersion(shaderVersion), > mDiagnostics(diagnostics), > mCaseTypeMismatch(false), > mFirstCaseFound(false), >@@ -85,13 +83,14 @@ ValidateSwitch::ValidateSwitch(TBasicType switchType, int shaderVersion, TDiagno > mDefaultCount(0), > mDuplicateCases(false) > { >+ setMaxAllowedDepth(kMaxAllowedTraversalDepth); > } > > void ValidateSwitch::visitSymbol(TIntermSymbol *) > { > if (!mFirstCaseFound) > mStatementBeforeCase = true; >- mLastStatementWasCase = false; >+ mLastStatementWasCase = false; > } > > void ValidateSwitch::visitConstantUnion(TIntermConstantUnion *) >@@ -100,24 +99,28 @@ void ValidateSwitch::visitConstantUnion(TIntermConstantUnion *) > // Could be just a statement like "0;" > if (!mFirstCaseFound) > mStatementBeforeCase = true; >- mLastStatementWasCase = false; >+ mLastStatementWasCase = false; > } > > bool ValidateSwitch::visitDeclaration(Visit, TIntermDeclaration *) > { > if (!mFirstCaseFound) > mStatementBeforeCase = true; >- mLastStatementWasCase = false; >+ mLastStatementWasCase = false; > return true; > } > >-bool ValidateSwitch::visitBlock(Visit, TIntermBlock *) >+bool ValidateSwitch::visitBlock(Visit visit, TIntermBlock *) > { > if (getParentNode() != nullptr) > { > if (!mFirstCaseFound) > mStatementBeforeCase = true; >- mLastStatementWasCase = false; >+ mLastStatementWasCase = false; >+ if (visit == PreVisit) >+ ++mControlFlowDepth; >+ if (visit == PostVisit) >+ --mControlFlowDepth; > } > return true; > } >@@ -126,7 +129,7 @@ bool ValidateSwitch::visitBinary(Visit, TIntermBinary *) > { > if (!mFirstCaseFound) > mStatementBeforeCase = true; >- mLastStatementWasCase = false; >+ mLastStatementWasCase = false; > return true; > } > >@@ -134,7 +137,7 @@ bool ValidateSwitch::visitUnary(Visit, TIntermUnary *) > { > if (!mFirstCaseFound) > mStatementBeforeCase = true; >- mLastStatementWasCase = false; >+ mLastStatementWasCase = false; > return true; > } > >@@ -142,7 +145,7 @@ bool ValidateSwitch::visitTernary(Visit, TIntermTernary *) > { > if (!mFirstCaseFound) > mStatementBeforeCase = true; >- mLastStatementWasCase = false; >+ mLastStatementWasCase = false; > return true; > } > >@@ -150,7 +153,7 @@ bool ValidateSwitch::visitSwizzle(Visit, TIntermSwizzle *) > { > if (!mFirstCaseFound) > mStatementBeforeCase = true; >- mLastStatementWasCase = false; >+ mLastStatementWasCase = false; > return true; > } > >@@ -162,7 +165,7 @@ bool ValidateSwitch::visitIfElse(Visit visit, TIntermIfElse *) > --mControlFlowDepth; > if (!mFirstCaseFound) > mStatementBeforeCase = true; >- mLastStatementWasCase = false; >+ mLastStatementWasCase = false; > return true; > } > >@@ -170,7 +173,7 @@ bool ValidateSwitch::visitSwitch(Visit, TIntermSwitch *) > { > if (!mFirstCaseFound) > mStatementBeforeCase = true; >- mLastStatementWasCase = false; >+ mLastStatementWasCase = false; > // Don't go into nested switch statements > return false; > } >@@ -250,7 +253,7 @@ bool ValidateSwitch::visitAggregate(Visit visit, TIntermAggregate *) > // This is not the statementList node, but some other node. > if (!mFirstCaseFound) > mStatementBeforeCase = true; >- mLastStatementWasCase = false; >+ mLastStatementWasCase = false; > } > return true; > } >@@ -263,7 +266,7 @@ bool ValidateSwitch::visitLoop(Visit visit, TIntermLoop *) > --mControlFlowDepth; > if (!mFirstCaseFound) > mStatementBeforeCase = true; >- mLastStatementWasCase = false; >+ mLastStatementWasCase = false; > return true; > } > >@@ -271,7 +274,7 @@ bool ValidateSwitch::visitBranch(Visit, TIntermBranch *) > { > if (!mFirstCaseFound) > mStatementBeforeCase = true; >- mLastStatementWasCase = false; >+ mLastStatementWasCase = false; > return true; > } > >@@ -281,39 +284,32 @@ bool ValidateSwitch::validateInternal(const TSourceLoc &loc) > { > mDiagnostics->error(loc, "statement before the first label", "switch"); > } >- bool lastStatementWasCaseError = false; > if (mLastStatementWasCase) > { >- if (mShaderVersion == 300) >- { >- lastStatementWasCaseError = true; >- // This error has been proposed to be made optional in GLSL ES 3.00, but dEQP tests >- // still require it. >- mDiagnostics->error( >- loc, "no statement between the last label and the end of the switch statement", >- "switch"); >- } >- else >- { >- // The error has been removed from GLSL ES 3.10. >- mDiagnostics->warning( >- loc, "no statement between the last label and the end of the switch statement", >- "switch"); >- } >+ // There have been some differences between versions of GLSL ES specs on whether this should >+ // be an error or not, but as of early 2018 the latest discussion is that this is an error >+ // also on GLSL ES versions newer than 3.00. >+ mDiagnostics->error( >+ loc, "no statement between the last label and the end of the switch statement", >+ "switch"); >+ } >+ if (getMaxDepth() >= kMaxAllowedTraversalDepth) >+ { >+ mDiagnostics->error(loc, "too complex expressions inside a switch statement", "switch"); > } >- return !mStatementBeforeCase && !lastStatementWasCaseError && !mCaseInsideControlFlow && >- !mCaseTypeMismatch && mDefaultCount <= 1 && !mDuplicateCases; >+ return !mStatementBeforeCase && !mLastStatementWasCase && !mCaseInsideControlFlow && >+ !mCaseTypeMismatch && mDefaultCount <= 1 && !mDuplicateCases && >+ getMaxDepth() < kMaxAllowedTraversalDepth; > } > > } // anonymous namespace > > bool ValidateSwitchStatementList(TBasicType switchType, >- int shaderVersion, > TDiagnostics *diagnostics, > TIntermBlock *statementList, > const TSourceLoc &loc) > { >- return ValidateSwitch::validate(switchType, shaderVersion, diagnostics, statementList, loc); >+ return ValidateSwitch::validate(switchType, diagnostics, statementList, loc); > } > > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateSwitch.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateSwitch.h >index 2d2dd70f784..757820a164e 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateSwitch.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateSwitch.h >@@ -18,7 +18,6 @@ class TIntermBlock; > // Check for errors and output error messages on the context. > // Returns true if there are no errors. > bool ValidateSwitchStatementList(TBasicType switchType, >- int shaderVersion, > TDiagnostics *diagnostics, > TIntermBlock *statementList, > const TSourceLoc &loc); >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateVaryingLocations.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateVaryingLocations.cpp >index 9c36fcea789..394e35c8d85 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateVaryingLocations.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateVaryingLocations.cpp >@@ -10,7 +10,8 @@ > #include "ValidateVaryingLocations.h" > > #include "compiler/translator/Diagnostics.h" >-#include "compiler/translator/IntermTraverse.h" >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > #include "compiler/translator/util.h" > > namespace sh >@@ -21,7 +22,7 @@ namespace > > void error(const TIntermSymbol &symbol, const char *reason, TDiagnostics *diagnostics) > { >- diagnostics->error(symbol.getLine(), reason, symbol.getSymbol().c_str()); >+ diagnostics->error(symbol.getLine(), reason, symbol.getName().data()); > } > > int GetLocationCount(const TIntermSymbol *varying, bool ignoreVaryingArraySize) >@@ -40,7 +41,7 @@ int GetLocationCount(const TIntermSymbol *varying, bool ignoreVaryingArraySize) > } > return totalLocation; > } >- // [GL_OES_shader_io_blocks SPEC Chapter 4.4.1] >+ // [GL_EXT_shader_io_blocks SPEC Chapter 4.4.1] > // Geometry shader inputs, tessellation control shader inputs and outputs, and tessellation > // evaluation inputs all have an additional level of arrayness relative to other shader inputs > // and outputs. This outer array level is removed from the type before considering how many >@@ -48,7 +49,7 @@ int GetLocationCount(const TIntermSymbol *varying, bool ignoreVaryingArraySize) > else if (ignoreVaryingArraySize) > { > // Array-of-arrays cannot be inputs or outputs of a geometry shader. >- // (GL_OES_geometry_shader SPEC issues(5)) >+ // (GL_EXT_geometry_shader SPEC issues(5)) > ASSERT(!varyingType.isArrayOfArrays()); > return varyingType.getSecondarySize(); > } >@@ -82,10 +83,10 @@ void ValidateShaderInterface(TDiagnostics *diagnostics, > const int offsetLocation = location + elementIndex; > if (locationMap.find(offsetLocation) != locationMap.end()) > { >- std::stringstream strstr; >- strstr << "'" << varying->getSymbol() >+ std::stringstream strstr = sh::InitializeStream<std::stringstream>(); >+ strstr << "'" << varying->getName() > << "' conflicting location with previously defined '" >- << locationMap[offsetLocation]->getSymbol() << "'"; >+ << locationMap[offsetLocation]->getName() << "'"; > error(*varying, strstr.str().c_str(), diagnostics); > } > else >@@ -113,8 +114,7 @@ class ValidateVaryingLocationsTraverser : public TIntermTraverser > > ValidateVaryingLocationsTraverser::ValidateVaryingLocationsTraverser(GLenum shaderType) > : TIntermTraverser(true, false, false), mShaderType(shaderType) >-{ >-} >+{} > > bool ValidateVaryingLocationsTraverser::visitDeclaration(Visit visit, TIntermDeclaration *node) > { >@@ -127,6 +127,11 @@ bool ValidateVaryingLocationsTraverser::visitDeclaration(Visit visit, TIntermDec > return false; > } > >+ if (symbol->variable().symbolType() == SymbolType::Empty) >+ { >+ return false; >+ } >+ > // Collect varyings that have explicit 'location' qualifiers. > const TQualifier qualifier = symbol->getQualifier(); > if (symbol->getType().getLayoutQualifier().location != -1) >@@ -156,7 +161,7 @@ void ValidateVaryingLocationsTraverser::validate(TDiagnostics *diagnostics) > ASSERT(diagnostics); > > ValidateShaderInterface(diagnostics, mInputVaryingsWithLocation, >- mShaderType == GL_GEOMETRY_SHADER_OES); >+ mShaderType == GL_GEOMETRY_SHADER_EXT); > ValidateShaderInterface(diagnostics, mOutputVaryingsWithLocation, false); > } > >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/VariablePacker.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/VariablePacker.cpp >index 6dd396ff021..123da4b35eb 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/VariablePacker.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/VariablePacker.cpp >@@ -10,8 +10,8 @@ > > #include "angle_gl.h" > >-#include "compiler/translator/VariablePacker.h" > #include "common/utilities.h" >+#include "compiler/translator/VariablePacker.h" > > namespace sh > { >@@ -80,7 +80,7 @@ void ExpandVariable(const ShaderVariable &variable, > else > { > ShaderVariable expandedVar = variable; >- expandedVar.name = name; >+ expandedVar.name = name; > > expanded->push_back(expandedVar); > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/VectorizeVectorScalarArithmetic.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/VectorizeVectorScalarArithmetic.cpp >deleted file mode 100644 >index 1e79a609915..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/VectorizeVectorScalarArithmetic.cpp >+++ /dev/null >@@ -1,284 +0,0 @@ >-// Copyright (c) 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. >-// >-// VectorizeVectorScalarArithmetic.cpp: Turn some arithmetic operations that operate on a float >-// vector-scalar pair into vector-vector operations. This is done recursively. Some scalar binary >-// operations inside vector constructors are also turned into vector operations. >-// >-// This is targeted to work around a bug in NVIDIA OpenGL drivers that was reproducible on NVIDIA >-// driver version 387.92. It works around the most common occurrences of the bug. >- >-#include "compiler/translator/VectorizeVectorScalarArithmetic.h" >- >-#include <set> >- >-#include "compiler/translator/IntermNode.h" >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class VectorizeVectorScalarArithmeticTraverser : public TIntermTraverser >-{ >- public: >- VectorizeVectorScalarArithmeticTraverser(TSymbolTable *symbolTable) >- : TIntermTraverser(true, false, false, symbolTable), mReplaced(false) >- { >- } >- >- bool didReplaceScalarsWithVectors() { return mReplaced; } >- void nextIteration() >- { >- mReplaced = false; >- mModifiedBlocks.clear(); >- } >- >- protected: >- bool visitBinary(Visit visit, TIntermBinary *node) override; >- bool visitAggregate(Visit visit, TIntermAggregate *node) override; >- >- private: >- // These helpers should only be called from visitAggregate when visiting a constructor. >- // argBinary is the only argument of the constructor. >- void replaceMathInsideConstructor(TIntermAggregate *node, TIntermBinary *argBinary); >- void replaceAssignInsideConstructor(const TIntermAggregate *node, >- const TIntermBinary *argBinary); >- >- static TIntermTyped *Vectorize(TIntermTyped *node, >- TType vectorType, >- TIntermTraverser::OriginalNode *originalNodeFate); >- >- bool mReplaced; >- std::set<const TIntermBlock *> mModifiedBlocks; >-}; >- >-TIntermTyped *VectorizeVectorScalarArithmeticTraverser::Vectorize( >- TIntermTyped *node, >- TType vectorType, >- TIntermTraverser::OriginalNode *originalNodeFate) >-{ >- ASSERT(node->isScalar()); >- vectorType.setQualifier(EvqTemporary); >- TIntermSequence vectorConstructorArgs; >- vectorConstructorArgs.push_back(node); >- TIntermAggregate *vectorized = >- TIntermAggregate::CreateConstructor(vectorType, &vectorConstructorArgs); >- TIntermTyped *vectorizedFolded = vectorized->fold(nullptr); >- if (originalNodeFate != nullptr) >- { >- if (vectorizedFolded != vectorized) >- { >- *originalNodeFate = OriginalNode::IS_DROPPED; >- } >- else >- { >- *originalNodeFate = OriginalNode::BECOMES_CHILD; >- } >- } >- return vectorizedFolded; >-} >- >-bool VectorizeVectorScalarArithmeticTraverser::visitBinary(Visit /*visit*/, TIntermBinary *node) >-{ >- TIntermTyped *left = node->getLeft(); >- TIntermTyped *right = node->getRight(); >- ASSERT(left); >- ASSERT(right); >- switch (node->getOp()) >- { >- case EOpAdd: >- case EOpAddAssign: >- // Only these specific ops are necessary to turn into vector ops. >- break; >- default: >- return true; >- } >- if (node->getBasicType() != EbtFloat) >- { >- // Only float ops have reproduced the bug. >- return true; >- } >- if (left->isScalar() && right->isVector()) >- { >- ASSERT(!node->isAssignment()); >- ASSERT(!right->isArray()); >- OriginalNode originalNodeFate; >- TIntermTyped *leftVectorized = Vectorize(left, right->getType(), &originalNodeFate); >- queueReplacementWithParent(node, left, leftVectorized, originalNodeFate); >- mReplaced = true; >- // Don't replace more nodes in the same subtree on this traversal. However, nodes elsewhere >- // in the tree may still be replaced. >- return false; >- } >- else if (left->isVector() && right->isScalar()) >- { >- OriginalNode originalNodeFate; >- TIntermTyped *rightVectorized = Vectorize(right, left->getType(), &originalNodeFate); >- queueReplacementWithParent(node, right, rightVectorized, originalNodeFate); >- mReplaced = true; >- // Don't replace more nodes in the same subtree on this traversal. However, nodes elsewhere >- // in the tree may still be replaced. >- return false; >- } >- return true; >-} >- >-void VectorizeVectorScalarArithmeticTraverser::replaceMathInsideConstructor( >- TIntermAggregate *node, >- TIntermBinary *argBinary) >-{ >- // Turn: >- // a * b >- // into: >- // gvec(a) * gvec(b) >- >- TIntermTyped *left = argBinary->getLeft(); >- TIntermTyped *right = argBinary->getRight(); >- ASSERT(left->isScalar() && right->isScalar()); >- >- TType leftVectorizedType = left->getType(); >- leftVectorizedType.setPrimarySize(static_cast<unsigned char>(node->getType().getNominalSize())); >- TIntermTyped *leftVectorized = Vectorize(left, leftVectorizedType, nullptr); >- TType rightVectorizedType = right->getType(); >- rightVectorizedType.setPrimarySize( >- static_cast<unsigned char>(node->getType().getNominalSize())); >- TIntermTyped *rightVectorized = Vectorize(right, rightVectorizedType, nullptr); >- >- TIntermBinary *newArg = new TIntermBinary(argBinary->getOp(), leftVectorized, rightVectorized); >- queueReplacementWithParent(node, argBinary, newArg, OriginalNode::IS_DROPPED); >-} >- >-void VectorizeVectorScalarArithmeticTraverser::replaceAssignInsideConstructor( >- const TIntermAggregate *node, >- const TIntermBinary *argBinary) >-{ >- // Turn: >- // gvec(a *= b); >- // into: >- // // This is inserted into the parent block: >- // gvec s0 = gvec(a); >- // >- // // This goes where the gvec constructor used to be: >- // ((s0 *= b, a = s0.x), s0); >- >- TIntermTyped *left = argBinary->getLeft(); >- TIntermTyped *right = argBinary->getRight(); >- ASSERT(left->isScalar() && right->isScalar()); >- ASSERT(!left->hasSideEffects()); >- >- TType vecType = node->getType(); >- vecType.setQualifier(EvqTemporary); >- >- nextTemporaryId(); >- // gvec s0 = gvec(a); >- // s0 is called "tempAssignmentTarget" below. >- TIntermTyped *tempAssignmentTargetInitializer = Vectorize(left->deepCopy(), vecType, nullptr); >- TIntermDeclaration *tempAssignmentTargetDeclaration = >- createTempInitDeclaration(tempAssignmentTargetInitializer); >- >- // s0 *= b >- TOperator compoundAssignmentOp = argBinary->getOp(); >- if (compoundAssignmentOp == EOpMulAssign) >- { >- compoundAssignmentOp = EOpVectorTimesScalarAssign; >- } >- TIntermBinary *replacementCompoundAssignment = >- new TIntermBinary(compoundAssignmentOp, createTempSymbol(vecType), right->deepCopy()); >- >- // s0.x >- TVector<int> swizzleXOffset; >- swizzleXOffset.push_back(0); >- TIntermSwizzle *tempAssignmentTargetX = >- new TIntermSwizzle(createTempSymbol(vecType), swizzleXOffset); >- // a = s0.x >- TIntermBinary *replacementAssignBackToTarget = >- new TIntermBinary(EOpAssign, left->deepCopy(), tempAssignmentTargetX); >- >- // s0 *= b, a = s0.x >- TIntermBinary *replacementSequenceLeft = >- new TIntermBinary(EOpComma, replacementCompoundAssignment, replacementAssignBackToTarget); >- // (s0 *= b, a = s0.x), s0 >- TIntermBinary *replacementSequence = >- new TIntermBinary(EOpComma, replacementSequenceLeft, createTempSymbol(vecType)); >- >- insertStatementInParentBlock(tempAssignmentTargetDeclaration); >- queueReplacement(replacementSequence, OriginalNode::IS_DROPPED); >-} >- >-bool VectorizeVectorScalarArithmeticTraverser::visitAggregate(Visit /*visit*/, >- TIntermAggregate *node) >-{ >- // Transform scalar binary expressions inside vector constructors. >- if (!node->isConstructor() || !node->isVector() || node->getSequence()->size() != 1) >- { >- return true; >- } >- TIntermTyped *argument = node->getSequence()->back()->getAsTyped(); >- ASSERT(argument); >- if (!argument->isScalar() || argument->getBasicType() != EbtFloat) >- { >- return true; >- } >- TIntermBinary *argBinary = argument->getAsBinaryNode(); >- if (!argBinary) >- { >- return true; >- } >- >- // Only specific ops are necessary to change. >- switch (argBinary->getOp()) >- { >- case EOpMul: >- case EOpDiv: >- { >- replaceMathInsideConstructor(node, argBinary); >- mReplaced = true; >- // Don't replace more nodes in the same subtree on this traversal. However, nodes >- // elsewhere in the tree may still be replaced. >- return false; >- } >- case EOpMulAssign: >- case EOpDivAssign: >- { >- // The case where the left side has side effects is too complicated to deal with, so we >- // leave that be. >- if (!argBinary->getLeft()->hasSideEffects()) >- { >- const TIntermBlock *parentBlock = getParentBlock(); >- // We can't do more than one insertion to the same block on the same traversal. >- if (mModifiedBlocks.find(parentBlock) == mModifiedBlocks.end()) >- { >- replaceAssignInsideConstructor(node, argBinary); >- mModifiedBlocks.insert(parentBlock); >- mReplaced = true; >- // Don't replace more nodes in the same subtree on this traversal. >- // However, nodes elsewhere in the tree may still be replaced. >- return false; >- } >- } >- break; >- } >- default: >- return true; >- } >- return true; >-} >- >-} // anonymous namespace >- >-void VectorizeVectorScalarArithmetic(TIntermBlock *root, TSymbolTable *symbolTable) >-{ >- VectorizeVectorScalarArithmeticTraverser traverser(symbolTable); >- do >- { >- traverser.nextIteration(); >- root->traverse(&traverser); >- traverser.updateTree(); >- } while (traverser.didReplaceScalarsWithVectors()); >-} >- >-} // namespace sh >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/VectorizeVectorScalarArithmetic.h b/Source/ThirdParty/ANGLE/src/compiler/translator/VectorizeVectorScalarArithmetic.h >deleted file mode 100644 >index 69f092e039d..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/VectorizeVectorScalarArithmetic.h >+++ /dev/null >@@ -1,25 +0,0 @@ >-// Copyright (c) 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. >-// >-// VectorizeVectorScalarArithmetic.h: Turn some arithmetic operations that operate on a float >-// vector-scalar pair into vector-vector operations. This is done recursively. Some scalar binary >-// operations inside vector constructors are also turned into vector operations. >-// >-// This is targeted to work around a bug in NVIDIA OpenGL drivers that was reproducible on NVIDIA >-// driver version 387.92. It works around the most common occurrences of the bug. >- >-#ifndef COMPILER_TRANSLATOR_VECTORIZEVECTORSCALARARITHMETIC_H_ >-#define COMPILER_TRANSLATOR_VECTORIZEVECTORSCALARARITHMETIC_H_ >- >-namespace sh >-{ >- >-class TIntermBlock; >-class TSymbolTable; >- >-void VectorizeVectorScalarArithmetic(TIntermBlock *root, TSymbolTable *symbolTable); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_VECTORIZEVECTORSCALARARITHMETIC_H_ >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.cpp >index 81688765b84..eb431c3117a 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.cpp >@@ -7,10 +7,16 @@ > #include "compiler/translator/VersionGLSL.h" > > #include "angle_gl.h" >+#include "compiler/translator/Symbol.h" > > namespace sh > { > >+namespace >+{ >+constexpr const ImmutableString kGlPointCoordString("gl_PointCoord"); >+} // anonymous namespace >+ > int ShaderOutputTypeToGLSLVersion(ShShaderOutput output) > { > switch (output) >@@ -76,7 +82,8 @@ TVersionGLSL::TVersionGLSL(sh::GLenum type, const TPragma &pragma, ShShaderOutpu > > void TVersionGLSL::visitSymbol(TIntermSymbol *node) > { >- if (node->getSymbol() == "gl_PointCoord") >+ if (node->variable().symbolType() == SymbolType::BuiltIn && >+ node->getName() == kGlPointCoordString) > { > ensureVersionIsAtLeast(GLSL_VERSION_120); > } >@@ -98,15 +105,16 @@ bool TVersionGLSL::visitInvariantDeclaration(Visit, TIntermInvariantDeclaration > return true; > } > >-bool TVersionGLSL::visitFunctionPrototype(Visit, TIntermFunctionPrototype *node) >+void TVersionGLSL::visitFunctionPrototype(TIntermFunctionPrototype *node) > { >- const TIntermSequence ¶ms = *(node->getSequence()); >- for (TIntermSequence::const_iterator iter = params.begin(); iter != params.end(); ++iter) >+ size_t paramCount = node->getFunction()->getParamCount(); >+ for (size_t i = 0; i < paramCount; ++i) > { >- const TIntermTyped *param = (*iter)->getAsTyped(); >- if (param->isArray()) >+ const TVariable *param = node->getFunction()->getParam(i); >+ const TType &type = param->getType(); >+ if (type.isArray()) > { >- TQualifier qualifier = param->getQualifier(); >+ TQualifier qualifier = type.getQualifier(); > if ((qualifier == EvqOut) || (qualifier == EvqInOut)) > { > ensureVersionIsAtLeast(GLSL_VERSION_120); >@@ -114,8 +122,6 @@ bool TVersionGLSL::visitFunctionPrototype(Visit, TIntermFunctionPrototype *node) > } > } > } >- // Fully processed. No need to visit children. >- return false; > } > > bool TVersionGLSL::visitAggregate(Visit, TIntermAggregate *node) >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.h >index 8b82eb9615a..f05da966f45 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.h >@@ -7,7 +7,7 @@ > #ifndef COMPILER_TRANSLATOR_VERSIONGLSL_H_ > #define COMPILER_TRANSLATOR_VERSIONGLSL_H_ > >-#include "compiler/translator/IntermTraverse.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" > > #include "compiler/translator/Pragma.h" > >@@ -62,7 +62,7 @@ class TVersionGLSL : public TIntermTraverser > void visitSymbol(TIntermSymbol *node) override; > bool visitAggregate(Visit, TIntermAggregate *node) override; > bool visitInvariantDeclaration(Visit, TIntermInvariantDeclaration *node) override; >- bool visitFunctionPrototype(Visit, TIntermFunctionPrototype *node) override; >+ void visitFunctionPrototype(TIntermFunctionPrototype *node) override; > bool visitDeclaration(Visit, TIntermDeclaration *node) override; > > private: >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/WrapSwitchStatementsInBlocks.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/WrapSwitchStatementsInBlocks.cpp >deleted file mode 100644 >index 85a11c998da..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/WrapSwitchStatementsInBlocks.cpp >+++ /dev/null >@@ -1,132 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// WrapSwitchStatementsInBlocks.cpp: Wrap switch statements in blocks and declare all switch-scoped >-// variables there to make the AST compatible with HLSL output. >-// >-// switch (init) >-// { >-// case 0: >-// float f; >-// default: >-// f = 1.0; >-// } >-// >-// becomes >-// >-// { >-// float f; >-// switch (init) >-// { >-// case 0: >-// default: >-// f = 1.0; >-// } >-// } >- >-#include "compiler/translator/WrapSwitchStatementsInBlocks.h" >- >-#include "compiler/translator/IntermNode.h" >-#include "compiler/translator/IntermTraverse.h" >- >-namespace sh >-{ >- >-namespace >-{ >- >-class WrapSwitchStatementsInBlocksTraverser : public TIntermTraverser >-{ >- public: >- WrapSwitchStatementsInBlocksTraverser() : TIntermTraverser(true, false, false), mDidWrap(false) >- { >- } >- >- bool visitSwitch(Visit visit, TIntermSwitch *node) override; >- >- bool didWrap() const { return mDidWrap; } >- >- private: >- bool mDidWrap; >-}; >- >-bool WrapSwitchStatementsInBlocksTraverser::visitSwitch(Visit, TIntermSwitch *node) >-{ >- std::vector<TIntermDeclaration *> declarations; >- TIntermSequence *statementList = node->getStatementList()->getSequence(); >- for (TIntermNode *statement : *statementList) >- { >- TIntermDeclaration *asDeclaration = statement->getAsDeclarationNode(); >- if (asDeclaration) >- { >- declarations.push_back(asDeclaration); >- } >- } >- if (declarations.empty()) >- { >- // We don't need to wrap the switch if it doesn't contain declarations as its direct >- // descendants. >- return true; >- } >- >- TIntermBlock *wrapperBlock = new TIntermBlock(); >- for (TIntermDeclaration *declaration : declarations) >- { >- // SeparateDeclarations should have already been run. >- ASSERT(declaration->getSequence()->size() == 1); >- >- TIntermDeclaration *declarationInBlock = new TIntermDeclaration(); >- TIntermSymbol *declaratorAsSymbol = declaration->getSequence()->at(0)->getAsSymbolNode(); >- if (declaratorAsSymbol) >- { >- // This is a simple declaration like: "float f;" >- // Remove the declaration from inside the switch and put it in the wrapping block. >- TIntermSequence emptyReplacement; >- mMultiReplacements.push_back(NodeReplaceWithMultipleEntry( >- node->getStatementList(), declaration, emptyReplacement)); >- >- declarationInBlock->appendDeclarator(declaratorAsSymbol->deepCopy()); >- } >- else >- { >- // This is an init declaration like: "float f = 0.0;" >- // Change the init declaration inside the switch into an assignment and put a plain >- // declaration in the wrapping block. >- TIntermBinary *declaratorAsBinary = >- declaration->getSequence()->at(0)->getAsBinaryNode(); >- ASSERT(declaratorAsBinary); >- >- TIntermBinary *initAssignment = new TIntermBinary( >- EOpAssign, declaratorAsBinary->getLeft(), declaratorAsBinary->getRight()); >- >- queueReplacementWithParent(node->getStatementList(), declaration, initAssignment, >- OriginalNode::IS_DROPPED); >- >- declarationInBlock->appendDeclarator(declaratorAsBinary->getLeft()->deepCopy()); >- } >- wrapperBlock->appendStatement(declarationInBlock); >- } >- >- wrapperBlock->appendStatement(node); >- queueReplacement(wrapperBlock, OriginalNode::BECOMES_CHILD); >- mDidWrap = true; >- >- // Should be fine to process multiple switch statements, even nesting ones in the same >- // traversal. >- return true; >-} >- >-} // anonymous namespace >- >-// Wrap switch statements in the AST into blocks when needed. >-bool WrapSwitchStatementsInBlocks(TIntermBlock *root) >-{ >- WrapSwitchStatementsInBlocksTraverser traverser; >- root->traverse(&traverser); >- traverser.updateTree(); >- return traverser.didWrap(); >-} >- >-} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/WrapSwitchStatementsInBlocks.h b/Source/ThirdParty/ANGLE/src/compiler/translator/WrapSwitchStatementsInBlocks.h >deleted file mode 100644 >index bc0179926d1..00000000000 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/WrapSwitchStatementsInBlocks.h >+++ /dev/null >@@ -1,22 +0,0 @@ >-// >-// Copyright (c) 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. >-// >-// WrapSwitchStatementsInBlocks.h: Wrap switch statements in blocks and declare all switch-scoped >-// variables there to make the AST compatible with HLSL output. >- >-#ifndef COMPILER_TRANSLATOR_WRAPSWITCHSTATEMENTSINBLOCKS_H_ >-#define COMPILER_TRANSLATOR_WRAPSWITCHSTATEMENTSINBLOCKS_H_ >- >-namespace sh >-{ >- >-class TIntermBlock; >- >-// Wrap switch statements in the AST into blocks when needed. Returns true if the AST was changed. >-bool WrapSwitchStatementsInBlocks(TIntermBlock *root); >- >-} // namespace sh >- >-#endif // COMPILER_TRANSLATOR_WRAPSWITCHSTATEMENTSINBLOCKS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.cpp >index fd8c450c206..7d0609ec823 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.cpp >@@ -11,94 +11,164 @@ > > #include "common/mathutil.h" > #include "common/utilities.h" >+#include "compiler/translator/Common.h" > > namespace sh > { > > namespace > { >-bool IsRowMajorLayout(const InterfaceBlockField &var) >+class BlockLayoutMapVisitor : public BlockEncoderVisitor > { >- return var.isRowMajorLayout; >-} >+ public: >+ BlockLayoutMapVisitor(BlockLayoutMap *blockInfoOut, >+ const std::string &instanceName, >+ BlockLayoutEncoder *encoder) >+ : BlockEncoderVisitor(instanceName, instanceName, encoder), mInfoOut(blockInfoOut) >+ {} >+ >+ void encodeVariable(const ShaderVariable &variable, >+ const BlockMemberInfo &variableInfo, >+ const std::string &name, >+ const std::string &mappedName) override >+ { >+ ASSERT(!gl::IsSamplerType(variable.type)); >+ (*mInfoOut)[name] = variableInfo; >+ } > >-bool IsRowMajorLayout(const ShaderVariable &var) >+ private: >+ BlockLayoutMap *mInfoOut; >+}; >+ >+template <typename VarT> >+void GetInterfaceBlockInfo(const std::vector<VarT> &fields, >+ const std::string &prefix, >+ BlockLayoutEncoder *encoder, >+ bool inRowMajorLayout, >+ BlockLayoutMap *blockInfoOut) > { >- return false; >+ BlockLayoutMapVisitor visitor(blockInfoOut, prefix, encoder); >+ TraverseShaderVariables(fields, inRowMajorLayout, &visitor); > } > >-template <typename VarT> >-void GetUniformBlockStructMemberInfo(const std::vector<VarT> &fields, >- const std::string &fieldName, >- sh::BlockLayoutEncoder *encoder, >- bool inRowMajorLayout, >- BlockLayoutMap *blockInfoOut) >+void TraverseStructVariable(const ShaderVariable &variable, >+ bool isRowMajorLayout, >+ ShaderVariableVisitor *visitor) > { >- encoder->enterAggregateType(); >- GetUniformBlockInfo(fields, fieldName, encoder, inRowMajorLayout, blockInfoOut); >- encoder->exitAggregateType(); >+ const std::vector<ShaderVariable> &fields = variable.fields; >+ >+ visitor->enterStructAccess(variable, isRowMajorLayout); >+ TraverseShaderVariables(fields, isRowMajorLayout, visitor); >+ visitor->exitStructAccess(variable, isRowMajorLayout); > } > >-template <typename VarT> >-void GetUniformBlockStructArrayMemberInfo(const VarT &field, >- unsigned int arrayNestingIndex, >- const std::string &arrayName, >- sh::BlockLayoutEncoder *encoder, >- bool inRowMajorLayout, >- BlockLayoutMap *blockInfoOut) >+void TraverseStructArrayVariable(const ShaderVariable &variable, >+ bool inRowMajorLayout, >+ ShaderVariableVisitor *visitor) > { >+ visitor->enterArray(variable); >+ > // Nested arrays are processed starting from outermost (arrayNestingIndex 0u) and ending at the >- // innermost. >- const unsigned int currentArraySize = field.getNestedArraySize(arrayNestingIndex); >- for (unsigned int arrayElement = 0u; arrayElement < currentArraySize; ++arrayElement) >+ // innermost. We make a special case for unsized arrays. >+ const unsigned int currentArraySize = variable.getNestedArraySize(0); >+ unsigned int count = std::max(currentArraySize, 1u); >+ for (unsigned int arrayElement = 0u; arrayElement < count; ++arrayElement) > { >- const std::string elementName = arrayName + ArrayString(arrayElement); >- if (arrayNestingIndex + 1u < field.arraySizes.size()) >+ visitor->enterArrayElement(variable, arrayElement); >+ ShaderVariable elementVar = variable; >+ elementVar.indexIntoArray(arrayElement); >+ >+ if (variable.arraySizes.size() > 1u) > { >- GetUniformBlockStructArrayMemberInfo(field, arrayNestingIndex + 1u, elementName, >- encoder, inRowMajorLayout, blockInfoOut); >+ TraverseStructArrayVariable(elementVar, inRowMajorLayout, visitor); > } > else > { >- GetUniformBlockStructMemberInfo(field.fields, elementName, encoder, inRowMajorLayout, >- blockInfoOut); >+ TraverseStructVariable(elementVar, inRowMajorLayout, visitor); > } >+ >+ visitor->exitArrayElement(variable, arrayElement); > } >+ >+ visitor->exitArray(variable); > } > >-template <typename VarT> >-void GetUniformBlockArrayOfArraysMemberInfo(const VarT &field, >- unsigned int arrayNestingIndex, >- const std::string &arrayName, >- sh::BlockLayoutEncoder *encoder, >- bool inRowMajorLayout, >- BlockLayoutMap *blockInfoOut) >-{ >- const unsigned int currentArraySize = field.getNestedArraySize(arrayNestingIndex); >- for (unsigned int arrayElement = 0u; arrayElement < currentArraySize; ++arrayElement) >+void TraverseArrayOfArraysVariable(const ShaderVariable &variable, >+ unsigned int arrayNestingIndex, >+ bool isRowMajorMatrix, >+ ShaderVariableVisitor *visitor) >+{ >+ visitor->enterArray(variable); >+ >+ const unsigned int currentArraySize = variable.getNestedArraySize(arrayNestingIndex); >+ unsigned int count = std::max(currentArraySize, 1u); >+ for (unsigned int arrayElement = 0u; arrayElement < count; ++arrayElement) > { >- const std::string elementName = arrayName + ArrayString(arrayElement); >- if (arrayNestingIndex + 2u < field.arraySizes.size()) >+ visitor->enterArrayElement(variable, arrayElement); >+ >+ ShaderVariable elementVar = variable; >+ elementVar.indexIntoArray(arrayElement); >+ >+ if (arrayNestingIndex + 2u < variable.arraySizes.size()) > { >- GetUniformBlockArrayOfArraysMemberInfo(field, arrayNestingIndex + 1u, elementName, >- encoder, inRowMajorLayout, blockInfoOut); >+ TraverseArrayOfArraysVariable(elementVar, arrayNestingIndex, isRowMajorMatrix, visitor); > } > else > { >- std::vector<unsigned int> innermostArraySize( >- 1u, field.getNestedArraySize(arrayNestingIndex + 1u)); >- (*blockInfoOut)[elementName] = >- encoder->encodeType(field.type, innermostArraySize, inRowMajorLayout); >+ if (gl::IsSamplerType(variable.type)) >+ { >+ visitor->visitSampler(elementVar); >+ } >+ else >+ { >+ visitor->visitVariable(elementVar, isRowMajorMatrix); >+ } > } >+ >+ visitor->exitArrayElement(variable, arrayElement); > } >+ >+ visitor->exitArray(variable); > } > >-} // anonymous namespace >+std::string CollapseNameStack(const std::vector<std::string> &nameStack) >+{ >+ std::stringstream strstr = sh::InitializeStream<std::stringstream>(); >+ for (const std::string &part : nameStack) >+ { >+ strstr << part; >+ } >+ return strstr.str(); >+} > >-BlockLayoutEncoder::BlockLayoutEncoder() : mCurrentOffset(0) >+size_t GetStd430BaseAlignment(GLenum variableType, bool isRowMajor) > { >+ GLenum flippedType = isRowMajor ? variableType : gl::TransposeMatrixType(variableType); >+ size_t numComponents = static_cast<size_t>(gl::VariableColumnCount(flippedType)); >+ return ComponentAlignment(numComponents); > } > >+class BaseAlignmentVisitor : public ShaderVariableVisitor >+{ >+ public: >+ BaseAlignmentVisitor() = default; >+ void visitVariable(const ShaderVariable &variable, bool isRowMajor) override >+ { >+ size_t baseAlignment = GetStd430BaseAlignment(variable.type, isRowMajor); >+ mCurrentAlignment = std::max(mCurrentAlignment, baseAlignment); >+ } >+ >+ // This is in components rather than bytes. >+ size_t getBaseAlignment() const { return mCurrentAlignment; } >+ >+ private: >+ size_t mCurrentAlignment = 0; >+}; >+} // anonymous namespace >+ >+// BlockLayoutEncoder implementation. >+BlockLayoutEncoder::BlockLayoutEncoder() : mCurrentOffset(0) {} >+ > BlockMemberInfo BlockLayoutEncoder::encodeType(GLenum type, > const std::vector<unsigned int> &arraySizes, > bool isRowMajorMatrix) >@@ -108,9 +178,9 @@ BlockMemberInfo BlockLayoutEncoder::encodeType(GLenum type, > > getBlockLayoutInfo(type, arraySizes, isRowMajorMatrix, &arrayStride, &matrixStride); > >- const BlockMemberInfo memberInfo(static_cast<int>(mCurrentOffset * BytesPerComponent), >- static_cast<int>(arrayStride * BytesPerComponent), >- static_cast<int>(matrixStride * BytesPerComponent), >+ const BlockMemberInfo memberInfo(static_cast<int>(mCurrentOffset * kBytesPerComponent), >+ static_cast<int>(arrayStride * kBytesPerComponent), >+ static_cast<int>(matrixStride * kBytesPerComponent), > isRowMajorMatrix); > > advanceOffset(type, arraySizes, isRowMajorMatrix, arrayStride, matrixStride); >@@ -118,35 +188,58 @@ BlockMemberInfo BlockLayoutEncoder::encodeType(GLenum type, > return memberInfo; > } > >+size_t BlockLayoutEncoder::getShaderVariableSize(const ShaderVariable &structVar, bool isRowMajor) >+{ >+ size_t currentOffset = mCurrentOffset; >+ mCurrentOffset = 0; >+ BlockEncoderVisitor visitor("", "", this); >+ enterAggregateType(structVar); >+ TraverseShaderVariables(structVar.fields, isRowMajor, &visitor); >+ exitAggregateType(structVar); >+ size_t structVarSize = getCurrentOffset(); >+ mCurrentOffset = currentOffset; >+ return structVarSize; >+} >+ > // static >-size_t BlockLayoutEncoder::getBlockRegister(const BlockMemberInfo &info) >+size_t BlockLayoutEncoder::GetBlockRegister(const BlockMemberInfo &info) > { >- return (info.offset / BytesPerComponent) / ComponentsPerRegister; >+ return (info.offset / kBytesPerComponent) / kComponentsPerRegister; > } > > // static >-size_t BlockLayoutEncoder::getBlockRegisterElement(const BlockMemberInfo &info) >+size_t BlockLayoutEncoder::GetBlockRegisterElement(const BlockMemberInfo &info) > { >- return (info.offset / BytesPerComponent) % ComponentsPerRegister; >+ return (info.offset / kBytesPerComponent) % kComponentsPerRegister; > } > >-void BlockLayoutEncoder::nextRegister() >+void BlockLayoutEncoder::align(size_t baseAlignment) > { >- mCurrentOffset = rx::roundUp<size_t>(mCurrentOffset, ComponentsPerRegister); >+ mCurrentOffset = rx::roundUp<size_t>(mCurrentOffset, baseAlignment); > } > >-Std140BlockEncoder::Std140BlockEncoder() >+// DummyBlockEncoder implementation. >+void DummyBlockEncoder::getBlockLayoutInfo(GLenum type, >+ const std::vector<unsigned int> &arraySizes, >+ bool isRowMajorMatrix, >+ int *arrayStrideOut, >+ int *matrixStrideOut) > { >+ *arrayStrideOut = 0; >+ *matrixStrideOut = 0; > } > >-void Std140BlockEncoder::enterAggregateType() >+// Std140BlockEncoder implementation. >+Std140BlockEncoder::Std140BlockEncoder() {} >+ >+void Std140BlockEncoder::enterAggregateType(const ShaderVariable &structVar) > { >- nextRegister(); >+ align(getBaseAlignment(structVar)); > } > >-void Std140BlockEncoder::exitAggregateType() >+void Std140BlockEncoder::exitAggregateType(const ShaderVariable &structVar) > { >- nextRegister(); >+ align(getBaseAlignment(structVar)); > } > > void Std140BlockEncoder::getBlockLayoutInfo(GLenum type, >@@ -156,7 +249,7 @@ void Std140BlockEncoder::getBlockLayoutInfo(GLenum type, > int *matrixStrideOut) > { > // We assume we are only dealing with 4 byte components (no doubles or half-words currently) >- ASSERT(gl::VariableComponentSize(gl::VariableComponentType(type)) == BytesPerComponent); >+ ASSERT(gl::VariableComponentSize(gl::VariableComponentType(type)) == kBytesPerComponent); > > size_t baseAlignment = 0; > int matrixStride = 0; >@@ -164,24 +257,24 @@ void Std140BlockEncoder::getBlockLayoutInfo(GLenum type, > > if (gl::IsMatrixType(type)) > { >- baseAlignment = ComponentsPerRegister; >- matrixStride = ComponentsPerRegister; >+ baseAlignment = getTypeBaseAlignment(type, isRowMajorMatrix); >+ matrixStride = getTypeBaseAlignment(type, isRowMajorMatrix); > > if (!arraySizes.empty()) > { > const int numRegisters = gl::MatrixRegisterCount(type, isRowMajorMatrix); >- arrayStride = ComponentsPerRegister * numRegisters; >+ arrayStride = getTypeBaseAlignment(type, isRowMajorMatrix) * numRegisters; > } > } > else if (!arraySizes.empty()) > { >- baseAlignment = ComponentsPerRegister; >- arrayStride = ComponentsPerRegister; >+ baseAlignment = getTypeBaseAlignment(type, false); >+ arrayStride = getTypeBaseAlignment(type, false); > } > else > { >- const int numComponents = gl::VariableComponentCount(type); >- baseAlignment = (numComponents == 3 ? 4u : static_cast<size_t>(numComponents)); >+ const size_t numComponents = static_cast<size_t>(gl::VariableComponentCount(type)); >+ baseAlignment = ComponentAlignment(numComponents); > } > > mCurrentOffset = rx::roundUp(mCurrentOffset, baseAlignment); >@@ -202,9 +295,8 @@ void Std140BlockEncoder::advanceOffset(GLenum type, > } > else if (gl::IsMatrixType(type)) > { >- ASSERT(matrixStride == ComponentsPerRegister); > const int numRegisters = gl::MatrixRegisterCount(type, isRowMajorMatrix); >- mCurrentOffset += ComponentsPerRegister * numRegisters; >+ mCurrentOffset += matrixStride * numRegisters; > } > else > { >@@ -212,70 +304,303 @@ void Std140BlockEncoder::advanceOffset(GLenum type, > } > } > >-template <typename VarT> >-void GetUniformBlockInfo(const std::vector<VarT> &fields, >+size_t Std140BlockEncoder::getBaseAlignment(const ShaderVariable &variable) const >+{ >+ return kComponentsPerRegister; >+} >+ >+size_t Std140BlockEncoder::getTypeBaseAlignment(GLenum type, bool isRowMajorMatrix) const >+{ >+ return kComponentsPerRegister; >+} >+ >+// Std430BlockEncoder implementation. >+Std430BlockEncoder::Std430BlockEncoder() {} >+ >+size_t Std430BlockEncoder::getBaseAlignment(const ShaderVariable &shaderVar) const >+{ >+ if (shaderVar.isStruct()) >+ { >+ BaseAlignmentVisitor visitor; >+ TraverseShaderVariables(shaderVar.fields, false, &visitor); >+ return visitor.getBaseAlignment(); >+ } >+ >+ return GetStd430BaseAlignment(shaderVar.type, shaderVar.isRowMajorLayout); >+} >+ >+size_t Std430BlockEncoder::getTypeBaseAlignment(GLenum type, bool isRowMajorMatrix) const >+{ >+ return GetStd430BaseAlignment(type, isRowMajorMatrix); >+} >+ >+void GetInterfaceBlockInfo(const std::vector<InterfaceBlockField> &fields, >+ const std::string &prefix, >+ BlockLayoutEncoder *encoder, >+ BlockLayoutMap *blockInfoOut) >+{ >+ // Matrix packing is always recorded in individual fields, so they'll set the row major layout >+ // flag to true if needed. >+ GetInterfaceBlockInfo(fields, prefix, encoder, false, blockInfoOut); >+} >+ >+void GetUniformBlockInfo(const std::vector<Uniform> &uniforms, > const std::string &prefix, >- sh::BlockLayoutEncoder *encoder, >- bool inRowMajorLayout, >+ BlockLayoutEncoder *encoder, > BlockLayoutMap *blockInfoOut) > { >- for (const VarT &field : fields) >+ // Matrix packing is always recorded in individual fields, so they'll set the row major layout >+ // flag to true if needed. >+ GetInterfaceBlockInfo(uniforms, prefix, encoder, false, blockInfoOut); >+} >+ >+// VariableNameVisitor implementation. >+VariableNameVisitor::VariableNameVisitor(const std::string &namePrefix, >+ const std::string &mappedNamePrefix) >+{ >+ if (!namePrefix.empty()) > { >- // Skip samplers. On Vulkan we use this for the default uniform block, so samplers may be >- // included. >- if (gl::IsSamplerType(field.type)) >- { >- continue; >- } >+ mNameStack.push_back(namePrefix + "."); >+ } > >- const std::string &fieldName = (prefix.empty() ? field.name : prefix + "." + field.name); >+ if (!mappedNamePrefix.empty()) >+ { >+ mMappedNameStack.push_back(mappedNamePrefix + "."); >+ } >+} > >- if (field.isStruct()) >- { >- bool rowMajorLayout = (inRowMajorLayout || IsRowMajorLayout(field)); >+VariableNameVisitor::~VariableNameVisitor() = default; > >- if (field.isArray()) >- { >- GetUniformBlockStructArrayMemberInfo(field, 0u, fieldName, encoder, rowMajorLayout, >- blockInfoOut); >- } >- else >- { >- GetUniformBlockStructMemberInfo(field.fields, fieldName, encoder, rowMajorLayout, >- blockInfoOut); >- } >- } >- else if (field.isArrayOfArrays()) >+void VariableNameVisitor::enterStruct(const ShaderVariable &structVar) >+{ >+ mNameStack.push_back(structVar.name); >+ mMappedNameStack.push_back(structVar.mappedName); >+} >+ >+void VariableNameVisitor::exitStruct(const ShaderVariable &structVar) >+{ >+ mNameStack.pop_back(); >+ mMappedNameStack.pop_back(); >+} >+ >+void VariableNameVisitor::enterStructAccess(const ShaderVariable &structVar, bool isRowMajor) >+{ >+ mNameStack.push_back("."); >+ mMappedNameStack.push_back("."); >+} >+ >+void VariableNameVisitor::exitStructAccess(const ShaderVariable &structVar, bool isRowMajor) >+{ >+ mNameStack.pop_back(); >+ mMappedNameStack.pop_back(); >+} >+ >+void VariableNameVisitor::enterArray(const ShaderVariable &arrayVar) >+{ >+ if (!arrayVar.hasParentArrayIndex() && !arrayVar.isStruct()) >+ { >+ mNameStack.push_back(arrayVar.name); >+ mMappedNameStack.push_back(arrayVar.mappedName); >+ } >+} >+ >+void VariableNameVisitor::exitArray(const ShaderVariable &arrayVar) >+{ >+ if (!arrayVar.hasParentArrayIndex() && !arrayVar.isStruct()) >+ { >+ mNameStack.pop_back(); >+ mMappedNameStack.pop_back(); >+ } >+} >+ >+void VariableNameVisitor::enterArrayElement(const ShaderVariable &arrayVar, >+ unsigned int arrayElement) >+{ >+ std::stringstream strstr = sh::InitializeStream<std::stringstream>(); >+ strstr << "[" << arrayElement << "]"; >+ std::string elementString = strstr.str(); >+ mNameStack.push_back(elementString); >+ mMappedNameStack.push_back(elementString); >+} >+ >+void VariableNameVisitor::exitArrayElement(const ShaderVariable &arrayVar, >+ unsigned int arrayElement) >+{ >+ mNameStack.pop_back(); >+ mMappedNameStack.pop_back(); >+} >+ >+std::string VariableNameVisitor::collapseNameStack() const >+{ >+ return CollapseNameStack(mNameStack); >+} >+ >+std::string VariableNameVisitor::collapseMappedNameStack() const >+{ >+ return CollapseNameStack(mMappedNameStack); >+} >+ >+void VariableNameVisitor::visitSampler(const sh::ShaderVariable &sampler) >+{ >+ if (!sampler.hasParentArrayIndex()) >+ { >+ mNameStack.push_back(sampler.name); >+ mMappedNameStack.push_back(sampler.mappedName); >+ } >+ >+ std::string name = collapseNameStack(); >+ std::string mappedName = collapseMappedNameStack(); >+ >+ if (!sampler.hasParentArrayIndex()) >+ { >+ mNameStack.pop_back(); >+ mMappedNameStack.pop_back(); >+ } >+ >+ visitNamedSampler(sampler, name, mappedName); >+} >+ >+void VariableNameVisitor::visitVariable(const ShaderVariable &variable, bool isRowMajor) >+{ >+ if (!variable.hasParentArrayIndex()) >+ { >+ mNameStack.push_back(variable.name); >+ mMappedNameStack.push_back(variable.mappedName); >+ } >+ >+ std::string name = collapseNameStack(); >+ std::string mappedName = collapseMappedNameStack(); >+ >+ if (!variable.hasParentArrayIndex()) >+ { >+ mNameStack.pop_back(); >+ mMappedNameStack.pop_back(); >+ } >+ >+ visitNamedVariable(variable, isRowMajor, name, mappedName); >+} >+ >+// BlockEncoderVisitor implementation. >+BlockEncoderVisitor::BlockEncoderVisitor(const std::string &namePrefix, >+ const std::string &mappedNamePrefix, >+ BlockLayoutEncoder *encoder) >+ : VariableNameVisitor(namePrefix, mappedNamePrefix), mEncoder(encoder) >+{} >+ >+BlockEncoderVisitor::~BlockEncoderVisitor() = default; >+ >+void BlockEncoderVisitor::enterStructAccess(const ShaderVariable &structVar, bool isRowMajor) >+{ >+ mStructStackSize++; >+ if (!mIsTopLevelArrayStrideReady) >+ { >+ size_t structSize = mEncoder->getShaderVariableSize(structVar, isRowMajor); >+ mTopLevelArrayStride *= structSize; >+ mIsTopLevelArrayStrideReady = true; >+ } >+ >+ VariableNameVisitor::enterStructAccess(structVar, isRowMajor); >+ mEncoder->enterAggregateType(structVar); >+} >+ >+void BlockEncoderVisitor::exitStructAccess(const ShaderVariable &structVar, bool isRowMajor) >+{ >+ mStructStackSize--; >+ mEncoder->exitAggregateType(structVar); >+ VariableNameVisitor::exitStructAccess(structVar, isRowMajor); >+} >+ >+void BlockEncoderVisitor::enterArrayElement(const sh::ShaderVariable &arrayVar, >+ unsigned int arrayElement) >+{ >+ if (mStructStackSize == 0 && !arrayVar.hasParentArrayIndex()) >+ { >+ // From the ES 3.1 spec "7.3.1.1 Naming Active Resources": >+ // For an active shader storage block member declared as an array of an aggregate type, >+ // an entry will be generated only for the first array element, regardless of its type. >+ // Such block members are referred to as top-level arrays. If the block member is an >+ // aggregate type, the enumeration rules are then applied recursively. >+ if (arrayElement == 0) > { >- bool isRowMajorMatrix = (gl::IsMatrixType(field.type) && inRowMajorLayout); >- GetUniformBlockArrayOfArraysMemberInfo(field, 0u, fieldName, encoder, isRowMajorMatrix, >- blockInfoOut); >+ mTopLevelArraySize = arrayVar.getOutermostArraySize(); >+ mTopLevelArrayStride = arrayVar.getInnerArraySizeProduct(); >+ mIsTopLevelArrayStrideReady = false; > } > else > { >- bool isRowMajorMatrix = (gl::IsMatrixType(field.type) && inRowMajorLayout); >- (*blockInfoOut)[fieldName] = >- encoder->encodeType(field.type, field.arraySizes, isRowMajorMatrix); >+ mSkipEnabled = true; > } > } >+ VariableNameVisitor::enterArrayElement(arrayVar, arrayElement); >+} >+ >+void BlockEncoderVisitor::exitArrayElement(const sh::ShaderVariable &arrayVar, >+ unsigned int arrayElement) >+{ >+ if (mStructStackSize == 0 && !arrayVar.hasParentArrayIndex()) >+ { >+ mTopLevelArraySize = 1; >+ mTopLevelArrayStride = 0; >+ mIsTopLevelArrayStrideReady = true; >+ mSkipEnabled = false; >+ } >+ VariableNameVisitor::exitArrayElement(arrayVar, arrayElement); > } > >-template void GetUniformBlockInfo(const std::vector<InterfaceBlockField> &, >- const std::string &, >- sh::BlockLayoutEncoder *, >- bool, >- BlockLayoutMap *); >+void BlockEncoderVisitor::visitNamedVariable(const ShaderVariable &variable, >+ bool isRowMajor, >+ const std::string &name, >+ const std::string &mappedName) >+{ >+ std::vector<unsigned int> innermostArraySize; > >-template void GetUniformBlockInfo(const std::vector<Uniform> &, >- const std::string &, >- sh::BlockLayoutEncoder *, >- bool, >- BlockLayoutMap *); >+ if (variable.isArray()) >+ { >+ innermostArraySize.push_back(variable.getNestedArraySize(0)); >+ } >+ BlockMemberInfo variableInfo = >+ mEncoder->encodeType(variable.type, innermostArraySize, isRowMajor); >+ if (!mIsTopLevelArrayStrideReady) >+ { >+ ASSERT(mTopLevelArrayStride); >+ mTopLevelArrayStride *= variableInfo.arrayStride; >+ mIsTopLevelArrayStrideReady = true; >+ } >+ variableInfo.topLevelArrayStride = mTopLevelArrayStride; >+ encodeVariable(variable, variableInfo, name, mappedName); >+} > >-template void GetUniformBlockInfo(const std::vector<ShaderVariable> &, >- const std::string &, >- sh::BlockLayoutEncoder *, >- bool, >- BlockLayoutMap *); >+void TraverseShaderVariable(const ShaderVariable &variable, >+ bool isRowMajorLayout, >+ ShaderVariableVisitor *visitor) >+{ >+ bool rowMajorLayout = (isRowMajorLayout || variable.isRowMajorLayout); >+ bool isRowMajor = rowMajorLayout && gl::IsMatrixType(variable.type); > >+ if (variable.isStruct()) >+ { >+ visitor->enterStruct(variable); >+ if (variable.isArray()) >+ { >+ TraverseStructArrayVariable(variable, rowMajorLayout, visitor); >+ } >+ else >+ { >+ TraverseStructVariable(variable, rowMajorLayout, visitor); >+ } >+ visitor->exitStruct(variable); >+ } >+ else if (variable.isArrayOfArrays()) >+ { >+ TraverseArrayOfArraysVariable(variable, 0u, isRowMajor, visitor); >+ } >+ else if (gl::IsSamplerType(variable.type)) >+ { >+ visitor->visitSampler(variable); >+ } >+ else >+ { >+ visitor->visitVariable(variable, isRowMajor); >+ } >+} > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.h b/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.h >index 2b7acf4e60f..30d5d1c3a5e 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.h >@@ -14,8 +14,8 @@ > #include <map> > #include <vector> > >-#include "angle_gl.h" > #include <GLSLANG/ShaderLang.h> >+#include "angle_gl.h" > > namespace sh > { >@@ -27,46 +27,52 @@ struct InterfaceBlock; > > struct BlockMemberInfo > { >- BlockMemberInfo() >- : offset(-1), >- arrayStride(-1), >- matrixStride(-1), >- isRowMajorMatrix(false), >- topLevelArrayStride(-1) >- { >- } >+ constexpr BlockMemberInfo() = default; > >- BlockMemberInfo(int offset, int arrayStride, int matrixStride, bool isRowMajorMatrix) >+ constexpr BlockMemberInfo(int offset, int arrayStride, int matrixStride, bool isRowMajorMatrix) > : offset(offset), > arrayStride(arrayStride), > matrixStride(matrixStride), >- isRowMajorMatrix(isRowMajorMatrix), >- topLevelArrayStride(-1) >- { >- } >+ isRowMajorMatrix(isRowMajorMatrix) >+ {} > >- BlockMemberInfo(int offset, >- int arrayStride, >- int matrixStride, >- bool isRowMajorMatrix, >- int topLevelArrayStride) >+ constexpr BlockMemberInfo(int offset, >+ int arrayStride, >+ int matrixStride, >+ bool isRowMajorMatrix, >+ int topLevelArrayStride) > : offset(offset), > arrayStride(arrayStride), > matrixStride(matrixStride), > isRowMajorMatrix(isRowMajorMatrix), > topLevelArrayStride(topLevelArrayStride) >- { >- } >+ {} >+ >+ // A single integer identifying the offset of an active variable. >+ int offset = -1; > >- static BlockMemberInfo getDefaultBlockInfo() { return BlockMemberInfo(-1, -1, -1, false, -1); } >+ // A single integer identifying the stride between array elements in an active variable. >+ int arrayStride = -1; > >- int offset; >- int arrayStride; >- int matrixStride; >- bool isRowMajorMatrix; >- int topLevelArrayStride; // Only used for shader storage block members. >+ // A single integer identifying the stride between columns of a column-major matrix or rows of a >+ // row-major matrix. >+ int matrixStride = -1; >+ >+ // A single integer identifying whether an active variable is a row-major matrix. >+ bool isRowMajorMatrix = false; >+ >+ // A single integer identifying the number of active array elements of the top-level shader >+ // storage block member containing the active variable. >+ int topLevelArrayStride = -1; > }; > >+constexpr size_t ComponentAlignment(size_t numComponents) >+{ >+ return (numComponents == 3u ? 4u : numComponents); >+} >+ >+constexpr BlockMemberInfo kDefaultBlockMemberInfo; >+ > class BlockLayoutEncoder > { > public: >@@ -77,21 +83,21 @@ class BlockLayoutEncoder > const std::vector<unsigned int> &arraySizes, > bool isRowMajorMatrix); > >- size_t getBlockSize() const { return mCurrentOffset * BytesPerComponent; } >+ size_t getCurrentOffset() const { return mCurrentOffset * kBytesPerComponent; } >+ size_t getShaderVariableSize(const ShaderVariable &structVar, bool isRowMajor); > >- virtual void enterAggregateType() = 0; >- virtual void exitAggregateType() = 0; >+ // Called when entering/exiting a structure variable. >+ virtual void enterAggregateType(const ShaderVariable &structVar) = 0; >+ virtual void exitAggregateType(const ShaderVariable &structVar) = 0; > >- static const size_t BytesPerComponent = 4u; >- static const unsigned int ComponentsPerRegister = 4u; >+ static constexpr size_t kBytesPerComponent = 4u; >+ static constexpr unsigned int kComponentsPerRegister = 4u; > >- static size_t getBlockRegister(const BlockMemberInfo &info); >- static size_t getBlockRegisterElement(const BlockMemberInfo &info); >+ static size_t GetBlockRegister(const BlockMemberInfo &info); >+ static size_t GetBlockRegisterElement(const BlockMemberInfo &info); > > protected: >- size_t mCurrentOffset; >- >- void nextRegister(); >+ void align(size_t baseAlignment); > > virtual void getBlockLayoutInfo(GLenum type, > const std::vector<unsigned int> &arraySizes, >@@ -103,6 +109,32 @@ class BlockLayoutEncoder > bool isRowMajorMatrix, > int arrayStride, > int matrixStride) = 0; >+ >+ size_t mCurrentOffset; >+}; >+ >+// Will return default values for everything. >+class DummyBlockEncoder : public BlockLayoutEncoder >+{ >+ public: >+ DummyBlockEncoder() = default; >+ >+ void enterAggregateType(const ShaderVariable &structVar) override {} >+ void exitAggregateType(const ShaderVariable &structVar) override {} >+ >+ protected: >+ void getBlockLayoutInfo(GLenum type, >+ const std::vector<unsigned int> &arraySizes, >+ bool isRowMajorMatrix, >+ int *arrayStrideOut, >+ int *matrixStrideOut) override; >+ >+ void advanceOffset(GLenum type, >+ const std::vector<unsigned int> &arraySizes, >+ bool isRowMajorMatrix, >+ int arrayStride, >+ int matrixStride) override >+ {} > }; > > // Block layout according to the std140 block layout >@@ -113,8 +145,8 @@ class Std140BlockEncoder : public BlockLayoutEncoder > public: > Std140BlockEncoder(); > >- void enterAggregateType() override; >- void exitAggregateType() override; >+ void enterAggregateType(const ShaderVariable &structVar) override; >+ void exitAggregateType(const ShaderVariable &structVar) override; > > protected: > void getBlockLayoutInfo(GLenum type, >@@ -127,18 +159,144 @@ class Std140BlockEncoder : public BlockLayoutEncoder > bool isRowMajorMatrix, > int arrayStride, > int matrixStride) override; >+ >+ virtual size_t getBaseAlignment(const ShaderVariable &variable) const; >+ virtual size_t getTypeBaseAlignment(GLenum type, bool isRowMajorMatrix) const; >+}; >+ >+class Std430BlockEncoder : public Std140BlockEncoder >+{ >+ public: >+ Std430BlockEncoder(); >+ >+ protected: >+ size_t getBaseAlignment(const ShaderVariable &variable) const override; >+ size_t getTypeBaseAlignment(GLenum type, bool isRowMajorMatrix) const override; > }; > > using BlockLayoutMap = std::map<std::string, BlockMemberInfo>; > >-// Only valid to call with ShaderVariable, InterfaceBlockField and Uniform. >-template <typename VarT> >-void GetUniformBlockInfo(const std::vector<VarT> &fields, >+void GetInterfaceBlockInfo(const std::vector<InterfaceBlockField> &fields, >+ const std::string &prefix, >+ BlockLayoutEncoder *encoder, >+ BlockLayoutMap *blockInfoOut); >+ >+// Used for laying out the default uniform block on the Vulkan backend. >+void GetUniformBlockInfo(const std::vector<Uniform> &uniforms, > const std::string &prefix, >- sh::BlockLayoutEncoder *encoder, >- bool inRowMajorLayout, >- BlockLayoutMap *blockLayoutMap); >+ BlockLayoutEncoder *encoder, >+ BlockLayoutMap *blockInfoOut); >+ >+class ShaderVariableVisitor >+{ >+ public: >+ virtual ~ShaderVariableVisitor() {} >+ >+ virtual void enterStruct(const ShaderVariable &structVar) {} >+ virtual void exitStruct(const ShaderVariable &structVar) {} >+ >+ virtual void enterStructAccess(const ShaderVariable &structVar, bool isRowMajor) {} >+ virtual void exitStructAccess(const ShaderVariable &structVar, bool isRowMajor) {} >+ >+ virtual void enterArray(const ShaderVariable &arrayVar) {} >+ virtual void exitArray(const ShaderVariable &arrayVar) {} >+ >+ virtual void enterArrayElement(const ShaderVariable &arrayVar, unsigned int arrayElement) {} >+ virtual void exitArrayElement(const ShaderVariable &arrayVar, unsigned int arrayElement) {} >+ >+ virtual void visitSampler(const sh::ShaderVariable &sampler) {} >+ >+ virtual void visitVariable(const ShaderVariable &variable, bool isRowMajor) = 0; >+ >+ protected: >+ ShaderVariableVisitor() {} >+}; >+ >+class VariableNameVisitor : public ShaderVariableVisitor >+{ >+ public: >+ VariableNameVisitor(const std::string &namePrefix, const std::string &mappedNamePrefix); >+ ~VariableNameVisitor() override; >+ >+ void enterStruct(const ShaderVariable &structVar) override; >+ void exitStruct(const ShaderVariable &structVar) override; >+ void enterStructAccess(const ShaderVariable &structVar, bool isRowMajor) override; >+ void exitStructAccess(const ShaderVariable &structVar, bool isRowMajor) override; >+ void enterArray(const ShaderVariable &arrayVar) override; >+ void exitArray(const ShaderVariable &arrayVar) override; >+ void enterArrayElement(const ShaderVariable &arrayVar, unsigned int arrayElement) override; >+ void exitArrayElement(const ShaderVariable &arrayVar, unsigned int arrayElement) override; > >+ protected: >+ virtual void visitNamedSampler(const sh::ShaderVariable &sampler, >+ const std::string &name, >+ const std::string &mappedName) >+ {} >+ virtual void visitNamedVariable(const ShaderVariable &variable, >+ bool isRowMajor, >+ const std::string &name, >+ const std::string &mappedName) = 0; >+ >+ std::string collapseNameStack() const; >+ std::string collapseMappedNameStack() const; >+ >+ private: >+ void visitSampler(const sh::ShaderVariable &sampler) final; >+ void visitVariable(const ShaderVariable &variable, bool isRowMajor) final; >+ >+ std::vector<std::string> mNameStack; >+ std::vector<std::string> mMappedNameStack; >+}; >+ >+class BlockEncoderVisitor : public VariableNameVisitor >+{ >+ public: >+ BlockEncoderVisitor(const std::string &namePrefix, >+ const std::string &mappedNamePrefix, >+ BlockLayoutEncoder *encoder); >+ ~BlockEncoderVisitor() override; >+ >+ void enterStructAccess(const ShaderVariable &structVar, bool isRowMajor) override; >+ void exitStructAccess(const ShaderVariable &structVar, bool isRowMajor) override; >+ void enterArrayElement(const ShaderVariable &arrayVar, unsigned int arrayElement) override; >+ void exitArrayElement(const ShaderVariable &arrayVar, unsigned int arrayElement) override; >+ >+ void visitNamedVariable(const ShaderVariable &variable, >+ bool isRowMajor, >+ const std::string &name, >+ const std::string &mappedName) override; >+ >+ virtual void encodeVariable(const ShaderVariable &variable, >+ const BlockMemberInfo &variableInfo, >+ const std::string &name, >+ const std::string &mappedName) >+ {} >+ >+ protected: >+ int mTopLevelArraySize = 1; >+ int mTopLevelArrayStride = 0; >+ bool mIsTopLevelArrayStrideReady = true; >+ bool mSkipEnabled = false; >+ >+ private: >+ BlockLayoutEncoder *mEncoder; >+ unsigned int mStructStackSize = 0; >+}; >+ >+void TraverseShaderVariable(const ShaderVariable &variable, >+ bool isRowMajorLayout, >+ ShaderVariableVisitor *visitor); >+ >+template <typename T> >+void TraverseShaderVariables(const std::vector<T> &vars, >+ bool isRowMajorLayout, >+ ShaderVariableVisitor *visitor) >+{ >+ for (const T &var : vars) >+ { >+ TraverseShaderVariable(var, isRowMajorLayout, visitor); >+ } >+} > } // namespace sh > > #endif // COMMON_BLOCKLAYOUT_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayoutHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayoutHLSL.cpp >index 867821f1ead..dde403699ce 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayoutHLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayoutHLSL.cpp >@@ -17,17 +17,14 @@ namespace sh > > HLSLBlockEncoder::HLSLBlockEncoder(HLSLBlockEncoderStrategy strategy, bool transposeMatrices) > : mEncoderStrategy(strategy), mTransposeMatrices(transposeMatrices) >-{ >-} >+{} > >-void HLSLBlockEncoder::enterAggregateType() >+void HLSLBlockEncoder::enterAggregateType(const ShaderVariable &structVar) > { >- nextRegister(); >+ align(kComponentsPerRegister); > } > >-void HLSLBlockEncoder::exitAggregateType() >-{ >-} >+void HLSLBlockEncoder::exitAggregateType(const ShaderVariable &structVar) {} > > void HLSLBlockEncoder::getBlockLayoutInfo(GLenum typeIn, > const std::vector<unsigned int> &arraySizes, >@@ -38,7 +35,7 @@ void HLSLBlockEncoder::getBlockLayoutInfo(GLenum typeIn, > GLenum type = (mTransposeMatrices ? gl::TransposeMatrixType(typeIn) : typeIn); > > // We assume we are only dealing with 4 byte components (no doubles or half-words currently) >- ASSERT(gl::VariableComponentSize(gl::VariableComponentType(type)) == BytesPerComponent); >+ ASSERT(gl::VariableComponentSize(gl::VariableComponentType(type)) == kBytesPerComponent); > > int matrixStride = 0; > int arrayStride = 0; >@@ -48,29 +45,29 @@ void HLSLBlockEncoder::getBlockLayoutInfo(GLenum typeIn, > // register > if (!isPacked() || gl::IsMatrixType(type) || !arraySizes.empty()) > { >- nextRegister(); >+ align(kComponentsPerRegister); > } > > if (gl::IsMatrixType(type)) > { >- matrixStride = ComponentsPerRegister; >+ matrixStride = kComponentsPerRegister; > > if (!arraySizes.empty()) > { > const int numRegisters = gl::MatrixRegisterCount(type, isRowMajorMatrix); >- arrayStride = ComponentsPerRegister * numRegisters; >+ arrayStride = kComponentsPerRegister * numRegisters; > } > } > else if (!arraySizes.empty()) > { >- arrayStride = ComponentsPerRegister; >+ arrayStride = kComponentsPerRegister; > } > else if (isPacked()) > { > int numComponents = gl::VariableComponentCount(type); >- if ((numComponents + (mCurrentOffset % ComponentsPerRegister)) > ComponentsPerRegister) >+ if ((numComponents + (mCurrentOffset % kComponentsPerRegister)) > kComponentsPerRegister) > { >- nextRegister(); >+ align(kComponentsPerRegister); > } > } > >@@ -88,15 +85,19 @@ void HLSLBlockEncoder::advanceOffset(GLenum typeIn, > > if (!arraySizes.empty()) > { >- mCurrentOffset += arrayStride * (gl::ArraySizeProduct(arraySizes) - 1); >+ unsigned int arraySize = gl::ArraySizeProduct(arraySizes); >+ if (arraySize > 0) >+ { >+ mCurrentOffset += arrayStride * (arraySize - 1); >+ } > } > > if (gl::IsMatrixType(type)) > { >- ASSERT(matrixStride == ComponentsPerRegister); >+ ASSERT(matrixStride == kComponentsPerRegister); > const int numRegisters = gl::MatrixRegisterCount(type, isRowMajorMatrix); > const int numComponents = gl::MatrixComponentCount(type, isRowMajorMatrix); >- mCurrentOffset += ComponentsPerRegister * (numRegisters - 1); >+ mCurrentOffset += kComponentsPerRegister * (numRegisters - 1); > mCurrentOffset += numComponents; > } > else if (isPacked()) >@@ -105,13 +106,13 @@ void HLSLBlockEncoder::advanceOffset(GLenum typeIn, > } > else > { >- mCurrentOffset += ComponentsPerRegister; >+ mCurrentOffset += kComponentsPerRegister; > } > } > > void HLSLBlockEncoder::skipRegisters(unsigned int numRegisters) > { >- mCurrentOffset += (numRegisters * ComponentsPerRegister); >+ mCurrentOffset += (numRegisters * kComponentsPerRegister); > } > > HLSLBlockEncoder::HLSLBlockEncoderStrategy HLSLBlockEncoder::GetStrategyFor( >@@ -137,14 +138,14 @@ void HLSLVariableRegisterCount(const ShaderVarType &variable, HLSLBlockEncoder * > { > for (size_t arrayElement = 0; arrayElement < variable.getArraySizeProduct(); arrayElement++) > { >- encoder->enterAggregateType(); >+ encoder->enterAggregateType(variable); > >- for (size_t fieldIndex = 0; fieldIndex < variable.fields.size(); fieldIndex++) >+ for (const ShaderVariable &field : variable.fields) > { >- HLSLVariableRegisterCount(variable.fields[fieldIndex], encoder); >+ HLSLVariableRegisterCount(field, encoder); > } > >- encoder->exitAggregateType(); >+ encoder->exitAggregateType(variable); > } > } > else >@@ -159,8 +160,8 @@ unsigned int HLSLVariableRegisterCount(const Uniform &variable, ShShaderOutput o > HLSLBlockEncoder encoder(HLSLBlockEncoder::GetStrategyFor(outputType), true); > HLSLVariableRegisterCount(variable, &encoder); > >- const size_t registerBytes = (encoder.BytesPerComponent * encoder.ComponentsPerRegister); >- return static_cast<unsigned int>(rx::roundUp<size_t>(encoder.getBlockSize(), registerBytes) / >- registerBytes); >+ const size_t registerBytes = (encoder.kBytesPerComponent * encoder.kComponentsPerRegister); >+ return static_cast<unsigned int>( >+ rx::roundUp<size_t>(encoder.getCurrentOffset(), registerBytes) / registerBytes); > } > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayoutHLSL.h b/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayoutHLSL.h >index 8f4a51a9068..98d93fccb08 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayoutHLSL.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayoutHLSL.h >@@ -13,9 +13,9 @@ > #include <cstddef> > #include <vector> > >+#include <GLSLANG/ShaderLang.h> > #include "angle_gl.h" > #include "blocklayout.h" >-#include <GLSLANG/ShaderLang.h> > > namespace sh > { >@@ -35,8 +35,8 @@ class HLSLBlockEncoder : public BlockLayoutEncoder > > HLSLBlockEncoder(HLSLBlockEncoderStrategy strategy, bool transposeMatrices); > >- void enterAggregateType() override; >- void exitAggregateType() override; >+ void enterAggregateType(const ShaderVariable &structVar) override; >+ void exitAggregateType(const ShaderVariable &structVar) override; > void skipRegisters(unsigned int numRegisters); > > bool isPacked() const { return mEncoderStrategy == ENCODE_PACKED; } >@@ -63,6 +63,6 @@ class HLSLBlockEncoder : public BlockLayoutEncoder > // HLSLBlockEncoder class to count the number of used registers in a struct (which are individually > // packed according to the same rules). > unsigned int HLSLVariableRegisterCount(const Uniform &variable, ShShaderOutput outputType); >-} >+} // namespace sh > > #endif // COMMON_BLOCKLAYOUTHLSL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/builtin_function_declarations.txt b/Source/ThirdParty/ANGLE/src/compiler/translator/builtin_function_declarations.txt >new file mode 100644 >index 00000000000..ce6ccb4cb07 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/builtin_function_declarations.txt >@@ -0,0 +1,593 @@ >+// The format of this file: >+// C++ style single-line comments are supported. >+// Leading whitespace is only for formatting and doesn't have semantic meaning. >+// >+// Grouping: >+// Groups of functions are denoted by "GROUP BEGIN" and "GROUP END". Groups can be nested. >+// Groups can have metadata related to the group itself. This is given at the end of the GROUP >+// BEGIN line in JSON object format. >+// Example: >+// GROUP BEGIN <group name> {"condition": "shaderType == GL_FRAGMENT_SHADER"} >+// GROUP END <group name> >+// >+// Defaults: >+// Default metadata for functions can be set with "DEFAULT METADATA" followed by metadata in JSON >+// object format. The metadata is applied to all following functions regardless of grouping until >+// another "DEFAULT METADATA" line is encountered, or until the end of a top-level group. >+// Example: >+// DEFAULT METADATA {"op": "CallBuiltInFunction"} >+// >+// Supported function metadata properties are: >+// "level" >+// string, one of COMMON_BUILTINS, ESSL1_BUILTINS, ESSL3_BUILTINS and ESSL3_1_BUILTINS. >+// "op" >+// string, either EOp code or "auto", in which case the op is derived from the function >+// name. >+// "suffix" >+// string, suffix that is used to disambiguate C++ variable names created based on the >+// function name from C++ keywords, or disambiguate two functions with the same name. >+// "extension" >+// string, GLSL extension where the function is defined. >+// "hasSideEffects" >+// boolean, can be used to mark a function as having side effects even if it has op other >+// than CallBuiltInFunction and it doesn't have out parameters. In case the op is >+// CallBuiltInFunction or the function has out parameters it is automatically treated as >+// having side effects. >+// >+// Function declarations: >+// Lines that declare functions are in a similar format as in the GLSL spec: >+// <return type> <function name>(<param type>, ...); >+// Parameter types can have "out" or "inout" qualifiers. >+ >+GROUP BEGIN Trigonometric >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "auto"} >+ genType radians(genType); >+ genType degrees(genType); >+ genType sin(genType); >+ genType cos(genType); >+ genType tan(genType); >+ genType asin(genType); >+ genType acos(genType); >+ genType atan(genType, genType); >+ genType atan(genType); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "auto"} >+ genType sinh(genType); >+ genType cosh(genType); >+ genType tanh(genType); >+ genType asinh(genType); >+ genType acosh(genType); >+ genType atanh(genType); >+GROUP END Trigonometric >+ >+GROUP BEGIN Exponential >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "auto"} >+ genType pow(genType, genType); >+ genType exp(genType); >+ genType log(genType); >+ genType exp2(genType); >+ genType log2(genType); >+ genType sqrt(genType); >+ genType inversesqrt(genType); >+GROUP END Exponential >+ >+GROUP BEGIN Common >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "auto"} >+ genType abs(genType); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "auto"} >+ genIType abs(genIType); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "auto"} >+ genType sign(genType); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "auto"} >+ genIType sign(genIType); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "auto"} >+ genType floor(genType); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "auto"} >+ genType trunc(genType); >+ genType round(genType); >+ genType roundEven(genType); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "auto"} >+ genType ceil(genType); >+ genType fract(genType); >+ genType mod(genType, float); >+ genType mod(genType, genType); >+ genType min(genType, float); >+ genType min(genType, genType); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "auto"} >+ genIType min(genIType, genIType); >+ genIType min(genIType, int); >+ genUType min(genUType, genUType); >+ genUType min(genUType, uint); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "auto"} >+ genType max(genType, float); >+ genType max(genType, genType); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "auto"} >+ genIType max(genIType, genIType); >+ genIType max(genIType, int); >+ genUType max(genUType, genUType); >+ genUType max(genUType, uint); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "auto"} >+ genType clamp(genType, float, float); >+ genType clamp(genType, genType, genType); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "auto"} >+ genIType clamp(genIType, int, int); >+ genIType clamp(genIType, genIType, genIType); >+ genUType clamp(genUType, uint, uint); >+ genUType clamp(genUType, genUType, genUType); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "auto"} >+ genType mix(genType, genType, float); >+ genType mix(genType, genType, genType); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "auto"} >+ genType mix(genType, genType, genBType); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "auto"} >+ genType step(genType, genType); >+ genType step(float, genType); >+ genType smoothstep(genType, genType, genType); >+ genType smoothstep(float, float, genType); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "auto"} >+ genType modf(genType, out genType); >+ genBType isnan(genType); >+ genBType isinf(genType); >+ genIType floatBitsToInt(genType); >+ genUType floatBitsToUint(genType); >+ genType intBitsToFloat(genIType); >+ genType uintBitsToFloat(genUType); >+ DEFAULT METADATA {"level": "ESSL3_1_BUILTINS", "op": "auto"} >+ genType frexp(genType, out genIType); >+ genType ldexp(genType, genIType); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "auto"} >+ uint packSnorm2x16(vec2); >+ uint packUnorm2x16(vec2); >+ uint packHalf2x16(vec2); >+ vec2 unpackSnorm2x16(uint); >+ vec2 unpackUnorm2x16(uint); >+ vec2 unpackHalf2x16(uint); >+ DEFAULT METADATA {"level": "ESSL3_1_BUILTINS", "op": "auto"} >+ uint packUnorm4x8(vec4); >+ uint packSnorm4x8(vec4); >+ vec4 unpackUnorm4x8(uint); >+ vec4 unpackSnorm4x8(uint); >+GROUP END Common >+ >+GROUP BEGIN Geometric >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "auto"} >+ float length(genType); >+ float distance(genType, genType); >+ float dot(genType, genType); >+ vec3 cross(vec3, vec3); >+ genType normalize(genType); >+ genType faceforward(genType, genType, genType); >+ genType reflect(genType, genType); >+ genType refract(genType, genType, float); >+GROUP END Geometric >+ >+GROUP BEGIN Matrix >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "MulMatrixComponentWise"} >+ mat2 matrixCompMult(mat2, mat2); >+ mat3 matrixCompMult(mat3, mat3); >+ mat4 matrixCompMult(mat4, mat4); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "MulMatrixComponentWise"} >+ mat2x3 matrixCompMult(mat2x3, mat2x3); >+ mat3x2 matrixCompMult(mat3x2, mat3x2); >+ mat2x4 matrixCompMult(mat2x4, mat2x4); >+ mat4x2 matrixCompMult(mat4x2, mat4x2); >+ mat3x4 matrixCompMult(mat3x4, mat3x4); >+ mat4x3 matrixCompMult(mat4x3, mat4x3); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "auto"} >+ mat2 outerProduct(vec2, vec2); >+ mat3 outerProduct(vec3, vec3); >+ mat4 outerProduct(vec4, vec4); >+ mat2x3 outerProduct(vec3, vec2); >+ mat3x2 outerProduct(vec2, vec3); >+ mat2x4 outerProduct(vec4, vec2); >+ mat4x2 outerProduct(vec2, vec4); >+ mat3x4 outerProduct(vec4, vec3); >+ mat4x3 outerProduct(vec3, vec4); >+ mat2 transpose(mat2); >+ mat3 transpose(mat3); >+ mat4 transpose(mat4); >+ mat2x3 transpose(mat3x2); >+ mat3x2 transpose(mat2x3); >+ mat2x4 transpose(mat4x2); >+ mat4x2 transpose(mat2x4); >+ mat3x4 transpose(mat4x3); >+ mat4x3 transpose(mat3x4); >+ float determinant(mat2); >+ float determinant(mat3); >+ float determinant(mat4); >+ mat2 inverse(mat2); >+ mat3 inverse(mat3); >+ mat4 inverse(mat4); >+GROUP END Matrix >+ >+GROUP BEGIN Vector >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "LessThanComponentWise"} >+ bvec lessThan(vec, vec); >+ bvec lessThan(ivec, ivec); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "LessThanComponentWise"} >+ bvec lessThan(uvec, uvec); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "LessThanEqualComponentWise"} >+ bvec lessThanEqual(vec, vec); >+ bvec lessThanEqual(ivec, ivec); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "LessThanEqualComponentWise"} >+ bvec lessThanEqual(uvec, uvec); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "GreaterThanComponentWise"} >+ bvec greaterThan(vec, vec); >+ bvec greaterThan(ivec, ivec); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "GreaterThanComponentWise"} >+ bvec greaterThan(uvec, uvec); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "GreaterThanEqualComponentWise"} >+ bvec greaterThanEqual(vec, vec); >+ bvec greaterThanEqual(ivec, ivec); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "GreaterThanEqualComponentWise"} >+ bvec greaterThanEqual(uvec, uvec); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "EqualComponentWise"} >+ bvec equal(vec, vec); >+ bvec equal(ivec, ivec); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "EqualComponentWise"} >+ bvec equal(uvec, uvec); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "EqualComponentWise"} >+ bvec equal(bvec, bvec); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "NotEqualComponentWise"} >+ bvec notEqual(vec, vec); >+ bvec notEqual(ivec, ivec); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "NotEqualComponentWise"} >+ bvec notEqual(uvec, uvec); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "NotEqualComponentWise"} >+ bvec notEqual(bvec, bvec); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "auto"} >+ bool any(bvec); >+ bool all(bvec); >+ DEFAULT METADATA {"level": "COMMON_BUILTINS", "op": "LogicalNotComponentWise", "suffix": "Func"} >+ bvec not(bvec); >+GROUP END Vector >+ >+GROUP BEGIN Integer >+ DEFAULT METADATA {"level": "ESSL3_1_BUILTINS", "op": "auto"} >+ genIType bitfieldExtract(genIType, int, int); >+ genUType bitfieldExtract(genUType, int, int); >+ genIType bitfieldInsert(genIType, genIType, int, int); >+ genUType bitfieldInsert(genUType, genUType, int, int); >+ genIType bitfieldReverse(genIType); >+ genUType bitfieldReverse(genUType); >+ genIType bitCount(genIType); >+ genIType bitCount(genUType); >+ genIType findLSB(genIType); >+ genIType findLSB(genUType); >+ genIType findMSB(genIType); >+ genIType findMSB(genUType); >+ genUType uaddCarry(genUType, genUType, out genUType); >+ genUType usubBorrow(genUType, genUType, out genUType); >+ void umulExtended(genUType, genUType, out genUType, out genUType); >+ void imulExtended(genIType, genIType, out genIType, out genIType); >+GROUP END Integer >+ >+GROUP BEGIN TextureESSL100 >+ DEFAULT METADATA {"level": "ESSL1_BUILTINS", "op": "CallBuiltInFunction"} >+ vec4 texture2D(sampler2D, vec2); >+ vec4 texture2DProj(sampler2D, vec3); >+ vec4 texture2DProj(sampler2D, vec4); >+ vec4 textureCube(samplerCube, vec3); >+GROUP END TextureESSL100 >+ >+// These are extension functions from OES_EGL_image_external and >+// NV_EGL_stream_consumer_external. We don't have a way to mark a built-in with two alternative >+// extensions, so these are marked with none. This is fine, since these functions overload core >+// function names and the functions require a samplerExternalOES parameter, which can only be >+// created if one of the extensions is enabled. >+// TODO(oetuaho): Consider implementing a cleaner solution. >+GROUP BEGIN EGL_image_external >+ DEFAULT METADATA {"level": "ESSL1_BUILTINS", "op": "CallBuiltInFunction"} >+ vec4 texture2D(samplerExternalOES, vec2); >+ vec4 texture2DProj(samplerExternalOES, vec3); >+ vec4 texture2DProj(samplerExternalOES, vec4); >+GROUP END EGL_image_external >+ >+GROUP BEGIN ARB_texture_rectangle >+ DEFAULT METADATA {"level": "ESSL1_BUILTINS", "op": "CallBuiltInFunction", "extension": "ARB_texture_rectangle"} >+ vec4 texture2DRect(sampler2DRect, vec2); >+ vec4 texture2DRectProj(sampler2DRect, vec3); >+ vec4 texture2DRectProj(sampler2DRect, vec4); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "CallBuiltInFunction", "extension": "ARB_texture_rectangle"} >+ // We don't have a rectangle texture extension for OpenGL ES however based on the behavior of >+ // rectangle texture in desktop OpenGL, they should be sampled with a "texture" overload in >+ // GLSL version that have such an overload. This is the case for ESSL3 and above. >+ vec4 texture(sampler2DRect, vec2); >+ vec4 textureProj(sampler2DRect, vec3); >+ vec4 textureProj(sampler2DRect, vec4); >+GROUP END ARB_texture_rectangle >+ >+// The *Grad* variants are new to both vertex and fragment shaders; the fragment >+// shader specific pieces are added separately below. >+GROUP BEGIN EXT_shader_texture_lod >+ DEFAULT METADATA {"level": "ESSL1_BUILTINS", "op": "CallBuiltInFunction", "extension": "EXT_shader_texture_lod"} >+ vec4 texture2DGradEXT(sampler2D, vec2, vec2, vec2); >+ vec4 texture2DProjGradEXT(sampler2D, vec3, vec2, vec2); >+ vec4 texture2DProjGradEXT(sampler2D, vec4, vec2, vec2); >+ vec4 textureCubeGradEXT(samplerCube, vec3, vec3, vec3); >+GROUP END EXT_shader_texture_lod >+ >+GROUP BEGIN TextureESSL100FS {"condition": "shaderType == GL_FRAGMENT_SHADER"} >+ DEFAULT METADATA {"level": "ESSL1_BUILTINS", "op": "CallBuiltInFunction"} >+ vec4 texture2D(sampler2D, vec2, float); >+ vec4 texture2DProj(sampler2D, vec3, float); >+ vec4 texture2DProj(sampler2D, vec4, float); >+ vec4 textureCube(samplerCube, vec3, float); >+ DEFAULT METADATA {"level": "ESSL1_BUILTINS", "op": "auto", "extension": "OES_standard_derivatives", "hasSideEffects": "true", "suffix": "Ext"} >+ genType dFdx(genType); >+ genType dFdy(genType); >+ genType fwidth(genType); >+ DEFAULT METADATA {"level": "ESSL1_BUILTINS", "op": "CallBuiltInFunction", "extension": "EXT_shader_texture_lod"} >+ vec4 texture2DLodEXT(sampler2D, vec2, float); >+ vec4 texture2DProjLodEXT(sampler2D, vec3, float); >+ vec4 texture2DProjLodEXT(sampler2D, vec4, float); >+ vec4 textureCubeLodEXT(samplerCube, vec3, float); >+GROUP END TextureESSL100FS >+ >+GROUP BEGIN TextureESSL100VS {"condition": "shaderType == GL_VERTEX_SHADER"} >+ DEFAULT METADATA {"level": "ESSL1_BUILTINS", "op": "CallBuiltInFunction"} >+ vec4 texture2DLod(sampler2D, vec2, float); >+ vec4 texture2DProjLod(sampler2D, vec3, float); >+ vec4 texture2DProjLod(sampler2D, vec4, float); >+ vec4 textureCubeLod(samplerCube, vec3, float); >+GROUP END TextureESSL100VS >+ >+GROUP BEGIN TextureESSL300 >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "CallBuiltInFunction"} >+ gvec4 texture(gsampler2D, vec2); >+ gvec4 texture(gsampler3D, vec3); >+ gvec4 texture(gsamplerCube, vec3); >+ gvec4 texture(gsampler2DArray, vec3); >+ gvec4 textureProj(gsampler2D, vec3); >+ gvec4 textureProj(gsampler2D, vec4); >+ gvec4 textureProj(gsampler3D, vec4); >+ gvec4 textureLod(gsampler2D, vec2, float); >+ gvec4 textureLod(gsampler3D, vec3, float); >+ gvec4 textureLod(gsamplerCube, vec3, float); >+ gvec4 textureLod(gsampler2DArray, vec3, float); >+ float texture(sampler2DShadow, vec3); >+ float texture(samplerCubeShadow, vec4); >+ float texture(sampler2DArrayShadow, vec4); >+ float textureProj(sampler2DShadow, vec4); >+ float textureLod(sampler2DShadow, vec3, float); >+ ivec2 textureSize(gsampler2D, int); >+ ivec3 textureSize(gsampler3D, int); >+ ivec2 textureSize(gsamplerCube, int); >+ ivec3 textureSize(gsampler2DArray, int); >+ ivec2 textureSize(sampler2DShadow, int); >+ ivec2 textureSize(samplerCubeShadow, int); >+ ivec3 textureSize(sampler2DArrayShadow, int); >+ gvec4 textureProjLod(gsampler2D, vec3, float); >+ gvec4 textureProjLod(gsampler2D, vec4, float); >+ gvec4 textureProjLod(gsampler3D, vec4, float); >+ float textureProjLod(sampler2DShadow, vec4, float); >+ gvec4 texelFetch(gsampler2D, ivec2, int); >+ gvec4 texelFetch(gsampler3D, ivec3, int); >+ gvec4 texelFetch(gsampler2DArray, ivec3, int); >+ gvec4 textureGrad(gsampler2D, vec2, vec2, vec2); >+ gvec4 textureGrad(gsampler3D, vec3, vec3, vec3); >+ gvec4 textureGrad(gsamplerCube, vec3, vec3, vec3); >+ float textureGrad(sampler2DShadow, vec3, vec2, vec2); >+ float textureGrad(samplerCubeShadow, vec4, vec3, vec3); >+ gvec4 textureGrad(gsampler2DArray, vec3, vec2, vec2); >+ float textureGrad(sampler2DArrayShadow, vec4, vec2, vec2); >+ gvec4 textureProjGrad(gsampler2D, vec3, vec2, vec2); >+ gvec4 textureProjGrad(gsampler2D, vec4, vec2, vec2); >+ gvec4 textureProjGrad(gsampler3D, vec4, vec3, vec3); >+ float textureProjGrad(sampler2DShadow, vec4, vec2, vec2); >+GROUP END TextureESSL300 >+ >+GROUP BEGIN TextureSizeMS >+ DEFAULT METADATA {"level": "ESSL3_1_BUILTINS", "op": "CallBuiltInFunction"} >+ ivec2 textureSize(gsampler2DMS); >+GROUP END TextureSizeMS >+ >+GROUP BEGIN TextureSizeMSExt >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "CallBuiltInFunction", "extension": "ANGLE_texture_multisample", "suffix": "Ext"} >+ ivec2 textureSize(gsampler2DMS); >+GROUP END TextureSizeMSExt >+ >+GROUP BEGIN TextureSizeMSArray >+ DEFAULT METADATA {"level": "ESSL3_1_BUILTINS", "op": "CallBuiltInFunction", "extension": "OES_texture_storage_multisample_2d_array"} >+ ivec3 textureSize(gsampler2DMSArray); >+GROUP END TextureSizeMSArray >+ >+GROUP BEGIN TextureOffsetNoBias {"queryFunction": true} >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "CallBuiltInFunction"} >+ gvec4 textureOffset(gsampler2D, vec2, ivec2); >+ gvec4 textureOffset(gsampler3D, vec3, ivec3); >+ float textureOffset(sampler2DShadow, vec3, ivec2); >+ gvec4 textureOffset(gsampler2DArray, vec3, ivec2); >+ gvec4 textureProjOffset(gsampler2D, vec3, ivec2); >+ gvec4 textureProjOffset(gsampler2D, vec4, ivec2); >+ gvec4 textureProjOffset(gsampler3D, vec4, ivec3); >+ float textureProjOffset(sampler2DShadow, vec4, ivec2); >+ gvec4 textureLodOffset(gsampler2D, vec2, float, ivec2); >+ gvec4 textureLodOffset(gsampler3D, vec3, float, ivec3); >+ float textureLodOffset(sampler2DShadow, vec3, float, ivec2); >+ gvec4 textureLodOffset(gsampler2DArray, vec3, float, ivec2); >+ gvec4 textureProjLodOffset(gsampler2D, vec3, float, ivec2); >+ gvec4 textureProjLodOffset(gsampler2D, vec4, float, ivec2); >+ gvec4 textureProjLodOffset(gsampler3D, vec4, float, ivec3); >+ float textureProjLodOffset(sampler2DShadow, vec4, float, ivec2); >+ gvec4 texelFetchOffset(gsampler2D, ivec2, int, ivec2); >+ gvec4 texelFetchOffset(gsampler3D, ivec3, int, ivec3); >+ gvec4 texelFetchOffset(gsampler2DArray, ivec3, int, ivec2); >+ gvec4 textureGradOffset(gsampler2D, vec2, vec2, vec2, ivec2); >+ gvec4 textureGradOffset(gsampler3D, vec3, vec3, vec3, ivec3); >+ float textureGradOffset(sampler2DShadow, vec3, vec2, vec2, ivec2); >+ gvec4 textureGradOffset(gsampler2DArray, vec3, vec2, vec2, ivec2); >+ float textureGradOffset(sampler2DArrayShadow, vec4, vec2, vec2, ivec2); >+ gvec4 textureProjGradOffset(gsampler2D, vec3, vec2, vec2, ivec2); >+ gvec4 textureProjGradOffset(gsampler2D, vec4, vec2, vec2, ivec2); >+ gvec4 textureProjGradOffset(gsampler3D, vec4, vec3, vec3, ivec3); >+ float textureProjGradOffset(sampler2DShadow, vec4, vec2, vec2, ivec2); >+GROUP END TextureOffsetNoBias >+ >+GROUP BEGIN TextureOffsetBias {"queryFunction": true, "condition": "shaderType == GL_FRAGMENT_SHADER"} >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "CallBuiltInFunction"} >+ gvec4 textureOffset(gsampler2D, vec2, ivec2, float); >+ gvec4 textureOffset(gsampler3D, vec3, ivec3, float); >+ float textureOffset(sampler2DShadow, vec3, ivec2, float); >+ gvec4 textureOffset(gsampler2DArray, vec3, ivec2, float); >+ gvec4 textureProjOffset(gsampler2D, vec3, ivec2, float); >+ gvec4 textureProjOffset(gsampler2D, vec4, ivec2, float); >+ gvec4 textureProjOffset(gsampler3D, vec4, ivec3, float); >+ float textureProjOffset(sampler2DShadow, vec4, ivec2, float); >+GROUP END TextureOffsetBias >+ >+GROUP BEGIN EGL_image_external_essl3 >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "CallBuiltInFunction", "extension": "OES_EGL_image_external_essl3"} >+ vec4 texture(samplerExternalOES, vec2); >+ vec4 textureProj(samplerExternalOES, vec3); >+ vec4 textureProj(samplerExternalOES, vec4); >+ ivec2 textureSize(samplerExternalOES, int); >+ vec4 texelFetch(samplerExternalOES, ivec2, int); >+GROUP END EGL_image_external_essl3 >+ >+GROUP BEGIN EXT_yuv_target >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "CallBuiltInFunction", "extension": "EXT_YUV_target"} >+ vec4 texture(samplerExternal2DY2YEXT, vec2); >+ vec4 textureProj(samplerExternal2DY2YEXT, vec3); >+ vec4 textureProj(samplerExternal2DY2YEXT, vec4); >+ vec3 rgb_2_yuv(vec3, yuvCscStandardEXT); >+ vec3 yuv_2_rgb(vec3, yuvCscStandardEXT); >+ ivec2 textureSize(samplerExternal2DY2YEXT, int); >+ vec4 texelFetch(samplerExternal2DY2YEXT, ivec2, int); >+GROUP END EXT_yuv_target >+ >+GROUP BEGIN TextureESSL300FS {"condition": "shaderType == GL_FRAGMENT_SHADER"} >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "CallBuiltInFunction"} >+ gvec4 texture(gsampler2D, vec2, float); >+ gvec4 texture(gsampler3D, vec3, float); >+ gvec4 texture(gsamplerCube, vec3, float); >+ gvec4 texture(gsampler2DArray, vec3, float); >+ gvec4 textureProj(gsampler2D, vec3, float); >+ gvec4 textureProj(gsampler2D, vec4, float); >+ gvec4 textureProj(gsampler3D, vec4, float); >+ float texture(sampler2DShadow, vec3, float); >+ float texture(samplerCubeShadow, vec4, float); >+ float textureProj(sampler2DShadow, vec4, float); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "CallBuiltInFunction", "extension": "OES_EGL_image_external_essl3"} >+ vec4 texture(samplerExternalOES, vec2, float); >+ vec4 textureProj(samplerExternalOES, vec3, float); >+ vec4 textureProj(samplerExternalOES, vec4, float); >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "CallBuiltInFunction", "extension": "EXT_YUV_target"} >+ vec4 texture(samplerExternal2DY2YEXT, vec2, float); >+ vec4 textureProj(samplerExternal2DY2YEXT, vec3, float); >+ vec4 textureProj(samplerExternal2DY2YEXT, vec4, float); >+GROUP END TextureESSL300FS >+ >+GROUP BEGIN TexelFetchMS >+ DEFAULT METADATA {"level": "ESSL3_1_BUILTINS", "op": "CallBuiltInFunction"} >+ gvec4 texelFetch(gsampler2DMS, ivec2, int); >+GROUP END TexelFetchMS >+ >+GROUP BEGIN TexelFetchMSExt >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "CallBuiltInFunction", "extension": "ANGLE_texture_multisample", "suffix": "Ext"} >+ gvec4 texelFetch(gsampler2DMS, ivec2, int); >+GROUP END TexelFetchMSExt >+ >+GROUP BEGIN TexelFetchMSArray >+ DEFAULT METADATA {"level": "ESSL3_1_BUILTINS", "op": "CallBuiltInFunction", "extension": "OES_texture_storage_multisample_2d_array"} >+ gvec4 texelFetch(gsampler2DMSArray, ivec3, int); >+GROUP END TexelFetchMSArray >+ >+GROUP BEGIN TextureGather {"queryFunction": true} >+ DEFAULT METADATA {"level": "ESSL3_1_BUILTINS", "op": "CallBuiltInFunction"} >+ gvec4 textureGather(gsampler2D, vec2); >+ gvec4 textureGather(gsampler2D, vec2, int); >+ gvec4 textureGather(gsampler2DArray, vec3); >+ gvec4 textureGather(gsampler2DArray, vec3, int); >+ gvec4 textureGather(gsamplerCube, vec3); >+ gvec4 textureGather(gsamplerCube, vec3, int); >+ vec4 textureGather(sampler2DShadow, vec2); >+ vec4 textureGather(sampler2DShadow, vec2, float); >+ vec4 textureGather(sampler2DArrayShadow, vec3); >+ vec4 textureGather(sampler2DArrayShadow, vec3, float); >+ vec4 textureGather(samplerCubeShadow, vec3); >+ vec4 textureGather(samplerCubeShadow, vec3, float); >+ >+ GROUP BEGIN Offset {"queryFunction": true} >+ gvec4 textureGatherOffset(gsampler2D, vec2, ivec2); >+ gvec4 textureGatherOffset(gsampler2D, vec2, ivec2, int); >+ gvec4 textureGatherOffset(gsampler2DArray, vec3, ivec2); >+ gvec4 textureGatherOffset(gsampler2DArray, vec3, ivec2, int); >+ vec4 textureGatherOffset(sampler2DShadow, vec2, float, ivec2); >+ vec4 textureGatherOffset(sampler2DArrayShadow, vec3, float, ivec2); >+ GROUP END Offset >+GROUP END TextureGather >+ >+GROUP BEGIN DerivativesESSL300FS {"condition": "shaderType == GL_FRAGMENT_SHADER"} >+ DEFAULT METADATA {"level": "ESSL3_BUILTINS", "op": "auto", "hasSideEffects": "true"} >+ genType dFdx(genType); >+ genType dFdy(genType); >+ genType fwidth(genType); >+GROUP END DerivativesESSL300FS >+ >+GROUP BEGIN AtomicCounter >+ DEFAULT METADATA {"level": "ESSL3_1_BUILTINS", "op": "CallBuiltInFunction"} >+ uint atomicCounter(atomic_uint); >+ uint atomicCounterIncrement(atomic_uint); >+ uint atomicCounterDecrement(atomic_uint); >+GROUP END AtomicCounter >+ >+GROUP BEGIN AtomicMemory {"queryFunction": true} >+ DEFAULT METADATA {"level": "ESSL3_1_BUILTINS", "op": "auto"} >+ uint atomicAdd(inout uint, uint); >+ int atomicAdd(inout int, int); >+ uint atomicMin(inout uint, uint); >+ int atomicMin(inout int, int); >+ uint atomicMax(inout uint, uint); >+ int atomicMax(inout int, int); >+ uint atomicAnd(inout uint, uint); >+ int atomicAnd(inout int, int); >+ uint atomicOr(inout uint, uint); >+ int atomicOr(inout int, int); >+ uint atomicXor(inout uint, uint); >+ int atomicXor(inout int, int); >+ uint atomicExchange(inout uint, uint); >+ int atomicExchange(inout int, int); >+ uint atomicCompSwap(inout uint, uint, uint); >+ int atomicCompSwap(inout int, int, int); >+GROUP END AtomicMemory >+ >+GROUP BEGIN Image {"queryFunction": true} >+ DEFAULT METADATA {"level": "ESSL3_1_BUILTINS", "op": "CallBuiltInFunction"} >+ GROUP BEGIN Store {"queryFunction": true} >+ void imageStore(gimage2D, ivec2, gvec4); >+ void imageStore(gimage3D, ivec3, gvec4); >+ void imageStore(gimage2DArray, ivec3, gvec4); >+ void imageStore(gimageCube, ivec3, gvec4); >+ GROUP END Store >+ GROUP BEGIN Load {"queryFunction": true} >+ gvec4 imageLoad(gimage2D, ivec2); >+ gvec4 imageLoad(gimage3D, ivec3); >+ gvec4 imageLoad(gimage2DArray, ivec3); >+ gvec4 imageLoad(gimageCube, ivec3); >+ GROUP END Load >+ ivec2 imageSize(gimage2D); >+ ivec3 imageSize(gimage3D); >+ ivec3 imageSize(gimage2DArray); >+ ivec2 imageSize(gimageCube); >+GROUP END Image >+ >+GROUP BEGIN Barrier >+ DEFAULT METADATA {"level": "ESSL3_1_BUILTINS", "op": "auto", "hasSideEffects": true} >+ void memoryBarrier(); >+ void memoryBarrierAtomicCounter(); >+ void memoryBarrierBuffer(); >+ void memoryBarrierImage(); >+GROUP END Barrier >+ >+GROUP BEGIN ESSL310CS {"condition": "shaderType == GL_COMPUTE_SHADER"} >+ DEFAULT METADATA {"level": "ESSL3_1_BUILTINS", "op": "auto", "hasSideEffects": true} >+ void barrier(); >+ void memoryBarrierShared(); >+ void groupMemoryBarrier(); >+GROUP END ESSL310CS >+ >+GROUP BEGIN ESSL310GS {"condition": "shaderType == GL_GEOMETRY_SHADER_EXT"} >+ DEFAULT METADATA {"level": "ESSL3_1_BUILTINS", "op": "auto", "extension": "EXT_geometry_shader", "hasSideEffects": true} >+ void EmitVertex(); >+ void EndPrimitive(); >+GROUP END ESSL310GS >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/builtin_symbols_hash_autogen.txt b/Source/ThirdParty/ANGLE/src/compiler/translator/builtin_symbols_hash_autogen.txt >new file mode 100644 >index 00000000000..9a717b41644 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/builtin_symbols_hash_autogen.txt >@@ -0,0 +1 @@ >+0af87b7f37d8a5260c859e9169a91f6a >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/builtin_variables.json b/Source/ThirdParty/ANGLE/src/compiler/translator/builtin_variables.json >new file mode 100644 >index 00000000000..f9461b4bc6b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/builtin_variables.json >@@ -0,0 +1,890 @@ >+{ >+ "General":{ >+ "comment":[ >+ " 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.", >+ "", >+ " The schema of this JSON file is as follows:", >+ "", >+ " The top-level object contains variable groups. Each group can have the following", >+ " properties:", >+ " variables: Object mapping variable names to variable properties.", >+ " subgroups: Object with more groups that fall under the top-level group.", >+ " condition: C++ code determining when these variables should be found from", >+ " the symbol table.", >+ " Each variable can have the following properties:", >+ " level: Symbol table level where the variable is contained.", >+ " type: Object with properties of the type. Can be substituted with initDynamicType.", >+ " initDynamicType: Template string with C++ code for initializing a TType * with the", >+ " name {type_name}. The name will be replaced when generating code.", >+ " May refer to names of previously listed structs or interface", >+ " blocks.", >+ " extension: Optional. Name of the extension where this variable is from.", >+ " value: Optional. String that has one valid value: 'resources'. Denotes that the", >+ " value of the variable should be based on the field of ShBuiltInResources", >+ " with the same name as the variable.", >+ " class: Optional. To be used for interface block or struct definitions. Valid", >+ " values are 'TStructure' or 'TInterfaceBlock'.", >+ " fields: Optional. Object to be used for storing fields of interface block and", >+ " struct definitions. Maps field names to field types.", >+ " suffix: Optional. Suffix to give C++ variables storing the properties of this", >+ " variable a unique name that doesn't conflict with C++ keywords.", >+ " Each type can have the following properties:", >+ " basic: Basic type as in the TBasicType enum without the Ebt prefix.", >+ " precision: Precision as in TPrecision enum without the Ebp prefix.", >+ " qualifier: Optional. Qualifier as in the TQualifier enum without the Evq prefix.", >+ " primarySize: Optional. Vector size or matrix column count.", >+ " secondarySize: Optional. Matrix row count.", >+ " Any group, variable or type can have the property 'comment'." >+ ], >+ "variables":{ >+ "gl_DepthRangeParameters":{ >+ "class":"TStructure", >+ "level":"COMMON_BUILTINS", >+ "fields":{ >+ "near":{ >+ "basic":"Float", >+ "precision":"High" >+ }, >+ "far":{ >+ "basic":"Float", >+ "precision":"High" >+ }, >+ "diff":{ >+ "basic":"Float", >+ "precision":"High" >+ } >+ } >+ }, >+ "gl_DepthRange":{ >+ "level":"COMMON_BUILTINS", >+ "initDynamicType":"TType *{type_name} = new TType(gl_DepthRangeParameters, false); {type_name}->setQualifier(EvqUniform);" >+ } >+ } >+ }, >+ "Constants":{ >+ "variables":{ >+ "gl_MaxVertexAttribs":{ >+ "level":"COMMON_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxVertexUniformVectors":{ >+ "level":"COMMON_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxVertexTextureImageUnits":{ >+ "level":"COMMON_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxCombinedTextureImageUnits":{ >+ "level":"COMMON_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxTextureImageUnits":{ >+ "level":"COMMON_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxFragmentUniformVectors":{ >+ "level":"COMMON_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxVaryingVectors":{ >+ "level":"ESSL1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxDrawBuffers":{ >+ "level":"COMMON_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxDualSourceDrawBuffersEXT":{ >+ "level":"COMMON_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "extension":"EXT_blend_func_extended", >+ "value":"resources", >+ "valueKey":"MaxDualSourceDrawBuffers" >+ }, >+ "gl_MaxVertexOutputVectors":{ >+ "level":"ESSL3_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxFragmentInputVectors":{ >+ "level":"ESSL3_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MinProgramTexelOffset":{ >+ "level":"ESSL3_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxProgramTexelOffset":{ >+ "level":"ESSL3_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxImageUnits":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxVertexImageUniforms":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxFragmentImageUniforms":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxComputeImageUniforms":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxCombinedImageUniforms":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxCombinedShaderOutputResources":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxComputeWorkGroupCount":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"Const", >+ "primarySize":3 >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxComputeWorkGroupSize":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"Const", >+ "primarySize":3 >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxComputeUniformComponents":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxComputeTextureImageUnits":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxComputeAtomicCounters":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxComputeAtomicCounterBuffers":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxVertexAtomicCounters":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxFragmentAtomicCounters":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxCombinedAtomicCounters":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxAtomicCounterBindings":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxVertexAtomicCounterBuffers":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxFragmentAtomicCounterBuffers":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxCombinedAtomicCounterBuffers":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ }, >+ "gl_MaxAtomicCounterBufferSize":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "value":"resources" >+ } >+ }, >+ "subgroups":{ >+ "EXTGeometryShader":{ >+ "variables":{ >+ "gl_MaxGeometryInputComponents":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "extension":"EXT_geometry_shader", >+ "value":"resources" >+ }, >+ "gl_MaxGeometryOutputComponents":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "extension":"EXT_geometry_shader", >+ "value":"resources" >+ }, >+ "gl_MaxGeometryImageUniforms":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "extension":"EXT_geometry_shader", >+ "value":"resources" >+ }, >+ "gl_MaxGeometryTextureImageUnits":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "extension":"EXT_geometry_shader", >+ "value":"resources" >+ }, >+ "gl_MaxGeometryOutputVertices":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "extension":"EXT_geometry_shader", >+ "value":"resources" >+ }, >+ "gl_MaxGeometryTotalOutputComponents":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "extension":"EXT_geometry_shader", >+ "value":"resources" >+ }, >+ "gl_MaxGeometryUniformComponents":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "extension":"EXT_geometry_shader", >+ "value":"resources" >+ }, >+ "gl_MaxGeometryAtomicCounters":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "extension":"EXT_geometry_shader", >+ "value":"resources" >+ }, >+ "gl_MaxGeometryAtomicCounterBuffers":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"Medium", >+ "qualifier":"Const" >+ }, >+ "extension":"EXT_geometry_shader", >+ "value":"resources" >+ } >+ } >+ } >+ } >+ }, >+ "FragShader":{ >+ "condition":"shaderType == GL_FRAGMENT_SHADER", >+ "variables":{ >+ "gl_FragCoord":{ >+ "level":"COMMON_BUILTINS", >+ "type":{ >+ "basic":"Float", >+ "precision":"Medium", >+ "qualifier":"FragCoord", >+ "primarySize":4 >+ } >+ }, >+ "gl_FrontFacing":{ >+ "level":"COMMON_BUILTINS", >+ "type":{ >+ "basic":"Bool", >+ "qualifier":"FrontFacing" >+ } >+ }, >+ "gl_PointCoord":{ >+ "level":"COMMON_BUILTINS", >+ "type":{ >+ "basic":"Float", >+ "precision":"Medium", >+ "qualifier":"PointCoord", >+ "primarySize":2 >+ } >+ }, >+ "gl_FragColor":{ >+ "level":"ESSL1_BUILTINS", >+ "type":{ >+ "basic":"Float", >+ "precision":"Medium", >+ "qualifier":"FragColor", >+ "primarySize":4 >+ } >+ }, >+ "gl_FragData":{ >+ "level":"ESSL1_BUILTINS", >+ "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpMedium, EvqFragData, 4); if (spec != SH_WEBGL2_SPEC && spec != SH_WEBGL3_SPEC) {{ {type_name}->makeArray(resources.MaxDrawBuffers); }} else {{ {type_name}->makeArray(1u); }}" >+ }, >+ "gl_FragDepth":{ >+ "level":"ESSL3_BUILTINS", >+ "type":{ >+ "basic":"Float", >+ "precision":"High", >+ "qualifier":"FragDepth" >+ } >+ } >+ }, >+ "subgroups":{ >+ "EXTBlendFuncExtended":{ >+ "condition":"mResources.EXT_blend_func_extended", >+ "variables":{ >+ "gl_SecondaryFragColorEXT":{ >+ "level":"ESSL1_BUILTINS", >+ "extension":"EXT_blend_func_extended", >+ "type":{ >+ "basic":"Float", >+ "precision":"Medium", >+ "qualifier":"SecondaryFragColorEXT", >+ "primarySize":4 >+ } >+ }, >+ "gl_SecondaryFragDataEXT":{ >+ "level":"ESSL1_BUILTINS", >+ "extension":"EXT_blend_func_extended", >+ "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpMedium, EvqSecondaryFragDataEXT, 4, 1); {type_name}->makeArray(resources.MaxDualSourceDrawBuffers);" >+ } >+ } >+ }, >+ "EXTFragDepth":{ >+ "condition":"mResources.EXT_frag_depth", >+ "variables":{ >+ "gl_FragDepthEXT":{ >+ "level":"ESSL1_BUILTINS", >+ "extension":"EXT_frag_depth", >+ "initDynamicType":"TType *{type_name} = new TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium, EvqFragDepthEXT, 1);" >+ } >+ } >+ }, >+ "EXTShaderFramebufferFetch":{ >+ "condition":"mResources.EXT_shader_framebuffer_fetch", >+ "variables":{ >+ "gl_LastFragData":{ >+ "level":"ESSL1_BUILTINS", >+ "extension":"EXT_shader_framebuffer_fetch", >+ "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpMedium, EvqLastFragData, 4, 1); {type_name}->makeArray(resources.MaxDrawBuffers);" >+ } >+ } >+ }, >+ "NVShaderFramebufferFetch":{ >+ "condition":"mResources.NV_shader_framebuffer_fetch", >+ "variables":{ >+ "gl_LastFragColor":{ >+ "level":"ESSL1_BUILTINS", >+ "extension":"NV_shader_framebuffer_fetch", >+ "type":{ >+ "basic":"Float", >+ "precision":"Medium", >+ "qualifier":"LastFragColor", >+ "primarySize":4 >+ } >+ }, >+ "gl_LastFragData":{ >+ "level":"ESSL1_BUILTINS", >+ "suffix":"NV", >+ "extension":"NV_shader_framebuffer_fetch", >+ "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpMedium, EvqLastFragData, 4, 1); {type_name}->makeArray(resources.MaxDrawBuffers);" >+ } >+ } >+ }, >+ "ARMShaderFramebufferFetch":{ >+ "condition":"!mResources.EXT_shader_framebuffer_fetch && !mResources.NV_shader_framebuffer_fetch && mResources.ARM_shader_framebuffer_fetch", >+ "variables":{ >+ "gl_LastFragColorARM":{ >+ "level":"ESSL1_BUILTINS", >+ "extension":"ARM_shader_framebuffer_fetch", >+ "type":{ >+ "basic":"Float", >+ "precision":"Medium", >+ "qualifier":"LastFragColor", >+ "primarySize":4 >+ } >+ } >+ } >+ }, >+ "GeometryShaderSupported":{ >+ "condition":"mResources.EXT_geometry_shader", >+ "variables":{ >+ "gl_PrimitiveID":{ >+ "level":"ESSL3_1_BUILTINS", >+ "extension":"EXT_geometry_shader", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"PrimitiveID" >+ } >+ }, >+ "gl_Layer":{ >+ "level":"ESSL3_1_BUILTINS", >+ "extension":"EXT_geometry_shader", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"Layer" >+ } >+ } >+ } >+ } >+ } >+ }, >+ "VertexShader":{ >+ "condition":"shaderType == GL_VERTEX_SHADER", >+ "variables":{ >+ "gl_Position":{ >+ "level":"COMMON_BUILTINS", >+ "type":{ >+ "basic":"Float", >+ "precision":"High", >+ "qualifier":"Position", >+ "primarySize":4 >+ } >+ }, >+ "gl_PointSize":{ >+ "level":"COMMON_BUILTINS", >+ "type":{ >+ "basic":"Float", >+ "precision":"Medium", >+ "qualifier":"PointSize" >+ } >+ }, >+ "gl_InstanceID":{ >+ "level":"ESSL3_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"InstanceID" >+ } >+ }, >+ "gl_VertexID":{ >+ "level":"ESSL3_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"VertexID" >+ } >+ }, >+ "gl_ViewportIndex":{ >+ "comment":"For internal use by ANGLE - not exposed to the parser.", >+ "level":"GLSL_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"ViewportIndex" >+ } >+ }, >+ "gl_Layer":{ >+ "suffix":"VS", >+ "comment":"gl_Layer exists in other shader stages in ESSL, but not in vertex shader so far.", >+ "level":"GLSL_BUILTINS", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"Layer" >+ } >+ } >+ }, >+ "subgroups":{ >+ "ANGLEMultiDraw":{ >+ "condition": "mResources.ANGLE_multi_draw", >+ "subgroups":{ >+ "ESSL3":{ >+ "variables":{ >+ "gl_DrawID":{ >+ "level":"ESSL3_BUILTINS", >+ "extension":"ANGLE_multi_draw", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"DrawID" >+ } >+ } >+ } >+ }, >+ "ESSL1":{ >+ "variables":{ >+ "gl_DrawID":{ >+ "suffix":"ESSL1", >+ "level":"ESSL1_BUILTINS", >+ "extension":"ANGLE_multi_draw", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"DrawID" >+ } >+ } >+ } >+ } >+ } >+ >+ } >+ } >+ }, >+ "ComputeShader":{ >+ "condition":"shaderType == GL_COMPUTE_SHADER", >+ "variables":{ >+ "gl_NumWorkGroups":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"UInt", >+ "precision":"Undefined", >+ "qualifier":"NumWorkGroups", >+ "primarySize":3 >+ } >+ }, >+ "gl_WorkGroupSize":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"UInt", >+ "precision":"Undefined", >+ "qualifier":"WorkGroupSize", >+ "primarySize":3 >+ } >+ }, >+ "gl_WorkGroupID":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"UInt", >+ "precision":"Undefined", >+ "qualifier":"WorkGroupID", >+ "primarySize":3 >+ } >+ }, >+ "gl_LocalInvocationID":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"UInt", >+ "precision":"Undefined", >+ "qualifier":"LocalInvocationID", >+ "primarySize":3 >+ } >+ }, >+ "gl_GlobalInvocationID":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"UInt", >+ "precision":"Undefined", >+ "qualifier":"GlobalInvocationID", >+ "primarySize":3 >+ } >+ }, >+ "gl_LocalInvocationIndex":{ >+ "level":"ESSL3_1_BUILTINS", >+ "type":{ >+ "basic":"UInt", >+ "precision":"Undefined", >+ "qualifier":"LocalInvocationIndex" >+ } >+ } >+ } >+ }, >+ "GeometryShader":{ >+ "condition":"shaderType == GL_GEOMETRY_SHADER_EXT", >+ "variables":{ >+ "gl_PrimitiveIDIn":{ >+ "level":"ESSL3_1_BUILTINS", >+ "extension":"EXT_geometry_shader", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"PrimitiveIDIn" >+ } >+ }, >+ "gl_InvocationID":{ >+ "level":"ESSL3_1_BUILTINS", >+ "extension":"EXT_geometry_shader", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"InvocationID" >+ } >+ }, >+ "gl_PrimitiveID":{ >+ "suffix":"GS", >+ "level":"ESSL3_1_BUILTINS", >+ "extension":"EXT_geometry_shader", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"PrimitiveID" >+ } >+ }, >+ "gl_Layer":{ >+ "suffix":"GS", >+ "level":"ESSL3_1_BUILTINS", >+ "extension":"EXT_geometry_shader", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"Layer" >+ } >+ }, >+ "gl_PerVertex":{ >+ "level":"ESSL3_1_BUILTINS", >+ "extension":"EXT_geometry_shader", >+ "class":"TInterfaceBlock", >+ "fields":{ >+ "gl_Position":{ >+ "basic":"Float", >+ "precision":"High", >+ "qualifier":"Position", >+ "primarySize":4 >+ } >+ } >+ }, >+ "gl_in":{ >+ "level":"ESSL3_1_BUILTINS", >+ "extension":"EXT_geometry_shader", >+ "initDynamicType":"TType *{type_name} = new TType(gl_PerVertex, EvqPerVertexIn, TLayoutQualifier::Create()); {type_name}->makeArray(0u);", >+ "comment":"The array size of gl_in is undefined until we get a valid input primitive declaration." >+ } >+ }, >+ "subgroups":{ >+ "Out":{ >+ "variables":{ >+ "gl_PerVertex":{ >+ "suffix":"OutBlock", >+ "level":"ESSL3_1_BUILTINS", >+ "extension":"EXT_geometry_shader", >+ "private":true, >+ "class":"TInterfaceBlock", >+ "fields":{ >+ "gl_Position":{ >+ "basic":"Float", >+ "precision":"High", >+ "qualifier":"Position", >+ "primarySize":4 >+ } >+ } >+ }, >+ "gl_Position":{ >+ "suffix":"GS", >+ "level":"ESSL3_1_BUILTINS", >+ "extension":"EXT_geometry_shader", >+ "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqPosition, 4); {type_name}->setInterfaceBlock(gl_PerVertexOutBlock);" >+ } >+ } >+ } >+ } >+ }, >+ "Multiview":{ >+ "condition":"mResources.OVR_multiview2 && shaderType != GL_COMPUTE_SHADER", >+ "subgroups":{ >+ "ESSL3":{ >+ "variables":{ >+ "gl_ViewID_OVR":{ >+ "level":"ESSL3_BUILTINS", >+ "extension":"OVR_multiview2", >+ "type":{ >+ "basic":"UInt", >+ "precision":"High", >+ "qualifier":"ViewIDOVR" >+ } >+ } >+ } >+ }, >+ "ESSL1":{ >+ "variables":{ >+ "gl_ViewID_OVR":{ >+ "suffix":"ESSL1", >+ "level":"ESSL1_BUILTINS", >+ "extension":"OVR_multiview2", >+ "type":{ >+ "basic":"Int", >+ "precision":"High", >+ "qualifier":"ViewIDOVR" >+ } >+ } >+ } >+ } >+ } >+ } >+} >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/emulated_builtin_function_data_hlsl.json b/Source/ThirdParty/ANGLE/src/compiler/translator/emulated_builtin_function_data_hlsl.json >index 32e500fe67a..99d24ef3c18 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/emulated_builtin_function_data_hlsl.json >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/emulated_builtin_function_data_hlsl.json >@@ -1378,5 +1378,48 @@ > "borrow = uint4(x < y);", > "return x - y;" > ] >+ }, >+ { >+ "comment":[ >+ "We emulate tanh just to avoid overflow on large arguments." >+ ], >+ "op":"tanh", >+ "return_type":"float", >+ "args":[ >+ "float x" >+ ], >+ "body":[ >+ "return (abs(x) > 15.0) ? sign(x) : tanh(x);" >+ ] >+ }, >+ { >+ "op":"tanh", >+ "return_type":"float2", >+ "args":[ >+ "float2 x" >+ ], >+ "body":[ >+ "return (abs(x) > 15.0) ? sign(x) : tanh(x);" >+ ] >+ }, >+ { >+ "op":"tanh", >+ "return_type":"float3", >+ "args":[ >+ "float3 x" >+ ], >+ "body":[ >+ "return (abs(x) > 15.0) ? sign(x) : tanh(x);" >+ ] >+ }, >+ { >+ "op":"tanh", >+ "return_type":"float4", >+ "args":[ >+ "float4 x" >+ ], >+ "body":[ >+ "return (abs(x) > 15.0) ? sign(x) : tanh(x);" >+ ] > } > ] >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp >index 288da5e0f58..c61e77a110e 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp >@@ -2,7 +2,7 @@ > // Generated by gen_emulated_builtin_function_tables.py using data from > // emulated_builtin_function_data_hlsl.json. > // >-// Copyright 2017 The ANGLE Project Authors. All rights reserved. >+// 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. > // >@@ -10,6 +10,7 @@ > // HLSL code for emulating GLSL builtin functions not present in HLSL. > > #include "compiler/translator/BuiltInFunctionEmulator.h" >+#include "compiler/translator/tree_util/BuiltIn_autogen.h" > > namespace sh > { >@@ -19,51 +20,51 @@ namespace > > struct FunctionPair > { >- constexpr FunctionPair(const MiniFunctionId &idIn, const char *bodyIn) : id(idIn), body(bodyIn) >- { >- } >+ constexpr FunctionPair(const TSymbolUniqueId &idIn, const char *bodyIn) >+ : id(idIn.get()), body(bodyIn) >+ {} > >- MiniFunctionId id; >+ int id; > const char *body; > }; > > constexpr FunctionPair g_hlslFunctions[] = { >- {{EOpMod, ParamType::Float1, ParamType::Float1}, >+ {BuiltInId::mod_Float1_Float1, > "float mod_emu(float x, float y)\n" > "{\n" > " return x - y * floor(x / y);\n" > "}\n"}, >- {{EOpMod, ParamType::Float2, ParamType::Float2}, >+ {BuiltInId::mod_Float2_Float2, > "float2 mod_emu(float2 x, float2 y)\n" > "{\n" > " return x - y * floor(x / y);\n" > "}\n"}, >- {{EOpMod, ParamType::Float2, ParamType::Float1}, >+ {BuiltInId::mod_Float2_Float1, > "float2 mod_emu(float2 x, float y)\n" > "{\n" > " return x - y * floor(x / y);\n" > "}\n"}, >- {{EOpMod, ParamType::Float3, ParamType::Float3}, >+ {BuiltInId::mod_Float3_Float3, > "float3 mod_emu(float3 x, float3 y)\n" > "{\n" > " return x - y * floor(x / y);\n" > "}\n"}, >- {{EOpMod, ParamType::Float3, ParamType::Float1}, >+ {BuiltInId::mod_Float3_Float1, > "float3 mod_emu(float3 x, float y)\n" > "{\n" > " return x - y * floor(x / y);\n" > "}\n"}, >- {{EOpMod, ParamType::Float4, ParamType::Float4}, >+ {BuiltInId::mod_Float4_Float4, > "float4 mod_emu(float4 x, float4 y)\n" > "{\n" > " return x - y * floor(x / y);\n" > "}\n"}, >- {{EOpMod, ParamType::Float4, ParamType::Float1}, >+ {BuiltInId::mod_Float4_Float1, > "float4 mod_emu(float4 x, float y)\n" > "{\n" > " return x - y * floor(x / y);\n" > "}\n"}, >- {{EOpFrexp, ParamType::Float1, ParamType::Int1}, >+ {BuiltInId::frexp_Float1_Int1, > "float frexp_emu(float x, out int exp)\n" > "{\n" > " float fexp;\n" >@@ -71,7 +72,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " exp = int(fexp);\n" > " return mantissa;\n" > "}\n"}, >- {{EOpFrexp, ParamType::Float2, ParamType::Int2}, >+ {BuiltInId::frexp_Float2_Int2, > "float2 frexp_emu(float2 x, out int2 exp)\n" > "{\n" > " float2 fexp;\n" >@@ -79,7 +80,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " exp = int2(fexp);\n" > " return mantissa;\n" > "}\n"}, >- {{EOpFrexp, ParamType::Float3, ParamType::Int3}, >+ {BuiltInId::frexp_Float3_Int3, > "float3 frexp_emu(float3 x, out int3 exp)\n" > "{\n" > " float3 fexp;\n" >@@ -87,7 +88,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " exp = int3(fexp);\n" > " return mantissa;\n" > "}\n"}, >- {{EOpFrexp, ParamType::Float4, ParamType::Int4}, >+ {BuiltInId::frexp_Float4_Int4, > "float4 frexp_emu(float4 x, out int4 exp)\n" > "{\n" > " float4 fexp;\n" >@@ -95,27 +96,27 @@ constexpr FunctionPair g_hlslFunctions[] = { > " exp = int4(fexp);\n" > " return mantissa;\n" > "}\n"}, >- {{EOpLdexp, ParamType::Float1, ParamType::Int1}, >+ {BuiltInId::ldexp_Float1_Int1, > "float ldexp_emu(float x, int exp)\n" > "{\n" > " return ldexp(x, float(exp));\n" > "}\n"}, >- {{EOpLdexp, ParamType::Float2, ParamType::Int2}, >+ {BuiltInId::ldexp_Float2_Int2, > "float2 ldexp_emu(float2 x, int2 exp)\n" > "{\n" > " return ldexp(x, float2(exp));\n" > "}\n"}, >- {{EOpLdexp, ParamType::Float3, ParamType::Int3}, >+ {BuiltInId::ldexp_Float3_Int3, > "float3 ldexp_emu(float3 x, int3 exp)\n" > "{\n" > " return ldexp(x, float3(exp));\n" > "}\n"}, >- {{EOpLdexp, ParamType::Float4, ParamType::Int4}, >+ {BuiltInId::ldexp_Float4_Int4, > "float4 ldexp_emu(float4 x, int4 exp)\n" > "{\n" > " return ldexp(x, float4(exp));\n" > "}\n"}, >- {{EOpFaceforward, ParamType::Float1, ParamType::Float1, ParamType::Float1}, >+ {BuiltInId::faceforward_Float1_Float1_Float1, > "float faceforward_emu(float N, float I, float Nref)\n" > "{\n" > " if(dot(Nref, I) >= 0)\n" >@@ -127,7 +128,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " return N;\n" > " }\n" > "}\n"}, >- {{EOpFaceforward, ParamType::Float2, ParamType::Float2, ParamType::Float2}, >+ {BuiltInId::faceforward_Float2_Float2_Float2, > "float2 faceforward_emu(float2 N, float2 I, float2 Nref)\n" > "{\n" > " if(dot(Nref, I) >= 0)\n" >@@ -139,7 +140,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " return N;\n" > " }\n" > "}\n"}, >- {{EOpFaceforward, ParamType::Float3, ParamType::Float3, ParamType::Float3}, >+ {BuiltInId::faceforward_Float3_Float3_Float3, > "float3 faceforward_emu(float3 N, float3 I, float3 Nref)\n" > "{\n" > " if(dot(Nref, I) >= 0)\n" >@@ -151,7 +152,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " return N;\n" > " }\n" > "}\n"}, >- {{EOpFaceforward, ParamType::Float4, ParamType::Float4, ParamType::Float4}, >+ {BuiltInId::faceforward_Float4_Float4_Float4, > "float4 faceforward_emu(float4 N, float4 I, float4 Nref)\n" > "{\n" > " if(dot(Nref, I) >= 0)\n" >@@ -163,20 +164,20 @@ constexpr FunctionPair g_hlslFunctions[] = { > " return N;\n" > " }\n" > "}\n"}, >- {{EOpAtan, ParamType::Float1, ParamType::Float1}, >+ {BuiltInId::atan_Float1_Float1, > "float atan_emu(float y, float x)\n" > "{\n" > " if(x == 0 && y == 0) x = 1;\n" > " return atan2(y, x);\n" > "}\n"}, >- {{EOpAtan, ParamType::Float2, ParamType::Float2}, >+ {BuiltInId::atan_Float2_Float2, > "float2 atan_emu(float2 y, float2 x)\n" > "{\n" > " if(x[0] == 0 && y[0] == 0) x[0] = 1;\n" > " if(x[1] == 0 && y[1] == 0) x[1] = 1;\n" > " return float2(atan2(y[0], x[0]), atan2(y[1], x[1]));\n" > "}\n"}, >- {{EOpAtan, ParamType::Float3, ParamType::Float3}, >+ {BuiltInId::atan_Float3_Float3, > "float3 atan_emu(float3 y, float3 x)\n" > "{\n" > " if(x[0] == 0 && y[0] == 0) x[0] = 1;\n" >@@ -184,7 +185,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " if(x[2] == 0 && y[2] == 0) x[2] = 1;\n" > " return float3(atan2(y[0], x[0]), atan2(y[1], x[1]), atan2(y[2], x[2]));\n" > "}\n"}, >- {{EOpAtan, ParamType::Float4, ParamType::Float4}, >+ {BuiltInId::atan_Float4_Float4, > "float4 atan_emu(float4 y, float4 x)\n" > "{\n" > " if(x[0] == 0 && y[0] == 0) x[0] = 1;\n" >@@ -194,72 +195,72 @@ constexpr FunctionPair g_hlslFunctions[] = { > " return float4(atan2(y[0], x[0]), atan2(y[1], x[1]), atan2(y[2], \n" > " x[2]), atan2(y[3], x[3]));\n" > "}\n"}, >- {{EOpAsinh, ParamType::Float1}, >+ {BuiltInId::asinh_Float1, > "float asinh_emu(in float x)\n" > "{\n" > " return log(x + sqrt(pow(x, 2.0) + 1.0));\n" > "}\n"}, >- {{EOpAsinh, ParamType::Float2}, >+ {BuiltInId::asinh_Float2, > "float2 asinh_emu(in float2 x)\n" > "{\n" > " return log(x + sqrt(pow(x, 2.0) + 1.0));\n" > "}\n"}, >- {{EOpAsinh, ParamType::Float3}, >+ {BuiltInId::asinh_Float3, > "float3 asinh_emu(in float3 x)\n" > "{\n" > " return log(x + sqrt(pow(x, 2.0) + 1.0));\n" > "}\n"}, >- {{EOpAsinh, ParamType::Float4}, >+ {BuiltInId::asinh_Float4, > "float4 asinh_emu(in float4 x)\n" > "{\n" > " return log(x + sqrt(pow(x, 2.0) + 1.0));\n" > "}\n"}, >- {{EOpAcosh, ParamType::Float1}, >+ {BuiltInId::acosh_Float1, > "float acosh_emu(in float x)\n" > "{\n" > " return log(x + sqrt(x + 1.0) * sqrt(x - 1.0));\n" > "}\n"}, >- {{EOpAcosh, ParamType::Float2}, >+ {BuiltInId::acosh_Float2, > "float2 acosh_emu(in float2 x)\n" > "{\n" > " return log(x + sqrt(x + 1.0) * sqrt(x - 1.0));\n" > "}\n"}, >- {{EOpAcosh, ParamType::Float3}, >+ {BuiltInId::acosh_Float3, > "float3 acosh_emu(in float3 x)\n" > "{\n" > " return log(x + sqrt(x + 1.0) * sqrt(x - 1.0));\n" > "}\n"}, >- {{EOpAcosh, ParamType::Float4}, >+ {BuiltInId::acosh_Float4, > "float4 acosh_emu(in float4 x)\n" > "{\n" > " return log(x + sqrt(x + 1.0) * sqrt(x - 1.0));\n" > "}\n"}, >- {{EOpAtanh, ParamType::Float1}, >+ {BuiltInId::atanh_Float1, > "float atanh_emu(in float x)\n" > "{\n" > " return 0.5 * log((1.0 + x) / (1.0 - x));\n" > "}\n"}, >- {{EOpAtanh, ParamType::Float2}, >+ {BuiltInId::atanh_Float2, > "float2 atanh_emu(in float2 x)\n" > "{\n" > " return 0.5 * log((1.0 + x) / (1.0 - x));\n" > "}\n"}, >- {{EOpAtanh, ParamType::Float3}, >+ {BuiltInId::atanh_Float3, > "float3 atanh_emu(in float3 x)\n" > "{\n" > " return 0.5 * log((1.0 + x) / (1.0 - x));\n" > "}\n"}, >- {{EOpAtanh, ParamType::Float4}, >+ {BuiltInId::atanh_Float4, > "float4 atanh_emu(in float4 x)\n" > "{\n" > " return 0.5 * log((1.0 + x) / (1.0 - x));\n" > "}\n"}, >- {{EOpRoundEven, ParamType::Float1}, >+ {BuiltInId::roundEven_Float1, > "float roundEven_emu(in float x)\n" > "{\n" > " return (frac(x) == 0.5 && trunc(x) % 2.0 == 0.0) ? trunc(x) : round(x);\n" > "}\n"}, >- {{EOpRoundEven, ParamType::Float2}, >+ {BuiltInId::roundEven_Float2, > "float2 roundEven_emu(in float2 x)\n" > "{\n" > " float2 v;\n" >@@ -267,7 +268,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " v[1] = (frac(x[1]) == 0.5 && trunc(x[1]) % 2.0 == 0.0) ? trunc(x[1]) : round(x[1]);\n" > " return v;\n" > "}\n"}, >- {{EOpRoundEven, ParamType::Float3}, >+ {BuiltInId::roundEven_Float3, > "float3 roundEven_emu(in float3 x)\n" > "{\n" > " float3 v;\n" >@@ -276,7 +277,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " v[2] = (frac(x[2]) == 0.5 && trunc(x[2]) % 2.0 == 0.0) ? trunc(x[2]) : round(x[2]);\n" > " return v;\n" > "}\n"}, >- {{EOpRoundEven, ParamType::Float4}, >+ {BuiltInId::roundEven_Float4, > "float4 roundEven_emu(in float4 x)\n" > "{\n" > " float4 v;\n" >@@ -286,7 +287,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " v[3] = (frac(x[3]) == 0.5 && trunc(x[3]) % 2.0 == 0.0) ? trunc(x[3]) : round(x[3]);\n" > " return v;\n" > "}\n"}, >- {{EOpPackSnorm2x16, ParamType::Float2}, >+ {BuiltInId::packSnorm2x16_Float2, > "int webgl_toSnorm16(in float x) {\n" > " return int(round(clamp(x, -1.0, 1.0) * 32767.0));\n" > "}\n" >@@ -296,7 +297,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " int y = webgl_toSnorm16(v.y);\n" > " return (asuint(y) << 16) | (asuint(x) & 0xffffu);\n" > "}\n"}, >- {{EOpPackUnorm2x16, ParamType::Float2}, >+ {BuiltInId::packUnorm2x16_Float2, > "uint webgl_toUnorm16(in float x) {\n" > " return uint(round(clamp(x, 0.0, 1.0) * 65535.0));\n" > "}\n" >@@ -306,14 +307,14 @@ constexpr FunctionPair g_hlslFunctions[] = { > " uint y = webgl_toUnorm16(v.y);\n" > " return (y << 16) | x;\n" > "}\n"}, >- {{EOpPackHalf2x16, ParamType::Float2}, >+ {BuiltInId::packHalf2x16_Float2, > "uint packHalf2x16_emu(in float2 v)\n" > "{\n" > " uint x = f32tof16(v.x);\n" > " uint y = f32tof16(v.y);\n" > " return (y << 16) | x;\n" > "}\n"}, >- {{EOpUnpackSnorm2x16, ParamType::Uint1}, >+ {BuiltInId::unpackSnorm2x16_UInt1, > "float webgl_fromSnorm16(in uint x) {\n" > " int xi = asint(x & 0x7fffu) - asint(x & 0x8000u);\n" > " return clamp(float(xi) / 32767.0, -1.0, 1.0);\n" >@@ -324,7 +325,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " uint x = u;\n" > " return float2(webgl_fromSnorm16(x), webgl_fromSnorm16(y));\n" > "}\n"}, >- {{EOpUnpackUnorm2x16, ParamType::Uint1}, >+ {BuiltInId::unpackUnorm2x16_UInt1, > "float webgl_fromUnorm16(in uint x) {\n" > " return float(x) / 65535.0;\n" > "}\n" >@@ -334,14 +335,14 @@ constexpr FunctionPair g_hlslFunctions[] = { > " uint x = u & 0xffffu;\n" > " return float2(webgl_fromUnorm16(x), webgl_fromUnorm16(y));\n" > "}\n"}, >- {{EOpUnpackHalf2x16, ParamType::Uint1}, >+ {BuiltInId::unpackHalf2x16_UInt1, > "float2 unpackHalf2x16_emu(in uint u)\n" > "{\n" > " uint y = (u >> 16);\n" > " uint x = u & 0xffffu;\n" > " return float2(f16tof32(x), f16tof32(y));\n" > "}\n"}, >- {{EOpPackSnorm4x8, ParamType::Float4}, >+ {BuiltInId::packSnorm4x8_Float4, > "int webgl_toSnorm8(in float x) {\n" > " return int(round(clamp(x, -1.0, 1.0) * 127.0));\n" > "}\n" >@@ -354,7 +355,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " return ((asuint(w) & 0xffu) << 24) | ((asuint(z) & 0xffu) << 16) \n" > " | ((asuint(y) & 0xffu) << 8) | (asuint(x) & 0xffu);\n" > "}\n"}, >- {{EOpPackUnorm4x8, ParamType::Float4}, >+ {BuiltInId::packUnorm4x8_Float4, > "uint webgl_toUnorm8(in float x) {\n" > " return uint(round(clamp(x, 0.0, 1.0) * 255.0));\n" > "}\n" >@@ -366,7 +367,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " uint w = webgl_toUnorm8(v.w);\n" > " return (w << 24) | (z << 16) | (y << 8) | x;\n" > "}\n"}, >- {{EOpUnpackSnorm4x8, ParamType::Uint1}, >+ {BuiltInId::unpackSnorm4x8_UInt1, > "float webgl_fromSnorm8(in uint x) {\n" > " int xi = asint(x & 0x7fu) - asint(x & 0x80u);\n" > " return clamp(float(xi) / 127.0, -1.0, 1.0);\n" >@@ -380,7 +381,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " return float4(webgl_fromSnorm8(x), webgl_fromSnorm8(y), \n" > " webgl_fromSnorm8(z), webgl_fromSnorm8(w));\n" > "}\n"}, >- {{EOpUnpackUnorm4x8, ParamType::Uint1}, >+ {BuiltInId::unpackUnorm4x8_UInt1, > "float webgl_fromUnorm8(in uint x) {\n" > " return float(x) / 255.0;\n" > "}\n" >@@ -402,47 +403,47 @@ constexpr FunctionPair g_hlslFunctions[] = { > // transpose(r) and transpose(c) are in a sense free, since to get the > // transpose of r, we simply can build a column matrix out of the original > // vector instead of a row matrix. >- {{EOpOuterProduct, ParamType::Float2, ParamType::Float2}, >+ {BuiltInId::outerProduct_Float2_Float2, > "float2x2 outerProduct_emu(in float2 c, in float2 r)\n" > "{\n" > " return mul(float2x1(r), float1x2(c));\n" > "}\n"}, >- {{EOpOuterProduct, ParamType::Float3, ParamType::Float3}, >+ {BuiltInId::outerProduct_Float3_Float3, > "float3x3 outerProduct_emu(in float3 c, in float3 r)\n" > "{\n" > " return mul(float3x1(r), float1x3(c));\n" > "}\n"}, >- {{EOpOuterProduct, ParamType::Float4, ParamType::Float4}, >+ {BuiltInId::outerProduct_Float4_Float4, > "float4x4 outerProduct_emu(in float4 c, in float4 r)\n" > "{\n" > " return mul(float4x1(r), float1x4(c));\n" > "}\n"}, >- {{EOpOuterProduct, ParamType::Float3, ParamType::Float2}, >+ {BuiltInId::outerProduct_Float3_Float2, > "float2x3 outerProduct_emu(in float3 c, in float2 r)\n" > "{\n" > " return mul(float2x1(r), float1x3(c));\n" > "}\n"}, >- {{EOpOuterProduct, ParamType::Float2, ParamType::Float3}, >+ {BuiltInId::outerProduct_Float2_Float3, > "float3x2 outerProduct_emu(in float2 c, in float3 r)\n" > "{\n" > " return mul(float3x1(r), float1x2(c));\n" > "}\n"}, >- {{EOpOuterProduct, ParamType::Float4, ParamType::Float2}, >+ {BuiltInId::outerProduct_Float4_Float2, > "float2x4 outerProduct_emu(in float4 c, in float2 r)\n" > "{\n" > " return mul(float2x1(r), float1x4(c));\n" > "}\n"}, >- {{EOpOuterProduct, ParamType::Float2, ParamType::Float4}, >+ {BuiltInId::outerProduct_Float2_Float4, > "float4x2 outerProduct_emu(in float2 c, in float4 r)\n" > "{\n" > " return mul(float4x1(r), float1x2(c));\n" > "}\n"}, >- {{EOpOuterProduct, ParamType::Float4, ParamType::Float3}, >+ {BuiltInId::outerProduct_Float4_Float3, > "float3x4 outerProduct_emu(in float4 c, in float3 r)\n" > "{\n" > " return mul(float3x1(r), float1x4(c));\n" > "}\n"}, >- {{EOpOuterProduct, ParamType::Float3, ParamType::Float4}, >+ {BuiltInId::outerProduct_Float3_Float4, > "float4x3 outerProduct_emu(in float3 c, in float4 r)\n" > "{\n" > " return mul(float4x1(r), float1x3(c));\n" >@@ -458,14 +459,14 @@ constexpr FunctionPair g_hlslFunctions[] = { > // which happens to be the cofactor matrix. That's stored in 'cof'. > // We don't need to care about divide-by-zero since results are undefined > // for singular or poorly-conditioned matrices. >- {{EOpInverse, ParamType::Mat2}, >+ {BuiltInId::inverse_Float2x2, > "float2x2 inverse_emu(in float2x2 m)\n" > "{\n" > " float2x2 cof = { m[1][1], -m[0][1], -m[1][0], m[0][0] };\n" > " return cof / determinant(transpose(m));\n" > "}\n"}, > // cofAB is the cofactor for column A and row B. >- {{EOpInverse, ParamType::Mat3}, >+ {BuiltInId::inverse_Float3x3, > "float3x3 inverse_emu(in float3x3 m)\n" > "{\n" > " float cof00 = m[1][1] * m[2][2] - m[2][1] * m[1][2];\n" >@@ -480,7 +481,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " float3x3 cof = { cof00, cof10, cof20, cof01, cof11, cof21, cof02, cof12, cof22 };\n" > " return cof / determinant(transpose(m));\n" > "}\n"}, >- {{EOpInverse, ParamType::Mat4}, >+ {BuiltInId::inverse_Float4x4, > "float4x4 inverse_emu(in float4x4 m)\n" > "{\n" > " float cof00 = m[1][1] * m[2][2] * m[3][3] + m[2][1] * m[3][2] * m[1][3] + m[3][1] * \n" >@@ -556,27 +557,27 @@ constexpr FunctionPair g_hlslFunctions[] = { > // comes from. For a component of 'a' that is false, the corresponding component of 'x' is > // returned. For a component of 'a' that is true, the corresponding component of 'y' is > // returned. >- {{EOpMix, ParamType::Float1, ParamType::Float1, ParamType::Bool1}, >+ {BuiltInId::mix_Float1_Float1_Bool1, > "float mix_emu(float x, float y, bool a)\n" > "{\n" > " return a ? y : x;\n" > "}\n"}, >- {{EOpMix, ParamType::Float2, ParamType::Float2, ParamType::Bool2}, >+ {BuiltInId::mix_Float2_Float2_Bool2, > "float2 mix_emu(float2 x, float2 y, bool2 a)\n" > "{\n" > " return a ? y : x;\n" > "}\n"}, >- {{EOpMix, ParamType::Float3, ParamType::Float3, ParamType::Bool3}, >+ {BuiltInId::mix_Float3_Float3_Bool3, > "float3 mix_emu(float3 x, float3 y, bool3 a)\n" > "{\n" > " return a ? y : x;\n" > "}\n"}, >- {{EOpMix, ParamType::Float4, ParamType::Float4, ParamType::Bool4}, >+ {BuiltInId::mix_Float4_Float4_Bool4, > "float4 mix_emu(float4 x, float4 y, bool4 a)\n" > "{\n" > " return a ? y : x;\n" > "}\n"}, >- {{EOpBitfieldExtract, ParamType::Uint1, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldExtract_UInt1_Int1_Int1, > "uint bitfieldExtract_emu(uint value, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -587,7 +588,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " uint mask = ((maskMsb - 1u) | maskMsb) << offset;\n" > " return (value & mask) >> offset;\n" > "}\n"}, >- {{EOpBitfieldExtract, ParamType::Uint2, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldExtract_UInt2_Int1_Int1, > "uint2 bitfieldExtract_emu(uint2 value, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -598,7 +599,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " uint mask = ((maskMsb - 1u) | maskMsb) << offset;\n" > " return (value & mask) >> offset;\n" > "}\n"}, >- {{EOpBitfieldExtract, ParamType::Uint3, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldExtract_UInt3_Int1_Int1, > "uint3 bitfieldExtract_emu(uint3 value, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -609,7 +610,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " uint mask = ((maskMsb - 1u) | maskMsb) << offset;\n" > " return (value & mask) >> offset;\n" > "}\n"}, >- {{EOpBitfieldExtract, ParamType::Uint4, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldExtract_UInt4_Int1_Int1, > "uint4 bitfieldExtract_emu(uint4 value, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -620,7 +621,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " uint mask = ((maskMsb - 1u) | maskMsb) << offset;\n" > " return (value & mask) >> offset;\n" > "}\n"}, >- {{EOpBitfieldExtract, ParamType::Int1, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldExtract_Int1_Int1_Int1, > "int bitfieldExtract_emu(int value, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -637,7 +638,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " }\n" > " return asint(resultUnsigned);\n" > "}\n"}, >- {{EOpBitfieldExtract, ParamType::Int2, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldExtract_Int2_Int1_Int1, > "int2 bitfieldExtract_emu(int2 value, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -654,7 +655,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " }\n" > " return asint(resultUnsigned);\n" > "}\n"}, >- {{EOpBitfieldExtract, ParamType::Int3, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldExtract_Int3_Int1_Int1, > "int3 bitfieldExtract_emu(int3 value, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -671,7 +672,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " }\n" > " return asint(resultUnsigned);\n" > "}\n"}, >- {{EOpBitfieldExtract, ParamType::Int4, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldExtract_Int4_Int1_Int1, > "int4 bitfieldExtract_emu(int4 value, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -688,7 +689,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " }\n" > " return asint(resultUnsigned);\n" > "}\n"}, >- {{EOpBitfieldInsert, ParamType::Uint1, ParamType::Uint1, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldInsert_UInt1_UInt1_Int1_Int1, > "uint bitfieldInsert_emu(uint base, uint insert, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -700,7 +701,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " uint baseMask = ~insertMask;\n" > " return (base & baseMask) | ((insert << offset) & insertMask);\n" > "}\n"}, >- {{EOpBitfieldInsert, ParamType::Uint2, ParamType::Uint2, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldInsert_UInt2_UInt2_Int1_Int1, > "uint2 bitfieldInsert_emu(uint2 base, uint2 insert, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -712,7 +713,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " uint baseMask = ~insertMask;\n" > " return (base & baseMask) | ((insert << offset) & insertMask);\n" > "}\n"}, >- {{EOpBitfieldInsert, ParamType::Uint3, ParamType::Uint3, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldInsert_UInt3_UInt3_Int1_Int1, > "uint3 bitfieldInsert_emu(uint3 base, uint3 insert, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -724,7 +725,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " uint baseMask = ~insertMask;\n" > " return (base & baseMask) | ((insert << offset) & insertMask);\n" > "}\n"}, >- {{EOpBitfieldInsert, ParamType::Uint4, ParamType::Uint4, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldInsert_UInt4_UInt4_Int1_Int1, > "uint4 bitfieldInsert_emu(uint4 base, uint4 insert, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -736,7 +737,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " uint baseMask = ~insertMask;\n" > " return (base & baseMask) | ((insert << offset) & insertMask);\n" > "}\n"}, >- {{EOpBitfieldInsert, ParamType::Int1, ParamType::Int1, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldInsert_Int1_Int1_Int1_Int1, > "int bitfieldInsert_emu(int base, int insert, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -750,7 +751,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " insertMask);\n" > " return asint(resultUnsigned);\n" > "}\n"}, >- {{EOpBitfieldInsert, ParamType::Int2, ParamType::Int2, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldInsert_Int2_Int2_Int1_Int1, > "int2 bitfieldInsert_emu(int2 base, int2 insert, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -764,7 +765,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " insertMask);\n" > " return asint(resultUnsigned);\n" > "}\n"}, >- {{EOpBitfieldInsert, ParamType::Int3, ParamType::Int3, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldInsert_Int3_Int3_Int1_Int1, > "int3 bitfieldInsert_emu(int3 base, int3 insert, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -778,7 +779,7 @@ constexpr FunctionPair g_hlslFunctions[] = { > " insertMask);\n" > " return asint(resultUnsigned);\n" > "}\n"}, >- {{EOpBitfieldInsert, ParamType::Int4, ParamType::Int4, ParamType::Int1, ParamType::Int1}, >+ {BuiltInId::bitfieldInsert_Int4_Int4_Int1_Int1, > "int4 bitfieldInsert_emu(int4 base, int4 insert, int offset, int bits)\n" > "{\n" > " if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)\n" >@@ -792,63 +793,84 @@ constexpr FunctionPair g_hlslFunctions[] = { > " insertMask);\n" > " return asint(resultUnsigned);\n" > "}\n"}, >- {{EOpUaddCarry, ParamType::Uint1, ParamType::Uint1, ParamType::Uint1}, >+ {BuiltInId::uaddCarry_UInt1_UInt1_UInt1, > "uint uaddCarry_emu(uint x, uint y, out uint carry)\n" > "{\n" > " carry = uint(x > (0xffffffffu - y));\n" > " return x + y;\n" > "}\n"}, >- {{EOpUaddCarry, ParamType::Uint2, ParamType::Uint2, ParamType::Uint2}, >+ {BuiltInId::uaddCarry_UInt2_UInt2_UInt2, > "uint2 uaddCarry_emu(uint2 x, uint2 y, out uint2 carry)\n" > "{\n" > " carry = uint2(x > (0xffffffffu - y));\n" > " return x + y;\n" > "}\n"}, >- {{EOpUaddCarry, ParamType::Uint3, ParamType::Uint3, ParamType::Uint3}, >+ {BuiltInId::uaddCarry_UInt3_UInt3_UInt3, > "uint3 uaddCarry_emu(uint3 x, uint3 y, out uint3 carry)\n" > "{\n" > " carry = uint3(x > (0xffffffffu - y));\n" > " return x + y;\n" > "}\n"}, >- {{EOpUaddCarry, ParamType::Uint4, ParamType::Uint4, ParamType::Uint4}, >+ {BuiltInId::uaddCarry_UInt4_UInt4_UInt4, > "uint4 uaddCarry_emu(uint4 x, uint4 y, out uint4 carry)\n" > "{\n" > " carry = uint4(x > (0xffffffffu - y));\n" > " return x + y;\n" > "}\n"}, >- {{EOpUsubBorrow, ParamType::Uint1, ParamType::Uint1, ParamType::Uint1}, >+ {BuiltInId::usubBorrow_UInt1_UInt1_UInt1, > "uint usubBorrow_emu(uint x, uint y, out uint borrow)\n" > "{\n" > " borrow = uint(x < y);\n" > " return x - y;\n" > "}\n"}, >- {{EOpUsubBorrow, ParamType::Uint2, ParamType::Uint2, ParamType::Uint2}, >+ {BuiltInId::usubBorrow_UInt2_UInt2_UInt2, > "uint2 usubBorrow_emu(uint2 x, uint2 y, out uint2 borrow)\n" > "{\n" > " borrow = uint2(x < y);\n" > " return x - y;\n" > "}\n"}, >- {{EOpUsubBorrow, ParamType::Uint3, ParamType::Uint3, ParamType::Uint3}, >+ {BuiltInId::usubBorrow_UInt3_UInt3_UInt3, > "uint3 usubBorrow_emu(uint3 x, uint3 y, out uint3 borrow)\n" > "{\n" > " borrow = uint3(x < y);\n" > " return x - y;\n" > "}\n"}, >- {{EOpUsubBorrow, ParamType::Uint4, ParamType::Uint4, ParamType::Uint4}, >+ {BuiltInId::usubBorrow_UInt4_UInt4_UInt4, > "uint4 usubBorrow_emu(uint4 x, uint4 y, out uint4 borrow)\n" > "{\n" > " borrow = uint4(x < y);\n" > " return x - y;\n" > "}\n"}, >+ // We emulate tanh just to avoid overflow on large arguments. >+ {BuiltInId::tanh_Float1, >+ "float tanh_emu(float x)\n" >+ "{\n" >+ " return (abs(x) > 15.0) ? sign(x) : tanh(x);\n" >+ "}\n"}, >+ {BuiltInId::tanh_Float2, >+ "float2 tanh_emu(float2 x)\n" >+ "{\n" >+ " return (abs(x) > 15.0) ? sign(x) : tanh(x);\n" >+ "}\n"}, >+ {BuiltInId::tanh_Float3, >+ "float3 tanh_emu(float3 x)\n" >+ "{\n" >+ " return (abs(x) > 15.0) ? sign(x) : tanh(x);\n" >+ "}\n"}, >+ {BuiltInId::tanh_Float4, >+ "float4 tanh_emu(float4 x)\n" >+ "{\n" >+ " return (abs(x) > 15.0) ? sign(x) : tanh(x);\n" >+ "}\n"}, > }; > } // anonymous namespace > >-const char *FindHLSLFunction(const FunctionId &functionID) >+const char *FindHLSLFunction(int uniqueId) > { > for (size_t index = 0; index < ArraySize(g_hlslFunctions); ++index) > { > const auto &function = g_hlslFunctions[index]; >- if (function.id == functionID) >+ if (function.id == uniqueId) > { > return function.body; > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/gen_builtin_symbols.py b/Source/ThirdParty/ANGLE/src/compiler/translator/gen_builtin_symbols.py >new file mode 100644 >index 00000000000..ff14b0a73e6 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/gen_builtin_symbols.py >@@ -0,0 +1,1403 @@ >+#!/usr/bin/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. >+# >+# gen_builtin_symbols.py: >+# Code generation for the built-in symbol tables. >+ >+from collections import OrderedDict >+from datetime import date >+import argparse >+import hashlib >+import json >+import re >+import os >+import sys >+ >+template_immutablestringtest_cpp = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {function_data_source_name}. >+// >+// Copyright {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. >+// >+// ImmutableString_test_autogen.cpp: >+// Tests for matching script-generated hashes with runtime computed hashes. >+ >+#include "compiler/translator/ImmutableString.h" >+#include "gtest/gtest.h" >+ >+namespace sh >+{{ >+ >+TEST(ImmutableStringTest, ScriptGeneratedHashesMatch) >+{{ >+{script_generated_hash_tests} >+}} >+ >+}} // namespace sh >+""" >+ >+# The header file has a "get" function for each variable. They are used in traversers. >+# It also declares id values of built-ins with human readable names, so they can be used to identify built-ins. >+template_builtin_header = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {variable_data_source_name} and >+// {function_data_source_name}. >+// >+// Copyright {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. >+// >+// BuiltIn_autogen.h: >+// Compile-time initialized built-ins. >+ >+#ifndef COMPILER_TRANSLATOR_TREEUTIL_BUILTIN_AUTOGEN_H_ >+#define COMPILER_TRANSLATOR_TREEUTIL_BUILTIN_AUTOGEN_H_ >+ >+#include "compiler/translator/SymbolUniqueId.h" >+ >+namespace sh >+{{ >+ >+class TVariable; >+ >+class BuiltInId >+{{ >+public: >+ >+{builtin_id_declarations} >+ >+}}; // class BuiltInId >+ >+namespace BuiltInVariable >+{{ >+ >+{get_variable_declarations} >+ >+}} // namespace BuiltInVariable >+ >+}} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEUTIL_BUILTIN_AUTOGEN_H_ >+""" >+ >+template_symboltable_h = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {variable_data_source_name} and >+// {function_data_source_name}. >+// >+// Copyright {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. >+// >+// SymbolTable_autogen.h: >+// Autogenerated member variables of TSymbolTable. >+ >+#ifndef COMPILER_TRANSLATOR_SYMBOLTABLE_AUTOGEN_H_ >+#define COMPILER_TRANSLATOR_SYMBOLTABLE_AUTOGEN_H_ >+ >+namespace sh >+{{ >+ >+class TSymbolTableBase >+{{ >+ protected: >+ TSymbolTableBase() = default; >+{declare_member_variables} >+}}; >+ >+}} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_SYMBOLTABLE_AUTOGEN_H_ >+""" >+ >+# By having the variables defined in a cpp file we ensure that there's just one instance of each of the declared variables. >+template_symboltable_cpp = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {variable_data_source_name} and >+// {function_data_source_name}. >+// >+// Copyright {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. >+// >+// SymbolTable_autogen.cpp: >+// Compile-time initialized built-ins. >+ >+#include "compiler/translator/SymbolTable.h" >+ >+#include "angle_gl.h" >+#include "compiler/translator/tree_util/BuiltIn_autogen.h" >+#include "compiler/translator/ImmutableString.h" >+#include "compiler/translator/StaticType.h" >+#include "compiler/translator/Symbol.h" >+#include "compiler/translator/SymbolTable.h" >+ >+namespace sh >+{{ >+ >+// Since some of the BuiltInId declarations are used outside of constexpr expressions, we need to >+// have these definitions without an initializer. C++17 should eventually remove the need for this. >+{builtin_id_definitions} >+ >+const int TSymbolTable::kLastBuiltInId = {last_builtin_id}; >+ >+namespace BuiltInName >+{{ >+ >+constexpr const ImmutableString _empty(""); >+{name_declarations} >+ >+}} // namespace BuiltInName >+ >+// TODO(oetuaho): Would be nice to make this a class instead of a namespace so that we could friend >+// this from TVariable. Now symbol constructors taking an id have to be public even though they're >+// not supposed to be accessible from outside of here. http://anglebug.com/2390 >+namespace BuiltInVariable >+{{ >+ >+{variable_declarations} >+ >+{get_variable_definitions} >+ >+}} // namespace BuiltInVariable >+ >+namespace BuiltInParameters >+{{ >+ >+{parameter_declarations} >+ >+}} // namespace BuiltInParameters >+ >+namespace UnmangledBuiltIns >+{{ >+ >+{unmangled_builtin_declarations} >+ >+}} // namespace UnmangledBuiltIns >+ >+// TODO(oetuaho): Would be nice to make this a class instead of a namespace so that we could friend >+// this from TFunction. Now symbol constructors taking an id have to be public even though they're >+// not supposed to be accessible from outside of here. http://anglebug.com/2390 >+namespace BuiltInFunction >+{{ >+ >+{function_declarations} >+ >+}} // namespace BuiltInFunction >+ >+void TSymbolTable::initializeBuiltInVariables(sh::GLenum shaderType, >+ ShShaderSpec spec, >+ const ShBuiltInResources &resources) >+{{ >+ const TSourceLoc zeroSourceLoc = {{0, 0, 0, 0}}; >+{init_member_variables} >+}} >+ >+const TSymbol *TSymbolTable::findBuiltIn(const ImmutableString &name, >+ int shaderVersion) const >+{{ >+ if (name.length() > {max_mangled_name_length}) >+ {{ >+ return nullptr; >+ }} >+ uint32_t nameHash = name.mangledNameHash(); >+ if ((nameHash >> 31) != 0) >+ {{ >+ // The name contains [ or {{. >+ return nullptr; >+ }} >+{get_builtin} >+}} >+ >+const UnmangledBuiltIn *TSymbolTable::getUnmangledBuiltInForShaderVersion(const ImmutableString &name, int shaderVersion) >+{{ >+ if (name.length() > {max_unmangled_name_length}) >+ {{ >+ return nullptr; >+ }} >+ uint32_t nameHash = name.mangledNameHash(); >+{get_unmangled_builtin} >+}} >+ >+}} // namespace sh >+""" >+ >+template_parsecontext_header = """// GENERATED FILE - DO NOT EDIT. >+// Generated by {script_name} using data from {variable_data_source_name} and >+// {function_data_source_name}. >+// >+// Copyright {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. >+// >+// ParseContext_autogen.h: >+// Helpers for built-in related checks. >+ >+#ifndef COMPILER_TRANSLATOR_PARSECONTEXT_AUTOGEN_H_ >+#define COMPILER_TRANSLATOR_PARSECONTEXT_AUTOGEN_H_ >+ >+namespace sh >+{{ >+ >+namespace BuiltInGroup >+{{ >+ >+{is_in_group_definitions} >+ >+}} // namespace BuiltInGroup >+ >+}} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_PARSECONTEXT_AUTOGEN_H_ >+ >+""" >+ >+parsed_variables = None >+ >+basic_types_enumeration = [ >+ 'Void', >+ 'Float', >+ 'Int', >+ 'UInt', >+ 'Bool', >+ 'AtomicCounter', >+ 'YuvCscStandardEXT', >+ 'Sampler2D', >+ 'Sampler3D', >+ 'SamplerCube', >+ 'Sampler2DArray', >+ 'SamplerExternalOES', >+ 'SamplerExternal2DY2YEXT', >+ 'Sampler2DRect', >+ 'Sampler2DMS', >+ 'Sampler2DMSArray', >+ 'ISampler2D', >+ 'ISampler3D', >+ 'ISamplerCube', >+ 'ISampler2DArray', >+ 'ISampler2DMS', >+ 'ISampler2DMSArray', >+ 'USampler2D', >+ 'USampler3D', >+ 'USamplerCube', >+ 'USampler2DArray', >+ 'USampler2DMS', >+ 'USampler2DMSArray', >+ 'Sampler2DShadow', >+ 'SamplerCubeShadow', >+ 'Sampler2DArrayShadow', >+ 'Image2D', >+ 'IImage2D', >+ 'UImage2D', >+ 'Image3D', >+ 'IImage3D', >+ 'UImage3D', >+ 'Image2DArray', >+ 'IImage2DArray', >+ 'UImage2DArray', >+ 'ImageCube', >+ 'IImageCube', >+ 'UImageCube' >+] >+ >+id_counter = 0 >+ >+def set_working_dir(): >+ script_dir = os.path.dirname(os.path.abspath(__file__)) >+ os.chdir(script_dir) >+ >+def get_basic_mangled_name(basic): >+ index = basic_types_enumeration.index(basic) >+ if index < 26: >+ return chr(ord('A') + index) >+ return chr(ord('a') + index - 26) >+ >+levels = ['ESSL3_1_BUILTINS', 'ESSL3_BUILTINS', 'ESSL1_BUILTINS', 'COMMON_BUILTINS'] >+ >+def get_shader_version_condition_for_level(level): >+ if level == 'ESSL3_1_BUILTINS': >+ return 'shaderVersion >= 310' >+ elif level == 'ESSL3_BUILTINS': >+ return 'shaderVersion >= 300' >+ elif level == 'ESSL1_BUILTINS': >+ return 'shaderVersion == 100' >+ elif level == 'COMMON_BUILTINS': >+ return '' >+ else: >+ raise Exception('Unsupported symbol table level') >+ >+class GroupedList: >+ """"Class for storing a list of objects grouped by symbol table level and condition.""" >+ def __init__(self): >+ self.objs = OrderedDict() >+ self.max_name_length = 0 >+ # We need to add all the levels here instead of lazily since they must be in a specific order. >+ for l in levels: >+ self.objs[l] = OrderedDict() >+ >+ def add_obj(self, level, condition, name, obj): >+ if (level not in levels): >+ raise Exception('Unexpected level: ' + str(level)) >+ if condition not in self.objs[level]: >+ self.objs[level][condition] = OrderedDict() >+ self.objs[level][condition][name] = obj >+ if len(name) > self.max_name_length: >+ self.max_name_length = len(name) >+ >+ def has_key(self, level, condition, name): >+ if (level not in levels): >+ raise Exception('Unexpected level: ' + str(level)) >+ if condition not in self.objs[level]: >+ return False >+ return (name in self.objs[level][condition]) >+ >+ def get(self, level, condition, name): >+ if self.has_key(level, condition, name): >+ return self.objs[level][condition][name] >+ return None >+ >+ def get_max_name_length(self): >+ return self.max_name_length >+ >+ def get_switch_code(self, script_generated_hash_tests): >+ code = [] >+ for level in levels: >+ if len(self.objs[level]) == 0: >+ continue >+ level_condition = get_shader_version_condition_for_level(level) >+ if level_condition != '': >+ code.append('if ({condition})\n {{'.format(condition = level_condition)) >+ >+ for condition, objs in self.objs[level].iteritems(): >+ if len(objs) > 0: >+ if condition != 'NO_CONDITION': >+ condition_header = ' if ({condition})\n {{'.format(condition = condition) >+ code.append(condition_header.replace('shaderType', 'mShaderType')) >+ >+ switch = {} >+ for name, obj in objs.iteritems(): >+ name_hash = mangledNameHash(name, script_generated_hash_tests) >+ if name_hash not in switch: >+ switch[name_hash] = [] >+ switch[name_hash].append(obj['hash_matched_code']) >+ >+ code.append('switch(nameHash) {') >+ for name_hash, obj in sorted(switch.iteritems()): >+ code.append('case 0x' + ('%08x' % name_hash) + 'u:\n{') >+ code += obj >+ code.append('break;\n}') >+ code.append('}') >+ >+ if condition != 'NO_CONDITION': >+ code.append('}') >+ >+ if level_condition != '': >+ code.append('}') >+ code.append('return nullptr;') >+ return '\n'.join(code) >+ >+class TType: >+ def __init__(self, glsl_header_type): >+ if isinstance(glsl_header_type, basestring): >+ self.data = self.parse_type(glsl_header_type) >+ else: >+ self.data = glsl_header_type >+ self.normalize() >+ >+ def normalize(self): >+ # Note that this will set primarySize and secondarySize also on genTypes. In that case they >+ # are overridden when the specific types are generated. >+ if 'primarySize' not in self.data: >+ if ('secondarySize' in self.data): >+ raise Exception('Unexpected secondarySize on type that does not have primarySize set') >+ self.data['primarySize'] = 1 >+ if 'secondarySize' not in self.data: >+ self.data['secondarySize'] = 1 >+ if 'precision' not in self.data: >+ self.data['precision'] = 'Undefined' >+ if 'qualifier' not in self.data: >+ self.data['qualifier'] = 'Global' >+ >+ def get_statictype_string(self): >+ template_type = 'StaticType::Get<Ebt{basic}, Ebp{precision}, Evq{qualifier}, {primarySize}, {secondarySize}>()' >+ return template_type.format(**self.data) >+ >+ def get_dynamic_type_string(self): >+ template_type = 'new TType(Ebt{basic}, Ebp{precision}, Evq{qualifier}, {primarySize}, {secondarySize})' >+ return template_type.format(**self.data) >+ >+ def get_mangled_name(self): >+ mangled_name = '' >+ >+ size_key = (self.data['secondarySize'] - 1) * 4 + self.data['primarySize'] - 1 >+ if size_key < 10: >+ mangled_name += chr(ord('0') + size_key) >+ else: >+ mangled_name += chr(ord('A') + size_key - 10) >+ >+ mangled_name += get_basic_mangled_name(self.data['basic']) >+ return mangled_name >+ >+ def get_human_readable_name(self): >+ name = self.data['basic'] >+ name += str(self.data['primarySize']) >+ if self.data['secondarySize'] > 1: >+ name += 'x' + str(self.data['secondarySize']) >+ return name >+ >+ def is_vector(self): >+ return self.data['primarySize'] > 1 and self.data['secondarySize'] == 1 >+ >+ def is_matrix(self): >+ return self.data['secondarySize'] > 1 >+ >+ def get_object_size(self): >+ return self.data['primarySize'] * self.data['secondarySize'] >+ >+ def specific_sampler_or_image_type(self, basic_type_prefix): >+ if 'genType' in self.data: >+ type = {} >+ if 'basic' not in self.data: >+ type['basic'] = {'': 'Float', 'I': 'Int', 'U': 'UInt'}[basic_type_prefix] >+ type['primarySize'] = self.data['primarySize'] >+ else: >+ type['basic'] = basic_type_prefix + self.data['basic'] >+ type['primarySize'] = 1 >+ type['precision'] = 'Undefined' >+ return TType(type) >+ return self >+ >+ def specific_type(self, vec_size): >+ type = {} >+ if 'genType' in self.data: >+ type['basic'] = self.data['basic'] >+ type['precision'] = self.data['precision'] >+ type['qualifier'] = self.data['qualifier'] >+ type['primarySize'] = vec_size >+ type['secondarySize'] = 1 >+ return TType(type) >+ return self >+ >+ def parse_type(self, glsl_header_type): >+ if glsl_header_type.startswith('out '): >+ type_obj = self.parse_type(glsl_header_type[4:]) >+ type_obj['qualifier'] = 'Out' >+ return type_obj >+ if glsl_header_type.startswith('inout '): >+ type_obj = self.parse_type(glsl_header_type[6:]) >+ type_obj['qualifier'] = 'InOut' >+ return type_obj >+ >+ basic_type_map = { >+ 'float': 'Float', >+ 'int': 'Int', >+ 'uint': 'UInt', >+ 'bool': 'Bool', >+ 'void': 'Void', >+ 'atomic_uint': 'AtomicCounter', >+ 'yuvCscStandardEXT': 'YuvCscStandardEXT' >+ } >+ >+ if glsl_header_type in basic_type_map: >+ return {'basic': basic_type_map[glsl_header_type]} >+ >+ type_obj = {} >+ >+ basic_type_prefix_map = {'': 'Float', 'i': 'Int', 'u': 'UInt', 'b': 'Bool', 'v': 'Void'} >+ >+ vec_re = re.compile(r'^([iub]?)vec([234]?)$') >+ vec_match = vec_re.match(glsl_header_type) >+ if vec_match: >+ type_obj['basic'] = basic_type_prefix_map[vec_match.group(1)] >+ if vec_match.group(2) == '': >+ # Type like "ivec" that represents either ivec2, ivec3 or ivec4 >+ type_obj['genType'] = 'vec' >+ else: >+ # vec with specific size >+ type_obj['primarySize'] = int(vec_match.group(2)) >+ return type_obj >+ >+ mat_re = re.compile(r'^mat([234])(x([234]))?$') >+ mat_match = mat_re.match(glsl_header_type) >+ if mat_match: >+ type_obj['basic'] = 'Float' >+ if len(glsl_header_type) == 4: >+ mat_size = int(mat_match.group(1)) >+ type_obj['primarySize'] = mat_size >+ type_obj['secondarySize'] = mat_size >+ else: >+ type_obj['primarySize'] = int(mat_match.group(1)) >+ type_obj['secondarySize'] = int(mat_match.group(3)) >+ return type_obj >+ >+ gen_re = re.compile(r'^gen([IUB]?)Type$') >+ gen_match = gen_re.match(glsl_header_type) >+ if gen_match: >+ type_obj['basic'] = basic_type_prefix_map[gen_match.group(1).lower()] >+ type_obj['genType'] = 'yes' >+ return type_obj >+ >+ if glsl_header_type.startswith('sampler'): >+ type_obj['basic'] = glsl_header_type[0].upper() + glsl_header_type[1:] >+ return type_obj >+ >+ if glsl_header_type.startswith('gsampler') or glsl_header_type.startswith('gimage'): >+ type_obj['basic'] = glsl_header_type[1].upper() + glsl_header_type[2:] >+ type_obj['genType'] = 'sampler_or_image' >+ return type_obj >+ >+ if glsl_header_type == 'gvec4': >+ return {'primarySize': 4, 'genType': 'sampler_or_image'} >+ if glsl_header_type == 'gvec3': >+ return {'primarySize': 3, 'genType': 'sampler_or_image'} >+ >+ raise Exception('Unrecognized type: ' + str(glsl_header_type)) >+ >+def get_parsed_functions(functions_txt_filename): >+ >+ def parse_function_parameters(parameters): >+ if parameters == '': >+ return [] >+ parametersOut = [] >+ parameters = parameters.split(', ') >+ for parameter in parameters: >+ parametersOut.append(TType(parameter.strip())) >+ return parametersOut >+ >+ lines = [] >+ with open(functions_txt_filename) as f: >+ lines = f.readlines() >+ lines = [line.strip() for line in lines if line.strip() != '' and not line.strip().startswith('//')] >+ >+ fun_re = re.compile(r'^(\w+) (\w+)\((.*)\);$') >+ >+ parsed_functions = OrderedDict() >+ group_stack = [] >+ default_metadata = {} >+ >+ for line in lines: >+ fun_match = fun_re.match(line) >+ if line.startswith('GROUP BEGIN '): >+ group_rest = line[12:].strip() >+ group_parts = group_rest.split(' ', 1) >+ current_group = { >+ 'functions': [], >+ 'name': group_parts[0], >+ 'subgroups': {} >+ } >+ if len(group_parts) > 1: >+ group_metadata = json.loads(group_parts[1]) >+ current_group.update(group_metadata) >+ group_stack.append(current_group) >+ elif line.startswith('GROUP END '): >+ group_end_name = line[10:].strip() >+ current_group = group_stack[-1] >+ if current_group['name'] != group_end_name: >+ raise Exception('GROUP END: Unexpected function group name "' + group_end_name + '" was expecting "' + current_group['name'] + '"') >+ group_stack.pop() >+ is_top_level_group = (len(group_stack) == 0) >+ if is_top_level_group: >+ parsed_functions[current_group['name']] = current_group >+ default_metadata = {} >+ else: >+ super_group = group_stack[-1] >+ super_group['subgroups'][current_group['name']] = current_group >+ elif line.startswith('DEFAULT METADATA'): >+ line_rest = line[16:].strip() >+ default_metadata = json.loads(line_rest) >+ elif fun_match: >+ return_type = fun_match.group(1) >+ name = fun_match.group(2) >+ parameters = fun_match.group(3) >+ function_props = { >+ 'name': name, >+ 'returnType': TType(return_type), >+ 'parameters': parse_function_parameters(parameters) >+ } >+ function_props.update(default_metadata) >+ group_stack[-1]['functions'].append(function_props) >+ else: >+ raise Exception('Unexpected function input line: ' + line) >+ >+ return parsed_functions >+ >+fnvPrime = 16777619 >+def hash32(str): >+ fnvOffsetBasis = 0x811c9dc5 >+ hash = fnvOffsetBasis >+ for c in str: >+ hash = hash ^ ord(c) >+ hash = (hash * fnvPrime) & 0xffffffff >+ return hash >+ >+def mangledNameHash(str, script_generated_hash_tests, save_test = True): >+ hash = hash32(str) >+ index = 0 >+ max_six_bit_value = (1 << 6) - 1 >+ paren_location = max_six_bit_value >+ has_array_or_block_param_bit = 0 >+ for c in str: >+ if c == '(': >+ paren_location = index >+ elif c == '{' or c == '[': >+ has_array_or_block_param_bit = 1 >+ index += 1 >+ hash = ((hash >> 13) ^ (hash & 0x1fff)) | (index << 19) | (paren_location << 25) | (has_array_or_block_param_bit << 31) >+ if save_test: >+ sanity_check = ' ASSERT_EQ(0x{hash}u, ImmutableString("{str}").mangledNameHash());'.format(hash = ('%08x' % hash), str = str) >+ script_generated_hash_tests.update({sanity_check: None}) >+ return hash >+ >+def get_suffix(props): >+ if 'suffix' in props: >+ return props['suffix'] >+ return '' >+ >+def get_extension(props): >+ if 'extension' in props: >+ return props['extension'] >+ return 'UNDEFINED' >+ >+def get_op(name, function_props): >+ if 'op' not in function_props: >+ raise Exception('function op not defined') >+ if function_props['op'] == 'auto': >+ return name[0].upper() + name[1:] >+ return function_props['op'] >+ >+def get_known_to_not_have_side_effects(function_props): >+ if 'op' in function_props and function_props['op'] != 'CallBuiltInFunction': >+ if 'hasSideEffects' in function_props: >+ return 'false' >+ else: >+ for param in get_parameters(function_props): >+ if 'qualifier' in param.data and (param.data['qualifier'] == 'Out' or param.data['qualifier'] == 'InOut'): >+ return 'false' >+ return 'true' >+ return 'false' >+ >+def get_parameters(function_props): >+ if 'parameters' in function_props: >+ return function_props['parameters'] >+ return [] >+ >+def get_function_mangled_name(function_name, parameters): >+ mangled_name = function_name + '(' >+ for param in parameters: >+ mangled_name += param.get_mangled_name() >+ return mangled_name >+ >+def get_function_human_readable_name(function_name, parameters): >+ name = function_name >+ for param in parameters: >+ name += '_' + param.get_human_readable_name() >+ return name >+ >+def gen_parameters_variant_ids(str_len, ttype_mangled_name_variants): >+ # Note that this doesn't generate variants with array parameters or struct / interface block parameters. They are assumed to have been filtered out separately. >+ if str_len % 2 != 0: >+ raise Exception('Expecting parameters mangled name length to be divisible by two') >+ num_variants = pow(len(ttype_mangled_name_variants), str_len / 2) >+ return xrange(num_variants) >+ >+def get_parameters_mangled_name_variant(variant_id, paren_location, total_length, ttype_mangled_name_variants): >+ str_len = total_length - paren_location - 1 >+ if str_len % 2 != 0: >+ raise Exception('Expecting parameters mangled name length to be divisible by two') >+ variant = '' >+ while (len(variant)) < str_len: >+ parameter_index = len(variant) / 2 >+ parameter_variant_index = variant_id >+ for i in xrange(parameter_index): >+ parameter_variant_index = parameter_variant_index / len(ttype_mangled_name_variants) >+ parameter_variant_index = parameter_variant_index % len(ttype_mangled_name_variants) >+ variant += ttype_mangled_name_variants[parameter_variant_index] >+ return variant >+ >+# Calculate the mangled name hash of a common prefix string that's been pre-hashed with hash32() >+# plus a variant of the parameters. This is faster than constructing the whole string and then >+# calculating the hash for that. >+def get_mangled_name_variant_hash(prefix_hash32, variant_id, paren_location, total_length, >+ num_type_variants, ttype_mangled_name_variants): >+ hash = prefix_hash32 >+ parameter_count = (total_length - paren_location) >> 1 >+ parameter_variant_id_base = variant_id >+ for parameter_index in xrange(parameter_count): >+ parameter_variant_index = parameter_variant_id_base % num_type_variants >+ param_str = ttype_mangled_name_variants[parameter_variant_index] >+ hash = hash ^ ord(param_str[0]) >+ hash = (hash * fnvPrime) & 0xffffffff >+ hash = hash ^ ord(param_str[1]) >+ hash = (hash * fnvPrime) & 0xffffffff >+ parameter_variant_id_base = parameter_variant_id_base / num_type_variants >+ return ((hash >> 13) ^ (hash & 0x1fff)) | (total_length << 19) | (paren_location << 25) >+ >+def mangled_name_hash_can_collide_with_different_parameters(function_variant_props, num_type_variants, >+ ttype_mangled_name_variants, script_generated_hash_tests): >+ # We exhaustively search through all possible lists of parameters and see if any other mangled >+ # name has the same hash. >+ mangled_name = function_variant_props['mangled_name'] >+ mangled_name_len = len(mangled_name) >+ hash = mangledNameHash(mangled_name, script_generated_hash_tests) >+ mangled_name_prefix = function_variant_props['name'] + '(' >+ paren_location = len(mangled_name_prefix) - 1 >+ prefix_hash32 = hash32(mangled_name_prefix) >+ parameters_mangled_name_len = len(mangled_name) - len(mangled_name_prefix) >+ parameters_mangled_name = mangled_name[len(mangled_name_prefix):] >+ if (parameters_mangled_name_len > 6): >+ # This increases the complexity of searching for hash collisions considerably, so rather than doing it we just conservatively assume that a hash collision may be possible. >+ return True >+ for variant_id in gen_parameters_variant_ids(parameters_mangled_name_len, ttype_mangled_name_variants): >+ variant_hash = get_mangled_name_variant_hash(prefix_hash32, variant_id, paren_location, mangled_name_len, >+ num_type_variants, ttype_mangled_name_variants) >+ manged_name_variant = get_parameters_mangled_name_variant(variant_id, paren_location, mangled_name_len, >+ ttype_mangled_name_variants) >+ if variant_hash == hash and manged_name_variant != parameters_mangled_name: >+ return True >+ return False >+ >+def get_unique_identifier_name(function_name, parameters): >+ unique_name = function_name + '_' >+ for param in parameters: >+ unique_name += param.get_mangled_name() >+ return unique_name >+ >+def get_variable_name_to_store_parameter(param): >+ unique_name = 'pt' >+ if 'qualifier' in param.data: >+ if param.data['qualifier'] == 'Out': >+ unique_name += '_o_' >+ if param.data['qualifier'] == 'InOut': >+ unique_name += '_io_' >+ unique_name += param.get_mangled_name() >+ return unique_name >+ >+def get_variable_name_to_store_parameters(parameters): >+ if len(parameters) == 0: >+ return 'empty' >+ unique_name = 'p' >+ for param in parameters: >+ if 'qualifier' in param.data: >+ if param.data['qualifier'] == 'Out': >+ unique_name += '_o_' >+ if param.data['qualifier'] == 'InOut': >+ unique_name += '_io_' >+ unique_name += param.get_mangled_name() >+ return unique_name >+ >+def define_constexpr_variable(template_args, variable_declarations): >+ template_variable_declaration = 'constexpr const TVariable kVar_{name_with_suffix}(BuiltInId::{name_with_suffix}, BuiltInName::{name}, SymbolType::BuiltIn, TExtension::{extension}, {type});' >+ variable_declarations.append(template_variable_declaration.format(**template_args)) >+ >+def gen_function_variants(function_name, function_props): >+ function_variants = [] >+ parameters = get_parameters(function_props) >+ function_is_gen_type = False >+ gen_type = set() >+ for param in parameters: >+ if 'genType' in param.data: >+ if param.data['genType'] not in ['sampler_or_image', 'vec', 'yes']: >+ raise Exception('Unexpected value of genType "' + str(param.data['genType']) + '" should be "sampler_or_image", "vec", or "yes"') >+ gen_type.add(param.data['genType']) >+ if len(gen_type) > 1: >+ raise Exception('Unexpected multiple values of genType set on the same function: ' + str(list(gen_type))) >+ if len(gen_type) == 0: >+ function_variants.append(function_props) >+ return function_variants >+ >+ # If we have a gsampler_or_image then we're generating variants for float, int and uint >+ # samplers. >+ if 'sampler_or_image' in gen_type: >+ types = ['', 'I', 'U'] >+ for type in types: >+ variant_props = function_props.copy() >+ variant_parameters = [] >+ for param in parameters: >+ variant_parameters.append(param.specific_sampler_or_image_type(type)) >+ variant_props['parameters'] = variant_parameters >+ variant_props['returnType'] = function_props['returnType'].specific_sampler_or_image_type(type) >+ function_variants.append(variant_props) >+ return function_variants >+ >+ # If we have a normal gentype then we're generating variants for different sizes of vectors. >+ sizes = range(1, 5) >+ if 'vec' in gen_type: >+ sizes = range(2, 5) >+ for size in sizes: >+ variant_props = function_props.copy() >+ variant_parameters = [] >+ for param in parameters: >+ variant_parameters.append(param.specific_type(size)) >+ variant_props['parameters'] = variant_parameters >+ variant_props['returnType'] = function_props['returnType'].specific_type(size) >+ function_variants.append(variant_props) >+ return function_variants >+ >+def process_single_function_group(condition, group_name, group, num_type_variants, parameter_declarations, ttype_mangled_name_variants, >+ name_declarations, unmangled_function_if_statements, unmangled_builtin_declarations, defined_function_variants, >+ builtin_id_declarations, builtin_id_definitions, defined_parameter_names, variable_declarations, function_declarations, >+ script_generated_hash_tests, get_builtin_if_statements): >+ global id_counter >+ >+ if 'functions' not in group: >+ return >+ >+ for function_props in group['functions']: >+ function_name = function_props['name'] >+ level = function_props['level'] >+ extension = get_extension(function_props) >+ template_args = { >+ 'name': function_name, >+ 'name_with_suffix': function_name + get_suffix(function_props), >+ 'level': level, >+ 'extension': extension, >+ 'op': get_op(function_name, function_props), >+ 'known_to_not_have_side_effects': get_known_to_not_have_side_effects(function_props) >+ } >+ >+ function_variants = gen_function_variants(function_name, function_props) >+ >+ template_name_declaration = 'constexpr const ImmutableString {name_with_suffix}("{name}");' >+ name_declaration = template_name_declaration.format(**template_args) >+ if not name_declaration in name_declarations: >+ name_declarations.add(name_declaration) >+ >+ template_unmangled_if = """if (name == BuiltInName::{name_with_suffix}) >+{{ >+ return &UnmangledBuiltIns::{extension}; >+}}""" >+ unmangled_if = template_unmangled_if.format(**template_args) >+ unmangled_builtin_no_condition = unmangled_function_if_statements.get(level, 'NO_CONDITION', function_name) >+ if unmangled_builtin_no_condition != None and unmangled_builtin_no_condition['extension'] == 'UNDEFINED': >+ # We already have this unmangled name without a condition nor extension on the same level. No need to add a duplicate with a condition. >+ pass >+ elif (not unmangled_function_if_statements.has_key(level, condition, function_name)) or extension == 'UNDEFINED': >+ # We don't have this unmangled builtin recorded yet or we might replace an unmangled builtin from an extension with one from core. >+ unmangled_function_if_statements.add_obj(level, condition, function_name, {'hash_matched_code': unmangled_if, 'extension': extension}) >+ unmangled_builtin_declarations.add('constexpr const UnmangledBuiltIn {extension}(TExtension::{extension});'.format(**template_args)) >+ >+ for function_props in function_variants: >+ template_args['id'] = id_counter >+ >+ parameters = get_parameters(function_props) >+ >+ template_args['unique_name'] = get_unique_identifier_name(template_args['name_with_suffix'], parameters) >+ >+ if template_args['unique_name'] in defined_function_variants: >+ continue >+ defined_function_variants.add(template_args['unique_name']) >+ >+ template_args['param_count'] = len(parameters) >+ template_args['return_type'] = function_props['returnType'].get_statictype_string() >+ template_args['mangled_name'] = get_function_mangled_name(function_name, parameters) >+ template_args['human_readable_name'] = get_function_human_readable_name(template_args['name_with_suffix'], parameters) >+ template_args['mangled_name_length'] = len(template_args['mangled_name']) >+ >+ template_builtin_id_declaration = ' static constexpr const TSymbolUniqueId {human_readable_name} = TSymbolUniqueId({id});' >+ builtin_id_declarations.append(template_builtin_id_declaration.format(**template_args)) >+ template_builtin_id_definition = 'constexpr const TSymbolUniqueId BuiltInId::{human_readable_name};' >+ builtin_id_definitions.append(template_builtin_id_definition.format(**template_args)) >+ >+ parameters_list = [] >+ for param in parameters: >+ unique_param_name = get_variable_name_to_store_parameter(param) >+ param_template_args = { >+ 'name': '_empty', >+ 'name_with_suffix': unique_param_name, >+ 'type': param.get_statictype_string(), >+ 'extension': 'UNDEFINED' >+ } >+ if unique_param_name not in defined_parameter_names: >+ id_counter += 1 >+ param_template_args['id'] = id_counter >+ template_builtin_id_declaration = ' static constexpr const TSymbolUniqueId {name_with_suffix} = TSymbolUniqueId({id});' >+ builtin_id_declarations.append(template_builtin_id_declaration.format(**param_template_args)) >+ define_constexpr_variable(param_template_args, variable_declarations) >+ defined_parameter_names.add(unique_param_name) >+ parameters_list.append('&BuiltInVariable::kVar_{name_with_suffix}'.format(**param_template_args)); >+ >+ template_args['parameters_var_name'] = get_variable_name_to_store_parameters(parameters) >+ if len(parameters) > 0: >+ template_args['parameters_list'] = ', '.join(parameters_list) >+ template_parameter_list_declaration = 'constexpr const TVariable *{parameters_var_name}[{param_count}] = {{ {parameters_list} }};' >+ parameter_declarations[template_args['parameters_var_name']] = template_parameter_list_declaration.format(**template_args) >+ else: >+ template_parameter_list_declaration = 'constexpr const TVariable **{parameters_var_name} = nullptr;' >+ parameter_declarations[template_args['parameters_var_name']] = template_parameter_list_declaration.format(**template_args) >+ >+ template_function_declaration = 'constexpr const TFunction kFunction_{unique_name}(BuiltInId::{human_readable_name}, BuiltInName::{name_with_suffix}, TExtension::{extension}, BuiltInParameters::{parameters_var_name}, {param_count}, {return_type}, EOp{op}, {known_to_not_have_side_effects});' >+ function_declarations.append(template_function_declaration.format(**template_args)) >+ >+ # If we can make sure that there's no other mangled name with the same length, function >+ # name and hash, then we can only check the mangled name length and the function name >+ # instead of checking the whole mangled name. >+ template_mangled_if = '' >+ if mangled_name_hash_can_collide_with_different_parameters(template_args, num_type_variants, >+ ttype_mangled_name_variants, script_generated_hash_tests): >+ template_mangled_name_declaration = 'constexpr const ImmutableString {unique_name}("{mangled_name}");' >+ name_declarations.add(template_mangled_name_declaration.format(**template_args)) >+ template_mangled_if = """if (name == BuiltInName::{unique_name}) >+{{ >+ return &BuiltInFunction::kFunction_{unique_name}; >+}}""" >+ else: >+ template_mangled_if = """if (name.beginsWith(BuiltInName::{name_with_suffix})) >+{{ >+ ASSERT(name.length() == {mangled_name_length}); >+ return &BuiltInFunction::kFunction_{unique_name}; >+}}""" >+ mangled_if = template_mangled_if.format(**template_args) >+ get_builtin_if_statements.add_obj(level, condition, template_args['mangled_name'], {'hash_matched_code': mangled_if}) >+ >+ id_counter += 1 >+ >+def process_function_group(group_name, group, num_type_variants, parameter_declarations, ttype_mangled_name_variants, >+ name_declarations, unmangled_function_if_statements, unmangled_builtin_declarations, >+ defined_function_variants, builtin_id_declarations, builtin_id_definitions, defined_parameter_names, >+ variable_declarations, function_declarations, script_generated_hash_tests, get_builtin_if_statements, >+ is_in_group_definitions): >+ global id_counter >+ first_id = id_counter >+ >+ condition = 'NO_CONDITION' >+ if 'condition' in group: >+ condition = group['condition'] >+ >+ process_single_function_group(condition, group_name, group, num_type_variants, parameter_declarations, >+ ttype_mangled_name_variants, name_declarations, unmangled_function_if_statements, unmangled_builtin_declarations, >+ defined_function_variants, builtin_id_declarations, builtin_id_definitions, defined_parameter_names, >+ variable_declarations, function_declarations, script_generated_hash_tests, get_builtin_if_statements) >+ >+ if 'subgroups' in group: >+ for subgroup_name, subgroup in group['subgroups'].iteritems(): >+ process_function_group(group_name + subgroup_name, subgroup, num_type_variants, parameter_declarations, >+ ttype_mangled_name_variants, name_declarations, unmangled_function_if_statements, >+ unmangled_builtin_declarations, defined_function_variants, builtin_id_declarations, >+ builtin_id_definitions, defined_parameter_names, variable_declarations, function_declarations, >+ script_generated_hash_tests, get_builtin_if_statements, is_in_group_definitions) >+ >+ if 'queryFunction' in group: >+ template_args = { >+ 'first_id': first_id, >+ 'last_id': id_counter - 1, >+ 'group_name': group_name >+ } >+ template_is_in_group_definition = """bool is{group_name}(const TFunction *func) >+{{ >+ int id = func->uniqueId().get(); >+ return id >= {first_id} && id <= {last_id}; >+}}""" >+ is_in_group_definitions.append(template_is_in_group_definition.format(**template_args)) >+ >+def prune_parameters_arrays(parameter_declarations, function_declarations): >+ # We can share parameters arrays between functions in case one array is a subarray of another. >+ parameter_variable_name_replacements = {} >+ used_param_variable_names = set() >+ for param_variable_name, param_declaration in sorted(parameter_declarations.iteritems(), key=lambda item: -len(item[0])): >+ replaced = False >+ for used in used_param_variable_names: >+ if used.startswith(param_variable_name): >+ parameter_variable_name_replacements[param_variable_name] = used >+ replaced = True >+ break >+ if not replaced: >+ used_param_variable_names.add(param_variable_name) >+ >+ for i in xrange(len(function_declarations)): >+ for replaced, replacement in parameter_variable_name_replacements.iteritems(): >+ function_declarations[i] = function_declarations[i].replace('BuiltInParameters::' + replaced + ',', 'BuiltInParameters::' + replacement + ',') >+ >+ return [value for key, value in parameter_declarations.iteritems() if key in used_param_variable_names] >+ >+def process_single_variable_group(condition, group_name, group, builtin_id_declarations, builtin_id_definitions, name_declarations, >+ init_member_variables, get_variable_declarations, get_builtin_if_statements, declare_member_variables, variable_declarations, >+ get_variable_definitions, variable_name_count): >+ global id_counter >+ if 'variables' not in group: >+ return >+ for variable_name, props in group['variables'].iteritems(): >+ level = props['level'] >+ template_args = { >+ 'id': id_counter, >+ 'name': variable_name, >+ 'name_with_suffix': variable_name + get_suffix(props), >+ 'level': props['level'], >+ 'extension': get_extension(props), >+ 'class': 'TVariable' >+ } >+ >+ template_builtin_id_declaration = ' static constexpr const TSymbolUniqueId {name_with_suffix} = TSymbolUniqueId({id});' >+ builtin_id_declarations.append(template_builtin_id_declaration.format(**template_args)) >+ template_builtin_id_definition = 'constexpr const TSymbolUniqueId BuiltInId::{name_with_suffix};' >+ builtin_id_definitions.append(template_builtin_id_definition.format(**template_args)) >+ >+ template_name_declaration = 'constexpr const ImmutableString {name}("{name}");' >+ name_declarations.add(template_name_declaration.format(**template_args)) >+ >+ is_member = True >+ template_init_variable = '' >+ >+ if 'type' in props: >+ if props['type']['basic'] != 'Bool' and 'precision' not in props['type']: >+ raise Exception('Missing precision for variable ' + variable_name) >+ template_args['type'] = TType(props['type']).get_statictype_string() >+ >+ if 'fields' in props: >+ # Handle struct and interface block definitions. >+ template_args['class'] = props['class'] >+ template_args['fields'] = 'fields_{name_with_suffix}'.format(**template_args) >+ init_member_variables.append(' TFieldList *{fields} = new TFieldList();'.format(**template_args)) >+ for field_name, field_type in props['fields'].iteritems(): >+ template_args['field_name'] = field_name >+ template_args['field_type'] = TType(field_type).get_dynamic_type_string() >+ template_name_declaration = 'constexpr const ImmutableString {field_name}("{field_name}");' >+ name_declarations.add(template_name_declaration.format(**template_args)) >+ template_add_field = ' {fields}->push_back(new TField({field_type}, BuiltInName::{field_name}, zeroSourceLoc, SymbolType::BuiltIn));' >+ init_member_variables.append(template_add_field.format(**template_args)) >+ template_init_temp_variable = ' {class} *{name_with_suffix} = new {class}(BuiltInId::{name_with_suffix}, BuiltInName::{name}, TExtension::{extension}, {fields});' >+ init_member_variables.append(template_init_temp_variable.format(**template_args)) >+ if 'private' in props and props['private']: >+ is_member = False >+ else: >+ template_init_variable = ' mVar_{name_with_suffix} = {name_with_suffix};' >+ >+ elif 'initDynamicType' in props: >+ # Handle variables whose type can't be expressed as TStaticType >+ # (type is a struct or has variable array size for example). >+ template_args['type_name'] = 'type_{name_with_suffix}'.format(**template_args) >+ template_args['type'] = template_args['type_name'] >+ template_args['initDynamicType'] = props['initDynamicType'].format(**template_args) >+ template_init_variable = """ {initDynamicType} >+ {type_name}->realize(); >+ mVar_{name_with_suffix} = new TVariable(BuiltInId::{name_with_suffix}, BuiltInName::{name}, SymbolType::BuiltIn, TExtension::{extension}, {type});""" >+ >+ elif 'value' in props: >+ # Handle variables with constant value, such as gl_MaxDrawBuffers. >+ if props['value'] != 'resources': >+ raise Exception('Unrecognized value source in variable properties: ' + str(props['value'])) >+ resources_key = variable_name[3:] >+ if 'valueKey' in props: >+ resources_key = props['valueKey'] >+ template_args['value'] = 'resources.' + resources_key >+ template_args['object_size'] = TType(props['type']).get_object_size() >+ template_init_variable = """ mVar_{name_with_suffix} = new TVariable(BuiltInId::{name_with_suffix}, BuiltInName::{name}, SymbolType::BuiltIn, TExtension::{extension}, {type}); >+ {{ >+ TConstantUnion *unionArray = new TConstantUnion[{object_size}]; >+ unionArray[0].setIConst({value}); >+ mVar_{name_with_suffix}->shareConstPointer(unionArray); >+ }}""" >+ if template_args['object_size'] > 1: >+ template_init_variable = """ mVar_{name_with_suffix} = new TVariable(BuiltInId::{name_with_suffix}, BuiltInName::{name}, SymbolType::BuiltIn, TExtension::{extension}, {type}); >+ {{ >+ TConstantUnion *unionArray = new TConstantUnion[{object_size}]; >+ for (size_t index = 0u; index < {object_size}; ++index) >+ {{ >+ unionArray[index].setIConst({value}[index]); >+ }} >+ mVar_{name_with_suffix}->shareConstPointer(unionArray); >+ }}""" >+ >+ else: >+ # Handle variables that can be stored as constexpr TVariable like >+ # gl_Position, gl_FragColor etc. >+ define_constexpr_variable(template_args, variable_declarations) >+ is_member = False >+ >+ template_get_variable_declaration = 'const TVariable *{name_with_suffix}();' >+ get_variable_declarations.append(template_get_variable_declaration.format(**template_args)) >+ >+ template_get_variable_definition = """const TVariable *{name_with_suffix}() >+{{ >+ return &kVar_{name_with_suffix}; >+}} >+""" >+ get_variable_definitions.append(template_get_variable_definition.format(**template_args)) >+ >+ if level != 'GLSL_BUILTINS': >+ template_name_if = """if (name == BuiltInName::{name}) >+{{ >+ return &BuiltInVariable::kVar_{name_with_suffix}; >+}}""" >+ name_if = template_name_if.format(**template_args) >+ get_builtin_if_statements.add_obj(level, condition, template_args['name'], {'hash_matched_code': name_if}) >+ >+ if is_member: >+ get_condition = condition >+ init_conditionally = (condition != 'NO_CONDITION' and variable_name_count[variable_name] == 1) >+ if init_conditionally: >+ # Instead of having the condition if statement at lookup, it's cheaper to have it at initialization time. >+ init_member_variables.append(' if ({condition})\n {{'.format(condition = condition)) >+ template_args['condition_comment'] = '\n // Only initialized if {condition}'.format(condition = condition) >+ get_condition = 'NO_CONDITION' >+ else: >+ template_args['condition_comment'] = '' >+ init_member_variables.append(template_init_variable.format(**template_args)) >+ if init_conditionally: >+ init_member_variables.append(' }') >+ >+ template_declare_member_variable = '{class} *mVar_{name_with_suffix} = nullptr;' >+ declare_member_variables.append(template_declare_member_variable.format(**template_args)) >+ >+ if level != 'GLSL_BUILTINS': >+ template_name_if = """if (name == BuiltInName::{name}) >+{{{condition_comment} >+ return mVar_{name_with_suffix}; >+}}""" >+ name_if = template_name_if.format(**template_args) >+ get_builtin_if_statements.add_obj(level, get_condition, variable_name, {'hash_matched_code': name_if}) >+ >+ id_counter += 1 >+ >+def count_variable_names(group, variable_name_count): >+ if 'variables' in group: >+ for name in group['variables'].iterkeys(): >+ if name not in variable_name_count: >+ variable_name_count[name] = 1 >+ else: >+ variable_name_count[name] += 1 >+ if 'subgroups' in group: >+ for subgroup_name, subgroup in group['subgroups'].iteritems(): >+ count_variable_names(subgroup, variable_name_count) >+ >+def process_variable_group(parent_condition, group_name, group, builtin_id_declarations, builtin_id_definitions, name_declarations, >+ init_member_variables, get_variable_declarations, get_builtin_if_statements, declare_member_variables, variable_declarations, >+ get_variable_definitions, variable_name_count): >+ global id_counter >+ condition = 'NO_CONDITION' >+ if 'condition' in group: >+ condition = group['condition'] >+ >+ if parent_condition != 'NO_CONDITION': >+ if condition == 'NO_CONDITION': >+ condition = parent_condition >+ else: >+ condition = '({cond1}) && ({cond2})'.format(cond1 = parent_condition, cond2 = condition) >+ >+ process_single_variable_group(condition, group_name, group, builtin_id_declarations, builtin_id_definitions, name_declarations, >+ init_member_variables, get_variable_declarations, get_builtin_if_statements, declare_member_variables, variable_declarations, >+ get_variable_definitions, variable_name_count) >+ >+ if 'subgroups' in group: >+ for subgroup_name, subgroup in group['subgroups'].iteritems(): >+ process_variable_group(condition, subgroup_name, subgroup, builtin_id_declarations, builtin_id_definitions, name_declarations, >+ init_member_variables, get_variable_declarations, get_builtin_if_statements, declare_member_variables, variable_declarations, >+ get_variable_definitions, variable_name_count) >+ >+ >+def main(): >+ >+ set_working_dir() >+ >+ parser = argparse.ArgumentParser() >+ parser.add_argument('--dump-intermediate-json', help='Dump parsed function data as a JSON file builtin_functions.json', action="store_true") >+ parser.add_argument('auto_script_command', nargs='?', default='') >+ args = parser.parse_args() >+ >+ test_filename = '../../tests/compiler_tests/ImmutableString_test_autogen.cpp' >+ variables_json_filename = 'builtin_variables.json' >+ functions_txt_filename = 'builtin_function_declarations.txt' >+ hash_filename = 'builtin_symbols_hash_autogen.txt' >+ >+ # auto_script parameters. >+ if args.auto_script_command != '': >+ inputs = [ >+ functions_txt_filename, >+ variables_json_filename, >+ ] >+ outputs = [ >+ 'ParseContext_autogen.h', >+ 'SymbolTable_autogen.cpp', >+ 'SymbolTable_autogen.h', >+ 'tree_util/BuiltIn_autogen.h', >+ test_filename, >+ hash_filename, >+ ] >+ >+ if args.auto_script_command == 'inputs': >+ print ','.join(inputs) >+ elif args.auto_script_command == 'outputs': >+ print ','.join(outputs) >+ else: >+ print('Invalid script parameters') >+ return 1 >+ return 0 >+ >+ >+ all_inputs = [os.path.abspath(__file__), variables_json_filename, functions_txt_filename] >+ # This script takes a while to run since it searches for hash collisions of mangled names. To avoid >+ # running it unnecessarily, we first check if we've already ran it with the same inputs. >+ m = hashlib.md5() >+ for input_path in all_inputs: >+ with open(input_path, 'rU') as input_file: >+ m.update(input_file.read()) >+ input_hash = m.hexdigest() >+ if os.path.exists(hash_filename): >+ with open(hash_filename) as hash_file: >+ if input_hash == hash_file.read(): >+ print "Canceling ESSL static builtins code generator - generated hash matches inputs." >+ sys.exit(0) >+ >+ # Declarations of symbol unique ids >+ builtin_id_declarations = [] >+ >+ # Definitions of symbol unique ids needed for those ids used outside of constexpr expressions. >+ builtin_id_definitions = [] >+ >+ # Declarations of name string variables >+ name_declarations = set() >+ >+ # Declarations of builtin TVariables >+ variable_declarations = [] >+ >+ # Declarations of builtin TFunctions >+ function_declarations = [] >+ >+ # Functions for querying the pointer to a specific TVariable. >+ get_variable_declarations = [] >+ get_variable_definitions = [] >+ >+ # Code for defining TVariables stored as members of TSymbolTable. >+ declare_member_variables = [] >+ init_member_variables = [] >+ >+ # Code for querying builtins. >+ get_builtin_if_statements = GroupedList() >+ >+ # Declarations of UnmangledBuiltIn objects >+ unmangled_builtin_declarations = set() >+ >+ # Code for querying builtin function unmangled names. >+ unmangled_function_if_statements = GroupedList() >+ >+ # Code for testing that script-generated hashes match with runtime computed hashes. >+ script_generated_hash_tests = OrderedDict() >+ >+ # Functions for testing whether a builtin belongs in group. >+ is_in_group_definitions = [] >+ >+ # Counts of variables with a certain name string: >+ variable_name_count = {} >+ >+ # Declarations of parameter arrays for builtin TFunctions. Map from C++ variable name to the full >+ # declaration. >+ parameter_declarations = {} >+ >+ ttype_mangled_name_variants = [] >+ >+ defined_function_variants = set() >+ defined_parameter_names = set() >+ >+ >+ parsed_functions = get_parsed_functions(functions_txt_filename) >+ >+ if args.dump_intermediate_json: >+ with open('builtin_functions.json', 'w') as outfile: >+ def serialize_obj(obj): >+ if isinstance(obj, TType): >+ return obj.data >+ else: >+ raise "Cannot serialize to JSON: " + str(obj) >+ json.dump(parsed_functions, outfile, indent=4, separators=(',', ': '), default=serialize_obj) >+ >+ with open(variables_json_filename) as f: >+ parsed_variables = json.load(f, object_pairs_hook=OrderedDict) >+ >+ for basic_type in basic_types_enumeration: >+ primary_sizes = [1] >+ secondary_sizes = [1] >+ if basic_type in ['Float', 'Int', 'UInt', 'Bool']: >+ primary_sizes = [1, 2, 3, 4] >+ if basic_type == 'Float': >+ secondary_sizes = [1, 2, 3, 4] >+ for primary_size in primary_sizes: >+ for secondary_size in secondary_sizes: >+ type = TType({'basic': basic_type, 'primarySize': primary_size, 'secondarySize': secondary_size}) >+ ttype_mangled_name_variants.append(type.get_mangled_name()) >+ >+ num_type_variants = len(ttype_mangled_name_variants) >+ >+ # Sanity check for get_mangled_name_variant_hash: >+ variant_hash = get_mangled_name_variant_hash(hash32("atan("), 3, 4, len("atan(0123"), num_type_variants, >+ ttype_mangled_name_variants) >+ mangled_name_hash = mangledNameHash("atan(" + get_parameters_mangled_name_variant(3, 4, len("atan(0123"), >+ ttype_mangled_name_variants), script_generated_hash_tests) >+ if variant_hash != mangled_name_hash: >+ raise Exception("get_mangled_name_variant_hash sanity check failed") >+ >+ for group_name, group in parsed_functions.iteritems(): >+ process_function_group(group_name, group, num_type_variants, parameter_declarations, ttype_mangled_name_variants, >+ name_declarations, unmangled_function_if_statements, unmangled_builtin_declarations, >+ defined_function_variants, builtin_id_declarations, builtin_id_definitions, defined_parameter_names, >+ variable_declarations, function_declarations, script_generated_hash_tests, get_builtin_if_statements, >+ is_in_group_definitions) >+ >+ parameter_declarations = prune_parameters_arrays(parameter_declarations, function_declarations) >+ >+ for group_name, group in parsed_variables.iteritems(): >+ count_variable_names(group, variable_name_count) >+ >+ for group_name, group in parsed_variables.iteritems(): >+ process_variable_group('NO_CONDITION', group_name, group, builtin_id_declarations, builtin_id_definitions, name_declarations, >+ init_member_variables, get_variable_declarations, get_builtin_if_statements, declare_member_variables, variable_declarations, >+ get_variable_definitions, variable_name_count) >+ >+ output_strings = { >+ 'script_name': os.path.basename(__file__), >+ 'copyright_year': date.today().year, >+ >+ 'builtin_id_declarations': '\n'.join(builtin_id_declarations), >+ 'builtin_id_definitions': '\n'.join(builtin_id_definitions), >+ 'last_builtin_id': id_counter - 1, >+ 'name_declarations': '\n'.join(sorted(list(name_declarations))), >+ >+ 'function_data_source_name': functions_txt_filename, >+ 'function_declarations': '\n'.join(function_declarations), >+ 'parameter_declarations': '\n'.join(sorted(parameter_declarations)), >+ >+ 'is_in_group_definitions': '\n'.join(is_in_group_definitions), >+ >+ 'variable_data_source_name': variables_json_filename, >+ 'variable_declarations': '\n'.join(sorted(variable_declarations)), >+ 'get_variable_declarations': '\n'.join(sorted(get_variable_declarations)), >+ 'get_variable_definitions': '\n'.join(sorted(get_variable_definitions)), >+ 'unmangled_builtin_declarations': '\n'.join(sorted(unmangled_builtin_declarations)), >+ >+ 'declare_member_variables': '\n'.join(declare_member_variables), >+ 'init_member_variables': '\n'.join(init_member_variables), >+ >+ 'get_unmangled_builtin': unmangled_function_if_statements.get_switch_code(script_generated_hash_tests), >+ 'get_builtin': get_builtin_if_statements.get_switch_code(script_generated_hash_tests), >+ 'max_unmangled_name_length': unmangled_function_if_statements.get_max_name_length(), >+ 'max_mangled_name_length': get_builtin_if_statements.get_max_name_length(), >+ >+ 'script_generated_hash_tests': '\n'.join(script_generated_hash_tests.iterkeys()) >+ } >+ >+ with open(test_filename, 'wt') as outfile_cpp: >+ output_cpp = template_immutablestringtest_cpp.format(**output_strings) >+ outfile_cpp.write(output_cpp) >+ >+ with open('tree_util/BuiltIn_autogen.h', 'wt') as outfile_header: >+ output_header = template_builtin_header.format(**output_strings) >+ outfile_header.write(output_header) >+ >+ with open('SymbolTable_autogen.cpp', 'wt') as outfile_cpp: >+ output_cpp = template_symboltable_cpp.format(**output_strings) >+ outfile_cpp.write(output_cpp) >+ >+ with open('ParseContext_autogen.h', 'wt') as outfile_header: >+ output_header = template_parsecontext_header.format(**output_strings) >+ outfile_header.write(output_header) >+ >+ with open('SymbolTable_autogen.h', 'wt') as outfile_h: >+ output_h = template_symboltable_h.format(**output_strings) >+ outfile_h.write(output_h) >+ >+ with open(hash_filename, 'wt') as hash_file: >+ hash_file.write(input_hash) >+ >+ return 0 >+ >+ >+if __name__ == '__main__': >+ sys.exit(main()) >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/gen_emulated_builtin_function_tables.py b/Source/ThirdParty/ANGLE/src/compiler/translator/gen_emulated_builtin_function_tables.py >index 3cb3f3b11c1..6f003a9b5e8 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/gen_emulated_builtin_function_tables.py >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/gen_emulated_builtin_function_tables.py >@@ -5,6 +5,7 @@ > # > # gen_emulated_builtin_function_tables.py: > # Generator for the builtin function maps. >+# NOTE: don't run this script directly. Run scripts/run_code_generation.py. > > from datetime import date > import json >@@ -21,6 +22,7 @@ template_emulated_builtin_functions_hlsl = """// GENERATED FILE - DO NOT EDIT. > // HLSL code for emulating GLSL builtin functions not present in HLSL. > > #include "compiler/translator/BuiltInFunctionEmulator.h" >+#include "compiler/translator/tree_util/BuiltIn_autogen.h" > > namespace sh > {{ >@@ -30,11 +32,11 @@ namespace > > struct FunctionPair > {{ >- constexpr FunctionPair(const MiniFunctionId &idIn, const char *bodyIn) : id(idIn), body(bodyIn) >+ constexpr FunctionPair(const TSymbolUniqueId &idIn, const char *bodyIn) : id(idIn.get()), body(bodyIn) > {{ > }} > >- MiniFunctionId id; >+ int id; > const char *body; > }}; > >@@ -42,12 +44,12 @@ constexpr FunctionPair g_hlslFunctions[] = {{ > {emulated_functions}}}; > }} // anonymous namespace > >-const char *FindHLSLFunction(const FunctionId &functionID) >+const char *FindHLSLFunction(int uniqueId) > {{ > for (size_t index = 0; index < ArraySize(g_hlslFunctions); ++index) > {{ > const auto &function = g_hlslFunctions[index]; >- if (function.id == functionID) >+ if (function.id == uniqueId) > {{ > return function.body; > }} >@@ -74,30 +76,18 @@ def load_json(path): > return json.loads(file_data, object_pairs_hook=reject_duplicate_keys) > > def enum_type(arg): >- # handle 'argtype argname' and 'out argtype argname' >- chunks = arg.split(' ') >- arg_type = chunks[0] >- if len(chunks) == 3: >- arg_type = chunks[1] >- >- if arg_type == "float2x2": >- return "Mat2" >- elif arg_type == "float3x3": >- return "Mat3" >- elif arg_type == "float4x4": >- return "Mat4" >- >- suffix = "" >- if not arg_type[-1].isdigit(): >- suffix = '1' >- return arg_type.capitalize() + suffix >- >-def caps(op): >- return op[0].upper() + op[1:] >- >-input_script = "emulated_builtin_function_data_hlsl.json" >-hlsl_json = load_json(input_script) >-emulated_functions = [] >+ # handle 'argtype argname' and 'out argtype argname' >+ chunks = arg.split(' ') >+ arg_type = chunks[0] >+ if len(chunks) == 3: >+ arg_type = chunks[1] >+ >+ suffix = "" >+ if not arg_type[-1].isdigit(): >+ suffix = '1' >+ if arg_type[0:4] == 'uint': >+ return 'UI' + arg_type[2:] + suffix >+ return arg_type.capitalize() + suffix > > def gen_emulated_function(data): > >@@ -109,24 +99,51 @@ def gen_emulated_function(data): > body = [ sig, '{' ] + [' ' + line for line in data['body']] + ['}'] > > func += "{\n" >- func += "{ EOp" + caps(data['op']) + ", " + ", ".join("ParamType::" + enum_type(arg) for arg in data['args']) + " },\n" >+ func += "BuiltInId::" + data['op'] + "_" + "_".join([enum_type(arg) for arg in data['args']]) + ",\n" > if 'helper' in data: > func += '"' + '\\n"\n"'.join(data['helper']) + '\\n"\n' > func += '"' + '\\n"\n"'.join(body) + '\\n"\n' > func += "},\n" > return [ func ] > >-for item in hlsl_json: >- emulated_functions += gen_emulated_function(item) > >-hlsl_fname = "emulated_builtin_functions_hlsl_autogen.cpp" >+def main(): > >-hlsl_gen = template_emulated_builtin_functions_hlsl.format( >- script_name = sys.argv[0], >- data_source_name = input_script, >- copyright_year = date.today().year, >- emulated_functions = "".join(emulated_functions)) >+ input_script = "emulated_builtin_function_data_hlsl.json" >+ hlsl_fname = "emulated_builtin_functions_hlsl_autogen.cpp" > >-with open(hlsl_fname, 'wt') as f: >- f.write(hlsl_gen) >- f.close() >+ # auto_script parameters. >+ if len(sys.argv) > 1: >+ inputs = [input_script] >+ outputs = [hlsl_fname] >+ >+ if sys.argv[1] == 'inputs': >+ print ','.join(inputs) >+ elif sys.argv[1] == 'outputs': >+ print ','.join(outputs) >+ else: >+ print('Invalid script parameters') >+ return 1 >+ return 0 >+ >+ hlsl_json = load_json(input_script) >+ emulated_functions = [] >+ >+ for item in hlsl_json: >+ emulated_functions += gen_emulated_function(item) >+ >+ hlsl_gen = template_emulated_builtin_functions_hlsl.format( >+ script_name = sys.argv[0], >+ data_source_name = input_script, >+ copyright_year = date.today().year, >+ emulated_functions = "".join(emulated_functions)) >+ >+ with open(hlsl_fname, 'wt') as f: >+ f.write(hlsl_gen) >+ f.close() >+ >+ return 0 >+ >+ >+if __name__ == '__main__': >+ sys.exit(main()) >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.l b/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.l >index 858ffd96bb3..8af29a8a7c7 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.l >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.l >@@ -26,9 +26,9 @@ WHICH GENERATES THE GLSL ES LEXER (glslang_lex.cpp). > > // Ignore errors in auto-generated code. > #if defined(__GNUC__) >+#pragma GCC diagnostic ignored "-Wswitch-enum" > #pragma GCC diagnostic ignored "-Wunused-function" > #pragma GCC diagnostic ignored "-Wunused-variable" >-#pragma GCC diagnostic ignored "-Wswitch-enum" > #elif defined(_MSC_VER) > #pragma warning(disable: 4005) > #pragma warning(disable: 4065) >@@ -38,6 +38,11 @@ WHICH GENERATES THE GLSL ES LEXER (glslang_lex.cpp). > #pragma warning(disable: 4701) > #pragma warning(disable: 4702) > #endif >+#if defined(__clang__) >+#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" >+// Flex isn't semi-colon clean. >+#pragma clang diagnostic ignored "-Wextra-semi-stmt" >+#endif > } > > %{ >@@ -63,6 +68,7 @@ using namespace sh; > #endif > #endif > >+#define YY_NO_INPUT > #define YY_USER_ACTION \ > yylloc->first_file = yylloc->last_file = yycolumn; \ > yylloc->first_line = yylloc->last_line = yylineno; >@@ -81,6 +87,8 @@ static int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int toke > static int ES2_and_ES3_reserved_ES3_1_keyword(TParseContext *context, int token); > static int ES2_and_ES3_ident_ES3_1_keyword(TParseContext *context, int token); > static int ES3_extension_keyword_else_ident(TParseContext *context, TExtension extension, int token); >+static int ES2_ident_ES3_reserved_ES3_1_extension_keyword(TParseContext *context, TExtension extension, int token); >+static int ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(TParseContext *context, TExtension extension, int token); > static int uint_constant(TParseContext *context); > static int int_constant(TParseContext *context); > static int float_constant(yyscan_t yyscanner); >@@ -184,21 +192,24 @@ O [0-7] > "sampler3DRect" { return ES2_reserved_ES3_keyword(context, SAMPLER3DRECT); } > "sampler2DRect" { return SAMPLER2DRECT; } > "sampler2DArray" { return ES2_ident_ES3_keyword(context, SAMPLER2DARRAY); } >-"sampler2DMS" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, SAMPLER2DMS); } >+"sampler2DMS" { return ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(context, TExtension::ANGLE_texture_multisample, SAMPLER2DMS); } > "isampler2D" { return ES2_ident_ES3_keyword(context, ISAMPLER2D); } > "isampler3D" { return ES2_ident_ES3_keyword(context, ISAMPLER3D); } > "isamplerCube" { return ES2_ident_ES3_keyword(context, ISAMPLERCUBE); } > "isampler2DArray" { return ES2_ident_ES3_keyword(context, ISAMPLER2DARRAY); } >-"isampler2DMS" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, ISAMPLER2DMS); } >+"isampler2DMS" { return ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(context, TExtension::ANGLE_texture_multisample, ISAMPLER2DMS); } > "usampler2D" { return ES2_ident_ES3_keyword(context, USAMPLER2D); } > "usampler3D" { return ES2_ident_ES3_keyword(context, USAMPLER3D); } > "usamplerCube" { return ES2_ident_ES3_keyword(context, USAMPLERCUBE); } > "usampler2DArray" { return ES2_ident_ES3_keyword(context, USAMPLER2DARRAY); } >-"usampler2DMS" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, USAMPLER2DMS); } >+"usampler2DMS" { return ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(context, TExtension::ANGLE_texture_multisample, USAMPLER2DMS); } > "sampler2DShadow" { return ES2_reserved_ES3_keyword(context, SAMPLER2DSHADOW); } > "samplerCubeShadow" { return ES2_ident_ES3_keyword(context, SAMPLERCUBESHADOW); } > "sampler2DArrayShadow" { return ES2_ident_ES3_keyword(context, SAMPLER2DARRAYSHADOW); } > "__samplerExternal2DY2YEXT" { return ES3_extension_keyword_else_ident(context, TExtension::EXT_YUV_target, SAMPLEREXTERNAL2DY2YEXT); } >+"sampler2DMSArray" { return ES2_ident_ES3_reserved_ES3_1_extension_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, SAMPLER2DMSARRAY); } >+"isampler2DMSArray" { return ES2_ident_ES3_reserved_ES3_1_extension_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, ISAMPLER2DMSARRAY); } >+"usampler2DMSArray" { return ES2_ident_ES3_reserved_ES3_1_extension_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, USAMPLER2DMSARRAY); } > > "struct" { return STRUCT; } > >@@ -263,22 +274,19 @@ O [0-7] > "usampler2DRect" | > "samplerBuffer" | > "isamplerBuffer" | >-"usamplerBuffer" | >-"sampler2DMSArray" | >-"isampler2DMSArray" | >-"usampler2DMSArray" { >+"usamplerBuffer" { > if (context->getShaderVersion() < 300) { >- yylval->lex.string = NewPoolTString(yytext); >- return check_type(yyscanner); >- } >- return reserved_word(yyscanner); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); >+ return check_type(yyscanner); >+ } >+ return reserved_word(yyscanner); > } > > /* Reserved keywords in GLSL ES 1.00 that are not reserved in GLSL ES 3.00 */ > "packed" { > if (context->getShaderVersion() >= 300) > { >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > >@@ -337,7 +345,7 @@ O [0-7] > "using" { return reserved_word(yyscanner); } > > {L}({L}|{D})* { >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > >@@ -406,7 +414,7 @@ O [0-7] > > <FIELDS>{L}({L}|{D})* { > BEGIN(INITIAL); >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return FIELD_SELECTION; > } > <FIELDS>[ \t\v\f\r] {} >@@ -422,9 +430,9 @@ O [0-7] > %% > > yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner) { >- pp::Token token; >+ angle::pp::Token token; > yyget_extra(yyscanner)->getPreprocessor().lex(&token); >- yy_size_t len = token.type == pp::Token::LAST ? 0 : token.text.size(); >+ yy_size_t len = token.type == angle::pp::Token::LAST ? 0 : token.text.size(); > if (len < max_size) > memcpy(buf, token.text.c_str(), len); > yyset_column(token.location.file, yyscanner); >@@ -439,14 +447,13 @@ yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner) { > > int check_type(yyscan_t yyscanner) { > struct yyguts_t* yyg = (struct yyguts_t*) yyscanner; >- >+ > int token = IDENTIFIER; >- TSymbol* symbol = yyextra->symbolTable.find(yytext, yyextra->getShaderVersion()); >- if (symbol && symbol->isVariable()) { >- TVariable* variable = static_cast<TVariable*>(symbol); >- if (variable->isUserType()) { >- token = TYPE_NAME; >- } >+ // Note that the ImmutableString used here isn't static or pool allocated - but it's fine since yytext is valid for the duration of its use. >+ const TSymbol* symbol = yyextra->symbolTable.find(ImmutableString(yytext, yyleng), yyextra->getShaderVersion()); >+ if (symbol && symbol->isStruct()) >+ { >+ token = TYPE_NAME; > } > yylval->lex.symbol = symbol; > return token; >@@ -490,7 +497,7 @@ int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token) > > if (context->getShaderVersion() < 300) > { >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > else if (context->getShaderVersion() == 300) >@@ -509,7 +516,7 @@ int ES2_ident_ES3_keyword(TParseContext *context, int token) > // not a reserved word in GLSL ES 1.00, so could be used as an identifier/type name > if (context->getShaderVersion() < 300) > { >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > >@@ -525,7 +532,7 @@ int ES2_ident_ES3_keyword_multiview_keyword(TParseContext *context, int token) > // except when multiview extension is enabled > if (context->getShaderVersion() < 300 && !context->isExtensionEnabled(TExtension::OVR_multiview)) > { >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > >@@ -552,7 +559,7 @@ int ES2_and_ES3_ident_ES3_1_keyword(TParseContext *context, int token) > // not a reserved word in GLSL ES 1.00 and GLSL ES 3.00, so could be used as an identifier/type name > if (context->getShaderVersion() < 310) > { >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > >@@ -570,7 +577,48 @@ int ES3_extension_keyword_else_ident(TParseContext *context, TExtension extensio > return token; > } > >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); >+ return check_type(yyscanner); >+} >+ >+int ES2_ident_ES3_reserved_ES3_1_extension_keyword(TParseContext *context, TExtension extension, int token) >+{ >+ struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); >+ yyscan_t yyscanner = (yyscan_t) context->getScanner(); >+ >+ // a keyword in GLSL ES 3.10 with enabled extension >+ if (context->getShaderVersion() >= 310 && context->isExtensionEnabled(extension)) >+ { >+ return token; >+ } >+ // a reserved word in GLSL ES 3.00+ >+ if (context->getShaderVersion() >= 300) >+ { >+ return reserved_word(yyscanner); >+ } >+ >+ // Otherwise can be used as an identifier/type name >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); >+ return check_type(yyscanner); >+} >+ >+int ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(TParseContext *context, TExtension extension, int token) >+{ >+ struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); >+ yyscan_t yyscanner = (yyscan_t) context->getScanner(); >+ >+ // A keyword in GLSL ES 3.00 with enabled extension or in GLSL ES 3.10 >+ if (context->getShaderVersion() >= 310 || (context->getShaderVersion() == 300 && context->isExtensionEnabled(extension))) >+ { >+ return token; >+ } >+ >+ if(context->getShaderVersion() == 300) >+ { >+ return reserved_word(yyscanner); >+ } >+ >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > >@@ -643,11 +691,11 @@ int yuvcscstandardext_constant(TParseContext *context) > // a reserved word in GLSL ES 3.00 with enabled extension, otherwise could be used as an identifier/type name > if (context->getShaderVersion() >= 300 && context->isExtensionEnabled(TExtension::EXT_YUV_target)) > { >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return YUVCSCSTANDARDEXTCONSTANT; > } > >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > >@@ -677,7 +725,7 @@ int glslang_scan(size_t count, const char* const string[], const int length[], > yyset_lineno(1, context->getScanner()); > > // Initialize preprocessor. >- pp::Preprocessor *preprocessor = &context->getPreprocessor(); >+ angle::pp::Preprocessor *preprocessor = &context->getPreprocessor(); > > if (!preprocessor->init(count, string, length)) > return 1; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.y b/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.y >index 3e506caac84..5d113e39ae0 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.y >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.y >@@ -39,7 +39,7 @@ WHICH GENERATES THE GLSL ES PARSER (glslang_tab.cpp AND glslang_tab.h). > #endif > > #include "angle_gl.h" >-#include "compiler/translator/Cache.h" >+#include "compiler/translator/Declarator.h" > #include "compiler/translator/SymbolTable.h" > #include "compiler/translator/ParseContext.h" > #include "GLSLANG/ShaderLang.h" >@@ -63,20 +63,19 @@ using namespace sh; > %union { > struct { > union { >- TString *string; >+ const char *string; // pool allocated. > float f; > int i; > unsigned int u; > bool b; > }; >- TSymbol* symbol; >+ const TSymbol* symbol; > } lex; > struct { > TOperator op; > union { > TIntermNode *intermNode; > TIntermNodePair nodePair; >- TIntermFunctionCallOrMethod callOrMethodPair; > TIntermTyped *intermTypedNode; > TIntermAggregate *intermAggregate; > TIntermBlock *intermBlock; >@@ -93,8 +92,10 @@ using namespace sh; > TLayoutQualifier layoutQualifier; > TQualifier qualifier; > TFunction *function; >+ TFunctionLookup *functionLookup; > TParameter param; >- TField *field; >+ TDeclarator *declarator; >+ TDeclaratorList *declaratorList; > TFieldList *fieldList; > TQualifierWrapperBase *qualifierWrapper; > TTypeQualifierBuilder *typeQualifierBuilder; >@@ -122,41 +123,41 @@ extern void yyerror(YYLTYPE* yylloc, TParseContext* context, void *scanner, cons > } \ > } while (0) > >-#define VERTEX_ONLY(S, L) { \ >+#define VERTEX_ONLY(S, L) do { \ > if (context->getShaderType() != GL_VERTEX_SHADER) { \ > context->error(L, " supported in vertex shaders only", S); \ > } \ >-} >+} while (0) > >-#define COMPUTE_ONLY(S, L) { \ >+#define COMPUTE_ONLY(S, L) do { \ > if (context->getShaderType() != GL_COMPUTE_SHADER) { \ > context->error(L, " supported in compute shaders only", S); \ > } \ >-} >+} while (0) > > #define ES2_ONLY(S, L) { \ >- if (context->getShaderVersion() != 100) { \ >+ if (context->getShaderVersion() != 100) do { \ > context->error(L, " supported in GLSL ES 1.00 only", S); \ > } \ >-} >+} while (0) > >-#define ES3_OR_NEWER(TOKEN, LINE, REASON) { \ >+#define ES3_OR_NEWER(TOKEN, LINE, REASON) do { \ > if (context->getShaderVersion() < 300) { \ > context->error(LINE, REASON " supported in GLSL ES 3.00 and above only", TOKEN); \ > } \ >-} >+} while (0) > >-#define ES3_OR_NEWER_OR_MULTIVIEW(TOKEN, LINE, REASON) { \ >+#define ES3_OR_NEWER_OR_MULTIVIEW(TOKEN, LINE, REASON) do { \ > if (context->getShaderVersion() < 300 && !context->isExtensionEnabled(TExtension::OVR_multiview)) { \ > context->error(LINE, REASON " supported in GLSL ES 3.00 and above only", TOKEN); \ > } \ >-} >+} while (0) > >-#define ES3_1_ONLY(TOKEN, LINE, REASON) { \ >+#define ES3_1_ONLY(TOKEN, LINE, REASON) do { \ > if (context->getShaderVersion() != 310) { \ > context->error(LINE, REASON " supported in GLSL ES 3.10 only", TOKEN); \ > } \ >-} >+} while (0) > %} > > %token <lex> INVARIANT HIGH_PRECISION MEDIUM_PRECISION LOW_PRECISION PRECISION >@@ -172,6 +173,7 @@ extern void yyerror(YYLTYPE* yylloc, TParseContext* context, void *scanner, cons > %token <lex> ISAMPLER2D ISAMPLER3D ISAMPLERCUBE ISAMPLER2DARRAY > %token <lex> USAMPLER2D USAMPLER3D USAMPLERCUBE USAMPLER2DARRAY > %token <lex> SAMPLER2DMS ISAMPLER2DMS USAMPLER2DMS >+%token <lex> SAMPLER2DMSARRAY ISAMPLER2DMSARRAY USAMPLER2DMSARRAY > %token <lex> SAMPLER3D SAMPLER3DRECT SAMPLER2DSHADOW SAMPLERCUBESHADOW SAMPLER2DARRAYSHADOW > %token <lex> SAMPLEREXTERNAL2DY2YEXT > %token <lex> IMAGE2D IIMAGE2D UIMAGE2D IMAGE3D IIMAGE3D UIMAGE3D IMAGE2DARRAY IIMAGE2DARRAY UIMAGE2DARRAY >@@ -232,12 +234,15 @@ extern void yyerror(YYLTYPE* yylloc, TParseContext* context, void *scanner, cons > > %type <interm.typeSpecifierNonArray> type_specifier_nonarray struct_specifier > %type <interm.type> type_specifier_no_prec >-%type <interm.field> struct_declarator >-%type <interm.fieldList> struct_declarator_list struct_declaration struct_declaration_list >-%type <interm.function> function_header function_declarator function_identifier >-%type <interm.function> function_header_with_parameters function_call_header >-%type <interm> function_call_header_with_parameters function_call_header_no_parameters function_call_generic function_prototype >-%type <interm> function_call_or_method >+%type <interm.declarator> struct_declarator >+%type <interm.declaratorList> struct_declarator_list >+%type <interm.fieldList> struct_declaration struct_declaration_list >+%type <interm.function> function_header function_declarator >+%type <interm.function> function_header_with_parameters >+%type <interm.functionLookup> function_identifier function_call_header >+%type <interm.functionLookup> function_call_header_with_parameters function_call_header_no_parameters >+%type <interm.functionLookup> function_call_generic function_call_or_method >+%type <interm> function_prototype > > %type <lex> enter_struct > >@@ -251,10 +256,7 @@ identifier > variable_identifier > : IDENTIFIER { > // The symbol table search was done in the lexical phase >- $$ = context->parseVariableIdentifier(@1, $1.string, $1.symbol); >- >- // don't delete $1.string, it's used by error recovery, and the pool >- // pop will reclaim the memory >+ $$ = context->parseVariableIdentifier(@1, ImmutableString($1.string), $1.symbol); > } > ; > >@@ -285,10 +287,10 @@ primary_expression > | YUVCSCSTANDARDEXTCONSTANT { > if (!context->checkCanUseExtension(@1, TExtension::EXT_YUV_target)) > { >- context->error(@1, "unsupported value", $1.string->c_str()); >+ context->error(@1, "unsupported value", ImmutableString($1.string)); > } > TConstantUnion *unionArray = new TConstantUnion[1]; >- unionArray->setYuvCscStandardEXTConst(getYuvCscStandardEXT($1.string->c_str())); >+ unionArray->setYuvCscStandardEXTConst(getYuvCscStandardEXT(ImmutableString($1.string))); > $$ = context->addScalarLiteral(unionArray, @1); > } > | LEFT_PAREN expression RIGHT_PAREN { >@@ -307,7 +309,7 @@ postfix_expression > $$ = $1; > } > | postfix_expression DOT FIELD_SELECTION { >- $$ = context->addFieldSelectionExpression($1, @2, *$3.string, @3); >+ $$ = context->addFieldSelectionExpression($1, @2, ImmutableString($3.string), @3); > } > | postfix_expression INC_OP { > $$ = context->addUnaryMathLValue(EOpPostIncrement, $1, @2); >@@ -326,19 +328,18 @@ integer_expression > > function_call > : function_call_or_method { >- $$ = context->addFunctionCallOrMethod($1.function, $1.callOrMethodPair.arguments, $1.callOrMethodPair.thisNode, @1); >+ $$ = context->addFunctionCallOrMethod($1, @1); > } > ; > > function_call_or_method > : function_call_generic { > $$ = $1; >- $$.callOrMethodPair.thisNode = nullptr; > } > | postfix_expression DOT function_call_generic { > ES3_OR_NEWER("", @3, "methods"); > $$ = $3; >- $$.callOrMethodPair.thisNode = $1; >+ $$->setThisNode($1); > } > ; > >@@ -353,24 +354,21 @@ function_call_generic > > function_call_header_no_parameters > : function_call_header VOID_TYPE { >- $$.function = $1; >- $$.callOrMethodPair.arguments = context->createEmptyArgumentsList(); >+ $$ = $1; > } > | function_call_header { >- $$.function = $1; >- $$.callOrMethodPair.arguments = context->createEmptyArgumentsList(); >+ $$ = $1; > } > ; > > function_call_header_with_parameters > : function_call_header assignment_expression { >- $$.callOrMethodPair.arguments = context->createEmptyArgumentsList(); >- $$.function = $1; >- $$.callOrMethodPair.arguments->push_back($2); >+ $$ = $1; >+ $$->addArgument($2); > } > | function_call_header_with_parameters COMMA assignment_expression { >- $$.function = $1.function; >- $$.callOrMethodPair.arguments->push_back($3); >+ $$ = $1; >+ $$->addArgument($3); > } > ; > >@@ -387,10 +385,10 @@ function_identifier > $$ = context->addConstructorFunc($1); > } > | IDENTIFIER { >- $$ = context->addNonConstructorFunc($1.string, @1); >+ $$ = context->addNonConstructorFunc(ImmutableString($1.string), $1.symbol); > } > | FIELD_SELECTION { >- $$ = context->addNonConstructorFunc($1.string, @1); >+ $$ = context->addNonConstructorFunc(ImmutableString($1.string), $1.symbol); > } > ; > >@@ -592,7 +590,7 @@ constant_expression > > enter_struct > : IDENTIFIER LEFT_BRACE { >- context->enterStructDeclaration(@1, *$1.string); >+ context->enterStructDeclaration(@1, ImmutableString($1.string)); > $$ = $1; > } > ; >@@ -609,16 +607,16 @@ declaration > $$ = nullptr; > } > | type_qualifier enter_struct struct_declaration_list RIGHT_BRACE SEMICOLON { >- ES3_OR_NEWER($2.string->c_str(), @1, "interface blocks"); >- $$ = context->addInterfaceBlock(*$1, @2, *$2.string, $3, NULL, @$, NULL, @$); >+ ES3_OR_NEWER(ImmutableString($2.string), @1, "interface blocks"); >+ $$ = context->addInterfaceBlock(*$1, @2, ImmutableString($2.string), $3, kEmptyImmutableString, @$, NULL, @$); > } > | type_qualifier enter_struct struct_declaration_list RIGHT_BRACE IDENTIFIER SEMICOLON { >- ES3_OR_NEWER($2.string->c_str(), @1, "interface blocks"); >- $$ = context->addInterfaceBlock(*$1, @2, *$2.string, $3, $5.string, @5, NULL, @$); >+ ES3_OR_NEWER(ImmutableString($2.string), @1, "interface blocks"); >+ $$ = context->addInterfaceBlock(*$1, @2, ImmutableString($2.string), $3, ImmutableString($5.string), @5, NULL, @$); > } > | type_qualifier enter_struct struct_declaration_list RIGHT_BRACE IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET SEMICOLON { >- ES3_OR_NEWER($2.string->c_str(), @1, "interface blocks"); >- $$ = context->addInterfaceBlock(*$1, @2, *$2.string, $3, $5.string, @5, $7, @6); >+ ES3_OR_NEWER(ImmutableString($2.string), @1, "interface blocks"); >+ $$ = context->addInterfaceBlock(*$1, @2, ImmutableString($2.string), $3, ImmutableString($5.string), @5, $7, @6); > } > | type_qualifier SEMICOLON { > context->parseGlobalLayoutQualifier(*$1); >@@ -626,7 +624,7 @@ declaration > } > | type_qualifier IDENTIFIER SEMICOLON // e.g. to qualify an existing variable as invariant > { >- $$ = context->parseInvariantDeclaration(*$1, @2, $2.string, $2.symbol); >+ $$ = context->parseInvariantDeclaration(*$1, @2, ImmutableString($2.string), $2.symbol); > } > ; > >@@ -653,7 +651,7 @@ function_header_with_parameters > $$ = $1; > if ($2.type->getBasicType() != EbtVoid) > { >- $1->addParameter($2.turnToConst()); >+ $1->addParameter($2.createVariable(&context->symbolTable)); > } > } > | function_header_with_parameters COMMA parameter_declaration { >@@ -667,14 +665,14 @@ function_header_with_parameters > } > else > { >- $1->addParameter($3.turnToConst()); >+ $1->addParameter($3.createVariable(&context->symbolTable)); > } > } > ; > > function_header > : fully_specified_type IDENTIFIER LEFT_PAREN { >- $$ = context->parseFunctionHeader($1, $2.string, @2); >+ $$ = context->parseFunctionHeader($1, ImmutableString($2.string), @2); > > context->symbolTable.push(); > context->enterFunctionDeclaration(); >@@ -684,10 +682,10 @@ function_header > parameter_declarator > // Type + name > : type_specifier identifier { >- $$ = context->parseParameterDeclarator($1, $2.string, @2); >+ $$ = context->parseParameterDeclarator($1, ImmutableString($2.string), @2); > } > | type_specifier identifier array_specifier { >- $$ = context->parseParameterArrayDeclarator($2.string, @2, *($3), @3, &$1); >+ $$ = context->parseParameterArrayDeclarator(ImmutableString($2.string), @2, *($3), @3, &$1); > } > ; > >@@ -723,44 +721,44 @@ init_declarator_list > } > | init_declarator_list COMMA identifier { > $$ = $1; >- context->parseDeclarator($$.type, @3, *$3.string, $$.intermDeclaration); >+ context->parseDeclarator($$.type, @3, ImmutableString($3.string), $$.intermDeclaration); > } > | init_declarator_list COMMA identifier array_specifier { > $$ = $1; >- context->parseArrayDeclarator($$.type, @3, *$3.string, @4, *($4), $$.intermDeclaration); >+ context->parseArrayDeclarator($$.type, @3, ImmutableString($3.string), @4, *($4), $$.intermDeclaration); > } > | init_declarator_list COMMA identifier array_specifier EQUAL initializer { > ES3_OR_NEWER("=", @5, "first-class arrays (array initializer)"); > $$ = $1; >- context->parseArrayInitDeclarator($$.type, @3, *$3.string, @4, *($4), @5, $6, $$.intermDeclaration); >+ context->parseArrayInitDeclarator($$.type, @3, ImmutableString($3.string), @4, *($4), @5, $6, $$.intermDeclaration); > } > | init_declarator_list COMMA identifier EQUAL initializer { > $$ = $1; >- context->parseInitDeclarator($$.type, @3, *$3.string, @4, $5, $$.intermDeclaration); >+ context->parseInitDeclarator($$.type, @3, ImmutableString($3.string), @4, $5, $$.intermDeclaration); > } > ; > > single_declaration > : fully_specified_type { > $$.type = $1; >- $$.intermDeclaration = context->parseSingleDeclaration($$.type, @1, ""); >+ $$.intermDeclaration = context->parseSingleDeclaration($$.type, @1, kEmptyImmutableString); > } > | fully_specified_type identifier { > $$.type = $1; >- $$.intermDeclaration = context->parseSingleDeclaration($$.type, @2, *$2.string); >+ $$.intermDeclaration = context->parseSingleDeclaration($$.type, @2, ImmutableString($2.string)); > } > | fully_specified_type identifier array_specifier { > $$.type = $1; >- $$.intermDeclaration = context->parseSingleArrayDeclaration($$.type, @2, *$2.string, @3, *($3)); >+ $$.intermDeclaration = context->parseSingleArrayDeclaration($$.type, @2, ImmutableString($2.string), @3, *($3)); > } > | fully_specified_type identifier array_specifier EQUAL initializer { > ES3_OR_NEWER("[]", @3, "first-class arrays (array initializer)"); > $$.type = $1; >- $$.intermDeclaration = context->parseSingleArrayInitDeclaration($$.type, @2, *$2.string, @3, *($3), @4, $5); >+ $$.intermDeclaration = context->parseSingleArrayInitDeclaration($$.type, @2, ImmutableString($2.string), @3, *($3), @4, $5); > } > | fully_specified_type identifier EQUAL initializer { > $$.type = $1; >- $$.intermDeclaration = context->parseSingleInitDeclaration($$.type, @2, *$2.string, @3, $4); >+ $$.intermDeclaration = context->parseSingleInitDeclaration($$.type, @2, ImmutableString($2.string), @3, $4); > } > ; > >@@ -914,16 +912,16 @@ layout_qualifier_id_list > > layout_qualifier_id > : IDENTIFIER { >- $$ = context->parseLayoutQualifier(*$1.string, @1); >+ $$ = context->parseLayoutQualifier(ImmutableString($1.string), @1); > } > | IDENTIFIER EQUAL INTCONSTANT { >- $$ = context->parseLayoutQualifier(*$1.string, @1, $3.i, @3); >+ $$ = context->parseLayoutQualifier(ImmutableString($1.string), @1, $3.i, @3); > } > | IDENTIFIER EQUAL UINTCONSTANT { >- $$ = context->parseLayoutQualifier(*$1.string, @1, $3.i, @3); >+ $$ = context->parseLayoutQualifier(ImmutableString($1.string), @1, $3.i, @3); > } > | SHARED { >- $$ = context->parseLayoutQualifier("shared", @1); >+ $$ = context->parseLayoutQualifier(ImmutableString("shared"), @1); > } > ; > >@@ -1087,6 +1085,9 @@ type_specifier_nonarray > | SAMPLER2DMS { > $$.initialize(EbtSampler2DMS, @1); > } >+ | SAMPLER2DMSARRAY { >+ $$.initialize(EbtSampler2DMSArray, @1); >+ } > | ISAMPLER2D { > $$.initialize(EbtISampler2D, @1); > } >@@ -1102,6 +1103,9 @@ type_specifier_nonarray > | ISAMPLER2DMS { > $$.initialize(EbtISampler2DMS, @1); > } >+ | ISAMPLER2DMSARRAY { >+ $$.initialize(EbtISampler2DMSArray, @1); >+ } > | USAMPLER2D { > $$.initialize(EbtUSampler2D, @1); > } >@@ -1117,6 +1121,9 @@ type_specifier_nonarray > | USAMPLER2DMS { > $$.initialize(EbtUSampler2DMS, @1); > } >+ | USAMPLER2DMSARRAY { >+ $$.initialize(EbtUSampler2DMSArray, @1); >+ } > | SAMPLER2DSHADOW { > $$.initialize(EbtSampler2DShadow, @1); > } >@@ -1150,9 +1157,6 @@ type_specifier_nonarray > } > $$.initialize(EbtSampler2DRect, @1); > } >- | struct_specifier { >- $$ = $1; >- } > | IMAGE2D { > $$.initialize(EbtImage2D, @1); > } >@@ -1192,19 +1196,22 @@ type_specifier_nonarray > | ATOMICUINT { > $$.initialize(EbtAtomicCounter, @1); > } >+ | struct_specifier { >+ $$ = $1; >+ } > | TYPE_NAME { > // This is for user defined type names. The lexical phase looked up the type. >- TType& structure = static_cast<TVariable*>($1.symbol)->getType(); >- $$.initializeStruct(structure.getStruct(), false, @1); >+ const TStructure *structure = static_cast<const TStructure*>($1.symbol); >+ $$.initializeStruct(structure, false, @1); > } > ; > > struct_specifier >- : STRUCT identifier LEFT_BRACE { context->enterStructDeclaration(@2, *$2.string); } struct_declaration_list RIGHT_BRACE { >- $$ = context->addStructure(@1, @2, $2.string, $5); >+ : STRUCT identifier LEFT_BRACE { context->enterStructDeclaration(@2, ImmutableString($2.string)); } struct_declaration_list RIGHT_BRACE { >+ $$ = context->addStructure(@1, @2, ImmutableString($2.string), $5); > } >- | STRUCT LEFT_BRACE { context->enterStructDeclaration(@2, *$2.string); } struct_declaration_list RIGHT_BRACE { >- $$ = context->addStructure(@1, @$, NewPoolTString(""), $4); >+ | STRUCT LEFT_BRACE { context->enterStructDeclaration(@2, kEmptyImmutableString); } struct_declaration_list RIGHT_BRACE { >+ $$ = context->addStructure(@1, @$, kEmptyImmutableString, $4); > } > ; > >@@ -1229,7 +1236,7 @@ struct_declaration > > struct_declarator_list > : struct_declarator { >- $$ = NewPoolTFieldList(); >+ $$ = new TDeclaratorList(); > $$->push_back($1); > } > | struct_declarator_list COMMA struct_declarator { >@@ -1239,10 +1246,10 @@ struct_declarator_list > > struct_declarator > : identifier { >- $$ = context->parseStructDeclarator($1.string, @1); >+ $$ = context->parseStructDeclarator(ImmutableString($1.string), @1); > } > | identifier array_specifier { >- $$ = context->parseStructArrayDeclarator($1.string, @1, *($2), @2); >+ $$ = context->parseStructArrayDeclarator(ImmutableString($1.string), @1, $2); > } > ; > >@@ -1307,11 +1314,11 @@ compound_statement_no_new_scope > statement_list > : statement { > $$ = new TIntermBlock(); >- $$->appendStatement($1); >+ context->appendStatement($$, $1); > } > | statement_list statement { > $$ = $1; >- $$->appendStatement($2); >+ context->appendStatement($$, $2); > } > ; > >@@ -1361,7 +1368,7 @@ condition > context->checkIsScalarBool($1->getLine(), $1); > } > | fully_specified_type identifier EQUAL initializer { >- $$ = context->addConditionInitializer($1, *$2.string, $4, @2); >+ $$ = context->addConditionInitializer($1, ImmutableString($2.string), $4, @2); > } > ; > >@@ -1454,7 +1461,7 @@ external_declaration > > function_definition > : function_prototype { >- context->parseFunctionDefinitionHeader(@1, &($1.function), &($1.intermFunctionPrototype)); >+ context->parseFunctionDefinitionHeader(@1, $1.function, &($1.intermFunctionPrototype)); > } > compound_statement_no_new_scope { > $$ = context->addFunctionDefinition($1.intermFunctionPrototype, $3, @1); >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_lex.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_lex.cpp >index d2f991984ff..2bf0ab37b4d 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_lex.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_lex.cpp >@@ -11,9 +11,9 @@ > > // Ignore errors in auto-generated code. > #if defined(__GNUC__) >+#pragma GCC diagnostic ignored "-Wswitch-enum" > #pragma GCC diagnostic ignored "-Wunused-function" > #pragma GCC diagnostic ignored "-Wunused-variable" >-#pragma GCC diagnostic ignored "-Wswitch-enum" > #elif defined(_MSC_VER) > #pragma warning(disable: 4005) > #pragma warning(disable: 4065) >@@ -23,6 +23,11 @@ > #pragma warning(disable: 4701) > #pragma warning(disable: 4702) > #endif >+#if defined(__clang__) >+#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" >+// Flex isn't semi-colon clean. >+#pragma clang diagnostic ignored "-Wextra-semi-stmt" >+#endif > > > >@@ -107,10 +112,10 @@ > /* First, we deal with platform-specific or compiler-specific issues. */ > > /* begin standard C headers. */ >-#include <stdio.h> >-#include <string.h> > #include <errno.h> >+#include <stdio.h> > #include <stdlib.h> >+#include <string.h> > > /* end standard C headers. */ > >@@ -570,58 +575,58 @@ static const flex_int16_t yy_accept[891] = > 169, 170, 184, 184, 184, 26, 166, 184, 184, 184, > > 184, 184, 52, 53, 54, 184, 184, 184, 184, 184, >- 184, 184, 184, 184, 184, 184, 109, 184, 184, 184, >+ 184, 184, 184, 184, 184, 184, 112, 184, 184, 184, > 184, 184, 184, 184, 184, 160, 184, 184, 184, 184, > 184, 184, 184, 184, 184, 184, 184, 146, 184, 184, > 183, 58, 59, 60, 184, 184, 15, 184, 184, 184, >- 114, 184, 184, 9, 184, 184, 112, 184, 184, 184, >- 161, 156, 115, 184, 184, 184, 184, 184, 184, 152, >- 184, 184, 184, 184, 184, 84, 40, 43, 45, 44, >+ 117, 184, 184, 9, 184, 184, 115, 184, 184, 184, >+ 161, 156, 118, 184, 184, 184, 184, 184, 184, 152, >+ 184, 184, 184, 184, 184, 87, 40, 43, 45, 44, > 41, 47, 46, 48, 42, 184, 184, 184, 184, 167, >- 143, 184, 184, 154, 184, 184, 184, 36, 110, 27, >+ 143, 184, 184, 154, 184, 184, 184, 36, 113, 27, > >- 180, 23, 155, 83, 184, 165, 18, 184, 184, 184, >+ 180, 23, 155, 86, 184, 165, 18, 184, 184, 184, > 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, > 184, 184, 184, 20, 35, 184, 184, 184, 184, 184, >- 184, 116, 89, 95, 184, 184, 184, 184, 184, 86, >- 88, 3, 184, 184, 184, 184, 184, 184, 184, 184, >+ 184, 119, 92, 98, 184, 184, 184, 184, 184, 89, >+ 91, 3, 184, 184, 184, 184, 184, 184, 184, 184, > 184, 184, 184, 148, 184, 184, 184, 184, 184, 8, > 184, 184, 10, 184, 184, 184, 184, 184, 184, 21, >- 103, 12, 157, 117, 90, 97, 184, 184, 184, 184, >+ 106, 12, 157, 120, 93, 100, 184, 184, 184, 184, > 184, 184, 184, 184, 184, 184, 184, 184, 184, 153, >- 184, 184, 184, 101, 107, 104, 184, 184, 184, 184, >+ 184, 184, 184, 104, 110, 107, 184, 184, 184, 184, > >- 184, 184, 184, 149, 118, 91, 96, 184, 184, 164, >- 184, 105, 184, 184, 184, 184, 6, 184, 184, 184, >- 184, 184, 184, 184, 184, 184, 100, 158, 1, 184, >- 184, 184, 184, 184, 184, 182, 184, 113, 5, 177, >+ 184, 184, 184, 149, 121, 94, 99, 184, 184, 164, >+ 184, 108, 184, 184, 184, 184, 6, 184, 184, 184, >+ 184, 184, 184, 184, 184, 184, 103, 158, 1, 184, >+ 184, 184, 184, 184, 184, 182, 184, 116, 5, 177, > 61, 64, 184, 184, 184, 184, 184, 184, 184, 184, >- 184, 184, 184, 184, 184, 102, 184, 184, 184, 184, >- 184, 184, 98, 184, 184, 184, 184, 184, 131, 69, >+ 184, 184, 184, 184, 184, 105, 184, 184, 184, 184, >+ 184, 184, 101, 184, 184, 184, 184, 184, 134, 69, > 70, 184, 184, 184, 184, 184, 184, 184, 184, 184, >- 184, 184, 184, 184, 184, 111, 184, 184, 184, 99, >- 133, 74, 75, 184, 184, 184, 184, 106, 184, 184, >+ 184, 184, 184, 184, 184, 114, 184, 184, 184, 102, >+ 136, 74, 75, 184, 184, 184, 184, 109, 184, 184, > >- 184, 184, 184, 184, 184, 126, 184, 184, 184, 184, >+ 184, 184, 184, 184, 184, 129, 184, 184, 184, 184, > 184, 184, 184, 184, 184, 184, 184, 68, 184, 184, > 184, 184, 62, 184, 184, 184, 184, 184, 184, 184, >- 184, 184, 184, 184, 184, 184, 184, 127, 119, 184, >- 92, 184, 184, 184, 73, 184, 184, 71, 184, 184, >+ 184, 184, 184, 184, 184, 184, 184, 130, 122, 184, >+ 95, 184, 184, 184, 73, 184, 184, 71, 184, 184, > 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, >- 184, 184, 128, 184, 184, 78, 184, 184, 76, 184, >- 184, 120, 93, 184, 122, 184, 123, 184, 184, 184, >- 184, 184, 184, 108, 184, 184, 184, 184, 66, 184, >- 65, 137, 184, 184, 121, 94, 184, 184, 184, 184, >- >- 184, 184, 184, 184, 184, 184, 184, 184, 135, 138, >- 184, 129, 184, 67, 184, 184, 184, 184, 184, 184, >- 184, 184, 136, 139, 184, 184, 184, 184, 132, 72, >+ 184, 184, 131, 184, 184, 78, 184, 184, 76, 184, >+ 184, 123, 96, 184, 125, 184, 126, 184, 184, 184, >+ 184, 184, 184, 111, 184, 184, 184, 184, 66, 184, >+ 65, 140, 184, 184, 124, 97, 184, 184, 184, 184, >+ >+ 184, 184, 184, 184, 184, 184, 184, 184, 138, 141, >+ 184, 132, 184, 67, 184, 184, 184, 184, 184, 184, >+ 184, 184, 139, 142, 184, 184, 184, 184, 135, 72, > 184, 184, 184, 178, 184, 184, 184, 79, 184, 184, >- 134, 77, 184, 184, 184, 184, 184, 184, 184, 184, >- 184, 140, 184, 184, 184, 184, 184, 184, 184, 184, >- 141, 184, 184, 184, 184, 80, 184, 142, 85, 184, >- 124, 125, 87, 184, 184, 184, 63, 184, 184, 184, >- 179, 184, 130, 81, 184, 184, 184, 184, 82, 0 >+ 137, 77, 184, 184, 184, 184, 184, 184, 184, 184, >+ 184, 83, 184, 184, 184, 184, 184, 184, 184, 184, >+ 84, 184, 184, 184, 184, 80, 184, 85, 88, 184, >+ 127, 128, 90, 184, 184, 184, 63, 184, 184, 184, >+ 179, 184, 133, 81, 184, 184, 184, 184, 82, 0 > } ; > > static const YY_CHAR yy_ec[256] = >@@ -1180,11 +1185,11 @@ IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh, > WHICH GENERATES THE GLSL ES LEXER (glslang_lex.cpp). > */ > >-#include "compiler/translator/glslang.h" >-#include "compiler/translator/ParseContext.h" > #include "compiler/preprocessor/Token.h" >-#include "compiler/translator/util.h" >+#include "compiler/translator/ParseContext.h" >+#include "compiler/translator/glslang.h" > #include "compiler/translator/length_limits.h" >+#include "compiler/translator/util.h" > > using namespace sh; > >@@ -1202,6 +1207,7 @@ using namespace sh; > #endif > #endif > >+#define YY_NO_INPUT > #define YY_USER_ACTION \ > yylloc->first_file = yylloc->last_file = yycolumn; \ > yylloc->first_line = yylloc->last_line = yylineno; >@@ -1220,6 +1226,8 @@ static int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int toke > static int ES2_and_ES3_reserved_ES3_1_keyword(TParseContext *context, int token); > static int ES2_and_ES3_ident_ES3_1_keyword(TParseContext *context, int token); > static int ES3_extension_keyword_else_ident(TParseContext *context, TExtension extension, int token); >+static int ES2_ident_ES3_reserved_ES3_1_extension_keyword(TParseContext *context, TExtension extension, int token); >+static int ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(TParseContext *context, TExtension extension, int token); > static int uint_constant(TParseContext *context); > static int int_constant(TParseContext *context); > static int float_constant(yyscan_t yyscanner); >@@ -1963,7 +1971,7 @@ YY_RULE_SETUP > YY_BREAK > case 68: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, SAMPLER2DMS); } >+{ return ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(context, TExtension::ANGLE_texture_multisample, SAMPLER2DMS); } > YY_BREAK > case 69: > YY_RULE_SETUP >@@ -1983,7 +1991,7 @@ YY_RULE_SETUP > YY_BREAK > case 73: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, ISAMPLER2DMS); } >+{ return ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(context, TExtension::ANGLE_texture_multisample, ISAMPLER2DMS); } > YY_BREAK > case 74: > YY_RULE_SETUP >@@ -2003,7 +2011,7 @@ YY_RULE_SETUP > YY_BREAK > case 78: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, USAMPLER2DMS); } >+{ return ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(context, TExtension::ANGLE_texture_multisample, USAMPLER2DMS); } > YY_BREAK > case 79: > YY_RULE_SETUP >@@ -2023,104 +2031,113 @@ YY_RULE_SETUP > YY_BREAK > case 83: > YY_RULE_SETUP >-{ return STRUCT; } >+{ return ES2_ident_ES3_reserved_ES3_1_extension_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, SAMPLER2DMSARRAY); } > YY_BREAK > case 84: > YY_RULE_SETUP >-{ return ES2_ident_ES3_keyword_multiview_keyword(context, LAYOUT); } >+{ return ES2_ident_ES3_reserved_ES3_1_extension_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, ISAMPLER2DMSARRAY); } > YY_BREAK > case 85: > YY_RULE_SETUP >-{ return ES3_extension_keyword_else_ident(context, TExtension::EXT_YUV_target, YUVCSCSTANDARDEXT); } >+{ return ES2_ident_ES3_reserved_ES3_1_extension_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, USAMPLER2DMSARRAY); } > YY_BREAK > case 86: > YY_RULE_SETUP >-{ return yuvcscstandardext_constant(context); } >+{ return STRUCT; } > YY_BREAK > case 87: > YY_RULE_SETUP >-{ return yuvcscstandardext_constant(context); } >+{ return ES2_ident_ES3_keyword_multiview_keyword(context, LAYOUT); } > YY_BREAK > case 88: > YY_RULE_SETUP >-{ return yuvcscstandardext_constant(context); } >+{ return ES3_extension_keyword_else_ident(context, TExtension::EXT_YUV_target, YUVCSCSTANDARDEXT); } > YY_BREAK > case 89: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2D); } >+{ return yuvcscstandardext_constant(context); } > YY_BREAK > case 90: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2D); } >+{ return yuvcscstandardext_constant(context); } > YY_BREAK > case 91: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2D); } >+{ return yuvcscstandardext_constant(context); } > YY_BREAK > case 92: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2DARRAY); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2D); } > YY_BREAK > case 93: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2DARRAY); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2D); } > YY_BREAK > case 94: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2DARRAY); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2D); } > YY_BREAK > case 95: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE3D); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2DARRAY); } > YY_BREAK > case 96: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE3D); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2DARRAY); } > YY_BREAK > case 97: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE3D); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2DARRAY); } > YY_BREAK > case 98: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGECUBE); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE3D); } > YY_BREAK > case 99: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGECUBE); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE3D); } > YY_BREAK > case 100: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGECUBE); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE3D); } > YY_BREAK > case 101: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, READONLY); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGECUBE); } > YY_BREAK > case 102: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, WRITEONLY); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGECUBE); } > YY_BREAK > case 103: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, COHERENT); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGECUBE); } > YY_BREAK > case 104: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, RESTRICT); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, READONLY); } > YY_BREAK > case 105: > YY_RULE_SETUP >-{ return ES2_and_ES3_reserved_ES3_1_keyword(context, VOLATILE); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, WRITEONLY); } > YY_BREAK > case 106: > YY_RULE_SETUP >-{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, ATOMICUINT); } >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, COHERENT); } > YY_BREAK >-/* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */ > case 107: >+YY_RULE_SETUP >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, RESTRICT); } >+ YY_BREAK > case 108: >+YY_RULE_SETUP >+{ return ES2_and_ES3_reserved_ES3_1_keyword(context, VOLATILE); } >+ YY_BREAK > case 109: >+YY_RULE_SETUP >+{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, ATOMICUINT); } >+ YY_BREAK >+/* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */ > case 110: > case 111: > case 112: >@@ -2155,12 +2172,12 @@ case 140: > case 141: > case 142: > YY_RULE_SETUP >-{ >+{ > if (context->getShaderVersion() < 300) { >- yylval->lex.string = NewPoolTString(yytext); >- return check_type(yyscanner); >- } >- return reserved_word(yyscanner); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); >+ return check_type(yyscanner); >+ } >+ return reserved_word(yyscanner); > } > YY_BREAK > /* Reserved keywords in GLSL ES 1.00 that are not reserved in GLSL ES 3.00 */ >@@ -2169,7 +2186,7 @@ YY_RULE_SETUP > { > if (context->getShaderVersion() >= 300) > { >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > >@@ -2223,7 +2240,7 @@ YY_RULE_SETUP > case 184: > YY_RULE_SETUP > { >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > YY_BREAK >@@ -2459,7 +2476,7 @@ case 242: > YY_RULE_SETUP > { > BEGIN(INITIAL); >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return FIELD_SELECTION; > } > YY_BREAK >@@ -3778,9 +3795,9 @@ void yyfree (void * ptr , yyscan_t yyscanner) > > > yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner) { >- pp::Token token; >+ angle::pp::Token token; > yyget_extra(yyscanner)->getPreprocessor().lex(&token); >- yy_size_t len = token.type == pp::Token::LAST ? 0 : token.text.size(); >+ yy_size_t len = token.type == angle::pp::Token::LAST ? 0 : token.text.size(); > if (len < max_size) > memcpy(buf, token.text.c_str(), len); > yyset_column(token.location.file, yyscanner); >@@ -3795,14 +3812,13 @@ yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner) { > > int check_type(yyscan_t yyscanner) { > struct yyguts_t* yyg = (struct yyguts_t*) yyscanner; >- >+ > int token = IDENTIFIER; >- TSymbol* symbol = yyextra->symbolTable.find(yytext, yyextra->getShaderVersion()); >- if (symbol && symbol->isVariable()) { >- TVariable* variable = static_cast<TVariable*>(symbol); >- if (variable->isUserType()) { >- token = TYPE_NAME; >- } >+ // Note that the ImmutableString used here isn't static or pool allocated - but it's fine since yytext is valid for the duration of its use. >+ const TSymbol* symbol = yyextra->symbolTable.find(ImmutableString(yytext, yyleng), yyextra->getShaderVersion()); >+ if (symbol && symbol->isStruct()) >+ { >+ token = TYPE_NAME; > } > yylval->lex.symbol = symbol; > return token; >@@ -3846,7 +3862,7 @@ int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token) > > if (context->getShaderVersion() < 300) > { >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > else if (context->getShaderVersion() == 300) >@@ -3865,7 +3881,7 @@ int ES2_ident_ES3_keyword(TParseContext *context, int token) > // not a reserved word in GLSL ES 1.00, so could be used as an identifier/type name > if (context->getShaderVersion() < 300) > { >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > >@@ -3879,9 +3895,9 @@ int ES2_ident_ES3_keyword_multiview_keyword(TParseContext *context, int token) > > // not a reserved word in GLSL ES 1.00, so could be used as an identifier/type name > // except when multiview extension is enabled >- if (context->getShaderVersion() < 300 && !context->isExtensionEnabled(TExtension::OVR_multiview)) >+ if (context->getShaderVersion() < 300 && !context->isExtensionEnabled(TExtension::OVR_multiview2)) > { >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > >@@ -3908,7 +3924,7 @@ int ES2_and_ES3_ident_ES3_1_keyword(TParseContext *context, int token) > // not a reserved word in GLSL ES 1.00 and GLSL ES 3.00, so could be used as an identifier/type name > if (context->getShaderVersion() < 310) > { >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > >@@ -3926,7 +3942,48 @@ int ES3_extension_keyword_else_ident(TParseContext *context, TExtension extensio > return token; > } > >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); >+ return check_type(yyscanner); >+} >+ >+int ES2_ident_ES3_reserved_ES3_1_extension_keyword(TParseContext *context, TExtension extension, int token) >+{ >+ struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); >+ yyscan_t yyscanner = (yyscan_t) context->getScanner(); >+ >+ // a keyword in GLSL ES 3.10 with enabled extension >+ if (context->getShaderVersion() >= 310 && context->isExtensionEnabled(extension)) >+ { >+ return token; >+ } >+ // a reserved word in GLSL ES 3.00+ >+ if (context->getShaderVersion() >= 300) >+ { >+ return reserved_word(yyscanner); >+ } >+ >+ // Otherwise can be used as an identifier/type name >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); >+ return check_type(yyscanner); >+} >+ >+int ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(TParseContext *context, TExtension extension, int token) >+{ >+ struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); >+ yyscan_t yyscanner = (yyscan_t) context->getScanner(); >+ >+ // A keyword in GLSL ES 3.00 with enabled extension or in GLSL ES 3.10 >+ if (context->getShaderVersion() >= 310 || (context->getShaderVersion() == 300 && context->isExtensionEnabled(extension))) >+ { >+ return token; >+ } >+ >+ if(context->getShaderVersion() == 300) >+ { >+ return reserved_word(yyscanner); >+ } >+ >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > >@@ -3999,11 +4056,11 @@ int yuvcscstandardext_constant(TParseContext *context) > // a reserved word in GLSL ES 3.00 with enabled extension, otherwise could be used as an identifier/type name > if (context->getShaderVersion() >= 300 && context->isExtensionEnabled(TExtension::EXT_YUV_target)) > { >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return YUVCSCSTANDARDEXTCONSTANT; > } > >- yylval->lex.string = NewPoolTString(yytext); >+ yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); > return check_type(yyscanner); > } > >@@ -4033,7 +4090,7 @@ int glslang_scan(size_t count, const char* const string[], const int length[], > yyset_lineno(1, context->getScanner()); > > // Initialize preprocessor. >- pp::Preprocessor *preprocessor = &context->getPreprocessor(); >+ angle::pp::Preprocessor *preprocessor = &context->getPreprocessor(); > > if (!preprocessor->init(count, string, length)) > return 1; >@@ -4052,3 +4109,4 @@ int glslang_scan(size_t count, const char* const string[], const int length[], > return 0; > } > >+ >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.cpp >index 14cd5360c3c..a60203b85cb 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.cpp >@@ -1,7 +1,5 @@ > /* A Bison parser, made by GNU Bison 3.0.4. */ > >-/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */ >- > /* Bison implementation for Yacc-like parsers in C > > Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. >@@ -60,12 +58,8 @@ > /* Pull parsers. */ > #define YYPULL 1 > >- >- >- > /* Copy the first part of user declarations. */ > >- > // > // Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved. > // Use of this source code is governed by a BSD-style license that can be >@@ -91,7 +85,7 @@ > #endif > > #include "angle_gl.h" >-#include "compiler/translator/Cache.h" >+#include "compiler/translator/Declarator.h" > #include "compiler/translator/SymbolTable.h" > #include "compiler/translator/ParseContext.h" > #include "GLSLANG/ShaderLang.h" >@@ -220,80 +214,83 @@ extern int yydebug; > SAMPLER2DMS = 332, > ISAMPLER2DMS = 333, > USAMPLER2DMS = 334, >- SAMPLER3D = 335, >- SAMPLER3DRECT = 336, >- SAMPLER2DSHADOW = 337, >- SAMPLERCUBESHADOW = 338, >- SAMPLER2DARRAYSHADOW = 339, >- SAMPLEREXTERNAL2DY2YEXT = 340, >- IMAGE2D = 341, >- IIMAGE2D = 342, >- UIMAGE2D = 343, >- IMAGE3D = 344, >- IIMAGE3D = 345, >- UIMAGE3D = 346, >- IMAGE2DARRAY = 347, >- IIMAGE2DARRAY = 348, >- UIMAGE2DARRAY = 349, >- IMAGECUBE = 350, >- IIMAGECUBE = 351, >- UIMAGECUBE = 352, >- ATOMICUINT = 353, >- LAYOUT = 354, >- YUVCSCSTANDARDEXT = 355, >- YUVCSCSTANDARDEXTCONSTANT = 356, >- IDENTIFIER = 357, >- TYPE_NAME = 358, >- FLOATCONSTANT = 359, >- INTCONSTANT = 360, >- UINTCONSTANT = 361, >- BOOLCONSTANT = 362, >- FIELD_SELECTION = 363, >- LEFT_OP = 364, >- RIGHT_OP = 365, >- INC_OP = 366, >- DEC_OP = 367, >- LE_OP = 368, >- GE_OP = 369, >- EQ_OP = 370, >- NE_OP = 371, >- AND_OP = 372, >- OR_OP = 373, >- XOR_OP = 374, >- MUL_ASSIGN = 375, >- DIV_ASSIGN = 376, >- ADD_ASSIGN = 377, >- MOD_ASSIGN = 378, >- LEFT_ASSIGN = 379, >- RIGHT_ASSIGN = 380, >- AND_ASSIGN = 381, >- XOR_ASSIGN = 382, >- OR_ASSIGN = 383, >- SUB_ASSIGN = 384, >- LEFT_PAREN = 385, >- RIGHT_PAREN = 386, >- LEFT_BRACKET = 387, >- RIGHT_BRACKET = 388, >- LEFT_BRACE = 389, >- RIGHT_BRACE = 390, >- DOT = 391, >- COMMA = 392, >- COLON = 393, >- EQUAL = 394, >- SEMICOLON = 395, >- BANG = 396, >- DASH = 397, >- TILDE = 398, >- PLUS = 399, >- STAR = 400, >- SLASH = 401, >- PERCENT = 402, >- LEFT_ANGLE = 403, >- RIGHT_ANGLE = 404, >- VERTICAL_BAR = 405, >- CARET = 406, >- AMPERSAND = 407, >- QUESTION = 408 >+ SAMPLER2DMSARRAY = 335, >+ ISAMPLER2DMSARRAY = 336, >+ USAMPLER2DMSARRAY = 337, >+ SAMPLER3D = 338, >+ SAMPLER3DRECT = 339, >+ SAMPLER2DSHADOW = 340, >+ SAMPLERCUBESHADOW = 341, >+ SAMPLER2DARRAYSHADOW = 342, >+ SAMPLEREXTERNAL2DY2YEXT = 343, >+ IMAGE2D = 344, >+ IIMAGE2D = 345, >+ UIMAGE2D = 346, >+ IMAGE3D = 347, >+ IIMAGE3D = 348, >+ UIMAGE3D = 349, >+ IMAGE2DARRAY = 350, >+ IIMAGE2DARRAY = 351, >+ UIMAGE2DARRAY = 352, >+ IMAGECUBE = 353, >+ IIMAGECUBE = 354, >+ UIMAGECUBE = 355, >+ ATOMICUINT = 356, >+ LAYOUT = 357, >+ YUVCSCSTANDARDEXT = 358, >+ YUVCSCSTANDARDEXTCONSTANT = 359, >+ IDENTIFIER = 360, >+ TYPE_NAME = 361, >+ FLOATCONSTANT = 362, >+ INTCONSTANT = 363, >+ UINTCONSTANT = 364, >+ BOOLCONSTANT = 365, >+ FIELD_SELECTION = 366, >+ LEFT_OP = 367, >+ RIGHT_OP = 368, >+ INC_OP = 369, >+ DEC_OP = 370, >+ LE_OP = 371, >+ GE_OP = 372, >+ EQ_OP = 373, >+ NE_OP = 374, >+ AND_OP = 375, >+ OR_OP = 376, >+ XOR_OP = 377, >+ MUL_ASSIGN = 378, >+ DIV_ASSIGN = 379, >+ ADD_ASSIGN = 380, >+ MOD_ASSIGN = 381, >+ LEFT_ASSIGN = 382, >+ RIGHT_ASSIGN = 383, >+ AND_ASSIGN = 384, >+ XOR_ASSIGN = 385, >+ OR_ASSIGN = 386, >+ SUB_ASSIGN = 387, >+ LEFT_PAREN = 388, >+ RIGHT_PAREN = 389, >+ LEFT_BRACKET = 390, >+ RIGHT_BRACKET = 391, >+ LEFT_BRACE = 392, >+ RIGHT_BRACE = 393, >+ DOT = 394, >+ COMMA = 395, >+ COLON = 396, >+ EQUAL = 397, >+ SEMICOLON = 398, >+ BANG = 399, >+ DASH = 400, >+ TILDE = 401, >+ PLUS = 402, >+ STAR = 403, >+ SLASH = 404, >+ PERCENT = 405, >+ LEFT_ANGLE = 406, >+ RIGHT_ANGLE = 407, >+ VERTICAL_BAR = 408, >+ CARET = 409, >+ AMPERSAND = 410, >+ QUESTION = 411 > }; > #endif > >@@ -306,20 +303,19 @@ union YYSTYPE > > struct { > union { >- TString *string; >+ const char *string; // pool allocated. > float f; > int i; > unsigned int u; > bool b; > }; >- TSymbol* symbol; >+ const TSymbol* symbol; > } lex; > struct { > TOperator op; > union { > TIntermNode *intermNode; > TIntermNodePair nodePair; >- TIntermFunctionCallOrMethod callOrMethodPair; > TIntermTyped *intermTypedNode; > TIntermAggregate *intermAggregate; > TIntermBlock *intermBlock; >@@ -336,8 +332,10 @@ union YYSTYPE > TLayoutQualifier layoutQualifier; > TQualifier qualifier; > TFunction *function; >+ TFunctionLookup *functionLookup; > TParameter param; >- TField *field; >+ TDeclarator *declarator; >+ TDeclaratorList *declaratorList; > TFieldList *fieldList; > TQualifierWrapperBase *qualifierWrapper; > TTypeQualifierBuilder *typeQualifierBuilder; >@@ -394,41 +392,35 @@ extern void yyerror(YYLTYPE* yylloc, TParseContext* context, void *scanner, cons > } \ > } while (0) > >-#define VERTEX_ONLY(S, L) { \ >+#define VERTEX_ONLY(S, L) do { \ > if (context->getShaderType() != GL_VERTEX_SHADER) { \ > context->error(L, " supported in vertex shaders only", S); \ > } \ >-} >+} while (0) > >-#define COMPUTE_ONLY(S, L) { \ >+#define COMPUTE_ONLY(S, L) do { \ > if (context->getShaderType() != GL_COMPUTE_SHADER) { \ > context->error(L, " supported in compute shaders only", S); \ > } \ >-} >+} while (0) > >-#define ES2_ONLY(S, L) { \ >+#define ES2_ONLY(S, L) do { \ > if (context->getShaderVersion() != 100) { \ > context->error(L, " supported in GLSL ES 1.00 only", S); \ > } \ >-} >+} while (0) > >-#define ES3_OR_NEWER(TOKEN, LINE, REASON) { \ >+#define ES3_OR_NEWER(TOKEN, LINE, REASON) do { \ > if (context->getShaderVersion() < 300) { \ > context->error(LINE, REASON " supported in GLSL ES 3.00 and above only", TOKEN); \ > } \ >-} >- >-#define ES3_OR_NEWER_OR_MULTIVIEW(TOKEN, LINE, REASON) { \ >- if (context->getShaderVersion() < 300 && !context->isExtensionEnabled(TExtension::OVR_multiview)) { \ >- context->error(LINE, REASON " supported in GLSL ES 3.00 and above only", TOKEN); \ >- } \ >-} >+} while (0) > >-#define ES3_1_ONLY(TOKEN, LINE, REASON) { \ >+#define ES3_1_ONLY(TOKEN, LINE, REASON) do { \ > if (context->getShaderVersion() != 310) { \ > context->error(LINE, REASON " supported in GLSL ES 3.10 only", TOKEN); \ > } \ >-} >+} while (0) > > > >@@ -672,23 +664,23 @@ union yyalloc > #endif /* !YYCOPY_NEEDED */ > > /* YYFINAL -- State number of the termination state. */ >-#define YYFINAL 135 >+#define YYFINAL 138 > /* YYLAST -- Last index in YYTABLE. */ >-#define YYLAST 2897 >+#define YYLAST 2973 > > /* YYNTOKENS -- Number of terminals. */ >-#define YYNTOKENS 154 >+#define YYNTOKENS 157 > /* YYNNTS -- Number of nonterminals. */ > #define YYNNTS 95 > /* YYNRULES -- Number of rules. */ >-#define YYNRULES 297 >+#define YYNRULES 300 > /* YYNSTATES -- Number of states. */ >-#define YYNSTATES 423 >+#define YYNSTATES 426 > > /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned > by yylex, with out-of-bounds checking. */ > #define YYUNDEFTOK 2 >-#define YYMAXUTOK 408 >+#define YYMAXUTOK 411 > > #define YYTRANSLATE(YYX) \ > ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) >@@ -737,43 +729,45 @@ static const yytype_uint8 yytranslate[] = > 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, > 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, > 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, >- 145, 146, 147, 148, 149, 150, 151, 152, 153 >+ 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, >+ 155, 156 > }; > > #if YYDEBUG > /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ > static const yytype_uint16 yyrline[] = > { >- 0, 248, 248, 249, 252, 262, 265, 270, 275, 280, >- 285, 294, 300, 303, 306, 309, 312, 315, 321, 328, >- 334, 338, 346, 349, 355, 359, 366, 371, 378, 386, >- 389, 392, 398, 401, 404, 407, 414, 415, 416, 417, >- 425, 426, 429, 432, 439, 440, 443, 449, 450, 454, >- 461, 462, 465, 468, 471, 477, 478, 481, 487, 488, >- 495, 496, 503, 504, 511, 512, 518, 519, 525, 526, >- 532, 533, 539, 540, 546, 547, 548, 549, 553, 554, >- 555, 559, 563, 567, 571, 578, 581, 587, 594, 601, >- 604, 607, 611, 615, 619, 623, 627, 634, 641, 644, >- 651, 659, 676, 686, 689, 695, 699, 703, 707, 714, >- 721, 724, 728, 732, 737, 744, 748, 752, 756, 761, >- 768, 772, 778, 781, 787, 791, 798, 804, 808, 812, >- 815, 818, 827, 832, 836, 839, 842, 845, 848, 852, >- 855, 859, 862, 865, 868, 871, 874, 881, 888, 891, >- 894, 900, 907, 910, 916, 919, 922, 925, 931, 934, >- 941, 946, 953, 958, 969, 972, 975, 978, 981, 984, >- 988, 992, 996, 1000, 1004, 1008, 1012, 1016, 1020, 1024, >- 1028, 1032, 1036, 1040, 1044, 1048, 1052, 1056, 1060, 1064, >- 1068, 1075, 1078, 1081, 1084, 1087, 1090, 1093, 1096, 1099, >- 1102, 1105, 1108, 1111, 1114, 1117, 1120, 1123, 1126, 1129, >- 1139, 1146, 1153, 1156, 1159, 1162, 1165, 1168, 1171, 1174, >- 1177, 1180, 1183, 1186, 1189, 1192, 1195, 1203, 1203, 1206, >- 1206, 1212, 1215, 1221, 1224, 1231, 1235, 1241, 1244, 1250, >- 1254, 1258, 1259, 1265, 1266, 1267, 1268, 1269, 1270, 1271, >- 1275, 1279, 1279, 1279, 1286, 1287, 1291, 1291, 1292, 1292, >- 1297, 1301, 1308, 1312, 1319, 1320, 1324, 1330, 1334, 1343, >- 1343, 1350, 1353, 1359, 1363, 1369, 1369, 1374, 1374, 1378, >- 1378, 1386, 1389, 1395, 1398, 1404, 1408, 1415, 1418, 1421, >- 1424, 1427, 1435, 1441, 1447, 1450, 1456, 1456 >+ 0, 253, 253, 254, 257, 264, 267, 272, 277, 282, >+ 287, 296, 302, 305, 308, 311, 314, 317, 323, 330, >+ 336, 339, 347, 350, 356, 359, 365, 369, 376, 384, >+ 387, 390, 396, 399, 402, 405, 412, 413, 414, 415, >+ 423, 424, 427, 430, 437, 438, 441, 447, 448, 452, >+ 459, 460, 463, 466, 469, 475, 476, 479, 485, 486, >+ 493, 494, 501, 502, 509, 510, 516, 517, 523, 524, >+ 530, 531, 537, 538, 544, 545, 546, 547, 551, 552, >+ 553, 557, 561, 565, 569, 576, 579, 585, 592, 599, >+ 602, 605, 609, 613, 617, 621, 625, 632, 639, 642, >+ 649, 657, 674, 684, 687, 693, 697, 701, 705, 712, >+ 719, 722, 726, 730, 735, 742, 746, 750, 754, 759, >+ 766, 770, 776, 779, 785, 789, 796, 802, 806, 810, >+ 813, 816, 825, 830, 834, 837, 840, 843, 846, 850, >+ 853, 857, 860, 863, 866, 869, 872, 879, 886, 889, >+ 892, 898, 905, 908, 914, 917, 920, 923, 929, 932, >+ 939, 944, 951, 956, 967, 970, 973, 976, 979, 982, >+ 986, 990, 994, 998, 1002, 1006, 1010, 1014, 1018, 1022, >+ 1026, 1030, 1034, 1038, 1042, 1046, 1050, 1054, 1058, 1062, >+ 1066, 1073, 1076, 1079, 1082, 1085, 1088, 1091, 1094, 1097, >+ 1100, 1103, 1106, 1109, 1112, 1115, 1118, 1121, 1124, 1127, >+ 1130, 1133, 1136, 1146, 1153, 1160, 1163, 1166, 1169, 1172, >+ 1175, 1178, 1181, 1184, 1187, 1190, 1193, 1196, 1199, 1202, >+ 1210, 1210, 1213, 1213, 1219, 1222, 1228, 1231, 1238, 1242, >+ 1248, 1251, 1257, 1261, 1265, 1266, 1272, 1273, 1274, 1275, >+ 1276, 1277, 1278, 1282, 1286, 1286, 1286, 1293, 1294, 1298, >+ 1298, 1299, 1299, 1304, 1308, 1315, 1319, 1326, 1327, 1331, >+ 1337, 1341, 1350, 1350, 1357, 1360, 1366, 1370, 1376, 1376, >+ 1381, 1381, 1385, 1385, 1393, 1396, 1402, 1405, 1411, 1415, >+ 1422, 1425, 1428, 1431, 1434, 1442, 1448, 1454, 1457, 1463, >+ 1463 > }; > #endif > >@@ -796,7 +790,8 @@ static const char *const yytname[] = > "SAMPLER2DRECT", "SAMPLER2DARRAY", "ISAMPLER2D", "ISAMPLER3D", > "ISAMPLERCUBE", "ISAMPLER2DARRAY", "USAMPLER2D", "USAMPLER3D", > "USAMPLERCUBE", "USAMPLER2DARRAY", "SAMPLER2DMS", "ISAMPLER2DMS", >- "USAMPLER2DMS", "SAMPLER3D", "SAMPLER3DRECT", "SAMPLER2DSHADOW", >+ "USAMPLER2DMS", "SAMPLER2DMSARRAY", "ISAMPLER2DMSARRAY", >+ "USAMPLER2DMSARRAY", "SAMPLER3D", "SAMPLER3DRECT", "SAMPLER2DSHADOW", > "SAMPLERCUBESHADOW", "SAMPLER2DARRAYSHADOW", "SAMPLEREXTERNAL2DY2YEXT", > "IMAGE2D", "IIMAGE2D", "UIMAGE2D", "IMAGE3D", "IIMAGE3D", "UIMAGE3D", > "IMAGE2DARRAY", "IIMAGE2DARRAY", "UIMAGE2DARRAY", "IMAGECUBE", >@@ -866,16 +861,16 @@ static const yytype_uint16 yytoknum[] = > 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, > 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, > 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, >- 405, 406, 407, 408 >+ 405, 406, 407, 408, 409, 410, 411 > }; > # endif > >-#define YYPACT_NINF -366 >+#define YYPACT_NINF -361 > > #define yypact_value_is_default(Yystate) \ >- (!!((Yystate) == (-366))) >+ (!!((Yystate) == (-361))) > >-#define YYTABLE_NINF -257 >+#define YYTABLE_NINF -260 > > #define yytable_value_is_error(Yytable_value) \ > 0 >@@ -884,49 +879,49 @@ static const yytype_uint16 yytoknum[] = > STATE-NUM. */ > static const yytype_int16 yypact[] = > { >- 2505, -366, -366, -366, -366, 144, -366, -366, -366, -366, >- -366, -366, -366, -366, -366, -366, -366, -366, -366, -366, >- -366, -366, -366, -366, -366, -366, -366, -366, -366, -366, >- -366, -366, -366, -366, -366, -366, -366, -366, -366, -366, >- -366, -366, -366, -366, -366, -366, -366, -366, -68, -366, >- -366, -366, -366, -366, -366, -366, -366, -366, -366, -366, >- -366, -366, -366, -366, -366, -366, -366, -366, -366, -366, >- -366, -366, -366, -366, -366, -366, -366, -366, -366, -366, >- -366, -366, -366, -366, -99, -366, -366, -366, -97, -85, >- -87, 2606, -45, -366, -32, -366, 1363, -366, -366, -366, >- -366, -366, -366, -366, -42, -366, 2404, -366, -366, 2794, >- -366, -366, -366, -40, -41, -366, -31, -366, 2606, -366, >- -366, -366, 2606, -18, -18, -366, -10, -107, -51, -366, >- 2606, -366, -366, 1458, -20, -366, -366, -13, 2606, -366, >- -366, -91, -50, -366, 407, -366, -366, -366, -366, -42, >- -67, -366, 1827, -64, -366, -366, 2606, -18, 2071, -366, >- -366, 16, -366, -366, -366, -366, -366, 1827, 1827, 1827, >- -366, -366, -366, -366, -366, -366, -366, -58, -366, -366, >- -366, 57, -38, 1948, 24, -366, 1827, 6, 13, 60, >- -86, 58, 25, 38, 45, 79, 78, -94, -366, 65, >- -366, 1582, -366, 2182, 2606, 74, -366, -41, 59, 62, >- -366, 70, 76, 67, 1706, 80, 1827, 71, 81, 73, >- -366, -366, 39, -366, -366, -21, -366, -97, 84, -366, >- -366, -366, -366, 549, -366, -366, -366, -366, -366, -366, >- -20, 1827, -53, -366, -366, 1827, -18, -42, -16, -366, >- -82, -366, -366, -366, -29, -366, -366, 1827, 2700, -366, >- -366, 1827, 85, -366, -366, -366, 1827, 1827, 1827, 1827, >- 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, >- 1827, 1827, 1827, 1827, 1827, 1827, -366, -366, 82, -366, >- 2293, -366, -366, -366, -366, -366, 83, -366, 1827, -366, >- -366, -1, 1827, 86, -366, -366, -366, 691, -366, -366, >- -366, -366, -366, -366, -366, -366, -366, -366, -366, 1827, >- 1827, -366, -366, -366, -366, 1827, -366, 3, -20, -18, >- -366, -96, -366, -366, 88, 89, -366, 92, -366, -366, >- -366, -366, -366, 6, 6, 13, 13, 60, 60, 60, >- 60, -86, -86, 58, 25, 38, 45, 79, 78, 46, >- -366, -366, 155, -31, 975, 1117, -27, -366, -26, -366, >- 1240, 691, -366, -366, -366, -366, -366, 1827, -366, -366, >- 1827, 93, -366, -366, -366, -366, 1240, 83, -366, 89, >- -18, 2606, 94, 95, 98, -366, 1827, -366, 87, 97, >- 202, -366, 100, 96, 833, -366, 101, -24, 1827, 833, >- 83, -366, 1827, -366, -366, -366, -366, 102, 89, -366, >- -366, -366, -366 >+ 2569, -361, -361, -361, -361, 126, -361, -361, -361, -361, >+ -361, -361, -361, -361, -361, -361, -361, -361, -361, -361, >+ -361, -361, -361, -361, -361, -361, -361, -361, -361, -361, >+ -361, -361, -361, -361, -361, -361, -361, -361, -361, -361, >+ -361, -361, -361, -361, -361, -361, -361, -361, -61, -361, >+ -361, -361, -361, -361, -361, -361, -361, -361, -361, -361, >+ -361, -361, -361, -361, -361, -361, -361, -361, -361, -361, >+ -361, -361, -361, -361, -361, -361, -361, -361, -361, -361, >+ -361, -361, -361, -361, -361, -361, -361, -108, -361, -361, >+ -361, -69, -99, -45, 2673, -119, -361, 2, -361, 1397, >+ -361, -361, -361, -361, -361, -361, -361, -80, -361, 2465, >+ -361, -361, 2867, -361, -361, -361, -24, -40, -361, -17, >+ -361, 2673, -361, -361, -361, 2673, 39, 39, -361, -5, >+ -96, -56, -361, 2673, -361, -361, 1495, -32, -361, -361, >+ -9, 2673, -361, -361, -2, -51, -361, 420, -361, -361, >+ -361, -361, -80, -65, -361, 1873, -60, -361, -361, 2673, >+ 39, 2123, -361, -361, 27, -361, -361, -361, -361, -361, >+ 1873, 1873, 1873, -361, -361, -361, -361, -361, -361, -361, >+ -67, -361, -361, -361, 28, -48, 1997, 33, -361, 1873, >+ 15, 22, 58, -89, 54, 24, 34, 38, 67, 72, >+ -95, -361, 59, -361, 1622, -361, 2237, 2673, 66, -361, >+ -40, 53, 55, -361, 64, 69, 56, 1749, 71, 1873, >+ 68, 75, 62, -361, -361, 26, -361, -361, -86, -361, >+ -69, 77, -361, -361, -361, -361, 565, -361, -361, -361, >+ -361, -361, -361, -32, 1873, -57, -361, -361, 1873, 39, >+ -80, -50, -361, -83, -361, -361, -361, -43, -361, -361, >+ 1873, 2770, -361, -361, 1873, 81, -361, -361, -361, 1873, >+ 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, >+ 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, -361, >+ -361, 80, -361, 2351, -361, -361, -361, -361, -361, 74, >+ -361, 1873, -361, -361, -21, 1873, 76, -361, -361, -361, >+ 710, -361, -361, -361, -361, -361, -361, -361, -361, -361, >+ -361, -361, 1873, 1873, -361, -361, -361, -361, 1873, -361, >+ -16, -32, 39, -361, -101, -361, -361, 82, 65, -361, >+ 86, -361, -361, -361, -361, -361, 15, 15, 22, 22, >+ 58, 58, 58, 58, -89, -89, 54, 24, 34, 38, >+ 67, 72, 40, -361, -361, 157, -17, 1000, 1145, -34, >+ -361, -30, -361, 1271, 710, -361, -361, -361, -361, -361, >+ 1873, -361, -361, 1873, 88, -361, -361, -361, -361, 1271, >+ 74, -361, 65, 39, 2673, 89, 84, 90, -361, 1873, >+ -361, 85, 91, 207, -361, 92, 93, 855, -361, 95, >+ -29, 1873, 855, 74, -361, 1873, -361, -361, -361, -361, >+ 96, 65, -361, -361, -361, -361 > }; > > /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. >@@ -939,74 +934,74 @@ static const yytype_uint16 yydefact[] = > 171, 178, 179, 180, 181, 182, 183, 135, 136, 137, > 139, 140, 133, 184, 185, 186, 187, 188, 189, 138, > 123, 122, 141, 142, 143, 144, 145, 146, 0, 164, >- 191, 193, 209, 211, 194, 196, 197, 198, 199, 201, >- 202, 203, 204, 195, 200, 205, 192, 206, 207, 208, >- 210, 213, 214, 215, 216, 217, 218, 219, 220, 221, >- 222, 223, 224, 225, 0, 190, 226, 295, 296, 0, >- 99, 98, 0, 110, 115, 130, 0, 131, 124, 127, >- 120, 129, 128, 147, 158, 212, 0, 292, 294, 0, >- 2, 3, 229, 0, 0, 89, 0, 97, 0, 106, >- 100, 108, 0, 109, 0, 90, 2, 116, 0, 95, >- 0, 125, 121, 0, 159, 1, 293, 0, 0, 227, >- 157, 154, 0, 152, 0, 297, 101, 105, 107, 103, >- 111, 102, 0, 117, 88, 96, 0, 0, 0, 231, >- 10, 4, 8, 6, 7, 9, 31, 0, 0, 0, >- 160, 38, 37, 39, 36, 5, 12, 32, 14, 19, >- 20, 0, 0, 25, 0, 40, 0, 44, 47, 50, >- 55, 58, 60, 62, 64, 66, 68, 70, 87, 0, >- 29, 0, 91, 0, 0, 0, 151, 0, 0, 0, >- 277, 0, 0, 0, 0, 0, 0, 0, 0, 251, >- 260, 264, 40, 72, 85, 0, 240, 0, 147, 243, >- 262, 242, 241, 0, 244, 245, 246, 247, 248, 249, >- 104, 0, 112, 239, 119, 0, 0, 237, 0, 235, >- 0, 232, 33, 34, 0, 16, 17, 0, 0, 23, >- 22, 0, 164, 26, 28, 35, 0, 0, 0, 0, >+ 191, 193, 212, 214, 194, 197, 198, 199, 200, 203, >+ 204, 205, 206, 195, 201, 207, 196, 202, 208, 192, >+ 209, 210, 211, 213, 215, 216, 217, 218, 219, 220, >+ 221, 222, 223, 224, 225, 226, 227, 0, 190, 229, >+ 298, 299, 0, 99, 98, 0, 110, 115, 130, 0, >+ 131, 124, 127, 120, 129, 128, 147, 158, 228, 0, >+ 295, 297, 0, 2, 3, 232, 0, 0, 89, 0, >+ 97, 0, 106, 100, 108, 0, 109, 0, 90, 2, >+ 116, 0, 95, 0, 125, 121, 0, 159, 1, 296, >+ 0, 0, 230, 157, 154, 0, 152, 0, 300, 101, >+ 105, 107, 103, 111, 102, 0, 117, 88, 96, 0, >+ 0, 0, 234, 10, 4, 8, 6, 7, 9, 31, >+ 0, 0, 0, 160, 38, 37, 39, 36, 5, 12, >+ 32, 14, 19, 20, 0, 0, 25, 0, 40, 0, >+ 44, 47, 50, 55, 58, 60, 62, 64, 66, 68, >+ 70, 87, 0, 29, 0, 91, 0, 0, 0, 151, >+ 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, >+ 0, 0, 254, 263, 267, 40, 72, 85, 0, 243, >+ 0, 147, 246, 265, 245, 244, 0, 247, 248, 249, >+ 250, 251, 252, 104, 0, 112, 242, 119, 0, 0, >+ 240, 0, 238, 0, 235, 33, 34, 0, 16, 17, >+ 0, 0, 23, 22, 0, 164, 26, 28, 35, 0, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 0, 0, 0, 161, 162, 0, 230, >- 0, 155, 156, 153, 288, 287, 258, 279, 0, 291, >- 289, 0, 0, 0, 272, 275, 250, 0, 75, 76, >- 78, 77, 80, 81, 82, 83, 84, 79, 74, 0, >- 0, 265, 261, 263, 114, 0, 118, 0, 238, 0, >- 233, 0, 92, 11, 0, 18, 30, 15, 21, 27, >- 41, 42, 43, 46, 45, 48, 49, 53, 54, 51, >- 52, 56, 57, 59, 61, 63, 65, 67, 69, 0, >- 163, 228, 0, 0, 0, 0, 0, 290, 0, 271, >- 0, 252, 73, 86, 113, 234, 236, 0, 93, 13, >- 0, 0, 257, 259, 282, 281, 284, 258, 269, 273, >- 0, 0, 0, 0, 0, 71, 0, 283, 0, 0, >- 268, 266, 0, 0, 0, 253, 0, 0, 285, 0, >- 258, 270, 0, 255, 276, 254, 94, 0, 286, 280, >- 267, 274, 278 >+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, >+ 162, 0, 233, 0, 155, 156, 153, 291, 290, 261, >+ 282, 0, 294, 292, 0, 0, 0, 275, 278, 253, >+ 0, 75, 76, 78, 77, 80, 81, 82, 83, 84, >+ 79, 74, 0, 0, 268, 264, 266, 114, 0, 118, >+ 0, 241, 0, 236, 0, 92, 11, 0, 18, 30, >+ 15, 21, 27, 41, 42, 43, 46, 45, 48, 49, >+ 53, 54, 51, 52, 56, 57, 59, 61, 63, 65, >+ 67, 69, 0, 163, 231, 0, 0, 0, 0, 0, >+ 293, 0, 274, 0, 255, 73, 86, 113, 237, 239, >+ 0, 93, 13, 0, 0, 260, 262, 285, 284, 287, >+ 261, 272, 276, 0, 0, 0, 0, 0, 71, 0, >+ 286, 0, 0, 271, 269, 0, 0, 0, 256, 0, >+ 0, 288, 0, 261, 273, 0, 258, 279, 257, 94, >+ 0, 289, 283, 270, 277, 281 > }; > > /* YYPGOTO[NTERM-NUM]. */ > static const yytype_int16 yypgoto[] = > { >- -366, -47, -366, -366, -366, -366, -366, -366, -15, -366, >- -366, -366, -366, 4, -366, -83, -80, -142, -84, -39, >- -48, -44, -37, -36, -46, -366, -128, -144, -366, -157, >- -195, -366, 17, 23, -366, -366, -366, 122, 128, 126, >- -366, -366, -344, -366, -78, -366, -92, -366, -89, 247, >- -366, -366, 47, 0, -112, -366, -366, -366, -366, -122, >- -148, 7, -74, -227, -109, -224, -353, -145, -366, -366, >- -151, -365, -366, -366, -113, -43, -106, -366, -366, -366, >- -366, -366, -126, -366, -366, -366, -366, -366, -366, -366, >- -366, -366, 156, -366, -366 >+ -361, -47, -361, -361, -361, -361, -361, -361, -28, -361, >+ -361, -361, -361, 42, -361, -87, -85, -140, -88, -55, >+ -49, -52, -44, -42, -39, -361, -131, -146, -361, -159, >+ -196, -361, 14, 17, -361, -361, -361, 117, 122, 120, >+ -361, -361, -337, -361, -90, -361, -93, -361, -92, 242, >+ -361, -361, 41, 0, -115, -361, -361, -361, -361, -123, >+ -150, 4, -78, -232, -113, -226, -348, -149, -361, -361, >+ -155, -360, -361, -361, -116, -46, -110, -361, -361, -361, >+ -361, -361, -130, -361, -361, -361, -361, -361, -361, -361, >+ -361, -361, 151, -361, -361 > }; > > /* YYDEFGOTO[NTERM-NUM]. */ > static const yytype_int16 yydefgoto[] = > { >- -1, 247, 175, 176, 177, 334, 178, 179, 180, 181, >- 182, 183, 184, 222, 186, 187, 188, 189, 190, 191, >- 192, 193, 194, 195, 196, 197, 223, 224, 319, 225, >- 199, 130, 226, 227, 89, 90, 91, 119, 120, 121, >- 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, >- 102, 142, 143, 200, 134, 104, 105, 204, 138, 158, >- 159, 248, 249, 244, 229, 230, 231, 232, 307, 393, >- 414, 362, 363, 364, 415, 233, 234, 235, 401, 236, >- 402, 237, 392, 238, 370, 296, 365, 386, 398, 399, >- 239, 106, 107, 108, 116 >+ -1, 250, 178, 179, 180, 337, 181, 182, 183, 184, >+ 185, 186, 187, 225, 189, 190, 191, 192, 193, 194, >+ 195, 196, 197, 198, 199, 200, 226, 227, 322, 228, >+ 202, 133, 229, 230, 92, 93, 94, 122, 123, 124, >+ 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, >+ 105, 145, 146, 203, 137, 107, 108, 207, 141, 161, >+ 162, 251, 252, 247, 232, 233, 234, 235, 310, 396, >+ 417, 365, 366, 367, 418, 236, 237, 238, 404, 239, >+ 405, 240, 395, 241, 373, 299, 368, 389, 401, 402, >+ 242, 109, 110, 111, 119 > }; > > /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If >@@ -1014,277 +1009,284 @@ static const yytype_int16 yydefgoto[] = > number is the opposite. If YYTABLE_NINF, syntax error. */ > static const yytype_int16 yytable[] = > { >- 103, 113, 123, 145, 131, 198, 288, 132, 243, 323, >- 251, 383, 254, 122, 324, 153, 203, 87, 326, 140, >- 331, 303, 400, 88, 284, 133, 390, 273, 274, 123, >- 131, 114, 152, 123, 110, 111, 377, 240, 242, 263, >- 122, 157, 390, 115, 378, 420, 117, 127, 205, 157, >- 118, 413, 156, 255, 256, 251, 413, 301, 332, 285, >- 156, 141, 275, 276, 131, 133, 112, 246, 201, 157, >- 126, 111, 241, 198, 257, 245, 149, 150, 258, 201, >- 156, 206, 290, 154, 110, 111, 325, 207, 198, 155, >- 133, 103, 124, 260, 139, 125, 103, 243, 374, 261, >- 335, 243, 333, 144, 387, 388, 103, 417, 320, 137, >- 320, 320, 201, 320, 157, 157, 320, 339, 103, 321, >- 151, 329, 103, 87, 330, 156, 156, 202, 359, 88, >- 103, 347, 348, 349, 350, 328, 320, 185, 103, 367, >- 329, 366, 251, 375, 228, 368, -30, 323, 2, 3, >- 4, 266, 267, 268, 264, 269, 103, 270, 103, 308, >- 309, 310, 311, 312, 313, 314, 315, 316, 317, 271, >- 272, 252, 253, 277, 278, 372, 373, 279, 318, 291, >- 292, 243, 394, 320, 380, 421, 343, 344, 259, 280, >- 265, 345, 346, 351, 352, 281, 282, 283, 286, 294, >- 297, 157, 295, 103, 103, 185, 298, 299, 306, 304, >- 302, 305, 156, 389, -29, 360, -24, -256, 381, 410, >- 185, 379, -31, 396, 369, 404, 320, 408, 409, 389, >- 405, 406, 354, 228, 219, 412, 395, 355, 358, 407, >- 353, 416, 422, 338, 147, 356, 146, 357, 148, 198, >- 382, 418, 109, 327, 293, 376, 384, 411, 419, 385, >- 397, 0, 136, 0, 371, 0, 0, 0, 243, 0, >- 340, 341, 342, 185, 185, 185, 185, 185, 185, 185, >- 185, 185, 185, 185, 185, 185, 185, 185, 185, 0, >- 103, 0, 391, 0, 0, 0, 0, 0, 0, 131, >- 0, 0, 132, 0, 0, 0, 0, 228, 391, 0, >+ 106, 116, 126, 148, 125, 201, 134, 135, 291, 246, >+ 326, 254, 327, 257, 90, 156, 329, 91, 206, 386, >+ 143, 127, 334, 306, 128, 117, 287, 276, 277, 126, >+ 403, 125, 134, 126, 380, 120, 393, 243, 245, 136, >+ 266, 160, 381, 159, 113, 114, 155, 258, 259, 160, >+ 130, 159, 393, 423, 323, 136, 254, 324, 304, 416, >+ 335, 288, 278, 279, 416, 144, 134, 249, 260, 160, >+ 136, 159, 261, 201, 118, 204, 115, 244, 204, 152, >+ 153, 157, 248, 209, 293, 328, 263, 158, 201, 210, >+ 332, 336, 264, 333, 106, 121, 377, 323, 246, 106, >+ 390, 338, 246, 204, 391, 420, 323, 129, 114, 106, >+ 323, 323, 140, 142, 160, 160, 159, 159, 342, 323, >+ 147, 106, 370, 90, 332, 106, 91, 378, 154, 362, >+ 2, 3, 4, 106, 205, 331, 350, 351, 352, 353, >+ 208, 106, 369, 254, 113, 114, 371, 231, 326, 311, >+ 312, 313, 314, 315, 316, 317, 318, 319, 320, 106, >+ -30, 106, 262, 269, 270, 271, 267, 272, 321, 273, >+ 274, 275, 280, 281, 294, 295, 375, 376, 188, 282, >+ 323, 383, 246, 424, 397, 346, 347, 285, 283, 348, >+ 349, 284, 354, 355, 286, 289, 297, 300, 298, 302, >+ 309, 160, 301, 159, 305, 323, 106, 106, 308, 307, >+ -29, -259, 255, 256, 392, -24, 363, 372, 382, -31, >+ 384, 399, 408, 407, 413, 412, 409, 356, 411, 222, >+ 392, 268, 358, 341, 357, 415, 231, 398, 419, 425, >+ 410, 359, 150, 149, 360, 151, 188, 112, 361, 201, >+ 385, 296, 421, 330, 379, 387, 414, 422, 388, 400, >+ 139, 188, 0, 0, 374, 0, 0, 0, 0, 246, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 394, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 106, 0, 0, 0, 0, 0, 394, >+ 0, 134, 135, 0, 0, 0, 0, 0, 0, 0, >+ 231, 343, 344, 345, 188, 188, 188, 188, 188, 188, >+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 0, 0, 406, 0, 0, 0, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 0, 0, 0, 231, 231, 0, >+ 0, 0, 0, 231, 231, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, >+ 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 0, 0, 0, 231, 0, 0, >+ 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, >+ 0, 0, 188, 1, 2, 3, 4, 5, 6, 7, >+ 8, 9, 10, 11, 211, 212, 213, 0, 214, 215, >+ 216, 217, 218, 219, 220, 12, 13, 14, 15, 16, >+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, >+ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, >+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, >+ 47, 48, 49, 221, 50, 51, 52, 53, 54, 55, >+ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, >+ 66, 67, 68, 69, 0, 70, 71, 72, 73, 74, >+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, >+ 85, 86, 87, 88, 163, 164, 89, 165, 166, 167, >+ 168, 169, 0, 0, 170, 171, 0, 0, 0, 0, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 0, 228, 228, 0, 0, 0, 0, >- 228, 228, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 185, 0, 0, 0, 0, 228, 0, 0, 0, >- 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 0, 228, 0, 0, 0, 0, 228, >- 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, >- 11, 208, 209, 210, 0, 211, 212, 213, 214, 215, >- 216, 217, 12, 13, 14, 15, 16, 17, 18, 19, >- 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, >- 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, >- 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, >- 218, 50, 51, 52, 53, 54, 55, 56, 57, 58, >- 59, 60, 61, 62, 63, 64, 65, 66, 0, 67, >- 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, >- 78, 79, 80, 81, 82, 83, 84, 85, 160, 161, >- 86, 162, 163, 164, 165, 166, 0, 0, 167, 168, >+ 0, 0, 0, 172, 0, 0, 0, 222, 223, 0, >+ 0, 0, 0, 224, 174, 175, 176, 177, 1, 2, >+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 211, >+ 212, 213, 0, 214, 215, 216, 217, 218, 219, 220, >+ 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, >+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, >+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, >+ 42, 43, 44, 45, 46, 47, 48, 49, 221, 50, >+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, >+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 0, >+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, >+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 163, >+ 164, 89, 165, 166, 167, 168, 169, 0, 0, 170, >+ 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 0, 0, 0, 0, 172, 0, >+ 0, 0, 222, 325, 0, 0, 0, 0, 224, 174, >+ 175, 176, 177, 1, 2, 3, 4, 5, 6, 7, >+ 8, 9, 10, 11, 211, 212, 213, 0, 214, 215, >+ 216, 217, 218, 219, 220, 12, 13, 14, 15, 16, >+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, >+ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, >+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, >+ 47, 48, 49, 221, 50, 51, 52, 53, 54, 55, >+ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, >+ 66, 67, 68, 69, 0, 70, 71, 72, 73, 74, >+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, >+ 85, 86, 87, 88, 163, 164, 89, 165, 166, 167, >+ 168, 169, 0, 0, 170, 171, 0, 0, 0, 0, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, >- 0, 219, 220, 0, 0, 0, 0, 221, 171, 172, >- 173, 174, 1, 2, 3, 4, 5, 6, 7, 8, >- 9, 10, 11, 208, 209, 210, 0, 211, 212, 213, >- 214, 215, 216, 217, 12, 13, 14, 15, 16, 17, >- 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, >- 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, >- 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, >- 48, 49, 218, 50, 51, 52, 53, 54, 55, 56, >- 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, >- 0, 67, 68, 69, 70, 71, 72, 73, 74, 75, >- 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, >- 160, 161, 86, 162, 163, 164, 165, 166, 0, 0, >- 167, 168, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, >- 0, 0, 0, 219, 322, 0, 0, 0, 0, 221, >- 171, 172, 173, 174, 1, 2, 3, 4, 5, 6, >- 7, 8, 9, 10, 11, 208, 209, 210, 0, 211, >- 212, 213, 214, 215, 216, 217, 12, 13, 14, 15, >- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, >- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, >- 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, >- 46, 47, 48, 49, 218, 50, 51, 52, 53, 54, >- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, >- 65, 66, 0, 67, 68, 69, 70, 71, 72, 73, >- 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, >- 84, 85, 160, 161, 86, 162, 163, 164, 165, 166, >- 0, 0, 167, 168, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 172, 0, 0, 0, 222, 0, 0, >+ 0, 0, 0, 224, 174, 175, 176, 177, 1, 2, >+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 211, >+ 212, 213, 0, 214, 215, 216, 217, 218, 219, 220, >+ 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, >+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, >+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, >+ 42, 43, 44, 45, 46, 47, 48, 49, 221, 50, >+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, >+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 0, >+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, >+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 163, >+ 164, 89, 165, 166, 167, 168, 169, 0, 0, 170, >+ 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 0, 0, 0, 0, 172, 0, >+ 0, 0, 147, 0, 0, 0, 0, 0, 224, 174, >+ 175, 176, 177, 1, 2, 3, 4, 5, 6, 7, >+ 8, 9, 10, 11, 211, 212, 213, 0, 214, 215, >+ 216, 217, 218, 219, 220, 12, 13, 14, 15, 16, >+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, >+ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, >+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, >+ 47, 48, 49, 221, 50, 51, 52, 53, 54, 55, >+ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, >+ 66, 67, 68, 69, 0, 70, 71, 72, 73, 74, >+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, >+ 85, 86, 87, 88, 163, 164, 89, 165, 166, 167, >+ 168, 169, 0, 0, 170, 171, 0, 0, 0, 0, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 169, 0, 0, 0, 219, 0, 0, 0, 0, >- 0, 221, 171, 172, 173, 174, 1, 2, 3, 4, >- 5, 6, 7, 8, 9, 10, 11, 208, 209, 210, >- 0, 211, 212, 213, 214, 215, 216, 217, 12, 13, >- 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, >- 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, >- 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, >- 44, 45, 46, 47, 48, 49, 218, 50, 51, 52, >- 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, >- 63, 64, 65, 66, 0, 67, 68, 69, 70, 71, >- 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, >- 82, 83, 84, 85, 160, 161, 86, 162, 163, 164, >- 165, 166, 0, 0, 167, 168, 0, 0, 0, 0, >+ 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 224, 174, 175, 176, 177, 1, 2, >+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 169, 0, 0, 0, 144, 0, 0, >- 0, 0, 0, 221, 171, 172, 173, 174, 1, 2, >- 3, 4, 5, 6, 7, 8, 9, 10, 11, 208, >- 209, 210, 0, 211, 212, 213, 214, 215, 216, 217, > 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, > 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, > 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, >- 42, 43, 44, 45, 46, 47, 48, 49, 218, 50, >+ 42, 43, 44, 45, 46, 47, 48, 49, 0, 50, > 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, >- 61, 62, 63, 64, 65, 66, 0, 67, 68, 69, >+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 0, > 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, >- 80, 81, 82, 83, 84, 85, 160, 161, 86, 162, >- 163, 164, 165, 166, 0, 0, 167, 168, 0, 0, >+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 163, >+ 164, 89, 165, 166, 167, 168, 169, 0, 0, 170, >+ 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 1, 2, 3, 4, 172, 6, >+ 7, 8, 9, 10, 11, 0, 0, 0, 224, 174, >+ 175, 176, 177, 0, 0, 0, 12, 13, 14, 15, >+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, >+ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, >+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, >+ 46, 47, 48, 49, 0, 50, 51, 52, 53, 54, >+ 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, >+ 65, 66, 67, 68, 69, 0, 70, 71, 72, 73, >+ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, >+ 84, 85, 86, 87, 88, 163, 164, 89, 165, 166, >+ 167, 168, 169, 0, 0, 170, 171, 0, 0, 0, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 0, 0, 169, 0, 0, 0, 0, >- 0, 0, 0, 0, 0, 221, 171, 172, 173, 174, >- 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, >- 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 1, 2, 3, 4, 172, 6, 7, 8, 9, 10, >+ 11, 0, 0, 0, 0, 174, 175, 176, 177, 0, > 0, 0, 12, 13, 14, 15, 16, 17, 18, 19, > 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, > 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, > 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, > 0, 50, 51, 52, 53, 54, 55, 56, 57, 58, >- 59, 60, 61, 62, 63, 64, 65, 66, 0, 67, >- 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, >- 78, 79, 80, 81, 82, 83, 84, 85, 160, 161, >- 86, 162, 163, 164, 165, 166, 0, 0, 167, 168, >+ 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, >+ 69, 0, 70, 71, 72, 73, 74, 75, 76, 77, >+ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, >+ 88, 0, 131, 89, 0, 8, 9, 10, 11, 0, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 1, 2, 3, 4, 169, 6, 7, >- 8, 9, 10, 11, 0, 0, 0, 221, 171, 172, >- 173, 174, 0, 0, 0, 12, 13, 14, 15, 16, >- 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, >- 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, >- 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, >- 47, 48, 49, 0, 50, 51, 52, 53, 54, 55, >- 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, >- 66, 0, 67, 68, 69, 70, 71, 72, 73, 74, >- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, >- 85, 160, 161, 86, 162, 163, 164, 165, 166, 0, >- 0, 167, 168, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, >- 169, 6, 7, 8, 9, 10, 11, 0, 0, 0, >- 0, 171, 172, 173, 174, 0, 0, 0, 12, 13, >- 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, >- 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, >- 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, >- 44, 45, 46, 47, 48, 49, 0, 50, 51, 52, >- 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, >- 63, 64, 65, 66, 0, 67, 68, 69, 70, 71, >- 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, >- 82, 83, 84, 85, 0, 128, 86, 0, 8, 9, >- 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 12, 13, 14, 15, 16, 17, 18, >- 19, 20, 21, 22, 23, 24, 25, 26, 0, 0, >- 0, 0, 0, 129, 33, 34, 35, 36, 37, 38, >- 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, >- 49, 0, 50, 51, 52, 53, 54, 55, 56, 57, >- 58, 59, 60, 61, 62, 63, 64, 65, 66, 0, >- 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, >- 77, 78, 79, 80, 81, 82, 83, 0, 85, 160, >- 161, 86, 162, 163, 164, 165, 166, 0, 0, 167, >- 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 0, 0, 0, 0, 0, 169, 0, >- 0, 170, 8, 9, 10, 11, 0, 0, 0, 171, >- 172, 173, 174, 0, 0, 0, 0, 12, 13, 14, >+ 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, >+ 22, 23, 24, 25, 26, 0, 0, 0, 0, 0, >+ 132, 33, 34, 35, 36, 37, 38, 0, 0, 0, >+ 0, 0, 0, 0, 0, 0, 48, 49, 0, 50, >+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, >+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 0, >+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, >+ 80, 81, 82, 83, 84, 85, 86, 0, 88, 163, >+ 164, 89, 165, 166, 167, 168, 169, 0, 0, 170, >+ 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 0, 0, 0, 0, 172, 0, >+ 0, 173, 8, 9, 10, 11, 0, 0, 0, 174, >+ 175, 176, 177, 0, 0, 0, 0, 12, 13, 14, > 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, > 25, 26, 0, 0, 0, 0, 0, 0, 33, 34, > 35, 36, 37, 38, 0, 0, 0, 0, 0, 0, > 0, 0, 0, 48, 49, 0, 50, 51, 52, 53, > 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, >- 64, 65, 66, 0, 67, 68, 69, 70, 71, 72, >+ 64, 65, 66, 67, 68, 69, 0, 70, 71, 72, > 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, >- 83, 0, 85, 160, 161, 86, 162, 163, 164, 165, >- 166, 0, 0, 167, 168, 0, 0, 0, 0, 0, >+ 83, 84, 85, 86, 0, 88, 163, 164, 89, 165, >+ 166, 167, 168, 169, 0, 0, 170, 171, 0, 0, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 169, 0, 0, 287, 8, 9, 10, 11, >- 0, 0, 0, 171, 172, 173, 174, 0, 0, 0, >- 0, 12, 13, 14, 15, 16, 17, 18, 19, 20, >- 21, 22, 23, 24, 25, 26, 0, 0, 0, 0, >- 0, 0, 33, 34, 35, 36, 37, 38, 0, 0, >- 0, 0, 0, 0, 0, 0, 0, 48, 49, 0, >- 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, >- 60, 61, 62, 63, 64, 65, 66, 0, 67, 68, >- 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, >- 79, 80, 81, 82, 83, 0, 85, 160, 161, 86, >- 162, 163, 164, 165, 166, 0, 0, 167, 168, 0, >+ 0, 0, 0, 0, 0, 172, 0, 0, 290, 8, >+ 9, 10, 11, 0, 0, 0, 174, 175, 176, 177, >+ 0, 0, 0, 0, 12, 13, 14, 15, 16, 17, >+ 18, 19, 20, 21, 22, 23, 24, 25, 26, 0, >+ 0, 0, 0, 0, 0, 33, 34, 35, 36, 37, >+ 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 48, 49, 0, 50, 51, 52, 53, 54, 55, 56, >+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, >+ 67, 68, 69, 0, 70, 71, 72, 73, 74, 75, >+ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, >+ 86, 0, 88, 163, 164, 89, 165, 166, 167, 168, >+ 169, 0, 0, 170, 171, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 0, 0, 172, 8, 9, 10, 11, 0, 0, 0, >+ 0, 0, 303, 174, 175, 176, 177, 0, 12, 13, >+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, >+ 24, 25, 26, 0, 0, 0, 0, 0, 0, 33, >+ 34, 35, 36, 37, 38, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 48, 49, 0, 50, 51, 52, >+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, >+ 63, 64, 65, 66, 67, 68, 69, 0, 70, 71, >+ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, >+ 82, 83, 84, 85, 86, 0, 88, 163, 164, 89, >+ 165, 166, 167, 168, 169, 0, 0, 170, 171, 0, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 0, 0, 0, 169, 8, 9, 10, >- 11, 0, 0, 0, 0, 0, 300, 171, 172, 173, >- 174, 0, 12, 13, 14, 15, 16, 17, 18, 19, >+ 0, 0, 0, 0, 0, 0, 172, 8, 9, 10, >+ 11, 0, 0, 0, 0, 0, 0, 174, 175, 176, >+ 177, 0, 12, 13, 14, 15, 16, 17, 18, 19, > 20, 21, 22, 23, 24, 25, 26, 0, 0, 0, > 0, 0, 0, 33, 34, 35, 36, 37, 38, 0, >- 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, >+ 0, 0, 0, 0, 0, 0, 0, 0, 48, 265, > 0, 50, 51, 52, 53, 54, 55, 56, 57, 58, >- 59, 60, 61, 62, 63, 64, 65, 66, 0, 67, >- 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, >- 78, 79, 80, 81, 82, 83, 0, 85, 160, 161, >- 86, 162, 163, 164, 165, 166, 0, 0, 167, 168, >- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 0, 0, 0, 0, 169, 8, 9, >- 10, 11, 0, 0, 0, 0, 0, 0, 171, 172, >- 173, 174, 0, 12, 13, 14, 15, 16, 17, 18, >- 19, 20, 21, 22, 23, 24, 25, 26, 0, 0, >- 0, 0, 0, 0, 33, 34, 35, 36, 37, 38, >- 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, >- 262, 0, 50, 51, 52, 53, 54, 55, 56, 57, >- 58, 59, 60, 61, 62, 63, 64, 65, 66, 0, >- 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, >- 77, 78, 79, 80, 81, 82, 83, 0, 85, 160, >- 161, 86, 162, 163, 164, 165, 166, 0, 0, 167, >- 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 0, 0, 0, 1, 2, 3, 4, 169, 6, >- 7, 8, 9, 10, 11, 0, 0, 0, 0, 171, >- 172, 173, 174, 0, 0, 0, 12, 13, 14, 15, >- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, >- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, >- 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, >- 46, 47, 48, 49, 0, 50, 51, 52, 53, 54, >- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, >- 65, 66, 0, 67, 68, 69, 70, 71, 72, 73, >- 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, >- 84, 85, 0, 0, 86, 0, 0, 0, 0, 0, >- 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, >- 6, 7, 8, 9, 10, 11, 0, 0, 0, 0, >- 0, 0, 0, 0, 0, 0, 250, 12, 13, 14, >- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, >- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, >- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, >- 45, 46, 47, 48, 49, 0, 50, 51, 52, 53, >- 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, >- 64, 65, 66, 0, 67, 68, 69, 70, 71, 72, >- 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, >- 83, 84, 85, 0, 0, 86, 0, 0, 0, 0, >+ 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, >+ 69, 0, 70, 71, 72, 73, 74, 75, 76, 77, >+ 78, 79, 80, 81, 82, 83, 84, 85, 86, 0, >+ 88, 163, 164, 89, 165, 166, 167, 168, 169, 0, >+ 0, 170, 171, 0, 0, 0, 0, 0, 0, 0, > 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, >- 0, 6, 7, 8, 9, 10, 11, 0, 0, 0, >- 0, 0, 0, 0, 0, 0, 0, 289, 12, 13, >+ 172, 6, 7, 8, 9, 10, 11, 0, 0, 0, >+ 0, 174, 175, 176, 177, 0, 0, 0, 12, 13, > 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, > 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, > 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, > 44, 45, 46, 47, 48, 49, 0, 50, 51, 52, > 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, >- 63, 64, 65, 66, 0, 67, 68, 69, 70, 71, >+ 63, 64, 65, 66, 67, 68, 69, 0, 70, 71, > 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, >- 82, 83, 84, 85, 0, 0, 86, 0, 0, 0, >- 0, 0, 0, 0, 135, 0, 0, 1, 2, 3, >- 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, >- 0, 0, 0, 0, 0, 0, 0, 0, 361, 12, >- 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, >- 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, >- 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, >- 43, 44, 45, 46, 47, 48, 49, 0, 50, 51, >- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, >- 62, 63, 64, 65, 66, 0, 67, 68, 69, 70, >- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, >- 81, 82, 83, 84, 85, 0, 0, 86, 1, 2, >- 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, >+ 82, 83, 84, 85, 86, 87, 88, 0, 0, 89, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 1, 2, 3, 4, 0, 6, 7, 8, 9, 10, >+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 0, 253, 12, 13, 14, 15, 16, 17, 18, 19, >+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, >+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, >+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, >+ 0, 50, 51, 52, 53, 54, 55, 56, 57, 58, >+ 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, >+ 69, 0, 70, 71, 72, 73, 74, 75, 76, 77, >+ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, >+ 88, 0, 0, 89, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 1, 2, 3, 4, 0, 6, >+ 7, 8, 9, 10, 11, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 0, 292, 12, 13, 14, 15, >+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, >+ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, >+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, >+ 46, 47, 48, 49, 0, 50, 51, 52, 53, 54, >+ 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, >+ 65, 66, 67, 68, 69, 0, 70, 71, 72, 73, >+ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, >+ 84, 85, 86, 87, 88, 0, 0, 89, 0, 0, >+ 0, 0, 0, 0, 0, 138, 0, 0, 1, 2, >+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, >+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, > 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, > 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, > 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, > 42, 43, 44, 45, 46, 47, 48, 49, 0, 50, > 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, >- 61, 62, 63, 64, 65, 66, 0, 67, 68, 69, >+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 0, > 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, >- 80, 81, 82, 83, 84, 85, 0, 0, 86, 1, >- 2, 3, 4, 0, 6, 7, 8, 9, 10, 11, >- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >- 0, 12, 13, 14, 15, 16, 17, 18, 19, 20, >- 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, >- 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, >- 41, 42, 43, 44, 45, 46, 47, 48, 49, 0, >- 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, >- 60, 61, 62, 63, 64, 65, 66, 0, 67, 68, >- 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, >- 79, 80, 81, 82, 83, 84, 85, 0, 0, 86, >+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 0, >+ 0, 89, 1, 2, 3, 4, 5, 6, 7, 8, >+ 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 12, 13, 14, 15, 16, 17, >+ 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, >+ 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, >+ 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, >+ 48, 49, 0, 50, 51, 52, 53, 54, 55, 56, >+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, >+ 67, 68, 69, 0, 70, 71, 72, 73, 74, 75, >+ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, >+ 86, 87, 88, 0, 0, 89, 1, 2, 3, 4, >+ 0, 6, 7, 8, 9, 10, 11, 0, 0, 0, >+ 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, >+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, >+ 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, >+ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, >+ 44, 45, 46, 47, 48, 49, 0, 50, 51, 52, >+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, >+ 63, 64, 65, 66, 67, 68, 69, 0, 70, 71, >+ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, >+ 82, 83, 84, 85, 86, 87, 88, 0, 0, 89, > 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, > 0, 0, 0, 0, 0, 12, 13, 14, 15, 16, > 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, >@@ -1292,120 +1294,109 @@ static const yytype_int16 yytable[] = > 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, > 0, 48, 49, 0, 50, 51, 52, 53, 54, 55, > 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, >- 66, 0, 67, 68, 69, 70, 71, 72, 73, 74, >- 75, 76, 77, 78, 79, 80, 81, 82, 83, 0, >- 85, 0, 336, 86, 8, 9, 10, 11, 337, 0, >- 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, >- 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, >- 23, 24, 25, 26, 0, 0, 0, 0, 0, 0, >- 33, 34, 35, 36, 37, 38, 0, 0, 0, 0, >- 0, 0, 0, 0, 0, 48, 49, 0, 50, 51, >- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, >- 62, 63, 64, 65, 66, 0, 67, 68, 69, 70, >- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, >- 81, 82, 83, 0, 85, 0, 0, 86 >+ 66, 67, 68, 69, 0, 70, 71, 72, 73, 74, >+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, >+ 85, 86, 0, 88, 0, 339, 89, 8, 9, 10, >+ 11, 340, 0, 0, 0, 0, 0, 0, 0, 0, >+ 0, 0, 12, 13, 14, 15, 16, 17, 18, 19, >+ 20, 21, 22, 23, 24, 25, 26, 0, 0, 0, >+ 0, 0, 0, 33, 34, 35, 36, 37, 38, 0, >+ 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, >+ 0, 50, 51, 52, 53, 54, 55, 56, 57, 58, >+ 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, >+ 69, 0, 70, 71, 72, 73, 74, 75, 76, 77, >+ 78, 79, 80, 81, 82, 83, 84, 85, 86, 0, >+ 88, 0, 0, 89 > }; > > static const yytype_int16 yycheck[] = > { >- 0, 48, 91, 116, 96, 133, 201, 96, 152, 233, >- 158, 364, 169, 91, 241, 127, 138, 0, 245, 60, >- 102, 216, 387, 0, 118, 132, 370, 113, 114, 118, >- 122, 130, 139, 122, 102, 103, 132, 149, 150, 183, >- 118, 130, 386, 140, 140, 410, 131, 94, 139, 138, >- 137, 404, 130, 111, 112, 203, 409, 214, 140, 153, >- 138, 102, 148, 149, 156, 132, 134, 156, 132, 158, >- 102, 103, 139, 201, 132, 139, 123, 124, 136, 132, >- 158, 131, 204, 134, 102, 103, 139, 137, 216, 140, >- 132, 91, 137, 131, 134, 140, 96, 241, 325, 137, >- 257, 245, 131, 134, 131, 131, 106, 131, 137, 109, >- 137, 137, 132, 137, 203, 204, 137, 261, 118, 140, >- 130, 137, 122, 106, 140, 203, 204, 140, 285, 106, >- 130, 273, 274, 275, 276, 247, 137, 133, 138, 140, >- 137, 298, 290, 140, 144, 302, 130, 371, 4, 5, >- 6, 145, 146, 147, 130, 142, 156, 144, 158, 120, >- 121, 122, 123, 124, 125, 126, 127, 128, 129, 109, >- 110, 167, 168, 115, 116, 319, 320, 152, 139, 105, >- 106, 325, 377, 137, 138, 412, 269, 270, 131, 151, >- 186, 271, 272, 277, 278, 150, 117, 119, 133, 140, >- 130, 290, 140, 203, 204, 201, 130, 140, 135, 138, >- 130, 130, 290, 370, 130, 133, 131, 134, 63, 17, >- 216, 133, 130, 130, 138, 131, 137, 140, 131, 386, >- 135, 133, 280, 233, 134, 139, 380, 281, 284, 396, >- 279, 140, 140, 258, 122, 282, 118, 283, 122, 377, >- 363, 408, 5, 246, 207, 329, 365, 402, 409, 365, >- 386, -1, 106, -1, 307, -1, -1, -1, 412, -1, >- 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, >- 276, 277, 278, 279, 280, 281, 282, 283, 284, -1, >- 290, -1, 370, -1, -1, -1, -1, -1, -1, 391, >- -1, -1, 391, -1, -1, -1, -1, 307, 386, -1, >- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >+ 0, 48, 94, 119, 94, 136, 99, 99, 204, 155, >+ 236, 161, 244, 172, 0, 130, 248, 0, 141, 367, >+ 60, 140, 105, 219, 143, 133, 121, 116, 117, 121, >+ 390, 121, 125, 125, 135, 134, 373, 152, 153, 135, >+ 186, 133, 143, 133, 105, 106, 142, 114, 115, 141, >+ 97, 141, 389, 413, 140, 135, 206, 143, 217, 407, >+ 143, 156, 151, 152, 412, 105, 159, 159, 135, 161, >+ 135, 161, 139, 204, 143, 135, 137, 142, 135, 126, >+ 127, 137, 142, 134, 207, 142, 134, 143, 219, 140, >+ 140, 134, 140, 143, 94, 140, 328, 140, 244, 99, >+ 134, 260, 248, 135, 134, 134, 140, 105, 106, 109, >+ 140, 140, 112, 137, 206, 207, 206, 207, 264, 140, >+ 137, 121, 143, 109, 140, 125, 109, 143, 133, 288, >+ 4, 5, 6, 133, 143, 250, 276, 277, 278, 279, >+ 142, 141, 301, 293, 105, 106, 305, 147, 374, 123, >+ 124, 125, 126, 127, 128, 129, 130, 131, 132, 159, >+ 133, 161, 134, 148, 149, 150, 133, 145, 142, 147, >+ 112, 113, 118, 119, 108, 109, 322, 323, 136, 155, >+ 140, 141, 328, 415, 380, 272, 273, 120, 154, 274, >+ 275, 153, 280, 281, 122, 136, 143, 133, 143, 143, >+ 138, 293, 133, 293, 133, 140, 206, 207, 133, 141, >+ 133, 137, 170, 171, 373, 134, 136, 141, 136, 133, >+ 63, 133, 138, 134, 17, 134, 136, 282, 143, 137, >+ 389, 189, 284, 261, 283, 142, 236, 383, 143, 143, >+ 399, 285, 125, 121, 286, 125, 204, 5, 287, 380, >+ 366, 210, 411, 249, 332, 368, 405, 412, 368, 389, >+ 109, 219, -1, -1, 310, -1, -1, -1, -1, 415, > -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >+ -1, -1, -1, 373, -1, -1, -1, -1, -1, -1, >+ -1, -1, -1, 293, -1, -1, -1, -1, -1, 389, >+ -1, 394, 394, -1, -1, -1, -1, -1, -1, -1, >+ 310, 269, 270, 271, 272, 273, 274, 275, 276, 277, >+ 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, > -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, 390, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, -1, 364, 365, -1, -1, -1, -1, >- 370, 371, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, 377, -1, -1, -1, -1, 386, -1, -1, -1, >- -1, 391, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, -1, 404, -1, -1, -1, -1, 409, >- 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, >- 13, 14, 15, 16, -1, 18, 19, 20, 21, 22, >- 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, >- 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, >- 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, >- 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, >- 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, >- 73, 74, 75, 76, 77, 78, 79, 80, -1, 82, >- 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, >- 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, >- 103, 104, 105, 106, 107, 108, -1, -1, 111, 112, >+ -1, -1, -1, -1, -1, -1, 393, -1, -1, -1, > -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, -1, -1, -1, -1, 130, -1, -1, >- -1, 134, 135, -1, -1, -1, -1, 140, 141, 142, >- 143, 144, 3, 4, 5, 6, 7, 8, 9, 10, >- 11, 12, 13, 14, 15, 16, -1, 18, 19, 20, >- 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, >- 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, >- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, >- 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, >- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, >- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, >- -1, 82, 83, 84, 85, 86, 87, 88, 89, 90, >- 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, >- 101, 102, 103, 104, 105, 106, 107, 108, -1, -1, >- 111, 112, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, -1, -1, -1, -1, -1, -1, 130, >- -1, -1, -1, 134, 135, -1, -1, -1, -1, 140, >- 141, 142, 143, 144, 3, 4, 5, 6, 7, 8, >- 9, 10, 11, 12, 13, 14, 15, 16, -1, 18, >- 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, >- 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, >- 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, >- 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, >- 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, >- 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, >- 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, >- 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, >- 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, >- -1, -1, 111, 112, -1, -1, -1, -1, -1, -1, >+ -1, -1, -1, -1, -1, -1, -1, 367, 368, -1, >+ -1, -1, -1, 373, 374, -1, -1, -1, -1, -1, >+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 389, >+ -1, -1, -1, -1, 394, -1, -1, -1, -1, -1, >+ -1, -1, -1, -1, -1, -1, -1, 407, -1, -1, >+ -1, -1, 412, -1, -1, -1, -1, -1, -1, -1, >+ -1, -1, 380, 3, 4, 5, 6, 7, 8, 9, >+ 10, 11, 12, 13, 14, 15, 16, -1, 18, 19, >+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, >+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, >+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, >+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, >+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, >+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, >+ 80, 81, 82, 83, -1, 85, 86, 87, 88, 89, >+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, >+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, >+ 110, 111, -1, -1, 114, 115, -1, -1, -1, -1, > -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, 130, -1, -1, -1, 134, -1, -1, -1, -1, >- -1, 140, 141, 142, 143, 144, 3, 4, 5, 6, >- 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, >- -1, 18, 19, 20, 21, 22, 23, 24, 25, 26, >- 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, >- 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, >- 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, >- 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, >- 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, >- 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, >- 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, >- 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, >- 107, 108, -1, -1, 111, 112, -1, -1, -1, -1, >+ -1, -1, -1, 133, -1, -1, -1, 137, 138, -1, >+ -1, -1, -1, 143, 144, 145, 146, 147, 3, 4, >+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, >+ 15, 16, -1, 18, 19, 20, 21, 22, 23, 24, >+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, >+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, >+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, >+ 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, >+ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, >+ 75, 76, 77, 78, 79, 80, 81, 82, 83, -1, >+ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, >+ 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, >+ 105, 106, 107, 108, 109, 110, 111, -1, -1, 114, >+ 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, >+ -1, -1, -1, -1, -1, -1, -1, -1, 133, -1, >+ -1, -1, 137, 138, -1, -1, -1, -1, 143, 144, >+ 145, 146, 147, 3, 4, 5, 6, 7, 8, 9, >+ 10, 11, 12, 13, 14, 15, 16, -1, 18, 19, >+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, >+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, >+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, >+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, >+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, >+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, >+ 80, 81, 82, 83, -1, 85, 86, 87, 88, 89, >+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, >+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, >+ 110, 111, -1, -1, 114, 115, -1, -1, -1, -1, > -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, 130, -1, -1, -1, 134, -1, -1, >- -1, -1, -1, 140, 141, 142, 143, 144, 3, 4, >+ -1, -1, -1, 133, -1, -1, -1, 137, -1, -1, >+ -1, -1, -1, 143, 144, 145, 146, 147, 3, 4, > 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, > 15, 16, -1, 18, 19, 20, 21, 22, 23, 24, > 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, >@@ -1413,172 +1404,191 @@ static const yytype_int16 yycheck[] = > 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, > 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, > 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, >- 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, >+ 75, 76, 77, 78, 79, 80, 81, 82, 83, -1, > 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, > 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, >- 105, 106, 107, 108, -1, -1, 111, 112, -1, -1, >+ 105, 106, 107, 108, 109, 110, 111, -1, -1, 114, >+ 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, >+ -1, -1, -1, -1, -1, -1, -1, -1, 133, -1, >+ -1, -1, 137, -1, -1, -1, -1, -1, 143, 144, >+ 145, 146, 147, 3, 4, 5, 6, 7, 8, 9, >+ 10, 11, 12, 13, 14, 15, 16, -1, 18, 19, >+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, >+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, >+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, >+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, >+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, >+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, >+ 80, 81, 82, 83, -1, 85, 86, 87, 88, 89, >+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, >+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, >+ 110, 111, -1, -1, 114, 115, -1, -1, -1, -1, > -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, -1, -1, 130, -1, -1, -1, -1, >- -1, -1, -1, -1, -1, 140, 141, 142, 143, 144, >- 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, >- 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, >+ -1, -1, -1, 133, -1, -1, -1, -1, -1, -1, >+ -1, -1, -1, 143, 144, 145, 146, 147, 3, 4, >+ 5, 6, 7, 8, 9, 10, 11, 12, 13, -1, >+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, >+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, >+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, >+ 55, 56, 57, 58, 59, 60, 61, 62, -1, 64, >+ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, >+ 75, 76, 77, 78, 79, 80, 81, 82, 83, -1, >+ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, >+ 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, >+ 105, 106, 107, 108, 109, 110, 111, -1, -1, 114, >+ 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, >+ -1, -1, -1, -1, 3, 4, 5, 6, 133, 8, >+ 9, 10, 11, 12, 13, -1, -1, -1, 143, 144, >+ 145, 146, 147, -1, -1, -1, 25, 26, 27, 28, >+ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, >+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, >+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, >+ 59, 60, 61, 62, -1, 64, 65, 66, 67, 68, >+ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, >+ 79, 80, 81, 82, 83, -1, 85, 86, 87, 88, >+ 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, >+ 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, >+ 109, 110, 111, -1, -1, 114, 115, -1, -1, -1, >+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >+ 3, 4, 5, 6, 133, 8, 9, 10, 11, 12, >+ 13, -1, -1, -1, -1, 144, 145, 146, 147, -1, > -1, -1, 25, 26, 27, 28, 29, 30, 31, 32, > 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, > 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, > 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, > -1, 64, 65, 66, 67, 68, 69, 70, 71, 72, >- 73, 74, 75, 76, 77, 78, 79, 80, -1, 82, >- 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, >+ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, >+ 83, -1, 85, 86, 87, 88, 89, 90, 91, 92, > 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, >- 103, 104, 105, 106, 107, 108, -1, -1, 111, 112, >+ 103, -1, 105, 106, -1, 10, 11, 12, 13, -1, > -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, 3, 4, 5, 6, 130, 8, 9, >- 10, 11, 12, 13, -1, -1, -1, 140, 141, 142, >- 143, 144, -1, -1, -1, 25, 26, 27, 28, 29, >- 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, >- 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, >- 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, >- 60, 61, 62, -1, 64, 65, 66, 67, 68, 69, >- 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, >- 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, >- 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, >- 100, 101, 102, 103, 104, 105, 106, 107, 108, -1, >- -1, 111, 112, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, -1, -1, -1, 3, 4, 5, 6, >- 130, 8, 9, 10, 11, 12, 13, -1, -1, -1, >- -1, 141, 142, 143, 144, -1, -1, -1, 25, 26, >- 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, >- 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, >- 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, >- 57, 58, 59, 60, 61, 62, -1, 64, 65, 66, >- 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, >- 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, >- 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, >- 97, 98, 99, 100, -1, 102, 103, -1, 10, 11, >- 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, 25, 26, 27, 28, 29, 30, 31, >- 32, 33, 34, 35, 36, 37, 38, 39, -1, -1, >- -1, -1, -1, 140, 46, 47, 48, 49, 50, 51, >- -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, >- 62, -1, 64, 65, 66, 67, 68, 69, 70, 71, >- 72, 73, 74, 75, 76, 77, 78, 79, 80, -1, >- 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, >- 92, 93, 94, 95, 96, 97, 98, -1, 100, 101, >- 102, 103, 104, 105, 106, 107, 108, -1, -1, 111, >- 112, -1, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, >- -1, 133, 10, 11, 12, 13, -1, -1, -1, 141, >- 142, 143, 144, -1, -1, -1, -1, 25, 26, 27, >+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, >+ 35, 36, 37, 38, 39, -1, -1, -1, -1, -1, >+ 143, 46, 47, 48, 49, 50, 51, -1, -1, -1, >+ -1, -1, -1, -1, -1, -1, 61, 62, -1, 64, >+ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, >+ 75, 76, 77, 78, 79, 80, 81, 82, 83, -1, >+ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, >+ 95, 96, 97, 98, 99, 100, 101, -1, 103, 104, >+ 105, 106, 107, 108, 109, 110, 111, -1, -1, 114, >+ 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, >+ -1, -1, -1, -1, -1, -1, -1, -1, 133, -1, >+ -1, 136, 10, 11, 12, 13, -1, -1, -1, 144, >+ 145, 146, 147, -1, -1, -1, -1, 25, 26, 27, > 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, > 38, 39, -1, -1, -1, -1, -1, -1, 46, 47, > 48, 49, 50, 51, -1, -1, -1, -1, -1, -1, > -1, -1, -1, 61, 62, -1, 64, 65, 66, 67, > 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, >- 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, >+ 78, 79, 80, 81, 82, 83, -1, 85, 86, 87, > 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, >- 98, -1, 100, 101, 102, 103, 104, 105, 106, 107, >- 108, -1, -1, 111, 112, -1, -1, -1, -1, -1, >+ 98, 99, 100, 101, -1, 103, 104, 105, 106, 107, >+ 108, 109, 110, 111, -1, -1, 114, 115, -1, -1, > -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, 130, -1, -1, 133, 10, 11, 12, 13, >- -1, -1, -1, 141, 142, 143, 144, -1, -1, -1, >- -1, 25, 26, 27, 28, 29, 30, 31, 32, 33, >- 34, 35, 36, 37, 38, 39, -1, -1, -1, -1, >- -1, -1, 46, 47, 48, 49, 50, 51, -1, -1, >- -1, -1, -1, -1, -1, -1, -1, 61, 62, -1, >- 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, >- 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, >- 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, >- 94, 95, 96, 97, 98, -1, 100, 101, 102, 103, >- 104, 105, 106, 107, 108, -1, -1, 111, 112, -1, >+ -1, -1, -1, -1, -1, 133, -1, -1, 136, 10, >+ 11, 12, 13, -1, -1, -1, 144, 145, 146, 147, >+ -1, -1, -1, -1, 25, 26, 27, 28, 29, 30, >+ 31, 32, 33, 34, 35, 36, 37, 38, 39, -1, >+ -1, -1, -1, -1, -1, 46, 47, 48, 49, 50, >+ 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, >+ 61, 62, -1, 64, 65, 66, 67, 68, 69, 70, >+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, >+ 81, 82, 83, -1, 85, 86, 87, 88, 89, 90, >+ 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, >+ 101, -1, 103, 104, 105, 106, 107, 108, 109, 110, >+ 111, -1, -1, 114, 115, -1, -1, -1, -1, -1, > -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, -1, -1, -1, 130, 10, 11, 12, >- 13, -1, -1, -1, -1, -1, 140, 141, 142, 143, >- 144, -1, 25, 26, 27, 28, 29, 30, 31, 32, >+ -1, -1, 133, 10, 11, 12, 13, -1, -1, -1, >+ -1, -1, 143, 144, 145, 146, 147, -1, 25, 26, >+ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, >+ 37, 38, 39, -1, -1, -1, -1, -1, -1, 46, >+ 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, >+ -1, -1, -1, -1, 61, 62, -1, 64, 65, 66, >+ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, >+ 77, 78, 79, 80, 81, 82, 83, -1, 85, 86, >+ 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, >+ 97, 98, 99, 100, 101, -1, 103, 104, 105, 106, >+ 107, 108, 109, 110, 111, -1, -1, 114, 115, -1, >+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >+ -1, -1, -1, -1, -1, -1, 133, 10, 11, 12, >+ 13, -1, -1, -1, -1, -1, -1, 144, 145, 146, >+ 147, -1, 25, 26, 27, 28, 29, 30, 31, 32, > 33, 34, 35, 36, 37, 38, 39, -1, -1, -1, > -1, -1, -1, 46, 47, 48, 49, 50, 51, -1, > -1, -1, -1, -1, -1, -1, -1, -1, 61, 62, > -1, 64, 65, 66, 67, 68, 69, 70, 71, 72, >- 73, 74, 75, 76, 77, 78, 79, 80, -1, 82, >- 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, >- 93, 94, 95, 96, 97, 98, -1, 100, 101, 102, >- 103, 104, 105, 106, 107, 108, -1, -1, 111, 112, >- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, -1, -1, -1, -1, 130, 10, 11, >- 12, 13, -1, -1, -1, -1, -1, -1, 141, 142, >- 143, 144, -1, 25, 26, 27, 28, 29, 30, 31, >- 32, 33, 34, 35, 36, 37, 38, 39, -1, -1, >- -1, -1, -1, -1, 46, 47, 48, 49, 50, 51, >- -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, >- 62, -1, 64, 65, 66, 67, 68, 69, 70, 71, >- 72, 73, 74, 75, 76, 77, 78, 79, 80, -1, >- 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, >- 92, 93, 94, 95, 96, 97, 98, -1, 100, 101, >- 102, 103, 104, 105, 106, 107, 108, -1, -1, 111, >- 112, -1, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, -1, -1, -1, 3, 4, 5, 6, 130, 8, >- 9, 10, 11, 12, 13, -1, -1, -1, -1, 141, >- 142, 143, 144, -1, -1, -1, 25, 26, 27, 28, >- 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, >- 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, >- 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, >- 59, 60, 61, 62, -1, 64, 65, 66, 67, 68, >- 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, >- 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, >- 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, >- 99, 100, -1, -1, 103, -1, -1, -1, -1, -1, >- -1, -1, -1, -1, -1, 3, 4, 5, 6, -1, >- 8, 9, 10, 11, 12, 13, -1, -1, -1, -1, >- -1, -1, -1, -1, -1, -1, 135, 25, 26, 27, >- 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, >- 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, >- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, >- 58, 59, 60, 61, 62, -1, 64, 65, 66, 67, >- 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, >- 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, >- 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, >- 98, 99, 100, -1, -1, 103, -1, -1, -1, -1, >+ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, >+ 83, -1, 85, 86, 87, 88, 89, 90, 91, 92, >+ 93, 94, 95, 96, 97, 98, 99, 100, 101, -1, >+ 103, 104, 105, 106, 107, 108, 109, 110, 111, -1, >+ -1, 114, 115, -1, -1, -1, -1, -1, -1, -1, > -1, -1, -1, -1, -1, -1, 3, 4, 5, 6, >- -1, 8, 9, 10, 11, 12, 13, -1, -1, -1, >- -1, -1, -1, -1, -1, -1, -1, 135, 25, 26, >+ 133, 8, 9, 10, 11, 12, 13, -1, -1, -1, >+ -1, 144, 145, 146, 147, -1, -1, -1, 25, 26, > 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, > 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, > 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, > 57, 58, 59, 60, 61, 62, -1, 64, 65, 66, > 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, >- 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, >+ 77, 78, 79, 80, 81, 82, 83, -1, 85, 86, > 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, >- 97, 98, 99, 100, -1, -1, 103, -1, -1, -1, >- -1, -1, -1, -1, 0, -1, -1, 3, 4, 5, >- 6, 7, 8, 9, 10, 11, 12, 13, -1, -1, >- -1, -1, -1, -1, -1, -1, -1, -1, 135, 25, >- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, >- 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, >- 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, >- 56, 57, 58, 59, 60, 61, 62, -1, 64, 65, >- 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, >- 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, >- 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, >- 96, 97, 98, 99, 100, -1, -1, 103, 3, 4, >- 5, 6, 7, 8, 9, 10, 11, 12, 13, -1, >+ 97, 98, 99, 100, 101, 102, 103, -1, -1, 106, > -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >+ 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, >+ 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, >+ -1, 138, 25, 26, 27, 28, 29, 30, 31, 32, >+ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, >+ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, >+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, >+ -1, 64, 65, 66, 67, 68, 69, 70, 71, 72, >+ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, >+ 83, -1, 85, 86, 87, 88, 89, 90, 91, 92, >+ 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, >+ 103, -1, -1, 106, -1, -1, -1, -1, -1, -1, >+ -1, -1, -1, -1, 3, 4, 5, 6, -1, 8, >+ 9, 10, 11, 12, 13, -1, -1, -1, -1, -1, >+ -1, -1, -1, -1, -1, 138, 25, 26, 27, 28, >+ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, >+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, >+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, >+ 59, 60, 61, 62, -1, 64, 65, 66, 67, 68, >+ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, >+ 79, 80, 81, 82, 83, -1, 85, 86, 87, 88, >+ 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, >+ 99, 100, 101, 102, 103, -1, -1, 106, -1, -1, >+ -1, -1, -1, -1, -1, 0, -1, -1, 3, 4, >+ 5, 6, 7, 8, 9, 10, 11, 12, 13, -1, >+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 138, > 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, > 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, > 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, > 55, 56, 57, 58, 59, 60, 61, 62, -1, 64, > 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, >- 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, >+ 75, 76, 77, 78, 79, 80, 81, 82, 83, -1, > 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, >- 95, 96, 97, 98, 99, 100, -1, -1, 103, 3, >- 4, 5, 6, -1, 8, 9, 10, 11, 12, 13, >- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, >- -1, 25, 26, 27, 28, 29, 30, 31, 32, 33, >- 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, >- 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, >- 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, >- 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, >- 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, >- 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, >- 94, 95, 96, 97, 98, 99, 100, -1, -1, 103, >+ 95, 96, 97, 98, 99, 100, 101, 102, 103, -1, >+ -1, 106, 3, 4, 5, 6, 7, 8, 9, 10, >+ 11, 12, 13, -1, -1, -1, -1, -1, -1, -1, >+ -1, -1, -1, -1, 25, 26, 27, 28, 29, 30, >+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, >+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, >+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, >+ 61, 62, -1, 64, 65, 66, 67, 68, 69, 70, >+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, >+ 81, 82, 83, -1, 85, 86, 87, 88, 89, 90, >+ 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, >+ 101, 102, 103, -1, -1, 106, 3, 4, 5, 6, >+ -1, 8, 9, 10, 11, 12, 13, -1, -1, -1, >+ -1, -1, -1, -1, -1, -1, -1, -1, 25, 26, >+ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, >+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, >+ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, >+ 57, 58, 59, 60, 61, 62, -1, 64, 65, 66, >+ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, >+ 77, 78, 79, 80, 81, 82, 83, -1, 85, 86, >+ 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, >+ 97, 98, 99, 100, 101, 102, 103, -1, -1, 106, > 10, 11, 12, 13, -1, -1, -1, -1, -1, -1, > -1, -1, -1, -1, -1, 25, 26, 27, 28, 29, > 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, >@@ -1586,18 +1596,19 @@ static const yytype_int16 yycheck[] = > 50, 51, -1, -1, -1, -1, -1, -1, -1, -1, > -1, 61, 62, -1, 64, 65, 66, 67, 68, 69, > 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, >- 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, >- 90, 91, 92, 93, 94, 95, 96, 97, 98, -1, >- 100, -1, 102, 103, 10, 11, 12, 13, 108, -1, >- -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, >- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, >- 36, 37, 38, 39, -1, -1, -1, -1, -1, -1, >- 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, >- -1, -1, -1, -1, -1, 61, 62, -1, 64, 65, >- 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, >- 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, >- 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, >- 96, 97, 98, -1, 100, -1, -1, 103 >+ 80, 81, 82, 83, -1, 85, 86, 87, 88, 89, >+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, >+ 100, 101, -1, 103, -1, 105, 106, 10, 11, 12, >+ 13, 111, -1, -1, -1, -1, -1, -1, -1, -1, >+ -1, -1, 25, 26, 27, 28, 29, 30, 31, 32, >+ 33, 34, 35, 36, 37, 38, 39, -1, -1, -1, >+ -1, -1, -1, 46, 47, 48, 49, 50, 51, -1, >+ -1, -1, -1, -1, -1, -1, -1, -1, 61, 62, >+ -1, 64, 65, 66, 67, 68, 69, 70, 71, 72, >+ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, >+ 83, -1, 85, 86, 87, 88, 89, 90, 91, 92, >+ 93, 94, 95, 96, 97, 98, 99, 100, 101, -1, >+ 103, -1, -1, 106 > }; > > /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing >@@ -1610,78 +1621,79 @@ static const yytype_uint8 yystos[] = > 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, > 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, > 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, >- 74, 75, 76, 77, 78, 79, 80, 82, 83, 84, >+ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, > 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, >- 95, 96, 97, 98, 99, 100, 103, 186, 187, 188, >- 189, 190, 194, 195, 196, 197, 198, 199, 200, 201, >- 202, 203, 204, 207, 209, 210, 245, 246, 247, 203, >- 102, 103, 134, 155, 130, 140, 248, 131, 137, 191, >- 192, 193, 198, 202, 137, 140, 102, 155, 102, 140, >- 185, 200, 202, 132, 208, 0, 246, 207, 212, 134, >- 60, 102, 205, 206, 134, 228, 192, 191, 193, 155, >- 155, 130, 139, 208, 134, 140, 198, 202, 213, 214, >- 101, 102, 104, 105, 106, 107, 108, 111, 112, 130, >- 133, 141, 142, 143, 144, 156, 157, 158, 160, 161, >- 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, >- 172, 173, 174, 175, 176, 177, 178, 179, 180, 184, >- 207, 132, 140, 213, 211, 139, 131, 137, 14, 15, >- 16, 18, 19, 20, 21, 22, 23, 24, 63, 134, >- 135, 140, 167, 180, 181, 183, 186, 187, 207, 218, >- 219, 220, 221, 229, 230, 231, 233, 235, 237, 244, >- 208, 139, 208, 181, 217, 139, 202, 155, 215, 216, >- 135, 214, 167, 167, 183, 111, 112, 132, 136, 131, >- 131, 137, 62, 181, 130, 167, 145, 146, 147, 142, >- 144, 109, 110, 113, 114, 148, 149, 115, 116, 152, >- 151, 150, 117, 119, 118, 153, 133, 133, 184, 135, >- 213, 105, 106, 206, 140, 140, 239, 130, 130, 140, >- 140, 183, 130, 184, 138, 130, 135, 222, 120, 121, >- 122, 123, 124, 125, 126, 127, 128, 129, 139, 182, >- 137, 140, 135, 219, 217, 139, 217, 215, 208, 137, >- 140, 102, 140, 131, 159, 183, 102, 108, 162, 181, >- 167, 167, 167, 169, 169, 170, 170, 171, 171, 171, >- 171, 172, 172, 173, 174, 175, 176, 177, 178, 183, >- 133, 135, 225, 226, 227, 240, 183, 140, 183, 138, >- 238, 229, 181, 181, 217, 140, 216, 132, 140, 133, >- 138, 63, 228, 220, 218, 230, 241, 131, 131, 183, >- 196, 198, 236, 223, 184, 181, 130, 236, 242, 243, >- 225, 232, 234, 155, 131, 135, 133, 183, 140, 131, >- 17, 221, 139, 220, 224, 228, 140, 131, 183, 224, >- 225, 217, 140 >+ 95, 96, 97, 98, 99, 100, 101, 102, 103, 106, >+ 189, 190, 191, 192, 193, 197, 198, 199, 200, 201, >+ 202, 203, 204, 205, 206, 207, 210, 212, 213, 248, >+ 249, 250, 206, 105, 106, 137, 158, 133, 143, 251, >+ 134, 140, 194, 195, 196, 201, 205, 140, 143, 105, >+ 158, 105, 143, 188, 203, 205, 135, 211, 0, 249, >+ 210, 215, 137, 60, 105, 208, 209, 137, 231, 195, >+ 194, 196, 158, 158, 133, 142, 211, 137, 143, 201, >+ 205, 216, 217, 104, 105, 107, 108, 109, 110, 111, >+ 114, 115, 133, 136, 144, 145, 146, 147, 159, 160, >+ 161, 163, 164, 165, 166, 167, 168, 169, 170, 171, >+ 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, >+ 182, 183, 187, 210, 135, 143, 216, 214, 142, 134, >+ 140, 14, 15, 16, 18, 19, 20, 21, 22, 23, >+ 24, 63, 137, 138, 143, 170, 183, 184, 186, 189, >+ 190, 210, 221, 222, 223, 224, 232, 233, 234, 236, >+ 238, 240, 247, 211, 142, 211, 184, 220, 142, 205, >+ 158, 218, 219, 138, 217, 170, 170, 186, 114, 115, >+ 135, 139, 134, 134, 140, 62, 184, 133, 170, 148, >+ 149, 150, 145, 147, 112, 113, 116, 117, 151, 152, >+ 118, 119, 155, 154, 153, 120, 122, 121, 156, 136, >+ 136, 187, 138, 216, 108, 109, 209, 143, 143, 242, >+ 133, 133, 143, 143, 186, 133, 187, 141, 133, 138, >+ 225, 123, 124, 125, 126, 127, 128, 129, 130, 131, >+ 132, 142, 185, 140, 143, 138, 222, 220, 142, 220, >+ 218, 211, 140, 143, 105, 143, 134, 162, 186, 105, >+ 111, 165, 184, 170, 170, 170, 172, 172, 173, 173, >+ 174, 174, 174, 174, 175, 175, 176, 177, 178, 179, >+ 180, 181, 186, 136, 138, 228, 229, 230, 243, 186, >+ 143, 186, 141, 241, 232, 184, 184, 220, 143, 219, >+ 135, 143, 136, 141, 63, 231, 223, 221, 233, 244, >+ 134, 134, 186, 199, 201, 239, 226, 187, 184, 133, >+ 239, 245, 246, 228, 235, 237, 158, 134, 138, 136, >+ 186, 143, 134, 17, 224, 142, 223, 227, 231, 143, >+ 134, 186, 227, 228, 220, 143 > }; > > /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ > static const yytype_uint8 yyr1[] = > { >- 0, 154, 155, 155, 156, 157, 157, 157, 157, 157, >- 157, 157, 158, 158, 158, 158, 158, 158, 159, 160, >- 161, 161, 162, 162, 163, 163, 164, 164, 165, 166, >- 166, 166, 167, 167, 167, 167, 168, 168, 168, 168, >- 169, 169, 169, 169, 170, 170, 170, 171, 171, 171, >- 172, 172, 172, 172, 172, 173, 173, 173, 174, 174, >- 175, 175, 176, 176, 177, 177, 178, 178, 179, 179, >- 180, 180, 181, 181, 182, 182, 182, 182, 182, 182, >- 182, 182, 182, 182, 182, 183, 183, 184, 185, 186, >- 186, 186, 186, 186, 186, 186, 186, 187, 188, 188, >- 189, 189, 190, 191, 191, 192, 192, 192, 192, 193, >- 194, 194, 194, 194, 194, 195, 195, 195, 195, 195, >- 196, 196, 197, 197, 198, 198, 199, 200, 200, 200, >- 200, 200, 201, 201, 201, 201, 201, 201, 201, 201, >- 201, 201, 201, 201, 201, 201, 201, 202, 203, 203, >- 203, 204, 205, 205, 206, 206, 206, 206, 207, 207, >- 208, 208, 208, 208, 209, 209, 209, 209, 209, 209, >- 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, >- 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, >- 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, >- 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, >- 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, >- 209, 209, 209, 209, 209, 209, 209, 211, 210, 212, >- 210, 213, 213, 214, 214, 215, 215, 216, 216, 217, >- 218, 219, 219, 220, 220, 220, 220, 220, 220, 220, >- 221, 222, 223, 221, 224, 224, 226, 225, 227, 225, >- 228, 228, 229, 229, 230, 230, 231, 232, 232, 234, >- 233, 235, 235, 236, 236, 238, 237, 239, 237, 240, >- 237, 241, 241, 242, 242, 243, 243, 244, 244, 244, >- 244, 244, 245, 245, 246, 246, 248, 247 >+ 0, 157, 158, 158, 159, 160, 160, 160, 160, 160, >+ 160, 160, 161, 161, 161, 161, 161, 161, 162, 163, >+ 164, 164, 165, 165, 166, 166, 167, 167, 168, 169, >+ 169, 169, 170, 170, 170, 170, 171, 171, 171, 171, >+ 172, 172, 172, 172, 173, 173, 173, 174, 174, 174, >+ 175, 175, 175, 175, 175, 176, 176, 176, 177, 177, >+ 178, 178, 179, 179, 180, 180, 181, 181, 182, 182, >+ 183, 183, 184, 184, 185, 185, 185, 185, 185, 185, >+ 185, 185, 185, 185, 185, 186, 186, 187, 188, 189, >+ 189, 189, 189, 189, 189, 189, 189, 190, 191, 191, >+ 192, 192, 193, 194, 194, 195, 195, 195, 195, 196, >+ 197, 197, 197, 197, 197, 198, 198, 198, 198, 198, >+ 199, 199, 200, 200, 201, 201, 202, 203, 203, 203, >+ 203, 203, 204, 204, 204, 204, 204, 204, 204, 204, >+ 204, 204, 204, 204, 204, 204, 204, 205, 206, 206, >+ 206, 207, 208, 208, 209, 209, 209, 209, 210, 210, >+ 211, 211, 211, 211, 212, 212, 212, 212, 212, 212, >+ 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, >+ 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, >+ 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, >+ 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, >+ 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, >+ 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, >+ 214, 213, 215, 213, 216, 216, 217, 217, 218, 218, >+ 219, 219, 220, 221, 222, 222, 223, 223, 223, 223, >+ 223, 223, 223, 224, 225, 226, 224, 227, 227, 229, >+ 228, 230, 228, 231, 231, 232, 232, 233, 233, 234, >+ 235, 235, 237, 236, 238, 238, 239, 239, 241, 240, >+ 242, 240, 243, 240, 244, 244, 245, 245, 246, 246, >+ 247, 247, 247, 247, 247, 248, 248, 249, 249, 251, >+ 250 > }; > > /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ >@@ -1709,14 +1721,15 @@ static const yytype_uint8 yyr2[] = > 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, > 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, > 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 1, 1, 1, 1, 1, 1, 1, 0, 6, 0, >- 5, 1, 2, 3, 4, 1, 3, 1, 2, 1, > 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, >- 2, 0, 0, 5, 1, 1, 0, 2, 0, 2, >- 2, 3, 1, 2, 1, 2, 5, 3, 1, 0, >- 6, 3, 2, 1, 4, 0, 6, 0, 8, 0, >- 7, 1, 1, 1, 0, 2, 3, 2, 2, 2, >- 3, 2, 1, 2, 1, 1, 0, 3 >+ 0, 6, 0, 5, 1, 2, 3, 4, 1, 3, >+ 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, >+ 1, 1, 1, 2, 0, 0, 5, 1, 1, 0, >+ 2, 0, 2, 2, 3, 1, 2, 1, 2, 5, >+ 3, 1, 0, 6, 3, 2, 1, 4, 0, 6, >+ 0, 8, 0, 7, 1, 1, 1, 0, 2, 3, >+ 2, 2, 2, 3, 2, 1, 2, 1, 1, 0, >+ 3 > }; > > >@@ -2499,10 +2512,7 @@ yyreduce: > > { > // The symbol table search was done in the lexical phase >- (yyval.interm.intermTypedNode) = context->parseVariableIdentifier((yylsp[0]), (yyvsp[0].lex).string, (yyvsp[0].lex).symbol); >- >- // don't delete $1.string, it's used by error recovery, and the pool >- // pop will reclaim the memory >+ (yyval.interm.intermTypedNode) = context->parseVariableIdentifier((yylsp[0]), ImmutableString((yyvsp[0].lex).string), (yyvsp[0].lex).symbol); > } > > break; >@@ -2560,10 +2570,10 @@ yyreduce: > { > if (!context->checkCanUseExtension((yylsp[0]), TExtension::EXT_YUV_target)) > { >- context->error((yylsp[0]), "unsupported value", (yyvsp[0].lex).string->c_str()); >+ context->error((yylsp[0]), "unsupported value", ImmutableString((yyvsp[0].lex).string)); > } > TConstantUnion *unionArray = new TConstantUnion[1]; >- unionArray->setYuvCscStandardEXTConst(getYuvCscStandardEXT((yyvsp[0].lex).string->c_str())); >+ unionArray->setYuvCscStandardEXTConst(getYuvCscStandardEXT(ImmutableString((yyvsp[0].lex).string))); > (yyval.interm.intermTypedNode) = context->addScalarLiteral(unionArray, (yylsp[0])); > } > >@@ -2604,7 +2614,7 @@ yyreduce: > case 15: > > { >- (yyval.interm.intermTypedNode) = context->addFieldSelectionExpression((yyvsp[-2].interm.intermTypedNode), (yylsp[-1]), *(yyvsp[0].lex).string, (yylsp[0])); >+ (yyval.interm.intermTypedNode) = context->addFieldSelectionExpression((yyvsp[-2].interm.intermTypedNode), (yylsp[-1]), ImmutableString((yyvsp[0].lex).string), (yylsp[0])); > } > > break; >@@ -2637,7 +2647,7 @@ yyreduce: > case 19: > > { >- (yyval.interm.intermTypedNode) = context->addFunctionCallOrMethod((yyvsp[0].interm).function, (yyvsp[0].interm).callOrMethodPair.arguments, (yyvsp[0].interm).callOrMethodPair.thisNode, (yylsp[0])); >+ (yyval.interm.intermTypedNode) = context->addFunctionCallOrMethod((yyvsp[0].interm.functionLookup), (yylsp[0])); > } > > break; >@@ -2645,8 +2655,7 @@ yyreduce: > case 20: > > { >- (yyval.interm) = (yyvsp[0].interm); >- (yyval.interm).callOrMethodPair.thisNode = nullptr; >+ (yyval.interm.functionLookup) = (yyvsp[0].interm.functionLookup); > } > > break; >@@ -2655,8 +2664,8 @@ yyreduce: > > { > ES3_OR_NEWER("", (yylsp[0]), "methods"); >- (yyval.interm) = (yyvsp[0].interm); >- (yyval.interm).callOrMethodPair.thisNode = (yyvsp[-2].interm.intermTypedNode); >+ (yyval.interm.functionLookup) = (yyvsp[0].interm.functionLookup); >+ (yyval.interm.functionLookup)->setThisNode((yyvsp[-2].interm.intermTypedNode)); > } > > break; >@@ -2664,7 +2673,7 @@ yyreduce: > case 22: > > { >- (yyval.interm) = (yyvsp[-1].interm); >+ (yyval.interm.functionLookup) = (yyvsp[-1].interm.functionLookup); > } > > break; >@@ -2672,7 +2681,7 @@ yyreduce: > case 23: > > { >- (yyval.interm) = (yyvsp[-1].interm); >+ (yyval.interm.functionLookup) = (yyvsp[-1].interm.functionLookup); > } > > break; >@@ -2680,8 +2689,7 @@ yyreduce: > case 24: > > { >- (yyval.interm).function = (yyvsp[-1].interm.function); >- (yyval.interm).callOrMethodPair.arguments = context->createEmptyArgumentsList(); >+ (yyval.interm.functionLookup) = (yyvsp[-1].interm.functionLookup); > } > > break; >@@ -2689,8 +2697,7 @@ yyreduce: > case 25: > > { >- (yyval.interm).function = (yyvsp[0].interm.function); >- (yyval.interm).callOrMethodPair.arguments = context->createEmptyArgumentsList(); >+ (yyval.interm.functionLookup) = (yyvsp[0].interm.functionLookup); > } > > break; >@@ -2698,9 +2705,8 @@ yyreduce: > case 26: > > { >- (yyval.interm).callOrMethodPair.arguments = context->createEmptyArgumentsList(); >- (yyval.interm).function = (yyvsp[-1].interm.function); >- (yyval.interm).callOrMethodPair.arguments->push_back((yyvsp[0].interm.intermTypedNode)); >+ (yyval.interm.functionLookup) = (yyvsp[-1].interm.functionLookup); >+ (yyval.interm.functionLookup)->addArgument((yyvsp[0].interm.intermTypedNode)); > } > > break; >@@ -2708,8 +2714,8 @@ yyreduce: > case 27: > > { >- (yyval.interm).function = (yyvsp[-2].interm).function; >- (yyval.interm).callOrMethodPair.arguments->push_back((yyvsp[0].interm.intermTypedNode)); >+ (yyval.interm.functionLookup) = (yyvsp[-2].interm.functionLookup); >+ (yyval.interm.functionLookup)->addArgument((yyvsp[0].interm.intermTypedNode)); > } > > break; >@@ -2717,7 +2723,7 @@ yyreduce: > case 28: > > { >- (yyval.interm.function) = (yyvsp[-1].interm.function); >+ (yyval.interm.functionLookup) = (yyvsp[-1].interm.functionLookup); > } > > break; >@@ -2725,7 +2731,7 @@ yyreduce: > case 29: > > { >- (yyval.interm.function) = context->addConstructorFunc((yyvsp[0].interm.type)); >+ (yyval.interm.functionLookup) = context->addConstructorFunc((yyvsp[0].interm.type)); > } > > break; >@@ -2733,7 +2739,7 @@ yyreduce: > case 30: > > { >- (yyval.interm.function) = context->addNonConstructorFunc((yyvsp[0].lex).string, (yylsp[0])); >+ (yyval.interm.functionLookup) = context->addNonConstructorFunc(ImmutableString((yyvsp[0].lex).string), (yyvsp[0].lex).symbol); > } > > break; >@@ -2741,7 +2747,7 @@ yyreduce: > case 31: > > { >- (yyval.interm.function) = context->addNonConstructorFunc((yyvsp[0].lex).string, (yylsp[0])); >+ (yyval.interm.functionLookup) = context->addNonConstructorFunc(ImmutableString((yyvsp[0].lex).string), (yyvsp[0].lex).symbol); > } > > break; >@@ -3169,7 +3175,7 @@ yyreduce: > case 88: > > { >- context->enterStructDeclaration((yylsp[-1]), *(yyvsp[-1].lex).string); >+ context->enterStructDeclaration((yylsp[-1]), ImmutableString((yyvsp[-1].lex).string)); > (yyval.lex) = (yyvsp[-1].lex); > } > >@@ -3203,8 +3209,8 @@ yyreduce: > case 92: > > { >- ES3_OR_NEWER((yyvsp[-3].lex).string->c_str(), (yylsp[-4]), "interface blocks"); >- (yyval.interm.intermNode) = context->addInterfaceBlock(*(yyvsp[-4].interm.typeQualifierBuilder), (yylsp[-3]), *(yyvsp[-3].lex).string, (yyvsp[-2].interm.fieldList), NULL, (yyloc), NULL, (yyloc)); >+ ES3_OR_NEWER(ImmutableString((yyvsp[-3].lex).string), (yylsp[-4]), "interface blocks"); >+ (yyval.interm.intermNode) = context->addInterfaceBlock(*(yyvsp[-4].interm.typeQualifierBuilder), (yylsp[-3]), ImmutableString((yyvsp[-3].lex).string), (yyvsp[-2].interm.fieldList), kEmptyImmutableString, (yyloc), NULL, (yyloc)); > } > > break; >@@ -3212,8 +3218,8 @@ yyreduce: > case 93: > > { >- ES3_OR_NEWER((yyvsp[-4].lex).string->c_str(), (yylsp[-5]), "interface blocks"); >- (yyval.interm.intermNode) = context->addInterfaceBlock(*(yyvsp[-5].interm.typeQualifierBuilder), (yylsp[-4]), *(yyvsp[-4].lex).string, (yyvsp[-3].interm.fieldList), (yyvsp[-1].lex).string, (yylsp[-1]), NULL, (yyloc)); >+ ES3_OR_NEWER(ImmutableString((yyvsp[-4].lex).string), (yylsp[-5]), "interface blocks"); >+ (yyval.interm.intermNode) = context->addInterfaceBlock(*(yyvsp[-5].interm.typeQualifierBuilder), (yylsp[-4]), ImmutableString((yyvsp[-4].lex).string), (yyvsp[-3].interm.fieldList), ImmutableString((yyvsp[-1].lex).string), (yylsp[-1]), NULL, (yyloc)); > } > > break; >@@ -3221,8 +3227,8 @@ yyreduce: > case 94: > > { >- ES3_OR_NEWER((yyvsp[-7].lex).string->c_str(), (yylsp[-8]), "interface blocks"); >- (yyval.interm.intermNode) = context->addInterfaceBlock(*(yyvsp[-8].interm.typeQualifierBuilder), (yylsp[-7]), *(yyvsp[-7].lex).string, (yyvsp[-6].interm.fieldList), (yyvsp[-4].lex).string, (yylsp[-4]), (yyvsp[-2].interm.intermTypedNode), (yylsp[-3])); >+ ES3_OR_NEWER(ImmutableString((yyvsp[-7].lex).string), (yylsp[-8]), "interface blocks"); >+ (yyval.interm.intermNode) = context->addInterfaceBlock(*(yyvsp[-8].interm.typeQualifierBuilder), (yylsp[-7]), ImmutableString((yyvsp[-7].lex).string), (yyvsp[-6].interm.fieldList), ImmutableString((yyvsp[-4].lex).string), (yylsp[-4]), (yyvsp[-2].interm.intermTypedNode), (yylsp[-3])); > } > > break; >@@ -3239,7 +3245,7 @@ yyreduce: > case 96: > > { >- (yyval.interm.intermNode) = context->parseInvariantDeclaration(*(yyvsp[-2].interm.typeQualifierBuilder), (yylsp[-1]), (yyvsp[-1].lex).string, (yyvsp[-1].lex).symbol); >+ (yyval.interm.intermNode) = context->parseInvariantDeclaration(*(yyvsp[-2].interm.typeQualifierBuilder), (yylsp[-1]), ImmutableString((yyvsp[-1].lex).string), (yyvsp[-1].lex).symbol); > } > > break; >@@ -3276,7 +3282,7 @@ yyreduce: > (yyval.interm.function) = (yyvsp[-1].interm.function); > if ((yyvsp[0].interm.param).type->getBasicType() != EbtVoid) > { >- (yyvsp[-1].interm.function)->addParameter((yyvsp[0].interm.param).turnToConst()); >+ (yyvsp[-1].interm.function)->addParameter((yyvsp[0].interm.param).createVariable(&context->symbolTable)); > } > } > >@@ -3295,7 +3301,7 @@ yyreduce: > } > else > { >- (yyvsp[-2].interm.function)->addParameter((yyvsp[0].interm.param).turnToConst()); >+ (yyvsp[-2].interm.function)->addParameter((yyvsp[0].interm.param).createVariable(&context->symbolTable)); > } > } > >@@ -3304,7 +3310,7 @@ yyreduce: > case 102: > > { >- (yyval.interm.function) = context->parseFunctionHeader((yyvsp[-2].interm.type), (yyvsp[-1].lex).string, (yylsp[-1])); >+ (yyval.interm.function) = context->parseFunctionHeader((yyvsp[-2].interm.type), ImmutableString((yyvsp[-1].lex).string), (yylsp[-1])); > > context->symbolTable.push(); > context->enterFunctionDeclaration(); >@@ -3315,7 +3321,7 @@ yyreduce: > case 103: > > { >- (yyval.interm.param) = context->parseParameterDeclarator((yyvsp[-1].interm.type), (yyvsp[0].lex).string, (yylsp[0])); >+ (yyval.interm.param) = context->parseParameterDeclarator((yyvsp[-1].interm.type), ImmutableString((yyvsp[0].lex).string), (yylsp[0])); > } > > break; >@@ -3323,7 +3329,7 @@ yyreduce: > case 104: > > { >- (yyval.interm.param) = context->parseParameterArrayDeclarator((yyvsp[-1].lex).string, (yylsp[-1]), *((yyvsp[0].interm.arraySizes)), (yylsp[0]), &(yyvsp[-2].interm.type)); >+ (yyval.interm.param) = context->parseParameterArrayDeclarator(ImmutableString((yyvsp[-1].lex).string), (yylsp[-1]), *((yyvsp[0].interm.arraySizes)), (yylsp[0]), &(yyvsp[-2].interm.type)); > } > > break; >@@ -3385,7 +3391,7 @@ yyreduce: > > { > (yyval.interm) = (yyvsp[-2].interm); >- context->parseDeclarator((yyval.interm).type, (yylsp[0]), *(yyvsp[0].lex).string, (yyval.interm).intermDeclaration); >+ context->parseDeclarator((yyval.interm).type, (yylsp[0]), ImmutableString((yyvsp[0].lex).string), (yyval.interm).intermDeclaration); > } > > break; >@@ -3394,7 +3400,7 @@ yyreduce: > > { > (yyval.interm) = (yyvsp[-3].interm); >- context->parseArrayDeclarator((yyval.interm).type, (yylsp[-1]), *(yyvsp[-1].lex).string, (yylsp[0]), *((yyvsp[0].interm.arraySizes)), (yyval.interm).intermDeclaration); >+ context->parseArrayDeclarator((yyval.interm).type, (yylsp[-1]), ImmutableString((yyvsp[-1].lex).string), (yylsp[0]), *((yyvsp[0].interm.arraySizes)), (yyval.interm).intermDeclaration); > } > > break; >@@ -3404,7 +3410,7 @@ yyreduce: > { > ES3_OR_NEWER("=", (yylsp[-1]), "first-class arrays (array initializer)"); > (yyval.interm) = (yyvsp[-5].interm); >- context->parseArrayInitDeclarator((yyval.interm).type, (yylsp[-3]), *(yyvsp[-3].lex).string, (yylsp[-2]), *((yyvsp[-2].interm.arraySizes)), (yylsp[-1]), (yyvsp[0].interm.intermTypedNode), (yyval.interm).intermDeclaration); >+ context->parseArrayInitDeclarator((yyval.interm).type, (yylsp[-3]), ImmutableString((yyvsp[-3].lex).string), (yylsp[-2]), *((yyvsp[-2].interm.arraySizes)), (yylsp[-1]), (yyvsp[0].interm.intermTypedNode), (yyval.interm).intermDeclaration); > } > > break; >@@ -3413,7 +3419,7 @@ yyreduce: > > { > (yyval.interm) = (yyvsp[-4].interm); >- context->parseInitDeclarator((yyval.interm).type, (yylsp[-2]), *(yyvsp[-2].lex).string, (yylsp[-1]), (yyvsp[0].interm.intermTypedNode), (yyval.interm).intermDeclaration); >+ context->parseInitDeclarator((yyval.interm).type, (yylsp[-2]), ImmutableString((yyvsp[-2].lex).string), (yylsp[-1]), (yyvsp[0].interm.intermTypedNode), (yyval.interm).intermDeclaration); > } > > break; >@@ -3422,7 +3428,7 @@ yyreduce: > > { > (yyval.interm).type = (yyvsp[0].interm.type); >- (yyval.interm).intermDeclaration = context->parseSingleDeclaration((yyval.interm).type, (yylsp[0]), ""); >+ (yyval.interm).intermDeclaration = context->parseSingleDeclaration((yyval.interm).type, (yylsp[0]), kEmptyImmutableString); > } > > break; >@@ -3431,7 +3437,7 @@ yyreduce: > > { > (yyval.interm).type = (yyvsp[-1].interm.type); >- (yyval.interm).intermDeclaration = context->parseSingleDeclaration((yyval.interm).type, (yylsp[0]), *(yyvsp[0].lex).string); >+ (yyval.interm).intermDeclaration = context->parseSingleDeclaration((yyval.interm).type, (yylsp[0]), ImmutableString((yyvsp[0].lex).string)); > } > > break; >@@ -3440,7 +3446,7 @@ yyreduce: > > { > (yyval.interm).type = (yyvsp[-2].interm.type); >- (yyval.interm).intermDeclaration = context->parseSingleArrayDeclaration((yyval.interm).type, (yylsp[-1]), *(yyvsp[-1].lex).string, (yylsp[0]), *((yyvsp[0].interm.arraySizes))); >+ (yyval.interm).intermDeclaration = context->parseSingleArrayDeclaration((yyval.interm).type, (yylsp[-1]), ImmutableString((yyvsp[-1].lex).string), (yylsp[0]), *((yyvsp[0].interm.arraySizes))); > } > > break; >@@ -3450,7 +3456,7 @@ yyreduce: > { > ES3_OR_NEWER("[]", (yylsp[-2]), "first-class arrays (array initializer)"); > (yyval.interm).type = (yyvsp[-4].interm.type); >- (yyval.interm).intermDeclaration = context->parseSingleArrayInitDeclaration((yyval.interm).type, (yylsp[-3]), *(yyvsp[-3].lex).string, (yylsp[-2]), *((yyvsp[-2].interm.arraySizes)), (yylsp[-1]), (yyvsp[0].interm.intermTypedNode)); >+ (yyval.interm).intermDeclaration = context->parseSingleArrayInitDeclaration((yyval.interm).type, (yylsp[-3]), ImmutableString((yyvsp[-3].lex).string), (yylsp[-2]), *((yyvsp[-2].interm.arraySizes)), (yylsp[-1]), (yyvsp[0].interm.intermTypedNode)); > } > > break; >@@ -3459,7 +3465,7 @@ yyreduce: > > { > (yyval.interm).type = (yyvsp[-3].interm.type); >- (yyval.interm).intermDeclaration = context->parseSingleInitDeclaration((yyval.interm).type, (yylsp[-2]), *(yyvsp[-2].lex).string, (yylsp[-1]), (yyvsp[0].interm.intermTypedNode)); >+ (yyval.interm).intermDeclaration = context->parseSingleInitDeclaration((yyval.interm).type, (yylsp[-2]), ImmutableString((yyvsp[-2].lex).string), (yylsp[-1]), (yyvsp[0].interm.intermTypedNode)); > } > > break; >@@ -3728,7 +3734,7 @@ yyreduce: > case 151: > > { >- ES3_OR_NEWER_OR_MULTIVIEW("layout", (yylsp[-3]), "qualifier"); >+ ES3_OR_NEWER("layout", (yylsp[-3]), "qualifier"); > (yyval.interm.layoutQualifier) = (yyvsp[-1].interm.layoutQualifier); > } > >@@ -3753,7 +3759,7 @@ yyreduce: > case 154: > > { >- (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[0].lex).string, (yylsp[0])); >+ (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(ImmutableString((yyvsp[0].lex).string), (yylsp[0])); > } > > break; >@@ -3761,7 +3767,7 @@ yyreduce: > case 155: > > { >- (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[-2].lex).string, (yylsp[-2]), (yyvsp[0].lex).i, (yylsp[0])); >+ (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(ImmutableString((yyvsp[-2].lex).string), (yylsp[-2]), (yyvsp[0].lex).i, (yylsp[0])); > } > > break; >@@ -3769,7 +3775,7 @@ yyreduce: > case 156: > > { >- (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[-2].lex).string, (yylsp[-2]), (yyvsp[0].lex).i, (yylsp[0])); >+ (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(ImmutableString((yyvsp[-2].lex).string), (yylsp[-2]), (yyvsp[0].lex).i, (yylsp[0])); > } > > break; >@@ -3777,7 +3783,7 @@ yyreduce: > case 157: > > { >- (yyval.interm.layoutQualifier) = context->parseLayoutQualifier("shared", (yylsp[0])); >+ (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(ImmutableString("shared"), (yylsp[0])); > } > > break; >@@ -4128,7 +4134,7 @@ yyreduce: > case 196: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler2D, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DMSArray, (yylsp[0])); > } > > break; >@@ -4136,7 +4142,7 @@ yyreduce: > case 197: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler3D, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler2D, (yylsp[0])); > } > > break; >@@ -4144,7 +4150,7 @@ yyreduce: > case 198: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtISamplerCube, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler3D, (yylsp[0])); > } > > break; >@@ -4152,7 +4158,7 @@ yyreduce: > case 199: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler2DArray, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtISamplerCube, (yylsp[0])); > } > > break; >@@ -4160,7 +4166,7 @@ yyreduce: > case 200: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler2DMS, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler2DArray, (yylsp[0])); > } > > break; >@@ -4168,7 +4174,7 @@ yyreduce: > case 201: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler2D, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler2DMS, (yylsp[0])); > } > > break; >@@ -4176,7 +4182,7 @@ yyreduce: > case 202: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler3D, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler2DMSArray, (yylsp[0])); > } > > break; >@@ -4184,7 +4190,7 @@ yyreduce: > case 203: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtUSamplerCube, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler2D, (yylsp[0])); > } > > break; >@@ -4192,7 +4198,7 @@ yyreduce: > case 204: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler2DArray, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler3D, (yylsp[0])); > } > > break; >@@ -4200,7 +4206,7 @@ yyreduce: > case 205: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler2DMS, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtUSamplerCube, (yylsp[0])); > } > > break; >@@ -4208,7 +4214,7 @@ yyreduce: > case 206: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DShadow, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler2DArray, (yylsp[0])); > } > > break; >@@ -4216,7 +4222,7 @@ yyreduce: > case 207: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtSamplerCubeShadow, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler2DMS, (yylsp[0])); > } > > break; >@@ -4224,7 +4230,7 @@ yyreduce: > case 208: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DArrayShadow, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler2DMSArray, (yylsp[0])); > } > > break; >@@ -4232,14 +4238,7 @@ yyreduce: > case 209: > > { >- constexpr std::array<TExtension, 3u> extensions{ { TExtension::NV_EGL_stream_consumer_external, >- TExtension::OES_EGL_image_external_essl3, >- TExtension::OES_EGL_image_external } }; >- if (!context->checkCanUseOneOfExtensions((yylsp[0]), extensions)) >- { >- context->error((yylsp[0]), "unsupported type", "samplerExternalOES"); >- } >- (yyval.interm.typeSpecifierNonArray).initialize(EbtSamplerExternalOES, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DShadow, (yylsp[0])); > } > > break; >@@ -4247,11 +4246,7 @@ yyreduce: > case 210: > > { >- if (!context->checkCanUseExtension((yylsp[0]), TExtension::EXT_YUV_target)) >- { >- context->error((yylsp[0]), "unsupported type", "__samplerExternal2DY2YEXT"); >- } >- (yyval.interm.typeSpecifierNonArray).initialize(EbtSamplerExternal2DY2YEXT, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtSamplerCubeShadow, (yylsp[0])); > } > > break; >@@ -4259,11 +4254,7 @@ yyreduce: > case 211: > > { >- if (!context->checkCanUseExtension((yylsp[0]), TExtension::ARB_texture_rectangle)) >- { >- context->error((yylsp[0]), "unsupported type", "sampler2DRect"); >- } >- (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DRect, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DArrayShadow, (yylsp[0])); > } > > break; >@@ -4271,7 +4262,14 @@ yyreduce: > case 212: > > { >- (yyval.interm.typeSpecifierNonArray) = (yyvsp[0].interm.typeSpecifierNonArray); >+ constexpr std::array<TExtension, 3u> extensions{ { TExtension::NV_EGL_stream_consumer_external, >+ TExtension::OES_EGL_image_external_essl3, >+ TExtension::OES_EGL_image_external } }; >+ if (!context->checkCanUseOneOfExtensions((yylsp[0]), extensions)) >+ { >+ context->error((yylsp[0]), "unsupported type", "samplerExternalOES"); >+ } >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtSamplerExternalOES, (yylsp[0])); > } > > break; >@@ -4279,7 +4277,11 @@ yyreduce: > case 213: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtImage2D, (yylsp[0])); >+ if (!context->checkCanUseExtension((yylsp[0]), TExtension::EXT_YUV_target)) >+ { >+ context->error((yylsp[0]), "unsupported type", "__samplerExternal2DY2YEXT"); >+ } >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtSamplerExternal2DY2YEXT, (yylsp[0])); > } > > break; >@@ -4287,7 +4289,11 @@ yyreduce: > case 214: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtIImage2D, (yylsp[0])); >+ if (!context->checkCanUseExtension((yylsp[0]), TExtension::ARB_texture_rectangle)) >+ { >+ context->error((yylsp[0]), "unsupported type", "sampler2DRect"); >+ } >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DRect, (yylsp[0])); > } > > break; >@@ -4295,7 +4301,7 @@ yyreduce: > case 215: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtUImage2D, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtImage2D, (yylsp[0])); > } > > break; >@@ -4303,7 +4309,7 @@ yyreduce: > case 216: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtImage3D, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtIImage2D, (yylsp[0])); > } > > break; >@@ -4311,7 +4317,7 @@ yyreduce: > case 217: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtIImage3D, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtUImage2D, (yylsp[0])); > } > > break; >@@ -4319,7 +4325,7 @@ yyreduce: > case 218: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtUImage3D, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtImage3D, (yylsp[0])); > } > > break; >@@ -4327,7 +4333,7 @@ yyreduce: > case 219: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtImage2DArray, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtIImage3D, (yylsp[0])); > } > > break; >@@ -4335,7 +4341,7 @@ yyreduce: > case 220: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtIImage2DArray, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtUImage3D, (yylsp[0])); > } > > break; >@@ -4343,7 +4349,7 @@ yyreduce: > case 221: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtUImage2DArray, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtImage2DArray, (yylsp[0])); > } > > break; >@@ -4351,7 +4357,7 @@ yyreduce: > case 222: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtImageCube, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtIImage2DArray, (yylsp[0])); > } > > break; >@@ -4359,7 +4365,7 @@ yyreduce: > case 223: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtIImageCube, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtUImage2DArray, (yylsp[0])); > } > > break; >@@ -4367,7 +4373,7 @@ yyreduce: > case 224: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtUImageCube, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtImageCube, (yylsp[0])); > } > > break; >@@ -4375,7 +4381,7 @@ yyreduce: > case 225: > > { >- (yyval.interm.typeSpecifierNonArray).initialize(EbtAtomicCounter, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtIImageCube, (yylsp[0])); > } > > break; >@@ -4383,61 +4389,61 @@ yyreduce: > case 226: > > { >- // This is for user defined type names. The lexical phase looked up the type. >- TType& structure = static_cast<TVariable*>((yyvsp[0].lex).symbol)->getType(); >- (yyval.interm.typeSpecifierNonArray).initializeStruct(structure.getStruct(), false, (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtUImageCube, (yylsp[0])); > } > > break; > > case 227: > >- { context->enterStructDeclaration((yylsp[-1]), *(yyvsp[-1].lex).string); } >+ { >+ (yyval.interm.typeSpecifierNonArray).initialize(EbtAtomicCounter, (yylsp[0])); >+ } > > break; > > case 228: > > { >- (yyval.interm.typeSpecifierNonArray) = context->addStructure((yylsp[-5]), (yylsp[-4]), (yyvsp[-4].lex).string, (yyvsp[-1].interm.fieldList)); >+ (yyval.interm.typeSpecifierNonArray) = (yyvsp[0].interm.typeSpecifierNonArray); > } > > break; > > case 229: > >- { context->enterStructDeclaration((yylsp[0]), *(yyvsp[0].lex).string); } >+ { >+ // This is for user defined type names. The lexical phase looked up the type. >+ const TStructure *structure = static_cast<const TStructure*>((yyvsp[0].lex).symbol); >+ (yyval.interm.typeSpecifierNonArray).initializeStruct(structure, false, (yylsp[0])); >+ } > > break; > > case 230: > >- { >- (yyval.interm.typeSpecifierNonArray) = context->addStructure((yylsp[-4]), (yyloc), NewPoolTString(""), (yyvsp[-1].interm.fieldList)); >- } >+ { context->enterStructDeclaration((yylsp[-1]), ImmutableString((yyvsp[-1].lex).string)); } > > break; > > case 231: > > { >- (yyval.interm.fieldList) = context->addStructFieldList((yyvsp[0].interm.fieldList), (yylsp[0])); >+ (yyval.interm.typeSpecifierNonArray) = context->addStructure((yylsp[-5]), (yylsp[-4]), ImmutableString((yyvsp[-4].lex).string), (yyvsp[-1].interm.fieldList)); > } > > break; > > case 232: > >- { >- (yyval.interm.fieldList) = context->combineStructFieldLists((yyvsp[-1].interm.fieldList), (yyvsp[0].interm.fieldList), (yylsp[0])); >- } >+ { context->enterStructDeclaration((yylsp[0]), kEmptyImmutableString); } > > break; > > case 233: > > { >- (yyval.interm.fieldList) = context->addStructDeclaratorList((yyvsp[-2].interm.type), (yyvsp[-1].interm.fieldList)); >+ (yyval.interm.typeSpecifierNonArray) = context->addStructure((yylsp[-4]), (yyloc), kEmptyImmutableString, (yyvsp[-1].interm.fieldList)); > } > > break; >@@ -4445,8 +4451,7 @@ yyreduce: > case 234: > > { >- // ES3 Only, but errors should be handled elsewhere >- (yyval.interm.fieldList) = context->addStructDeclaratorListWithQualifiers(*(yyvsp[-3].interm.typeQualifierBuilder), &(yyvsp[-2].interm.type), (yyvsp[-1].interm.fieldList)); >+ (yyval.interm.fieldList) = context->addStructFieldList((yyvsp[0].interm.fieldList), (yylsp[0])); > } > > break; >@@ -4454,8 +4459,7 @@ yyreduce: > case 235: > > { >- (yyval.interm.fieldList) = NewPoolTFieldList(); >- (yyval.interm.fieldList)->push_back((yyvsp[0].interm.field)); >+ (yyval.interm.fieldList) = context->combineStructFieldLists((yyvsp[-1].interm.fieldList), (yyvsp[0].interm.fieldList), (yylsp[0])); > } > > break; >@@ -4463,7 +4467,7 @@ yyreduce: > case 236: > > { >- (yyval.interm.fieldList)->push_back((yyvsp[0].interm.field)); >+ (yyval.interm.fieldList) = context->addStructDeclaratorList((yyvsp[-2].interm.type), (yyvsp[-1].interm.declaratorList)); > } > > break; >@@ -4471,7 +4475,8 @@ yyreduce: > case 237: > > { >- (yyval.interm.field) = context->parseStructDeclarator((yyvsp[0].lex).string, (yylsp[0])); >+ // ES3 Only, but errors should be handled elsewhere >+ (yyval.interm.fieldList) = context->addStructDeclaratorListWithQualifiers(*(yyvsp[-3].interm.typeQualifierBuilder), &(yyvsp[-2].interm.type), (yyvsp[-1].interm.declaratorList)); > } > > break; >@@ -4479,32 +4484,39 @@ yyreduce: > case 238: > > { >- (yyval.interm.field) = context->parseStructArrayDeclarator((yyvsp[-1].lex).string, (yylsp[-1]), *((yyvsp[0].interm.arraySizes)), (yylsp[0])); >+ (yyval.interm.declaratorList) = new TDeclaratorList(); >+ (yyval.interm.declaratorList)->push_back((yyvsp[0].interm.declarator)); > } > > break; > > case 239: > >- { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } >+ { >+ (yyval.interm.declaratorList)->push_back((yyvsp[0].interm.declarator)); >+ } > > break; > > case 240: > >- { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } >+ { >+ (yyval.interm.declarator) = context->parseStructDeclarator(ImmutableString((yyvsp[0].lex).string), (yylsp[0])); >+ } > > break; > > case 241: > >- { (yyval.interm.intermNode) = (yyvsp[0].interm.intermBlock); } >+ { >+ (yyval.interm.declarator) = context->parseStructArrayDeclarator(ImmutableString((yyvsp[-1].lex).string), (yylsp[-1]), (yyvsp[0].interm.arraySizes)); >+ } > > break; > > case 242: > >- { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } >+ { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } > > break; > >@@ -4516,7 +4528,7 @@ yyreduce: > > case 244: > >- { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } >+ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermBlock); } > > break; > >@@ -4528,13 +4540,13 @@ yyreduce: > > case 246: > >- { (yyval.interm.intermNode) = (yyvsp[0].interm.intermSwitch); } >+ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } > > break; > > case 247: > >- { (yyval.interm.intermNode) = (yyvsp[0].interm.intermCase); } >+ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } > > break; > >@@ -4546,12 +4558,30 @@ yyreduce: > > case 249: > >- { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } >+ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermSwitch); } > > break; > > case 250: > >+ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermCase); } >+ >+ break; >+ >+ case 251: >+ >+ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } >+ >+ break; >+ >+ case 252: >+ >+ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } >+ >+ break; >+ >+ case 253: >+ > { > (yyval.interm.intermBlock) = new TIntermBlock(); > (yyval.interm.intermBlock)->setLine((yyloc)); >@@ -4559,19 +4589,19 @@ yyreduce: > > break; > >- case 251: >+ case 254: > > { context->symbolTable.push(); } > > break; > >- case 252: >+ case 255: > > { context->symbolTable.pop(); } > > break; > >- case 253: >+ case 256: > > { > (yyvsp[-2].interm.intermBlock)->setLine((yyloc)); >@@ -4580,43 +4610,43 @@ yyreduce: > > break; > >- case 254: >+ case 257: > > { (yyval.interm.intermNode) = (yyvsp[0].interm.intermBlock); } > > break; > >- case 255: >+ case 258: > > { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } > > break; > >- case 256: >+ case 259: > > { context->symbolTable.push(); } > > break; > >- case 257: >+ case 260: > > { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermBlock); } > > break; > >- case 258: >+ case 261: > > { context->symbolTable.push(); } > > break; > >- case 259: >+ case 262: > > { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } > > break; > >- case 260: >+ case 263: > > { > (yyval.interm.intermBlock) = new TIntermBlock(); >@@ -4625,7 +4655,7 @@ yyreduce: > > break; > >- case 261: >+ case 264: > > { > (yyvsp[-1].interm.intermBlock)->setLine((yyloc)); >@@ -4634,37 +4664,37 @@ yyreduce: > > break; > >- case 262: >+ case 265: > > { > (yyval.interm.intermBlock) = new TIntermBlock(); >- (yyval.interm.intermBlock)->appendStatement((yyvsp[0].interm.intermNode)); >+ context->appendStatement((yyval.interm.intermBlock), (yyvsp[0].interm.intermNode)); > } > > break; > >- case 263: >+ case 266: > > { > (yyval.interm.intermBlock) = (yyvsp[-1].interm.intermBlock); >- (yyval.interm.intermBlock)->appendStatement((yyvsp[0].interm.intermNode)); >+ context->appendStatement((yyval.interm.intermBlock), (yyvsp[0].interm.intermNode)); > } > > break; > >- case 264: >+ case 267: > > { (yyval.interm.intermNode) = context->addEmptyStatement((yyloc)); } > > break; > >- case 265: >+ case 268: > > { (yyval.interm.intermNode) = (yyvsp[-1].interm.intermTypedNode); } > > break; > >- case 266: >+ case 269: > > { > (yyval.interm.intermNode) = context->addIfElse((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.nodePair), (yylsp[-4])); >@@ -4672,7 +4702,7 @@ yyreduce: > > break; > >- case 267: >+ case 270: > > { > (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode); >@@ -4681,7 +4711,7 @@ yyreduce: > > break; > >- case 268: >+ case 271: > > { > (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode); >@@ -4690,13 +4720,13 @@ yyreduce: > > break; > >- case 269: >+ case 272: > > { context->incrSwitchNestingLevel(); } > > break; > >- case 270: >+ case 273: > > { > (yyval.interm.intermSwitch) = context->addSwitch((yyvsp[-3].interm.intermTypedNode), (yyvsp[0].interm.intermBlock), (yylsp[-5])); >@@ -4705,7 +4735,7 @@ yyreduce: > > break; > >- case 271: >+ case 274: > > { > (yyval.interm.intermCase) = context->addCase((yyvsp[-1].interm.intermTypedNode), (yylsp[-2])); >@@ -4713,7 +4743,7 @@ yyreduce: > > break; > >- case 272: >+ case 275: > > { > (yyval.interm.intermCase) = context->addDefault((yylsp[-1])); >@@ -4721,7 +4751,7 @@ yyreduce: > > break; > >- case 273: >+ case 276: > > { > (yyval.interm.intermNode) = (yyvsp[0].interm.intermTypedNode); >@@ -4730,21 +4760,21 @@ yyreduce: > > break; > >- case 274: >+ case 277: > > { >- (yyval.interm.intermNode) = context->addConditionInitializer((yyvsp[-3].interm.type), *(yyvsp[-2].lex).string, (yyvsp[0].interm.intermTypedNode), (yylsp[-2])); >+ (yyval.interm.intermNode) = context->addConditionInitializer((yyvsp[-3].interm.type), ImmutableString((yyvsp[-2].lex).string), (yyvsp[0].interm.intermTypedNode), (yylsp[-2])); > } > > break; > >- case 275: >+ case 278: > > { context->symbolTable.push(); context->incrLoopNestingLevel(); } > > break; > >- case 276: >+ case 279: > > { > context->symbolTable.pop(); >@@ -4754,13 +4784,13 @@ yyreduce: > > break; > >- case 277: >+ case 280: > > { context->incrLoopNestingLevel(); } > > break; > >- case 278: >+ case 281: > > { > (yyval.interm.intermNode) = context->addLoop(ELoopDoWhile, 0, (yyvsp[-2].interm.intermTypedNode), 0, (yyvsp[-5].interm.intermNode), (yylsp[-4])); >@@ -4769,13 +4799,13 @@ yyreduce: > > break; > >- case 279: >+ case 282: > > { context->symbolTable.push(); context->incrLoopNestingLevel(); } > > break; > >- case 280: >+ case 283: > > { > context->symbolTable.pop(); >@@ -4785,7 +4815,7 @@ yyreduce: > > break; > >- case 281: >+ case 284: > > { > (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); >@@ -4793,7 +4823,7 @@ yyreduce: > > break; > >- case 282: >+ case 285: > > { > (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); >@@ -4801,7 +4831,7 @@ yyreduce: > > break; > >- case 283: >+ case 286: > > { > (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); >@@ -4809,7 +4839,7 @@ yyreduce: > > break; > >- case 284: >+ case 287: > > { > (yyval.interm.intermNode) = nullptr; >@@ -4817,7 +4847,7 @@ yyreduce: > > break; > >- case 285: >+ case 288: > > { > (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermNode); >@@ -4826,7 +4856,7 @@ yyreduce: > > break; > >- case 286: >+ case 289: > > { > (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode); >@@ -4835,7 +4865,7 @@ yyreduce: > > break; > >- case 287: >+ case 290: > > { > (yyval.interm.intermNode) = context->addBranch(EOpContinue, (yylsp[-1])); >@@ -4843,7 +4873,7 @@ yyreduce: > > break; > >- case 288: >+ case 291: > > { > (yyval.interm.intermNode) = context->addBranch(EOpBreak, (yylsp[-1])); >@@ -4851,7 +4881,7 @@ yyreduce: > > break; > >- case 289: >+ case 292: > > { > (yyval.interm.intermNode) = context->addBranch(EOpReturn, (yylsp[-1])); >@@ -4859,7 +4889,7 @@ yyreduce: > > break; > >- case 290: >+ case 293: > > { > (yyval.interm.intermNode) = context->addBranch(EOpReturn, (yyvsp[-1].interm.intermTypedNode), (yylsp[-2])); >@@ -4867,7 +4897,7 @@ yyreduce: > > break; > >- case 291: >+ case 294: > > { > (yyval.interm.intermNode) = context->addBranch(EOpKill, (yylsp[-1])); >@@ -4875,7 +4905,7 @@ yyreduce: > > break; > >- case 292: >+ case 295: > > { > (yyval.interm.intermBlock) = new TIntermBlock(); >@@ -4886,7 +4916,7 @@ yyreduce: > > break; > >- case 293: >+ case 296: > > { > (yyval.interm.intermBlock)->appendStatement((yyvsp[0].interm.intermNode)); >@@ -4894,7 +4924,7 @@ yyreduce: > > break; > >- case 294: >+ case 297: > > { > (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); >@@ -4902,7 +4932,7 @@ yyreduce: > > break; > >- case 295: >+ case 298: > > { > (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); >@@ -4910,15 +4940,15 @@ yyreduce: > > break; > >- case 296: >+ case 299: > > { >- context->parseFunctionDefinitionHeader((yylsp[0]), &((yyvsp[0].interm).function), &((yyvsp[0].interm).intermFunctionPrototype)); >+ context->parseFunctionDefinitionHeader((yylsp[0]), (yyvsp[0].interm).function, &((yyvsp[0].interm).intermFunctionPrototype)); > } > > break; > >- case 297: >+ case 300: > > { > (yyval.interm.intermNode) = context->addFunctionDefinition((yyvsp[-2].interm).intermFunctionPrototype, (yyvsp[0].interm.intermBlock), (yylsp[-2])); >@@ -5168,3 +5198,4 @@ yyreturn: > int glslang_parse(TParseContext* context) { > return yyparse(context, context->getScanner()); > } >+ >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.h b/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.h >index cb43a46dfb5..e05076fcb5e 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.h >@@ -1,7 +1,5 @@ > /* A Bison parser, made by GNU Bison 3.0.4. */ > >-/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */ >- > /* Bison interface for Yacc-like parsers in C > > Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. >@@ -33,25 +31,22 @@ > version 2.2 of Bison. */ > > #ifndef YY_YY_GLSLANG_TAB_H_INCLUDED >-# define YY_YY_GLSLANG_TAB_H_INCLUDED >+#define YY_YY_GLSLANG_TAB_H_INCLUDED > /* Debug traces. */ > #ifndef YYDEBUG >-# define YYDEBUG 0 >+# define YYDEBUG 0 > #endif > #if YYDEBUG > extern int yydebug; > #endif > /* "%code requires" blocks. */ > >- > #define YYLTYPE TSourceLoc > #define YYLTYPE_IS_DECLARED 1 > >- >- > /* Token type. */ > #ifndef YYTOKENTYPE >-# define YYTOKENTYPE >+# define YYTOKENTYPE > enum yytokentype > { > INVARIANT = 258, >@@ -131,106 +126,111 @@ enum yytokentype > SAMPLER2DMS = 332, > ISAMPLER2DMS = 333, > USAMPLER2DMS = 334, >- SAMPLER3D = 335, >- SAMPLER3DRECT = 336, >- SAMPLER2DSHADOW = 337, >- SAMPLERCUBESHADOW = 338, >- SAMPLER2DARRAYSHADOW = 339, >- SAMPLEREXTERNAL2DY2YEXT = 340, >- IMAGE2D = 341, >- IIMAGE2D = 342, >- UIMAGE2D = 343, >- IMAGE3D = 344, >- IIMAGE3D = 345, >- UIMAGE3D = 346, >- IMAGE2DARRAY = 347, >- IIMAGE2DARRAY = 348, >- UIMAGE2DARRAY = 349, >- IMAGECUBE = 350, >- IIMAGECUBE = 351, >- UIMAGECUBE = 352, >- ATOMICUINT = 353, >- LAYOUT = 354, >- YUVCSCSTANDARDEXT = 355, >- YUVCSCSTANDARDEXTCONSTANT = 356, >- IDENTIFIER = 357, >- TYPE_NAME = 358, >- FLOATCONSTANT = 359, >- INTCONSTANT = 360, >- UINTCONSTANT = 361, >- BOOLCONSTANT = 362, >- FIELD_SELECTION = 363, >- LEFT_OP = 364, >- RIGHT_OP = 365, >- INC_OP = 366, >- DEC_OP = 367, >- LE_OP = 368, >- GE_OP = 369, >- EQ_OP = 370, >- NE_OP = 371, >- AND_OP = 372, >- OR_OP = 373, >- XOR_OP = 374, >- MUL_ASSIGN = 375, >- DIV_ASSIGN = 376, >- ADD_ASSIGN = 377, >- MOD_ASSIGN = 378, >- LEFT_ASSIGN = 379, >- RIGHT_ASSIGN = 380, >- AND_ASSIGN = 381, >- XOR_ASSIGN = 382, >- OR_ASSIGN = 383, >- SUB_ASSIGN = 384, >- LEFT_PAREN = 385, >- RIGHT_PAREN = 386, >- LEFT_BRACKET = 387, >- RIGHT_BRACKET = 388, >- LEFT_BRACE = 389, >- RIGHT_BRACE = 390, >- DOT = 391, >- COMMA = 392, >- COLON = 393, >- EQUAL = 394, >- SEMICOLON = 395, >- BANG = 396, >- DASH = 397, >- TILDE = 398, >- PLUS = 399, >- STAR = 400, >- SLASH = 401, >- PERCENT = 402, >- LEFT_ANGLE = 403, >- RIGHT_ANGLE = 404, >- VERTICAL_BAR = 405, >- CARET = 406, >- AMPERSAND = 407, >- QUESTION = 408 >+ SAMPLER2DMSARRAY = 335, >+ ISAMPLER2DMSARRAY = 336, >+ USAMPLER2DMSARRAY = 337, >+ SAMPLER3D = 338, >+ SAMPLER3DRECT = 339, >+ SAMPLER2DSHADOW = 340, >+ SAMPLERCUBESHADOW = 341, >+ SAMPLER2DARRAYSHADOW = 342, >+ SAMPLEREXTERNAL2DY2YEXT = 343, >+ IMAGE2D = 344, >+ IIMAGE2D = 345, >+ UIMAGE2D = 346, >+ IMAGE3D = 347, >+ IIMAGE3D = 348, >+ UIMAGE3D = 349, >+ IMAGE2DARRAY = 350, >+ IIMAGE2DARRAY = 351, >+ UIMAGE2DARRAY = 352, >+ IMAGECUBE = 353, >+ IIMAGECUBE = 354, >+ UIMAGECUBE = 355, >+ ATOMICUINT = 356, >+ LAYOUT = 357, >+ YUVCSCSTANDARDEXT = 358, >+ YUVCSCSTANDARDEXTCONSTANT = 359, >+ IDENTIFIER = 360, >+ TYPE_NAME = 361, >+ FLOATCONSTANT = 362, >+ INTCONSTANT = 363, >+ UINTCONSTANT = 364, >+ BOOLCONSTANT = 365, >+ FIELD_SELECTION = 366, >+ LEFT_OP = 367, >+ RIGHT_OP = 368, >+ INC_OP = 369, >+ DEC_OP = 370, >+ LE_OP = 371, >+ GE_OP = 372, >+ EQ_OP = 373, >+ NE_OP = 374, >+ AND_OP = 375, >+ OR_OP = 376, >+ XOR_OP = 377, >+ MUL_ASSIGN = 378, >+ DIV_ASSIGN = 379, >+ ADD_ASSIGN = 380, >+ MOD_ASSIGN = 381, >+ LEFT_ASSIGN = 382, >+ RIGHT_ASSIGN = 383, >+ AND_ASSIGN = 384, >+ XOR_ASSIGN = 385, >+ OR_ASSIGN = 386, >+ SUB_ASSIGN = 387, >+ LEFT_PAREN = 388, >+ RIGHT_PAREN = 389, >+ LEFT_BRACKET = 390, >+ RIGHT_BRACKET = 391, >+ LEFT_BRACE = 392, >+ RIGHT_BRACE = 393, >+ DOT = 394, >+ COMMA = 395, >+ COLON = 396, >+ EQUAL = 397, >+ SEMICOLON = 398, >+ BANG = 399, >+ DASH = 400, >+ TILDE = 401, >+ PLUS = 402, >+ STAR = 403, >+ SLASH = 404, >+ PERCENT = 405, >+ LEFT_ANGLE = 406, >+ RIGHT_ANGLE = 407, >+ VERTICAL_BAR = 408, >+ CARET = 409, >+ AMPERSAND = 410, >+ QUESTION = 411 > }; > #endif > > /* Value type. */ >-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED >+#if !defined YYSTYPE && !defined YYSTYPE_IS_DECLARED > > union YYSTYPE > { > >- >- struct { >- union { >- TString *string; >+ struct >+ { >+ union >+ { >+ const char *string; // pool allocated. > float f; > int i; > unsigned int u; > bool b; > }; >- TSymbol* symbol; >+ const TSymbol *symbol; > } lex; >- struct { >+ struct >+ { > TOperator op; >- union { >+ union >+ { > TIntermNode *intermNode; > TIntermNodePair nodePair; >- TIntermFunctionCallOrMethod callOrMethodPair; > TIntermTyped *intermTypedNode; > TIntermAggregate *intermAggregate; > TIntermBlock *intermBlock; >@@ -239,7 +239,8 @@ union YYSTYPE > TIntermSwitch *intermSwitch; > TIntermCase *intermCase; > }; >- union { >+ union >+ { > TVector<unsigned int> *arraySizes; > TTypeSpecifierNonArray typeSpecifierNonArray; > TPublicType type; >@@ -247,38 +248,36 @@ union YYSTYPE > TLayoutQualifier layoutQualifier; > TQualifier qualifier; > TFunction *function; >+ TFunctionLookup *functionLookup; > TParameter param; >- TField *field; >+ TDeclarator *declarator; >+ TDeclaratorList *declaratorList; > TFieldList *fieldList; > TQualifierWrapperBase *qualifierWrapper; > TTypeQualifierBuilder *typeQualifierBuilder; > }; > } interm; >- >- > }; > > typedef union YYSTYPE YYSTYPE; >-# define YYSTYPE_IS_TRIVIAL 1 >-# define YYSTYPE_IS_DECLARED 1 >+# define YYSTYPE_IS_TRIVIAL 1 >+# define YYSTYPE_IS_DECLARED 1 > #endif > > /* Location type. */ >-#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED >+#if !defined YYLTYPE && !defined YYLTYPE_IS_DECLARED > typedef struct YYLTYPE YYLTYPE; > struct YYLTYPE > { >- int first_line; >- int first_column; >- int last_line; >- int last_column; >+ int first_line; >+ int first_column; >+ int last_line; >+ int last_column; > }; >-# define YYLTYPE_IS_DECLARED 1 >-# define YYLTYPE_IS_TRIVIAL 1 >+# define YYLTYPE_IS_DECLARED 1 >+# define YYLTYPE_IS_TRIVIAL 1 > #endif > >- >- >-int yyparse (TParseContext* context, void *scanner); >+int yyparse(TParseContext *context, void *scanner); > > #endif /* !YY_YY_GLSLANG_TAB_H_INCLUDED */ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/AddAndTrueToLoopCondition.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/AddAndTrueToLoopCondition.cpp >new file mode 100644 >index 00000000000..25a52983a30 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/AddAndTrueToLoopCondition.cpp >@@ -0,0 +1,58 @@ >+// >+// Copyright (c) 2016 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. >+// >+ >+#include "compiler/translator/tree_ops/AddAndTrueToLoopCondition.h" >+ >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+// An AST traverser that rewrites for and while loops by replacing "condition" with >+// "condition && true" to work around condition bug on Intel Mac. >+class AddAndTrueToLoopConditionTraverser : public TIntermTraverser >+{ >+ public: >+ AddAndTrueToLoopConditionTraverser() : TIntermTraverser(true, false, false) {} >+ >+ bool visitLoop(Visit, TIntermLoop *loop) override >+ { >+ // do-while loop doesn't have this bug. >+ if (loop->getType() != ELoopFor && loop->getType() != ELoopWhile) >+ { >+ return true; >+ } >+ >+ // For loop may not have a condition. >+ if (loop->getCondition() == nullptr) >+ { >+ return true; >+ } >+ >+ // Constant true. >+ TIntermTyped *trueValue = CreateBoolNode(true); >+ >+ // CONDITION && true. >+ TIntermBinary *andOp = new TIntermBinary(EOpLogicalAnd, loop->getCondition(), trueValue); >+ loop->setCondition(andOp); >+ >+ return true; >+ } >+}; >+ >+} // anonymous namespace >+ >+void AddAndTrueToLoopCondition(TIntermNode *root) >+{ >+ AddAndTrueToLoopConditionTraverser traverser; >+ root->traverse(&traverser); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/AddAndTrueToLoopCondition.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/AddAndTrueToLoopCondition.h >new file mode 100644 >index 00000000000..3a9efc2133e >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/AddAndTrueToLoopCondition.h >@@ -0,0 +1,20 @@ >+// >+// Copyright (c) 2016 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. >+// >+ >+// Rewrite condition in for and while loops to work around driver bug on Intel Mac. >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_ADDANDTRUETOLOOPCONDITION_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_ADDANDTRUETOLOOPCONDITION_H_ >+ >+class TIntermNode; >+namespace sh >+{ >+ >+void AddAndTrueToLoopCondition(TIntermNode *root); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_ADDANDTRUETOLOOPCONDITION_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/AddDefaultReturnStatements.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/AddDefaultReturnStatements.cpp >new file mode 100644 >index 00000000000..636ce375067 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/AddDefaultReturnStatements.cpp >@@ -0,0 +1,58 @@ >+// >+// Copyright (c) 2016 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. >+// >+// AddDefaultReturnStatements.cpp: Add default return statements to functions that do not end in a >+// return. >+// >+ >+#include "compiler/translator/tree_ops/AddDefaultReturnStatements.h" >+ >+#include "compiler/translator/IntermNode.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/util.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+bool NeedsReturnStatement(TIntermFunctionDefinition *node, TType *returnType) >+{ >+ *returnType = node->getFunctionPrototype()->getType(); >+ if (returnType->getBasicType() == EbtVoid) >+ { >+ return false; >+ } >+ >+ TIntermBlock *bodyNode = node->getBody(); >+ TIntermBranch *returnNode = bodyNode->getSequence()->back()->getAsBranchNode(); >+ if (returnNode != nullptr && returnNode->getFlowOp() == EOpReturn) >+ { >+ return false; >+ } >+ >+ return true; >+} >+ >+} // anonymous namespace >+ >+void AddDefaultReturnStatements(TIntermBlock *root) >+{ >+ TType returnType; >+ for (TIntermNode *node : *root->getSequence()) >+ { >+ TIntermFunctionDefinition *definition = node->getAsFunctionDefinition(); >+ if (definition != nullptr && NeedsReturnStatement(definition, &returnType)) >+ { >+ TIntermBranch *branch = new TIntermBranch(EOpReturn, CreateZeroNode(returnType)); >+ >+ TIntermBlock *bodyNode = definition->getBody(); >+ bodyNode->getSequence()->push_back(branch); >+ } >+ } >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/AddDefaultReturnStatements.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/AddDefaultReturnStatements.h >new file mode 100644 >index 00000000000..6d537978f55 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/AddDefaultReturnStatements.h >@@ -0,0 +1,22 @@ >+// >+// Copyright (c) 2016 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. >+// >+// AddDefaultReturnStatements.h: Add default return statements to functions that do not end in a >+// return. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_ADDDEFAULTRETURNSTATEMENTS_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_ADDDEFAULTRETURNSTATEMENTS_H_ >+ >+class TIntermBlock; >+ >+namespace sh >+{ >+ >+void AddDefaultReturnStatements(TIntermBlock *root); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_ADDDEFAULTRETURNSTATEMENTS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.cpp >new file mode 100644 >index 00000000000..824908b0e6f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.cpp >@@ -0,0 +1,228 @@ >+// >+// Copyright (c) 2002-2015 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. >+// >+// The ArrayReturnValueToOutParameter function changes return values of an array type to out >+// parameters in function definitions, prototypes, and call sites. >+ >+#include "compiler/translator/tree_ops/ArrayReturnValueToOutParameter.h" >+ >+#include <map> >+ >+#include "compiler/translator/StaticType.h" >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+constexpr const ImmutableString kReturnValueVariableName("angle_return"); >+ >+class ArrayReturnValueToOutParameterTraverser : private TIntermTraverser >+{ >+ public: >+ static void apply(TIntermNode *root, TSymbolTable *symbolTable); >+ >+ private: >+ ArrayReturnValueToOutParameterTraverser(TSymbolTable *symbolTable); >+ >+ void visitFunctionPrototype(TIntermFunctionPrototype *node) override; >+ bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override; >+ bool visitAggregate(Visit visit, TIntermAggregate *node) override; >+ bool visitBranch(Visit visit, TIntermBranch *node) override; >+ bool visitBinary(Visit visit, TIntermBinary *node) override; >+ >+ TIntermAggregate *createReplacementCall(TIntermAggregate *originalCall, >+ TIntermTyped *returnValueTarget); >+ >+ // Set when traversal is inside a function with array return value. >+ TIntermFunctionDefinition *mFunctionWithArrayReturnValue; >+ >+ struct ChangedFunction >+ { >+ const TVariable *returnValueVariable; >+ const TFunction *func; >+ }; >+ >+ // Map from function symbol ids to the changed function. >+ std::map<int, ChangedFunction> mChangedFunctions; >+}; >+ >+TIntermAggregate *ArrayReturnValueToOutParameterTraverser::createReplacementCall( >+ TIntermAggregate *originalCall, >+ TIntermTyped *returnValueTarget) >+{ >+ TIntermSequence *replacementArguments = new TIntermSequence(); >+ TIntermSequence *originalArguments = originalCall->getSequence(); >+ for (auto &arg : *originalArguments) >+ { >+ replacementArguments->push_back(arg); >+ } >+ replacementArguments->push_back(returnValueTarget); >+ ASSERT(originalCall->getFunction()); >+ const TSymbolUniqueId &originalId = originalCall->getFunction()->uniqueId(); >+ TIntermAggregate *replacementCall = TIntermAggregate::CreateFunctionCall( >+ *mChangedFunctions[originalId.get()].func, replacementArguments); >+ replacementCall->setLine(originalCall->getLine()); >+ return replacementCall; >+} >+ >+void ArrayReturnValueToOutParameterTraverser::apply(TIntermNode *root, TSymbolTable *symbolTable) >+{ >+ ArrayReturnValueToOutParameterTraverser arrayReturnValueToOutParam(symbolTable); >+ root->traverse(&arrayReturnValueToOutParam); >+ arrayReturnValueToOutParam.updateTree(); >+} >+ >+ArrayReturnValueToOutParameterTraverser::ArrayReturnValueToOutParameterTraverser( >+ TSymbolTable *symbolTable) >+ : TIntermTraverser(true, false, true, symbolTable), mFunctionWithArrayReturnValue(nullptr) >+{} >+ >+bool ArrayReturnValueToOutParameterTraverser::visitFunctionDefinition( >+ Visit visit, >+ TIntermFunctionDefinition *node) >+{ >+ if (node->getFunctionPrototype()->isArray() && visit == PreVisit) >+ { >+ // Replacing the function header is done on visitFunctionPrototype(). >+ mFunctionWithArrayReturnValue = node; >+ } >+ if (visit == PostVisit) >+ { >+ mFunctionWithArrayReturnValue = nullptr; >+ } >+ return true; >+} >+ >+void ArrayReturnValueToOutParameterTraverser::visitFunctionPrototype(TIntermFunctionPrototype *node) >+{ >+ if (node->isArray()) >+ { >+ // Replace the whole prototype node with another node that has the out parameter >+ // added. Also set the function to return void. >+ const TSymbolUniqueId &functionId = node->getFunction()->uniqueId(); >+ if (mChangedFunctions.find(functionId.get()) == mChangedFunctions.end()) >+ { >+ TType *returnValueVariableType = new TType(node->getType()); >+ returnValueVariableType->setQualifier(EvqOut); >+ ChangedFunction changedFunction; >+ changedFunction.returnValueVariable = >+ new TVariable(mSymbolTable, kReturnValueVariableName, returnValueVariableType, >+ SymbolType::AngleInternal); >+ TFunction *func = new TFunction(mSymbolTable, node->getFunction()->name(), >+ node->getFunction()->symbolType(), >+ StaticType::GetBasic<EbtVoid>(), false); >+ for (size_t i = 0; i < node->getFunction()->getParamCount(); ++i) >+ { >+ func->addParameter(node->getFunction()->getParam(i)); >+ } >+ func->addParameter(changedFunction.returnValueVariable); >+ changedFunction.func = func; >+ mChangedFunctions[functionId.get()] = changedFunction; >+ } >+ TIntermFunctionPrototype *replacement = >+ new TIntermFunctionPrototype(mChangedFunctions[functionId.get()].func); >+ replacement->setLine(node->getLine()); >+ >+ queueReplacement(replacement, OriginalNode::IS_DROPPED); >+ } >+} >+ >+bool ArrayReturnValueToOutParameterTraverser::visitAggregate(Visit visit, TIntermAggregate *node) >+{ >+ ASSERT(!node->isArray() || node->getOp() != EOpCallInternalRawFunction); >+ if (visit == PreVisit && node->isArray() && node->getOp() == EOpCallFunctionInAST) >+ { >+ // Handle call sites where the returned array is not assigned. >+ // Examples where f() is a function returning an array: >+ // 1. f(); >+ // 2. another_array == f(); >+ // 3. another_function(f()); >+ // 4. return f(); >+ // Cases 2 to 4 are already converted to simpler cases by >+ // SeparateExpressionsReturningArrays, so we only need to worry about the case where a >+ // function call returning an array forms an expression by itself. >+ TIntermBlock *parentBlock = getParentNode()->getAsBlock(); >+ if (parentBlock) >+ { >+ // replace >+ // f(); >+ // with >+ // type s0[size]; f(s0); >+ TIntermSequence replacements; >+ >+ // type s0[size]; >+ TIntermDeclaration *returnValueDeclaration = nullptr; >+ TVariable *returnValue = DeclareTempVariable(mSymbolTable, new TType(node->getType()), >+ EvqTemporary, &returnValueDeclaration); >+ replacements.push_back(returnValueDeclaration); >+ >+ // f(s0); >+ TIntermSymbol *returnValueSymbol = CreateTempSymbolNode(returnValue); >+ replacements.push_back(createReplacementCall(node, returnValueSymbol)); >+ mMultiReplacements.push_back( >+ NodeReplaceWithMultipleEntry(parentBlock, node, replacements)); >+ } >+ return false; >+ } >+ return true; >+} >+ >+bool ArrayReturnValueToOutParameterTraverser::visitBranch(Visit visit, TIntermBranch *node) >+{ >+ if (mFunctionWithArrayReturnValue && node->getFlowOp() == EOpReturn) >+ { >+ // Instead of returning a value, assign to the out parameter and then return. >+ TIntermSequence replacements; >+ >+ TIntermTyped *expression = node->getExpression(); >+ ASSERT(expression != nullptr); >+ const TSymbolUniqueId &functionId = >+ mFunctionWithArrayReturnValue->getFunction()->uniqueId(); >+ ASSERT(mChangedFunctions.find(functionId.get()) != mChangedFunctions.end()); >+ TIntermSymbol *returnValueSymbol = >+ new TIntermSymbol(mChangedFunctions[functionId.get()].returnValueVariable); >+ TIntermBinary *replacementAssignment = >+ new TIntermBinary(EOpAssign, returnValueSymbol, expression); >+ replacementAssignment->setLine(expression->getLine()); >+ replacements.push_back(replacementAssignment); >+ >+ TIntermBranch *replacementBranch = new TIntermBranch(EOpReturn, nullptr); >+ replacementBranch->setLine(node->getLine()); >+ replacements.push_back(replacementBranch); >+ >+ mMultiReplacements.push_back( >+ NodeReplaceWithMultipleEntry(getParentNode()->getAsBlock(), node, replacements)); >+ } >+ return false; >+} >+ >+bool ArrayReturnValueToOutParameterTraverser::visitBinary(Visit visit, TIntermBinary *node) >+{ >+ if (node->getOp() == EOpAssign && node->getLeft()->isArray()) >+ { >+ TIntermAggregate *rightAgg = node->getRight()->getAsAggregate(); >+ ASSERT(rightAgg == nullptr || rightAgg->getOp() != EOpCallInternalRawFunction); >+ if (rightAgg != nullptr && rightAgg->getOp() == EOpCallFunctionInAST) >+ { >+ TIntermAggregate *replacementCall = createReplacementCall(rightAgg, node->getLeft()); >+ queueReplacement(replacementCall, OriginalNode::IS_DROPPED); >+ } >+ } >+ return false; >+} >+ >+} // namespace >+ >+void ArrayReturnValueToOutParameter(TIntermNode *root, TSymbolTable *symbolTable) >+{ >+ ArrayReturnValueToOutParameterTraverser::apply(root, symbolTable); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.h >new file mode 100644 >index 00000000000..9ceb02c76a8 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.h >@@ -0,0 +1,22 @@ >+// >+// Copyright (c) 2002-2015 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. >+// >+// The ArrayReturnValueToOutParameter function changes return values of an array type to out >+// parameters in function definitions, prototypes and call sites. >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_ARRAYRETURNVALUETOOUTPARAMETER_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_ARRAYRETURNVALUETOOUTPARAMETER_H_ >+ >+namespace sh >+{ >+ >+class TIntermNode; >+class TSymbolTable; >+ >+void ArrayReturnValueToOutParameter(TIntermNode *root, TSymbolTable *symbolTable); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_ARRAYRETURNVALUETOOUTPARAMETER_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/BreakVariableAliasingInInnerLoops.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/BreakVariableAliasingInInnerLoops.cpp >new file mode 100644 >index 00000000000..19f53a73834 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/BreakVariableAliasingInInnerLoops.cpp >@@ -0,0 +1,107 @@ >+// >+// Copyright (c) 2016 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. >+// >+ >+// BreakVariableAliasingInInnerLoops.h: To optimize simple assignments, the HLSL compiler frontend >+// may record a variable as aliasing another. Sometimes the alias information gets garbled >+// so we work around this issue by breaking the aliasing chain in inner loops. >+ >+#include "BreakVariableAliasingInInnerLoops.h" >+ >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+// A HLSL compiler developer gave us more details on the root cause and the workaround needed: >+// The root problem is that if the HLSL compiler is applying aliasing information even on >+// incomplete simulations (in this case, a single pass). The bug is triggered by an assignment >+// that comes from a series of assignments, possibly with swizzled or ternary operators with >+// known conditionals, where the source is before the loop. >+// So, a workaround is to add a +0 term to variables the first time they are assigned to in >+// an inner loop (if they are declared in an outside scope, otherwise there is no need). >+// This will break the aliasing chain. >+ >+// For simplicity here we add a +0 to any assignment that is in at least two nested loops. Because >+// the bug only shows up with swizzles, and ternary assignment, whole array or whole structure >+// assignment don't need a workaround. >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+class AliasingBreaker : public TIntermTraverser >+{ >+ public: >+ AliasingBreaker() : TIntermTraverser(true, false, true) {} >+ >+ protected: >+ bool visitBinary(Visit visit, TIntermBinary *binary) >+ { >+ if (visit != PreVisit) >+ { >+ return false; >+ } >+ >+ if (mLoopLevel < 2 || !binary->isAssignment()) >+ { >+ return true; >+ } >+ >+ TIntermTyped *B = binary->getRight(); >+ TType type = B->getType(); >+ >+ if (!type.isScalar() && !type.isVector() && !type.isMatrix()) >+ { >+ return true; >+ } >+ >+ if (type.isArray() || IsSampler(type.getBasicType())) >+ { >+ return true; >+ } >+ >+ // We have a scalar / vector / matrix assignment with loop depth 2. >+ // Transform it from >+ // A = B >+ // to >+ // A = (B + typeof<B>(0)); >+ >+ TIntermBinary *bPlusZero = new TIntermBinary(EOpAdd, B, CreateZeroNode(type)); >+ bPlusZero->setLine(B->getLine()); >+ >+ binary->replaceChildNode(B, bPlusZero); >+ >+ return true; >+ } >+ >+ bool visitLoop(Visit visit, TIntermLoop *loop) >+ { >+ if (visit == PreVisit) >+ { >+ mLoopLevel++; >+ } >+ else >+ { >+ ASSERT(mLoopLevel > 0); >+ mLoopLevel--; >+ } >+ >+ return true; >+ } >+ >+ private: >+ int mLoopLevel = 0; >+}; >+ >+} // anonymous namespace >+ >+void BreakVariableAliasingInInnerLoops(TIntermNode *root) >+{ >+ AliasingBreaker breaker; >+ root->traverse(&breaker); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/BreakVariableAliasingInInnerLoops.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/BreakVariableAliasingInInnerLoops.h >new file mode 100644 >index 00000000000..cdbdb7aa963 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/BreakVariableAliasingInInnerLoops.h >@@ -0,0 +1,23 @@ >+// >+// Copyright (c) 2016 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. >+// >+ >+// BreakVariableAliasingInInnerLoops.h: To optimize simple assignments, the HLSL compiler frontend >+// may record a variable as aliasing another. Sometimes the alias information gets garbled >+// so we work around this issue by breaking the aliasing chain in inner loops. >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_BREAKVARIABLEALIASINGININNERLOOPS_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_BREAKVARIABLEALIASINGININNERLOOPS_H_ >+ >+class TIntermNode; >+ >+namespace sh >+{ >+ >+void BreakVariableAliasingInInnerLoops(TIntermNode *root); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_BREAKVARIABLEALIASINGININNERLOOPS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ClampFragDepth.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ClampFragDepth.cpp >new file mode 100644 >index 00000000000..d721160a325 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ClampFragDepth.cpp >@@ -0,0 +1,54 @@ >+// >+// Copyright (c) 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. >+// >+// ClampFragDepth.cpp: Limit the value that is written to gl_FragDepth to the range [0.0, 1.0]. >+// The clamping is run at the very end of shader execution, and is only performed if the shader >+// statically accesses gl_FragDepth. >+// >+ >+#include "compiler/translator/tree_ops/ClampFragDepth.h" >+ >+#include "compiler/translator/ImmutableString.h" >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/BuiltIn_autogen.h" >+#include "compiler/translator/tree_util/FindSymbolNode.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/RunAtTheEndOfShader.h" >+ >+namespace sh >+{ >+ >+void ClampFragDepth(TIntermBlock *root, TSymbolTable *symbolTable) >+{ >+ // Only clamp gl_FragDepth if it's used in the shader. >+ if (!FindSymbolNode(root, ImmutableString("gl_FragDepth"))) >+ { >+ return; >+ } >+ >+ TIntermSymbol *fragDepthNode = new TIntermSymbol(BuiltInVariable::gl_FragDepth()); >+ >+ TIntermTyped *minFragDepthNode = CreateZeroNode(TType(EbtFloat, EbpHigh, EvqConst)); >+ >+ TConstantUnion *maxFragDepthConstant = new TConstantUnion(); >+ maxFragDepthConstant->setFConst(1.0); >+ TIntermConstantUnion *maxFragDepthNode = >+ new TIntermConstantUnion(maxFragDepthConstant, TType(EbtFloat, EbpHigh, EvqConst)); >+ >+ // clamp(gl_FragDepth, 0.0, 1.0) >+ TIntermSequence *clampArguments = new TIntermSequence(); >+ clampArguments->push_back(fragDepthNode->deepCopy()); >+ clampArguments->push_back(minFragDepthNode); >+ clampArguments->push_back(maxFragDepthNode); >+ TIntermTyped *clampedFragDepth = >+ CreateBuiltInFunctionCallNode("clamp", clampArguments, *symbolTable, 100); >+ >+ // gl_FragDepth = clamp(gl_FragDepth, 0.0, 1.0) >+ TIntermBinary *assignFragDepth = new TIntermBinary(EOpAssign, fragDepthNode, clampedFragDepth); >+ >+ RunAtTheEndOfShader(root, assignFragDepth, symbolTable); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ClampFragDepth.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ClampFragDepth.h >new file mode 100644 >index 00000000000..70d1f7336ad >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ClampFragDepth.h >@@ -0,0 +1,24 @@ >+// >+// Copyright (c) 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. >+// >+// ClampFragDepth.h: Limit the value that is written to gl_FragDepth to the range [0.0, 1.0]. >+// The clamping is run at the very end of shader execution, and is only performed if the shader >+// statically accesses gl_FragDepth. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_CLAMPFRAGDEPTH_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_CLAMPFRAGDEPTH_H_ >+ >+namespace sh >+{ >+ >+class TIntermBlock; >+class TSymbolTable; >+ >+void ClampFragDepth(TIntermBlock *root, TSymbolTable *symbolTable); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_CLAMPFRAGDEPTH_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ClampPointSize.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ClampPointSize.cpp >new file mode 100644 >index 00000000000..3966aabd831 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ClampPointSize.cpp >@@ -0,0 +1,48 @@ >+// >+// Copyright (c) 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. >+// >+// ClampPointSize.cpp: Limit the value that is written to gl_PointSize. >+// >+ >+#include "compiler/translator/tree_ops/ClampPointSize.h" >+ >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/BuiltIn_autogen.h" >+#include "compiler/translator/tree_util/FindSymbolNode.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/RunAtTheEndOfShader.h" >+ >+namespace sh >+{ >+ >+void ClampPointSize(TIntermBlock *root, float maxPointSize, TSymbolTable *symbolTable) >+{ >+ // Only clamp gl_PointSize if it's used in the shader. >+ if (!FindSymbolNode(root, ImmutableString("gl_PointSize"))) >+ { >+ return; >+ } >+ >+ TIntermSymbol *pointSizeNode = new TIntermSymbol(BuiltInVariable::gl_PointSize()); >+ >+ TConstantUnion *maxPointSizeConstant = new TConstantUnion(); >+ maxPointSizeConstant->setFConst(maxPointSize); >+ TIntermConstantUnion *maxPointSizeNode = >+ new TIntermConstantUnion(maxPointSizeConstant, TType(EbtFloat, EbpHigh, EvqConst)); >+ >+ // min(gl_PointSize, maxPointSize) >+ TIntermSequence *minArguments = new TIntermSequence(); >+ minArguments->push_back(pointSizeNode->deepCopy()); >+ minArguments->push_back(maxPointSizeNode); >+ TIntermTyped *clampedPointSize = >+ CreateBuiltInFunctionCallNode("min", minArguments, *symbolTable, 100); >+ >+ // gl_PointSize = min(gl_PointSize, maxPointSize) >+ TIntermBinary *assignPointSize = new TIntermBinary(EOpAssign, pointSizeNode, clampedPointSize); >+ >+ RunAtTheEndOfShader(root, assignPointSize, symbolTable); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ClampPointSize.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ClampPointSize.h >new file mode 100644 >index 00000000000..5bc7cd4d438 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ClampPointSize.h >@@ -0,0 +1,22 @@ >+// >+// Copyright (c) 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. >+// >+// ClampPointSize.h: Limit the value that is written to gl_PointSize. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_CLAMPPOINTSIZE_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_CLAMPPOINTSIZE_H_ >+ >+namespace sh >+{ >+ >+class TIntermBlock; >+class TSymbolTable; >+ >+void ClampPointSize(TIntermBlock *root, float maxPointSize, TSymbolTable *symbolTable); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_CLAMPPOINTSIZE_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp >new file mode 100644 >index 00000000000..91ffe5966ac >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp >@@ -0,0 +1,186 @@ >+// >+// Copyright (c) 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. >+// >+// Applies the necessary AST transformations to support multiview rendering through instancing. >+// Check the header file For more information. >+// >+ >+#include "compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.h" >+ >+#include "compiler/translator/StaticType.h" >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_ops/InitializeVariables.h" >+#include "compiler/translator/tree_util/BuiltIn_autogen.h" >+#include "compiler/translator/tree_util/FindMain.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+#include "compiler/translator/tree_util/ReplaceVariable.h" >+#include "compiler/translator/util.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+constexpr const ImmutableString kViewIDVariableName("ViewID_OVR"); >+constexpr const ImmutableString kInstanceIDVariableName("InstanceID"); >+constexpr const ImmutableString kMultiviewBaseViewLayerIndexVariableName( >+ "multiviewBaseViewLayerIndex"); >+ >+// Adds the InstanceID and ViewID_OVR initializers to the end of the initializers' sequence. >+void InitializeViewIDAndInstanceID(const TVariable *viewID, >+ const TVariable *instanceID, >+ unsigned numberOfViews, >+ const TSymbolTable &symbolTable, >+ TIntermSequence *initializers) >+{ >+ // Create an unsigned numberOfViews node. >+ TConstantUnion *numberOfViewsUnsignedConstant = new TConstantUnion(); >+ numberOfViewsUnsignedConstant->setUConst(numberOfViews); >+ TIntermConstantUnion *numberOfViewsUint = >+ new TIntermConstantUnion(numberOfViewsUnsignedConstant, TType(EbtUInt, EbpHigh, EvqConst)); >+ >+ // Create a uint(gl_InstanceID) node. >+ TIntermSequence *glInstanceIDSymbolCastArguments = new TIntermSequence(); >+ glInstanceIDSymbolCastArguments->push_back(new TIntermSymbol(BuiltInVariable::gl_InstanceID())); >+ TIntermAggregate *glInstanceIDAsUint = TIntermAggregate::CreateConstructor( >+ TType(EbtUInt, EbpHigh, EvqTemporary), glInstanceIDSymbolCastArguments); >+ >+ // Create a uint(gl_InstanceID) / numberOfViews node. >+ TIntermBinary *normalizedInstanceID = >+ new TIntermBinary(EOpDiv, glInstanceIDAsUint, numberOfViewsUint); >+ >+ // Create an int(uint(gl_InstanceID) / numberOfViews) node. >+ TIntermSequence *normalizedInstanceIDCastArguments = new TIntermSequence(); >+ normalizedInstanceIDCastArguments->push_back(normalizedInstanceID); >+ TIntermAggregate *normalizedInstanceIDAsInt = TIntermAggregate::CreateConstructor( >+ TType(EbtInt, EbpHigh, EvqTemporary), normalizedInstanceIDCastArguments); >+ >+ // Create an InstanceID = int(uint(gl_InstanceID) / numberOfViews) node. >+ TIntermBinary *instanceIDInitializer = >+ new TIntermBinary(EOpAssign, new TIntermSymbol(instanceID), normalizedInstanceIDAsInt); >+ initializers->push_back(instanceIDInitializer); >+ >+ // Create a uint(gl_InstanceID) % numberOfViews node. >+ TIntermBinary *normalizedViewID = >+ new TIntermBinary(EOpIMod, glInstanceIDAsUint->deepCopy(), numberOfViewsUint->deepCopy()); >+ >+ // Create a ViewID_OVR = uint(gl_InstanceID) % numberOfViews node. >+ TIntermBinary *viewIDInitializer = >+ new TIntermBinary(EOpAssign, new TIntermSymbol(viewID), normalizedViewID); >+ initializers->push_back(viewIDInitializer); >+} >+ >+// Adds a branch to write int(ViewID_OVR) to either gl_ViewportIndex or gl_Layer. The branch is >+// added to the end of the initializers' sequence. >+void SelectViewIndexInVertexShader(const TVariable *viewID, >+ const TVariable *multiviewBaseViewLayerIndex, >+ TIntermSequence *initializers, >+ const TSymbolTable &symbolTable) >+{ >+ // Create an int(ViewID_OVR) node. >+ TIntermSequence *viewIDSymbolCastArguments = new TIntermSequence(); >+ viewIDSymbolCastArguments->push_back(new TIntermSymbol(viewID)); >+ TIntermAggregate *viewIDAsInt = TIntermAggregate::CreateConstructor( >+ TType(EbtInt, EbpHigh, EvqTemporary), viewIDSymbolCastArguments); >+ >+ // Create a gl_ViewportIndex node. >+ TIntermSymbol *viewportIndexSymbol = new TIntermSymbol(BuiltInVariable::gl_ViewportIndex()); >+ >+ // Create a { gl_ViewportIndex = int(ViewID_OVR) } node. >+ TIntermBlock *viewportIndexInitializerInBlock = new TIntermBlock(); >+ viewportIndexInitializerInBlock->appendStatement( >+ new TIntermBinary(EOpAssign, viewportIndexSymbol, viewIDAsInt)); >+ >+ // Create a gl_Layer node. >+ TIntermSymbol *layerSymbol = new TIntermSymbol(BuiltInVariable::gl_LayerVS()); >+ >+ // Create an int(ViewID_OVR) + multiviewBaseViewLayerIndex node >+ TIntermBinary *sumOfViewIDAndBaseViewIndex = new TIntermBinary( >+ EOpAdd, viewIDAsInt->deepCopy(), new TIntermSymbol(multiviewBaseViewLayerIndex)); >+ >+ // Create a { gl_Layer = int(ViewID_OVR) + multiviewBaseViewLayerIndex } node. >+ TIntermBlock *layerInitializerInBlock = new TIntermBlock(); >+ layerInitializerInBlock->appendStatement( >+ new TIntermBinary(EOpAssign, layerSymbol, sumOfViewIDAndBaseViewIndex)); >+ >+ // Create a node to compare whether the base view index uniform is less than zero. >+ TIntermBinary *multiviewBaseViewLayerIndexZeroComparison = >+ new TIntermBinary(EOpLessThan, new TIntermSymbol(multiviewBaseViewLayerIndex), >+ CreateZeroNode(TType(EbtInt, EbpHigh, EvqConst))); >+ >+ // Create an if-else statement to select the code path. >+ TIntermIfElse *multiviewBranch = >+ new TIntermIfElse(multiviewBaseViewLayerIndexZeroComparison, >+ viewportIndexInitializerInBlock, layerInitializerInBlock); >+ >+ initializers->push_back(multiviewBranch); >+} >+ >+} // namespace >+ >+void DeclareAndInitBuiltinsForInstancedMultiview(TIntermBlock *root, >+ unsigned numberOfViews, >+ GLenum shaderType, >+ ShCompileOptions compileOptions, >+ ShShaderOutput shaderOutput, >+ TSymbolTable *symbolTable) >+{ >+ ASSERT(shaderType == GL_VERTEX_SHADER || shaderType == GL_FRAGMENT_SHADER); >+ >+ TQualifier viewIDQualifier = (shaderType == GL_VERTEX_SHADER) ? EvqFlatOut : EvqFlatIn; >+ const TVariable *viewID = >+ new TVariable(symbolTable, kViewIDVariableName, >+ new TType(EbtUInt, EbpHigh, viewIDQualifier), SymbolType::AngleInternal); >+ >+ DeclareGlobalVariable(root, viewID); >+ ReplaceVariable(root, BuiltInVariable::gl_ViewID_OVR(), viewID); >+ if (shaderType == GL_VERTEX_SHADER) >+ { >+ // Replacing gl_InstanceID with InstanceID should happen before adding the initializers of >+ // InstanceID and ViewID. >+ const TType *instanceIDVariableType = StaticType::Get<EbtInt, EbpHigh, EvqGlobal, 1, 1>(); >+ const TVariable *instanceID = >+ new TVariable(symbolTable, kInstanceIDVariableName, instanceIDVariableType, >+ SymbolType::AngleInternal); >+ DeclareGlobalVariable(root, instanceID); >+ ReplaceVariable(root, BuiltInVariable::gl_InstanceID(), instanceID); >+ >+ TIntermSequence *initializers = new TIntermSequence(); >+ InitializeViewIDAndInstanceID(viewID, instanceID, numberOfViews, *symbolTable, >+ initializers); >+ >+ // The AST transformation which adds the expression to select the viewport index should >+ // be done only for the GLSL and ESSL output. >+ const bool selectView = (compileOptions & SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER) != 0u; >+ // Assert that if the view is selected in the vertex shader, then the output is >+ // either GLSL or ESSL. >+ ASSERT(!selectView || IsOutputGLSL(shaderOutput) || IsOutputESSL(shaderOutput)); >+ if (selectView) >+ { >+ // Add a uniform to switch between side-by-side and layered rendering. >+ const TType *baseLayerIndexVariableType = >+ StaticType::Get<EbtInt, EbpHigh, EvqUniform, 1, 1>(); >+ const TVariable *multiviewBaseViewLayerIndex = >+ new TVariable(symbolTable, kMultiviewBaseViewLayerIndexVariableName, >+ baseLayerIndexVariableType, SymbolType::AngleInternal); >+ DeclareGlobalVariable(root, multiviewBaseViewLayerIndex); >+ >+ // Setting a value to gl_ViewportIndex or gl_Layer should happen after ViewID_OVR's >+ // initialization. >+ SelectViewIndexInVertexShader(viewID, multiviewBaseViewLayerIndex, initializers, >+ *symbolTable); >+ } >+ >+ // Insert initializers at the beginning of main(). >+ TIntermBlock *initializersBlock = new TIntermBlock(); >+ initializersBlock->getSequence()->swap(*initializers); >+ TIntermBlock *mainBody = FindMainBody(root); >+ mainBody->getSequence()->insert(mainBody->getSequence()->begin(), initializersBlock); >+ } >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.h >new file mode 100644 >index 00000000000..9501ea58b31 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.h >@@ -0,0 +1,48 @@ >+// >+// Copyright (c) 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. >+// >+// Regardless of the shader type, the following AST transformations are applied: >+// - Add declaration of View_ID_OVR. >+// - Replace every occurrence of gl_ViewID_OVR with ViewID_OVR, mark ViewID_OVR as internal and >+// declare it as a flat varying. >+// >+// If the shader type is a vertex shader, the following AST transformations are applied: >+// - Replace every occurrence of gl_InstanceID with InstanceID, mark InstanceID as internal and set >+// its qualifier to EvqTemporary. >+// - Add initializers of ViewID_OVR and InstanceID to the beginning of the body of main. The pass >+// should be executed before any variables get collected so that usage of gl_InstanceID is recorded. >+// - If the output is ESSL or GLSL and the SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER option is >+// enabled, the expression >+// "if (multiviewBaseViewLayerIndex < 0) { >+// gl_ViewportIndex = int(ViewID_OVR); >+// } else { >+// gl_Layer = int(ViewID_OVR) + multiviewBaseViewLayerIndex; >+// }" >+// is added after ViewID and InstanceID are initialized. Also, MultiviewRenderPath is added as a >+// uniform. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_DECLAREANDINITBUILTINSFORINSTANCEDMULTIVIEW_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_DECLAREANDINITBUILTINSFORINSTANCEDMULTIVIEW_H_ >+ >+#include "GLSLANG/ShaderLang.h" >+#include "angle_gl.h" >+ >+namespace sh >+{ >+ >+class TIntermBlock; >+class TSymbolTable; >+ >+void DeclareAndInitBuiltinsForInstancedMultiview(TIntermBlock *root, >+ unsigned numberOfViews, >+ GLenum shaderType, >+ ShCompileOptions compileOptions, >+ ShShaderOutput shaderOutput, >+ TSymbolTable *symbolTable); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_DECLAREANDINITBUILTINSFORINSTANCEDMULTIVIEW_H_ >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp >new file mode 100644 >index 00000000000..8f48d3e352b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp >@@ -0,0 +1,167 @@ >+// >+// Copyright (c) 2016 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. >+// >+// DeferGlobalInitializers is an AST traverser that moves global initializers into a separate >+// function that is called in the beginning of main(). This enables initialization of globals with >+// uniforms or non-constant globals, as allowed by the WebGL spec. Some initializers referencing >+// non-constants may need to be unfolded into if statements in HLSL - this kind of steps should be >+// done after DeferGlobalInitializers is run. Note that it's important that the function definition >+// is at the end of the shader, as some globals may be declared after main(). >+// >+// It can also initialize all uninitialized globals. >+// >+ >+#include "compiler/translator/tree_ops/DeferGlobalInitializers.h" >+ >+#include <vector> >+ >+#include "compiler/translator/IntermNode.h" >+#include "compiler/translator/StaticType.h" >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_ops/InitializeVariables.h" >+#include "compiler/translator/tree_util/FindMain.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/ReplaceVariable.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+constexpr const ImmutableString kInitGlobalsString("initGlobals"); >+ >+void GetDeferredInitializers(TIntermDeclaration *declaration, >+ bool initializeUninitializedGlobals, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported, >+ TIntermSequence *deferredInitializersOut, >+ std::vector<const TVariable *> *variablesToReplaceOut, >+ TSymbolTable *symbolTable) >+{ >+ // SeparateDeclarations should have already been run. >+ ASSERT(declaration->getSequence()->size() == 1); >+ >+ TIntermNode *declarator = declaration->getSequence()->back(); >+ TIntermBinary *init = declarator->getAsBinaryNode(); >+ if (init) >+ { >+ TIntermSymbol *symbolNode = init->getLeft()->getAsSymbolNode(); >+ ASSERT(symbolNode); >+ TIntermTyped *expression = init->getRight(); >+ >+ if (expression->getQualifier() != EvqConst || !expression->hasConstantValue()) >+ { >+ // For variables which are not constant, defer their real initialization until >+ // after we initialize uniforms. >+ // Deferral is done also in any cases where the variable can not be converted to a >+ // constant union, since otherwise there's a chance that HLSL output will generate extra >+ // statements from the initializer expression. >+ >+ // Change const global to a regular global if its initialization is deferred. >+ // This can happen if ANGLE has not been able to fold the constant expression used >+ // as an initializer. >+ ASSERT(symbolNode->getQualifier() == EvqConst || >+ symbolNode->getQualifier() == EvqGlobal); >+ if (symbolNode->getQualifier() == EvqConst) >+ { >+ variablesToReplaceOut->push_back(&symbolNode->variable()); >+ } >+ >+ TIntermBinary *deferredInit = >+ new TIntermBinary(EOpAssign, symbolNode->deepCopy(), init->getRight()); >+ deferredInitializersOut->push_back(deferredInit); >+ >+ // Remove the initializer from the global scope and just declare the global instead. >+ declaration->replaceChildNode(init, symbolNode); >+ } >+ } >+ else if (initializeUninitializedGlobals) >+ { >+ TIntermSymbol *symbolNode = declarator->getAsSymbolNode(); >+ ASSERT(symbolNode); >+ >+ // Ignore ANGLE internal variables and nameless declarations. >+ if (symbolNode->variable().symbolType() == SymbolType::AngleInternal || >+ symbolNode->variable().symbolType() == SymbolType::Empty) >+ return; >+ >+ if (symbolNode->getQualifier() == EvqGlobal) >+ { >+ TIntermSequence *initCode = CreateInitCode(symbolNode, canUseLoopsToInitialize, >+ highPrecisionSupported, symbolTable); >+ deferredInitializersOut->insert(deferredInitializersOut->end(), initCode->begin(), >+ initCode->end()); >+ } >+ } >+} >+ >+void InsertInitCallToMain(TIntermBlock *root, >+ TIntermSequence *deferredInitializers, >+ TSymbolTable *symbolTable) >+{ >+ TIntermBlock *initGlobalsBlock = new TIntermBlock(); >+ initGlobalsBlock->getSequence()->swap(*deferredInitializers); >+ >+ TFunction *initGlobalsFunction = >+ new TFunction(symbolTable, kInitGlobalsString, SymbolType::AngleInternal, >+ StaticType::GetBasic<EbtVoid>(), false); >+ >+ TIntermFunctionPrototype *initGlobalsFunctionPrototype = >+ CreateInternalFunctionPrototypeNode(*initGlobalsFunction); >+ root->getSequence()->insert(root->getSequence()->begin(), initGlobalsFunctionPrototype); >+ TIntermFunctionDefinition *initGlobalsFunctionDefinition = >+ CreateInternalFunctionDefinitionNode(*initGlobalsFunction, initGlobalsBlock); >+ root->appendStatement(initGlobalsFunctionDefinition); >+ >+ TIntermAggregate *initGlobalsCall = >+ TIntermAggregate::CreateFunctionCall(*initGlobalsFunction, new TIntermSequence()); >+ >+ TIntermBlock *mainBody = FindMainBody(root); >+ mainBody->getSequence()->insert(mainBody->getSequence()->begin(), initGlobalsCall); >+} >+ >+} // namespace >+ >+void DeferGlobalInitializers(TIntermBlock *root, >+ bool initializeUninitializedGlobals, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported, >+ TSymbolTable *symbolTable) >+{ >+ TIntermSequence *deferredInitializers = new TIntermSequence(); >+ std::vector<const TVariable *> variablesToReplace; >+ >+ // Loop over all global statements and process the declarations. This is simpler than using a >+ // traverser. >+ for (TIntermNode *statement : *root->getSequence()) >+ { >+ TIntermDeclaration *declaration = statement->getAsDeclarationNode(); >+ if (declaration) >+ { >+ GetDeferredInitializers(declaration, initializeUninitializedGlobals, >+ canUseLoopsToInitialize, highPrecisionSupported, >+ deferredInitializers, &variablesToReplace, symbolTable); >+ } >+ } >+ >+ // Add the function with initialization and the call to that. >+ if (!deferredInitializers->empty()) >+ { >+ InsertInitCallToMain(root, deferredInitializers, symbolTable); >+ } >+ >+ // Replace constant variables with non-constant global variables. >+ for (const TVariable *var : variablesToReplace) >+ { >+ TType *replacementType = new TType(var->getType()); >+ replacementType->setQualifier(EvqGlobal); >+ TVariable *replacement = >+ new TVariable(symbolTable, var->name(), replacementType, var->symbolType()); >+ ReplaceVariable(root, var, replacement); >+ } >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/DeferGlobalInitializers.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/DeferGlobalInitializers.h >new file mode 100644 >index 00000000000..b0e45478579 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/DeferGlobalInitializers.h >@@ -0,0 +1,33 @@ >+// >+// Copyright (c) 2016 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. >+// >+// DeferGlobalInitializers is an AST traverser that moves global initializers into a separate >+// function that is called in the beginning of main(). This enables initialization of globals with >+// uniforms or non-constant globals, as allowed by the WebGL spec. Some initializers referencing >+// non-constants may need to be unfolded into if statements in HLSL - this kind of steps should be >+// done after DeferGlobalInitializers is run. Note that it's important that the function definition >+// is at the end of the shader, as some globals may be declared after main(). >+// >+// It can also initialize all uninitialized globals. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_DEFERGLOBALINITIALIZERS_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_DEFERGLOBALINITIALIZERS_H_ >+ >+namespace sh >+{ >+ >+class TIntermBlock; >+class TSymbolTable; >+ >+void DeferGlobalInitializers(TIntermBlock *root, >+ bool initializeUninitializedGlobals, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported, >+ TSymbolTable *symbolTable); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_DEFERGLOBALINITIALIZERS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulateGLDrawID.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulateGLDrawID.cpp >new file mode 100644 >index 00000000000..5776d2a31a3 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulateGLDrawID.cpp >@@ -0,0 +1,89 @@ >+// >+// 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. >+// >+// EmulateGLDrawID is an AST traverser to convert the gl_DrawID builtin >+// to a uniform int >+// >+ >+#include "compiler/translator/tree_ops/EmulateGLDrawID.h" >+ >+#include "angle_gl.h" >+#include "compiler/translator/StaticType.h" >+#include "compiler/translator/Symbol.h" >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/BuiltIn_autogen.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+#include "compiler/translator/tree_util/ReplaceVariable.h" >+#include "compiler/translator/util.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+constexpr const ImmutableString kEmulatedGLDrawIDName("angle_DrawID"); >+ >+class FindGLDrawIDTraverser : public TIntermTraverser >+{ >+ public: >+ FindGLDrawIDTraverser() : TIntermTraverser(true, false, false), mVariable(nullptr) {} >+ >+ const TVariable *getGLDrawIDBuiltinVariable() { return mVariable; } >+ >+ protected: >+ void visitSymbol(TIntermSymbol *node) override >+ { >+ if (&node->variable() == BuiltInVariable::gl_DrawID() || >+ &node->variable() == BuiltInVariable::gl_DrawIDESSL1()) >+ { >+ mVariable = &node->variable(); >+ } >+ } >+ >+ private: >+ const TVariable *mVariable; >+}; >+ >+} // namespace >+ >+void EmulateGLDrawID(TIntermBlock *root, >+ TSymbolTable *symbolTable, >+ std::vector<sh::Uniform> *uniforms, >+ bool shouldCollect) >+{ >+ FindGLDrawIDTraverser traverser; >+ root->traverse(&traverser); >+ const TVariable *builtInVariable = traverser.getGLDrawIDBuiltinVariable(); >+ if (builtInVariable) >+ { >+ const TType *type = StaticType::Get<EbtInt, EbpHigh, EvqUniform, 1, 1>(); >+ const TVariable *drawID = >+ new TVariable(symbolTable, kEmulatedGLDrawIDName, type, SymbolType::AngleInternal); >+ >+ // AngleInternal variables don't get collected >+ if (shouldCollect) >+ { >+ Uniform uniform; >+ uniform.name = kEmulatedGLDrawIDName.data(); >+ uniform.mappedName = kEmulatedGLDrawIDName.data(); >+ uniform.type = GLVariableType(*type); >+ uniform.precision = GLVariablePrecision(*type); >+ uniform.staticUse = symbolTable->isStaticallyUsed(*builtInVariable); >+ uniform.active = true; >+ uniform.binding = type->getLayoutQualifier().binding; >+ uniform.location = type->getLayoutQualifier().location; >+ uniform.offset = type->getLayoutQualifier().offset; >+ uniform.readonly = type->getMemoryQualifier().readonly; >+ uniform.writeonly = type->getMemoryQualifier().writeonly; >+ uniforms->push_back(uniform); >+ } >+ >+ DeclareGlobalVariable(root, drawID); >+ ReplaceVariable(root, builtInVariable, drawID); >+ } >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulateGLDrawID.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulateGLDrawID.h >new file mode 100644 >index 00000000000..db295e9fded >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulateGLDrawID.h >@@ -0,0 +1,31 @@ >+// >+// 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. >+// >+// EmulateGLDrawID is an AST traverser to convert the gl_DrawID builtin >+// to a uniform int >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_EMULATEGLDRAWID_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_EMULATEGLDRAWID_H_ >+ >+#include <GLSLANG/ShaderLang.h> >+#include <vector> >+ >+#include "compiler/translator/HashNames.h" >+ >+namespace sh >+{ >+struct Uniform; >+class TIntermBlock; >+class TSymbolTable; >+ >+void EmulateGLDrawID(TIntermBlock *root, >+ TSymbolTable *symbolTable, >+ std::vector<sh::Uniform> *uniforms, >+ bool shouldCollect); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_EMULATEGLDRAWID_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.cpp >new file mode 100644 >index 00000000000..d562136999c >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.cpp >@@ -0,0 +1,131 @@ >+// >+// Copyright (c) 2002-2016 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. >+// >+// gl_FragColor needs to broadcast to all color buffers in ES2 if >+// GL_EXT_draw_buffers is explicitly enabled in a fragment shader. >+// >+// We emulate this by replacing all gl_FragColor with gl_FragData[0], and in the end >+// of main() function, assigning gl_FragData[1], ..., gl_FragData[maxDrawBuffers-1] >+// with gl_FragData[0]. >+// >+ >+#include "compiler/translator/tree_ops/EmulateGLFragColorBroadcast.h" >+ >+#include "compiler/translator/Symbol.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+#include "compiler/translator/tree_util/RunAtTheEndOfShader.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+constexpr const ImmutableString kGlFragDataString("gl_FragData"); >+ >+class GLFragColorBroadcastTraverser : public TIntermTraverser >+{ >+ public: >+ GLFragColorBroadcastTraverser(int maxDrawBuffers, TSymbolTable *symbolTable, int shaderVersion) >+ : TIntermTraverser(true, false, false, symbolTable), >+ mGLFragColorUsed(false), >+ mMaxDrawBuffers(maxDrawBuffers), >+ mShaderVersion(shaderVersion) >+ {} >+ >+ void broadcastGLFragColor(TIntermBlock *root); >+ >+ bool isGLFragColorUsed() const { return mGLFragColorUsed; } >+ >+ protected: >+ void visitSymbol(TIntermSymbol *node) override; >+ >+ TIntermBinary *constructGLFragDataNode(int index) const; >+ TIntermBinary *constructGLFragDataAssignNode(int index) const; >+ >+ private: >+ bool mGLFragColorUsed; >+ int mMaxDrawBuffers; >+ const int mShaderVersion; >+}; >+ >+TIntermBinary *GLFragColorBroadcastTraverser::constructGLFragDataNode(int index) const >+{ >+ TIntermSymbol *symbol = >+ ReferenceBuiltInVariable(kGlFragDataString, *mSymbolTable, mShaderVersion); >+ TIntermTyped *indexNode = CreateIndexNode(index); >+ >+ TIntermBinary *binary = new TIntermBinary(EOpIndexDirect, symbol, indexNode); >+ return binary; >+} >+ >+TIntermBinary *GLFragColorBroadcastTraverser::constructGLFragDataAssignNode(int index) const >+{ >+ TIntermTyped *fragDataIndex = constructGLFragDataNode(index); >+ TIntermTyped *fragDataZero = constructGLFragDataNode(0); >+ >+ return new TIntermBinary(EOpAssign, fragDataIndex, fragDataZero); >+} >+ >+void GLFragColorBroadcastTraverser::visitSymbol(TIntermSymbol *node) >+{ >+ if (node->variable().symbolType() == SymbolType::BuiltIn && node->getName() == "gl_FragColor") >+ { >+ queueReplacement(constructGLFragDataNode(0), OriginalNode::IS_DROPPED); >+ mGLFragColorUsed = true; >+ } >+} >+ >+void GLFragColorBroadcastTraverser::broadcastGLFragColor(TIntermBlock *root) >+{ >+ ASSERT(mMaxDrawBuffers > 1); >+ if (!mGLFragColorUsed) >+ { >+ return; >+ } >+ >+ TIntermBlock *broadcastBlock = new TIntermBlock(); >+ // Now insert statements >+ // gl_FragData[1] = gl_FragData[0]; >+ // ... >+ // gl_FragData[maxDrawBuffers - 1] = gl_FragData[0]; >+ for (int colorIndex = 1; colorIndex < mMaxDrawBuffers; ++colorIndex) >+ { >+ broadcastBlock->appendStatement(constructGLFragDataAssignNode(colorIndex)); >+ } >+ RunAtTheEndOfShader(root, broadcastBlock, mSymbolTable); >+} >+ >+} // namespace >+ >+void EmulateGLFragColorBroadcast(TIntermBlock *root, >+ int maxDrawBuffers, >+ std::vector<sh::OutputVariable> *outputVariables, >+ TSymbolTable *symbolTable, >+ int shaderVersion) >+{ >+ ASSERT(maxDrawBuffers > 1); >+ GLFragColorBroadcastTraverser traverser(maxDrawBuffers, symbolTable, shaderVersion); >+ root->traverse(&traverser); >+ if (traverser.isGLFragColorUsed()) >+ { >+ traverser.updateTree(); >+ traverser.broadcastGLFragColor(root); >+ for (auto &var : *outputVariables) >+ { >+ if (var.name == "gl_FragColor") >+ { >+ // TODO(zmo): Find a way to keep the original variable information. >+ var.name = "gl_FragData"; >+ var.mappedName = "gl_FragData"; >+ var.arraySizes.push_back(maxDrawBuffers); >+ ASSERT(var.arraySizes.size() == 1u); >+ } >+ } >+ } >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.h >new file mode 100644 >index 00000000000..f6bf549bacc >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.h >@@ -0,0 +1,31 @@ >+// >+// Copyright (c) 2002-2016 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. >+// >+// Emulate gl_FragColor broadcast behaviors in ES2 where >+// GL_EXT_draw_buffers is explicitly enabled in a fragment shader. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_EMULATEGLFRAGCOLORBROADCAST_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_EMULATEGLFRAGCOLORBROADCAST_H_ >+ >+#include <vector> >+ >+namespace sh >+{ >+struct OutputVariable; >+class TIntermBlock; >+class TSymbolTable; >+ >+// Replace all gl_FragColor with gl_FragData[0], and in the end of main() function, >+// assign gl_FragData[1] ... gl_FragData[maxDrawBuffers - 1] with gl_FragData[0]. >+// If gl_FragColor is in outputVariables, it is replaced by gl_FragData. >+void EmulateGLFragColorBroadcast(TIntermBlock *root, >+ int maxDrawBuffers, >+ std::vector<OutputVariable> *outputVariables, >+ TSymbolTable *symbolTable, >+ int shaderVersion); >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_EMULATEGLFRAGCOLORBROADCAST_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulatePrecision.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulatePrecision.cpp >new file mode 100644 >index 00000000000..ba19bd112ef >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulatePrecision.cpp >@@ -0,0 +1,776 @@ >+// >+// Copyright (c) 2002-2014 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. >+// >+ >+#include "compiler/translator/tree_ops/EmulatePrecision.h" >+ >+#include "compiler/translator/FunctionLookup.h" >+ >+#include <memory> >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+constexpr const ImmutableString kParamXName("x"); >+constexpr const ImmutableString kParamYName("y"); >+constexpr const ImmutableString kAngleFrmString("angle_frm"); >+constexpr const ImmutableString kAngleFrlString("angle_frl"); >+ >+class RoundingHelperWriter : angle::NonCopyable >+{ >+ public: >+ static RoundingHelperWriter *createHelperWriter(const ShShaderOutput outputLanguage); >+ >+ void writeCommonRoundingHelpers(TInfoSinkBase &sink, const int shaderVersion); >+ void writeCompoundAssignmentHelper(TInfoSinkBase &sink, >+ const char *lType, >+ const char *rType, >+ const char *opStr, >+ const char *opNameStr); >+ >+ virtual ~RoundingHelperWriter() {} >+ >+ protected: >+ RoundingHelperWriter(const ShShaderOutput outputLanguage) : mOutputLanguage(outputLanguage) {} >+ RoundingHelperWriter() = delete; >+ >+ const ShShaderOutput mOutputLanguage; >+ >+ private: >+ virtual std::string getTypeString(const char *glslType) = 0; >+ virtual void writeFloatRoundingHelpers(TInfoSinkBase &sink) = 0; >+ virtual void writeVectorRoundingHelpers(TInfoSinkBase &sink, const unsigned int size) = 0; >+ virtual void writeMatrixRoundingHelper(TInfoSinkBase &sink, >+ const unsigned int columns, >+ const unsigned int rows, >+ const char *functionName) = 0; >+}; >+ >+class RoundingHelperWriterGLSL : public RoundingHelperWriter >+{ >+ public: >+ RoundingHelperWriterGLSL(const ShShaderOutput outputLanguage) >+ : RoundingHelperWriter(outputLanguage) >+ {} >+ >+ private: >+ std::string getTypeString(const char *glslType) override; >+ void writeFloatRoundingHelpers(TInfoSinkBase &sink) override; >+ void writeVectorRoundingHelpers(TInfoSinkBase &sink, const unsigned int size) override; >+ void writeMatrixRoundingHelper(TInfoSinkBase &sink, >+ const unsigned int columns, >+ const unsigned int rows, >+ const char *functionName) override; >+}; >+ >+class RoundingHelperWriterESSL : public RoundingHelperWriterGLSL >+{ >+ public: >+ RoundingHelperWriterESSL(const ShShaderOutput outputLanguage) >+ : RoundingHelperWriterGLSL(outputLanguage) >+ {} >+ >+ private: >+ std::string getTypeString(const char *glslType) override; >+}; >+ >+class RoundingHelperWriterHLSL : public RoundingHelperWriter >+{ >+ public: >+ RoundingHelperWriterHLSL(const ShShaderOutput outputLanguage) >+ : RoundingHelperWriter(outputLanguage) >+ {} >+ >+ private: >+ std::string getTypeString(const char *glslType) override; >+ void writeFloatRoundingHelpers(TInfoSinkBase &sink) override; >+ void writeVectorRoundingHelpers(TInfoSinkBase &sink, const unsigned int size) override; >+ void writeMatrixRoundingHelper(TInfoSinkBase &sink, >+ const unsigned int columns, >+ const unsigned int rows, >+ const char *functionName) override; >+}; >+ >+RoundingHelperWriter *RoundingHelperWriter::createHelperWriter(const ShShaderOutput outputLanguage) >+{ >+ ASSERT(EmulatePrecision::SupportedInLanguage(outputLanguage)); >+ switch (outputLanguage) >+ { >+ case SH_HLSL_4_1_OUTPUT: >+ return new RoundingHelperWriterHLSL(outputLanguage); >+ case SH_ESSL_OUTPUT: >+ return new RoundingHelperWriterESSL(outputLanguage); >+ default: >+ return new RoundingHelperWriterGLSL(outputLanguage); >+ } >+} >+ >+void RoundingHelperWriter::writeCommonRoundingHelpers(TInfoSinkBase &sink, const int shaderVersion) >+{ >+ // Write the angle_frm functions that round floating point numbers to >+ // half precision, and angle_frl functions that round them to minimum lowp >+ // precision. >+ >+ writeFloatRoundingHelpers(sink); >+ writeVectorRoundingHelpers(sink, 2); >+ writeVectorRoundingHelpers(sink, 3); >+ writeVectorRoundingHelpers(sink, 4); >+ if (shaderVersion > 100) >+ { >+ for (unsigned int columns = 2; columns <= 4; ++columns) >+ { >+ for (unsigned int rows = 2; rows <= 4; ++rows) >+ { >+ writeMatrixRoundingHelper(sink, columns, rows, "angle_frm"); >+ writeMatrixRoundingHelper(sink, columns, rows, "angle_frl"); >+ } >+ } >+ } >+ else >+ { >+ for (unsigned int size = 2; size <= 4; ++size) >+ { >+ writeMatrixRoundingHelper(sink, size, size, "angle_frm"); >+ writeMatrixRoundingHelper(sink, size, size, "angle_frl"); >+ } >+ } >+} >+ >+void RoundingHelperWriter::writeCompoundAssignmentHelper(TInfoSinkBase &sink, >+ const char *lType, >+ const char *rType, >+ const char *opStr, >+ const char *opNameStr) >+{ >+ std::string lTypeStr = getTypeString(lType); >+ std::string rTypeStr = getTypeString(rType); >+ >+ // Note that y should be passed through angle_frm at the function call site, >+ // but x can't be passed through angle_frm there since it is an inout parameter. >+ // So only pass x and the result through angle_frm here. >+ // clang-format off >+ sink << >+ lTypeStr << " angle_compound_" << opNameStr << "_frm(inout " << lTypeStr << " x, in " << rTypeStr << " y) {\n" >+ " x = angle_frm(angle_frm(x) " << opStr << " y);\n" >+ " return x;\n" >+ "}\n"; >+ sink << >+ lTypeStr << " angle_compound_" << opNameStr << "_frl(inout " << lTypeStr << " x, in " << rTypeStr << " y) {\n" >+ " x = angle_frl(angle_frl(x) " << opStr << " y);\n" >+ " return x;\n" >+ "}\n"; >+ // clang-format on >+} >+ >+std::string RoundingHelperWriterGLSL::getTypeString(const char *glslType) >+{ >+ return glslType; >+} >+ >+std::string RoundingHelperWriterESSL::getTypeString(const char *glslType) >+{ >+ std::stringstream typeStrStr = sh::InitializeStream<std::stringstream>(); >+ typeStrStr << "highp " << glslType; >+ return typeStrStr.str(); >+} >+ >+void RoundingHelperWriterGLSL::writeFloatRoundingHelpers(TInfoSinkBase &sink) >+{ >+ // Unoptimized version of angle_frm for single floats: >+ // >+ // int webgl_maxNormalExponent(in int exponentBits) >+ // { >+ // int possibleExponents = int(exp2(float(exponentBits))); >+ // int exponentBias = possibleExponents / 2 - 1; >+ // int allExponentBitsOne = possibleExponents - 1; >+ // return (allExponentBitsOne - 1) - exponentBias; >+ // } >+ // >+ // float angle_frm(in float x) >+ // { >+ // int mantissaBits = 10; >+ // int exponentBits = 5; >+ // float possibleMantissas = exp2(float(mantissaBits)); >+ // float mantissaMax = 2.0 - 1.0 / possibleMantissas; >+ // int maxNE = webgl_maxNormalExponent(exponentBits); >+ // float max = exp2(float(maxNE)) * mantissaMax; >+ // if (x > max) >+ // { >+ // return max; >+ // } >+ // if (x < -max) >+ // { >+ // return -max; >+ // } >+ // float exponent = floor(log2(abs(x))); >+ // if (abs(x) == 0.0 || exponent < -float(maxNE)) >+ // { >+ // return 0.0 * sign(x) >+ // } >+ // x = x * exp2(-(exponent - float(mantissaBits))); >+ // x = sign(x) * floor(abs(x)); >+ // return x * exp2(exponent - float(mantissaBits)); >+ // } >+ >+ // All numbers with a magnitude less than 2^-15 are subnormal, and are >+ // flushed to zero. >+ >+ // Note the constant numbers below: >+ // a) 65504 is the maximum possible mantissa (1.1111111111 in binary) times >+ // 2^15, the maximum normal exponent. >+ // b) 10.0 is the number of mantissa bits. >+ // c) -25.0 is the minimum normal half-float exponent -15.0 minus the number >+ // of mantissa bits. >+ // d) + 1e-30 is to make sure the argument of log2() won't be zero. It can >+ // only affect the result of log2 on x where abs(x) < 1e-22. Since these >+ // numbers will be flushed to zero either way (2^-15 is the smallest >+ // normal positive number), this does not introduce any error. >+ >+ std::string floatType = getTypeString("float"); >+ >+ // clang-format off >+ sink << >+ floatType << " angle_frm(in " << floatType << " x) {\n" >+ " x = clamp(x, -65504.0, 65504.0);\n" >+ " " << floatType << " exponent = floor(log2(abs(x) + 1e-30)) - 10.0;\n" >+ " bool isNonZero = (exponent >= -25.0);\n" >+ " x = x * exp2(-exponent);\n" >+ " x = sign(x) * floor(abs(x));\n" >+ " return x * exp2(exponent) * float(isNonZero);\n" >+ "}\n"; >+ >+ sink << >+ floatType << " angle_frl(in " << floatType << " x) {\n" >+ " x = clamp(x, -2.0, 2.0);\n" >+ " x = x * 256.0;\n" >+ " x = sign(x) * floor(abs(x));\n" >+ " return x * 0.00390625;\n" >+ "}\n"; >+ // clang-format on >+} >+ >+void RoundingHelperWriterGLSL::writeVectorRoundingHelpers(TInfoSinkBase &sink, >+ const unsigned int size) >+{ >+ std::stringstream vecTypeStrStr = sh::InitializeStream<std::stringstream>(); >+ vecTypeStrStr << "vec" << size; >+ std::string vecType = getTypeString(vecTypeStrStr.str().c_str()); >+ >+ // clang-format off >+ sink << >+ vecType << " angle_frm(in " << vecType << " v) {\n" >+ " v = clamp(v, -65504.0, 65504.0);\n" >+ " " << vecType << " exponent = floor(log2(abs(v) + 1e-30)) - 10.0;\n" >+ " bvec" << size << " isNonZero = greaterThanEqual(exponent, vec" << size << "(-25.0));\n" >+ " v = v * exp2(-exponent);\n" >+ " v = sign(v) * floor(abs(v));\n" >+ " return v * exp2(exponent) * vec" << size << "(isNonZero);\n" >+ "}\n"; >+ >+ sink << >+ vecType << " angle_frl(in " << vecType << " v) {\n" >+ " v = clamp(v, -2.0, 2.0);\n" >+ " v = v * 256.0;\n" >+ " v = sign(v) * floor(abs(v));\n" >+ " return v * 0.00390625;\n" >+ "}\n"; >+ // clang-format on >+} >+ >+void RoundingHelperWriterGLSL::writeMatrixRoundingHelper(TInfoSinkBase &sink, >+ const unsigned int columns, >+ const unsigned int rows, >+ const char *functionName) >+{ >+ std::stringstream matTypeStrStr = sh::InitializeStream<std::stringstream>(); >+ matTypeStrStr << "mat" << columns; >+ if (rows != columns) >+ { >+ matTypeStrStr << "x" << rows; >+ } >+ std::string matType = getTypeString(matTypeStrStr.str().c_str()); >+ >+ sink << matType << " " << functionName << "(in " << matType << " m) {\n" >+ << " " << matType << " rounded;\n"; >+ >+ for (unsigned int i = 0; i < columns; ++i) >+ { >+ sink << " rounded[" << i << "] = " << functionName << "(m[" << i << "]);\n"; >+ } >+ >+ sink << " return rounded;\n" >+ "}\n"; >+} >+ >+static const char *GetHLSLTypeStr(const char *floatTypeStr) >+{ >+ if (strcmp(floatTypeStr, "float") == 0) >+ { >+ return "float"; >+ } >+ if (strcmp(floatTypeStr, "vec2") == 0) >+ { >+ return "float2"; >+ } >+ if (strcmp(floatTypeStr, "vec3") == 0) >+ { >+ return "float3"; >+ } >+ if (strcmp(floatTypeStr, "vec4") == 0) >+ { >+ return "float4"; >+ } >+ if (strcmp(floatTypeStr, "mat2") == 0) >+ { >+ return "float2x2"; >+ } >+ if (strcmp(floatTypeStr, "mat3") == 0) >+ { >+ return "float3x3"; >+ } >+ if (strcmp(floatTypeStr, "mat4") == 0) >+ { >+ return "float4x4"; >+ } >+ if (strcmp(floatTypeStr, "mat2x3") == 0) >+ { >+ return "float2x3"; >+ } >+ if (strcmp(floatTypeStr, "mat2x4") == 0) >+ { >+ return "float2x4"; >+ } >+ if (strcmp(floatTypeStr, "mat3x2") == 0) >+ { >+ return "float3x2"; >+ } >+ if (strcmp(floatTypeStr, "mat3x4") == 0) >+ { >+ return "float3x4"; >+ } >+ if (strcmp(floatTypeStr, "mat4x2") == 0) >+ { >+ return "float4x2"; >+ } >+ if (strcmp(floatTypeStr, "mat4x3") == 0) >+ { >+ return "float4x3"; >+ } >+ UNREACHABLE(); >+ return nullptr; >+} >+ >+std::string RoundingHelperWriterHLSL::getTypeString(const char *glslType) >+{ >+ return GetHLSLTypeStr(glslType); >+} >+ >+void RoundingHelperWriterHLSL::writeFloatRoundingHelpers(TInfoSinkBase &sink) >+{ >+ // In HLSL scalars are the same as 1-vectors. >+ writeVectorRoundingHelpers(sink, 1); >+} >+ >+void RoundingHelperWriterHLSL::writeVectorRoundingHelpers(TInfoSinkBase &sink, >+ const unsigned int size) >+{ >+ std::stringstream vecTypeStrStr = sh::InitializeStream<std::stringstream>(); >+ vecTypeStrStr << "float" << size; >+ std::string vecType = vecTypeStrStr.str(); >+ >+ // clang-format off >+ sink << >+ vecType << " angle_frm(" << vecType << " v) {\n" >+ " v = clamp(v, -65504.0, 65504.0);\n" >+ " " << vecType << " exponent = floor(log2(abs(v) + 1e-30)) - 10.0;\n" >+ " bool" << size << " isNonZero = exponent < -25.0;\n" >+ " v = v * exp2(-exponent);\n" >+ " v = sign(v) * floor(abs(v));\n" >+ " return v * exp2(exponent) * (float" << size << ")(isNonZero);\n" >+ "}\n"; >+ >+ sink << >+ vecType << " angle_frl(" << vecType << " v) {\n" >+ " v = clamp(v, -2.0, 2.0);\n" >+ " v = v * 256.0;\n" >+ " v = sign(v) * floor(abs(v));\n" >+ " return v * 0.00390625;\n" >+ "}\n"; >+ // clang-format on >+} >+ >+void RoundingHelperWriterHLSL::writeMatrixRoundingHelper(TInfoSinkBase &sink, >+ const unsigned int columns, >+ const unsigned int rows, >+ const char *functionName) >+{ >+ std::stringstream matTypeStrStr = sh::InitializeStream<std::stringstream>(); >+ matTypeStrStr << "float" << columns << "x" << rows; >+ std::string matType = matTypeStrStr.str(); >+ >+ sink << matType << " " << functionName << "(" << matType << " m) {\n" >+ << " " << matType << " rounded;\n"; >+ >+ for (unsigned int i = 0; i < columns; ++i) >+ { >+ sink << " rounded[" << i << "] = " << functionName << "(m[" << i << "]);\n"; >+ } >+ >+ sink << " return rounded;\n" >+ "}\n"; >+} >+ >+bool canRoundFloat(const TType &type) >+{ >+ return type.getBasicType() == EbtFloat && !type.isArray() && >+ (type.getPrecision() == EbpLow || type.getPrecision() == EbpMedium); >+} >+ >+bool ParentUsesResult(TIntermNode *parent, TIntermTyped *node) >+{ >+ if (!parent) >+ { >+ return false; >+ } >+ >+ TIntermBlock *blockParent = parent->getAsBlock(); >+ // If the parent is a block, the result is not assigned anywhere, >+ // so rounding it is not needed. In particular, this can avoid a lot of >+ // unnecessary rounding of unused return values of assignment. >+ if (blockParent) >+ { >+ return false; >+ } >+ TIntermBinary *binaryParent = parent->getAsBinaryNode(); >+ if (binaryParent && binaryParent->getOp() == EOpComma && (binaryParent->getRight() != node)) >+ { >+ return false; >+ } >+ return true; >+} >+ >+bool ParentConstructorTakesCareOfRounding(TIntermNode *parent, TIntermTyped *node) >+{ >+ if (!parent) >+ { >+ return false; >+ } >+ TIntermAggregate *parentConstructor = parent->getAsAggregate(); >+ if (!parentConstructor || parentConstructor->getOp() != EOpConstruct) >+ { >+ return false; >+ } >+ if (parentConstructor->getPrecision() != node->getPrecision()) >+ { >+ return false; >+ } >+ return canRoundFloat(parentConstructor->getType()); >+} >+ >+} // namespace >+ >+EmulatePrecision::EmulatePrecision(TSymbolTable *symbolTable) >+ : TLValueTrackingTraverser(true, true, true, symbolTable), mDeclaringVariables(false) >+{} >+ >+void EmulatePrecision::visitSymbol(TIntermSymbol *node) >+{ >+ TIntermNode *parent = getParentNode(); >+ if (canRoundFloat(node->getType()) && ParentUsesResult(parent, node) && >+ !ParentConstructorTakesCareOfRounding(parent, node) && !mDeclaringVariables && >+ !isLValueRequiredHere()) >+ { >+ TIntermNode *replacement = createRoundingFunctionCallNode(node); >+ queueReplacement(replacement, OriginalNode::BECOMES_CHILD); >+ } >+} >+ >+bool EmulatePrecision::visitBinary(Visit visit, TIntermBinary *node) >+{ >+ bool visitChildren = true; >+ >+ TOperator op = node->getOp(); >+ >+ // RHS of initialize is not being declared. >+ if (op == EOpInitialize && visit == InVisit) >+ mDeclaringVariables = false; >+ >+ if ((op == EOpIndexDirectStruct) && visit == InVisit) >+ visitChildren = false; >+ >+ if (visit != PreVisit) >+ return visitChildren; >+ >+ const TType &type = node->getType(); >+ bool roundFloat = canRoundFloat(type); >+ >+ if (roundFloat) >+ { >+ switch (op) >+ { >+ // Math operators that can result in a float may need to apply rounding to the return >+ // value. Note that in the case of assignment, the rounding is applied to its return >+ // value here, not the value being assigned. >+ case EOpAssign: >+ case EOpAdd: >+ case EOpSub: >+ case EOpMul: >+ case EOpDiv: >+ case EOpVectorTimesScalar: >+ case EOpVectorTimesMatrix: >+ case EOpMatrixTimesVector: >+ case EOpMatrixTimesScalar: >+ case EOpMatrixTimesMatrix: >+ { >+ TIntermNode *parent = getParentNode(); >+ if (!ParentUsesResult(parent, node) || >+ ParentConstructorTakesCareOfRounding(parent, node)) >+ { >+ break; >+ } >+ TIntermNode *replacement = createRoundingFunctionCallNode(node); >+ queueReplacement(replacement, OriginalNode::BECOMES_CHILD); >+ break; >+ } >+ >+ // Compound assignment cases need to replace the operator with a function call. >+ case EOpAddAssign: >+ { >+ mEmulateCompoundAdd.insert( >+ TypePair(type.getBuiltInTypeNameString(), >+ node->getRight()->getType().getBuiltInTypeNameString())); >+ TIntermNode *replacement = createCompoundAssignmentFunctionCallNode( >+ node->getLeft(), node->getRight(), "add"); >+ queueReplacement(replacement, OriginalNode::IS_DROPPED); >+ break; >+ } >+ case EOpSubAssign: >+ { >+ mEmulateCompoundSub.insert( >+ TypePair(type.getBuiltInTypeNameString(), >+ node->getRight()->getType().getBuiltInTypeNameString())); >+ TIntermNode *replacement = createCompoundAssignmentFunctionCallNode( >+ node->getLeft(), node->getRight(), "sub"); >+ queueReplacement(replacement, OriginalNode::IS_DROPPED); >+ break; >+ } >+ case EOpMulAssign: >+ case EOpVectorTimesMatrixAssign: >+ case EOpVectorTimesScalarAssign: >+ case EOpMatrixTimesScalarAssign: >+ case EOpMatrixTimesMatrixAssign: >+ { >+ mEmulateCompoundMul.insert( >+ TypePair(type.getBuiltInTypeNameString(), >+ node->getRight()->getType().getBuiltInTypeNameString())); >+ TIntermNode *replacement = createCompoundAssignmentFunctionCallNode( >+ node->getLeft(), node->getRight(), "mul"); >+ queueReplacement(replacement, OriginalNode::IS_DROPPED); >+ break; >+ } >+ case EOpDivAssign: >+ { >+ mEmulateCompoundDiv.insert( >+ TypePair(type.getBuiltInTypeNameString(), >+ node->getRight()->getType().getBuiltInTypeNameString())); >+ TIntermNode *replacement = createCompoundAssignmentFunctionCallNode( >+ node->getLeft(), node->getRight(), "div"); >+ queueReplacement(replacement, OriginalNode::IS_DROPPED); >+ break; >+ } >+ default: >+ // The rest of the binary operations should not need precision emulation. >+ break; >+ } >+ } >+ return visitChildren; >+} >+ >+bool EmulatePrecision::visitDeclaration(Visit visit, TIntermDeclaration *node) >+{ >+ // Variable or interface block declaration. >+ if (visit == PreVisit) >+ { >+ mDeclaringVariables = true; >+ } >+ else if (visit == InVisit) >+ { >+ mDeclaringVariables = true; >+ } >+ else >+ { >+ mDeclaringVariables = false; >+ } >+ return true; >+} >+ >+bool EmulatePrecision::visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) >+{ >+ return false; >+} >+ >+bool EmulatePrecision::visitAggregate(Visit visit, TIntermAggregate *node) >+{ >+ if (visit != PreVisit) >+ return true; >+ >+ // User-defined function return values are not rounded. The calculations that produced >+ // the value inside the function definition should have been rounded. >+ TOperator op = node->getOp(); >+ if (op == EOpCallInternalRawFunction || op == EOpCallFunctionInAST || >+ (op == EOpConstruct && node->getBasicType() == EbtStruct)) >+ { >+ return true; >+ } >+ >+ TIntermNode *parent = getParentNode(); >+ if (canRoundFloat(node->getType()) && ParentUsesResult(parent, node) && >+ !ParentConstructorTakesCareOfRounding(parent, node)) >+ { >+ TIntermNode *replacement = createRoundingFunctionCallNode(node); >+ queueReplacement(replacement, OriginalNode::BECOMES_CHILD); >+ } >+ return true; >+} >+ >+bool EmulatePrecision::visitUnary(Visit visit, TIntermUnary *node) >+{ >+ switch (node->getOp()) >+ { >+ case EOpNegative: >+ case EOpLogicalNot: >+ case EOpPostIncrement: >+ case EOpPostDecrement: >+ case EOpPreIncrement: >+ case EOpPreDecrement: >+ case EOpLogicalNotComponentWise: >+ break; >+ default: >+ if (canRoundFloat(node->getType()) && visit == PreVisit) >+ { >+ TIntermNode *replacement = createRoundingFunctionCallNode(node); >+ queueReplacement(replacement, OriginalNode::BECOMES_CHILD); >+ } >+ break; >+ } >+ >+ return true; >+} >+ >+void EmulatePrecision::writeEmulationHelpers(TInfoSinkBase &sink, >+ const int shaderVersion, >+ const ShShaderOutput outputLanguage) >+{ >+ std::unique_ptr<RoundingHelperWriter> roundingHelperWriter( >+ RoundingHelperWriter::createHelperWriter(outputLanguage)); >+ >+ roundingHelperWriter->writeCommonRoundingHelpers(sink, shaderVersion); >+ >+ EmulationSet::const_iterator it; >+ for (it = mEmulateCompoundAdd.begin(); it != mEmulateCompoundAdd.end(); it++) >+ roundingHelperWriter->writeCompoundAssignmentHelper(sink, it->lType, it->rType, "+", "add"); >+ for (it = mEmulateCompoundSub.begin(); it != mEmulateCompoundSub.end(); it++) >+ roundingHelperWriter->writeCompoundAssignmentHelper(sink, it->lType, it->rType, "-", "sub"); >+ for (it = mEmulateCompoundDiv.begin(); it != mEmulateCompoundDiv.end(); it++) >+ roundingHelperWriter->writeCompoundAssignmentHelper(sink, it->lType, it->rType, "/", "div"); >+ for (it = mEmulateCompoundMul.begin(); it != mEmulateCompoundMul.end(); it++) >+ roundingHelperWriter->writeCompoundAssignmentHelper(sink, it->lType, it->rType, "*", "mul"); >+} >+ >+// static >+bool EmulatePrecision::SupportedInLanguage(const ShShaderOutput outputLanguage) >+{ >+ switch (outputLanguage) >+ { >+ case SH_HLSL_4_1_OUTPUT: >+ case SH_ESSL_OUTPUT: >+ return true; >+ default: >+ // Other languages not yet supported >+ return (outputLanguage == SH_GLSL_COMPATIBILITY_OUTPUT || >+ sh::IsGLSL130OrNewer(outputLanguage)); >+ } >+} >+ >+const TFunction *EmulatePrecision::getInternalFunction(const ImmutableString &functionName, >+ const TType &returnType, >+ TIntermSequence *arguments, >+ const TVector<const TVariable *> ¶meters, >+ bool knownToNotHaveSideEffects) >+{ >+ ImmutableString mangledName = TFunctionLookup::GetMangledName(functionName.data(), *arguments); >+ if (mInternalFunctions.find(mangledName) == mInternalFunctions.end()) >+ { >+ TFunction *func = new TFunction(mSymbolTable, functionName, SymbolType::AngleInternal, >+ new TType(returnType), knownToNotHaveSideEffects); >+ ASSERT(parameters.size() == arguments->size()); >+ for (size_t i = 0; i < parameters.size(); ++i) >+ { >+ func->addParameter(parameters[i]); >+ } >+ mInternalFunctions[mangledName] = func; >+ } >+ return mInternalFunctions[mangledName]; >+} >+ >+TIntermAggregate *EmulatePrecision::createRoundingFunctionCallNode(TIntermTyped *roundedChild) >+{ >+ const ImmutableString *roundFunctionName = &kAngleFrmString; >+ if (roundedChild->getPrecision() == EbpLow) >+ roundFunctionName = &kAngleFrlString; >+ TIntermSequence *arguments = new TIntermSequence(); >+ arguments->push_back(roundedChild); >+ >+ TVector<const TVariable *> parameters; >+ TType *paramType = new TType(roundedChild->getType()); >+ paramType->setPrecision(EbpHigh); >+ paramType->setQualifier(EvqIn); >+ parameters.push_back(new TVariable(mSymbolTable, kParamXName, >+ static_cast<const TType *>(paramType), >+ SymbolType::AngleInternal)); >+ >+ return TIntermAggregate::CreateRawFunctionCall( >+ *getInternalFunction(*roundFunctionName, roundedChild->getType(), arguments, parameters, >+ true), >+ arguments); >+} >+ >+TIntermAggregate *EmulatePrecision::createCompoundAssignmentFunctionCallNode(TIntermTyped *left, >+ TIntermTyped *right, >+ const char *opNameStr) >+{ >+ std::stringstream strstr = sh::InitializeStream<std::stringstream>(); >+ if (left->getPrecision() == EbpMedium) >+ strstr << "angle_compound_" << opNameStr << "_frm"; >+ else >+ strstr << "angle_compound_" << opNameStr << "_frl"; >+ ImmutableString functionName = ImmutableString(strstr.str()); >+ TIntermSequence *arguments = new TIntermSequence(); >+ arguments->push_back(left); >+ arguments->push_back(right); >+ >+ TVector<const TVariable *> parameters; >+ TType *leftParamType = new TType(left->getType()); >+ leftParamType->setPrecision(EbpHigh); >+ leftParamType->setQualifier(EvqOut); >+ parameters.push_back(new TVariable(mSymbolTable, kParamXName, >+ static_cast<const TType *>(leftParamType), >+ SymbolType::AngleInternal)); >+ TType *rightParamType = new TType(right->getType()); >+ rightParamType->setPrecision(EbpHigh); >+ rightParamType->setQualifier(EvqIn); >+ parameters.push_back(new TVariable(mSymbolTable, kParamYName, >+ static_cast<const TType *>(rightParamType), >+ SymbolType::AngleInternal)); >+ >+ return TIntermAggregate::CreateRawFunctionCall( >+ *getInternalFunction(functionName, left->getType(), arguments, parameters, false), >+ arguments); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulatePrecision.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulatePrecision.h >new file mode 100644 >index 00000000000..10501fa1d0b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/EmulatePrecision.h >@@ -0,0 +1,85 @@ >+// >+// Copyright (c) 2002-2014 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. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_EMULATE_PRECISION_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_EMULATE_PRECISION_H_ >+ >+#include "GLSLANG/ShaderLang.h" >+#include "common/angleutils.h" >+#include "compiler/translator/Compiler.h" >+#include "compiler/translator/InfoSink.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+// This class gathers all compound assignments from the AST and can then write >+// the functions required for their precision emulation. This way there is no >+// need to write a huge number of variations of the emulated compound assignment >+// to every translated shader with emulation enabled. >+ >+namespace sh >+{ >+ >+class EmulatePrecision : public TLValueTrackingTraverser >+{ >+ public: >+ EmulatePrecision(TSymbolTable *symbolTable); >+ >+ void visitSymbol(TIntermSymbol *node) override; >+ bool visitBinary(Visit visit, TIntermBinary *node) override; >+ bool visitUnary(Visit visit, TIntermUnary *node) override; >+ bool visitAggregate(Visit visit, TIntermAggregate *node) override; >+ bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) override; >+ bool visitDeclaration(Visit visit, TIntermDeclaration *node) override; >+ >+ void writeEmulationHelpers(TInfoSinkBase &sink, >+ const int shaderVersion, >+ const ShShaderOutput outputLanguage); >+ >+ static bool SupportedInLanguage(const ShShaderOutput outputLanguage); >+ >+ private: >+ struct TypePair >+ { >+ TypePair(const char *l, const char *r) : lType(l), rType(r) {} >+ >+ const char *lType; >+ const char *rType; >+ }; >+ >+ struct TypePairComparator >+ { >+ bool operator()(const TypePair &l, const TypePair &r) const >+ { >+ if (l.lType == r.lType) >+ return l.rType < r.rType; >+ return l.lType < r.lType; >+ } >+ }; >+ >+ const TFunction *getInternalFunction(const ImmutableString &functionName, >+ const TType &returnType, >+ TIntermSequence *arguments, >+ const TVector<const TVariable *> ¶meters, >+ bool knownToNotHaveSideEffects); >+ TIntermAggregate *createRoundingFunctionCallNode(TIntermTyped *roundedChild); >+ TIntermAggregate *createCompoundAssignmentFunctionCallNode(TIntermTyped *left, >+ TIntermTyped *right, >+ const char *opNameStr); >+ >+ typedef std::set<TypePair, TypePairComparator> EmulationSet; >+ EmulationSet mEmulateCompoundAdd; >+ EmulationSet mEmulateCompoundSub; >+ EmulationSet mEmulateCompoundMul; >+ EmulationSet mEmulateCompoundDiv; >+ >+ // Map from mangled name to function. >+ TMap<ImmutableString, const TFunction *> mInternalFunctions; >+ >+ bool mDeclaringVariables; >+}; >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_EMULATE_PRECISION_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ExpandIntegerPowExpressions.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ExpandIntegerPowExpressions.cpp >new file mode 100644 >index 00000000000..0dc7f03e0e1 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ExpandIntegerPowExpressions.cpp >@@ -0,0 +1,146 @@ >+// >+// Copyright (c) 2016 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. >+// >+// Implementation of the integer pow expressions HLSL bug workaround. >+// See header for more info. >+ >+#include "compiler/translator/tree_ops/ExpandIntegerPowExpressions.h" >+ >+#include <cmath> >+#include <cstdlib> >+ >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+class Traverser : public TIntermTraverser >+{ >+ public: >+ static void Apply(TIntermNode *root, TSymbolTable *symbolTable); >+ >+ private: >+ Traverser(TSymbolTable *symbolTable); >+ bool visitAggregate(Visit visit, TIntermAggregate *node) override; >+ void nextIteration(); >+ >+ bool mFound = false; >+}; >+ >+// static >+void Traverser::Apply(TIntermNode *root, TSymbolTable *symbolTable) >+{ >+ Traverser traverser(symbolTable); >+ do >+ { >+ traverser.nextIteration(); >+ root->traverse(&traverser); >+ if (traverser.mFound) >+ { >+ traverser.updateTree(); >+ } >+ } while (traverser.mFound); >+} >+ >+Traverser::Traverser(TSymbolTable *symbolTable) : TIntermTraverser(true, false, false, symbolTable) >+{} >+ >+void Traverser::nextIteration() >+{ >+ mFound = false; >+} >+ >+bool Traverser::visitAggregate(Visit visit, TIntermAggregate *node) >+{ >+ if (mFound) >+ { >+ return false; >+ } >+ >+ // Test 0: skip non-pow operators. >+ if (node->getOp() != EOpPow) >+ { >+ return true; >+ } >+ >+ const TIntermSequence *sequence = node->getSequence(); >+ ASSERT(sequence->size() == 2u); >+ const TIntermConstantUnion *constantExponent = sequence->at(1)->getAsConstantUnion(); >+ >+ // Test 1: check for a single constant. >+ if (!constantExponent || constantExponent->getNominalSize() != 1) >+ { >+ return true; >+ } >+ >+ ASSERT(constantExponent->getBasicType() == EbtFloat); >+ float exponentValue = constantExponent->getConstantValue()->getFConst(); >+ >+ // Test 2: exponentValue is in the problematic range. >+ if (exponentValue < -5.0f || exponentValue > 9.0f) >+ { >+ return true; >+ } >+ >+ // Test 3: exponentValue is integer or pretty close to an integer. >+ if (std::abs(exponentValue - std::round(exponentValue)) > 0.0001f) >+ { >+ return true; >+ } >+ >+ // Test 4: skip -1, 0, and 1 >+ int exponent = static_cast<int>(std::round(exponentValue)); >+ int n = std::abs(exponent); >+ if (n < 2) >+ { >+ return true; >+ } >+ >+ // Potential problem case detected, apply workaround. >+ >+ TIntermTyped *lhs = sequence->at(0)->getAsTyped(); >+ ASSERT(lhs); >+ >+ TIntermDeclaration *lhsVariableDeclaration = nullptr; >+ TVariable *lhsVariable = >+ DeclareTempVariable(mSymbolTable, lhs, EvqTemporary, &lhsVariableDeclaration); >+ insertStatementInParentBlock(lhsVariableDeclaration); >+ >+ // Create a chain of n-1 multiples. >+ TIntermTyped *current = CreateTempSymbolNode(lhsVariable); >+ for (int i = 1; i < n; ++i) >+ { >+ TIntermBinary *mul = new TIntermBinary(EOpMul, current, CreateTempSymbolNode(lhsVariable)); >+ mul->setLine(node->getLine()); >+ current = mul; >+ } >+ >+ // For negative pow, compute the reciprocal of the positive pow. >+ if (exponent < 0) >+ { >+ TConstantUnion *oneVal = new TConstantUnion(); >+ oneVal->setFConst(1.0f); >+ TIntermConstantUnion *oneNode = new TIntermConstantUnion(oneVal, node->getType()); >+ TIntermBinary *div = new TIntermBinary(EOpDiv, oneNode, current); >+ current = div; >+ } >+ >+ queueReplacement(current, OriginalNode::IS_DROPPED); >+ mFound = true; >+ return false; >+} >+ >+} // anonymous namespace >+ >+void ExpandIntegerPowExpressions(TIntermNode *root, TSymbolTable *symbolTable) >+{ >+ Traverser::Apply(root, symbolTable); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ExpandIntegerPowExpressions.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ExpandIntegerPowExpressions.h >new file mode 100644 >index 00000000000..7ee5adab3ca >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ExpandIntegerPowExpressions.h >@@ -0,0 +1,29 @@ >+// >+// Copyright (c) 2016 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 mutating tree traversal works around a bug in the HLSL compiler optimizer with "pow" that >+// manifests under the following conditions: >+// >+// - If pow() has a literal exponent value >+// - ... and this value is integer or within 10e-6 of an integer >+// - ... and it is in {-4, -3, -2, 2, 3, 4, 5, 6, 7, 8} >+// >+// The workaround is to replace the pow with a series of multiplies. >+// See http://anglebug.com/851 >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_EXPANDINTEGERPOWEXPRESSIONS_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_EXPANDINTEGERPOWEXPRESSIONS_H_ >+ >+namespace sh >+{ >+ >+class TIntermNode; >+class TSymbolTable; >+ >+void ExpandIntegerPowExpressions(TIntermNode *root, TSymbolTable *symbolTable); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_EXPANDINTEGERPOWEXPRESSIONS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/FoldExpressions.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/FoldExpressions.cpp >new file mode 100644 >index 00000000000..5d57e1e7163 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/FoldExpressions.cpp >@@ -0,0 +1,115 @@ >+// >+// Copyright (c) 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. >+// >+// FoldExpressions.cpp: Fold expressions. This may fold expressions so that the qualifier of the >+// folded node differs from the qualifier of the original expression, so it needs to be done after >+// parsing and validation of qualifiers is complete. Expressions that are folded: >+// 1. Ternary ops with a constant condition. >+// 2. Sequence aka comma ops where the left side has no side effects. >+// 3. Any expressions containing any of the above. >+ >+#include "compiler/translator/tree_ops/FoldExpressions.h" >+ >+#include "compiler/translator/Diagnostics.h" >+#include "compiler/translator/IntermNode.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+class FoldExpressionsTraverser : public TIntermTraverser >+{ >+ public: >+ FoldExpressionsTraverser(TDiagnostics *diagnostics) >+ : TIntermTraverser(true, false, false), mDiagnostics(diagnostics), mDidReplace(false) >+ {} >+ >+ bool didReplace() { return mDidReplace; } >+ >+ void nextIteration() { mDidReplace = false; } >+ >+ protected: >+ bool visitTernary(Visit visit, TIntermTernary *node) override >+ { >+ TIntermTyped *folded = node->fold(mDiagnostics); >+ if (folded != node) >+ { >+ queueReplacement(folded, OriginalNode::IS_DROPPED); >+ mDidReplace = true; >+ return false; >+ } >+ return true; >+ } >+ >+ bool visitAggregate(Visit visit, TIntermAggregate *node) override >+ { >+ TIntermTyped *folded = node->fold(mDiagnostics); >+ if (folded != node) >+ { >+ queueReplacement(folded, OriginalNode::IS_DROPPED); >+ mDidReplace = true; >+ return false; >+ } >+ return true; >+ } >+ >+ bool visitBinary(Visit visit, TIntermBinary *node) override >+ { >+ TIntermTyped *folded = node->fold(mDiagnostics); >+ if (folded != node) >+ { >+ queueReplacement(folded, OriginalNode::IS_DROPPED); >+ mDidReplace = true; >+ return false; >+ } >+ return true; >+ } >+ >+ bool visitUnary(Visit visit, TIntermUnary *node) override >+ { >+ TIntermTyped *folded = node->fold(mDiagnostics); >+ if (folded != node) >+ { >+ queueReplacement(folded, OriginalNode::IS_DROPPED); >+ mDidReplace = true; >+ return false; >+ } >+ return true; >+ } >+ >+ bool visitSwizzle(Visit visit, TIntermSwizzle *node) override >+ { >+ TIntermTyped *folded = node->fold(mDiagnostics); >+ if (folded != node) >+ { >+ queueReplacement(folded, OriginalNode::IS_DROPPED); >+ mDidReplace = true; >+ return false; >+ } >+ return true; >+ } >+ >+ private: >+ TDiagnostics *mDiagnostics; >+ bool mDidReplace; >+}; >+ >+} // anonymous namespace >+ >+void FoldExpressions(TIntermBlock *root, TDiagnostics *diagnostics) >+{ >+ FoldExpressionsTraverser traverser(diagnostics); >+ do >+ { >+ traverser.nextIteration(); >+ root->traverse(&traverser); >+ traverser.updateTree(); >+ } while (traverser.didReplace()); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/FoldExpressions.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/FoldExpressions.h >new file mode 100644 >index 00000000000..42d026afb85 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/FoldExpressions.h >@@ -0,0 +1,24 @@ >+// >+// Copyright (c) 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. >+// >+// FoldExpressions.h: Fold expressions. This may fold expressions so that the qualifier of the >+// folded node differs from the qualifier of the original expression, so it needs to be done after >+// parsing and validation of qualifiers is complete. Expressions that are folded: 1. Ternary ops >+// with a constant condition. >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_FOLDEXPRESSIONS_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_FOLDEXPRESSIONS_H_ >+ >+namespace sh >+{ >+ >+class TIntermBlock; >+class TDiagnostics; >+ >+void FoldExpressions(TIntermBlock *root, TDiagnostics *diagnostics); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_FOLDEXPRESSIONS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/InitializeVariables.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/InitializeVariables.cpp >new file mode 100644 >index 00000000000..21b0bed6581 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/InitializeVariables.cpp >@@ -0,0 +1,311 @@ >+// >+// Copyright (c) 2002-2013 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. >+// >+ >+#include "compiler/translator/tree_ops/InitializeVariables.h" >+ >+#include "angle_gl.h" >+#include "common/debug.h" >+#include "compiler/translator/StaticType.h" >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/FindMain.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+#include "compiler/translator/util.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+void AddArrayZeroInitSequence(const TIntermTyped *initializedNode, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported, >+ TIntermSequence *initSequenceOut, >+ TSymbolTable *symbolTable); >+ >+void AddStructZeroInitSequence(const TIntermTyped *initializedNode, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported, >+ TIntermSequence *initSequenceOut, >+ TSymbolTable *symbolTable); >+ >+TIntermBinary *CreateZeroInitAssignment(const TIntermTyped *initializedNode) >+{ >+ TIntermTyped *zero = CreateZeroNode(initializedNode->getType()); >+ return new TIntermBinary(EOpAssign, initializedNode->deepCopy(), zero); >+} >+ >+void AddZeroInitSequence(const TIntermTyped *initializedNode, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported, >+ TIntermSequence *initSequenceOut, >+ TSymbolTable *symbolTable) >+{ >+ if (initializedNode->isArray()) >+ { >+ AddArrayZeroInitSequence(initializedNode, canUseLoopsToInitialize, highPrecisionSupported, >+ initSequenceOut, symbolTable); >+ } >+ else if (initializedNode->getType().isStructureContainingArrays() || >+ initializedNode->getType().isNamelessStruct()) >+ { >+ AddStructZeroInitSequence(initializedNode, canUseLoopsToInitialize, highPrecisionSupported, >+ initSequenceOut, symbolTable); >+ } >+ else >+ { >+ initSequenceOut->push_back(CreateZeroInitAssignment(initializedNode)); >+ } >+} >+ >+void AddStructZeroInitSequence(const TIntermTyped *initializedNode, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported, >+ TIntermSequence *initSequenceOut, >+ TSymbolTable *symbolTable) >+{ >+ ASSERT(initializedNode->getBasicType() == EbtStruct); >+ const TStructure *structType = initializedNode->getType().getStruct(); >+ for (int i = 0; i < static_cast<int>(structType->fields().size()); ++i) >+ { >+ TIntermBinary *element = new TIntermBinary(EOpIndexDirectStruct, >+ initializedNode->deepCopy(), CreateIndexNode(i)); >+ // Structs can't be defined inside structs, so the type of a struct field can't be a >+ // nameless struct. >+ ASSERT(!element->getType().isNamelessStruct()); >+ AddZeroInitSequence(element, canUseLoopsToInitialize, highPrecisionSupported, >+ initSequenceOut, symbolTable); >+ } >+} >+ >+void AddArrayZeroInitStatementList(const TIntermTyped *initializedNode, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported, >+ TIntermSequence *initSequenceOut, >+ TSymbolTable *symbolTable) >+{ >+ for (unsigned int i = 0; i < initializedNode->getOutermostArraySize(); ++i) >+ { >+ TIntermBinary *element = >+ new TIntermBinary(EOpIndexDirect, initializedNode->deepCopy(), CreateIndexNode(i)); >+ AddZeroInitSequence(element, canUseLoopsToInitialize, highPrecisionSupported, >+ initSequenceOut, symbolTable); >+ } >+} >+ >+void AddArrayZeroInitForLoop(const TIntermTyped *initializedNode, >+ bool highPrecisionSupported, >+ TIntermSequence *initSequenceOut, >+ TSymbolTable *symbolTable) >+{ >+ ASSERT(initializedNode->isArray()); >+ const TType *mediumpIndexType = StaticType::Get<EbtInt, EbpMedium, EvqTemporary, 1, 1>(); >+ const TType *highpIndexType = StaticType::Get<EbtInt, EbpHigh, EvqTemporary, 1, 1>(); >+ TVariable *indexVariable = >+ CreateTempVariable(symbolTable, highPrecisionSupported ? highpIndexType : mediumpIndexType); >+ >+ TIntermSymbol *indexSymbolNode = CreateTempSymbolNode(indexVariable); >+ TIntermDeclaration *indexInit = >+ CreateTempInitDeclarationNode(indexVariable, CreateZeroNode(indexVariable->getType())); >+ TIntermConstantUnion *arraySizeNode = CreateIndexNode(initializedNode->getOutermostArraySize()); >+ TIntermBinary *indexSmallerThanSize = >+ new TIntermBinary(EOpLessThan, indexSymbolNode->deepCopy(), arraySizeNode); >+ TIntermUnary *indexIncrement = >+ new TIntermUnary(EOpPreIncrement, indexSymbolNode->deepCopy(), nullptr); >+ >+ TIntermBlock *forLoopBody = new TIntermBlock(); >+ TIntermSequence *forLoopBodySeq = forLoopBody->getSequence(); >+ >+ TIntermBinary *element = new TIntermBinary(EOpIndexIndirect, initializedNode->deepCopy(), >+ indexSymbolNode->deepCopy()); >+ AddZeroInitSequence(element, true, highPrecisionSupported, forLoopBodySeq, symbolTable); >+ >+ TIntermLoop *forLoop = >+ new TIntermLoop(ELoopFor, indexInit, indexSmallerThanSize, indexIncrement, forLoopBody); >+ initSequenceOut->push_back(forLoop); >+} >+ >+void AddArrayZeroInitSequence(const TIntermTyped *initializedNode, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported, >+ TIntermSequence *initSequenceOut, >+ TSymbolTable *symbolTable) >+{ >+ // The array elements are assigned one by one to keep the AST compatible with ESSL 1.00 which >+ // doesn't have array assignment. We'll do this either with a for loop or just a list of >+ // statements assigning to each array index. Note that it is important to have the array init in >+ // the right order to workaround http://crbug.com/709317 >+ bool isSmallArray = initializedNode->getOutermostArraySize() <= 1u || >+ (initializedNode->getBasicType() != EbtStruct && >+ !initializedNode->getType().isArrayOfArrays() && >+ initializedNode->getOutermostArraySize() <= 3u); >+ if (initializedNode->getQualifier() == EvqFragData || >+ initializedNode->getQualifier() == EvqFragmentOut || isSmallArray || >+ !canUseLoopsToInitialize) >+ { >+ // Fragment outputs should not be indexed by non-constant indices. >+ // Also it doesn't make sense to use loops to initialize very small arrays. >+ AddArrayZeroInitStatementList(initializedNode, canUseLoopsToInitialize, >+ highPrecisionSupported, initSequenceOut, symbolTable); >+ } >+ else >+ { >+ AddArrayZeroInitForLoop(initializedNode, highPrecisionSupported, initSequenceOut, >+ symbolTable); >+ } >+} >+ >+void InsertInitCode(TIntermSequence *mainBody, >+ const InitVariableList &variables, >+ TSymbolTable *symbolTable, >+ int shaderVersion, >+ const TExtensionBehavior &extensionBehavior, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported) >+{ >+ for (const auto &var : variables) >+ { >+ // Note that tempVariableName will reference a short-lived char array here - that's fine >+ // since we're only using it to find symbols. >+ ImmutableString tempVariableName(var.name.c_str(), var.name.length()); >+ >+ TIntermTyped *initializedSymbol = nullptr; >+ if (var.isBuiltIn()) >+ { >+ initializedSymbol = >+ ReferenceBuiltInVariable(tempVariableName, *symbolTable, shaderVersion); >+ if (initializedSymbol->getQualifier() == EvqFragData && >+ !IsExtensionEnabled(extensionBehavior, TExtension::EXT_draw_buffers)) >+ { >+ // If GL_EXT_draw_buffers is disabled, only the 0th index of gl_FragData can be >+ // written to. >+ // TODO(oetuaho): This is a bit hacky and would be better to remove, if we came up >+ // with a good way to do it. Right now "gl_FragData" in symbol table is initialized >+ // to have the array size of MaxDrawBuffers, and the initialization happens before >+ // the shader sets the extensions it is using. >+ initializedSymbol = >+ new TIntermBinary(EOpIndexDirect, initializedSymbol, CreateIndexNode(0)); >+ } >+ } >+ else >+ { >+ initializedSymbol = ReferenceGlobalVariable(tempVariableName, *symbolTable); >+ } >+ ASSERT(initializedSymbol != nullptr); >+ >+ TIntermSequence *initCode = CreateInitCode(initializedSymbol, canUseLoopsToInitialize, >+ highPrecisionSupported, symbolTable); >+ mainBody->insert(mainBody->begin(), initCode->begin(), initCode->end()); >+ } >+} >+ >+class InitializeLocalsTraverser : public TIntermTraverser >+{ >+ public: >+ InitializeLocalsTraverser(int shaderVersion, >+ TSymbolTable *symbolTable, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported) >+ : TIntermTraverser(true, false, false, symbolTable), >+ mShaderVersion(shaderVersion), >+ mCanUseLoopsToInitialize(canUseLoopsToInitialize), >+ mHighPrecisionSupported(highPrecisionSupported) >+ {} >+ >+ protected: >+ bool visitDeclaration(Visit visit, TIntermDeclaration *node) override >+ { >+ for (TIntermNode *declarator : *node->getSequence()) >+ { >+ if (!mInGlobalScope && !declarator->getAsBinaryNode()) >+ { >+ TIntermSymbol *symbol = declarator->getAsSymbolNode(); >+ ASSERT(symbol); >+ if (symbol->variable().symbolType() == SymbolType::Empty) >+ { >+ continue; >+ } >+ >+ // Arrays may need to be initialized one element at a time, since ESSL 1.00 does not >+ // support array constructors or assigning arrays. >+ bool arrayConstructorUnavailable = >+ (symbol->isArray() || symbol->getType().isStructureContainingArrays()) && >+ mShaderVersion == 100; >+ // Nameless struct constructors can't be referred to, so they also need to be >+ // initialized one element at a time. >+ // TODO(oetuaho): Check if it makes sense to initialize using a loop, even if we >+ // could use an initializer. It could at least reduce code size for very large >+ // arrays, but could hurt runtime performance. >+ if (arrayConstructorUnavailable || symbol->getType().isNamelessStruct()) >+ { >+ // SimplifyLoopConditions should have been run so the parent node of this node >+ // should not be a loop. >+ ASSERT(getParentNode()->getAsLoopNode() == nullptr); >+ // SeparateDeclarations should have already been run, so we don't need to worry >+ // about further declarators in this declaration depending on the effects of >+ // this declarator. >+ ASSERT(node->getSequence()->size() == 1); >+ insertStatementsInParentBlock( >+ TIntermSequence(), *CreateInitCode(symbol, mCanUseLoopsToInitialize, >+ mHighPrecisionSupported, mSymbolTable)); >+ } >+ else >+ { >+ TIntermBinary *init = >+ new TIntermBinary(EOpInitialize, symbol, CreateZeroNode(symbol->getType())); >+ queueReplacementWithParent(node, symbol, init, OriginalNode::BECOMES_CHILD); >+ } >+ } >+ } >+ return false; >+ } >+ >+ private: >+ int mShaderVersion; >+ bool mCanUseLoopsToInitialize; >+ bool mHighPrecisionSupported; >+}; >+ >+} // namespace >+ >+TIntermSequence *CreateInitCode(const TIntermTyped *initializedSymbol, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported, >+ TSymbolTable *symbolTable) >+{ >+ TIntermSequence *initCode = new TIntermSequence(); >+ AddZeroInitSequence(initializedSymbol, canUseLoopsToInitialize, highPrecisionSupported, >+ initCode, symbolTable); >+ return initCode; >+} >+ >+void InitializeUninitializedLocals(TIntermBlock *root, >+ int shaderVersion, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported, >+ TSymbolTable *symbolTable) >+{ >+ InitializeLocalsTraverser traverser(shaderVersion, symbolTable, canUseLoopsToInitialize, >+ highPrecisionSupported); >+ root->traverse(&traverser); >+ traverser.updateTree(); >+} >+ >+void InitializeVariables(TIntermBlock *root, >+ const InitVariableList &vars, >+ TSymbolTable *symbolTable, >+ int shaderVersion, >+ const TExtensionBehavior &extensionBehavior, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported) >+{ >+ TIntermBlock *body = FindMainBody(root); >+ InsertInitCode(body->getSequence(), vars, symbolTable, shaderVersion, extensionBehavior, >+ canUseLoopsToInitialize, highPrecisionSupported); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/InitializeVariables.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/InitializeVariables.h >new file mode 100644 >index 00000000000..06695f93c91 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/InitializeVariables.h >@@ -0,0 +1,56 @@ >+// >+// Copyright (c) 2002-2013 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. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_INITIALIZEVARIABLES_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_INITIALIZEVARIABLES_H_ >+ >+#include <GLSLANG/ShaderLang.h> >+ >+#include "compiler/translator/ExtensionBehavior.h" >+#include "compiler/translator/IntermNode.h" >+ >+namespace sh >+{ >+class TSymbolTable; >+ >+typedef std::vector<sh::ShaderVariable> InitVariableList; >+ >+// For all of the functions below: If canUseLoopsToInitialize is set, for loops are used instead of >+// a large number of initializers where it can make sense, such as for initializing large arrays. >+ >+// Return a sequence of assignment operations to initialize "initializedSymbol". initializedSymbol >+// may be an array, struct or any combination of these, as long as it contains only basic types. >+TIntermSequence *CreateInitCode(const TIntermTyped *initializedSymbol, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported, >+ TSymbolTable *symbolTable); >+ >+// Initialize all uninitialized local variables, so that undefined behavior is avoided. >+void InitializeUninitializedLocals(TIntermBlock *root, >+ int shaderVersion, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported, >+ TSymbolTable *symbolTable); >+ >+// This function can initialize all the types that CreateInitCode is able to initialize. All >+// variables must be globals which can be found in the symbol table. For now it is used for the >+// following two scenarios: >+// 1. Initializing gl_Position; >+// 2. Initializing output variables referred to in the shader source. >+// Note: The type of each lvalue in an initializer is retrieved from the symbol table. gl_FragData >+// requires special handling because the number of indices which can be initialized is determined by >+// enabled extensions. >+void InitializeVariables(TIntermBlock *root, >+ const InitVariableList &vars, >+ TSymbolTable *symbolTable, >+ int shaderVersion, >+ const TExtensionBehavior &extensionBehavior, >+ bool canUseLoopsToInitialize, >+ bool highPrecisionSupported); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_INITIALIZEVARIABLES_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/NameEmbeddedUniformStructs.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/NameEmbeddedUniformStructs.cpp >new file mode 100644 >index 00000000000..9c544491ec1 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/NameEmbeddedUniformStructs.cpp >@@ -0,0 +1,101 @@ >+// >+// 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. >+// >+// NameEmbeddedUniformStructs: Gives nameless uniform struct internal names. >+// >+ >+#include "compiler/translator/tree_ops/NameEmbeddedUniformStructs.h" >+ >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+namespace >+{ >+// This traverser translates embedded uniform structs into a specifier and declaration. >+// This makes the declarations easier to move into uniform blocks. >+class Traverser : public TIntermTraverser >+{ >+ public: >+ explicit Traverser(TSymbolTable *symbolTable) >+ : TIntermTraverser(true, false, false, symbolTable) >+ {} >+ >+ bool visitDeclaration(Visit visit, TIntermDeclaration *decl) override >+ { >+ ASSERT(visit == PreVisit); >+ >+ if (!mInGlobalScope) >+ { >+ return false; >+ } >+ >+ const TIntermSequence &sequence = *(decl->getSequence()); >+ ASSERT(sequence.size() == 1); >+ TIntermTyped *declarator = sequence.front()->getAsTyped(); >+ const TType &type = declarator->getType(); >+ >+ if (type.isStructSpecifier() && type.getQualifier() == EvqUniform) >+ { >+ const TStructure *structure = type.getStruct(); >+ >+ if (structure->symbolType() == SymbolType::Empty) >+ { >+ doReplacement(decl, declarator, structure); >+ } >+ } >+ >+ return false; >+ } >+ >+ private: >+ void doReplacement(TIntermDeclaration *decl, >+ TIntermTyped *declarator, >+ const TStructure *oldStructure) >+ { >+ // struct <structName> { ... }; >+ TStructure *structure = new TStructure(mSymbolTable, kEmptyImmutableString, >+ &oldStructure->fields(), SymbolType::AngleInternal); >+ TType *namedType = new TType(structure, true); >+ namedType->setQualifier(EvqGlobal); >+ >+ TVariable *structVariable = >+ new TVariable(mSymbolTable, kEmptyImmutableString, namedType, SymbolType::Empty); >+ TIntermSymbol *structDeclarator = new TIntermSymbol(structVariable); >+ TIntermDeclaration *structDeclaration = new TIntermDeclaration; >+ structDeclaration->appendDeclarator(structDeclarator); >+ >+ TIntermSequence *newSequence = new TIntermSequence; >+ newSequence->push_back(structDeclaration); >+ >+ // uniform <structName> <structUniformName>; >+ TIntermSymbol *asSymbol = declarator->getAsSymbolNode(); >+ if (asSymbol && asSymbol->variable().symbolType() != SymbolType::Empty) >+ { >+ TIntermDeclaration *namedDecl = new TIntermDeclaration; >+ TType *uniformType = new TType(structure, false); >+ uniformType->setQualifier(EvqUniform); >+ >+ TVariable *newVar = new TVariable(mSymbolTable, asSymbol->getName(), uniformType, >+ asSymbol->variable().symbolType()); >+ TIntermSymbol *newSymbol = new TIntermSymbol(newVar); >+ namedDecl->appendDeclarator(newSymbol); >+ >+ newSequence->push_back(namedDecl); >+ } >+ >+ mMultiReplacements.emplace_back(getParentNode()->getAsBlock(), decl, *newSequence); >+ } >+}; >+} // anonymous namespace >+ >+void NameEmbeddedStructUniforms(TIntermBlock *root, TSymbolTable *symbolTable) >+{ >+ Traverser nameStructs(symbolTable); >+ root->traverse(&nameStructs); >+ nameStructs.updateTree(); >+} >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/NameEmbeddedUniformStructs.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/NameEmbeddedUniformStructs.h >new file mode 100644 >index 00000000000..0ada1895012 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/NameEmbeddedUniformStructs.h >@@ -0,0 +1,25 @@ >+// >+// 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. >+// >+// NameEmbeddedUniformStructs: Gives nameless uniform struct internal names. >+// >+// For example: >+// uniform struct { int a; } uni; >+// becomes: >+// struct s1 { int a; }; >+// uniform s1 uni; >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_NAMEEMBEDDEDUNIFORMSTRUCTS_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_NAMEEMBEDDEDUNIFORMSTRUCTS_H_ >+ >+namespace sh >+{ >+class TIntermBlock; >+class TSymbolTable; >+void NameEmbeddedStructUniforms(TIntermBlock *root, TSymbolTable *symbolTable); >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_NAMEEMBEDDEDUNIFORMSTRUCTS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/PruneEmptyCases.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/PruneEmptyCases.cpp >new file mode 100644 >index 00000000000..7dd756ca2d9 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/PruneEmptyCases.cpp >@@ -0,0 +1,127 @@ >+// >+// Copyright (c) 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. >+// >+// PruneEmptyCases.cpp: The PruneEmptyCases function prunes cases that are followed by nothing from >+// the AST. >+ >+#include "compiler/translator/tree_ops/PruneEmptyCases.h" >+ >+#include "compiler/translator/Symbol.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+bool AreEmptyBlocks(TIntermSequence *statements); >+ >+bool IsEmptyBlock(TIntermNode *node) >+{ >+ TIntermBlock *asBlock = node->getAsBlock(); >+ if (asBlock) >+ { >+ return AreEmptyBlocks(asBlock->getSequence()); >+ } >+ // Empty declarations should have already been pruned, otherwise they would need to be handled >+ // here. Note that declarations for struct types do contain a nameless child node. >+ ASSERT(node->getAsDeclarationNode() == nullptr || >+ !node->getAsDeclarationNode()->getSequence()->empty()); >+ // Pure literal statements should also already be pruned. >+ ASSERT(node->getAsConstantUnion() == nullptr); >+ return false; >+} >+ >+// Return true if all statements in "statements" consist only of empty blocks and no-op statements. >+// Returns true also if there are no statements. >+bool AreEmptyBlocks(TIntermSequence *statements) >+{ >+ for (size_t i = 0u; i < statements->size(); ++i) >+ { >+ if (!IsEmptyBlock(statements->at(i))) >+ { >+ return false; >+ } >+ } >+ return true; >+} >+ >+class PruneEmptyCasesTraverser : private TIntermTraverser >+{ >+ public: >+ static void apply(TIntermBlock *root); >+ >+ private: >+ PruneEmptyCasesTraverser(); >+ bool visitSwitch(Visit visit, TIntermSwitch *node) override; >+}; >+ >+void PruneEmptyCasesTraverser::apply(TIntermBlock *root) >+{ >+ PruneEmptyCasesTraverser prune; >+ root->traverse(&prune); >+ prune.updateTree(); >+} >+ >+PruneEmptyCasesTraverser::PruneEmptyCasesTraverser() : TIntermTraverser(true, false, false) {} >+ >+bool PruneEmptyCasesTraverser::visitSwitch(Visit visit, TIntermSwitch *node) >+{ >+ // This may mutate the statementList, but that's okay, since traversal has not yet reached >+ // there. >+ TIntermBlock *statementList = node->getStatementList(); >+ TIntermSequence *statements = statementList->getSequence(); >+ >+ // Iterate block children in reverse order. Cases that are only followed by other cases or empty >+ // blocks are marked for pruning. >+ size_t i = statements->size(); >+ size_t lastNoOpInStatementList = i; >+ while (i > 0) >+ { >+ --i; >+ TIntermNode *statement = statements->at(i); >+ if (statement->getAsCaseNode() || IsEmptyBlock(statement)) >+ { >+ lastNoOpInStatementList = i; >+ } >+ else >+ { >+ break; >+ } >+ } >+ if (lastNoOpInStatementList == 0) >+ { >+ // Remove the entire switch statement, extracting the init expression if needed. >+ TIntermTyped *init = node->getInit(); >+ if (init->hasSideEffects()) >+ { >+ queueReplacement(init, OriginalNode::IS_DROPPED); >+ } >+ else >+ { >+ TIntermSequence emptyReplacement; >+ ASSERT(getParentNode()->getAsBlock()); >+ mMultiReplacements.push_back(NodeReplaceWithMultipleEntry(getParentNode()->getAsBlock(), >+ node, emptyReplacement)); >+ } >+ return false; >+ } >+ if (lastNoOpInStatementList < statements->size()) >+ { >+ statements->erase(statements->begin() + lastNoOpInStatementList, statements->end()); >+ } >+ >+ return true; >+} >+ >+} // namespace >+ >+void PruneEmptyCases(TIntermBlock *root) >+{ >+ PruneEmptyCasesTraverser::apply(root); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/PruneEmptyCases.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/PruneEmptyCases.h >new file mode 100644 >index 00000000000..0b88ac181c2 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/PruneEmptyCases.h >@@ -0,0 +1,19 @@ >+// >+// Copyright (c) 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. >+// >+// PruneEmptyCases.h: The PruneEmptyCases function prunes cases that are followed by nothing from >+// the AST. >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_PRUNEEMPTYCASES_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_PRUNEEMPTYCASES_H_ >+ >+namespace sh >+{ >+class TIntermBlock; >+ >+void PruneEmptyCases(TIntermBlock *root); >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_PRUNEEMPTYCASES_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/PruneNoOps.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/PruneNoOps.cpp >new file mode 100644 >index 00000000000..620c3f481b6 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/PruneNoOps.cpp >@@ -0,0 +1,166 @@ >+// >+// Copyright (c) 2002-2015 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. >+// >+// PruneNoOps.cpp: The PruneNoOps function prunes: >+// 1. Empty declarations "int;". Empty declarators will be pruned as well, so for example: >+// int , a; >+// is turned into >+// int a; >+// 2. Literal statements: "1.0;". The ESSL output doesn't define a default precision for float, >+// so float literal statements would end up with no precision which is invalid ESSL. >+ >+#include "compiler/translator/tree_ops/PruneNoOps.h" >+ >+#include "compiler/translator/Symbol.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+bool IsNoOp(TIntermNode *node) >+{ >+ if (node->getAsConstantUnion() != nullptr) >+ { >+ return true; >+ } >+ bool isEmptyDeclaration = node->getAsDeclarationNode() != nullptr && >+ node->getAsDeclarationNode()->getSequence()->empty(); >+ if (isEmptyDeclaration) >+ { >+ return true; >+ } >+ return false; >+} >+ >+class PruneNoOpsTraverser : private TIntermTraverser >+{ >+ public: >+ static void apply(TIntermBlock *root, TSymbolTable *symbolTable); >+ >+ private: >+ PruneNoOpsTraverser(TSymbolTable *symbolTable); >+ bool visitDeclaration(Visit, TIntermDeclaration *node) override; >+ bool visitBlock(Visit visit, TIntermBlock *node) override; >+ bool visitLoop(Visit visit, TIntermLoop *loop) override; >+}; >+ >+void PruneNoOpsTraverser::apply(TIntermBlock *root, TSymbolTable *symbolTable) >+{ >+ PruneNoOpsTraverser prune(symbolTable); >+ root->traverse(&prune); >+ prune.updateTree(); >+} >+ >+PruneNoOpsTraverser::PruneNoOpsTraverser(TSymbolTable *symbolTable) >+ : TIntermTraverser(true, false, false, symbolTable) >+{} >+ >+bool PruneNoOpsTraverser::visitDeclaration(Visit, TIntermDeclaration *node) >+{ >+ TIntermSequence *sequence = node->getSequence(); >+ if (sequence->size() >= 1) >+ { >+ TIntermSymbol *declaratorSymbol = sequence->front()->getAsSymbolNode(); >+ // Prune declarations without a variable name, unless it's an interface block declaration. >+ if (declaratorSymbol != nullptr && >+ declaratorSymbol->variable().symbolType() == SymbolType::Empty && >+ !declaratorSymbol->isInterfaceBlock()) >+ { >+ if (sequence->size() > 1) >+ { >+ // Generate a replacement that will remove the empty declarator in the beginning of >+ // a declarator list. Example of a declaration that will be changed: >+ // float, a; >+ // will be changed to >+ // float a; >+ // This applies also to struct declarations. >+ TIntermSequence emptyReplacement; >+ mMultiReplacements.push_back( >+ NodeReplaceWithMultipleEntry(node, declaratorSymbol, emptyReplacement)); >+ } >+ else if (declaratorSymbol->getBasicType() != EbtStruct) >+ { >+ // If there are entirely empty non-struct declarations, they result in >+ // TIntermDeclaration nodes without any children in the parsing stage. These are >+ // handled in visitBlock and visitLoop. >+ UNREACHABLE(); >+ } >+ else if (declaratorSymbol->getQualifier() != EvqGlobal && >+ declaratorSymbol->getQualifier() != EvqTemporary) >+ { >+ // Single struct declarations may just declare the struct type and no variables, so >+ // they should not be pruned. Here we handle an empty struct declaration with a >+ // qualifier, for example like this: >+ // const struct a { int i; }; >+ // NVIDIA GL driver version 367.27 doesn't accept this kind of declarations, so we >+ // convert the declaration to a regular struct declaration. This is okay, since ESSL >+ // 1.00 spec section 4.1.8 says about structs that "The optional qualifiers only >+ // apply to any declarators, and are not part of the type being defined for name." >+ >+ // Create a new variable to use in the declarator so that the variable and node >+ // types are kept consistent. >+ TType *type = new TType(declaratorSymbol->getType()); >+ if (mInGlobalScope) >+ { >+ type->setQualifier(EvqGlobal); >+ } >+ else >+ { >+ type->setQualifier(EvqTemporary); >+ } >+ TVariable *variable = >+ new TVariable(mSymbolTable, kEmptyImmutableString, type, SymbolType::Empty); >+ queueReplacementWithParent(node, declaratorSymbol, new TIntermSymbol(variable), >+ OriginalNode::IS_DROPPED); >+ } >+ } >+ } >+ return false; >+} >+ >+bool PruneNoOpsTraverser::visitBlock(Visit visit, TIntermBlock *node) >+{ >+ TIntermSequence *statements = node->getSequence(); >+ >+ for (TIntermNode *statement : *statements) >+ { >+ if (IsNoOp(statement)) >+ { >+ TIntermSequence emptyReplacement; >+ mMultiReplacements.push_back( >+ NodeReplaceWithMultipleEntry(node, statement, emptyReplacement)); >+ } >+ } >+ >+ return true; >+} >+ >+bool PruneNoOpsTraverser::visitLoop(Visit visit, TIntermLoop *loop) >+{ >+ TIntermTyped *expr = loop->getExpression(); >+ if (expr != nullptr && IsNoOp(expr)) >+ { >+ loop->setExpression(nullptr); >+ } >+ TIntermNode *init = loop->getInit(); >+ if (init != nullptr && IsNoOp(init)) >+ { >+ loop->setInit(nullptr); >+ } >+ >+ return true; >+} >+ >+} // namespace >+ >+void PruneNoOps(TIntermBlock *root, TSymbolTable *symbolTable) >+{ >+ PruneNoOpsTraverser::apply(root, symbolTable); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/PruneNoOps.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/PruneNoOps.h >new file mode 100644 >index 00000000000..83a6c665898 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/PruneNoOps.h >@@ -0,0 +1,25 @@ >+// >+// Copyright (c) 2002-2015 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. >+// >+// PruneNoOps.h: The PruneNoOps function prunes: >+// 1. Empty declarations "int;". Empty declarators will be pruned as well, so for example: >+// int , a; >+// is turned into >+// int a; >+// 2. Literal statements: "1.0;". The ESSL output doesn't define a default precision for float, >+// so float literal statements would end up with no precision which is invalid ESSL. >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_PRUNENOOPS_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_PRUNENOOPS_H_ >+ >+namespace sh >+{ >+class TIntermBlock; >+class TSymbolTable; >+ >+void PruneNoOps(TIntermBlock *root, TSymbolTable *symbolTable); >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_PRUNENOOPS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RecordConstantPrecision.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RecordConstantPrecision.cpp >new file mode 100644 >index 00000000000..9e7b0a03307 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RecordConstantPrecision.cpp >@@ -0,0 +1,167 @@ >+// >+// Copyright (c) 2002-2015 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. >+// >+// During parsing, all constant expressions are folded to constant union nodes. The expressions that >+// have been folded may have had precision qualifiers, which should affect the precision of the >+// consuming operation. If the folded constant union nodes are written to output as such they won't >+// have any precision qualifiers, and their effect on the precision of the consuming operation is >+// lost. >+// >+// RecordConstantPrecision is an AST traverser that inspects the precision qualifiers of constants >+// and hoists the constants outside the containing expression as precision qualified named variables >+// in case that is required for correct precision propagation. >+// >+ >+#include "compiler/translator/tree_ops/RecordConstantPrecision.h" >+ >+#include "compiler/translator/InfoSink.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+class RecordConstantPrecisionTraverser : public TIntermTraverser >+{ >+ public: >+ RecordConstantPrecisionTraverser(TSymbolTable *symbolTable); >+ >+ void visitConstantUnion(TIntermConstantUnion *node) override; >+ >+ void nextIteration(); >+ >+ bool foundHigherPrecisionConstant() const { return mFoundHigherPrecisionConstant; } >+ >+ protected: >+ bool operandAffectsParentOperationPrecision(TIntermTyped *operand); >+ >+ bool mFoundHigherPrecisionConstant; >+}; >+ >+RecordConstantPrecisionTraverser::RecordConstantPrecisionTraverser(TSymbolTable *symbolTable) >+ : TIntermTraverser(true, false, true, symbolTable), mFoundHigherPrecisionConstant(false) >+{} >+ >+bool RecordConstantPrecisionTraverser::operandAffectsParentOperationPrecision(TIntermTyped *operand) >+{ >+ if (getParentNode()->getAsCaseNode() || getParentNode()->getAsBlock()) >+ { >+ return false; >+ } >+ >+ const TIntermBinary *parentAsBinary = getParentNode()->getAsBinaryNode(); >+ if (parentAsBinary != nullptr) >+ { >+ // If the constant is assigned or is used to initialize a variable, or if it's an index, >+ // its precision has no effect. >+ switch (parentAsBinary->getOp()) >+ { >+ case EOpInitialize: >+ case EOpAssign: >+ case EOpIndexDirect: >+ case EOpIndexDirectStruct: >+ case EOpIndexDirectInterfaceBlock: >+ case EOpIndexIndirect: >+ return false; >+ default: >+ break; >+ } >+ >+ TIntermTyped *otherOperand = parentAsBinary->getRight(); >+ if (otherOperand == operand) >+ { >+ otherOperand = parentAsBinary->getLeft(); >+ } >+ // If the precision of the other child is at least as high as the precision of the constant, >+ // the precision of the constant has no effect. >+ if (otherOperand->getAsConstantUnion() == nullptr && >+ otherOperand->getPrecision() >= operand->getPrecision()) >+ { >+ return false; >+ } >+ } >+ >+ TIntermAggregate *parentAsAggregate = getParentNode()->getAsAggregate(); >+ if (parentAsAggregate != nullptr) >+ { >+ if (!parentAsAggregate->gotPrecisionFromChildren()) >+ { >+ // This can be either: >+ // * a call to an user-defined function >+ // * a call to a texture function >+ // * some other kind of aggregate >+ // In any of these cases the constant precision has no effect. >+ return false; >+ } >+ if (parentAsAggregate->isConstructor() && parentAsAggregate->getBasicType() == EbtBool) >+ { >+ return false; >+ } >+ // If the precision of operands does affect the result, but the precision of any of the >+ // other children has a precision that's at least as high as the precision of the constant, >+ // the precision of the constant has no effect. >+ TIntermSequence *parameters = parentAsAggregate->getSequence(); >+ for (TIntermNode *parameter : *parameters) >+ { >+ const TIntermTyped *typedParameter = parameter->getAsTyped(); >+ if (parameter != operand && typedParameter != nullptr && >+ parameter->getAsConstantUnion() == nullptr && >+ typedParameter->getPrecision() >= operand->getPrecision()) >+ { >+ return false; >+ } >+ } >+ } >+ return true; >+} >+ >+void RecordConstantPrecisionTraverser::visitConstantUnion(TIntermConstantUnion *node) >+{ >+ if (mFoundHigherPrecisionConstant) >+ return; >+ >+ // If the constant has lowp or undefined precision, it can't increase the precision of consuming >+ // operations. >+ if (node->getPrecision() < EbpMedium) >+ return; >+ >+ // It's possible the node has no effect on the precision of the consuming expression, depending >+ // on the consuming expression, and the precision of the other parameters of the expression. >+ if (!operandAffectsParentOperationPrecision(node)) >+ return; >+ >+ // Make the constant a precision-qualified named variable to make sure it affects the precision >+ // of the consuming expression. >+ TIntermDeclaration *variableDeclaration = nullptr; >+ TVariable *variable = DeclareTempVariable(mSymbolTable, node, EvqConst, &variableDeclaration); >+ insertStatementInParentBlock(variableDeclaration); >+ queueReplacement(CreateTempSymbolNode(variable), OriginalNode::IS_DROPPED); >+ mFoundHigherPrecisionConstant = true; >+} >+ >+void RecordConstantPrecisionTraverser::nextIteration() >+{ >+ mFoundHigherPrecisionConstant = false; >+} >+ >+} // namespace >+ >+void RecordConstantPrecision(TIntermNode *root, TSymbolTable *symbolTable) >+{ >+ RecordConstantPrecisionTraverser traverser(symbolTable); >+ // Iterate as necessary, and reset the traverser between iterations. >+ do >+ { >+ traverser.nextIteration(); >+ root->traverse(&traverser); >+ if (traverser.foundHigherPrecisionConstant()) >+ traverser.updateTree(); >+ } while (traverser.foundHigherPrecisionConstant()); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RecordConstantPrecision.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RecordConstantPrecision.h >new file mode 100644 >index 00000000000..5b15db5e48f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RecordConstantPrecision.h >@@ -0,0 +1,28 @@ >+// >+// Copyright (c) 2002-2015 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. >+// >+// During parsing, all constant expressions are folded to constant union nodes. The expressions that >+// have been folded may have had precision qualifiers, which should affect the precision of the >+// consuming operation. If the folded constant union nodes are written to output as such they won't >+// have any precision qualifiers, and their effect on the precision of the consuming operation is >+// lost. >+// >+// RecordConstantPrecision is an AST traverser that inspects the precision qualifiers of constants >+// and hoists the constants outside the containing expression as precision qualified named variables >+// in case that is required for correct precision propagation. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_RECORDCONSTANTPRECISION_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_RECORDCONSTANTPRECISION_H_ >+ >+namespace sh >+{ >+class TIntermNode; >+class TSymbolTable; >+ >+void RecordConstantPrecision(TIntermNode *root, TSymbolTable *symbolTable); >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_RECORDCONSTANTPRECISION_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RegenerateStructNames.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RegenerateStructNames.cpp >new file mode 100644 >index 00000000000..dd700246db2 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RegenerateStructNames.cpp >@@ -0,0 +1,87 @@ >+// >+// Copyright (c) 2002-2014 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. >+// >+ >+#include "compiler/translator/tree_ops/RegenerateStructNames.h" >+ >+#include "common/debug.h" >+#include "compiler/translator/ImmutableStringBuilder.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+constexpr const ImmutableString kPrefix("_webgl_struct_"); >+} // anonymous namespace >+ >+void RegenerateStructNames::visitSymbol(TIntermSymbol *symbol) >+{ >+ ASSERT(symbol); >+ const TType &type = symbol->getType(); >+ const TStructure *userType = type.getStruct(); >+ if (!userType) >+ return; >+ >+ if (userType->symbolType() == SymbolType::BuiltIn || >+ userType->symbolType() == SymbolType::Empty) >+ { >+ // Built-in struct or nameless struct, do not touch it. >+ return; >+ } >+ >+ int uniqueId = userType->uniqueId().get(); >+ >+ ASSERT(mScopeDepth > 0); >+ if (mScopeDepth == 1) >+ { >+ // If a struct is defined at global scope, we don't map its name. >+ // This is because at global level, the struct might be used to >+ // declare a uniform, so the same name needs to stay the same for >+ // vertex/fragment shaders. However, our mapping uses internal ID, >+ // which will be different for the same struct in vertex/fragment >+ // shaders. >+ // This is OK because names for any structs defined in other scopes >+ // will begin with "_webgl", which is reserved. So there will be >+ // no conflicts among unmapped struct names from global scope and >+ // mapped struct names from other scopes. >+ // However, we need to keep track of these global structs, so if a >+ // variable is used in a local scope, we don't try to modify the >+ // struct name through that variable. >+ mDeclaredGlobalStructs.insert(uniqueId); >+ return; >+ } >+ if (mDeclaredGlobalStructs.count(uniqueId) > 0) >+ return; >+ // Map {name} to _webgl_struct_{uniqueId}_{name}. >+ if (userType->name().beginsWith(kPrefix)) >+ { >+ // The name has already been regenerated. >+ return; >+ } >+ ImmutableStringBuilder tmp(kPrefix.length() + sizeof(uniqueId) * 2u + 1u + >+ userType->name().length()); >+ tmp << kPrefix; >+ tmp.appendHex(uniqueId); >+ tmp << '_' << userType->name(); >+ >+ // TODO(oetuaho): Add another mechanism to change symbol names so that the const_cast is not >+ // needed. >+ const_cast<TStructure *>(userType)->setName(tmp); >+} >+ >+bool RegenerateStructNames::visitBlock(Visit, TIntermBlock *block) >+{ >+ ++mScopeDepth; >+ TIntermSequence &sequence = *(block->getSequence()); >+ for (TIntermNode *node : sequence) >+ { >+ node->traverse(this); >+ } >+ --mScopeDepth; >+ return false; >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RegenerateStructNames.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RegenerateStructNames.h >new file mode 100644 >index 00000000000..4c53cd50e8f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RegenerateStructNames.h >@@ -0,0 +1,40 @@ >+// >+// Copyright (c) 2002-2014 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. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_REGENERATESTRUCTNAMES_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_REGENERATESTRUCTNAMES_H_ >+ >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+#include <set> >+ >+namespace sh >+{ >+ >+class RegenerateStructNames : public TIntermTraverser >+{ >+ public: >+ RegenerateStructNames(TSymbolTable *symbolTable) >+ : TIntermTraverser(true, false, false, symbolTable), mScopeDepth(0) >+ {} >+ >+ protected: >+ void visitSymbol(TIntermSymbol *) override; >+ bool visitBlock(Visit, TIntermBlock *block) override; >+ >+ private: >+ // Indicating the depth of the current scope. >+ // The global scope is 1. >+ int mScopeDepth; >+ >+ // If a struct's declared globally, push its ID in this set. >+ std::set<int> mDeclaredGlobalStructs; >+}; >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_REGENERATESTRUCTNAMES_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveArrayLengthMethod.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveArrayLengthMethod.cpp >new file mode 100644 >index 00000000000..473159f89c6 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveArrayLengthMethod.cpp >@@ -0,0 +1,83 @@ >+// >+// Copyright (c) 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. >+// >+// RemoveArrayLengthMethod.cpp: >+// Fold array length expressions, including cases where the "this" node has side effects. >+// Example: >+// int i = (a = b).length(); >+// int j = (func()).length(); >+// becomes: >+// (a = b); >+// int i = <constant array length>; >+// func(); >+// int j = <constant array length>; >+// >+// Must be run after SplitSequenceOperator, SimplifyLoopConditions and SeparateDeclarations steps >+// have been done to expressions containing calls of the array length method. >+// >+// Does nothing to length method calls done on runtime-sized arrays. >+ >+#include "compiler/translator/tree_ops/RemoveArrayLengthMethod.h" >+ >+#include "compiler/translator/IntermNode.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+class RemoveArrayLengthTraverser : public TIntermTraverser >+{ >+ public: >+ RemoveArrayLengthTraverser() : TIntermTraverser(true, false, false), mFoundArrayLength(false) {} >+ >+ bool visitUnary(Visit visit, TIntermUnary *node) override; >+ >+ void nextIteration() { mFoundArrayLength = false; } >+ >+ bool foundArrayLength() const { return mFoundArrayLength; } >+ >+ private: >+ bool mFoundArrayLength; >+}; >+ >+bool RemoveArrayLengthTraverser::visitUnary(Visit visit, TIntermUnary *node) >+{ >+ // The only case where we leave array length() in place is for runtime-sized arrays. >+ if (node->getOp() == EOpArrayLength && !node->getOperand()->getType().isUnsizedArray()) >+ { >+ mFoundArrayLength = true; >+ if (!node->getOperand()->hasSideEffects()) >+ { >+ queueReplacement(node->fold(nullptr), OriginalNode::IS_DROPPED); >+ return false; >+ } >+ insertStatementInParentBlock(node->getOperand()->deepCopy()); >+ TConstantUnion *constArray = new TConstantUnion[1]; >+ constArray->setIConst(node->getOperand()->getOutermostArraySize()); >+ queueReplacement(new TIntermConstantUnion(constArray, node->getType()), >+ OriginalNode::IS_DROPPED); >+ return false; >+ } >+ return true; >+} >+ >+} // anonymous namespace >+ >+void RemoveArrayLengthMethod(TIntermBlock *root) >+{ >+ RemoveArrayLengthTraverser traverser; >+ do >+ { >+ traverser.nextIteration(); >+ root->traverse(&traverser); >+ if (traverser.foundArrayLength()) >+ traverser.updateTree(); >+ } while (traverser.foundArrayLength()); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveArrayLengthMethod.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveArrayLengthMethod.h >new file mode 100644 >index 00000000000..63768287498 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveArrayLengthMethod.h >@@ -0,0 +1,34 @@ >+// >+// Copyright (c) 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. >+// >+// RemoveArrayLengthMethod.h: >+// Fold array length expressions, including cases where the "this" node has side effects. >+// Example: >+// int i = (a = b).length(); >+// int j = (func()).length(); >+// becomes: >+// (a = b); >+// int i = <constant array length>; >+// func(); >+// int j = <constant array length>; >+// >+// Must be run after SplitSequenceOperator, SimplifyLoopConditions and SeparateDeclarations steps >+// have been done to expressions containing calls of the array length method. >+// >+// Does nothing to length method calls done on runtime-sized arrays. >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_REMOVEARRAYLENGTHMETHOD_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_REMOVEARRAYLENGTHMETHOD_H_ >+ >+namespace sh >+{ >+ >+class TIntermBlock; >+ >+void RemoveArrayLengthMethod(TIntermBlock *root); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_REMOVEARRAYLENGTHMETHOD_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp >new file mode 100644 >index 00000000000..879d29eba07 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp >@@ -0,0 +1,543 @@ >+// >+// Copyright (c) 2002-2015 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. >+// >+// RemoveDynamicIndexing is an AST traverser to remove dynamic indexing of non-SSBO vectors and >+// matrices, replacing them with calls to functions that choose which component to return or write. >+// We don't need to consider dynamic indexing in SSBO since it can be directly as part of the offset >+// of RWByteAddressBuffer. >+// >+ >+#include "compiler/translator/tree_ops/RemoveDynamicIndexing.h" >+ >+#include "compiler/translator/Diagnostics.h" >+#include "compiler/translator/InfoSink.h" >+#include "compiler/translator/StaticType.h" >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/IntermNodePatternMatcher.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+const TType *kIndexType = StaticType::Get<EbtInt, EbpHigh, EvqIn, 1, 1>(); >+ >+constexpr const ImmutableString kBaseName("base"); >+constexpr const ImmutableString kIndexName("index"); >+constexpr const ImmutableString kValueName("value"); >+ >+std::string GetIndexFunctionName(const TType &type, bool write) >+{ >+ TInfoSinkBase nameSink; >+ nameSink << "dyn_index_"; >+ if (write) >+ { >+ nameSink << "write_"; >+ } >+ if (type.isMatrix()) >+ { >+ nameSink << "mat" << type.getCols() << "x" << type.getRows(); >+ } >+ else >+ { >+ switch (type.getBasicType()) >+ { >+ case EbtInt: >+ nameSink << "ivec"; >+ break; >+ case EbtBool: >+ nameSink << "bvec"; >+ break; >+ case EbtUInt: >+ nameSink << "uvec"; >+ break; >+ case EbtFloat: >+ nameSink << "vec"; >+ break; >+ default: >+ UNREACHABLE(); >+ } >+ nameSink << type.getNominalSize(); >+ } >+ return nameSink.str(); >+} >+ >+TIntermConstantUnion *CreateIntConstantNode(int i) >+{ >+ TConstantUnion *constant = new TConstantUnion(); >+ constant->setIConst(i); >+ return new TIntermConstantUnion(constant, TType(EbtInt, EbpHigh)); >+} >+ >+TIntermTyped *EnsureSignedInt(TIntermTyped *node) >+{ >+ if (node->getBasicType() == EbtInt) >+ return node; >+ >+ TIntermSequence *arguments = new TIntermSequence(); >+ arguments->push_back(node); >+ return TIntermAggregate::CreateConstructor(TType(EbtInt), arguments); >+} >+ >+TType *GetFieldType(const TType &indexedType) >+{ >+ if (indexedType.isMatrix()) >+ { >+ TType *fieldType = new TType(indexedType.getBasicType(), indexedType.getPrecision()); >+ fieldType->setPrimarySize(static_cast<unsigned char>(indexedType.getRows())); >+ return fieldType; >+ } >+ else >+ { >+ return new TType(indexedType.getBasicType(), indexedType.getPrecision()); >+ } >+} >+ >+const TType *GetBaseType(const TType &type, bool write) >+{ >+ TType *baseType = new TType(type); >+ // Conservatively use highp here, even if the indexed type is not highp. That way the code can't >+ // end up using mediump version of an indexing function for a highp value, if both mediump and >+ // highp values are being indexed in the shader. For HLSL precision doesn't matter, but in >+ // principle this code could be used with multiple backends. >+ baseType->setPrecision(EbpHigh); >+ baseType->setQualifier(EvqInOut); >+ if (!write) >+ baseType->setQualifier(EvqIn); >+ return baseType; >+} >+ >+// Generate a read or write function for one field in a vector/matrix. >+// Out-of-range indices are clamped. This is consistent with how ANGLE handles out-of-range >+// indices in other places. >+// Note that indices can be either int or uint. We create only int versions of the functions, >+// and convert uint indices to int at the call site. >+// read function example: >+// float dyn_index_vec2(in vec2 base, in int index) >+// { >+// switch(index) >+// { >+// case (0): >+// return base[0]; >+// case (1): >+// return base[1]; >+// default: >+// break; >+// } >+// if (index < 0) >+// return base[0]; >+// return base[1]; >+// } >+// write function example: >+// void dyn_index_write_vec2(inout vec2 base, in int index, in float value) >+// { >+// switch(index) >+// { >+// case (0): >+// base[0] = value; >+// return; >+// case (1): >+// base[1] = value; >+// return; >+// default: >+// break; >+// } >+// if (index < 0) >+// { >+// base[0] = value; >+// return; >+// } >+// base[1] = value; >+// } >+// Note that else is not used in above functions to avoid the RewriteElseBlocks transformation. >+TIntermFunctionDefinition *GetIndexFunctionDefinition(const TType &type, >+ bool write, >+ const TFunction &func, >+ TSymbolTable *symbolTable) >+{ >+ ASSERT(!type.isArray()); >+ >+ int numCases = 0; >+ if (type.isMatrix()) >+ { >+ numCases = type.getCols(); >+ } >+ else >+ { >+ numCases = type.getNominalSize(); >+ } >+ >+ std::string functionName = GetIndexFunctionName(type, write); >+ TIntermFunctionPrototype *prototypeNode = CreateInternalFunctionPrototypeNode(func); >+ >+ TIntermSymbol *baseParam = new TIntermSymbol(func.getParam(0)); >+ TIntermSymbol *indexParam = new TIntermSymbol(func.getParam(1)); >+ TIntermSymbol *valueParam = nullptr; >+ if (write) >+ { >+ valueParam = new TIntermSymbol(func.getParam(2)); >+ } >+ >+ TIntermBlock *statementList = new TIntermBlock(); >+ for (int i = 0; i < numCases; ++i) >+ { >+ TIntermCase *caseNode = new TIntermCase(CreateIntConstantNode(i)); >+ statementList->getSequence()->push_back(caseNode); >+ >+ TIntermBinary *indexNode = >+ new TIntermBinary(EOpIndexDirect, baseParam->deepCopy(), CreateIndexNode(i)); >+ if (write) >+ { >+ TIntermBinary *assignNode = >+ new TIntermBinary(EOpAssign, indexNode, valueParam->deepCopy()); >+ statementList->getSequence()->push_back(assignNode); >+ TIntermBranch *returnNode = new TIntermBranch(EOpReturn, nullptr); >+ statementList->getSequence()->push_back(returnNode); >+ } >+ else >+ { >+ TIntermBranch *returnNode = new TIntermBranch(EOpReturn, indexNode); >+ statementList->getSequence()->push_back(returnNode); >+ } >+ } >+ >+ // Default case >+ TIntermCase *defaultNode = new TIntermCase(nullptr); >+ statementList->getSequence()->push_back(defaultNode); >+ TIntermBranch *breakNode = new TIntermBranch(EOpBreak, nullptr); >+ statementList->getSequence()->push_back(breakNode); >+ >+ TIntermSwitch *switchNode = new TIntermSwitch(indexParam->deepCopy(), statementList); >+ >+ TIntermBlock *bodyNode = new TIntermBlock(); >+ bodyNode->getSequence()->push_back(switchNode); >+ >+ TIntermBinary *cond = >+ new TIntermBinary(EOpLessThan, indexParam->deepCopy(), CreateIntConstantNode(0)); >+ >+ // Two blocks: one accesses (either reads or writes) the first element and returns, >+ // the other accesses the last element. >+ TIntermBlock *useFirstBlock = new TIntermBlock(); >+ TIntermBlock *useLastBlock = new TIntermBlock(); >+ TIntermBinary *indexFirstNode = >+ new TIntermBinary(EOpIndexDirect, baseParam->deepCopy(), CreateIndexNode(0)); >+ TIntermBinary *indexLastNode = >+ new TIntermBinary(EOpIndexDirect, baseParam->deepCopy(), CreateIndexNode(numCases - 1)); >+ if (write) >+ { >+ TIntermBinary *assignFirstNode = >+ new TIntermBinary(EOpAssign, indexFirstNode, valueParam->deepCopy()); >+ useFirstBlock->getSequence()->push_back(assignFirstNode); >+ TIntermBranch *returnNode = new TIntermBranch(EOpReturn, nullptr); >+ useFirstBlock->getSequence()->push_back(returnNode); >+ >+ TIntermBinary *assignLastNode = >+ new TIntermBinary(EOpAssign, indexLastNode, valueParam->deepCopy()); >+ useLastBlock->getSequence()->push_back(assignLastNode); >+ } >+ else >+ { >+ TIntermBranch *returnFirstNode = new TIntermBranch(EOpReturn, indexFirstNode); >+ useFirstBlock->getSequence()->push_back(returnFirstNode); >+ >+ TIntermBranch *returnLastNode = new TIntermBranch(EOpReturn, indexLastNode); >+ useLastBlock->getSequence()->push_back(returnLastNode); >+ } >+ TIntermIfElse *ifNode = new TIntermIfElse(cond, useFirstBlock, nullptr); >+ bodyNode->getSequence()->push_back(ifNode); >+ bodyNode->getSequence()->push_back(useLastBlock); >+ >+ TIntermFunctionDefinition *indexingFunction = >+ new TIntermFunctionDefinition(prototypeNode, bodyNode); >+ return indexingFunction; >+} >+ >+class RemoveDynamicIndexingTraverser : public TLValueTrackingTraverser >+{ >+ public: >+ RemoveDynamicIndexingTraverser(TSymbolTable *symbolTable, >+ PerformanceDiagnostics *perfDiagnostics); >+ >+ bool visitBinary(Visit visit, TIntermBinary *node) override; >+ >+ void insertHelperDefinitions(TIntermNode *root); >+ >+ void nextIteration(); >+ >+ bool usedTreeInsertion() const { return mUsedTreeInsertion; } >+ >+ protected: >+ // Maps of types that are indexed to the indexing function ids used for them. Note that these >+ // can not store multiple variants of the same type with different precisions - only one >+ // precision gets stored. >+ std::map<TType, TFunction *> mIndexedVecAndMatrixTypes; >+ std::map<TType, TFunction *> mWrittenVecAndMatrixTypes; >+ >+ bool mUsedTreeInsertion; >+ >+ // When true, the traverser will remove side effects from any indexing expression. >+ // This is done so that in code like >+ // V[j++][i]++. >+ // where V is an array of vectors, j++ will only be evaluated once. >+ bool mRemoveIndexSideEffectsInSubtree; >+ >+ PerformanceDiagnostics *mPerfDiagnostics; >+}; >+ >+RemoveDynamicIndexingTraverser::RemoveDynamicIndexingTraverser( >+ TSymbolTable *symbolTable, >+ PerformanceDiagnostics *perfDiagnostics) >+ : TLValueTrackingTraverser(true, false, false, symbolTable), >+ mUsedTreeInsertion(false), >+ mRemoveIndexSideEffectsInSubtree(false), >+ mPerfDiagnostics(perfDiagnostics) >+{} >+ >+void RemoveDynamicIndexingTraverser::insertHelperDefinitions(TIntermNode *root) >+{ >+ TIntermBlock *rootBlock = root->getAsBlock(); >+ ASSERT(rootBlock != nullptr); >+ TIntermSequence insertions; >+ for (auto &type : mIndexedVecAndMatrixTypes) >+ { >+ insertions.push_back( >+ GetIndexFunctionDefinition(type.first, false, *type.second, mSymbolTable)); >+ } >+ for (auto &type : mWrittenVecAndMatrixTypes) >+ { >+ insertions.push_back( >+ GetIndexFunctionDefinition(type.first, true, *type.second, mSymbolTable)); >+ } >+ rootBlock->insertChildNodes(0, insertions); >+} >+ >+// Create a call to dyn_index_*() based on an indirect indexing op node >+TIntermAggregate *CreateIndexFunctionCall(TIntermBinary *node, >+ TIntermTyped *index, >+ TFunction *indexingFunction) >+{ >+ ASSERT(node->getOp() == EOpIndexIndirect); >+ TIntermSequence *arguments = new TIntermSequence(); >+ arguments->push_back(node->getLeft()); >+ arguments->push_back(index); >+ >+ TIntermAggregate *indexingCall = >+ TIntermAggregate::CreateFunctionCall(*indexingFunction, arguments); >+ indexingCall->setLine(node->getLine()); >+ return indexingCall; >+} >+ >+TIntermAggregate *CreateIndexedWriteFunctionCall(TIntermBinary *node, >+ TVariable *index, >+ TVariable *writtenValue, >+ TFunction *indexedWriteFunction) >+{ >+ ASSERT(node->getOp() == EOpIndexIndirect); >+ TIntermSequence *arguments = new TIntermSequence(); >+ // Deep copy the child nodes so that two pointers to the same node don't end up in the tree. >+ arguments->push_back(node->getLeft()->deepCopy()); >+ arguments->push_back(CreateTempSymbolNode(index)); >+ arguments->push_back(CreateTempSymbolNode(writtenValue)); >+ >+ TIntermAggregate *indexedWriteCall = >+ TIntermAggregate::CreateFunctionCall(*indexedWriteFunction, arguments); >+ indexedWriteCall->setLine(node->getLine()); >+ return indexedWriteCall; >+} >+ >+bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *node) >+{ >+ if (mUsedTreeInsertion) >+ return false; >+ >+ if (node->getOp() == EOpIndexIndirect) >+ { >+ if (mRemoveIndexSideEffectsInSubtree) >+ { >+ ASSERT(node->getRight()->hasSideEffects()); >+ // In case we're just removing index side effects, convert >+ // v_expr[index_expr] >+ // to this: >+ // int s0 = index_expr; v_expr[s0]; >+ // Now v_expr[s0] can be safely executed several times without unintended side effects. >+ TIntermDeclaration *indexVariableDeclaration = nullptr; >+ TVariable *indexVariable = DeclareTempVariable(mSymbolTable, node->getRight(), >+ EvqTemporary, &indexVariableDeclaration); >+ insertStatementInParentBlock(indexVariableDeclaration); >+ mUsedTreeInsertion = true; >+ >+ // Replace the index with the temp variable >+ TIntermSymbol *tempIndex = CreateTempSymbolNode(indexVariable); >+ queueReplacementWithParent(node, node->getRight(), tempIndex, OriginalNode::IS_DROPPED); >+ } >+ else if (IntermNodePatternMatcher::IsDynamicIndexingOfNonSSBOVectorOrMatrix(node)) >+ { >+ mPerfDiagnostics->warning(node->getLine(), >+ "Performance: dynamic indexing of vectors and " >+ "matrices is emulated and can be slow.", >+ "[]"); >+ bool write = isLValueRequiredHere(); >+ >+#if defined(ANGLE_ENABLE_ASSERTS) >+ // Make sure that IntermNodePatternMatcher is consistent with the slightly differently >+ // implemented checks in this traverser. >+ IntermNodePatternMatcher matcher( >+ IntermNodePatternMatcher::kDynamicIndexingOfVectorOrMatrixInLValue); >+ ASSERT(matcher.match(node, getParentNode(), isLValueRequiredHere()) == write); >+#endif >+ >+ const TType &type = node->getLeft()->getType(); >+ ImmutableString indexingFunctionName(GetIndexFunctionName(type, false)); >+ TFunction *indexingFunction = nullptr; >+ if (mIndexedVecAndMatrixTypes.find(type) == mIndexedVecAndMatrixTypes.end()) >+ { >+ indexingFunction = >+ new TFunction(mSymbolTable, indexingFunctionName, SymbolType::AngleInternal, >+ GetFieldType(type), true); >+ indexingFunction->addParameter(new TVariable( >+ mSymbolTable, kBaseName, GetBaseType(type, false), SymbolType::AngleInternal)); >+ indexingFunction->addParameter( >+ new TVariable(mSymbolTable, kIndexName, kIndexType, SymbolType::AngleInternal)); >+ mIndexedVecAndMatrixTypes[type] = indexingFunction; >+ } >+ else >+ { >+ indexingFunction = mIndexedVecAndMatrixTypes[type]; >+ } >+ >+ if (write) >+ { >+ // Convert: >+ // v_expr[index_expr]++; >+ // to this: >+ // int s0 = index_expr; float s1 = dyn_index(v_expr, s0); s1++; >+ // dyn_index_write(v_expr, s0, s1); >+ // This works even if index_expr has some side effects. >+ if (node->getLeft()->hasSideEffects()) >+ { >+ // If v_expr has side effects, those need to be removed before proceeding. >+ // Otherwise the side effects of v_expr would be evaluated twice. >+ // The only case where an l-value can have side effects is when it is >+ // indexing. For example, it can be V[j++] where V is an array of vectors. >+ mRemoveIndexSideEffectsInSubtree = true; >+ return true; >+ } >+ >+ TIntermBinary *leftBinary = node->getLeft()->getAsBinaryNode(); >+ if (leftBinary != nullptr && >+ IntermNodePatternMatcher::IsDynamicIndexingOfNonSSBOVectorOrMatrix(leftBinary)) >+ { >+ // This is a case like: >+ // mat2 m; >+ // m[a][b]++; >+ // Process the child node m[a] first. >+ return true; >+ } >+ >+ // TODO(oetuaho@nvidia.com): This is not optimal if the expression using the value >+ // only writes it and doesn't need the previous value. http://anglebug.com/1116 >+ >+ TFunction *indexedWriteFunction = nullptr; >+ if (mWrittenVecAndMatrixTypes.find(type) == mWrittenVecAndMatrixTypes.end()) >+ { >+ ImmutableString functionName( >+ GetIndexFunctionName(node->getLeft()->getType(), true)); >+ indexedWriteFunction = >+ new TFunction(mSymbolTable, functionName, SymbolType::AngleInternal, >+ StaticType::GetBasic<EbtVoid>(), false); >+ indexedWriteFunction->addParameter(new TVariable(mSymbolTable, kBaseName, >+ GetBaseType(type, true), >+ SymbolType::AngleInternal)); >+ indexedWriteFunction->addParameter(new TVariable( >+ mSymbolTable, kIndexName, kIndexType, SymbolType::AngleInternal)); >+ TType *valueType = GetFieldType(type); >+ valueType->setQualifier(EvqIn); >+ indexedWriteFunction->addParameter(new TVariable( >+ mSymbolTable, kValueName, static_cast<const TType *>(valueType), >+ SymbolType::AngleInternal)); >+ mWrittenVecAndMatrixTypes[type] = indexedWriteFunction; >+ } >+ else >+ { >+ indexedWriteFunction = mWrittenVecAndMatrixTypes[type]; >+ } >+ >+ TIntermSequence insertionsBefore; >+ TIntermSequence insertionsAfter; >+ >+ // Store the index in a temporary signed int variable. >+ // s0 = index_expr; >+ TIntermTyped *indexInitializer = EnsureSignedInt(node->getRight()); >+ TIntermDeclaration *indexVariableDeclaration = nullptr; >+ TVariable *indexVariable = DeclareTempVariable( >+ mSymbolTable, indexInitializer, EvqTemporary, &indexVariableDeclaration); >+ insertionsBefore.push_back(indexVariableDeclaration); >+ >+ // s1 = dyn_index(v_expr, s0); >+ TIntermAggregate *indexingCall = CreateIndexFunctionCall( >+ node, CreateTempSymbolNode(indexVariable), indexingFunction); >+ TIntermDeclaration *fieldVariableDeclaration = nullptr; >+ TVariable *fieldVariable = DeclareTempVariable( >+ mSymbolTable, indexingCall, EvqTemporary, &fieldVariableDeclaration); >+ insertionsBefore.push_back(fieldVariableDeclaration); >+ >+ // dyn_index_write(v_expr, s0, s1); >+ TIntermAggregate *indexedWriteCall = CreateIndexedWriteFunctionCall( >+ node, indexVariable, fieldVariable, indexedWriteFunction); >+ insertionsAfter.push_back(indexedWriteCall); >+ insertStatementsInParentBlock(insertionsBefore, insertionsAfter); >+ >+ // replace the node with s1 >+ queueReplacement(CreateTempSymbolNode(fieldVariable), OriginalNode::IS_DROPPED); >+ mUsedTreeInsertion = true; >+ } >+ else >+ { >+ // The indexed value is not being written, so we can simply convert >+ // v_expr[index_expr] >+ // into >+ // dyn_index(v_expr, index_expr) >+ // If the index_expr is unsigned, we'll convert it to signed. >+ ASSERT(!mRemoveIndexSideEffectsInSubtree); >+ TIntermAggregate *indexingCall = CreateIndexFunctionCall( >+ node, EnsureSignedInt(node->getRight()), indexingFunction); >+ queueReplacement(indexingCall, OriginalNode::IS_DROPPED); >+ } >+ } >+ } >+ return !mUsedTreeInsertion; >+} >+ >+void RemoveDynamicIndexingTraverser::nextIteration() >+{ >+ mUsedTreeInsertion = false; >+ mRemoveIndexSideEffectsInSubtree = false; >+} >+ >+} // namespace >+ >+void RemoveDynamicIndexing(TIntermNode *root, >+ TSymbolTable *symbolTable, >+ PerformanceDiagnostics *perfDiagnostics) >+{ >+ RemoveDynamicIndexingTraverser traverser(symbolTable, perfDiagnostics); >+ do >+ { >+ traverser.nextIteration(); >+ root->traverse(&traverser); >+ traverser.updateTree(); >+ } while (traverser.usedTreeInsertion()); >+ // TODO(oetuaho@nvidia.com): It might be nicer to add the helper definitions also in the middle >+ // of traversal. Now the tree ends up in an inconsistent state in the middle, since there are >+ // function call nodes with no corresponding definition nodes. This needs special handling in >+ // TIntermLValueTrackingTraverser, and creates intricacies that are not easily apparent from a >+ // superficial reading of the code. >+ traverser.insertHelperDefinitions(root); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveDynamicIndexing.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveDynamicIndexing.h >new file mode 100644 >index 00000000000..500c88ed122 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveDynamicIndexing.h >@@ -0,0 +1,28 @@ >+// >+// Copyright (c) 2002-2015 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. >+// >+// RemoveDynamicIndexing is an AST traverser to remove dynamic indexing of non-SSBO vectors and >+// matrices, replacing them with calls to functions that choose which component to return or write. >+// We don't need to consider dynamic indexing in SSBO since it can be directly as part of the offset >+// of RWByteAddressBuffer. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_REMOVEDYNAMICINDEXING_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_REMOVEDYNAMICINDEXING_H_ >+ >+namespace sh >+{ >+ >+class TIntermNode; >+class TSymbolTable; >+class PerformanceDiagnostics; >+ >+void RemoveDynamicIndexing(TIntermNode *root, >+ TSymbolTable *symbolTable, >+ PerformanceDiagnostics *perfDiagnostics); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_REMOVEDYNAMICINDEXING_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveInvariantDeclaration.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveInvariantDeclaration.cpp >new file mode 100644 >index 00000000000..e40fe959299 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveInvariantDeclaration.cpp >@@ -0,0 +1,43 @@ >+// >+// Copyright (c) 2016 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. >+// >+ >+#include "compiler/translator/tree_ops/RemoveInvariantDeclaration.h" >+ >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+// An AST traverser that removes invariant declaration for input in fragment shader >+// when GLSL >= 4.20 and for output in vertex shader when GLSL < 4.2. >+class RemoveInvariantDeclarationTraverser : public TIntermTraverser >+{ >+ public: >+ RemoveInvariantDeclarationTraverser() : TIntermTraverser(true, false, false) {} >+ >+ private: >+ bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) override >+ { >+ TIntermSequence emptyReplacement; >+ mMultiReplacements.push_back( >+ NodeReplaceWithMultipleEntry(getParentNode()->getAsBlock(), node, emptyReplacement)); >+ return false; >+ } >+}; >+ >+} // anonymous namespace >+ >+void RemoveInvariantDeclaration(TIntermNode *root) >+{ >+ RemoveInvariantDeclarationTraverser traverser; >+ root->traverse(&traverser); >+ traverser.updateTree(); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveInvariantDeclaration.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveInvariantDeclaration.h >new file mode 100644 >index 00000000000..3281014ad07 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveInvariantDeclaration.h >@@ -0,0 +1,18 @@ >+// >+// Copyright (c) 2016 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. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_REMOVEINVARIANTDECLARATION_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_REMOVEINVARIANTDECLARATION_H_ >+ >+class TIntermNode; >+namespace sh >+{ >+ >+void RemoveInvariantDeclaration(TIntermNode *root); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_REMOVEINVARIANTDECLARATION_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemovePow.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemovePow.cpp >new file mode 100644 >index 00000000000..c270ff0f4ac >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemovePow.cpp >@@ -0,0 +1,101 @@ >+// >+// Copyright (c) 2002-2015 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. >+// >+// RemovePow is an AST traverser to convert pow(x, y) built-in calls where y is a >+// constant to exp2(y * log2(x)). This works around an issue in NVIDIA 311 series >+// OpenGL drivers. >+// >+ >+#include "compiler/translator/tree_ops/RemovePow.h" >+ >+#include "compiler/translator/InfoSink.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+bool IsProblematicPow(TIntermTyped *node) >+{ >+ TIntermAggregate *agg = node->getAsAggregate(); >+ if (agg != nullptr && agg->getOp() == EOpPow) >+ { >+ ASSERT(agg->getSequence()->size() == 2); >+ return agg->getSequence()->at(1)->getAsConstantUnion() != nullptr; >+ } >+ return false; >+} >+ >+// Traverser that converts all pow operations simultaneously. >+class RemovePowTraverser : public TIntermTraverser >+{ >+ public: >+ RemovePowTraverser(TSymbolTable *symbolTable); >+ >+ bool visitAggregate(Visit visit, TIntermAggregate *node) override; >+ >+ void nextIteration() { mNeedAnotherIteration = false; } >+ bool needAnotherIteration() const { return mNeedAnotherIteration; } >+ >+ protected: >+ bool mNeedAnotherIteration; >+}; >+ >+RemovePowTraverser::RemovePowTraverser(TSymbolTable *symbolTable) >+ : TIntermTraverser(true, false, false, symbolTable), mNeedAnotherIteration(false) >+{} >+ >+bool RemovePowTraverser::visitAggregate(Visit visit, TIntermAggregate *node) >+{ >+ if (IsProblematicPow(node)) >+ { >+ TIntermTyped *x = node->getSequence()->at(0)->getAsTyped(); >+ TIntermTyped *y = node->getSequence()->at(1)->getAsTyped(); >+ >+ TIntermSequence *logArgs = new TIntermSequence(); >+ logArgs->push_back(x); >+ TIntermTyped *log = CreateBuiltInFunctionCallNode("log2", logArgs, *mSymbolTable, 100); >+ log->setLine(node->getLine()); >+ >+ TOperator op = TIntermBinary::GetMulOpBasedOnOperands(y->getType(), log->getType()); >+ TIntermBinary *mul = new TIntermBinary(op, y, log); >+ mul->setLine(node->getLine()); >+ >+ TIntermSequence *expArgs = new TIntermSequence(); >+ expArgs->push_back(mul); >+ TIntermTyped *exp = CreateBuiltInFunctionCallNode("exp2", expArgs, *mSymbolTable, 100); >+ exp->setLine(node->getLine()); >+ >+ queueReplacement(exp, OriginalNode::IS_DROPPED); >+ >+ // If the x parameter also needs to be replaced, we need to do that in another traversal, >+ // since it's parent node will change in a way that's not handled correctly by updateTree(). >+ if (IsProblematicPow(x)) >+ { >+ mNeedAnotherIteration = true; >+ return false; >+ } >+ } >+ return true; >+} >+ >+} // namespace >+ >+void RemovePow(TIntermNode *root, TSymbolTable *symbolTable) >+{ >+ RemovePowTraverser traverser(symbolTable); >+ // Iterate as necessary, and reset the traverser between iterations. >+ do >+ { >+ traverser.nextIteration(); >+ root->traverse(&traverser); >+ traverser.updateTree(); >+ } while (traverser.needAnotherIteration()); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemovePow.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemovePow.h >new file mode 100644 >index 00000000000..bb0e990656c >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemovePow.h >@@ -0,0 +1,22 @@ >+// >+// Copyright (c) 2002-2015 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. >+// >+// RemovePow is an AST traverser to convert pow(x, y) built-in calls where y is a >+// constant to exp2(y * log2(x)). This works around an issue in NVIDIA 311 series >+// OpenGL drivers. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_REMOVEPOW_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_REMOVEPOW_H_ >+ >+namespace sh >+{ >+class TIntermNode; >+class TSymbolTable; >+ >+void RemovePow(TIntermNode *root, TSymbolTable *symbolTable); >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_REMOVEPOW_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveSwitchFallThrough.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveSwitchFallThrough.cpp >new file mode 100644 >index 00000000000..9af46770f86 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveSwitchFallThrough.cpp >@@ -0,0 +1,270 @@ >+// >+// Copyright (c) 2002-2015 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. >+// >+// RemoveSwitchFallThrough.cpp: Remove fall-through from switch statements. >+// Note that it is unsafe to do further AST transformations on the AST generated >+// by this function. It leaves duplicate nodes in the AST making replacements >+// unreliable. >+ >+#include "compiler/translator/tree_ops/RemoveSwitchFallThrough.h" >+ >+#include "compiler/translator/Diagnostics.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+class RemoveSwitchFallThroughTraverser : public TIntermTraverser >+{ >+ public: >+ static TIntermBlock *removeFallThrough(TIntermBlock *statementList, >+ PerformanceDiagnostics *perfDiagnostics); >+ >+ private: >+ RemoveSwitchFallThroughTraverser(TIntermBlock *statementList, >+ PerformanceDiagnostics *perfDiagnostics); >+ >+ void visitSymbol(TIntermSymbol *node) override; >+ void visitConstantUnion(TIntermConstantUnion *node) override; >+ bool visitDeclaration(Visit, TIntermDeclaration *node) override; >+ bool visitBinary(Visit, TIntermBinary *node) override; >+ bool visitUnary(Visit, TIntermUnary *node) override; >+ bool visitTernary(Visit visit, TIntermTernary *node) override; >+ bool visitSwizzle(Visit, TIntermSwizzle *node) override; >+ bool visitIfElse(Visit visit, TIntermIfElse *node) override; >+ bool visitSwitch(Visit, TIntermSwitch *node) override; >+ bool visitCase(Visit, TIntermCase *node) override; >+ bool visitAggregate(Visit, TIntermAggregate *node) override; >+ bool visitBlock(Visit, TIntermBlock *node) override; >+ bool visitLoop(Visit, TIntermLoop *node) override; >+ bool visitBranch(Visit, TIntermBranch *node) override; >+ >+ void outputSequence(TIntermSequence *sequence, size_t startIndex); >+ void handlePreviousCase(); >+ >+ TIntermBlock *mStatementList; >+ TIntermBlock *mStatementListOut; >+ bool mLastStatementWasBreak; >+ TIntermBlock *mPreviousCase; >+ std::vector<TIntermBlock *> mCasesSharingBreak; >+ PerformanceDiagnostics *mPerfDiagnostics; >+}; >+ >+TIntermBlock *RemoveSwitchFallThroughTraverser::removeFallThrough( >+ TIntermBlock *statementList, >+ PerformanceDiagnostics *perfDiagnostics) >+{ >+ RemoveSwitchFallThroughTraverser rm(statementList, perfDiagnostics); >+ ASSERT(statementList); >+ statementList->traverse(&rm); >+ ASSERT(rm.mPreviousCase || statementList->getSequence()->empty()); >+ if (!rm.mLastStatementWasBreak && rm.mPreviousCase) >+ { >+ // Make sure that there's a branch at the end of the final case inside the switch statement. >+ // This also ensures that any cases that fall through to the final case will get the break. >+ TIntermBranch *finalBreak = new TIntermBranch(EOpBreak, nullptr); >+ rm.mPreviousCase->getSequence()->push_back(finalBreak); >+ rm.mLastStatementWasBreak = true; >+ } >+ rm.handlePreviousCase(); >+ return rm.mStatementListOut; >+} >+ >+RemoveSwitchFallThroughTraverser::RemoveSwitchFallThroughTraverser( >+ TIntermBlock *statementList, >+ PerformanceDiagnostics *perfDiagnostics) >+ : TIntermTraverser(true, false, false), >+ mStatementList(statementList), >+ mLastStatementWasBreak(false), >+ mPreviousCase(nullptr), >+ mPerfDiagnostics(perfDiagnostics) >+{ >+ mStatementListOut = new TIntermBlock(); >+} >+ >+void RemoveSwitchFallThroughTraverser::visitSymbol(TIntermSymbol *node) >+{ >+ // Note that this assumes that switch statements which don't begin by a case statement >+ // have already been weeded out in validation. >+ mPreviousCase->getSequence()->push_back(node); >+ mLastStatementWasBreak = false; >+} >+ >+void RemoveSwitchFallThroughTraverser::visitConstantUnion(TIntermConstantUnion *node) >+{ >+ // Conditions of case labels are not traversed, so this is a constant statement like "0;". >+ // These are no-ops so there's no need to add them back to the statement list. Should have >+ // already been pruned out of the AST, in fact. >+ UNREACHABLE(); >+} >+ >+bool RemoveSwitchFallThroughTraverser::visitDeclaration(Visit, TIntermDeclaration *node) >+{ >+ mPreviousCase->getSequence()->push_back(node); >+ mLastStatementWasBreak = false; >+ return false; >+} >+ >+bool RemoveSwitchFallThroughTraverser::visitBinary(Visit, TIntermBinary *node) >+{ >+ mPreviousCase->getSequence()->push_back(node); >+ mLastStatementWasBreak = false; >+ return false; >+} >+ >+bool RemoveSwitchFallThroughTraverser::visitUnary(Visit, TIntermUnary *node) >+{ >+ mPreviousCase->getSequence()->push_back(node); >+ mLastStatementWasBreak = false; >+ return false; >+} >+ >+bool RemoveSwitchFallThroughTraverser::visitTernary(Visit, TIntermTernary *node) >+{ >+ mPreviousCase->getSequence()->push_back(node); >+ mLastStatementWasBreak = false; >+ return false; >+} >+ >+bool RemoveSwitchFallThroughTraverser::visitSwizzle(Visit, TIntermSwizzle *node) >+{ >+ mPreviousCase->getSequence()->push_back(node); >+ mLastStatementWasBreak = false; >+ return false; >+} >+ >+bool RemoveSwitchFallThroughTraverser::visitIfElse(Visit, TIntermIfElse *node) >+{ >+ mPreviousCase->getSequence()->push_back(node); >+ mLastStatementWasBreak = false; >+ return false; >+} >+ >+bool RemoveSwitchFallThroughTraverser::visitSwitch(Visit, TIntermSwitch *node) >+{ >+ mPreviousCase->getSequence()->push_back(node); >+ mLastStatementWasBreak = false; >+ // Don't go into nested switch statements >+ return false; >+} >+ >+void RemoveSwitchFallThroughTraverser::outputSequence(TIntermSequence *sequence, size_t startIndex) >+{ >+ for (size_t i = startIndex; i < sequence->size(); ++i) >+ { >+ mStatementListOut->getSequence()->push_back(sequence->at(i)); >+ } >+} >+ >+void RemoveSwitchFallThroughTraverser::handlePreviousCase() >+{ >+ if (mPreviousCase) >+ mCasesSharingBreak.push_back(mPreviousCase); >+ if (mLastStatementWasBreak) >+ { >+ for (size_t i = 0; i < mCasesSharingBreak.size(); ++i) >+ { >+ ASSERT(!mCasesSharingBreak.at(i)->getSequence()->empty()); >+ if (mCasesSharingBreak.at(i)->getSequence()->size() == 1) >+ { >+ // Fall-through is allowed in case the label has no statements. >+ outputSequence(mCasesSharingBreak.at(i)->getSequence(), 0); >+ } >+ else >+ { >+ // Include all the statements that this case can fall through under the same label. >+ if (mCasesSharingBreak.size() > i + 1u) >+ { >+ mPerfDiagnostics->warning(mCasesSharingBreak.at(i)->getLine(), >+ "Performance: non-empty fall-through cases in " >+ "switch statements generate extra code.", >+ "switch"); >+ } >+ for (size_t j = i; j < mCasesSharingBreak.size(); ++j) >+ { >+ size_t startIndex = >+ j > i ? 1 : 0; // Add the label only from the first sequence. >+ outputSequence(mCasesSharingBreak.at(j)->getSequence(), startIndex); >+ } >+ } >+ } >+ mCasesSharingBreak.clear(); >+ } >+ mLastStatementWasBreak = false; >+ mPreviousCase = nullptr; >+} >+ >+bool RemoveSwitchFallThroughTraverser::visitCase(Visit, TIntermCase *node) >+{ >+ handlePreviousCase(); >+ mPreviousCase = new TIntermBlock(); >+ mPreviousCase->getSequence()->push_back(node); >+ mPreviousCase->setLine(node->getLine()); >+ // Don't traverse the condition of the case statement >+ return false; >+} >+ >+bool RemoveSwitchFallThroughTraverser::visitAggregate(Visit, TIntermAggregate *node) >+{ >+ mPreviousCase->getSequence()->push_back(node); >+ mLastStatementWasBreak = false; >+ return false; >+} >+ >+bool DoesBlockAlwaysBreak(TIntermBlock *node) >+{ >+ if (node->getSequence()->empty()) >+ { >+ return false; >+ } >+ >+ TIntermBlock *lastStatementAsBlock = node->getSequence()->back()->getAsBlock(); >+ if (lastStatementAsBlock) >+ { >+ return DoesBlockAlwaysBreak(lastStatementAsBlock); >+ } >+ >+ TIntermBranch *lastStatementAsBranch = node->getSequence()->back()->getAsBranchNode(); >+ return lastStatementAsBranch != nullptr; >+} >+ >+bool RemoveSwitchFallThroughTraverser::visitBlock(Visit, TIntermBlock *node) >+{ >+ if (node != mStatementList) >+ { >+ mPreviousCase->getSequence()->push_back(node); >+ mLastStatementWasBreak = DoesBlockAlwaysBreak(node); >+ return false; >+ } >+ return true; >+} >+ >+bool RemoveSwitchFallThroughTraverser::visitLoop(Visit, TIntermLoop *node) >+{ >+ mPreviousCase->getSequence()->push_back(node); >+ mLastStatementWasBreak = false; >+ return false; >+} >+ >+bool RemoveSwitchFallThroughTraverser::visitBranch(Visit, TIntermBranch *node) >+{ >+ mPreviousCase->getSequence()->push_back(node); >+ // TODO: Verify that accepting return or continue statements here doesn't cause problems. >+ mLastStatementWasBreak = true; >+ return false; >+} >+ >+} // anonymous namespace >+ >+TIntermBlock *RemoveSwitchFallThrough(TIntermBlock *statementList, >+ PerformanceDiagnostics *perfDiagnostics) >+{ >+ return RemoveSwitchFallThroughTraverser::removeFallThrough(statementList, perfDiagnostics); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveSwitchFallThrough.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveSwitchFallThrough.h >new file mode 100644 >index 00000000000..58cad0c8567 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveSwitchFallThrough.h >@@ -0,0 +1,27 @@ >+// >+// Copyright (c) 2002-2015 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. >+// >+// RemoveSwitchFallThrough.h: Remove fall-through from switch statements. >+// Note that it is unsafe to do further AST transformations on the AST generated >+// by this function. It leaves duplicate nodes in the AST making replacements >+// unreliable. >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_REMOVESWITCHFALLTHROUGH_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_REMOVESWITCHFALLTHROUGH_H_ >+ >+namespace sh >+{ >+ >+class TIntermBlock; >+class PerformanceDiagnostics; >+ >+// When given a statementList from a switch AST node, return an updated >+// statementList that has fall-through removed. >+TIntermBlock *RemoveSwitchFallThrough(TIntermBlock *statementList, >+ PerformanceDiagnostics *perfDiagnostics); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_REMOVESWITCHFALLTHROUGH_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveUnreferencedVariables.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveUnreferencedVariables.cpp >new file mode 100644 >index 00000000000..28471a309d5 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveUnreferencedVariables.cpp >@@ -0,0 +1,371 @@ >+// >+// Copyright (c) 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. >+// >+// RemoveUnreferencedVariables.cpp: >+// Drop variables that are declared but never referenced in the AST. This avoids adding unnecessary >+// initialization code for them. Also removes unreferenced struct types. >+// >+ >+#include "compiler/translator/tree_ops/RemoveUnreferencedVariables.h" >+ >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+class CollectVariableRefCountsTraverser : public TIntermTraverser >+{ >+ public: >+ CollectVariableRefCountsTraverser(); >+ >+ using RefCountMap = std::unordered_map<int, unsigned int>; >+ RefCountMap &getSymbolIdRefCounts() { return mSymbolIdRefCounts; } >+ RefCountMap &getStructIdRefCounts() { return mStructIdRefCounts; } >+ >+ void visitSymbol(TIntermSymbol *node) override; >+ bool visitAggregate(Visit visit, TIntermAggregate *node) override; >+ void visitFunctionPrototype(TIntermFunctionPrototype *node) override; >+ >+ private: >+ void incrementStructTypeRefCount(const TType &type); >+ >+ RefCountMap mSymbolIdRefCounts; >+ >+ // Structure reference counts are counted from symbols, constructors, function calls, function >+ // return values and from interface block and structure fields. We need to track both function >+ // calls and function return values since there's a compiler option not to prune unused >+ // functions. The type of a constant union may also be a struct, but statements that are just a >+ // constant union are always pruned, and if the constant union is used somehow it will get >+ // counted by something else. >+ RefCountMap mStructIdRefCounts; >+}; >+ >+CollectVariableRefCountsTraverser::CollectVariableRefCountsTraverser() >+ : TIntermTraverser(true, false, false) >+{} >+ >+void CollectVariableRefCountsTraverser::incrementStructTypeRefCount(const TType &type) >+{ >+ if (type.isInterfaceBlock()) >+ { >+ const auto *block = type.getInterfaceBlock(); >+ ASSERT(block); >+ >+ // We can end up incrementing ref counts of struct types referenced from an interface block >+ // multiple times for the same block. This doesn't matter, because interface blocks can't be >+ // pruned so we'll never do the reverse operation. >+ for (const auto &field : block->fields()) >+ { >+ ASSERT(!field->type()->isInterfaceBlock()); >+ incrementStructTypeRefCount(*field->type()); >+ } >+ return; >+ } >+ >+ const auto *structure = type.getStruct(); >+ if (structure != nullptr) >+ { >+ auto structIter = mStructIdRefCounts.find(structure->uniqueId().get()); >+ if (structIter == mStructIdRefCounts.end()) >+ { >+ mStructIdRefCounts[structure->uniqueId().get()] = 1u; >+ >+ for (const auto &field : structure->fields()) >+ { >+ incrementStructTypeRefCount(*field->type()); >+ } >+ >+ return; >+ } >+ ++(structIter->second); >+ } >+} >+ >+void CollectVariableRefCountsTraverser::visitSymbol(TIntermSymbol *node) >+{ >+ incrementStructTypeRefCount(node->getType()); >+ >+ auto iter = mSymbolIdRefCounts.find(node->uniqueId().get()); >+ if (iter == mSymbolIdRefCounts.end()) >+ { >+ mSymbolIdRefCounts[node->uniqueId().get()] = 1u; >+ return; >+ } >+ ++(iter->second); >+} >+ >+bool CollectVariableRefCountsTraverser::visitAggregate(Visit visit, TIntermAggregate *node) >+{ >+ // This tracks struct references in both function calls and constructors. >+ incrementStructTypeRefCount(node->getType()); >+ return true; >+} >+ >+void CollectVariableRefCountsTraverser::visitFunctionPrototype(TIntermFunctionPrototype *node) >+{ >+ incrementStructTypeRefCount(node->getType()); >+ size_t paramCount = node->getFunction()->getParamCount(); >+ for (size_t i = 0; i < paramCount; ++i) >+ { >+ incrementStructTypeRefCount(node->getFunction()->getParam(i)->getType()); >+ } >+} >+ >+// Traverser that removes all unreferenced variables on one traversal. >+class RemoveUnreferencedVariablesTraverser : public TIntermTraverser >+{ >+ public: >+ RemoveUnreferencedVariablesTraverser( >+ CollectVariableRefCountsTraverser::RefCountMap *symbolIdRefCounts, >+ CollectVariableRefCountsTraverser::RefCountMap *structIdRefCounts, >+ TSymbolTable *symbolTable); >+ >+ bool visitDeclaration(Visit visit, TIntermDeclaration *node) override; >+ void visitSymbol(TIntermSymbol *node) override; >+ bool visitAggregate(Visit visit, TIntermAggregate *node) override; >+ >+ // Traverse loop and block nodes in reverse order. Note that this traverser does not track >+ // parent block positions, so insertStatementInParentBlock is unusable! >+ void traverseBlock(TIntermBlock *block) override; >+ void traverseLoop(TIntermLoop *loop) override; >+ >+ private: >+ void removeVariableDeclaration(TIntermDeclaration *node, TIntermTyped *declarator); >+ void decrementStructTypeRefCount(const TType &type); >+ >+ CollectVariableRefCountsTraverser::RefCountMap *mSymbolIdRefCounts; >+ CollectVariableRefCountsTraverser::RefCountMap *mStructIdRefCounts; >+ bool mRemoveReferences; >+}; >+ >+RemoveUnreferencedVariablesTraverser::RemoveUnreferencedVariablesTraverser( >+ CollectVariableRefCountsTraverser::RefCountMap *symbolIdRefCounts, >+ CollectVariableRefCountsTraverser::RefCountMap *structIdRefCounts, >+ TSymbolTable *symbolTable) >+ : TIntermTraverser(true, false, true, symbolTable), >+ mSymbolIdRefCounts(symbolIdRefCounts), >+ mStructIdRefCounts(structIdRefCounts), >+ mRemoveReferences(false) >+{} >+ >+void RemoveUnreferencedVariablesTraverser::decrementStructTypeRefCount(const TType &type) >+{ >+ auto *structure = type.getStruct(); >+ if (structure != nullptr) >+ { >+ ASSERT(mStructIdRefCounts->find(structure->uniqueId().get()) != mStructIdRefCounts->end()); >+ unsigned int structRefCount = --(*mStructIdRefCounts)[structure->uniqueId().get()]; >+ >+ if (structRefCount == 0) >+ { >+ for (const auto &field : structure->fields()) >+ { >+ decrementStructTypeRefCount(*field->type()); >+ } >+ } >+ } >+} >+ >+void RemoveUnreferencedVariablesTraverser::removeVariableDeclaration(TIntermDeclaration *node, >+ TIntermTyped *declarator) >+{ >+ if (declarator->getType().isStructSpecifier() && !declarator->getType().isNamelessStruct()) >+ { >+ unsigned int structId = declarator->getType().getStruct()->uniqueId().get(); >+ unsigned int structRefCountInThisDeclarator = 1u; >+ if (declarator->getAsBinaryNode() && >+ declarator->getAsBinaryNode()->getRight()->getAsAggregate()) >+ { >+ ASSERT(declarator->getAsBinaryNode()->getLeft()->getType().getStruct() == >+ declarator->getType().getStruct()); >+ ASSERT(declarator->getAsBinaryNode()->getRight()->getType().getStruct() == >+ declarator->getType().getStruct()); >+ structRefCountInThisDeclarator = 2u; >+ } >+ if ((*mStructIdRefCounts)[structId] > structRefCountInThisDeclarator) >+ { >+ // If this declaration declares a named struct type that is used elsewhere, we need to >+ // keep it. We can still change the declarator though so that it doesn't declare an >+ // unreferenced variable. >+ >+ // Note that since we're not removing the entire declaration, the struct's reference >+ // count will end up being one less than the correct refcount. But since the struct >+ // declaration is kept, the incorrect refcount can't cause any other problems. >+ >+ if (declarator->getAsSymbolNode() && >+ declarator->getAsSymbolNode()->variable().symbolType() == SymbolType::Empty) >+ { >+ // Already an empty declaration - nothing to do. >+ return; >+ } >+ TVariable *emptyVariable = >+ new TVariable(mSymbolTable, kEmptyImmutableString, new TType(declarator->getType()), >+ SymbolType::Empty); >+ queueReplacementWithParent(node, declarator, new TIntermSymbol(emptyVariable), >+ OriginalNode::IS_DROPPED); >+ return; >+ } >+ } >+ >+ if (getParentNode()->getAsBlock()) >+ { >+ TIntermSequence emptyReplacement; >+ mMultiReplacements.push_back( >+ NodeReplaceWithMultipleEntry(getParentNode()->getAsBlock(), node, emptyReplacement)); >+ } >+ else >+ { >+ ASSERT(getParentNode()->getAsLoopNode()); >+ queueReplacement(nullptr, OriginalNode::IS_DROPPED); >+ } >+} >+ >+bool RemoveUnreferencedVariablesTraverser::visitDeclaration(Visit visit, TIntermDeclaration *node) >+{ >+ if (visit == PreVisit) >+ { >+ // SeparateDeclarations should have already been run. >+ ASSERT(node->getSequence()->size() == 1u); >+ >+ TIntermTyped *declarator = node->getSequence()->back()->getAsTyped(); >+ ASSERT(declarator); >+ >+ // We can only remove variables that are not a part of the shader interface. >+ TQualifier qualifier = declarator->getQualifier(); >+ if (qualifier != EvqTemporary && qualifier != EvqGlobal && qualifier != EvqConst) >+ { >+ return true; >+ } >+ >+ bool canRemoveVariable = false; >+ TIntermSymbol *symbolNode = declarator->getAsSymbolNode(); >+ if (symbolNode != nullptr) >+ { >+ canRemoveVariable = (*mSymbolIdRefCounts)[symbolNode->uniqueId().get()] == 1u || >+ symbolNode->variable().symbolType() == SymbolType::Empty; >+ } >+ TIntermBinary *initNode = declarator->getAsBinaryNode(); >+ if (initNode != nullptr) >+ { >+ ASSERT(initNode->getLeft()->getAsSymbolNode()); >+ int symbolId = initNode->getLeft()->getAsSymbolNode()->uniqueId().get(); >+ canRemoveVariable = >+ (*mSymbolIdRefCounts)[symbolId] == 1u && !initNode->getRight()->hasSideEffects(); >+ } >+ >+ if (canRemoveVariable) >+ { >+ removeVariableDeclaration(node, declarator); >+ mRemoveReferences = true; >+ } >+ return true; >+ } >+ ASSERT(visit == PostVisit); >+ mRemoveReferences = false; >+ return true; >+} >+ >+void RemoveUnreferencedVariablesTraverser::visitSymbol(TIntermSymbol *node) >+{ >+ if (mRemoveReferences) >+ { >+ ASSERT(mSymbolIdRefCounts->find(node->uniqueId().get()) != mSymbolIdRefCounts->end()); >+ --(*mSymbolIdRefCounts)[node->uniqueId().get()]; >+ >+ decrementStructTypeRefCount(node->getType()); >+ } >+} >+ >+bool RemoveUnreferencedVariablesTraverser::visitAggregate(Visit visit, TIntermAggregate *node) >+{ >+ if (visit == PreVisit && mRemoveReferences) >+ { >+ decrementStructTypeRefCount(node->getType()); >+ } >+ return true; >+} >+ >+void RemoveUnreferencedVariablesTraverser::traverseBlock(TIntermBlock *node) >+{ >+ // We traverse blocks in reverse order. This way reference counts can be decremented when >+ // removing initializers, and variables that become unused when initializers are removed can be >+ // removed on the same traversal. >+ >+ ScopedNodeInTraversalPath addToPath(this, node); >+ >+ bool visit = true; >+ >+ TIntermSequence *sequence = node->getSequence(); >+ >+ if (preVisit) >+ visit = visitBlock(PreVisit, node); >+ >+ if (visit) >+ { >+ for (auto iter = sequence->rbegin(); iter != sequence->rend(); ++iter) >+ { >+ (*iter)->traverse(this); >+ if (visit && inVisit) >+ { >+ if ((iter + 1) != sequence->rend()) >+ visit = visitBlock(InVisit, node); >+ } >+ } >+ } >+ >+ if (visit && postVisit) >+ visitBlock(PostVisit, node); >+} >+ >+void RemoveUnreferencedVariablesTraverser::traverseLoop(TIntermLoop *node) >+{ >+ // We traverse loops in reverse order as well. The loop body gets traversed before the init >+ // node. >+ >+ ScopedNodeInTraversalPath addToPath(this, node); >+ >+ bool visit = true; >+ >+ if (preVisit) >+ visit = visitLoop(PreVisit, node); >+ >+ if (visit) >+ { >+ // We don't need to traverse loop expressions or conditions since they can't be declarations >+ // in the AST (loops which have a declaration in their condition get transformed in the >+ // parsing stage). >+ ASSERT(node->getExpression() == nullptr || >+ node->getExpression()->getAsDeclarationNode() == nullptr); >+ ASSERT(node->getCondition() == nullptr || >+ node->getCondition()->getAsDeclarationNode() == nullptr); >+ >+ if (node->getBody()) >+ node->getBody()->traverse(this); >+ >+ if (node->getInit()) >+ node->getInit()->traverse(this); >+ } >+ >+ if (visit && postVisit) >+ visitLoop(PostVisit, node); >+} >+ >+} // namespace >+ >+void RemoveUnreferencedVariables(TIntermBlock *root, TSymbolTable *symbolTable) >+{ >+ CollectVariableRefCountsTraverser collector; >+ root->traverse(&collector); >+ RemoveUnreferencedVariablesTraverser traverser(&collector.getSymbolIdRefCounts(), >+ &collector.getStructIdRefCounts(), symbolTable); >+ root->traverse(&traverser); >+ traverser.updateTree(); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveUnreferencedVariables.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveUnreferencedVariables.h >new file mode 100644 >index 00000000000..6888b2f2a0b >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveUnreferencedVariables.h >@@ -0,0 +1,24 @@ >+// >+// Copyright (c) 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. >+// >+// RemoveUnreferencedVariables.h: >+// Drop variables that are declared but never referenced in the AST. This avoids adding unnecessary >+// initialization code for them. Also removes unreferenced struct types. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_REMOVEUNREFERENCEDVARIABLES_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_REMOVEUNREFERENCEDVARIABLES_H_ >+ >+namespace sh >+{ >+ >+class TIntermBlock; >+class TSymbolTable; >+ >+void RemoveUnreferencedVariables(TIntermBlock *root, TSymbolTable *symbolTable); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_REMOVEUNREFERENCEDVARIABLES_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteAtomicFunctionExpressions.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteAtomicFunctionExpressions.cpp >new file mode 100644 >index 00000000000..f47e790b0ae >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteAtomicFunctionExpressions.cpp >@@ -0,0 +1,182 @@ >+// >+// Copyright (c) 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. >+// >+// Implementation of the function RewriteAtomicFunctionExpressions. >+// See the header for more details. >+ >+#include "RewriteAtomicFunctionExpressions.h" >+ >+#include "compiler/translator/tree_util/IntermNodePatternMatcher.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+#include "compiler/translator/util.h" >+ >+namespace sh >+{ >+namespace >+{ >+// Traverser that simplifies all the atomic function expressions into the ones that can be directly >+// translated into HLSL. >+// >+// case 1 (only for atomicExchange and atomicCompSwap): >+// original: >+// atomicExchange(counter, newValue); >+// new: >+// tempValue = atomicExchange(counter, newValue); >+// >+// case 2 (atomic function, temporary variable required): >+// original: >+// value = atomicAdd(counter, 1) * otherValue; >+// someArray[atomicAdd(counter, 1)] = someOtherValue; >+// new: >+// value = ((tempValue = atomicAdd(counter, 1)), tempValue) * otherValue; >+// someArray[((tempValue = atomicAdd(counter, 1)), tempValue)] = someOtherValue; >+// >+// case 3 (atomic function used directly initialize a variable): >+// original: >+// int value = atomicAdd(counter, 1); >+// new: >+// tempValue = atomicAdd(counter, 1); >+// int value = tempValue; >+// >+class RewriteAtomicFunctionExpressionsTraverser : public TIntermTraverser >+{ >+ public: >+ RewriteAtomicFunctionExpressionsTraverser(TSymbolTable *symbolTable, int shaderVersion); >+ >+ bool visitAggregate(Visit visit, TIntermAggregate *node) override; >+ bool visitBlock(Visit visit, TIntermBlock *node) override; >+ >+ private: >+ static bool IsAtomicExchangeOrCompSwapNoReturnValue(TIntermAggregate *node, >+ TIntermNode *parentNode); >+ static bool IsAtomicFunctionInsideExpression(TIntermAggregate *node, TIntermNode *parentNode); >+ >+ void rewriteAtomicFunctionCallNode(TIntermAggregate *oldAtomicFunctionNode); >+ >+ const TVariable *getTempVariable(const TType *type); >+ >+ int mShaderVersion; >+ TIntermSequence mTempVariables; >+}; >+ >+RewriteAtomicFunctionExpressionsTraverser::RewriteAtomicFunctionExpressionsTraverser( >+ TSymbolTable *symbolTable, >+ int shaderVersion) >+ : TIntermTraverser(false, false, true, symbolTable), mShaderVersion(shaderVersion) >+{} >+ >+void RewriteAtomicFunctionExpressionsTraverser::rewriteAtomicFunctionCallNode( >+ TIntermAggregate *oldAtomicFunctionNode) >+{ >+ ASSERT(oldAtomicFunctionNode); >+ >+ const TVariable *returnVariable = getTempVariable(&oldAtomicFunctionNode->getType()); >+ >+ TIntermBinary *rewrittenNode = new TIntermBinary( >+ TOperator::EOpAssign, CreateTempSymbolNode(returnVariable), oldAtomicFunctionNode); >+ >+ auto *parentNode = getParentNode(); >+ >+ auto *parentBinary = parentNode->getAsBinaryNode(); >+ if (parentBinary && parentBinary->getOp() == EOpInitialize) >+ { >+ insertStatementInParentBlock(rewrittenNode); >+ queueReplacement(CreateTempSymbolNode(returnVariable), OriginalNode::IS_DROPPED); >+ } >+ else >+ { >+ // As all atomic function assignment will be converted to the last argument of an >+ // interlocked function, if we need the return value, assignment needs to be wrapped with >+ // the comma operator and the temporary variables. >+ if (!parentNode->getAsBlock()) >+ { >+ rewrittenNode = TIntermBinary::CreateComma( >+ rewrittenNode, new TIntermSymbol(returnVariable), mShaderVersion); >+ } >+ >+ queueReplacement(rewrittenNode, OriginalNode::IS_DROPPED); >+ } >+} >+ >+const TVariable *RewriteAtomicFunctionExpressionsTraverser::getTempVariable(const TType *type) >+{ >+ TIntermDeclaration *variableDeclaration; >+ TVariable *returnVariable = >+ DeclareTempVariable(mSymbolTable, type, EvqTemporary, &variableDeclaration); >+ mTempVariables.push_back(variableDeclaration); >+ return returnVariable; >+} >+ >+bool RewriteAtomicFunctionExpressionsTraverser::IsAtomicExchangeOrCompSwapNoReturnValue( >+ TIntermAggregate *node, >+ TIntermNode *parentNode) >+{ >+ ASSERT(node); >+ return (node->getOp() == EOpAtomicExchange || node->getOp() == EOpAtomicCompSwap) && >+ parentNode && parentNode->getAsBlock(); >+} >+ >+bool RewriteAtomicFunctionExpressionsTraverser::IsAtomicFunctionInsideExpression( >+ TIntermAggregate *node, >+ TIntermNode *parentNode) >+{ >+ ASSERT(node); >+ // We only need to handle atomic functions with a parent that it is not block nodes. If the >+ // parent node is block, it means that the atomic function is not inside an expression. >+ if (!IsAtomicFunction(node->getOp()) || parentNode->getAsBlock()) >+ { >+ return false; >+ } >+ >+ auto *parentAsBinary = parentNode->getAsBinaryNode(); >+ // Assignments are handled in OutputHLSL >+ return !parentAsBinary || parentAsBinary->getOp() != EOpAssign; >+} >+ >+bool RewriteAtomicFunctionExpressionsTraverser::visitAggregate(Visit visit, TIntermAggregate *node) >+{ >+ ASSERT(visit == PostVisit); >+ // Skip atomic memory functions for SSBO. They will be processed in the OutputHLSL traverser. >+ if (IsAtomicFunction(node->getOp()) && >+ IsInShaderStorageBlock((*node->getSequence())[0]->getAsTyped())) >+ { >+ return false; >+ } >+ >+ TIntermNode *parentNode = getParentNode(); >+ if (IsAtomicExchangeOrCompSwapNoReturnValue(node, parentNode) || >+ IsAtomicFunctionInsideExpression(node, parentNode)) >+ { >+ rewriteAtomicFunctionCallNode(node); >+ } >+ >+ return true; >+} >+ >+bool RewriteAtomicFunctionExpressionsTraverser::visitBlock(Visit visit, TIntermBlock *node) >+{ >+ ASSERT(visit == PostVisit); >+ >+ if (!mTempVariables.empty() && getParentNode()->getAsFunctionDefinition()) >+ { >+ insertStatementsInBlockAtPosition(node, 0, mTempVariables, TIntermSequence()); >+ mTempVariables.clear(); >+ } >+ >+ return true; >+} >+ >+} // anonymous namespace >+ >+void RewriteAtomicFunctionExpressions(TIntermNode *root, >+ TSymbolTable *symbolTable, >+ int shaderVersion) >+{ >+ RewriteAtomicFunctionExpressionsTraverser traverser(symbolTable, shaderVersion); >+ traverser.traverse(root); >+ traverser.updateTree(); >+} >+} // namespace sh >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteAtomicFunctionExpressions.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteAtomicFunctionExpressions.h >new file mode 100644 >index 00000000000..a54440536e3 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteAtomicFunctionExpressions.h >@@ -0,0 +1,38 @@ >+// >+// Copyright (c) 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. >+// >+// RewriteAtomicFunctionExpressions rewrites the expressions that contain >+// atomic function calls and cannot be directly translated into HLSL into >+// several simple ones that can be easily handled in the HLSL translator. >+// >+// We need to rewite these expressions because: >+// 1. All GLSL atomic functions have return values, which all represent the >+// original value of the shared or ssbo variable; while all HLSL atomic >+// functions don't, and the original value can be stored in the last >+// parameter of the function call. >+// 2. For HLSL atomic functions, the last parameter that stores the original >+// value is optional except for InterlockedExchange and >+// InterlockedCompareExchange. Missing original_value in the call of >+// InterlockedExchange or InterlockedCompareExchange results in a compile >+// error from HLSL compiler. >+// >+// RewriteAtomicFunctionExpressions is a function that can modify the AST >+// to ensure all the expressions that contain atomic function calls can be >+// directly translated into HLSL expressions. >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_REWRITE_ATOMIC_FUNCTION_EXPRESSIONS_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_REWRITE_ATOMIC_FUNCTION_EXPRESSIONS_H_ >+ >+namespace sh >+{ >+class TIntermNode; >+class TSymbolTable; >+ >+void RewriteAtomicFunctionExpressions(TIntermNode *root, >+ TSymbolTable *symbolTable, >+ int shaderVersion); >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_REWRITE_ATOMIC_FUNCTION_EXPRESSIONS_H_ >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteDoWhile.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteDoWhile.cpp >new file mode 100644 >index 00000000000..7956322a5a6 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteDoWhile.cpp >@@ -0,0 +1,144 @@ >+// >+// Copyright (c) 2015 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. >+// >+ >+// RewriteDoWhile.cpp: rewrites do-while loops using another equivalent >+// construct. >+ >+#include "compiler/translator/tree_ops/RewriteDoWhile.h" >+ >+#include "compiler/translator/StaticType.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+// An AST traverser that rewrites loops of the form >+// do { >+// CODE; >+// } while (CONDITION) >+// >+// to loops of the form >+// bool temp = false; >+// while (true) { >+// if (temp) { >+// if (!CONDITION) { >+// break; >+// } >+// } >+// temp = true; >+// CODE; >+// } >+// >+// The reason we don't use a simpler form, with for example just (temp && !CONDITION) in the >+// while condition, is that short-circuit is often badly supported by driver shader compiler. >+// The double if has the same effect, but forces shader compilers to behave. >+// >+// TODO(cwallez) when UnfoldShortCircuitIntoIf handles loops correctly, revisit this as we might >+// be able to use while (temp || CONDITION) with temp initially set to true then run >+// UnfoldShortCircuitIntoIf >+class DoWhileRewriter : public TIntermTraverser >+{ >+ public: >+ DoWhileRewriter(TSymbolTable *symbolTable) : TIntermTraverser(true, false, false, symbolTable) >+ {} >+ >+ bool visitBlock(Visit, TIntermBlock *node) override >+ { >+ // A well-formed AST can only have do-while inside TIntermBlock. By doing a prefix traversal >+ // we are able to replace the do-while in the sequence directly as the content of the >+ // do-while will be traversed later. >+ >+ TIntermSequence *statements = node->getSequence(); >+ >+ // The statements vector will have new statements inserted when we encounter a do-while, >+ // which prevents us from using a range-based for loop. Using the usual i++ works, as >+ // the (two) new statements inserted replace the statement at the current position. >+ for (size_t i = 0; i < statements->size(); i++) >+ { >+ TIntermNode *statement = (*statements)[i]; >+ TIntermLoop *loop = statement->getAsLoopNode(); >+ >+ if (loop == nullptr || loop->getType() != ELoopDoWhile) >+ { >+ continue; >+ } >+ >+ // Found a loop to change. >+ const TType *boolType = StaticType::Get<EbtBool, EbpUndefined, EvqTemporary, 1, 1>(); >+ TVariable *conditionVariable = CreateTempVariable(mSymbolTable, boolType); >+ >+ // bool temp = false; >+ TIntermDeclaration *tempDeclaration = >+ CreateTempInitDeclarationNode(conditionVariable, CreateBoolNode(false)); >+ >+ // temp = true; >+ TIntermBinary *assignTrue = >+ CreateTempAssignmentNode(conditionVariable, CreateBoolNode(true)); >+ >+ // if (temp) { >+ // if (!CONDITION) { >+ // break; >+ // } >+ // } >+ TIntermIfElse *breakIf = nullptr; >+ { >+ TIntermBranch *breakStatement = new TIntermBranch(EOpBreak, nullptr); >+ >+ TIntermBlock *breakBlock = new TIntermBlock(); >+ breakBlock->getSequence()->push_back(breakStatement); >+ >+ TIntermUnary *negatedCondition = >+ new TIntermUnary(EOpLogicalNot, loop->getCondition(), nullptr); >+ >+ TIntermIfElse *innerIf = new TIntermIfElse(negatedCondition, breakBlock, nullptr); >+ >+ TIntermBlock *innerIfBlock = new TIntermBlock(); >+ innerIfBlock->getSequence()->push_back(innerIf); >+ >+ breakIf = new TIntermIfElse(CreateTempSymbolNode(conditionVariable), innerIfBlock, >+ nullptr); >+ } >+ >+ // Assemble the replacement loops, reusing the do-while loop's body and inserting our >+ // statements at the front. >+ TIntermLoop *newLoop = nullptr; >+ { >+ TIntermBlock *body = loop->getBody(); >+ if (body == nullptr) >+ { >+ body = new TIntermBlock(); >+ } >+ auto sequence = body->getSequence(); >+ sequence->insert(sequence->begin(), assignTrue); >+ sequence->insert(sequence->begin(), breakIf); >+ >+ newLoop = new TIntermLoop(ELoopWhile, nullptr, CreateBoolNode(true), nullptr, body); >+ } >+ >+ TIntermSequence replacement; >+ replacement.push_back(tempDeclaration); >+ replacement.push_back(newLoop); >+ >+ node->replaceChildNodeWithMultiple(loop, replacement); >+ } >+ return true; >+ } >+}; >+ >+} // anonymous namespace >+ >+void RewriteDoWhile(TIntermNode *root, TSymbolTable *symbolTable) >+{ >+ DoWhileRewriter rewriter(symbolTable); >+ >+ root->traverse(&rewriter); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteDoWhile.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteDoWhile.h >new file mode 100644 >index 00000000000..c91d7deb062 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteDoWhile.h >@@ -0,0 +1,23 @@ >+// >+// Copyright (c) 2015 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. >+// >+ >+// RewriteDoWhile.h: rewrite do-while loops as while loops to work around >+// driver bugs >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_REWRITEDOWHILE_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_REWRITEDOWHILE_H_ >+ >+namespace sh >+{ >+ >+class TIntermNode; >+class TSymbolTable; >+ >+void RewriteDoWhile(TIntermNode *root, TSymbolTable *symbolTable); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_REWRITEDOWHILE_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteElseBlocks.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteElseBlocks.cpp >new file mode 100644 >index 00000000000..701e29aa9de >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteElseBlocks.cpp >@@ -0,0 +1,120 @@ >+// >+// Copyright (c) 2014 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. >+// >+// RewriteElseBlocks.cpp: Implementation for tree transform to change >+// all if-else blocks to if-if blocks. >+// >+ >+#include "compiler/translator/tree_ops/RewriteElseBlocks.h" >+ >+#include "compiler/translator/IntermNode.h" >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/NodeSearch.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+class ElseBlockRewriter : public TIntermTraverser >+{ >+ public: >+ ElseBlockRewriter(TSymbolTable *symbolTable); >+ >+ protected: >+ bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *aggregate) override; >+ bool visitBlock(Visit visit, TIntermBlock *block) override; >+ >+ private: >+ TIntermNode *rewriteIfElse(TIntermIfElse *ifElse); >+ >+ const TType *mFunctionType; >+}; >+ >+ElseBlockRewriter::ElseBlockRewriter(TSymbolTable *symbolTable) >+ : TIntermTraverser(true, false, true, symbolTable), mFunctionType(nullptr) >+{} >+ >+bool ElseBlockRewriter::visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) >+{ >+ // Store the current function context (see comment below) >+ mFunctionType = ((visit == PreVisit) ? &node->getFunctionPrototype()->getType() : nullptr); >+ return true; >+} >+ >+bool ElseBlockRewriter::visitBlock(Visit visit, TIntermBlock *node) >+{ >+ if (visit == PostVisit) >+ { >+ for (size_t statementIndex = 0; statementIndex != node->getSequence()->size(); >+ statementIndex++) >+ { >+ TIntermNode *statement = (*node->getSequence())[statementIndex]; >+ TIntermIfElse *ifElse = statement->getAsIfElseNode(); >+ if (ifElse && ifElse->getFalseBlock() != nullptr) >+ { >+ (*node->getSequence())[statementIndex] = rewriteIfElse(ifElse); >+ } >+ } >+ } >+ return true; >+} >+ >+TIntermNode *ElseBlockRewriter::rewriteIfElse(TIntermIfElse *ifElse) >+{ >+ ASSERT(ifElse != nullptr); >+ >+ TIntermDeclaration *storeCondition = nullptr; >+ TVariable *conditionVariable = >+ DeclareTempVariable(mSymbolTable, ifElse->getCondition(), EvqTemporary, &storeCondition); >+ >+ TIntermBlock *falseBlock = nullptr; >+ >+ TType boolType(EbtBool, EbpUndefined, EvqTemporary); >+ >+ if (ifElse->getFalseBlock()) >+ { >+ TIntermBlock *negatedElse = nullptr; >+ // crbug.com/346463 >+ // D3D generates error messages claiming a function has no return value, when rewriting >+ // an if-else clause that returns something non-void in a function. By appending dummy >+ // returns (that are unreachable) we can silence this compile error. >+ if (mFunctionType && mFunctionType->getBasicType() != EbtVoid) >+ { >+ TIntermNode *returnNode = new TIntermBranch(EOpReturn, CreateZeroNode(*mFunctionType)); >+ negatedElse = new TIntermBlock(); >+ negatedElse->appendStatement(returnNode); >+ } >+ >+ TIntermSymbol *conditionSymbolElse = CreateTempSymbolNode(conditionVariable); >+ TIntermUnary *negatedCondition = >+ new TIntermUnary(EOpLogicalNot, conditionSymbolElse, nullptr); >+ TIntermIfElse *falseIfElse = >+ new TIntermIfElse(negatedCondition, ifElse->getFalseBlock(), negatedElse); >+ falseBlock = EnsureBlock(falseIfElse); >+ } >+ >+ TIntermSymbol *conditionSymbolSel = CreateTempSymbolNode(conditionVariable); >+ TIntermIfElse *newIfElse = >+ new TIntermIfElse(conditionSymbolSel, ifElse->getTrueBlock(), falseBlock); >+ >+ TIntermBlock *block = new TIntermBlock(); >+ block->getSequence()->push_back(storeCondition); >+ block->getSequence()->push_back(newIfElse); >+ >+ return block; >+} >+ >+} // anonymous namespace >+ >+void RewriteElseBlocks(TIntermNode *node, TSymbolTable *symbolTable) >+{ >+ ElseBlockRewriter rewriter(symbolTable); >+ node->traverse(&rewriter); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteElseBlocks.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteElseBlocks.h >new file mode 100644 >index 00000000000..3ae3b4a710f >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteElseBlocks.h >@@ -0,0 +1,22 @@ >+// >+// Copyright (c) 2014 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. >+// >+// RewriteElseBlocks.h: Prototype for tree transform to change >+// all if-else blocks to if-if blocks. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_REWRITEELSEBLOCKS_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_REWRITEELSEBLOCKS_H_ >+ >+namespace sh >+{ >+ >+class TIntermNode; >+class TSymbolTable; >+ >+void RewriteElseBlocks(TIntermNode *node, TSymbolTable *symbolTable); >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_REWRITEELSEBLOCKS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteExpressionsWithShaderStorageBlock.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteExpressionsWithShaderStorageBlock.cpp >new file mode 100644 >index 00000000000..9228f5b4ec7 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteExpressionsWithShaderStorageBlock.cpp >@@ -0,0 +1,411 @@ >+// >+// 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. >+// >+// RewriteExpressionsWithShaderStorageBlock rewrites the expressions that contain shader storage >+// block calls into several simple ones that can be easily handled in the HLSL translator. After the >+// AST pass, all ssbo related blocks will be like below: >+// ssbo_access_chain = ssbo_access_chain; >+// ssbo_access_chain = expr_no_ssbo; >+// lvalue_no_ssbo = ssbo_access_chain; >+// >+ >+#include "compiler/translator/tree_ops/RewriteExpressionsWithShaderStorageBlock.h" >+ >+#include "compiler/translator/Symbol.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+#include "compiler/translator/util.h" >+ >+namespace sh >+{ >+namespace >+{ >+ >+bool IsIncrementOrDecrementOperator(TOperator op) >+{ >+ switch (op) >+ { >+ case EOpPostIncrement: >+ case EOpPostDecrement: >+ case EOpPreIncrement: >+ case EOpPreDecrement: >+ return true; >+ default: >+ return false; >+ } >+} >+ >+bool IsCompoundAssignment(TOperator op) >+{ >+ switch (op) >+ { >+ case EOpAddAssign: >+ case EOpSubAssign: >+ case EOpMulAssign: >+ case EOpVectorTimesMatrixAssign: >+ case EOpVectorTimesScalarAssign: >+ case EOpMatrixTimesScalarAssign: >+ case EOpMatrixTimesMatrixAssign: >+ case EOpDivAssign: >+ case EOpIModAssign: >+ case EOpBitShiftLeftAssign: >+ case EOpBitShiftRightAssign: >+ case EOpBitwiseAndAssign: >+ case EOpBitwiseXorAssign: >+ case EOpBitwiseOrAssign: >+ return true; >+ default: >+ return false; >+ } >+} >+ >+// EOpIndexDirect, EOpIndexIndirect, EOpIndexDirectStruct, EOpIndexDirectInterfaceBlock belong to >+// operators in SSBO access chain. >+bool IsReadonlyBinaryOperatorNotInSSBOAccessChain(TOperator op) >+{ >+ switch (op) >+ { >+ case EOpComma: >+ case EOpAdd: >+ case EOpSub: >+ case EOpMul: >+ case EOpDiv: >+ case EOpIMod: >+ case EOpBitShiftLeft: >+ case EOpBitShiftRight: >+ case EOpBitwiseAnd: >+ case EOpBitwiseXor: >+ case EOpBitwiseOr: >+ case EOpEqual: >+ case EOpNotEqual: >+ case EOpLessThan: >+ case EOpGreaterThan: >+ case EOpLessThanEqual: >+ case EOpGreaterThanEqual: >+ case EOpVectorTimesScalar: >+ case EOpMatrixTimesScalar: >+ case EOpVectorTimesMatrix: >+ case EOpMatrixTimesVector: >+ case EOpMatrixTimesMatrix: >+ case EOpLogicalOr: >+ case EOpLogicalXor: >+ case EOpLogicalAnd: >+ return true; >+ default: >+ return false; >+ } >+} >+ >+bool HasSSBOAsFunctionArgument(TIntermSequence *arguments) >+{ >+ for (TIntermNode *arg : *arguments) >+ { >+ TIntermTyped *typedArg = arg->getAsTyped(); >+ if (IsInShaderStorageBlock(typedArg)) >+ { >+ return true; >+ } >+ } >+ return false; >+} >+ >+class RewriteExpressionsWithShaderStorageBlockTraverser : public TIntermTraverser >+{ >+ public: >+ RewriteExpressionsWithShaderStorageBlockTraverser(TSymbolTable *symbolTable); >+ void nextIteration(); >+ bool foundSSBO() const { return mFoundSSBO; } >+ >+ private: >+ bool visitBinary(Visit, TIntermBinary *node) override; >+ bool visitAggregate(Visit visit, TIntermAggregate *node) override; >+ bool visitUnary(Visit visit, TIntermUnary *node) override; >+ >+ TIntermSymbol *insertInitStatementAndReturnTempSymbol(TIntermTyped *node, >+ TIntermSequence *insertions); >+ >+ bool mFoundSSBO; >+}; >+ >+RewriteExpressionsWithShaderStorageBlockTraverser:: >+ RewriteExpressionsWithShaderStorageBlockTraverser(TSymbolTable *symbolTable) >+ : TIntermTraverser(true, true, false, symbolTable), mFoundSSBO(false) >+{} >+ >+TIntermSymbol * >+RewriteExpressionsWithShaderStorageBlockTraverser::insertInitStatementAndReturnTempSymbol( >+ TIntermTyped *node, >+ TIntermSequence *insertions) >+{ >+ TIntermDeclaration *variableDeclaration; >+ TVariable *tempVariable = >+ DeclareTempVariable(mSymbolTable, node, EvqTemporary, &variableDeclaration); >+ >+ insertions->push_back(variableDeclaration); >+ return CreateTempSymbolNode(tempVariable); >+} >+ >+bool RewriteExpressionsWithShaderStorageBlockTraverser::visitBinary(Visit visit, >+ TIntermBinary *node) >+{ >+ // Make sure that the expression is caculated from left to right. >+ if (visit != InVisit) >+ { >+ return true; >+ } >+ >+ if (mFoundSSBO) >+ { >+ return false; >+ } >+ >+ bool rightSSBO = IsInShaderStorageBlock(node->getRight()); >+ bool leftSSBO = IsInShaderStorageBlock(node->getLeft()); >+ if (!leftSSBO && !rightSSBO) >+ { >+ return true; >+ } >+ >+ // case 1: Compound assigment operator >+ // original: >+ // lssbo += expr; >+ // new: >+ // var rvalue = expr; >+ // var temp = lssbo; >+ // temp += rvalue; >+ // lssbo = temp; >+ // >+ // original: >+ // lvalue_no_ssbo += rssbo; >+ // new: >+ // var rvalue = rssbo; >+ // lvalue_no_ssbo += rvalue; >+ if (IsCompoundAssignment(node->getOp())) >+ { >+ mFoundSSBO = true; >+ TIntermSequence insertions; >+ TIntermTyped *rightNode = >+ insertInitStatementAndReturnTempSymbol(node->getRight(), &insertions); >+ if (leftSSBO) >+ { >+ TIntermSymbol *tempSymbol = >+ insertInitStatementAndReturnTempSymbol(node->getLeft()->deepCopy(), &insertions); >+ TIntermBinary *tempCompoundOperate = >+ new TIntermBinary(node->getOp(), tempSymbol->deepCopy(), rightNode->deepCopy()); >+ insertions.push_back(tempCompoundOperate); >+ insertStatementsInParentBlock(insertions); >+ >+ TIntermBinary *assignTempValueToSSBO = >+ new TIntermBinary(EOpAssign, node->getLeft(), tempSymbol->deepCopy()); >+ queueReplacement(assignTempValueToSSBO, OriginalNode::IS_DROPPED); >+ } >+ else >+ { >+ insertStatementsInParentBlock(insertions); >+ TIntermBinary *compoundAssignRValueToLValue = >+ new TIntermBinary(node->getOp(), node->getLeft(), rightNode->deepCopy()); >+ queueReplacement(compoundAssignRValueToLValue, OriginalNode::IS_DROPPED); >+ } >+ } >+ // case 2: Readonly binary operator >+ // original: >+ // ssbo0 + ssbo1 + ssbo2; >+ // new: >+ // var temp0 = ssbo0; >+ // var temp1 = ssbo1; >+ // var temp2 = ssbo2; >+ // temp0 + temp1 + temp2; >+ else if (IsReadonlyBinaryOperatorNotInSSBOAccessChain(node->getOp()) && (leftSSBO || rightSSBO)) >+ { >+ mFoundSSBO = true; >+ TIntermTyped *rightNode = node->getRight(); >+ TIntermTyped *leftNode = node->getLeft(); >+ TIntermSequence insertions; >+ if (rightSSBO) >+ { >+ rightNode = insertInitStatementAndReturnTempSymbol(node->getRight(), &insertions); >+ } >+ if (leftSSBO) >+ { >+ leftNode = insertInitStatementAndReturnTempSymbol(node->getLeft(), &insertions); >+ } >+ >+ insertStatementsInParentBlock(insertions); >+ TIntermBinary *newExpr = >+ new TIntermBinary(node->getOp(), leftNode->deepCopy(), rightNode->deepCopy()); >+ queueReplacement(newExpr, OriginalNode::IS_DROPPED); >+ } >+ return !mFoundSSBO; >+} >+ >+// case 3: ssbo as the argument of aggregate type >+// original: >+// foo(ssbo); >+// new: >+// var tempArg = ssbo; >+// foo(tempArg); >+// ssbo = tempArg; (Optional based on whether ssbo is an out|input argument) >+// >+// original: >+// foo(ssbo) * expr; >+// new: >+// var tempArg = ssbo; >+// var tempReturn = foo(tempArg); >+// ssbo = tempArg; (Optional based on whether ssbo is an out|input argument) >+// tempReturn * expr; >+bool RewriteExpressionsWithShaderStorageBlockTraverser::visitAggregate(Visit visit, >+ TIntermAggregate *node) >+{ >+ // Make sure that visitAggregate is only executed once for same node. >+ if (visit != PreVisit) >+ { >+ return true; >+ } >+ >+ if (mFoundSSBO) >+ { >+ return false; >+ } >+ >+ // We still need to process the ssbo as the non-first argument of atomic memory functions. >+ if (IsAtomicFunction(node->getOp()) && >+ IsInShaderStorageBlock((*node->getSequence())[0]->getAsTyped())) >+ { >+ return true; >+ } >+ >+ if (!HasSSBOAsFunctionArgument(node->getSequence())) >+ { >+ return true; >+ } >+ >+ mFoundSSBO = true; >+ TIntermSequence insertions; >+ TIntermSequence readBackToSSBOs; >+ TIntermSequence *originalArguments = node->getSequence(); >+ for (size_t i = 0; i < node->getChildCount(); ++i) >+ { >+ TIntermTyped *ssboArgument = (*originalArguments)[i]->getAsTyped(); >+ if (IsInShaderStorageBlock(ssboArgument)) >+ { >+ TIntermSymbol *argumentCopy = >+ insertInitStatementAndReturnTempSymbol(ssboArgument, &insertions); >+ if (node->getFunction() != nullptr) >+ { >+ TQualifier qual = node->getFunction()->getParam(i)->getType().getQualifier(); >+ if (qual == EvqInOut || qual == EvqOut) >+ { >+ TIntermBinary *readBackToSSBO = new TIntermBinary( >+ EOpAssign, ssboArgument->deepCopy(), argumentCopy->deepCopy()); >+ readBackToSSBOs.push_back(readBackToSSBO); >+ } >+ } >+ node->replaceChildNode(ssboArgument, argumentCopy); >+ } >+ } >+ >+ TIntermBlock *parentBlock = getParentNode()->getAsBlock(); >+ if (parentBlock) >+ { >+ // Aggregate node is as a single sentence. >+ insertions.push_back(node); >+ if (!readBackToSSBOs.empty()) >+ { >+ insertions.insert(insertions.end(), readBackToSSBOs.begin(), readBackToSSBOs.end()); >+ } >+ mMultiReplacements.push_back(NodeReplaceWithMultipleEntry(parentBlock, node, insertions)); >+ } >+ else >+ { >+ // Aggregate node is inside an expression. >+ TIntermSymbol *tempSymbol = insertInitStatementAndReturnTempSymbol(node, &insertions); >+ if (!readBackToSSBOs.empty()) >+ { >+ insertions.insert(insertions.end(), readBackToSSBOs.begin(), readBackToSSBOs.end()); >+ } >+ insertStatementsInParentBlock(insertions); >+ queueReplacement(tempSymbol->deepCopy(), OriginalNode::IS_DROPPED); >+ } >+ >+ return false; >+} >+ >+bool RewriteExpressionsWithShaderStorageBlockTraverser::visitUnary(Visit visit, TIntermUnary *node) >+{ >+ if (mFoundSSBO) >+ { >+ return false; >+ } >+ >+ if (!IsInShaderStorageBlock(node->getOperand())) >+ { >+ return true; >+ } >+ >+ // .length() is processed in OutputHLSL. >+ if (node->getOp() == EOpArrayLength) >+ { >+ return true; >+ } >+ >+ mFoundSSBO = true; >+ >+ // case 4: ssbo as the operand of ++/-- >+ // original: >+ // ++ssbo * expr; >+ // new: >+ // var temp1 = ssbo; >+ // var temp2 = ++temp1; >+ // ssbo = temp1; >+ // temp2 * expr; >+ if (IsIncrementOrDecrementOperator(node->getOp())) >+ { >+ TIntermSequence insertions; >+ TIntermSymbol *temp1 = >+ insertInitStatementAndReturnTempSymbol(node->getOperand(), &insertions); >+ TIntermUnary *newUnary = new TIntermUnary(node->getOp(), temp1->deepCopy(), nullptr); >+ TIntermSymbol *temp2 = insertInitStatementAndReturnTempSymbol(newUnary, &insertions); >+ TIntermBinary *readBackToSSBO = >+ new TIntermBinary(EOpAssign, node->getOperand()->deepCopy(), temp1->deepCopy()); >+ insertions.push_back(readBackToSSBO); >+ insertStatementsInParentBlock(insertions); >+ queueReplacement(temp2->deepCopy(), OriginalNode::IS_DROPPED); >+ } >+ // case 5: ssbo as the operand of readonly unary operator >+ // original: >+ // ~ssbo * expr; >+ // new: >+ // var temp = ssbo; >+ // ~temp * expr; >+ else >+ { >+ TIntermSequence insertions; >+ TIntermSymbol *temp = >+ insertInitStatementAndReturnTempSymbol(node->getOperand(), &insertions); >+ insertStatementsInParentBlock(insertions); >+ node->replaceChildNode(node->getOperand(), temp->deepCopy()); >+ } >+ return false; >+} >+ >+void RewriteExpressionsWithShaderStorageBlockTraverser::nextIteration() >+{ >+ mFoundSSBO = false; >+} >+ >+} // anonymous namespace >+ >+void RewriteExpressionsWithShaderStorageBlock(TIntermNode *root, TSymbolTable *symbolTable) >+{ >+ RewriteExpressionsWithShaderStorageBlockTraverser traverser(symbolTable); >+ do >+ { >+ traverser.nextIteration(); >+ root->traverse(&traverser); >+ if (traverser.foundSSBO()) >+ traverser.updateTree(); >+ } while (traverser.foundSSBO()); >+} >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteExpressionsWithShaderStorageBlock.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteExpressionsWithShaderStorageBlock.h >new file mode 100644 >index 00000000000..957552e6fdc >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteExpressionsWithShaderStorageBlock.h >@@ -0,0 +1,32 @@ >+// >+// 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. >+// >+// RewriteExpressionsWithShaderStorageBlock rewrites the expressions that contain shader storage >+// block calls into several simple ones that can be easily handled in the HLSL translator. After the >+// AST pass, all ssbo related blocks will be like below: >+// ssbo_access_chain = ssbo_access_chain; >+// ssbo_access_chain = expr_no_ssbo; >+// lvalue_no_ssbo = ssbo_access_chain; >+// >+// Below situations are needed to be rewritten (Details can be found in .cpp file). >+// SSBO as the operand of compound assignment operators. >+// SSBO as the operand of ++/--. >+// SSBO as the operand of repeated assignment. >+// SSBO as the operand of readonly unary/binary/ternary operators. >+// SSBO as the argument of aggregate type. >+// SSBO as the condition of if/switch/while/do-while/for >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_REWRITE_EXPRESSIONS_WITH_SHADER_STORAGE_BLOCK_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_REWRITE_EXPRESSIONS_WITH_SHADER_STORAGE_BLOCK_H_ >+ >+namespace sh >+{ >+class TIntermNode; >+class TSymbolTable; >+ >+void RewriteExpressionsWithShaderStorageBlock(TIntermNode *root, TSymbolTable *symbolTable); >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_REWRITE_EXPRESSIONS_WITH_SHADER_STORAGE_BLOCK_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.cpp >new file mode 100644 >index 00000000000..3cc670e6881 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.cpp >@@ -0,0 +1,92 @@ >+// >+// Copyright (c) 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. >+// >+// RewriteRepeatedAssignToSwizzled.cpp: Rewrite expressions that assign an assignment to a swizzled >+// vector, like: >+// v.x = z = expression; >+// to: >+// z = expression; >+// v.x = z; >+// >+// Note that this doesn't handle some corner cases: expressions nested inside other expressions, >+// inside loop headers, or inside if conditions. >+ >+#include "compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.h" >+ >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+class RewriteAssignToSwizzledTraverser : public TIntermTraverser >+{ >+ public: >+ static void rewrite(TIntermBlock *root); >+ >+ private: >+ RewriteAssignToSwizzledTraverser(); >+ >+ bool visitBinary(Visit, TIntermBinary *node) override; >+ >+ void nextIteration(); >+ >+ bool didRewrite() { return mDidRewrite; } >+ >+ bool mDidRewrite; >+}; >+ >+// static >+void RewriteAssignToSwizzledTraverser::rewrite(TIntermBlock *root) >+{ >+ RewriteAssignToSwizzledTraverser rewrite; >+ do >+ { >+ rewrite.nextIteration(); >+ root->traverse(&rewrite); >+ rewrite.updateTree(); >+ } while (rewrite.didRewrite()); >+} >+ >+RewriteAssignToSwizzledTraverser::RewriteAssignToSwizzledTraverser() >+ : TIntermTraverser(true, false, false), mDidRewrite(false) >+{} >+ >+void RewriteAssignToSwizzledTraverser::nextIteration() >+{ >+ mDidRewrite = false; >+} >+ >+bool RewriteAssignToSwizzledTraverser::visitBinary(Visit, TIntermBinary *node) >+{ >+ TIntermBinary *rightBinary = node->getRight()->getAsBinaryNode(); >+ TIntermBlock *parentBlock = getParentNode()->getAsBlock(); >+ if (parentBlock && node->isAssignment() && node->getLeft()->getAsSwizzleNode() && rightBinary && >+ rightBinary->isAssignment()) >+ { >+ TIntermSequence replacements; >+ replacements.push_back(rightBinary); >+ TIntermTyped *rightAssignmentTargetCopy = rightBinary->getLeft()->deepCopy(); >+ TIntermBinary *lastAssign = >+ new TIntermBinary(EOpAssign, node->getLeft(), rightAssignmentTargetCopy); >+ replacements.push_back(lastAssign); >+ mMultiReplacements.push_back(NodeReplaceWithMultipleEntry(parentBlock, node, replacements)); >+ mDidRewrite = true; >+ return false; >+ } >+ return true; >+} >+ >+} // anonymous namespace >+ >+void RewriteRepeatedAssignToSwizzled(TIntermBlock *root) >+{ >+ RewriteAssignToSwizzledTraverser::rewrite(root); >+} >+ >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.h >new file mode 100644 >index 00000000000..2f2d3b9f80c >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.h >@@ -0,0 +1,28 @@ >+// >+// Copyright (c) 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. >+// >+// RewriteRepeatedAssignToSwizzled.h: Rewrite expressions that assign an assignment to a swizzled >+// vector, like: >+// v.x = z = expression; >+// to: >+// z = expression; >+// v.x = z; >+// >+// Note that this doesn't handle some corner cases: expressions nested inside other expressions, >+// inside loop headers, or inside if conditions. >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_REWRITEREPEATEDASSIGNTOSWIZZLED_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_REWRITEREPEATEDASSIGNTOSWIZZLED_H_ >+ >+namespace sh >+{ >+ >+class TIntermBlock; >+ >+void RewriteRepeatedAssignToSwizzled(TIntermBlock *root); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_REWRITEREPEATEDASSIGNTOSWIZZLED_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteStructSamplers.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteStructSamplers.cpp >new file mode 100644 >index 00000000000..8d5bdd0bae4 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteStructSamplers.cpp >@@ -0,0 +1,699 @@ >+// >+// 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. >+// >+// RewriteStructSamplers: Extract structs from samplers. >+// >+ >+#include "compiler/translator/tree_ops/RewriteStructSamplers.h" >+ >+#include "compiler/translator/ImmutableStringBuilder.h" >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+namespace >+{ >+// Helper method to get the sampler extracted struct type of a parameter. >+TType *GetStructSamplerParameterType(TSymbolTable *symbolTable, const TVariable ¶m) >+{ >+ const TStructure *structure = param.getType().getStruct(); >+ const TSymbol *structSymbol = symbolTable->findUserDefined(structure->name()); >+ ASSERT(structSymbol && structSymbol->isStruct()); >+ const TStructure *structVar = static_cast<const TStructure *>(structSymbol); >+ TType *structType = new TType(structVar, false); >+ >+ if (param.getType().isArray()) >+ { >+ structType->makeArrays(*param.getType().getArraySizes()); >+ } >+ >+ ASSERT(!structType->isStructureContainingSamplers()); >+ >+ return structType; >+} >+ >+TIntermSymbol *ReplaceTypeOfSymbolNode(TIntermSymbol *symbolNode, TSymbolTable *symbolTable) >+{ >+ const TVariable &oldVariable = symbolNode->variable(); >+ >+ TType *newType = GetStructSamplerParameterType(symbolTable, oldVariable); >+ >+ TVariable *newVariable = >+ new TVariable(oldVariable.uniqueId(), oldVariable.name(), oldVariable.symbolType(), >+ oldVariable.extension(), newType); >+ return new TIntermSymbol(newVariable); >+} >+ >+TIntermTyped *ReplaceTypeOfTypedStructNode(TIntermTyped *argument, TSymbolTable *symbolTable) >+{ >+ TIntermSymbol *asSymbol = argument->getAsSymbolNode(); >+ if (asSymbol) >+ { >+ ASSERT(asSymbol->getType().getStruct()); >+ return ReplaceTypeOfSymbolNode(asSymbol, symbolTable); >+ } >+ >+ TIntermTyped *replacement = argument->deepCopy(); >+ TIntermBinary *binary = replacement->getAsBinaryNode(); >+ ASSERT(binary); >+ >+ while (binary) >+ { >+ ASSERT(binary->getOp() == EOpIndexDirectStruct || binary->getOp() == EOpIndexDirect); >+ >+ asSymbol = binary->getLeft()->getAsSymbolNode(); >+ >+ if (asSymbol) >+ { >+ ASSERT(asSymbol->getType().getStruct()); >+ TIntermSymbol *newSymbol = ReplaceTypeOfSymbolNode(asSymbol, symbolTable); >+ binary->replaceChildNode(binary->getLeft(), newSymbol); >+ return replacement; >+ } >+ >+ binary = binary->getLeft()->getAsBinaryNode(); >+ } >+ >+ UNREACHABLE(); >+ return nullptr; >+} >+ >+// Maximum string size of a hex unsigned int. >+constexpr size_t kHexSize = ImmutableStringBuilder::GetHexCharCount<unsigned int>(); >+ >+class Traverser final : public TIntermTraverser >+{ >+ public: >+ explicit Traverser(TSymbolTable *symbolTable) >+ : TIntermTraverser(true, false, true, symbolTable), mRemovedUniformsCount(0) >+ { >+ mSymbolTable->push(); >+ } >+ >+ ~Traverser() override { mSymbolTable->pop(); } >+ >+ int removedUniformsCount() const { return mRemovedUniformsCount; } >+ >+ // Each struct sampler declaration is stripped of its samplers. New uniforms are added for each >+ // stripped struct sampler. >+ bool visitDeclaration(Visit visit, TIntermDeclaration *decl) override >+ { >+ if (visit != PreVisit) >+ return true; >+ >+ if (!mInGlobalScope) >+ { >+ return true; >+ } >+ >+ const TIntermSequence &sequence = *(decl->getSequence()); >+ TIntermTyped *declarator = sequence.front()->getAsTyped(); >+ const TType &type = declarator->getType(); >+ >+ if (type.isStructureContainingSamplers()) >+ { >+ TIntermSequence *newSequence = new TIntermSequence; >+ >+ if (type.isStructSpecifier()) >+ { >+ stripStructSpecifierSamplers(type.getStruct(), newSequence); >+ } >+ else >+ { >+ TIntermSymbol *asSymbol = declarator->getAsSymbolNode(); >+ ASSERT(asSymbol); >+ const TVariable &variable = asSymbol->variable(); >+ ASSERT(variable.symbolType() != SymbolType::Empty); >+ extractStructSamplerUniforms(decl, variable, type.getStruct(), newSequence); >+ } >+ >+ mMultiReplacements.emplace_back(getParentNode()->getAsBlock(), decl, *newSequence); >+ } >+ >+ return true; >+ } >+ >+ // Each struct sampler reference is replaced with a reference to the new extracted sampler. >+ bool visitBinary(Visit visit, TIntermBinary *node) override >+ { >+ if (visit != PreVisit) >+ return true; >+ >+ if (node->getOp() == EOpIndexDirectStruct && node->getType().isSampler()) >+ { >+ ImmutableString newName = GetStructSamplerNameFromTypedNode(node); >+ const TVariable *samplerReplacement = >+ static_cast<const TVariable *>(mSymbolTable->findUserDefined(newName)); >+ ASSERT(samplerReplacement); >+ >+ TIntermSymbol *replacement = new TIntermSymbol(samplerReplacement); >+ >+ queueReplacement(replacement, OriginalNode::IS_DROPPED); >+ return true; >+ } >+ >+ return true; >+ } >+ >+ // In we are passing references to structs containing samplers we must new additional >+ // arguments. For each extracted struct sampler a new argument is added. This chains to nested >+ // structs. >+ void visitFunctionPrototype(TIntermFunctionPrototype *node) override >+ { >+ const TFunction *function = node->getFunction(); >+ >+ if (!function->hasSamplerInStructParams()) >+ { >+ return; >+ } >+ >+ const TSymbol *foundFunction = mSymbolTable->findUserDefined(function->name()); >+ if (foundFunction) >+ { >+ ASSERT(foundFunction->isFunction()); >+ function = static_cast<const TFunction *>(foundFunction); >+ } >+ else >+ { >+ TFunction *newFunction = createStructSamplerFunction(function); >+ mSymbolTable->declareUserDefinedFunction(newFunction, true); >+ function = newFunction; >+ } >+ >+ ASSERT(!function->hasSamplerInStructParams()); >+ TIntermFunctionPrototype *newProto = new TIntermFunctionPrototype(function); >+ queueReplacement(newProto, OriginalNode::IS_DROPPED); >+ } >+ >+ // We insert a new scope for each function definition so we can track the new parameters. >+ bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override >+ { >+ if (visit == PreVisit) >+ { >+ mSymbolTable->push(); >+ } >+ else >+ { >+ ASSERT(visit == PostVisit); >+ mSymbolTable->pop(); >+ } >+ return true; >+ } >+ >+ // For function call nodes we pass references to the extracted struct samplers in that scope. >+ bool visitAggregate(Visit visit, TIntermAggregate *node) override >+ { >+ if (visit != PreVisit) >+ return true; >+ >+ if (!node->isFunctionCall()) >+ return true; >+ >+ const TFunction *function = node->getFunction(); >+ if (!function->hasSamplerInStructParams()) >+ return true; >+ >+ ASSERT(node->getOp() == EOpCallFunctionInAST); >+ TFunction *newFunction = mSymbolTable->findUserDefinedFunction(function->name()); >+ TIntermSequence *newArguments = getStructSamplerArguments(function, node->getSequence()); >+ >+ TIntermAggregate *newCall = >+ TIntermAggregate::CreateFunctionCall(*newFunction, newArguments); >+ queueReplacement(newCall, OriginalNode::IS_DROPPED); >+ return true; >+ } >+ >+ private: >+ // This returns the name of a struct sampler reference. References are always TIntermBinary. >+ static ImmutableString GetStructSamplerNameFromTypedNode(TIntermTyped *node) >+ { >+ std::string stringBuilder; >+ >+ TIntermTyped *currentNode = node; >+ while (currentNode->getAsBinaryNode()) >+ { >+ TIntermBinary *asBinary = currentNode->getAsBinaryNode(); >+ >+ switch (asBinary->getOp()) >+ { >+ case EOpIndexDirect: >+ { >+ const int index = asBinary->getRight()->getAsConstantUnion()->getIConst(0); >+ const std::string strInt = Str(index); >+ stringBuilder.insert(0, strInt); >+ stringBuilder.insert(0, "_"); >+ break; >+ } >+ case EOpIndexDirectStruct: >+ { >+ stringBuilder.insert(0, asBinary->getIndexStructFieldName().data()); >+ stringBuilder.insert(0, "_"); >+ break; >+ } >+ >+ default: >+ UNREACHABLE(); >+ break; >+ } >+ >+ currentNode = asBinary->getLeft(); >+ } >+ >+ const ImmutableString &variableName = currentNode->getAsSymbolNode()->variable().name(); >+ stringBuilder.insert(0, variableName.data()); >+ >+ return stringBuilder; >+ } >+ >+ // Removes all the struct samplers from a struct specifier. >+ void stripStructSpecifierSamplers(const TStructure *structure, TIntermSequence *newSequence) >+ { >+ TFieldList *newFieldList = new TFieldList; >+ ASSERT(structure->containsSamplers()); >+ >+ for (const TField *field : structure->fields()) >+ { >+ const TType &fieldType = *field->type(); >+ if (!fieldType.isSampler() && !isRemovedStructType(fieldType)) >+ { >+ TType *newType = nullptr; >+ >+ if (fieldType.isStructureContainingSamplers()) >+ { >+ const TSymbol *structSymbol = >+ mSymbolTable->findUserDefined(fieldType.getStruct()->name()); >+ ASSERT(structSymbol && structSymbol->isStruct()); >+ const TStructure *fieldStruct = static_cast<const TStructure *>(structSymbol); >+ newType = new TType(fieldStruct, true); >+ if (fieldType.isArray()) >+ { >+ newType->makeArrays(*fieldType.getArraySizes()); >+ } >+ } >+ else >+ { >+ newType = new TType(fieldType); >+ } >+ >+ TField *newField = >+ new TField(newType, field->name(), field->line(), field->symbolType()); >+ newFieldList->push_back(newField); >+ } >+ } >+ >+ // Prune empty structs. >+ if (newFieldList->empty()) >+ { >+ mRemovedStructs.insert(structure->name()); >+ return; >+ } >+ >+ TStructure *newStruct = >+ new TStructure(mSymbolTable, structure->name(), newFieldList, structure->symbolType()); >+ TType *newStructType = new TType(newStruct, true); >+ TVariable *newStructVar = >+ new TVariable(mSymbolTable, kEmptyImmutableString, newStructType, SymbolType::Empty); >+ TIntermSymbol *newStructRef = new TIntermSymbol(newStructVar); >+ >+ TIntermDeclaration *structDecl = new TIntermDeclaration; >+ structDecl->appendDeclarator(newStructRef); >+ >+ newSequence->push_back(structDecl); >+ >+ mSymbolTable->declare(newStruct); >+ } >+ >+ // Returns true if the type is a struct that was removed because we extracted all the members. >+ bool isRemovedStructType(const TType &type) const >+ { >+ const TStructure *structure = type.getStruct(); >+ return (structure && (mRemovedStructs.count(structure->name()) > 0)); >+ } >+ >+ // Removes samplers from struct uniforms. For each sampler removed also adds a new globally >+ // defined sampler uniform. >+ void extractStructSamplerUniforms(TIntermDeclaration *oldDeclaration, >+ const TVariable &variable, >+ const TStructure *structure, >+ TIntermSequence *newSequence) >+ { >+ ASSERT(structure->containsSamplers()); >+ >+ size_t nonSamplerCount = 0; >+ >+ for (const TField *field : structure->fields()) >+ { >+ nonSamplerCount += >+ extractFieldSamplers(variable.name(), field, variable.getType(), newSequence); >+ } >+ >+ if (nonSamplerCount > 0) >+ { >+ // Keep the old declaration around if it has other members. >+ newSequence->push_back(oldDeclaration); >+ } >+ else >+ { >+ mRemovedUniformsCount++; >+ } >+ } >+ >+ // Extracts samplers from a field of a struct. Works with nested structs and arrays. >+ size_t extractFieldSamplers(const ImmutableString &prefix, >+ const TField *field, >+ const TType &containingType, >+ TIntermSequence *newSequence) >+ { >+ if (containingType.isArray()) >+ { >+ size_t nonSamplerCount = 0; >+ >+ // Name the samplers internally as varName_<index>_fieldName >+ const TVector<unsigned int> &arraySizes = *containingType.getArraySizes(); >+ for (unsigned int arrayElement = 0; arrayElement < arraySizes[0]; ++arrayElement) >+ { >+ ImmutableStringBuilder stringBuilder(prefix.length() + kHexSize + 1); >+ stringBuilder << prefix << "_"; >+ stringBuilder.appendHex(arrayElement); >+ nonSamplerCount = extractFieldSamplersImpl(stringBuilder, field, newSequence); >+ } >+ >+ return nonSamplerCount; >+ } >+ >+ return extractFieldSamplersImpl(prefix, field, newSequence); >+ } >+ >+ // Extracts samplers from a field of a struct. Works with nested structs and arrays. >+ size_t extractFieldSamplersImpl(const ImmutableString &prefix, >+ const TField *field, >+ TIntermSequence *newSequence) >+ { >+ size_t nonSamplerCount = 0; >+ >+ const TType &fieldType = *field->type(); >+ if (fieldType.isSampler() || fieldType.isStructureContainingSamplers()) >+ { >+ ImmutableStringBuilder stringBuilder(prefix.length() + field->name().length() + 1); >+ stringBuilder << prefix << "_" << field->name(); >+ ImmutableString newPrefix(stringBuilder); >+ >+ if (fieldType.isSampler()) >+ { >+ extractSampler(newPrefix, fieldType, newSequence); >+ } >+ else >+ { >+ const TStructure *structure = fieldType.getStruct(); >+ for (const TField *nestedField : structure->fields()) >+ { >+ nonSamplerCount += >+ extractFieldSamplers(newPrefix, nestedField, fieldType, newSequence); >+ } >+ } >+ } >+ else >+ { >+ nonSamplerCount++; >+ } >+ >+ return nonSamplerCount; >+ } >+ >+ // Extracts a sampler from a struct. Declares the new extracted sampler. >+ void extractSampler(const ImmutableString &newName, >+ const TType &fieldType, >+ TIntermSequence *newSequence) const >+ { >+ TType *newType = new TType(fieldType); >+ newType->setQualifier(EvqUniform); >+ TVariable *newVariable = >+ new TVariable(mSymbolTable, newName, newType, SymbolType::AngleInternal); >+ TIntermSymbol *newRef = new TIntermSymbol(newVariable); >+ >+ TIntermDeclaration *samplerDecl = new TIntermDeclaration; >+ samplerDecl->appendDeclarator(newRef); >+ >+ newSequence->push_back(samplerDecl); >+ >+ mSymbolTable->declareInternal(newVariable); >+ } >+ >+ // Returns the chained name of a sampler uniform field. >+ static ImmutableString GetFieldName(const ImmutableString ¶mName, >+ const TField *field, >+ unsigned arrayIndex) >+ { >+ ImmutableStringBuilder nameBuilder(paramName.length() + kHexSize + 2 + >+ field->name().length()); >+ nameBuilder << paramName << "_"; >+ >+ if (arrayIndex < std::numeric_limits<unsigned>::max()) >+ { >+ nameBuilder.appendHex(arrayIndex); >+ nameBuilder << "_"; >+ } >+ nameBuilder << field->name(); >+ >+ return nameBuilder; >+ } >+ >+ // A pattern that visits every parameter of a function call. Uses different handlers for struct >+ // parameters, struct sampler parameters, and non-struct parameters. >+ class StructSamplerFunctionVisitor : angle::NonCopyable >+ { >+ public: >+ StructSamplerFunctionVisitor() = default; >+ virtual ~StructSamplerFunctionVisitor() = default; >+ >+ virtual void traverse(const TFunction *function) >+ { >+ size_t paramCount = function->getParamCount(); >+ >+ for (size_t paramIndex = 0; paramIndex < paramCount; ++paramIndex) >+ { >+ const TVariable *param = function->getParam(paramIndex); >+ const TType ¶mType = param->getType(); >+ >+ if (paramType.isStructureContainingSamplers()) >+ { >+ const ImmutableString &baseName = getNameFromIndex(function, paramIndex); >+ if (traverseStructContainingSamplers(baseName, paramType)) >+ { >+ visitStructParam(function, paramIndex); >+ } >+ } >+ else >+ { >+ visitNonStructParam(function, paramIndex); >+ } >+ } >+ } >+ >+ virtual ImmutableString getNameFromIndex(const TFunction *function, size_t paramIndex) = 0; >+ virtual void visitSamplerInStructParam(const ImmutableString &name, >+ const TField *field) = 0; >+ virtual void visitStructParam(const TFunction *function, size_t paramIndex) = 0; >+ virtual void visitNonStructParam(const TFunction *function, size_t paramIndex) = 0; >+ >+ private: >+ bool traverseStructContainingSamplers(const ImmutableString &baseName, >+ const TType &structType) >+ { >+ bool hasNonSamplerFields = false; >+ const TStructure *structure = structType.getStruct(); >+ for (const TField *field : structure->fields()) >+ { >+ if (field->type()->isStructureContainingSamplers() || field->type()->isSampler()) >+ { >+ if (traverseSamplerInStruct(baseName, structType, field)) >+ { >+ hasNonSamplerFields = true; >+ } >+ } >+ else >+ { >+ hasNonSamplerFields = true; >+ } >+ } >+ return hasNonSamplerFields; >+ } >+ >+ bool traverseSamplerInStruct(const ImmutableString &baseName, >+ const TType &baseType, >+ const TField *field) >+ { >+ bool hasNonSamplerParams = false; >+ >+ if (baseType.isArray()) >+ { >+ const TVector<unsigned int> &arraySizes = *baseType.getArraySizes(); >+ ASSERT(arraySizes.size() == 1); >+ >+ for (unsigned int arrayIndex = 0; arrayIndex < arraySizes[0]; ++arrayIndex) >+ { >+ ImmutableString name = GetFieldName(baseName, field, arrayIndex); >+ >+ if (field->type()->isStructureContainingSamplers()) >+ { >+ if (traverseStructContainingSamplers(name, *field->type())) >+ { >+ hasNonSamplerParams = true; >+ } >+ } >+ else >+ { >+ ASSERT(field->type()->isSampler()); >+ visitSamplerInStructParam(name, field); >+ } >+ } >+ } >+ else if (field->type()->isStructureContainingSamplers()) >+ { >+ ImmutableString name = >+ GetFieldName(baseName, field, std::numeric_limits<unsigned>::max()); >+ hasNonSamplerParams = traverseStructContainingSamplers(name, *field->type()); >+ } >+ else >+ { >+ ASSERT(field->type()->isSampler()); >+ ImmutableString name = >+ GetFieldName(baseName, field, std::numeric_limits<unsigned>::max()); >+ visitSamplerInStructParam(name, field); >+ } >+ >+ return hasNonSamplerParams; >+ } >+ }; >+ >+ // A visitor that replaces functions with struct sampler references. The struct sampler >+ // references are expanded to include new fields for the structs. >+ class CreateStructSamplerFunctionVisitor final : public StructSamplerFunctionVisitor >+ { >+ public: >+ CreateStructSamplerFunctionVisitor(TSymbolTable *symbolTable) >+ : mSymbolTable(symbolTable), mNewFunction(nullptr) >+ {} >+ >+ ImmutableString getNameFromIndex(const TFunction *function, size_t paramIndex) override >+ { >+ const TVariable *param = function->getParam(paramIndex); >+ return param->name(); >+ } >+ >+ void traverse(const TFunction *function) override >+ { >+ mNewFunction = >+ new TFunction(mSymbolTable, function->name(), function->symbolType(), >+ &function->getReturnType(), function->isKnownToNotHaveSideEffects()); >+ >+ StructSamplerFunctionVisitor::traverse(function); >+ } >+ >+ void visitSamplerInStructParam(const ImmutableString &name, const TField *field) override >+ { >+ TVariable *fieldSampler = >+ new TVariable(mSymbolTable, name, field->type(), SymbolType::AngleInternal); >+ mNewFunction->addParameter(fieldSampler); >+ mSymbolTable->declareInternal(fieldSampler); >+ } >+ >+ void visitStructParam(const TFunction *function, size_t paramIndex) override >+ { >+ const TVariable *param = function->getParam(paramIndex); >+ TType *structType = GetStructSamplerParameterType(mSymbolTable, *param); >+ TVariable *newParam = >+ new TVariable(mSymbolTable, param->name(), structType, param->symbolType()); >+ mNewFunction->addParameter(newParam); >+ } >+ >+ void visitNonStructParam(const TFunction *function, size_t paramIndex) override >+ { >+ const TVariable *param = function->getParam(paramIndex); >+ mNewFunction->addParameter(param); >+ } >+ >+ TFunction *getNewFunction() const { return mNewFunction; } >+ >+ private: >+ TSymbolTable *mSymbolTable; >+ TFunction *mNewFunction; >+ }; >+ >+ TFunction *createStructSamplerFunction(const TFunction *function) const >+ { >+ CreateStructSamplerFunctionVisitor visitor(mSymbolTable); >+ visitor.traverse(function); >+ return visitor.getNewFunction(); >+ } >+ >+ // A visitor that replaces function calls with expanded struct sampler parameters. >+ class GetSamplerArgumentsVisitor final : public StructSamplerFunctionVisitor >+ { >+ public: >+ GetSamplerArgumentsVisitor(TSymbolTable *symbolTable, const TIntermSequence *arguments) >+ : mSymbolTable(symbolTable), mArguments(arguments), mNewArguments(new TIntermSequence) >+ {} >+ >+ ImmutableString getNameFromIndex(const TFunction *function, size_t paramIndex) override >+ { >+ TIntermTyped *argument = (*mArguments)[paramIndex]->getAsTyped(); >+ return GetStructSamplerNameFromTypedNode(argument); >+ } >+ >+ void visitSamplerInStructParam(const ImmutableString &name, const TField *field) override >+ { >+ TVariable *argSampler = >+ new TVariable(mSymbolTable, name, field->type(), SymbolType::AngleInternal); >+ TIntermSymbol *argSymbol = new TIntermSymbol(argSampler); >+ mNewArguments->push_back(argSymbol); >+ } >+ >+ void visitStructParam(const TFunction *function, size_t paramIndex) override >+ { >+ // The tree structure of the parameter is modified to point to the new type. This leaves >+ // the tree in a consistent state. >+ TIntermTyped *argument = (*mArguments)[paramIndex]->getAsTyped(); >+ TIntermTyped *replacement = ReplaceTypeOfTypedStructNode(argument, mSymbolTable); >+ mNewArguments->push_back(replacement); >+ } >+ >+ void visitNonStructParam(const TFunction *function, size_t paramIndex) override >+ { >+ TIntermTyped *argument = (*mArguments)[paramIndex]->getAsTyped(); >+ mNewArguments->push_back(argument); >+ } >+ >+ TIntermSequence *getNewArguments() const { return mNewArguments; } >+ >+ private: >+ TSymbolTable *mSymbolTable; >+ const TIntermSequence *mArguments; >+ TIntermSequence *mNewArguments; >+ }; >+ >+ TIntermSequence *getStructSamplerArguments(const TFunction *function, >+ const TIntermSequence *arguments) const >+ { >+ GetSamplerArgumentsVisitor visitor(mSymbolTable, arguments); >+ visitor.traverse(function); >+ return visitor.getNewArguments(); >+ } >+ >+ int mRemovedUniformsCount; >+ std::set<ImmutableString> mRemovedStructs; >+}; >+} // anonymous namespace >+ >+int RewriteStructSamplers(TIntermBlock *root, TSymbolTable *symbolTable) >+{ >+ Traverser rewriteStructSamplers(symbolTable); >+ root->traverse(&rewriteStructSamplers); >+ rewriteStructSamplers.updateTree(); >+ >+ return rewriteStructSamplers.removedUniformsCount(); >+} >+} // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteStructSamplers.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteStructSamplers.h >new file mode 100644 >index 00000000000..2b7aa6e1c4a >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteStructSamplers.h >@@ -0,0 +1,31 @@ >+// >+// 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. >+// >+// RewriteStructSamplers: Extract structs from samplers. >+// >+// This traverser is designed to strip out samplers from structs. It moves them into >+// separate uniform sampler declarations. This allows the struct to be stored in the >+// default uniform block. It also requires that we rewrite any functions that take the >+// struct as an argument. The struct is split into two arguments. >+// >+// For example: >+// struct S { sampler2D samp; int i; }; >+// uniform S uni; >+// Is rewritten as: >+// struct S { int i; }; >+// uniform S uni; >+// uniform sampler2D uni_i; >+ >+#ifndef COMPILER_TRANSLATOR_TREEOPS_REWRITESTRUCTSAMPLERS_H_ >+#define COMPILER_TRANSLATOR_TREEOPS_REWRITESTRUCTSAMPLERS_H_ >+ >+namespace sh >+{ >+class TIntermBlock; >+class TSymbolTable; >+int RewriteStructSamplers(TIntermBlock *root, TSymbolTable *symbolTable); >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TREEOPS_REWRITESTRUCTSAMPLERS_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteTexelFetchOffset.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteTexelFetchOffset.cpp >new file mode 100644 >index 00000000000..3587fd65384 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteTexelFetchOffset.cpp >@@ -0,0 +1,154 @@ >+// >+// Copyright (c) 2016 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. >+// >+// Implementation of texelFetchOffset translation issue workaround. >+// See header for more info. >+ >+#include "compiler/translator/tree_ops/RewriteTexelFetchOffset.h" >+ >+#include "common/angleutils.h" >+#include "compiler/translator/SymbolTable.h" >+#include "compiler/translator/tree_util/IntermNode_util.h" >+#include "compiler/translator/tree_util/IntermTraverse.h" >+ >+namespace sh >+{ >+ >+namespace >+{ >+ >+class Traverser : public TIntermTraverser >+{ >+ public: >+ static void Apply(TIntermNode *root, const TSymbolTable &symbolTable, int shaderVersion); >+ >+ private: >+ Traverser(const TSymbolTable &symbolTable, int shaderVersion); >+ bool visitAggregate(Visit visit, TIntermAggregate *node) override; >+ void nextIteration(); >+ >+ const TSymbolTable *symbolTable; >+ const int shaderVersion; >+ bool mFound = false; >+}; >+ >+Traverser::Traverser(const TSymbolTable &symbolTable, int shaderVersion) >+ : TIntermTraverser(true, false, false), symbolTable(&symbolTable), shaderVersion(shaderVersion) >+{} >+ >+// static >+void Traverser::Apply(TIntermNode *root, const TSymbolTable &symbolTable, int shaderVersion) >+{ >+ Traverser traverser(symbolTable, shaderVersion); >+ do >+ { >+ traverser.nextIteration(); >+ root->traverse(&traverser); >+ if (traverser.mFound) >+ { >+ traverser.updateTree(); >+ } >+ } while (traverser.mFound); >+} >+ >+void Traverser::nextIteration() >+{ >+ mFound = false; >+} >+ >+bool Traverser::visitAggregate(Visit visit, TIntermAggregate *node) >+{ >+ if (mFound) >+ { >+ return false; >+ } >+ >+ // Decide if the node represents the call of texelFetchOffset. >+ if (node->getOp() != EOpCallBuiltInFunction) >+ { >+ return true; >+ } >+ >+ ASSERT(node->getFunction()->symbolType() == SymbolType::BuiltIn); >+ if (node->getFunction()->name() != "texelFetchOffset") >+ { >+ return true; >+ } >+ >+ // Potential problem case detected, apply workaround. >+ const TIntermSequence *sequence = node->getSequence(); >+ ASSERT(sequence->size() == 4u); >+ >+ // Decide if the sampler is a 2DArray sampler. In that case position is ivec3 and offset is >+ // ivec2. >+ bool is2DArray = sequence->at(1)->getAsTyped()->getNominalSize() == 3 && >+ sequence->at(3)->getAsTyped()->getNominalSize() == 2; >+ >+ // Create new node that represents the call of function texelFetch. >+ // Its argument list will be: texelFetch(sampler, Position+offset, lod). >+ >+ TIntermSequence *texelFetchArguments = new TIntermSequence(); >+ >+ // sampler >+ texelFetchArguments->push_back(sequence->at(0)); >+ >+ // Position >+ TIntermTyped *texCoordNode = sequence->at(1)->getAsTyped(); >+ ASSERT(texCoordNode); >+ >+ // offset >+ TIntermTyped *offsetNode = nullptr; >+ ASSERT(sequence->at(3)->getAsTyped()); >+ if (is2DArray) >+ { >+ // For 2DArray samplers, Position is ivec3 and offset is ivec2; >+ // So offset must be converted into an ivec3 before being added to Position. >+ TIntermSequence *constructOffsetIvecArguments = new TIntermSequence(); >+ constructOffsetIvecArguments->push_back(sequence->at(3)->getAsTyped()); >+ >+ TIntermTyped *zeroNode = CreateZeroNode(TType(EbtInt)); >+ constructOffsetIvecArguments->push_back(zeroNode); >+ >+ offsetNode = TIntermAggregate::CreateConstructor(texCoordNode->getType(), >+ constructOffsetIvecArguments); >+ offsetNode->setLine(texCoordNode->getLine()); >+ } >+ else >+ { >+ offsetNode = sequence->at(3)->getAsTyped(); >+ } >+ >+ // Position+offset >+ TIntermBinary *add = new TIntermBinary(EOpAdd, texCoordNode, offsetNode); >+ add->setLine(texCoordNode->getLine()); >+ texelFetchArguments->push_back(add); >+ >+ // lod >+ texelFetchArguments->push_back(sequence->at(2)); >+ >+ ASSERT(texelFetchArguments->size() == 3u); >+ >+ TIntermTyped *texelFetchNode = CreateBuiltInFunctionCallNode("texelFetch", texelFetchArguments, >+ *symbolTable, shaderVersion); >+ texelFetchNode->setLine(node->getLine()); >+ >+ // Replace the old node by this new node. >+ queueReplacement(texelFetchNode, OriginalNode::IS_DROPPED); >+ mFound = true; >+ return false; >+} >+ >+} // anonymous namespace >+ >+void RewriteTexelFetchOffset(TIntermNode *root, const TSymbolTable &symbolTable, int shaderVersion) >+{ >+ // texelFetchOffset is only valid in GLSL 3.0 and later. >+ if (shaderVersion < 300) >+ return; >+ >+ Traverser::Apply(root, symbolTable, shaderVersion); >+} >+ >+} // namespace sh >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteTexelFetchOffset.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteTexelFetchOffset.h >new file mode 100644 >index 00000000000..45e224dd620 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RewriteTexelFetchOffset.h >@@ -0,0 +1,28 @@ >+// >+// Copyright (c) 2016 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 mutating tree traversal works around an issue on the translation >+// from texelFetchOffset into HLSL function Load on INTEL drivers. It >+// works by translating texelFetchOffset into texelFetch: >+// >+// - From: texelFetchOffset(sampler, Position, lod, offset) >